@joai/warps-adapter-evm 1.0.0-beta.74
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 +64 -0
- package/dist/index.d.cts +296 -0
- package/dist/index.d.ts +296 -0
- package/dist/index.js +2329 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +2301 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +44 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,2329 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
|
|
30
|
+
// src/index.ts
|
|
31
|
+
var index_exports = {};
|
|
32
|
+
__export(index_exports, {
|
|
33
|
+
ArbitrumAdapter: () => ArbitrumAdapter,
|
|
34
|
+
ArbitrumExplorers: () => ArbitrumExplorers,
|
|
35
|
+
BaseAdapter: () => BaseAdapter,
|
|
36
|
+
BaseExplorers: () => BaseExplorers,
|
|
37
|
+
EthereumAdapter: () => EthereumAdapter,
|
|
38
|
+
EthereumExplorers: () => EthereumExplorers,
|
|
39
|
+
EvmChainIdMap: () => EvmChainIdMap,
|
|
40
|
+
EvmChainIds: () => EvmChainIds,
|
|
41
|
+
EvmExplorers: () => EvmExplorers,
|
|
42
|
+
ExplorerUrls: () => ExplorerUrls,
|
|
43
|
+
KnownTokens: () => KnownTokens,
|
|
44
|
+
NativeTokenArb: () => NativeTokenArb,
|
|
45
|
+
NativeTokenBase: () => NativeTokenBase,
|
|
46
|
+
NativeTokenEth: () => NativeTokenEth,
|
|
47
|
+
NativeTokenPolygon: () => NativeTokenPolygon,
|
|
48
|
+
PolygonAdapter: () => PolygonAdapter,
|
|
49
|
+
PolygonExplorers: () => PolygonExplorers,
|
|
50
|
+
SupportedEvmChainIds: () => SupportedEvmChainIds,
|
|
51
|
+
WarpEvmConstants: () => WarpEvmConstants,
|
|
52
|
+
WarpEvmDataLoader: () => WarpEvmDataLoader,
|
|
53
|
+
WarpEvmExecutor: () => WarpEvmExecutor,
|
|
54
|
+
WarpEvmExplorer: () => WarpEvmExplorer,
|
|
55
|
+
WarpEvmOutput: () => WarpEvmOutput,
|
|
56
|
+
WarpEvmSerializer: () => WarpEvmSerializer,
|
|
57
|
+
WarpEvmWallet: () => WarpEvmWallet,
|
|
58
|
+
createEvmAdapter: () => createEvmAdapter,
|
|
59
|
+
findKnownTokenById: () => findKnownTokenById,
|
|
60
|
+
getAllEvmAdapters: () => getAllEvmAdapters,
|
|
61
|
+
getAllEvmChainNames: () => getAllEvmChainNames,
|
|
62
|
+
getKnownTokensForChain: () => getKnownTokensForChain
|
|
63
|
+
});
|
|
64
|
+
module.exports = __toCommonJS(index_exports);
|
|
65
|
+
|
|
66
|
+
// src/chains/arbitrum.ts
|
|
67
|
+
var import_warps19 = require("@joai/warps");
|
|
68
|
+
|
|
69
|
+
// src/WarpEvmDataLoader.ts
|
|
70
|
+
var import_warps14 = require("@joai/warps");
|
|
71
|
+
var import_ethers3 = require("ethers");
|
|
72
|
+
|
|
73
|
+
// src/providers/UniswapService.ts
|
|
74
|
+
var import_warps = require("@joai/warps");
|
|
75
|
+
var _UniswapService = class _UniswapService {
|
|
76
|
+
constructor(cache, chainId) {
|
|
77
|
+
this.cache = cache;
|
|
78
|
+
this.chainId = chainId;
|
|
79
|
+
}
|
|
80
|
+
async getTokenList() {
|
|
81
|
+
try {
|
|
82
|
+
const response = await fetch(_UniswapService.UNISWAP_TOKEN_LIST_URL);
|
|
83
|
+
if (!response.ok) {
|
|
84
|
+
throw new Error(`Failed to fetch Uniswap token list: ${response.status}`);
|
|
85
|
+
}
|
|
86
|
+
const tokenList = await response.json();
|
|
87
|
+
return tokenList;
|
|
88
|
+
} catch (error) {
|
|
89
|
+
throw new Error(`Failed to fetch Uniswap token list: ${error}`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
async findToken(address) {
|
|
93
|
+
const normalizedAddress = address.toLowerCase();
|
|
94
|
+
const cacheKey = `uniswap:token:${this.chainId}:${normalizedAddress}`;
|
|
95
|
+
const cachedToken = this.cache.get(cacheKey);
|
|
96
|
+
if (cachedToken) {
|
|
97
|
+
return cachedToken;
|
|
98
|
+
}
|
|
99
|
+
try {
|
|
100
|
+
const tokenList = await this.getTokenList();
|
|
101
|
+
const token = tokenList.tokens.find((token2) => token2.address.toLowerCase() === normalizedAddress) || null;
|
|
102
|
+
if (token && token.chainId !== this.chainId) {
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
if (token) {
|
|
106
|
+
this.cache.set(cacheKey, token, import_warps.CacheTtl.OneHour);
|
|
107
|
+
} else {
|
|
108
|
+
this.cache.set(cacheKey, null, import_warps.CacheTtl.OneMinute * 5);
|
|
109
|
+
}
|
|
110
|
+
return token;
|
|
111
|
+
} catch (error) {
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
async getTokenMetadata(address) {
|
|
116
|
+
const normalizedAddress = address.toLowerCase();
|
|
117
|
+
const cacheKey = `uniswap:metadata:${this.chainId}:${normalizedAddress}`;
|
|
118
|
+
const cachedMetadata = this.cache.get(cacheKey);
|
|
119
|
+
if (cachedMetadata !== null) {
|
|
120
|
+
return cachedMetadata;
|
|
121
|
+
}
|
|
122
|
+
const token = await this.findToken(address);
|
|
123
|
+
if (!token) {
|
|
124
|
+
this.cache.set(cacheKey, null, import_warps.CacheTtl.OneMinute * 5);
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
const metadata = {
|
|
128
|
+
name: token.name,
|
|
129
|
+
symbol: token.symbol,
|
|
130
|
+
decimals: token.decimals,
|
|
131
|
+
logoUrl: token.logoURI
|
|
132
|
+
};
|
|
133
|
+
this.cache.set(cacheKey, metadata, import_warps.CacheTtl.OneHour);
|
|
134
|
+
return metadata;
|
|
135
|
+
}
|
|
136
|
+
async getBridgeInfo(address) {
|
|
137
|
+
const normalizedAddress = address.toLowerCase();
|
|
138
|
+
const cacheKey = `uniswap:bridge:${this.chainId}:${normalizedAddress}`;
|
|
139
|
+
const cachedBridgeInfo = this.cache.get(cacheKey);
|
|
140
|
+
if (cachedBridgeInfo !== null) {
|
|
141
|
+
return cachedBridgeInfo;
|
|
142
|
+
}
|
|
143
|
+
const token = await this.findToken(address);
|
|
144
|
+
if (!token?.extensions?.bridgeInfo) {
|
|
145
|
+
this.cache.set(cacheKey, null, import_warps.CacheTtl.OneMinute * 5);
|
|
146
|
+
return null;
|
|
147
|
+
}
|
|
148
|
+
const bridgeInfo = {};
|
|
149
|
+
for (const [chainId, info] of Object.entries(token.extensions.bridgeInfo)) {
|
|
150
|
+
bridgeInfo[chainId] = info.tokenAddress;
|
|
151
|
+
}
|
|
152
|
+
this.cache.set(cacheKey, bridgeInfo, import_warps.CacheTtl.OneHour);
|
|
153
|
+
return bridgeInfo;
|
|
154
|
+
}
|
|
155
|
+
};
|
|
156
|
+
_UniswapService.UNISWAP_TOKEN_LIST_URL = "https://tokens.uniswap.org";
|
|
157
|
+
var UniswapService = _UniswapService;
|
|
158
|
+
|
|
159
|
+
// src/providers/PrivateKeyWalletProvider.ts
|
|
160
|
+
var import_ethers = require("ethers");
|
|
161
|
+
var import_warps2 = require("@joai/warps");
|
|
162
|
+
var _PrivateKeyWalletProvider = class _PrivateKeyWalletProvider {
|
|
163
|
+
constructor(config, chain) {
|
|
164
|
+
this.config = config;
|
|
165
|
+
this.chain = chain;
|
|
166
|
+
this.wallet = null;
|
|
167
|
+
}
|
|
168
|
+
async getAddress() {
|
|
169
|
+
try {
|
|
170
|
+
const wallet = this.getWallet();
|
|
171
|
+
return wallet.address;
|
|
172
|
+
} catch {
|
|
173
|
+
return null;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
async getPublicKey() {
|
|
177
|
+
try {
|
|
178
|
+
const wallet = this.getWallet();
|
|
179
|
+
const publicKey = wallet.signingKey.publicKey;
|
|
180
|
+
return publicKey.startsWith("0x") ? publicKey.slice(2) : publicKey;
|
|
181
|
+
} catch {
|
|
182
|
+
return null;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
async signTransaction(tx) {
|
|
186
|
+
const wallet = this.getWallet();
|
|
187
|
+
const txRequest = {
|
|
188
|
+
to: tx.to,
|
|
189
|
+
data: tx.data,
|
|
190
|
+
value: tx.value || 0,
|
|
191
|
+
gasLimit: tx.gasLimit,
|
|
192
|
+
maxFeePerGas: tx.maxFeePerGas,
|
|
193
|
+
maxPriorityFeePerGas: tx.maxPriorityFeePerGas,
|
|
194
|
+
nonce: tx.nonce,
|
|
195
|
+
chainId: tx.chainId
|
|
196
|
+
};
|
|
197
|
+
const signedTx = await wallet.signTransaction(txRequest);
|
|
198
|
+
return { ...tx, signature: signedTx };
|
|
199
|
+
}
|
|
200
|
+
async signMessage(message) {
|
|
201
|
+
const wallet = this.getWallet();
|
|
202
|
+
return await wallet.signMessage(message);
|
|
203
|
+
}
|
|
204
|
+
getWalletInstance() {
|
|
205
|
+
return this.getWallet();
|
|
206
|
+
}
|
|
207
|
+
async importFromMnemonic(mnemonic) {
|
|
208
|
+
const wallet = import_ethers.ethers.Wallet.fromPhrase(mnemonic);
|
|
209
|
+
const walletDetails = {
|
|
210
|
+
provider: _PrivateKeyWalletProvider.PROVIDER_NAME,
|
|
211
|
+
address: wallet.address,
|
|
212
|
+
privateKey: wallet.privateKey,
|
|
213
|
+
mnemonic
|
|
214
|
+
};
|
|
215
|
+
(0, import_warps2.setWarpWalletInConfig)(this.config, this.chain.name, walletDetails);
|
|
216
|
+
return walletDetails;
|
|
217
|
+
}
|
|
218
|
+
async importFromPrivateKey(privateKey) {
|
|
219
|
+
const wallet = new import_ethers.ethers.Wallet(privateKey);
|
|
220
|
+
const walletDetails = {
|
|
221
|
+
provider: _PrivateKeyWalletProvider.PROVIDER_NAME,
|
|
222
|
+
address: wallet.address,
|
|
223
|
+
privateKey: wallet.privateKey,
|
|
224
|
+
mnemonic: null
|
|
225
|
+
};
|
|
226
|
+
(0, import_warps2.setWarpWalletInConfig)(this.config, this.chain.name, walletDetails);
|
|
227
|
+
return walletDetails;
|
|
228
|
+
}
|
|
229
|
+
async export() {
|
|
230
|
+
const wallet = this.getWallet();
|
|
231
|
+
const mnemonic = (0, import_warps2.getWarpWalletMnemonicFromConfig)(this.config, this.chain.name);
|
|
232
|
+
return {
|
|
233
|
+
provider: _PrivateKeyWalletProvider.PROVIDER_NAME,
|
|
234
|
+
address: wallet.address,
|
|
235
|
+
privateKey: wallet.privateKey,
|
|
236
|
+
mnemonic: mnemonic || null
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
async generate() {
|
|
240
|
+
const wallet = import_ethers.ethers.Wallet.createRandom();
|
|
241
|
+
return {
|
|
242
|
+
provider: _PrivateKeyWalletProvider.PROVIDER_NAME,
|
|
243
|
+
address: wallet.address,
|
|
244
|
+
privateKey: wallet.privateKey,
|
|
245
|
+
mnemonic: null
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
getWallet() {
|
|
249
|
+
if (this.wallet) return this.wallet;
|
|
250
|
+
const privateKey = (0, import_warps2.getWarpWalletPrivateKeyFromConfig)(this.config, this.chain.name);
|
|
251
|
+
if (!privateKey) throw new Error("No private key provided");
|
|
252
|
+
this.wallet = new import_ethers.ethers.Wallet(privateKey);
|
|
253
|
+
return this.wallet;
|
|
254
|
+
}
|
|
255
|
+
};
|
|
256
|
+
_PrivateKeyWalletProvider.PROVIDER_NAME = "privateKey";
|
|
257
|
+
var PrivateKeyWalletProvider = _PrivateKeyWalletProvider;
|
|
258
|
+
|
|
259
|
+
// src/providers/MnemonicWalletProvider.ts
|
|
260
|
+
var import_ethers2 = require("ethers");
|
|
261
|
+
var bip39 = __toESM(require("@scure/bip39"), 1);
|
|
262
|
+
var import_english = require("@scure/bip39/wordlists/english.js");
|
|
263
|
+
var import_warps3 = require("@joai/warps");
|
|
264
|
+
var _MnemonicWalletProvider = class _MnemonicWalletProvider {
|
|
265
|
+
constructor(config, chain) {
|
|
266
|
+
this.config = config;
|
|
267
|
+
this.chain = chain;
|
|
268
|
+
this.wallet = null;
|
|
269
|
+
}
|
|
270
|
+
async getAddress() {
|
|
271
|
+
try {
|
|
272
|
+
const wallet = this.getWallet();
|
|
273
|
+
return wallet.address;
|
|
274
|
+
} catch {
|
|
275
|
+
return null;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
async getPublicKey() {
|
|
279
|
+
try {
|
|
280
|
+
const wallet = this.getWallet();
|
|
281
|
+
const publicKey = wallet.signingKey.publicKey;
|
|
282
|
+
return publicKey.startsWith("0x") ? publicKey.slice(2) : publicKey;
|
|
283
|
+
} catch {
|
|
284
|
+
return null;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
async signTransaction(tx) {
|
|
288
|
+
const wallet = this.getWallet();
|
|
289
|
+
const txRequest = {
|
|
290
|
+
to: tx.to,
|
|
291
|
+
data: tx.data,
|
|
292
|
+
value: tx.value || 0,
|
|
293
|
+
gasLimit: tx.gasLimit,
|
|
294
|
+
maxFeePerGas: tx.maxFeePerGas,
|
|
295
|
+
maxPriorityFeePerGas: tx.maxPriorityFeePerGas,
|
|
296
|
+
nonce: tx.nonce,
|
|
297
|
+
chainId: tx.chainId
|
|
298
|
+
};
|
|
299
|
+
const signedTx = await wallet.signTransaction(txRequest);
|
|
300
|
+
return { ...tx, signature: signedTx };
|
|
301
|
+
}
|
|
302
|
+
async signMessage(message) {
|
|
303
|
+
const wallet = this.getWallet();
|
|
304
|
+
return await wallet.signMessage(message);
|
|
305
|
+
}
|
|
306
|
+
getWalletInstance() {
|
|
307
|
+
return this.getWallet();
|
|
308
|
+
}
|
|
309
|
+
async importFromMnemonic(mnemonic) {
|
|
310
|
+
const trimmedMnemonic = (0, import_warps3.normalizeAndValidateMnemonic)(mnemonic);
|
|
311
|
+
const wallet = import_ethers2.HDNodeWallet.fromPhrase(trimmedMnemonic);
|
|
312
|
+
const walletDetails = {
|
|
313
|
+
provider: _MnemonicWalletProvider.PROVIDER_NAME,
|
|
314
|
+
address: wallet.address,
|
|
315
|
+
privateKey: wallet.privateKey,
|
|
316
|
+
mnemonic: trimmedMnemonic
|
|
317
|
+
};
|
|
318
|
+
(0, import_warps3.setWarpWalletInConfig)(this.config, this.chain.name, walletDetails);
|
|
319
|
+
return walletDetails;
|
|
320
|
+
}
|
|
321
|
+
async importFromPrivateKey(privateKey) {
|
|
322
|
+
const wallet = new import_ethers2.ethers.Wallet(privateKey);
|
|
323
|
+
const walletDetails = {
|
|
324
|
+
provider: _MnemonicWalletProvider.PROVIDER_NAME,
|
|
325
|
+
address: wallet.address,
|
|
326
|
+
privateKey: wallet.privateKey,
|
|
327
|
+
mnemonic: null
|
|
328
|
+
};
|
|
329
|
+
(0, import_warps3.setWarpWalletInConfig)(this.config, this.chain.name, walletDetails);
|
|
330
|
+
return walletDetails;
|
|
331
|
+
}
|
|
332
|
+
async export() {
|
|
333
|
+
const wallet = this.getWallet();
|
|
334
|
+
const mnemonic = (0, import_warps3.getWarpWalletMnemonicFromConfig)(this.config, this.chain.name);
|
|
335
|
+
const privateKey = (0, import_warps3.getWarpWalletPrivateKeyFromConfig)(this.config, this.chain.name);
|
|
336
|
+
return {
|
|
337
|
+
provider: _MnemonicWalletProvider.PROVIDER_NAME,
|
|
338
|
+
address: wallet.address,
|
|
339
|
+
privateKey: privateKey || null,
|
|
340
|
+
mnemonic: mnemonic || null
|
|
341
|
+
};
|
|
342
|
+
}
|
|
343
|
+
async generate() {
|
|
344
|
+
const mnemonicRaw = bip39.generateMnemonic(import_english.wordlist, 256);
|
|
345
|
+
const mnemonic = (0, import_warps3.normalizeMnemonic)(mnemonicRaw);
|
|
346
|
+
(0, import_warps3.validateMnemonicLength)(mnemonic);
|
|
347
|
+
const wallet = import_ethers2.HDNodeWallet.fromPhrase(mnemonic);
|
|
348
|
+
return {
|
|
349
|
+
provider: _MnemonicWalletProvider.PROVIDER_NAME,
|
|
350
|
+
address: wallet.address,
|
|
351
|
+
privateKey: null,
|
|
352
|
+
mnemonic
|
|
353
|
+
};
|
|
354
|
+
}
|
|
355
|
+
getWallet() {
|
|
356
|
+
if (this.wallet) return this.wallet;
|
|
357
|
+
const mnemonic = (0, import_warps3.getWarpWalletMnemonicFromConfig)(this.config, this.chain.name);
|
|
358
|
+
if (!mnemonic) throw new Error("No mnemonic provided");
|
|
359
|
+
this.wallet = import_ethers2.HDNodeWallet.fromPhrase(mnemonic.trim());
|
|
360
|
+
return this.wallet;
|
|
361
|
+
}
|
|
362
|
+
};
|
|
363
|
+
_MnemonicWalletProvider.PROVIDER_NAME = "mnemonic";
|
|
364
|
+
var MnemonicWalletProvider = _MnemonicWalletProvider;
|
|
365
|
+
|
|
366
|
+
// src/providers/ReadOnlyWalletProvider.ts
|
|
367
|
+
var import_warps4 = require("@joai/warps");
|
|
368
|
+
var ReadOnlyWalletProvider = class {
|
|
369
|
+
constructor(config, chain) {
|
|
370
|
+
this.config = config;
|
|
371
|
+
this.chain = chain;
|
|
372
|
+
}
|
|
373
|
+
async getAddress() {
|
|
374
|
+
return (0, import_warps4.getWarpWalletAddressFromConfig)(this.config, this.chain.name);
|
|
375
|
+
}
|
|
376
|
+
async getPublicKey() {
|
|
377
|
+
return null;
|
|
378
|
+
}
|
|
379
|
+
async signTransaction(tx) {
|
|
380
|
+
const address = await this.getAddress();
|
|
381
|
+
throw new Error(`Wallet can not be used for signing: ${address}`);
|
|
382
|
+
}
|
|
383
|
+
async signMessage(message) {
|
|
384
|
+
const address = await this.getAddress();
|
|
385
|
+
throw new Error(`Wallet can not be used for signing: ${address}`);
|
|
386
|
+
}
|
|
387
|
+
async importFromMnemonic(mnemonic) {
|
|
388
|
+
const address = (0, import_warps4.getWarpWalletAddressFromConfig)(this.config, this.chain.name);
|
|
389
|
+
throw new Error(`Wallet can not be used for signing: ${address}`);
|
|
390
|
+
}
|
|
391
|
+
async importFromPrivateKey(privateKey) {
|
|
392
|
+
const address = (0, import_warps4.getWarpWalletAddressFromConfig)(this.config, this.chain.name);
|
|
393
|
+
throw new Error(`Wallet can not be used for signing: ${address}`);
|
|
394
|
+
}
|
|
395
|
+
async export() {
|
|
396
|
+
const address = (0, import_warps4.getWarpWalletAddressFromConfig)(this.config, this.chain.name);
|
|
397
|
+
throw new Error(`Wallet can not be used for signing: ${address}`);
|
|
398
|
+
}
|
|
399
|
+
async generate() {
|
|
400
|
+
const address = (0, import_warps4.getWarpWalletAddressFromConfig)(this.config, this.chain.name);
|
|
401
|
+
throw new Error(`Wallet can not be used for signing: ${address}`);
|
|
402
|
+
}
|
|
403
|
+
};
|
|
404
|
+
|
|
405
|
+
// src/tokens.ts
|
|
406
|
+
var import_warps13 = require("@joai/warps");
|
|
407
|
+
|
|
408
|
+
// src/tokens/arbitrum.ts
|
|
409
|
+
var import_warps5 = require("@joai/warps");
|
|
410
|
+
var ArbitrumChain = import_warps5.WarpChainName.Arbitrum;
|
|
411
|
+
var ArbitrumTokens = [
|
|
412
|
+
{
|
|
413
|
+
chain: ArbitrumChain,
|
|
414
|
+
identifier: "0x0000000000000000000000000000000000000000",
|
|
415
|
+
name: "Ether",
|
|
416
|
+
symbol: "ETH",
|
|
417
|
+
decimals: 18,
|
|
418
|
+
logoUrl: "https://assets.coingecko.com/coins/images/279/small/ethereum.png"
|
|
419
|
+
},
|
|
420
|
+
{
|
|
421
|
+
chain: ArbitrumChain,
|
|
422
|
+
identifier: "0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8",
|
|
423
|
+
name: "USD Coin",
|
|
424
|
+
symbol: "USDC",
|
|
425
|
+
decimals: 6,
|
|
426
|
+
logoUrl: "https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png"
|
|
427
|
+
},
|
|
428
|
+
{
|
|
429
|
+
chain: ArbitrumChain,
|
|
430
|
+
identifier: "0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9",
|
|
431
|
+
name: "Tether USD",
|
|
432
|
+
symbol: "USDT",
|
|
433
|
+
decimals: 6,
|
|
434
|
+
logoUrl: "https://assets.coingecko.com/coins/images/325/small/Tether.png"
|
|
435
|
+
},
|
|
436
|
+
{
|
|
437
|
+
chain: ArbitrumChain,
|
|
438
|
+
identifier: "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",
|
|
439
|
+
name: "Wrapped Ether",
|
|
440
|
+
symbol: "WETH",
|
|
441
|
+
decimals: 18,
|
|
442
|
+
logoUrl: "https://assets.coingecko.com/coins/images/2518/small/weth.png"
|
|
443
|
+
}
|
|
444
|
+
];
|
|
445
|
+
|
|
446
|
+
// src/tokens/arbitrum-sepolia.ts
|
|
447
|
+
var import_warps6 = require("@joai/warps");
|
|
448
|
+
var ArbitrumChain2 = import_warps6.WarpChainName.Arbitrum;
|
|
449
|
+
var ArbitrumSepoliaTokens = [
|
|
450
|
+
{
|
|
451
|
+
chain: ArbitrumChain2,
|
|
452
|
+
identifier: "0x0000000000000000000000000000000000000000",
|
|
453
|
+
name: "Ether",
|
|
454
|
+
symbol: "ETH",
|
|
455
|
+
decimals: 18,
|
|
456
|
+
logoUrl: "https://assets.coingecko.com/coins/images/279/small/ethereum.png"
|
|
457
|
+
},
|
|
458
|
+
{
|
|
459
|
+
chain: ArbitrumChain2,
|
|
460
|
+
identifier: "0x980B62Da83eFf3D4576C647993b0c1D7faf17c73",
|
|
461
|
+
name: "Wrapped Ether",
|
|
462
|
+
symbol: "WETH",
|
|
463
|
+
decimals: 18,
|
|
464
|
+
logoUrl: "https://assets.coingecko.com/coins/images/2518/small/weth.png"
|
|
465
|
+
},
|
|
466
|
+
{
|
|
467
|
+
chain: ArbitrumChain2,
|
|
468
|
+
identifier: "0xC6d2Bd6437655FBc6689Bfc987E09846aC4367Ed",
|
|
469
|
+
name: "Wrapped SET",
|
|
470
|
+
symbol: "WSET",
|
|
471
|
+
decimals: 18,
|
|
472
|
+
logoUrl: "https://raw.githubusercontent.com/JoAiHQ/assets/refs/heads/main/tokens/logos/set-black.svg"
|
|
473
|
+
}
|
|
474
|
+
];
|
|
475
|
+
|
|
476
|
+
// src/tokens/base.ts
|
|
477
|
+
var import_warps7 = require("@joai/warps");
|
|
478
|
+
var BaseChain = import_warps7.WarpChainName.Base;
|
|
479
|
+
var BaseTokens = [
|
|
480
|
+
{
|
|
481
|
+
chain: BaseChain,
|
|
482
|
+
identifier: "0x0000000000000000000000000000000000000000",
|
|
483
|
+
name: "Ether",
|
|
484
|
+
symbol: "ETH",
|
|
485
|
+
decimals: 18,
|
|
486
|
+
logoUrl: "https://assets.coingecko.com/coins/images/279/small/ethereum.png"
|
|
487
|
+
},
|
|
488
|
+
{
|
|
489
|
+
chain: BaseChain,
|
|
490
|
+
identifier: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
|
|
491
|
+
name: "USD Coin",
|
|
492
|
+
symbol: "USDC",
|
|
493
|
+
decimals: 6,
|
|
494
|
+
logoUrl: "https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png"
|
|
495
|
+
},
|
|
496
|
+
{
|
|
497
|
+
chain: BaseChain,
|
|
498
|
+
identifier: "0x4200000000000000000000000000000000000006",
|
|
499
|
+
name: "Wrapped Ether",
|
|
500
|
+
symbol: "WETH",
|
|
501
|
+
decimals: 18,
|
|
502
|
+
logoUrl: "https://assets.coingecko.com/coins/images/2518/small/weth.png"
|
|
503
|
+
},
|
|
504
|
+
{
|
|
505
|
+
chain: BaseChain,
|
|
506
|
+
identifier: "0x808456652fdb597867f38412077A9182bf77359F",
|
|
507
|
+
name: "Euro",
|
|
508
|
+
symbol: "EURC",
|
|
509
|
+
decimals: 6,
|
|
510
|
+
logoUrl: "https://assets.coingecko.com/coins/images/26045/standard/euro.png"
|
|
511
|
+
},
|
|
512
|
+
{
|
|
513
|
+
chain: BaseChain,
|
|
514
|
+
identifier: "0xcbB7C0006F23900c38EB856149F799620fcb8A4a",
|
|
515
|
+
name: "Coinbase Wrapped BTC",
|
|
516
|
+
symbol: "CBETH",
|
|
517
|
+
decimals: 8,
|
|
518
|
+
logoUrl: "https://assets.coingecko.com/coins/images/7598/small/wrapped_bitcoin_wbtc.png"
|
|
519
|
+
}
|
|
520
|
+
];
|
|
521
|
+
|
|
522
|
+
// src/tokens/base-sepolia.ts
|
|
523
|
+
var import_warps8 = require("@joai/warps");
|
|
524
|
+
var BaseChain2 = import_warps8.WarpChainName.Base;
|
|
525
|
+
var BaseSepoliaTokens = [
|
|
526
|
+
{
|
|
527
|
+
chain: BaseChain2,
|
|
528
|
+
identifier: "0x0000000000000000000000000000000000000000",
|
|
529
|
+
name: "Ether",
|
|
530
|
+
symbol: "ETH",
|
|
531
|
+
decimals: 18,
|
|
532
|
+
logoUrl: "https://assets.coingecko.com/coins/images/279/small/ethereum.png"
|
|
533
|
+
},
|
|
534
|
+
{
|
|
535
|
+
chain: BaseChain2,
|
|
536
|
+
identifier: "0x036CbD53842c5426634e7929541eC2318f3dCF7e",
|
|
537
|
+
name: "USD",
|
|
538
|
+
symbol: "USDC",
|
|
539
|
+
decimals: 6,
|
|
540
|
+
logoUrl: "https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png"
|
|
541
|
+
},
|
|
542
|
+
{
|
|
543
|
+
chain: BaseChain2,
|
|
544
|
+
identifier: "0x808456652fdb597867f38412077A9182bf77359F",
|
|
545
|
+
name: "Euro",
|
|
546
|
+
symbol: "EURC",
|
|
547
|
+
decimals: 6,
|
|
548
|
+
logoUrl: "https://assets.coingecko.com/coins/images/26045/thumb/euro-coin.png?1655394420"
|
|
549
|
+
},
|
|
550
|
+
{
|
|
551
|
+
chain: BaseChain2,
|
|
552
|
+
identifier: "0xcbB7C0006F23900c38EB856149F799620fcb8A4a",
|
|
553
|
+
name: "Wrapped Bitcoin",
|
|
554
|
+
symbol: "WBTC",
|
|
555
|
+
decimals: 8,
|
|
556
|
+
logoUrl: "https://assets.coingecko.com/coins/images/7598/small/wrapped_bitcoin_wbtc.png"
|
|
557
|
+
}
|
|
558
|
+
];
|
|
559
|
+
|
|
560
|
+
// src/tokens/ethereum.ts
|
|
561
|
+
var import_warps9 = require("@joai/warps");
|
|
562
|
+
var EthereumChain = import_warps9.WarpChainName.Ethereum;
|
|
563
|
+
var EthereumTokens = [
|
|
564
|
+
{
|
|
565
|
+
chain: EthereumChain,
|
|
566
|
+
identifier: "0x0000000000000000000000000000000000000000",
|
|
567
|
+
name: "Ether",
|
|
568
|
+
symbol: "ETH",
|
|
569
|
+
decimals: 18,
|
|
570
|
+
logoUrl: "https://assets.coingecko.com/coins/images/279/small/ethereum.png"
|
|
571
|
+
},
|
|
572
|
+
{
|
|
573
|
+
chain: EthereumChain,
|
|
574
|
+
identifier: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
|
|
575
|
+
name: "USD Coin",
|
|
576
|
+
symbol: "USDC",
|
|
577
|
+
decimals: 6,
|
|
578
|
+
logoUrl: "https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png"
|
|
579
|
+
},
|
|
580
|
+
{
|
|
581
|
+
chain: EthereumChain,
|
|
582
|
+
identifier: "0xdAC17F958D2ee523a2206206994597C13D831ec7",
|
|
583
|
+
name: "Tether USD",
|
|
584
|
+
symbol: "USDT",
|
|
585
|
+
decimals: 6,
|
|
586
|
+
logoUrl: "https://assets.coingecko.com/coins/images/325/small/Tether.png"
|
|
587
|
+
},
|
|
588
|
+
{
|
|
589
|
+
chain: EthereumChain,
|
|
590
|
+
identifier: "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599",
|
|
591
|
+
name: "Wrapped Bitcoin",
|
|
592
|
+
symbol: "WBTC",
|
|
593
|
+
decimals: 8,
|
|
594
|
+
logoUrl: "https://assets.coingecko.com/coins/images/7598/small/wrapped_bitcoin_wbtc.png"
|
|
595
|
+
},
|
|
596
|
+
{
|
|
597
|
+
chain: EthereumChain,
|
|
598
|
+
identifier: "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",
|
|
599
|
+
name: "Wrapped Ether",
|
|
600
|
+
symbol: "WETH",
|
|
601
|
+
decimals: 18,
|
|
602
|
+
logoUrl: "https://assets.coingecko.com/coins/images/2518/small/weth.png"
|
|
603
|
+
},
|
|
604
|
+
{
|
|
605
|
+
chain: EthereumChain,
|
|
606
|
+
identifier: "0x6B175474E89094C44Da98b954EedeAC495271d0F",
|
|
607
|
+
name: "Dai Stablecoin",
|
|
608
|
+
symbol: "DAI",
|
|
609
|
+
decimals: 18,
|
|
610
|
+
logoUrl: "https://assets.coingecko.com/coins/images/9956/small/4943.png"
|
|
611
|
+
}
|
|
612
|
+
];
|
|
613
|
+
|
|
614
|
+
// src/tokens/ethereum-sepolia.ts
|
|
615
|
+
var import_warps10 = require("@joai/warps");
|
|
616
|
+
var EthereumChain2 = import_warps10.WarpChainName.Ethereum;
|
|
617
|
+
var EthereumSepoliaTokens = [
|
|
618
|
+
{
|
|
619
|
+
chain: EthereumChain2,
|
|
620
|
+
identifier: "0x0000000000000000000000000000000000000000",
|
|
621
|
+
name: "Ether",
|
|
622
|
+
symbol: "ETH",
|
|
623
|
+
decimals: 18,
|
|
624
|
+
logoUrl: "https://assets.coingecko.com/coins/images/279/small/ethereum.png"
|
|
625
|
+
},
|
|
626
|
+
{
|
|
627
|
+
chain: EthereumChain2,
|
|
628
|
+
identifier: "0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238",
|
|
629
|
+
name: "USD Coin",
|
|
630
|
+
symbol: "USDC",
|
|
631
|
+
decimals: 6,
|
|
632
|
+
logoUrl: "https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png"
|
|
633
|
+
},
|
|
634
|
+
{
|
|
635
|
+
chain: EthereumChain2,
|
|
636
|
+
identifier: "0x7169D38820dfd117C3FA1f22a697dBA58d90BA06",
|
|
637
|
+
name: "Tether USD",
|
|
638
|
+
symbol: "USDT",
|
|
639
|
+
decimals: 6,
|
|
640
|
+
logoUrl: "https://assets.coingecko.com/coins/images/325/small/Tether.png"
|
|
641
|
+
},
|
|
642
|
+
{
|
|
643
|
+
chain: EthereumChain2,
|
|
644
|
+
identifier: "0xfFf9976782d46CC05630D1f6eBAb18b2324d6B14",
|
|
645
|
+
name: "Wrapped Ether",
|
|
646
|
+
symbol: "WETH",
|
|
647
|
+
decimals: 18,
|
|
648
|
+
logoUrl: "https://assets.coingecko.com/coins/images/2518/small/weth.png"
|
|
649
|
+
},
|
|
650
|
+
{
|
|
651
|
+
chain: EthereumChain2,
|
|
652
|
+
identifier: "0xC6d2Bd6437655FBc6689Bfc987E09846aC4367Ed",
|
|
653
|
+
name: "Wrapped SET",
|
|
654
|
+
symbol: "WSET",
|
|
655
|
+
decimals: 18,
|
|
656
|
+
logoUrl: "https://raw.githubusercontent.com/JoAiHQ/assets/refs/heads/main/tokens/logos/set-black.svg"
|
|
657
|
+
}
|
|
658
|
+
];
|
|
659
|
+
|
|
660
|
+
// src/tokens/polygon.ts
|
|
661
|
+
var import_warps11 = require("@joai/warps");
|
|
662
|
+
var PolygonChain = import_warps11.WarpChainName.Polygon;
|
|
663
|
+
var PolygonTokens = [
|
|
664
|
+
{
|
|
665
|
+
chain: PolygonChain,
|
|
666
|
+
identifier: "0x0000000000000000000000000000000000000000",
|
|
667
|
+
name: "Polygon",
|
|
668
|
+
symbol: "MATIC",
|
|
669
|
+
decimals: 18,
|
|
670
|
+
logoUrl: "https://assets.coingecko.com/coins/images/4713/small/matic-token-icon.png"
|
|
671
|
+
},
|
|
672
|
+
{
|
|
673
|
+
chain: PolygonChain,
|
|
674
|
+
identifier: "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174",
|
|
675
|
+
name: "USD Coin",
|
|
676
|
+
symbol: "USDC",
|
|
677
|
+
decimals: 6,
|
|
678
|
+
logoUrl: "https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png"
|
|
679
|
+
},
|
|
680
|
+
{
|
|
681
|
+
chain: PolygonChain,
|
|
682
|
+
identifier: "0xc2132D05D31c914a87C6611C10748AEb04B58e8F",
|
|
683
|
+
name: "Tether USD",
|
|
684
|
+
symbol: "USDT",
|
|
685
|
+
decimals: 6,
|
|
686
|
+
logoUrl: "https://assets.coingecko.com/coins/images/325/small/Tether.png"
|
|
687
|
+
},
|
|
688
|
+
{
|
|
689
|
+
chain: PolygonChain,
|
|
690
|
+
identifier: "0x1BFD67037B42Cf73acF2047067bd4F2C47D9BfD6",
|
|
691
|
+
name: "Wrapped Bitcoin",
|
|
692
|
+
symbol: "WBTC",
|
|
693
|
+
decimals: 8,
|
|
694
|
+
logoUrl: "https://assets.coingecko.com/coins/images/7598/small/wrapped_bitcoin_wbtc.png"
|
|
695
|
+
},
|
|
696
|
+
{
|
|
697
|
+
chain: PolygonChain,
|
|
698
|
+
identifier: "0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619",
|
|
699
|
+
name: "Wrapped Ether",
|
|
700
|
+
symbol: "WETH",
|
|
701
|
+
decimals: 18,
|
|
702
|
+
logoUrl: "https://assets.coingecko.com/coins/images/2518/small/weth.png"
|
|
703
|
+
},
|
|
704
|
+
{
|
|
705
|
+
chain: PolygonChain,
|
|
706
|
+
identifier: "0x8f3Cf7ad23Cd3CaDbD9735AFf958023239c6A063",
|
|
707
|
+
name: "Dai Stablecoin",
|
|
708
|
+
symbol: "DAI",
|
|
709
|
+
decimals: 18,
|
|
710
|
+
logoUrl: "https://assets.coingecko.com/coins/images/9956/small/4943.png"
|
|
711
|
+
}
|
|
712
|
+
];
|
|
713
|
+
|
|
714
|
+
// src/tokens/polygon-mumbai.ts
|
|
715
|
+
var import_warps12 = require("@joai/warps");
|
|
716
|
+
var PolygonChain2 = import_warps12.WarpChainName.Polygon;
|
|
717
|
+
var PolygonMumbaiTokens = [
|
|
718
|
+
{
|
|
719
|
+
chain: PolygonChain2,
|
|
720
|
+
identifier: "0x0000000000000000000000000000000000000000",
|
|
721
|
+
name: "Polygon",
|
|
722
|
+
symbol: "MATIC",
|
|
723
|
+
decimals: 18,
|
|
724
|
+
logoUrl: "https://assets.coingecko.com/coins/images/4713/small/matic-token-icon.png"
|
|
725
|
+
},
|
|
726
|
+
{
|
|
727
|
+
chain: PolygonChain2,
|
|
728
|
+
identifier: "0x0FA8781a83E46826621b3BC094Ea2Aea2Cdd993B",
|
|
729
|
+
name: "USD Coin",
|
|
730
|
+
symbol: "USDC",
|
|
731
|
+
decimals: 6,
|
|
732
|
+
logoUrl: "https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png"
|
|
733
|
+
}
|
|
734
|
+
];
|
|
735
|
+
|
|
736
|
+
// src/tokens.ts
|
|
737
|
+
var KnownTokens = {
|
|
738
|
+
[import_warps13.WarpChainName.Ethereum]: {
|
|
739
|
+
mainnet: EthereumTokens,
|
|
740
|
+
testnet: EthereumSepoliaTokens,
|
|
741
|
+
devnet: EthereumSepoliaTokens
|
|
742
|
+
},
|
|
743
|
+
[import_warps13.WarpChainName.Base]: {
|
|
744
|
+
mainnet: BaseTokens,
|
|
745
|
+
testnet: BaseSepoliaTokens,
|
|
746
|
+
devnet: BaseSepoliaTokens
|
|
747
|
+
},
|
|
748
|
+
[import_warps13.WarpChainName.Arbitrum]: {
|
|
749
|
+
mainnet: ArbitrumTokens,
|
|
750
|
+
testnet: ArbitrumSepoliaTokens,
|
|
751
|
+
devnet: ArbitrumSepoliaTokens
|
|
752
|
+
},
|
|
753
|
+
[import_warps13.WarpChainName.Polygon]: {
|
|
754
|
+
mainnet: PolygonTokens,
|
|
755
|
+
testnet: PolygonMumbaiTokens,
|
|
756
|
+
devnet: PolygonMumbaiTokens
|
|
757
|
+
}
|
|
758
|
+
};
|
|
759
|
+
var findKnownTokenById = (chain, env, id) => {
|
|
760
|
+
const chainTokens = KnownTokens[chain]?.[env] || [];
|
|
761
|
+
return chainTokens.find((token) => token.identifier === id) || null;
|
|
762
|
+
};
|
|
763
|
+
var getKnownTokensForChain = (chainName, env = "mainnet") => {
|
|
764
|
+
return KnownTokens[chainName]?.[env] || [];
|
|
765
|
+
};
|
|
766
|
+
|
|
767
|
+
// src/WarpEvmDataLoader.ts
|
|
768
|
+
var ERC20_ABI = [
|
|
769
|
+
"function balanceOf(address owner) view returns (uint256)",
|
|
770
|
+
"function decimals() view returns (uint8)",
|
|
771
|
+
"function name() view returns (string)",
|
|
772
|
+
"function symbol() view returns (string)",
|
|
773
|
+
"function totalSupply() view returns (uint256)"
|
|
774
|
+
];
|
|
775
|
+
var WarpEvmDataLoader = class {
|
|
776
|
+
constructor(config, chain) {
|
|
777
|
+
this.config = config;
|
|
778
|
+
this.chain = chain;
|
|
779
|
+
const providerConfig = (0, import_warps14.getProviderConfig)(this.config, this.chain.name, this.config.env, this.chain.defaultApiUrl);
|
|
780
|
+
const network = new import_ethers3.ethers.Network(this.chain.name, parseInt(this.chain.chainId));
|
|
781
|
+
this.provider = new import_ethers3.ethers.JsonRpcProvider(providerConfig.url, network);
|
|
782
|
+
this.cache = new import_warps14.WarpCache(config.env, config.cache);
|
|
783
|
+
this.uniswapService = new UniswapService(this.cache, parseInt(this.chain.chainId));
|
|
784
|
+
}
|
|
785
|
+
getRequiredConfirmations() {
|
|
786
|
+
if (this.config.env === "mainnet") {
|
|
787
|
+
return 12;
|
|
788
|
+
}
|
|
789
|
+
return 1;
|
|
790
|
+
}
|
|
791
|
+
async getAccount(address) {
|
|
792
|
+
const balance = await this.provider.getBalance(address);
|
|
793
|
+
return {
|
|
794
|
+
chain: this.chain.name,
|
|
795
|
+
address,
|
|
796
|
+
balance
|
|
797
|
+
};
|
|
798
|
+
}
|
|
799
|
+
async getAccountAssets(address) {
|
|
800
|
+
const account = await this.getAccount(address);
|
|
801
|
+
const tokenBalances = await this.getERC20TokenBalances(address);
|
|
802
|
+
let assets = account.balance > 0 ? [{ ...this.chain.nativeToken, amount: account.balance }] : [];
|
|
803
|
+
for (const tokenBalance of tokenBalances) {
|
|
804
|
+
if (tokenBalance.balance > 0n) {
|
|
805
|
+
assets.push({
|
|
806
|
+
chain: this.chain.name,
|
|
807
|
+
identifier: tokenBalance.tokenAddress,
|
|
808
|
+
name: tokenBalance.name,
|
|
809
|
+
symbol: tokenBalance.symbol,
|
|
810
|
+
amount: tokenBalance.balance,
|
|
811
|
+
decimals: tokenBalance.decimals,
|
|
812
|
+
logoUrl: tokenBalance.logoUrl || ""
|
|
813
|
+
});
|
|
814
|
+
}
|
|
815
|
+
}
|
|
816
|
+
return assets;
|
|
817
|
+
}
|
|
818
|
+
async getAsset(identifier) {
|
|
819
|
+
try {
|
|
820
|
+
console.log("WarpEvmDataLoader.getAsset", identifier);
|
|
821
|
+
if (identifier === this.chain.nativeToken.identifier) {
|
|
822
|
+
return this.chain.nativeToken;
|
|
823
|
+
}
|
|
824
|
+
const cacheKey = import_warps14.WarpCacheKey.Asset(this.config.env, this.chain.name, identifier);
|
|
825
|
+
const cachedAsset = this.cache.get(cacheKey);
|
|
826
|
+
if (cachedAsset) {
|
|
827
|
+
return cachedAsset;
|
|
828
|
+
}
|
|
829
|
+
console.log("WarpEvmDataLoader.getAsset: findKnownTokenById", this.chain.name, this.config.env, identifier);
|
|
830
|
+
const knownToken = findKnownTokenById(this.chain.name, this.config.env, identifier);
|
|
831
|
+
if (knownToken) {
|
|
832
|
+
return {
|
|
833
|
+
chain: this.chain.name,
|
|
834
|
+
identifier,
|
|
835
|
+
name: knownToken.name,
|
|
836
|
+
symbol: knownToken.symbol,
|
|
837
|
+
amount: 0n,
|
|
838
|
+
decimals: knownToken.decimals,
|
|
839
|
+
logoUrl: knownToken.logoUrl
|
|
840
|
+
};
|
|
841
|
+
}
|
|
842
|
+
const metadata = await this.getTokenMetadata(identifier);
|
|
843
|
+
const asset = {
|
|
844
|
+
chain: this.chain.name,
|
|
845
|
+
identifier,
|
|
846
|
+
name: metadata.name,
|
|
847
|
+
symbol: metadata.symbol,
|
|
848
|
+
amount: 0n,
|
|
849
|
+
decimals: metadata.decimals,
|
|
850
|
+
logoUrl: metadata.logoUrl
|
|
851
|
+
};
|
|
852
|
+
this.cache.set(cacheKey, asset, import_warps14.CacheTtl.OneHour);
|
|
853
|
+
return asset;
|
|
854
|
+
} catch (error) {
|
|
855
|
+
return null;
|
|
856
|
+
}
|
|
857
|
+
}
|
|
858
|
+
async getAction(identifier, awaitCompleted = false) {
|
|
859
|
+
try {
|
|
860
|
+
const tx = await this.provider.getTransaction(identifier);
|
|
861
|
+
if (!tx) return null;
|
|
862
|
+
let receipt = await this.provider.getTransactionReceipt(identifier);
|
|
863
|
+
if (awaitCompleted) {
|
|
864
|
+
if (!receipt) {
|
|
865
|
+
receipt = await tx.wait();
|
|
866
|
+
} else {
|
|
867
|
+
const confirmations = this.getRequiredConfirmations();
|
|
868
|
+
const currentBlock = await this.provider.getBlockNumber();
|
|
869
|
+
const receiptBlock = receipt.blockNumber;
|
|
870
|
+
const confirmationsCount = currentBlock - receiptBlock;
|
|
871
|
+
if (confirmationsCount < confirmations) {
|
|
872
|
+
await tx.wait(confirmations);
|
|
873
|
+
receipt = await this.provider.getTransactionReceipt(identifier);
|
|
874
|
+
}
|
|
875
|
+
}
|
|
876
|
+
}
|
|
877
|
+
const block = await this.provider.getBlock(receipt?.blockNumber || tx.blockNumber || "latest");
|
|
878
|
+
const status = receipt ? receipt.status === 1 ? "success" : receipt.status === 0 ? "failed" : "pending" : "pending";
|
|
879
|
+
const error = receipt?.status === 0 ? "Transaction failed" : null;
|
|
880
|
+
return {
|
|
881
|
+
chain: this.chain.name,
|
|
882
|
+
id: tx.hash || identifier,
|
|
883
|
+
receiver: tx.to || "",
|
|
884
|
+
sender: tx.from,
|
|
885
|
+
value: tx.value,
|
|
886
|
+
function: tx.data && tx.data !== "0x" ? "contract_call" : "",
|
|
887
|
+
status,
|
|
888
|
+
createdAt: block?.timestamp ? new Date(Number(block.timestamp) * 1e3).toISOString() : (/* @__PURE__ */ new Date()).toISOString(),
|
|
889
|
+
error,
|
|
890
|
+
tx: {
|
|
891
|
+
hash: tx.hash || "",
|
|
892
|
+
from: tx.from,
|
|
893
|
+
to: tx.to || "",
|
|
894
|
+
value: tx.value.toString(),
|
|
895
|
+
data: tx.data || "0x",
|
|
896
|
+
gasLimit: tx.gasLimit?.toString() || "0",
|
|
897
|
+
gasPrice: tx.gasPrice?.toString() || "0",
|
|
898
|
+
blockNumber: tx.blockNumber || 0,
|
|
899
|
+
blockHash: tx.blockHash || "",
|
|
900
|
+
transactionIndex: tx.index || 0,
|
|
901
|
+
status: receipt?.status
|
|
902
|
+
}
|
|
903
|
+
};
|
|
904
|
+
} catch (error) {
|
|
905
|
+
return null;
|
|
906
|
+
}
|
|
907
|
+
}
|
|
908
|
+
async getAccountActions(address, options) {
|
|
909
|
+
return [];
|
|
910
|
+
}
|
|
911
|
+
async getERC20TokenBalances(address) {
|
|
912
|
+
const env = this.config.env === "mainnet" ? "mainnet" : "testnet";
|
|
913
|
+
const tokens = getKnownTokensForChain(this.chain.name, env);
|
|
914
|
+
const balanceReqs = tokens.map((token) => this.getTokenBalance(address, token.identifier).catch(() => 0n));
|
|
915
|
+
const balances = await Promise.all(balanceReqs);
|
|
916
|
+
return balances.map((balance, index) => ({ balance, token: tokens[index] })).filter(({ balance }) => balance > 0n).map(({ balance, token }) => ({
|
|
917
|
+
tokenAddress: token.identifier,
|
|
918
|
+
balance,
|
|
919
|
+
name: token.name,
|
|
920
|
+
symbol: token.symbol,
|
|
921
|
+
decimals: token.decimals || 18,
|
|
922
|
+
logoUrl: (0, import_warps14.getWarpChainAssetLogoUrl)(token, this.config) || ""
|
|
923
|
+
}));
|
|
924
|
+
}
|
|
925
|
+
async getTokenBalance(address, tokenAddress) {
|
|
926
|
+
const contract = new import_ethers3.ethers.Contract(tokenAddress, ERC20_ABI, this.provider);
|
|
927
|
+
const balance = await contract.balanceOf(address);
|
|
928
|
+
return balance;
|
|
929
|
+
}
|
|
930
|
+
async getTokenMetadata(tokenAddress) {
|
|
931
|
+
const uniswapMetadata = await this.uniswapService.getTokenMetadata(tokenAddress);
|
|
932
|
+
if (uniswapMetadata) {
|
|
933
|
+
return uniswapMetadata;
|
|
934
|
+
}
|
|
935
|
+
const contract = new import_ethers3.ethers.Contract(tokenAddress, ERC20_ABI, this.provider);
|
|
936
|
+
const [name, symbol, decimals] = await Promise.all([
|
|
937
|
+
contract.name().catch(() => "Unknown Token"),
|
|
938
|
+
contract.symbol().catch(() => "UNKNOWN"),
|
|
939
|
+
contract.decimals().catch(() => 18)
|
|
940
|
+
]);
|
|
941
|
+
return {
|
|
942
|
+
name: name || "Unknown Token",
|
|
943
|
+
symbol: symbol || "UNKNOWN",
|
|
944
|
+
decimals: decimals || 18,
|
|
945
|
+
logoUrl: ""
|
|
946
|
+
};
|
|
947
|
+
}
|
|
948
|
+
};
|
|
949
|
+
|
|
950
|
+
// src/WarpEvmExecutor.ts
|
|
951
|
+
var import_warps17 = require("@joai/warps");
|
|
952
|
+
var import_ethers6 = require("ethers");
|
|
953
|
+
|
|
954
|
+
// src/constants.ts
|
|
955
|
+
var WarpEvmConstants = {
|
|
956
|
+
GasLimit: {
|
|
957
|
+
Default: 21e3,
|
|
958
|
+
ContractCall: 1e5,
|
|
959
|
+
ContractDeploy: 5e5,
|
|
960
|
+
Transfer: 21e3,
|
|
961
|
+
TokenTransfer: 65e3,
|
|
962
|
+
// ERC-20 transfer gas limit
|
|
963
|
+
Approve: 46e3,
|
|
964
|
+
Swap: 2e5
|
|
965
|
+
},
|
|
966
|
+
GasPrice: {
|
|
967
|
+
Default: "1200010"
|
|
968
|
+
},
|
|
969
|
+
Validation: {
|
|
970
|
+
MinGasLimit: 21e3,
|
|
971
|
+
MaxGasLimit: 3e7
|
|
972
|
+
}
|
|
973
|
+
};
|
|
974
|
+
var EthereumExplorers = /* @__PURE__ */ ((EthereumExplorers2) => {
|
|
975
|
+
EthereumExplorers2["Etherscan"] = "etherscan";
|
|
976
|
+
EthereumExplorers2["EtherscanSepolia"] = "etherscan_sepolia";
|
|
977
|
+
EthereumExplorers2["Ethplorer"] = "ethplorer";
|
|
978
|
+
EthereumExplorers2["Blockscout"] = "blockscout";
|
|
979
|
+
EthereumExplorers2["BlockscoutSepolia"] = "blockscout_sepolia";
|
|
980
|
+
return EthereumExplorers2;
|
|
981
|
+
})(EthereumExplorers || {});
|
|
982
|
+
var ArbitrumExplorers = /* @__PURE__ */ ((ArbitrumExplorers2) => {
|
|
983
|
+
ArbitrumExplorers2["Arbiscan"] = "arbiscan";
|
|
984
|
+
ArbitrumExplorers2["ArbiscanSepolia"] = "arbiscan_sepolia";
|
|
985
|
+
ArbitrumExplorers2["BlockscoutArbitrum"] = "blockscout_arbitrum";
|
|
986
|
+
ArbitrumExplorers2["BlockscoutArbitrumSepolia"] = "blockscout_arbitrum_sepolia";
|
|
987
|
+
return ArbitrumExplorers2;
|
|
988
|
+
})(ArbitrumExplorers || {});
|
|
989
|
+
var BaseExplorers = /* @__PURE__ */ ((BaseExplorers2) => {
|
|
990
|
+
BaseExplorers2["Basescan"] = "basescan";
|
|
991
|
+
BaseExplorers2["BasescanSepolia"] = "basescan_sepolia";
|
|
992
|
+
BaseExplorers2["BlockscoutBase"] = "blockscout_base";
|
|
993
|
+
BaseExplorers2["BlockscoutBaseSepolia"] = "blockscout_base_sepolia";
|
|
994
|
+
return BaseExplorers2;
|
|
995
|
+
})(BaseExplorers || {});
|
|
996
|
+
var PolygonExplorers = /* @__PURE__ */ ((PolygonExplorers2) => {
|
|
997
|
+
PolygonExplorers2["Polygonscan"] = "polygonscan";
|
|
998
|
+
PolygonExplorers2["PolygonscanMumbai"] = "polygonscan_mumbai";
|
|
999
|
+
PolygonExplorers2["BlockscoutPolygon"] = "blockscout_polygon";
|
|
1000
|
+
PolygonExplorers2["BlockscoutPolygonMumbai"] = "blockscout_polygon_mumbai";
|
|
1001
|
+
return PolygonExplorers2;
|
|
1002
|
+
})(PolygonExplorers || {});
|
|
1003
|
+
var EvmExplorers = {
|
|
1004
|
+
ethereum: {
|
|
1005
|
+
mainnet: ["etherscan" /* Etherscan */, "ethplorer" /* Ethplorer */, "blockscout" /* Blockscout */],
|
|
1006
|
+
testnet: ["etherscan_sepolia" /* EtherscanSepolia */, "blockscout_sepolia" /* BlockscoutSepolia */],
|
|
1007
|
+
devnet: ["etherscan_sepolia" /* EtherscanSepolia */, "blockscout_sepolia" /* BlockscoutSepolia */]
|
|
1008
|
+
},
|
|
1009
|
+
arbitrum: {
|
|
1010
|
+
mainnet: ["arbiscan" /* Arbiscan */, "blockscout_arbitrum" /* BlockscoutArbitrum */],
|
|
1011
|
+
testnet: ["arbiscan_sepolia" /* ArbiscanSepolia */, "blockscout_arbitrum_sepolia" /* BlockscoutArbitrumSepolia */],
|
|
1012
|
+
devnet: ["arbiscan_sepolia" /* ArbiscanSepolia */, "blockscout_arbitrum_sepolia" /* BlockscoutArbitrumSepolia */]
|
|
1013
|
+
},
|
|
1014
|
+
base: {
|
|
1015
|
+
mainnet: ["basescan" /* Basescan */, "blockscout_base" /* BlockscoutBase */],
|
|
1016
|
+
testnet: ["basescan_sepolia" /* BasescanSepolia */, "blockscout_base_sepolia" /* BlockscoutBaseSepolia */],
|
|
1017
|
+
devnet: ["basescan_sepolia" /* BasescanSepolia */, "blockscout_base_sepolia" /* BlockscoutBaseSepolia */]
|
|
1018
|
+
},
|
|
1019
|
+
polygon: {
|
|
1020
|
+
mainnet: ["polygonscan" /* Polygonscan */, "blockscout_polygon" /* BlockscoutPolygon */],
|
|
1021
|
+
testnet: ["polygonscan_mumbai" /* PolygonscanMumbai */, "blockscout_polygon_mumbai" /* BlockscoutPolygonMumbai */],
|
|
1022
|
+
devnet: ["polygonscan_mumbai" /* PolygonscanMumbai */, "blockscout_polygon_mumbai" /* BlockscoutPolygonMumbai */]
|
|
1023
|
+
}
|
|
1024
|
+
};
|
|
1025
|
+
var ExplorerUrls = {
|
|
1026
|
+
["etherscan" /* Etherscan */]: "https://etherscan.io",
|
|
1027
|
+
["etherscan_sepolia" /* EtherscanSepolia */]: "https://sepolia.etherscan.io",
|
|
1028
|
+
["ethplorer" /* Ethplorer */]: "https://ethplorer.io",
|
|
1029
|
+
["blockscout" /* Blockscout */]: "https://eth.blockscout.com",
|
|
1030
|
+
["blockscout_sepolia" /* BlockscoutSepolia */]: "https://sepolia.blockscout.com",
|
|
1031
|
+
["arbiscan" /* Arbiscan */]: "https://arbiscan.io",
|
|
1032
|
+
["arbiscan_sepolia" /* ArbiscanSepolia */]: "https://sepolia.arbiscan.io",
|
|
1033
|
+
["blockscout_arbitrum" /* BlockscoutArbitrum */]: "https://arbitrum.blockscout.com",
|
|
1034
|
+
["blockscout_arbitrum_sepolia" /* BlockscoutArbitrumSepolia */]: "https://sepolia.blockscout.com",
|
|
1035
|
+
["basescan" /* Basescan */]: "https://basescan.org",
|
|
1036
|
+
["basescan_sepolia" /* BasescanSepolia */]: "https://sepolia.basescan.org",
|
|
1037
|
+
["blockscout_base" /* BlockscoutBase */]: "https://base.blockscout.com",
|
|
1038
|
+
["blockscout_base_sepolia" /* BlockscoutBaseSepolia */]: "https://sepolia.blockscout.com",
|
|
1039
|
+
["polygonscan" /* Polygonscan */]: "https://polygonscan.com",
|
|
1040
|
+
["polygonscan_mumbai" /* PolygonscanMumbai */]: "https://mumbai.polygonscan.com",
|
|
1041
|
+
["blockscout_polygon" /* BlockscoutPolygon */]: "https://polygon.blockscout.com",
|
|
1042
|
+
["blockscout_polygon_mumbai" /* BlockscoutPolygonMumbai */]: "https://mumbai.blockscout.com"
|
|
1043
|
+
};
|
|
1044
|
+
var EvmChainIds = {
|
|
1045
|
+
Ethereum: {
|
|
1046
|
+
Mainnet: 1,
|
|
1047
|
+
Goerli: 5,
|
|
1048
|
+
Sepolia: 11155111
|
|
1049
|
+
},
|
|
1050
|
+
Polygon: {
|
|
1051
|
+
Mainnet: 137,
|
|
1052
|
+
Mumbai: 80001
|
|
1053
|
+
},
|
|
1054
|
+
Arbitrum: {
|
|
1055
|
+
Mainnet: 42161,
|
|
1056
|
+
Sepolia: 421614
|
|
1057
|
+
},
|
|
1058
|
+
Base: {
|
|
1059
|
+
Mainnet: 8453,
|
|
1060
|
+
Sepolia: 84532
|
|
1061
|
+
},
|
|
1062
|
+
Optimism: {
|
|
1063
|
+
Mainnet: 10,
|
|
1064
|
+
Sepolia: 11155420
|
|
1065
|
+
}
|
|
1066
|
+
};
|
|
1067
|
+
var EvmChainIdMap = {
|
|
1068
|
+
"ethereum:mainnet": EvmChainIds.Ethereum.Mainnet,
|
|
1069
|
+
"ethereum:goerli": EvmChainIds.Ethereum.Goerli,
|
|
1070
|
+
"ethereum:sepolia": EvmChainIds.Ethereum.Sepolia,
|
|
1071
|
+
"polygon:mainnet": EvmChainIds.Polygon.Mainnet,
|
|
1072
|
+
"polygon:mumbai": EvmChainIds.Polygon.Mumbai,
|
|
1073
|
+
"arbitrum:mainnet": EvmChainIds.Arbitrum.Mainnet,
|
|
1074
|
+
"arbitrum:sepolia": EvmChainIds.Arbitrum.Sepolia,
|
|
1075
|
+
"base:mainnet": EvmChainIds.Base.Mainnet,
|
|
1076
|
+
"base:sepolia": EvmChainIds.Base.Sepolia,
|
|
1077
|
+
"optimism:mainnet": EvmChainIds.Optimism.Mainnet,
|
|
1078
|
+
"optimism:sepolia": EvmChainIds.Optimism.Sepolia
|
|
1079
|
+
};
|
|
1080
|
+
var SupportedEvmChainIds = [
|
|
1081
|
+
EvmChainIds.Ethereum.Mainnet,
|
|
1082
|
+
EvmChainIds.Ethereum.Goerli,
|
|
1083
|
+
EvmChainIds.Ethereum.Sepolia,
|
|
1084
|
+
EvmChainIds.Polygon.Mainnet,
|
|
1085
|
+
EvmChainIds.Polygon.Mumbai,
|
|
1086
|
+
EvmChainIds.Arbitrum.Mainnet,
|
|
1087
|
+
EvmChainIds.Arbitrum.Sepolia,
|
|
1088
|
+
EvmChainIds.Base.Mainnet,
|
|
1089
|
+
EvmChainIds.Base.Sepolia,
|
|
1090
|
+
EvmChainIds.Optimism.Mainnet,
|
|
1091
|
+
EvmChainIds.Optimism.Sepolia
|
|
1092
|
+
];
|
|
1093
|
+
|
|
1094
|
+
// src/WarpEvmOutput.ts
|
|
1095
|
+
var import_warps16 = require("@joai/warps");
|
|
1096
|
+
var import_ethers5 = require("ethers");
|
|
1097
|
+
|
|
1098
|
+
// src/WarpEvmSerializer.ts
|
|
1099
|
+
var import_warps15 = require("@joai/warps");
|
|
1100
|
+
var import_ethers4 = require("ethers");
|
|
1101
|
+
var SplitParamsRegex = new RegExp(`${import_warps15.WarpConstants.ArgParamsSeparator}(.*)`);
|
|
1102
|
+
var WarpEvmSerializer = class {
|
|
1103
|
+
constructor() {
|
|
1104
|
+
this.coreSerializer = new import_warps15.WarpSerializer();
|
|
1105
|
+
}
|
|
1106
|
+
typedToString(value) {
|
|
1107
|
+
if (typeof value === "string") {
|
|
1108
|
+
if (import_ethers4.ethers.isAddress(value)) {
|
|
1109
|
+
return `address:${value}`;
|
|
1110
|
+
}
|
|
1111
|
+
if (import_ethers4.ethers.isHexString(value) && !import_ethers4.ethers.isAddress(value)) {
|
|
1112
|
+
return `hex:${value}`;
|
|
1113
|
+
}
|
|
1114
|
+
return `string:${value}`;
|
|
1115
|
+
}
|
|
1116
|
+
if (typeof value === "number") {
|
|
1117
|
+
if (Number.isInteger(value)) {
|
|
1118
|
+
if (value >= 0 && value <= 255) return `uint8:${value}`;
|
|
1119
|
+
if (value >= 0 && value <= 65535) return `uint16:${value}`;
|
|
1120
|
+
if (value >= 0 && value <= 4294967295) return `uint32:${value}`;
|
|
1121
|
+
return `uint64:${value}`;
|
|
1122
|
+
}
|
|
1123
|
+
return `string:${value}`;
|
|
1124
|
+
}
|
|
1125
|
+
if (typeof value === "bigint") {
|
|
1126
|
+
return `biguint:${value.toString()}`;
|
|
1127
|
+
}
|
|
1128
|
+
if (typeof value === "boolean") {
|
|
1129
|
+
return `boolean:${value}`;
|
|
1130
|
+
}
|
|
1131
|
+
if (Array.isArray(value)) {
|
|
1132
|
+
if (value.length === 0) return `list:string:`;
|
|
1133
|
+
const types = value.map((item) => this.typedToString(item).split(import_warps15.WarpConstants.ArgParamsSeparator)[0]);
|
|
1134
|
+
const type = types[0];
|
|
1135
|
+
const values = value.map((item) => this.typedToString(item).split(import_warps15.WarpConstants.ArgParamsSeparator)[1]);
|
|
1136
|
+
return `list:${type}:${values.join(",")}`;
|
|
1137
|
+
}
|
|
1138
|
+
if (value === null || value === void 0) {
|
|
1139
|
+
return `string:null`;
|
|
1140
|
+
}
|
|
1141
|
+
return `string:${String(value)}`;
|
|
1142
|
+
}
|
|
1143
|
+
typedToNative(value) {
|
|
1144
|
+
const stringValue = this.typedToString(value);
|
|
1145
|
+
const [type, ...valueParts] = stringValue.split(import_warps15.WarpConstants.ArgParamsSeparator);
|
|
1146
|
+
const nativeValue = valueParts.join(import_warps15.WarpConstants.ArgParamsSeparator);
|
|
1147
|
+
return [type, this.parseNativeValue(type, nativeValue)];
|
|
1148
|
+
}
|
|
1149
|
+
nativeToTyped(type, value) {
|
|
1150
|
+
switch (type) {
|
|
1151
|
+
case "string":
|
|
1152
|
+
return String(value);
|
|
1153
|
+
case "uint8":
|
|
1154
|
+
case "uint16":
|
|
1155
|
+
case "uint32":
|
|
1156
|
+
case "uint64":
|
|
1157
|
+
return BigInt(value);
|
|
1158
|
+
case "biguint":
|
|
1159
|
+
return BigInt(value);
|
|
1160
|
+
case "boolean":
|
|
1161
|
+
return Boolean(value);
|
|
1162
|
+
case "address":
|
|
1163
|
+
return String(value);
|
|
1164
|
+
case "hex":
|
|
1165
|
+
const hexValue = String(value);
|
|
1166
|
+
return hexValue.startsWith("0x") ? hexValue : `0x${hexValue}`;
|
|
1167
|
+
default:
|
|
1168
|
+
if (type.startsWith("list:")) {
|
|
1169
|
+
const [, itemType, itemsStr] = type.split(":");
|
|
1170
|
+
if (!itemsStr) return [];
|
|
1171
|
+
const items = itemsStr.split(",");
|
|
1172
|
+
return items.map((item) => this.nativeToTyped(itemType, item));
|
|
1173
|
+
}
|
|
1174
|
+
return String(value);
|
|
1175
|
+
}
|
|
1176
|
+
}
|
|
1177
|
+
nativeToType(type) {
|
|
1178
|
+
switch (type) {
|
|
1179
|
+
case "string":
|
|
1180
|
+
return "string";
|
|
1181
|
+
case "uint8":
|
|
1182
|
+
case "uint16":
|
|
1183
|
+
case "uint32":
|
|
1184
|
+
case "uint64":
|
|
1185
|
+
case "biguint":
|
|
1186
|
+
return "bigint";
|
|
1187
|
+
case "boolean":
|
|
1188
|
+
return "boolean";
|
|
1189
|
+
case "address":
|
|
1190
|
+
return "string";
|
|
1191
|
+
case "hex":
|
|
1192
|
+
return "string";
|
|
1193
|
+
default:
|
|
1194
|
+
return "string";
|
|
1195
|
+
}
|
|
1196
|
+
}
|
|
1197
|
+
stringToTyped(value) {
|
|
1198
|
+
const parts = value.split(import_warps15.WarpConstants.ArgParamsSeparator, 2);
|
|
1199
|
+
if (parts.length < 2) {
|
|
1200
|
+
return value;
|
|
1201
|
+
}
|
|
1202
|
+
const [type, stringValue] = parts;
|
|
1203
|
+
switch (type) {
|
|
1204
|
+
case "string":
|
|
1205
|
+
return stringValue;
|
|
1206
|
+
case "uint8":
|
|
1207
|
+
case "uint16":
|
|
1208
|
+
case "uint32":
|
|
1209
|
+
case "uint64":
|
|
1210
|
+
return BigInt(stringValue);
|
|
1211
|
+
case "biguint":
|
|
1212
|
+
return BigInt(stringValue);
|
|
1213
|
+
case "boolean":
|
|
1214
|
+
return stringValue === "true";
|
|
1215
|
+
case "address":
|
|
1216
|
+
return stringValue;
|
|
1217
|
+
case "hex":
|
|
1218
|
+
return stringValue.startsWith("0x") ? stringValue : `0x${stringValue}`;
|
|
1219
|
+
default:
|
|
1220
|
+
if (type.startsWith("list:")) {
|
|
1221
|
+
const [, itemType, itemsStr] = type.split(":");
|
|
1222
|
+
if (!itemsStr) return [];
|
|
1223
|
+
const items = itemsStr.split(",");
|
|
1224
|
+
return items.map((item) => this.stringToTyped(`${itemType}:${item}`));
|
|
1225
|
+
}
|
|
1226
|
+
return stringValue;
|
|
1227
|
+
}
|
|
1228
|
+
}
|
|
1229
|
+
parseNativeValue(type, value) {
|
|
1230
|
+
switch (type) {
|
|
1231
|
+
case "string":
|
|
1232
|
+
return value;
|
|
1233
|
+
case "uint8":
|
|
1234
|
+
case "uint16":
|
|
1235
|
+
case "uint32":
|
|
1236
|
+
case "uint64":
|
|
1237
|
+
case "biguint":
|
|
1238
|
+
return BigInt(value);
|
|
1239
|
+
case "boolean":
|
|
1240
|
+
return value === "true";
|
|
1241
|
+
case "address":
|
|
1242
|
+
return value;
|
|
1243
|
+
case "hex":
|
|
1244
|
+
return value;
|
|
1245
|
+
default:
|
|
1246
|
+
return value;
|
|
1247
|
+
}
|
|
1248
|
+
}
|
|
1249
|
+
};
|
|
1250
|
+
|
|
1251
|
+
// src/WarpEvmOutput.ts
|
|
1252
|
+
var WarpEvmOutput = class {
|
|
1253
|
+
constructor(config, chain) {
|
|
1254
|
+
this.config = config;
|
|
1255
|
+
this.chain = chain;
|
|
1256
|
+
this.serializer = new WarpEvmSerializer();
|
|
1257
|
+
const providerConfig = (0, import_warps16.getProviderConfig)(this.config, this.chain.name, this.config.env, this.chain.defaultApiUrl);
|
|
1258
|
+
const network = new import_ethers5.ethers.Network(this.chain.name, parseInt(this.chain.chainId));
|
|
1259
|
+
this.provider = new import_ethers5.ethers.JsonRpcProvider(providerConfig.url, network);
|
|
1260
|
+
this.cache = new import_warps16.WarpCache(config.env, config.cache);
|
|
1261
|
+
}
|
|
1262
|
+
async getActionExecution(warp, actionIndex, tx) {
|
|
1263
|
+
const inputs = this.cache.get(import_warps16.WarpCacheKey.WarpExecutable(this.config.env, warp.meta?.hash || "", actionIndex)) ?? [];
|
|
1264
|
+
const resolvedInputs = (0, import_warps16.extractResolvedInputValues)(inputs);
|
|
1265
|
+
if (!tx) {
|
|
1266
|
+
return this.createFailedExecution(warp, actionIndex, resolvedInputs);
|
|
1267
|
+
}
|
|
1268
|
+
if ("status" in tx && typeof tx.status === "string") {
|
|
1269
|
+
return this.handleWarpChainAction(warp, actionIndex, tx, resolvedInputs);
|
|
1270
|
+
}
|
|
1271
|
+
return this.handleTransactionReceipt(warp, actionIndex, tx, resolvedInputs);
|
|
1272
|
+
}
|
|
1273
|
+
createFailedExecution(warp, actionIndex, resolvedInputs = []) {
|
|
1274
|
+
return {
|
|
1275
|
+
status: "error",
|
|
1276
|
+
warp,
|
|
1277
|
+
action: actionIndex,
|
|
1278
|
+
user: (0, import_warps16.getWarpWalletAddressFromConfig)(this.config, this.chain.name),
|
|
1279
|
+
txHash: "",
|
|
1280
|
+
tx: null,
|
|
1281
|
+
next: null,
|
|
1282
|
+
values: { string: [], native: [], mapped: {} },
|
|
1283
|
+
output: {},
|
|
1284
|
+
messages: {},
|
|
1285
|
+
destination: null,
|
|
1286
|
+
resolvedInputs
|
|
1287
|
+
};
|
|
1288
|
+
}
|
|
1289
|
+
handleWarpChainAction(warp, actionIndex, tx, resolvedInputs = []) {
|
|
1290
|
+
const success = tx.status === "success";
|
|
1291
|
+
const transactionHash = tx.id || tx.tx?.hash || "";
|
|
1292
|
+
const gasUsed = tx.tx?.gasLimit || "0";
|
|
1293
|
+
const gasPrice = tx.tx?.gasPrice || "0";
|
|
1294
|
+
const blockNumber = tx.tx?.blockNumber || "0";
|
|
1295
|
+
const rawValues = [transactionHash, blockNumber, gasUsed, gasPrice];
|
|
1296
|
+
const stringValues = rawValues.map(String);
|
|
1297
|
+
return {
|
|
1298
|
+
status: success ? "success" : "error",
|
|
1299
|
+
warp,
|
|
1300
|
+
action: actionIndex,
|
|
1301
|
+
user: (0, import_warps16.getWarpWalletAddressFromConfig)(this.config, this.chain.name),
|
|
1302
|
+
txHash: transactionHash,
|
|
1303
|
+
tx,
|
|
1304
|
+
next: null,
|
|
1305
|
+
values: { string: stringValues, native: rawValues, mapped: {} },
|
|
1306
|
+
output: {},
|
|
1307
|
+
messages: {},
|
|
1308
|
+
destination: null,
|
|
1309
|
+
resolvedInputs
|
|
1310
|
+
};
|
|
1311
|
+
}
|
|
1312
|
+
handleTransactionReceipt(warp, actionIndex, tx, resolvedInputs = []) {
|
|
1313
|
+
const success = tx.status === 1;
|
|
1314
|
+
const gasUsed = tx.gasUsed?.toString() || "0";
|
|
1315
|
+
const gasPrice = tx.gasPrice?.toString() || "0";
|
|
1316
|
+
const blockNumber = tx.blockNumber?.toString() || "0";
|
|
1317
|
+
const transactionHash = tx.hash;
|
|
1318
|
+
const logs = tx.logs.map((log) => ({
|
|
1319
|
+
address: log.address,
|
|
1320
|
+
topics: [...log.topics],
|
|
1321
|
+
data: log.data,
|
|
1322
|
+
blockNumber: log.blockNumber?.toString() || "0",
|
|
1323
|
+
transactionHash: log.transactionHash,
|
|
1324
|
+
index: log.index?.toString() || "0"
|
|
1325
|
+
}));
|
|
1326
|
+
const rawValues = [transactionHash, blockNumber, gasUsed, gasPrice, ...logs.length > 0 ? logs : []];
|
|
1327
|
+
const stringValues = rawValues.map(String);
|
|
1328
|
+
return {
|
|
1329
|
+
status: success ? "success" : "error",
|
|
1330
|
+
warp,
|
|
1331
|
+
action: actionIndex,
|
|
1332
|
+
user: (0, import_warps16.getWarpWalletAddressFromConfig)(this.config, this.chain.name),
|
|
1333
|
+
txHash: transactionHash,
|
|
1334
|
+
tx: {
|
|
1335
|
+
...tx,
|
|
1336
|
+
status: tx.status
|
|
1337
|
+
},
|
|
1338
|
+
next: null,
|
|
1339
|
+
values: { string: stringValues, native: rawValues, mapped: {} },
|
|
1340
|
+
output: {},
|
|
1341
|
+
messages: {},
|
|
1342
|
+
destination: null,
|
|
1343
|
+
resolvedInputs
|
|
1344
|
+
};
|
|
1345
|
+
}
|
|
1346
|
+
async extractQueryOutput(warp, typedValues, actionIndex, inputs) {
|
|
1347
|
+
const stringValues = typedValues.map((t) => this.serializer.typedToString(t));
|
|
1348
|
+
const nativeValues = typedValues.map((t) => this.serializer.typedToNative(t)[1]);
|
|
1349
|
+
const values = { string: stringValues, native: nativeValues, mapped: {} };
|
|
1350
|
+
let output = {};
|
|
1351
|
+
if (!warp.output) return { values, output };
|
|
1352
|
+
const getNestedValue = (path) => {
|
|
1353
|
+
const indices = path.split(".").slice(1).map((i) => parseInt(i) - 1);
|
|
1354
|
+
if (indices.length === 0) return void 0;
|
|
1355
|
+
let value = nativeValues[indices[0]];
|
|
1356
|
+
for (let i = 1; i < indices.length; i++) {
|
|
1357
|
+
if (value === void 0 || value === null) return void 0;
|
|
1358
|
+
value = value[indices[i]];
|
|
1359
|
+
}
|
|
1360
|
+
return value;
|
|
1361
|
+
};
|
|
1362
|
+
for (const [key, path] of Object.entries(warp.output)) {
|
|
1363
|
+
if (path.startsWith(import_warps16.WarpConstants.Transform.Prefix)) continue;
|
|
1364
|
+
const currentActionIndex = (0, import_warps16.parseOutputOutIndex)(path);
|
|
1365
|
+
if (currentActionIndex !== null && currentActionIndex !== actionIndex) {
|
|
1366
|
+
output[key] = null;
|
|
1367
|
+
continue;
|
|
1368
|
+
}
|
|
1369
|
+
if (path.startsWith("out.") || path === "out" || path.startsWith("out[")) {
|
|
1370
|
+
output[key] = getNestedValue(path) || null;
|
|
1371
|
+
} else {
|
|
1372
|
+
output[key] = path;
|
|
1373
|
+
}
|
|
1374
|
+
}
|
|
1375
|
+
return { values, output: await (0, import_warps16.evaluateOutputCommon)(warp, output, actionIndex, inputs, this.serializer.coreSerializer, this.config) };
|
|
1376
|
+
}
|
|
1377
|
+
async getTransactionStatus(txHash) {
|
|
1378
|
+
try {
|
|
1379
|
+
const receipt = await this.provider.getTransactionReceipt(txHash);
|
|
1380
|
+
if (!receipt) {
|
|
1381
|
+
return { status: "pending" };
|
|
1382
|
+
}
|
|
1383
|
+
return {
|
|
1384
|
+
status: receipt.status === 1 ? "confirmed" : "failed",
|
|
1385
|
+
blockNumber: receipt.blockNumber,
|
|
1386
|
+
gasUsed: receipt.gasUsed
|
|
1387
|
+
};
|
|
1388
|
+
} catch (error) {
|
|
1389
|
+
throw new Error(`Failed to get transaction status: ${error}`);
|
|
1390
|
+
}
|
|
1391
|
+
}
|
|
1392
|
+
async getTransactionReceipt(txHash) {
|
|
1393
|
+
try {
|
|
1394
|
+
return await this.provider.getTransactionReceipt(txHash);
|
|
1395
|
+
} catch (error) {
|
|
1396
|
+
return null;
|
|
1397
|
+
}
|
|
1398
|
+
}
|
|
1399
|
+
};
|
|
1400
|
+
|
|
1401
|
+
// src/WarpEvmExecutor.ts
|
|
1402
|
+
var WarpEvmExecutor = class {
|
|
1403
|
+
constructor(config, chain) {
|
|
1404
|
+
this.config = config;
|
|
1405
|
+
this.chain = chain;
|
|
1406
|
+
this.serializer = new WarpEvmSerializer();
|
|
1407
|
+
const providerConfig = (0, import_warps17.getProviderConfig)(this.config, chain.name, this.config.env, this.chain.defaultApiUrl);
|
|
1408
|
+
const network = new import_ethers6.ethers.Network(this.chain.name, parseInt(this.chain.chainId));
|
|
1409
|
+
this.provider = new import_ethers6.ethers.JsonRpcProvider(providerConfig.url, network);
|
|
1410
|
+
this.output = new WarpEvmOutput(config, this.chain);
|
|
1411
|
+
}
|
|
1412
|
+
async createTransaction(executable) {
|
|
1413
|
+
const action = (0, import_warps17.getWarpActionByIndex)(executable.warp, executable.action);
|
|
1414
|
+
let tx = null;
|
|
1415
|
+
if (action.type === "transfer") {
|
|
1416
|
+
tx = await this.createTransferTransaction(executable);
|
|
1417
|
+
} else if (action.type === "contract") {
|
|
1418
|
+
tx = await this.createContractCallTransaction(executable);
|
|
1419
|
+
} else if (action.type === "query") {
|
|
1420
|
+
throw new Error("WarpEvmExecutor: Invalid action type for createTransaction; Use executeQuery instead");
|
|
1421
|
+
} else if (action.type === "collect") {
|
|
1422
|
+
throw new Error("WarpEvmExecutor: Invalid action type for createTransaction; Use executeCollect instead");
|
|
1423
|
+
}
|
|
1424
|
+
if (!tx) throw new Error(`WarpEvmExecutor: Invalid action type (${action.type})`);
|
|
1425
|
+
return tx;
|
|
1426
|
+
}
|
|
1427
|
+
async createTransferTransaction(executable) {
|
|
1428
|
+
const userWallet = (0, import_warps17.getWarpWalletAddressFromConfig)(this.config, executable.chain.name);
|
|
1429
|
+
if (!userWallet) throw new Error("WarpEvmExecutor: createTransfer - user address not set");
|
|
1430
|
+
if (!import_ethers6.ethers.isAddress(executable.destination)) {
|
|
1431
|
+
throw new Error(`WarpEvmExecutor: Invalid destination address: ${executable.destination}`);
|
|
1432
|
+
}
|
|
1433
|
+
if (executable.transfers && executable.transfers.length > 0) {
|
|
1434
|
+
return this.createTokenTransferTransaction(executable, userWallet);
|
|
1435
|
+
}
|
|
1436
|
+
const tx = {
|
|
1437
|
+
to: executable.destination,
|
|
1438
|
+
value: executable.value,
|
|
1439
|
+
data: executable.data ? this.serializer.stringToTyped(executable.data) : "0x"
|
|
1440
|
+
};
|
|
1441
|
+
return this.estimateGasAndSetDefaults(tx, userWallet);
|
|
1442
|
+
}
|
|
1443
|
+
async createContractCallTransaction(executable) {
|
|
1444
|
+
const userWallet = (0, import_warps17.getWarpWalletAddressFromConfig)(this.config, executable.chain.name);
|
|
1445
|
+
if (!userWallet) throw new Error("WarpEvmExecutor: createContractCall - user address not set");
|
|
1446
|
+
const action = (0, import_warps17.getWarpActionByIndex)(executable.warp, executable.action);
|
|
1447
|
+
if (!action || !("func" in action) || !action.func) throw new Error("WarpEvmExecutor: Contract action must have a function name");
|
|
1448
|
+
if (!import_ethers6.ethers.isAddress(executable.destination)) throw new Error(`WarpEvmExecutor: Invalid contract address: ${executable.destination}`);
|
|
1449
|
+
try {
|
|
1450
|
+
let iface;
|
|
1451
|
+
try {
|
|
1452
|
+
iface = new import_ethers6.ethers.Interface(JSON.parse(action.abi));
|
|
1453
|
+
} catch {
|
|
1454
|
+
iface = new import_ethers6.ethers.Interface([action.abi]);
|
|
1455
|
+
}
|
|
1456
|
+
const funcFragment = iface.getFunction(action.func);
|
|
1457
|
+
if (!funcFragment) throw new Error(`WarpEvmExecutor: Function ${action.func} not found in ABI`);
|
|
1458
|
+
const nativeArgs = this.prepareNativeArgs(executable.args, funcFragment);
|
|
1459
|
+
console.log("Native args:", nativeArgs);
|
|
1460
|
+
const encodedData = iface.encodeFunctionData(action.func, nativeArgs);
|
|
1461
|
+
const value = this.getPayableValue(executable, funcFragment);
|
|
1462
|
+
console.log("Encoded data:", encodedData);
|
|
1463
|
+
console.log("Value:", value);
|
|
1464
|
+
const tx = {
|
|
1465
|
+
to: executable.destination,
|
|
1466
|
+
value,
|
|
1467
|
+
data: encodedData
|
|
1468
|
+
};
|
|
1469
|
+
return this.estimateGasAndSetDefaults(tx, userWallet);
|
|
1470
|
+
} catch (error) {
|
|
1471
|
+
throw new Error(`WarpEvmExecutor: Failed to encode function data for ${action.func}: ${error}`);
|
|
1472
|
+
}
|
|
1473
|
+
}
|
|
1474
|
+
async createTokenTransferTransaction(executable, userWallet) {
|
|
1475
|
+
if (executable.transfers.length === 0) throw new Error("WarpEvmExecutor: No transfers provided");
|
|
1476
|
+
if (!this.chain.nativeToken?.identifier) throw new Error("WarpEvmExecutor: No native token defined for this chain");
|
|
1477
|
+
const nativeTokenTransfers = executable.transfers.filter((transfer) => transfer.identifier === this.chain.nativeToken.identifier);
|
|
1478
|
+
const erc20Transfers = executable.transfers.filter((transfer) => transfer.identifier !== this.chain.nativeToken.identifier);
|
|
1479
|
+
if (nativeTokenTransfers.length === 1 && erc20Transfers.length === 0) {
|
|
1480
|
+
const transfer = nativeTokenTransfers[0];
|
|
1481
|
+
if (transfer.amount <= 0n) throw new Error("WarpEvmExecutor: Native token transfer amount must be positive");
|
|
1482
|
+
const tx = {
|
|
1483
|
+
to: executable.destination,
|
|
1484
|
+
value: transfer.amount,
|
|
1485
|
+
data: "0x"
|
|
1486
|
+
};
|
|
1487
|
+
return this.estimateGasAndSetDefaults(tx, userWallet);
|
|
1488
|
+
}
|
|
1489
|
+
if (nativeTokenTransfers.length === 0 && erc20Transfers.length === 1) {
|
|
1490
|
+
return this.createSingleTokenTransfer(executable, erc20Transfers[0], userWallet);
|
|
1491
|
+
}
|
|
1492
|
+
if (executable.transfers.length > 1) throw new Error("WarpEvmExecutor: Multiple token transfers not yet supported");
|
|
1493
|
+
throw new Error("WarpEvmExecutor: Invalid transfer configuration");
|
|
1494
|
+
}
|
|
1495
|
+
async createSingleTokenTransfer(executable, transfer, userWallet) {
|
|
1496
|
+
if (!import_ethers6.ethers.isAddress(transfer.identifier)) {
|
|
1497
|
+
throw new Error(`WarpEvmExecutor: Invalid token address: ${transfer.identifier}`);
|
|
1498
|
+
}
|
|
1499
|
+
const transferInterface = new import_ethers6.ethers.Interface(["function transfer(address to, uint256 amount) returns (bool)"]);
|
|
1500
|
+
const encodedData = transferInterface.encodeFunctionData("transfer", [executable.destination, transfer.amount]);
|
|
1501
|
+
const tx = {
|
|
1502
|
+
to: transfer.identifier,
|
|
1503
|
+
value: 0n,
|
|
1504
|
+
data: encodedData
|
|
1505
|
+
};
|
|
1506
|
+
return this.estimateGasAndSetDefaults(tx, userWallet);
|
|
1507
|
+
}
|
|
1508
|
+
async executeQuery(executable) {
|
|
1509
|
+
const action = (0, import_warps17.getWarpActionByIndex)(executable.warp, executable.action);
|
|
1510
|
+
if (action.type !== "query") throw new Error(`WarpEvmExecutor: Invalid action type for executeQuery: ${action.type}`);
|
|
1511
|
+
if (!action.func) throw new Error("WarpEvmExecutor: Query action must have a function name");
|
|
1512
|
+
if (!import_ethers6.ethers.isAddress(executable.destination)) throw new Error(`WarpEvmExecutor: Invalid address for query: ${executable.destination}`);
|
|
1513
|
+
try {
|
|
1514
|
+
let iface;
|
|
1515
|
+
try {
|
|
1516
|
+
iface = new import_ethers6.ethers.Interface(JSON.parse(action.abi));
|
|
1517
|
+
} catch {
|
|
1518
|
+
iface = new import_ethers6.ethers.Interface([action.abi]);
|
|
1519
|
+
}
|
|
1520
|
+
const funcFragment = iface.getFunction(action.func);
|
|
1521
|
+
if (!funcFragment) throw new Error(`WarpEvmExecutor: Function ${action.func} not found in ABI`);
|
|
1522
|
+
const nativeArgs = this.prepareNativeArgs(executable.args, funcFragment);
|
|
1523
|
+
const encodedData = iface.encodeFunctionData(action.func, nativeArgs);
|
|
1524
|
+
const result = await this.provider.call({
|
|
1525
|
+
to: executable.destination,
|
|
1526
|
+
data: encodedData
|
|
1527
|
+
});
|
|
1528
|
+
const decodedResult = iface.decodeFunctionResult(action.func, result);
|
|
1529
|
+
const isSuccess = true;
|
|
1530
|
+
const { values, output } = await this.output.extractQueryOutput(
|
|
1531
|
+
executable.warp,
|
|
1532
|
+
decodedResult,
|
|
1533
|
+
executable.action,
|
|
1534
|
+
executable.resolvedInputs
|
|
1535
|
+
);
|
|
1536
|
+
const next = (0, import_warps17.getNextInfo)(this.config, [], executable.warp, executable.action, output);
|
|
1537
|
+
const destinationInput = executable.resolvedInputs.find((i) => i.input.position === "receiver" || i.input.position === "destination");
|
|
1538
|
+
const destination = destinationInput?.value || executable.destination;
|
|
1539
|
+
const resolvedInputs = (0, import_warps17.extractResolvedInputValues)(executable.resolvedInputs);
|
|
1540
|
+
return {
|
|
1541
|
+
status: isSuccess ? "success" : "error",
|
|
1542
|
+
warp: executable.warp,
|
|
1543
|
+
action: executable.action,
|
|
1544
|
+
user: (0, import_warps17.getWarpWalletAddressFromConfig)(this.config, executable.chain.name),
|
|
1545
|
+
txHash: null,
|
|
1546
|
+
tx: null,
|
|
1547
|
+
next,
|
|
1548
|
+
values,
|
|
1549
|
+
output: { ...output, _DATA: decodedResult },
|
|
1550
|
+
messages: (0, import_warps17.applyOutputToMessages)(executable.warp, output, this.config),
|
|
1551
|
+
destination,
|
|
1552
|
+
resolvedInputs
|
|
1553
|
+
};
|
|
1554
|
+
} catch (error) {
|
|
1555
|
+
const destinationInput = executable.resolvedInputs.find((i) => i.input.position === "receiver" || i.input.position === "destination");
|
|
1556
|
+
const destination = destinationInput?.value || executable.destination;
|
|
1557
|
+
const resolvedInputs = (0, import_warps17.extractResolvedInputValues)(executable.resolvedInputs);
|
|
1558
|
+
return {
|
|
1559
|
+
status: "error",
|
|
1560
|
+
warp: executable.warp,
|
|
1561
|
+
action: executable.action,
|
|
1562
|
+
user: (0, import_warps17.getWarpWalletAddressFromConfig)(this.config, executable.chain.name),
|
|
1563
|
+
txHash: null,
|
|
1564
|
+
tx: null,
|
|
1565
|
+
next: null,
|
|
1566
|
+
values: { string: [], native: [], mapped: {} },
|
|
1567
|
+
output: { _DATA: error },
|
|
1568
|
+
messages: {},
|
|
1569
|
+
destination,
|
|
1570
|
+
resolvedInputs
|
|
1571
|
+
};
|
|
1572
|
+
}
|
|
1573
|
+
}
|
|
1574
|
+
async estimateGasAndSetDefaults(tx, from) {
|
|
1575
|
+
try {
|
|
1576
|
+
const gasEstimate = await this.provider.estimateGas({
|
|
1577
|
+
...tx,
|
|
1578
|
+
from
|
|
1579
|
+
});
|
|
1580
|
+
if (gasEstimate < BigInt(WarpEvmConstants.Validation.MinGasLimit)) throw new Error(`Gas estimate too low: ${gasEstimate}`);
|
|
1581
|
+
if (gasEstimate > BigInt(WarpEvmConstants.Validation.MaxGasLimit)) throw new Error(`Gas estimate too high: ${gasEstimate}`);
|
|
1582
|
+
const feeData = await this.provider.getFeeData();
|
|
1583
|
+
if (feeData.maxFeePerGas && feeData.maxPriorityFeePerGas) {
|
|
1584
|
+
return {
|
|
1585
|
+
...tx,
|
|
1586
|
+
chainId: parseInt(this.chain.chainId),
|
|
1587
|
+
gasLimit: gasEstimate,
|
|
1588
|
+
maxFeePerGas: feeData.maxFeePerGas,
|
|
1589
|
+
maxPriorityFeePerGas: feeData.maxPriorityFeePerGas
|
|
1590
|
+
};
|
|
1591
|
+
} else if (feeData.gasPrice) {
|
|
1592
|
+
return {
|
|
1593
|
+
...tx,
|
|
1594
|
+
chainId: parseInt(this.chain.chainId),
|
|
1595
|
+
gasLimit: gasEstimate,
|
|
1596
|
+
gasPrice: feeData.gasPrice
|
|
1597
|
+
};
|
|
1598
|
+
} else {
|
|
1599
|
+
return {
|
|
1600
|
+
...tx,
|
|
1601
|
+
chainId: parseInt(this.chain.chainId),
|
|
1602
|
+
gasLimit: gasEstimate,
|
|
1603
|
+
gasPrice: import_ethers6.ethers.parseUnits(WarpEvmConstants.GasPrice.Default, "wei")
|
|
1604
|
+
};
|
|
1605
|
+
}
|
|
1606
|
+
} catch (error) {
|
|
1607
|
+
let defaultGasLimit = BigInt(WarpEvmConstants.GasLimit.Default);
|
|
1608
|
+
if (tx.data && tx.data !== "0x") {
|
|
1609
|
+
if (tx.data.startsWith("0xa9059cbb")) {
|
|
1610
|
+
defaultGasLimit = BigInt(WarpEvmConstants.GasLimit.TokenTransfer);
|
|
1611
|
+
} else {
|
|
1612
|
+
defaultGasLimit = BigInt(WarpEvmConstants.GasLimit.ContractCall);
|
|
1613
|
+
}
|
|
1614
|
+
} else {
|
|
1615
|
+
defaultGasLimit = BigInt(WarpEvmConstants.GasLimit.Transfer);
|
|
1616
|
+
}
|
|
1617
|
+
return {
|
|
1618
|
+
...tx,
|
|
1619
|
+
chainId: parseInt(this.chain.chainId),
|
|
1620
|
+
gasLimit: defaultGasLimit,
|
|
1621
|
+
gasPrice: import_ethers6.ethers.parseUnits(WarpEvmConstants.GasPrice.Default, "wei")
|
|
1622
|
+
};
|
|
1623
|
+
}
|
|
1624
|
+
}
|
|
1625
|
+
async verifyMessage(message, signature) {
|
|
1626
|
+
try {
|
|
1627
|
+
const recoveredAddress = import_ethers6.ethers.verifyMessage(message, signature);
|
|
1628
|
+
return recoveredAddress;
|
|
1629
|
+
} catch (error) {
|
|
1630
|
+
throw new Error(`Failed to verify message: ${error}`);
|
|
1631
|
+
}
|
|
1632
|
+
}
|
|
1633
|
+
getPayableValue(executable, funcFragment) {
|
|
1634
|
+
if (funcFragment.stateMutability !== "payable") {
|
|
1635
|
+
return executable.value;
|
|
1636
|
+
}
|
|
1637
|
+
const nativeTokenId = this.chain.nativeToken?.identifier;
|
|
1638
|
+
const zeroAddress = "0x0000000000000000000000000000000000000000";
|
|
1639
|
+
const nativeTokenTransfer = nativeTokenId ? executable.transfers.find((transfer) => transfer.identifier === nativeTokenId || transfer.identifier === zeroAddress) : void 0;
|
|
1640
|
+
if (nativeTokenTransfer) {
|
|
1641
|
+
return nativeTokenTransfer.amount;
|
|
1642
|
+
}
|
|
1643
|
+
const nativeTokenAsset = this.findNativeTokenAsset(executable.resolvedInputs, nativeTokenId, zeroAddress);
|
|
1644
|
+
if (nativeTokenAsset) {
|
|
1645
|
+
return nativeTokenAsset.amount;
|
|
1646
|
+
}
|
|
1647
|
+
return executable.value;
|
|
1648
|
+
}
|
|
1649
|
+
findNativeTokenAsset(resolvedInputs, nativeTokenId, zeroAddress) {
|
|
1650
|
+
for (const input of resolvedInputs) {
|
|
1651
|
+
if (input.input.type === "asset" && input.value) {
|
|
1652
|
+
const [, assetValue] = this.serializer.coreSerializer.stringToNative(input.value);
|
|
1653
|
+
const asset = assetValue;
|
|
1654
|
+
if (asset && "amount" in asset) {
|
|
1655
|
+
if (asset.identifier === nativeTokenId || asset.identifier === zeroAddress) {
|
|
1656
|
+
return asset;
|
|
1657
|
+
}
|
|
1658
|
+
}
|
|
1659
|
+
}
|
|
1660
|
+
}
|
|
1661
|
+
return null;
|
|
1662
|
+
}
|
|
1663
|
+
prepareNativeArgs(args, funcFragment) {
|
|
1664
|
+
return args.map((arg, index) => {
|
|
1665
|
+
const nativeValue = this.serializer.coreSerializer.stringToNative(arg)[1];
|
|
1666
|
+
const paramType = funcFragment.inputs[index]?.type;
|
|
1667
|
+
if (paramType === "bytes32" && typeof nativeValue === "string") {
|
|
1668
|
+
let hexValue = nativeValue;
|
|
1669
|
+
if (!hexValue.startsWith("0x")) {
|
|
1670
|
+
hexValue = "0x" + hexValue;
|
|
1671
|
+
}
|
|
1672
|
+
if (hexValue.length !== 66) {
|
|
1673
|
+
hexValue = import_ethers6.ethers.zeroPadValue(hexValue, 32);
|
|
1674
|
+
}
|
|
1675
|
+
return hexValue;
|
|
1676
|
+
}
|
|
1677
|
+
return nativeValue;
|
|
1678
|
+
});
|
|
1679
|
+
}
|
|
1680
|
+
};
|
|
1681
|
+
|
|
1682
|
+
// src/WarpEvmExplorer.ts
|
|
1683
|
+
var WarpEvmExplorer = class {
|
|
1684
|
+
constructor(chain, config) {
|
|
1685
|
+
this.chain = chain;
|
|
1686
|
+
this.config = config;
|
|
1687
|
+
}
|
|
1688
|
+
getExplorers() {
|
|
1689
|
+
const chainExplorers = EvmExplorers[this.chain.name];
|
|
1690
|
+
if (!chainExplorers) {
|
|
1691
|
+
return ["Default"];
|
|
1692
|
+
}
|
|
1693
|
+
const explorers = chainExplorers[this.config.env];
|
|
1694
|
+
if (!explorers) {
|
|
1695
|
+
return ["Default"];
|
|
1696
|
+
}
|
|
1697
|
+
return explorers;
|
|
1698
|
+
}
|
|
1699
|
+
getPrimaryExplorer() {
|
|
1700
|
+
const explorers = this.getExplorers();
|
|
1701
|
+
return explorers[0];
|
|
1702
|
+
}
|
|
1703
|
+
getExplorerUrlByName(explorer) {
|
|
1704
|
+
const userPreference = this.config.preferences?.explorers?.[this.chain.name];
|
|
1705
|
+
if (userPreference && !explorer) {
|
|
1706
|
+
const url2 = ExplorerUrls[userPreference];
|
|
1707
|
+
if (url2) return url2;
|
|
1708
|
+
}
|
|
1709
|
+
if (explorer) {
|
|
1710
|
+
const url2 = ExplorerUrls[explorer];
|
|
1711
|
+
if (url2) return url2;
|
|
1712
|
+
}
|
|
1713
|
+
const primaryExplorer = this.getPrimaryExplorer();
|
|
1714
|
+
const url = ExplorerUrls[primaryExplorer];
|
|
1715
|
+
return url || ExplorerUrls[primaryExplorer];
|
|
1716
|
+
}
|
|
1717
|
+
getAccountUrl(address, explorer) {
|
|
1718
|
+
const baseUrl = this.getExplorerUrlByName(explorer);
|
|
1719
|
+
return `${baseUrl}/address/${address}`;
|
|
1720
|
+
}
|
|
1721
|
+
getTransactionUrl(hash, explorer) {
|
|
1722
|
+
const baseUrl = this.getExplorerUrlByName(explorer);
|
|
1723
|
+
return `${baseUrl}/tx/${hash}`;
|
|
1724
|
+
}
|
|
1725
|
+
getBlockUrl(blockNumber, explorer) {
|
|
1726
|
+
const baseUrl = this.getExplorerUrlByName(explorer);
|
|
1727
|
+
return `${baseUrl}/block/${blockNumber}`;
|
|
1728
|
+
}
|
|
1729
|
+
getAssetUrl(identifier, explorer) {
|
|
1730
|
+
const baseUrl = this.getExplorerUrlByName(explorer);
|
|
1731
|
+
return `${baseUrl}/token/${identifier}`;
|
|
1732
|
+
}
|
|
1733
|
+
getContractUrl(address, explorer) {
|
|
1734
|
+
const baseUrl = this.getExplorerUrlByName(explorer);
|
|
1735
|
+
return `${baseUrl}/address/${address}`;
|
|
1736
|
+
}
|
|
1737
|
+
getAllExplorers() {
|
|
1738
|
+
return this.getExplorers();
|
|
1739
|
+
}
|
|
1740
|
+
getExplorerByName(name) {
|
|
1741
|
+
const explorers = this.getExplorers();
|
|
1742
|
+
return explorers.find((explorer) => explorer.toLowerCase() === name.toLowerCase());
|
|
1743
|
+
}
|
|
1744
|
+
getAccountUrls(address) {
|
|
1745
|
+
const explorers = this.getAllExplorers();
|
|
1746
|
+
const urls = {};
|
|
1747
|
+
explorers.forEach((explorer) => {
|
|
1748
|
+
const url = ExplorerUrls[explorer];
|
|
1749
|
+
if (url) {
|
|
1750
|
+
urls[explorer] = `${url}/address/${address}`;
|
|
1751
|
+
}
|
|
1752
|
+
});
|
|
1753
|
+
return urls;
|
|
1754
|
+
}
|
|
1755
|
+
getTransactionUrls(hash) {
|
|
1756
|
+
const explorers = this.getAllExplorers();
|
|
1757
|
+
const urls = {};
|
|
1758
|
+
explorers.forEach((explorer) => {
|
|
1759
|
+
const url = ExplorerUrls[explorer];
|
|
1760
|
+
if (url) {
|
|
1761
|
+
urls[explorer] = `${url}/tx/${hash}`;
|
|
1762
|
+
}
|
|
1763
|
+
});
|
|
1764
|
+
return urls;
|
|
1765
|
+
}
|
|
1766
|
+
getAssetUrls(identifier) {
|
|
1767
|
+
const explorers = this.getAllExplorers();
|
|
1768
|
+
const urls = {};
|
|
1769
|
+
explorers.forEach((explorer) => {
|
|
1770
|
+
const url = ExplorerUrls[explorer];
|
|
1771
|
+
if (url) {
|
|
1772
|
+
urls[explorer] = `${url}/token/${identifier}`;
|
|
1773
|
+
}
|
|
1774
|
+
});
|
|
1775
|
+
return urls;
|
|
1776
|
+
}
|
|
1777
|
+
getContractUrls(address) {
|
|
1778
|
+
const explorers = this.getAllExplorers();
|
|
1779
|
+
const urls = {};
|
|
1780
|
+
explorers.forEach((explorer) => {
|
|
1781
|
+
const url = ExplorerUrls[explorer];
|
|
1782
|
+
if (url) {
|
|
1783
|
+
urls[explorer] = `${url}/address/${address}`;
|
|
1784
|
+
}
|
|
1785
|
+
});
|
|
1786
|
+
return urls;
|
|
1787
|
+
}
|
|
1788
|
+
getBlockUrls(blockNumber) {
|
|
1789
|
+
const explorers = this.getAllExplorers();
|
|
1790
|
+
const urls = {};
|
|
1791
|
+
explorers.forEach((explorer) => {
|
|
1792
|
+
const url = ExplorerUrls[explorer];
|
|
1793
|
+
if (url) {
|
|
1794
|
+
urls[explorer] = `${url}/block/${blockNumber}`;
|
|
1795
|
+
}
|
|
1796
|
+
});
|
|
1797
|
+
return urls;
|
|
1798
|
+
}
|
|
1799
|
+
};
|
|
1800
|
+
|
|
1801
|
+
// src/WarpEvmWallet.ts
|
|
1802
|
+
var import_warps18 = require("@joai/warps");
|
|
1803
|
+
var import_client = require("@x402/evm/exact/client");
|
|
1804
|
+
var import_ethers7 = require("ethers");
|
|
1805
|
+
var import_accounts = require("viem/accounts");
|
|
1806
|
+
var WarpEvmWallet = class {
|
|
1807
|
+
constructor(config, chain) {
|
|
1808
|
+
this.config = config;
|
|
1809
|
+
this.chain = chain;
|
|
1810
|
+
this.cachedAddress = null;
|
|
1811
|
+
this.cachedPublicKey = null;
|
|
1812
|
+
const providerConfig = (0, import_warps18.getProviderConfig)(config, chain.name, config.env, chain.defaultApiUrl);
|
|
1813
|
+
this.provider = new import_ethers7.ethers.JsonRpcProvider(providerConfig.url);
|
|
1814
|
+
this.walletProvider = this.createProvider();
|
|
1815
|
+
const wallet = config.user?.wallets?.[chain.name];
|
|
1816
|
+
if (typeof wallet === "string") {
|
|
1817
|
+
this.cachedAddress = wallet;
|
|
1818
|
+
} else if (this.walletProvider instanceof PrivateKeyWalletProvider || this.walletProvider instanceof MnemonicWalletProvider) {
|
|
1819
|
+
try {
|
|
1820
|
+
const w = this.walletProvider.getWalletInstance();
|
|
1821
|
+
this.cachedAddress = w.address;
|
|
1822
|
+
const pk = w.signingKey.publicKey;
|
|
1823
|
+
this.cachedPublicKey = pk.startsWith("0x") ? pk.slice(2) : pk;
|
|
1824
|
+
} catch {
|
|
1825
|
+
}
|
|
1826
|
+
}
|
|
1827
|
+
}
|
|
1828
|
+
async signTransaction(tx) {
|
|
1829
|
+
if (!tx || typeof tx !== "object") throw new Error("Invalid transaction object");
|
|
1830
|
+
if (!this.walletProvider) throw new Error("No wallet provider available");
|
|
1831
|
+
if (this.walletProvider instanceof ReadOnlyWalletProvider) throw new Error(`Wallet (${this.chain.name}) is read-only`);
|
|
1832
|
+
if (tx.nonce === void 0) {
|
|
1833
|
+
const address = await this.getAddressAsync();
|
|
1834
|
+
if (address) {
|
|
1835
|
+
tx.nonce = await this.provider.getTransactionCount(address, "pending");
|
|
1836
|
+
}
|
|
1837
|
+
}
|
|
1838
|
+
this.normalizeFees(tx);
|
|
1839
|
+
return await this.walletProvider.signTransaction(tx);
|
|
1840
|
+
}
|
|
1841
|
+
async signTransactions(txs) {
|
|
1842
|
+
if (txs.length === 0) return [];
|
|
1843
|
+
if (!this.walletProvider) throw new Error("No wallet provider available");
|
|
1844
|
+
const address = await this.getAddressAsync();
|
|
1845
|
+
if (!address) throw new Error("No wallet address available");
|
|
1846
|
+
const currentNonce = await this.provider.getTransactionCount(address, "pending");
|
|
1847
|
+
const signedTxs = [];
|
|
1848
|
+
for (let i = 0; i < txs.length; i++) {
|
|
1849
|
+
const tx = { ...txs[i] };
|
|
1850
|
+
if (tx.nonce === void 0) {
|
|
1851
|
+
tx.nonce = currentNonce + i;
|
|
1852
|
+
}
|
|
1853
|
+
if (i > 0 && (this.walletProvider instanceof PrivateKeyWalletProvider || this.walletProvider instanceof MnemonicWalletProvider)) {
|
|
1854
|
+
this.adjustFeesForMultipleTransactions(tx, i);
|
|
1855
|
+
}
|
|
1856
|
+
this.normalizeFees(tx);
|
|
1857
|
+
signedTxs.push(await this.walletProvider.signTransaction(tx));
|
|
1858
|
+
}
|
|
1859
|
+
return signedTxs;
|
|
1860
|
+
}
|
|
1861
|
+
async signMessage(message) {
|
|
1862
|
+
if (!this.walletProvider) throw new Error("No wallet provider available");
|
|
1863
|
+
if (this.walletProvider instanceof ReadOnlyWalletProvider) throw new Error(`Wallet (${this.chain.name}) is read-only`);
|
|
1864
|
+
return await this.walletProvider.signMessage(message);
|
|
1865
|
+
}
|
|
1866
|
+
async sendTransaction(tx) {
|
|
1867
|
+
if (!tx || typeof tx !== "object") throw new Error("Invalid transaction object");
|
|
1868
|
+
if (!tx.signature) throw new Error("Transaction must be signed before sending");
|
|
1869
|
+
if (!this.walletProvider) throw new Error("No wallet provider available");
|
|
1870
|
+
if (typeof tx.signature === "string" && tx.signature.startsWith("0x")) {
|
|
1871
|
+
const txResponse = await this.provider.broadcastTransaction(tx.signature);
|
|
1872
|
+
return txResponse.hash;
|
|
1873
|
+
}
|
|
1874
|
+
if (this.walletProvider instanceof PrivateKeyWalletProvider || this.walletProvider instanceof MnemonicWalletProvider) {
|
|
1875
|
+
const wallet = this.walletProvider.getWalletInstance();
|
|
1876
|
+
const connectedWallet = wallet.connect(this.provider);
|
|
1877
|
+
const txResponse = await connectedWallet.sendTransaction(tx);
|
|
1878
|
+
return txResponse.hash;
|
|
1879
|
+
}
|
|
1880
|
+
throw new Error("Wallet provider does not support sending transactions");
|
|
1881
|
+
}
|
|
1882
|
+
async sendTransactions(txs) {
|
|
1883
|
+
return Promise.all(txs.map(async (tx) => this.sendTransaction(tx)));
|
|
1884
|
+
}
|
|
1885
|
+
async importFromMnemonic(mnemonic) {
|
|
1886
|
+
const walletProvider = this.createProviderForOperation("mnemonic");
|
|
1887
|
+
return await walletProvider.importFromMnemonic(mnemonic);
|
|
1888
|
+
}
|
|
1889
|
+
async importFromPrivateKey(privateKey) {
|
|
1890
|
+
const walletProvider = this.createProviderForOperation("privateKey");
|
|
1891
|
+
return await walletProvider.importFromPrivateKey(privateKey);
|
|
1892
|
+
}
|
|
1893
|
+
async export(provider) {
|
|
1894
|
+
const walletProvider = this.createProviderForOperation(provider);
|
|
1895
|
+
return await walletProvider.export();
|
|
1896
|
+
}
|
|
1897
|
+
async generate(provider) {
|
|
1898
|
+
const walletProvider = this.createProviderForOperation(provider);
|
|
1899
|
+
return await walletProvider.generate();
|
|
1900
|
+
}
|
|
1901
|
+
getAddress() {
|
|
1902
|
+
return this.cachedAddress;
|
|
1903
|
+
}
|
|
1904
|
+
getPublicKey() {
|
|
1905
|
+
return this.cachedPublicKey;
|
|
1906
|
+
}
|
|
1907
|
+
async registerX402Handlers(client) {
|
|
1908
|
+
if (!this.walletProvider) throw new Error("No wallet provider available");
|
|
1909
|
+
const provider = this.walletProvider;
|
|
1910
|
+
const getInstance = provider.getWalletInstance;
|
|
1911
|
+
if (typeof getInstance !== "function") throw new Error("Wallet provider does not have getWalletInstance method");
|
|
1912
|
+
const wallet = getInstance();
|
|
1913
|
+
if (!wallet || !wallet.privateKey) throw new Error("Wallet instance does not have private key");
|
|
1914
|
+
const signer = (0, import_accounts.privateKeyToAccount)(wallet.privateKey);
|
|
1915
|
+
const handlers = {};
|
|
1916
|
+
for (const chainId of SupportedEvmChainIds) {
|
|
1917
|
+
handlers[`eip155:${chainId}`] = () => {
|
|
1918
|
+
(0, import_client.registerExactEvmScheme)(client, { signer });
|
|
1919
|
+
};
|
|
1920
|
+
}
|
|
1921
|
+
return handlers;
|
|
1922
|
+
}
|
|
1923
|
+
createProvider() {
|
|
1924
|
+
const wallet = this.config.user?.wallets?.[this.chain.name];
|
|
1925
|
+
if (!wallet) return null;
|
|
1926
|
+
if (typeof wallet === "string") return new ReadOnlyWalletProvider(this.config, this.chain);
|
|
1927
|
+
return this.createProviderForOperation(wallet.provider);
|
|
1928
|
+
}
|
|
1929
|
+
async getAddressAsync() {
|
|
1930
|
+
if (this.cachedAddress !== null) return this.cachedAddress;
|
|
1931
|
+
if (!this.walletProvider) return null;
|
|
1932
|
+
this.cachedAddress = await this.walletProvider.getAddress();
|
|
1933
|
+
if (!this.cachedPublicKey) this.cachedPublicKey = await this.walletProvider.getPublicKey();
|
|
1934
|
+
return this.cachedAddress;
|
|
1935
|
+
}
|
|
1936
|
+
createProviderForOperation(provider) {
|
|
1937
|
+
const customWalletProviders = this.config.walletProviders?.[this.chain.name];
|
|
1938
|
+
const providerFactory = customWalletProviders?.[provider];
|
|
1939
|
+
if (providerFactory) {
|
|
1940
|
+
const walletProvider = providerFactory(this.config, this.chain);
|
|
1941
|
+
if (!walletProvider) throw new Error(`Custom wallet provider factory returned null for ${provider}`);
|
|
1942
|
+
return walletProvider;
|
|
1943
|
+
}
|
|
1944
|
+
if (provider === "privateKey") return new PrivateKeyWalletProvider(this.config, this.chain);
|
|
1945
|
+
if (provider === "mnemonic") return new MnemonicWalletProvider(this.config, this.chain);
|
|
1946
|
+
throw new Error(`Unsupported wallet provider for ${this.chain.name}: ${provider}`);
|
|
1947
|
+
}
|
|
1948
|
+
normalizeFees(tx) {
|
|
1949
|
+
const hasEip1559Fields = tx.maxFeePerGas !== void 0 && tx.maxPriorityFeePerGas !== void 0;
|
|
1950
|
+
const hasLegacyFields = tx.gasPrice !== void 0 && !hasEip1559Fields;
|
|
1951
|
+
if (hasEip1559Fields) {
|
|
1952
|
+
const maxFee = this.parseBigInt(tx.maxFeePerGas);
|
|
1953
|
+
const maxPriorityFee = this.parseBigInt(tx.maxPriorityFeePerGas);
|
|
1954
|
+
tx.maxFeePerGas = maxFee;
|
|
1955
|
+
tx.maxPriorityFeePerGas = this.normalizePriorityFee(maxFee, maxPriorityFee);
|
|
1956
|
+
} else if (hasLegacyFields) {
|
|
1957
|
+
const gasPrice = this.parseBigInt(tx.gasPrice);
|
|
1958
|
+
tx.maxFeePerGas = gasPrice;
|
|
1959
|
+
tx.maxPriorityFeePerGas = this.normalizePriorityFee(gasPrice, gasPrice * 9n / 10n);
|
|
1960
|
+
delete tx.gasPrice;
|
|
1961
|
+
} else {
|
|
1962
|
+
const defaultMaxFee = 1000000000n;
|
|
1963
|
+
tx.maxFeePerGas = defaultMaxFee;
|
|
1964
|
+
tx.maxPriorityFeePerGas = defaultMaxFee / 10n;
|
|
1965
|
+
}
|
|
1966
|
+
}
|
|
1967
|
+
parseBigInt(value) {
|
|
1968
|
+
if (value === void 0 || value === null) return void 0;
|
|
1969
|
+
if (typeof value === "bigint") return value;
|
|
1970
|
+
return BigInt(value);
|
|
1971
|
+
}
|
|
1972
|
+
adjustFeesForMultipleTransactions(tx, index) {
|
|
1973
|
+
const priorityReduction = BigInt(index * 1e9);
|
|
1974
|
+
const minGasPrice = BigInt(1e9);
|
|
1975
|
+
if (tx.maxFeePerGas && tx.maxPriorityFeePerGas) {
|
|
1976
|
+
const maxFee = this.parseBigInt(tx.maxFeePerGas);
|
|
1977
|
+
const maxPriorityFee = this.parseBigInt(tx.maxPriorityFeePerGas);
|
|
1978
|
+
const reducedMaxFee = maxFee > priorityReduction ? maxFee - priorityReduction : minGasPrice;
|
|
1979
|
+
const reducedMaxPriorityFee = maxPriorityFee > priorityReduction ? maxPriorityFee - priorityReduction : minGasPrice;
|
|
1980
|
+
tx.maxFeePerGas = reducedMaxFee;
|
|
1981
|
+
tx.maxPriorityFeePerGas = this.normalizePriorityFee(reducedMaxFee, reducedMaxPriorityFee);
|
|
1982
|
+
delete tx.gasPrice;
|
|
1983
|
+
} else if (tx.gasPrice) {
|
|
1984
|
+
tx.gasPrice = tx.gasPrice > priorityReduction ? tx.gasPrice - priorityReduction : minGasPrice;
|
|
1985
|
+
delete tx.maxFeePerGas;
|
|
1986
|
+
delete tx.maxPriorityFeePerGas;
|
|
1987
|
+
}
|
|
1988
|
+
}
|
|
1989
|
+
normalizePriorityFee(maxFee, maxPriorityFee) {
|
|
1990
|
+
if (maxFee <= 0n) return 1n;
|
|
1991
|
+
if (maxPriorityFee <= maxFee) return maxPriorityFee;
|
|
1992
|
+
const safeFee = maxFee / 10n;
|
|
1993
|
+
return safeFee < 1n ? 1n : safeFee;
|
|
1994
|
+
}
|
|
1995
|
+
};
|
|
1996
|
+
|
|
1997
|
+
// src/chains/common.ts
|
|
1998
|
+
var createEvmAdapter = (chainName, chainInfos) => {
|
|
1999
|
+
return (config, fallback) => {
|
|
2000
|
+
if (!fallback) throw new Error(`${chainName} adapter requires a fallback adapter`);
|
|
2001
|
+
return {
|
|
2002
|
+
chainInfo: chainInfos[config.env],
|
|
2003
|
+
builder: () => fallback.builder(),
|
|
2004
|
+
executor: new WarpEvmExecutor(config, chainInfos[config.env]),
|
|
2005
|
+
output: new WarpEvmOutput(config, chainInfos[config.env]),
|
|
2006
|
+
serializer: new WarpEvmSerializer(),
|
|
2007
|
+
registry: fallback.registry,
|
|
2008
|
+
explorer: new WarpEvmExplorer(chainInfos[config.env], config),
|
|
2009
|
+
abiBuilder: () => fallback.abiBuilder(),
|
|
2010
|
+
brandBuilder: () => fallback.brandBuilder(),
|
|
2011
|
+
dataLoader: new WarpEvmDataLoader(config, chainInfos[config.env]),
|
|
2012
|
+
wallet: new WarpEvmWallet(config, chainInfos[config.env])
|
|
2013
|
+
};
|
|
2014
|
+
};
|
|
2015
|
+
};
|
|
2016
|
+
|
|
2017
|
+
// src/chains/arbitrum.ts
|
|
2018
|
+
var NativeTokenArb = {
|
|
2019
|
+
chain: import_warps19.WarpChainName.Arbitrum,
|
|
2020
|
+
identifier: "ARB",
|
|
2021
|
+
symbol: "ARB",
|
|
2022
|
+
name: "Arbitrum",
|
|
2023
|
+
decimals: 18,
|
|
2024
|
+
logoUrl: "https://raw.githubusercontent.com/JoAiHQ/assets/refs/heads/main/tokens/logos/arb.svg"
|
|
2025
|
+
};
|
|
2026
|
+
var ArbitrumAdapter = createEvmAdapter(import_warps19.WarpChainName.Arbitrum, {
|
|
2027
|
+
mainnet: {
|
|
2028
|
+
name: import_warps19.WarpChainName.Arbitrum,
|
|
2029
|
+
displayName: "Arbitrum",
|
|
2030
|
+
chainId: "42161",
|
|
2031
|
+
blockTime: 1e3,
|
|
2032
|
+
addressHrp: "0x",
|
|
2033
|
+
defaultApiUrl: "https://arb1.arbitrum.io/rpc",
|
|
2034
|
+
logoUrl: "https://raw.githubusercontent.com/JoAiHQ/assets/refs/heads/main/chains/logos/arbitrum.svg",
|
|
2035
|
+
nativeToken: NativeTokenArb
|
|
2036
|
+
},
|
|
2037
|
+
testnet: {
|
|
2038
|
+
name: import_warps19.WarpChainName.Arbitrum,
|
|
2039
|
+
displayName: "Arbitrum Sepolia",
|
|
2040
|
+
chainId: "421614",
|
|
2041
|
+
blockTime: 1e3,
|
|
2042
|
+
addressHrp: "0x",
|
|
2043
|
+
defaultApiUrl: "https://sepolia-rollup.arbitrum.io/rpc",
|
|
2044
|
+
logoUrl: "https://raw.githubusercontent.com/JoAiHQ/assets/refs/heads/main/chains/logos/arbitrum.svg",
|
|
2045
|
+
nativeToken: NativeTokenArb
|
|
2046
|
+
},
|
|
2047
|
+
devnet: {
|
|
2048
|
+
name: import_warps19.WarpChainName.Arbitrum,
|
|
2049
|
+
displayName: "Arbitrum Sepolia",
|
|
2050
|
+
chainId: "421614",
|
|
2051
|
+
blockTime: 1e3,
|
|
2052
|
+
addressHrp: "0x",
|
|
2053
|
+
defaultApiUrl: "https://sepolia-rollup.arbitrum.io/rpc",
|
|
2054
|
+
logoUrl: "https://raw.githubusercontent.com/JoAiHQ/assets/refs/heads/main/chains/logos/arbitrum.svg",
|
|
2055
|
+
nativeToken: NativeTokenArb
|
|
2056
|
+
}
|
|
2057
|
+
});
|
|
2058
|
+
|
|
2059
|
+
// src/chains/base.ts
|
|
2060
|
+
var import_warps20 = require("@joai/warps");
|
|
2061
|
+
var NativeTokenBase = {
|
|
2062
|
+
chain: import_warps20.WarpChainName.Base,
|
|
2063
|
+
identifier: "ETH",
|
|
2064
|
+
name: "Ether",
|
|
2065
|
+
symbol: "ETH",
|
|
2066
|
+
decimals: 18,
|
|
2067
|
+
logoUrl: {
|
|
2068
|
+
light: "https://raw.githubusercontent.com/JoAiHQ/assets/refs/heads/main/tokens/logos/eth-white.svg",
|
|
2069
|
+
dark: "https://raw.githubusercontent.com/JoAiHQ/assets/refs/heads/main/tokens/logos/eth-black.svg"
|
|
2070
|
+
}
|
|
2071
|
+
};
|
|
2072
|
+
var BaseAdapter = createEvmAdapter(import_warps20.WarpChainName.Base, {
|
|
2073
|
+
mainnet: {
|
|
2074
|
+
name: import_warps20.WarpChainName.Base,
|
|
2075
|
+
displayName: "Base",
|
|
2076
|
+
chainId: "8453",
|
|
2077
|
+
blockTime: 2e3,
|
|
2078
|
+
addressHrp: "0x",
|
|
2079
|
+
defaultApiUrl: "https://mainnet.base.org",
|
|
2080
|
+
logoUrl: {
|
|
2081
|
+
light: "https://raw.githubusercontent.com/JoAiHQ/assets/refs/heads/main/chains/logos/base-white.svg",
|
|
2082
|
+
dark: "https://raw.githubusercontent.com/JoAiHQ/assets/refs/heads/main/chains/logos/base-black.svg"
|
|
2083
|
+
},
|
|
2084
|
+
nativeToken: NativeTokenBase
|
|
2085
|
+
},
|
|
2086
|
+
testnet: {
|
|
2087
|
+
name: import_warps20.WarpChainName.Base,
|
|
2088
|
+
displayName: "Base Sepolia",
|
|
2089
|
+
chainId: "84532",
|
|
2090
|
+
blockTime: 2e3,
|
|
2091
|
+
addressHrp: "0x",
|
|
2092
|
+
defaultApiUrl: "https://sepolia.base.org",
|
|
2093
|
+
logoUrl: {
|
|
2094
|
+
light: "https://raw.githubusercontent.com/JoAiHQ/assets/refs/heads/main/chains/logos/base-white.svg",
|
|
2095
|
+
dark: "https://raw.githubusercontent.com/JoAiHQ/assets/refs/heads/main/chains/logos/base-black.svg"
|
|
2096
|
+
},
|
|
2097
|
+
nativeToken: NativeTokenBase
|
|
2098
|
+
},
|
|
2099
|
+
devnet: {
|
|
2100
|
+
name: import_warps20.WarpChainName.Base,
|
|
2101
|
+
displayName: "Base Sepolia",
|
|
2102
|
+
chainId: "84532",
|
|
2103
|
+
blockTime: 2e3,
|
|
2104
|
+
addressHrp: "0x",
|
|
2105
|
+
defaultApiUrl: "https://sepolia.base.org",
|
|
2106
|
+
logoUrl: {
|
|
2107
|
+
light: "https://raw.githubusercontent.com/JoAiHQ/assets/refs/heads/main/chains/logos/base-white.svg",
|
|
2108
|
+
dark: "https://raw.githubusercontent.com/JoAiHQ/assets/refs/heads/main/chains/logos/base-black.svg"
|
|
2109
|
+
},
|
|
2110
|
+
nativeToken: NativeTokenBase
|
|
2111
|
+
}
|
|
2112
|
+
});
|
|
2113
|
+
|
|
2114
|
+
// src/chains/combined.ts
|
|
2115
|
+
var import_warps21 = require("@joai/warps");
|
|
2116
|
+
var getAllEvmChainNames = () => [
|
|
2117
|
+
import_warps21.WarpChainName.Ethereum,
|
|
2118
|
+
import_warps21.WarpChainName.Base,
|
|
2119
|
+
import_warps21.WarpChainName.Arbitrum,
|
|
2120
|
+
import_warps21.WarpChainName.Polygon,
|
|
2121
|
+
import_warps21.WarpChainName.Somnia
|
|
2122
|
+
];
|
|
2123
|
+
|
|
2124
|
+
// src/chains/ethereum.ts
|
|
2125
|
+
var import_warps22 = require("@joai/warps");
|
|
2126
|
+
var NativeTokenEth = {
|
|
2127
|
+
chain: import_warps22.WarpChainName.Ethereum,
|
|
2128
|
+
identifier: "ETH",
|
|
2129
|
+
symbol: "ETH",
|
|
2130
|
+
name: "Ether",
|
|
2131
|
+
decimals: 18,
|
|
2132
|
+
logoUrl: {
|
|
2133
|
+
light: "https://raw.githubusercontent.com/JoAiHQ/assets/refs/heads/main/tokens/logos/eth-white.svg",
|
|
2134
|
+
dark: "https://raw.githubusercontent.com/JoAiHQ/assets/refs/heads/main/tokens/logos/eth-black.svg"
|
|
2135
|
+
}
|
|
2136
|
+
};
|
|
2137
|
+
var EthereumAdapter = createEvmAdapter(import_warps22.WarpChainName.Ethereum, {
|
|
2138
|
+
mainnet: {
|
|
2139
|
+
name: import_warps22.WarpChainName.Ethereum,
|
|
2140
|
+
displayName: "Ethereum Mainnet",
|
|
2141
|
+
chainId: "1",
|
|
2142
|
+
blockTime: 12e3,
|
|
2143
|
+
addressHrp: "0x",
|
|
2144
|
+
defaultApiUrl: "https://ethereum-rpc.publicnode.com",
|
|
2145
|
+
logoUrl: {
|
|
2146
|
+
light: "https://raw.githubusercontent.com/JoAiHQ/assets/refs/heads/main/chains/logos/ethereum-white.svg",
|
|
2147
|
+
dark: "https://raw.githubusercontent.com/JoAiHQ/assets/refs/heads/main/chains/logos/ethereum-black.svg"
|
|
2148
|
+
},
|
|
2149
|
+
nativeToken: NativeTokenEth
|
|
2150
|
+
},
|
|
2151
|
+
testnet: {
|
|
2152
|
+
name: import_warps22.WarpChainName.Ethereum,
|
|
2153
|
+
displayName: "Ethereum Sepolia",
|
|
2154
|
+
chainId: "11155111",
|
|
2155
|
+
blockTime: 12e3,
|
|
2156
|
+
addressHrp: "0x",
|
|
2157
|
+
defaultApiUrl: "https://ethereum-sepolia-rpc.publicnode.com",
|
|
2158
|
+
logoUrl: {
|
|
2159
|
+
light: "https://raw.githubusercontent.com/JoAiHQ/assets/refs/heads/main/chains/logos/ethereum-white.svg",
|
|
2160
|
+
dark: "https://raw.githubusercontent.com/JoAiHQ/assets/refs/heads/main/chains/logos/ethereum-black.svg"
|
|
2161
|
+
},
|
|
2162
|
+
nativeToken: NativeTokenEth
|
|
2163
|
+
},
|
|
2164
|
+
devnet: {
|
|
2165
|
+
name: import_warps22.WarpChainName.Ethereum,
|
|
2166
|
+
displayName: "Ethereum Sepolia",
|
|
2167
|
+
chainId: "11155111",
|
|
2168
|
+
blockTime: 12e3,
|
|
2169
|
+
addressHrp: "0x",
|
|
2170
|
+
defaultApiUrl: "https://ethereum-sepolia-rpc.publicnode.com",
|
|
2171
|
+
logoUrl: {
|
|
2172
|
+
light: "https://raw.githubusercontent.com/JoAiHQ/assets/refs/heads/main/chains/logos/ethereum-white.svg",
|
|
2173
|
+
dark: "https://raw.githubusercontent.com/JoAiHQ/assets/refs/heads/main/chains/logos/ethereum-black.svg"
|
|
2174
|
+
},
|
|
2175
|
+
nativeToken: NativeTokenEth
|
|
2176
|
+
}
|
|
2177
|
+
});
|
|
2178
|
+
|
|
2179
|
+
// src/chains/polygon.ts
|
|
2180
|
+
var import_warps23 = require("@joai/warps");
|
|
2181
|
+
var NativeTokenPolygon = {
|
|
2182
|
+
chain: import_warps23.WarpChainName.Polygon,
|
|
2183
|
+
identifier: "MATIC",
|
|
2184
|
+
symbol: "MATIC",
|
|
2185
|
+
name: "Polygon",
|
|
2186
|
+
decimals: 18,
|
|
2187
|
+
logoUrl: {
|
|
2188
|
+
light: "https://raw.githubusercontent.com/JoAiHQ/assets/refs/heads/main/tokens/logos/matic-white.svg",
|
|
2189
|
+
dark: "https://raw.githubusercontent.com/JoAiHQ/assets/refs/heads/main/tokens/logos/matic-black.svg"
|
|
2190
|
+
}
|
|
2191
|
+
};
|
|
2192
|
+
var PolygonAdapter = createEvmAdapter(import_warps23.WarpChainName.Polygon, {
|
|
2193
|
+
mainnet: {
|
|
2194
|
+
name: import_warps23.WarpChainName.Polygon,
|
|
2195
|
+
displayName: "Polygon",
|
|
2196
|
+
chainId: "137",
|
|
2197
|
+
blockTime: 2e3,
|
|
2198
|
+
addressHrp: "0x",
|
|
2199
|
+
defaultApiUrl: "https://polygon-rpc.com",
|
|
2200
|
+
logoUrl: {
|
|
2201
|
+
light: "https://raw.githubusercontent.com/JoAiHQ/assets/refs/heads/main/chains/logos/polygon-white.svg",
|
|
2202
|
+
dark: "https://raw.githubusercontent.com/JoAiHQ/assets/refs/heads/main/chains/logos/polygon-black.svg"
|
|
2203
|
+
},
|
|
2204
|
+
nativeToken: NativeTokenPolygon
|
|
2205
|
+
},
|
|
2206
|
+
testnet: {
|
|
2207
|
+
name: import_warps23.WarpChainName.Polygon,
|
|
2208
|
+
displayName: "Polygon Mumbai",
|
|
2209
|
+
chainId: "80001",
|
|
2210
|
+
blockTime: 2e3,
|
|
2211
|
+
addressHrp: "0x",
|
|
2212
|
+
defaultApiUrl: "https://rpc.ankr.com/polygon_mumbai",
|
|
2213
|
+
logoUrl: {
|
|
2214
|
+
light: "https://raw.githubusercontent.com/JoAiHQ/assets/refs/heads/main/chains/logos/polygon-white.svg",
|
|
2215
|
+
dark: "https://raw.githubusercontent.com/JoAiHQ/assets/refs/heads/main/chains/logos/polygon-black.svg"
|
|
2216
|
+
},
|
|
2217
|
+
nativeToken: NativeTokenPolygon
|
|
2218
|
+
},
|
|
2219
|
+
devnet: {
|
|
2220
|
+
name: import_warps23.WarpChainName.Polygon,
|
|
2221
|
+
displayName: "Polygon Mumbai",
|
|
2222
|
+
chainId: "80001",
|
|
2223
|
+
blockTime: 2e3,
|
|
2224
|
+
addressHrp: "0x",
|
|
2225
|
+
defaultApiUrl: "https://rpc.ankr.com/polygon_mumbai",
|
|
2226
|
+
logoUrl: {
|
|
2227
|
+
light: "https://raw.githubusercontent.com/JoAiHQ/assets/refs/heads/main/chains/logos/polygon-white.svg",
|
|
2228
|
+
dark: "https://raw.githubusercontent.com/JoAiHQ/assets/refs/heads/main/chains/logos/polygon-black.svg"
|
|
2229
|
+
},
|
|
2230
|
+
nativeToken: NativeTokenPolygon
|
|
2231
|
+
}
|
|
2232
|
+
});
|
|
2233
|
+
|
|
2234
|
+
// src/adapters.ts
|
|
2235
|
+
var import_warps25 = require("@joai/warps");
|
|
2236
|
+
|
|
2237
|
+
// src/chains/somnia.ts
|
|
2238
|
+
var import_warps24 = require("@joai/warps");
|
|
2239
|
+
var NativeTokenSomi = {
|
|
2240
|
+
chain: import_warps24.WarpChainName.Somnia,
|
|
2241
|
+
identifier: "SOMI",
|
|
2242
|
+
symbol: "SOMI",
|
|
2243
|
+
name: "Somnia",
|
|
2244
|
+
decimals: 18,
|
|
2245
|
+
logoUrl: "https://assets.coingecko.com/coins/images/68061/standard/somniacg.png?1754641117"
|
|
2246
|
+
};
|
|
2247
|
+
var NativeTokenStt = {
|
|
2248
|
+
chain: import_warps24.WarpChainName.Somnia,
|
|
2249
|
+
identifier: "STT",
|
|
2250
|
+
symbol: "STT",
|
|
2251
|
+
name: "Somnia Testnet Token",
|
|
2252
|
+
decimals: 18,
|
|
2253
|
+
logoUrl: "https://assets.coingecko.com/coins/images/68061/standard/somniacg.png?1754641117"
|
|
2254
|
+
};
|
|
2255
|
+
var SomniaAdapter = createEvmAdapter(import_warps24.WarpChainName.Somnia, {
|
|
2256
|
+
mainnet: {
|
|
2257
|
+
name: import_warps24.WarpChainName.Somnia,
|
|
2258
|
+
displayName: "Somnia Mainnet",
|
|
2259
|
+
chainId: "5031",
|
|
2260
|
+
blockTime: 100,
|
|
2261
|
+
addressHrp: "0x",
|
|
2262
|
+
defaultApiUrl: "https://api.infra.mainnet.somnia.network/",
|
|
2263
|
+
logoUrl: "https://raw.githubusercontent.com/JoAiHQ/assets/refs/heads/main/chains/logos/somnia.png",
|
|
2264
|
+
nativeToken: NativeTokenSomi
|
|
2265
|
+
},
|
|
2266
|
+
testnet: {
|
|
2267
|
+
name: import_warps24.WarpChainName.Somnia,
|
|
2268
|
+
displayName: "Somnia Testnet",
|
|
2269
|
+
chainId: "50312",
|
|
2270
|
+
blockTime: 100,
|
|
2271
|
+
addressHrp: "0x",
|
|
2272
|
+
defaultApiUrl: "https://dream-rpc.somnia.network/",
|
|
2273
|
+
logoUrl: "https://raw.githubusercontent.com/JoAiHQ/assets/refs/heads/main/chains/logos/somnia.png",
|
|
2274
|
+
nativeToken: NativeTokenStt
|
|
2275
|
+
},
|
|
2276
|
+
devnet: {
|
|
2277
|
+
name: import_warps24.WarpChainName.Somnia,
|
|
2278
|
+
displayName: "Somnia Testnet",
|
|
2279
|
+
chainId: "50312",
|
|
2280
|
+
blockTime: 100,
|
|
2281
|
+
addressHrp: "0x",
|
|
2282
|
+
defaultApiUrl: "https://dream-rpc.somnia.network",
|
|
2283
|
+
logoUrl: "https://raw.githubusercontent.com/JoAiHQ/assets/refs/heads/main/chains/logos/somnia.png",
|
|
2284
|
+
nativeToken: NativeTokenStt
|
|
2285
|
+
}
|
|
2286
|
+
});
|
|
2287
|
+
|
|
2288
|
+
// src/adapters.ts
|
|
2289
|
+
var getAllEvmAdapters = (fallbackFactory) => [
|
|
2290
|
+
(0, import_warps25.withAdapterFallback)(EthereumAdapter, fallbackFactory),
|
|
2291
|
+
(0, import_warps25.withAdapterFallback)(BaseAdapter, fallbackFactory),
|
|
2292
|
+
(0, import_warps25.withAdapterFallback)(ArbitrumAdapter, fallbackFactory),
|
|
2293
|
+
(0, import_warps25.withAdapterFallback)(PolygonAdapter, fallbackFactory),
|
|
2294
|
+
(0, import_warps25.withAdapterFallback)(SomniaAdapter, fallbackFactory)
|
|
2295
|
+
];
|
|
2296
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
2297
|
+
0 && (module.exports = {
|
|
2298
|
+
ArbitrumAdapter,
|
|
2299
|
+
ArbitrumExplorers,
|
|
2300
|
+
BaseAdapter,
|
|
2301
|
+
BaseExplorers,
|
|
2302
|
+
EthereumAdapter,
|
|
2303
|
+
EthereumExplorers,
|
|
2304
|
+
EvmChainIdMap,
|
|
2305
|
+
EvmChainIds,
|
|
2306
|
+
EvmExplorers,
|
|
2307
|
+
ExplorerUrls,
|
|
2308
|
+
KnownTokens,
|
|
2309
|
+
NativeTokenArb,
|
|
2310
|
+
NativeTokenBase,
|
|
2311
|
+
NativeTokenEth,
|
|
2312
|
+
NativeTokenPolygon,
|
|
2313
|
+
PolygonAdapter,
|
|
2314
|
+
PolygonExplorers,
|
|
2315
|
+
SupportedEvmChainIds,
|
|
2316
|
+
WarpEvmConstants,
|
|
2317
|
+
WarpEvmDataLoader,
|
|
2318
|
+
WarpEvmExecutor,
|
|
2319
|
+
WarpEvmExplorer,
|
|
2320
|
+
WarpEvmOutput,
|
|
2321
|
+
WarpEvmSerializer,
|
|
2322
|
+
WarpEvmWallet,
|
|
2323
|
+
createEvmAdapter,
|
|
2324
|
+
findKnownTokenById,
|
|
2325
|
+
getAllEvmAdapters,
|
|
2326
|
+
getAllEvmChainNames,
|
|
2327
|
+
getKnownTokensForChain
|
|
2328
|
+
});
|
|
2329
|
+
//# sourceMappingURL=index.js.map
|