eliza-plugin-insumer 1.0.0 → 1.0.2
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/dist/index.js +44 -22
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -13,9 +13,10 @@ async function apiCall(apiKey, method, path, body) {
|
|
|
13
13
|
return res.json();
|
|
14
14
|
}
|
|
15
15
|
function formatAttestResult(data) {
|
|
16
|
-
const
|
|
17
|
-
const
|
|
18
|
-
const
|
|
16
|
+
const attestation = data.attestation;
|
|
17
|
+
const id = attestation?.id;
|
|
18
|
+
const pass = attestation?.pass;
|
|
19
|
+
const results = attestation?.results || [];
|
|
19
20
|
const lines = [
|
|
20
21
|
`Attestation ${id}: ${pass ? "PASS" : "FAIL"}`,
|
|
21
22
|
""
|
|
@@ -25,18 +26,22 @@ function formatAttestResult(data) {
|
|
|
25
26
|
const chain = r.chainId !== void 0 ? ` (chain ${r.chainId})` : "";
|
|
26
27
|
lines.push(` [${icon}] ${r.label || r.type}${chain}`);
|
|
27
28
|
}
|
|
28
|
-
const passCount =
|
|
29
|
-
const failCount =
|
|
29
|
+
const passCount = attestation?.passCount;
|
|
30
|
+
const failCount = attestation?.failCount;
|
|
30
31
|
lines.push("", `${passCount} passed, ${failCount} failed`);
|
|
31
|
-
if (
|
|
32
|
-
lines.push(`Expires: ${
|
|
32
|
+
if (attestation?.expiresAt) {
|
|
33
|
+
lines.push(`Expires: ${attestation.expiresAt}`);
|
|
34
|
+
}
|
|
35
|
+
if (data.jwt) {
|
|
36
|
+
lines.push("", `JWT: ${data.jwt}`);
|
|
33
37
|
}
|
|
34
38
|
return lines.join("\n");
|
|
35
39
|
}
|
|
36
40
|
function formatTrustResult(data) {
|
|
37
|
-
const
|
|
38
|
-
const
|
|
39
|
-
const
|
|
41
|
+
const trust = data.trust;
|
|
42
|
+
const id = trust?.id;
|
|
43
|
+
const dimensions = trust?.dimensions;
|
|
44
|
+
const summary = trust?.summary;
|
|
40
45
|
const lines = [`Trust Profile ${id}`, ""];
|
|
41
46
|
if (dimensions) {
|
|
42
47
|
for (const [name, dim] of Object.entries(dimensions)) {
|
|
@@ -52,24 +57,30 @@ function formatTrustResult(data) {
|
|
|
52
57
|
if (summary) {
|
|
53
58
|
lines.push(
|
|
54
59
|
"",
|
|
55
|
-
`Overall: ${summary.
|
|
60
|
+
`Overall: ${summary.totalPassed}/${summary.totalChecks} checks passed`
|
|
56
61
|
);
|
|
57
62
|
}
|
|
58
63
|
return lines.join("\n");
|
|
59
64
|
}
|
|
60
65
|
function formatBatchResult(data) {
|
|
61
|
-
const
|
|
62
|
-
const
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
+
const results = data.results || [];
|
|
67
|
+
const batchSummary = data.summary;
|
|
68
|
+
const lines = [`Batch Trust: ${results.length} profiles`, ""];
|
|
69
|
+
for (const result of results) {
|
|
70
|
+
if (result.error) {
|
|
71
|
+
const err = result.error;
|
|
72
|
+
lines.push(` ${err.wallet}: ERROR \u2014 ${err.message}`);
|
|
66
73
|
} else {
|
|
67
|
-
const
|
|
74
|
+
const trust = result.trust;
|
|
75
|
+
const summary = trust?.summary;
|
|
68
76
|
lines.push(
|
|
69
|
-
` ${
|
|
77
|
+
` ${trust?.wallet}: ${summary?.totalPassed ?? "?"}/${summary?.totalChecks ?? "?"} checks passed (${trust?.id})`
|
|
70
78
|
);
|
|
71
79
|
}
|
|
72
80
|
}
|
|
81
|
+
if (batchSummary) {
|
|
82
|
+
lines.push("", `${batchSummary.succeeded}/${batchSummary.requested} succeeded`);
|
|
83
|
+
}
|
|
73
84
|
return lines.join("\n");
|
|
74
85
|
}
|
|
75
86
|
|
|
@@ -83,20 +94,28 @@ Extract the following as a JSON object:
|
|
|
83
94
|
- wallet: EVM address (0x...) if present
|
|
84
95
|
- solanaWallet: Solana address (base58) if present
|
|
85
96
|
- xrplWallet: XRPL address (r...) if present
|
|
97
|
+
- format: "jwt" if the user asks for a JWT token, bearer token, Wallet Auth token, or JWT format. Omit otherwise.
|
|
86
98
|
- conditions: array of conditions to check, each with:
|
|
87
99
|
- type: "token_balance", "nft_ownership", "eas_attestation", or "farcaster_id"
|
|
88
100
|
- contractAddress: token/NFT contract address (use the reference table below)
|
|
89
101
|
- chainId: chain ID number or "solana" or "xrpl"
|
|
90
102
|
- threshold: minimum balance (for token_balance)
|
|
91
103
|
- decimals: token decimals (for token_balance)
|
|
104
|
+
- currency: XRPL trust line currency code (e.g. "RLUSD", "USDC"). Required for XRPL trust line tokens.
|
|
105
|
+
- taxon: XRPL NFT taxon number (optional, for nft_ownership on XRPL only)
|
|
92
106
|
- label: human-readable description
|
|
93
107
|
- template: compliance template name (for eas_attestation)
|
|
94
108
|
|
|
95
|
-
Chain ID reference:
|
|
109
|
+
Chain ID reference (32 supported chains):
|
|
96
110
|
Ethereum = 1, BNB Chain = 56, Base = 8453, Avalanche = 43114,
|
|
97
111
|
Polygon = 137, Arbitrum = 42161, Optimism = 10, Chiliz = 88888,
|
|
98
|
-
Soneium = 1868, Plume = 98866, World Chain = 480,
|
|
99
|
-
|
|
112
|
+
Soneium = 1868, Plume = 98866, World Chain = 480,
|
|
113
|
+
Sonic = 146, Gnosis = 100, Mantle = 5000, Scroll = 534352,
|
|
114
|
+
Linea = 59144, zkSync Era = 324, Blast = 81457, Taiko = 167000,
|
|
115
|
+
Ronin = 2020, Celo = 42220, Moonbeam = 1284, Moonriver = 1285,
|
|
116
|
+
Viction = 88, opBNB = 204, Unichain = 130, Ink = 57073,
|
|
117
|
+
Sei = 1329, Berachain = 80094, ApeChain = 33139,
|
|
118
|
+
Solana = "solana", XRPL = "xrpl"
|
|
100
119
|
|
|
101
120
|
Well-known contracts (Ethereum mainnet unless noted):
|
|
102
121
|
USDC = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 (6 decimals)
|
|
@@ -109,12 +128,15 @@ Well-known contracts (Ethereum mainnet unless noted):
|
|
|
109
128
|
USDC on Base = 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 (6 decimals)
|
|
110
129
|
USDC on Polygon = 0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359 (6 decimals)
|
|
111
130
|
USDC on Arbitrum = 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 (6 decimals)
|
|
131
|
+
USDC on Optimism = 0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85 (6 decimals)
|
|
132
|
+
USDC on BNB Chain = 0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d (18 decimals)
|
|
133
|
+
USDC on Avalanche = 0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E (6 decimals)
|
|
112
134
|
USDC on Solana = EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v (6 decimals)
|
|
113
135
|
|
|
114
136
|
XRPL tokens (use chainId "xrpl"):
|
|
115
137
|
XRP native = contractAddress "native"
|
|
116
138
|
RLUSD = contractAddress "rMxCKbEDwqr76QuheSUMdEGf4B9xJ8m5De", currency "RLUSD"
|
|
117
|
-
USDC on XRPL = contractAddress "
|
|
139
|
+
USDC on XRPL = contractAddress "rGm7WCVp9gb4jZHWTEtGUr4dd74z2XuWhE", currency "USDC"
|
|
118
140
|
|
|
119
141
|
Compliance templates (for eas_attestation, no contractAddress needed):
|
|
120
142
|
"coinbase_verified_account" \u2014 KYC on Base
|
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/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 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\n// --- Response formatters ---\n\ninterface AttestResult {\n condition: number;\n label?: string;\n type: string;\n chainId?: number | string;\n met: boolean;\n}\n\ninterface TrustDimension {\n checks: Array<{ label: string; met: boolean }>;\n passCount: number;\n failCount: number;\n total: number;\n}\n\nexport function formatAttestResult(data: Record<string, unknown>): string {\n const id = data.id as string;\n const pass = data.pass as boolean;\n const results = (data.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 lines.push(` [${icon}] ${r.label || r.type}${chain}`);\n }\n const passCount = data.passCount as number;\n const failCount = data.failCount as number;\n lines.push(\"\", `${passCount} passed, ${failCount} failed`);\n if (data.expiresAt) {\n lines.push(`Expires: ${data.expiresAt}`);\n }\n return lines.join(\"\\n\");\n}\n\nexport function formatTrustResult(data: Record<string, unknown>): string {\n const id = data.id as string;\n const dimensions = data.dimensions as Record<string, TrustDimension> | undefined;\n const summary = data.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.passCount}/${summary.totalChecks} checks passed`\n );\n }\n return lines.join(\"\\n\");\n}\n\nexport function formatBatchResult(data: Record<string, unknown>): string {\n const profiles = (data.profiles || []) as Array<Record<string, unknown>>;\n const lines: string[] = [`Batch Trust: ${profiles.length} profiles`, \"\"];\n for (const profile of profiles) {\n if (profile.error) {\n lines.push(` ${profile.wallet}: ERROR — ${profile.error}`);\n } else {\n const summary = profile.summary as Record<string, unknown> | undefined;\n lines.push(\n ` ${profile.wallet}: ${summary?.passCount ?? \"?\"}/${summary?.totalChecks ?? \"?\"} checks passed (${profile.id})`\n );\n }\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- 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 - label: human-readable description\n - template: compliance template name (for eas_attestation)\n\nChain ID reference:\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, Solana = \"solana\",\n 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 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 \"rcEGREd8NmkKRE8GE424sksyt1tJVFZwu\", currency \"USD\"\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","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 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 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 { walletCredentialsProvider } from \"./providers/credentials.js\";\n\nexport const insumerPlugin: Plugin = {\n name: \"insumer\",\n description:\n \"Privacy-preserving on-chain verification across 32 blockchains. Verify token balances, NFT ownership, EAS attestations, and wallet trust profiles — all with ECDSA-signed results that never expose actual balances.\",\n actions: [verifyWalletAction, checkTrustAction, checkTrustBatchAction],\n providers: [walletCredentialsProvider],\n};\n\nexport default insumerPlugin;\n"],"mappings":";AAAA,IAAM,WAAW;AAoDjB,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;AAmBO,SAAS,mBAAmB,MAAuC;AACxE,QAAM,KAAK,KAAK;AAChB,QAAM,OAAO,KAAK;AAClB,QAAM,UAAW,KAAK,WAAW,CAAC;AAClC,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,UAAM,KAAK,MAAM,IAAI,KAAK,EAAE,SAAS,EAAE,IAAI,GAAG,KAAK,EAAE;AAAA,EACvD;AACA,QAAM,YAAY,KAAK;AACvB,QAAM,YAAY,KAAK;AACvB,QAAM,KAAK,IAAI,GAAG,SAAS,YAAY,SAAS,SAAS;AACzD,MAAI,KAAK,WAAW;AAClB,UAAM,KAAK,YAAY,KAAK,SAAS,EAAE;AAAA,EACzC;AACA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEO,SAAS,kBAAkB,MAAuC;AACvE,QAAM,KAAK,KAAK;AAChB,QAAM,aAAa,KAAK;AACxB,QAAM,UAAU,KAAK;AACrB,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,SAAS,IAAI,QAAQ,WAAW;AAAA,IACtD;AAAA,EACF;AACA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEO,SAAS,kBAAkB,MAAuC;AACvE,QAAM,WAAY,KAAK,YAAY,CAAC;AACpC,QAAM,QAAkB,CAAC,gBAAgB,SAAS,MAAM,aAAa,EAAE;AACvE,aAAW,WAAW,UAAU;AAC9B,QAAI,QAAQ,OAAO;AACjB,YAAM,KAAK,KAAK,QAAQ,MAAM,kBAAa,QAAQ,KAAK,EAAE;AAAA,IAC5D,OAAO;AACL,YAAM,UAAU,QAAQ;AACxB,YAAM;AAAA,QACJ,KAAK,QAAQ,MAAM,KAAK,SAAS,aAAa,GAAG,IAAI,SAAS,eAAe,GAAG,mBAAmB,QAAQ,EAAE;AAAA,MAC/G;AAAA,IACF;AAAA,EACF;AACA,SAAO,MAAM,KAAK,IAAI;AACxB;;;ACrJO,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;AAuDvB,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;;;ACzD3B,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,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;;;AC5IO,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;;;ACtGA,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;;;AC3DO,IAAM,gBAAwB;AAAA,EACnC,MAAM;AAAA,EACN,aACE;AAAA,EACF,SAAS,CAAC,oBAAoB,kBAAkB,qBAAqB;AAAA,EACrE,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/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\" | \"json\";\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\n// --- Response formatters ---\n\ninterface AttestResult {\n condition: number;\n label?: string;\n type: string;\n chainId?: number | string;\n met: 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 lines.push(` [${icon}] ${r.label || r.type}${chain}`);\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","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 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 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 { walletCredentialsProvider } from \"./providers/credentials.js\";\n\nexport const insumerPlugin: Plugin = {\n name: \"insumer\",\n description:\n \"Privacy-preserving on-chain verification across 32 blockchains. Verify token balances, NFT ownership, EAS attestations, and wallet trust profiles — all with ECDSA-signed results that never expose actual balances.\",\n actions: [verifyWalletAction, checkTrustAction, checkTrustBatchAction],\n providers: [walletCredentialsProvider],\n};\n\nexport default insumerPlugin;\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED