@x402-api/elizaos-plugin 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/README.md +346 -0
  2. package/dist/actions/dexQuotes.d.ts +4 -0
  3. package/dist/actions/dexQuotes.d.ts.map +1 -0
  4. package/dist/actions/dexQuotes.js +80 -0
  5. package/dist/actions/dexQuotes.js.map +1 -0
  6. package/dist/actions/fundingRates.d.ts +4 -0
  7. package/dist/actions/fundingRates.d.ts.map +1 -0
  8. package/dist/actions/fundingRates.js +85 -0
  9. package/dist/actions/fundingRates.js.map +1 -0
  10. package/dist/actions/gasTracker.d.ts +4 -0
  11. package/dist/actions/gasTracker.d.ts.map +1 -0
  12. package/dist/actions/gasTracker.js +60 -0
  13. package/dist/actions/gasTracker.js.map +1 -0
  14. package/dist/actions/priceFeed.d.ts +4 -0
  15. package/dist/actions/priceFeed.d.ts.map +1 -0
  16. package/dist/actions/priceFeed.js +75 -0
  17. package/dist/actions/priceFeed.js.map +1 -0
  18. package/dist/actions/tokenScanner.d.ts +4 -0
  19. package/dist/actions/tokenScanner.d.ts.map +1 -0
  20. package/dist/actions/tokenScanner.js +83 -0
  21. package/dist/actions/tokenScanner.js.map +1 -0
  22. package/dist/actions/walletProfiler.d.ts +4 -0
  23. package/dist/actions/walletProfiler.d.ts.map +1 -0
  24. package/dist/actions/walletProfiler.js +92 -0
  25. package/dist/actions/walletProfiler.js.map +1 -0
  26. package/dist/actions/whaleTracker.d.ts +4 -0
  27. package/dist/actions/whaleTracker.d.ts.map +1 -0
  28. package/dist/actions/whaleTracker.js +71 -0
  29. package/dist/actions/whaleTracker.js.map +1 -0
  30. package/dist/actions/yieldScanner.d.ts +4 -0
  31. package/dist/actions/yieldScanner.d.ts.map +1 -0
  32. package/dist/actions/yieldScanner.js +93 -0
  33. package/dist/actions/yieldScanner.js.map +1 -0
  34. package/dist/client.d.ts +66 -0
  35. package/dist/client.d.ts.map +1 -0
  36. package/dist/client.js +154 -0
  37. package/dist/client.js.map +1 -0
  38. package/dist/index.d.ts +24 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +24 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/plugin.d.ts +63 -0
  43. package/dist/plugin.d.ts.map +1 -0
  44. package/dist/plugin.js +108 -0
  45. package/dist/plugin.js.map +1 -0
  46. package/dist/types.d.ts +280 -0
  47. package/dist/types.d.ts.map +1 -0
  48. package/dist/types.js +8 -0
  49. package/dist/types.js.map +1 -0
  50. package/package.json +66 -0
