eliza-plugin-insumer 1.2.0 → 1.2.1
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.
- package/README.md +1 -5
- package/dist/index.js +15 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -219,11 +219,7 @@ If the API cannot reach one or more data sources after retries, actions return `
|
|
|
219
219
|
|
|
220
220
|
## Supported Chains (32)
|
|
221
221
|
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
**4 Covalent chains:** Taiko, Ronin, Moonriver, Viction
|
|
225
|
-
|
|
226
|
-
**Plus:** Solana, XRP Ledger
|
|
222
|
+
30 EVM chains + Solana + XRP Ledger. Includes Ethereum, Base, Polygon, Arbitrum, Optimism, BNB Chain, Avalanche, and 23 more. [Full list →](https://insumermodel.com/developers/api-reference/)
|
|
227
223
|
|
|
228
224
|
## Pricing
|
|
229
225
|
|
package/dist/index.js
CHANGED
|
@@ -236,6 +236,7 @@ Extract the following as a JSON object:
|
|
|
236
236
|
- chainId: chain ID number
|
|
237
237
|
- contractAddress: token contract address
|
|
238
238
|
- decimals: token decimals (6 for USDC, 18 for most ERC-20)
|
|
239
|
+
- currency: XRPL trust line currency code (e.g. "RLUSD", "USDC") \u2014 only for XRPL tokens
|
|
239
240
|
- tiers: array of 1-4 tiers, each with:
|
|
240
241
|
- name: tier name (e.g. "Bronze", "Silver", "Gold")
|
|
241
242
|
- threshold: minimum token balance for this tier
|
|
@@ -1070,14 +1071,20 @@ var acpDiscountAction = {
|
|
|
1070
1071
|
const data = result.data;
|
|
1071
1072
|
const discounts = data.discounts;
|
|
1072
1073
|
const codes = discounts?.codes || [];
|
|
1074
|
+
const applied = discounts?.applied || [];
|
|
1073
1075
|
const verification = data.verification;
|
|
1074
1076
|
const lines = [`ACP Discount Result`, ``];
|
|
1075
1077
|
if (codes.length > 0) {
|
|
1076
1078
|
lines.push(`Discount code: ${codes[0]}`);
|
|
1077
1079
|
}
|
|
1080
|
+
if (applied.length > 0) {
|
|
1081
|
+
const coupon = applied[0].coupon;
|
|
1082
|
+
if (coupon?.percent_off) {
|
|
1083
|
+
lines.push(`Discount: ${coupon.percent_off}%`);
|
|
1084
|
+
}
|
|
1085
|
+
}
|
|
1078
1086
|
if (verification) {
|
|
1079
1087
|
lines.push(`Verification code: ${verification.code}`);
|
|
1080
|
-
lines.push(`Discount: ${verification.totalDiscount}%`);
|
|
1081
1088
|
}
|
|
1082
1089
|
if (codes.length === 0 && !verification) {
|
|
1083
1090
|
lines.push(`No discount eligible for this wallet at this merchant.`);
|
|
@@ -1168,14 +1175,20 @@ var ucpDiscountAction = {
|
|
|
1168
1175
|
const data = result.data;
|
|
1169
1176
|
const discounts = data.discounts;
|
|
1170
1177
|
const codes = discounts?.codes || [];
|
|
1178
|
+
const applied = discounts?.applied || [];
|
|
1171
1179
|
const verification = data.verification;
|
|
1172
1180
|
const lines = [`UCP Discount Result`, ``];
|
|
1173
1181
|
if (codes.length > 0) {
|
|
1174
1182
|
lines.push(`Discount code: ${codes[0]}`);
|
|
1175
1183
|
}
|
|
1184
|
+
if (applied.length > 0) {
|
|
1185
|
+
const discount = applied[0];
|
|
1186
|
+
if (discount.title) {
|
|
1187
|
+
lines.push(`Discount: ${discount.title}`);
|
|
1188
|
+
}
|
|
1189
|
+
}
|
|
1176
1190
|
if (verification) {
|
|
1177
1191
|
lines.push(`Verification code: ${verification.code}`);
|
|
1178
|
-
lines.push(`Discount: ${verification.totalDiscount}%`);
|
|
1179
1192
|
}
|
|
1180
1193
|
if (codes.length === 0 && !verification) {
|
|
1181
1194
|
lines.push(`No discount eligible for this wallet at this merchant.`);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/api.ts","../src/utils/templates.ts","../src/actions/verify.ts","../src/actions/trust.ts","../src/actions/batch.ts","../src/actions/buy_key.ts","../src/actions/create_merchant.ts","../src/actions/configure_tokens.ts","../src/actions/add_credits.ts","../src/actions/acp_discount.ts","../src/actions/ucp_discount.ts","../src/actions/confirm_payment.ts","../src/providers/credentials.ts","../src/index.ts"],"sourcesContent":["const API_BASE = \"https://api.insumermodel.com/v1\";\n\n// --- Types ---\n\nexport interface ApiResponse {\n ok: boolean;\n data?: Record<string, unknown>;\n error?: { code: number; message: string };\n meta?: { version: string; timestamp: string };\n}\n\nexport interface AttestCondition {\n type: \"token_balance\" | \"nft_ownership\" | \"eas_attestation\" | \"farcaster_id\";\n contractAddress?: string;\n chainId?: number | \"solana\" | \"xrpl\";\n threshold?: number;\n decimals?: number;\n currency?: string;\n taxon?: number;\n label?: string;\n schemaId?: string;\n attester?: string;\n indexer?: string;\n template?: string;\n}\n\nexport interface AttestParams {\n wallet?: string;\n solanaWallet?: string;\n xrplWallet?: string;\n proof?: \"merkle\";\n format?: \"jwt\";\n conditions: AttestCondition[];\n}\n\nexport interface TrustParams {\n wallet: string;\n solanaWallet?: string;\n xrplWallet?: string;\n proof?: \"merkle\";\n}\n\nexport interface BatchTrustParams {\n wallets: Array<{\n wallet: string;\n solanaWallet?: string;\n xrplWallet?: string;\n }>;\n proof?: \"merkle\";\n}\n\n// --- API helper ---\n\nexport async function apiCall(\n apiKey: string,\n method: string,\n path: string,\n body?: Record<string, unknown>\n): Promise<ApiResponse> {\n const url = `${API_BASE}${path}`;\n const res = await fetch(url, {\n method,\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-Key\": apiKey,\n },\n body: body ? JSON.stringify(body) : undefined,\n });\n return res.json() as Promise<ApiResponse>;\n}\n\nexport async function publicApiCall(\n method: string,\n path: string,\n body?: Record<string, unknown>\n): Promise<ApiResponse> {\n const url = `${API_BASE}${path}`;\n const res = await fetch(url, {\n method,\n headers: { \"Content-Type\": \"application/json\" },\n body: body ? JSON.stringify(body) : undefined,\n });\n return res.json() as Promise<ApiResponse>;\n}\n\n// --- Response formatters ---\n\ninterface AttestResult {\n condition: number;\n label?: string;\n type: string;\n chainId?: number | string;\n met: boolean;\n blockNumber?: string;\n blockTimestamp?: string;\n ledgerIndex?: number;\n ledgerHash?: string;\n trustLineState?: { frozen: boolean };\n}\n\ninterface TrustDimension {\n checks: Array<{ label: string; met: boolean }>;\n passCount: number;\n failCount: number;\n total: number;\n}\n\n/**\n * Format an attest API response for display.\n * API shape: data = { attestation: { id, pass, results, passCount, failCount, expiresAt }, sig, kid, jwt? }\n */\nexport function formatAttestResult(data: Record<string, unknown>): string {\n const attestation = data.attestation as Record<string, unknown> | undefined;\n const id = attestation?.id as string;\n const pass = attestation?.pass as boolean;\n const results = (attestation?.results || []) as AttestResult[];\n const lines: string[] = [\n `Attestation ${id}: ${pass ? \"PASS\" : \"FAIL\"}`,\n \"\",\n ];\n for (const r of results) {\n const icon = r.met ? \"+\" : \"-\";\n const chain =\n r.chainId !== undefined ? ` (chain ${r.chainId})` : \"\";\n let extra = \"\";\n if (r.ledgerIndex !== undefined) {\n extra += ` | ledger ${r.ledgerIndex}`;\n }\n if (r.trustLineState?.frozen) {\n extra += \" | FROZEN trust line\";\n }\n lines.push(` [${icon}] ${r.label || r.type}${chain}${extra}`);\n }\n const passCount = attestation?.passCount as number;\n const failCount = attestation?.failCount as number;\n lines.push(\"\", `${passCount} passed, ${failCount} failed`);\n if (attestation?.expiresAt) {\n lines.push(`Expires: ${attestation.expiresAt}`);\n }\n if (data.jwt) {\n lines.push(\"\", `JWT: ${data.jwt}`);\n }\n return lines.join(\"\\n\");\n}\n\n/**\n * Format a trust API response for display.\n * API shape: data = { trust: { id, dimensions, summary, ... }, sig, kid }\n */\nexport function formatTrustResult(data: Record<string, unknown>): string {\n const trust = data.trust as Record<string, unknown> | undefined;\n const id = trust?.id as string;\n const dimensions = trust?.dimensions as Record<string, TrustDimension> | undefined;\n const summary = trust?.summary as Record<string, unknown> | undefined;\n const lines: string[] = [`Trust Profile ${id}`, \"\"];\n if (dimensions) {\n for (const [name, dim] of Object.entries(dimensions)) {\n lines.push(\n ` ${name}: ${dim.passCount}/${dim.total} passed`\n );\n for (const check of dim.checks) {\n const icon = check.met ? \"+\" : \"-\";\n lines.push(` [${icon}] ${check.label}`);\n }\n }\n }\n if (summary) {\n lines.push(\n \"\",\n `Overall: ${summary.totalPassed}/${summary.totalChecks} checks passed`\n );\n }\n return lines.join(\"\\n\");\n}\n\n/**\n * Format a batch trust API response for display.\n * API shape: data = { results: [{ trust: { id, wallet, summary, ... }, sig, kid } | { error: { wallet, message } }], summary: { requested, succeeded, failed } }\n */\nexport function formatBatchResult(data: Record<string, unknown>): string {\n const results = (data.results || []) as Array<Record<string, unknown>>;\n const batchSummary = data.summary as Record<string, unknown> | undefined;\n const lines: string[] = [`Batch Trust: ${results.length} profiles`, \"\"];\n for (const result of results) {\n if (result.error) {\n const err = result.error as Record<string, unknown>;\n lines.push(` ${err.wallet}: ERROR — ${err.message}`);\n } else {\n const trust = result.trust as Record<string, unknown> | undefined;\n const summary = trust?.summary as Record<string, unknown> | undefined;\n lines.push(\n ` ${trust?.wallet}: ${summary?.totalPassed ?? \"?\"}/${summary?.totalChecks ?? \"?\"} checks passed (${trust?.id})`\n );\n }\n }\n if (batchSummary) {\n lines.push(\"\", `${batchSummary.succeeded}/${batchSummary.requested} succeeded`);\n }\n return lines.join(\"\\n\");\n}\n","export const verifyTemplate = `You are extracting on-chain verification parameters from the conversation.\n\nRecent messages:\n{{recentMessages}}\n\nExtract the following as a JSON object:\n- wallet: EVM address (0x...) if present\n- solanaWallet: Solana address (base58) if present\n- xrplWallet: XRPL address (r...) if present\n- format: \"jwt\" if the user asks for a JWT token, bearer token, Wallet Auth token, or JWT format. Omit otherwise.\n- conditions: array of conditions to check, each with:\n - type: \"token_balance\", \"nft_ownership\", \"eas_attestation\", or \"farcaster_id\"\n - contractAddress: token/NFT contract address (use the reference table below)\n - chainId: chain ID number or \"solana\" or \"xrpl\"\n - threshold: minimum balance (for token_balance)\n - decimals: token decimals (for token_balance)\n - currency: XRPL trust line currency code (e.g. \"RLUSD\", \"USDC\"). Required for XRPL trust line tokens.\n - taxon: XRPL NFT taxon number (optional, for nft_ownership on XRPL only)\n - label: human-readable description\n - template: compliance template name (for eas_attestation)\n\nChain ID reference (32 supported chains):\n Ethereum = 1, BNB Chain = 56, Base = 8453, Avalanche = 43114,\n Polygon = 137, Arbitrum = 42161, Optimism = 10, Chiliz = 88888,\n Soneium = 1868, Plume = 98866, World Chain = 480,\n Sonic = 146, Gnosis = 100, Mantle = 5000, Scroll = 534352,\n Linea = 59144, zkSync Era = 324, Blast = 81457, Taiko = 167000,\n Ronin = 2020, Celo = 42220, Moonbeam = 1284, Moonriver = 1285,\n Viction = 88, opBNB = 204, Unichain = 130, Ink = 57073,\n Sei = 1329, Berachain = 80094, ApeChain = 33139,\n Solana = \"solana\", XRPL = \"xrpl\"\n\nWell-known contracts (Ethereum mainnet unless noted):\n USDC = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 (6 decimals)\n USDT = 0xdAC17F958D2ee523a2206206994597C13D831ec7 (6 decimals)\n UNI = 0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984 (18 decimals)\n AAVE = 0x7Fc66500c84A76Ad7e9c93437bFc5Ac33E2DDaE9 (18 decimals)\n LINK = 0x514910771AF9Ca656af840dff83E8264EcF986CA (18 decimals)\n WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 (18 decimals)\n BAYC = 0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D (NFT)\n USDC on Base = 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 (6 decimals)\n USDC on Polygon = 0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359 (6 decimals)\n USDC on Arbitrum = 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 (6 decimals)\n USDC on Optimism = 0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85 (6 decimals)\n USDC on BNB Chain = 0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d (18 decimals)\n USDC on Avalanche = 0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E (6 decimals)\n USDC on Solana = EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v (6 decimals)\n\nXRPL tokens (use chainId \"xrpl\"):\n XRP native = contractAddress \"native\"\n RLUSD = contractAddress \"rMxCKbEDwqr76QuheSUMdEGf4B9xJ8m5De\", currency \"RLUSD\"\n USDC on XRPL = contractAddress \"rGm7WCVp9gb4jZHWTEtGUr4dd74z2XuWhE\", currency \"USDC\"\n\nCompliance templates (for eas_attestation, no contractAddress needed):\n \"coinbase_verified_account\" — KYC on Base\n \"coinbase_verified_country\" — country verification on Base\n \"coinbase_one\" — Coinbase One membership on Base\n \"gitcoin_passport_score\" — Gitcoin Passport score on Optimism\n \"gitcoin_passport_active\" — active Gitcoin Passport on Optimism\n\nIf the user says \"check if they hold UNI\", create a token_balance condition with the UNI contract, chainId 1, threshold 1, decimals 18.\nIf the user says \"verify KYC\", use template \"coinbase_verified_account\".\nIf the user says \"check RLUSD balance\", use chainId \"xrpl\", contractAddress \"rMxCKbEDwqr76QuheSUMdEGf4B9xJ8m5De\", currency \"RLUSD\".\n\nRespond with ONLY the JSON object, no explanation.`;\n\nexport const trustTemplate = `You are extracting wallet trust profile parameters from the conversation.\n\nRecent messages:\n{{recentMessages}}\n\nExtract the following as a JSON object:\n- wallet: EVM address (0x...) — required\n- solanaWallet: Solana address (base58) if mentioned\n- xrplWallet: XRPL address (r...) if mentioned\n\nThe trust profile automatically checks 17+ dimensions (stablecoins, governance tokens, NFTs, staking) for the EVM wallet. Adding solanaWallet or xrplWallet extends the profile with additional checks.\n\nRespond with ONLY the JSON object, no explanation.`;\n\nexport const batchTrustTemplate = `You are extracting multiple wallet addresses for batch trust profiling from the conversation.\n\nRecent messages:\n{{recentMessages}}\n\nExtract the following as a JSON object:\n- wallets: array of wallet objects, each with:\n - wallet: EVM address (0x...) — required\n - solanaWallet: Solana address (base58) if mentioned for this wallet\n - xrplWallet: XRPL address (r...) if mentioned for this wallet\n\nMaximum 10 wallets. Each wallet gets an independent trust profile.\n\nRespond with ONLY the JSON object, no explanation.`;\n\nexport const buyKeyTemplate = `You are extracting API key purchase parameters from the conversation.\n\nRecent messages:\n{{recentMessages}}\n\nExtract the following as a JSON object:\n- txHash: the USDC transaction hash\n- chainId: chain where USDC was sent (number or \"solana\")\n- amount: USDC amount sent (number, minimum 5)\n- appName: name for the API key\n\nChain IDs for USDC payments:\n Ethereum = 1, Base = 8453, Polygon = 137, Arbitrum = 42161,\n Optimism = 10, BNB Chain = 56, Avalanche = 43114, Solana = \"solana\"\n\nPlatform wallets:\n EVM: 0xAd982CB19aCCa2923Df8F687C0614a7700255a23\n Solana: 6a1mLjefhvSJX1sEX8PTnionbE9DqoYjU6F6bNkT4Ydr\n\nRespond with ONLY the JSON object, no explanation.`;\n\nexport const createMerchantTemplate = `You are extracting merchant creation parameters from the conversation.\n\nRecent messages:\n{{recentMessages}}\n\nExtract the following as a JSON object:\n- companyName: display name for the merchant (required)\n- companyId: unique alphanumeric ID with dashes/underscores (required, e.g. \"acme-coffee\")\n- location: city or region (optional)\n\nRespond with ONLY the JSON object, no explanation.`;\n\nexport const configureTokensTemplate = `You are extracting token tier configuration parameters from the conversation.\n\nRecent messages:\n{{recentMessages}}\n\nExtract the following as a JSON object:\n- merchantId: the merchant ID to configure tokens for (required)\n- ownToken: the merchant's own token config (or null), with:\n - symbol: token symbol (e.g. \"USDC\", \"UNI\")\n - chainId: chain ID number\n - contractAddress: token contract address\n - decimals: token decimals (6 for USDC, 18 for most ERC-20)\n - tiers: array of 1-4 tiers, each with:\n - name: tier name (e.g. \"Bronze\", \"Silver\", \"Gold\")\n - threshold: minimum token balance for this tier\n - discount: discount percentage (1-100)\n- partnerTokens: array of additional token configs (same structure as ownToken), default []\n\nOnboarding chain IDs (only these 11 are supported for token config):\n Ethereum = 1, BNB Chain = 56, Base = 8453, Avalanche = 43114,\n Polygon = 137, Arbitrum = 42161, Optimism = 10, Chiliz = 88888,\n Soneium = 1868, Plume = 98866, World Chain = 480\n\nWell-known contracts:\n USDC on Ethereum = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 (6 decimals)\n USDC on Base = 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 (6 decimals)\n UNI = 0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984 (18 decimals)\n\nRespond with ONLY the JSON object, no explanation.`;\n\nexport const addCreditsTemplate = `You are extracting merchant credit purchase parameters from the conversation.\n\nRecent messages:\n{{recentMessages}}\n\nExtract the following as a JSON object:\n- merchantId: the merchant ID to add credits to (required)\n- txHash: the USDC transaction hash (required)\n- chainId: chain where USDC was sent (number or \"solana\")\n- amount: USDC amount sent (number, minimum 5)\n- updateWallet: true only if the user explicitly wants to change their registered wallet (default false)\n\nChain IDs for USDC payments:\n Ethereum = 1, Base = 8453, Polygon = 137, Arbitrum = 42161,\n Optimism = 10, BNB Chain = 56, Avalanche = 43114, Solana = \"solana\"\n\nPlatform wallets:\n EVM: 0xAd982CB19aCCa2923Df8F687C0614a7700255a23\n Solana: 6a1mLjefhvSJX1sEX8PTnionbE9DqoYjU6F6bNkT4Ydr\n\nRespond with ONLY the JSON object, no explanation.`;\n\nexport const acpDiscountTemplate = `You are extracting ACP discount check parameters from the conversation.\n\nRecent messages:\n{{recentMessages}}\n\nExtract the following as a JSON object:\n- merchantId: the merchant ID (required)\n- wallet: EVM address (0x...) if present\n- solanaWallet: Solana address (base58) if present\n- xrplWallet: XRPL address (r...) if present\n- items: optional array of line items, each with:\n - path: JSONPath reference (e.g. \"$.line_items[0]\")\n - amount: item price in cents\n\nAt least one wallet address is required.\n\nRespond with ONLY the JSON object, no explanation.`;\n\nexport const ucpDiscountTemplate = `You are extracting UCP discount check parameters from the conversation.\n\nRecent messages:\n{{recentMessages}}\n\nExtract the following as a JSON object:\n- merchantId: the merchant ID (required)\n- wallet: EVM address (0x...) if present\n- solanaWallet: Solana address (base58) if present\n- xrplWallet: XRPL address (r...) if present\n- items: optional array of line items, each with:\n - path: JSONPath reference (e.g. \"$.line_items[0]\")\n - amount: item price in cents\n\nAt least one wallet address is required.\n\nRespond with ONLY the JSON object, no explanation.`;\n\nexport const confirmPaymentTemplate = `You are extracting payment confirmation parameters from the conversation.\n\nRecent messages:\n{{recentMessages}}\n\nExtract the following as a JSON object:\n- code: the discount code (INSR-XXXXX format, required)\n- txHash: the USDC transaction hash (required)\n- chainId: chain where USDC was sent (number or \"solana\")\n- amount: USDC amount sent (number or string)\n\nChain IDs for USDC payments:\n Ethereum = 1, Base = 8453, Polygon = 137, Arbitrum = 42161,\n Optimism = 10, BNB Chain = 56, Avalanche = 43114, Solana = \"solana\"\n\nRespond with ONLY the JSON object, no explanation.`;\n","import type {\n Action,\n ActionExample,\n IAgentRuntime,\n Memory,\n State,\n HandlerCallback,\n} from \"@elizaos/core\";\nimport { apiCall, formatAttestResult } from \"../utils/api.js\";\nimport type { AttestParams } from \"../utils/api.js\";\nimport { verifyTemplate } from \"../utils/templates.js\";\n\nexport const verifyWalletAction: Action = {\n name: \"VERIFY_WALLET\",\n description:\n \"Verify on-chain token balances, NFT ownership, EAS attestations, or Farcaster identity for a wallet across 32 blockchains. Returns ECDSA-signed privacy-preserving booleans — never exposes actual balances. Supports EVM, Solana, and XRPL.\",\n similes: [\n \"CHECK_WALLET\",\n \"VERIFY_TOKENS\",\n \"CHECK_TOKEN_BALANCE\",\n \"VERIFY_NFT\",\n \"ATTEST_WALLET\",\n \"ON_CHAIN_VERIFY\",\n \"CHECK_HOLDINGS\",\n \"WALLET_ATTESTATION\",\n ],\n examples: [\n [\n {\n name: \"user\",\n content: {\n text: \"Can you check if 0x1234567890abcdef1234567890abcdef12345678 holds at least 100 UNI?\",\n },\n } as ActionExample,\n {\n name: \"assistant\",\n content: {\n text: \"I'll verify the UNI holdings for that wallet now.\",\n actions: [\"VERIFY_WALLET\"],\n },\n } as ActionExample,\n ],\n [\n {\n name: \"user\",\n content: {\n text: \"Verify if 6a1mLjefhvSJX1sEX8PTnionbE9DqoYjU6F6bNkT4Ydr has USDC on Solana\",\n },\n } as ActionExample,\n {\n name: \"assistant\",\n content: {\n text: \"Checking USDC balance on Solana for that wallet.\",\n actions: [\"VERIFY_WALLET\"],\n },\n } as ActionExample,\n ],\n [\n {\n name: \"user\",\n content: {\n text: \"Does 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045 have a Coinbase KYC attestation?\",\n },\n } as ActionExample,\n {\n name: \"assistant\",\n content: {\n text: \"I'll check for a Coinbase verified account attestation on Base.\",\n actions: [\"VERIFY_WALLET\"],\n },\n } as ActionExample,\n ],\n [\n {\n name: \"user\",\n content: {\n text: \"Check if ra8xqX4QhcogFfxpMxMByvFnXyxw9E8rzY holds at least 10 RLUSD on XRPL\",\n },\n } as ActionExample,\n {\n name: \"assistant\",\n content: {\n text: \"I'll verify RLUSD holdings on XRP Ledger for that wallet.\",\n actions: [\"VERIFY_WALLET\"],\n },\n } as ActionExample,\n ],\n ],\n\n validate: async (runtime: IAgentRuntime, _message: Memory): Promise<boolean> => {\n const apiKey = runtime.getSetting(\"INSUMER_API_KEY\");\n return typeof apiKey === \"string\" && apiKey.startsWith(\"insr_live_\");\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n _options?: Record<string, unknown>,\n callback?: HandlerCallback\n ) => {\n const apiKey = runtime.getSetting(\"INSUMER_API_KEY\") as string;\n\n // Build state if not provided\n if (!state) {\n state = await runtime.composeState(message, []);\n }\n\n // Build extraction prompt\n const prompt = verifyTemplate.replace(\n \"{{recentMessages}}\",\n state.text || message.content.text || \"\"\n );\n\n // Extract structured params via LLM\n const extracted = await runtime.useModel(\"TEXT_SMALL\" as never, {\n prompt,\n stopSequences: [] as string[],\n } as never) as string;\n\n let params: AttestParams;\n try {\n params = JSON.parse(extracted);\n } catch {\n if (callback) {\n await callback({\n text: \"I couldn't extract the verification parameters from the conversation. Please specify a wallet address and what to check (e.g., token balance, NFT ownership, KYC attestation).\",\n });\n }\n return { success: false, text: \"Failed to parse verification parameters\" };\n }\n\n // Validate at least one wallet and one condition\n if (!params.wallet && !params.solanaWallet && !params.xrplWallet) {\n if (callback) {\n await callback({\n text: \"Please provide a wallet address to verify (EVM 0x..., Solana base58, or XRPL r-address).\",\n });\n }\n return { success: false, text: \"No wallet address provided\" };\n }\n if (!params.conditions || params.conditions.length === 0) {\n if (callback) {\n await callback({\n text: \"Please specify what to verify (e.g., token balance, NFT ownership, KYC attestation).\",\n });\n }\n return { success: false, text: \"No conditions provided\" };\n }\n\n // Call InsumerAPI\n const result = await apiCall(apiKey, \"POST\", \"/attest\", params as unknown as Record<string, unknown>);\n\n if (!result.ok) {\n const errMsg = result.error?.message || \"Unknown API error\";\n if (callback) {\n await callback({ text: `Verification failed: ${errMsg}` });\n }\n return { success: false, text: errMsg };\n }\n\n const formatted = formatAttestResult(result.data!);\n if (callback) {\n await callback({ text: formatted });\n }\n return { success: true, text: formatted, data: result.data as Record<string, unknown> };\n },\n};\n","import type {\n Action,\n ActionExample,\n IAgentRuntime,\n Memory,\n State,\n HandlerCallback,\n} from \"@elizaos/core\";\nimport { apiCall, formatTrustResult } from \"../utils/api.js\";\nimport type { TrustParams } from \"../utils/api.js\";\nimport { trustTemplate } from \"../utils/templates.js\";\n\nexport const checkTrustAction: Action = {\n name: \"CHECK_TRUST\",\n description:\n \"Generate an ECDSA-signed wallet trust profile with 17+ checks across stablecoins, governance tokens, NFTs, and staking positions. Returns per-dimension pass/fail counts — no scores, no opinions, just cryptographically verifiable evidence. Supports cross-chain profiles with optional Solana and XRPL wallets. Costs 3 credits.\",\n similes: [\n \"TRUST_PROFILE\",\n \"WALLET_TRUST\",\n \"WALLET_REPUTATION\",\n \"AGENT_TRUST\",\n \"WALLET_PROFILE\",\n \"CHECK_WALLET_TRUST\",\n ],\n examples: [\n [\n {\n name: \"user\",\n content: {\n text: \"What's the trust profile for 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045?\",\n },\n } as ActionExample,\n {\n name: \"assistant\",\n content: {\n text: \"I'll generate a trust profile for that wallet now.\",\n actions: [\"CHECK_TRUST\"],\n },\n } as ActionExample,\n ],\n [\n {\n name: \"user\",\n content: {\n text: \"Check trust for 0xAb5801a7D398351b8bE11C439e05C5B3259aeC9B with Solana wallet 6a1mLjefhvSJX1sEX8PTnionbE9DqoYjU6F6bNkT4Ydr\",\n },\n } as ActionExample,\n {\n name: \"assistant\",\n content: {\n text: \"Generating a cross-chain trust profile for those wallets.\",\n actions: [\"CHECK_TRUST\"],\n },\n } as ActionExample,\n ],\n ],\n\n validate: async (runtime: IAgentRuntime, _message: Memory): Promise<boolean> => {\n const apiKey = runtime.getSetting(\"INSUMER_API_KEY\");\n return typeof apiKey === \"string\" && apiKey.startsWith(\"insr_live_\");\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n _options?: Record<string, unknown>,\n callback?: HandlerCallback\n ) => {\n const apiKey = runtime.getSetting(\"INSUMER_API_KEY\") as string;\n\n if (!state) {\n state = await runtime.composeState(message, []);\n }\n\n const prompt = trustTemplate.replace(\n \"{{recentMessages}}\",\n state.text || message.content.text || \"\"\n );\n\n const extracted = await runtime.useModel(\"TEXT_SMALL\" as never, {\n prompt,\n stopSequences: [] as string[],\n } as never) as string;\n\n let params: TrustParams;\n try {\n params = JSON.parse(extracted);\n } catch {\n if (callback) {\n await callback({\n text: \"I couldn't extract the wallet address from the conversation. Please provide an EVM wallet address (0x...).\",\n });\n }\n return { success: false, text: \"Failed to parse trust parameters\" };\n }\n\n if (!params.wallet) {\n if (callback) {\n await callback({\n text: \"Please provide an EVM wallet address (0x...) to generate a trust profile.\",\n });\n }\n return { success: false, text: \"No wallet address provided\" };\n }\n\n const result = await apiCall(apiKey, \"POST\", \"/trust\", params as unknown as Record<string, unknown>);\n\n if (!result.ok) {\n const errMsg = result.error?.message || \"Unknown API error\";\n if (callback) {\n await callback({ text: `Trust profile failed: ${errMsg}` });\n }\n return { success: false, text: errMsg };\n }\n\n const formatted = formatTrustResult(result.data!);\n if (callback) {\n await callback({ text: formatted });\n }\n return { success: true, text: formatted, data: result.data as Record<string, unknown> };\n },\n};\n","import type {\n Action,\n ActionExample,\n IAgentRuntime,\n Memory,\n State,\n HandlerCallback,\n} from \"@elizaos/core\";\nimport { apiCall, formatBatchResult } from \"../utils/api.js\";\nimport type { BatchTrustParams } from \"../utils/api.js\";\nimport { batchTrustTemplate } from \"../utils/templates.js\";\n\nexport const checkTrustBatchAction: Action = {\n name: \"CHECK_TRUST_BATCH\",\n description:\n \"Generate trust profiles for up to 10 wallets in a single request. Shared block fetches make this 5-8x faster than sequential calls. Each wallet gets an independently ECDSA-signed profile. Supports partial success. Costs 3 credits per successful wallet.\",\n similes: [\n \"BATCH_TRUST\",\n \"BULK_TRUST_CHECK\",\n \"MULTI_WALLET_TRUST\",\n \"CHECK_MULTIPLE_WALLETS\",\n ],\n examples: [\n [\n {\n name: \"user\",\n content: {\n text: \"Check trust profiles for these three wallets: 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045, 0xAb5801a7D398351b8bE11C439e05C5B3259aeC9B, and 0x1234567890abcdef1234567890abcdef12345678\",\n },\n } as ActionExample,\n {\n name: \"assistant\",\n content: {\n text: \"I'll generate trust profiles for all three wallets in a single batch.\",\n actions: [\"CHECK_TRUST_BATCH\"],\n },\n } as ActionExample,\n ],\n ],\n\n validate: async (runtime: IAgentRuntime, _message: Memory): Promise<boolean> => {\n const apiKey = runtime.getSetting(\"INSUMER_API_KEY\");\n return typeof apiKey === \"string\" && apiKey.startsWith(\"insr_live_\");\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n _options?: Record<string, unknown>,\n callback?: HandlerCallback\n ) => {\n const apiKey = runtime.getSetting(\"INSUMER_API_KEY\") as string;\n\n if (!state) {\n state = await runtime.composeState(message, []);\n }\n\n const prompt = batchTrustTemplate.replace(\n \"{{recentMessages}}\",\n state.text || message.content.text || \"\"\n );\n\n const extracted = await runtime.useModel(\"TEXT_SMALL\" as never, {\n prompt,\n stopSequences: [] as string[],\n } as never) as string;\n\n let params: BatchTrustParams;\n try {\n params = JSON.parse(extracted);\n } catch {\n if (callback) {\n await callback({\n text: \"I couldn't extract the wallet addresses from the conversation. Please list the EVM wallet addresses (0x...) you want to check.\",\n });\n }\n return { success: false, text: \"Failed to parse batch parameters\" };\n }\n\n if (!params.wallets || params.wallets.length === 0) {\n if (callback) {\n await callback({\n text: \"Please provide at least one EVM wallet address (0x...) for batch trust profiling.\",\n });\n }\n return { success: false, text: \"No wallets provided\" };\n }\n\n if (params.wallets.length > 10) {\n params.wallets = params.wallets.slice(0, 10);\n }\n\n const result = await apiCall(apiKey, \"POST\", \"/trust/batch\", params as unknown as Record<string, unknown>);\n\n if (!result.ok) {\n const errMsg = result.error?.message || \"Unknown API error\";\n if (callback) {\n await callback({ text: `Batch trust check failed: ${errMsg}` });\n }\n return { success: false, text: errMsg };\n }\n\n const formatted = formatBatchResult(result.data!);\n if (callback) {\n await callback({ text: formatted });\n }\n return { success: true, text: formatted, data: result.data as Record<string, unknown> };\n },\n};\n","import type {\n Action,\n ActionExample,\n IAgentRuntime,\n Memory,\n State,\n HandlerCallback,\n} from \"@elizaos/core\";\nimport { publicApiCall } from \"../utils/api.js\";\nimport { buyKeyTemplate } from \"../utils/templates.js\";\n\ninterface BuyKeyParams {\n txHash: string;\n chainId: number | \"solana\";\n amount: number;\n appName: string;\n}\n\nexport const buyKeyAction: Action = {\n name: \"BUY_API_KEY\",\n description:\n \"Buy a new InsumerAPI key with USDC. No existing API key required. Send USDC to the platform wallet, then provide the transaction hash. The sender wallet becomes the key's identity. One key per wallet.\",\n similes: [\n \"PURCHASE_API_KEY\",\n \"GET_API_KEY\",\n \"BUY_KEY\",\n \"CREATE_API_KEY\",\n \"ONBOARD_AGENT\",\n ],\n examples: [\n [\n {\n name: \"user\",\n content: {\n text: \"I sent 10 USDC on Base, tx hash 0xabc123. Get me an API key for my agent called 'TrustBot'.\",\n },\n } as ActionExample,\n {\n name: \"assistant\",\n content: {\n text: \"I'll verify your USDC payment and create your API key now.\",\n actions: [\"BUY_API_KEY\"],\n },\n } as ActionExample,\n ],\n ],\n\n validate: async (_runtime: IAgentRuntime, _message: Memory): Promise<boolean> => {\n // No API key required — this is the endpoint that creates one\n return true;\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n _options?: Record<string, unknown>,\n callback?: HandlerCallback\n ) => {\n // Build state if not provided\n if (!state) {\n state = await runtime.composeState(message, []);\n }\n\n // Build extraction prompt\n const prompt = buyKeyTemplate.replace(\n \"{{recentMessages}}\",\n state.text || message.content.text || \"\"\n );\n\n // Extract structured params via LLM\n const extracted = await runtime.useModel(\"TEXT_SMALL\" as never, {\n prompt,\n stopSequences: [] as string[],\n } as never) as string;\n\n let params: BuyKeyParams;\n try {\n params = JSON.parse(extracted);\n } catch {\n if (callback) {\n await callback({\n text: \"I couldn't extract the purchase parameters. Please provide: transaction hash, chain (e.g. Base, Ethereum, Solana), USDC amount, and a name for your key.\",\n });\n }\n return { success: false, text: \"Failed to parse purchase parameters\" };\n }\n\n if (!params.txHash) {\n if (callback) {\n await callback({ text: \"Please provide the USDC transaction hash.\" });\n }\n return { success: false, text: \"No transaction hash provided\" };\n }\n if (!params.appName) {\n if (callback) {\n await callback({ text: \"Please provide a name for your API key.\" });\n }\n return { success: false, text: \"No app name provided\" };\n }\n\n // Call InsumerAPI (public endpoint, no auth needed)\n const result = await publicApiCall(\"POST\", \"/keys/buy\", params as unknown as Record<string, unknown>);\n\n if (!result.ok) {\n const errMsg = result.error?.message || \"Unknown API error\";\n if (callback) {\n await callback({ text: `Key purchase failed: ${errMsg}` });\n }\n return { success: false, text: errMsg };\n }\n\n const data = result.data as Record<string, unknown>;\n const text = [\n `API key created successfully!`,\n ``,\n `Key: ${data.key}`,\n `Name: ${data.name}`,\n `Credits: ${data.creditsAdded}`,\n `Wallet: ${data.registeredWallet}`,\n ``,\n `Store this key securely — it is only shown once.`,\n `Use it as your INSUMER_API_KEY to access all verification endpoints.`,\n ].join(\"\\n\");\n\n if (callback) {\n await callback({ text });\n }\n return { success: true, text, data };\n },\n};\n","import type {\n Action,\n ActionExample,\n IAgentRuntime,\n Memory,\n State,\n HandlerCallback,\n} from \"@elizaos/core\";\nimport { apiCall } from \"../utils/api.js\";\nimport { createMerchantTemplate } from \"../utils/templates.js\";\n\ninterface CreateMerchantParams {\n companyName: string;\n companyId: string;\n location?: string;\n}\n\nexport const createMerchantAction: Action = {\n name: \"CREATE_MERCHANT\",\n description:\n \"Create a new merchant on InsumerAPI. The agent's API key becomes the merchant owner. Receives 100 free verification credits. Max 10 merchants per API key.\",\n similes: [\n \"NEW_MERCHANT\",\n \"SETUP_MERCHANT\",\n \"REGISTER_MERCHANT\",\n \"ONBOARD_MERCHANT\",\n \"CREATE_STORE\",\n ],\n examples: [\n [\n {\n name: \"user\",\n content: {\n text: \"Create a merchant called 'Acme Coffee' with ID acme-coffee, located in New York.\",\n },\n } as ActionExample,\n {\n name: \"assistant\",\n content: {\n text: \"I'll create the Acme Coffee merchant now.\",\n actions: [\"CREATE_MERCHANT\"],\n },\n } as ActionExample,\n ],\n ],\n\n validate: async (runtime: IAgentRuntime, _message: Memory): Promise<boolean> => {\n const apiKey = runtime.getSetting(\"INSUMER_API_KEY\");\n return typeof apiKey === \"string\" && apiKey.startsWith(\"insr_live_\");\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n _options?: Record<string, unknown>,\n callback?: HandlerCallback\n ) => {\n const apiKey = runtime.getSetting(\"INSUMER_API_KEY\") as string;\n\n if (!state) {\n state = await runtime.composeState(message, []);\n }\n\n const prompt = createMerchantTemplate.replace(\n \"{{recentMessages}}\",\n state.text || message.content.text || \"\"\n );\n\n const extracted = await runtime.useModel(\"TEXT_SMALL\" as never, {\n prompt,\n stopSequences: [] as string[],\n } as never) as string;\n\n let params: CreateMerchantParams;\n try {\n params = JSON.parse(extracted);\n } catch {\n if (callback) {\n await callback({\n text: \"I couldn't extract the merchant details. Please provide a company name and a unique ID (alphanumeric, dashes, underscores).\",\n });\n }\n return { success: false, text: \"Failed to parse merchant parameters\" };\n }\n\n if (!params.companyName || !params.companyId) {\n if (callback) {\n await callback({\n text: \"Please provide both a company name and a unique company ID (e.g. 'acme-coffee').\",\n });\n }\n return { success: false, text: \"Missing required merchant fields\" };\n }\n\n const result = await apiCall(apiKey, \"POST\", \"/merchants\", params as unknown as Record<string, unknown>);\n\n if (!result.ok) {\n const errMsg = result.error?.message || \"Unknown API error\";\n if (callback) {\n await callback({ text: `Merchant creation failed: ${errMsg}` });\n }\n return { success: false, text: errMsg };\n }\n\n const data = result.data as Record<string, unknown>;\n const text = [\n `Merchant created successfully!`,\n ``,\n `ID: ${data.id}`,\n `Name: ${data.companyName}`,\n `Credits: ${data.credits} (free starter credits)`,\n ``,\n `Next steps: configure token tiers with CONFIGURE_TOKENS, then add credits with ADD_CREDITS.`,\n ].join(\"\\n\");\n\n if (callback) {\n await callback({ text });\n }\n return { success: true, text, data };\n },\n};\n","import type {\n Action,\n ActionExample,\n IAgentRuntime,\n Memory,\n State,\n HandlerCallback,\n} from \"@elizaos/core\";\nimport { apiCall } from \"../utils/api.js\";\nimport { configureTokensTemplate } from \"../utils/templates.js\";\n\ninterface TokenTier {\n name: string;\n threshold: number;\n discount: number;\n}\n\ninterface TokenConfig {\n symbol: string;\n chainId: number;\n contractAddress: string;\n decimals: number;\n tiers: TokenTier[];\n}\n\ninterface ConfigureTokensParams {\n merchantId: string;\n ownToken?: TokenConfig | null;\n partnerTokens?: TokenConfig[];\n}\n\nexport const configureTokensAction: Action = {\n name: \"CONFIGURE_TOKENS\",\n description:\n \"Configure which tokens gate access to merchant discounts and set tier thresholds. Supports own token + up to 7 partner tokens with 1-4 discount tiers each. Limited to 11 onboarding chains.\",\n similes: [\n \"SET_TOKEN_TIERS\",\n \"CONFIGURE_TOKEN_GATING\",\n \"SETUP_TOKENS\",\n \"TOKEN_TIERS\",\n \"SET_DISCOUNTS\",\n ],\n examples: [\n [\n {\n name: \"user\",\n content: {\n text: \"Set up USDC token gating for merchant acme-coffee: Bronze at 100 USDC (5% off), Silver at 1000 (10%), Gold at 10000 (15%) on Ethereum.\",\n },\n } as ActionExample,\n {\n name: \"assistant\",\n content: {\n text: \"I'll configure the USDC token tiers for acme-coffee now.\",\n actions: [\"CONFIGURE_TOKENS\"],\n },\n } as ActionExample,\n ],\n ],\n\n validate: async (runtime: IAgentRuntime, _message: Memory): Promise<boolean> => {\n const apiKey = runtime.getSetting(\"INSUMER_API_KEY\");\n return typeof apiKey === \"string\" && apiKey.startsWith(\"insr_live_\");\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n _options?: Record<string, unknown>,\n callback?: HandlerCallback\n ) => {\n const apiKey = runtime.getSetting(\"INSUMER_API_KEY\") as string;\n\n if (!state) {\n state = await runtime.composeState(message, []);\n }\n\n const prompt = configureTokensTemplate.replace(\n \"{{recentMessages}}\",\n state.text || message.content.text || \"\"\n );\n\n const extracted = await runtime.useModel(\"TEXT_SMALL\" as never, {\n prompt,\n stopSequences: [] as string[],\n } as never) as string;\n\n let params: ConfigureTokensParams;\n try {\n params = JSON.parse(extracted);\n } catch {\n if (callback) {\n await callback({\n text: \"I couldn't extract the token configuration. Please specify a merchant ID, token symbol, chain, contract address, and discount tiers.\",\n });\n }\n return { success: false, text: \"Failed to parse token configuration\" };\n }\n\n if (!params.merchantId) {\n if (callback) {\n await callback({ text: \"Please provide the merchant ID to configure tokens for.\" });\n }\n return { success: false, text: \"No merchant ID provided\" };\n }\n\n const { merchantId, ...body } = params;\n const result = await apiCall(apiKey, \"PUT\", `/merchants/${merchantId}/tokens`, body as unknown as Record<string, unknown>);\n\n if (!result.ok) {\n const errMsg = result.error?.message || \"Unknown API error\";\n if (callback) {\n await callback({ text: `Token configuration failed: ${errMsg}` });\n }\n return { success: false, text: errMsg };\n }\n\n const data = result.data as Record<string, unknown>;\n const text = [\n `Token tiers configured for ${merchantId}!`,\n ``,\n `Total tokens: ${data.totalTokens}/${data.maxTokens}`,\n ].join(\"\\n\");\n\n if (callback) {\n await callback({ text });\n }\n return { success: true, text, data };\n },\n};\n","import type {\n Action,\n ActionExample,\n IAgentRuntime,\n Memory,\n State,\n HandlerCallback,\n} from \"@elizaos/core\";\nimport { apiCall } from \"../utils/api.js\";\nimport { addCreditsTemplate } from \"../utils/templates.js\";\n\ninterface AddCreditsParams {\n merchantId: string;\n txHash: string;\n chainId: number | \"solana\";\n amount: number;\n updateWallet?: boolean;\n}\n\nexport const addCreditsAction: Action = {\n name: \"ADD_CREDITS\",\n description:\n \"Buy merchant verification credits with USDC. Send USDC to the platform wallet, then provide the tx hash. Credits are consumed by discount code generation (POST /v1/verify, ACP, UCP). Volume discounts apply.\",\n similes: [\n \"BUY_MERCHANT_CREDITS\",\n \"TOP_UP_CREDITS\",\n \"ADD_MERCHANT_CREDITS\",\n \"PURCHASE_CREDITS\",\n ],\n examples: [\n [\n {\n name: \"user\",\n content: {\n text: \"I sent 20 USDC on Base (tx 0xabc123) to top up credits for merchant acme-coffee.\",\n },\n } as ActionExample,\n {\n name: \"assistant\",\n content: {\n text: \"I'll verify the payment and add credits to acme-coffee now.\",\n actions: [\"ADD_CREDITS\"],\n },\n } as ActionExample,\n ],\n ],\n\n validate: async (runtime: IAgentRuntime, _message: Memory): Promise<boolean> => {\n const apiKey = runtime.getSetting(\"INSUMER_API_KEY\");\n return typeof apiKey === \"string\" && apiKey.startsWith(\"insr_live_\");\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n _options?: Record<string, unknown>,\n callback?: HandlerCallback\n ) => {\n const apiKey = runtime.getSetting(\"INSUMER_API_KEY\") as string;\n\n if (!state) {\n state = await runtime.composeState(message, []);\n }\n\n const prompt = addCreditsTemplate.replace(\n \"{{recentMessages}}\",\n state.text || message.content.text || \"\"\n );\n\n const extracted = await runtime.useModel(\"TEXT_SMALL\" as never, {\n prompt,\n stopSequences: [] as string[],\n } as never) as string;\n\n let params: AddCreditsParams;\n try {\n params = JSON.parse(extracted);\n } catch {\n if (callback) {\n await callback({\n text: \"I couldn't extract the credit purchase details. Please provide: merchant ID, transaction hash, chain, and USDC amount.\",\n });\n }\n return { success: false, text: \"Failed to parse credit purchase parameters\" };\n }\n\n if (!params.merchantId || !params.txHash) {\n if (callback) {\n await callback({ text: \"Please provide the merchant ID and USDC transaction hash.\" });\n }\n return { success: false, text: \"Missing merchant ID or tx hash\" };\n }\n\n const { merchantId, ...body } = params;\n const result = await apiCall(apiKey, \"POST\", `/merchants/${merchantId}/credits`, body as unknown as Record<string, unknown>);\n\n if (!result.ok) {\n const errMsg = result.error?.message || \"Unknown API error\";\n if (callback) {\n await callback({ text: `Credit purchase failed: ${errMsg}` });\n }\n return { success: false, text: errMsg };\n }\n\n const data = result.data as Record<string, unknown>;\n const text = [\n `Credits added to ${merchantId}!`,\n ``,\n `Credits added: ${data.creditsAdded}`,\n `Total credits: ${data.totalCredits}`,\n `USDC paid: ${data.usdcPaid}`,\n `Chain: ${data.chainName}`,\n ].join(\"\\n\");\n\n if (callback) {\n await callback({ text });\n }\n return { success: true, text, data };\n },\n};\n","import type {\n Action,\n ActionExample,\n IAgentRuntime,\n Memory,\n State,\n HandlerCallback,\n} from \"@elizaos/core\";\nimport { apiCall } from \"../utils/api.js\";\nimport { acpDiscountTemplate } from \"../utils/templates.js\";\n\ninterface AcpDiscountParams {\n merchantId: string;\n wallet?: string;\n solanaWallet?: string;\n xrplWallet?: string;\n items?: Array<{ path: string; amount: number }>;\n}\n\nexport const acpDiscountAction: Action = {\n name: \"ACP_DISCOUNT\",\n description:\n \"Check discount eligibility in OpenAI/Stripe Agentic Commerce Protocol (ACP) format. Returns coupon objects, allocations, and a signed verification code. Costs 1 merchant credit.\",\n similes: [\n \"ACP_CHECK\",\n \"OPENAI_DISCOUNT\",\n \"STRIPE_DISCOUNT\",\n \"AGENTIC_COMMERCE_DISCOUNT\",\n \"CHECK_ACP_DISCOUNT\",\n ],\n examples: [\n [\n {\n name: \"user\",\n content: {\n text: \"Check ACP discount for wallet 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045 at merchant acme-coffee.\",\n },\n } as ActionExample,\n {\n name: \"assistant\",\n content: {\n text: \"I'll check the ACP discount eligibility now.\",\n actions: [\"ACP_DISCOUNT\"],\n },\n } as ActionExample,\n ],\n ],\n\n validate: async (runtime: IAgentRuntime, _message: Memory): Promise<boolean> => {\n const apiKey = runtime.getSetting(\"INSUMER_API_KEY\");\n return typeof apiKey === \"string\" && apiKey.startsWith(\"insr_live_\");\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n _options?: Record<string, unknown>,\n callback?: HandlerCallback\n ) => {\n const apiKey = runtime.getSetting(\"INSUMER_API_KEY\") as string;\n\n if (!state) {\n state = await runtime.composeState(message, []);\n }\n\n const prompt = acpDiscountTemplate.replace(\n \"{{recentMessages}}\",\n state.text || message.content.text || \"\"\n );\n\n const extracted = await runtime.useModel(\"TEXT_SMALL\" as never, {\n prompt,\n stopSequences: [] as string[],\n } as never) as string;\n\n let params: AcpDiscountParams;\n try {\n params = JSON.parse(extracted);\n } catch {\n if (callback) {\n await callback({\n text: \"I couldn't extract the discount parameters. Please provide a merchant ID and wallet address.\",\n });\n }\n return { success: false, text: \"Failed to parse ACP discount parameters\" };\n }\n\n if (!params.merchantId) {\n if (callback) {\n await callback({ text: \"Please provide the merchant ID.\" });\n }\n return { success: false, text: \"No merchant ID provided\" };\n }\n if (!params.wallet && !params.solanaWallet && !params.xrplWallet) {\n if (callback) {\n await callback({ text: \"Please provide a wallet address to check discount eligibility.\" });\n }\n return { success: false, text: \"No wallet address provided\" };\n }\n\n const result = await apiCall(apiKey, \"POST\", \"/acp/discount\", params as unknown as Record<string, unknown>);\n\n if (!result.ok) {\n const errMsg = result.error?.message || \"Unknown API error\";\n if (callback) {\n await callback({ text: `ACP discount check failed: ${errMsg}` });\n }\n return { success: false, text: errMsg };\n }\n\n const data = result.data as Record<string, unknown>;\n const discounts = data.discounts as Record<string, unknown> | undefined;\n const codes = (discounts?.codes || []) as string[];\n const verification = data.verification as Record<string, unknown> | undefined;\n\n const lines = [`ACP Discount Result`, ``];\n if (codes.length > 0) {\n lines.push(`Discount code: ${codes[0]}`);\n }\n if (verification) {\n lines.push(`Verification code: ${verification.code}`);\n lines.push(`Discount: ${verification.totalDiscount}%`);\n }\n if (codes.length === 0 && !verification) {\n lines.push(`No discount eligible for this wallet at this merchant.`);\n }\n\n const text = lines.join(\"\\n\");\n if (callback) {\n await callback({ text });\n }\n return { success: true, text, data };\n },\n};\n","import type {\n Action,\n ActionExample,\n IAgentRuntime,\n Memory,\n State,\n HandlerCallback,\n} from \"@elizaos/core\";\nimport { apiCall } from \"../utils/api.js\";\nimport { ucpDiscountTemplate } from \"../utils/templates.js\";\n\ninterface UcpDiscountParams {\n merchantId: string;\n wallet?: string;\n solanaWallet?: string;\n xrplWallet?: string;\n items?: Array<{ path: string; amount: number }>;\n}\n\nexport const ucpDiscountAction: Action = {\n name: \"UCP_DISCOUNT\",\n description:\n \"Check discount eligibility in Google Universal Commerce Protocol (UCP) format. Returns title-based discounts, allocations, and a signed verification code. Costs 1 merchant credit.\",\n similes: [\n \"UCP_CHECK\",\n \"GOOGLE_DISCOUNT\",\n \"UNIVERSAL_COMMERCE_DISCOUNT\",\n \"CHECK_UCP_DISCOUNT\",\n ],\n examples: [\n [\n {\n name: \"user\",\n content: {\n text: \"Check UCP discount for wallet 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045 at merchant acme-coffee.\",\n },\n } as ActionExample,\n {\n name: \"assistant\",\n content: {\n text: \"I'll check the UCP discount eligibility now.\",\n actions: [\"UCP_DISCOUNT\"],\n },\n } as ActionExample,\n ],\n ],\n\n validate: async (runtime: IAgentRuntime, _message: Memory): Promise<boolean> => {\n const apiKey = runtime.getSetting(\"INSUMER_API_KEY\");\n return typeof apiKey === \"string\" && apiKey.startsWith(\"insr_live_\");\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n _options?: Record<string, unknown>,\n callback?: HandlerCallback\n ) => {\n const apiKey = runtime.getSetting(\"INSUMER_API_KEY\") as string;\n\n if (!state) {\n state = await runtime.composeState(message, []);\n }\n\n const prompt = ucpDiscountTemplate.replace(\n \"{{recentMessages}}\",\n state.text || message.content.text || \"\"\n );\n\n const extracted = await runtime.useModel(\"TEXT_SMALL\" as never, {\n prompt,\n stopSequences: [] as string[],\n } as never) as string;\n\n let params: UcpDiscountParams;\n try {\n params = JSON.parse(extracted);\n } catch {\n if (callback) {\n await callback({\n text: \"I couldn't extract the discount parameters. Please provide a merchant ID and wallet address.\",\n });\n }\n return { success: false, text: \"Failed to parse UCP discount parameters\" };\n }\n\n if (!params.merchantId) {\n if (callback) {\n await callback({ text: \"Please provide the merchant ID.\" });\n }\n return { success: false, text: \"No merchant ID provided\" };\n }\n if (!params.wallet && !params.solanaWallet && !params.xrplWallet) {\n if (callback) {\n await callback({ text: \"Please provide a wallet address to check discount eligibility.\" });\n }\n return { success: false, text: \"No wallet address provided\" };\n }\n\n const result = await apiCall(apiKey, \"POST\", \"/ucp/discount\", params as unknown as Record<string, unknown>);\n\n if (!result.ok) {\n const errMsg = result.error?.message || \"Unknown API error\";\n if (callback) {\n await callback({ text: `UCP discount check failed: ${errMsg}` });\n }\n return { success: false, text: errMsg };\n }\n\n const data = result.data as Record<string, unknown>;\n const discounts = data.discounts as Record<string, unknown> | undefined;\n const codes = (discounts?.codes || []) as string[];\n const verification = data.verification as Record<string, unknown> | undefined;\n\n const lines = [`UCP Discount Result`, ``];\n if (codes.length > 0) {\n lines.push(`Discount code: ${codes[0]}`);\n }\n if (verification) {\n lines.push(`Verification code: ${verification.code}`);\n lines.push(`Discount: ${verification.totalDiscount}%`);\n }\n if (codes.length === 0 && !verification) {\n lines.push(`No discount eligible for this wallet at this merchant.`);\n }\n\n const text = lines.join(\"\\n\");\n if (callback) {\n await callback({ text });\n }\n return { success: true, text, data };\n },\n};\n","import type {\n Action,\n ActionExample,\n IAgentRuntime,\n Memory,\n State,\n HandlerCallback,\n} from \"@elizaos/core\";\nimport { apiCall } from \"../utils/api.js\";\nimport { confirmPaymentTemplate } from \"../utils/templates.js\";\n\ninterface ConfirmPaymentParams {\n code: string;\n txHash: string;\n chainId: number | \"solana\";\n amount: number | string;\n}\n\nexport const confirmPaymentAction: Action = {\n name: \"CONFIRM_PAYMENT\",\n description:\n \"Confirm that a USDC payment was made on-chain for a discount code. Verifies the transaction receipt to ensure USDC arrived at the merchant address. Use after ACP_DISCOUNT or UCP_DISCOUNT.\",\n similes: [\n \"VERIFY_PAYMENT\",\n \"CONFIRM_USDC\",\n \"PAYMENT_CONFIRMATION\",\n \"CHECK_PAYMENT\",\n ],\n examples: [\n [\n {\n name: \"user\",\n content: {\n text: \"Confirm payment for code INSR-A7K3M. I sent 25 USDC on Base, tx hash 0xdef456.\",\n },\n } as ActionExample,\n {\n name: \"assistant\",\n content: {\n text: \"I'll verify the USDC payment for that discount code now.\",\n actions: [\"CONFIRM_PAYMENT\"],\n },\n } as ActionExample,\n ],\n ],\n\n validate: async (runtime: IAgentRuntime, _message: Memory): Promise<boolean> => {\n const apiKey = runtime.getSetting(\"INSUMER_API_KEY\");\n return typeof apiKey === \"string\" && apiKey.startsWith(\"insr_live_\");\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n _options?: Record<string, unknown>,\n callback?: HandlerCallback\n ) => {\n const apiKey = runtime.getSetting(\"INSUMER_API_KEY\") as string;\n\n if (!state) {\n state = await runtime.composeState(message, []);\n }\n\n const prompt = confirmPaymentTemplate.replace(\n \"{{recentMessages}}\",\n state.text || message.content.text || \"\"\n );\n\n const extracted = await runtime.useModel(\"TEXT_SMALL\" as never, {\n prompt,\n stopSequences: [] as string[],\n } as never) as string;\n\n let params: ConfirmPaymentParams;\n try {\n params = JSON.parse(extracted);\n } catch {\n if (callback) {\n await callback({\n text: \"I couldn't extract the payment details. Please provide: discount code (INSR-XXXXX), transaction hash, chain, and USDC amount.\",\n });\n }\n return { success: false, text: \"Failed to parse payment parameters\" };\n }\n\n if (!params.code || !params.txHash) {\n if (callback) {\n await callback({ text: \"Please provide the discount code (INSR-XXXXX) and transaction hash.\" });\n }\n return { success: false, text: \"Missing code or tx hash\" };\n }\n\n const result = await apiCall(apiKey, \"POST\", \"/payment/confirm\", params as unknown as Record<string, unknown>);\n\n if (!result.ok) {\n const errMsg = result.error?.message || \"Unknown API error\";\n if (callback) {\n await callback({ text: `Payment confirmation failed: ${errMsg}` });\n }\n return { success: false, text: errMsg };\n }\n\n const data = result.data as Record<string, unknown>;\n const confirmed = data.confirmed as boolean;\n const text = confirmed\n ? [\n `Payment confirmed!`,\n ``,\n `Code: ${data.code}`,\n `Amount verified: ${data.amountVerified} USDC`,\n `Chain: ${data.chainName}`,\n `Confirmed at: ${data.confirmedAt}`,\n ].join(\"\\n\")\n : `Payment not confirmed. The transaction could not be verified.`;\n\n if (callback) {\n await callback({ text });\n }\n return { success: true, text, data };\n },\n};\n","import type {\n Provider,\n IAgentRuntime,\n Memory,\n} from \"@elizaos/core\";\n\n// Wallet address patterns\nconst EVM_REGEX = /\\b0x[a-fA-F0-9]{40}\\b/g;\nconst SOLANA_REGEX = /\\b[1-9A-HJ-NP-Za-km-z]{32,44}\\b/g;\nconst XRPL_REGEX = /\\br[1-9A-HJ-NP-Za-km-z]{24,34}\\b/g;\n\n// Common false positives for Solana regex (transaction hashes, etc.)\nfunction isSolanaAddress(candidate: string): boolean {\n // Solana addresses are 32-44 chars of base58\n return candidate.length >= 32 && candidate.length <= 44;\n}\n\nexport const walletCredentialsProvider: Provider = {\n name: \"WALLET_CREDENTIALS\",\n description:\n \"Detects wallet addresses in conversation and signals that InsumerAPI verification actions are available.\",\n dynamic: true,\n\n get: async (\n runtime: IAgentRuntime,\n message: Memory\n ) => {\n // Silent if no API key configured\n const apiKey = runtime.getSetting(\"INSUMER_API_KEY\");\n if (!apiKey || typeof apiKey !== \"string\" || !apiKey.startsWith(\"insr_live_\")) {\n return { text: \"\" };\n }\n\n const text = message.content.text || \"\";\n\n const evmWallets = text.match(EVM_REGEX) || [];\n const solanaMatches = (text.match(SOLANA_REGEX) || []).filter(isSolanaAddress);\n const xrplWallets = text.match(XRPL_REGEX) || [];\n\n // Filter Solana matches that overlap with EVM or XRPL\n const evmSet = new Set(evmWallets);\n const xrplSet = new Set(xrplWallets);\n const solanaWallets = solanaMatches.filter(\n (s) => !evmSet.has(s) && !xrplSet.has(s)\n );\n\n const detected: string[] = [];\n if (evmWallets.length > 0) {\n detected.push(`EVM: ${evmWallets.join(\", \")}`);\n }\n if (solanaWallets.length > 0) {\n detected.push(`Solana: ${solanaWallets.join(\", \")}`);\n }\n if (xrplWallets.length > 0) {\n detected.push(`XRPL: ${xrplWallets.join(\", \")}`);\n }\n\n if (detected.length === 0) {\n return { text: \"\" };\n }\n\n return {\n text: `InsumerAPI is available for on-chain verification. Detected wallets: ${detected.join(\"; \")}. You can use VERIFY_WALLET to check token balances/NFTs/attestations, or CHECK_TRUST for a full trust profile.`,\n };\n },\n};\n","import type { Plugin } from \"@elizaos/core\";\nimport { verifyWalletAction } from \"./actions/verify.js\";\nimport { checkTrustAction } from \"./actions/trust.js\";\nimport { checkTrustBatchAction } from \"./actions/batch.js\";\nimport { buyKeyAction } from \"./actions/buy_key.js\";\nimport { createMerchantAction } from \"./actions/create_merchant.js\";\nimport { configureTokensAction } from \"./actions/configure_tokens.js\";\nimport { addCreditsAction } from \"./actions/add_credits.js\";\nimport { acpDiscountAction } from \"./actions/acp_discount.js\";\nimport { ucpDiscountAction } from \"./actions/ucp_discount.js\";\nimport { confirmPaymentAction } from \"./actions/confirm_payment.js\";\nimport { walletCredentialsProvider } from \"./providers/credentials.js\";\n\nexport const insumerPlugin: Plugin = {\n name: \"insumer\",\n description:\n \"Full autonomous agent lifecycle for token-gated commerce across 32 blockchains. 10 actions: buy API key, create merchant, configure token tiers, add credits, verify wallets, trust profiles, ACP/UCP commerce, confirm payments. ECDSA-signed results, never exposes balances.\",\n actions: [\n verifyWalletAction,\n checkTrustAction,\n checkTrustBatchAction,\n buyKeyAction,\n createMerchantAction,\n configureTokensAction,\n addCreditsAction,\n acpDiscountAction,\n ucpDiscountAction,\n confirmPaymentAction,\n ],\n providers: [walletCredentialsProvider],\n};\n\nexport default insumerPlugin;\n"],"mappings":";AAAA,IAAM,WAAW;AAqDjB,eAAsB,QACpB,QACA,QACA,MACA,MACsB;AACtB,QAAM,MAAM,GAAG,QAAQ,GAAG,IAAI;AAC9B,QAAM,MAAM,MAAM,MAAM,KAAK;AAAA,IAC3B;AAAA,IACA,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,aAAa;AAAA,IACf;AAAA,IACA,MAAM,OAAO,KAAK,UAAU,IAAI,IAAI;AAAA,EACtC,CAAC;AACD,SAAO,IAAI,KAAK;AAClB;AAEA,eAAsB,cACpB,QACA,MACA,MACsB;AACtB,QAAM,MAAM,GAAG,QAAQ,GAAG,IAAI;AAC9B,QAAM,MAAM,MAAM,MAAM,KAAK;AAAA,IAC3B;AAAA,IACA,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAC9C,MAAM,OAAO,KAAK,UAAU,IAAI,IAAI;AAAA,EACtC,CAAC;AACD,SAAO,IAAI,KAAK;AAClB;AA4BO,SAAS,mBAAmB,MAAuC;AACxE,QAAM,cAAc,KAAK;AACzB,QAAM,KAAK,aAAa;AACxB,QAAM,OAAO,aAAa;AAC1B,QAAM,UAAW,aAAa,WAAW,CAAC;AAC1C,QAAM,QAAkB;AAAA,IACtB,eAAe,EAAE,KAAK,OAAO,SAAS,MAAM;AAAA,IAC5C;AAAA,EACF;AACA,aAAW,KAAK,SAAS;AACvB,UAAM,OAAO,EAAE,MAAM,MAAM;AAC3B,UAAM,QACJ,EAAE,YAAY,SAAY,WAAW,EAAE,OAAO,MAAM;AACtD,QAAI,QAAQ;AACZ,QAAI,EAAE,gBAAgB,QAAW;AAC/B,eAAS,aAAa,EAAE,WAAW;AAAA,IACrC;AACA,QAAI,EAAE,gBAAgB,QAAQ;AAC5B,eAAS;AAAA,IACX;AACA,UAAM,KAAK,MAAM,IAAI,KAAK,EAAE,SAAS,EAAE,IAAI,GAAG,KAAK,GAAG,KAAK,EAAE;AAAA,EAC/D;AACA,QAAM,YAAY,aAAa;AAC/B,QAAM,YAAY,aAAa;AAC/B,QAAM,KAAK,IAAI,GAAG,SAAS,YAAY,SAAS,SAAS;AACzD,MAAI,aAAa,WAAW;AAC1B,UAAM,KAAK,YAAY,YAAY,SAAS,EAAE;AAAA,EAChD;AACA,MAAI,KAAK,KAAK;AACZ,UAAM,KAAK,IAAI,QAAQ,KAAK,GAAG,EAAE;AAAA,EACnC;AACA,SAAO,MAAM,KAAK,IAAI;AACxB;AAMO,SAAS,kBAAkB,MAAuC;AACvE,QAAM,QAAQ,KAAK;AACnB,QAAM,KAAK,OAAO;AAClB,QAAM,aAAa,OAAO;AAC1B,QAAM,UAAU,OAAO;AACvB,QAAM,QAAkB,CAAC,iBAAiB,EAAE,IAAI,EAAE;AAClD,MAAI,YAAY;AACd,eAAW,CAAC,MAAM,GAAG,KAAK,OAAO,QAAQ,UAAU,GAAG;AACpD,YAAM;AAAA,QACJ,KAAK,IAAI,KAAK,IAAI,SAAS,IAAI,IAAI,KAAK;AAAA,MAC1C;AACA,iBAAW,SAAS,IAAI,QAAQ;AAC9B,cAAM,OAAO,MAAM,MAAM,MAAM;AAC/B,cAAM,KAAK,QAAQ,IAAI,KAAK,MAAM,KAAK,EAAE;AAAA,MAC3C;AAAA,IACF;AAAA,EACF;AACA,MAAI,SAAS;AACX,UAAM;AAAA,MACJ;AAAA,MACA,YAAY,QAAQ,WAAW,IAAI,QAAQ,WAAW;AAAA,IACxD;AAAA,EACF;AACA,SAAO,MAAM,KAAK,IAAI;AACxB;AAMO,SAAS,kBAAkB,MAAuC;AACvE,QAAM,UAAW,KAAK,WAAW,CAAC;AAClC,QAAM,eAAe,KAAK;AAC1B,QAAM,QAAkB,CAAC,gBAAgB,QAAQ,MAAM,aAAa,EAAE;AACtE,aAAW,UAAU,SAAS;AAC5B,QAAI,OAAO,OAAO;AAChB,YAAM,MAAM,OAAO;AACnB,YAAM,KAAK,KAAK,IAAI,MAAM,kBAAa,IAAI,OAAO,EAAE;AAAA,IACtD,OAAO;AACL,YAAM,QAAQ,OAAO;AACrB,YAAM,UAAU,OAAO;AACvB,YAAM;AAAA,QACJ,KAAK,OAAO,MAAM,KAAK,SAAS,eAAe,GAAG,IAAI,SAAS,eAAe,GAAG,mBAAmB,OAAO,EAAE;AAAA,MAC/G;AAAA,IACF;AAAA,EACF;AACA,MAAI,cAAc;AAChB,UAAM,KAAK,IAAI,GAAG,aAAa,SAAS,IAAI,aAAa,SAAS,YAAY;AAAA,EAChF;AACA,SAAO,MAAM,KAAK,IAAI;AACxB;;;ACvMO,IAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkEvB,IAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AActB,IAAM,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAe3B,IAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBvB,IAAM,yBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAY/B,IAAM,0BAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA8BhC,IAAM,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsB3B,IAAM,sBAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkB5B,IAAM,sBAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkB5B,IAAM,yBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AC5M/B,IAAM,qBAA6B;AAAA,EACxC,MAAM;AAAA,EACN,aACE;AAAA,EACF,SAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS,CAAC,eAAe;AAAA,QAC3B;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS,CAAC,eAAe;AAAA,QAC3B;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS,CAAC,eAAe;AAAA,QAC3B;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS,CAAC,eAAe;AAAA,QAC3B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,UAAU,OAAO,SAAwB,aAAuC;AAC9E,UAAM,SAAS,QAAQ,WAAW,iBAAiB;AACnD,WAAO,OAAO,WAAW,YAAY,OAAO,WAAW,YAAY;AAAA,EACrE;AAAA,EAEA,SAAS,OACP,SACA,SACA,OACA,UACA,aACG;AACH,UAAM,SAAS,QAAQ,WAAW,iBAAiB;AAGnD,QAAI,CAAC,OAAO;AACV,cAAQ,MAAM,QAAQ,aAAa,SAAS,CAAC,CAAC;AAAA,IAChD;AAGA,UAAM,SAAS,eAAe;AAAA,MAC5B;AAAA,MACA,MAAM,QAAQ,QAAQ,QAAQ,QAAQ;AAAA,IACxC;AAGA,UAAM,YAAY,MAAM,QAAQ,SAAS,cAAuB;AAAA,MAC9D;AAAA,MACA,eAAe,CAAC;AAAA,IAClB,CAAU;AAEV,QAAI;AACJ,QAAI;AACF,eAAS,KAAK,MAAM,SAAS;AAAA,IAC/B,QAAQ;AACN,UAAI,UAAU;AACZ,cAAM,SAAS;AAAA,UACb,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,0CAA0C;AAAA,IAC3E;AAGA,QAAI,CAAC,OAAO,UAAU,CAAC,OAAO,gBAAgB,CAAC,OAAO,YAAY;AAChE,UAAI,UAAU;AACZ,cAAM,SAAS;AAAA,UACb,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,6BAA6B;AAAA,IAC9D;AACA,QAAI,CAAC,OAAO,cAAc,OAAO,WAAW,WAAW,GAAG;AACxD,UAAI,UAAU;AACZ,cAAM,SAAS;AAAA,UACb,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,yBAAyB;AAAA,IAC1D;AAGA,UAAM,SAAS,MAAM,QAAQ,QAAQ,QAAQ,WAAW,MAA4C;AAEpG,QAAI,CAAC,OAAO,IAAI;AACd,YAAM,SAAS,OAAO,OAAO,WAAW;AACxC,UAAI,UAAU;AACZ,cAAM,SAAS,EAAE,MAAM,wBAAwB,MAAM,GAAG,CAAC;AAAA,MAC3D;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,OAAO;AAAA,IACxC;AAEA,UAAM,YAAY,mBAAmB,OAAO,IAAK;AACjD,QAAI,UAAU;AACZ,YAAM,SAAS,EAAE,MAAM,UAAU,CAAC;AAAA,IACpC;AACA,WAAO,EAAE,SAAS,MAAM,MAAM,WAAW,MAAM,OAAO,KAAgC;AAAA,EACxF;AACF;;;AC3JO,IAAM,mBAA2B;AAAA,EACtC,MAAM;AAAA,EACN,aACE;AAAA,EACF,SAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS,CAAC,aAAa;AAAA,QACzB;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS,CAAC,aAAa;AAAA,QACzB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,UAAU,OAAO,SAAwB,aAAuC;AAC9E,UAAM,SAAS,QAAQ,WAAW,iBAAiB;AACnD,WAAO,OAAO,WAAW,YAAY,OAAO,WAAW,YAAY;AAAA,EACrE;AAAA,EAEA,SAAS,OACP,SACA,SACA,OACA,UACA,aACG;AACH,UAAM,SAAS,QAAQ,WAAW,iBAAiB;AAEnD,QAAI,CAAC,OAAO;AACV,cAAQ,MAAM,QAAQ,aAAa,SAAS,CAAC,CAAC;AAAA,IAChD;AAEA,UAAM,SAAS,cAAc;AAAA,MAC3B;AAAA,MACA,MAAM,QAAQ,QAAQ,QAAQ,QAAQ;AAAA,IACxC;AAEA,UAAM,YAAY,MAAM,QAAQ,SAAS,cAAuB;AAAA,MAC9D;AAAA,MACA,eAAe,CAAC;AAAA,IAClB,CAAU;AAEV,QAAI;AACJ,QAAI;AACF,eAAS,KAAK,MAAM,SAAS;AAAA,IAC/B,QAAQ;AACN,UAAI,UAAU;AACZ,cAAM,SAAS;AAAA,UACb,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,mCAAmC;AAAA,IACpE;AAEA,QAAI,CAAC,OAAO,QAAQ;AAClB,UAAI,UAAU;AACZ,cAAM,SAAS;AAAA,UACb,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,6BAA6B;AAAA,IAC9D;AAEA,UAAM,SAAS,MAAM,QAAQ,QAAQ,QAAQ,UAAU,MAA4C;AAEnG,QAAI,CAAC,OAAO,IAAI;AACd,YAAM,SAAS,OAAO,OAAO,WAAW;AACxC,UAAI,UAAU;AACZ,cAAM,SAAS,EAAE,MAAM,yBAAyB,MAAM,GAAG,CAAC;AAAA,MAC5D;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,OAAO;AAAA,IACxC;AAEA,UAAM,YAAY,kBAAkB,OAAO,IAAK;AAChD,QAAI,UAAU;AACZ,YAAM,SAAS,EAAE,MAAM,UAAU,CAAC;AAAA,IACpC;AACA,WAAO,EAAE,SAAS,MAAM,MAAM,WAAW,MAAM,OAAO,KAAgC;AAAA,EACxF;AACF;;;AC9GO,IAAM,wBAAgC;AAAA,EAC3C,MAAM;AAAA,EACN,aACE;AAAA,EACF,SAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS,CAAC,mBAAmB;AAAA,QAC/B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,UAAU,OAAO,SAAwB,aAAuC;AAC9E,UAAM,SAAS,QAAQ,WAAW,iBAAiB;AACnD,WAAO,OAAO,WAAW,YAAY,OAAO,WAAW,YAAY;AAAA,EACrE;AAAA,EAEA,SAAS,OACP,SACA,SACA,OACA,UACA,aACG;AACH,UAAM,SAAS,QAAQ,WAAW,iBAAiB;AAEnD,QAAI,CAAC,OAAO;AACV,cAAQ,MAAM,QAAQ,aAAa,SAAS,CAAC,CAAC;AAAA,IAChD;AAEA,UAAM,SAAS,mBAAmB;AAAA,MAChC;AAAA,MACA,MAAM,QAAQ,QAAQ,QAAQ,QAAQ;AAAA,IACxC;AAEA,UAAM,YAAY,MAAM,QAAQ,SAAS,cAAuB;AAAA,MAC9D;AAAA,MACA,eAAe,CAAC;AAAA,IAClB,CAAU;AAEV,QAAI;AACJ,QAAI;AACF,eAAS,KAAK,MAAM,SAAS;AAAA,IAC/B,QAAQ;AACN,UAAI,UAAU;AACZ,cAAM,SAAS;AAAA,UACb,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,mCAAmC;AAAA,IACpE;AAEA,QAAI,CAAC,OAAO,WAAW,OAAO,QAAQ,WAAW,GAAG;AAClD,UAAI,UAAU;AACZ,cAAM,SAAS;AAAA,UACb,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,sBAAsB;AAAA,IACvD;AAEA,QAAI,OAAO,QAAQ,SAAS,IAAI;AAC9B,aAAO,UAAU,OAAO,QAAQ,MAAM,GAAG,EAAE;AAAA,IAC7C;AAEA,UAAM,SAAS,MAAM,QAAQ,QAAQ,QAAQ,gBAAgB,MAA4C;AAEzG,QAAI,CAAC,OAAO,IAAI;AACd,YAAM,SAAS,OAAO,OAAO,WAAW;AACxC,UAAI,UAAU;AACZ,cAAM,SAAS,EAAE,MAAM,6BAA6B,MAAM,GAAG,CAAC;AAAA,MAChE;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,OAAO;AAAA,IACxC;AAEA,UAAM,YAAY,kBAAkB,OAAO,IAAK;AAChD,QAAI,UAAU;AACZ,YAAM,SAAS,EAAE,MAAM,UAAU,CAAC;AAAA,IACpC;AACA,WAAO,EAAE,SAAS,MAAM,MAAM,WAAW,MAAM,OAAO,KAAgC;AAAA,EACxF;AACF;;;AC3FO,IAAM,eAAuB;AAAA,EAClC,MAAM;AAAA,EACN,aACE;AAAA,EACF,SAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS,CAAC,aAAa;AAAA,QACzB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,UAAU,OAAO,UAAyB,aAAuC;AAE/E,WAAO;AAAA,EACT;AAAA,EAEA,SAAS,OACP,SACA,SACA,OACA,UACA,aACG;AAEH,QAAI,CAAC,OAAO;AACV,cAAQ,MAAM,QAAQ,aAAa,SAAS,CAAC,CAAC;AAAA,IAChD;AAGA,UAAM,SAAS,eAAe;AAAA,MAC5B;AAAA,MACA,MAAM,QAAQ,QAAQ,QAAQ,QAAQ;AAAA,IACxC;AAGA,UAAM,YAAY,MAAM,QAAQ,SAAS,cAAuB;AAAA,MAC9D;AAAA,MACA,eAAe,CAAC;AAAA,IAClB,CAAU;AAEV,QAAI;AACJ,QAAI;AACF,eAAS,KAAK,MAAM,SAAS;AAAA,IAC/B,QAAQ;AACN,UAAI,UAAU;AACZ,cAAM,SAAS;AAAA,UACb,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,sCAAsC;AAAA,IACvE;AAEA,QAAI,CAAC,OAAO,QAAQ;AAClB,UAAI,UAAU;AACZ,cAAM,SAAS,EAAE,MAAM,4CAA4C,CAAC;AAAA,MACtE;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,+BAA+B;AAAA,IAChE;AACA,QAAI,CAAC,OAAO,SAAS;AACnB,UAAI,UAAU;AACZ,cAAM,SAAS,EAAE,MAAM,0CAA0C,CAAC;AAAA,MACpE;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,uBAAuB;AAAA,IACxD;AAGA,UAAM,SAAS,MAAM,cAAc,QAAQ,aAAa,MAA4C;AAEpG,QAAI,CAAC,OAAO,IAAI;AACd,YAAM,SAAS,OAAO,OAAO,WAAW;AACxC,UAAI,UAAU;AACZ,cAAM,SAAS,EAAE,MAAM,wBAAwB,MAAM,GAAG,CAAC;AAAA,MAC3D;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,OAAO;AAAA,IACxC;AAEA,UAAM,OAAO,OAAO;AACpB,UAAM,OAAO;AAAA,MACX;AAAA,MACA;AAAA,MACA,QAAQ,KAAK,GAAG;AAAA,MAChB,SAAS,KAAK,IAAI;AAAA,MAClB,YAAY,KAAK,YAAY;AAAA,MAC7B,WAAW,KAAK,gBAAgB;AAAA,MAChC;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,KAAK,IAAI;AAEX,QAAI,UAAU;AACZ,YAAM,SAAS,EAAE,KAAK,CAAC;AAAA,IACzB;AACA,WAAO,EAAE,SAAS,MAAM,MAAM,KAAK;AAAA,EACrC;AACF;;;ACjHO,IAAM,uBAA+B;AAAA,EAC1C,MAAM;AAAA,EACN,aACE;AAAA,EACF,SAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS,CAAC,iBAAiB;AAAA,QAC7B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,UAAU,OAAO,SAAwB,aAAuC;AAC9E,UAAM,SAAS,QAAQ,WAAW,iBAAiB;AACnD,WAAO,OAAO,WAAW,YAAY,OAAO,WAAW,YAAY;AAAA,EACrE;AAAA,EAEA,SAAS,OACP,SACA,SACA,OACA,UACA,aACG;AACH,UAAM,SAAS,QAAQ,WAAW,iBAAiB;AAEnD,QAAI,CAAC,OAAO;AACV,cAAQ,MAAM,QAAQ,aAAa,SAAS,CAAC,CAAC;AAAA,IAChD;AAEA,UAAM,SAAS,uBAAuB;AAAA,MACpC;AAAA,MACA,MAAM,QAAQ,QAAQ,QAAQ,QAAQ;AAAA,IACxC;AAEA,UAAM,YAAY,MAAM,QAAQ,SAAS,cAAuB;AAAA,MAC9D;AAAA,MACA,eAAe,CAAC;AAAA,IAClB,CAAU;AAEV,QAAI;AACJ,QAAI;AACF,eAAS,KAAK,MAAM,SAAS;AAAA,IAC/B,QAAQ;AACN,UAAI,UAAU;AACZ,cAAM,SAAS;AAAA,UACb,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,sCAAsC;AAAA,IACvE;AAEA,QAAI,CAAC,OAAO,eAAe,CAAC,OAAO,WAAW;AAC5C,UAAI,UAAU;AACZ,cAAM,SAAS;AAAA,UACb,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,mCAAmC;AAAA,IACpE;AAEA,UAAM,SAAS,MAAM,QAAQ,QAAQ,QAAQ,cAAc,MAA4C;AAEvG,QAAI,CAAC,OAAO,IAAI;AACd,YAAM,SAAS,OAAO,OAAO,WAAW;AACxC,UAAI,UAAU;AACZ,cAAM,SAAS,EAAE,MAAM,6BAA6B,MAAM,GAAG,CAAC;AAAA,MAChE;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,OAAO;AAAA,IACxC;AAEA,UAAM,OAAO,OAAO;AACpB,UAAM,OAAO;AAAA,MACX;AAAA,MACA;AAAA,MACA,OAAO,KAAK,EAAE;AAAA,MACd,SAAS,KAAK,WAAW;AAAA,MACzB,YAAY,KAAK,OAAO;AAAA,MACxB;AAAA,MACA;AAAA,IACF,EAAE,KAAK,IAAI;AAEX,QAAI,UAAU;AACZ,YAAM,SAAS,EAAE,KAAK,CAAC;AAAA,IACzB;AACA,WAAO,EAAE,SAAS,MAAM,MAAM,KAAK;AAAA,EACrC;AACF;;;AC1FO,IAAM,wBAAgC;AAAA,EAC3C,MAAM;AAAA,EACN,aACE;AAAA,EACF,SAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS,CAAC,kBAAkB;AAAA,QAC9B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,UAAU,OAAO,SAAwB,aAAuC;AAC9E,UAAM,SAAS,QAAQ,WAAW,iBAAiB;AACnD,WAAO,OAAO,WAAW,YAAY,OAAO,WAAW,YAAY;AAAA,EACrE;AAAA,EAEA,SAAS,OACP,SACA,SACA,OACA,UACA,aACG;AACH,UAAM,SAAS,QAAQ,WAAW,iBAAiB;AAEnD,QAAI,CAAC,OAAO;AACV,cAAQ,MAAM,QAAQ,aAAa,SAAS,CAAC,CAAC;AAAA,IAChD;AAEA,UAAM,SAAS,wBAAwB;AAAA,MACrC;AAAA,MACA,MAAM,QAAQ,QAAQ,QAAQ,QAAQ;AAAA,IACxC;AAEA,UAAM,YAAY,MAAM,QAAQ,SAAS,cAAuB;AAAA,MAC9D;AAAA,MACA,eAAe,CAAC;AAAA,IAClB,CAAU;AAEV,QAAI;AACJ,QAAI;AACF,eAAS,KAAK,MAAM,SAAS;AAAA,IAC/B,QAAQ;AACN,UAAI,UAAU;AACZ,cAAM,SAAS;AAAA,UACb,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,sCAAsC;AAAA,IACvE;AAEA,QAAI,CAAC,OAAO,YAAY;AACtB,UAAI,UAAU;AACZ,cAAM,SAAS,EAAE,MAAM,0DAA0D,CAAC;AAAA,MACpF;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,0BAA0B;AAAA,IAC3D;AAEA,UAAM,EAAE,YAAY,GAAG,KAAK,IAAI;AAChC,UAAM,SAAS,MAAM,QAAQ,QAAQ,OAAO,cAAc,UAAU,WAAW,IAA0C;AAEzH,QAAI,CAAC,OAAO,IAAI;AACd,YAAM,SAAS,OAAO,OAAO,WAAW;AACxC,UAAI,UAAU;AACZ,cAAM,SAAS,EAAE,MAAM,+BAA+B,MAAM,GAAG,CAAC;AAAA,MAClE;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,OAAO;AAAA,IACxC;AAEA,UAAM,OAAO,OAAO;AACpB,UAAM,OAAO;AAAA,MACX,8BAA8B,UAAU;AAAA,MACxC;AAAA,MACA,iBAAiB,KAAK,WAAW,IAAI,KAAK,SAAS;AAAA,IACrD,EAAE,KAAK,IAAI;AAEX,QAAI,UAAU;AACZ,YAAM,SAAS,EAAE,KAAK,CAAC;AAAA,IACzB;AACA,WAAO,EAAE,SAAS,MAAM,MAAM,KAAK;AAAA,EACrC;AACF;;;AC/GO,IAAM,mBAA2B;AAAA,EACtC,MAAM;AAAA,EACN,aACE;AAAA,EACF,SAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS,CAAC,aAAa;AAAA,QACzB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,UAAU,OAAO,SAAwB,aAAuC;AAC9E,UAAM,SAAS,QAAQ,WAAW,iBAAiB;AACnD,WAAO,OAAO,WAAW,YAAY,OAAO,WAAW,YAAY;AAAA,EACrE;AAAA,EAEA,SAAS,OACP,SACA,SACA,OACA,UACA,aACG;AACH,UAAM,SAAS,QAAQ,WAAW,iBAAiB;AAEnD,QAAI,CAAC,OAAO;AACV,cAAQ,MAAM,QAAQ,aAAa,SAAS,CAAC,CAAC;AAAA,IAChD;AAEA,UAAM,SAAS,mBAAmB;AAAA,MAChC;AAAA,MACA,MAAM,QAAQ,QAAQ,QAAQ,QAAQ;AAAA,IACxC;AAEA,UAAM,YAAY,MAAM,QAAQ,SAAS,cAAuB;AAAA,MAC9D;AAAA,MACA,eAAe,CAAC;AAAA,IAClB,CAAU;AAEV,QAAI;AACJ,QAAI;AACF,eAAS,KAAK,MAAM,SAAS;AAAA,IAC/B,QAAQ;AACN,UAAI,UAAU;AACZ,cAAM,SAAS;AAAA,UACb,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,6CAA6C;AAAA,IAC9E;AAEA,QAAI,CAAC,OAAO,cAAc,CAAC,OAAO,QAAQ;AACxC,UAAI,UAAU;AACZ,cAAM,SAAS,EAAE,MAAM,4DAA4D,CAAC;AAAA,MACtF;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,iCAAiC;AAAA,IAClE;AAEA,UAAM,EAAE,YAAY,GAAG,KAAK,IAAI;AAChC,UAAM,SAAS,MAAM,QAAQ,QAAQ,QAAQ,cAAc,UAAU,YAAY,IAA0C;AAE3H,QAAI,CAAC,OAAO,IAAI;AACd,YAAM,SAAS,OAAO,OAAO,WAAW;AACxC,UAAI,UAAU;AACZ,cAAM,SAAS,EAAE,MAAM,2BAA2B,MAAM,GAAG,CAAC;AAAA,MAC9D;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,OAAO;AAAA,IACxC;AAEA,UAAM,OAAO,OAAO;AACpB,UAAM,OAAO;AAAA,MACX,oBAAoB,UAAU;AAAA,MAC9B;AAAA,MACA,kBAAkB,KAAK,YAAY;AAAA,MACnC,kBAAkB,KAAK,YAAY;AAAA,MACnC,cAAc,KAAK,QAAQ;AAAA,MAC3B,UAAU,KAAK,SAAS;AAAA,IAC1B,EAAE,KAAK,IAAI;AAEX,QAAI,UAAU;AACZ,YAAM,SAAS,EAAE,KAAK,CAAC;AAAA,IACzB;AACA,WAAO,EAAE,SAAS,MAAM,MAAM,KAAK;AAAA,EACrC;AACF;;;ACrGO,IAAM,oBAA4B;AAAA,EACvC,MAAM;AAAA,EACN,aACE;AAAA,EACF,SAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS,CAAC,cAAc;AAAA,QAC1B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,UAAU,OAAO,SAAwB,aAAuC;AAC9E,UAAM,SAAS,QAAQ,WAAW,iBAAiB;AACnD,WAAO,OAAO,WAAW,YAAY,OAAO,WAAW,YAAY;AAAA,EACrE;AAAA,EAEA,SAAS,OACP,SACA,SACA,OACA,UACA,aACG;AACH,UAAM,SAAS,QAAQ,WAAW,iBAAiB;AAEnD,QAAI,CAAC,OAAO;AACV,cAAQ,MAAM,QAAQ,aAAa,SAAS,CAAC,CAAC;AAAA,IAChD;AAEA,UAAM,SAAS,oBAAoB;AAAA,MACjC;AAAA,MACA,MAAM,QAAQ,QAAQ,QAAQ,QAAQ;AAAA,IACxC;AAEA,UAAM,YAAY,MAAM,QAAQ,SAAS,cAAuB;AAAA,MAC9D;AAAA,MACA,eAAe,CAAC;AAAA,IAClB,CAAU;AAEV,QAAI;AACJ,QAAI;AACF,eAAS,KAAK,MAAM,SAAS;AAAA,IAC/B,QAAQ;AACN,UAAI,UAAU;AACZ,cAAM,SAAS;AAAA,UACb,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,0CAA0C;AAAA,IAC3E;AAEA,QAAI,CAAC,OAAO,YAAY;AACtB,UAAI,UAAU;AACZ,cAAM,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAAA,MAC5D;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,0BAA0B;AAAA,IAC3D;AACA,QAAI,CAAC,OAAO,UAAU,CAAC,OAAO,gBAAgB,CAAC,OAAO,YAAY;AAChE,UAAI,UAAU;AACZ,cAAM,SAAS,EAAE,MAAM,iEAAiE,CAAC;AAAA,MAC3F;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,6BAA6B;AAAA,IAC9D;AAEA,UAAM,SAAS,MAAM,QAAQ,QAAQ,QAAQ,iBAAiB,MAA4C;AAE1G,QAAI,CAAC,OAAO,IAAI;AACd,YAAM,SAAS,OAAO,OAAO,WAAW;AACxC,UAAI,UAAU;AACZ,cAAM,SAAS,EAAE,MAAM,8BAA8B,MAAM,GAAG,CAAC;AAAA,MACjE;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,OAAO;AAAA,IACxC;AAEA,UAAM,OAAO,OAAO;AACpB,UAAM,YAAY,KAAK;AACvB,UAAM,QAAS,WAAW,SAAS,CAAC;AACpC,UAAM,eAAe,KAAK;AAE1B,UAAM,QAAQ,CAAC,uBAAuB,EAAE;AACxC,QAAI,MAAM,SAAS,GAAG;AACpB,YAAM,KAAK,kBAAkB,MAAM,CAAC,CAAC,EAAE;AAAA,IACzC;AACA,QAAI,cAAc;AAChB,YAAM,KAAK,sBAAsB,aAAa,IAAI,EAAE;AACpD,YAAM,KAAK,aAAa,aAAa,aAAa,GAAG;AAAA,IACvD;AACA,QAAI,MAAM,WAAW,KAAK,CAAC,cAAc;AACvC,YAAM,KAAK,wDAAwD;AAAA,IACrE;AAEA,UAAM,OAAO,MAAM,KAAK,IAAI;AAC5B,QAAI,UAAU;AACZ,YAAM,SAAS,EAAE,KAAK,CAAC;AAAA,IACzB;AACA,WAAO,EAAE,SAAS,MAAM,MAAM,KAAK;AAAA,EACrC;AACF;;;ACnHO,IAAM,oBAA4B;AAAA,EACvC,MAAM;AAAA,EACN,aACE;AAAA,EACF,SAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS,CAAC,cAAc;AAAA,QAC1B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,UAAU,OAAO,SAAwB,aAAuC;AAC9E,UAAM,SAAS,QAAQ,WAAW,iBAAiB;AACnD,WAAO,OAAO,WAAW,YAAY,OAAO,WAAW,YAAY;AAAA,EACrE;AAAA,EAEA,SAAS,OACP,SACA,SACA,OACA,UACA,aACG;AACH,UAAM,SAAS,QAAQ,WAAW,iBAAiB;AAEnD,QAAI,CAAC,OAAO;AACV,cAAQ,MAAM,QAAQ,aAAa,SAAS,CAAC,CAAC;AAAA,IAChD;AAEA,UAAM,SAAS,oBAAoB;AAAA,MACjC;AAAA,MACA,MAAM,QAAQ,QAAQ,QAAQ,QAAQ;AAAA,IACxC;AAEA,UAAM,YAAY,MAAM,QAAQ,SAAS,cAAuB;AAAA,MAC9D;AAAA,MACA,eAAe,CAAC;AAAA,IAClB,CAAU;AAEV,QAAI;AACJ,QAAI;AACF,eAAS,KAAK,MAAM,SAAS;AAAA,IAC/B,QAAQ;AACN,UAAI,UAAU;AACZ,cAAM,SAAS;AAAA,UACb,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,0CAA0C;AAAA,IAC3E;AAEA,QAAI,CAAC,OAAO,YAAY;AACtB,UAAI,UAAU;AACZ,cAAM,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAAA,MAC5D;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,0BAA0B;AAAA,IAC3D;AACA,QAAI,CAAC,OAAO,UAAU,CAAC,OAAO,gBAAgB,CAAC,OAAO,YAAY;AAChE,UAAI,UAAU;AACZ,cAAM,SAAS,EAAE,MAAM,iEAAiE,CAAC;AAAA,MAC3F;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,6BAA6B;AAAA,IAC9D;AAEA,UAAM,SAAS,MAAM,QAAQ,QAAQ,QAAQ,iBAAiB,MAA4C;AAE1G,QAAI,CAAC,OAAO,IAAI;AACd,YAAM,SAAS,OAAO,OAAO,WAAW;AACxC,UAAI,UAAU;AACZ,cAAM,SAAS,EAAE,MAAM,8BAA8B,MAAM,GAAG,CAAC;AAAA,MACjE;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,OAAO;AAAA,IACxC;AAEA,UAAM,OAAO,OAAO;AACpB,UAAM,YAAY,KAAK;AACvB,UAAM,QAAS,WAAW,SAAS,CAAC;AACpC,UAAM,eAAe,KAAK;AAE1B,UAAM,QAAQ,CAAC,uBAAuB,EAAE;AACxC,QAAI,MAAM,SAAS,GAAG;AACpB,YAAM,KAAK,kBAAkB,MAAM,CAAC,CAAC,EAAE;AAAA,IACzC;AACA,QAAI,cAAc;AAChB,YAAM,KAAK,sBAAsB,aAAa,IAAI,EAAE;AACpD,YAAM,KAAK,aAAa,aAAa,aAAa,GAAG;AAAA,IACvD;AACA,QAAI,MAAM,WAAW,KAAK,CAAC,cAAc;AACvC,YAAM,KAAK,wDAAwD;AAAA,IACrE;AAEA,UAAM,OAAO,MAAM,KAAK,IAAI;AAC5B,QAAI,UAAU;AACZ,YAAM,SAAS,EAAE,KAAK,CAAC;AAAA,IACzB;AACA,WAAO,EAAE,SAAS,MAAM,MAAM,KAAK;AAAA,EACrC;AACF;;;ACnHO,IAAM,uBAA+B;AAAA,EAC1C,MAAM;AAAA,EACN,aACE;AAAA,EACF,SAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS,CAAC,iBAAiB;AAAA,QAC7B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,UAAU,OAAO,SAAwB,aAAuC;AAC9E,UAAM,SAAS,QAAQ,WAAW,iBAAiB;AACnD,WAAO,OAAO,WAAW,YAAY,OAAO,WAAW,YAAY;AAAA,EACrE;AAAA,EAEA,SAAS,OACP,SACA,SACA,OACA,UACA,aACG;AACH,UAAM,SAAS,QAAQ,WAAW,iBAAiB;AAEnD,QAAI,CAAC,OAAO;AACV,cAAQ,MAAM,QAAQ,aAAa,SAAS,CAAC,CAAC;AAAA,IAChD;AAEA,UAAM,SAAS,uBAAuB;AAAA,MACpC;AAAA,MACA,MAAM,QAAQ,QAAQ,QAAQ,QAAQ;AAAA,IACxC;AAEA,UAAM,YAAY,MAAM,QAAQ,SAAS,cAAuB;AAAA,MAC9D;AAAA,MACA,eAAe,CAAC;AAAA,IAClB,CAAU;AAEV,QAAI;AACJ,QAAI;AACF,eAAS,KAAK,MAAM,SAAS;AAAA,IAC/B,QAAQ;AACN,UAAI,UAAU;AACZ,cAAM,SAAS;AAAA,UACb,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,qCAAqC;AAAA,IACtE;AAEA,QAAI,CAAC,OAAO,QAAQ,CAAC,OAAO,QAAQ;AAClC,UAAI,UAAU;AACZ,cAAM,SAAS,EAAE,MAAM,sEAAsE,CAAC;AAAA,MAChG;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,0BAA0B;AAAA,IAC3D;AAEA,UAAM,SAAS,MAAM,QAAQ,QAAQ,QAAQ,oBAAoB,MAA4C;AAE7G,QAAI,CAAC,OAAO,IAAI;AACd,YAAM,SAAS,OAAO,OAAO,WAAW;AACxC,UAAI,UAAU;AACZ,cAAM,SAAS,EAAE,MAAM,gCAAgC,MAAM,GAAG,CAAC;AAAA,MACnE;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,OAAO;AAAA,IACxC;AAEA,UAAM,OAAO,OAAO;AACpB,UAAM,YAAY,KAAK;AACvB,UAAM,OAAO,YACT;AAAA,MACE;AAAA,MACA;AAAA,MACA,SAAS,KAAK,IAAI;AAAA,MAClB,oBAAoB,KAAK,cAAc;AAAA,MACvC,UAAU,KAAK,SAAS;AAAA,MACxB,iBAAiB,KAAK,WAAW;AAAA,IACnC,EAAE,KAAK,IAAI,IACX;AAEJ,QAAI,UAAU;AACZ,YAAM,SAAS,EAAE,KAAK,CAAC;AAAA,IACzB;AACA,WAAO,EAAE,SAAS,MAAM,MAAM,KAAK;AAAA,EACrC;AACF;;;AClHA,IAAM,YAAY;AAClB,IAAM,eAAe;AACrB,IAAM,aAAa;AAGnB,SAAS,gBAAgB,WAA4B;AAEnD,SAAO,UAAU,UAAU,MAAM,UAAU,UAAU;AACvD;AAEO,IAAM,4BAAsC;AAAA,EACjD,MAAM;AAAA,EACN,aACE;AAAA,EACF,SAAS;AAAA,EAET,KAAK,OACH,SACA,YACG;AAEH,UAAM,SAAS,QAAQ,WAAW,iBAAiB;AACnD,QAAI,CAAC,UAAU,OAAO,WAAW,YAAY,CAAC,OAAO,WAAW,YAAY,GAAG;AAC7E,aAAO,EAAE,MAAM,GAAG;AAAA,IACpB;AAEA,UAAM,OAAO,QAAQ,QAAQ,QAAQ;AAErC,UAAM,aAAa,KAAK,MAAM,SAAS,KAAK,CAAC;AAC7C,UAAM,iBAAiB,KAAK,MAAM,YAAY,KAAK,CAAC,GAAG,OAAO,eAAe;AAC7E,UAAM,cAAc,KAAK,MAAM,UAAU,KAAK,CAAC;AAG/C,UAAM,SAAS,IAAI,IAAI,UAAU;AACjC,UAAM,UAAU,IAAI,IAAI,WAAW;AACnC,UAAM,gBAAgB,cAAc;AAAA,MAClC,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC;AAAA,IACzC;AAEA,UAAM,WAAqB,CAAC;AAC5B,QAAI,WAAW,SAAS,GAAG;AACzB,eAAS,KAAK,QAAQ,WAAW,KAAK,IAAI,CAAC,EAAE;AAAA,IAC/C;AACA,QAAI,cAAc,SAAS,GAAG;AAC5B,eAAS,KAAK,WAAW,cAAc,KAAK,IAAI,CAAC,EAAE;AAAA,IACrD;AACA,QAAI,YAAY,SAAS,GAAG;AAC1B,eAAS,KAAK,SAAS,YAAY,KAAK,IAAI,CAAC,EAAE;AAAA,IACjD;AAEA,QAAI,SAAS,WAAW,GAAG;AACzB,aAAO,EAAE,MAAM,GAAG;AAAA,IACpB;AAEA,WAAO;AAAA,MACL,MAAM,wEAAwE,SAAS,KAAK,IAAI,CAAC;AAAA,IACnG;AAAA,EACF;AACF;;;ACpDO,IAAM,gBAAwB;AAAA,EACnC,MAAM;AAAA,EACN,aACE;AAAA,EACF,SAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,WAAW,CAAC,yBAAyB;AACvC;AAEA,IAAO,gBAAQ;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/api.ts","../src/utils/templates.ts","../src/actions/verify.ts","../src/actions/trust.ts","../src/actions/batch.ts","../src/actions/buy_key.ts","../src/actions/create_merchant.ts","../src/actions/configure_tokens.ts","../src/actions/add_credits.ts","../src/actions/acp_discount.ts","../src/actions/ucp_discount.ts","../src/actions/confirm_payment.ts","../src/providers/credentials.ts","../src/index.ts"],"sourcesContent":["const API_BASE = \"https://api.insumermodel.com/v1\";\n\n// --- Types ---\n\nexport interface ApiResponse {\n ok: boolean;\n data?: Record<string, unknown>;\n error?: { code: number; message: string };\n meta?: { version: string; timestamp: string };\n}\n\nexport interface AttestCondition {\n type: \"token_balance\" | \"nft_ownership\" | \"eas_attestation\" | \"farcaster_id\";\n contractAddress?: string;\n chainId?: number | \"solana\" | \"xrpl\";\n threshold?: number;\n decimals?: number;\n currency?: string;\n taxon?: number;\n label?: string;\n schemaId?: string;\n attester?: string;\n indexer?: string;\n template?: string;\n}\n\nexport interface AttestParams {\n wallet?: string;\n solanaWallet?: string;\n xrplWallet?: string;\n proof?: \"merkle\";\n format?: \"jwt\";\n conditions: AttestCondition[];\n}\n\nexport interface TrustParams {\n wallet: string;\n solanaWallet?: string;\n xrplWallet?: string;\n proof?: \"merkle\";\n}\n\nexport interface BatchTrustParams {\n wallets: Array<{\n wallet: string;\n solanaWallet?: string;\n xrplWallet?: string;\n }>;\n proof?: \"merkle\";\n}\n\n// --- API helper ---\n\nexport async function apiCall(\n apiKey: string,\n method: string,\n path: string,\n body?: Record<string, unknown>\n): Promise<ApiResponse> {\n const url = `${API_BASE}${path}`;\n const res = await fetch(url, {\n method,\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-Key\": apiKey,\n },\n body: body ? JSON.stringify(body) : undefined,\n });\n return res.json() as Promise<ApiResponse>;\n}\n\nexport async function publicApiCall(\n method: string,\n path: string,\n body?: Record<string, unknown>\n): Promise<ApiResponse> {\n const url = `${API_BASE}${path}`;\n const res = await fetch(url, {\n method,\n headers: { \"Content-Type\": \"application/json\" },\n body: body ? JSON.stringify(body) : undefined,\n });\n return res.json() as Promise<ApiResponse>;\n}\n\n// --- Response formatters ---\n\ninterface AttestResult {\n condition: number;\n label?: string;\n type: string;\n chainId?: number | string;\n met: boolean;\n blockNumber?: string;\n blockTimestamp?: string;\n ledgerIndex?: number;\n ledgerHash?: string;\n trustLineState?: { frozen: boolean };\n}\n\ninterface TrustDimension {\n checks: Array<{ label: string; met: boolean }>;\n passCount: number;\n failCount: number;\n total: number;\n}\n\n/**\n * Format an attest API response for display.\n * API shape: data = { attestation: { id, pass, results, passCount, failCount, expiresAt }, sig, kid, jwt? }\n */\nexport function formatAttestResult(data: Record<string, unknown>): string {\n const attestation = data.attestation as Record<string, unknown> | undefined;\n const id = attestation?.id as string;\n const pass = attestation?.pass as boolean;\n const results = (attestation?.results || []) as AttestResult[];\n const lines: string[] = [\n `Attestation ${id}: ${pass ? \"PASS\" : \"FAIL\"}`,\n \"\",\n ];\n for (const r of results) {\n const icon = r.met ? \"+\" : \"-\";\n const chain =\n r.chainId !== undefined ? ` (chain ${r.chainId})` : \"\";\n let extra = \"\";\n if (r.ledgerIndex !== undefined) {\n extra += ` | ledger ${r.ledgerIndex}`;\n }\n if (r.trustLineState?.frozen) {\n extra += \" | FROZEN trust line\";\n }\n lines.push(` [${icon}] ${r.label || r.type}${chain}${extra}`);\n }\n const passCount = attestation?.passCount as number;\n const failCount = attestation?.failCount as number;\n lines.push(\"\", `${passCount} passed, ${failCount} failed`);\n if (attestation?.expiresAt) {\n lines.push(`Expires: ${attestation.expiresAt}`);\n }\n if (data.jwt) {\n lines.push(\"\", `JWT: ${data.jwt}`);\n }\n return lines.join(\"\\n\");\n}\n\n/**\n * Format a trust API response for display.\n * API shape: data = { trust: { id, dimensions, summary, ... }, sig, kid }\n */\nexport function formatTrustResult(data: Record<string, unknown>): string {\n const trust = data.trust as Record<string, unknown> | undefined;\n const id = trust?.id as string;\n const dimensions = trust?.dimensions as Record<string, TrustDimension> | undefined;\n const summary = trust?.summary as Record<string, unknown> | undefined;\n const lines: string[] = [`Trust Profile ${id}`, \"\"];\n if (dimensions) {\n for (const [name, dim] of Object.entries(dimensions)) {\n lines.push(\n ` ${name}: ${dim.passCount}/${dim.total} passed`\n );\n for (const check of dim.checks) {\n const icon = check.met ? \"+\" : \"-\";\n lines.push(` [${icon}] ${check.label}`);\n }\n }\n }\n if (summary) {\n lines.push(\n \"\",\n `Overall: ${summary.totalPassed}/${summary.totalChecks} checks passed`\n );\n }\n return lines.join(\"\\n\");\n}\n\n/**\n * Format a batch trust API response for display.\n * API shape: data = { results: [{ trust: { id, wallet, summary, ... }, sig, kid } | { error: { wallet, message } }], summary: { requested, succeeded, failed } }\n */\nexport function formatBatchResult(data: Record<string, unknown>): string {\n const results = (data.results || []) as Array<Record<string, unknown>>;\n const batchSummary = data.summary as Record<string, unknown> | undefined;\n const lines: string[] = [`Batch Trust: ${results.length} profiles`, \"\"];\n for (const result of results) {\n if (result.error) {\n const err = result.error as Record<string, unknown>;\n lines.push(` ${err.wallet}: ERROR — ${err.message}`);\n } else {\n const trust = result.trust as Record<string, unknown> | undefined;\n const summary = trust?.summary as Record<string, unknown> | undefined;\n lines.push(\n ` ${trust?.wallet}: ${summary?.totalPassed ?? \"?\"}/${summary?.totalChecks ?? \"?\"} checks passed (${trust?.id})`\n );\n }\n }\n if (batchSummary) {\n lines.push(\"\", `${batchSummary.succeeded}/${batchSummary.requested} succeeded`);\n }\n return lines.join(\"\\n\");\n}\n","export const verifyTemplate = `You are extracting on-chain verification parameters from the conversation.\n\nRecent messages:\n{{recentMessages}}\n\nExtract the following as a JSON object:\n- wallet: EVM address (0x...) if present\n- solanaWallet: Solana address (base58) if present\n- xrplWallet: XRPL address (r...) if present\n- format: \"jwt\" if the user asks for a JWT token, bearer token, Wallet Auth token, or JWT format. Omit otherwise.\n- conditions: array of conditions to check, each with:\n - type: \"token_balance\", \"nft_ownership\", \"eas_attestation\", or \"farcaster_id\"\n - contractAddress: token/NFT contract address (use the reference table below)\n - chainId: chain ID number or \"solana\" or \"xrpl\"\n - threshold: minimum balance (for token_balance)\n - decimals: token decimals (for token_balance)\n - currency: XRPL trust line currency code (e.g. \"RLUSD\", \"USDC\"). Required for XRPL trust line tokens.\n - taxon: XRPL NFT taxon number (optional, for nft_ownership on XRPL only)\n - label: human-readable description\n - template: compliance template name (for eas_attestation)\n\nChain ID reference (32 supported chains):\n Ethereum = 1, BNB Chain = 56, Base = 8453, Avalanche = 43114,\n Polygon = 137, Arbitrum = 42161, Optimism = 10, Chiliz = 88888,\n Soneium = 1868, Plume = 98866, World Chain = 480,\n Sonic = 146, Gnosis = 100, Mantle = 5000, Scroll = 534352,\n Linea = 59144, zkSync Era = 324, Blast = 81457, Taiko = 167000,\n Ronin = 2020, Celo = 42220, Moonbeam = 1284, Moonriver = 1285,\n Viction = 88, opBNB = 204, Unichain = 130, Ink = 57073,\n Sei = 1329, Berachain = 80094, ApeChain = 33139,\n Solana = \"solana\", XRPL = \"xrpl\"\n\nWell-known contracts (Ethereum mainnet unless noted):\n USDC = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 (6 decimals)\n USDT = 0xdAC17F958D2ee523a2206206994597C13D831ec7 (6 decimals)\n UNI = 0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984 (18 decimals)\n AAVE = 0x7Fc66500c84A76Ad7e9c93437bFc5Ac33E2DDaE9 (18 decimals)\n LINK = 0x514910771AF9Ca656af840dff83E8264EcF986CA (18 decimals)\n WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 (18 decimals)\n BAYC = 0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D (NFT)\n USDC on Base = 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 (6 decimals)\n USDC on Polygon = 0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359 (6 decimals)\n USDC on Arbitrum = 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 (6 decimals)\n USDC on Optimism = 0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85 (6 decimals)\n USDC on BNB Chain = 0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d (18 decimals)\n USDC on Avalanche = 0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E (6 decimals)\n USDC on Solana = EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v (6 decimals)\n\nXRPL tokens (use chainId \"xrpl\"):\n XRP native = contractAddress \"native\"\n RLUSD = contractAddress \"rMxCKbEDwqr76QuheSUMdEGf4B9xJ8m5De\", currency \"RLUSD\"\n USDC on XRPL = contractAddress \"rGm7WCVp9gb4jZHWTEtGUr4dd74z2XuWhE\", currency \"USDC\"\n\nCompliance templates (for eas_attestation, no contractAddress needed):\n \"coinbase_verified_account\" — KYC on Base\n \"coinbase_verified_country\" — country verification on Base\n \"coinbase_one\" — Coinbase One membership on Base\n \"gitcoin_passport_score\" — Gitcoin Passport score on Optimism\n \"gitcoin_passport_active\" — active Gitcoin Passport on Optimism\n\nIf the user says \"check if they hold UNI\", create a token_balance condition with the UNI contract, chainId 1, threshold 1, decimals 18.\nIf the user says \"verify KYC\", use template \"coinbase_verified_account\".\nIf the user says \"check RLUSD balance\", use chainId \"xrpl\", contractAddress \"rMxCKbEDwqr76QuheSUMdEGf4B9xJ8m5De\", currency \"RLUSD\".\n\nRespond with ONLY the JSON object, no explanation.`;\n\nexport const trustTemplate = `You are extracting wallet trust profile parameters from the conversation.\n\nRecent messages:\n{{recentMessages}}\n\nExtract the following as a JSON object:\n- wallet: EVM address (0x...) — required\n- solanaWallet: Solana address (base58) if mentioned\n- xrplWallet: XRPL address (r...) if mentioned\n\nThe trust profile automatically checks 17+ dimensions (stablecoins, governance tokens, NFTs, staking) for the EVM wallet. Adding solanaWallet or xrplWallet extends the profile with additional checks.\n\nRespond with ONLY the JSON object, no explanation.`;\n\nexport const batchTrustTemplate = `You are extracting multiple wallet addresses for batch trust profiling from the conversation.\n\nRecent messages:\n{{recentMessages}}\n\nExtract the following as a JSON object:\n- wallets: array of wallet objects, each with:\n - wallet: EVM address (0x...) — required\n - solanaWallet: Solana address (base58) if mentioned for this wallet\n - xrplWallet: XRPL address (r...) if mentioned for this wallet\n\nMaximum 10 wallets. Each wallet gets an independent trust profile.\n\nRespond with ONLY the JSON object, no explanation.`;\n\nexport const buyKeyTemplate = `You are extracting API key purchase parameters from the conversation.\n\nRecent messages:\n{{recentMessages}}\n\nExtract the following as a JSON object:\n- txHash: the USDC transaction hash\n- chainId: chain where USDC was sent (number or \"solana\")\n- amount: USDC amount sent (number, minimum 5)\n- appName: name for the API key\n\nChain IDs for USDC payments:\n Ethereum = 1, Base = 8453, Polygon = 137, Arbitrum = 42161,\n Optimism = 10, BNB Chain = 56, Avalanche = 43114, Solana = \"solana\"\n\nPlatform wallets:\n EVM: 0xAd982CB19aCCa2923Df8F687C0614a7700255a23\n Solana: 6a1mLjefhvSJX1sEX8PTnionbE9DqoYjU6F6bNkT4Ydr\n\nRespond with ONLY the JSON object, no explanation.`;\n\nexport const createMerchantTemplate = `You are extracting merchant creation parameters from the conversation.\n\nRecent messages:\n{{recentMessages}}\n\nExtract the following as a JSON object:\n- companyName: display name for the merchant (required)\n- companyId: unique alphanumeric ID with dashes/underscores (required, e.g. \"acme-coffee\")\n- location: city or region (optional)\n\nRespond with ONLY the JSON object, no explanation.`;\n\nexport const configureTokensTemplate = `You are extracting token tier configuration parameters from the conversation.\n\nRecent messages:\n{{recentMessages}}\n\nExtract the following as a JSON object:\n- merchantId: the merchant ID to configure tokens for (required)\n- ownToken: the merchant's own token config (or null), with:\n - symbol: token symbol (e.g. \"USDC\", \"UNI\")\n - chainId: chain ID number\n - contractAddress: token contract address\n - decimals: token decimals (6 for USDC, 18 for most ERC-20)\n - currency: XRPL trust line currency code (e.g. \"RLUSD\", \"USDC\") — only for XRPL tokens\n - tiers: array of 1-4 tiers, each with:\n - name: tier name (e.g. \"Bronze\", \"Silver\", \"Gold\")\n - threshold: minimum token balance for this tier\n - discount: discount percentage (1-100)\n- partnerTokens: array of additional token configs (same structure as ownToken), default []\n\nOnboarding chain IDs (only these 11 are supported for token config):\n Ethereum = 1, BNB Chain = 56, Base = 8453, Avalanche = 43114,\n Polygon = 137, Arbitrum = 42161, Optimism = 10, Chiliz = 88888,\n Soneium = 1868, Plume = 98866, World Chain = 480\n\nWell-known contracts:\n USDC on Ethereum = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 (6 decimals)\n USDC on Base = 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 (6 decimals)\n UNI = 0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984 (18 decimals)\n\nRespond with ONLY the JSON object, no explanation.`;\n\nexport const addCreditsTemplate = `You are extracting merchant credit purchase parameters from the conversation.\n\nRecent messages:\n{{recentMessages}}\n\nExtract the following as a JSON object:\n- merchantId: the merchant ID to add credits to (required)\n- txHash: the USDC transaction hash (required)\n- chainId: chain where USDC was sent (number or \"solana\")\n- amount: USDC amount sent (number, minimum 5)\n- updateWallet: true only if the user explicitly wants to change their registered wallet (default false)\n\nChain IDs for USDC payments:\n Ethereum = 1, Base = 8453, Polygon = 137, Arbitrum = 42161,\n Optimism = 10, BNB Chain = 56, Avalanche = 43114, Solana = \"solana\"\n\nPlatform wallets:\n EVM: 0xAd982CB19aCCa2923Df8F687C0614a7700255a23\n Solana: 6a1mLjefhvSJX1sEX8PTnionbE9DqoYjU6F6bNkT4Ydr\n\nRespond with ONLY the JSON object, no explanation.`;\n\nexport const acpDiscountTemplate = `You are extracting ACP discount check parameters from the conversation.\n\nRecent messages:\n{{recentMessages}}\n\nExtract the following as a JSON object:\n- merchantId: the merchant ID (required)\n- wallet: EVM address (0x...) if present\n- solanaWallet: Solana address (base58) if present\n- xrplWallet: XRPL address (r...) if present\n- items: optional array of line items, each with:\n - path: JSONPath reference (e.g. \"$.line_items[0]\")\n - amount: item price in cents\n\nAt least one wallet address is required.\n\nRespond with ONLY the JSON object, no explanation.`;\n\nexport const ucpDiscountTemplate = `You are extracting UCP discount check parameters from the conversation.\n\nRecent messages:\n{{recentMessages}}\n\nExtract the following as a JSON object:\n- merchantId: the merchant ID (required)\n- wallet: EVM address (0x...) if present\n- solanaWallet: Solana address (base58) if present\n- xrplWallet: XRPL address (r...) if present\n- items: optional array of line items, each with:\n - path: JSONPath reference (e.g. \"$.line_items[0]\")\n - amount: item price in cents\n\nAt least one wallet address is required.\n\nRespond with ONLY the JSON object, no explanation.`;\n\nexport const confirmPaymentTemplate = `You are extracting payment confirmation parameters from the conversation.\n\nRecent messages:\n{{recentMessages}}\n\nExtract the following as a JSON object:\n- code: the discount code (INSR-XXXXX format, required)\n- txHash: the USDC transaction hash (required)\n- chainId: chain where USDC was sent (number or \"solana\")\n- amount: USDC amount sent (number or string)\n\nChain IDs for USDC payments:\n Ethereum = 1, Base = 8453, Polygon = 137, Arbitrum = 42161,\n Optimism = 10, BNB Chain = 56, Avalanche = 43114, Solana = \"solana\"\n\nRespond with ONLY the JSON object, no explanation.`;\n","import type {\n Action,\n ActionExample,\n IAgentRuntime,\n Memory,\n State,\n HandlerCallback,\n} from \"@elizaos/core\";\nimport { apiCall, formatAttestResult } from \"../utils/api.js\";\nimport type { AttestParams } from \"../utils/api.js\";\nimport { verifyTemplate } from \"../utils/templates.js\";\n\nexport const verifyWalletAction: Action = {\n name: \"VERIFY_WALLET\",\n description:\n \"Verify on-chain token balances, NFT ownership, EAS attestations, or Farcaster identity for a wallet across 32 blockchains. Returns ECDSA-signed privacy-preserving booleans — never exposes actual balances. Supports EVM, Solana, and XRPL.\",\n similes: [\n \"CHECK_WALLET\",\n \"VERIFY_TOKENS\",\n \"CHECK_TOKEN_BALANCE\",\n \"VERIFY_NFT\",\n \"ATTEST_WALLET\",\n \"ON_CHAIN_VERIFY\",\n \"CHECK_HOLDINGS\",\n \"WALLET_ATTESTATION\",\n ],\n examples: [\n [\n {\n name: \"user\",\n content: {\n text: \"Can you check if 0x1234567890abcdef1234567890abcdef12345678 holds at least 100 UNI?\",\n },\n } as ActionExample,\n {\n name: \"assistant\",\n content: {\n text: \"I'll verify the UNI holdings for that wallet now.\",\n actions: [\"VERIFY_WALLET\"],\n },\n } as ActionExample,\n ],\n [\n {\n name: \"user\",\n content: {\n text: \"Verify if 6a1mLjefhvSJX1sEX8PTnionbE9DqoYjU6F6bNkT4Ydr has USDC on Solana\",\n },\n } as ActionExample,\n {\n name: \"assistant\",\n content: {\n text: \"Checking USDC balance on Solana for that wallet.\",\n actions: [\"VERIFY_WALLET\"],\n },\n } as ActionExample,\n ],\n [\n {\n name: \"user\",\n content: {\n text: \"Does 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045 have a Coinbase KYC attestation?\",\n },\n } as ActionExample,\n {\n name: \"assistant\",\n content: {\n text: \"I'll check for a Coinbase verified account attestation on Base.\",\n actions: [\"VERIFY_WALLET\"],\n },\n } as ActionExample,\n ],\n [\n {\n name: \"user\",\n content: {\n text: \"Check if ra8xqX4QhcogFfxpMxMByvFnXyxw9E8rzY holds at least 10 RLUSD on XRPL\",\n },\n } as ActionExample,\n {\n name: \"assistant\",\n content: {\n text: \"I'll verify RLUSD holdings on XRP Ledger for that wallet.\",\n actions: [\"VERIFY_WALLET\"],\n },\n } as ActionExample,\n ],\n ],\n\n validate: async (runtime: IAgentRuntime, _message: Memory): Promise<boolean> => {\n const apiKey = runtime.getSetting(\"INSUMER_API_KEY\");\n return typeof apiKey === \"string\" && apiKey.startsWith(\"insr_live_\");\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n _options?: Record<string, unknown>,\n callback?: HandlerCallback\n ) => {\n const apiKey = runtime.getSetting(\"INSUMER_API_KEY\") as string;\n\n // Build state if not provided\n if (!state) {\n state = await runtime.composeState(message, []);\n }\n\n // Build extraction prompt\n const prompt = verifyTemplate.replace(\n \"{{recentMessages}}\",\n state.text || message.content.text || \"\"\n );\n\n // Extract structured params via LLM\n const extracted = await runtime.useModel(\"TEXT_SMALL\" as never, {\n prompt,\n stopSequences: [] as string[],\n } as never) as string;\n\n let params: AttestParams;\n try {\n params = JSON.parse(extracted);\n } catch {\n if (callback) {\n await callback({\n text: \"I couldn't extract the verification parameters from the conversation. Please specify a wallet address and what to check (e.g., token balance, NFT ownership, KYC attestation).\",\n });\n }\n return { success: false, text: \"Failed to parse verification parameters\" };\n }\n\n // Validate at least one wallet and one condition\n if (!params.wallet && !params.solanaWallet && !params.xrplWallet) {\n if (callback) {\n await callback({\n text: \"Please provide a wallet address to verify (EVM 0x..., Solana base58, or XRPL r-address).\",\n });\n }\n return { success: false, text: \"No wallet address provided\" };\n }\n if (!params.conditions || params.conditions.length === 0) {\n if (callback) {\n await callback({\n text: \"Please specify what to verify (e.g., token balance, NFT ownership, KYC attestation).\",\n });\n }\n return { success: false, text: \"No conditions provided\" };\n }\n\n // Call InsumerAPI\n const result = await apiCall(apiKey, \"POST\", \"/attest\", params as unknown as Record<string, unknown>);\n\n if (!result.ok) {\n const errMsg = result.error?.message || \"Unknown API error\";\n if (callback) {\n await callback({ text: `Verification failed: ${errMsg}` });\n }\n return { success: false, text: errMsg };\n }\n\n const formatted = formatAttestResult(result.data!);\n if (callback) {\n await callback({ text: formatted });\n }\n return { success: true, text: formatted, data: result.data as Record<string, unknown> };\n },\n};\n","import type {\n Action,\n ActionExample,\n IAgentRuntime,\n Memory,\n State,\n HandlerCallback,\n} from \"@elizaos/core\";\nimport { apiCall, formatTrustResult } from \"../utils/api.js\";\nimport type { TrustParams } from \"../utils/api.js\";\nimport { trustTemplate } from \"../utils/templates.js\";\n\nexport const checkTrustAction: Action = {\n name: \"CHECK_TRUST\",\n description:\n \"Generate an ECDSA-signed wallet trust profile with 17+ checks across stablecoins, governance tokens, NFTs, and staking positions. Returns per-dimension pass/fail counts — no scores, no opinions, just cryptographically verifiable evidence. Supports cross-chain profiles with optional Solana and XRPL wallets. Costs 3 credits.\",\n similes: [\n \"TRUST_PROFILE\",\n \"WALLET_TRUST\",\n \"WALLET_REPUTATION\",\n \"AGENT_TRUST\",\n \"WALLET_PROFILE\",\n \"CHECK_WALLET_TRUST\",\n ],\n examples: [\n [\n {\n name: \"user\",\n content: {\n text: \"What's the trust profile for 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045?\",\n },\n } as ActionExample,\n {\n name: \"assistant\",\n content: {\n text: \"I'll generate a trust profile for that wallet now.\",\n actions: [\"CHECK_TRUST\"],\n },\n } as ActionExample,\n ],\n [\n {\n name: \"user\",\n content: {\n text: \"Check trust for 0xAb5801a7D398351b8bE11C439e05C5B3259aeC9B with Solana wallet 6a1mLjefhvSJX1sEX8PTnionbE9DqoYjU6F6bNkT4Ydr\",\n },\n } as ActionExample,\n {\n name: \"assistant\",\n content: {\n text: \"Generating a cross-chain trust profile for those wallets.\",\n actions: [\"CHECK_TRUST\"],\n },\n } as ActionExample,\n ],\n ],\n\n validate: async (runtime: IAgentRuntime, _message: Memory): Promise<boolean> => {\n const apiKey = runtime.getSetting(\"INSUMER_API_KEY\");\n return typeof apiKey === \"string\" && apiKey.startsWith(\"insr_live_\");\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n _options?: Record<string, unknown>,\n callback?: HandlerCallback\n ) => {\n const apiKey = runtime.getSetting(\"INSUMER_API_KEY\") as string;\n\n if (!state) {\n state = await runtime.composeState(message, []);\n }\n\n const prompt = trustTemplate.replace(\n \"{{recentMessages}}\",\n state.text || message.content.text || \"\"\n );\n\n const extracted = await runtime.useModel(\"TEXT_SMALL\" as never, {\n prompt,\n stopSequences: [] as string[],\n } as never) as string;\n\n let params: TrustParams;\n try {\n params = JSON.parse(extracted);\n } catch {\n if (callback) {\n await callback({\n text: \"I couldn't extract the wallet address from the conversation. Please provide an EVM wallet address (0x...).\",\n });\n }\n return { success: false, text: \"Failed to parse trust parameters\" };\n }\n\n if (!params.wallet) {\n if (callback) {\n await callback({\n text: \"Please provide an EVM wallet address (0x...) to generate a trust profile.\",\n });\n }\n return { success: false, text: \"No wallet address provided\" };\n }\n\n const result = await apiCall(apiKey, \"POST\", \"/trust\", params as unknown as Record<string, unknown>);\n\n if (!result.ok) {\n const errMsg = result.error?.message || \"Unknown API error\";\n if (callback) {\n await callback({ text: `Trust profile failed: ${errMsg}` });\n }\n return { success: false, text: errMsg };\n }\n\n const formatted = formatTrustResult(result.data!);\n if (callback) {\n await callback({ text: formatted });\n }\n return { success: true, text: formatted, data: result.data as Record<string, unknown> };\n },\n};\n","import type {\n Action,\n ActionExample,\n IAgentRuntime,\n Memory,\n State,\n HandlerCallback,\n} from \"@elizaos/core\";\nimport { apiCall, formatBatchResult } from \"../utils/api.js\";\nimport type { BatchTrustParams } from \"../utils/api.js\";\nimport { batchTrustTemplate } from \"../utils/templates.js\";\n\nexport const checkTrustBatchAction: Action = {\n name: \"CHECK_TRUST_BATCH\",\n description:\n \"Generate trust profiles for up to 10 wallets in a single request. Shared block fetches make this 5-8x faster than sequential calls. Each wallet gets an independently ECDSA-signed profile. Supports partial success. Costs 3 credits per successful wallet.\",\n similes: [\n \"BATCH_TRUST\",\n \"BULK_TRUST_CHECK\",\n \"MULTI_WALLET_TRUST\",\n \"CHECK_MULTIPLE_WALLETS\",\n ],\n examples: [\n [\n {\n name: \"user\",\n content: {\n text: \"Check trust profiles for these three wallets: 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045, 0xAb5801a7D398351b8bE11C439e05C5B3259aeC9B, and 0x1234567890abcdef1234567890abcdef12345678\",\n },\n } as ActionExample,\n {\n name: \"assistant\",\n content: {\n text: \"I'll generate trust profiles for all three wallets in a single batch.\",\n actions: [\"CHECK_TRUST_BATCH\"],\n },\n } as ActionExample,\n ],\n ],\n\n validate: async (runtime: IAgentRuntime, _message: Memory): Promise<boolean> => {\n const apiKey = runtime.getSetting(\"INSUMER_API_KEY\");\n return typeof apiKey === \"string\" && apiKey.startsWith(\"insr_live_\");\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n _options?: Record<string, unknown>,\n callback?: HandlerCallback\n ) => {\n const apiKey = runtime.getSetting(\"INSUMER_API_KEY\") as string;\n\n if (!state) {\n state = await runtime.composeState(message, []);\n }\n\n const prompt = batchTrustTemplate.replace(\n \"{{recentMessages}}\",\n state.text || message.content.text || \"\"\n );\n\n const extracted = await runtime.useModel(\"TEXT_SMALL\" as never, {\n prompt,\n stopSequences: [] as string[],\n } as never) as string;\n\n let params: BatchTrustParams;\n try {\n params = JSON.parse(extracted);\n } catch {\n if (callback) {\n await callback({\n text: \"I couldn't extract the wallet addresses from the conversation. Please list the EVM wallet addresses (0x...) you want to check.\",\n });\n }\n return { success: false, text: \"Failed to parse batch parameters\" };\n }\n\n if (!params.wallets || params.wallets.length === 0) {\n if (callback) {\n await callback({\n text: \"Please provide at least one EVM wallet address (0x...) for batch trust profiling.\",\n });\n }\n return { success: false, text: \"No wallets provided\" };\n }\n\n if (params.wallets.length > 10) {\n params.wallets = params.wallets.slice(0, 10);\n }\n\n const result = await apiCall(apiKey, \"POST\", \"/trust/batch\", params as unknown as Record<string, unknown>);\n\n if (!result.ok) {\n const errMsg = result.error?.message || \"Unknown API error\";\n if (callback) {\n await callback({ text: `Batch trust check failed: ${errMsg}` });\n }\n return { success: false, text: errMsg };\n }\n\n const formatted = formatBatchResult(result.data!);\n if (callback) {\n await callback({ text: formatted });\n }\n return { success: true, text: formatted, data: result.data as Record<string, unknown> };\n },\n};\n","import type {\n Action,\n ActionExample,\n IAgentRuntime,\n Memory,\n State,\n HandlerCallback,\n} from \"@elizaos/core\";\nimport { publicApiCall } from \"../utils/api.js\";\nimport { buyKeyTemplate } from \"../utils/templates.js\";\n\ninterface BuyKeyParams {\n txHash: string;\n chainId: number | \"solana\";\n amount: number;\n appName: string;\n}\n\nexport const buyKeyAction: Action = {\n name: \"BUY_API_KEY\",\n description:\n \"Buy a new InsumerAPI key with USDC. No existing API key required. Send USDC to the platform wallet, then provide the transaction hash. The sender wallet becomes the key's identity. One key per wallet.\",\n similes: [\n \"PURCHASE_API_KEY\",\n \"GET_API_KEY\",\n \"BUY_KEY\",\n \"CREATE_API_KEY\",\n \"ONBOARD_AGENT\",\n ],\n examples: [\n [\n {\n name: \"user\",\n content: {\n text: \"I sent 10 USDC on Base, tx hash 0xabc123. Get me an API key for my agent called 'TrustBot'.\",\n },\n } as ActionExample,\n {\n name: \"assistant\",\n content: {\n text: \"I'll verify your USDC payment and create your API key now.\",\n actions: [\"BUY_API_KEY\"],\n },\n } as ActionExample,\n ],\n ],\n\n validate: async (_runtime: IAgentRuntime, _message: Memory): Promise<boolean> => {\n // No API key required — this is the endpoint that creates one\n return true;\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n _options?: Record<string, unknown>,\n callback?: HandlerCallback\n ) => {\n // Build state if not provided\n if (!state) {\n state = await runtime.composeState(message, []);\n }\n\n // Build extraction prompt\n const prompt = buyKeyTemplate.replace(\n \"{{recentMessages}}\",\n state.text || message.content.text || \"\"\n );\n\n // Extract structured params via LLM\n const extracted = await runtime.useModel(\"TEXT_SMALL\" as never, {\n prompt,\n stopSequences: [] as string[],\n } as never) as string;\n\n let params: BuyKeyParams;\n try {\n params = JSON.parse(extracted);\n } catch {\n if (callback) {\n await callback({\n text: \"I couldn't extract the purchase parameters. Please provide: transaction hash, chain (e.g. Base, Ethereum, Solana), USDC amount, and a name for your key.\",\n });\n }\n return { success: false, text: \"Failed to parse purchase parameters\" };\n }\n\n if (!params.txHash) {\n if (callback) {\n await callback({ text: \"Please provide the USDC transaction hash.\" });\n }\n return { success: false, text: \"No transaction hash provided\" };\n }\n if (!params.appName) {\n if (callback) {\n await callback({ text: \"Please provide a name for your API key.\" });\n }\n return { success: false, text: \"No app name provided\" };\n }\n\n // Call InsumerAPI (public endpoint, no auth needed)\n const result = await publicApiCall(\"POST\", \"/keys/buy\", params as unknown as Record<string, unknown>);\n\n if (!result.ok) {\n const errMsg = result.error?.message || \"Unknown API error\";\n if (callback) {\n await callback({ text: `Key purchase failed: ${errMsg}` });\n }\n return { success: false, text: errMsg };\n }\n\n const data = result.data as Record<string, unknown>;\n const text = [\n `API key created successfully!`,\n ``,\n `Key: ${data.key}`,\n `Name: ${data.name}`,\n `Credits: ${data.creditsAdded}`,\n `Wallet: ${data.registeredWallet}`,\n ``,\n `Store this key securely — it is only shown once.`,\n `Use it as your INSUMER_API_KEY to access all verification endpoints.`,\n ].join(\"\\n\");\n\n if (callback) {\n await callback({ text });\n }\n return { success: true, text, data };\n },\n};\n","import type {\n Action,\n ActionExample,\n IAgentRuntime,\n Memory,\n State,\n HandlerCallback,\n} from \"@elizaos/core\";\nimport { apiCall } from \"../utils/api.js\";\nimport { createMerchantTemplate } from \"../utils/templates.js\";\n\ninterface CreateMerchantParams {\n companyName: string;\n companyId: string;\n location?: string;\n}\n\nexport const createMerchantAction: Action = {\n name: \"CREATE_MERCHANT\",\n description:\n \"Create a new merchant on InsumerAPI. The agent's API key becomes the merchant owner. Receives 100 free verification credits. Max 10 merchants per API key.\",\n similes: [\n \"NEW_MERCHANT\",\n \"SETUP_MERCHANT\",\n \"REGISTER_MERCHANT\",\n \"ONBOARD_MERCHANT\",\n \"CREATE_STORE\",\n ],\n examples: [\n [\n {\n name: \"user\",\n content: {\n text: \"Create a merchant called 'Acme Coffee' with ID acme-coffee, located in New York.\",\n },\n } as ActionExample,\n {\n name: \"assistant\",\n content: {\n text: \"I'll create the Acme Coffee merchant now.\",\n actions: [\"CREATE_MERCHANT\"],\n },\n } as ActionExample,\n ],\n ],\n\n validate: async (runtime: IAgentRuntime, _message: Memory): Promise<boolean> => {\n const apiKey = runtime.getSetting(\"INSUMER_API_KEY\");\n return typeof apiKey === \"string\" && apiKey.startsWith(\"insr_live_\");\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n _options?: Record<string, unknown>,\n callback?: HandlerCallback\n ) => {\n const apiKey = runtime.getSetting(\"INSUMER_API_KEY\") as string;\n\n if (!state) {\n state = await runtime.composeState(message, []);\n }\n\n const prompt = createMerchantTemplate.replace(\n \"{{recentMessages}}\",\n state.text || message.content.text || \"\"\n );\n\n const extracted = await runtime.useModel(\"TEXT_SMALL\" as never, {\n prompt,\n stopSequences: [] as string[],\n } as never) as string;\n\n let params: CreateMerchantParams;\n try {\n params = JSON.parse(extracted);\n } catch {\n if (callback) {\n await callback({\n text: \"I couldn't extract the merchant details. Please provide a company name and a unique ID (alphanumeric, dashes, underscores).\",\n });\n }\n return { success: false, text: \"Failed to parse merchant parameters\" };\n }\n\n if (!params.companyName || !params.companyId) {\n if (callback) {\n await callback({\n text: \"Please provide both a company name and a unique company ID (e.g. 'acme-coffee').\",\n });\n }\n return { success: false, text: \"Missing required merchant fields\" };\n }\n\n const result = await apiCall(apiKey, \"POST\", \"/merchants\", params as unknown as Record<string, unknown>);\n\n if (!result.ok) {\n const errMsg = result.error?.message || \"Unknown API error\";\n if (callback) {\n await callback({ text: `Merchant creation failed: ${errMsg}` });\n }\n return { success: false, text: errMsg };\n }\n\n const data = result.data as Record<string, unknown>;\n const text = [\n `Merchant created successfully!`,\n ``,\n `ID: ${data.id}`,\n `Name: ${data.companyName}`,\n `Credits: ${data.credits} (free starter credits)`,\n ``,\n `Next steps: configure token tiers with CONFIGURE_TOKENS, then add credits with ADD_CREDITS.`,\n ].join(\"\\n\");\n\n if (callback) {\n await callback({ text });\n }\n return { success: true, text, data };\n },\n};\n","import type {\n Action,\n ActionExample,\n IAgentRuntime,\n Memory,\n State,\n HandlerCallback,\n} from \"@elizaos/core\";\nimport { apiCall } from \"../utils/api.js\";\nimport { configureTokensTemplate } from \"../utils/templates.js\";\n\ninterface TokenTier {\n name: string;\n threshold: number;\n discount: number;\n}\n\ninterface TokenConfig {\n symbol: string;\n chainId: number;\n contractAddress: string;\n decimals: number;\n currency?: string;\n tiers: TokenTier[];\n}\n\ninterface ConfigureTokensParams {\n merchantId: string;\n ownToken?: TokenConfig | null;\n partnerTokens?: TokenConfig[];\n}\n\nexport const configureTokensAction: Action = {\n name: \"CONFIGURE_TOKENS\",\n description:\n \"Configure which tokens gate access to merchant discounts and set tier thresholds. Supports own token + up to 7 partner tokens with 1-4 discount tiers each. Limited to 11 onboarding chains.\",\n similes: [\n \"SET_TOKEN_TIERS\",\n \"CONFIGURE_TOKEN_GATING\",\n \"SETUP_TOKENS\",\n \"TOKEN_TIERS\",\n \"SET_DISCOUNTS\",\n ],\n examples: [\n [\n {\n name: \"user\",\n content: {\n text: \"Set up USDC token gating for merchant acme-coffee: Bronze at 100 USDC (5% off), Silver at 1000 (10%), Gold at 10000 (15%) on Ethereum.\",\n },\n } as ActionExample,\n {\n name: \"assistant\",\n content: {\n text: \"I'll configure the USDC token tiers for acme-coffee now.\",\n actions: [\"CONFIGURE_TOKENS\"],\n },\n } as ActionExample,\n ],\n ],\n\n validate: async (runtime: IAgentRuntime, _message: Memory): Promise<boolean> => {\n const apiKey = runtime.getSetting(\"INSUMER_API_KEY\");\n return typeof apiKey === \"string\" && apiKey.startsWith(\"insr_live_\");\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n _options?: Record<string, unknown>,\n callback?: HandlerCallback\n ) => {\n const apiKey = runtime.getSetting(\"INSUMER_API_KEY\") as string;\n\n if (!state) {\n state = await runtime.composeState(message, []);\n }\n\n const prompt = configureTokensTemplate.replace(\n \"{{recentMessages}}\",\n state.text || message.content.text || \"\"\n );\n\n const extracted = await runtime.useModel(\"TEXT_SMALL\" as never, {\n prompt,\n stopSequences: [] as string[],\n } as never) as string;\n\n let params: ConfigureTokensParams;\n try {\n params = JSON.parse(extracted);\n } catch {\n if (callback) {\n await callback({\n text: \"I couldn't extract the token configuration. Please specify a merchant ID, token symbol, chain, contract address, and discount tiers.\",\n });\n }\n return { success: false, text: \"Failed to parse token configuration\" };\n }\n\n if (!params.merchantId) {\n if (callback) {\n await callback({ text: \"Please provide the merchant ID to configure tokens for.\" });\n }\n return { success: false, text: \"No merchant ID provided\" };\n }\n\n const { merchantId, ...body } = params;\n const result = await apiCall(apiKey, \"PUT\", `/merchants/${merchantId}/tokens`, body as unknown as Record<string, unknown>);\n\n if (!result.ok) {\n const errMsg = result.error?.message || \"Unknown API error\";\n if (callback) {\n await callback({ text: `Token configuration failed: ${errMsg}` });\n }\n return { success: false, text: errMsg };\n }\n\n const data = result.data as Record<string, unknown>;\n const text = [\n `Token tiers configured for ${merchantId}!`,\n ``,\n `Total tokens: ${data.totalTokens}/${data.maxTokens}`,\n ].join(\"\\n\");\n\n if (callback) {\n await callback({ text });\n }\n return { success: true, text, data };\n },\n};\n","import type {\n Action,\n ActionExample,\n IAgentRuntime,\n Memory,\n State,\n HandlerCallback,\n} from \"@elizaos/core\";\nimport { apiCall } from \"../utils/api.js\";\nimport { addCreditsTemplate } from \"../utils/templates.js\";\n\ninterface AddCreditsParams {\n merchantId: string;\n txHash: string;\n chainId: number | \"solana\";\n amount: number;\n updateWallet?: boolean;\n}\n\nexport const addCreditsAction: Action = {\n name: \"ADD_CREDITS\",\n description:\n \"Buy merchant verification credits with USDC. Send USDC to the platform wallet, then provide the tx hash. Credits are consumed by discount code generation (POST /v1/verify, ACP, UCP). Volume discounts apply.\",\n similes: [\n \"BUY_MERCHANT_CREDITS\",\n \"TOP_UP_CREDITS\",\n \"ADD_MERCHANT_CREDITS\",\n \"PURCHASE_CREDITS\",\n ],\n examples: [\n [\n {\n name: \"user\",\n content: {\n text: \"I sent 20 USDC on Base (tx 0xabc123) to top up credits for merchant acme-coffee.\",\n },\n } as ActionExample,\n {\n name: \"assistant\",\n content: {\n text: \"I'll verify the payment and add credits to acme-coffee now.\",\n actions: [\"ADD_CREDITS\"],\n },\n } as ActionExample,\n ],\n ],\n\n validate: async (runtime: IAgentRuntime, _message: Memory): Promise<boolean> => {\n const apiKey = runtime.getSetting(\"INSUMER_API_KEY\");\n return typeof apiKey === \"string\" && apiKey.startsWith(\"insr_live_\");\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n _options?: Record<string, unknown>,\n callback?: HandlerCallback\n ) => {\n const apiKey = runtime.getSetting(\"INSUMER_API_KEY\") as string;\n\n if (!state) {\n state = await runtime.composeState(message, []);\n }\n\n const prompt = addCreditsTemplate.replace(\n \"{{recentMessages}}\",\n state.text || message.content.text || \"\"\n );\n\n const extracted = await runtime.useModel(\"TEXT_SMALL\" as never, {\n prompt,\n stopSequences: [] as string[],\n } as never) as string;\n\n let params: AddCreditsParams;\n try {\n params = JSON.parse(extracted);\n } catch {\n if (callback) {\n await callback({\n text: \"I couldn't extract the credit purchase details. Please provide: merchant ID, transaction hash, chain, and USDC amount.\",\n });\n }\n return { success: false, text: \"Failed to parse credit purchase parameters\" };\n }\n\n if (!params.merchantId || !params.txHash) {\n if (callback) {\n await callback({ text: \"Please provide the merchant ID and USDC transaction hash.\" });\n }\n return { success: false, text: \"Missing merchant ID or tx hash\" };\n }\n\n const { merchantId, ...body } = params;\n const result = await apiCall(apiKey, \"POST\", `/merchants/${merchantId}/credits`, body as unknown as Record<string, unknown>);\n\n if (!result.ok) {\n const errMsg = result.error?.message || \"Unknown API error\";\n if (callback) {\n await callback({ text: `Credit purchase failed: ${errMsg}` });\n }\n return { success: false, text: errMsg };\n }\n\n const data = result.data as Record<string, unknown>;\n const text = [\n `Credits added to ${merchantId}!`,\n ``,\n `Credits added: ${data.creditsAdded}`,\n `Total credits: ${data.totalCredits}`,\n `USDC paid: ${data.usdcPaid}`,\n `Chain: ${data.chainName}`,\n ].join(\"\\n\");\n\n if (callback) {\n await callback({ text });\n }\n return { success: true, text, data };\n },\n};\n","import type {\n Action,\n ActionExample,\n IAgentRuntime,\n Memory,\n State,\n HandlerCallback,\n} from \"@elizaos/core\";\nimport { apiCall } from \"../utils/api.js\";\nimport { acpDiscountTemplate } from \"../utils/templates.js\";\n\ninterface AcpDiscountParams {\n merchantId: string;\n wallet?: string;\n solanaWallet?: string;\n xrplWallet?: string;\n items?: Array<{ path: string; amount: number }>;\n}\n\nexport const acpDiscountAction: Action = {\n name: \"ACP_DISCOUNT\",\n description:\n \"Check discount eligibility in OpenAI/Stripe Agentic Commerce Protocol (ACP) format. Returns coupon objects, allocations, and a signed verification code. Costs 1 merchant credit.\",\n similes: [\n \"ACP_CHECK\",\n \"OPENAI_DISCOUNT\",\n \"STRIPE_DISCOUNT\",\n \"AGENTIC_COMMERCE_DISCOUNT\",\n \"CHECK_ACP_DISCOUNT\",\n ],\n examples: [\n [\n {\n name: \"user\",\n content: {\n text: \"Check ACP discount for wallet 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045 at merchant acme-coffee.\",\n },\n } as ActionExample,\n {\n name: \"assistant\",\n content: {\n text: \"I'll check the ACP discount eligibility now.\",\n actions: [\"ACP_DISCOUNT\"],\n },\n } as ActionExample,\n ],\n ],\n\n validate: async (runtime: IAgentRuntime, _message: Memory): Promise<boolean> => {\n const apiKey = runtime.getSetting(\"INSUMER_API_KEY\");\n return typeof apiKey === \"string\" && apiKey.startsWith(\"insr_live_\");\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n _options?: Record<string, unknown>,\n callback?: HandlerCallback\n ) => {\n const apiKey = runtime.getSetting(\"INSUMER_API_KEY\") as string;\n\n if (!state) {\n state = await runtime.composeState(message, []);\n }\n\n const prompt = acpDiscountTemplate.replace(\n \"{{recentMessages}}\",\n state.text || message.content.text || \"\"\n );\n\n const extracted = await runtime.useModel(\"TEXT_SMALL\" as never, {\n prompt,\n stopSequences: [] as string[],\n } as never) as string;\n\n let params: AcpDiscountParams;\n try {\n params = JSON.parse(extracted);\n } catch {\n if (callback) {\n await callback({\n text: \"I couldn't extract the discount parameters. Please provide a merchant ID and wallet address.\",\n });\n }\n return { success: false, text: \"Failed to parse ACP discount parameters\" };\n }\n\n if (!params.merchantId) {\n if (callback) {\n await callback({ text: \"Please provide the merchant ID.\" });\n }\n return { success: false, text: \"No merchant ID provided\" };\n }\n if (!params.wallet && !params.solanaWallet && !params.xrplWallet) {\n if (callback) {\n await callback({ text: \"Please provide a wallet address to check discount eligibility.\" });\n }\n return { success: false, text: \"No wallet address provided\" };\n }\n\n const result = await apiCall(apiKey, \"POST\", \"/acp/discount\", params as unknown as Record<string, unknown>);\n\n if (!result.ok) {\n const errMsg = result.error?.message || \"Unknown API error\";\n if (callback) {\n await callback({ text: `ACP discount check failed: ${errMsg}` });\n }\n return { success: false, text: errMsg };\n }\n\n const data = result.data as Record<string, unknown>;\n const discounts = data.discounts as Record<string, unknown> | undefined;\n const codes = (discounts?.codes || []) as string[];\n const applied = (discounts?.applied || []) as Array<Record<string, unknown>>;\n const verification = data.verification as Record<string, unknown> | undefined;\n\n const lines = [`ACP Discount Result`, ``];\n if (codes.length > 0) {\n lines.push(`Discount code: ${codes[0]}`);\n }\n if (applied.length > 0) {\n const coupon = applied[0].coupon as Record<string, unknown> | undefined;\n if (coupon?.percent_off) {\n lines.push(`Discount: ${coupon.percent_off}%`);\n }\n }\n if (verification) {\n lines.push(`Verification code: ${verification.code}`);\n }\n if (codes.length === 0 && !verification) {\n lines.push(`No discount eligible for this wallet at this merchant.`);\n }\n\n const text = lines.join(\"\\n\");\n if (callback) {\n await callback({ text });\n }\n return { success: true, text, data };\n },\n};\n","import type {\n Action,\n ActionExample,\n IAgentRuntime,\n Memory,\n State,\n HandlerCallback,\n} from \"@elizaos/core\";\nimport { apiCall } from \"../utils/api.js\";\nimport { ucpDiscountTemplate } from \"../utils/templates.js\";\n\ninterface UcpDiscountParams {\n merchantId: string;\n wallet?: string;\n solanaWallet?: string;\n xrplWallet?: string;\n items?: Array<{ path: string; amount: number }>;\n}\n\nexport const ucpDiscountAction: Action = {\n name: \"UCP_DISCOUNT\",\n description:\n \"Check discount eligibility in Google Universal Commerce Protocol (UCP) format. Returns title-based discounts, allocations, and a signed verification code. Costs 1 merchant credit.\",\n similes: [\n \"UCP_CHECK\",\n \"GOOGLE_DISCOUNT\",\n \"UNIVERSAL_COMMERCE_DISCOUNT\",\n \"CHECK_UCP_DISCOUNT\",\n ],\n examples: [\n [\n {\n name: \"user\",\n content: {\n text: \"Check UCP discount for wallet 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045 at merchant acme-coffee.\",\n },\n } as ActionExample,\n {\n name: \"assistant\",\n content: {\n text: \"I'll check the UCP discount eligibility now.\",\n actions: [\"UCP_DISCOUNT\"],\n },\n } as ActionExample,\n ],\n ],\n\n validate: async (runtime: IAgentRuntime, _message: Memory): Promise<boolean> => {\n const apiKey = runtime.getSetting(\"INSUMER_API_KEY\");\n return typeof apiKey === \"string\" && apiKey.startsWith(\"insr_live_\");\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n _options?: Record<string, unknown>,\n callback?: HandlerCallback\n ) => {\n const apiKey = runtime.getSetting(\"INSUMER_API_KEY\") as string;\n\n if (!state) {\n state = await runtime.composeState(message, []);\n }\n\n const prompt = ucpDiscountTemplate.replace(\n \"{{recentMessages}}\",\n state.text || message.content.text || \"\"\n );\n\n const extracted = await runtime.useModel(\"TEXT_SMALL\" as never, {\n prompt,\n stopSequences: [] as string[],\n } as never) as string;\n\n let params: UcpDiscountParams;\n try {\n params = JSON.parse(extracted);\n } catch {\n if (callback) {\n await callback({\n text: \"I couldn't extract the discount parameters. Please provide a merchant ID and wallet address.\",\n });\n }\n return { success: false, text: \"Failed to parse UCP discount parameters\" };\n }\n\n if (!params.merchantId) {\n if (callback) {\n await callback({ text: \"Please provide the merchant ID.\" });\n }\n return { success: false, text: \"No merchant ID provided\" };\n }\n if (!params.wallet && !params.solanaWallet && !params.xrplWallet) {\n if (callback) {\n await callback({ text: \"Please provide a wallet address to check discount eligibility.\" });\n }\n return { success: false, text: \"No wallet address provided\" };\n }\n\n const result = await apiCall(apiKey, \"POST\", \"/ucp/discount\", params as unknown as Record<string, unknown>);\n\n if (!result.ok) {\n const errMsg = result.error?.message || \"Unknown API error\";\n if (callback) {\n await callback({ text: `UCP discount check failed: ${errMsg}` });\n }\n return { success: false, text: errMsg };\n }\n\n const data = result.data as Record<string, unknown>;\n const discounts = data.discounts as Record<string, unknown> | undefined;\n const codes = (discounts?.codes || []) as string[];\n const applied = (discounts?.applied || []) as Array<Record<string, unknown>>;\n const verification = data.verification as Record<string, unknown> | undefined;\n\n const lines = [`UCP Discount Result`, ``];\n if (codes.length > 0) {\n lines.push(`Discount code: ${codes[0]}`);\n }\n if (applied.length > 0) {\n const discount = applied[0] as Record<string, unknown>;\n if (discount.title) {\n lines.push(`Discount: ${discount.title}`);\n }\n }\n if (verification) {\n lines.push(`Verification code: ${verification.code}`);\n }\n if (codes.length === 0 && !verification) {\n lines.push(`No discount eligible for this wallet at this merchant.`);\n }\n\n const text = lines.join(\"\\n\");\n if (callback) {\n await callback({ text });\n }\n return { success: true, text, data };\n },\n};\n","import type {\n Action,\n ActionExample,\n IAgentRuntime,\n Memory,\n State,\n HandlerCallback,\n} from \"@elizaos/core\";\nimport { apiCall } from \"../utils/api.js\";\nimport { confirmPaymentTemplate } from \"../utils/templates.js\";\n\ninterface ConfirmPaymentParams {\n code: string;\n txHash: string;\n chainId: number | \"solana\";\n amount: number | string;\n}\n\nexport const confirmPaymentAction: Action = {\n name: \"CONFIRM_PAYMENT\",\n description:\n \"Confirm that a USDC payment was made on-chain for a discount code. Verifies the transaction receipt to ensure USDC arrived at the merchant address. Use after ACP_DISCOUNT or UCP_DISCOUNT.\",\n similes: [\n \"VERIFY_PAYMENT\",\n \"CONFIRM_USDC\",\n \"PAYMENT_CONFIRMATION\",\n \"CHECK_PAYMENT\",\n ],\n examples: [\n [\n {\n name: \"user\",\n content: {\n text: \"Confirm payment for code INSR-A7K3M. I sent 25 USDC on Base, tx hash 0xdef456.\",\n },\n } as ActionExample,\n {\n name: \"assistant\",\n content: {\n text: \"I'll verify the USDC payment for that discount code now.\",\n actions: [\"CONFIRM_PAYMENT\"],\n },\n } as ActionExample,\n ],\n ],\n\n validate: async (runtime: IAgentRuntime, _message: Memory): Promise<boolean> => {\n const apiKey = runtime.getSetting(\"INSUMER_API_KEY\");\n return typeof apiKey === \"string\" && apiKey.startsWith(\"insr_live_\");\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n _options?: Record<string, unknown>,\n callback?: HandlerCallback\n ) => {\n const apiKey = runtime.getSetting(\"INSUMER_API_KEY\") as string;\n\n if (!state) {\n state = await runtime.composeState(message, []);\n }\n\n const prompt = confirmPaymentTemplate.replace(\n \"{{recentMessages}}\",\n state.text || message.content.text || \"\"\n );\n\n const extracted = await runtime.useModel(\"TEXT_SMALL\" as never, {\n prompt,\n stopSequences: [] as string[],\n } as never) as string;\n\n let params: ConfirmPaymentParams;\n try {\n params = JSON.parse(extracted);\n } catch {\n if (callback) {\n await callback({\n text: \"I couldn't extract the payment details. Please provide: discount code (INSR-XXXXX), transaction hash, chain, and USDC amount.\",\n });\n }\n return { success: false, text: \"Failed to parse payment parameters\" };\n }\n\n if (!params.code || !params.txHash) {\n if (callback) {\n await callback({ text: \"Please provide the discount code (INSR-XXXXX) and transaction hash.\" });\n }\n return { success: false, text: \"Missing code or tx hash\" };\n }\n\n const result = await apiCall(apiKey, \"POST\", \"/payment/confirm\", params as unknown as Record<string, unknown>);\n\n if (!result.ok) {\n const errMsg = result.error?.message || \"Unknown API error\";\n if (callback) {\n await callback({ text: `Payment confirmation failed: ${errMsg}` });\n }\n return { success: false, text: errMsg };\n }\n\n const data = result.data as Record<string, unknown>;\n const confirmed = data.confirmed as boolean;\n const text = confirmed\n ? [\n `Payment confirmed!`,\n ``,\n `Code: ${data.code}`,\n `Amount verified: ${data.amountVerified} USDC`,\n `Chain: ${data.chainName}`,\n `Confirmed at: ${data.confirmedAt}`,\n ].join(\"\\n\")\n : `Payment not confirmed. The transaction could not be verified.`;\n\n if (callback) {\n await callback({ text });\n }\n return { success: true, text, data };\n },\n};\n","import type {\n Provider,\n IAgentRuntime,\n Memory,\n} from \"@elizaos/core\";\n\n// Wallet address patterns\nconst EVM_REGEX = /\\b0x[a-fA-F0-9]{40}\\b/g;\nconst SOLANA_REGEX = /\\b[1-9A-HJ-NP-Za-km-z]{32,44}\\b/g;\nconst XRPL_REGEX = /\\br[1-9A-HJ-NP-Za-km-z]{24,34}\\b/g;\n\n// Common false positives for Solana regex (transaction hashes, etc.)\nfunction isSolanaAddress(candidate: string): boolean {\n // Solana addresses are 32-44 chars of base58\n return candidate.length >= 32 && candidate.length <= 44;\n}\n\nexport const walletCredentialsProvider: Provider = {\n name: \"WALLET_CREDENTIALS\",\n description:\n \"Detects wallet addresses in conversation and signals that InsumerAPI verification actions are available.\",\n dynamic: true,\n\n get: async (\n runtime: IAgentRuntime,\n message: Memory\n ) => {\n // Silent if no API key configured\n const apiKey = runtime.getSetting(\"INSUMER_API_KEY\");\n if (!apiKey || typeof apiKey !== \"string\" || !apiKey.startsWith(\"insr_live_\")) {\n return { text: \"\" };\n }\n\n const text = message.content.text || \"\";\n\n const evmWallets = text.match(EVM_REGEX) || [];\n const solanaMatches = (text.match(SOLANA_REGEX) || []).filter(isSolanaAddress);\n const xrplWallets = text.match(XRPL_REGEX) || [];\n\n // Filter Solana matches that overlap with EVM or XRPL\n const evmSet = new Set(evmWallets);\n const xrplSet = new Set(xrplWallets);\n const solanaWallets = solanaMatches.filter(\n (s) => !evmSet.has(s) && !xrplSet.has(s)\n );\n\n const detected: string[] = [];\n if (evmWallets.length > 0) {\n detected.push(`EVM: ${evmWallets.join(\", \")}`);\n }\n if (solanaWallets.length > 0) {\n detected.push(`Solana: ${solanaWallets.join(\", \")}`);\n }\n if (xrplWallets.length > 0) {\n detected.push(`XRPL: ${xrplWallets.join(\", \")}`);\n }\n\n if (detected.length === 0) {\n return { text: \"\" };\n }\n\n return {\n text: `InsumerAPI is available for on-chain verification. Detected wallets: ${detected.join(\"; \")}. You can use VERIFY_WALLET to check token balances/NFTs/attestations, or CHECK_TRUST for a full trust profile.`,\n };\n },\n};\n","import type { Plugin } from \"@elizaos/core\";\nimport { verifyWalletAction } from \"./actions/verify.js\";\nimport { checkTrustAction } from \"./actions/trust.js\";\nimport { checkTrustBatchAction } from \"./actions/batch.js\";\nimport { buyKeyAction } from \"./actions/buy_key.js\";\nimport { createMerchantAction } from \"./actions/create_merchant.js\";\nimport { configureTokensAction } from \"./actions/configure_tokens.js\";\nimport { addCreditsAction } from \"./actions/add_credits.js\";\nimport { acpDiscountAction } from \"./actions/acp_discount.js\";\nimport { ucpDiscountAction } from \"./actions/ucp_discount.js\";\nimport { confirmPaymentAction } from \"./actions/confirm_payment.js\";\nimport { walletCredentialsProvider } from \"./providers/credentials.js\";\n\nexport const insumerPlugin: Plugin = {\n name: \"insumer\",\n description:\n \"Full autonomous agent lifecycle for token-gated commerce across 32 blockchains. 10 actions: buy API key, create merchant, configure token tiers, add credits, verify wallets, trust profiles, ACP/UCP commerce, confirm payments. ECDSA-signed results, never exposes balances.\",\n actions: [\n verifyWalletAction,\n checkTrustAction,\n checkTrustBatchAction,\n buyKeyAction,\n createMerchantAction,\n configureTokensAction,\n addCreditsAction,\n acpDiscountAction,\n ucpDiscountAction,\n confirmPaymentAction,\n ],\n providers: [walletCredentialsProvider],\n};\n\nexport default insumerPlugin;\n"],"mappings":";AAAA,IAAM,WAAW;AAqDjB,eAAsB,QACpB,QACA,QACA,MACA,MACsB;AACtB,QAAM,MAAM,GAAG,QAAQ,GAAG,IAAI;AAC9B,QAAM,MAAM,MAAM,MAAM,KAAK;AAAA,IAC3B;AAAA,IACA,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,aAAa;AAAA,IACf;AAAA,IACA,MAAM,OAAO,KAAK,UAAU,IAAI,IAAI;AAAA,EACtC,CAAC;AACD,SAAO,IAAI,KAAK;AAClB;AAEA,eAAsB,cACpB,QACA,MACA,MACsB;AACtB,QAAM,MAAM,GAAG,QAAQ,GAAG,IAAI;AAC9B,QAAM,MAAM,MAAM,MAAM,KAAK;AAAA,IAC3B;AAAA,IACA,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAC9C,MAAM,OAAO,KAAK,UAAU,IAAI,IAAI;AAAA,EACtC,CAAC;AACD,SAAO,IAAI,KAAK;AAClB;AA4BO,SAAS,mBAAmB,MAAuC;AACxE,QAAM,cAAc,KAAK;AACzB,QAAM,KAAK,aAAa;AACxB,QAAM,OAAO,aAAa;AAC1B,QAAM,UAAW,aAAa,WAAW,CAAC;AAC1C,QAAM,QAAkB;AAAA,IACtB,eAAe,EAAE,KAAK,OAAO,SAAS,MAAM;AAAA,IAC5C;AAAA,EACF;AACA,aAAW,KAAK,SAAS;AACvB,UAAM,OAAO,EAAE,MAAM,MAAM;AAC3B,UAAM,QACJ,EAAE,YAAY,SAAY,WAAW,EAAE,OAAO,MAAM;AACtD,QAAI,QAAQ;AACZ,QAAI,EAAE,gBAAgB,QAAW;AAC/B,eAAS,aAAa,EAAE,WAAW;AAAA,IACrC;AACA,QAAI,EAAE,gBAAgB,QAAQ;AAC5B,eAAS;AAAA,IACX;AACA,UAAM,KAAK,MAAM,IAAI,KAAK,EAAE,SAAS,EAAE,IAAI,GAAG,KAAK,GAAG,KAAK,EAAE;AAAA,EAC/D;AACA,QAAM,YAAY,aAAa;AAC/B,QAAM,YAAY,aAAa;AAC/B,QAAM,KAAK,IAAI,GAAG,SAAS,YAAY,SAAS,SAAS;AACzD,MAAI,aAAa,WAAW;AAC1B,UAAM,KAAK,YAAY,YAAY,SAAS,EAAE;AAAA,EAChD;AACA,MAAI,KAAK,KAAK;AACZ,UAAM,KAAK,IAAI,QAAQ,KAAK,GAAG,EAAE;AAAA,EACnC;AACA,SAAO,MAAM,KAAK,IAAI;AACxB;AAMO,SAAS,kBAAkB,MAAuC;AACvE,QAAM,QAAQ,KAAK;AACnB,QAAM,KAAK,OAAO;AAClB,QAAM,aAAa,OAAO;AAC1B,QAAM,UAAU,OAAO;AACvB,QAAM,QAAkB,CAAC,iBAAiB,EAAE,IAAI,EAAE;AAClD,MAAI,YAAY;AACd,eAAW,CAAC,MAAM,GAAG,KAAK,OAAO,QAAQ,UAAU,GAAG;AACpD,YAAM;AAAA,QACJ,KAAK,IAAI,KAAK,IAAI,SAAS,IAAI,IAAI,KAAK;AAAA,MAC1C;AACA,iBAAW,SAAS,IAAI,QAAQ;AAC9B,cAAM,OAAO,MAAM,MAAM,MAAM;AAC/B,cAAM,KAAK,QAAQ,IAAI,KAAK,MAAM,KAAK,EAAE;AAAA,MAC3C;AAAA,IACF;AAAA,EACF;AACA,MAAI,SAAS;AACX,UAAM;AAAA,MACJ;AAAA,MACA,YAAY,QAAQ,WAAW,IAAI,QAAQ,WAAW;AAAA,IACxD;AAAA,EACF;AACA,SAAO,MAAM,KAAK,IAAI;AACxB;AAMO,SAAS,kBAAkB,MAAuC;AACvE,QAAM,UAAW,KAAK,WAAW,CAAC;AAClC,QAAM,eAAe,KAAK;AAC1B,QAAM,QAAkB,CAAC,gBAAgB,QAAQ,MAAM,aAAa,EAAE;AACtE,aAAW,UAAU,SAAS;AAC5B,QAAI,OAAO,OAAO;AAChB,YAAM,MAAM,OAAO;AACnB,YAAM,KAAK,KAAK,IAAI,MAAM,kBAAa,IAAI,OAAO,EAAE;AAAA,IACtD,OAAO;AACL,YAAM,QAAQ,OAAO;AACrB,YAAM,UAAU,OAAO;AACvB,YAAM;AAAA,QACJ,KAAK,OAAO,MAAM,KAAK,SAAS,eAAe,GAAG,IAAI,SAAS,eAAe,GAAG,mBAAmB,OAAO,EAAE;AAAA,MAC/G;AAAA,IACF;AAAA,EACF;AACA,MAAI,cAAc;AAChB,UAAM,KAAK,IAAI,GAAG,aAAa,SAAS,IAAI,aAAa,SAAS,YAAY;AAAA,EAChF;AACA,SAAO,MAAM,KAAK,IAAI;AACxB;;;ACvMO,IAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkEvB,IAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AActB,IAAM,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAe3B,IAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBvB,IAAM,yBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAY/B,IAAM,0BAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+BhC,IAAM,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsB3B,IAAM,sBAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkB5B,IAAM,sBAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkB5B,IAAM,yBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AC7M/B,IAAM,qBAA6B;AAAA,EACxC,MAAM;AAAA,EACN,aACE;AAAA,EACF,SAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS,CAAC,eAAe;AAAA,QAC3B;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS,CAAC,eAAe;AAAA,QAC3B;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS,CAAC,eAAe;AAAA,QAC3B;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS,CAAC,eAAe;AAAA,QAC3B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,UAAU,OAAO,SAAwB,aAAuC;AAC9E,UAAM,SAAS,QAAQ,WAAW,iBAAiB;AACnD,WAAO,OAAO,WAAW,YAAY,OAAO,WAAW,YAAY;AAAA,EACrE;AAAA,EAEA,SAAS,OACP,SACA,SACA,OACA,UACA,aACG;AACH,UAAM,SAAS,QAAQ,WAAW,iBAAiB;AAGnD,QAAI,CAAC,OAAO;AACV,cAAQ,MAAM,QAAQ,aAAa,SAAS,CAAC,CAAC;AAAA,IAChD;AAGA,UAAM,SAAS,eAAe;AAAA,MAC5B;AAAA,MACA,MAAM,QAAQ,QAAQ,QAAQ,QAAQ;AAAA,IACxC;AAGA,UAAM,YAAY,MAAM,QAAQ,SAAS,cAAuB;AAAA,MAC9D;AAAA,MACA,eAAe,CAAC;AAAA,IAClB,CAAU;AAEV,QAAI;AACJ,QAAI;AACF,eAAS,KAAK,MAAM,SAAS;AAAA,IAC/B,QAAQ;AACN,UAAI,UAAU;AACZ,cAAM,SAAS;AAAA,UACb,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,0CAA0C;AAAA,IAC3E;AAGA,QAAI,CAAC,OAAO,UAAU,CAAC,OAAO,gBAAgB,CAAC,OAAO,YAAY;AAChE,UAAI,UAAU;AACZ,cAAM,SAAS;AAAA,UACb,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,6BAA6B;AAAA,IAC9D;AACA,QAAI,CAAC,OAAO,cAAc,OAAO,WAAW,WAAW,GAAG;AACxD,UAAI,UAAU;AACZ,cAAM,SAAS;AAAA,UACb,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,yBAAyB;AAAA,IAC1D;AAGA,UAAM,SAAS,MAAM,QAAQ,QAAQ,QAAQ,WAAW,MAA4C;AAEpG,QAAI,CAAC,OAAO,IAAI;AACd,YAAM,SAAS,OAAO,OAAO,WAAW;AACxC,UAAI,UAAU;AACZ,cAAM,SAAS,EAAE,MAAM,wBAAwB,MAAM,GAAG,CAAC;AAAA,MAC3D;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,OAAO;AAAA,IACxC;AAEA,UAAM,YAAY,mBAAmB,OAAO,IAAK;AACjD,QAAI,UAAU;AACZ,YAAM,SAAS,EAAE,MAAM,UAAU,CAAC;AAAA,IACpC;AACA,WAAO,EAAE,SAAS,MAAM,MAAM,WAAW,MAAM,OAAO,KAAgC;AAAA,EACxF;AACF;;;AC3JO,IAAM,mBAA2B;AAAA,EACtC,MAAM;AAAA,EACN,aACE;AAAA,EACF,SAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS,CAAC,aAAa;AAAA,QACzB;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS,CAAC,aAAa;AAAA,QACzB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,UAAU,OAAO,SAAwB,aAAuC;AAC9E,UAAM,SAAS,QAAQ,WAAW,iBAAiB;AACnD,WAAO,OAAO,WAAW,YAAY,OAAO,WAAW,YAAY;AAAA,EACrE;AAAA,EAEA,SAAS,OACP,SACA,SACA,OACA,UACA,aACG;AACH,UAAM,SAAS,QAAQ,WAAW,iBAAiB;AAEnD,QAAI,CAAC,OAAO;AACV,cAAQ,MAAM,QAAQ,aAAa,SAAS,CAAC,CAAC;AAAA,IAChD;AAEA,UAAM,SAAS,cAAc;AAAA,MAC3B;AAAA,MACA,MAAM,QAAQ,QAAQ,QAAQ,QAAQ;AAAA,IACxC;AAEA,UAAM,YAAY,MAAM,QAAQ,SAAS,cAAuB;AAAA,MAC9D;AAAA,MACA,eAAe,CAAC;AAAA,IAClB,CAAU;AAEV,QAAI;AACJ,QAAI;AACF,eAAS,KAAK,MAAM,SAAS;AAAA,IAC/B,QAAQ;AACN,UAAI,UAAU;AACZ,cAAM,SAAS;AAAA,UACb,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,mCAAmC;AAAA,IACpE;AAEA,QAAI,CAAC,OAAO,QAAQ;AAClB,UAAI,UAAU;AACZ,cAAM,SAAS;AAAA,UACb,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,6BAA6B;AAAA,IAC9D;AAEA,UAAM,SAAS,MAAM,QAAQ,QAAQ,QAAQ,UAAU,MAA4C;AAEnG,QAAI,CAAC,OAAO,IAAI;AACd,YAAM,SAAS,OAAO,OAAO,WAAW;AACxC,UAAI,UAAU;AACZ,cAAM,SAAS,EAAE,MAAM,yBAAyB,MAAM,GAAG,CAAC;AAAA,MAC5D;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,OAAO;AAAA,IACxC;AAEA,UAAM,YAAY,kBAAkB,OAAO,IAAK;AAChD,QAAI,UAAU;AACZ,YAAM,SAAS,EAAE,MAAM,UAAU,CAAC;AAAA,IACpC;AACA,WAAO,EAAE,SAAS,MAAM,MAAM,WAAW,MAAM,OAAO,KAAgC;AAAA,EACxF;AACF;;;AC9GO,IAAM,wBAAgC;AAAA,EAC3C,MAAM;AAAA,EACN,aACE;AAAA,EACF,SAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS,CAAC,mBAAmB;AAAA,QAC/B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,UAAU,OAAO,SAAwB,aAAuC;AAC9E,UAAM,SAAS,QAAQ,WAAW,iBAAiB;AACnD,WAAO,OAAO,WAAW,YAAY,OAAO,WAAW,YAAY;AAAA,EACrE;AAAA,EAEA,SAAS,OACP,SACA,SACA,OACA,UACA,aACG;AACH,UAAM,SAAS,QAAQ,WAAW,iBAAiB;AAEnD,QAAI,CAAC,OAAO;AACV,cAAQ,MAAM,QAAQ,aAAa,SAAS,CAAC,CAAC;AAAA,IAChD;AAEA,UAAM,SAAS,mBAAmB;AAAA,MAChC;AAAA,MACA,MAAM,QAAQ,QAAQ,QAAQ,QAAQ;AAAA,IACxC;AAEA,UAAM,YAAY,MAAM,QAAQ,SAAS,cAAuB;AAAA,MAC9D;AAAA,MACA,eAAe,CAAC;AAAA,IAClB,CAAU;AAEV,QAAI;AACJ,QAAI;AACF,eAAS,KAAK,MAAM,SAAS;AAAA,IAC/B,QAAQ;AACN,UAAI,UAAU;AACZ,cAAM,SAAS;AAAA,UACb,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,mCAAmC;AAAA,IACpE;AAEA,QAAI,CAAC,OAAO,WAAW,OAAO,QAAQ,WAAW,GAAG;AAClD,UAAI,UAAU;AACZ,cAAM,SAAS;AAAA,UACb,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,sBAAsB;AAAA,IACvD;AAEA,QAAI,OAAO,QAAQ,SAAS,IAAI;AAC9B,aAAO,UAAU,OAAO,QAAQ,MAAM,GAAG,EAAE;AAAA,IAC7C;AAEA,UAAM,SAAS,MAAM,QAAQ,QAAQ,QAAQ,gBAAgB,MAA4C;AAEzG,QAAI,CAAC,OAAO,IAAI;AACd,YAAM,SAAS,OAAO,OAAO,WAAW;AACxC,UAAI,UAAU;AACZ,cAAM,SAAS,EAAE,MAAM,6BAA6B,MAAM,GAAG,CAAC;AAAA,MAChE;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,OAAO;AAAA,IACxC;AAEA,UAAM,YAAY,kBAAkB,OAAO,IAAK;AAChD,QAAI,UAAU;AACZ,YAAM,SAAS,EAAE,MAAM,UAAU,CAAC;AAAA,IACpC;AACA,WAAO,EAAE,SAAS,MAAM,MAAM,WAAW,MAAM,OAAO,KAAgC;AAAA,EACxF;AACF;;;AC3FO,IAAM,eAAuB;AAAA,EAClC,MAAM;AAAA,EACN,aACE;AAAA,EACF,SAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS,CAAC,aAAa;AAAA,QACzB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,UAAU,OAAO,UAAyB,aAAuC;AAE/E,WAAO;AAAA,EACT;AAAA,EAEA,SAAS,OACP,SACA,SACA,OACA,UACA,aACG;AAEH,QAAI,CAAC,OAAO;AACV,cAAQ,MAAM,QAAQ,aAAa,SAAS,CAAC,CAAC;AAAA,IAChD;AAGA,UAAM,SAAS,eAAe;AAAA,MAC5B;AAAA,MACA,MAAM,QAAQ,QAAQ,QAAQ,QAAQ;AAAA,IACxC;AAGA,UAAM,YAAY,MAAM,QAAQ,SAAS,cAAuB;AAAA,MAC9D;AAAA,MACA,eAAe,CAAC;AAAA,IAClB,CAAU;AAEV,QAAI;AACJ,QAAI;AACF,eAAS,KAAK,MAAM,SAAS;AAAA,IAC/B,QAAQ;AACN,UAAI,UAAU;AACZ,cAAM,SAAS;AAAA,UACb,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,sCAAsC;AAAA,IACvE;AAEA,QAAI,CAAC,OAAO,QAAQ;AAClB,UAAI,UAAU;AACZ,cAAM,SAAS,EAAE,MAAM,4CAA4C,CAAC;AAAA,MACtE;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,+BAA+B;AAAA,IAChE;AACA,QAAI,CAAC,OAAO,SAAS;AACnB,UAAI,UAAU;AACZ,cAAM,SAAS,EAAE,MAAM,0CAA0C,CAAC;AAAA,MACpE;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,uBAAuB;AAAA,IACxD;AAGA,UAAM,SAAS,MAAM,cAAc,QAAQ,aAAa,MAA4C;AAEpG,QAAI,CAAC,OAAO,IAAI;AACd,YAAM,SAAS,OAAO,OAAO,WAAW;AACxC,UAAI,UAAU;AACZ,cAAM,SAAS,EAAE,MAAM,wBAAwB,MAAM,GAAG,CAAC;AAAA,MAC3D;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,OAAO;AAAA,IACxC;AAEA,UAAM,OAAO,OAAO;AACpB,UAAM,OAAO;AAAA,MACX;AAAA,MACA;AAAA,MACA,QAAQ,KAAK,GAAG;AAAA,MAChB,SAAS,KAAK,IAAI;AAAA,MAClB,YAAY,KAAK,YAAY;AAAA,MAC7B,WAAW,KAAK,gBAAgB;AAAA,MAChC;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,KAAK,IAAI;AAEX,QAAI,UAAU;AACZ,YAAM,SAAS,EAAE,KAAK,CAAC;AAAA,IACzB;AACA,WAAO,EAAE,SAAS,MAAM,MAAM,KAAK;AAAA,EACrC;AACF;;;ACjHO,IAAM,uBAA+B;AAAA,EAC1C,MAAM;AAAA,EACN,aACE;AAAA,EACF,SAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS,CAAC,iBAAiB;AAAA,QAC7B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,UAAU,OAAO,SAAwB,aAAuC;AAC9E,UAAM,SAAS,QAAQ,WAAW,iBAAiB;AACnD,WAAO,OAAO,WAAW,YAAY,OAAO,WAAW,YAAY;AAAA,EACrE;AAAA,EAEA,SAAS,OACP,SACA,SACA,OACA,UACA,aACG;AACH,UAAM,SAAS,QAAQ,WAAW,iBAAiB;AAEnD,QAAI,CAAC,OAAO;AACV,cAAQ,MAAM,QAAQ,aAAa,SAAS,CAAC,CAAC;AAAA,IAChD;AAEA,UAAM,SAAS,uBAAuB;AAAA,MACpC;AAAA,MACA,MAAM,QAAQ,QAAQ,QAAQ,QAAQ;AAAA,IACxC;AAEA,UAAM,YAAY,MAAM,QAAQ,SAAS,cAAuB;AAAA,MAC9D;AAAA,MACA,eAAe,CAAC;AAAA,IAClB,CAAU;AAEV,QAAI;AACJ,QAAI;AACF,eAAS,KAAK,MAAM,SAAS;AAAA,IAC/B,QAAQ;AACN,UAAI,UAAU;AACZ,cAAM,SAAS;AAAA,UACb,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,sCAAsC;AAAA,IACvE;AAEA,QAAI,CAAC,OAAO,eAAe,CAAC,OAAO,WAAW;AAC5C,UAAI,UAAU;AACZ,cAAM,SAAS;AAAA,UACb,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,mCAAmC;AAAA,IACpE;AAEA,UAAM,SAAS,MAAM,QAAQ,QAAQ,QAAQ,cAAc,MAA4C;AAEvG,QAAI,CAAC,OAAO,IAAI;AACd,YAAM,SAAS,OAAO,OAAO,WAAW;AACxC,UAAI,UAAU;AACZ,cAAM,SAAS,EAAE,MAAM,6BAA6B,MAAM,GAAG,CAAC;AAAA,MAChE;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,OAAO;AAAA,IACxC;AAEA,UAAM,OAAO,OAAO;AACpB,UAAM,OAAO;AAAA,MACX;AAAA,MACA;AAAA,MACA,OAAO,KAAK,EAAE;AAAA,MACd,SAAS,KAAK,WAAW;AAAA,MACzB,YAAY,KAAK,OAAO;AAAA,MACxB;AAAA,MACA;AAAA,IACF,EAAE,KAAK,IAAI;AAEX,QAAI,UAAU;AACZ,YAAM,SAAS,EAAE,KAAK,CAAC;AAAA,IACzB;AACA,WAAO,EAAE,SAAS,MAAM,MAAM,KAAK;AAAA,EACrC;AACF;;;ACzFO,IAAM,wBAAgC;AAAA,EAC3C,MAAM;AAAA,EACN,aACE;AAAA,EACF,SAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS,CAAC,kBAAkB;AAAA,QAC9B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,UAAU,OAAO,SAAwB,aAAuC;AAC9E,UAAM,SAAS,QAAQ,WAAW,iBAAiB;AACnD,WAAO,OAAO,WAAW,YAAY,OAAO,WAAW,YAAY;AAAA,EACrE;AAAA,EAEA,SAAS,OACP,SACA,SACA,OACA,UACA,aACG;AACH,UAAM,SAAS,QAAQ,WAAW,iBAAiB;AAEnD,QAAI,CAAC,OAAO;AACV,cAAQ,MAAM,QAAQ,aAAa,SAAS,CAAC,CAAC;AAAA,IAChD;AAEA,UAAM,SAAS,wBAAwB;AAAA,MACrC;AAAA,MACA,MAAM,QAAQ,QAAQ,QAAQ,QAAQ;AAAA,IACxC;AAEA,UAAM,YAAY,MAAM,QAAQ,SAAS,cAAuB;AAAA,MAC9D;AAAA,MACA,eAAe,CAAC;AAAA,IAClB,CAAU;AAEV,QAAI;AACJ,QAAI;AACF,eAAS,KAAK,MAAM,SAAS;AAAA,IAC/B,QAAQ;AACN,UAAI,UAAU;AACZ,cAAM,SAAS;AAAA,UACb,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,sCAAsC;AAAA,IACvE;AAEA,QAAI,CAAC,OAAO,YAAY;AACtB,UAAI,UAAU;AACZ,cAAM,SAAS,EAAE,MAAM,0DAA0D,CAAC;AAAA,MACpF;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,0BAA0B;AAAA,IAC3D;AAEA,UAAM,EAAE,YAAY,GAAG,KAAK,IAAI;AAChC,UAAM,SAAS,MAAM,QAAQ,QAAQ,OAAO,cAAc,UAAU,WAAW,IAA0C;AAEzH,QAAI,CAAC,OAAO,IAAI;AACd,YAAM,SAAS,OAAO,OAAO,WAAW;AACxC,UAAI,UAAU;AACZ,cAAM,SAAS,EAAE,MAAM,+BAA+B,MAAM,GAAG,CAAC;AAAA,MAClE;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,OAAO;AAAA,IACxC;AAEA,UAAM,OAAO,OAAO;AACpB,UAAM,OAAO;AAAA,MACX,8BAA8B,UAAU;AAAA,MACxC;AAAA,MACA,iBAAiB,KAAK,WAAW,IAAI,KAAK,SAAS;AAAA,IACrD,EAAE,KAAK,IAAI;AAEX,QAAI,UAAU;AACZ,YAAM,SAAS,EAAE,KAAK,CAAC;AAAA,IACzB;AACA,WAAO,EAAE,SAAS,MAAM,MAAM,KAAK;AAAA,EACrC;AACF;;;AChHO,IAAM,mBAA2B;AAAA,EACtC,MAAM;AAAA,EACN,aACE;AAAA,EACF,SAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS,CAAC,aAAa;AAAA,QACzB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,UAAU,OAAO,SAAwB,aAAuC;AAC9E,UAAM,SAAS,QAAQ,WAAW,iBAAiB;AACnD,WAAO,OAAO,WAAW,YAAY,OAAO,WAAW,YAAY;AAAA,EACrE;AAAA,EAEA,SAAS,OACP,SACA,SACA,OACA,UACA,aACG;AACH,UAAM,SAAS,QAAQ,WAAW,iBAAiB;AAEnD,QAAI,CAAC,OAAO;AACV,cAAQ,MAAM,QAAQ,aAAa,SAAS,CAAC,CAAC;AAAA,IAChD;AAEA,UAAM,SAAS,mBAAmB;AAAA,MAChC;AAAA,MACA,MAAM,QAAQ,QAAQ,QAAQ,QAAQ;AAAA,IACxC;AAEA,UAAM,YAAY,MAAM,QAAQ,SAAS,cAAuB;AAAA,MAC9D;AAAA,MACA,eAAe,CAAC;AAAA,IAClB,CAAU;AAEV,QAAI;AACJ,QAAI;AACF,eAAS,KAAK,MAAM,SAAS;AAAA,IAC/B,QAAQ;AACN,UAAI,UAAU;AACZ,cAAM,SAAS;AAAA,UACb,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,6CAA6C;AAAA,IAC9E;AAEA,QAAI,CAAC,OAAO,cAAc,CAAC,OAAO,QAAQ;AACxC,UAAI,UAAU;AACZ,cAAM,SAAS,EAAE,MAAM,4DAA4D,CAAC;AAAA,MACtF;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,iCAAiC;AAAA,IAClE;AAEA,UAAM,EAAE,YAAY,GAAG,KAAK,IAAI;AAChC,UAAM,SAAS,MAAM,QAAQ,QAAQ,QAAQ,cAAc,UAAU,YAAY,IAA0C;AAE3H,QAAI,CAAC,OAAO,IAAI;AACd,YAAM,SAAS,OAAO,OAAO,WAAW;AACxC,UAAI,UAAU;AACZ,cAAM,SAAS,EAAE,MAAM,2BAA2B,MAAM,GAAG,CAAC;AAAA,MAC9D;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,OAAO;AAAA,IACxC;AAEA,UAAM,OAAO,OAAO;AACpB,UAAM,OAAO;AAAA,MACX,oBAAoB,UAAU;AAAA,MAC9B;AAAA,MACA,kBAAkB,KAAK,YAAY;AAAA,MACnC,kBAAkB,KAAK,YAAY;AAAA,MACnC,cAAc,KAAK,QAAQ;AAAA,MAC3B,UAAU,KAAK,SAAS;AAAA,IAC1B,EAAE,KAAK,IAAI;AAEX,QAAI,UAAU;AACZ,YAAM,SAAS,EAAE,KAAK,CAAC;AAAA,IACzB;AACA,WAAO,EAAE,SAAS,MAAM,MAAM,KAAK;AAAA,EACrC;AACF;;;ACrGO,IAAM,oBAA4B;AAAA,EACvC,MAAM;AAAA,EACN,aACE;AAAA,EACF,SAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS,CAAC,cAAc;AAAA,QAC1B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,UAAU,OAAO,SAAwB,aAAuC;AAC9E,UAAM,SAAS,QAAQ,WAAW,iBAAiB;AACnD,WAAO,OAAO,WAAW,YAAY,OAAO,WAAW,YAAY;AAAA,EACrE;AAAA,EAEA,SAAS,OACP,SACA,SACA,OACA,UACA,aACG;AACH,UAAM,SAAS,QAAQ,WAAW,iBAAiB;AAEnD,QAAI,CAAC,OAAO;AACV,cAAQ,MAAM,QAAQ,aAAa,SAAS,CAAC,CAAC;AAAA,IAChD;AAEA,UAAM,SAAS,oBAAoB;AAAA,MACjC;AAAA,MACA,MAAM,QAAQ,QAAQ,QAAQ,QAAQ;AAAA,IACxC;AAEA,UAAM,YAAY,MAAM,QAAQ,SAAS,cAAuB;AAAA,MAC9D;AAAA,MACA,eAAe,CAAC;AAAA,IAClB,CAAU;AAEV,QAAI;AACJ,QAAI;AACF,eAAS,KAAK,MAAM,SAAS;AAAA,IAC/B,QAAQ;AACN,UAAI,UAAU;AACZ,cAAM,SAAS;AAAA,UACb,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,0CAA0C;AAAA,IAC3E;AAEA,QAAI,CAAC,OAAO,YAAY;AACtB,UAAI,UAAU;AACZ,cAAM,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAAA,MAC5D;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,0BAA0B;AAAA,IAC3D;AACA,QAAI,CAAC,OAAO,UAAU,CAAC,OAAO,gBAAgB,CAAC,OAAO,YAAY;AAChE,UAAI,UAAU;AACZ,cAAM,SAAS,EAAE,MAAM,iEAAiE,CAAC;AAAA,MAC3F;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,6BAA6B;AAAA,IAC9D;AAEA,UAAM,SAAS,MAAM,QAAQ,QAAQ,QAAQ,iBAAiB,MAA4C;AAE1G,QAAI,CAAC,OAAO,IAAI;AACd,YAAM,SAAS,OAAO,OAAO,WAAW;AACxC,UAAI,UAAU;AACZ,cAAM,SAAS,EAAE,MAAM,8BAA8B,MAAM,GAAG,CAAC;AAAA,MACjE;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,OAAO;AAAA,IACxC;AAEA,UAAM,OAAO,OAAO;AACpB,UAAM,YAAY,KAAK;AACvB,UAAM,QAAS,WAAW,SAAS,CAAC;AACpC,UAAM,UAAW,WAAW,WAAW,CAAC;AACxC,UAAM,eAAe,KAAK;AAE1B,UAAM,QAAQ,CAAC,uBAAuB,EAAE;AACxC,QAAI,MAAM,SAAS,GAAG;AACpB,YAAM,KAAK,kBAAkB,MAAM,CAAC,CAAC,EAAE;AAAA,IACzC;AACA,QAAI,QAAQ,SAAS,GAAG;AACtB,YAAM,SAAS,QAAQ,CAAC,EAAE;AAC1B,UAAI,QAAQ,aAAa;AACvB,cAAM,KAAK,aAAa,OAAO,WAAW,GAAG;AAAA,MAC/C;AAAA,IACF;AACA,QAAI,cAAc;AAChB,YAAM,KAAK,sBAAsB,aAAa,IAAI,EAAE;AAAA,IACtD;AACA,QAAI,MAAM,WAAW,KAAK,CAAC,cAAc;AACvC,YAAM,KAAK,wDAAwD;AAAA,IACrE;AAEA,UAAM,OAAO,MAAM,KAAK,IAAI;AAC5B,QAAI,UAAU;AACZ,YAAM,SAAS,EAAE,KAAK,CAAC;AAAA,IACzB;AACA,WAAO,EAAE,SAAS,MAAM,MAAM,KAAK;AAAA,EACrC;AACF;;;ACzHO,IAAM,oBAA4B;AAAA,EACvC,MAAM;AAAA,EACN,aACE;AAAA,EACF,SAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS,CAAC,cAAc;AAAA,QAC1B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,UAAU,OAAO,SAAwB,aAAuC;AAC9E,UAAM,SAAS,QAAQ,WAAW,iBAAiB;AACnD,WAAO,OAAO,WAAW,YAAY,OAAO,WAAW,YAAY;AAAA,EACrE;AAAA,EAEA,SAAS,OACP,SACA,SACA,OACA,UACA,aACG;AACH,UAAM,SAAS,QAAQ,WAAW,iBAAiB;AAEnD,QAAI,CAAC,OAAO;AACV,cAAQ,MAAM,QAAQ,aAAa,SAAS,CAAC,CAAC;AAAA,IAChD;AAEA,UAAM,SAAS,oBAAoB;AAAA,MACjC;AAAA,MACA,MAAM,QAAQ,QAAQ,QAAQ,QAAQ;AAAA,IACxC;AAEA,UAAM,YAAY,MAAM,QAAQ,SAAS,cAAuB;AAAA,MAC9D;AAAA,MACA,eAAe,CAAC;AAAA,IAClB,CAAU;AAEV,QAAI;AACJ,QAAI;AACF,eAAS,KAAK,MAAM,SAAS;AAAA,IAC/B,QAAQ;AACN,UAAI,UAAU;AACZ,cAAM,SAAS;AAAA,UACb,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,0CAA0C;AAAA,IAC3E;AAEA,QAAI,CAAC,OAAO,YAAY;AACtB,UAAI,UAAU;AACZ,cAAM,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAAA,MAC5D;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,0BAA0B;AAAA,IAC3D;AACA,QAAI,CAAC,OAAO,UAAU,CAAC,OAAO,gBAAgB,CAAC,OAAO,YAAY;AAChE,UAAI,UAAU;AACZ,cAAM,SAAS,EAAE,MAAM,iEAAiE,CAAC;AAAA,MAC3F;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,6BAA6B;AAAA,IAC9D;AAEA,UAAM,SAAS,MAAM,QAAQ,QAAQ,QAAQ,iBAAiB,MAA4C;AAE1G,QAAI,CAAC,OAAO,IAAI;AACd,YAAM,SAAS,OAAO,OAAO,WAAW;AACxC,UAAI,UAAU;AACZ,cAAM,SAAS,EAAE,MAAM,8BAA8B,MAAM,GAAG,CAAC;AAAA,MACjE;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,OAAO;AAAA,IACxC;AAEA,UAAM,OAAO,OAAO;AACpB,UAAM,YAAY,KAAK;AACvB,UAAM,QAAS,WAAW,SAAS,CAAC;AACpC,UAAM,UAAW,WAAW,WAAW,CAAC;AACxC,UAAM,eAAe,KAAK;AAE1B,UAAM,QAAQ,CAAC,uBAAuB,EAAE;AACxC,QAAI,MAAM,SAAS,GAAG;AACpB,YAAM,KAAK,kBAAkB,MAAM,CAAC,CAAC,EAAE;AAAA,IACzC;AACA,QAAI,QAAQ,SAAS,GAAG;AACtB,YAAM,WAAW,QAAQ,CAAC;AAC1B,UAAI,SAAS,OAAO;AAClB,cAAM,KAAK,aAAa,SAAS,KAAK,EAAE;AAAA,MAC1C;AAAA,IACF;AACA,QAAI,cAAc;AAChB,YAAM,KAAK,sBAAsB,aAAa,IAAI,EAAE;AAAA,IACtD;AACA,QAAI,MAAM,WAAW,KAAK,CAAC,cAAc;AACvC,YAAM,KAAK,wDAAwD;AAAA,IACrE;AAEA,UAAM,OAAO,MAAM,KAAK,IAAI;AAC5B,QAAI,UAAU;AACZ,YAAM,SAAS,EAAE,KAAK,CAAC;AAAA,IACzB;AACA,WAAO,EAAE,SAAS,MAAM,MAAM,KAAK;AAAA,EACrC;AACF;;;ACzHO,IAAM,uBAA+B;AAAA,EAC1C,MAAM;AAAA,EACN,aACE;AAAA,EACF,SAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS,CAAC,iBAAiB;AAAA,QAC7B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,UAAU,OAAO,SAAwB,aAAuC;AAC9E,UAAM,SAAS,QAAQ,WAAW,iBAAiB;AACnD,WAAO,OAAO,WAAW,YAAY,OAAO,WAAW,YAAY;AAAA,EACrE;AAAA,EAEA,SAAS,OACP,SACA,SACA,OACA,UACA,aACG;AACH,UAAM,SAAS,QAAQ,WAAW,iBAAiB;AAEnD,QAAI,CAAC,OAAO;AACV,cAAQ,MAAM,QAAQ,aAAa,SAAS,CAAC,CAAC;AAAA,IAChD;AAEA,UAAM,SAAS,uBAAuB;AAAA,MACpC;AAAA,MACA,MAAM,QAAQ,QAAQ,QAAQ,QAAQ;AAAA,IACxC;AAEA,UAAM,YAAY,MAAM,QAAQ,SAAS,cAAuB;AAAA,MAC9D;AAAA,MACA,eAAe,CAAC;AAAA,IAClB,CAAU;AAEV,QAAI;AACJ,QAAI;AACF,eAAS,KAAK,MAAM,SAAS;AAAA,IAC/B,QAAQ;AACN,UAAI,UAAU;AACZ,cAAM,SAAS;AAAA,UACb,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,qCAAqC;AAAA,IACtE;AAEA,QAAI,CAAC,OAAO,QAAQ,CAAC,OAAO,QAAQ;AAClC,UAAI,UAAU;AACZ,cAAM,SAAS,EAAE,MAAM,sEAAsE,CAAC;AAAA,MAChG;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,0BAA0B;AAAA,IAC3D;AAEA,UAAM,SAAS,MAAM,QAAQ,QAAQ,QAAQ,oBAAoB,MAA4C;AAE7G,QAAI,CAAC,OAAO,IAAI;AACd,YAAM,SAAS,OAAO,OAAO,WAAW;AACxC,UAAI,UAAU;AACZ,cAAM,SAAS,EAAE,MAAM,gCAAgC,MAAM,GAAG,CAAC;AAAA,MACnE;AACA,aAAO,EAAE,SAAS,OAAO,MAAM,OAAO;AAAA,IACxC;AAEA,UAAM,OAAO,OAAO;AACpB,UAAM,YAAY,KAAK;AACvB,UAAM,OAAO,YACT;AAAA,MACE;AAAA,MACA;AAAA,MACA,SAAS,KAAK,IAAI;AAAA,MAClB,oBAAoB,KAAK,cAAc;AAAA,MACvC,UAAU,KAAK,SAAS;AAAA,MACxB,iBAAiB,KAAK,WAAW;AAAA,IACnC,EAAE,KAAK,IAAI,IACX;AAEJ,QAAI,UAAU;AACZ,YAAM,SAAS,EAAE,KAAK,CAAC;AAAA,IACzB;AACA,WAAO,EAAE,SAAS,MAAM,MAAM,KAAK;AAAA,EACrC;AACF;;;AClHA,IAAM,YAAY;AAClB,IAAM,eAAe;AACrB,IAAM,aAAa;AAGnB,SAAS,gBAAgB,WAA4B;AAEnD,SAAO,UAAU,UAAU,MAAM,UAAU,UAAU;AACvD;AAEO,IAAM,4BAAsC;AAAA,EACjD,MAAM;AAAA,EACN,aACE;AAAA,EACF,SAAS;AAAA,EAET,KAAK,OACH,SACA,YACG;AAEH,UAAM,SAAS,QAAQ,WAAW,iBAAiB;AACnD,QAAI,CAAC,UAAU,OAAO,WAAW,YAAY,CAAC,OAAO,WAAW,YAAY,GAAG;AAC7E,aAAO,EAAE,MAAM,GAAG;AAAA,IACpB;AAEA,UAAM,OAAO,QAAQ,QAAQ,QAAQ;AAErC,UAAM,aAAa,KAAK,MAAM,SAAS,KAAK,CAAC;AAC7C,UAAM,iBAAiB,KAAK,MAAM,YAAY,KAAK,CAAC,GAAG,OAAO,eAAe;AAC7E,UAAM,cAAc,KAAK,MAAM,UAAU,KAAK,CAAC;AAG/C,UAAM,SAAS,IAAI,IAAI,UAAU;AACjC,UAAM,UAAU,IAAI,IAAI,WAAW;AACnC,UAAM,gBAAgB,cAAc;AAAA,MAClC,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC;AAAA,IACzC;AAEA,UAAM,WAAqB,CAAC;AAC5B,QAAI,WAAW,SAAS,GAAG;AACzB,eAAS,KAAK,QAAQ,WAAW,KAAK,IAAI,CAAC,EAAE;AAAA,IAC/C;AACA,QAAI,cAAc,SAAS,GAAG;AAC5B,eAAS,KAAK,WAAW,cAAc,KAAK,IAAI,CAAC,EAAE;AAAA,IACrD;AACA,QAAI,YAAY,SAAS,GAAG;AAC1B,eAAS,KAAK,SAAS,YAAY,KAAK,IAAI,CAAC,EAAE;AAAA,IACjD;AAEA,QAAI,SAAS,WAAW,GAAG;AACzB,aAAO,EAAE,MAAM,GAAG;AAAA,IACpB;AAEA,WAAO;AAAA,MACL,MAAM,wEAAwE,SAAS,KAAK,IAAI,CAAC;AAAA,IACnG;AAAA,EACF;AACF;;;ACpDO,IAAM,gBAAwB;AAAA,EACnC,MAAM;AAAA,EACN,aACE;AAAA,EACF,SAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,WAAW,CAAC,yBAAyB;AACvC;AAEA,IAAO,gBAAQ;","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "eliza-plugin-insumer",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.1",
|
|
4
4
|
"description": "ElizaOS plugin for InsumerAPI — 10 actions covering the full autonomous agent lifecycle: buy API key, create merchant, configure token tiers, add credits, verify wallets, trust profiles, ACP/UCP commerce, confirm payments. ECDSA-signed results across 32 blockchains.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|