@coinbase/agentkit 0.4.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +103 -7
- package/dist/action-providers/across/acrossActionProvider.d.ts +50 -0
- package/dist/action-providers/across/acrossActionProvider.js +333 -0
- package/dist/action-providers/across/acrossActionProvider.test.d.ts +1 -0
- package/dist/action-providers/across/acrossActionProvider.test.js +391 -0
- package/dist/action-providers/across/constants.d.ts +1 -0
- package/dist/action-providers/across/constants.js +2 -0
- package/dist/action-providers/across/index.d.ts +1 -0
- package/dist/action-providers/across/index.js +17 -0
- package/dist/action-providers/across/schemas.d.ts +36 -0
- package/dist/action-providers/across/schemas.js +46 -0
- package/dist/action-providers/across/utils.d.ts +7 -0
- package/dist/action-providers/across/utils.js +25 -0
- package/dist/action-providers/erc20/constants.d.ts +2 -0
- package/dist/action-providers/erc20/constants.js +12 -1
- package/dist/action-providers/erc20/erc20ActionProvider.js +18 -0
- package/dist/action-providers/erc20/erc20ActionProvider.test.js +4 -0
- package/dist/action-providers/flaunch/constants.d.ts +1078 -0
- package/dist/action-providers/flaunch/constants.js +709 -0
- package/dist/action-providers/flaunch/flaunchActionProvider.d.ts +102 -0
- package/dist/action-providers/flaunch/flaunchActionProvider.js +519 -0
- package/dist/action-providers/flaunch/flaunchActionProvider.test.d.ts +1 -0
- package/dist/action-providers/flaunch/flaunchActionProvider.test.js +307 -0
- package/dist/action-providers/flaunch/index.d.ts +7 -0
- package/dist/action-providers/flaunch/index.js +23 -0
- package/dist/action-providers/flaunch/schemas.d.ts +77 -0
- package/dist/action-providers/flaunch/schemas.js +71 -0
- package/dist/action-providers/flaunch/types.d.ts +64 -0
- package/dist/action-providers/flaunch/types.js +2 -0
- package/dist/action-providers/flaunch/utils.d.ts +60 -0
- package/dist/action-providers/flaunch/utils.js +507 -0
- package/dist/action-providers/index.d.ts +4 -0
- package/dist/action-providers/index.js +4 -0
- package/dist/action-providers/messari/constants.d.ts +17 -0
- package/dist/action-providers/messari/constants.js +20 -0
- package/dist/action-providers/messari/index.d.ts +5 -0
- package/dist/action-providers/messari/index.js +21 -0
- package/dist/action-providers/messari/messariActionProvider.d.ts +42 -0
- package/dist/action-providers/messari/messariActionProvider.js +128 -0
- package/dist/action-providers/messari/messariActionProvider.test.d.ts +1 -0
- package/dist/action-providers/messari/messariActionProvider.test.js +152 -0
- package/dist/action-providers/messari/schemas.d.ts +11 -0
- package/dist/action-providers/messari/schemas.js +16 -0
- package/dist/action-providers/messari/types.d.ts +40 -0
- package/dist/action-providers/messari/types.js +2 -0
- package/dist/action-providers/messari/utils.d.ts +22 -0
- package/dist/action-providers/messari/utils.js +65 -0
- package/dist/action-providers/onramp/index.d.ts +7 -0
- package/dist/action-providers/onramp/index.js +23 -0
- package/dist/action-providers/onramp/onrampActionProvider.d.ts +56 -0
- package/dist/action-providers/onramp/onrampActionProvider.js +109 -0
- package/dist/action-providers/onramp/onrampActionProvider.test.d.ts +1 -0
- package/dist/action-providers/onramp/onrampActionProvider.test.js +97 -0
- package/dist/action-providers/onramp/schemas.d.ts +12 -0
- package/dist/action-providers/onramp/schemas.js +15 -0
- package/dist/action-providers/onramp/types.d.ts +107 -0
- package/dist/action-providers/onramp/types.js +2 -0
- package/dist/action-providers/onramp/utils.d.ts +16 -0
- package/dist/action-providers/onramp/utils.js +56 -0
- package/dist/action-providers/onramp/version.d.ts +2 -0
- package/dist/action-providers/onramp/version.js +5 -0
- package/dist/wallet-providers/cdpWalletProvider.d.ts +11 -2
- package/dist/wallet-providers/cdpWalletProvider.js +44 -10
- package/dist/wallet-providers/cdpWalletProvider.test.d.ts +1 -0
- package/dist/wallet-providers/cdpWalletProvider.test.js +735 -0
- package/dist/wallet-providers/evmWalletProvider.test.d.ts +1 -0
- package/dist/wallet-providers/evmWalletProvider.test.js +56 -0
- package/dist/wallet-providers/index.d.ts +1 -0
- package/dist/wallet-providers/index.js +1 -0
- package/dist/wallet-providers/privyEvmDelegatedEmbeddedWalletProvider.d.ts +167 -0
- package/dist/wallet-providers/privyEvmDelegatedEmbeddedWalletProvider.js +438 -0
- package/dist/wallet-providers/privyEvmDelegatedEmbeddedWalletProvider.test.d.ts +1 -0
- package/dist/wallet-providers/privyEvmDelegatedEmbeddedWalletProvider.test.js +280 -0
- package/dist/wallet-providers/privyEvmWalletProvider.test.d.ts +1 -0
- package/dist/wallet-providers/privyEvmWalletProvider.test.js +331 -0
- package/dist/wallet-providers/privyShared.d.ts +9 -0
- package/dist/wallet-providers/privyShared.js +16 -5
- package/dist/wallet-providers/privySvmWalletProvider.test.d.ts +1 -0
- package/dist/wallet-providers/privySvmWalletProvider.test.js +310 -0
- package/dist/wallet-providers/privyWalletProvider.d.ts +21 -8
- package/dist/wallet-providers/privyWalletProvider.js +39 -7
- package/dist/wallet-providers/privyWalletProvider.test.d.ts +1 -0
- package/dist/wallet-providers/privyWalletProvider.test.js +124 -0
- package/dist/wallet-providers/smartWalletProvider.test.d.ts +1 -0
- package/dist/wallet-providers/smartWalletProvider.test.js +388 -0
- package/dist/wallet-providers/solanaKeypairWalletProvider.test.js +210 -16
- package/dist/wallet-providers/svmWalletProvider.test.d.ts +1 -0
- package/dist/wallet-providers/svmWalletProvider.test.js +55 -0
- package/dist/wallet-providers/viemWalletProvider.test.d.ts +1 -0
- package/dist/wallet-providers/viemWalletProvider.test.js +338 -0
- package/dist/wallet-providers/walletProvider.test.d.ts +1 -0
- package/dist/wallet-providers/walletProvider.test.js +103 -0
- package/package.json +26 -21
|
@@ -0,0 +1,507 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getSwapAmountsFromReceipt = exports.getSwapAmountsFromLog = exports.memecoinToEthWithPermit2 = exports.ethToMemecoin = exports.getAmountWithSlippage = exports.generateTokenUri = void 0;
|
|
4
|
+
const viem_1 = require("viem");
|
|
5
|
+
const constants_1 = require("./constants");
|
|
6
|
+
/**
|
|
7
|
+
* Uploads a base64 image to IPFS using Pinata
|
|
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;
|
|
172
|
+
const getAmountWithSlippage = (amount, slippage, swapType) => {
|
|
173
|
+
if (amount == null) {
|
|
174
|
+
return 0n;
|
|
175
|
+
}
|
|
176
|
+
const absAmount = amount < 0n ? -amount : amount;
|
|
177
|
+
const slippageMultiplier = swapType === "EXACT_IN"
|
|
178
|
+
? BigInt(1e18) - (0, viem_1.parseEther)(slippage)
|
|
179
|
+
: BigInt(1e18) + (0, viem_1.parseEther)(slippage);
|
|
180
|
+
return (absAmount * slippageMultiplier) / BigInt(1e18);
|
|
181
|
+
};
|
|
182
|
+
exports.getAmountWithSlippage = getAmountWithSlippage;
|
|
183
|
+
const ETH = viem_1.zeroAddress;
|
|
184
|
+
const ethToMemecoin = (params) => {
|
|
185
|
+
const flETH = constants_1.FLETHAddress[params.chainId];
|
|
186
|
+
const flETHHooks = constants_1.FLETHHooksAddress[params.chainId];
|
|
187
|
+
const flaunchHooks = constants_1.FlaunchPositionManagerAddress[params.chainId];
|
|
188
|
+
// Determine actions based on swapType
|
|
189
|
+
const v4Actions = ("0x" +
|
|
190
|
+
(params.swapType === "EXACT_IN" ? constants_1.V4Actions.SWAP_EXACT_IN : constants_1.V4Actions.SWAP_EXACT_OUT) +
|
|
191
|
+
constants_1.V4Actions.SETTLE_ALL +
|
|
192
|
+
constants_1.V4Actions.TAKE_ALL);
|
|
193
|
+
// Initialize variables for path and v4Params
|
|
194
|
+
let path;
|
|
195
|
+
let v4Params;
|
|
196
|
+
// Configure path and parameters based on swapType
|
|
197
|
+
if (params.swapType === "EXACT_IN") {
|
|
198
|
+
if (params.amountIn == null || params.amountOutMin == null) {
|
|
199
|
+
throw new Error("amountIn and amountOutMin are required for EXACT_IN swap");
|
|
200
|
+
}
|
|
201
|
+
// Path for 'EXACT_IN' swap
|
|
202
|
+
path = [
|
|
203
|
+
{
|
|
204
|
+
intermediateCurrency: flETH,
|
|
205
|
+
fee: 0,
|
|
206
|
+
tickSpacing: 60,
|
|
207
|
+
hooks: flETHHooks,
|
|
208
|
+
hookData: "0x",
|
|
209
|
+
},
|
|
210
|
+
{
|
|
211
|
+
intermediateCurrency: params.memecoin,
|
|
212
|
+
fee: 0,
|
|
213
|
+
tickSpacing: 60,
|
|
214
|
+
hooks: flaunchHooks,
|
|
215
|
+
hookData: (0, viem_1.encodeAbiParameters)([{ type: "address", name: "referrer" }], [params.referrer ?? viem_1.zeroAddress]),
|
|
216
|
+
},
|
|
217
|
+
];
|
|
218
|
+
// Parameters for 'EXACT_IN' swap
|
|
219
|
+
v4Params = (0, viem_1.encodeAbiParameters)(constants_1.IV4RouterAbiExactInput, [
|
|
220
|
+
{
|
|
221
|
+
currencyIn: ETH,
|
|
222
|
+
path: path,
|
|
223
|
+
amountIn: params.amountIn,
|
|
224
|
+
amountOutMinimum: params.amountOutMin,
|
|
225
|
+
},
|
|
226
|
+
]);
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
if (params.amountOut == null || params.amountInMax == null) {
|
|
230
|
+
throw new Error("amountOut and amountInMax are required for EXACT_OUT swap");
|
|
231
|
+
}
|
|
232
|
+
// Path for 'EXACT_OUT' swap
|
|
233
|
+
path = [
|
|
234
|
+
{
|
|
235
|
+
fee: 0,
|
|
236
|
+
tickSpacing: 60,
|
|
237
|
+
hookData: "0x",
|
|
238
|
+
hooks: flETHHooks,
|
|
239
|
+
intermediateCurrency: ETH,
|
|
240
|
+
},
|
|
241
|
+
{
|
|
242
|
+
fee: 0,
|
|
243
|
+
tickSpacing: 60,
|
|
244
|
+
hooks: flaunchHooks,
|
|
245
|
+
intermediateCurrency: flETH,
|
|
246
|
+
hookData: (0, viem_1.encodeAbiParameters)([{ type: "address", name: "referrer" }], [params.referrer ?? viem_1.zeroAddress]),
|
|
247
|
+
},
|
|
248
|
+
];
|
|
249
|
+
// Parameters for 'EXACT_OUT' swap
|
|
250
|
+
v4Params = (0, viem_1.encodeAbiParameters)(constants_1.IV4RouterAbiExactOutput, [
|
|
251
|
+
{
|
|
252
|
+
currencyOut: params.memecoin,
|
|
253
|
+
path: path,
|
|
254
|
+
amountOut: params.amountOut,
|
|
255
|
+
amountInMaximum: params.amountInMax,
|
|
256
|
+
},
|
|
257
|
+
]);
|
|
258
|
+
}
|
|
259
|
+
// Common parameters for both swap types
|
|
260
|
+
const settleParams = (0, viem_1.encodeAbiParameters)([
|
|
261
|
+
{
|
|
262
|
+
type: "address",
|
|
263
|
+
name: "currency",
|
|
264
|
+
},
|
|
265
|
+
{
|
|
266
|
+
type: "uint256",
|
|
267
|
+
name: "maxAmount",
|
|
268
|
+
},
|
|
269
|
+
], [
|
|
270
|
+
ETH,
|
|
271
|
+
params.swapType === "EXACT_IN"
|
|
272
|
+
? (params.amountIn ?? viem_1.maxUint256)
|
|
273
|
+
: (params.amountInMax ?? viem_1.maxUint256),
|
|
274
|
+
]);
|
|
275
|
+
const takeParams = (0, viem_1.encodeAbiParameters)([
|
|
276
|
+
{
|
|
277
|
+
type: "address",
|
|
278
|
+
name: "currency",
|
|
279
|
+
},
|
|
280
|
+
{
|
|
281
|
+
type: "uint256",
|
|
282
|
+
name: "minAmount",
|
|
283
|
+
},
|
|
284
|
+
], [
|
|
285
|
+
params.memecoin,
|
|
286
|
+
params.swapType === "EXACT_IN"
|
|
287
|
+
? (params.amountOutMin ?? viem_1.maxUint256)
|
|
288
|
+
: (params.amountOut ?? viem_1.maxUint256),
|
|
289
|
+
]);
|
|
290
|
+
// Encode router data
|
|
291
|
+
const v4RouterData = (0, viem_1.encodeAbiParameters)([
|
|
292
|
+
{ type: "bytes", name: "actions" },
|
|
293
|
+
{ type: "bytes[]", name: "params" },
|
|
294
|
+
], [v4Actions, [v4Params, settleParams, takeParams]]);
|
|
295
|
+
// Commands for Universal Router
|
|
296
|
+
const urCommands = ("0x" + constants_1.URCommands.V4_SWAP + constants_1.URCommands.SWEEP);
|
|
297
|
+
const sweepInput = (0, viem_1.encodeAbiParameters)([
|
|
298
|
+
{ type: "address", name: "token" },
|
|
299
|
+
{ type: "address", name: "recipient" },
|
|
300
|
+
{ type: "uint160", name: "amountIn" },
|
|
301
|
+
], [ETH, params.sender, 0n]);
|
|
302
|
+
// Encode calldata for Universal Router
|
|
303
|
+
const inputs = [v4RouterData, sweepInput];
|
|
304
|
+
const urExecuteCalldata = (0, viem_1.encodeFunctionData)({
|
|
305
|
+
abi: constants_1.UNIVERSAL_ROUTER_ABI,
|
|
306
|
+
functionName: "execute",
|
|
307
|
+
args: [urCommands, inputs],
|
|
308
|
+
});
|
|
309
|
+
return {
|
|
310
|
+
calldata: urExecuteCalldata,
|
|
311
|
+
commands: urCommands,
|
|
312
|
+
inputs,
|
|
313
|
+
};
|
|
314
|
+
};
|
|
315
|
+
exports.ethToMemecoin = ethToMemecoin;
|
|
316
|
+
// @notice Beofre calling the UniversalRouter the user must have:
|
|
317
|
+
// 1. Given the Permit2 contract allowance to spend the memecoin
|
|
318
|
+
const memecoinToEthWithPermit2 = (params) => {
|
|
319
|
+
const flETH = constants_1.FLETHAddress[params.chainId];
|
|
320
|
+
const flETHHooks = constants_1.FLETHHooksAddress[params.chainId];
|
|
321
|
+
const flaunchHooks = constants_1.FlaunchPositionManagerAddress[params.chainId];
|
|
322
|
+
const v4Actions = ("0x" +
|
|
323
|
+
constants_1.V4Actions.SWAP_EXACT_IN +
|
|
324
|
+
constants_1.V4Actions.SETTLE_ALL +
|
|
325
|
+
constants_1.V4Actions.TAKE_ALL);
|
|
326
|
+
const v4ExactInputParams = (0, viem_1.encodeAbiParameters)(constants_1.IV4RouterAbiExactInput, [
|
|
327
|
+
{
|
|
328
|
+
currencyIn: params.memecoin,
|
|
329
|
+
path: [
|
|
330
|
+
{
|
|
331
|
+
intermediateCurrency: flETH,
|
|
332
|
+
fee: 0,
|
|
333
|
+
tickSpacing: 60,
|
|
334
|
+
hooks: flaunchHooks,
|
|
335
|
+
hookData: (0, viem_1.encodeAbiParameters)([
|
|
336
|
+
{
|
|
337
|
+
type: "address",
|
|
338
|
+
name: "referrer",
|
|
339
|
+
},
|
|
340
|
+
], [params.referrer ?? viem_1.zeroAddress]),
|
|
341
|
+
},
|
|
342
|
+
{
|
|
343
|
+
intermediateCurrency: ETH,
|
|
344
|
+
fee: 0,
|
|
345
|
+
tickSpacing: 60,
|
|
346
|
+
hooks: flETHHooks,
|
|
347
|
+
hookData: "0x",
|
|
348
|
+
},
|
|
349
|
+
],
|
|
350
|
+
amountIn: params.amountIn,
|
|
351
|
+
amountOutMinimum: params.ethOutMin,
|
|
352
|
+
},
|
|
353
|
+
]);
|
|
354
|
+
const settleParams = (0, viem_1.encodeAbiParameters)([
|
|
355
|
+
{
|
|
356
|
+
type: "address",
|
|
357
|
+
name: "currency",
|
|
358
|
+
},
|
|
359
|
+
{
|
|
360
|
+
type: "uint256",
|
|
361
|
+
name: "maxAmount",
|
|
362
|
+
},
|
|
363
|
+
], [params.memecoin, params.amountIn]);
|
|
364
|
+
const takeParams = (0, viem_1.encodeAbiParameters)([
|
|
365
|
+
{
|
|
366
|
+
type: "address",
|
|
367
|
+
name: "currency",
|
|
368
|
+
},
|
|
369
|
+
{
|
|
370
|
+
type: "uint256",
|
|
371
|
+
name: "minAmount",
|
|
372
|
+
},
|
|
373
|
+
], [ETH, params.ethOutMin]);
|
|
374
|
+
const v4RouterData = (0, viem_1.encodeAbiParameters)([
|
|
375
|
+
{ type: "bytes", name: "actions" },
|
|
376
|
+
{ type: "bytes[]", name: "params" },
|
|
377
|
+
], [v4Actions, [v4ExactInputParams, settleParams, takeParams]]);
|
|
378
|
+
if (params.signature && params.permitSingle) {
|
|
379
|
+
const urCommands = ("0x" + constants_1.URCommands.PERMIT2_PERMIT + constants_1.URCommands.V4_SWAP);
|
|
380
|
+
const permit2PermitInput = (0, viem_1.encodeAbiParameters)([
|
|
381
|
+
{
|
|
382
|
+
type: "tuple",
|
|
383
|
+
components: [
|
|
384
|
+
{
|
|
385
|
+
type: "tuple",
|
|
386
|
+
components: [
|
|
387
|
+
{ type: "address", name: "token" },
|
|
388
|
+
{ type: "uint160", name: "amount" },
|
|
389
|
+
{ type: "uint48", name: "expiration" },
|
|
390
|
+
{ type: "uint48", name: "nonce" },
|
|
391
|
+
],
|
|
392
|
+
name: "details",
|
|
393
|
+
},
|
|
394
|
+
{ type: "address", name: "spender" },
|
|
395
|
+
{ type: "uint256", name: "sigDeadline" },
|
|
396
|
+
],
|
|
397
|
+
name: "PermitSingle",
|
|
398
|
+
},
|
|
399
|
+
{ type: "bytes", name: "signature" },
|
|
400
|
+
], [params.permitSingle, params.signature]);
|
|
401
|
+
const inputs = [permit2PermitInput, v4RouterData];
|
|
402
|
+
const urExecuteCalldata = (0, viem_1.encodeFunctionData)({
|
|
403
|
+
abi: constants_1.UNIVERSAL_ROUTER_ABI,
|
|
404
|
+
functionName: "execute",
|
|
405
|
+
args: [urCommands, inputs],
|
|
406
|
+
});
|
|
407
|
+
return {
|
|
408
|
+
calldata: urExecuteCalldata,
|
|
409
|
+
commands: urCommands,
|
|
410
|
+
inputs,
|
|
411
|
+
};
|
|
412
|
+
}
|
|
413
|
+
else {
|
|
414
|
+
const urCommands = ("0x" + constants_1.URCommands.V4_SWAP);
|
|
415
|
+
const inputs = [v4RouterData];
|
|
416
|
+
const urExecuteCalldata = (0, viem_1.encodeFunctionData)({
|
|
417
|
+
abi: constants_1.UNIVERSAL_ROUTER_ABI,
|
|
418
|
+
functionName: "execute",
|
|
419
|
+
args: [urCommands, inputs],
|
|
420
|
+
});
|
|
421
|
+
return {
|
|
422
|
+
calldata: urExecuteCalldata,
|
|
423
|
+
commands: urCommands,
|
|
424
|
+
inputs,
|
|
425
|
+
};
|
|
426
|
+
}
|
|
427
|
+
};
|
|
428
|
+
exports.memecoinToEthWithPermit2 = memecoinToEthWithPermit2;
|
|
429
|
+
const getSwapAmountsFromLog = ({ filteredPoolSwapEvent, coinAddress, chainId, }) => {
|
|
430
|
+
const { flAmount0, flAmount1, flFee0, flFee1, ispAmount0, ispAmount1, ispFee0, ispFee1, uniAmount0, uniAmount1, uniFee0, uniFee1, } = filteredPoolSwapEvent;
|
|
431
|
+
const currency0Delta = flAmount0 + ispAmount0 + uniAmount0;
|
|
432
|
+
const currency1Delta = flAmount1 + ispAmount1 + uniAmount1;
|
|
433
|
+
const currency0Fees = flFee0 + ispFee0 + uniFee0;
|
|
434
|
+
const currency1Fees = flFee1 + ispFee1 + uniFee1;
|
|
435
|
+
let feesIsInFLETH;
|
|
436
|
+
let swapType;
|
|
437
|
+
const flETHIsCurrencyZero = coinAddress > constants_1.FLETHAddress[chainId];
|
|
438
|
+
if (flETHIsCurrencyZero) {
|
|
439
|
+
swapType = currency0Delta < 0 ? "BUY" : "SELL";
|
|
440
|
+
feesIsInFLETH = currency0Fees < 0;
|
|
441
|
+
}
|
|
442
|
+
else {
|
|
443
|
+
swapType = currency1Delta < 0 ? "BUY" : "SELL";
|
|
444
|
+
feesIsInFLETH = currency1Fees < 0;
|
|
445
|
+
}
|
|
446
|
+
const absCurrency0Delta = currency0Delta < 0 ? -currency0Delta : currency0Delta;
|
|
447
|
+
const absCurrency1Delta = currency1Delta < 0 ? -currency1Delta : currency1Delta;
|
|
448
|
+
const absCurrency0Fees = currency0Fees < 0 ? -currency0Fees : currency0Fees;
|
|
449
|
+
const absCurrency1Fees = currency1Fees < 0 ? -currency1Fees : currency1Fees;
|
|
450
|
+
const fees = {
|
|
451
|
+
isInFLETH: feesIsInFLETH,
|
|
452
|
+
amount: flETHIsCurrencyZero
|
|
453
|
+
? feesIsInFLETH
|
|
454
|
+
? absCurrency0Fees
|
|
455
|
+
: absCurrency1Fees
|
|
456
|
+
: feesIsInFLETH
|
|
457
|
+
? absCurrency1Fees
|
|
458
|
+
: absCurrency0Fees,
|
|
459
|
+
};
|
|
460
|
+
if (swapType === "BUY") {
|
|
461
|
+
return {
|
|
462
|
+
coinsBought: flETHIsCurrencyZero
|
|
463
|
+
? absCurrency1Delta - (!fees.isInFLETH ? fees.amount : 0n)
|
|
464
|
+
: absCurrency0Delta - (!fees.isInFLETH ? fees.amount : 0n),
|
|
465
|
+
ethSold: flETHIsCurrencyZero
|
|
466
|
+
? absCurrency0Delta - (fees.isInFLETH ? fees.amount : 0n)
|
|
467
|
+
: absCurrency1Delta - (fees.isInFLETH ? fees.amount : 0n),
|
|
468
|
+
};
|
|
469
|
+
}
|
|
470
|
+
else {
|
|
471
|
+
return {
|
|
472
|
+
coinsSold: flETHIsCurrencyZero
|
|
473
|
+
? absCurrency1Delta - (!fees.isInFLETH ? fees.amount : 0n)
|
|
474
|
+
: absCurrency0Delta - (!fees.isInFLETH ? fees.amount : 0n),
|
|
475
|
+
ethBought: flETHIsCurrencyZero
|
|
476
|
+
? absCurrency0Delta - (fees.isInFLETH ? fees.amount : 0n)
|
|
477
|
+
: absCurrency1Delta - (fees.isInFLETH ? fees.amount : 0n),
|
|
478
|
+
};
|
|
479
|
+
}
|
|
480
|
+
};
|
|
481
|
+
exports.getSwapAmountsFromLog = getSwapAmountsFromLog;
|
|
482
|
+
const getSwapAmountsFromReceipt = ({ receipt, coinAddress, chainId, }) => {
|
|
483
|
+
const filteredPoolSwapEvent = receipt.logs
|
|
484
|
+
.map(log => {
|
|
485
|
+
try {
|
|
486
|
+
if (log.address.toLowerCase() !== constants_1.FlaunchPositionManagerAddress[chainId].toLowerCase()) {
|
|
487
|
+
return null;
|
|
488
|
+
}
|
|
489
|
+
const event = (0, viem_1.decodeEventLog)({
|
|
490
|
+
abi: constants_1.POSITION_MANAGER_ABI,
|
|
491
|
+
data: log.data,
|
|
492
|
+
topics: log.topics,
|
|
493
|
+
});
|
|
494
|
+
return event.eventName === "PoolSwap" ? event.args : null;
|
|
495
|
+
}
|
|
496
|
+
catch {
|
|
497
|
+
return null;
|
|
498
|
+
}
|
|
499
|
+
})
|
|
500
|
+
.filter((event) => event !== null)[0];
|
|
501
|
+
return (0, exports.getSwapAmountsFromLog)({
|
|
502
|
+
filteredPoolSwapEvent,
|
|
503
|
+
coinAddress,
|
|
504
|
+
chainId,
|
|
505
|
+
});
|
|
506
|
+
};
|
|
507
|
+
exports.getSwapAmountsFromReceipt = getSwapAmountsFromReceipt;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export * from "./actionDecorator";
|
|
2
2
|
export * from "./actionProvider";
|
|
3
3
|
export * from "./customActionProvider";
|
|
4
|
+
export * from "./across";
|
|
4
5
|
export * from "./alchemy";
|
|
5
6
|
export * from "./basename";
|
|
6
7
|
export * from "./cdp";
|
|
@@ -10,6 +11,7 @@ export * from "./erc20";
|
|
|
10
11
|
export * from "./erc721";
|
|
11
12
|
export * from "./farcaster";
|
|
12
13
|
export * from "./jupiter";
|
|
14
|
+
export * from "./messari";
|
|
13
15
|
export * from "./pyth";
|
|
14
16
|
export * from "./moonwell";
|
|
15
17
|
export * from "./morpho";
|
|
@@ -20,3 +22,5 @@ export * from "./wallet";
|
|
|
20
22
|
export * from "./weth";
|
|
21
23
|
export * from "./wow";
|
|
22
24
|
export * from "./allora";
|
|
25
|
+
export * from "./flaunch";
|
|
26
|
+
export * from "./onramp";
|
|
@@ -17,6 +17,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
17
17
|
__exportStar(require("./actionDecorator"), exports);
|
|
18
18
|
__exportStar(require("./actionProvider"), exports);
|
|
19
19
|
__exportStar(require("./customActionProvider"), exports);
|
|
20
|
+
__exportStar(require("./across"), exports);
|
|
20
21
|
__exportStar(require("./alchemy"), exports);
|
|
21
22
|
__exportStar(require("./basename"), exports);
|
|
22
23
|
__exportStar(require("./cdp"), exports);
|
|
@@ -26,6 +27,7 @@ __exportStar(require("./erc20"), exports);
|
|
|
26
27
|
__exportStar(require("./erc721"), exports);
|
|
27
28
|
__exportStar(require("./farcaster"), exports);
|
|
28
29
|
__exportStar(require("./jupiter"), exports);
|
|
30
|
+
__exportStar(require("./messari"), exports);
|
|
29
31
|
__exportStar(require("./pyth"), exports);
|
|
30
32
|
__exportStar(require("./moonwell"), exports);
|
|
31
33
|
__exportStar(require("./morpho"), exports);
|
|
@@ -36,3 +38,5 @@ __exportStar(require("./wallet"), exports);
|
|
|
36
38
|
__exportStar(require("./weth"), exports);
|
|
37
39
|
__exportStar(require("./wow"), exports);
|
|
38
40
|
__exportStar(require("./allora"), exports);
|
|
41
|
+
__exportStar(require("./flaunch"), exports);
|
|
42
|
+
__exportStar(require("./onramp"), exports);
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base URL for the Messari API
|
|
3
|
+
*/
|
|
4
|
+
export declare const MESSARI_BASE_URL = "https://api.messari.io/ai/v1";
|
|
5
|
+
/**
|
|
6
|
+
* Default error message when API key is missing
|
|
7
|
+
*/
|
|
8
|
+
export declare const API_KEY_MISSING_ERROR = "MESSARI_API_KEY is not configured.";
|
|
9
|
+
/**
|
|
10
|
+
* Rate limits by subscription tier
|
|
11
|
+
*/
|
|
12
|
+
export declare const RATE_LIMITS: {
|
|
13
|
+
FREE: string;
|
|
14
|
+
LITE: string;
|
|
15
|
+
PRO: string;
|
|
16
|
+
ENTERPRISE: string;
|
|
17
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RATE_LIMITS = exports.API_KEY_MISSING_ERROR = exports.MESSARI_BASE_URL = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Base URL for the Messari API
|
|
6
|
+
*/
|
|
7
|
+
exports.MESSARI_BASE_URL = "https://api.messari.io/ai/v1";
|
|
8
|
+
/**
|
|
9
|
+
* Default error message when API key is missing
|
|
10
|
+
*/
|
|
11
|
+
exports.API_KEY_MISSING_ERROR = "MESSARI_API_KEY is not configured.";
|
|
12
|
+
/**
|
|
13
|
+
* Rate limits by subscription tier
|
|
14
|
+
*/
|
|
15
|
+
exports.RATE_LIMITS = {
|
|
16
|
+
FREE: "2 requests per day",
|
|
17
|
+
LITE: "10 requests per day",
|
|
18
|
+
PRO: "20 requests per day",
|
|
19
|
+
ENTERPRISE: "50 requests per day",
|
|
20
|
+
};
|
|
@@ -0,0 +1,21 @@
|
|
|
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("./messariActionProvider"), exports);
|
|
18
|
+
__exportStar(require("./schemas"), exports);
|
|
19
|
+
__exportStar(require("./types"), exports);
|
|
20
|
+
__exportStar(require("./constants"), exports);
|
|
21
|
+
__exportStar(require("./utils"), exports);
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { ActionProvider } from "../actionProvider";
|
|
3
|
+
import { Network } from "../../network";
|
|
4
|
+
import { MessariResearchQuestionSchema } from "./schemas";
|
|
5
|
+
import { MessariActionProviderConfig } from "./types";
|
|
6
|
+
/**
|
|
7
|
+
* MessariActionProvider is an action provider for Messari AI toolkit interactions.
|
|
8
|
+
* It enables AI agents to ask research questions about crypto markets, protocols, and tokens.
|
|
9
|
+
*
|
|
10
|
+
* @augments ActionProvider
|
|
11
|
+
*/
|
|
12
|
+
export declare class MessariActionProvider extends ActionProvider {
|
|
13
|
+
private readonly apiKey;
|
|
14
|
+
/**
|
|
15
|
+
* Constructor for the MessariActionProvider class.
|
|
16
|
+
*
|
|
17
|
+
* @param config - The configuration options for the MessariActionProvider
|
|
18
|
+
*/
|
|
19
|
+
constructor(config?: MessariActionProviderConfig);
|
|
20
|
+
/**
|
|
21
|
+
* Makes a request to the Messari AI API with a research question
|
|
22
|
+
*
|
|
23
|
+
* @param args - The arguments containing the research question
|
|
24
|
+
* @returns A string containing the research results or an error message
|
|
25
|
+
*/
|
|
26
|
+
researchQuestion(args: z.infer<typeof MessariResearchQuestionSchema>): Promise<string>;
|
|
27
|
+
/**
|
|
28
|
+
* Checks if the action provider supports the given network.
|
|
29
|
+
* Messari research is network-agnostic, so it supports all networks.
|
|
30
|
+
*
|
|
31
|
+
* @param _ - The network to check
|
|
32
|
+
* @returns Always returns true as Messari research is network-agnostic
|
|
33
|
+
*/
|
|
34
|
+
supportsNetwork(_: Network): boolean;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Factory function to create a new MessariActionProvider instance.
|
|
38
|
+
*
|
|
39
|
+
* @param config - The configuration options for the MessariActionProvider
|
|
40
|
+
* @returns A new instance of MessariActionProvider
|
|
41
|
+
*/
|
|
42
|
+
export declare const messariActionProvider: (config?: MessariActionProviderConfig) => MessariActionProvider;
|