package/dist/client.js ADDED
@@ -0,0 +1,154 @@
1
+ /**
2
+ * x402 API Client
3
+ *
4
+ * Handles HTTP requests to the x402 DeFi API with x402 payment support.
5
+ *
6
+ * ## Payment Flow
7
+ *
8
+ * The x402 API uses the HTTP 402 Payment Required protocol:
9
+ * 1. Agent makes a request
10
+ * 2. Server returns 402 with payment details (amount, token, payTo address)
11
+ * 3. Agent pays via USDC on Base
12
+ * 4. Agent retries with payment proof header (X-PAYMENT)
13
+ * 5. Server validates payment and returns data
14
+ *
15
+ * ## Setup Options
16
+ *
17
+ * ### Option A: x402-fetch (Recommended for autonomous agents)
18
+ * Install x402-fetch and configure your wallet private key.
19
+ * The client will auto-handle the 402 flow transparently.
20
+ *
21
+ * ### Option B: Pre-authorized fetch
22
+ * If you have a pre-authorized session token from the x402 facilitator.
23
+ *
24
+ * ### Option C: Manual (for testing)
25
+ * Just make the request — you'll get the 402 details to handle manually.
26
+ */
27
+ export const X402_API_BASE_URL = 'https://x402-api.fly.dev';
28
+ let cachedFetch = null;
29
+ /**
30
+ * Get a fetch function that handles x402 payments.
31
+ *
32
+ * If x402-fetch is installed and a wallet private key is provided,
33
+ * returns an auto-paying fetch. Otherwise returns standard fetch.
34
+ */
35
+ async function getX402Fetch(config) {
36
+ if (cachedFetch)
37
+ return cachedFetch;
38
+ if (config.walletPrivateKey) {
39
+ try {
40
+ // Try to load x402-fetch for automatic payment handling.
41
+ // Using dynamic require via Function to avoid TypeScript's static analysis
42
+ // of optional peer dependencies (x402-fetch, viem) which may not be installed.
43
+ const requireDynamic = new Function('m', 'return import(m)');
44
+ const x402Module = await requireDynamic('x402-fetch').catch(() => null);
45
+ if (x402Module?.wrapFetchWithPayment) {
46
+ const viemModule = await requireDynamic('viem');
47
+ const viemAccounts = await requireDynamic('viem/accounts');
48
+ const viemChains = await requireDynamic('viem/chains');
49
+ const privateKeyToAccount = viemAccounts['privateKeyToAccount'];
50
+ const createWalletClient = viemModule['createWalletClient'];
51
+ const http = viemModule['http'];
52
+ const base = viemChains['base'];
53
+ const account = privateKeyToAccount(config.walletPrivateKey);
54
+ const walletClient = createWalletClient({ account, chain: base, transport: http() });
55
+ const wrapFetch = x402Module['wrapFetchWithPayment'];
56
+ cachedFetch = wrapFetch(fetch, walletClient);
57
+ console.log('[x402-plugin] Using x402-fetch with wallet:', account.address);
58
+ return cachedFetch;
59
+ }
60
+ }
61
+ catch {
62
+ // x402-fetch or viem not installed, fall through to standard fetch
63
+ }
64
+ }
65
+ // Standard fetch — will return 402 if payment not configured
66
+ cachedFetch = fetch;
67
+ return cachedFetch;
68
+ }
69
+ /**
70
+ * Make a request to the x402 API.
71
+ *
72
+ * @param endpoint - API endpoint path (e.g. '/api/price-feed')
73
+ * @param params - Query parameters
74
+ * @param config - Client configuration
75
+ * @returns Parsed JSON response
76
+ * @throws Error with helpful message on 402 (payment required) or other errors
77
+ */
78
+ export async function x402ApiRequest(endpoint, params, config = {}) {
79
+ const baseUrl = config.baseUrl || X402_API_BASE_URL;
80
+ // Build URL with query params
81
+ const url = new URL(`${baseUrl}${endpoint}`);
82
+ for (const [key, value] of Object.entries(params)) {
83
+ if (value !== undefined) {
84
+ url.searchParams.set(key, String(value));
85
+ }
86
+ }
87
+ const fetchFn = await getX402Fetch(config);
88
+ const controller = new AbortController();
89
+ const timeout = setTimeout(() => controller.abort(), config.timeoutMs || 30_000);
90
+ try {
91
+ const response = await fetchFn(url.toString(), {
92
+ signal: controller.signal,
93
+ headers: {
94
+ 'Accept': 'application/json',
95
+ 'User-Agent': 'ElizaOS-x402-plugin/1.0',
96
+ },
97
+ });
98
+ if (response.status === 402) {
99
+ // Payment required — x402-fetch should have handled this automatically
100
+ // If we reach here, it means x402-fetch is not configured
101
+ let paymentDetails = '';
102
+ try {
103
+ const body = await response.json();
104
+ paymentDetails = JSON.stringify(body, null, 2);
105
+ }
106
+ catch {
107
+ paymentDetails = await response.text();
108
+ }
109
+ throw new Error(`x402 Payment Required for ${endpoint}\n\n` +
110
+ `To enable automatic payments:\n` +
111
+ `1. Install x402-fetch: npm install x402-fetch viem\n` +
112
+ `2. Set X402_WALLET_PRIVATE_KEY in your .env file\n` +
113
+ `3. Add walletPrivateKey to plugin config\n\n` +
114
+ `Payment details:\n${paymentDetails}`);
115
+ }
116
+ if (!response.ok) {
117
+ const errorText = await response.text();
118
+ throw new Error(`API error ${response.status}: ${errorText}`);
119
+ }
120
+ return response.json();
121
+ }
122
+ finally {
123
+ clearTimeout(timeout);
124
+ }
125
+ }
126
+ /**
127
+ * Extract key information from a message for API parameters.
128
+ * Parses natural language to extract token symbols, addresses, chains, etc.
129
+ */
130
+ export function extractParams(text) {
131
+ const params = {};
132
+ // Extract Ethereum address
133
+ const addressMatch = text.match(/0x[0-9a-fA-F]{40}/);
134
+ if (addressMatch)
135
+ params.address = addressMatch[0];
136
+ // Extract chain name
137
+ const chainMatch = text.match(/\b(ethereum|base|arbitrum|polygon|solana|optimism)\b/i);
138
+ if (chainMatch)
139
+ params.chain = chainMatch[1].toLowerCase();
140
+ // Extract token symbols (2-6 uppercase letters, common patterns)
141
+ const tokenMatch = text.match(/\b([A-Z]{2,6})\b/);
142
+ if (tokenMatch && !['GET', 'THE', 'FOR', 'AND', 'ETH', 'BTC', 'SOL'].includes(tokenMatch[1])) {
143
+ // Prefer specific DeFi tokens
144
+ const defiTokenMatch = text.match(/\b(BTC|ETH|SOL|USDC|USDT|DAI|LINK|UNI|AAVE|ARB|OP|PEPE|SHIB|DOGE|stETH|rETH|sUSDe|sDAI)\b/i);
145
+ if (defiTokenMatch)
146
+ params.token = defiTokenMatch[1].toUpperCase();
147
+ }
148
+ // Extract amounts
149
+ const amountMatch = text.match(/\b(\d+(?:\.\d+)?)\s*(?:eth|btc|sol|usdc|token)?/i);
150
+ if (amountMatch)
151
+ params.amount = amountMatch[1];
152
+ return params;
153
+ }
154
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * @x402-api/elizaos-plugin
3
+ *
4
+ * ElizaOS plugin wrapping the x402 DeFi API — 8 pay-per-call endpoints
5
+ * for crypto prices, gas, DEX quotes, token security, whale tracking,
6
+ * yields, funding rates, and wallet analysis.
7
+ *
8
+ * @see https://x402-api.fly.dev
9
+ * @see https://github.com/sugi/x402-api-server
10
+ */
11
+ export { x402DeFiPlugin, createX402Plugin } from './plugin.js';
12
+ export type { X402PluginConfig } from './plugin.js';
13
+ export { x402ApiRequest, extractParams, X402_API_BASE_URL } from './client.js';
14
+ export type { X402ClientConfig } from './client.js';
15
+ export { createPriceFeedAction } from './actions/priceFeed.js';
16
+ export { createGasTrackerAction } from './actions/gasTracker.js';
17
+ export { createDexQuotesAction } from './actions/dexQuotes.js';
18
+ export { createTokenScannerAction } from './actions/tokenScanner.js';
19
+ export { createWhaleTrackerAction } from './actions/whaleTracker.js';
20
+ export { createYieldScannerAction } from './actions/yieldScanner.js';
21
+ export { createFundingRatesAction } from './actions/fundingRates.js';
22
+ export { createWalletProfilerAction } from './actions/walletProfiler.js';
23
+ export type { X402PaymentInfo, ApiResponse, CoinPrice, PriceFeedData, PriceFeedResponse, GasTier, ChainGasData, GasTrackerData, GasTrackerResponse, DexQuote, DexQuotesData, DexQuotesQuery, TokenScanData, TokenScanQuery, WhaleHolder, WhaleTransfer, WhaleTrackerData, WhaleTrackerQuery, YieldPool, YieldScannerQuery, FundingRateEntry, ArbOpportunity, FundingRatesData, FundingRatesQuery, WalletHolding, DefiPosition, WalletProfileData, WalletProfilerQuery, } from './types.js';
24
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/D,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGpD,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAC/E,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AAGzE,YAAY,EAEV,eAAe,EACf,WAAW,EAGX,SAAS,EACT,aAAa,EACb,iBAAiB,EAGjB,OAAO,EACP,YAAY,EACZ,cAAc,EACd,kBAAkB,EAGlB,QAAQ,EACR,aAAa,EACb,cAAc,EAGd,aAAa,EACb,cAAc,EAGd,WAAW,EACX,aAAa,EACb,gBAAgB,EAChB,iBAAiB,EAGjB,SAAS,EACT,iBAAiB,EAGjB,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EAGjB,aAAa,EACb,YAAY,EACZ,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,24 @@
1
+ /**
2
+ * @x402-api/elizaos-plugin
3
+ *
4
+ * ElizaOS plugin wrapping the x402 DeFi API — 8 pay-per-call endpoints
5
+ * for crypto prices, gas, DEX quotes, token security, whale tracking,
6
+ * yields, funding rates, and wallet analysis.
7
+ *
8
+ * @see https://x402-api.fly.dev
9
+ * @see https://github.com/sugi/x402-api-server
10
+ */
11
+ // Main plugin
12
+ export { x402DeFiPlugin, createX402Plugin } from './plugin.js';
13
+ // Client utilities
14
+ export { x402ApiRequest, extractParams, X402_API_BASE_URL } from './client.js';
15
+ // Individual action factories (for custom composition)
16
+ export { createPriceFeedAction } from './actions/priceFeed.js';
17
+ export { createGasTrackerAction } from './actions/gasTracker.js';
18
+ export { createDexQuotesAction } from './actions/dexQuotes.js';
19
+ export { createTokenScannerAction } from './actions/tokenScanner.js';
20
+ export { createWhaleTrackerAction } from './actions/whaleTracker.js';
21
+ export { createYieldScannerAction } from './actions/yieldScanner.js';
22
+ export { createFundingRatesAction } from './actions/fundingRates.js';
23
+ export { createWalletProfilerAction } from './actions/walletProfiler.js';
24
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,cAAc;AACd,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAG/D,mBAAmB;AACnB,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAG/E,uDAAuD;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * x402 DeFi API — ElizaOS Plugin
3
+ *
4
+ * Wraps all 8 pay-per-call DeFi endpoints as ElizaOS actions.
5
+ * Payments handled automatically via x402-fetch (USDC on Base).
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * // In your character file:
10
+ * import { x402DeFiPlugin } from '@x402-api/elizaos-plugin';
11
+ *
12
+ * export const character: Character = {
13
+ * name: 'DeFi Agent',
14
+ * plugins: [
15
+ * '@elizaos/plugin-bootstrap',
16
+ * x402DeFiPlugin,
17
+ * ],
18
+ * };
19
+ * ```
20
+ */
21
+ import type { Plugin } from '@elizaos/core';
22
+ export interface X402PluginConfig {
23
+ /**
24
+ * Base URL for the API.
25
+ * @default 'https://x402-api.fly.dev'
26
+ */
27
+ baseUrl?: string;
28
+ /**
29
+ * Wallet private key for automatic x402 payment.
30
+ * Can also be set via X402_WALLET_PRIVATE_KEY env variable.
31
+ * WARNING: Keep this secret! Use env vars, never hardcode.
32
+ */
33
+ walletPrivateKey?: string;
34
+ /**
35
+ * Your wallet address (used for logging).
36
+ * Can also be set via X402_WALLET_ADDRESS env variable.
37
+ */
38
+ walletAddress?: string;
39
+ /**
40
+ * Request timeout in milliseconds.
41
+ * @default 30000
42
+ */
43
+ timeoutMs?: number;
44
+ }
45
+ /**
46
+ * Create the x402 DeFi plugin with configuration.
47
+ *
48
+ * @example
49
+ * ```typescript
50
+ * import { createX402Plugin } from '@x402-api/elizaos-plugin';
51
+ *
52
+ * const plugin = createX402Plugin({
53
+ * walletPrivateKey: process.env.X402_WALLET_PRIVATE_KEY,
54
+ * });
55
+ * ```
56
+ */
57
+ export declare function createX402Plugin(pluginConfig?: X402PluginConfig): Plugin;
58
+ /**
59
+ * Default export: pre-configured plugin with env-based settings.
60
+ * Wallet key is read from X402_WALLET_PRIVATE_KEY at runtime.
61
+ */
62
+ export declare const x402DeFiPlugin: Plugin;
63
+ //# sourceMappingURL=plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAiB,MAAM,eAAe,CAAC;AAW3D,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,YAAY,GAAE,gBAAqB,GAAG,MAAM,CAwE5E;AAED;;;GAGG;AACH,eAAO,MAAM,cAAc,QAAqB,CAAC"}
package/dist/plugin.js ADDED
@@ -0,0 +1,108 @@
1
+ /**
2
+ * x402 DeFi API — ElizaOS Plugin
3
+ *
4
+ * Wraps all 8 pay-per-call DeFi endpoints as ElizaOS actions.
5
+ * Payments handled automatically via x402-fetch (USDC on Base).
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * // In your character file:
10
+ * import { x402DeFiPlugin } from '@x402-api/elizaos-plugin';
11
+ *
12
+ * export const character: Character = {
13
+ * name: 'DeFi Agent',
14
+ * plugins: [
15
+ * '@elizaos/plugin-bootstrap',
16
+ * x402DeFiPlugin,
17
+ * ],
18
+ * };
19
+ * ```
20
+ */
21
+ import { X402_API_BASE_URL } from './client.js';
22
+ import { createPriceFeedAction } from './actions/priceFeed.js';
23
+ import { createGasTrackerAction } from './actions/gasTracker.js';
24
+ import { createDexQuotesAction } from './actions/dexQuotes.js';
25
+ import { createTokenScannerAction } from './actions/tokenScanner.js';
26
+ import { createWhaleTrackerAction } from './actions/whaleTracker.js';
27
+ import { createYieldScannerAction } from './actions/yieldScanner.js';
28
+ import { createFundingRatesAction } from './actions/fundingRates.js';
29
+ import { createWalletProfilerAction } from './actions/walletProfiler.js';
30
+ /**
31
+ * Create the x402 DeFi plugin with configuration.
32
+ *
33
+ * @example
34
+ * ```typescript
35
+ * import { createX402Plugin } from '@x402-api/elizaos-plugin';
36
+ *
37
+ * const plugin = createX402Plugin({
38
+ * walletPrivateKey: process.env.X402_WALLET_PRIVATE_KEY,
39
+ * });
40
+ * ```
41
+ */
42
+ export function createX402Plugin(pluginConfig = {}) {
43
+ let clientConfig = {
44
+ baseUrl: pluginConfig.baseUrl || X402_API_BASE_URL,
45
+ timeoutMs: pluginConfig.timeoutMs || 30_000,
46
+ };
47
+ return {
48
+ name: 'x402-defi-api',
49
+ description: 'Pay-per-call DeFi intelligence: prices, gas, DEX quotes, token security, ' +
50
+ 'whale tracking, yields, funding rates, and wallet analysis. ' +
51
+ 'Powered by x402 micropayments (USDC on Base). Base cost: $0.001–$0.008 per query.',
52
+ /**
53
+ * Called once when ElizaOS loads the plugin.
54
+ * Reads wallet configuration from runtime settings or env vars.
55
+ */
56
+ init: async (runtimeConfig, runtime) => {
57
+ // Resolve wallet private key from multiple sources (priority order):
58
+ // 1. Plugin config (passed directly)
59
+ // 2. Runtime settings (from character file or .env via elizaos)
60
+ // 3. Process environment
61
+ // getSetting returns string | boolean | number | null — we cast to string for URL/key values
62
+ const privateKey = pluginConfig.walletPrivateKey ||
63
+ runtime.getSetting('X402_WALLET_PRIVATE_KEY') ||
64
+ process.env.X402_WALLET_PRIVATE_KEY;
65
+ const walletAddress = pluginConfig.walletAddress ||
66
+ runtime.getSetting('X402_WALLET_ADDRESS') ||
67
+ process.env.X402_WALLET_ADDRESS;
68
+ const baseUrl = pluginConfig.baseUrl ||
69
+ runtime.getSetting('X402_API_BASE_URL') ||
70
+ process.env.X402_API_BASE_URL ||
71
+ X402_API_BASE_URL;
72
+ clientConfig = {
73
+ baseUrl,
74
+ walletPrivateKey: privateKey,
75
+ walletAddress,
76
+ timeoutMs: pluginConfig.timeoutMs || 30_000,
77
+ };
78
+ if (privateKey) {
79
+ console.log('[x402-plugin] Wallet configured — automatic payment enabled');
80
+ console.log(`[x402-plugin] API: ${baseUrl}`);
81
+ }
82
+ else {
83
+ console.warn('[x402-plugin] WARNING: No wallet private key configured.\n' +
84
+ ' Set X402_WALLET_PRIVATE_KEY in your .env file to enable automatic x402 payments.\n' +
85
+ ' Without it, API calls will return a 402 Payment Required error.\n' +
86
+ ' See: https://github.com/sugi/x402-api-server#configuration');
87
+ }
88
+ },
89
+ actions: [
90
+ // All 8 actions are created lazily with the clientConfig reference
91
+ // (clientConfig is mutated in init, so actions see the updated config)
92
+ createPriceFeedAction(clientConfig),
93
+ createGasTrackerAction(clientConfig),
94
+ createDexQuotesAction(clientConfig),
95
+ createTokenScannerAction(clientConfig),
96
+ createWhaleTrackerAction(clientConfig),
97
+ createYieldScannerAction(clientConfig),
98
+ createFundingRatesAction(clientConfig),
99
+ createWalletProfilerAction(clientConfig),
100
+ ],
101
+ };
102
+ }
103
+ /**
104
+ * Default export: pre-configured plugin with env-based settings.
105
+ * Wallet key is read from X402_WALLET_PRIVATE_KEY at runtime.
106
+ */
107
+ export const x402DeFiPlugin = createX402Plugin();
108
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAGH,OAAO,EAAyB,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AA6BzE;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,gBAAgB,CAAC,eAAiC,EAAE;IAClE,IAAI,YAAY,GAAqB;QACnC,OAAO,EAAE,YAAY,CAAC,OAAO,IAAI,iBAAiB;QAClD,SAAS,EAAE,YAAY,CAAC,SAAS,IAAI,MAAM;KAC5C,CAAC;IAEF,OAAO;QACL,IAAI,EAAE,eAAe;QACrB,WAAW,EACT,2EAA2E;YAC3E,8DAA8D;YAC9D,mFAAmF;QAErF;;;WAGG;QACH,IAAI,EAAE,KAAK,EAAE,aAAqC,EAAE,OAAsB,EAAE,EAAE;YAC5E,qEAAqE;YACrE,qCAAqC;YACrC,gEAAgE;YAChE,yBAAyB;YACzB,6FAA6F;YAC7F,MAAM,UAAU,GACd,YAAY,CAAC,gBAAgB;gBAC5B,OAAO,CAAC,UAAU,CAAC,yBAAyB,CAAmB;gBAChE,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC;YAEtC,MAAM,aAAa,GACjB,YAAY,CAAC,aAAa;gBACzB,OAAO,CAAC,UAAU,CAAC,qBAAqB,CAAmB;gBAC5D,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;YAElC,MAAM,OAAO,GACX,YAAY,CAAC,OAAO;gBACnB,OAAO,CAAC,UAAU,CAAC,mBAAmB,CAAmB;gBAC1D,OAAO,CAAC,GAAG,CAAC,iBAAiB;gBAC7B,iBAAiB,CAAC;YAEpB,YAAY,GAAG;gBACb,OAAO;gBACP,gBAAgB,EAAE,UAAU;gBAC5B,aAAa;gBACb,SAAS,EAAE,YAAY,CAAC,SAAS,IAAI,MAAM;aAC5C,CAAC;YAEF,IAAI,UAAU,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;gBAC3E,OAAO,CAAC,GAAG,CAAC,sBAAsB,OAAO,EAAE,CAAC,CAAC;YAC/C,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CACV,4DAA4D;oBAC5D,sFAAsF;oBACtF,qEAAqE;oBACrE,8DAA8D,CAC/D,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO,EAAE;YACP,mEAAmE;YACnE,uEAAuE;YACvE,qBAAqB,CAAC,YAAY,CAAC;YACnC,sBAAsB,CAAC,YAAY,CAAC;YACpC,qBAAqB,CAAC,YAAY,CAAC;YACnC,wBAAwB,CAAC,YAAY,CAAC;YACtC,wBAAwB,CAAC,YAAY,CAAC;YACtC,wBAAwB,CAAC,YAAY,CAAC;YACtC,wBAAwB,CAAC,YAAY,CAAC;YACtC,0BAA0B,CAAC,YAAY,CAAC;SACzC;KACF,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,gBAAgB,EAAE,CAAC"}
@@ -0,0 +1,280 @@
1
+ /**
2
+ * TypeScript types for the x402 DeFi API responses.
3
+ * Base URL: https://x402-api.fly.dev
4
+ *
5
+ * All endpoints require x402 micropayment (USDC on Base).
6
+ */
7
+ export interface X402PaymentInfo {
8
+ payer?: string;
9
+ amount?: string;
10
+ token?: string;
11
+ }
12
+ export interface ApiResponse<T> {
13
+ timestamp: string;
14
+ source: string;
15
+ cached?: boolean;
16
+ payment?: X402PaymentInfo;
17
+ data: T;
18
+ }
19
+ export interface CoinPrice {
20
+ id: string;
21
+ price_usd: number | null;
22
+ change_24h_pct: number | null;
23
+ volume_24h_usd: number | null;
24
+ market_cap_usd: number | null;
25
+ last_updated: string | null;
26
+ }
27
+ export interface PriceFeedData {
28
+ core: CoinPrice[];
29
+ top_movers: {
30
+ gainers: CoinPrice[];
31
+ losers: CoinPrice[];
32
+ };
33
+ }
34
+ export interface PriceFeedResponse extends ApiResponse<PriceFeedData> {
35
+ cache_ttl_seconds: number;
36
+ }
37
+ export interface GasTier {
38
+ slow: number;
39
+ normal: number;
40
+ fast: number;
41
+ }
42
+ export interface ChainGasData {
43
+ chain: string;
44
+ chain_id: number;
45
+ native_token: string;
46
+ is_mock: boolean;
47
+ gas_price_gwei: GasTier;
48
+ estimated_cost_usd: {
49
+ transfer: GasTier;
50
+ swap: GasTier;
51
+ nft_mint: GasTier;
52
+ };
53
+ }
54
+ export interface GasTrackerData {
55
+ ethereum: ChainGasData;
56
+ base: ChainGasData;
57
+ polygon: ChainGasData;
58
+ arbitrum: ChainGasData;
59
+ }
60
+ export interface GasTrackerResponse extends ApiResponse<GasTrackerData> {
61
+ cache_ttl_seconds: number;
62
+ }
63
+ export interface DexQuote {
64
+ dex: string;
65
+ dex_name: string;
66
+ input_token: string;
67
+ output_token: string;
68
+ input_amount: number;
69
+ output_amount: number;
70
+ effective_rate: number;
71
+ price_impact_pct: number;
72
+ fee_bps: number;
73
+ fee_usd: number;
74
+ estimated_gas_usd: number;
75
+ route: string[];
76
+ min_output: number;
77
+ expires_in_seconds: number;
78
+ }
79
+ export interface DexQuotesData {
80
+ pair: string;
81
+ chain: string;
82
+ input_amount: number;
83
+ input_value_usd: number;
84
+ base_rate: number;
85
+ best_dex: string;
86
+ best_output: number;
87
+ savings_vs_worst: number;
88
+ quotes: DexQuote[];
89
+ recommendation: {
90
+ dex: string;
91
+ reason: string;
92
+ output: number;
93
+ total_cost_usd: number;
94
+ };
95
+ }
96
+ export interface DexQuotesQuery {
97
+ from?: string;
98
+ to?: string;
99
+ amount?: number;
100
+ chain?: string;
101
+ }
102
+ export interface TokenScanData {
103
+ address: string;
104
+ name: string;
105
+ symbol: string;
106
+ decimals: number;
107
+ chain: string;
108
+ deployer: string;
109
+ deploy_date: string;
110
+ total_supply: number;
111
+ holder_count: number;
112
+ is_verified: boolean;
113
+ has_proxy: boolean;
114
+ has_mint_function: boolean;
115
+ liquidity_locked: boolean;
116
+ honeypot_risk: boolean;
117
+ buy_tax: number;
118
+ sell_tax: number;
119
+ liquidity_usd: number;
120
+ market_cap_usd: number;
121
+ price_usd: number;
122
+ risk_score: number;
123
+ risk_level: 'LOW' | 'MEDIUM' | 'HIGH' | 'CRITICAL';
124
+ risk_flags: {
125
+ is_verified: boolean;
126
+ has_proxy: boolean;
127
+ has_mint_function: boolean;
128
+ liquidity_locked: boolean;
129
+ honeypot_risk: boolean;
130
+ high_buy_tax: boolean;
131
+ high_sell_tax: boolean;
132
+ };
133
+ age_days: number;
134
+ }
135
+ export interface TokenScanQuery {
136
+ token?: string;
137
+ chain?: string;
138
+ }
139
+ export interface WhaleHolder {
140
+ rank: number;
141
+ address: string;
142
+ label: string;
143
+ wallet_type: string;
144
+ balance: number;
145
+ percentage: number;
146
+ last_active: string;
147
+ is_contract: boolean;
148
+ }
149
+ export interface WhaleTransfer {
150
+ tx_hash: string;
151
+ from: string;
152
+ to: string;
153
+ amount: number;
154
+ usd_value: number;
155
+ timestamp: string;
156
+ transfer_type: string;
157
+ }
158
+ export interface WhaleTrackerData {
159
+ token: string;
160
+ chain: string;
161
+ total_supply: number;
162
+ circulating_supply: number;
163
+ holder_count: number;
164
+ concentration_metrics: {
165
+ top_1_pct: number;
166
+ top_10_pct: number;
167
+ top_20_pct: number;
168
+ gini_coefficient: number;
169
+ herfindahl_index: number;
170
+ };
171
+ distribution_buckets: Array<{
172
+ label: string;
173
+ holder_pct: number;
174
+ supply_pct: number;
175
+ }>;
176
+ top_holders: WhaleHolder[];
177
+ recent_large_transfers: WhaleTransfer[];
178
+ }
179
+ export interface WhaleTrackerQuery {
180
+ token?: string;
181
+ chain?: string;
182
+ }
183
+ export interface YieldPool {
184
+ protocol: string;
185
+ asset: string;
186
+ chain: string;
187
+ apy: number;
188
+ tvl: number;
189
+ risk_tier: 'low' | 'medium' | 'high';
190
+ type: string;
191
+ updated_at: string;
192
+ }
193
+ export interface YieldScannerQuery {
194
+ chain?: string;
195
+ min_tvl?: number;
196
+ asset?: string;
197
+ limit?: number;
198
+ }
199
+ export interface FundingRateEntry {
200
+ funding_rate: number;
201
+ annualized_pct: number;
202
+ predicted_rate: number;
203
+ open_interest_usd: number;
204
+ next_funding_in_ms: number;
205
+ last_updated: string;
206
+ }
207
+ export interface ArbOpportunity {
208
+ asset: string;
209
+ long_venue: string;
210
+ long_rate: number;
211
+ short_venue: string;
212
+ short_rate: number;
213
+ spread_bps: number;
214
+ annualized_arb_pct: number;
215
+ signal: 'STRONG' | 'MODERATE' | 'WEAK';
216
+ note: string;
217
+ }
218
+ export interface FundingRatesData {
219
+ [asset: string]: {
220
+ [protocol: string]: FundingRateEntry;
221
+ };
222
+ }
223
+ export interface FundingRatesQuery {
224
+ asset?: string;
225
+ min_spread?: number;
226
+ }
227
+ export interface WalletHolding {
228
+ token: string;
229
+ chain: string;
230
+ balance: number;
231
+ price_usd: number;
232
+ value_usd: number;
233
+ portfolio_pct: number;
234
+ }
235
+ export interface DefiPosition {
236
+ protocol: string;
237
+ type: string;
238
+ asset: string;
239
+ chain: string;
240
+ value_usd: number;
241
+ apy: number;
242
+ }
243
+ export interface WalletProfileData {
244
+ address: string;
245
+ label: string | null;
246
+ wallet_type: string;
247
+ chains_active: string[];
248
+ total_value_usd: number;
249
+ defi_value_usd: number;
250
+ portfolio: {
251
+ top_holdings: WalletHolding[];
252
+ allocation: {
253
+ native_tokens_pct: number;
254
+ stablecoins_pct: number;
255
+ defi_tokens_pct: number;
256
+ };
257
+ };
258
+ defi_positions: DefiPosition[];
259
+ activity: {
260
+ total_transactions: number;
261
+ first_seen: string;
262
+ last_active: string;
263
+ age_days: number;
264
+ avg_tx_per_day: number;
265
+ nft_count: number;
266
+ };
267
+ risk_profile: {
268
+ classification: 'conservative' | 'moderate' | 'aggressive';
269
+ stablecoin_ratio: number;
270
+ diversification_score: number;
271
+ defi_exposure_pct: number;
272
+ is_contract: boolean;
273
+ is_multisig: boolean;
274
+ };
275
+ }
276
+ export interface WalletProfilerQuery {
277
+ address?: string;
278
+ chain?: string;
279
+ }
280
+ //# sourceMappingURL=types.d.ts.map