@coinbase/agentkit 0.10.0 → 0.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +75 -0
- package/dist/action-providers/across/acrossActionProvider.js +3 -3
- 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 +223 -23
- package/dist/action-providers/cdp/cdpEvmWalletActionProvider.test.js +278 -0
- package/dist/action-providers/cdp/cdpSmartWalletActionProvider.d.ts +17 -2
- package/dist/action-providers/cdp/cdpSmartWalletActionProvider.js +223 -18
- package/dist/action-providers/cdp/cdpSmartWalletActionProvider.test.js +265 -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 +32 -0
- package/dist/action-providers/cdp/swapUtils.js +142 -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/constants.d.ts +1 -1
- package/dist/action-providers/flaunch/constants.js +2 -2
- package/dist/action-providers/flaunch/flaunchActionProvider.js +3 -11
- package/dist/action-providers/flaunch/flaunchActionProvider.test.js +5 -0
- package/dist/action-providers/index.d.ts +3 -0
- package/dist/action-providers/index.js +3 -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.js +5 -0
- package/dist/action-providers/pyth/pythActionProvider.test.js +5 -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 +108 -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 +18 -0
- package/dist/action-providers/superfluid/utils/parseLogs.js +78 -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 +21 -10
- package/dist/action-providers/wallet/walletActionProvider.test.js +6 -2
- 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/wallet-providers/cdpEvmWalletProvider.d.ts +20 -2
- package/dist/wallet-providers/cdpEvmWalletProvider.js +40 -15
- package/dist/wallet-providers/cdpShared.d.ts +5 -0
- package/dist/wallet-providers/cdpSmartWalletProvider.d.ts +22 -3
- package/dist/wallet-providers/cdpSmartWalletProvider.js +43 -19
- 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 +5 -1
- package/dist/wallet-providers/legacyCdpSmartWalletProvider.d.ts +9 -2
- package/dist/wallet-providers/legacyCdpSmartWalletProvider.js +12 -2
- package/dist/wallet-providers/legacyCdpWalletProvider.d.ts +12 -2
- package/dist/wallet-providers/legacyCdpWalletProvider.js +11 -2
- package/dist/wallet-providers/privyEvmDelegatedEmbeddedWalletProvider.d.ts +10 -2
- package/dist/wallet-providers/privyEvmDelegatedEmbeddedWalletProvider.js +12 -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 +1 -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 +12 -2
- package/dist/wallet-providers/viemWalletProvider.js +12 -3
- package/dist/wallet-providers/viemWalletProvider.test.js +6 -5
- package/dist/wallet-providers/walletProvider.d.ts +1 -1
- package/dist/wallet-providers/zeroDevWalletProvider.d.ts +10 -2
- package/dist/wallet-providers/zeroDevWalletProvider.js +14 -5
- package/dist/wallet-providers/zeroDevWalletProvider.test.js +2 -2
- package/package.json +4 -2
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { ActionProvider } from "../actionProvider";
|
|
3
|
+
import { Network } from "../../network";
|
|
4
|
+
import { GetSwapPriceSchema, ExecuteSwapSchema } from "./schemas";
|
|
5
|
+
import { EvmWalletProvider } from "../../wallet-providers";
|
|
6
|
+
/**
|
|
7
|
+
* Configuration for the ZeroXActionProvider.
|
|
8
|
+
*/
|
|
9
|
+
export interface ZeroXActionProviderConfig {
|
|
10
|
+
/**
|
|
11
|
+
* The API key to use for 0x API requests.
|
|
12
|
+
*/
|
|
13
|
+
apiKey?: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* 0x API Action Provider for token swaps.
|
|
17
|
+
* Requires a 0x API key.
|
|
18
|
+
*/
|
|
19
|
+
export declare class ZeroXActionProvider extends ActionProvider<EvmWalletProvider> {
|
|
20
|
+
#private;
|
|
21
|
+
/**
|
|
22
|
+
* Constructor for the ZeroXActionProvider.
|
|
23
|
+
*
|
|
24
|
+
* @param config - Configuration for the provider.
|
|
25
|
+
*/
|
|
26
|
+
constructor(config: ZeroXActionProviderConfig);
|
|
27
|
+
/**
|
|
28
|
+
* Gets a price quote for swapping one token for another.
|
|
29
|
+
*
|
|
30
|
+
* @param walletProvider - The wallet provider to get information from.
|
|
31
|
+
* @param args - The input arguments for the action.
|
|
32
|
+
* @returns A message containing the price quote.
|
|
33
|
+
*/
|
|
34
|
+
getSwapPrice(walletProvider: EvmWalletProvider, args: z.infer<typeof GetSwapPriceSchema>): Promise<string>;
|
|
35
|
+
/**
|
|
36
|
+
* Executes a token swap using the 0x API.
|
|
37
|
+
*
|
|
38
|
+
* @param walletProvider - The wallet provider to use for the swap.
|
|
39
|
+
* @param args - The input arguments for the action.
|
|
40
|
+
* @returns A message containing the result of the swap.
|
|
41
|
+
*/
|
|
42
|
+
executeSwap(walletProvider: EvmWalletProvider, args: z.infer<typeof ExecuteSwapSchema>): Promise<string>;
|
|
43
|
+
/**
|
|
44
|
+
* Checks if the ZeroX action provider supports the given network.
|
|
45
|
+
*
|
|
46
|
+
* @param network - The network to check.
|
|
47
|
+
* @returns True if the ZeroX action provider supports the network, false otherwise.
|
|
48
|
+
*/
|
|
49
|
+
supportsNetwork: (network: Network) => boolean;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Creates a new ZeroXActionProvider with the provided configuration.
|
|
53
|
+
*
|
|
54
|
+
* @param config - Optional configuration for the provider.
|
|
55
|
+
* @returns A new ZeroXActionProvider.
|
|
56
|
+
*/
|
|
57
|
+
export declare const zeroXActionProvider: (config: ZeroXActionProviderConfig) => ZeroXActionProvider;
|
|
@@ -0,0 +1,407 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
12
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
13
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
14
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
15
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
16
|
+
};
|
|
17
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
18
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
19
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
20
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
21
|
+
};
|
|
22
|
+
var _ZeroXActionProvider_apiKey;
|
|
23
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
24
|
+
exports.zeroXActionProvider = exports.ZeroXActionProvider = void 0;
|
|
25
|
+
const zod_1 = require("zod");
|
|
26
|
+
const actionProvider_1 = require("../actionProvider");
|
|
27
|
+
const actionDecorator_1 = require("../actionDecorator");
|
|
28
|
+
const schemas_1 = require("./schemas");
|
|
29
|
+
const wallet_providers_1 = require("../../wallet-providers");
|
|
30
|
+
const viem_1 = require("viem");
|
|
31
|
+
const utils_1 = require("./utils");
|
|
32
|
+
/**
|
|
33
|
+
* 0x API Action Provider for token swaps.
|
|
34
|
+
* Requires a 0x API key.
|
|
35
|
+
*/
|
|
36
|
+
class ZeroXActionProvider extends actionProvider_1.ActionProvider {
|
|
37
|
+
/**
|
|
38
|
+
* Constructor for the ZeroXActionProvider.
|
|
39
|
+
*
|
|
40
|
+
* @param config - Configuration for the provider.
|
|
41
|
+
*/
|
|
42
|
+
constructor(config) {
|
|
43
|
+
super("zerox", []);
|
|
44
|
+
_ZeroXActionProvider_apiKey.set(this, void 0);
|
|
45
|
+
/**
|
|
46
|
+
* Checks if the ZeroX action provider supports the given network.
|
|
47
|
+
*
|
|
48
|
+
* @param network - The network to check.
|
|
49
|
+
* @returns True if the ZeroX action provider supports the network, false otherwise.
|
|
50
|
+
*/
|
|
51
|
+
this.supportsNetwork = (network) => network.protocolFamily === "evm";
|
|
52
|
+
const apiKey = config.apiKey || process.env.ZEROX_API_KEY;
|
|
53
|
+
if (!apiKey) {
|
|
54
|
+
throw new Error("0x API key not provided.");
|
|
55
|
+
}
|
|
56
|
+
__classPrivateFieldSet(this, _ZeroXActionProvider_apiKey, apiKey, "f");
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Gets a price quote for swapping one token for another.
|
|
60
|
+
*
|
|
61
|
+
* @param walletProvider - The wallet provider to get information from.
|
|
62
|
+
* @param args - The input arguments for the action.
|
|
63
|
+
* @returns A message containing the price quote.
|
|
64
|
+
*/
|
|
65
|
+
async getSwapPrice(walletProvider, args) {
|
|
66
|
+
const network = walletProvider.getNetwork();
|
|
67
|
+
const chainId = network.chainId;
|
|
68
|
+
if (!chainId)
|
|
69
|
+
throw new Error("Chain ID not available from wallet provider");
|
|
70
|
+
try {
|
|
71
|
+
// Get token details
|
|
72
|
+
const { fromTokenDecimals: sellTokenDecimals, toTokenDecimals: buyTokenDecimals, fromTokenName: sellTokenName, toTokenName: buyTokenName, } = await (0, utils_1.getTokenDetails)(walletProvider, args.sellToken, args.buyToken);
|
|
73
|
+
// Convert sell amount to base units
|
|
74
|
+
const sellAmount = (0, viem_1.parseUnits)(args.sellAmount, sellTokenDecimals).toString();
|
|
75
|
+
// Create URL for the price API request
|
|
76
|
+
const url = new URL("https://api.0x.org/swap/permit2/price");
|
|
77
|
+
url.searchParams.append("chainId", chainId.toString());
|
|
78
|
+
url.searchParams.append("sellToken", args.sellToken);
|
|
79
|
+
url.searchParams.append("buyToken", args.buyToken);
|
|
80
|
+
url.searchParams.append("sellAmount", sellAmount);
|
|
81
|
+
url.searchParams.append("taker", walletProvider.getAddress());
|
|
82
|
+
url.searchParams.append("slippageBps", args.slippageBps.toString());
|
|
83
|
+
if (args.swapFeeRecipient) {
|
|
84
|
+
url.searchParams.append("swapFeeRecipient", args.swapFeeRecipient);
|
|
85
|
+
url.searchParams.append("swapFeeBps", args.swapFeeBps.toString());
|
|
86
|
+
url.searchParams.append("swapFeeToken", args.sellToken);
|
|
87
|
+
}
|
|
88
|
+
// Make the request
|
|
89
|
+
const response = await fetch(url.toString(), {
|
|
90
|
+
method: "GET",
|
|
91
|
+
headers: {
|
|
92
|
+
"Content-Type": "application/json",
|
|
93
|
+
"0x-api-key": __classPrivateFieldGet(this, _ZeroXActionProvider_apiKey, "f"),
|
|
94
|
+
"0x-version": "v2",
|
|
95
|
+
},
|
|
96
|
+
});
|
|
97
|
+
if (!response.ok) {
|
|
98
|
+
const errorText = await response.text();
|
|
99
|
+
return JSON.stringify({
|
|
100
|
+
success: false,
|
|
101
|
+
error: `Error fetching swap price: ${response.status} ${response.statusText} - ${errorText}`,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
const data = await response.json();
|
|
105
|
+
// Format the response
|
|
106
|
+
const formattedResponse = {
|
|
107
|
+
success: true,
|
|
108
|
+
sellAmount: (0, viem_1.formatUnits)(BigInt(sellAmount), sellTokenDecimals),
|
|
109
|
+
sellTokenName: sellTokenName,
|
|
110
|
+
sellToken: args.sellToken,
|
|
111
|
+
buyAmount: (0, viem_1.formatUnits)(data.buyAmount, buyTokenDecimals),
|
|
112
|
+
minBuyAmount: data.minBuyAmount ? (0, viem_1.formatUnits)(data.minBuyAmount, buyTokenDecimals) : null,
|
|
113
|
+
buyTokenName: buyTokenName,
|
|
114
|
+
buyToken: args.buyToken,
|
|
115
|
+
slippageBps: args.slippageBps,
|
|
116
|
+
liquidityAvailable: data.liquidityAvailable,
|
|
117
|
+
balanceEnough: data.issues?.balance === null,
|
|
118
|
+
priceOfBuyTokenInSellToken: (Number((0, viem_1.formatUnits)(BigInt(sellAmount), sellTokenDecimals)) /
|
|
119
|
+
Number((0, viem_1.formatUnits)(data.buyAmount, buyTokenDecimals))).toString(),
|
|
120
|
+
priceOfSellTokenInBuyToken: (Number((0, viem_1.formatUnits)(data.buyAmount, buyTokenDecimals)) /
|
|
121
|
+
Number((0, viem_1.formatUnits)(BigInt(sellAmount), sellTokenDecimals))).toString(),
|
|
122
|
+
};
|
|
123
|
+
return JSON.stringify(formattedResponse);
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
return JSON.stringify({
|
|
127
|
+
success: false,
|
|
128
|
+
error: `Error fetching swap price: ${error}`,
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Executes a token swap using the 0x API.
|
|
134
|
+
*
|
|
135
|
+
* @param walletProvider - The wallet provider to use for the swap.
|
|
136
|
+
* @param args - The input arguments for the action.
|
|
137
|
+
* @returns A message containing the result of the swap.
|
|
138
|
+
*/
|
|
139
|
+
async executeSwap(walletProvider, args) {
|
|
140
|
+
// Sanity checks
|
|
141
|
+
const network = walletProvider.getNetwork();
|
|
142
|
+
const chainId = network.chainId;
|
|
143
|
+
if (!chainId)
|
|
144
|
+
throw new Error("Chain ID not available from wallet provider");
|
|
145
|
+
try {
|
|
146
|
+
// Get token details
|
|
147
|
+
const { fromTokenDecimals: sellTokenDecimals, toTokenDecimals: buyTokenDecimals, fromTokenName: sellTokenName, toTokenName: buyTokenName, } = await (0, utils_1.getTokenDetails)(walletProvider, args.sellToken, args.buyToken);
|
|
148
|
+
// Convert sell amount to base units
|
|
149
|
+
const sellAmount = (0, viem_1.parseUnits)(args.sellAmount, sellTokenDecimals).toString();
|
|
150
|
+
// Get the wallet address
|
|
151
|
+
const walletAddress = walletProvider.getAddress();
|
|
152
|
+
// Fetch price quote first
|
|
153
|
+
const priceUrl = new URL("https://api.0x.org/swap/permit2/price");
|
|
154
|
+
priceUrl.searchParams.append("chainId", chainId.toString());
|
|
155
|
+
priceUrl.searchParams.append("sellToken", args.sellToken);
|
|
156
|
+
priceUrl.searchParams.append("buyToken", args.buyToken);
|
|
157
|
+
priceUrl.searchParams.append("sellAmount", sellAmount);
|
|
158
|
+
priceUrl.searchParams.append("taker", walletAddress);
|
|
159
|
+
priceUrl.searchParams.append("slippageBps", args.slippageBps.toString());
|
|
160
|
+
if (args.swapFeeRecipient) {
|
|
161
|
+
priceUrl.searchParams.append("swapFeeRecipient", args.swapFeeRecipient);
|
|
162
|
+
priceUrl.searchParams.append("swapFeeBps", args.swapFeeBps.toString());
|
|
163
|
+
priceUrl.searchParams.append("swapFeeToken", args.sellToken);
|
|
164
|
+
}
|
|
165
|
+
const priceResponse = await fetch(priceUrl.toString(), {
|
|
166
|
+
method: "GET",
|
|
167
|
+
headers: {
|
|
168
|
+
"Content-Type": "application/json",
|
|
169
|
+
"0x-api-key": __classPrivateFieldGet(this, _ZeroXActionProvider_apiKey, "f"),
|
|
170
|
+
"0x-version": "v2",
|
|
171
|
+
},
|
|
172
|
+
});
|
|
173
|
+
if (!priceResponse.ok) {
|
|
174
|
+
const errorText = await priceResponse.text();
|
|
175
|
+
return JSON.stringify({
|
|
176
|
+
success: false,
|
|
177
|
+
error: `Error fetching swap price: ${priceResponse.status} ${priceResponse.statusText} - ${errorText}`,
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
const priceData = await priceResponse.json();
|
|
181
|
+
// Check if liquidity is available
|
|
182
|
+
if (priceData.liquidityAvailable === false) {
|
|
183
|
+
return JSON.stringify({
|
|
184
|
+
success: false,
|
|
185
|
+
error: "No liquidity available for this swap.",
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
// Check if balance of sell token is enough
|
|
189
|
+
if (priceData.balance != null) {
|
|
190
|
+
return JSON.stringify({
|
|
191
|
+
success: false,
|
|
192
|
+
error: `Insufficient balance of sell token ${priceData.balance.token}. Requested to swap ${priceData.balance.expected}, but balance is only ${priceData.balance.actual}.`,
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
// Check if permit2 approval is needed for ERC20 tokens
|
|
196
|
+
// Only needed once per token per address
|
|
197
|
+
let approvalTxHash = null;
|
|
198
|
+
if (priceData.issues?.allowance) {
|
|
199
|
+
try {
|
|
200
|
+
approvalTxHash = await walletProvider.sendTransaction({
|
|
201
|
+
to: args.sellToken,
|
|
202
|
+
data: (0, viem_1.encodeFunctionData)({
|
|
203
|
+
abi: viem_1.erc20Abi,
|
|
204
|
+
functionName: "approve",
|
|
205
|
+
args: [utils_1.PERMIT2_ADDRESS, viem_1.maxUint256],
|
|
206
|
+
}),
|
|
207
|
+
});
|
|
208
|
+
await walletProvider.waitForTransactionReceipt(approvalTxHash);
|
|
209
|
+
}
|
|
210
|
+
catch (error) {
|
|
211
|
+
return JSON.stringify({
|
|
212
|
+
success: false,
|
|
213
|
+
error: `Error approving token: ${error}`,
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
// Fetch the swap quote
|
|
218
|
+
const quoteUrl = new URL("https://api.0x.org/swap/permit2/quote");
|
|
219
|
+
quoteUrl.searchParams.append("chainId", chainId.toString());
|
|
220
|
+
quoteUrl.searchParams.append("sellToken", args.sellToken);
|
|
221
|
+
quoteUrl.searchParams.append("buyToken", args.buyToken);
|
|
222
|
+
quoteUrl.searchParams.append("sellAmount", sellAmount);
|
|
223
|
+
quoteUrl.searchParams.append("taker", walletAddress);
|
|
224
|
+
quoteUrl.searchParams.append("slippageBps", args.slippageBps.toString());
|
|
225
|
+
if (args.swapFeeRecipient) {
|
|
226
|
+
quoteUrl.searchParams.append("swapFeeRecipient", args.swapFeeRecipient);
|
|
227
|
+
quoteUrl.searchParams.append("swapFeeBps", args.swapFeeBps.toString());
|
|
228
|
+
quoteUrl.searchParams.append("swapFeeToken", args.sellToken);
|
|
229
|
+
}
|
|
230
|
+
const quoteResponse = await fetch(quoteUrl.toString(), {
|
|
231
|
+
method: "GET",
|
|
232
|
+
headers: {
|
|
233
|
+
"Content-Type": "application/json",
|
|
234
|
+
"0x-api-key": __classPrivateFieldGet(this, _ZeroXActionProvider_apiKey, "f"),
|
|
235
|
+
"0x-version": "v2",
|
|
236
|
+
},
|
|
237
|
+
});
|
|
238
|
+
if (!quoteResponse.ok) {
|
|
239
|
+
const errorText = await quoteResponse.text();
|
|
240
|
+
return JSON.stringify({
|
|
241
|
+
success: false,
|
|
242
|
+
error: `Error fetching swap quote: ${quoteResponse.status} ${quoteResponse.statusText} - ${errorText}`,
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
const quoteData = await quoteResponse.json();
|
|
246
|
+
// Sign Permit2.eip712 returned from quote
|
|
247
|
+
let signature;
|
|
248
|
+
if (quoteData.permit2?.eip712) {
|
|
249
|
+
try {
|
|
250
|
+
// For LegacyCdpWalletProvider, remove EIP712Domain to avoid ambiguous primary types
|
|
251
|
+
const types = walletProvider instanceof wallet_providers_1.LegacyCdpWalletProvider
|
|
252
|
+
? (() => {
|
|
253
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
254
|
+
const { EIP712Domain, ...rest } = quoteData.permit2.eip712.types;
|
|
255
|
+
return rest;
|
|
256
|
+
})()
|
|
257
|
+
: quoteData.permit2.eip712.types;
|
|
258
|
+
const typedData = {
|
|
259
|
+
domain: quoteData.permit2.eip712.domain,
|
|
260
|
+
types,
|
|
261
|
+
primaryType: quoteData.permit2.eip712.primaryType,
|
|
262
|
+
message: quoteData.permit2.eip712.message,
|
|
263
|
+
};
|
|
264
|
+
signature = await walletProvider.signTypedData(typedData);
|
|
265
|
+
// Append sig length and sig data to transaction.data
|
|
266
|
+
if (signature && quoteData.transaction?.data) {
|
|
267
|
+
const signatureLengthInHex = (0, viem_1.numberToHex)((0, viem_1.size)(signature), {
|
|
268
|
+
signed: false,
|
|
269
|
+
size: 32,
|
|
270
|
+
});
|
|
271
|
+
const transactionData = quoteData.transaction.data;
|
|
272
|
+
const sigLengthHex = signatureLengthInHex;
|
|
273
|
+
const sig = signature;
|
|
274
|
+
quoteData.transaction.data = (0, viem_1.concat)([transactionData, sigLengthHex, sig]);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
catch (error) {
|
|
278
|
+
return JSON.stringify({
|
|
279
|
+
success: false,
|
|
280
|
+
error: `Error signing permit2 message: ${error}`,
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
// Execute swap
|
|
285
|
+
try {
|
|
286
|
+
// Prepare transaction parameters
|
|
287
|
+
const txParams = {
|
|
288
|
+
to: quoteData.transaction.to,
|
|
289
|
+
data: quoteData.transaction.data,
|
|
290
|
+
...(quoteData?.transaction.gas ? { gas: BigInt(quoteData.transaction.gas) } : {}),
|
|
291
|
+
...(quoteData.transaction.value ? { value: BigInt(quoteData.transaction.value) } : {}),
|
|
292
|
+
};
|
|
293
|
+
// Send transaction
|
|
294
|
+
const txHash = await walletProvider.sendTransaction(txParams);
|
|
295
|
+
const receipt = await walletProvider.waitForTransactionReceipt(txHash);
|
|
296
|
+
if (receipt.status !== "complete" && receipt.status !== "success") {
|
|
297
|
+
return JSON.stringify({
|
|
298
|
+
success: false,
|
|
299
|
+
...(approvalTxHash ? { approvalTxHash } : {}),
|
|
300
|
+
transactionHash: receipt.transactionHash,
|
|
301
|
+
error: `Swap transaction failed`,
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
// Format the response
|
|
305
|
+
const formattedResponse = {
|
|
306
|
+
success: true,
|
|
307
|
+
...(approvalTxHash ? { approvalTxHash } : {}),
|
|
308
|
+
transactionHash: receipt.transactionHash,
|
|
309
|
+
sellAmount: (0, viem_1.formatUnits)(BigInt(sellAmount), sellTokenDecimals),
|
|
310
|
+
sellTokenName: sellTokenName,
|
|
311
|
+
sellToken: args.sellToken,
|
|
312
|
+
buyAmount: (0, viem_1.formatUnits)(quoteData.buyAmount, buyTokenDecimals),
|
|
313
|
+
minBuyAmount: quoteData.minBuyAmount
|
|
314
|
+
? (0, viem_1.formatUnits)(quoteData.minBuyAmount, buyTokenDecimals)
|
|
315
|
+
: null,
|
|
316
|
+
buyTokenName: buyTokenName,
|
|
317
|
+
buyToken: args.buyToken,
|
|
318
|
+
slippageBps: args.slippageBps,
|
|
319
|
+
network: network.networkId,
|
|
320
|
+
};
|
|
321
|
+
return JSON.stringify(formattedResponse);
|
|
322
|
+
}
|
|
323
|
+
catch (error) {
|
|
324
|
+
return JSON.stringify({
|
|
325
|
+
success: false,
|
|
326
|
+
error: `Error sending swap transaction: ${error}`,
|
|
327
|
+
...(approvalTxHash ? { approvalTxHash } : {}),
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
catch (error) {
|
|
332
|
+
return JSON.stringify({
|
|
333
|
+
success: false,
|
|
334
|
+
error: `Error executing swap: ${error}`,
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
exports.ZeroXActionProvider = ZeroXActionProvider;
|
|
340
|
+
_ZeroXActionProvider_apiKey = new WeakMap();
|
|
341
|
+
__decorate([
|
|
342
|
+
(0, actionDecorator_1.CreateAction)({
|
|
343
|
+
name: "get_swap_price_quote_from_0x",
|
|
344
|
+
description: `
|
|
345
|
+
This tool fetches a price quote for swapping between two tokens using the 0x API.
|
|
346
|
+
|
|
347
|
+
It takes the following inputs:
|
|
348
|
+
- sellToken: The contract address of the token to sell
|
|
349
|
+
- buyToken: The contract address of the token to buy
|
|
350
|
+
- sellAmount: The amount of sellToken to swap in whole units (e.g. 1 ETH or 10 USDC)
|
|
351
|
+
- slippageBps: (Optional) Maximum allowed slippage in basis points (100 = 1%)
|
|
352
|
+
- swapFeeRecipient: (Optional) The wallet address to receive affiliate trading fees
|
|
353
|
+
- swapFeeBps: The amount in basis points (0-1000) to charge as affiliate fees (defaults to 100 = 1%), only used if swapFeeRecipient is provided
|
|
354
|
+
|
|
355
|
+
Important notes:
|
|
356
|
+
- The contract address for native ETH is "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"
|
|
357
|
+
- This only fetches a price quote and does not execute a swap
|
|
358
|
+
- Supported on all EVM networks compatible with 0x API
|
|
359
|
+
- Use sellToken units exactly as provided, do not convert to wei or any other units
|
|
360
|
+
- Never assume token or address, they have to be provided as inputs. If only token symbol is provided, use the get_token_address tool if available to get the token address first
|
|
361
|
+
`,
|
|
362
|
+
schema: schemas_1.GetSwapPriceSchema,
|
|
363
|
+
}),
|
|
364
|
+
__metadata("design:type", Function),
|
|
365
|
+
__metadata("design:paramtypes", [wallet_providers_1.EvmWalletProvider, void 0]),
|
|
366
|
+
__metadata("design:returntype", Promise)
|
|
367
|
+
], ZeroXActionProvider.prototype, "getSwapPrice", null);
|
|
368
|
+
__decorate([
|
|
369
|
+
(0, actionDecorator_1.CreateAction)({
|
|
370
|
+
name: "execute_swap_on_0x",
|
|
371
|
+
description: `
|
|
372
|
+
This tool executes a token swap between two tokens using the 0x API.
|
|
373
|
+
|
|
374
|
+
It takes the following inputs:
|
|
375
|
+
- sellToken: The contract address of the token to sell
|
|
376
|
+
- buyToken: The contract address of the token to buy
|
|
377
|
+
- sellAmount: The amount of sellToken to swap in whole units (e.g. 1 ETH or 10 USDC)
|
|
378
|
+
- slippageBps: (Optional) Maximum allowed slippage in basis points (100 = 1%)
|
|
379
|
+
- swapFeeRecipient: (Optional) The wallet address to receive affiliate trading fees
|
|
380
|
+
- swapFeeBps: The amount in basis points (0-1000) to charge as affiliate fees (defaults to 100 = 1%), only used if swapFeeRecipient is provided
|
|
381
|
+
|
|
382
|
+
Important notes:
|
|
383
|
+
- The contract address for native ETH is "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"
|
|
384
|
+
- This will execute an actual swap transaction that sends tokens from your wallet
|
|
385
|
+
- If needed, it will automatically approve the permit2 contract to spend the sell token
|
|
386
|
+
- The approval transaction is only needed once per token
|
|
387
|
+
- Ensure you have sufficient balance of the sell token before executing
|
|
388
|
+
- The trade size might influence the excecution price depending on available liquidity
|
|
389
|
+
- First fetch a price quote and only execute swap if you are happy with the indicated price
|
|
390
|
+
- Supported on all EVM networks compatible with 0x API
|
|
391
|
+
- Use sellToken units exactly as provided, do not convert to wei or any other units
|
|
392
|
+
- Never assume token or address, they have to be provided as inputs. If only token symbol is provided, use the get_token_address tool if available to get the token address first
|
|
393
|
+
`,
|
|
394
|
+
schema: schemas_1.ExecuteSwapSchema,
|
|
395
|
+
}),
|
|
396
|
+
__metadata("design:type", Function),
|
|
397
|
+
__metadata("design:paramtypes", [wallet_providers_1.EvmWalletProvider, void 0]),
|
|
398
|
+
__metadata("design:returntype", Promise)
|
|
399
|
+
], ZeroXActionProvider.prototype, "executeSwap", null);
|
|
400
|
+
/**
|
|
401
|
+
* Creates a new ZeroXActionProvider with the provided configuration.
|
|
402
|
+
*
|
|
403
|
+
* @param config - Optional configuration for the provider.
|
|
404
|
+
* @returns A new ZeroXActionProvider.
|
|
405
|
+
*/
|
|
406
|
+
const zeroXActionProvider = (config) => new ZeroXActionProvider(config);
|
|
407
|
+
exports.zeroXActionProvider = zeroXActionProvider;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|