@coinbase/agentkit 0.10.2 → 0.10.4
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 +89 -10
- package/dist/action-providers/across/acrossActionProvider.js +2 -4
- package/dist/action-providers/across/acrossActionProvider.test.js +10 -5
- package/dist/action-providers/baseAccount/baseAccountActionProvider.js +5 -7
- package/dist/action-providers/cdp/cdpApiActionProvider.js +7 -30
- package/dist/action-providers/cdp/cdpApiActionProvider.test.js +2 -8
- package/dist/action-providers/cdp/faucetUtils.d.ts +38 -0
- package/dist/action-providers/cdp/faucetUtils.js +81 -0
- package/dist/action-providers/clanker/schemas.d.ts +4 -4
- package/dist/action-providers/clanker/utils.d.ts +2 -1
- package/dist/action-providers/clanker/utils.js +2 -2
- package/dist/action-providers/enso/constants.d.ts +4 -0
- package/dist/action-providers/enso/constants.js +10 -0
- package/dist/action-providers/enso/ensoActionProvider.d.ts +34 -0
- package/dist/action-providers/enso/ensoActionProvider.js +125 -0
- package/dist/action-providers/enso/ensoActionProvider.test.d.ts +1 -0
- package/dist/action-providers/enso/ensoActionProvider.test.js +141 -0
- package/dist/action-providers/enso/index.d.ts +1 -0
- package/dist/action-providers/enso/index.js +17 -0
- package/dist/action-providers/enso/schemas.d.ts +23 -0
- package/dist/action-providers/enso/schemas.js +22 -0
- package/dist/action-providers/erc20/constants.d.ts +2 -0
- package/dist/action-providers/erc20/constants.js +2 -0
- package/dist/action-providers/erc20/erc20ActionProvider.d.ts +17 -1
- package/dist/action-providers/erc20/erc20ActionProvider.js +103 -1
- package/dist/action-providers/erc20/erc20ActionProvider.test.js +201 -0
- package/dist/action-providers/erc20/schemas.d.ts +29 -0
- package/dist/action-providers/erc20/schemas.js +34 -1
- package/dist/action-providers/index.d.ts +4 -1
- package/dist/action-providers/index.js +4 -1
- package/dist/action-providers/jupiter/jupiterActionProvider.js +2 -2
- package/dist/action-providers/spl/splActionProvider.js +12 -13
- package/dist/action-providers/superfluid/graphQueries/superfluidGraphQueries.js +2 -2
- package/dist/action-providers/sushi/constants.d.ts +35 -0
- package/dist/action-providers/sushi/constants.js +7 -0
- package/dist/action-providers/sushi/index.d.ts +4 -0
- package/dist/action-providers/sushi/index.js +20 -0
- package/dist/action-providers/sushi/sushiDataActionProvider.d.ts +32 -0
- package/dist/action-providers/sushi/sushiDataActionProvider.js +113 -0
- package/dist/action-providers/sushi/sushiDataSchemas.d.ts +11 -0
- package/dist/action-providers/sushi/sushiDataSchemas.js +16 -0
- package/dist/action-providers/sushi/sushiRouterActionProvider.d.ts +40 -0
- package/dist/action-providers/sushi/sushiRouterActionProvider.js +386 -0
- package/dist/action-providers/sushi/sushiRouterActionProvider.test.d.ts +1 -0
- package/dist/action-providers/sushi/sushiRouterActionProvider.test.js +392 -0
- package/dist/action-providers/sushi/sushiRouterSchemas.d.ts +36 -0
- package/dist/action-providers/sushi/sushiRouterSchemas.js +55 -0
- package/dist/action-providers/vaultsfyi/constants.d.ts +8 -12
- package/dist/action-providers/vaultsfyi/constants.js +47 -13
- package/dist/action-providers/vaultsfyi/schemas.d.ts +120 -65
- package/dist/action-providers/vaultsfyi/schemas.js +72 -38
- package/dist/action-providers/vaultsfyi/sdk.d.ts +8 -0
- package/dist/action-providers/vaultsfyi/sdk.js +15 -0
- package/dist/action-providers/vaultsfyi/utils.d.ts +151 -55
- package/dist/action-providers/vaultsfyi/utils.js +29 -75
- package/dist/action-providers/vaultsfyi/vaultsfyiActionProvider.d.ts +55 -16
- package/dist/action-providers/vaultsfyi/vaultsfyiActionProvider.js +413 -217
- package/dist/action-providers/vaultsfyi/vaultsfyiActionProvider.test.js +509 -316
- package/dist/action-providers/wallet/walletActionProvider.js +1 -1
- package/dist/action-providers/weth/constants.d.ts +0 -1
- package/dist/action-providers/weth/constants.js +1 -2
- package/dist/action-providers/weth/schemas.js +6 -2
- package/dist/action-providers/weth/wethActionProvider.d.ts +7 -0
- package/dist/action-providers/weth/wethActionProvider.js +57 -32
- package/dist/action-providers/weth/wethActionProvider.test.js +60 -11
- package/dist/action-providers/x402/constants.d.ts +67 -0
- package/dist/action-providers/x402/constants.js +37 -0
- package/dist/action-providers/x402/schemas.d.ts +45 -5
- package/dist/action-providers/x402/schemas.js +81 -11
- package/dist/action-providers/x402/utils.d.ts +89 -14
- package/dist/action-providers/x402/utils.js +335 -31
- package/dist/action-providers/x402/x402ActionProvider.d.ts +21 -7
- package/dist/action-providers/x402/x402ActionProvider.js +250 -184
- package/dist/action-providers/x402/x402ActionProvider.test.js +240 -236
- package/dist/action-providers/yelay/constants.d.ts +64 -0
- package/dist/action-providers/yelay/constants.js +137 -0
- package/dist/action-providers/yelay/index.d.ts +2 -0
- package/dist/action-providers/yelay/index.js +18 -0
- package/dist/action-providers/yelay/schemas.d.ts +47 -0
- package/dist/action-providers/yelay/schemas.js +59 -0
- package/dist/action-providers/yelay/types.d.ts +24 -0
- package/dist/action-providers/yelay/yelayActionProvider.d.ts +70 -0
- package/dist/action-providers/yelay/yelayActionProvider.js +329 -0
- package/dist/action-providers/yelay/yelayActionProvider.test.d.ts +1 -0
- package/dist/action-providers/yelay/yelayActionProvider.test.js +302 -0
- package/dist/action-providers/zora/zoraActionProvider.js +4 -5
- package/dist/wallet-providers/cdpSmartWalletProvider.js +1 -3
- package/dist/wallet-providers/cdpSolanaWalletProvider.d.ts +14 -0
- package/dist/wallet-providers/cdpSolanaWalletProvider.js +39 -3
- package/dist/wallet-providers/cdpSolanaWalletProvider.test.js +16 -0
- package/dist/wallet-providers/privySvmWalletProvider.d.ts +14 -0
- package/dist/wallet-providers/privySvmWalletProvider.js +17 -0
- package/dist/wallet-providers/privySvmWalletProvider.test.js +10 -0
- package/dist/wallet-providers/solanaKeypairWalletProvider.d.ts +14 -0
- package/dist/wallet-providers/solanaKeypairWalletProvider.js +17 -0
- package/dist/wallet-providers/svmWalletProvider.d.ts +34 -0
- package/dist/wallet-providers/svmWalletProvider.js +43 -0
- package/dist/wallet-providers/svmWalletProvider.test.js +10 -0
- package/package.json +11 -6
- package/dist/action-providers/vaultsfyi/api/actions.d.ts +0 -41
- package/dist/action-providers/vaultsfyi/api/actions.js +0 -28
- package/dist/action-providers/vaultsfyi/api/historicalData.d.ts +0 -31
- package/dist/action-providers/vaultsfyi/api/historicalData.js +0 -44
- package/dist/action-providers/vaultsfyi/api/types.d.ts +0 -34
- package/dist/action-providers/vaultsfyi/api/vaults.d.ts +0 -66
- package/dist/action-providers/vaultsfyi/api/vaults.js +0 -57
- /package/dist/action-providers/{vaultsfyi/api → yelay}/types.js +0 -0
|
@@ -1,51 +1,308 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.getX402Networks = getX402Networks;
|
|
4
|
+
exports.getNetworkId = getNetworkId;
|
|
5
|
+
exports.fetchAllDiscoveryResources = fetchAllDiscoveryResources;
|
|
6
|
+
exports.filterByNetwork = filterByNetwork;
|
|
7
|
+
exports.filterByDescription = filterByDescription;
|
|
8
|
+
exports.filterByX402Version = filterByX402Version;
|
|
9
|
+
exports.filterByKeyword = filterByKeyword;
|
|
10
|
+
exports.filterByMaxPrice = filterByMaxPrice;
|
|
11
|
+
exports.formatSimplifiedResources = formatSimplifiedResources;
|
|
4
12
|
exports.handleHttpError = handleHttpError;
|
|
5
13
|
exports.formatPaymentOption = formatPaymentOption;
|
|
6
14
|
exports.isUsdcAsset = isUsdcAsset;
|
|
7
15
|
exports.convertWholeUnitsToAtomic = convertWholeUnitsToAtomic;
|
|
16
|
+
exports.buildUrlWithParams = buildUrlWithParams;
|
|
8
17
|
const utils_1 = require("../erc20/utils");
|
|
9
18
|
const constants_1 = require("../erc20/constants");
|
|
10
19
|
const viem_1 = require("viem");
|
|
20
|
+
const wallet_providers_1 = require("../../wallet-providers");
|
|
21
|
+
const constants_2 = require("./constants");
|
|
11
22
|
/**
|
|
12
|
-
*
|
|
23
|
+
* Returns array of matching network identifiers (both v1 and v2 CAIP-2 formats).
|
|
24
|
+
* Used for filtering discovery results that may contain either format.
|
|
13
25
|
*
|
|
14
|
-
* @param network - The network
|
|
15
|
-
* @returns
|
|
16
|
-
* @throws Error if the network is not supported
|
|
26
|
+
* @param network - The network object
|
|
27
|
+
* @returns Array of network identifiers that match the wallet's network
|
|
17
28
|
*/
|
|
18
|
-
function
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
case "base-sepolia":
|
|
23
|
-
return "base-sepolia";
|
|
24
|
-
case "solana-mainnet":
|
|
25
|
-
return "solana";
|
|
26
|
-
case "solana-devnet":
|
|
27
|
-
return "solana-devnet";
|
|
28
|
-
default:
|
|
29
|
-
return network.networkId;
|
|
29
|
+
function getX402Networks(network) {
|
|
30
|
+
const networkId = network.networkId;
|
|
31
|
+
if (!networkId) {
|
|
32
|
+
return [];
|
|
30
33
|
}
|
|
34
|
+
return constants_2.NETWORK_MAPPINGS[networkId] ?? [networkId];
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Gets network ID from a CAIP-2 or v1 network identifier.
|
|
38
|
+
*
|
|
39
|
+
* @param network - The x402 network identifier (e.g., "eip155:8453" for v2 or "base" for v1)
|
|
40
|
+
* @returns The network ID (e.g., "base-mainnet") or the original if not found
|
|
41
|
+
*/
|
|
42
|
+
function getNetworkId(network) {
|
|
43
|
+
for (const [agentKitId, formats] of Object.entries(constants_2.NETWORK_MAPPINGS)) {
|
|
44
|
+
if (formats.includes(network)) {
|
|
45
|
+
return agentKitId;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return network;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Fetches a URL with retry logic and exponential backoff for rate limiting.
|
|
52
|
+
*
|
|
53
|
+
* @param url - The URL to fetch
|
|
54
|
+
* @param maxRetries - Maximum number of retries (default 3)
|
|
55
|
+
* @param initialDelayMs - Initial delay in milliseconds (default 1000)
|
|
56
|
+
* @returns The fetch Response
|
|
57
|
+
*/
|
|
58
|
+
async function fetchWithRetry(url, maxRetries = 3, initialDelayMs = 1000) {
|
|
59
|
+
let lastError = null;
|
|
60
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
61
|
+
const response = await fetch(url);
|
|
62
|
+
if (response.ok) {
|
|
63
|
+
return response;
|
|
64
|
+
}
|
|
65
|
+
if (response.status === 429 && attempt < maxRetries) {
|
|
66
|
+
const delayMs = initialDelayMs * Math.pow(2, attempt);
|
|
67
|
+
await new Promise(resolve => setTimeout(resolve, delayMs));
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
lastError = new Error(`Discovery API error: ${response.status} ${response.statusText}`);
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
throw lastError ?? new Error("Failed to fetch after retries");
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Fetches all resources from the discovery API with pagination.
|
|
77
|
+
*
|
|
78
|
+
* @param discoveryUrl - The base URL for discovery
|
|
79
|
+
* @param pageSize - Number of resources per page (default 100)
|
|
80
|
+
* @returns Array of all discovered resources
|
|
81
|
+
*/
|
|
82
|
+
async function fetchAllDiscoveryResources(discoveryUrl, pageSize = 1000) {
|
|
83
|
+
const allResources = [];
|
|
84
|
+
let offset = 0;
|
|
85
|
+
let hasMore = true;
|
|
86
|
+
while (hasMore) {
|
|
87
|
+
const url = new URL(discoveryUrl);
|
|
88
|
+
url.searchParams.set("limit", pageSize.toString());
|
|
89
|
+
url.searchParams.set("offset", offset.toString());
|
|
90
|
+
const response = await fetchWithRetry(url.toString());
|
|
91
|
+
const data = await response.json();
|
|
92
|
+
const resources = data.resources ?? data.items ?? [];
|
|
93
|
+
if (resources.length === 0) {
|
|
94
|
+
hasMore = false;
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
allResources.push(...resources);
|
|
98
|
+
offset += resources.length;
|
|
99
|
+
// Stop when getting fewer resources than requested (last page)
|
|
100
|
+
if (resources.length < pageSize) {
|
|
101
|
+
hasMore = false;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return allResources;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Filters resources by network compatibility.
|
|
109
|
+
* Matches resources that accept any of the wallet's network identifiers (v1 or v2 format).
|
|
110
|
+
*
|
|
111
|
+
* @param resources - Array of discovery resources
|
|
112
|
+
* @param walletNetworks - Array of network identifiers to match
|
|
113
|
+
* @returns Filtered array of resources
|
|
114
|
+
*/
|
|
115
|
+
function filterByNetwork(resources, walletNetworks) {
|
|
116
|
+
return resources.filter(resource => {
|
|
117
|
+
const accepts = resource.accepts ?? [];
|
|
118
|
+
return accepts.some(option => walletNetworks.includes(option.network));
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Extracts description from a resource based on its x402 version.
|
|
123
|
+
* - v1: description is in accepts[].description
|
|
124
|
+
* - v2: description is in metadata.description
|
|
125
|
+
*
|
|
126
|
+
* @param resource - The discovery resource
|
|
127
|
+
* @returns The description string or empty string if not found
|
|
128
|
+
*/
|
|
129
|
+
function getResourceDescription(resource) {
|
|
130
|
+
if (resource.x402Version === 2) {
|
|
131
|
+
const metadataDesc = resource.metadata?.description;
|
|
132
|
+
return typeof metadataDesc === "string" ? metadataDesc : "";
|
|
133
|
+
}
|
|
134
|
+
// v1: look in accepts[].description
|
|
135
|
+
const accepts = resource.accepts ?? [];
|
|
136
|
+
for (const option of accepts) {
|
|
137
|
+
if (option.description?.trim()) {
|
|
138
|
+
return option.description;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return "";
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Filters resources by having a valid description.
|
|
145
|
+
* Removes resources with empty or default descriptions.
|
|
146
|
+
* Supports both v1 (accepts[].description) and v2 (metadata.description) formats.
|
|
147
|
+
*
|
|
148
|
+
* @param resources - Array of discovery resources
|
|
149
|
+
* @returns Filtered array of resources with valid descriptions
|
|
150
|
+
*/
|
|
151
|
+
function filterByDescription(resources) {
|
|
152
|
+
return resources.filter(resource => {
|
|
153
|
+
const desc = getResourceDescription(resource).trim();
|
|
154
|
+
return desc && desc !== "" && desc !== "Access to protected content";
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Filters resources by x402 protocol version.
|
|
159
|
+
* Uses the x402Version field on the resource.
|
|
160
|
+
*
|
|
161
|
+
* @param resources - Array of discovery resources
|
|
162
|
+
* @param allowedVersions - Array of allowed versions (default: [1, 2])
|
|
163
|
+
* @returns Filtered array of resources matching the allowed versions
|
|
164
|
+
*/
|
|
165
|
+
function filterByX402Version(resources, allowedVersions = [1, 2]) {
|
|
166
|
+
return resources.filter(resource => {
|
|
167
|
+
const version = resource.x402Version;
|
|
168
|
+
if (version === undefined) {
|
|
169
|
+
return true; // Include resources without version info
|
|
170
|
+
}
|
|
171
|
+
return allowedVersions.includes(version);
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Filters resources by keyword appearing in description or URL.
|
|
176
|
+
* Case-insensitive search.
|
|
177
|
+
* Supports both v1 (accepts[].description) and v2 (metadata.description) formats.
|
|
178
|
+
*
|
|
179
|
+
* @param resources - Array of discovery resources
|
|
180
|
+
* @param keyword - The keyword to search for in descriptions and URLs
|
|
181
|
+
* @returns Filtered array of resources with matching descriptions or URLs
|
|
182
|
+
*/
|
|
183
|
+
function filterByKeyword(resources, keyword) {
|
|
184
|
+
const lowerKeyword = keyword.toLowerCase();
|
|
185
|
+
return resources.filter(resource => {
|
|
186
|
+
// Check description (version-aware)
|
|
187
|
+
const desc = getResourceDescription(resource).toLowerCase();
|
|
188
|
+
if (desc.includes(lowerKeyword)) {
|
|
189
|
+
return true;
|
|
190
|
+
}
|
|
191
|
+
// Also check the URL for keyword matches
|
|
192
|
+
const url = (resource.resource ?? resource.url ?? "").toLowerCase();
|
|
193
|
+
if (url.includes(lowerKeyword)) {
|
|
194
|
+
return true;
|
|
195
|
+
}
|
|
196
|
+
return false;
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Filters resources by maximum USDC price.
|
|
201
|
+
*
|
|
202
|
+
* @param resources - Array of discovery resources
|
|
203
|
+
* @param maxUsdcPrice - Maximum price in whole USDC units
|
|
204
|
+
* @param walletProvider - Wallet provider for asset identification
|
|
205
|
+
* @param walletNetworks - Array of network identifiers to match
|
|
206
|
+
* @returns Filtered array of resources within price limit
|
|
207
|
+
*/
|
|
208
|
+
async function filterByMaxPrice(resources, maxUsdcPrice, walletProvider, walletNetworks) {
|
|
209
|
+
const filtered = [];
|
|
210
|
+
for (const resource of resources) {
|
|
211
|
+
const accepts = resource.accepts ?? [];
|
|
212
|
+
let shouldInclude = false;
|
|
213
|
+
for (const option of accepts) {
|
|
214
|
+
if (!walletNetworks.includes(option.network)) {
|
|
215
|
+
continue;
|
|
216
|
+
}
|
|
217
|
+
if (!option.asset) {
|
|
218
|
+
continue;
|
|
219
|
+
}
|
|
220
|
+
// Check if this is a USDC asset
|
|
221
|
+
if (!isUsdcAsset(option.asset, walletProvider)) {
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
// Get the amount (supports both v1 maxAmountRequired and v2 amount/price)
|
|
225
|
+
const amountStr = option.maxAmountRequired ?? option.amount ?? option.price;
|
|
226
|
+
if (!amountStr) {
|
|
227
|
+
continue;
|
|
228
|
+
}
|
|
229
|
+
try {
|
|
230
|
+
const maxUsdcPriceAtomic = await convertWholeUnitsToAtomic(maxUsdcPrice, option.asset, walletProvider);
|
|
231
|
+
if (maxUsdcPriceAtomic) {
|
|
232
|
+
const resourceAmount = BigInt(amountStr);
|
|
233
|
+
const maxAmount = BigInt(maxUsdcPriceAtomic);
|
|
234
|
+
if (resourceAmount <= maxAmount) {
|
|
235
|
+
shouldInclude = true;
|
|
236
|
+
break;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
catch {
|
|
241
|
+
// Skip if conversion fails
|
|
242
|
+
continue;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
if (shouldInclude) {
|
|
246
|
+
filtered.push(resource);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
return filtered;
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Formats resources into simplified output for LLM consumption.
|
|
253
|
+
*
|
|
254
|
+
* @param resources - Array of discovery resources
|
|
255
|
+
* @param walletNetworks - Array of network identifiers to match for price extraction
|
|
256
|
+
* @param walletProvider - Wallet provider for formatting
|
|
257
|
+
* @returns Array of simplified resources with url, price, description
|
|
258
|
+
*/
|
|
259
|
+
async function formatSimplifiedResources(resources, walletNetworks, walletProvider) {
|
|
260
|
+
const simplified = [];
|
|
261
|
+
for (const resource of resources) {
|
|
262
|
+
const accepts = resource.accepts ?? [];
|
|
263
|
+
const matchingOption = accepts.find(opt => walletNetworks.includes(opt.network));
|
|
264
|
+
if (!matchingOption) {
|
|
265
|
+
continue;
|
|
266
|
+
}
|
|
267
|
+
// Extract URL: v1 and v2 both use resource.resource, but v2 docs show resource.url
|
|
268
|
+
const url = resource.resource ?? resource.url ?? "";
|
|
269
|
+
// Extract description (version-aware via helper)
|
|
270
|
+
const description = getResourceDescription(resource);
|
|
271
|
+
let price = "Unknown";
|
|
272
|
+
// Get the amount (supports both v1 and v2 formats)
|
|
273
|
+
const amountStr = matchingOption.maxAmountRequired ?? matchingOption.amount ?? matchingOption.price;
|
|
274
|
+
if (amountStr && matchingOption.asset) {
|
|
275
|
+
price = await formatPaymentOption({
|
|
276
|
+
asset: matchingOption.asset,
|
|
277
|
+
maxAmountRequired: amountStr,
|
|
278
|
+
network: matchingOption.network,
|
|
279
|
+
}, walletProvider);
|
|
280
|
+
}
|
|
281
|
+
simplified.push({
|
|
282
|
+
url,
|
|
283
|
+
price,
|
|
284
|
+
description,
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
return simplified;
|
|
31
288
|
}
|
|
32
289
|
/**
|
|
33
290
|
* Helper method to handle HTTP errors consistently.
|
|
34
291
|
*
|
|
35
|
-
* @param error - The
|
|
292
|
+
* @param error - The error to handle
|
|
36
293
|
* @param url - The URL that was being accessed when the error occurred
|
|
37
294
|
* @returns A JSON string containing formatted error details
|
|
38
295
|
*/
|
|
39
296
|
function handleHttpError(error, url) {
|
|
40
|
-
if (error
|
|
297
|
+
if (error instanceof Response) {
|
|
41
298
|
return JSON.stringify({
|
|
42
299
|
error: true,
|
|
43
|
-
message: `HTTP ${error.
|
|
44
|
-
details: error.
|
|
300
|
+
message: `HTTP ${error.status} error when accessing ${url}`,
|
|
301
|
+
details: error.statusText,
|
|
45
302
|
suggestion: "Check if the URL is correct and the API is available.",
|
|
46
303
|
}, null, 2);
|
|
47
304
|
}
|
|
48
|
-
if (error.
|
|
305
|
+
if (error instanceof TypeError && error.message.includes("fetch")) {
|
|
49
306
|
return JSON.stringify({
|
|
50
307
|
error: true,
|
|
51
308
|
message: `Network error when accessing ${url}`,
|
|
@@ -53,10 +310,11 @@ function handleHttpError(error, url) {
|
|
|
53
310
|
suggestion: "Check your internet connection and verify the API endpoint is accessible.",
|
|
54
311
|
}, null, 2);
|
|
55
312
|
}
|
|
313
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
56
314
|
return JSON.stringify({
|
|
57
315
|
error: true,
|
|
58
316
|
message: `Error making request to ${url}`,
|
|
59
|
-
details:
|
|
317
|
+
details: message,
|
|
60
318
|
suggestion: "Please check the request parameters and try again.",
|
|
61
319
|
}, null, 2);
|
|
62
320
|
}
|
|
@@ -75,7 +333,8 @@ async function formatPaymentOption(option, walletProvider) {
|
|
|
75
333
|
// Check if this is an EVM network and we can use ERC20 helpers
|
|
76
334
|
const walletNetwork = walletProvider.getNetwork();
|
|
77
335
|
const isEvmNetwork = walletNetwork.protocolFamily === "evm";
|
|
78
|
-
|
|
336
|
+
const isSvmNetwork = walletNetwork.protocolFamily === "svm";
|
|
337
|
+
if (isEvmNetwork && walletProvider instanceof wallet_providers_1.EvmWalletProvider) {
|
|
79
338
|
const networkId = walletNetwork.networkId;
|
|
80
339
|
const tokenSymbols = constants_1.TOKEN_ADDRESSES_BY_SYMBOLS[networkId];
|
|
81
340
|
if (tokenSymbols) {
|
|
@@ -83,7 +342,7 @@ async function formatPaymentOption(option, walletProvider) {
|
|
|
83
342
|
if (asset.toLowerCase() === address.toLowerCase()) {
|
|
84
343
|
const decimals = symbol === "USDC" || symbol === "EURC" ? 6 : 18;
|
|
85
344
|
const formattedAmount = (0, viem_1.formatUnits)(BigInt(maxAmountRequired), decimals);
|
|
86
|
-
return `${formattedAmount} ${symbol} on ${network}
|
|
345
|
+
return `${formattedAmount} ${symbol} on ${getNetworkId(network)}`;
|
|
87
346
|
}
|
|
88
347
|
}
|
|
89
348
|
}
|
|
@@ -92,15 +351,25 @@ async function formatPaymentOption(option, walletProvider) {
|
|
|
92
351
|
const tokenDetails = await (0, utils_1.getTokenDetails)(walletProvider, asset);
|
|
93
352
|
if (tokenDetails) {
|
|
94
353
|
const formattedAmount = (0, viem_1.formatUnits)(BigInt(maxAmountRequired), tokenDetails.decimals);
|
|
95
|
-
return `${formattedAmount} ${tokenDetails.name} on ${network}
|
|
354
|
+
return `${formattedAmount} ${tokenDetails.name} on ${getNetworkId(network)}`;
|
|
96
355
|
}
|
|
97
356
|
}
|
|
98
357
|
catch {
|
|
99
358
|
// If we can't get token details, fall back to raw format
|
|
100
359
|
}
|
|
101
360
|
}
|
|
102
|
-
|
|
103
|
-
|
|
361
|
+
if (isSvmNetwork && walletProvider instanceof wallet_providers_1.SvmWalletProvider) {
|
|
362
|
+
// Check if the asset is USDC on Solana networks
|
|
363
|
+
const networkId = walletNetwork.networkId;
|
|
364
|
+
const usdcAddress = constants_2.SOLANA_USDC_ADDRESSES[networkId];
|
|
365
|
+
if (usdcAddress && asset === usdcAddress) {
|
|
366
|
+
// USDC has 6 decimals on Solana
|
|
367
|
+
const formattedAmount = (0, viem_1.formatUnits)(BigInt(maxAmountRequired), 6);
|
|
368
|
+
return `${formattedAmount} USDC on ${getNetworkId(network)}`;
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
// Fallback to original format for non-EVM/SVM networks or when token details can't be fetched
|
|
372
|
+
return `${asset} ${maxAmountRequired} on ${getNetworkId(network)}`;
|
|
104
373
|
}
|
|
105
374
|
/**
|
|
106
375
|
* Checks if an asset is USDC on any supported network.
|
|
@@ -112,13 +381,21 @@ async function formatPaymentOption(option, walletProvider) {
|
|
|
112
381
|
function isUsdcAsset(asset, walletProvider) {
|
|
113
382
|
const walletNetwork = walletProvider.getNetwork();
|
|
114
383
|
const isEvmNetwork = walletNetwork.protocolFamily === "evm";
|
|
115
|
-
|
|
384
|
+
const isSvmNetwork = walletNetwork.protocolFamily === "svm";
|
|
385
|
+
if (isEvmNetwork && walletProvider instanceof wallet_providers_1.EvmWalletProvider) {
|
|
116
386
|
const networkId = walletNetwork.networkId;
|
|
117
387
|
const tokenSymbols = constants_1.TOKEN_ADDRESSES_BY_SYMBOLS[networkId];
|
|
118
388
|
if (tokenSymbols && tokenSymbols.USDC) {
|
|
119
389
|
return asset.toLowerCase() === tokenSymbols.USDC.toLowerCase();
|
|
120
390
|
}
|
|
121
391
|
}
|
|
392
|
+
if (isSvmNetwork && walletProvider instanceof wallet_providers_1.SvmWalletProvider) {
|
|
393
|
+
const networkId = walletNetwork.networkId;
|
|
394
|
+
const usdcAddress = constants_2.SOLANA_USDC_ADDRESSES[networkId];
|
|
395
|
+
if (usdcAddress) {
|
|
396
|
+
return asset === usdcAddress;
|
|
397
|
+
}
|
|
398
|
+
}
|
|
122
399
|
return false;
|
|
123
400
|
}
|
|
124
401
|
/**
|
|
@@ -133,7 +410,8 @@ async function convertWholeUnitsToAtomic(wholeUnits, asset, walletProvider) {
|
|
|
133
410
|
// Check if this is an EVM network and we can use ERC20 helpers
|
|
134
411
|
const walletNetwork = walletProvider.getNetwork();
|
|
135
412
|
const isEvmNetwork = walletNetwork.protocolFamily === "evm";
|
|
136
|
-
|
|
413
|
+
const isSvmNetwork = walletNetwork.protocolFamily === "svm";
|
|
414
|
+
if (isEvmNetwork && walletProvider instanceof wallet_providers_1.EvmWalletProvider) {
|
|
137
415
|
const networkId = walletNetwork.networkId;
|
|
138
416
|
const tokenSymbols = constants_1.TOKEN_ADDRESSES_BY_SYMBOLS[networkId];
|
|
139
417
|
if (tokenSymbols) {
|
|
@@ -155,6 +433,32 @@ async function convertWholeUnitsToAtomic(wholeUnits, asset, walletProvider) {
|
|
|
155
433
|
// If we can't get token details, fall back to assuming 18 decimals
|
|
156
434
|
}
|
|
157
435
|
}
|
|
158
|
-
|
|
436
|
+
if (isSvmNetwork && walletProvider instanceof wallet_providers_1.SvmWalletProvider) {
|
|
437
|
+
// Check if the asset is USDC on Solana networks
|
|
438
|
+
const networkId = walletNetwork.networkId;
|
|
439
|
+
const usdcAddress = constants_2.SOLANA_USDC_ADDRESSES[networkId];
|
|
440
|
+
if (usdcAddress && asset === usdcAddress) {
|
|
441
|
+
// USDC has 6 decimals on Solana
|
|
442
|
+
return (0, viem_1.parseUnits)(wholeUnits.toString(), 6).toString();
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
// Fallback to 18 decimals for unknown tokens or non-EVM/SVM networks
|
|
159
446
|
return (0, viem_1.parseUnits)(wholeUnits.toString(), 18).toString();
|
|
160
447
|
}
|
|
448
|
+
/**
|
|
449
|
+
* Builds a URL with query parameters appended.
|
|
450
|
+
*
|
|
451
|
+
* @param baseUrl - The base URL
|
|
452
|
+
* @param queryParams - Optional query parameters to append
|
|
453
|
+
* @returns URL string with query parameters
|
|
454
|
+
*/
|
|
455
|
+
function buildUrlWithParams(baseUrl, queryParams) {
|
|
456
|
+
if (!queryParams || Object.keys(queryParams).length === 0) {
|
|
457
|
+
return baseUrl;
|
|
458
|
+
}
|
|
459
|
+
const url = new URL(baseUrl);
|
|
460
|
+
Object.entries(queryParams).forEach(([key, value]) => {
|
|
461
|
+
url.searchParams.append(key, value);
|
|
462
|
+
});
|
|
463
|
+
return url.toString();
|
|
464
|
+
}
|
|
@@ -2,11 +2,11 @@ import { z } from "zod";
|
|
|
2
2
|
import { ActionProvider } from "../actionProvider";
|
|
3
3
|
import { Network } from "../../network";
|
|
4
4
|
import { HttpRequestSchema, RetryWithX402Schema, DirectX402RequestSchema, ListX402ServicesSchema } from "./schemas";
|
|
5
|
-
import {
|
|
5
|
+
import { WalletProvider } from "../../wallet-providers";
|
|
6
6
|
/**
|
|
7
7
|
* X402ActionProvider provides actions for making HTTP requests, with optional x402 payment handling.
|
|
8
8
|
*/
|
|
9
|
-
export declare class X402ActionProvider extends ActionProvider<
|
|
9
|
+
export declare class X402ActionProvider extends ActionProvider<WalletProvider> {
|
|
10
10
|
/**
|
|
11
11
|
* Creates a new instance of X402ActionProvider.
|
|
12
12
|
* Initializes the provider with x402 capabilities.
|
|
@@ -16,10 +16,10 @@ export declare class X402ActionProvider extends ActionProvider<EvmWalletProvider
|
|
|
16
16
|
* Discovers available x402 services with optional filtering.
|
|
17
17
|
*
|
|
18
18
|
* @param walletProvider - The wallet provider to use for network filtering
|
|
19
|
-
* @param args - Optional filters: maxUsdcPrice
|
|
19
|
+
* @param args - Optional filters: discoveryUrl, maxUsdcPrice
|
|
20
20
|
* @returns JSON string with the list of services (filtered by network and description)
|
|
21
21
|
*/
|
|
22
|
-
discoverX402Services(walletProvider:
|
|
22
|
+
discoverX402Services(walletProvider: WalletProvider, args: z.infer<typeof ListX402ServicesSchema>): Promise<string>;
|
|
23
23
|
/**
|
|
24
24
|
* Makes a basic HTTP request to an API endpoint.
|
|
25
25
|
*
|
|
@@ -27,7 +27,7 @@ export declare class X402ActionProvider extends ActionProvider<EvmWalletProvider
|
|
|
27
27
|
* @param args - The request parameters including URL, method, headers, and body
|
|
28
28
|
* @returns A JSON string containing the response or error details
|
|
29
29
|
*/
|
|
30
|
-
makeHttpRequest(walletProvider:
|
|
30
|
+
makeHttpRequest(walletProvider: WalletProvider, args: z.infer<typeof HttpRequestSchema>): Promise<string>;
|
|
31
31
|
/**
|
|
32
32
|
* Retries a request with x402 payment after receiving a 402 response.
|
|
33
33
|
*
|
|
@@ -35,7 +35,7 @@ export declare class X402ActionProvider extends ActionProvider<EvmWalletProvider
|
|
|
35
35
|
* @param args - The request parameters including URL, method, headers, body, and payment option
|
|
36
36
|
* @returns A JSON string containing the response with payment details or error information
|
|
37
37
|
*/
|
|
38
|
-
retryWithX402(walletProvider:
|
|
38
|
+
retryWithX402(walletProvider: WalletProvider, args: z.infer<typeof RetryWithX402Schema>): Promise<string>;
|
|
39
39
|
/**
|
|
40
40
|
* Makes an HTTP request with automatic x402 payment handling.
|
|
41
41
|
*
|
|
@@ -43,7 +43,7 @@ export declare class X402ActionProvider extends ActionProvider<EvmWalletProvider
|
|
|
43
43
|
* @param args - The request parameters including URL, method, headers, and body
|
|
44
44
|
* @returns A JSON string containing the response with optional payment details or error information
|
|
45
45
|
*/
|
|
46
|
-
makeHttpRequestWithX402(walletProvider:
|
|
46
|
+
makeHttpRequestWithX402(walletProvider: WalletProvider, args: z.infer<typeof DirectX402RequestSchema>): Promise<string>;
|
|
47
47
|
/**
|
|
48
48
|
* Checks if the action provider supports the given network.
|
|
49
49
|
*
|
|
@@ -51,5 +51,19 @@ export declare class X402ActionProvider extends ActionProvider<EvmWalletProvider
|
|
|
51
51
|
* @returns True if the network is supported, false otherwise
|
|
52
52
|
*/
|
|
53
53
|
supportsNetwork: (network: Network) => boolean;
|
|
54
|
+
/**
|
|
55
|
+
* Creates an x402 client configured for the given wallet provider.
|
|
56
|
+
*
|
|
57
|
+
* @param walletProvider - The wallet provider to configure the client for
|
|
58
|
+
* @returns Configured x402Client
|
|
59
|
+
*/
|
|
60
|
+
private createX402Client;
|
|
61
|
+
/**
|
|
62
|
+
* Parses response data based on content type.
|
|
63
|
+
*
|
|
64
|
+
* @param response - The fetch Response object
|
|
65
|
+
* @returns Parsed response data
|
|
66
|
+
*/
|
|
67
|
+
private parseResponseData;
|
|
54
68
|
}
|
|
55
69
|
export declare const x402ActionProvider: () => X402ActionProvider;
|