@coinbase/agentkit 0.0.0-nightly-20250919210434 → 0.0.0-nightly-20251002210424
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 +170 -39
- 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.js +7 -30
- package/dist/action-providers/cdp/cdpApiActionProvider.test.js +2 -8
- package/dist/action-providers/cdp/cdpEvmWalletActionProvider.js +2 -1
- package/dist/action-providers/cdp/cdpEvmWalletActionProvider.test.js +3 -1
- package/dist/action-providers/cdp/cdpSmartWalletActionProvider.js +2 -1
- package/dist/action-providers/cdp/cdpSmartWalletActionProvider.test.js +3 -1
- package/dist/action-providers/cdp/faucetUtils.d.ts +38 -0
- package/dist/action-providers/cdp/faucetUtils.js +81 -0
- package/dist/action-providers/cdp/swapUtils.d.ts +0 -9
- package/dist/action-providers/cdp/swapUtils.js +0 -36
- package/dist/action-providers/clanker/schemas.d.ts +6 -6
- 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 +102 -0
- 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/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 +41 -20
- package/dist/action-providers/flaunch/constants.js +111 -36
- package/dist/action-providers/flaunch/flaunchActionProvider.d.ts +4 -43
- package/dist/action-providers/flaunch/flaunchActionProvider.js +132 -200
- package/dist/action-providers/flaunch/flaunchActionProvider.test.js +108 -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 -1
- package/dist/action-providers/index.js +4 -1
- package/dist/action-providers/superfluid/superfluidSuperTokenCreatorActionProvider.js +5 -4
- package/dist/action-providers/superfluid/utils/parseLogs.d.ts +2 -1
- package/dist/action-providers/superfluid/utils/parseLogs.js +6 -3
- package/dist/action-providers/wallet/walletActionProvider.js +3 -0
- 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/utils.d.ts +4 -4
- package/dist/action-providers/x402/utils.js +42 -5
- package/dist/action-providers/x402/x402ActionProvider.d.ts +6 -6
- package/dist/action-providers/x402/x402ActionProvider.js +23 -8
- package/dist/action-providers/x402/x402ActionProvider.test.js +50 -6
- 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/types.js +2 -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/utils.d.ts +10 -0
- package/dist/utils.js +43 -13
- package/dist/wallet-providers/cdpEvmWalletProvider.js +5 -21
- package/dist/wallet-providers/cdpSmartWalletProvider.js +10 -7
- package/dist/wallet-providers/cdpSmartWalletProvider.test.js +0 -8
- 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/dist/wallet-providers/viemWalletProvider.d.ts +1 -1
- package/dist/wallet-providers/viemWalletProvider.js +5 -1
- package/dist/wallet-providers/viemWalletProvider.test.js +12 -1
- package/package.json +4 -1
|
@@ -1,174 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getSwapAmountsFromReceipt = exports.getSwapAmountsFromLog = exports.memecoinToEthWithPermit2 = exports.ethToMemecoin = exports.getAmountWithSlippage =
|
|
3
|
+
exports.getSwapAmountsFromReceipt = exports.getSwapAmountsFromLog = exports.memecoinToEthWithPermit2 = exports.ethToMemecoin = exports.getAmountWithSlippage = void 0;
|
|
4
|
+
exports.buyFlaunchCoin = buyFlaunchCoin;
|
|
4
5
|
const viem_1 = require("viem");
|
|
5
6
|
const constants_1 = require("./constants");
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
*
|
|
9
|
-
* @param params - Configuration and base64 image data
|
|
10
|
-
* @param params.pinataConfig - Pinata configuration including JWT
|
|
11
|
-
* @param params.base64Image - Base64 encoded image data
|
|
12
|
-
* @param params.name - Optional name for the uploaded file
|
|
13
|
-
* @param params.metadata - Optional metadata key-value pairs
|
|
14
|
-
* @returns Upload response with CID and other details
|
|
15
|
-
*/
|
|
16
|
-
const uploadImageToIPFS = async (params) => {
|
|
17
|
-
try {
|
|
18
|
-
const formData = new FormData();
|
|
19
|
-
// Convert base64 to Blob and then to File
|
|
20
|
-
// Remove data URL prefix if present (e.g., "data:image/jpeg;base64,")
|
|
21
|
-
const base64Data = params.base64Image.split(",")[1] || params.base64Image;
|
|
22
|
-
const byteCharacters = atob(base64Data);
|
|
23
|
-
const byteArrays = [];
|
|
24
|
-
for (let offset = 0; offset < byteCharacters.length; offset += 1024) {
|
|
25
|
-
const slice = byteCharacters.slice(offset, offset + 1024);
|
|
26
|
-
const byteNumbers = new Array(slice.length);
|
|
27
|
-
for (let i = 0; i < slice.length; i++) {
|
|
28
|
-
byteNumbers[i] = slice.charCodeAt(i);
|
|
29
|
-
}
|
|
30
|
-
const byteArray = new Uint8Array(byteNumbers);
|
|
31
|
-
byteArrays.push(byteArray);
|
|
32
|
-
}
|
|
33
|
-
// Detect mime type from base64 string
|
|
34
|
-
let mimeType = "image/png"; // default
|
|
35
|
-
if (params.base64Image.startsWith("data:")) {
|
|
36
|
-
mimeType = params.base64Image.split(";")[0].split(":")[1];
|
|
37
|
-
}
|
|
38
|
-
const blob = new Blob(byteArrays, { type: mimeType });
|
|
39
|
-
const fileName = params.name || `image.${mimeType.split("/")[1]}`;
|
|
40
|
-
const file = new File([blob], fileName, { type: mimeType });
|
|
41
|
-
formData.append("file", file);
|
|
42
|
-
const pinataMetadata = {
|
|
43
|
-
name: params.name || null,
|
|
44
|
-
keyvalues: params.metadata || {},
|
|
45
|
-
};
|
|
46
|
-
formData.append("pinataMetadata", JSON.stringify(pinataMetadata));
|
|
47
|
-
const pinataOptions = {
|
|
48
|
-
cidVersion: 1,
|
|
49
|
-
};
|
|
50
|
-
formData.append("pinataOptions", JSON.stringify(pinataOptions));
|
|
51
|
-
const response = await fetch("https://api.pinata.cloud/pinning/pinFileToIPFS", {
|
|
52
|
-
method: "POST",
|
|
53
|
-
headers: {
|
|
54
|
-
Authorization: `Bearer ${params.pinataConfig.jwt}`,
|
|
55
|
-
},
|
|
56
|
-
body: formData,
|
|
57
|
-
});
|
|
58
|
-
if (!response.ok) {
|
|
59
|
-
const error = await response.json();
|
|
60
|
-
throw new Error(`Failed to upload image to IPFS: ${error.message || response.statusText}`);
|
|
61
|
-
}
|
|
62
|
-
const data = await response.json();
|
|
63
|
-
return {
|
|
64
|
-
IpfsHash: data.IpfsHash,
|
|
65
|
-
PinSize: data.PinSize,
|
|
66
|
-
Timestamp: data.Timestamp,
|
|
67
|
-
isDuplicate: data.isDuplicate || false,
|
|
68
|
-
};
|
|
69
|
-
}
|
|
70
|
-
catch (error) {
|
|
71
|
-
if (error instanceof Error) {
|
|
72
|
-
throw new Error(`Failed to upload image to IPFS: ${error.message}`);
|
|
73
|
-
}
|
|
74
|
-
throw error;
|
|
75
|
-
}
|
|
76
|
-
};
|
|
77
|
-
/**
|
|
78
|
-
* Uploads JSON data to IPFS using Pinata
|
|
79
|
-
*
|
|
80
|
-
* @param params - Configuration and JSON data
|
|
81
|
-
* @param params.pinataConfig - Pinata configuration including JWT
|
|
82
|
-
* @param params.json - JSON data to upload
|
|
83
|
-
* @param params.name - Optional name for the uploaded file
|
|
84
|
-
* @param params.metadata - Optional metadata key-value pairs
|
|
85
|
-
* @returns Upload response with CID and other details
|
|
86
|
-
*/
|
|
87
|
-
const uploadJsonToIPFS = async (params) => {
|
|
88
|
-
try {
|
|
89
|
-
const requestBody = {
|
|
90
|
-
pinataOptions: {
|
|
91
|
-
cidVersion: 1,
|
|
92
|
-
},
|
|
93
|
-
pinataMetadata: {
|
|
94
|
-
name: params.name || null,
|
|
95
|
-
keyvalues: params.metadata || {},
|
|
96
|
-
},
|
|
97
|
-
pinataContent: params.json,
|
|
98
|
-
};
|
|
99
|
-
const response = await fetch("https://api.pinata.cloud/pinning/pinJSONToIPFS", {
|
|
100
|
-
method: "POST",
|
|
101
|
-
headers: {
|
|
102
|
-
Authorization: `Bearer ${params.pinataConfig.jwt}`,
|
|
103
|
-
"Content-Type": "application/json",
|
|
104
|
-
},
|
|
105
|
-
body: JSON.stringify(requestBody),
|
|
106
|
-
});
|
|
107
|
-
if (!response.ok) {
|
|
108
|
-
const error = await response.json();
|
|
109
|
-
throw new Error(`Failed to upload JSON to IPFS: ${error.message || response.statusText}`);
|
|
110
|
-
}
|
|
111
|
-
const data = await response.json();
|
|
112
|
-
return {
|
|
113
|
-
IpfsHash: data.IpfsHash,
|
|
114
|
-
PinSize: data.PinSize,
|
|
115
|
-
Timestamp: data.Timestamp,
|
|
116
|
-
isDuplicate: data.isDuplicate || false,
|
|
117
|
-
};
|
|
118
|
-
}
|
|
119
|
-
catch (error) {
|
|
120
|
-
if (error instanceof Error) {
|
|
121
|
-
throw new Error(`Failed to upload JSON to IPFS: ${error.message}`);
|
|
122
|
-
}
|
|
123
|
-
throw error;
|
|
124
|
-
}
|
|
125
|
-
};
|
|
126
|
-
const generateTokenUriBase64Image = async (name, params) => {
|
|
127
|
-
// 1. upload image to IPFS
|
|
128
|
-
const imageRes = await uploadImageToIPFS({
|
|
129
|
-
pinataConfig: params.pinataConfig,
|
|
130
|
-
base64Image: params.metadata.base64Image,
|
|
131
|
-
});
|
|
132
|
-
// 2. upload metadata to IPFS
|
|
133
|
-
const coinMetadata = {
|
|
134
|
-
name,
|
|
135
|
-
description: params.metadata.description,
|
|
136
|
-
image: `ipfs://${imageRes.IpfsHash}`,
|
|
137
|
-
external_link: params.metadata.websiteUrl || "",
|
|
138
|
-
collaborators: [],
|
|
139
|
-
discordUrl: params.metadata.discordUrl || "",
|
|
140
|
-
twitterUrl: params.metadata.twitterUrl || "",
|
|
141
|
-
telegramUrl: params.metadata.telegramUrl || "",
|
|
142
|
-
};
|
|
143
|
-
const metadataRes = await uploadJsonToIPFS({
|
|
144
|
-
pinataConfig: params.pinataConfig,
|
|
145
|
-
json: coinMetadata,
|
|
146
|
-
});
|
|
147
|
-
return `ipfs://${metadataRes.IpfsHash}`;
|
|
148
|
-
};
|
|
149
|
-
const generateTokenUri = async (name, params) => {
|
|
150
|
-
// 1. get base64Image from imageUrl
|
|
151
|
-
const response = await fetch(params.metadata.imageUrl);
|
|
152
|
-
if (!response.ok) {
|
|
153
|
-
throw new Error(`Failed to fetch image: ${response.statusText}`);
|
|
154
|
-
}
|
|
155
|
-
const arrayBuffer = await response.arrayBuffer();
|
|
156
|
-
const base64Image = Buffer.from(arrayBuffer).toString("base64");
|
|
157
|
-
// 2. generate token uri
|
|
158
|
-
const tokenUri = await generateTokenUriBase64Image(name, {
|
|
159
|
-
pinataConfig: params.pinataConfig,
|
|
160
|
-
metadata: {
|
|
161
|
-
base64Image,
|
|
162
|
-
description: params.metadata.description,
|
|
163
|
-
websiteUrl: params.metadata.websiteUrl,
|
|
164
|
-
discordUrl: params.metadata.discordUrl,
|
|
165
|
-
twitterUrl: params.metadata.twitterUrl,
|
|
166
|
-
telegramUrl: params.metadata.telegramUrl,
|
|
167
|
-
},
|
|
168
|
-
});
|
|
169
|
-
return tokenUri;
|
|
170
|
-
};
|
|
171
|
-
exports.generateTokenUri = generateTokenUri;
|
|
7
|
+
const network_1 = require("../../network");
|
|
8
|
+
const viem_2 = require("viem");
|
|
172
9
|
const getAmountWithSlippage = (amount, slippage, swapType) => {
|
|
173
10
|
if (amount == null) {
|
|
174
11
|
return 0n;
|
|
@@ -184,7 +21,7 @@ const ETH = viem_1.zeroAddress;
|
|
|
184
21
|
const ethToMemecoin = (params) => {
|
|
185
22
|
const flETH = constants_1.FLETHAddress[params.chainId];
|
|
186
23
|
const flETHHooks = constants_1.FLETHHooksAddress[params.chainId];
|
|
187
|
-
const flaunchHooks = constants_1.
|
|
24
|
+
const flaunchHooks = constants_1.FlaunchPositionManagerV1_1Address[params.chainId];
|
|
188
25
|
// Determine actions based on swapType
|
|
189
26
|
const v4Actions = ("0x" +
|
|
190
27
|
(params.swapType === "EXACT_IN" ? constants_1.V4Actions.SWAP_EXACT_IN : constants_1.V4Actions.SWAP_EXACT_OUT) +
|
|
@@ -314,11 +151,11 @@ const ethToMemecoin = (params) => {
|
|
|
314
151
|
};
|
|
315
152
|
exports.ethToMemecoin = ethToMemecoin;
|
|
316
153
|
// @notice Before calling the UniversalRouter the user must have:
|
|
317
|
-
//
|
|
154
|
+
// Given the Permit2 contract allowance to spend the memecoin
|
|
318
155
|
const memecoinToEthWithPermit2 = (params) => {
|
|
319
156
|
const flETH = constants_1.FLETHAddress[params.chainId];
|
|
320
157
|
const flETHHooks = constants_1.FLETHHooksAddress[params.chainId];
|
|
321
|
-
const flaunchHooks = constants_1.
|
|
158
|
+
const flaunchHooks = constants_1.FlaunchPositionManagerV1_1Address[params.chainId];
|
|
322
159
|
const v4Actions = ("0x" +
|
|
323
160
|
constants_1.V4Actions.SWAP_EXACT_IN +
|
|
324
161
|
constants_1.V4Actions.SETTLE_ALL +
|
|
@@ -483,11 +320,11 @@ const getSwapAmountsFromReceipt = ({ receipt, coinAddress, chainId, }) => {
|
|
|
483
320
|
const filteredPoolSwapEvent = receipt.logs
|
|
484
321
|
.map(log => {
|
|
485
322
|
try {
|
|
486
|
-
if (log.address.toLowerCase() !== constants_1.
|
|
323
|
+
if (log.address.toLowerCase() !== constants_1.FlaunchPositionManagerV1_1Address[chainId].toLowerCase()) {
|
|
487
324
|
return null;
|
|
488
325
|
}
|
|
489
326
|
const event = (0, viem_1.decodeEventLog)({
|
|
490
|
-
abi: constants_1.
|
|
327
|
+
abi: constants_1.POSITION_MANAGERV1_1_ABI,
|
|
491
328
|
data: log.data,
|
|
492
329
|
topics: log.topics,
|
|
493
330
|
});
|
|
@@ -505,3 +342,131 @@ const getSwapAmountsFromReceipt = ({ receipt, coinAddress, chainId, }) => {
|
|
|
505
342
|
});
|
|
506
343
|
};
|
|
507
344
|
exports.getSwapAmountsFromReceipt = getSwapAmountsFromReceipt;
|
|
345
|
+
/**
|
|
346
|
+
* Buys a flaunch coin using ETH input.
|
|
347
|
+
*
|
|
348
|
+
* @param walletProvider - The wallet provider instance for blockchain interactions
|
|
349
|
+
* @param coinAddress - The address of the coin to buy
|
|
350
|
+
* @param swapType - The type of swap to perform
|
|
351
|
+
* @param swapParams - The parameters for the swap
|
|
352
|
+
* @param swapParams.amountIn - The amount of ETH to spend (for EXACT_IN)
|
|
353
|
+
* @param swapParams.amountOut - The amount of coins to buy (for EXACT_OUT)
|
|
354
|
+
* @param slippagePercent - The slippage percentage
|
|
355
|
+
* @returns A promise that resolves to a string describing the transaction result
|
|
356
|
+
*/
|
|
357
|
+
async function buyFlaunchCoin(walletProvider, coinAddress, swapType, swapParams, slippagePercent) {
|
|
358
|
+
const network = walletProvider.getNetwork();
|
|
359
|
+
const chainId = network.chainId;
|
|
360
|
+
const networkId = network.networkId;
|
|
361
|
+
if (!chainId || !networkId) {
|
|
362
|
+
throw new Error("Chain ID is not set.");
|
|
363
|
+
}
|
|
364
|
+
try {
|
|
365
|
+
let amountIn;
|
|
366
|
+
let amountOutMin;
|
|
367
|
+
let amountOut;
|
|
368
|
+
let amountInMax;
|
|
369
|
+
if (swapType === "EXACT_IN") {
|
|
370
|
+
amountIn = (0, viem_1.parseEther)(swapParams.amountIn);
|
|
371
|
+
const quoteResult = await walletProvider.getPublicClient().simulateContract({
|
|
372
|
+
address: constants_1.QuoterAddress[chainId],
|
|
373
|
+
abi: constants_1.QUOTER_ABI,
|
|
374
|
+
functionName: "quoteExactInput",
|
|
375
|
+
args: [
|
|
376
|
+
{
|
|
377
|
+
exactAmount: amountIn,
|
|
378
|
+
exactCurrency: viem_1.zeroAddress, // ETH
|
|
379
|
+
path: [
|
|
380
|
+
{
|
|
381
|
+
fee: 0,
|
|
382
|
+
tickSpacing: 60,
|
|
383
|
+
hookData: "0x",
|
|
384
|
+
hooks: constants_1.FLETHHooksAddress[chainId],
|
|
385
|
+
intermediateCurrency: constants_1.FLETHAddress[chainId],
|
|
386
|
+
},
|
|
387
|
+
{
|
|
388
|
+
fee: 0,
|
|
389
|
+
tickSpacing: 60,
|
|
390
|
+
hooks: constants_1.FlaunchPositionManagerV1_1Address[chainId],
|
|
391
|
+
hookData: "0x",
|
|
392
|
+
intermediateCurrency: coinAddress,
|
|
393
|
+
},
|
|
394
|
+
],
|
|
395
|
+
},
|
|
396
|
+
],
|
|
397
|
+
});
|
|
398
|
+
amountOutMin = (0, exports.getAmountWithSlippage)(quoteResult.result[0], // amountOut
|
|
399
|
+
(slippagePercent / 100).toFixed(18).toString(), swapType);
|
|
400
|
+
}
|
|
401
|
+
else {
|
|
402
|
+
// EXACT_OUT
|
|
403
|
+
amountOut = (0, viem_1.parseEther)(swapParams.amountOut);
|
|
404
|
+
const quoteResult = await walletProvider.getPublicClient().simulateContract({
|
|
405
|
+
address: constants_1.QuoterAddress[chainId],
|
|
406
|
+
abi: constants_1.QUOTER_ABI,
|
|
407
|
+
functionName: "quoteExactOutput",
|
|
408
|
+
args: [
|
|
409
|
+
{
|
|
410
|
+
path: [
|
|
411
|
+
{
|
|
412
|
+
intermediateCurrency: viem_1.zeroAddress,
|
|
413
|
+
fee: 0,
|
|
414
|
+
tickSpacing: 60,
|
|
415
|
+
hookData: "0x",
|
|
416
|
+
hooks: constants_1.FLETHHooksAddress[chainId],
|
|
417
|
+
},
|
|
418
|
+
{
|
|
419
|
+
intermediateCurrency: constants_1.FLETHAddress[chainId],
|
|
420
|
+
fee: 0,
|
|
421
|
+
tickSpacing: 60,
|
|
422
|
+
hooks: constants_1.FlaunchPositionManagerV1_1Address[chainId],
|
|
423
|
+
hookData: "0x",
|
|
424
|
+
},
|
|
425
|
+
],
|
|
426
|
+
exactCurrency: coinAddress,
|
|
427
|
+
exactAmount: amountOut,
|
|
428
|
+
},
|
|
429
|
+
],
|
|
430
|
+
});
|
|
431
|
+
amountInMax = (0, exports.getAmountWithSlippage)(quoteResult.result[0], // amountIn
|
|
432
|
+
(slippagePercent / 100).toFixed(18).toString(), swapType);
|
|
433
|
+
}
|
|
434
|
+
const { commands, inputs } = (0, exports.ethToMemecoin)({
|
|
435
|
+
sender: walletProvider.getAddress(),
|
|
436
|
+
memecoin: coinAddress,
|
|
437
|
+
chainId: Number(chainId),
|
|
438
|
+
referrer: viem_1.zeroAddress,
|
|
439
|
+
swapType,
|
|
440
|
+
amountIn,
|
|
441
|
+
amountOutMin,
|
|
442
|
+
amountOut,
|
|
443
|
+
amountInMax,
|
|
444
|
+
});
|
|
445
|
+
const data = (0, viem_1.encodeFunctionData)({
|
|
446
|
+
abi: constants_1.UNIVERSAL_ROUTER_ABI,
|
|
447
|
+
functionName: "execute",
|
|
448
|
+
args: [commands, inputs],
|
|
449
|
+
});
|
|
450
|
+
const hash = await walletProvider.sendTransaction({
|
|
451
|
+
to: constants_1.UniversalRouterAddress[chainId],
|
|
452
|
+
data,
|
|
453
|
+
value: swapType === "EXACT_IN" ? amountIn : amountInMax,
|
|
454
|
+
});
|
|
455
|
+
const receipt = await walletProvider.waitForTransactionReceipt(hash);
|
|
456
|
+
const swapAmounts = (0, exports.getSwapAmountsFromReceipt)({
|
|
457
|
+
receipt,
|
|
458
|
+
coinAddress: coinAddress,
|
|
459
|
+
chainId: Number(chainId),
|
|
460
|
+
});
|
|
461
|
+
const coinSymbol = await walletProvider.readContract({
|
|
462
|
+
address: coinAddress,
|
|
463
|
+
abi: constants_1.ERC20_ABI,
|
|
464
|
+
functionName: "symbol",
|
|
465
|
+
});
|
|
466
|
+
return `Bought ${(0, viem_2.formatEther)(swapAmounts.coinsBought)} $${coinSymbol} for ${(0, viem_2.formatEther)(swapAmounts.ethSold)} ETH\n
|
|
467
|
+
Tx hash: [${hash}](${network_1.NETWORK_ID_TO_VIEM_CHAIN[networkId].blockExplorers?.default.url}/tx/${hash})`;
|
|
468
|
+
}
|
|
469
|
+
catch (error) {
|
|
470
|
+
return `Error buying coin: ${error}`;
|
|
471
|
+
}
|
|
472
|
+
}
|
|
@@ -3,11 +3,14 @@ export * from "./actionProvider";
|
|
|
3
3
|
export * from "./customActionProvider";
|
|
4
4
|
export * from "./across";
|
|
5
5
|
export * from "./alchemy";
|
|
6
|
+
export * from "./baseAccount";
|
|
6
7
|
export * from "./basename";
|
|
7
8
|
export * from "./cdp-legacy";
|
|
8
9
|
export * from "./cdp";
|
|
10
|
+
export * from "./clanker";
|
|
9
11
|
export * from "./compound";
|
|
10
12
|
export * from "./defillama";
|
|
13
|
+
export * from "./enso";
|
|
11
14
|
export * from "./erc20";
|
|
12
15
|
export * from "./erc721";
|
|
13
16
|
export * from "./farcaster";
|
|
@@ -29,8 +32,8 @@ export * from "./flaunch";
|
|
|
29
32
|
export * from "./onramp";
|
|
30
33
|
export * from "./vaultsfyi";
|
|
31
34
|
export * from "./x402";
|
|
35
|
+
export * from "./yelay";
|
|
32
36
|
export * from "./zerion";
|
|
33
37
|
export * from "./zerodev";
|
|
34
38
|
export * from "./zeroX";
|
|
35
39
|
export * from "./zora";
|
|
36
|
-
export * from "./clanker";
|
|
@@ -19,11 +19,14 @@ __exportStar(require("./actionProvider"), exports);
|
|
|
19
19
|
__exportStar(require("./customActionProvider"), exports);
|
|
20
20
|
__exportStar(require("./across"), exports);
|
|
21
21
|
__exportStar(require("./alchemy"), exports);
|
|
22
|
+
__exportStar(require("./baseAccount"), exports);
|
|
22
23
|
__exportStar(require("./basename"), exports);
|
|
23
24
|
__exportStar(require("./cdp-legacy"), exports);
|
|
24
25
|
__exportStar(require("./cdp"), exports);
|
|
26
|
+
__exportStar(require("./clanker"), exports);
|
|
25
27
|
__exportStar(require("./compound"), exports);
|
|
26
28
|
__exportStar(require("./defillama"), exports);
|
|
29
|
+
__exportStar(require("./enso"), exports);
|
|
27
30
|
__exportStar(require("./erc20"), exports);
|
|
28
31
|
__exportStar(require("./erc721"), exports);
|
|
29
32
|
__exportStar(require("./farcaster"), exports);
|
|
@@ -45,8 +48,8 @@ __exportStar(require("./flaunch"), exports);
|
|
|
45
48
|
__exportStar(require("./onramp"), exports);
|
|
46
49
|
__exportStar(require("./vaultsfyi"), exports);
|
|
47
50
|
__exportStar(require("./x402"), exports);
|
|
51
|
+
__exportStar(require("./yelay"), exports);
|
|
48
52
|
__exportStar(require("./zerion"), exports);
|
|
49
53
|
__exportStar(require("./zerodev"), exports);
|
|
50
54
|
__exportStar(require("./zeroX"), exports);
|
|
51
55
|
__exportStar(require("./zora"), exports);
|
|
52
|
-
__exportStar(require("./clanker"), exports);
|
|
@@ -74,14 +74,15 @@ class SuperfluidSuperTokenCreatorActionProvider extends actionProvider_1.ActionP
|
|
|
74
74
|
`${symbol}x`,
|
|
75
75
|
],
|
|
76
76
|
});
|
|
77
|
+
const superTokenFactoryAddress = walletProvider.getNetwork().networkId === "base-sepolia"
|
|
78
|
+
? constants_1.SuperTokenFactoryAddress_Base_Sepolia
|
|
79
|
+
: constants_1.SuperTokenFactoryAddress;
|
|
77
80
|
const createSuperTokenHash = await walletProvider.sendTransaction({
|
|
78
|
-
to:
|
|
79
|
-
? constants_1.SuperTokenFactoryAddress_Base_Sepolia
|
|
80
|
-
: constants_1.SuperTokenFactoryAddress,
|
|
81
|
+
to: superTokenFactoryAddress,
|
|
81
82
|
data: createSuperTokenData,
|
|
82
83
|
});
|
|
83
84
|
const receipt = await walletProvider.waitForTransactionReceipt(createSuperTokenHash);
|
|
84
|
-
const superTokenAddress = (0, parseLogs_1.extractCreatedSuperTokenAddressAbi)(receipt);
|
|
85
|
+
const superTokenAddress = (0, parseLogs_1.extractCreatedSuperTokenAddressAbi)(receipt, superTokenFactoryAddress);
|
|
85
86
|
return `Created super token for ${args.erc20TokenAddress}. Super token address at ${superTokenAddress} Transaction hash: ${createSuperTokenHash}`;
|
|
86
87
|
}
|
|
87
88
|
catch (error) {
|
|
@@ -12,7 +12,8 @@ type TxReceipt = {
|
|
|
12
12
|
* Extracts the super token address using the contract abi
|
|
13
13
|
*
|
|
14
14
|
* @param receipt - the transaction receipt from creating the super token
|
|
15
|
+
* @param factoryAddress - the address of the factory that created the super token
|
|
15
16
|
* @returns - The contract address of the created Super Token
|
|
16
17
|
*/
|
|
17
|
-
export declare function extractCreatedSuperTokenAddressAbi(receipt: TxReceipt): `0x${string}`;
|
|
18
|
+
export declare function extractCreatedSuperTokenAddressAbi(receipt: TxReceipt, factoryAddress: `0x${string}`): `0x${string}`;
|
|
18
19
|
export {};
|
|
@@ -46,12 +46,15 @@ function pickTokenLike(args) {
|
|
|
46
46
|
* Extracts the super token address using the contract abi
|
|
47
47
|
*
|
|
48
48
|
* @param receipt - the transaction receipt from creating the super token
|
|
49
|
+
* @param factoryAddress - the address of the factory that created the super token
|
|
49
50
|
* @returns - The contract address of the created Super Token
|
|
50
51
|
*/
|
|
51
|
-
function extractCreatedSuperTokenAddressAbi(receipt) {
|
|
52
|
-
const factory =
|
|
52
|
+
function extractCreatedSuperTokenAddressAbi(receipt, factoryAddress) {
|
|
53
|
+
const factory = factoryAddress.toLowerCase();
|
|
53
54
|
if (!factory)
|
|
54
|
-
throw new Error("Missing
|
|
55
|
+
throw new Error("Missing factory address");
|
|
56
|
+
console.log("factory", factory);
|
|
57
|
+
console.log("receipt.logs", receipt.logs);
|
|
55
58
|
for (const log of receipt.logs) {
|
|
56
59
|
if (log.address.toLowerCase() !== factory)
|
|
57
60
|
continue;
|
|
@@ -69,6 +69,9 @@ class WalletActionProvider extends actionProvider_1.ActionProvider {
|
|
|
69
69
|
"Wallet Details:",
|
|
70
70
|
`- Provider: ${name}`,
|
|
71
71
|
`- Address: ${address}`,
|
|
72
|
+
...(walletProvider instanceof wallet_providers_1.CdpSmartWalletProvider
|
|
73
|
+
? [`- Owner Address: ${walletProvider.ownerAccount.address}`]
|
|
74
|
+
: []),
|
|
72
75
|
"- Network:",
|
|
73
76
|
` * Protocol Family: ${network.protocolFamily}`,
|
|
74
77
|
` * Network ID: ${network.networkId || "N/A"}`,
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.WETH_ABI =
|
|
4
|
-
exports.WETH_ADDRESS = "0x4200000000000000000000000000000000000006";
|
|
3
|
+
exports.WETH_ABI = void 0;
|
|
5
4
|
exports.WETH_ABI = [
|
|
6
5
|
{
|
|
7
6
|
inputs: [],
|
|
@@ -4,13 +4,17 @@ exports.UnwrapEthSchema = exports.WrapEthSchema = void 0;
|
|
|
4
4
|
const zod_1 = require("zod");
|
|
5
5
|
exports.WrapEthSchema = zod_1.z
|
|
6
6
|
.object({
|
|
7
|
-
amountToWrap: zod_1.z
|
|
7
|
+
amountToWrap: zod_1.z
|
|
8
|
+
.string()
|
|
9
|
+
.describe("Amount of ETH to wrap in human-readable format (e.g., 0.1 for 0.1 ETH)"),
|
|
8
10
|
})
|
|
9
11
|
.strip()
|
|
10
12
|
.describe("Instructions for wrapping ETH to WETH");
|
|
11
13
|
exports.UnwrapEthSchema = zod_1.z
|
|
12
14
|
.object({
|
|
13
|
-
amountToUnwrap: zod_1.z
|
|
15
|
+
amountToUnwrap: zod_1.z
|
|
16
|
+
.string()
|
|
17
|
+
.describe("Amount of WETH to unwrap in human-readable format (e.g., 0.1 for 0.1 WETH)"),
|
|
14
18
|
})
|
|
15
19
|
.strip()
|
|
16
20
|
.describe("Instructions for unwrapping WETH to ETH");
|
|
@@ -3,6 +3,13 @@ import { ActionProvider } from "../actionProvider";
|
|
|
3
3
|
import { Network } from "../../network";
|
|
4
4
|
import { WrapEthSchema, UnwrapEthSchema } from "./schemas";
|
|
5
5
|
import { EvmWalletProvider } from "../../wallet-providers";
|
|
6
|
+
/**
|
|
7
|
+
* Gets the WETH address for the given network.
|
|
8
|
+
*
|
|
9
|
+
* @param network - The network to get the WETH address for.
|
|
10
|
+
* @returns The WETH address for the network, or undefined if not supported.
|
|
11
|
+
*/
|
|
12
|
+
export declare const getWethAddress: (network: Network) => string | undefined;
|
|
6
13
|
/**
|
|
7
14
|
* WethActionProvider is an action provider for WETH.
|
|
8
15
|
*/
|
|
@@ -9,14 +9,26 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
9
9
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.wethActionProvider = exports.WethActionProvider = void 0;
|
|
12
|
+
exports.wethActionProvider = exports.WethActionProvider = exports.getWethAddress = void 0;
|
|
13
13
|
const zod_1 = require("zod");
|
|
14
14
|
const actionProvider_1 = require("../actionProvider");
|
|
15
15
|
const actionDecorator_1 = require("../actionDecorator");
|
|
16
16
|
const schemas_1 = require("./schemas");
|
|
17
17
|
const constants_1 = require("./constants");
|
|
18
|
+
const constants_2 = require("../erc20/constants");
|
|
18
19
|
const viem_1 = require("viem");
|
|
19
20
|
const wallet_providers_1 = require("../../wallet-providers");
|
|
21
|
+
/**
|
|
22
|
+
* Gets the WETH address for the given network.
|
|
23
|
+
*
|
|
24
|
+
* @param network - The network to get the WETH address for.
|
|
25
|
+
* @returns The WETH address for the network, or undefined if not supported.
|
|
26
|
+
*/
|
|
27
|
+
const getWethAddress = (network) => {
|
|
28
|
+
const networkTokens = constants_2.TOKEN_ADDRESSES_BY_SYMBOLS[network.networkId];
|
|
29
|
+
return networkTokens && "WETH" in networkTokens ? networkTokens.WETH : undefined;
|
|
30
|
+
};
|
|
31
|
+
exports.getWethAddress = getWethAddress;
|
|
20
32
|
/**
|
|
21
33
|
* WethActionProvider is an action provider for WETH.
|
|
22
34
|
*/
|
|
@@ -32,7 +44,9 @@ class WethActionProvider extends actionProvider_1.ActionProvider {
|
|
|
32
44
|
* @param network - The network to check.
|
|
33
45
|
* @returns True if the Weth action provider supports the network, false otherwise.
|
|
34
46
|
*/
|
|
35
|
-
this.supportsNetwork = (network) =>
|
|
47
|
+
this.supportsNetwork = (network) => {
|
|
48
|
+
return (0, exports.getWethAddress)(network) !== undefined;
|
|
49
|
+
};
|
|
36
50
|
}
|
|
37
51
|
/**
|
|
38
52
|
* Wraps ETH to WETH.
|
|
@@ -42,17 +56,30 @@ class WethActionProvider extends actionProvider_1.ActionProvider {
|
|
|
42
56
|
* @returns A message containing the transaction hash.
|
|
43
57
|
*/
|
|
44
58
|
async wrapEth(walletProvider, args) {
|
|
59
|
+
const network = walletProvider.getNetwork();
|
|
60
|
+
const wethAddress = (0, exports.getWethAddress)(network);
|
|
61
|
+
if (!wethAddress) {
|
|
62
|
+
return `Error: WETH not supported on network ${network.networkId}`;
|
|
63
|
+
}
|
|
45
64
|
try {
|
|
65
|
+
// Convert human-readable ETH amount to wei (ETH has 18 decimals)
|
|
66
|
+
const amountInWei = (0, viem_1.parseUnits)(args.amountToWrap, 18);
|
|
67
|
+
// Check ETH balance before wrapping
|
|
68
|
+
const ethBalance = await walletProvider.getBalance();
|
|
69
|
+
if (ethBalance < amountInWei) {
|
|
70
|
+
const ethBalanceFormatted = (0, viem_1.formatUnits)(ethBalance, 18);
|
|
71
|
+
return `Error: Insufficient ETH balance. Requested to wrap ${args.amountToWrap} ETH, but only ${ethBalanceFormatted} ETH is available.`;
|
|
72
|
+
}
|
|
46
73
|
const hash = await walletProvider.sendTransaction({
|
|
47
|
-
to:
|
|
74
|
+
to: wethAddress,
|
|
48
75
|
data: (0, viem_1.encodeFunctionData)({
|
|
49
76
|
abi: constants_1.WETH_ABI,
|
|
50
77
|
functionName: "deposit",
|
|
51
78
|
}),
|
|
52
|
-
value:
|
|
79
|
+
value: amountInWei,
|
|
53
80
|
});
|
|
54
81
|
await walletProvider.waitForTransactionReceipt(hash);
|
|
55
|
-
return `Wrapped ETH
|
|
82
|
+
return `Wrapped ${args.amountToWrap} ETH to WETH. Transaction hash: ${hash}`;
|
|
56
83
|
}
|
|
57
84
|
catch (error) {
|
|
58
85
|
return `Error wrapping ETH: ${error}`;
|
|
@@ -66,17 +93,35 @@ class WethActionProvider extends actionProvider_1.ActionProvider {
|
|
|
66
93
|
* @returns A message containing the transaction hash.
|
|
67
94
|
*/
|
|
68
95
|
async unwrapEth(walletProvider, args) {
|
|
96
|
+
const network = walletProvider.getNetwork();
|
|
97
|
+
const wethAddress = (0, exports.getWethAddress)(network);
|
|
98
|
+
if (!wethAddress) {
|
|
99
|
+
return `Error: WETH not supported on network ${network.networkId}`;
|
|
100
|
+
}
|
|
69
101
|
try {
|
|
102
|
+
// Convert human-readable WETH amount to wei (WETH has 18 decimals)
|
|
103
|
+
const amountInWei = (0, viem_1.parseUnits)(args.amountToUnwrap, 18);
|
|
104
|
+
// Check WETH balance before unwrapping
|
|
105
|
+
const wethBalance = await walletProvider.readContract({
|
|
106
|
+
address: wethAddress,
|
|
107
|
+
abi: viem_1.erc20Abi,
|
|
108
|
+
functionName: "balanceOf",
|
|
109
|
+
args: [walletProvider.getAddress()],
|
|
110
|
+
});
|
|
111
|
+
if (wethBalance < amountInWei) {
|
|
112
|
+
const wethBalanceFormatted = (0, viem_1.formatUnits)(wethBalance, 18);
|
|
113
|
+
return `Error: Insufficient WETH balance. Requested to unwrap ${args.amountToUnwrap} WETH, but only ${wethBalanceFormatted} WETH is available.`;
|
|
114
|
+
}
|
|
70
115
|
const hash = await walletProvider.sendTransaction({
|
|
71
|
-
to:
|
|
116
|
+
to: wethAddress,
|
|
72
117
|
data: (0, viem_1.encodeFunctionData)({
|
|
73
118
|
abi: constants_1.WETH_ABI,
|
|
74
119
|
functionName: "withdraw",
|
|
75
|
-
args: [
|
|
120
|
+
args: [amountInWei],
|
|
76
121
|
}),
|
|
77
122
|
});
|
|
78
123
|
await walletProvider.waitForTransactionReceipt(hash);
|
|
79
|
-
return `Unwrapped WETH
|
|
124
|
+
return `Unwrapped ${args.amountToUnwrap} WETH to ETH. Transaction hash: ${hash}`;
|
|
80
125
|
}
|
|
81
126
|
catch (error) {
|
|
82
127
|
return `Error unwrapping WETH: ${error}`;
|
|
@@ -88,20 +133,10 @@ __decorate([
|
|
|
88
133
|
(0, actionDecorator_1.CreateAction)({
|
|
89
134
|
name: "wrap_eth",
|
|
90
135
|
description: `
|
|
91
|
-
This tool
|
|
92
|
-
Do not use this tool for any other purpose, or trading other assets.
|
|
136
|
+
This tool wraps ETH to WETH.
|
|
93
137
|
|
|
94
138
|
Inputs:
|
|
95
|
-
- Amount of ETH to wrap.
|
|
96
|
-
|
|
97
|
-
Important notes:
|
|
98
|
-
- The amount is a string and cannot have any decimal points, since the unit of measurement is wei.
|
|
99
|
-
- Make sure to use the exact amount provided, and if there's any doubt, check by getting more information before continuing with the action.
|
|
100
|
-
- 1 wei = 0.000000000000000001 WETH
|
|
101
|
-
- Minimum purchase amount is 100000000000 wei (0.0000001 WETH)
|
|
102
|
-
- Only supported on the following networks:
|
|
103
|
-
- Base Sepolia (ie, 'base-sepolia')
|
|
104
|
-
- Base Mainnet (ie, 'base', 'base-mainnet')
|
|
139
|
+
- Amount of ETH to wrap in human-readable format (e.g., 0.1 for 0.1 ETH).
|
|
105
140
|
`,
|
|
106
141
|
schema: schemas_1.WrapEthSchema,
|
|
107
142
|
}),
|
|
@@ -113,20 +148,10 @@ __decorate([
|
|
|
113
148
|
(0, actionDecorator_1.CreateAction)({
|
|
114
149
|
name: "unwrap_eth",
|
|
115
150
|
description: `
|
|
116
|
-
This tool
|
|
117
|
-
Do not use this tool for any other purpose, or trading other assets.
|
|
151
|
+
This tool unwraps WETH to ETH.
|
|
118
152
|
|
|
119
153
|
Inputs:
|
|
120
|
-
- Amount of WETH to unwrap.
|
|
121
|
-
|
|
122
|
-
Important notes:
|
|
123
|
-
- The amount is a string and cannot have any decimal points, since the unit of measurement is wei.
|
|
124
|
-
- Make sure to use the exact amount provided, and if there's any doubt, check by getting more information before continuing with the action.
|
|
125
|
-
- 1 wei = 0.000000000000000001 WETH
|
|
126
|
-
- Minimum unwrap amount is 100000000000 wei (0.0000001 WETH)
|
|
127
|
-
- Only supported on the following networks:
|
|
128
|
-
- Base Sepolia (ie, 'base-sepolia')
|
|
129
|
-
- Base Mainnet (ie, 'base', 'base-mainnet')
|
|
154
|
+
- Amount of WETH to unwrap in human-readable format (e.g., 0.1 for 0.1 WETH).
|
|
130
155
|
`,
|
|
131
156
|
schema: schemas_1.UnwrapEthSchema,
|
|
132
157
|
}),
|