@coinbase/agentkit 0.10.0 → 0.10.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +195 -23
- package/dist/action-providers/across/acrossActionProvider.js +3 -3
- package/dist/action-providers/across/schemas.d.ts +1 -1
- package/dist/action-providers/baseAccount/baseAccountActionProvider.d.ts +46 -0
- package/dist/action-providers/baseAccount/baseAccountActionProvider.js +404 -0
- package/dist/action-providers/baseAccount/baseAccountActionProvider.test.d.ts +1 -0
- package/dist/action-providers/baseAccount/baseAccountActionProvider.test.js +325 -0
- package/dist/action-providers/baseAccount/index.d.ts +2 -0
- package/dist/action-providers/baseAccount/index.js +18 -0
- package/dist/action-providers/baseAccount/schemas.d.ts +43 -0
- package/dist/action-providers/baseAccount/schemas.js +62 -0
- package/dist/action-providers/baseAccount/types.d.ts +17 -0
- package/dist/action-providers/baseAccount/types.js +2 -0
- package/dist/action-providers/baseAccount/utils.d.ts +14 -0
- package/dist/action-providers/baseAccount/utils.js +57 -0
- package/dist/action-providers/cdp/cdpApiActionProvider.d.ts +3 -12
- package/dist/action-providers/cdp/cdpApiActionProvider.js +2 -81
- package/dist/action-providers/cdp/cdpApiActionProvider.test.js +0 -125
- package/dist/action-providers/cdp/cdpEvmWalletActionProvider.d.ts +18 -3
- package/dist/action-providers/cdp/cdpEvmWalletActionProvider.js +224 -23
- package/dist/action-providers/cdp/cdpEvmWalletActionProvider.test.js +280 -0
- package/dist/action-providers/cdp/cdpSmartWalletActionProvider.d.ts +17 -2
- package/dist/action-providers/cdp/cdpSmartWalletActionProvider.js +224 -18
- package/dist/action-providers/cdp/cdpSmartWalletActionProvider.test.js +267 -1
- package/dist/action-providers/cdp/schemas.d.ts +12 -12
- package/dist/action-providers/cdp/schemas.js +17 -5
- package/dist/action-providers/cdp/swapUtils.d.ts +23 -0
- package/dist/action-providers/cdp/swapUtils.js +106 -0
- package/dist/action-providers/clanker/clankerActionProvider.d.ts +43 -0
- package/dist/action-providers/clanker/clankerActionProvider.js +130 -0
- package/dist/action-providers/clanker/clankerActionProvider.test.d.ts +4 -0
- package/dist/action-providers/clanker/clankerActionProvider.test.js +119 -0
- package/dist/action-providers/clanker/index.d.ts +2 -0
- package/dist/action-providers/clanker/index.js +18 -0
- package/dist/action-providers/clanker/schemas.d.ts +56 -0
- package/dist/action-providers/clanker/schemas.js +47 -0
- package/dist/action-providers/clanker/utils.d.ts +9 -0
- package/dist/action-providers/clanker/utils.js +23 -0
- package/dist/action-providers/compound/constants.d.ts +1 -1
- package/dist/action-providers/compound/constants.js +2 -2
- package/dist/action-providers/erc20/constants.d.ts +35 -135
- package/dist/action-providers/erc20/constants.js +37 -189
- package/dist/action-providers/erc20/erc20ActionProvider.d.ts +9 -1
- package/dist/action-providers/erc20/erc20ActionProvider.js +87 -35
- package/dist/action-providers/erc20/erc20ActionProvider.test.js +115 -52
- package/dist/action-providers/erc20/schemas.d.ts +25 -12
- package/dist/action-providers/erc20/schemas.js +34 -6
- package/dist/action-providers/erc20/utils.d.ts +19 -0
- package/dist/action-providers/erc20/utils.js +54 -0
- package/dist/action-providers/flaunch/client_utils.d.ts +25 -0
- package/dist/action-providers/flaunch/client_utils.js +62 -0
- package/dist/action-providers/flaunch/constants.d.ts +42 -21
- package/dist/action-providers/flaunch/constants.js +113 -38
- package/dist/action-providers/flaunch/flaunchActionProvider.d.ts +4 -43
- package/dist/action-providers/flaunch/flaunchActionProvider.js +133 -209
- package/dist/action-providers/flaunch/flaunchActionProvider.test.js +113 -13
- package/dist/action-providers/flaunch/metadata_utils.d.ts +12 -0
- package/dist/action-providers/flaunch/metadata_utils.js +216 -0
- package/dist/action-providers/flaunch/schemas.d.ts +39 -3
- package/dist/action-providers/flaunch/schemas.js +62 -10
- package/dist/action-providers/flaunch/{utils.d.ts → swap_utils.d.ts} +17 -19
- package/dist/action-providers/flaunch/{utils.js → swap_utils.js} +137 -172
- package/dist/action-providers/index.d.ts +4 -0
- package/dist/action-providers/index.js +4 -0
- package/dist/action-providers/jupiter/schemas.d.ts +1 -1
- package/dist/action-providers/moonwell/schemas.d.ts +2 -2
- package/dist/action-providers/morpho/morphoActionProvider.js +5 -5
- package/dist/action-providers/morpho/schemas.d.ts +2 -2
- package/dist/action-providers/pyth/pythActionProvider.d.ts +2 -2
- package/dist/action-providers/pyth/pythActionProvider.js +83 -26
- package/dist/action-providers/pyth/pythActionProvider.test.js +179 -23
- package/dist/action-providers/pyth/schemas.d.ts +6 -0
- package/dist/action-providers/pyth/schemas.js +9 -1
- package/dist/action-providers/superfluid/constants.d.ts +814 -0
- package/dist/action-providers/superfluid/constants.js +2826 -0
- package/dist/action-providers/superfluid/graphQueries/endpoints.d.ts +2 -0
- package/dist/action-providers/superfluid/graphQueries/endpoints.js +5 -0
- package/dist/action-providers/superfluid/graphQueries/queries.d.ts +1 -0
- package/dist/action-providers/superfluid/graphQueries/queries.js +35 -0
- package/dist/action-providers/superfluid/graphQueries/superfluidGraphQueries.d.ts +8 -0
- package/dist/action-providers/superfluid/graphQueries/superfluidGraphQueries.js +24 -0
- package/dist/action-providers/superfluid/graphQueries/types.d.ts +27 -0
- package/dist/action-providers/superfluid/graphQueries/types.js +2 -0
- package/dist/action-providers/superfluid/index.d.ts +7 -0
- package/dist/action-providers/superfluid/index.js +23 -0
- package/dist/action-providers/superfluid/schemas.d.ts +86 -0
- package/dist/action-providers/superfluid/schemas.js +103 -0
- package/dist/action-providers/superfluid/superfluidActionProvider.d.ts +20 -0
- package/dist/action-providers/superfluid/superfluidActionProvider.js +36 -0
- package/dist/action-providers/superfluid/superfluidPoolActionProvider.d.ts +46 -0
- package/dist/action-providers/superfluid/superfluidPoolActionProvider.js +143 -0
- package/dist/action-providers/superfluid/superfluidPoolActionProvider.test.d.ts +1 -0
- package/dist/action-providers/superfluid/superfluidPoolActionProvider.test.js +92 -0
- package/dist/action-providers/superfluid/superfluidQueryActionProvider.d.ts +27 -0
- package/dist/action-providers/superfluid/superfluidQueryActionProvider.js +71 -0
- package/dist/action-providers/superfluid/superfluidQueryActionProvider.test.d.ts +1 -0
- package/dist/action-providers/superfluid/superfluidQueryActionProvider.test.js +57 -0
- package/dist/action-providers/superfluid/superfluidStreamActionProvider.d.ts +56 -0
- package/dist/action-providers/superfluid/superfluidStreamActionProvider.js +191 -0
- package/dist/action-providers/superfluid/superfluidStreamActionProvider.test.d.ts +1 -0
- package/dist/action-providers/superfluid/superfluidStreamActionProvider.test.js +80 -0
- package/dist/action-providers/superfluid/superfluidSuperTokenCreatorActionProvider.d.ts +30 -0
- package/dist/action-providers/superfluid/superfluidSuperTokenCreatorActionProvider.js +109 -0
- package/dist/action-providers/superfluid/superfluidSuperTokenCreatorActionProvider.test.d.ts +1 -0
- package/dist/action-providers/superfluid/superfluidSuperTokenCreatorActionProvider.test.js +75 -0
- package/dist/action-providers/superfluid/superfluidWrapperActionProvider.d.ts +32 -0
- package/dist/action-providers/superfluid/superfluidWrapperActionProvider.js +101 -0
- package/dist/action-providers/superfluid/superfluidWrapperActionProvider.test.d.ts +1 -0
- package/dist/action-providers/superfluid/superfluidWrapperActionProvider.test.js +85 -0
- package/dist/action-providers/superfluid/utils/parseLogs.d.ts +19 -0
- package/dist/action-providers/superfluid/utils/parseLogs.js +81 -0
- package/dist/action-providers/truemarkets/truemarketsActionProvider.d.ts +4 -16
- package/dist/action-providers/truemarkets/truemarketsActionProvider.js +20 -41
- package/dist/action-providers/truemarkets/truemarketsActionProvider.test.js +11 -33
- package/dist/action-providers/wallet/walletActionProvider.js +24 -10
- package/dist/action-providers/wallet/walletActionProvider.test.js +6 -2
- package/dist/action-providers/x402/schemas.d.ts +7 -0
- package/dist/action-providers/x402/schemas.js +11 -1
- package/dist/action-providers/x402/utils.d.ts +55 -0
- package/dist/action-providers/x402/utils.js +160 -0
- package/dist/action-providers/x402/x402ActionProvider.d.ts +9 -9
- package/dist/action-providers/x402/x402ActionProvider.js +158 -39
- package/dist/action-providers/x402/x402ActionProvider.test.js +116 -10
- package/dist/action-providers/zeroX/index.d.ts +1 -0
- package/dist/action-providers/zeroX/index.js +17 -0
- package/dist/action-providers/zeroX/schemas.d.ts +51 -0
- package/dist/action-providers/zeroX/schemas.js +82 -0
- package/dist/action-providers/zeroX/utils.d.ts +23 -0
- package/dist/action-providers/zeroX/utils.js +106 -0
- package/dist/action-providers/zeroX/zeroXActionProvider.d.ts +57 -0
- package/dist/action-providers/zeroX/zeroXActionProvider.js +407 -0
- package/dist/action-providers/zeroX/zeroXActionProvider.test.d.ts +1 -0
- package/dist/action-providers/zeroX/zeroXActionProvider.test.js +445 -0
- package/dist/utils.d.ts +10 -0
- package/dist/utils.js +43 -13
- package/dist/wallet-providers/cdpEvmWalletProvider.d.ts +27 -2
- package/dist/wallet-providers/cdpEvmWalletProvider.js +54 -36
- package/dist/wallet-providers/cdpEvmWalletProvider.test.js +7 -0
- package/dist/wallet-providers/cdpShared.d.ts +5 -0
- package/dist/wallet-providers/cdpSmartWalletProvider.d.ts +29 -3
- package/dist/wallet-providers/cdpSmartWalletProvider.js +66 -25
- package/dist/wallet-providers/cdpSmartWalletProvider.test.js +6 -10
- package/dist/wallet-providers/cdpSolanaWalletProvider.d.ts +1 -1
- package/dist/wallet-providers/cdpSolanaWalletProvider.js +7 -7
- package/dist/wallet-providers/cdpSolanaWalletProvider.test.js +15 -12
- package/dist/wallet-providers/evmWalletProvider.d.ts +13 -2
- package/dist/wallet-providers/evmWalletProvider.js +4 -0
- package/dist/wallet-providers/legacyCdpSmartWalletProvider.d.ts +18 -2
- package/dist/wallet-providers/legacyCdpSmartWalletProvider.js +23 -2
- package/dist/wallet-providers/legacyCdpWalletProvider.d.ts +19 -2
- package/dist/wallet-providers/legacyCdpWalletProvider.js +27 -2
- package/dist/wallet-providers/legacyCdpWalletProvider.test.js +6 -0
- package/dist/wallet-providers/privyEvmDelegatedEmbeddedWalletProvider.d.ts +17 -2
- package/dist/wallet-providers/privyEvmDelegatedEmbeddedWalletProvider.js +39 -3
- package/dist/wallet-providers/privyEvmDelegatedEmbeddedWalletProvider.test.js +1 -1
- package/dist/wallet-providers/privyEvmWalletProvider.d.ts +2 -0
- package/dist/wallet-providers/privyEvmWalletProvider.js +2 -1
- package/dist/wallet-providers/privyEvmWalletProvider.test.js +12 -1
- package/dist/wallet-providers/solanaKeypairWalletProvider.d.ts +1 -1
- package/dist/wallet-providers/solanaKeypairWalletProvider.js +3 -4
- package/dist/wallet-providers/solanaKeypairWalletProvider.test.js +4 -2
- package/dist/wallet-providers/viemWalletProvider.d.ts +20 -3
- package/dist/wallet-providers/viemWalletProvider.js +33 -4
- package/dist/wallet-providers/viemWalletProvider.test.js +27 -6
- package/dist/wallet-providers/walletProvider.d.ts +1 -1
- package/dist/wallet-providers/zeroDevWalletProvider.d.ts +17 -2
- package/dist/wallet-providers/zeroDevWalletProvider.js +26 -5
- package/dist/wallet-providers/zeroDevWalletProvider.test.js +12 -2
- package/package.json +8 -4
|
@@ -20,7 +20,10 @@ const schemas_1 = require("./schemas");
|
|
|
20
20
|
const wallet_providers_1 = require("../../wallet-providers");
|
|
21
21
|
const axios_1 = __importDefault(require("axios"));
|
|
22
22
|
const x402_axios_1 = require("x402-axios");
|
|
23
|
-
const
|
|
23
|
+
const verify_1 = require("x402/verify");
|
|
24
|
+
const x402_1 = require("@coinbase/x402");
|
|
25
|
+
const utils_1 = require("./utils");
|
|
26
|
+
const SUPPORTED_NETWORKS = ["base-mainnet", "base-sepolia", "solana-mainnet", "solana-devnet"];
|
|
24
27
|
/**
|
|
25
28
|
* X402ActionProvider provides actions for making HTTP requests, with optional x402 payment handling.
|
|
26
29
|
*/
|
|
@@ -39,6 +42,116 @@ class X402ActionProvider extends actionProvider_1.ActionProvider {
|
|
|
39
42
|
*/
|
|
40
43
|
this.supportsNetwork = (network) => network.protocolFamily === "evm" && SUPPORTED_NETWORKS.includes(network.networkId);
|
|
41
44
|
}
|
|
45
|
+
/**
|
|
46
|
+
* Discovers available x402 services with optional filtering.
|
|
47
|
+
*
|
|
48
|
+
* @param walletProvider - The wallet provider to use for network filtering
|
|
49
|
+
* @param args - Optional filters: maxUsdcPrice
|
|
50
|
+
* @returns JSON string with the list of services (filtered by network and description)
|
|
51
|
+
*/
|
|
52
|
+
async discoverX402Services(walletProvider, args) {
|
|
53
|
+
try {
|
|
54
|
+
const { list } = (0, verify_1.useFacilitator)(x402_1.facilitator);
|
|
55
|
+
const services = await list();
|
|
56
|
+
if (!services || !services.items) {
|
|
57
|
+
return JSON.stringify({
|
|
58
|
+
error: true,
|
|
59
|
+
message: "No services found",
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
// Get the current wallet network
|
|
63
|
+
const walletNetwork = (0, utils_1.getX402Network)(walletProvider.getNetwork());
|
|
64
|
+
// Filter services by network, description, and optional USDC price
|
|
65
|
+
const hasValidMaxUsdcPrice = typeof args.maxUsdcPrice === "number" &&
|
|
66
|
+
Number.isFinite(args.maxUsdcPrice) &&
|
|
67
|
+
args.maxUsdcPrice > 0;
|
|
68
|
+
const filteredServices = services.items.filter(item => {
|
|
69
|
+
// Filter by network - only include services that accept the current wallet network
|
|
70
|
+
const accepts = Array.isArray(item.accepts) ? item.accepts : [];
|
|
71
|
+
const hasMatchingNetwork = accepts.some(req => req.network === walletNetwork);
|
|
72
|
+
// Filter out services with empty or default descriptions
|
|
73
|
+
const hasDescription = accepts.some(req => req.description &&
|
|
74
|
+
req.description.trim() !== "" &&
|
|
75
|
+
req.description.trim() !== "Access to protected content");
|
|
76
|
+
return hasMatchingNetwork && hasDescription;
|
|
77
|
+
});
|
|
78
|
+
// Apply USDC price filtering if maxUsdcPrice is provided (only consider USDC assets)
|
|
79
|
+
let priceFilteredServices = filteredServices;
|
|
80
|
+
if (hasValidMaxUsdcPrice) {
|
|
81
|
+
priceFilteredServices = [];
|
|
82
|
+
for (const item of filteredServices) {
|
|
83
|
+
const accepts = Array.isArray(item.accepts) ? item.accepts : [];
|
|
84
|
+
let shouldInclude = false;
|
|
85
|
+
for (const req of accepts) {
|
|
86
|
+
if (req.network === walletNetwork && req.asset && req.maxAmountRequired) {
|
|
87
|
+
// Only consider USDC assets when maxUsdcPrice filter is applied
|
|
88
|
+
if ((0, utils_1.isUsdcAsset)(req.asset, walletProvider)) {
|
|
89
|
+
try {
|
|
90
|
+
const maxUsdcPriceAtomic = await (0, utils_1.convertWholeUnitsToAtomic)(args.maxUsdcPrice, req.asset, walletProvider);
|
|
91
|
+
if (maxUsdcPriceAtomic) {
|
|
92
|
+
const requirement = BigInt(req.maxAmountRequired);
|
|
93
|
+
const maxUsdcPriceAtomicBigInt = BigInt(maxUsdcPriceAtomic);
|
|
94
|
+
if (requirement <= maxUsdcPriceAtomicBigInt) {
|
|
95
|
+
shouldInclude = true;
|
|
96
|
+
break;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
// If conversion fails, skip this requirement
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
if (shouldInclude) {
|
|
108
|
+
priceFilteredServices.push(item);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
// Format the filtered services
|
|
113
|
+
const filtered = await Promise.all(priceFilteredServices.map(async (item) => {
|
|
114
|
+
const accepts = Array.isArray(item.accepts) ? item.accepts : [];
|
|
115
|
+
const matchingAccept = accepts.find(req => req.network === walletNetwork);
|
|
116
|
+
// Format amount if available
|
|
117
|
+
let formattedMaxAmount = matchingAccept?.maxAmountRequired;
|
|
118
|
+
if (matchingAccept?.maxAmountRequired && matchingAccept?.asset) {
|
|
119
|
+
formattedMaxAmount = await (0, utils_1.formatPaymentOption)({
|
|
120
|
+
asset: matchingAccept.asset,
|
|
121
|
+
maxAmountRequired: matchingAccept.maxAmountRequired,
|
|
122
|
+
network: matchingAccept.network,
|
|
123
|
+
}, walletProvider);
|
|
124
|
+
}
|
|
125
|
+
return {
|
|
126
|
+
resource: item.resource,
|
|
127
|
+
description: matchingAccept?.description || "",
|
|
128
|
+
cost: formattedMaxAmount,
|
|
129
|
+
...(matchingAccept?.outputSchema?.input && {
|
|
130
|
+
input: matchingAccept.outputSchema.input,
|
|
131
|
+
}),
|
|
132
|
+
...(matchingAccept?.outputSchema?.output && {
|
|
133
|
+
output: matchingAccept.outputSchema.output,
|
|
134
|
+
}),
|
|
135
|
+
...(item.metadata && item.metadata.length > 0 && { metadata: item.metadata }),
|
|
136
|
+
};
|
|
137
|
+
}));
|
|
138
|
+
return JSON.stringify({
|
|
139
|
+
success: true,
|
|
140
|
+
walletNetwork,
|
|
141
|
+
total: services.items.length,
|
|
142
|
+
returned: filtered.length,
|
|
143
|
+
items: filtered,
|
|
144
|
+
}, null, 2);
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
148
|
+
return JSON.stringify({
|
|
149
|
+
error: true,
|
|
150
|
+
message: "Failed to list x402 services",
|
|
151
|
+
details: message,
|
|
152
|
+
}, null, 2);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
42
155
|
/**
|
|
43
156
|
* Makes a basic HTTP request to an API endpoint.
|
|
44
157
|
*
|
|
@@ -64,19 +177,32 @@ class X402ActionProvider extends actionProvider_1.ActionProvider {
|
|
|
64
177
|
data: response.data,
|
|
65
178
|
}, null, 2);
|
|
66
179
|
}
|
|
180
|
+
// Check if wallet network matches any available payment options
|
|
181
|
+
const walletNetwork = (0, utils_1.getX402Network)(walletProvider.getNetwork());
|
|
182
|
+
const availableNetworks = response.data.accepts.map(option => option.network);
|
|
183
|
+
const hasMatchingNetwork = availableNetworks.includes(walletNetwork);
|
|
184
|
+
let paymentOptionsText = `The wallet network ${walletNetwork} does not match any available payment options (${availableNetworks.join(", ")}).`;
|
|
185
|
+
// Format payment options for matching networks
|
|
186
|
+
if (hasMatchingNetwork) {
|
|
187
|
+
const matchingOptions = response.data.accepts.filter(option => option.network === walletNetwork);
|
|
188
|
+
const formattedOptions = await Promise.all(matchingOptions.map(option => (0, utils_1.formatPaymentOption)(option, walletProvider)));
|
|
189
|
+
paymentOptionsText = `The payment options are: ${formattedOptions.join(", ")}`;
|
|
190
|
+
}
|
|
67
191
|
return JSON.stringify({
|
|
68
192
|
status: "error_402_payment_required",
|
|
69
193
|
acceptablePaymentOptions: response.data.accepts,
|
|
70
194
|
nextSteps: [
|
|
71
195
|
"Inform the user that the requested server replied with a 402 Payment Required response.",
|
|
72
|
-
|
|
73
|
-
"Ask the user if they want to retry the request with payment.",
|
|
74
|
-
|
|
196
|
+
paymentOptionsText,
|
|
197
|
+
hasMatchingNetwork ? "Ask the user if they want to retry the request with payment." : "",
|
|
198
|
+
hasMatchingNetwork
|
|
199
|
+
? `Use retry_http_request_with_x402 to retry the request with payment.`
|
|
200
|
+
: "",
|
|
75
201
|
],
|
|
76
202
|
});
|
|
77
203
|
}
|
|
78
204
|
catch (error) {
|
|
79
|
-
return
|
|
205
|
+
return (0, utils_1.handleHttpError)(error, args.url);
|
|
80
206
|
}
|
|
81
207
|
}
|
|
82
208
|
/**
|
|
@@ -88,6 +214,16 @@ class X402ActionProvider extends actionProvider_1.ActionProvider {
|
|
|
88
214
|
*/
|
|
89
215
|
async retryWithX402(walletProvider, args) {
|
|
90
216
|
try {
|
|
217
|
+
// Check network compatibility before attempting payment
|
|
218
|
+
const walletNetwork = (0, utils_1.getX402Network)(walletProvider.getNetwork());
|
|
219
|
+
const selectedNetwork = args.selectedPaymentOption.network;
|
|
220
|
+
if (walletNetwork !== selectedNetwork) {
|
|
221
|
+
return JSON.stringify({
|
|
222
|
+
error: true,
|
|
223
|
+
message: "Network mismatch",
|
|
224
|
+
details: `Wallet is on ${walletNetwork} but payment requires ${selectedNetwork}`,
|
|
225
|
+
}, null, 2);
|
|
226
|
+
}
|
|
91
227
|
// Make the request with payment handling
|
|
92
228
|
const account = walletProvider.toSigner();
|
|
93
229
|
const paymentSelector = (accepts) => {
|
|
@@ -108,7 +244,9 @@ class X402ActionProvider extends actionProvider_1.ActionProvider {
|
|
|
108
244
|
}
|
|
109
245
|
return accepts[0];
|
|
110
246
|
};
|
|
111
|
-
const api = (0, x402_axios_1.withPaymentInterceptor)(axios_1.default.create({}),
|
|
247
|
+
const api = (0, x402_axios_1.withPaymentInterceptor)(axios_1.default.create({}),
|
|
248
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
249
|
+
account, paymentSelector);
|
|
112
250
|
const response = await api.request({
|
|
113
251
|
url: args.url,
|
|
114
252
|
method: args.method ?? "GET",
|
|
@@ -142,7 +280,7 @@ class X402ActionProvider extends actionProvider_1.ActionProvider {
|
|
|
142
280
|
});
|
|
143
281
|
}
|
|
144
282
|
catch (error) {
|
|
145
|
-
return
|
|
283
|
+
return (0, utils_1.handleHttpError)(error, args.url);
|
|
146
284
|
}
|
|
147
285
|
}
|
|
148
286
|
/**
|
|
@@ -155,6 +293,7 @@ class X402ActionProvider extends actionProvider_1.ActionProvider {
|
|
|
155
293
|
async makeHttpRequestWithX402(walletProvider, args) {
|
|
156
294
|
try {
|
|
157
295
|
const account = walletProvider.toSigner();
|
|
296
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
158
297
|
const api = (0, x402_axios_1.withPaymentInterceptor)(axios_1.default.create({}), account);
|
|
159
298
|
const response = await api.request({
|
|
160
299
|
url: args.url,
|
|
@@ -183,42 +322,21 @@ class X402ActionProvider extends actionProvider_1.ActionProvider {
|
|
|
183
322
|
}, null, 2);
|
|
184
323
|
}
|
|
185
324
|
catch (error) {
|
|
186
|
-
return
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
/**
|
|
190
|
-
* Helper method to handle HTTP errors consistently.
|
|
191
|
-
*
|
|
192
|
-
* @param error - The axios error to handle
|
|
193
|
-
* @param url - The URL that was being accessed when the error occurred
|
|
194
|
-
* @returns A JSON string containing formatted error details
|
|
195
|
-
*/
|
|
196
|
-
handleHttpError(error, url) {
|
|
197
|
-
if (error.response) {
|
|
198
|
-
return JSON.stringify({
|
|
199
|
-
error: true,
|
|
200
|
-
message: `HTTP ${error.response.status} error when accessing ${url}`,
|
|
201
|
-
details: error.response.data?.error || error.response.statusText,
|
|
202
|
-
suggestion: "Check if the URL is correct and the API is available.",
|
|
203
|
-
}, null, 2);
|
|
204
|
-
}
|
|
205
|
-
if (error.request) {
|
|
206
|
-
return JSON.stringify({
|
|
207
|
-
error: true,
|
|
208
|
-
message: `Network error when accessing ${url}`,
|
|
209
|
-
details: error.message,
|
|
210
|
-
suggestion: "Check your internet connection and verify the API endpoint is accessible.",
|
|
211
|
-
}, null, 2);
|
|
325
|
+
return (0, utils_1.handleHttpError)(error, args.url);
|
|
212
326
|
}
|
|
213
|
-
return JSON.stringify({
|
|
214
|
-
error: true,
|
|
215
|
-
message: `Error making request to ${url}`,
|
|
216
|
-
details: error.message,
|
|
217
|
-
suggestion: "Please check the request parameters and try again.",
|
|
218
|
-
}, null, 2);
|
|
219
327
|
}
|
|
220
328
|
}
|
|
221
329
|
exports.X402ActionProvider = X402ActionProvider;
|
|
330
|
+
__decorate([
|
|
331
|
+
(0, actionDecorator_1.CreateAction)({
|
|
332
|
+
name: "discover_x402_services",
|
|
333
|
+
description: "Discover available x402 services. Optionally filter by a maximum price in whole units of USDC (only USDC payment options will be considered when filter is applied).",
|
|
334
|
+
schema: schemas_1.ListX402ServicesSchema,
|
|
335
|
+
}),
|
|
336
|
+
__metadata("design:type", Function),
|
|
337
|
+
__metadata("design:paramtypes", [wallet_providers_1.EvmWalletProvider, void 0]),
|
|
338
|
+
__metadata("design:returntype", Promise)
|
|
339
|
+
], X402ActionProvider.prototype, "discoverX402Services", null);
|
|
222
340
|
__decorate([
|
|
223
341
|
(0, actionDecorator_1.CreateAction)({
|
|
224
342
|
name: "make_http_request",
|
|
@@ -272,6 +390,7 @@ This action combines both steps into one, which means:
|
|
|
272
390
|
- No chance to review payment details before paying
|
|
273
391
|
- No confirmation step
|
|
274
392
|
- Automatic payment processing
|
|
393
|
+
- Assumes payment option is compatible with wallet network
|
|
275
394
|
|
|
276
395
|
EXAMPLES:
|
|
277
396
|
- Production: make_http_request_with_x402("https://api.example.com/data")
|
|
@@ -39,9 +39,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
39
39
|
const x402ActionProvider_1 = require("./x402ActionProvider");
|
|
40
40
|
const axios_1 = __importDefault(require("axios"));
|
|
41
41
|
const x402axios = __importStar(require("x402-axios"));
|
|
42
|
+
const x402Verify = __importStar(require("x402/verify"));
|
|
43
|
+
// Mock external facilitator dependency
|
|
44
|
+
jest.mock("@coinbase/x402", () => ({
|
|
45
|
+
facilitator: {},
|
|
46
|
+
}));
|
|
42
47
|
// Mock modules
|
|
43
48
|
jest.mock("axios");
|
|
44
49
|
jest.mock("x402-axios");
|
|
50
|
+
jest.mock("x402/verify");
|
|
45
51
|
// Create mock functions
|
|
46
52
|
const mockRequest = jest.fn();
|
|
47
53
|
// Create a complete mock axios instance
|
|
@@ -83,6 +89,7 @@ const mockAxios = {
|
|
|
83
89
|
};
|
|
84
90
|
const mockWithPaymentInterceptor = jest.fn().mockReturnValue(mockAxiosInstance);
|
|
85
91
|
const mockDecodeXPaymentResponse = jest.fn();
|
|
92
|
+
const mockUseFacilitator = jest.fn();
|
|
86
93
|
// Override the mocked modules
|
|
87
94
|
axios_1.default.create = mockAxios.create;
|
|
88
95
|
axios_1.default.request = mockRequest;
|
|
@@ -90,10 +97,12 @@ axios_1.default.isAxiosError = mockAxios.isAxiosError;
|
|
|
90
97
|
// Mock x402-axios functions
|
|
91
98
|
jest.mocked(x402axios.withPaymentInterceptor).mockImplementation(mockWithPaymentInterceptor);
|
|
92
99
|
jest.mocked(x402axios.decodeXPaymentResponse).mockImplementation(mockDecodeXPaymentResponse);
|
|
100
|
+
jest.mocked(x402Verify.useFacilitator).mockImplementation(mockUseFacilitator);
|
|
93
101
|
// Mock wallet provider
|
|
94
|
-
const
|
|
102
|
+
const makeMockWalletProvider = (networkId) => ({
|
|
95
103
|
toSigner: jest.fn().mockReturnValue("mock-signer"),
|
|
96
|
-
}
|
|
104
|
+
getNetwork: jest.fn().mockReturnValue({ protocolFamily: "evm", networkId }),
|
|
105
|
+
});
|
|
97
106
|
// Sample responses based on real examples
|
|
98
107
|
const MOCK_PAYMENT_INFO_RESPONSE = {
|
|
99
108
|
paymentRequired: true,
|
|
@@ -171,7 +180,7 @@ describe("X402ActionProvider", () => {
|
|
|
171
180
|
headers: {},
|
|
172
181
|
config: {},
|
|
173
182
|
});
|
|
174
|
-
const result = await provider.makeHttpRequest(
|
|
183
|
+
const result = await provider.makeHttpRequest(makeMockWalletProvider("base-sepolia"), {
|
|
175
184
|
url: "https://api.example.com/free",
|
|
176
185
|
method: "GET",
|
|
177
186
|
});
|
|
@@ -187,7 +196,7 @@ describe("X402ActionProvider", () => {
|
|
|
187
196
|
headers: {},
|
|
188
197
|
config: {},
|
|
189
198
|
});
|
|
190
|
-
const result = await provider.makeHttpRequest(
|
|
199
|
+
const result = await provider.makeHttpRequest(makeMockWalletProvider("base-sepolia"), {
|
|
191
200
|
url: "https://www.x402.org/protected",
|
|
192
201
|
method: "GET",
|
|
193
202
|
});
|
|
@@ -201,7 +210,7 @@ describe("X402ActionProvider", () => {
|
|
|
201
210
|
error.isAxiosError = true;
|
|
202
211
|
error.request = {};
|
|
203
212
|
mockRequest.mockRejectedValue(error);
|
|
204
|
-
const result = await provider.makeHttpRequest(
|
|
213
|
+
const result = await provider.makeHttpRequest(makeMockWalletProvider("base-sepolia"), {
|
|
205
214
|
url: "https://api.example.com/endpoint",
|
|
206
215
|
method: "GET",
|
|
207
216
|
});
|
|
@@ -210,6 +219,103 @@ describe("X402ActionProvider", () => {
|
|
|
210
219
|
expect(parsedResult.message).toContain("Network error");
|
|
211
220
|
});
|
|
212
221
|
});
|
|
222
|
+
describe("listX402Services", () => {
|
|
223
|
+
it("should list services without filters", async () => {
|
|
224
|
+
const mockList = jest.fn().mockResolvedValue({
|
|
225
|
+
items: [
|
|
226
|
+
{
|
|
227
|
+
resource: "https://example.com/service1",
|
|
228
|
+
metadata: { category: "test" },
|
|
229
|
+
accepts: [
|
|
230
|
+
{
|
|
231
|
+
asset: "0xUSDC",
|
|
232
|
+
maxAmountRequired: "90000",
|
|
233
|
+
network: "base-sepolia",
|
|
234
|
+
scheme: "exact",
|
|
235
|
+
description: "Test service 1",
|
|
236
|
+
outputSchema: { type: "object" },
|
|
237
|
+
extra: { name: "USDC" },
|
|
238
|
+
},
|
|
239
|
+
],
|
|
240
|
+
},
|
|
241
|
+
],
|
|
242
|
+
});
|
|
243
|
+
mockUseFacilitator.mockReturnValue({ list: mockList });
|
|
244
|
+
const result = await provider.discoverX402Services(makeMockWalletProvider("base-sepolia"), {});
|
|
245
|
+
const parsed = JSON.parse(result);
|
|
246
|
+
expect(parsed.success).toBe(true);
|
|
247
|
+
expect(parsed.total).toBe(1);
|
|
248
|
+
expect(parsed.returned).toBe(1);
|
|
249
|
+
expect(parsed.items.length).toBe(1);
|
|
250
|
+
});
|
|
251
|
+
it("should filter services by asset and maxPrice", async () => {
|
|
252
|
+
const mockList = jest.fn().mockResolvedValue({
|
|
253
|
+
items: [
|
|
254
|
+
{
|
|
255
|
+
resource: "https://example.com/service1",
|
|
256
|
+
metadata: { category: "test" },
|
|
257
|
+
accepts: [
|
|
258
|
+
{
|
|
259
|
+
asset: "0x036CbD53842c5426634e7929541eC2318f3dCF7e", // Real USDC address for base-sepolia
|
|
260
|
+
maxAmountRequired: "90000", // 0.09 USDC (should pass 0.1 filter)
|
|
261
|
+
network: "base-sepolia",
|
|
262
|
+
scheme: "exact",
|
|
263
|
+
description: "Test service 1",
|
|
264
|
+
outputSchema: { type: "object" },
|
|
265
|
+
extra: { name: "USDC" },
|
|
266
|
+
},
|
|
267
|
+
],
|
|
268
|
+
},
|
|
269
|
+
{
|
|
270
|
+
resource: "https://example.com/service2",
|
|
271
|
+
metadata: { category: "test" },
|
|
272
|
+
accepts: [
|
|
273
|
+
{
|
|
274
|
+
asset: "0x036CbD53842c5426634e7929541eC2318f3dCF7e", // Real USDC address for base-sepolia
|
|
275
|
+
maxAmountRequired: "150000", // 0.15 USDC (should fail 0.1 filter)
|
|
276
|
+
network: "base-sepolia",
|
|
277
|
+
scheme: "exact",
|
|
278
|
+
description: "Test service 2",
|
|
279
|
+
outputSchema: { type: "object" },
|
|
280
|
+
extra: { name: "USDC" },
|
|
281
|
+
},
|
|
282
|
+
],
|
|
283
|
+
},
|
|
284
|
+
{
|
|
285
|
+
resource: "https://example.com/service3",
|
|
286
|
+
metadata: { category: "test" },
|
|
287
|
+
accepts: [
|
|
288
|
+
{
|
|
289
|
+
asset: "0x036CbD53842c5426634e7929541eC2318f3dCF7e", // Real USDC address for base-sepolia
|
|
290
|
+
maxAmountRequired: "50000", // 0.05 USDC (should pass 0.1 filter)
|
|
291
|
+
network: "base-sepolia",
|
|
292
|
+
scheme: "exact",
|
|
293
|
+
description: "Test service 3",
|
|
294
|
+
outputSchema: { type: "object" },
|
|
295
|
+
extra: { name: "USDC" },
|
|
296
|
+
},
|
|
297
|
+
],
|
|
298
|
+
},
|
|
299
|
+
],
|
|
300
|
+
});
|
|
301
|
+
mockUseFacilitator.mockReturnValue({ list: mockList });
|
|
302
|
+
const result = await provider.discoverX402Services(makeMockWalletProvider("base-sepolia"), {
|
|
303
|
+
maxUsdcPrice: 0.1,
|
|
304
|
+
});
|
|
305
|
+
const parsed = JSON.parse(result);
|
|
306
|
+
expect(parsed.success).toBe(true);
|
|
307
|
+
expect(parsed.returned).toBe(2);
|
|
308
|
+
expect(parsed.items.map(item => item.resource)).toEqual(expect.arrayContaining(["https://example.com/service1", "https://example.com/service3"]));
|
|
309
|
+
});
|
|
310
|
+
it("should handle errors from facilitator", async () => {
|
|
311
|
+
const mockList = jest.fn().mockRejectedValue(new Error("boom"));
|
|
312
|
+
mockUseFacilitator.mockReturnValue({ list: mockList });
|
|
313
|
+
const result = await provider.discoverX402Services(makeMockWalletProvider("base-sepolia"), {});
|
|
314
|
+
const parsed = JSON.parse(result);
|
|
315
|
+
expect(parsed.error).toBe(true);
|
|
316
|
+
expect(parsed.message).toContain("Failed to list x402 services");
|
|
317
|
+
});
|
|
318
|
+
});
|
|
213
319
|
describe("retryHttpRequestWithX402", () => {
|
|
214
320
|
it("should successfully retry with payment", async () => {
|
|
215
321
|
mockDecodeXPaymentResponse.mockReturnValue(MOCK_PAYMENT_RESPONSE);
|
|
@@ -222,7 +328,7 @@ describe("X402ActionProvider", () => {
|
|
|
222
328
|
},
|
|
223
329
|
config: {},
|
|
224
330
|
});
|
|
225
|
-
const result = await provider.retryWithX402(
|
|
331
|
+
const result = await provider.retryWithX402(makeMockWalletProvider("base-sepolia"), {
|
|
226
332
|
url: "https://www.x402.org/protected",
|
|
227
333
|
method: "GET",
|
|
228
334
|
selectedPaymentOption: {
|
|
@@ -247,7 +353,7 @@ describe("X402ActionProvider", () => {
|
|
|
247
353
|
error.isAxiosError = true;
|
|
248
354
|
error.request = {};
|
|
249
355
|
mockRequest.mockRejectedValue(error);
|
|
250
|
-
const result = await provider.retryWithX402(
|
|
356
|
+
const result = await provider.retryWithX402(makeMockWalletProvider("base-sepolia"), {
|
|
251
357
|
url: "https://www.x402.org/protected",
|
|
252
358
|
method: "GET",
|
|
253
359
|
selectedPaymentOption: {
|
|
@@ -274,7 +380,7 @@ describe("X402ActionProvider", () => {
|
|
|
274
380
|
},
|
|
275
381
|
config: {},
|
|
276
382
|
});
|
|
277
|
-
const result = await provider.makeHttpRequestWithX402(
|
|
383
|
+
const result = await provider.makeHttpRequestWithX402(makeMockWalletProvider("base-sepolia"), {
|
|
278
384
|
url: "https://www.x402.org/protected",
|
|
279
385
|
method: "GET",
|
|
280
386
|
});
|
|
@@ -296,7 +402,7 @@ describe("X402ActionProvider", () => {
|
|
|
296
402
|
headers: {},
|
|
297
403
|
config: {},
|
|
298
404
|
});
|
|
299
|
-
const result = await provider.makeHttpRequestWithX402(
|
|
405
|
+
const result = await provider.makeHttpRequestWithX402(makeMockWalletProvider("base-sepolia"), {
|
|
300
406
|
url: "https://api.example.com/free",
|
|
301
407
|
method: "GET",
|
|
302
408
|
});
|
|
@@ -310,7 +416,7 @@ describe("X402ActionProvider", () => {
|
|
|
310
416
|
error.isAxiosError = true;
|
|
311
417
|
error.request = {};
|
|
312
418
|
mockRequest.mockRejectedValue(error);
|
|
313
|
-
const result = await provider.makeHttpRequestWithX402(
|
|
419
|
+
const result = await provider.makeHttpRequestWithX402(makeMockWalletProvider("base-sepolia"), {
|
|
314
420
|
url: "https://api.example.com/endpoint",
|
|
315
421
|
method: "GET",
|
|
316
422
|
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./zeroXActionProvider";
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./zeroXActionProvider"), exports);
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* Input schema for getting a swap price.
|
|
4
|
+
*/
|
|
5
|
+
export declare const GetSwapPriceSchema: z.ZodObject<{
|
|
6
|
+
sellToken: z.ZodString;
|
|
7
|
+
buyToken: z.ZodString;
|
|
8
|
+
sellAmount: z.ZodString;
|
|
9
|
+
slippageBps: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
10
|
+
swapFeeRecipient: z.ZodOptional<z.ZodString>;
|
|
11
|
+
swapFeeBps: z.ZodDefault<z.ZodNumber>;
|
|
12
|
+
}, "strip", z.ZodTypeAny, {
|
|
13
|
+
slippageBps: number;
|
|
14
|
+
buyToken: string;
|
|
15
|
+
sellToken: string;
|
|
16
|
+
sellAmount: string;
|
|
17
|
+
swapFeeBps: number;
|
|
18
|
+
swapFeeRecipient?: string | undefined;
|
|
19
|
+
}, {
|
|
20
|
+
buyToken: string;
|
|
21
|
+
sellToken: string;
|
|
22
|
+
sellAmount: string;
|
|
23
|
+
slippageBps?: number | undefined;
|
|
24
|
+
swapFeeRecipient?: string | undefined;
|
|
25
|
+
swapFeeBps?: number | undefined;
|
|
26
|
+
}>;
|
|
27
|
+
/**
|
|
28
|
+
* Input schema for executing a swap.
|
|
29
|
+
*/
|
|
30
|
+
export declare const ExecuteSwapSchema: z.ZodObject<{
|
|
31
|
+
sellToken: z.ZodString;
|
|
32
|
+
buyToken: z.ZodString;
|
|
33
|
+
sellAmount: z.ZodString;
|
|
34
|
+
slippageBps: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
35
|
+
swapFeeRecipient: z.ZodOptional<z.ZodString>;
|
|
36
|
+
swapFeeBps: z.ZodDefault<z.ZodNumber>;
|
|
37
|
+
}, "strip", z.ZodTypeAny, {
|
|
38
|
+
slippageBps: number;
|
|
39
|
+
buyToken: string;
|
|
40
|
+
sellToken: string;
|
|
41
|
+
sellAmount: string;
|
|
42
|
+
swapFeeBps: number;
|
|
43
|
+
swapFeeRecipient?: string | undefined;
|
|
44
|
+
}, {
|
|
45
|
+
buyToken: string;
|
|
46
|
+
sellToken: string;
|
|
47
|
+
sellAmount: string;
|
|
48
|
+
slippageBps?: number | undefined;
|
|
49
|
+
swapFeeRecipient?: string | undefined;
|
|
50
|
+
swapFeeBps?: number | undefined;
|
|
51
|
+
}>;
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ExecuteSwapSchema = exports.GetSwapPriceSchema = void 0;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
/**
|
|
6
|
+
* Input schema for getting a swap price.
|
|
7
|
+
*/
|
|
8
|
+
exports.GetSwapPriceSchema = zod_1.z
|
|
9
|
+
.object({
|
|
10
|
+
sellToken: zod_1.z
|
|
11
|
+
.string()
|
|
12
|
+
.regex(/^0x[a-fA-F0-9]{40}$/, "Invalid Ethereum address format")
|
|
13
|
+
.describe("The token contract address to sell"),
|
|
14
|
+
buyToken: zod_1.z
|
|
15
|
+
.string()
|
|
16
|
+
.regex(/^0x[a-fA-F0-9]{40}$/, "Invalid Ethereum address format")
|
|
17
|
+
.describe("The token contract address to buy"),
|
|
18
|
+
sellAmount: zod_1.z
|
|
19
|
+
.string()
|
|
20
|
+
.describe("The amount of sellToken to sell in whole units (e.g., 1.5 WETH, 10 USDC)"),
|
|
21
|
+
slippageBps: zod_1.z
|
|
22
|
+
.number()
|
|
23
|
+
.int()
|
|
24
|
+
.min(0)
|
|
25
|
+
.max(10000)
|
|
26
|
+
.optional()
|
|
27
|
+
.default(100)
|
|
28
|
+
.describe("The maximum acceptable slippage in basis points (0-10000, default: 100)"),
|
|
29
|
+
swapFeeRecipient: zod_1.z
|
|
30
|
+
.string()
|
|
31
|
+
.regex(/^0x[a-fA-F0-9]{40}$/, "Invalid Ethereum address format")
|
|
32
|
+
.optional()
|
|
33
|
+
.describe("The wallet address to receive an affiliate fee on the trade"),
|
|
34
|
+
swapFeeBps: zod_1.z
|
|
35
|
+
.number()
|
|
36
|
+
.int()
|
|
37
|
+
.min(0)
|
|
38
|
+
.max(1000)
|
|
39
|
+
.default(100)
|
|
40
|
+
.describe("The amount in basis points (0-1000) of the sellToken to charge as trading fee (defaults to 100 = 1%), only used if swapFeeRecipient is provided"),
|
|
41
|
+
})
|
|
42
|
+
.strip()
|
|
43
|
+
.describe("Get a price quote for swapping one token for another");
|
|
44
|
+
/**
|
|
45
|
+
* Input schema for executing a swap.
|
|
46
|
+
*/
|
|
47
|
+
exports.ExecuteSwapSchema = zod_1.z
|
|
48
|
+
.object({
|
|
49
|
+
sellToken: zod_1.z
|
|
50
|
+
.string()
|
|
51
|
+
.regex(/^0x[a-fA-F0-9]{40}$/, "Invalid Ethereum address format")
|
|
52
|
+
.describe("The token contract address to sell"),
|
|
53
|
+
buyToken: zod_1.z
|
|
54
|
+
.string()
|
|
55
|
+
.regex(/^0x[a-fA-F0-9]{40}$/, "Invalid Ethereum address format")
|
|
56
|
+
.describe("The token contract address to buy"),
|
|
57
|
+
sellAmount: zod_1.z
|
|
58
|
+
.string()
|
|
59
|
+
.describe("The amount of sellToken to sell in whole units (e.g., 1.5 WETH, 10 USDC)"),
|
|
60
|
+
slippageBps: zod_1.z
|
|
61
|
+
.number()
|
|
62
|
+
.int()
|
|
63
|
+
.min(0)
|
|
64
|
+
.max(10000)
|
|
65
|
+
.optional()
|
|
66
|
+
.default(100)
|
|
67
|
+
.describe("The maximum acceptable slippage in basis points (0-10000, default: 100)"),
|
|
68
|
+
swapFeeRecipient: zod_1.z
|
|
69
|
+
.string()
|
|
70
|
+
.regex(/^0x[a-fA-F0-9]{40}$/, "Invalid Ethereum address format")
|
|
71
|
+
.optional()
|
|
72
|
+
.describe("The wallet address to receive an affiliate fee on the trade"),
|
|
73
|
+
swapFeeBps: zod_1.z
|
|
74
|
+
.number()
|
|
75
|
+
.int()
|
|
76
|
+
.min(0)
|
|
77
|
+
.max(1000)
|
|
78
|
+
.default(100)
|
|
79
|
+
.describe("The amount in basis points (0-1000) of the sellToken to charge as trading fee (defaults to 100 = 1%), only used if swapFeeRecipient is provided"),
|
|
80
|
+
})
|
|
81
|
+
.strip()
|
|
82
|
+
.describe("Execute a swap between two tokens");
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { EvmWalletProvider } from "../../wallet-providers";
|
|
2
|
+
export declare const PERMIT2_ADDRESS = "0x000000000022D473030F116dDEE9F6B43aC78BA3";
|
|
3
|
+
/**
|
|
4
|
+
* Checks if a token is native ETH.
|
|
5
|
+
*
|
|
6
|
+
* @param token - The token address to check.
|
|
7
|
+
* @returns True if the token is native ETH, false otherwise.
|
|
8
|
+
*/
|
|
9
|
+
export declare function isNativeEth(token: string): boolean;
|
|
10
|
+
/**
|
|
11
|
+
* Gets the details (decimals and name) for both fromToken and toToken
|
|
12
|
+
*
|
|
13
|
+
* @param walletProvider - The EVM wallet provider to read contracts
|
|
14
|
+
* @param fromToken - The contract address of the from token
|
|
15
|
+
* @param toToken - The contract address of the to token
|
|
16
|
+
* @returns Promise<{fromTokenDecimals: number, toTokenDecimals: number, fromTokenName: string, toTokenName: string}>
|
|
17
|
+
*/
|
|
18
|
+
export declare function getTokenDetails(walletProvider: EvmWalletProvider, fromToken: string, toToken: string): Promise<{
|
|
19
|
+
fromTokenDecimals: number;
|
|
20
|
+
toTokenDecimals: number;
|
|
21
|
+
fromTokenName: string;
|
|
22
|
+
toTokenName: string;
|
|
23
|
+
}>;
|