@insumermodel/plugin-eliza 2.0.0 → 2.1.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 CHANGED
@@ -1,20 +1,20 @@
1
- # eliza-plugin-insumer
1
+ # @insumermodel/plugin-eliza
2
2
 
3
- ElizaOS plugin for [InsumerAPI](https://insumermodel.com) — 10 actions for condition-based access across 33 blockchains.
3
+ ElizaOS plugin for [InsumerAPI](https://insumermodel.com) — 10 actions for condition-based access across 37 blockchains.
4
4
 
5
5
  An agent can go from zero to running a condition-based commerce operation with no human involvement: provision an API key with USDC, create a merchant, configure which tokens gate access, add credits, verify wallets, run ACP/UCP commerce flows, and confirm payments — all autonomously.
6
6
 
7
7
  ## Install
8
8
 
9
9
  ```bash
10
- npm install eliza-plugin-insumer
10
+ npm install @insumermodel/plugin-eliza
11
11
  ```
12
12
 
13
13
  ## Configure
14
14
 
15
- ### 1. Get a free API key (instant, no credit card)
15
+ ### 1. Get a key no signup, no dashboard, no password
16
16
 
17
- Generate one from your terminal no browser needed:
17
+ Two paths. Both return an `insr_live_...` key instantly with 100 reads/day and 10 verification credits. One free key per email.
18
18
 
19
19
  ```bash
20
20
  curl -s -X POST https://api.insumermodel.com/v1/keys/create \
@@ -22,15 +22,13 @@ curl -s -X POST https://api.insumermodel.com/v1/keys/create \
22
22
  -d '{"email": "you@example.com", "appName": "ElizaOS Agent", "tier": "free"}' | jq .
23
23
  ```
24
24
 
25
- Returns an `insr_live_...` key with 100 reads/day and 10 verification credits. One free key per email.
26
-
27
- Or visit [insumermodel.com/developers](https://insumermodel.com/developers/) to get one.
25
+ Or enter your email on [insumermodel.com](https://insumermodel.com/?utm_source=npm-insumermodel-plugin-eliza) the key appears inline. Already have a key? Manage it at [insumermodel.com/developers/account/](https://insumermodel.com/developers/account/?utm_source=npm-insumermodel-plugin-eliza).
28
26
 
29
27
  ### 2. Add to your character file
30
28
 
31
29
  ```json
32
30
  {
33
- "plugins": ["eliza-plugin-insumer"],
31
+ "plugins": ["@insumermodel/plugin-eliza"],
34
32
  "settings": {
35
33
  "secrets": {
36
34
  "INSUMER_API_KEY": "insr_live_your_key_here"
@@ -55,7 +53,7 @@ CREATE_MERCHANT → Create merchant profile (100 free credits)
55
53
  CONFIGURE_TOKENS → Set which tokens gate discounts + tier thresholds
56
54
  ADD_CREDITS → Top up merchant credits with USDC
57
55
  VERIFY_WALLET → Verify token/NFT/attestation conditions (1-10 per call)
58
- CHECK_TRUST → Generate 36-check wallet trust profile
56
+ CHECK_TRUST → Generate wallet trust profile (up to 49 checks across 27 chains)
59
57
  CHECK_TRUST_BATCH → Profile up to 10 wallets in one call
60
58
  ACP_DISCOUNT → Check discount in OpenAI/Stripe ACP format
61
59
  UCP_DISCOUNT → Check discount in Google UCP format
@@ -95,7 +93,7 @@ Credits: 100 (free starter credits)
95
93
 
96
94
  ### CONFIGURE_TOKENS
97
95
 
98
- Configure which tokens gate access to merchant discounts. Up to 8 tokens with 1-4 discount tiers each. Supports all 30 EVM chains plus Solana and XRPL.
96
+ Configure which tokens gate access to merchant discounts. Up to 8 tokens with 1-4 discount tiers each. Supports EVM chains (Ethereum, Base, Polygon, Arbitrum, Optimism, and more) plus Solana and XRPL.
99
97
 
100
98
  ```
101
99
  User: "Set up USDC gating for acme-coffee: Bronze at 100 (5%), Silver at 1000 (10%), Gold at 10000 (15%) on Ethereum."
@@ -122,7 +120,7 @@ Chain: Base
122
120
 
123
121
  ### VERIFY_WALLET
124
122
 
125
- Verify 1-10 on-chain conditions (token balances, NFT ownership, EAS attestations, Farcaster identity) across 33 chains. Returns ECDSA-signed boolean results.
123
+ Verify 1-10 on-chain conditions (token balances, NFT ownership, EAS attestations, Farcaster identity) across 37 chains. Returns ECDSA-signed boolean results.
126
124
 
127
125
  ```
128
126
  User: "Check if 0xd8dA... holds at least 100 UNI"
@@ -135,7 +133,7 @@ Attestation ATST-A7C3E1B2D4F56789: PASS
135
133
 
136
134
  ### CHECK_TRUST
137
135
 
138
- Generate a structured wallet trust profile with 36 base checks (up to 40 with Solana, XRPL, and Bitcoin) across stablecoins, governance tokens, NFTs, and staking. Optional cross-chain with Solana and XRPL wallets.
136
+ Generate a structured wallet trust profile with up to 49 checks across 27 chains (stablecoins, governance tokens, NFTs, staking, institutional issuances). Optional cross-chain with Solana, XRPL, Bitcoin, Tron, Stellar, and Sui wallets.
139
137
 
140
138
  ```
141
139
  User: "What's the trust profile for 0xd8dA...?"
@@ -146,7 +144,7 @@ Trust Profile TRST-B2K4F
146
144
  governance: 2/4 passed
147
145
  nfts: 1/3 passed
148
146
  staking: 2/3 passed
149
- Overall: 22/36 checks passed
147
+ Overall: 22/38 checks passed
150
148
  ```
151
149
 
152
150
  ### CHECK_TRUST_BATCH
@@ -158,9 +156,9 @@ User: "Check trust for these wallets: 0xd8dA..., 0xAb58..., 0x1234..."
158
156
  Agent: [calls CHECK_TRUST_BATCH → POST /v1/trust/batch]
159
157
 
160
158
  Batch Trust: 3 profiles
161
- 0xd8dA...: 22/36 checks passed (TRST-B2K4F)
162
- 0xAb58...: 14/36 checks passed (TRST-C3L5G)
163
- 0x1234...: 6/36 checks passed (TRST-D4M6H)
159
+ 0xd8dA...: 22/38 checks passed (TRST-B2K4F)
160
+ 0xAb58...: 14/38 checks passed (TRST-C3L5G)
161
+ 0x1234...: 6/38 checks passed (TRST-D4M6H)
164
162
  ```
165
163
 
166
164
  ### ACP_DISCOUNT
@@ -209,7 +207,7 @@ The VERIFY_WALLET action supports `format: "jwt"` when the user requests a JWT o
209
207
 
210
208
  ## Provider: WALLET_CREDENTIALS
211
209
 
212
- Automatically detects wallet addresses (EVM, Solana, XRPL) in conversation and signals that verification actions are available. Dynamic — only activates when wallet patterns are found.
210
+ Automatically detects wallet addresses (EVM, Solana, XRPL, Bitcoin, Tron, Stellar, Sui) in conversation and signals that verification actions are available. Dynamic — only activates when wallet patterns are found.
213
211
 
214
212
  ## Handling `rpc_failure` Errors
215
213
 
@@ -217,9 +215,9 @@ If the API cannot reach one or more data sources after retries, actions return `
217
215
 
218
216
  **Important:** `rpc_failure` is NOT a verification failure. Do not treat it as `pass: false`. It means the data source was temporarily unavailable and the API refused to sign an unverified result.
219
217
 
220
- ## Supported Chains (33)
218
+ ## Supported Chains (37)
221
219
 
222
- 30 EVM chains + Solana + XRP Ledger + Bitcoin. Includes Ethereum, Base, Polygon, Arbitrum, Optimism, BNB Chain, Avalanche, and 23 more. [Full list →](https://insumermodel.com/developers/api-reference/)
220
+ 31 EVM chains + Solana + XRP Ledger + Bitcoin + Tron + Stellar + Sui. Includes Ethereum, Base, Polygon, Arbitrum, Optimism, BNB Chain, Avalanche, XDC, and 23 more EVM chains. [Full list →](https://insumermodel.com/developers/api-reference/)
223
221
 
224
222
  ## Pricing
225
223
 
@@ -232,11 +230,12 @@ If the API cannot reach one or more data sources after retries, actions return `
232
230
  - **Solana (USDC/USDT):** `6a1mLjefhvSJX1sEX8PTnionbE9DqoYjU6F6bNkT4Ydr`
233
231
  - **Bitcoin:** `bc1qg7qnerdhlmdn899zemtez5tcx2a2snc0dt9dt0`
234
232
 
235
- **Supported payment chains:** Ethereum, Base, Polygon, Arbitrum, Optimism, BNB Chain, Avalanche, Solana, Bitcoin. Tokens sent on unsupported chains cannot be recovered. All purchases are final and non-refundable. [Full pricing →](https://insumermodel.com/pricing/)
233
+ **Supported payment chains:** Ethereum, Base, Polygon, Arbitrum, Optimism, BNB Chain, Avalanche, Solana, Bitcoin, Tron (USDT-TRC20). Tokens sent on unsupported chains cannot be recovered. All purchases are final and non-refundable. [Full pricing →](https://insumermodel.com/pricing/)
236
234
 
237
235
  ## Also Available As
238
236
 
239
- - **MCP Server:** `npx -y mcp-server-insumer` ([npm](https://www.npmjs.com/package/mcp-server-insumer))
237
+ - **Claude Code Skill:** `smithery skill add douglasborthwick/insumer-skill` ([Smithery](https://smithery.ai/skills/douglasborthwick/insumer-skill) · [GitHub](https://github.com/douglasborthwick-crypto/insumer-skill)) — for *writing* wallet auth into your own projects from inside Claude Code
238
+ - **MCP Server:** `npx -y mcp-server-insumer` ([npm](https://www.npmjs.com/package/mcp-server-insumer)) — for runtime agent access to the API
240
239
  - **LangChain:** `pip install langchain-insumer` ([PyPI](https://pypi.org/project/langchain-insumer/))
241
240
  - **OpenAI GPT:** [GPT Store](https://chatgpt.com/g/g-67bf98eb32dc8191a4051de54f7e2c6e-insumer-api-assistant)
242
241
 
package/dist/index.js CHANGED
@@ -111,19 +111,23 @@ Extract the following as a JSON object:
111
111
  - solanaWallet: Solana address (base58) if present
112
112
  - xrplWallet: XRPL address (r...) if present
113
113
  - bitcoinWallet: Bitcoin address (1..., 3..., bc1q..., or bc1p...) if present
114
+ - tronWallet: Tron address (T-prefixed base58, 34 chars) if present
115
+ - stellarWallet: Stellar address (G-prefixed, 56 chars) if present
116
+ - suiWallet: Sui address (0x + 64 hex chars) if present
114
117
  - format: "jwt" if the user asks for a JWT token, bearer token, Wallet Auth token, or JWT format. Omit otherwise.
115
118
  - conditions: array of conditions to check, each with:
116
119
  - type: "token_balance", "nft_ownership", "eas_attestation", or "farcaster_id"
117
120
  - contractAddress: token/NFT contract address (use the reference table below)
118
- - chainId: chain ID number or "solana" or "xrpl"
121
+ - chainId: chain ID number or "solana", "xrpl", "bitcoin", "tron", "stellar", or "sui"
119
122
  - threshold: minimum balance (for token_balance)
120
123
  - decimals: token decimals (for token_balance)
121
124
  - currency: XRPL trust line currency code (e.g. "RLUSD", "USDC"). Required for XRPL trust line tokens.
125
+ - assetCode: Stellar asset code (e.g. "USDC", "BENJI"). Required for Stellar trust line tokens.
122
126
  - taxon: XRPL NFT taxon number (optional, for nft_ownership on XRPL only)
123
127
  - label: human-readable description
124
128
  - template: compliance template name (for eas_attestation)
125
129
 
126
- Chain ID reference (33 supported chains):
130
+ Chain ID reference (37 supported chains):
127
131
  Ethereum = 1, BNB Chain = 56, Base = 8453, Avalanche = 43114,
128
132
  Polygon = 137, Arbitrum = 42161, Optimism = 10, Chiliz = 88888,
129
133
  Soneium = 1868, Plume = 98866, World Chain = 480,
@@ -131,8 +135,9 @@ Chain ID reference (33 supported chains):
131
135
  Linea = 59144, zkSync Era = 324, Blast = 81457, Taiko = 167000,
132
136
  Ronin = 2020, Celo = 42220, Moonbeam = 1284, Moonriver = 1285,
133
137
  Viction = 88, opBNB = 204, Unichain = 130, Ink = 57073,
134
- Sei = 1329, Berachain = 80094, ApeChain = 33139,
135
- Solana = "solana", XRPL = "xrpl", Bitcoin = "bitcoin"
138
+ Sei = 1329, Berachain = 80094, ApeChain = 33139, XDC = 50,
139
+ Solana = "solana", XRPL = "xrpl", Bitcoin = "bitcoin",
140
+ Tron = "tron", Stellar = "stellar", Sui = "sui"
136
141
 
137
142
  Well-known contracts (Ethereum mainnet unless noted):
138
143
  USDC = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 (6 decimals)
@@ -155,6 +160,19 @@ XRPL tokens (use chainId "xrpl"):
155
160
  RLUSD = contractAddress "rMxCKbEDwqr76QuheSUMdEGf4B9xJ8m5De", currency "RLUSD"
156
161
  USDC on XRPL = contractAddress "rGm7WCVp9gb4jZHWTEtGUr4dd74z2XuWhE", currency "USDC"
157
162
 
163
+ Tron tokens (use chainId "tron"):
164
+ TRX native = contractAddress "native"
165
+ USDT-TRC20 = contractAddress "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t", decimals 6
166
+
167
+ Stellar tokens (use chainId "stellar", assetCode required for trustlines):
168
+ XLM native = contractAddress "native"
169
+ USDC on Stellar = contractAddress "GA5ZSEJYB37JRC5AVCIA5MOP4RHTM335X2KGX3IHOJAPP5RE34K4KZVN", assetCode "USDC"
170
+ BENJI (Franklin) = contractAddress "GBJW74JRHIIIYC3X3J5VKLR2CR4UJHKO76V5J5SAYTUFAUE7PJBKCT5R", assetCode "BENJI"
171
+
172
+ Sui tokens (use chainId "sui"):
173
+ SUI native = contractAddress "native"
174
+ USDC on Sui = contractAddress "0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC", decimals 6
175
+
158
176
  Compliance templates (for eas_attestation, no contractAddress needed):
159
177
  "coinbase_verified_account" \u2014 KYC on Base
160
178
  "coinbase_verified_country" \u2014 country verification on Base
@@ -177,8 +195,11 @@ Extract the following as a JSON object:
177
195
  - solanaWallet: Solana address (base58) if mentioned
178
196
  - xrplWallet: XRPL address (r...) if mentioned
179
197
  - bitcoinWallet: Bitcoin address (1..., 3..., bc1q..., or bc1p...) if mentioned
198
+ - tronWallet: Tron address (T-prefixed base58, 34 chars) if mentioned
199
+ - stellarWallet: Stellar address (G-prefixed, 56 chars) if mentioned
200
+ - suiWallet: Sui address (0x + 64 hex chars) if mentioned
180
201
 
181
- The trust profile automatically checks 17+ dimensions (stablecoins, governance tokens, NFTs, staking) for the EVM wallet. Adding solanaWallet, xrplWallet, or bitcoinWallet extends the profile with additional checks.
202
+ The trust profile runs up to 49 checks across 27 chains. The 38 base checks (stablecoins, governance tokens, NFTs, staking) all read the EVM wallet. Adding solanaWallet, xrplWallet, bitcoinWallet, tronWallet, stellarWallet, or suiWallet extends the profile with additional checks on those chains.
182
203
 
183
204
  Respond with ONLY the JSON object, no explanation.`;
184
205
  var batchTrustTemplate = `You are extracting multiple wallet addresses for batch trust profiling from the conversation.
@@ -192,6 +213,9 @@ Extract the following as a JSON object:
192
213
  - solanaWallet: Solana address (base58) if mentioned for this wallet
193
214
  - xrplWallet: XRPL address (r...) if mentioned for this wallet
194
215
  - bitcoinWallet: Bitcoin address (1..., 3..., bc1q..., or bc1p...) if mentioned for this wallet
216
+ - tronWallet: Tron address (T-prefixed base58) if mentioned for this wallet
217
+ - stellarWallet: Stellar address (G-prefixed) if mentioned for this wallet
218
+ - suiWallet: Sui address (0x + 64 hex chars) if mentioned for this wallet
195
219
 
196
220
  Maximum 10 wallets. Each wallet gets an independent trust profile.
197
221
 
@@ -203,19 +227,20 @@ Recent messages:
203
227
 
204
228
  Extract the following as a JSON object:
205
229
  - txHash: the USDC/USDT/BTC transaction hash
206
- - chainId: chain where crypto was sent (number, "solana", or "bitcoin")
230
+ - chainId: chain where crypto was sent (number, "solana", "bitcoin", or "tron")
207
231
  - amount: amount sent (number, minimum 5 USD equivalent)
208
232
  - appName: name for the API key
209
233
 
210
234
  Chain IDs for payments:
211
235
  Ethereum = 1, Base = 8453, Polygon = 137, Arbitrum = 42161,
212
236
  Optimism = 10, BNB Chain = 56, Avalanche = 43114, Solana = "solana",
213
- Bitcoin = "bitcoin"
237
+ Bitcoin = "bitcoin", Tron = "tron"
214
238
 
215
239
  Platform wallets:
216
240
  EVM: 0xAd982CB19aCCa2923Df8F687C0614a7700255a23
217
241
  Solana: 6a1mLjefhvSJX1sEX8PTnionbE9DqoYjU6F6bNkT4Ydr
218
242
  Bitcoin: bc1qg7qnerdhlmdn899zemtez5tcx2a2snc0dt9dt0
243
+ Tron: TC5yvwkAMakkXtUxYiu2Yn1xbBcwYuD6cn
219
244
 
220
245
  Respond with ONLY the JSON object, no explanation.`;
221
246
  var createMerchantTemplate = `You are extracting merchant creation parameters from the conversation.
@@ -248,15 +273,15 @@ Extract the following as a JSON object:
248
273
  - discount: discount percentage (1-50)
249
274
  - partnerTokens: array of additional token configs (same structure as ownToken), default []
250
275
 
251
- Onboarding chain IDs (26 EVM chains + Solana + XRPL supported for token config):
276
+ Onboarding chain IDs (EVM chains + Solana + XRPL supported for token config):
252
277
  Ethereum = 1, BNB Chain = 56, Base = 8453, Avalanche = 43114,
253
278
  Polygon = 137, Arbitrum = 42161, Optimism = 10, Chiliz = 88888,
254
279
  Soneium = 1868, Plume = 98866, World Chain = 480,
255
280
  Sonic = 146, Gnosis = 100, Mantle = 5000, Scroll = 534352,
256
281
  Linea = 59144, zkSync Era = 324, Blast = 81457, Celo = 42220,
257
282
  Moonbeam = 1284, opBNB = 204, Unichain = 130, Ink = 57073,
258
- Sei = 1329, Berachain = 80094, ApeChain = 33139,
259
- Solana = "solana", XRPL = "xrpl", Bitcoin = "bitcoin"
283
+ Sei = 1329, Berachain = 80094, ApeChain = 33139, XDC = 50,
284
+ Solana = "solana", XRPL = "xrpl"
260
285
 
261
286
  Well-known contracts:
262
287
  USDC on Ethereum = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 (6 decimals)
@@ -271,20 +296,21 @@ Recent messages:
271
296
 
272
297
  Extract the following as a JSON object:
273
298
  - merchantId: the merchant ID to add credits to (required)
274
- - txHash: the USDC transaction hash (required)
275
- - chainId: chain where USDC was sent (number or "solana")
276
- - amount: USDC amount sent (number, minimum 5)
299
+ - txHash: the USDC/USDT/BTC transaction hash (required)
300
+ - chainId: chain where crypto was sent (number, "solana", "bitcoin", or "tron")
301
+ - amount: amount sent (number, minimum 5 USD equivalent)
277
302
  - updateWallet: true only if the user explicitly wants to change their registered wallet (default false)
278
303
 
279
304
  Chain IDs for payments:
280
305
  Ethereum = 1, Base = 8453, Polygon = 137, Arbitrum = 42161,
281
306
  Optimism = 10, BNB Chain = 56, Avalanche = 43114, Solana = "solana",
282
- Bitcoin = "bitcoin"
307
+ Bitcoin = "bitcoin", Tron = "tron"
283
308
 
284
309
  Platform wallets:
285
310
  EVM: 0xAd982CB19aCCa2923Df8F687C0614a7700255a23
286
311
  Solana: 6a1mLjefhvSJX1sEX8PTnionbE9DqoYjU6F6bNkT4Ydr
287
312
  Bitcoin: bc1qg7qnerdhlmdn899zemtez5tcx2a2snc0dt9dt0
313
+ Tron: TC5yvwkAMakkXtUxYiu2Yn1xbBcwYuD6cn
288
314
 
289
315
  Respond with ONLY the JSON object, no explanation.`;
290
316
  var acpDiscountTemplate = `You are extracting ACP discount check parameters from the conversation.
@@ -297,6 +323,10 @@ Extract the following as a JSON object:
297
323
  - wallet: EVM address (0x...) if present
298
324
  - solanaWallet: Solana address (base58) if present
299
325
  - xrplWallet: XRPL address (r...) if present
326
+ - bitcoinWallet: Bitcoin address (1..., 3..., bc1q..., or bc1p...) if present
327
+ - tronWallet: Tron address (T-prefixed base58) if present
328
+ - stellarWallet: Stellar address (G-prefixed) if present
329
+ - suiWallet: Sui address (0x + 64 hex chars) if present
300
330
  - items: optional array of line items, each with:
301
331
  - path: JSONPath reference (e.g. "$.line_items[0]")
302
332
  - amount: item price in cents
@@ -314,6 +344,10 @@ Extract the following as a JSON object:
314
344
  - wallet: EVM address (0x...) if present
315
345
  - solanaWallet: Solana address (base58) if present
316
346
  - xrplWallet: XRPL address (r...) if present
347
+ - bitcoinWallet: Bitcoin address (1..., 3..., bc1q..., or bc1p...) if present
348
+ - tronWallet: Tron address (T-prefixed base58) if present
349
+ - stellarWallet: Stellar address (G-prefixed) if present
350
+ - suiWallet: Sui address (0x + 64 hex chars) if present
317
351
  - items: optional array of line items, each with:
318
352
  - path: JSONPath reference (e.g. "$.line_items[0]")
319
353
  - amount: item price in cents
@@ -341,7 +375,7 @@ Respond with ONLY the JSON object, no explanation.`;
341
375
  // src/actions/verify.ts
342
376
  var verifyWalletAction = {
343
377
  name: "VERIFY_WALLET",
344
- description: "Verify on-chain token balances, NFT ownership, EAS attestations, or Farcaster identity for a wallet across 33 blockchains. Returns ECDSA-signed privacy-preserving booleans \u2014 never exposes actual balances. Supports EVM, Solana, XRPL, and Bitcoin.",
378
+ description: "Verify on-chain token balances, NFT ownership, EAS attestations, or Farcaster identity for a wallet across 37 blockchains. Returns ECDSA-signed privacy-preserving booleans \u2014 never exposes actual balances. Supports EVM, Solana, XRPL, Bitcoin, Tron, Stellar, and Sui.",
345
379
  similes: [
346
380
  "CHECK_WALLET",
347
381
  "VERIFY_TOKENS",
@@ -442,10 +476,10 @@ var verifyWalletAction = {
442
476
  }
443
477
  return { success: false, text: "Failed to parse verification parameters" };
444
478
  }
445
- if (!params.wallet && !params.solanaWallet && !params.xrplWallet && !params.bitcoinWallet) {
479
+ if (!params.wallet && !params.solanaWallet && !params.xrplWallet && !params.bitcoinWallet && !params.tronWallet && !params.stellarWallet && !params.suiWallet) {
446
480
  if (callback) {
447
481
  await callback({
448
- text: "Please provide a wallet address to verify (EVM 0x..., Solana base58, XRPL r-address, or Bitcoin bc1.../1.../3...)."
482
+ text: "Please provide a wallet address to verify (EVM 0x..., Solana base58, XRPL r-address, Bitcoin bc1.../1.../3..., Tron T..., Stellar G..., or Sui 0x...)."
449
483
  });
450
484
  }
451
485
  return { success: false, text: "No wallet address provided" };
@@ -477,7 +511,7 @@ var verifyWalletAction = {
477
511
  // src/actions/trust.ts
478
512
  var checkTrustAction = {
479
513
  name: "CHECK_TRUST",
480
- description: "Generate an ECDSA-signed wallet trust profile with 17+ checks across stablecoins, governance tokens, NFTs, and staking positions. Returns per-dimension pass/fail counts \u2014 no scores, no opinions, just cryptographically verifiable evidence. Supports cross-chain profiles with optional Solana and XRPL wallets. Costs 3 credits.",
514
+ description: "Generate an ECDSA-signed wallet trust profile with up to 49 checks across 27 chains (stablecoins, governance tokens, NFTs, staking, institutional issuances). Returns per-dimension pass/fail counts \u2014 no scores, no opinions, just cryptographically verifiable evidence. Cross-chain via optional Solana, XRPL, Bitcoin, Tron, Stellar, and Sui wallets. Costs 3 credits.",
481
515
  similes: [
482
516
  "TRUST_PROFILE",
483
517
  "WALLET_TRUST",
@@ -837,7 +871,7 @@ var createMerchantAction = {
837
871
  // src/actions/configure_tokens.ts
838
872
  var configureTokensAction = {
839
873
  name: "CONFIGURE_TOKENS",
840
- description: "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. All 26 EVM chains + Solana + XRPL supported.",
874
+ description: "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. EVM chains + Solana + XRPL supported.",
841
875
  similes: [
842
876
  "SET_TOKEN_TIERS",
843
877
  "CONFIGURE_TOKEN_GATING",
@@ -1068,7 +1102,7 @@ var acpDiscountAction = {
1068
1102
  }
1069
1103
  return { success: false, text: "No merchant ID provided" };
1070
1104
  }
1071
- if (!params.wallet && !params.solanaWallet && !params.xrplWallet) {
1105
+ if (!params.wallet && !params.solanaWallet && !params.xrplWallet && !params.bitcoinWallet && !params.tronWallet && !params.stellarWallet && !params.suiWallet) {
1072
1106
  if (callback) {
1073
1107
  await callback({ text: "Please provide a wallet address to check discount eligibility." });
1074
1108
  }
@@ -1172,7 +1206,7 @@ var ucpDiscountAction = {
1172
1206
  }
1173
1207
  return { success: false, text: "No merchant ID provided" };
1174
1208
  }
1175
- if (!params.wallet && !params.solanaWallet && !params.xrplWallet) {
1209
+ if (!params.wallet && !params.solanaWallet && !params.xrplWallet && !params.bitcoinWallet && !params.tronWallet && !params.stellarWallet && !params.suiWallet) {
1176
1210
  if (callback) {
1177
1211
  await callback({ text: "Please provide a wallet address to check discount eligibility." });
1178
1212
  }
@@ -1303,9 +1337,12 @@ var confirmPaymentAction = {
1303
1337
 
1304
1338
  // src/providers/credentials.ts
1305
1339
  var EVM_REGEX = /\b0x[a-fA-F0-9]{40}\b/g;
1340
+ var SUI_REGEX = /\b0x[a-fA-F0-9]{64}\b/g;
1306
1341
  var SOLANA_REGEX = /\b[1-9A-HJ-NP-Za-km-z]{32,44}\b/g;
1307
1342
  var XRPL_REGEX = /\br[1-9A-HJ-NP-Za-km-z]{24,34}\b/g;
1308
1343
  var BITCOIN_REGEX = /\b(1[a-km-zA-HJ-NP-Z1-9]{25,34}|3[a-km-zA-HJ-NP-Z1-9]{25,34}|bc1[a-z0-9]{39,59}|bc1p[a-z0-9]{58})\b/g;
1344
+ var TRON_REGEX = /\bT[1-9A-HJ-NP-Za-km-z]{33}\b/g;
1345
+ var STELLAR_REGEX = /\bG[A-Z2-7]{55}\b/g;
1309
1346
  function isSolanaAddress(candidate) {
1310
1347
  return candidate.length >= 32 && candidate.length <= 44;
1311
1348
  }
@@ -1319,15 +1356,21 @@ var walletCredentialsProvider = {
1319
1356
  return { text: "" };
1320
1357
  }
1321
1358
  const text = message.content.text || "";
1322
- const evmWallets = text.match(EVM_REGEX) || [];
1359
+ const suiWallets = text.match(SUI_REGEX) || [];
1360
+ const suiSet = new Set(suiWallets);
1361
+ const evmWallets = (text.match(EVM_REGEX) || []).filter((w) => !suiSet.has(w));
1323
1362
  const solanaMatches = (text.match(SOLANA_REGEX) || []).filter(isSolanaAddress);
1324
1363
  const xrplWallets = text.match(XRPL_REGEX) || [];
1325
1364
  const bitcoinWallets = text.match(BITCOIN_REGEX) || [];
1365
+ const tronWallets = text.match(TRON_REGEX) || [];
1366
+ const stellarWallets = text.match(STELLAR_REGEX) || [];
1326
1367
  const evmSet = new Set(evmWallets);
1327
1368
  const xrplSet = new Set(xrplWallets);
1328
1369
  const btcSet = new Set(bitcoinWallets);
1370
+ const tronSet = new Set(tronWallets);
1371
+ const stellarSet = new Set(stellarWallets);
1329
1372
  const solanaWallets = solanaMatches.filter(
1330
- (s) => !evmSet.has(s) && !xrplSet.has(s) && !btcSet.has(s)
1373
+ (s) => !evmSet.has(s) && !xrplSet.has(s) && !btcSet.has(s) && !tronSet.has(s) && !stellarSet.has(s) && !suiSet.has(s)
1331
1374
  );
1332
1375
  const detected = [];
1333
1376
  if (evmWallets.length > 0) {
@@ -1342,6 +1385,15 @@ var walletCredentialsProvider = {
1342
1385
  if (bitcoinWallets.length > 0) {
1343
1386
  detected.push(`Bitcoin: ${bitcoinWallets.join(", ")}`);
1344
1387
  }
1388
+ if (tronWallets.length > 0) {
1389
+ detected.push(`Tron: ${tronWallets.join(", ")}`);
1390
+ }
1391
+ if (stellarWallets.length > 0) {
1392
+ detected.push(`Stellar: ${stellarWallets.join(", ")}`);
1393
+ }
1394
+ if (suiWallets.length > 0) {
1395
+ detected.push(`Sui: ${suiWallets.join(", ")}`);
1396
+ }
1345
1397
  if (detected.length === 0) {
1346
1398
  return { text: "" };
1347
1399
  }
@@ -1354,7 +1406,7 @@ var walletCredentialsProvider = {
1354
1406
  // src/index.ts
1355
1407
  var insumerPlugin = {
1356
1408
  name: "insumer",
1357
- description: "Full autonomous agent lifecycle for token-gated commerce across 33 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.",
1409
+ description: "Full autonomous agent lifecycle for condition-based commerce across 37 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.",
1358
1410
  actions: [
1359
1411
  verifyWalletAction,
1360
1412
  checkTrustAction,
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\" | \"bitcoin\";\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 bitcoinWallet?: 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 bitcoinWallet?: string;\n proof?: \"merkle\";\n}\n\nexport interface BatchTrustParams {\n wallets: Array<{\n wallet: string;\n solanaWallet?: string;\n xrplWallet?: string;\n bitcoinWallet?: 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- bitcoinWallet: Bitcoin address (1..., 3..., bc1q..., or bc1p...) 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 (33 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\", Bitcoin = \"bitcoin\"\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- bitcoinWallet: Bitcoin address (1..., 3..., bc1q..., or bc1p...) if mentioned\n\nThe trust profile automatically checks 17+ dimensions (stablecoins, governance tokens, NFTs, staking) for the EVM wallet. Adding solanaWallet, xrplWallet, or bitcoinWallet 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 - bitcoinWallet: Bitcoin address (1..., 3..., bc1q..., or bc1p...) 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/USDT/BTC transaction hash\n- chainId: chain where crypto was sent (number, \"solana\", or \"bitcoin\")\n- amount: amount sent (number, minimum 5 USD equivalent)\n- appName: name for the API key\n\nChain IDs for payments:\n Ethereum = 1, Base = 8453, Polygon = 137, Arbitrum = 42161,\n Optimism = 10, BNB Chain = 56, Avalanche = 43114, Solana = \"solana\",\n Bitcoin = \"bitcoin\"\n\nPlatform wallets:\n EVM: 0xAd982CB19aCCa2923Df8F687C0614a7700255a23\n Solana: 6a1mLjefhvSJX1sEX8PTnionbE9DqoYjU6F6bNkT4Ydr\n Bitcoin: bc1qg7qnerdhlmdn899zemtez5tcx2a2snc0dt9dt0\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-50)\n- partnerTokens: array of additional token configs (same structure as ownToken), default []\n\nOnboarding chain IDs (26 EVM chains + Solana + XRPL 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 Sonic = 146, Gnosis = 100, Mantle = 5000, Scroll = 534352,\n Linea = 59144, zkSync Era = 324, Blast = 81457, Celo = 42220,\n Moonbeam = 1284, opBNB = 204, Unichain = 130, Ink = 57073,\n Sei = 1329, Berachain = 80094, ApeChain = 33139,\n Solana = \"solana\", XRPL = \"xrpl\", Bitcoin = \"bitcoin\"\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 payments:\n Ethereum = 1, Base = 8453, Polygon = 137, Arbitrum = 42161,\n Optimism = 10, BNB Chain = 56, Avalanche = 43114, Solana = \"solana\",\n Bitcoin = \"bitcoin\"\n\nPlatform wallets:\n EVM: 0xAd982CB19aCCa2923Df8F687C0614a7700255a23\n Solana: 6a1mLjefhvSJX1sEX8PTnionbE9DqoYjU6F6bNkT4Ydr\n Bitcoin: bc1qg7qnerdhlmdn899zemtez5tcx2a2snc0dt9dt0\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 33 blockchains. Returns ECDSA-signed privacy-preserving booleans — never exposes actual balances. Supports EVM, Solana, XRPL, and Bitcoin.\",\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 && !params.bitcoinWallet) {\n if (callback) {\n await callback({\n text: \"Please provide a wallet address to verify (EVM 0x..., Solana base58, XRPL r-address, or Bitcoin bc1.../1.../3...).\",\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\" | \"bitcoin\";\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, USDT, or BTC. No existing API key required. Send crypto to the platform wallet, then provide the transaction hash. The sender wallet becomes the key's identity. One key per wallet. USDC/USDT auto-detected on EVM/Solana. BTC on Bitcoin (converted to USD at market rate).\",\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'. (Also accepts USDT or BTC)\",\n },\n } as ActionExample,\n {\n name: \"assistant\",\n content: {\n text: \"I'll verify your 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, Bitcoin), amount (for stablecoins), 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 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. All 26 EVM chains + Solana + XRPL supported.\",\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\" | \"bitcoin\";\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, USDT, or BTC. Send crypto to the platform wallet, then provide the tx hash. USDC/USDT auto-detected on EVM/Solana. BTC on Bitcoin (converted to USD at market rate). 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 amount (for stablecoins).\",\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 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 isBtc = data.btcPaid !== undefined;\n const paymentLine = isBtc\n ? `BTC paid: ${data.btcPaid} (≈$${data.usdEquivalent} at $${data.btcPrice})`\n : `USDC paid: ${data.usdcPaid}`;\n const text = [\n `Credits added to ${merchantId}!`,\n ``,\n `Credits added: ${data.creditsAdded}`,\n `Total credits: ${data.totalCredits}`,\n paymentLine,\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;\nconst BITCOIN_REGEX = /\\b(1[a-km-zA-HJ-NP-Z1-9]{25,34}|3[a-km-zA-HJ-NP-Z1-9]{25,34}|bc1[a-z0-9]{39,59}|bc1p[a-z0-9]{58})\\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 const bitcoinWallets = text.match(BITCOIN_REGEX) || [];\n\n // Filter Solana matches that overlap with EVM, XRPL, or Bitcoin\n const evmSet = new Set(evmWallets);\n const xrplSet = new Set(xrplWallets);\n const btcSet = new Set(bitcoinWallets);\n const solanaWallets = solanaMatches.filter(\n (s) => !evmSet.has(s) && !xrplSet.has(s) && !btcSet.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 if (bitcoinWallets.length > 0) {\n detected.push(`Bitcoin: ${bitcoinWallets.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 33 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":"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","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\" | \"bitcoin\" | \"tron\" | \"stellar\" | \"sui\";\n threshold?: number;\n decimals?: number;\n currency?: string;\n assetCode?: 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 bitcoinWallet?: string;\n tronWallet?: string;\n stellarWallet?: string;\n suiWallet?: 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 bitcoinWallet?: string;\n tronWallet?: string;\n stellarWallet?: string;\n suiWallet?: string;\n proof?: \"merkle\";\n}\n\nexport interface BatchTrustParams {\n wallets: Array<{\n wallet: string;\n solanaWallet?: string;\n xrplWallet?: string;\n bitcoinWallet?: string;\n tronWallet?: string;\n stellarWallet?: string;\n suiWallet?: 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- bitcoinWallet: Bitcoin address (1..., 3..., bc1q..., or bc1p...) if present\n- tronWallet: Tron address (T-prefixed base58, 34 chars) if present\n- stellarWallet: Stellar address (G-prefixed, 56 chars) if present\n- suiWallet: Sui address (0x + 64 hex chars) 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\", \"xrpl\", \"bitcoin\", \"tron\", \"stellar\", or \"sui\"\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 - assetCode: Stellar asset code (e.g. \"USDC\", \"BENJI\"). Required for Stellar 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 (37 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, XDC = 50,\n Solana = \"solana\", XRPL = \"xrpl\", Bitcoin = \"bitcoin\",\n Tron = \"tron\", Stellar = \"stellar\", Sui = \"sui\"\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\nTron tokens (use chainId \"tron\"):\n TRX native = contractAddress \"native\"\n USDT-TRC20 = contractAddress \"TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t\", decimals 6\n\nStellar tokens (use chainId \"stellar\", assetCode required for trustlines):\n XLM native = contractAddress \"native\"\n USDC on Stellar = contractAddress \"GA5ZSEJYB37JRC5AVCIA5MOP4RHTM335X2KGX3IHOJAPP5RE34K4KZVN\", assetCode \"USDC\"\n BENJI (Franklin) = contractAddress \"GBJW74JRHIIIYC3X3J5VKLR2CR4UJHKO76V5J5SAYTUFAUE7PJBKCT5R\", assetCode \"BENJI\"\n\nSui tokens (use chainId \"sui\"):\n SUI native = contractAddress \"native\"\n USDC on Sui = contractAddress \"0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC\", decimals 6\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- bitcoinWallet: Bitcoin address (1..., 3..., bc1q..., or bc1p...) if mentioned\n- tronWallet: Tron address (T-prefixed base58, 34 chars) if mentioned\n- stellarWallet: Stellar address (G-prefixed, 56 chars) if mentioned\n- suiWallet: Sui address (0x + 64 hex chars) if mentioned\n\nThe trust profile runs up to 49 checks across 27 chains. The 38 base checks (stablecoins, governance tokens, NFTs, staking) all read the EVM wallet. Adding solanaWallet, xrplWallet, bitcoinWallet, tronWallet, stellarWallet, or suiWallet extends the profile with additional checks on those chains.\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 - bitcoinWallet: Bitcoin address (1..., 3..., bc1q..., or bc1p...) if mentioned for this wallet\n - tronWallet: Tron address (T-prefixed base58) if mentioned for this wallet\n - stellarWallet: Stellar address (G-prefixed) if mentioned for this wallet\n - suiWallet: Sui address (0x + 64 hex chars) 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/USDT/BTC transaction hash\n- chainId: chain where crypto was sent (number, \"solana\", \"bitcoin\", or \"tron\")\n- amount: amount sent (number, minimum 5 USD equivalent)\n- appName: name for the API key\n\nChain IDs for payments:\n Ethereum = 1, Base = 8453, Polygon = 137, Arbitrum = 42161,\n Optimism = 10, BNB Chain = 56, Avalanche = 43114, Solana = \"solana\",\n Bitcoin = \"bitcoin\", Tron = \"tron\"\n\nPlatform wallets:\n EVM: 0xAd982CB19aCCa2923Df8F687C0614a7700255a23\n Solana: 6a1mLjefhvSJX1sEX8PTnionbE9DqoYjU6F6bNkT4Ydr\n Bitcoin: bc1qg7qnerdhlmdn899zemtez5tcx2a2snc0dt9dt0\n Tron: TC5yvwkAMakkXtUxYiu2Yn1xbBcwYuD6cn\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-50)\n- partnerTokens: array of additional token configs (same structure as ownToken), default []\n\nOnboarding chain IDs (EVM chains + Solana + XRPL 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 Sonic = 146, Gnosis = 100, Mantle = 5000, Scroll = 534352,\n Linea = 59144, zkSync Era = 324, Blast = 81457, Celo = 42220,\n Moonbeam = 1284, opBNB = 204, Unichain = 130, Ink = 57073,\n Sei = 1329, Berachain = 80094, ApeChain = 33139, XDC = 50,\n Solana = \"solana\", XRPL = \"xrpl\"\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/USDT/BTC transaction hash (required)\n- chainId: chain where crypto was sent (number, \"solana\", \"bitcoin\", or \"tron\")\n- amount: amount sent (number, minimum 5 USD equivalent)\n- updateWallet: true only if the user explicitly wants to change their registered wallet (default false)\n\nChain IDs for payments:\n Ethereum = 1, Base = 8453, Polygon = 137, Arbitrum = 42161,\n Optimism = 10, BNB Chain = 56, Avalanche = 43114, Solana = \"solana\",\n Bitcoin = \"bitcoin\", Tron = \"tron\"\n\nPlatform wallets:\n EVM: 0xAd982CB19aCCa2923Df8F687C0614a7700255a23\n Solana: 6a1mLjefhvSJX1sEX8PTnionbE9DqoYjU6F6bNkT4Ydr\n Bitcoin: bc1qg7qnerdhlmdn899zemtez5tcx2a2snc0dt9dt0\n Tron: TC5yvwkAMakkXtUxYiu2Yn1xbBcwYuD6cn\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- bitcoinWallet: Bitcoin address (1..., 3..., bc1q..., or bc1p...) if present\n- tronWallet: Tron address (T-prefixed base58) if present\n- stellarWallet: Stellar address (G-prefixed) if present\n- suiWallet: Sui address (0x + 64 hex chars) 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- bitcoinWallet: Bitcoin address (1..., 3..., bc1q..., or bc1p...) if present\n- tronWallet: Tron address (T-prefixed base58) if present\n- stellarWallet: Stellar address (G-prefixed) if present\n- suiWallet: Sui address (0x + 64 hex chars) 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 37 blockchains. Returns ECDSA-signed privacy-preserving booleans — never exposes actual balances. Supports EVM, Solana, XRPL, Bitcoin, Tron, Stellar, and Sui.\",\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 (\n !params.wallet &&\n !params.solanaWallet &&\n !params.xrplWallet &&\n !params.bitcoinWallet &&\n !params.tronWallet &&\n !params.stellarWallet &&\n !params.suiWallet\n ) {\n if (callback) {\n await callback({\n text: \"Please provide a wallet address to verify (EVM 0x..., Solana base58, XRPL r-address, Bitcoin bc1.../1.../3..., Tron T..., Stellar G..., or Sui 0x...).\",\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 up to 49 checks across 27 chains (stablecoins, governance tokens, NFTs, staking, institutional issuances). Returns per-dimension pass/fail counts — no scores, no opinions, just cryptographically verifiable evidence. Cross-chain via optional Solana, XRPL, Bitcoin, Tron, Stellar, and Sui 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\" | \"bitcoin\" | \"tron\";\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, USDT, or BTC. No existing API key required. Send crypto to the platform wallet, then provide the transaction hash. The sender wallet becomes the key's identity. One key per wallet. USDC/USDT auto-detected on EVM/Solana. BTC on Bitcoin (converted to USD at market rate).\",\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'. (Also accepts USDT or BTC)\",\n },\n } as ActionExample,\n {\n name: \"assistant\",\n content: {\n text: \"I'll verify your 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, Bitcoin), amount (for stablecoins), 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 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. EVM chains + Solana + XRPL supported.\",\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\" | \"bitcoin\" | \"tron\";\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, USDT, or BTC. Send crypto to the platform wallet, then provide the tx hash. USDC/USDT auto-detected on EVM/Solana. BTC on Bitcoin (converted to USD at market rate). 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 amount (for stablecoins).\",\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 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 isBtc = data.btcPaid !== undefined;\n const paymentLine = isBtc\n ? `BTC paid: ${data.btcPaid} (≈$${data.usdEquivalent} at $${data.btcPrice})`\n : `USDC paid: ${data.usdcPaid}`;\n const text = [\n `Credits added to ${merchantId}!`,\n ``,\n `Credits added: ${data.creditsAdded}`,\n `Total credits: ${data.totalCredits}`,\n paymentLine,\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 bitcoinWallet?: string;\n tronWallet?: string;\n stellarWallet?: string;\n suiWallet?: 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 (\n !params.wallet &&\n !params.solanaWallet &&\n !params.xrplWallet &&\n !params.bitcoinWallet &&\n !params.tronWallet &&\n !params.stellarWallet &&\n !params.suiWallet\n ) {\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 bitcoinWallet?: string;\n tronWallet?: string;\n stellarWallet?: string;\n suiWallet?: 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 (\n !params.wallet &&\n !params.solanaWallet &&\n !params.xrplWallet &&\n !params.bitcoinWallet &&\n !params.tronWallet &&\n !params.stellarWallet &&\n !params.suiWallet\n ) {\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 SUI_REGEX = /\\b0x[a-fA-F0-9]{64}\\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;\nconst BITCOIN_REGEX = /\\b(1[a-km-zA-HJ-NP-Z1-9]{25,34}|3[a-km-zA-HJ-NP-Z1-9]{25,34}|bc1[a-z0-9]{39,59}|bc1p[a-z0-9]{58})\\b/g;\nconst TRON_REGEX = /\\bT[1-9A-HJ-NP-Za-km-z]{33}\\b/g;\nconst STELLAR_REGEX = /\\bG[A-Z2-7]{55}\\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 // Sui (0x + 64 hex) must be matched before EVM so 64-char hex isn't truncated to a 40-char EVM match.\n const suiWallets = text.match(SUI_REGEX) || [];\n const suiSet = new Set(suiWallets);\n const evmWallets = (text.match(EVM_REGEX) || []).filter((w) => !suiSet.has(w));\n const solanaMatches = (text.match(SOLANA_REGEX) || []).filter(isSolanaAddress);\n const xrplWallets = text.match(XRPL_REGEX) || [];\n const bitcoinWallets = text.match(BITCOIN_REGEX) || [];\n const tronWallets = text.match(TRON_REGEX) || [];\n const stellarWallets = text.match(STELLAR_REGEX) || [];\n\n // Filter Solana matches that overlap with other detected sets\n const evmSet = new Set(evmWallets);\n const xrplSet = new Set(xrplWallets);\n const btcSet = new Set(bitcoinWallets);\n const tronSet = new Set(tronWallets);\n const stellarSet = new Set(stellarWallets);\n const solanaWallets = solanaMatches.filter(\n (s) =>\n !evmSet.has(s) &&\n !xrplSet.has(s) &&\n !btcSet.has(s) &&\n !tronSet.has(s) &&\n !stellarSet.has(s) &&\n !suiSet.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 if (bitcoinWallets.length > 0) {\n detected.push(`Bitcoin: ${bitcoinWallets.join(\", \")}`);\n }\n if (tronWallets.length > 0) {\n detected.push(`Tron: ${tronWallets.join(\", \")}`);\n }\n if (stellarWallets.length > 0) {\n detected.push(`Stellar: ${stellarWallets.join(\", \")}`);\n }\n if (suiWallets.length > 0) {\n detected.push(`Sui: ${suiWallets.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 condition-based commerce across 37 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":"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","names":[]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@insumermodel/plugin-eliza",
3
- "version": "2.0.0",
4
- "description": "ElizaOS plugin for InsumerAPI — condition-based access for autonomous agents. 10 actions: buy API key, create merchant, configure conditions, add credits, verify wallets, trust profiles (40 checks across 24 chains incl. Solana, XRPL, Bitcoin), ACP/UCP commerce, confirm payments. ECDSA-signed results across 33 blockchains.",
3
+ "version": "2.1.1",
4
+ "description": "ElizaOS plugin for InsumerAPI — condition-based access for autonomous agents. 10 actions: buy API key, create merchant, configure conditions, add credits, verify wallets, trust profiles (up to 49 checks across 27 chains incl. Solana, XRPL, Bitcoin, Tron, Stellar, Sui), ACP/UCP commerce, confirm payments. ECDSA-signed results across 37 blockchains.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",