@vleap/warps-adapter-evm 0.2.0-alpha.18 → 0.2.0-alpha.19
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/dist/index.d.ts +94 -6
- package/dist/index.mjs +244 -96
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/dist/index.d.ts
CHANGED
|
@@ -1,18 +1,17 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { WarpChainAsset, AdapterFactory, WarpClientConfig, Adapter, WarpChain, WarpChainEnv, WarpChainInfo, AdapterWarpDataLoader, WarpChainAccount, WarpDataLoaderOptions, WarpChainAction, AdapterWarpExecutor, WarpExecutable, WarpExecution, WarpActionInputType, AdapterWarpExplorer, AdapterWarpResults, Warp, ResolvedInput, WarpExecutionResults, AdapterWarpSerializer, WarpSerializer, WarpNativeValue, BaseWarpActionInputType, WarpAdapterGenericType } from '@vleap/warps';
|
|
2
2
|
import { ethers } from 'ethers';
|
|
3
3
|
|
|
4
|
-
declare const ChainNameArbitrum: WarpChain;
|
|
5
4
|
declare const NativeTokenArb: WarpChainAsset;
|
|
6
5
|
declare const getArbitrumAdapter: AdapterFactory;
|
|
7
6
|
|
|
8
|
-
declare const ChainNameBase: WarpChain;
|
|
9
7
|
declare const NativeTokenBase: WarpChainAsset;
|
|
10
8
|
declare const getBaseAdapter: AdapterFactory;
|
|
11
9
|
|
|
12
10
|
declare const getAllEvmAdapters: (config: WarpClientConfig, fallback?: Adapter) => Adapter[];
|
|
13
11
|
declare const getAllEvmChainNames: () => WarpChain[];
|
|
14
12
|
|
|
15
|
-
declare const
|
|
13
|
+
declare const createEvmAdapter: (chainName: string, chainPrefix: string, chainInfos: Record<WarpChainEnv, WarpChainInfo>) => AdapterFactory;
|
|
14
|
+
|
|
16
15
|
declare const NativeTokenEth: WarpChainAsset;
|
|
17
16
|
declare const getEthereumAdapter: AdapterFactory;
|
|
18
17
|
|
|
@@ -22,6 +21,7 @@ declare const WarpEvmConstants: {
|
|
|
22
21
|
ContractCall: number;
|
|
23
22
|
ContractDeploy: number;
|
|
24
23
|
Transfer: number;
|
|
24
|
+
TokenTransfer: number;
|
|
25
25
|
Approve: number;
|
|
26
26
|
Swap: number;
|
|
27
27
|
};
|
|
@@ -72,6 +72,79 @@ declare const EvmExplorers: {
|
|
|
72
72
|
};
|
|
73
73
|
declare const ExplorerUrls: Record<ExplorerName, string>;
|
|
74
74
|
|
|
75
|
+
interface TokenInfo$1 {
|
|
76
|
+
name?: string;
|
|
77
|
+
symbol?: string;
|
|
78
|
+
logoURI?: string;
|
|
79
|
+
decimals?: number;
|
|
80
|
+
}
|
|
81
|
+
declare class EvmLogoService {
|
|
82
|
+
static getTokenInfo(chainName: string, tokenAddress: string): Promise<TokenInfo$1>;
|
|
83
|
+
static getLogoUrl(chainName: string, tokenAddress: string, tokenName?: string, tokenSymbol?: string): Promise<string>;
|
|
84
|
+
private static fetchFromTokenLists;
|
|
85
|
+
private static fetchFromDefiLlama;
|
|
86
|
+
private static fetchFromTrustWallet;
|
|
87
|
+
static clearCache(): void;
|
|
88
|
+
static getCacheSize(): number;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
interface TokenMetadata$1 {
|
|
92
|
+
name: string;
|
|
93
|
+
symbol: string;
|
|
94
|
+
decimals: number;
|
|
95
|
+
logoUrl?: string;
|
|
96
|
+
}
|
|
97
|
+
interface TokenBalance {
|
|
98
|
+
tokenAddress: string;
|
|
99
|
+
balance: bigint;
|
|
100
|
+
metadata: TokenMetadata$1;
|
|
101
|
+
}
|
|
102
|
+
interface TokenInfo {
|
|
103
|
+
name?: string;
|
|
104
|
+
symbol?: string;
|
|
105
|
+
logoURI?: string;
|
|
106
|
+
decimals?: number;
|
|
107
|
+
}
|
|
108
|
+
interface TokenListResponse {
|
|
109
|
+
tokens: Array<{
|
|
110
|
+
chainId: number;
|
|
111
|
+
address: string;
|
|
112
|
+
name: string;
|
|
113
|
+
symbol: string;
|
|
114
|
+
decimals: number;
|
|
115
|
+
logoURI?: string;
|
|
116
|
+
}>;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
interface TokenMetadata {
|
|
120
|
+
name: string;
|
|
121
|
+
symbol: string;
|
|
122
|
+
decimals: number;
|
|
123
|
+
logoUrl?: string;
|
|
124
|
+
}
|
|
125
|
+
declare class WarpEvmDataLoader implements AdapterWarpDataLoader {
|
|
126
|
+
private readonly config;
|
|
127
|
+
private readonly chain;
|
|
128
|
+
private provider;
|
|
129
|
+
constructor(config: WarpClientConfig, chain: WarpChainInfo);
|
|
130
|
+
getAccount(address: string): Promise<WarpChainAccount>;
|
|
131
|
+
getAccountAssets(address: string): Promise<WarpChainAsset[]>;
|
|
132
|
+
getAccountActions(address: string, options?: WarpDataLoaderOptions): Promise<WarpChainAction[]>;
|
|
133
|
+
private getERC20TokenBalances;
|
|
134
|
+
private getTokenBalance;
|
|
135
|
+
private getTokenMetadata;
|
|
136
|
+
private detectTokensFromEvents;
|
|
137
|
+
getTokenInfo(tokenAddress: string): Promise<TokenMetadata | null>;
|
|
138
|
+
getTokenBalanceForAddress(address: string, tokenAddress: string): Promise<bigint>;
|
|
139
|
+
getMultipleTokenBalances(address: string, tokenAddresses: string[]): Promise<Map<string, bigint>>;
|
|
140
|
+
getAccountTokens(address: string): Promise<WarpChainAsset[]>;
|
|
141
|
+
getTokenMetadataPublic(tokenAddress: string): Promise<TokenMetadata | null>;
|
|
142
|
+
getChainInfo(): Promise<{
|
|
143
|
+
chainId: string;
|
|
144
|
+
blockTime: number;
|
|
145
|
+
}>;
|
|
146
|
+
}
|
|
147
|
+
|
|
75
148
|
declare class WarpEvmExecutor implements AdapterWarpExecutor {
|
|
76
149
|
private readonly config;
|
|
77
150
|
private readonly chain;
|
|
@@ -82,10 +155,13 @@ declare class WarpEvmExecutor implements AdapterWarpExecutor {
|
|
|
82
155
|
createTransaction(executable: WarpExecutable): Promise<ethers.TransactionRequest>;
|
|
83
156
|
createTransferTransaction(executable: WarpExecutable): Promise<ethers.TransactionRequest>;
|
|
84
157
|
createContractCallTransaction(executable: WarpExecutable): Promise<ethers.TransactionRequest>;
|
|
158
|
+
private createTokenTransferTransaction;
|
|
159
|
+
private createSingleTokenTransfer;
|
|
85
160
|
executeQuery(executable: WarpExecutable): Promise<WarpExecution>;
|
|
86
161
|
preprocessInput(chain: WarpChainInfo, input: string, type: WarpActionInputType, value: string): Promise<string>;
|
|
87
162
|
private estimateGasAndSetDefaults;
|
|
88
163
|
signMessage(message: string, privateKey: string): Promise<string>;
|
|
164
|
+
verifyMessage(message: string, signature: string): Promise<string>;
|
|
89
165
|
}
|
|
90
166
|
|
|
91
167
|
declare class WarpEvmExplorer implements AdapterWarpExplorer {
|
|
@@ -104,17 +180,29 @@ declare class WarpEvmExplorer implements AdapterWarpExplorer {
|
|
|
104
180
|
getExplorerByName(name: string): ExplorerName | undefined;
|
|
105
181
|
getAccountUrls(address: string): Record<ExplorerName, string>;
|
|
106
182
|
getTransactionUrls(hash: string): Record<ExplorerName, string>;
|
|
183
|
+
getAssetUrls(identifier: string): Record<ExplorerName, string>;
|
|
184
|
+
getContractUrls(address: string): Record<ExplorerName, string>;
|
|
185
|
+
getBlockUrls(blockNumber: string | number): Record<ExplorerName, string>;
|
|
107
186
|
}
|
|
108
187
|
|
|
109
188
|
declare class WarpEvmResults implements AdapterWarpResults {
|
|
110
189
|
private readonly config;
|
|
190
|
+
private readonly chain?;
|
|
111
191
|
private readonly serializer;
|
|
112
|
-
|
|
192
|
+
private readonly provider;
|
|
193
|
+
constructor(config: WarpClientConfig, chain?: WarpChainInfo | undefined);
|
|
113
194
|
getTransactionExecutionResults(warp: Warp, tx: ethers.TransactionReceipt): Promise<WarpExecution>;
|
|
114
195
|
extractQueryResults(warp: Warp, typedValues: any[], actionIndex: number, inputs: ResolvedInput[]): Promise<{
|
|
115
196
|
values: any[];
|
|
197
|
+
valuesRaw: any[];
|
|
116
198
|
results: WarpExecutionResults;
|
|
117
199
|
}>;
|
|
200
|
+
getTransactionStatus(txHash: string): Promise<{
|
|
201
|
+
status: 'pending' | 'confirmed' | 'failed';
|
|
202
|
+
blockNumber?: number;
|
|
203
|
+
gasUsed?: bigint;
|
|
204
|
+
}>;
|
|
205
|
+
getTransactionReceipt(txHash: string): Promise<ethers.TransactionReceipt | null>;
|
|
118
206
|
}
|
|
119
207
|
|
|
120
208
|
declare class WarpEvmSerializer implements AdapterWarpSerializer {
|
|
@@ -128,4 +216,4 @@ declare class WarpEvmSerializer implements AdapterWarpSerializer {
|
|
|
128
216
|
private parseNativeValue;
|
|
129
217
|
}
|
|
130
218
|
|
|
131
|
-
export { ArbitrumExplorers, BaseExplorers,
|
|
219
|
+
export { ArbitrumExplorers, BaseExplorers, EthereumExplorers, EvmExplorers, EvmLogoService, type ExplorerName, ExplorerUrls, NativeTokenArb, NativeTokenBase, NativeTokenEth, type TokenBalance, type TokenInfo, type TokenListResponse, type TokenMetadata$1 as TokenMetadata, WarpEvmConstants, WarpEvmDataLoader, WarpEvmExecutor, WarpEvmExplorer, WarpEvmResults, WarpEvmSerializer, createEvmAdapter, getAllEvmAdapters, getAllEvmChainNames, getArbitrumAdapter, getBaseAdapter, getEthereumAdapter };
|
package/dist/index.mjs
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
|
+
// src/chains/arbitrum.ts
|
|
2
|
+
import { WarpChainName } from "@vleap/warps";
|
|
3
|
+
|
|
1
4
|
// src/WarpEvmDataLoader.ts
|
|
2
|
-
import {
|
|
5
|
+
import {
|
|
6
|
+
getProviderUrl
|
|
7
|
+
} from "@vleap/warps";
|
|
3
8
|
import { ethers } from "ethers";
|
|
4
9
|
|
|
5
10
|
// src/LogoService.ts
|
|
@@ -285,12 +290,14 @@ var WarpEvmDataLoader = class {
|
|
|
285
290
|
this.config = config;
|
|
286
291
|
this.chain = chain;
|
|
287
292
|
const apiUrl = getProviderUrl(this.config, this.chain.name, this.config.env, this.chain.defaultApiUrl);
|
|
288
|
-
|
|
293
|
+
const network = new ethers.Network(this.chain.name, parseInt(this.chain.chainId));
|
|
294
|
+
this.provider = new ethers.JsonRpcProvider(apiUrl, network);
|
|
289
295
|
}
|
|
290
296
|
async getAccount(address) {
|
|
291
297
|
try {
|
|
292
298
|
const balance = await this.provider.getBalance(address);
|
|
293
299
|
return {
|
|
300
|
+
chain: this.chain.name,
|
|
294
301
|
address,
|
|
295
302
|
balance
|
|
296
303
|
};
|
|
@@ -311,6 +318,7 @@ var WarpEvmDataLoader = class {
|
|
|
311
318
|
tokenBalance.metadata.symbol
|
|
312
319
|
);
|
|
313
320
|
assets.push({
|
|
321
|
+
chain: this.chain.name,
|
|
314
322
|
identifier: tokenBalance.tokenAddress,
|
|
315
323
|
name: tokenBalance.metadata.name,
|
|
316
324
|
amount: tokenBalance.balance,
|
|
@@ -324,6 +332,9 @@ var WarpEvmDataLoader = class {
|
|
|
324
332
|
throw new Error(`Failed to get account assets for ${address}: ${error}`);
|
|
325
333
|
}
|
|
326
334
|
}
|
|
335
|
+
async getAccountActions(address, options) {
|
|
336
|
+
return [];
|
|
337
|
+
}
|
|
327
338
|
async getERC20TokenBalances(address) {
|
|
328
339
|
const tokenBalances = [];
|
|
329
340
|
const knownTokens = KNOWN_TOKENS[this.chain.name] || {};
|
|
@@ -425,7 +436,6 @@ var WarpEvmDataLoader = class {
|
|
|
425
436
|
try {
|
|
426
437
|
return await this.getTokenMetadata(tokenAddress);
|
|
427
438
|
} catch (error) {
|
|
428
|
-
console.warn(`Failed to get token info for ${tokenAddress}: ${error}`);
|
|
429
439
|
return null;
|
|
430
440
|
}
|
|
431
441
|
}
|
|
@@ -444,23 +454,44 @@ var WarpEvmDataLoader = class {
|
|
|
444
454
|
const balance = await this.getTokenBalance(address, tokenAddress);
|
|
445
455
|
balances.set(tokenAddress, balance);
|
|
446
456
|
} catch (error) {
|
|
447
|
-
console.warn(`Failed to get balance for token ${tokenAddress}: ${error}`);
|
|
448
457
|
balances.set(tokenAddress, 0n);
|
|
449
458
|
}
|
|
450
459
|
})
|
|
451
460
|
);
|
|
452
461
|
return balances;
|
|
453
462
|
}
|
|
463
|
+
async getAccountTokens(address) {
|
|
464
|
+
return this.getAccountAssets(address);
|
|
465
|
+
}
|
|
466
|
+
async getTokenMetadataPublic(tokenAddress) {
|
|
467
|
+
try {
|
|
468
|
+
return await this.getTokenMetadata(tokenAddress);
|
|
469
|
+
} catch (error) {
|
|
470
|
+
return null;
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
async getChainInfo() {
|
|
474
|
+
try {
|
|
475
|
+
const network = await this.provider.getNetwork();
|
|
476
|
+
const latestBlock = await this.provider.getBlock("latest");
|
|
477
|
+
return {
|
|
478
|
+
chainId: network.chainId.toString(),
|
|
479
|
+
blockTime: latestBlock?.timestamp ? Date.now() / 1e3 - latestBlock.timestamp : 12
|
|
480
|
+
};
|
|
481
|
+
} catch (error) {
|
|
482
|
+
throw new Error(`Failed to get chain info: ${error}`);
|
|
483
|
+
}
|
|
484
|
+
}
|
|
454
485
|
};
|
|
455
486
|
|
|
456
487
|
// src/WarpEvmExecutor.ts
|
|
457
488
|
import {
|
|
458
489
|
applyResultsToMessages,
|
|
459
490
|
getNextInfo,
|
|
460
|
-
getProviderUrl as
|
|
491
|
+
getProviderUrl as getProviderUrl3,
|
|
461
492
|
getWarpActionByIndex
|
|
462
493
|
} from "@vleap/warps";
|
|
463
|
-
import { ethers as
|
|
494
|
+
import { ethers as ethers4 } from "ethers";
|
|
464
495
|
|
|
465
496
|
// src/constants.ts
|
|
466
497
|
var WarpEvmConstants = {
|
|
@@ -469,6 +500,8 @@ var WarpEvmConstants = {
|
|
|
469
500
|
ContractCall: 1e5,
|
|
470
501
|
ContractDeploy: 5e5,
|
|
471
502
|
Transfer: 21e3,
|
|
503
|
+
TokenTransfer: 65e3,
|
|
504
|
+
// ERC-20 transfer gas limit
|
|
472
505
|
Approve: 46e3,
|
|
473
506
|
Swap: 2e5
|
|
474
507
|
},
|
|
@@ -538,9 +571,11 @@ var ExplorerUrls = {
|
|
|
538
571
|
// src/WarpEvmResults.ts
|
|
539
572
|
import {
|
|
540
573
|
evaluateResultsCommon,
|
|
574
|
+
getProviderUrl as getProviderUrl2,
|
|
541
575
|
parseResultsOutIndex,
|
|
542
576
|
WarpConstants as WarpConstants2
|
|
543
577
|
} from "@vleap/warps";
|
|
578
|
+
import { ethers as ethers3 } from "ethers";
|
|
544
579
|
|
|
545
580
|
// src/WarpEvmSerializer.ts
|
|
546
581
|
import {
|
|
@@ -699,9 +734,19 @@ var WarpEvmSerializer = class {
|
|
|
699
734
|
|
|
700
735
|
// src/WarpEvmResults.ts
|
|
701
736
|
var WarpEvmResults = class {
|
|
702
|
-
constructor(config) {
|
|
737
|
+
constructor(config, chain) {
|
|
703
738
|
this.config = config;
|
|
739
|
+
this.chain = chain;
|
|
704
740
|
this.serializer = new WarpEvmSerializer();
|
|
741
|
+
if (this.chain) {
|
|
742
|
+
const apiUrl = getProviderUrl2(this.config, this.chain.name, this.config.env, this.chain.defaultApiUrl);
|
|
743
|
+
const network = new ethers3.Network(this.chain.name, parseInt(this.chain.chainId));
|
|
744
|
+
this.provider = new ethers3.JsonRpcProvider(apiUrl, network);
|
|
745
|
+
} else {
|
|
746
|
+
const apiUrl = getProviderUrl2(this.config, "ethereum", this.config.env, "https://ethereum-rpc.publicnode.com");
|
|
747
|
+
const network = new ethers3.Network("ethereum", 1);
|
|
748
|
+
this.provider = new ethers3.JsonRpcProvider(apiUrl, network);
|
|
749
|
+
}
|
|
705
750
|
}
|
|
706
751
|
async getTransactionExecutionResults(warp, tx) {
|
|
707
752
|
const success = tx.status === 1;
|
|
@@ -726,6 +771,7 @@ var WarpEvmResults = class {
|
|
|
726
771
|
tx,
|
|
727
772
|
next: null,
|
|
728
773
|
values: [transactionHash, blockNumber, gasUsed, gasPrice, ...logs.length > 0 ? logs : []],
|
|
774
|
+
valuesRaw: [transactionHash, blockNumber, gasUsed, gasPrice, ...logs.length > 0 ? logs : []],
|
|
729
775
|
results: {},
|
|
730
776
|
messages: {}
|
|
731
777
|
};
|
|
@@ -734,7 +780,7 @@ var WarpEvmResults = class {
|
|
|
734
780
|
const values = typedValues.map((t) => this.serializer.typedToString(t));
|
|
735
781
|
const valuesRaw = typedValues.map((t) => this.serializer.typedToNative(t)[1]);
|
|
736
782
|
let results = {};
|
|
737
|
-
if (!warp.results) return { values, results };
|
|
783
|
+
if (!warp.results) return { values, valuesRaw, results };
|
|
738
784
|
const getNestedValue = (path) => {
|
|
739
785
|
const indices = path.split(".").slice(1).map((i) => parseInt(i) - 1);
|
|
740
786
|
if (indices.length === 0) return void 0;
|
|
@@ -758,7 +804,29 @@ var WarpEvmResults = class {
|
|
|
758
804
|
results[key] = path;
|
|
759
805
|
}
|
|
760
806
|
}
|
|
761
|
-
return { values, results: await evaluateResultsCommon(warp, results, actionIndex, inputs) };
|
|
807
|
+
return { values, valuesRaw, results: await evaluateResultsCommon(warp, results, actionIndex, inputs) };
|
|
808
|
+
}
|
|
809
|
+
async getTransactionStatus(txHash) {
|
|
810
|
+
try {
|
|
811
|
+
const receipt = await this.provider.getTransactionReceipt(txHash);
|
|
812
|
+
if (!receipt) {
|
|
813
|
+
return { status: "pending" };
|
|
814
|
+
}
|
|
815
|
+
return {
|
|
816
|
+
status: receipt.status === 1 ? "confirmed" : "failed",
|
|
817
|
+
blockNumber: receipt.blockNumber,
|
|
818
|
+
gasUsed: receipt.gasUsed
|
|
819
|
+
};
|
|
820
|
+
} catch (error) {
|
|
821
|
+
throw new Error(`Failed to get transaction status: ${error}`);
|
|
822
|
+
}
|
|
823
|
+
}
|
|
824
|
+
async getTransactionReceipt(txHash) {
|
|
825
|
+
try {
|
|
826
|
+
return await this.provider.getTransactionReceipt(txHash);
|
|
827
|
+
} catch (error) {
|
|
828
|
+
return null;
|
|
829
|
+
}
|
|
762
830
|
}
|
|
763
831
|
};
|
|
764
832
|
|
|
@@ -768,9 +836,10 @@ var WarpEvmExecutor = class {
|
|
|
768
836
|
this.config = config;
|
|
769
837
|
this.chain = chain;
|
|
770
838
|
this.serializer = new WarpEvmSerializer();
|
|
771
|
-
const apiUrl =
|
|
772
|
-
|
|
773
|
-
this.
|
|
839
|
+
const apiUrl = getProviderUrl3(this.config, chain.name, this.config.env, this.chain.defaultApiUrl);
|
|
840
|
+
const network = new ethers4.Network(this.chain.name, parseInt(this.chain.chainId));
|
|
841
|
+
this.provider = new ethers4.JsonRpcProvider(apiUrl, network);
|
|
842
|
+
this.results = new WarpEvmResults(config, this.chain);
|
|
774
843
|
}
|
|
775
844
|
async createTransaction(executable) {
|
|
776
845
|
const action = getWarpActionByIndex(executable.warp, executable.action);
|
|
@@ -790,11 +859,11 @@ var WarpEvmExecutor = class {
|
|
|
790
859
|
async createTransferTransaction(executable) {
|
|
791
860
|
const userWallet = this.config.user?.wallets?.[executable.chain.name];
|
|
792
861
|
if (!userWallet) throw new Error("WarpEvmExecutor: createTransfer - user address not set");
|
|
793
|
-
if (!
|
|
862
|
+
if (!ethers4.isAddress(executable.destination)) {
|
|
794
863
|
throw new Error(`WarpEvmExecutor: Invalid destination address: ${executable.destination}`);
|
|
795
864
|
}
|
|
796
|
-
if (executable.
|
|
797
|
-
|
|
865
|
+
if (executable.transfers && executable.transfers.length > 0) {
|
|
866
|
+
return this.createTokenTransferTransaction(executable, userWallet);
|
|
798
867
|
}
|
|
799
868
|
const tx = {
|
|
800
869
|
to: executable.destination,
|
|
@@ -810,14 +879,11 @@ var WarpEvmExecutor = class {
|
|
|
810
879
|
if (!action || !("func" in action) || !action.func) {
|
|
811
880
|
throw new Error("WarpEvmExecutor: Contract action must have a function name");
|
|
812
881
|
}
|
|
813
|
-
if (!
|
|
882
|
+
if (!ethers4.isAddress(executable.destination)) {
|
|
814
883
|
throw new Error(`WarpEvmExecutor: Invalid contract address: ${executable.destination}`);
|
|
815
884
|
}
|
|
816
|
-
if (executable.value < 0) {
|
|
817
|
-
throw new Error(`WarpEvmExecutor: Contract call value cannot be negative: ${executable.value}`);
|
|
818
|
-
}
|
|
819
885
|
try {
|
|
820
|
-
const iface = new
|
|
886
|
+
const iface = new ethers4.Interface([`function ${action.func}`]);
|
|
821
887
|
const encodedData = iface.encodeFunctionData(action.func, executable.args);
|
|
822
888
|
const tx = {
|
|
823
889
|
to: executable.destination,
|
|
@@ -829,6 +895,50 @@ var WarpEvmExecutor = class {
|
|
|
829
895
|
throw new Error(`WarpEvmExecutor: Failed to encode function data for ${action.func}: ${error}`);
|
|
830
896
|
}
|
|
831
897
|
}
|
|
898
|
+
async createTokenTransferTransaction(executable, userWallet) {
|
|
899
|
+
if (executable.transfers.length === 0) {
|
|
900
|
+
throw new Error("WarpEvmExecutor: No transfers provided");
|
|
901
|
+
}
|
|
902
|
+
if (!this.chain.nativeToken?.identifier) {
|
|
903
|
+
throw new Error("WarpEvmExecutor: No native token defined for this chain");
|
|
904
|
+
}
|
|
905
|
+
const nativeTokenTransfers = executable.transfers.filter((transfer) => transfer.identifier === this.chain.nativeToken.identifier);
|
|
906
|
+
const erc20Transfers = executable.transfers.filter((transfer) => transfer.identifier !== this.chain.nativeToken.identifier);
|
|
907
|
+
if (nativeTokenTransfers.length === 1 && erc20Transfers.length === 0) {
|
|
908
|
+
const transfer = nativeTokenTransfers[0];
|
|
909
|
+
if (transfer.amount <= 0n) {
|
|
910
|
+
throw new Error("WarpEvmExecutor: Native token transfer amount must be positive");
|
|
911
|
+
}
|
|
912
|
+
const tx = {
|
|
913
|
+
to: executable.destination,
|
|
914
|
+
value: transfer.amount,
|
|
915
|
+
data: "0x"
|
|
916
|
+
};
|
|
917
|
+
return this.estimateGasAndSetDefaults(tx, userWallet);
|
|
918
|
+
}
|
|
919
|
+
if (nativeTokenTransfers.length === 0 && erc20Transfers.length === 1) {
|
|
920
|
+
return this.createSingleTokenTransfer(executable, erc20Transfers[0], userWallet);
|
|
921
|
+
}
|
|
922
|
+
if (executable.transfers.length > 1) {
|
|
923
|
+
throw new Error("WarpEvmExecutor: Multiple token transfers not yet supported");
|
|
924
|
+
}
|
|
925
|
+
throw new Error("WarpEvmExecutor: Invalid transfer configuration");
|
|
926
|
+
}
|
|
927
|
+
async createSingleTokenTransfer(executable, transfer, userWallet) {
|
|
928
|
+
if (!ethers4.isAddress(transfer.identifier)) {
|
|
929
|
+
throw new Error(`WarpEvmExecutor: Invalid token address: ${transfer.identifier}`);
|
|
930
|
+
}
|
|
931
|
+
const transferInterface = new ethers4.Interface(["function transfer(address to, uint256 amount) returns (bool)"]);
|
|
932
|
+
const encodedData = transferInterface.encodeFunctionData("transfer", [executable.destination, transfer.amount]);
|
|
933
|
+
const tx = {
|
|
934
|
+
to: transfer.identifier,
|
|
935
|
+
// Token contract address
|
|
936
|
+
value: 0n,
|
|
937
|
+
// No native token value for ERC-20 transfers
|
|
938
|
+
data: encodedData
|
|
939
|
+
};
|
|
940
|
+
return this.estimateGasAndSetDefaults(tx, userWallet);
|
|
941
|
+
}
|
|
832
942
|
async executeQuery(executable) {
|
|
833
943
|
const action = getWarpActionByIndex(executable.warp, executable.action);
|
|
834
944
|
if (action.type !== "query") {
|
|
@@ -837,11 +947,11 @@ var WarpEvmExecutor = class {
|
|
|
837
947
|
if (!action.func) {
|
|
838
948
|
throw new Error("WarpEvmExecutor: Query action must have a function name");
|
|
839
949
|
}
|
|
840
|
-
if (!
|
|
950
|
+
if (!ethers4.isAddress(executable.destination)) {
|
|
841
951
|
throw new Error(`WarpEvmExecutor: Invalid contract address for query: ${executable.destination}`);
|
|
842
952
|
}
|
|
843
953
|
try {
|
|
844
|
-
const iface = new
|
|
954
|
+
const iface = new ethers4.Interface([`function ${action.func}`]);
|
|
845
955
|
const encodedData = iface.encodeFunctionData(action.func, executable.args);
|
|
846
956
|
const result = await this.provider.call({
|
|
847
957
|
to: executable.destination,
|
|
@@ -849,7 +959,7 @@ var WarpEvmExecutor = class {
|
|
|
849
959
|
});
|
|
850
960
|
const decodedResult = iface.decodeFunctionResult(action.func, result);
|
|
851
961
|
const isSuccess = true;
|
|
852
|
-
const { values, results } = await this.results.extractQueryResults(
|
|
962
|
+
const { values, valuesRaw, results } = await this.results.extractQueryResults(
|
|
853
963
|
executable.warp,
|
|
854
964
|
decodedResult,
|
|
855
965
|
executable.action,
|
|
@@ -865,6 +975,7 @@ var WarpEvmExecutor = class {
|
|
|
865
975
|
tx: null,
|
|
866
976
|
next,
|
|
867
977
|
values,
|
|
978
|
+
valuesRaw,
|
|
868
979
|
results,
|
|
869
980
|
messages: applyResultsToMessages(executable.warp, results)
|
|
870
981
|
};
|
|
@@ -878,37 +989,14 @@ var WarpEvmExecutor = class {
|
|
|
878
989
|
tx: null,
|
|
879
990
|
next: null,
|
|
880
991
|
values: [],
|
|
992
|
+
valuesRaw: [],
|
|
881
993
|
results: {},
|
|
882
994
|
messages: {}
|
|
883
995
|
};
|
|
884
996
|
}
|
|
885
997
|
}
|
|
886
998
|
async preprocessInput(chain, input, type, value) {
|
|
887
|
-
|
|
888
|
-
switch (type) {
|
|
889
|
-
case "address":
|
|
890
|
-
if (!ethers3.isAddress(typedValue)) {
|
|
891
|
-
throw new Error(`Invalid address format: ${typedValue}`);
|
|
892
|
-
}
|
|
893
|
-
return ethers3.getAddress(typedValue);
|
|
894
|
-
case "hex":
|
|
895
|
-
if (!ethers3.isHexString(typedValue)) {
|
|
896
|
-
throw new Error(`Invalid hex format: ${typedValue}`);
|
|
897
|
-
}
|
|
898
|
-
return typedValue;
|
|
899
|
-
case "uint8":
|
|
900
|
-
case "uint16":
|
|
901
|
-
case "uint32":
|
|
902
|
-
case "uint64":
|
|
903
|
-
case "biguint":
|
|
904
|
-
const bigIntValue = BigInt(typedValue);
|
|
905
|
-
if (bigIntValue < 0) {
|
|
906
|
-
throw new Error(`Negative value not allowed for type ${type}: ${typedValue}`);
|
|
907
|
-
}
|
|
908
|
-
return bigIntValue.toString();
|
|
909
|
-
default:
|
|
910
|
-
return String(typedValue);
|
|
911
|
-
}
|
|
999
|
+
return input;
|
|
912
1000
|
}
|
|
913
1001
|
async estimateGasAndSetDefaults(tx, from) {
|
|
914
1002
|
try {
|
|
@@ -926,6 +1014,7 @@ var WarpEvmExecutor = class {
|
|
|
926
1014
|
if (feeData.maxFeePerGas && feeData.maxPriorityFeePerGas) {
|
|
927
1015
|
return {
|
|
928
1016
|
...tx,
|
|
1017
|
+
chainId: BigInt(this.chain.chainId),
|
|
929
1018
|
gasLimit: gasEstimate,
|
|
930
1019
|
maxFeePerGas: feeData.maxFeePerGas,
|
|
931
1020
|
maxPriorityFeePerGas: feeData.maxPriorityFeePerGas
|
|
@@ -933,32 +1022,53 @@ var WarpEvmExecutor = class {
|
|
|
933
1022
|
} else if (feeData.gasPrice) {
|
|
934
1023
|
return {
|
|
935
1024
|
...tx,
|
|
1025
|
+
chainId: BigInt(this.chain.chainId),
|
|
936
1026
|
gasLimit: gasEstimate,
|
|
937
1027
|
gasPrice: feeData.gasPrice
|
|
938
1028
|
};
|
|
939
1029
|
} else {
|
|
940
1030
|
return {
|
|
941
1031
|
...tx,
|
|
1032
|
+
chainId: BigInt(this.chain.chainId),
|
|
942
1033
|
gasLimit: gasEstimate,
|
|
943
|
-
gasPrice:
|
|
1034
|
+
gasPrice: ethers4.parseUnits(WarpEvmConstants.GasPrice.Default, "wei")
|
|
944
1035
|
};
|
|
945
1036
|
}
|
|
946
1037
|
} catch (error) {
|
|
947
1038
|
let defaultGasLimit = BigInt(WarpEvmConstants.GasLimit.Default);
|
|
948
1039
|
if (tx.data && tx.data !== "0x") {
|
|
949
|
-
|
|
1040
|
+
if (tx.data.startsWith("0xa9059cbb")) {
|
|
1041
|
+
defaultGasLimit = BigInt(WarpEvmConstants.GasLimit.TokenTransfer);
|
|
1042
|
+
} else {
|
|
1043
|
+
defaultGasLimit = BigInt(WarpEvmConstants.GasLimit.ContractCall);
|
|
1044
|
+
}
|
|
950
1045
|
} else {
|
|
951
1046
|
defaultGasLimit = BigInt(WarpEvmConstants.GasLimit.Transfer);
|
|
952
1047
|
}
|
|
953
1048
|
return {
|
|
954
1049
|
...tx,
|
|
1050
|
+
chainId: BigInt(this.chain.chainId),
|
|
955
1051
|
gasLimit: defaultGasLimit,
|
|
956
|
-
gasPrice:
|
|
1052
|
+
gasPrice: ethers4.parseUnits(WarpEvmConstants.GasPrice.Default, "wei")
|
|
957
1053
|
};
|
|
958
1054
|
}
|
|
959
1055
|
}
|
|
960
1056
|
async signMessage(message, privateKey) {
|
|
961
|
-
|
|
1057
|
+
try {
|
|
1058
|
+
const wallet = new ethers4.Wallet(privateKey);
|
|
1059
|
+
const signature = await wallet.signMessage(message);
|
|
1060
|
+
return signature;
|
|
1061
|
+
} catch (error) {
|
|
1062
|
+
throw new Error(`Failed to sign message: ${error}`);
|
|
1063
|
+
}
|
|
1064
|
+
}
|
|
1065
|
+
async verifyMessage(message, signature) {
|
|
1066
|
+
try {
|
|
1067
|
+
const recoveredAddress = ethers4.verifyMessage(message, signature);
|
|
1068
|
+
return recoveredAddress;
|
|
1069
|
+
} catch (error) {
|
|
1070
|
+
throw new Error(`Failed to verify message: ${error}`);
|
|
1071
|
+
}
|
|
962
1072
|
}
|
|
963
1073
|
};
|
|
964
1074
|
|
|
@@ -1046,6 +1156,39 @@ var WarpEvmExplorer = class {
|
|
|
1046
1156
|
});
|
|
1047
1157
|
return urls;
|
|
1048
1158
|
}
|
|
1159
|
+
getAssetUrls(identifier) {
|
|
1160
|
+
const explorers = this.getAllExplorers();
|
|
1161
|
+
const urls = {};
|
|
1162
|
+
explorers.forEach((explorer) => {
|
|
1163
|
+
const url = ExplorerUrls[explorer];
|
|
1164
|
+
if (url) {
|
|
1165
|
+
urls[explorer] = `${url}/token/${identifier}`;
|
|
1166
|
+
}
|
|
1167
|
+
});
|
|
1168
|
+
return urls;
|
|
1169
|
+
}
|
|
1170
|
+
getContractUrls(address) {
|
|
1171
|
+
const explorers = this.getAllExplorers();
|
|
1172
|
+
const urls = {};
|
|
1173
|
+
explorers.forEach((explorer) => {
|
|
1174
|
+
const url = ExplorerUrls[explorer];
|
|
1175
|
+
if (url) {
|
|
1176
|
+
urls[explorer] = `${url}/address/${address}`;
|
|
1177
|
+
}
|
|
1178
|
+
});
|
|
1179
|
+
return urls;
|
|
1180
|
+
}
|
|
1181
|
+
getBlockUrls(blockNumber) {
|
|
1182
|
+
const explorers = this.getAllExplorers();
|
|
1183
|
+
const urls = {};
|
|
1184
|
+
explorers.forEach((explorer) => {
|
|
1185
|
+
const url = ExplorerUrls[explorer];
|
|
1186
|
+
if (url) {
|
|
1187
|
+
urls[explorer] = `${url}/block/${blockNumber}`;
|
|
1188
|
+
}
|
|
1189
|
+
});
|
|
1190
|
+
return urls;
|
|
1191
|
+
}
|
|
1049
1192
|
};
|
|
1050
1193
|
|
|
1051
1194
|
// src/chains/common.ts
|
|
@@ -1058,7 +1201,7 @@ var createEvmAdapter = (chainName, chainPrefix, chainInfos) => {
|
|
|
1058
1201
|
prefix: chainPrefix,
|
|
1059
1202
|
builder: () => fallback.builder(),
|
|
1060
1203
|
executor: new WarpEvmExecutor(config, chainInfos[config.env]),
|
|
1061
|
-
results: new WarpEvmResults(config),
|
|
1204
|
+
results: new WarpEvmResults(config, chainInfos[config.env]),
|
|
1062
1205
|
serializer: new WarpEvmSerializer(),
|
|
1063
1206
|
registry: fallback.registry,
|
|
1064
1207
|
explorer: new WarpEvmExplorer(chainInfos[config.env], config),
|
|
@@ -1070,54 +1213,55 @@ var createEvmAdapter = (chainName, chainPrefix, chainInfos) => {
|
|
|
1070
1213
|
};
|
|
1071
1214
|
|
|
1072
1215
|
// src/chains/arbitrum.ts
|
|
1073
|
-
var ChainNameArbitrum = "arbitrum";
|
|
1074
1216
|
var NativeTokenArb = {
|
|
1217
|
+
chain: WarpChainName.Arbitrum,
|
|
1075
1218
|
identifier: "ARB",
|
|
1076
1219
|
name: "ARB",
|
|
1077
1220
|
decimals: 18,
|
|
1078
1221
|
logoUrl: "https://vleap.ai/images/tokens/arb.svg"
|
|
1079
1222
|
};
|
|
1080
|
-
var getArbitrumAdapter = createEvmAdapter(
|
|
1081
|
-
|
|
1082
|
-
name:
|
|
1083
|
-
displayName: "Arbitrum
|
|
1084
|
-
chainId: "
|
|
1223
|
+
var getArbitrumAdapter = createEvmAdapter(WarpChainName.Arbitrum, "arb", {
|
|
1224
|
+
mainnet: {
|
|
1225
|
+
name: WarpChainName.Arbitrum,
|
|
1226
|
+
displayName: "Arbitrum",
|
|
1227
|
+
chainId: "42161",
|
|
1085
1228
|
blockTime: 1e3,
|
|
1086
1229
|
addressHrp: "0x",
|
|
1087
|
-
defaultApiUrl: "https://
|
|
1230
|
+
defaultApiUrl: "https://arb1.arbitrum.io/rpc",
|
|
1088
1231
|
nativeToken: NativeTokenArb
|
|
1089
1232
|
},
|
|
1090
1233
|
testnet: {
|
|
1091
|
-
name:
|
|
1092
|
-
displayName: "Arbitrum
|
|
1093
|
-
chainId: "
|
|
1234
|
+
name: WarpChainName.Arbitrum,
|
|
1235
|
+
displayName: "Arbitrum Sepolia",
|
|
1236
|
+
chainId: "421614",
|
|
1094
1237
|
blockTime: 1e3,
|
|
1095
1238
|
addressHrp: "0x",
|
|
1096
|
-
defaultApiUrl: "https://
|
|
1239
|
+
defaultApiUrl: "https://sepolia-rollup.arbitrum.io/rpc",
|
|
1097
1240
|
nativeToken: NativeTokenArb
|
|
1098
1241
|
},
|
|
1099
|
-
|
|
1100
|
-
name:
|
|
1101
|
-
displayName: "Arbitrum",
|
|
1102
|
-
chainId: "
|
|
1242
|
+
devnet: {
|
|
1243
|
+
name: WarpChainName.Arbitrum,
|
|
1244
|
+
displayName: "Arbitrum Sepolia",
|
|
1245
|
+
chainId: "421614",
|
|
1103
1246
|
blockTime: 1e3,
|
|
1104
1247
|
addressHrp: "0x",
|
|
1105
|
-
defaultApiUrl: "https://
|
|
1248
|
+
defaultApiUrl: "https://sepolia-rollup.arbitrum.io/rpc",
|
|
1106
1249
|
nativeToken: NativeTokenArb
|
|
1107
1250
|
}
|
|
1108
1251
|
});
|
|
1109
1252
|
|
|
1110
1253
|
// src/chains/base.ts
|
|
1111
|
-
|
|
1254
|
+
import { WarpChainName as WarpChainName2 } from "@vleap/warps";
|
|
1112
1255
|
var NativeTokenBase = {
|
|
1256
|
+
chain: WarpChainName2.Base,
|
|
1113
1257
|
identifier: "ETH",
|
|
1114
1258
|
name: "ETH",
|
|
1115
1259
|
decimals: 18,
|
|
1116
1260
|
logoUrl: "https://vleap.ai/images/tokens/eth.svg"
|
|
1117
1261
|
};
|
|
1118
|
-
var getBaseAdapter = createEvmAdapter(
|
|
1262
|
+
var getBaseAdapter = createEvmAdapter(WarpChainName2.Base, "base", {
|
|
1119
1263
|
mainnet: {
|
|
1120
|
-
name:
|
|
1264
|
+
name: WarpChainName2.Base,
|
|
1121
1265
|
displayName: "Base",
|
|
1122
1266
|
chainId: "8453",
|
|
1123
1267
|
blockTime: 2e3,
|
|
@@ -1126,17 +1270,17 @@ var getBaseAdapter = createEvmAdapter(ChainNameBase, "base", {
|
|
|
1126
1270
|
nativeToken: NativeTokenBase
|
|
1127
1271
|
},
|
|
1128
1272
|
testnet: {
|
|
1129
|
-
name:
|
|
1130
|
-
displayName: "Base
|
|
1131
|
-
chainId: "
|
|
1273
|
+
name: WarpChainName2.Base,
|
|
1274
|
+
displayName: "Base Sepolia",
|
|
1275
|
+
chainId: "84532",
|
|
1132
1276
|
blockTime: 2e3,
|
|
1133
1277
|
addressHrp: "0x",
|
|
1134
|
-
defaultApiUrl: "https://
|
|
1278
|
+
defaultApiUrl: "https://sepolia.base.org",
|
|
1135
1279
|
nativeToken: NativeTokenBase
|
|
1136
1280
|
},
|
|
1137
1281
|
devnet: {
|
|
1138
|
-
name:
|
|
1139
|
-
displayName: "Base
|
|
1282
|
+
name: WarpChainName2.Base,
|
|
1283
|
+
displayName: "Base Sepolia",
|
|
1140
1284
|
chainId: "84532",
|
|
1141
1285
|
blockTime: 2e3,
|
|
1142
1286
|
addressHrp: "0x",
|
|
@@ -1145,40 +1289,44 @@ var getBaseAdapter = createEvmAdapter(ChainNameBase, "base", {
|
|
|
1145
1289
|
}
|
|
1146
1290
|
});
|
|
1147
1291
|
|
|
1292
|
+
// src/chains/combined.ts
|
|
1293
|
+
import { WarpChainName as WarpChainName4 } from "@vleap/warps";
|
|
1294
|
+
|
|
1148
1295
|
// src/chains/ethereum.ts
|
|
1149
|
-
|
|
1296
|
+
import { WarpChainName as WarpChainName3 } from "@vleap/warps";
|
|
1150
1297
|
var NativeTokenEth = {
|
|
1298
|
+
chain: WarpChainName3.Ethereum,
|
|
1151
1299
|
identifier: "ETH",
|
|
1152
1300
|
name: "ETH",
|
|
1153
1301
|
decimals: 18,
|
|
1154
1302
|
logoUrl: "https://vleap.ai/images/tokens/eth.svg"
|
|
1155
1303
|
};
|
|
1156
|
-
var getEthereumAdapter = createEvmAdapter(
|
|
1157
|
-
|
|
1158
|
-
name:
|
|
1159
|
-
displayName: "Ethereum
|
|
1160
|
-
chainId: "
|
|
1304
|
+
var getEthereumAdapter = createEvmAdapter(WarpChainName3.Ethereum, "eth", {
|
|
1305
|
+
mainnet: {
|
|
1306
|
+
name: WarpChainName3.Ethereum,
|
|
1307
|
+
displayName: "Ethereum Mainnet",
|
|
1308
|
+
chainId: "1",
|
|
1161
1309
|
blockTime: 12e3,
|
|
1162
1310
|
addressHrp: "0x",
|
|
1163
|
-
defaultApiUrl: "https://ethereum-
|
|
1311
|
+
defaultApiUrl: "https://ethereum-rpc.publicnode.com",
|
|
1164
1312
|
nativeToken: NativeTokenEth
|
|
1165
1313
|
},
|
|
1166
1314
|
testnet: {
|
|
1167
|
-
name:
|
|
1168
|
-
displayName: "Ethereum
|
|
1315
|
+
name: WarpChainName3.Ethereum,
|
|
1316
|
+
displayName: "Ethereum Sepolia",
|
|
1169
1317
|
chainId: "11155111",
|
|
1170
1318
|
blockTime: 12e3,
|
|
1171
1319
|
addressHrp: "0x",
|
|
1172
1320
|
defaultApiUrl: "https://ethereum-sepolia-rpc.publicnode.com",
|
|
1173
1321
|
nativeToken: NativeTokenEth
|
|
1174
1322
|
},
|
|
1175
|
-
|
|
1176
|
-
name:
|
|
1177
|
-
displayName: "Ethereum
|
|
1178
|
-
chainId: "
|
|
1323
|
+
devnet: {
|
|
1324
|
+
name: WarpChainName3.Ethereum,
|
|
1325
|
+
displayName: "Ethereum Sepolia",
|
|
1326
|
+
chainId: "11155111",
|
|
1179
1327
|
blockTime: 12e3,
|
|
1180
1328
|
addressHrp: "0x",
|
|
1181
|
-
defaultApiUrl: "https://ethereum-rpc.publicnode.com",
|
|
1329
|
+
defaultApiUrl: "https://ethereum-sepolia-rpc.publicnode.com",
|
|
1182
1330
|
nativeToken: NativeTokenEth
|
|
1183
1331
|
}
|
|
1184
1332
|
});
|
|
@@ -1189,24 +1337,24 @@ var getAllEvmAdapters = (config, fallback) => [
|
|
|
1189
1337
|
getArbitrumAdapter(config, fallback),
|
|
1190
1338
|
getBaseAdapter(config, fallback)
|
|
1191
1339
|
];
|
|
1192
|
-
var getAllEvmChainNames = () => [
|
|
1340
|
+
var getAllEvmChainNames = () => [WarpChainName4.Ethereum, WarpChainName4.Base, WarpChainName4.Arbitrum];
|
|
1193
1341
|
export {
|
|
1194
1342
|
ArbitrumExplorers,
|
|
1195
1343
|
BaseExplorers,
|
|
1196
|
-
ChainNameArbitrum,
|
|
1197
|
-
ChainNameBase,
|
|
1198
|
-
ChainNameEthereum,
|
|
1199
1344
|
EthereumExplorers,
|
|
1200
1345
|
EvmExplorers,
|
|
1346
|
+
EvmLogoService,
|
|
1201
1347
|
ExplorerUrls,
|
|
1202
1348
|
NativeTokenArb,
|
|
1203
1349
|
NativeTokenBase,
|
|
1204
1350
|
NativeTokenEth,
|
|
1205
1351
|
WarpEvmConstants,
|
|
1352
|
+
WarpEvmDataLoader,
|
|
1206
1353
|
WarpEvmExecutor,
|
|
1207
1354
|
WarpEvmExplorer,
|
|
1208
1355
|
WarpEvmResults,
|
|
1209
1356
|
WarpEvmSerializer,
|
|
1357
|
+
createEvmAdapter,
|
|
1210
1358
|
getAllEvmAdapters,
|
|
1211
1359
|
getAllEvmChainNames,
|
|
1212
1360
|
getArbitrumAdapter,
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/WarpEvmDataLoader.ts","../src/LogoService.ts","../src/WarpEvmExecutor.ts","../src/constants.ts","../src/WarpEvmResults.ts","../src/WarpEvmSerializer.ts","../src/WarpEvmExplorer.ts","../src/chains/common.ts","../src/chains/arbitrum.ts","../src/chains/base.ts","../src/chains/ethereum.ts","../src/chains/combined.ts"],"sourcesContent":["import { AdapterWarpDataLoader, getProviderUrl, WarpChainAccount, WarpChainAsset, WarpChainInfo, WarpClientConfig } from '@vleap/warps'\nimport { ethers } from 'ethers'\nimport { EvmLogoService } from './LogoService'\n\n// ERC20 ABI for token interactions\nconst ERC20_ABI = [\n 'function balanceOf(address owner) view returns (uint256)',\n 'function decimals() view returns (uint8)',\n 'function name() view returns (string)',\n 'function symbol() view returns (string)',\n 'function totalSupply() view returns (uint256)',\n]\n\n// ERC20 Transfer event for token detection\nconst ERC20_TRANSFER_EVENT = 'event Transfer(address indexed from, address indexed to, uint256 value)'\n\n// Known token lists for popular chains\nconst KNOWN_TOKENS: Record<string, Record<string, { name: string; symbol: string; decimals: number; logoUrl?: string }>> = {\n ethereum: {\n '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48': {\n name: 'USD Coin',\n symbol: 'USDC',\n decimals: 6,\n logoUrl: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png',\n },\n '0xdAC17F958D2ee523a2206206994597C13D831ec7': {\n name: 'Tether USD',\n symbol: 'USDT',\n decimals: 6,\n logoUrl: 'https://assets.coingecko.com/coins/images/325/small/Tether.png',\n },\n '0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599': {\n name: 'Wrapped Bitcoin',\n symbol: 'WBTC',\n decimals: 8,\n logoUrl: 'https://assets.coingecko.com/coins/images/7598/small/wrapped_bitcoin_wbtc.png',\n },\n '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2': {\n name: 'Wrapped Ether',\n symbol: 'WETH',\n decimals: 18,\n logoUrl: 'https://assets.coingecko.com/coins/images/2518/small/weth.png',\n },\n '0x6B175474E89094C44Da98b954EedeAC495271d0F': {\n name: 'Dai Stablecoin',\n symbol: 'DAI',\n decimals: 18,\n logoUrl: 'https://assets.coingecko.com/coins/images/9956/small/4943.png',\n },\n // Sepolia testnet tokens\n '0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238': {\n name: 'USD Coin',\n symbol: 'USDC',\n decimals: 6,\n logoUrl: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png',\n },\n '0x7169D38820dfd117C3FA1f22a697dBA58d90BA06': {\n name: 'Tether USD',\n symbol: 'USDT',\n decimals: 6,\n logoUrl: 'https://assets.coingecko.com/coins/images/325/small/Tether.png',\n },\n '0x7b79995e5f793A07Bc00c21412e50Ecae098E7f9': {\n name: 'Wrapped Ether',\n symbol: 'WETH',\n decimals: 18,\n logoUrl: 'https://assets.coingecko.com/coins/images/2518/small/weth.png',\n },\n },\n arbitrum: {\n '0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8': {\n name: 'USD Coin',\n symbol: 'USDC',\n decimals: 6,\n logoUrl: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png',\n },\n '0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9': {\n name: 'Tether USD',\n symbol: 'USDT',\n decimals: 6,\n logoUrl: 'https://assets.coingecko.com/coins/images/325/small/Tether.png',\n },\n '0x82aF49447D8a07e3bd95BD0d56f35241523fBab1': {\n name: 'Wrapped Ether',\n symbol: 'WETH',\n decimals: 18,\n logoUrl: 'https://assets.coingecko.com/coins/images/2518/small/weth.png',\n },\n },\n base: {\n '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913': {\n name: 'USD Coin',\n symbol: 'USDC',\n decimals: 6,\n logoUrl: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png',\n },\n '0x4200000000000000000000000000000000000006': {\n name: 'Wrapped Ether',\n symbol: 'WETH',\n decimals: 18,\n logoUrl: 'https://assets.coingecko.com/coins/images/2518/small/weth.png',\n },\n '0x036CbD53842c5426634e7929541eC2318f3dCF7e': {\n name: 'USD Coin',\n symbol: 'USDC',\n decimals: 6,\n logoUrl: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png',\n },\n '0x808456652fdb597867f38412077A9182bf77359F': {\n name: 'Euro Coin',\n symbol: 'EURC',\n decimals: 6,\n logoUrl: 'https://assets.coingecko.com/coins/images/3318/small/euro-coin.png',\n },\n '0xcbB7C0006F23900c38EB856149F799620fcb8A4a': {\n name: 'Coinbase Wrapped BTC',\n symbol: 'CBETH',\n decimals: 8,\n logoUrl: 'https://assets.coingecko.com/coins/images/7598/small/wrapped_bitcoin_wbtc.png',\n },\n },\n}\n\ninterface TokenMetadata {\n name: string\n symbol: string\n decimals: number\n logoUrl?: string\n}\n\ninterface TokenBalance {\n tokenAddress: string\n balance: bigint\n metadata: TokenMetadata\n}\n\nexport class WarpEvmDataLoader implements AdapterWarpDataLoader {\n private provider: ethers.JsonRpcProvider\n\n constructor(\n private readonly config: WarpClientConfig,\n private readonly chain: WarpChainInfo\n ) {\n const apiUrl = getProviderUrl(this.config, this.chain.name, this.config.env, this.chain.defaultApiUrl)\n this.provider = new ethers.JsonRpcProvider(apiUrl)\n }\n\n async getAccount(address: string): Promise<WarpChainAccount> {\n try {\n const balance = await this.provider.getBalance(address)\n\n return {\n address,\n balance,\n }\n } catch (error) {\n throw new Error(`Failed to get account balance for ${address}: ${error}`)\n }\n }\n\n async getAccountAssets(address: string): Promise<WarpChainAsset[]> {\n try {\n const assets: WarpChainAsset[] = []\n\n // Get ERC20 token balances\n const tokenBalances = await this.getERC20TokenBalances(address)\n\n for (const tokenBalance of tokenBalances) {\n if (tokenBalance.balance > 0n) {\n const logoUrl =\n tokenBalance.metadata.logoUrl ||\n (await EvmLogoService.getLogoUrl(\n this.chain.name,\n tokenBalance.tokenAddress,\n tokenBalance.metadata.name,\n tokenBalance.metadata.symbol\n ))\n\n assets.push({\n identifier: tokenBalance.tokenAddress,\n name: tokenBalance.metadata.name,\n amount: tokenBalance.balance,\n decimals: tokenBalance.metadata.decimals,\n logoUrl: logoUrl || '',\n })\n }\n }\n\n return assets\n } catch (error) {\n throw new Error(`Failed to get account assets for ${address}: ${error}`)\n }\n }\n\n private async getERC20TokenBalances(address: string): Promise<TokenBalance[]> {\n const tokenBalances: TokenBalance[] = []\n\n // Get known tokens for this chain\n const knownTokens = KNOWN_TOKENS[this.chain.name] || {}\n\n // Process known tokens first\n for (const [tokenAddress, metadata] of Object.entries(knownTokens)) {\n try {\n const balance = await this.getTokenBalance(address, tokenAddress)\n if (balance > 0n) {\n tokenBalances.push({\n tokenAddress,\n balance,\n metadata,\n })\n }\n } catch (error) {\n // Skip tokens that fail to load\n }\n }\n\n // Try to detect additional tokens from transfer events\n const additionalTokens = await this.detectTokensFromEvents(address)\n for (const tokenAddress of additionalTokens) {\n if (!knownTokens[tokenAddress]) {\n try {\n const metadata = await this.getTokenMetadata(tokenAddress)\n const balance = await this.getTokenBalance(address, tokenAddress)\n if (balance > 0n) {\n tokenBalances.push({\n tokenAddress,\n balance,\n metadata,\n })\n }\n } catch (error) {\n // Skip tokens that fail to load\n }\n }\n }\n\n return tokenBalances\n }\n\n private async getTokenBalance(address: string, tokenAddress: string): Promise<bigint> {\n try {\n const contract = new ethers.Contract(tokenAddress, ERC20_ABI, this.provider)\n const balance = await contract.balanceOf(address)\n return balance\n } catch (error) {\n throw new Error(`Failed to get token balance: ${error}`)\n }\n }\n\n private async getTokenMetadata(tokenAddress: string): Promise<TokenMetadata> {\n try {\n const tokenInfo = await EvmLogoService.getTokenInfo(this.chain.name, tokenAddress)\n\n if (tokenInfo.name && tokenInfo.symbol && tokenInfo.decimals !== undefined) {\n return {\n name: tokenInfo.name,\n symbol: tokenInfo.symbol,\n decimals: tokenInfo.decimals,\n logoUrl: tokenInfo.logoURI,\n }\n }\n\n const contract = new ethers.Contract(tokenAddress, ERC20_ABI, this.provider)\n const [name, symbol, decimals] = await Promise.all([\n contract.name().catch(() => tokenInfo.name || 'Unknown Token'),\n contract.symbol().catch(() => tokenInfo.symbol || 'UNKNOWN'),\n contract.decimals().catch(() => tokenInfo.decimals || 18),\n ])\n\n return {\n name: name || tokenInfo.name || 'Unknown Token',\n symbol: symbol || tokenInfo.symbol || 'UNKNOWN',\n decimals: decimals || tokenInfo.decimals || 18,\n logoUrl: tokenInfo.logoURI,\n }\n } catch (error) {\n throw new Error(`Failed to get token metadata: ${error}`)\n }\n }\n\n private async detectTokensFromEvents(address: string): Promise<string[]> {\n try {\n // Get recent blocks to scan for transfer events\n const currentBlock = await this.provider.getBlockNumber()\n const fromBlock = Math.max(0, currentBlock - 10000) // Scan last 10k blocks\n\n // Create filter for Transfer events where the address is the recipient\n const filter = {\n fromBlock,\n toBlock: currentBlock,\n topics: [\n ethers.id('Transfer(address,address,uint256)'),\n null, // from address (any)\n ethers.zeroPadValue(address, 32), // to address (our target)\n ],\n }\n\n const logs = await this.provider.getLogs(filter)\n\n // Extract unique token addresses from transfer events\n const tokenAddresses = new Set<string>()\n for (const log of logs) {\n tokenAddresses.add(log.address)\n }\n\n return Array.from(tokenAddresses)\n } catch (error) {\n return []\n }\n }\n\n // Additional utility methods for enhanced token support\n async getTokenInfo(tokenAddress: string): Promise<TokenMetadata | null> {\n try {\n return await this.getTokenMetadata(tokenAddress)\n } catch (error) {\n console.warn(`Failed to get token info for ${tokenAddress}: ${error}`)\n return null\n }\n }\n\n async getTokenBalanceForAddress(address: string, tokenAddress: string): Promise<bigint> {\n try {\n return await this.getTokenBalance(address, tokenAddress)\n } catch (error) {\n throw new Error(`Failed to get token balance for ${tokenAddress}: ${error}`)\n }\n }\n\n async getMultipleTokenBalances(address: string, tokenAddresses: string[]): Promise<Map<string, bigint>> {\n const balances = new Map<string, bigint>()\n\n await Promise.all(\n tokenAddresses.map(async (tokenAddress) => {\n try {\n const balance = await this.getTokenBalance(address, tokenAddress)\n balances.set(tokenAddress, balance)\n } catch (error) {\n console.warn(`Failed to get balance for token ${tokenAddress}: ${error}`)\n balances.set(tokenAddress, 0n)\n }\n })\n )\n\n return balances\n }\n}\n","interface TokenInfo {\n name?: string\n symbol?: string\n logoURI?: string\n decimals?: number\n}\n\ninterface TokenListResponse {\n tokens: Array<{\n chainId: number\n address: string\n name: string\n symbol: string\n decimals: number\n logoURI?: string\n }>\n}\n\nconst CHAIN_IDS: Record<string, number> = {\n ethereum: 1,\n arbitrum: 42161,\n base: 8453,\n}\n\nconst FALLBACK_LOGOS: Record<string, Record<string, string>> = {\n ethereum: {\n '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48': 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png',\n '0xdAC17F958D2ee523a2206206994597C13D831ec7': 'https://assets.coingecko.com/coins/images/325/small/Tether.png',\n '0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599': 'https://assets.coingecko.com/coins/images/7598/small/wrapped_bitcoin_wbtc.png',\n '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2': 'https://assets.coingecko.com/coins/images/2518/small/weth.png',\n '0x6B175474E89094C44Da98b954EedeAC495271d0F': 'https://assets.coingecko.com/coins/images/9956/small/4943.png',\n },\n arbitrum: {\n '0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8': 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png',\n '0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9': 'https://assets.coingecko.com/coins/images/325/small/Tether.png',\n '0x82aF49447D8a07e3bd95BD0d56f35241523fBab1': 'https://assets.coingecko.com/coins/images/2518/small/weth.png',\n },\n base: {\n '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913': 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png',\n '0x4200000000000000000000000000000000000006': 'https://assets.coingecko.com/coins/images/2518/small/weth.png',\n '0x036CbD53842c5426634e7929541eC2318f3dCF7e': 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png',\n '0x808456652fdb597867f38412077A9182bf77359F': 'https://assets.coingecko.com/coins/images/3318/small/euro-coin.png',\n '0xcbB7C0006F23900c38EB856149F799620fcb8A4a': 'https://assets.coingecko.com/coins/images/7598/small/wrapped_bitcoin_wbtc.png',\n },\n}\n\nconst TOKEN_LISTS = [\n 'https://tokens.uniswap.org',\n 'https://raw.githubusercontent.com/compound-finance/token-list/master/compound.tokenlist.json',\n 'https://tokens.1inch.io',\n]\n\nconst logoCache = new Map<string, string>()\nconst tokenInfoCache = new Map<string, TokenInfo>()\nconst tokenListCache = new Map<string, TokenInfo>()\n\nexport class EvmLogoService {\n static async getTokenInfo(chainName: string, tokenAddress: string): Promise<TokenInfo> {\n const cacheKey = `${chainName}:${tokenAddress.toLowerCase()}`\n\n if (tokenInfoCache.has(cacheKey)) {\n return tokenInfoCache.get(cacheKey)!\n }\n\n let tokenInfo: TokenInfo = {}\n\n try {\n tokenInfo = await this.fetchFromTokenLists(chainName, tokenAddress)\n } catch (error) {}\n\n if (!tokenInfo.logoURI) {\n try {\n tokenInfo = { ...tokenInfo, ...(await this.fetchFromDefiLlama(chainName, tokenAddress)) }\n } catch (error) {}\n }\n\n tokenInfoCache.set(cacheKey, tokenInfo)\n return tokenInfo\n }\n\n static async getLogoUrl(chainName: string, tokenAddress: string, tokenName?: string, tokenSymbol?: string): Promise<string> {\n const cacheKey = `${chainName}:${tokenAddress.toLowerCase()}`\n\n if (logoCache.has(cacheKey)) {\n return logoCache.get(cacheKey)!\n }\n\n let logoUrl = ''\n\n const fallbackLogos = FALLBACK_LOGOS[chainName]\n if (fallbackLogos && fallbackLogos[tokenAddress]) {\n logoUrl = fallbackLogos[tokenAddress]\n } else {\n const tokenInfo = await this.getTokenInfo(chainName, tokenAddress)\n logoUrl = tokenInfo.logoURI || ''\n\n if (!logoUrl && (tokenSymbol || tokenName)) {\n try {\n logoUrl = await this.fetchFromTrustWallet(chainName, tokenAddress)\n } catch (error) {}\n }\n }\n\n logoCache.set(cacheKey, logoUrl)\n return logoUrl\n }\n\n private static async fetchFromTokenLists(chainName: string, tokenAddress: string): Promise<TokenInfo> {\n const chainId = CHAIN_IDS[chainName]\n if (!chainId) return {}\n\n const normalizedAddress = tokenAddress.toLowerCase()\n\n if (tokenListCache.has(`${chainId}:${normalizedAddress}`)) {\n return tokenListCache.get(`${chainId}:${normalizedAddress}`) || {}\n }\n\n for (const tokenListUrl of TOKEN_LISTS) {\n try {\n const response = await fetch(tokenListUrl, {\n headers: { Accept: 'application/json' },\n signal: AbortSignal.timeout(5000),\n })\n\n if (response.ok) {\n const data: TokenListResponse = await response.json()\n\n const token = data.tokens.find((t) => t.chainId === chainId && t.address.toLowerCase() === normalizedAddress)\n\n if (token) {\n const tokenInfo: TokenInfo = {\n name: token.name,\n symbol: token.symbol,\n decimals: token.decimals,\n logoURI: token.logoURI,\n }\n tokenListCache.set(`${chainId}:${normalizedAddress}`, tokenInfo)\n return tokenInfo\n }\n }\n } catch (error) {\n continue\n }\n }\n\n return {}\n }\n\n private static async fetchFromDefiLlama(chainName: string, tokenAddress: string): Promise<TokenInfo> {\n try {\n const chainMapping: Record<string, string> = {\n ethereum: 'ethereum',\n arbitrum: 'arbitrum',\n base: 'base',\n }\n\n const chain = chainMapping[chainName]\n if (!chain) return {}\n\n const response = await fetch(`https://coins.llama.fi/prices/current/${chain}:${tokenAddress}`, { signal: AbortSignal.timeout(5000) })\n\n if (response.ok) {\n const data = await response.json()\n const coinData = data.coins?.[`${chain}:${tokenAddress}`]\n\n if (coinData) {\n return {\n symbol: coinData.symbol,\n logoURI: coinData.logoURI,\n }\n }\n }\n } catch (error) {}\n\n return {}\n }\n\n private static async fetchFromTrustWallet(chainName: string, tokenAddress: string): Promise<string> {\n try {\n const chainMapping: Record<string, string> = {\n ethereum: 'ethereum',\n arbitrum: 'arbitrum',\n base: 'base',\n }\n\n const chain = chainMapping[chainName]\n if (!chain) return ''\n\n const logoUrl = `https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/${chain}/assets/${tokenAddress}/logo.png`\n\n const response = await fetch(logoUrl, {\n method: 'HEAD',\n signal: AbortSignal.timeout(3000),\n })\n\n if (response.ok) {\n return logoUrl\n }\n } catch (error) {}\n\n return ''\n }\n\n static clearCache(): void {\n logoCache.clear()\n tokenInfoCache.clear()\n tokenListCache.clear()\n }\n\n static getCacheSize(): number {\n return logoCache.size + tokenInfoCache.size + tokenListCache.size\n }\n}\n","import {\n AdapterWarpExecutor,\n applyResultsToMessages,\n getNextInfo,\n getProviderUrl,\n getWarpActionByIndex,\n WarpActionInputType,\n WarpChainInfo,\n WarpClientConfig,\n WarpExecutable,\n WarpExecution,\n WarpQueryAction,\n} from '@vleap/warps'\nimport { ethers } from 'ethers'\nimport { WarpEvmConstants } from './constants'\nimport { WarpEvmResults } from './WarpEvmResults'\nimport { WarpEvmSerializer } from './WarpEvmSerializer'\n\nexport class WarpEvmExecutor implements AdapterWarpExecutor {\n private readonly serializer: WarpEvmSerializer\n private readonly provider: ethers.JsonRpcProvider\n private readonly results: WarpEvmResults\n\n constructor(\n private readonly config: WarpClientConfig,\n private readonly chain: WarpChainInfo\n ) {\n this.serializer = new WarpEvmSerializer()\n const apiUrl = getProviderUrl(this.config, chain.name, this.config.env, this.chain.defaultApiUrl)\n this.provider = new ethers.JsonRpcProvider(apiUrl)\n this.results = new WarpEvmResults(config)\n }\n\n async createTransaction(executable: WarpExecutable): Promise<ethers.TransactionRequest> {\n const action = getWarpActionByIndex(executable.warp, executable.action)\n\n let tx: ethers.TransactionRequest | null = null\n if (action.type === 'transfer') {\n tx = await this.createTransferTransaction(executable)\n } else if (action.type === 'contract') {\n tx = await this.createContractCallTransaction(executable)\n } else if (action.type === 'query') {\n throw new Error('WarpEvmExecutor: Invalid action type for createTransaction; Use executeQuery instead')\n } else if (action.type === 'collect') {\n throw new Error('WarpEvmExecutor: Invalid action type for createTransaction; Use executeCollect instead')\n }\n\n if (!tx) throw new Error(`WarpEvmExecutor: Invalid action type (${action.type})`)\n\n return tx\n }\n\n async createTransferTransaction(executable: WarpExecutable): Promise<ethers.TransactionRequest> {\n const userWallet = this.config.user?.wallets?.[executable.chain.name]\n if (!userWallet) throw new Error('WarpEvmExecutor: createTransfer - user address not set')\n\n // Validate destination address\n if (!ethers.isAddress(executable.destination)) {\n throw new Error(`WarpEvmExecutor: Invalid destination address: ${executable.destination}`)\n }\n\n // Validate value\n if (executable.value < 0) {\n throw new Error(`WarpEvmExecutor: Transfer value cannot be negative: ${executable.value}`)\n }\n\n const tx: ethers.TransactionRequest = {\n to: executable.destination,\n value: executable.value,\n data: executable.data ? this.serializer.stringToTyped(executable.data) : '0x',\n }\n\n return this.estimateGasAndSetDefaults(tx, userWallet)\n }\n\n async createContractCallTransaction(executable: WarpExecutable): Promise<ethers.TransactionRequest> {\n const userWallet = this.config.user?.wallets?.[executable.chain.name]\n if (!userWallet) throw new Error('WarpEvmExecutor: createContractCall - user address not set')\n\n const action = getWarpActionByIndex(executable.warp, executable.action)\n if (!action || !('func' in action) || !action.func) {\n throw new Error('WarpEvmExecutor: Contract action must have a function name')\n }\n\n // Validate destination address\n if (!ethers.isAddress(executable.destination)) {\n throw new Error(`WarpEvmExecutor: Invalid contract address: ${executable.destination}`)\n }\n\n // Validate value\n if (executable.value < 0) {\n throw new Error(`WarpEvmExecutor: Contract call value cannot be negative: ${executable.value}`)\n }\n\n try {\n const iface = new ethers.Interface([`function ${action.func}`])\n const encodedData = iface.encodeFunctionData(action.func, executable.args)\n\n const tx: ethers.TransactionRequest = {\n to: executable.destination,\n value: executable.value,\n data: encodedData,\n }\n\n return this.estimateGasAndSetDefaults(tx, userWallet)\n } catch (error) {\n throw new Error(`WarpEvmExecutor: Failed to encode function data for ${action.func}: ${error}`)\n }\n }\n\n async executeQuery(executable: WarpExecutable): Promise<WarpExecution> {\n const action = getWarpActionByIndex(executable.warp, executable.action) as WarpQueryAction\n if (action.type !== 'query') {\n throw new Error(`WarpEvmExecutor: Invalid action type for executeQuery: ${action.type}`)\n }\n if (!action.func) {\n throw new Error('WarpEvmExecutor: Query action must have a function name')\n }\n\n // Validate destination address\n if (!ethers.isAddress(executable.destination)) {\n throw new Error(`WarpEvmExecutor: Invalid contract address for query: ${executable.destination}`)\n }\n\n try {\n const iface = new ethers.Interface([`function ${action.func}`])\n const encodedData = iface.encodeFunctionData(action.func, executable.args)\n\n const result = await this.provider.call({\n to: executable.destination,\n data: encodedData,\n })\n\n const decodedResult = iface.decodeFunctionResult(action.func, result)\n const isSuccess = true\n\n const { values, results } = await this.results.extractQueryResults(\n executable.warp,\n decodedResult,\n executable.action,\n executable.resolvedInputs\n )\n\n const next = getNextInfo(this.config, [], executable.warp, executable.action, results)\n\n return {\n success: isSuccess,\n warp: executable.warp,\n action: executable.action,\n user: this.config.user?.wallets?.[executable.chain.name] || null,\n txHash: null,\n tx: null,\n next,\n values,\n results,\n messages: applyResultsToMessages(executable.warp, results),\n }\n } catch (error) {\n return {\n success: false,\n warp: executable.warp,\n action: executable.action,\n user: this.config.user?.wallets?.[executable.chain.name] || null,\n txHash: null,\n tx: null,\n next: null,\n values: [],\n results: {},\n messages: {},\n }\n }\n }\n\n async preprocessInput(chain: WarpChainInfo, input: string, type: WarpActionInputType, value: string): Promise<string> {\n const typedValue = this.serializer.stringToTyped(value)\n\n switch (type) {\n case 'address':\n if (!ethers.isAddress(typedValue)) {\n throw new Error(`Invalid address format: ${typedValue}`)\n }\n return ethers.getAddress(typedValue)\n case 'hex':\n if (!ethers.isHexString(typedValue)) {\n throw new Error(`Invalid hex format: ${typedValue}`)\n }\n return typedValue\n case 'uint8':\n case 'uint16':\n case 'uint32':\n case 'uint64':\n case 'biguint':\n const bigIntValue = BigInt(typedValue)\n if (bigIntValue < 0) {\n throw new Error(`Negative value not allowed for type ${type}: ${typedValue}`)\n }\n return bigIntValue.toString()\n default:\n return String(typedValue)\n }\n }\n\n private async estimateGasAndSetDefaults(tx: ethers.TransactionRequest, from: string): Promise<ethers.TransactionRequest> {\n try {\n const gasEstimate = await this.provider.estimateGas({\n ...tx,\n from,\n })\n\n // Validate gas estimate\n if (gasEstimate < BigInt(WarpEvmConstants.Validation.MinGasLimit)) {\n throw new Error(`Gas estimate too low: ${gasEstimate}`)\n }\n if (gasEstimate > BigInt(WarpEvmConstants.Validation.MaxGasLimit)) {\n throw new Error(`Gas estimate too high: ${gasEstimate}`)\n }\n\n const feeData = await this.provider.getFeeData()\n\n // Handle both EIP-1559 and legacy gas pricing\n if (feeData.maxFeePerGas && feeData.maxPriorityFeePerGas) {\n // EIP-1559 pricing\n return {\n ...tx,\n gasLimit: gasEstimate,\n maxFeePerGas: feeData.maxFeePerGas,\n maxPriorityFeePerGas: feeData.maxPriorityFeePerGas,\n }\n } else if (feeData.gasPrice) {\n // Legacy pricing\n return {\n ...tx,\n gasLimit: gasEstimate,\n gasPrice: feeData.gasPrice,\n }\n } else {\n // Fallback to default values\n return {\n ...tx,\n gasLimit: gasEstimate,\n gasPrice: ethers.parseUnits(WarpEvmConstants.GasPrice.Default, 'wei'),\n }\n }\n } catch (error) {\n // If gas estimation fails, use default values based on transaction type\n let defaultGasLimit = BigInt(WarpEvmConstants.GasLimit.Default)\n\n // Determine gas limit based on transaction type\n if (tx.data && tx.data !== '0x') {\n defaultGasLimit = BigInt(WarpEvmConstants.GasLimit.ContractCall)\n } else {\n defaultGasLimit = BigInt(WarpEvmConstants.GasLimit.Transfer)\n }\n\n return {\n ...tx,\n gasLimit: defaultGasLimit,\n gasPrice: ethers.parseUnits(WarpEvmConstants.GasPrice.Default, 'wei'),\n }\n }\n }\n\n async signMessage(message: string, privateKey: string): Promise<string> {\n throw new Error('Not implemented')\n }\n}\n","export const WarpEvmConstants = {\n GasLimit: {\n Default: 21000,\n ContractCall: 100000,\n ContractDeploy: 500000,\n Transfer: 21000,\n Approve: 46000,\n Swap: 200000,\n },\n GasPrice: {\n Default: '20000000000',\n },\n Validation: {\n MinGasLimit: 21000,\n MaxGasLimit: 30000000,\n },\n}\n\nexport enum EthereumExplorers {\n Etherscan = 'etherscan',\n EtherscanSepolia = 'etherscan_sepolia',\n Ethplorer = 'ethplorer',\n Blockscout = 'blockscout',\n BlockscoutSepolia = 'blockscout_sepolia',\n}\n\nexport enum ArbitrumExplorers {\n Arbiscan = 'arbiscan',\n ArbiscanSepolia = 'arbiscan_sepolia',\n BlockscoutArbitrum = 'blockscout_arbitrum',\n BlockscoutArbitrumSepolia = 'blockscout_arbitrum_sepolia',\n}\n\nexport enum BaseExplorers {\n Basescan = 'basescan',\n BasescanSepolia = 'basescan_sepolia',\n BlockscoutBase = 'blockscout_base',\n BlockscoutBaseSepolia = 'blockscout_base_sepolia',\n}\n\nexport type ExplorerName = EthereumExplorers | ArbitrumExplorers | BaseExplorers\n\nexport const EvmExplorers = {\n ethereum: {\n mainnet: [EthereumExplorers.Etherscan, EthereumExplorers.Ethplorer, EthereumExplorers.Blockscout] as const,\n testnet: [EthereumExplorers.EtherscanSepolia, EthereumExplorers.BlockscoutSepolia] as const,\n devnet: [EthereumExplorers.EtherscanSepolia, EthereumExplorers.BlockscoutSepolia] as const,\n },\n arbitrum: {\n mainnet: [ArbitrumExplorers.Arbiscan, ArbitrumExplorers.BlockscoutArbitrum] as const,\n testnet: [ArbitrumExplorers.ArbiscanSepolia, ArbitrumExplorers.BlockscoutArbitrumSepolia] as const,\n devnet: [ArbitrumExplorers.ArbiscanSepolia, ArbitrumExplorers.BlockscoutArbitrumSepolia] as const,\n },\n base: {\n mainnet: [BaseExplorers.Basescan, BaseExplorers.BlockscoutBase] as const,\n testnet: [BaseExplorers.BasescanSepolia, BaseExplorers.BlockscoutBaseSepolia] as const,\n devnet: [BaseExplorers.BasescanSepolia, BaseExplorers.BlockscoutBaseSepolia] as const,\n },\n} as const\n\nexport const ExplorerUrls: Record<ExplorerName, string> = {\n [EthereumExplorers.Etherscan]: 'https://etherscan.io',\n [EthereumExplorers.EtherscanSepolia]: 'https://sepolia.etherscan.io',\n [EthereumExplorers.Ethplorer]: 'https://ethplorer.io',\n [EthereumExplorers.Blockscout]: 'https://eth.blockscout.com',\n [EthereumExplorers.BlockscoutSepolia]: 'https://sepolia.blockscout.com',\n\n [ArbitrumExplorers.Arbiscan]: 'https://arbiscan.io',\n [ArbitrumExplorers.ArbiscanSepolia]: 'https://sepolia.arbiscan.io',\n [ArbitrumExplorers.BlockscoutArbitrum]: 'https://arbitrum.blockscout.com',\n [ArbitrumExplorers.BlockscoutArbitrumSepolia]: 'https://sepolia.blockscout.com',\n\n [BaseExplorers.Basescan]: 'https://basescan.org',\n [BaseExplorers.BasescanSepolia]: 'https://sepolia.basescan.org',\n [BaseExplorers.BlockscoutBase]: 'https://base.blockscout.com',\n [BaseExplorers.BlockscoutBaseSepolia]: 'https://sepolia.blockscout.com',\n}\n","import {\n AdapterWarpResults,\n evaluateResultsCommon,\n parseResultsOutIndex,\n ResolvedInput,\n Warp,\n WarpClientConfig,\n WarpConstants,\n WarpExecution,\n WarpExecutionResults,\n} from '@vleap/warps'\nimport { ethers } from 'ethers'\nimport { WarpEvmSerializer } from './WarpEvmSerializer'\n\nexport class WarpEvmResults implements AdapterWarpResults {\n private readonly serializer: WarpEvmSerializer\n\n constructor(private readonly config: WarpClientConfig) {\n this.serializer = new WarpEvmSerializer()\n }\n\n async getTransactionExecutionResults(warp: Warp, tx: ethers.TransactionReceipt): Promise<WarpExecution> {\n const success = tx.status === 1\n const gasUsed = tx.gasUsed?.toString() || '0'\n const gasPrice = tx.gasPrice?.toString() || '0'\n const blockNumber = tx.blockNumber?.toString() || '0'\n const transactionHash = tx.hash\n\n const logs = tx.logs.map((log) => ({\n address: log.address,\n topics: log.topics,\n data: log.data,\n blockNumber: log.blockNumber?.toString() || '0',\n transactionHash: log.transactionHash,\n index: log.index?.toString() || '0',\n }))\n\n return {\n success,\n warp,\n action: 0,\n user: this.config.user?.wallets?.evm || null,\n txHash: transactionHash,\n tx,\n next: null,\n values: [transactionHash, blockNumber, gasUsed, gasPrice, ...(logs.length > 0 ? logs : [])],\n results: {},\n messages: {},\n }\n }\n\n async extractQueryResults(\n warp: Warp,\n typedValues: any[],\n actionIndex: number,\n inputs: ResolvedInput[]\n ): Promise<{ values: any[]; results: WarpExecutionResults }> {\n const values = typedValues.map((t) => this.serializer.typedToString(t))\n const valuesRaw = typedValues.map((t) => this.serializer.typedToNative(t)[1])\n let results: WarpExecutionResults = {}\n\n if (!warp.results) return { values, results }\n\n const getNestedValue = (path: string): unknown => {\n const indices = path\n .split('.')\n .slice(1)\n .map((i) => parseInt(i) - 1)\n if (indices.length === 0) return undefined\n let value: any = valuesRaw[indices[0]]\n for (let i = 1; i < indices.length; i++) {\n if (value === undefined || value === null) return undefined\n value = value[indices[i]]\n }\n return value\n }\n\n for (const [key, path] of Object.entries(warp.results)) {\n if (path.startsWith(WarpConstants.Transform.Prefix)) continue\n const currentActionIndex = parseResultsOutIndex(path)\n if (currentActionIndex !== null && currentActionIndex !== actionIndex) {\n results[key] = null\n continue\n }\n if (path.startsWith('out.') || path === 'out' || path.startsWith('out[')) {\n results[key] = getNestedValue(path) || null\n } else {\n results[key] = path\n }\n }\n\n return { values, results: await evaluateResultsCommon(warp, results, actionIndex, inputs) }\n }\n}\n","import {\n AdapterWarpSerializer,\n BaseWarpActionInputType,\n WarpActionInputType,\n WarpAdapterGenericType,\n WarpConstants,\n WarpNativeValue,\n WarpSerializer,\n} from '@vleap/warps'\nimport { ethers } from 'ethers'\n\nconst SplitParamsRegex = new RegExp(`${WarpConstants.ArgParamsSeparator}(.*)`)\n\nexport class WarpEvmSerializer implements AdapterWarpSerializer {\n public readonly coreSerializer: WarpSerializer\n\n constructor() {\n this.coreSerializer = new WarpSerializer()\n }\n\n typedToString(value: any): string {\n if (typeof value === 'string') {\n if (ethers.isAddress(value)) {\n return `address:${value}`\n }\n if (ethers.isHexString(value) && !ethers.isAddress(value)) {\n return `hex:${value}`\n }\n return `string:${value}`\n }\n if (typeof value === 'number') {\n if (Number.isInteger(value)) {\n if (value >= 0 && value <= 255) return `uint8:${value}`\n if (value >= 0 && value <= 65535) return `uint16:${value}`\n if (value >= 0 && value <= 4294967295) return `uint32:${value}`\n return `uint64:${value}`\n }\n return `string:${value}`\n }\n if (typeof value === 'bigint') {\n return `biguint:${value.toString()}`\n }\n if (typeof value === 'boolean') {\n return `boolean:${value}`\n }\n if (Array.isArray(value)) {\n if (value.length === 0) return `list:string:`\n const types = value.map((item) => this.typedToString(item).split(WarpConstants.ArgParamsSeparator)[0]) as BaseWarpActionInputType[]\n const type = types[0] as BaseWarpActionInputType\n const values = value.map((item) => this.typedToString(item).split(WarpConstants.ArgParamsSeparator)[1]) as WarpNativeValue[]\n return `list:${type}:${values.join(',')}`\n }\n if (value === null || value === undefined) {\n return `string:null`\n }\n return `string:${String(value)}`\n }\n\n typedToNative(value: any): [WarpActionInputType, WarpNativeValue] {\n const stringValue = this.typedToString(value)\n const [type, ...valueParts] = stringValue.split(WarpConstants.ArgParamsSeparator)\n const nativeValue = valueParts.join(WarpConstants.ArgParamsSeparator)\n return [type, this.parseNativeValue(type, nativeValue)]\n }\n\n nativeToTyped(type: WarpActionInputType, value: WarpNativeValue): any {\n switch (type) {\n case 'string':\n return String(value)\n case 'uint8':\n case 'uint16':\n case 'uint32':\n case 'uint64':\n return BigInt(value as string | number)\n case 'biguint':\n return BigInt(value as string | number)\n case 'boolean':\n return Boolean(value)\n case 'address':\n return String(value)\n case 'hex':\n return String(value)\n default:\n if (type.startsWith('list:')) {\n const [, itemType, itemsStr] = type.split(':')\n if (!itemsStr) return []\n const items = itemsStr.split(',')\n return items.map((item) => this.nativeToTyped(itemType, item))\n }\n return String(value)\n }\n }\n\n nativeToType(type: BaseWarpActionInputType): WarpAdapterGenericType {\n switch (type) {\n case 'string':\n return 'string'\n case 'uint8':\n case 'uint16':\n case 'uint32':\n case 'uint64':\n case 'biguint':\n return 'bigint'\n case 'boolean':\n return 'boolean'\n case 'address':\n return 'string'\n case 'hex':\n return 'string'\n default:\n return 'string'\n }\n }\n\n stringToTyped(value: string): any {\n const parts = value.split(WarpConstants.ArgParamsSeparator, 2)\n if (parts.length < 2) {\n return value\n }\n\n const [type, stringValue] = parts\n\n switch (type) {\n case 'string':\n return stringValue\n case 'uint8':\n case 'uint16':\n case 'uint32':\n case 'uint64':\n return BigInt(stringValue)\n case 'biguint':\n return BigInt(stringValue)\n case 'boolean':\n return stringValue === 'true'\n case 'address':\n return stringValue\n case 'hex':\n return stringValue\n default:\n if (type.startsWith('list:')) {\n const [, itemType, itemsStr] = type.split(':')\n if (!itemsStr) return []\n const items = itemsStr.split(',')\n return items.map((item) => this.stringToTyped(`${itemType}:${item}`))\n }\n return stringValue\n }\n }\n\n private parseNativeValue(type: string, value: string): WarpNativeValue {\n switch (type) {\n case 'string':\n return value\n case 'uint8':\n case 'uint16':\n case 'uint32':\n case 'uint64':\n case 'biguint':\n return BigInt(value)\n case 'boolean':\n return value === 'true'\n case 'address':\n return value\n case 'hex':\n return value\n default:\n return value\n }\n }\n}\n","import { AdapterWarpExplorer, WarpChainInfo, WarpClientConfig } from '@vleap/warps'\nimport { EvmExplorers, ExplorerName, ExplorerUrls } from './constants'\n\nexport class WarpEvmExplorer implements AdapterWarpExplorer {\n constructor(\n private readonly chain: WarpChainInfo,\n private readonly config: WarpClientConfig\n ) {}\n\n private getExplorers(): readonly ExplorerName[] {\n const chainExplorers = EvmExplorers[this.chain.name as keyof typeof EvmExplorers]\n if (!chainExplorers) {\n return ['Default' as ExplorerName]\n }\n\n const explorers = chainExplorers[this.config.env]\n if (!explorers) {\n return ['Default' as ExplorerName]\n }\n\n return explorers\n }\n\n private getPrimaryExplorer(): ExplorerName {\n const explorers = this.getExplorers()\n return explorers[0]\n }\n\n private getExplorerUrlByName(explorer?: ExplorerName): string {\n const userPreference = this.config.preferences?.explorers?.[this.chain.name]\n\n if (userPreference && !explorer) {\n const url = ExplorerUrls[userPreference as ExplorerName]\n if (url) return url\n }\n\n if (explorer) {\n const url = ExplorerUrls[explorer]\n if (url) return url\n }\n\n const primaryExplorer = this.getPrimaryExplorer()\n const url = ExplorerUrls[primaryExplorer]\n return url || ExplorerUrls[primaryExplorer]\n }\n\n getAccountUrl(address: string, explorer?: ExplorerName): string {\n const baseUrl = this.getExplorerUrlByName(explorer)\n return `${baseUrl}/address/${address}`\n }\n\n getTransactionUrl(hash: string, explorer?: ExplorerName): string {\n const baseUrl = this.getExplorerUrlByName(explorer)\n return `${baseUrl}/tx/${hash}`\n }\n\n getBlockUrl(blockNumber: string | number, explorer?: ExplorerName): string {\n const baseUrl = this.getExplorerUrlByName(explorer)\n return `${baseUrl}/block/${blockNumber}`\n }\n\n getAssetUrl(identifier: string, explorer?: ExplorerName): string {\n const baseUrl = this.getExplorerUrlByName(explorer)\n return `${baseUrl}/token/${identifier}`\n }\n\n getContractUrl(address: string, explorer?: ExplorerName): string {\n const baseUrl = this.getExplorerUrlByName(explorer)\n return `${baseUrl}/address/${address}`\n }\n\n getAllExplorers(): readonly ExplorerName[] {\n return this.getExplorers()\n }\n\n getExplorerByName(name: string): ExplorerName | undefined {\n const explorers = this.getExplorers()\n return explorers.find((explorer) => explorer.toLowerCase() === name.toLowerCase())\n }\n\n getAccountUrls(address: string): Record<ExplorerName, string> {\n const explorers = this.getAllExplorers()\n const urls: Record<ExplorerName, string> = {} as Record<ExplorerName, string>\n\n explorers.forEach((explorer) => {\n const url = ExplorerUrls[explorer]\n if (url) {\n urls[explorer] = `${url}/address/${address}`\n }\n })\n\n return urls\n }\n\n getTransactionUrls(hash: string): Record<ExplorerName, string> {\n const explorers = this.getAllExplorers()\n const urls: Record<ExplorerName, string> = {} as Record<ExplorerName, string>\n\n explorers.forEach((explorer) => {\n const url = ExplorerUrls[explorer]\n if (url) {\n urls[explorer] = `${url}/tx/${hash}`\n }\n })\n\n return urls\n }\n}\n","import { Adapter, AdapterFactory, WarpChainEnv, WarpChainInfo, WarpClientConfig } from '@vleap/warps'\nimport { WarpEvmDataLoader } from '../WarpEvmDataLoader'\nimport { WarpEvmExecutor } from '../WarpEvmExecutor'\nimport { WarpEvmExplorer } from '../WarpEvmExplorer'\nimport { WarpEvmResults } from '../WarpEvmResults'\nimport { WarpEvmSerializer } from '../WarpEvmSerializer'\n\nexport const createEvmAdapter = (\n chainName: string,\n chainPrefix: string,\n chainInfos: Record<WarpChainEnv, WarpChainInfo>\n): AdapterFactory => {\n return (config: WarpClientConfig, fallback?: Adapter) => {\n if (!fallback) throw new Error(`${chainName} adapter requires a fallback adapter`)\n\n return {\n chain: chainName,\n chainInfo: chainInfos[config.env],\n prefix: chainPrefix,\n builder: () => fallback.builder(),\n executor: new WarpEvmExecutor(config, chainInfos[config.env]),\n results: new WarpEvmResults(config),\n serializer: new WarpEvmSerializer(),\n registry: fallback.registry,\n explorer: new WarpEvmExplorer(chainInfos[config.env], config),\n abiBuilder: () => fallback.abiBuilder(),\n brandBuilder: () => fallback.brandBuilder(),\n dataLoader: new WarpEvmDataLoader(config, chainInfos[config.env]),\n }\n }\n}\n","import { AdapterFactory, WarpChain, WarpChainAsset } from '@vleap/warps'\nimport { createEvmAdapter } from './common'\n\nexport const ChainNameArbitrum: WarpChain = 'arbitrum'\n\nexport const NativeTokenArb: WarpChainAsset = {\n identifier: 'ARB',\n name: 'ARB',\n decimals: 18,\n logoUrl: 'https://vleap.ai/images/tokens/arb.svg',\n}\n\nexport const getArbitrumAdapter: AdapterFactory = createEvmAdapter(ChainNameArbitrum, 'arb', {\n devnet: {\n name: ChainNameArbitrum,\n displayName: 'Arbitrum Devnet',\n chainId: '421614',\n blockTime: 1000,\n addressHrp: '0x',\n defaultApiUrl: 'https://sepolia-rollup.arbitrum.io/rpc',\n nativeToken: NativeTokenArb,\n },\n testnet: {\n name: ChainNameArbitrum,\n displayName: 'Arbitrum Testnet',\n chainId: '421613',\n blockTime: 1000,\n addressHrp: '0x',\n defaultApiUrl: 'https://goerli-rollup.arbitrum.io/rpc',\n nativeToken: NativeTokenArb,\n },\n mainnet: {\n name: ChainNameArbitrum,\n displayName: 'Arbitrum',\n chainId: '42161',\n blockTime: 1000,\n addressHrp: '0x',\n defaultApiUrl: 'https://arb1.arbitrum.io/rpc',\n nativeToken: NativeTokenArb,\n },\n})\n","import { AdapterFactory, WarpChain, WarpChainAsset } from '@vleap/warps'\nimport { createEvmAdapter } from './common'\n\nexport const ChainNameBase: WarpChain = 'base'\n\nexport const NativeTokenBase: WarpChainAsset = {\n identifier: 'ETH',\n name: 'ETH',\n decimals: 18,\n logoUrl: 'https://vleap.ai/images/tokens/eth.svg',\n}\n\nexport const getBaseAdapter: AdapterFactory = createEvmAdapter(ChainNameBase, 'base', {\n mainnet: {\n name: ChainNameBase,\n displayName: 'Base',\n chainId: '8453',\n blockTime: 2000,\n addressHrp: '0x',\n defaultApiUrl: 'https://mainnet.base.org',\n nativeToken: NativeTokenBase,\n },\n testnet: {\n name: ChainNameBase,\n displayName: 'Base Testnet',\n chainId: '84531',\n blockTime: 2000,\n addressHrp: '0x',\n defaultApiUrl: 'https://goerli.base.org',\n nativeToken: NativeTokenBase,\n },\n devnet: {\n name: ChainNameBase,\n displayName: 'Base Devnet',\n chainId: '84532',\n blockTime: 2000,\n addressHrp: '0x',\n defaultApiUrl: 'https://sepolia.base.org',\n nativeToken: NativeTokenBase,\n },\n})\n","import { AdapterFactory, WarpChain, WarpChainAsset } from '@vleap/warps'\nimport { createEvmAdapter } from './common'\n\nexport const ChainNameEthereum: WarpChain = 'ethereum'\n\nexport const NativeTokenEth: WarpChainAsset = {\n identifier: 'ETH',\n name: 'ETH',\n decimals: 18,\n logoUrl: 'https://vleap.ai/images/tokens/eth.svg',\n}\n\nexport const getEthereumAdapter: AdapterFactory = createEvmAdapter(ChainNameEthereum, 'eth', {\n devnet: {\n name: ChainNameEthereum,\n displayName: 'Ethereum Devnet',\n chainId: '11155111',\n blockTime: 12000,\n addressHrp: '0x',\n defaultApiUrl: 'https://ethereum-sepolia-rpc.publicnode.com',\n nativeToken: NativeTokenEth,\n },\n testnet: {\n name: ChainNameEthereum,\n displayName: 'Ethereum Testnet',\n chainId: '11155111',\n blockTime: 12000,\n addressHrp: '0x',\n defaultApiUrl: 'https://ethereum-sepolia-rpc.publicnode.com',\n nativeToken: NativeTokenEth,\n },\n mainnet: {\n name: ChainNameEthereum,\n displayName: 'Ethereum Mainnet',\n chainId: '1',\n blockTime: 12000,\n addressHrp: '0x',\n defaultApiUrl: 'https://ethereum-rpc.publicnode.com',\n nativeToken: NativeTokenEth,\n },\n})\n","import { Adapter, WarpChain, WarpClientConfig } from '@vleap/warps'\nimport { ChainNameArbitrum, getArbitrumAdapter } from './arbitrum'\nimport { ChainNameBase, getBaseAdapter } from './base'\nimport { ChainNameEthereum, getEthereumAdapter } from './ethereum'\n\nexport const getAllEvmAdapters = (config: WarpClientConfig, fallback?: Adapter): Adapter[] => [\n getEthereumAdapter(config, fallback),\n getArbitrumAdapter(config, fallback),\n getBaseAdapter(config, fallback),\n]\n\nexport const getAllEvmChainNames = (): WarpChain[] => [ChainNameArbitrum, ChainNameBase, ChainNameEthereum]\n"],"mappings":";AAAA,SAAgC,sBAAyF;AACzH,SAAS,cAAc;;;ACiBvB,IAAM,YAAoC;AAAA,EACxC,UAAU;AAAA,EACV,UAAU;AAAA,EACV,MAAM;AACR;AAEA,IAAM,iBAAyD;AAAA,EAC7D,UAAU;AAAA,IACR,8CAA8C;AAAA,IAC9C,8CAA8C;AAAA,IAC9C,8CAA8C;AAAA,IAC9C,8CAA8C;AAAA,IAC9C,8CAA8C;AAAA,EAChD;AAAA,EACA,UAAU;AAAA,IACR,8CAA8C;AAAA,IAC9C,8CAA8C;AAAA,IAC9C,8CAA8C;AAAA,EAChD;AAAA,EACA,MAAM;AAAA,IACJ,8CAA8C;AAAA,IAC9C,8CAA8C;AAAA,IAC9C,8CAA8C;AAAA,IAC9C,8CAA8C;AAAA,IAC9C,8CAA8C;AAAA,EAChD;AACF;AAEA,IAAM,cAAc;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,YAAY,oBAAI,IAAoB;AAC1C,IAAM,iBAAiB,oBAAI,IAAuB;AAClD,IAAM,iBAAiB,oBAAI,IAAuB;AAE3C,IAAM,iBAAN,MAAqB;AAAA,EAC1B,aAAa,aAAa,WAAmB,cAA0C;AACrF,UAAM,WAAW,GAAG,SAAS,IAAI,aAAa,YAAY,CAAC;AAE3D,QAAI,eAAe,IAAI,QAAQ,GAAG;AAChC,aAAO,eAAe,IAAI,QAAQ;AAAA,IACpC;AAEA,QAAI,YAAuB,CAAC;AAE5B,QAAI;AACF,kBAAY,MAAM,KAAK,oBAAoB,WAAW,YAAY;AAAA,IACpE,SAAS,OAAO;AAAA,IAAC;AAEjB,QAAI,CAAC,UAAU,SAAS;AACtB,UAAI;AACF,oBAAY,EAAE,GAAG,WAAW,GAAI,MAAM,KAAK,mBAAmB,WAAW,YAAY,EAAG;AAAA,MAC1F,SAAS,OAAO;AAAA,MAAC;AAAA,IACnB;AAEA,mBAAe,IAAI,UAAU,SAAS;AACtC,WAAO;AAAA,EACT;AAAA,EAEA,aAAa,WAAW,WAAmB,cAAsB,WAAoB,aAAuC;AAC1H,UAAM,WAAW,GAAG,SAAS,IAAI,aAAa,YAAY,CAAC;AAE3D,QAAI,UAAU,IAAI,QAAQ,GAAG;AAC3B,aAAO,UAAU,IAAI,QAAQ;AAAA,IAC/B;AAEA,QAAI,UAAU;AAEd,UAAM,gBAAgB,eAAe,SAAS;AAC9C,QAAI,iBAAiB,cAAc,YAAY,GAAG;AAChD,gBAAU,cAAc,YAAY;AAAA,IACtC,OAAO;AACL,YAAM,YAAY,MAAM,KAAK,aAAa,WAAW,YAAY;AACjE,gBAAU,UAAU,WAAW;AAE/B,UAAI,CAAC,YAAY,eAAe,YAAY;AAC1C,YAAI;AACF,oBAAU,MAAM,KAAK,qBAAqB,WAAW,YAAY;AAAA,QACnE,SAAS,OAAO;AAAA,QAAC;AAAA,MACnB;AAAA,IACF;AAEA,cAAU,IAAI,UAAU,OAAO;AAC/B,WAAO;AAAA,EACT;AAAA,EAEA,aAAqB,oBAAoB,WAAmB,cAA0C;AACpG,UAAM,UAAU,UAAU,SAAS;AACnC,QAAI,CAAC,QAAS,QAAO,CAAC;AAEtB,UAAM,oBAAoB,aAAa,YAAY;AAEnD,QAAI,eAAe,IAAI,GAAG,OAAO,IAAI,iBAAiB,EAAE,GAAG;AACzD,aAAO,eAAe,IAAI,GAAG,OAAO,IAAI,iBAAiB,EAAE,KAAK,CAAC;AAAA,IACnE;AAEA,eAAW,gBAAgB,aAAa;AACtC,UAAI;AACF,cAAM,WAAW,MAAM,MAAM,cAAc;AAAA,UACzC,SAAS,EAAE,QAAQ,mBAAmB;AAAA,UACtC,QAAQ,YAAY,QAAQ,GAAI;AAAA,QAClC,CAAC;AAED,YAAI,SAAS,IAAI;AACf,gBAAM,OAA0B,MAAM,SAAS,KAAK;AAEpD,gBAAM,QAAQ,KAAK,OAAO,KAAK,CAAC,MAAM,EAAE,YAAY,WAAW,EAAE,QAAQ,YAAY,MAAM,iBAAiB;AAE5G,cAAI,OAAO;AACT,kBAAM,YAAuB;AAAA,cAC3B,MAAM,MAAM;AAAA,cACZ,QAAQ,MAAM;AAAA,cACd,UAAU,MAAM;AAAA,cAChB,SAAS,MAAM;AAAA,YACjB;AACA,2BAAe,IAAI,GAAG,OAAO,IAAI,iBAAiB,IAAI,SAAS;AAC/D,mBAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd;AAAA,MACF;AAAA,IACF;AAEA,WAAO,CAAC;AAAA,EACV;AAAA,EAEA,aAAqB,mBAAmB,WAAmB,cAA0C;AACnG,QAAI;AACF,YAAM,eAAuC;AAAA,QAC3C,UAAU;AAAA,QACV,UAAU;AAAA,QACV,MAAM;AAAA,MACR;AAEA,YAAM,QAAQ,aAAa,SAAS;AACpC,UAAI,CAAC,MAAO,QAAO,CAAC;AAEpB,YAAM,WAAW,MAAM,MAAM,yCAAyC,KAAK,IAAI,YAAY,IAAI,EAAE,QAAQ,YAAY,QAAQ,GAAI,EAAE,CAAC;AAEpI,UAAI,SAAS,IAAI;AACf,cAAM,OAAO,MAAM,SAAS,KAAK;AACjC,cAAM,WAAW,KAAK,QAAQ,GAAG,KAAK,IAAI,YAAY,EAAE;AAExD,YAAI,UAAU;AACZ,iBAAO;AAAA,YACL,QAAQ,SAAS;AAAA,YACjB,SAAS,SAAS;AAAA,UACpB;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AAAA,IAAC;AAEjB,WAAO,CAAC;AAAA,EACV;AAAA,EAEA,aAAqB,qBAAqB,WAAmB,cAAuC;AAClG,QAAI;AACF,YAAM,eAAuC;AAAA,QAC3C,UAAU;AAAA,QACV,UAAU;AAAA,QACV,MAAM;AAAA,MACR;AAEA,YAAM,QAAQ,aAAa,SAAS;AACpC,UAAI,CAAC,MAAO,QAAO;AAEnB,YAAM,UAAU,2EAA2E,KAAK,WAAW,YAAY;AAEvH,YAAM,WAAW,MAAM,MAAM,SAAS;AAAA,QACpC,QAAQ;AAAA,QACR,QAAQ,YAAY,QAAQ,GAAI;AAAA,MAClC,CAAC;AAED,UAAI,SAAS,IAAI;AACf,eAAO;AAAA,MACT;AAAA,IACF,SAAS,OAAO;AAAA,IAAC;AAEjB,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,aAAmB;AACxB,cAAU,MAAM;AAChB,mBAAe,MAAM;AACrB,mBAAe,MAAM;AAAA,EACvB;AAAA,EAEA,OAAO,eAAuB;AAC5B,WAAO,UAAU,OAAO,eAAe,OAAO,eAAe;AAAA,EAC/D;AACF;;;AD/MA,IAAM,YAAY;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAMA,IAAM,eAAqH;AAAA,EACzH,UAAU;AAAA,IACR,8CAA8C;AAAA,MAC5C,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,IACA,8CAA8C;AAAA,MAC5C,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,IACA,8CAA8C;AAAA,MAC5C,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,IACA,8CAA8C;AAAA,MAC5C,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,IACA,8CAA8C;AAAA,MAC5C,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA;AAAA,IAEA,8CAA8C;AAAA,MAC5C,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,IACA,8CAA8C;AAAA,MAC5C,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,IACA,8CAA8C;AAAA,MAC5C,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR,8CAA8C;AAAA,MAC5C,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,IACA,8CAA8C;AAAA,MAC5C,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,IACA,8CAA8C;AAAA,MAC5C,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,MAAM;AAAA,IACJ,8CAA8C;AAAA,MAC5C,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,IACA,8CAA8C;AAAA,MAC5C,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,IACA,8CAA8C;AAAA,MAC5C,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,IACA,8CAA8C;AAAA,MAC5C,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,IACA,8CAA8C;AAAA,MAC5C,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,EACF;AACF;AAeO,IAAM,oBAAN,MAAyD;AAAA,EAG9D,YACmB,QACA,OACjB;AAFiB;AACA;AAEjB,UAAM,SAAS,eAAe,KAAK,QAAQ,KAAK,MAAM,MAAM,KAAK,OAAO,KAAK,KAAK,MAAM,aAAa;AACrG,SAAK,WAAW,IAAI,OAAO,gBAAgB,MAAM;AAAA,EACnD;AAAA,EAEA,MAAM,WAAW,SAA4C;AAC3D,QAAI;AACF,YAAM,UAAU,MAAM,KAAK,SAAS,WAAW,OAAO;AAEtD,aAAO;AAAA,QACL;AAAA,QACA;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,YAAM,IAAI,MAAM,qCAAqC,OAAO,KAAK,KAAK,EAAE;AAAA,IAC1E;AAAA,EACF;AAAA,EAEA,MAAM,iBAAiB,SAA4C;AACjE,QAAI;AACF,YAAM,SAA2B,CAAC;AAGlC,YAAM,gBAAgB,MAAM,KAAK,sBAAsB,OAAO;AAE9D,iBAAW,gBAAgB,eAAe;AACxC,YAAI,aAAa,UAAU,IAAI;AAC7B,gBAAM,UACJ,aAAa,SAAS,WACrB,MAAM,eAAe;AAAA,YACpB,KAAK,MAAM;AAAA,YACX,aAAa;AAAA,YACb,aAAa,SAAS;AAAA,YACtB,aAAa,SAAS;AAAA,UACxB;AAEF,iBAAO,KAAK;AAAA,YACV,YAAY,aAAa;AAAA,YACzB,MAAM,aAAa,SAAS;AAAA,YAC5B,QAAQ,aAAa;AAAA,YACrB,UAAU,aAAa,SAAS;AAAA,YAChC,SAAS,WAAW;AAAA,UACtB,CAAC;AAAA,QACH;AAAA,MACF;AAEA,aAAO;AAAA,IACT,SAAS,OAAO;AACd,YAAM,IAAI,MAAM,oCAAoC,OAAO,KAAK,KAAK,EAAE;AAAA,IACzE;AAAA,EACF;AAAA,EAEA,MAAc,sBAAsB,SAA0C;AAC5E,UAAM,gBAAgC,CAAC;AAGvC,UAAM,cAAc,aAAa,KAAK,MAAM,IAAI,KAAK,CAAC;AAGtD,eAAW,CAAC,cAAc,QAAQ,KAAK,OAAO,QAAQ,WAAW,GAAG;AAClE,UAAI;AACF,cAAM,UAAU,MAAM,KAAK,gBAAgB,SAAS,YAAY;AAChE,YAAI,UAAU,IAAI;AAChB,wBAAc,KAAK;AAAA,YACjB;AAAA,YACA;AAAA,YACA;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF,SAAS,OAAO;AAAA,MAEhB;AAAA,IACF;AAGA,UAAM,mBAAmB,MAAM,KAAK,uBAAuB,OAAO;AAClE,eAAW,gBAAgB,kBAAkB;AAC3C,UAAI,CAAC,YAAY,YAAY,GAAG;AAC9B,YAAI;AACF,gBAAM,WAAW,MAAM,KAAK,iBAAiB,YAAY;AACzD,gBAAM,UAAU,MAAM,KAAK,gBAAgB,SAAS,YAAY;AAChE,cAAI,UAAU,IAAI;AAChB,0BAAc,KAAK;AAAA,cACjB;AAAA,cACA;AAAA,cACA;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF,SAAS,OAAO;AAAA,QAEhB;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,gBAAgB,SAAiB,cAAuC;AACpF,QAAI;AACF,YAAM,WAAW,IAAI,OAAO,SAAS,cAAc,WAAW,KAAK,QAAQ;AAC3E,YAAM,UAAU,MAAM,SAAS,UAAU,OAAO;AAChD,aAAO;AAAA,IACT,SAAS,OAAO;AACd,YAAM,IAAI,MAAM,gCAAgC,KAAK,EAAE;AAAA,IACzD;AAAA,EACF;AAAA,EAEA,MAAc,iBAAiB,cAA8C;AAC3E,QAAI;AACF,YAAM,YAAY,MAAM,eAAe,aAAa,KAAK,MAAM,MAAM,YAAY;AAEjF,UAAI,UAAU,QAAQ,UAAU,UAAU,UAAU,aAAa,QAAW;AAC1E,eAAO;AAAA,UACL,MAAM,UAAU;AAAA,UAChB,QAAQ,UAAU;AAAA,UAClB,UAAU,UAAU;AAAA,UACpB,SAAS,UAAU;AAAA,QACrB;AAAA,MACF;AAEA,YAAM,WAAW,IAAI,OAAO,SAAS,cAAc,WAAW,KAAK,QAAQ;AAC3E,YAAM,CAAC,MAAM,QAAQ,QAAQ,IAAI,MAAM,QAAQ,IAAI;AAAA,QACjD,SAAS,KAAK,EAAE,MAAM,MAAM,UAAU,QAAQ,eAAe;AAAA,QAC7D,SAAS,OAAO,EAAE,MAAM,MAAM,UAAU,UAAU,SAAS;AAAA,QAC3D,SAAS,SAAS,EAAE,MAAM,MAAM,UAAU,YAAY,EAAE;AAAA,MAC1D,CAAC;AAED,aAAO;AAAA,QACL,MAAM,QAAQ,UAAU,QAAQ;AAAA,QAChC,QAAQ,UAAU,UAAU,UAAU;AAAA,QACtC,UAAU,YAAY,UAAU,YAAY;AAAA,QAC5C,SAAS,UAAU;AAAA,MACrB;AAAA,IACF,SAAS,OAAO;AACd,YAAM,IAAI,MAAM,iCAAiC,KAAK,EAAE;AAAA,IAC1D;AAAA,EACF;AAAA,EAEA,MAAc,uBAAuB,SAAoC;AACvE,QAAI;AAEF,YAAM,eAAe,MAAM,KAAK,SAAS,eAAe;AACxD,YAAM,YAAY,KAAK,IAAI,GAAG,eAAe,GAAK;AAGlD,YAAM,SAAS;AAAA,QACb;AAAA,QACA,SAAS;AAAA,QACT,QAAQ;AAAA,UACN,OAAO,GAAG,mCAAmC;AAAA,UAC7C;AAAA;AAAA,UACA,OAAO,aAAa,SAAS,EAAE;AAAA;AAAA,QACjC;AAAA,MACF;AAEA,YAAM,OAAO,MAAM,KAAK,SAAS,QAAQ,MAAM;AAG/C,YAAM,iBAAiB,oBAAI,IAAY;AACvC,iBAAW,OAAO,MAAM;AACtB,uBAAe,IAAI,IAAI,OAAO;AAAA,MAChC;AAEA,aAAO,MAAM,KAAK,cAAc;AAAA,IAClC,SAAS,OAAO;AACd,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,aAAa,cAAqD;AACtE,QAAI;AACF,aAAO,MAAM,KAAK,iBAAiB,YAAY;AAAA,IACjD,SAAS,OAAO;AACd,cAAQ,KAAK,gCAAgC,YAAY,KAAK,KAAK,EAAE;AACrE,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,0BAA0B,SAAiB,cAAuC;AACtF,QAAI;AACF,aAAO,MAAM,KAAK,gBAAgB,SAAS,YAAY;AAAA,IACzD,SAAS,OAAO;AACd,YAAM,IAAI,MAAM,mCAAmC,YAAY,KAAK,KAAK,EAAE;AAAA,IAC7E;AAAA,EACF;AAAA,EAEA,MAAM,yBAAyB,SAAiB,gBAAwD;AACtG,UAAM,WAAW,oBAAI,IAAoB;AAEzC,UAAM,QAAQ;AAAA,MACZ,eAAe,IAAI,OAAO,iBAAiB;AACzC,YAAI;AACF,gBAAM,UAAU,MAAM,KAAK,gBAAgB,SAAS,YAAY;AAChE,mBAAS,IAAI,cAAc,OAAO;AAAA,QACpC,SAAS,OAAO;AACd,kBAAQ,KAAK,mCAAmC,YAAY,KAAK,KAAK,EAAE;AACxE,mBAAS,IAAI,cAAc,EAAE;AAAA,QAC/B;AAAA,MACF,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AACF;;;AE1VA;AAAA,EAEE;AAAA,EACA;AAAA,EACA,kBAAAA;AAAA,EACA;AAAA,OAOK;AACP,SAAS,UAAAC,eAAc;;;ACbhB,IAAM,mBAAmB;AAAA,EAC9B,UAAU;AAAA,IACR,SAAS;AAAA,IACT,cAAc;AAAA,IACd,gBAAgB;AAAA,IAChB,UAAU;AAAA,IACV,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AAAA,EACA,UAAU;AAAA,IACR,SAAS;AAAA,EACX;AAAA,EACA,YAAY;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,EACf;AACF;AAEO,IAAK,oBAAL,kBAAKC,uBAAL;AACL,EAAAA,mBAAA,eAAY;AACZ,EAAAA,mBAAA,sBAAmB;AACnB,EAAAA,mBAAA,eAAY;AACZ,EAAAA,mBAAA,gBAAa;AACb,EAAAA,mBAAA,uBAAoB;AALV,SAAAA;AAAA,GAAA;AAQL,IAAK,oBAAL,kBAAKC,uBAAL;AACL,EAAAA,mBAAA,cAAW;AACX,EAAAA,mBAAA,qBAAkB;AAClB,EAAAA,mBAAA,wBAAqB;AACrB,EAAAA,mBAAA,+BAA4B;AAJlB,SAAAA;AAAA,GAAA;AAOL,IAAK,gBAAL,kBAAKC,mBAAL;AACL,EAAAA,eAAA,cAAW;AACX,EAAAA,eAAA,qBAAkB;AAClB,EAAAA,eAAA,oBAAiB;AACjB,EAAAA,eAAA,2BAAwB;AAJd,SAAAA;AAAA,GAAA;AASL,IAAM,eAAe;AAAA,EAC1B,UAAU;AAAA,IACR,SAAS,CAAC,6BAA6B,6BAA6B,6BAA4B;AAAA,IAChG,SAAS,CAAC,4CAAoC,4CAAmC;AAAA,IACjF,QAAQ,CAAC,4CAAoC,4CAAmC;AAAA,EAClF;AAAA,EACA,UAAU;AAAA,IACR,SAAS,CAAC,2BAA4B,8CAAoC;AAAA,IAC1E,SAAS,CAAC,0CAAmC,6DAA2C;AAAA,IACxF,QAAQ,CAAC,0CAAmC,6DAA2C;AAAA,EACzF;AAAA,EACA,MAAM;AAAA,IACJ,SAAS,CAAC,2BAAwB,sCAA4B;AAAA,IAC9D,SAAS,CAAC,0CAA+B,qDAAmC;AAAA,IAC5E,QAAQ,CAAC,0CAA+B,qDAAmC;AAAA,EAC7E;AACF;AAEO,IAAM,eAA6C;AAAA,EACxD,CAAC,2BAA2B,GAAG;AAAA,EAC/B,CAAC,0CAAkC,GAAG;AAAA,EACtC,CAAC,2BAA2B,GAAG;AAAA,EAC/B,CAAC,6BAA4B,GAAG;AAAA,EAChC,CAAC,4CAAmC,GAAG;AAAA,EAEvC,CAAC,yBAA0B,GAAG;AAAA,EAC9B,CAAC,wCAAiC,GAAG;AAAA,EACrC,CAAC,8CAAoC,GAAG;AAAA,EACxC,CAAC,6DAA2C,GAAG;AAAA,EAE/C,CAAC,yBAAsB,GAAG;AAAA,EAC1B,CAAC,wCAA6B,GAAG;AAAA,EACjC,CAAC,sCAA4B,GAAG;AAAA,EAChC,CAAC,qDAAmC,GAAG;AACzC;;;AC5EA;AAAA,EAEE;AAAA,EACA;AAAA,EAIA,iBAAAC;AAAA,OAGK;;;ACVP;AAAA,EAKE;AAAA,EAEA;AAAA,OACK;AACP,SAAS,UAAAC,eAAc;AAEvB,IAAM,mBAAmB,IAAI,OAAO,GAAG,cAAc,kBAAkB,MAAM;AAEtE,IAAM,oBAAN,MAAyD;AAAA,EAG9D,cAAc;AACZ,SAAK,iBAAiB,IAAI,eAAe;AAAA,EAC3C;AAAA,EAEA,cAAc,OAAoB;AAChC,QAAI,OAAO,UAAU,UAAU;AAC7B,UAAIA,QAAO,UAAU,KAAK,GAAG;AAC3B,eAAO,WAAW,KAAK;AAAA,MACzB;AACA,UAAIA,QAAO,YAAY,KAAK,KAAK,CAACA,QAAO,UAAU,KAAK,GAAG;AACzD,eAAO,OAAO,KAAK;AAAA,MACrB;AACA,aAAO,UAAU,KAAK;AAAA,IACxB;AACA,QAAI,OAAO,UAAU,UAAU;AAC7B,UAAI,OAAO,UAAU,KAAK,GAAG;AAC3B,YAAI,SAAS,KAAK,SAAS,IAAK,QAAO,SAAS,KAAK;AACrD,YAAI,SAAS,KAAK,SAAS,MAAO,QAAO,UAAU,KAAK;AACxD,YAAI,SAAS,KAAK,SAAS,WAAY,QAAO,UAAU,KAAK;AAC7D,eAAO,UAAU,KAAK;AAAA,MACxB;AACA,aAAO,UAAU,KAAK;AAAA,IACxB;AACA,QAAI,OAAO,UAAU,UAAU;AAC7B,aAAO,WAAW,MAAM,SAAS,CAAC;AAAA,IACpC;AACA,QAAI,OAAO,UAAU,WAAW;AAC9B,aAAO,WAAW,KAAK;AAAA,IACzB;AACA,QAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,UAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,YAAM,QAAQ,MAAM,IAAI,CAAC,SAAS,KAAK,cAAc,IAAI,EAAE,MAAM,cAAc,kBAAkB,EAAE,CAAC,CAAC;AACrG,YAAM,OAAO,MAAM,CAAC;AACpB,YAAM,SAAS,MAAM,IAAI,CAAC,SAAS,KAAK,cAAc,IAAI,EAAE,MAAM,cAAc,kBAAkB,EAAE,CAAC,CAAC;AACtG,aAAO,QAAQ,IAAI,IAAI,OAAO,KAAK,GAAG,CAAC;AAAA,IACzC;AACA,QAAI,UAAU,QAAQ,UAAU,QAAW;AACzC,aAAO;AAAA,IACT;AACA,WAAO,UAAU,OAAO,KAAK,CAAC;AAAA,EAChC;AAAA,EAEA,cAAc,OAAoD;AAChE,UAAM,cAAc,KAAK,cAAc,KAAK;AAC5C,UAAM,CAAC,MAAM,GAAG,UAAU,IAAI,YAAY,MAAM,cAAc,kBAAkB;AAChF,UAAM,cAAc,WAAW,KAAK,cAAc,kBAAkB;AACpE,WAAO,CAAC,MAAM,KAAK,iBAAiB,MAAM,WAAW,CAAC;AAAA,EACxD;AAAA,EAEA,cAAc,MAA2B,OAA6B;AACpE,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,eAAO,OAAO,KAAK;AAAA,MACrB,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,eAAO,OAAO,KAAwB;AAAA,MACxC,KAAK;AACH,eAAO,OAAO,KAAwB;AAAA,MACxC,KAAK;AACH,eAAO,QAAQ,KAAK;AAAA,MACtB,KAAK;AACH,eAAO,OAAO,KAAK;AAAA,MACrB,KAAK;AACH,eAAO,OAAO,KAAK;AAAA,MACrB;AACE,YAAI,KAAK,WAAW,OAAO,GAAG;AAC5B,gBAAM,CAAC,EAAE,UAAU,QAAQ,IAAI,KAAK,MAAM,GAAG;AAC7C,cAAI,CAAC,SAAU,QAAO,CAAC;AACvB,gBAAM,QAAQ,SAAS,MAAM,GAAG;AAChC,iBAAO,MAAM,IAAI,CAAC,SAAS,KAAK,cAAc,UAAU,IAAI,CAAC;AAAA,QAC/D;AACA,eAAO,OAAO,KAAK;AAAA,IACvB;AAAA,EACF;AAAA,EAEA,aAAa,MAAuD;AAClE,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT;AACE,eAAO;AAAA,IACX;AAAA,EACF;AAAA,EAEA,cAAc,OAAoB;AAChC,UAAM,QAAQ,MAAM,MAAM,cAAc,oBAAoB,CAAC;AAC7D,QAAI,MAAM,SAAS,GAAG;AACpB,aAAO;AAAA,IACT;AAEA,UAAM,CAAC,MAAM,WAAW,IAAI;AAE5B,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,eAAO,OAAO,WAAW;AAAA,MAC3B,KAAK;AACH,eAAO,OAAO,WAAW;AAAA,MAC3B,KAAK;AACH,eAAO,gBAAgB;AAAA,MACzB,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT;AACE,YAAI,KAAK,WAAW,OAAO,GAAG;AAC5B,gBAAM,CAAC,EAAE,UAAU,QAAQ,IAAI,KAAK,MAAM,GAAG;AAC7C,cAAI,CAAC,SAAU,QAAO,CAAC;AACvB,gBAAM,QAAQ,SAAS,MAAM,GAAG;AAChC,iBAAO,MAAM,IAAI,CAAC,SAAS,KAAK,cAAc,GAAG,QAAQ,IAAI,IAAI,EAAE,CAAC;AAAA,QACtE;AACA,eAAO;AAAA,IACX;AAAA,EACF;AAAA,EAEQ,iBAAiB,MAAc,OAAgC;AACrE,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,eAAO,OAAO,KAAK;AAAA,MACrB,KAAK;AACH,eAAO,UAAU;AAAA,MACnB,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT;AACE,eAAO;AAAA,IACX;AAAA,EACF;AACF;;;AD3JO,IAAM,iBAAN,MAAmD;AAAA,EAGxD,YAA6B,QAA0B;AAA1B;AAC3B,SAAK,aAAa,IAAI,kBAAkB;AAAA,EAC1C;AAAA,EAEA,MAAM,+BAA+B,MAAY,IAAuD;AACtG,UAAM,UAAU,GAAG,WAAW;AAC9B,UAAM,UAAU,GAAG,SAAS,SAAS,KAAK;AAC1C,UAAM,WAAW,GAAG,UAAU,SAAS,KAAK;AAC5C,UAAM,cAAc,GAAG,aAAa,SAAS,KAAK;AAClD,UAAM,kBAAkB,GAAG;AAE3B,UAAM,OAAO,GAAG,KAAK,IAAI,CAAC,SAAS;AAAA,MACjC,SAAS,IAAI;AAAA,MACb,QAAQ,IAAI;AAAA,MACZ,MAAM,IAAI;AAAA,MACV,aAAa,IAAI,aAAa,SAAS,KAAK;AAAA,MAC5C,iBAAiB,IAAI;AAAA,MACrB,OAAO,IAAI,OAAO,SAAS,KAAK;AAAA,IAClC,EAAE;AAEF,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR,MAAM,KAAK,OAAO,MAAM,SAAS,OAAO;AAAA,MACxC,QAAQ;AAAA,MACR;AAAA,MACA,MAAM;AAAA,MACN,QAAQ,CAAC,iBAAiB,aAAa,SAAS,UAAU,GAAI,KAAK,SAAS,IAAI,OAAO,CAAC,CAAE;AAAA,MAC1F,SAAS,CAAC;AAAA,MACV,UAAU,CAAC;AAAA,IACb;AAAA,EACF;AAAA,EAEA,MAAM,oBACJ,MACA,aACA,aACA,QAC2D;AAC3D,UAAM,SAAS,YAAY,IAAI,CAAC,MAAM,KAAK,WAAW,cAAc,CAAC,CAAC;AACtE,UAAM,YAAY,YAAY,IAAI,CAAC,MAAM,KAAK,WAAW,cAAc,CAAC,EAAE,CAAC,CAAC;AAC5E,QAAI,UAAgC,CAAC;AAErC,QAAI,CAAC,KAAK,QAAS,QAAO,EAAE,QAAQ,QAAQ;AAE5C,UAAM,iBAAiB,CAAC,SAA0B;AAChD,YAAM,UAAU,KACb,MAAM,GAAG,EACT,MAAM,CAAC,EACP,IAAI,CAAC,MAAM,SAAS,CAAC,IAAI,CAAC;AAC7B,UAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,UAAI,QAAa,UAAU,QAAQ,CAAC,CAAC;AACrC,eAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,YAAI,UAAU,UAAa,UAAU,KAAM,QAAO;AAClD,gBAAQ,MAAM,QAAQ,CAAC,CAAC;AAAA,MAC1B;AACA,aAAO;AAAA,IACT;AAEA,eAAW,CAAC,KAAK,IAAI,KAAK,OAAO,QAAQ,KAAK,OAAO,GAAG;AACtD,UAAI,KAAK,WAAWC,eAAc,UAAU,MAAM,EAAG;AACrD,YAAM,qBAAqB,qBAAqB,IAAI;AACpD,UAAI,uBAAuB,QAAQ,uBAAuB,aAAa;AACrE,gBAAQ,GAAG,IAAI;AACf;AAAA,MACF;AACA,UAAI,KAAK,WAAW,MAAM,KAAK,SAAS,SAAS,KAAK,WAAW,MAAM,GAAG;AACxE,gBAAQ,GAAG,IAAI,eAAe,IAAI,KAAK;AAAA,MACzC,OAAO;AACL,gBAAQ,GAAG,IAAI;AAAA,MACjB;AAAA,IACF;AAEA,WAAO,EAAE,QAAQ,SAAS,MAAM,sBAAsB,MAAM,SAAS,aAAa,MAAM,EAAE;AAAA,EAC5F;AACF;;;AF3EO,IAAM,kBAAN,MAAqD;AAAA,EAK1D,YACmB,QACA,OACjB;AAFiB;AACA;AAEjB,SAAK,aAAa,IAAI,kBAAkB;AACxC,UAAM,SAASC,gBAAe,KAAK,QAAQ,MAAM,MAAM,KAAK,OAAO,KAAK,KAAK,MAAM,aAAa;AAChG,SAAK,WAAW,IAAIC,QAAO,gBAAgB,MAAM;AACjD,SAAK,UAAU,IAAI,eAAe,MAAM;AAAA,EAC1C;AAAA,EAEA,MAAM,kBAAkB,YAAgE;AACtF,UAAM,SAAS,qBAAqB,WAAW,MAAM,WAAW,MAAM;AAEtE,QAAI,KAAuC;AAC3C,QAAI,OAAO,SAAS,YAAY;AAC9B,WAAK,MAAM,KAAK,0BAA0B,UAAU;AAAA,IACtD,WAAW,OAAO,SAAS,YAAY;AACrC,WAAK,MAAM,KAAK,8BAA8B,UAAU;AAAA,IAC1D,WAAW,OAAO,SAAS,SAAS;AAClC,YAAM,IAAI,MAAM,sFAAsF;AAAA,IACxG,WAAW,OAAO,SAAS,WAAW;AACpC,YAAM,IAAI,MAAM,wFAAwF;AAAA,IAC1G;AAEA,QAAI,CAAC,GAAI,OAAM,IAAI,MAAM,yCAAyC,OAAO,IAAI,GAAG;AAEhF,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,0BAA0B,YAAgE;AAC9F,UAAM,aAAa,KAAK,OAAO,MAAM,UAAU,WAAW,MAAM,IAAI;AACpE,QAAI,CAAC,WAAY,OAAM,IAAI,MAAM,wDAAwD;AAGzF,QAAI,CAACA,QAAO,UAAU,WAAW,WAAW,GAAG;AAC7C,YAAM,IAAI,MAAM,iDAAiD,WAAW,WAAW,EAAE;AAAA,IAC3F;AAGA,QAAI,WAAW,QAAQ,GAAG;AACxB,YAAM,IAAI,MAAM,uDAAuD,WAAW,KAAK,EAAE;AAAA,IAC3F;AAEA,UAAM,KAAgC;AAAA,MACpC,IAAI,WAAW;AAAA,MACf,OAAO,WAAW;AAAA,MAClB,MAAM,WAAW,OAAO,KAAK,WAAW,cAAc,WAAW,IAAI,IAAI;AAAA,IAC3E;AAEA,WAAO,KAAK,0BAA0B,IAAI,UAAU;AAAA,EACtD;AAAA,EAEA,MAAM,8BAA8B,YAAgE;AAClG,UAAM,aAAa,KAAK,OAAO,MAAM,UAAU,WAAW,MAAM,IAAI;AACpE,QAAI,CAAC,WAAY,OAAM,IAAI,MAAM,4DAA4D;AAE7F,UAAM,SAAS,qBAAqB,WAAW,MAAM,WAAW,MAAM;AACtE,QAAI,CAAC,UAAU,EAAE,UAAU,WAAW,CAAC,OAAO,MAAM;AAClD,YAAM,IAAI,MAAM,4DAA4D;AAAA,IAC9E;AAGA,QAAI,CAACA,QAAO,UAAU,WAAW,WAAW,GAAG;AAC7C,YAAM,IAAI,MAAM,8CAA8C,WAAW,WAAW,EAAE;AAAA,IACxF;AAGA,QAAI,WAAW,QAAQ,GAAG;AACxB,YAAM,IAAI,MAAM,4DAA4D,WAAW,KAAK,EAAE;AAAA,IAChG;AAEA,QAAI;AACF,YAAM,QAAQ,IAAIA,QAAO,UAAU,CAAC,YAAY,OAAO,IAAI,EAAE,CAAC;AAC9D,YAAM,cAAc,MAAM,mBAAmB,OAAO,MAAM,WAAW,IAAI;AAEzE,YAAM,KAAgC;AAAA,QACpC,IAAI,WAAW;AAAA,QACf,OAAO,WAAW;AAAA,QAClB,MAAM;AAAA,MACR;AAEA,aAAO,KAAK,0BAA0B,IAAI,UAAU;AAAA,IACtD,SAAS,OAAO;AACd,YAAM,IAAI,MAAM,uDAAuD,OAAO,IAAI,KAAK,KAAK,EAAE;AAAA,IAChG;AAAA,EACF;AAAA,EAEA,MAAM,aAAa,YAAoD;AACrE,UAAM,SAAS,qBAAqB,WAAW,MAAM,WAAW,MAAM;AACtE,QAAI,OAAO,SAAS,SAAS;AAC3B,YAAM,IAAI,MAAM,0DAA0D,OAAO,IAAI,EAAE;AAAA,IACzF;AACA,QAAI,CAAC,OAAO,MAAM;AAChB,YAAM,IAAI,MAAM,yDAAyD;AAAA,IAC3E;AAGA,QAAI,CAACA,QAAO,UAAU,WAAW,WAAW,GAAG;AAC7C,YAAM,IAAI,MAAM,wDAAwD,WAAW,WAAW,EAAE;AAAA,IAClG;AAEA,QAAI;AACF,YAAM,QAAQ,IAAIA,QAAO,UAAU,CAAC,YAAY,OAAO,IAAI,EAAE,CAAC;AAC9D,YAAM,cAAc,MAAM,mBAAmB,OAAO,MAAM,WAAW,IAAI;AAEzE,YAAM,SAAS,MAAM,KAAK,SAAS,KAAK;AAAA,QACtC,IAAI,WAAW;AAAA,QACf,MAAM;AAAA,MACR,CAAC;AAED,YAAM,gBAAgB,MAAM,qBAAqB,OAAO,MAAM,MAAM;AACpE,YAAM,YAAY;AAElB,YAAM,EAAE,QAAQ,QAAQ,IAAI,MAAM,KAAK,QAAQ;AAAA,QAC7C,WAAW;AAAA,QACX;AAAA,QACA,WAAW;AAAA,QACX,WAAW;AAAA,MACb;AAEA,YAAM,OAAO,YAAY,KAAK,QAAQ,CAAC,GAAG,WAAW,MAAM,WAAW,QAAQ,OAAO;AAErF,aAAO;AAAA,QACL,SAAS;AAAA,QACT,MAAM,WAAW;AAAA,QACjB,QAAQ,WAAW;AAAA,QACnB,MAAM,KAAK,OAAO,MAAM,UAAU,WAAW,MAAM,IAAI,KAAK;AAAA,QAC5D,QAAQ;AAAA,QACR,IAAI;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA,UAAU,uBAAuB,WAAW,MAAM,OAAO;AAAA,MAC3D;AAAA,IACF,SAAS,OAAO;AACd,aAAO;AAAA,QACL,SAAS;AAAA,QACT,MAAM,WAAW;AAAA,QACjB,QAAQ,WAAW;AAAA,QACnB,MAAM,KAAK,OAAO,MAAM,UAAU,WAAW,MAAM,IAAI,KAAK;AAAA,QAC5D,QAAQ;AAAA,QACR,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,QAAQ,CAAC;AAAA,QACT,SAAS,CAAC;AAAA,QACV,UAAU,CAAC;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,gBAAgB,OAAsB,OAAe,MAA2B,OAAgC;AACpH,UAAM,aAAa,KAAK,WAAW,cAAc,KAAK;AAEtD,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,YAAI,CAACA,QAAO,UAAU,UAAU,GAAG;AACjC,gBAAM,IAAI,MAAM,2BAA2B,UAAU,EAAE;AAAA,QACzD;AACA,eAAOA,QAAO,WAAW,UAAU;AAAA,MACrC,KAAK;AACH,YAAI,CAACA,QAAO,YAAY,UAAU,GAAG;AACnC,gBAAM,IAAI,MAAM,uBAAuB,UAAU,EAAE;AAAA,QACrD;AACA,eAAO;AAAA,MACT,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,cAAM,cAAc,OAAO,UAAU;AACrC,YAAI,cAAc,GAAG;AACnB,gBAAM,IAAI,MAAM,uCAAuC,IAAI,KAAK,UAAU,EAAE;AAAA,QAC9E;AACA,eAAO,YAAY,SAAS;AAAA,MAC9B;AACE,eAAO,OAAO,UAAU;AAAA,IAC5B;AAAA,EACF;AAAA,EAEA,MAAc,0BAA0B,IAA+B,MAAkD;AACvH,QAAI;AACF,YAAM,cAAc,MAAM,KAAK,SAAS,YAAY;AAAA,QAClD,GAAG;AAAA,QACH;AAAA,MACF,CAAC;AAGD,UAAI,cAAc,OAAO,iBAAiB,WAAW,WAAW,GAAG;AACjE,cAAM,IAAI,MAAM,yBAAyB,WAAW,EAAE;AAAA,MACxD;AACA,UAAI,cAAc,OAAO,iBAAiB,WAAW,WAAW,GAAG;AACjE,cAAM,IAAI,MAAM,0BAA0B,WAAW,EAAE;AAAA,MACzD;AAEA,YAAM,UAAU,MAAM,KAAK,SAAS,WAAW;AAG/C,UAAI,QAAQ,gBAAgB,QAAQ,sBAAsB;AAExD,eAAO;AAAA,UACL,GAAG;AAAA,UACH,UAAU;AAAA,UACV,cAAc,QAAQ;AAAA,UACtB,sBAAsB,QAAQ;AAAA,QAChC;AAAA,MACF,WAAW,QAAQ,UAAU;AAE3B,eAAO;AAAA,UACL,GAAG;AAAA,UACH,UAAU;AAAA,UACV,UAAU,QAAQ;AAAA,QACpB;AAAA,MACF,OAAO;AAEL,eAAO;AAAA,UACL,GAAG;AAAA,UACH,UAAU;AAAA,UACV,UAAUA,QAAO,WAAW,iBAAiB,SAAS,SAAS,KAAK;AAAA,QACtE;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AAEd,UAAI,kBAAkB,OAAO,iBAAiB,SAAS,OAAO;AAG9D,UAAI,GAAG,QAAQ,GAAG,SAAS,MAAM;AAC/B,0BAAkB,OAAO,iBAAiB,SAAS,YAAY;AAAA,MACjE,OAAO;AACL,0BAAkB,OAAO,iBAAiB,SAAS,QAAQ;AAAA,MAC7D;AAEA,aAAO;AAAA,QACL,GAAG;AAAA,QACH,UAAU;AAAA,QACV,UAAUA,QAAO,WAAW,iBAAiB,SAAS,SAAS,KAAK;AAAA,MACtE;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,YAAY,SAAiB,YAAqC;AACtE,UAAM,IAAI,MAAM,iBAAiB;AAAA,EACnC;AACF;;;AItQO,IAAM,kBAAN,MAAqD;AAAA,EAC1D,YACmB,OACA,QACjB;AAFiB;AACA;AAAA,EAChB;AAAA,EAEK,eAAwC;AAC9C,UAAM,iBAAiB,aAAa,KAAK,MAAM,IAAiC;AAChF,QAAI,CAAC,gBAAgB;AACnB,aAAO,CAAC,SAAyB;AAAA,IACnC;AAEA,UAAM,YAAY,eAAe,KAAK,OAAO,GAAG;AAChD,QAAI,CAAC,WAAW;AACd,aAAO,CAAC,SAAyB;AAAA,IACnC;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,qBAAmC;AACzC,UAAM,YAAY,KAAK,aAAa;AACpC,WAAO,UAAU,CAAC;AAAA,EACpB;AAAA,EAEQ,qBAAqB,UAAiC;AAC5D,UAAM,iBAAiB,KAAK,OAAO,aAAa,YAAY,KAAK,MAAM,IAAI;AAE3E,QAAI,kBAAkB,CAAC,UAAU;AAC/B,YAAMC,OAAM,aAAa,cAA8B;AACvD,UAAIA,KAAK,QAAOA;AAAA,IAClB;AAEA,QAAI,UAAU;AACZ,YAAMA,OAAM,aAAa,QAAQ;AACjC,UAAIA,KAAK,QAAOA;AAAA,IAClB;AAEA,UAAM,kBAAkB,KAAK,mBAAmB;AAChD,UAAM,MAAM,aAAa,eAAe;AACxC,WAAO,OAAO,aAAa,eAAe;AAAA,EAC5C;AAAA,EAEA,cAAc,SAAiB,UAAiC;AAC9D,UAAM,UAAU,KAAK,qBAAqB,QAAQ;AAClD,WAAO,GAAG,OAAO,YAAY,OAAO;AAAA,EACtC;AAAA,EAEA,kBAAkB,MAAc,UAAiC;AAC/D,UAAM,UAAU,KAAK,qBAAqB,QAAQ;AAClD,WAAO,GAAG,OAAO,OAAO,IAAI;AAAA,EAC9B;AAAA,EAEA,YAAY,aAA8B,UAAiC;AACzE,UAAM,UAAU,KAAK,qBAAqB,QAAQ;AAClD,WAAO,GAAG,OAAO,UAAU,WAAW;AAAA,EACxC;AAAA,EAEA,YAAY,YAAoB,UAAiC;AAC/D,UAAM,UAAU,KAAK,qBAAqB,QAAQ;AAClD,WAAO,GAAG,OAAO,UAAU,UAAU;AAAA,EACvC;AAAA,EAEA,eAAe,SAAiB,UAAiC;AAC/D,UAAM,UAAU,KAAK,qBAAqB,QAAQ;AAClD,WAAO,GAAG,OAAO,YAAY,OAAO;AAAA,EACtC;AAAA,EAEA,kBAA2C;AACzC,WAAO,KAAK,aAAa;AAAA,EAC3B;AAAA,EAEA,kBAAkB,MAAwC;AACxD,UAAM,YAAY,KAAK,aAAa;AACpC,WAAO,UAAU,KAAK,CAAC,aAAa,SAAS,YAAY,MAAM,KAAK,YAAY,CAAC;AAAA,EACnF;AAAA,EAEA,eAAe,SAA+C;AAC5D,UAAM,YAAY,KAAK,gBAAgB;AACvC,UAAM,OAAqC,CAAC;AAE5C,cAAU,QAAQ,CAAC,aAAa;AAC9B,YAAM,MAAM,aAAa,QAAQ;AACjC,UAAI,KAAK;AACP,aAAK,QAAQ,IAAI,GAAG,GAAG,YAAY,OAAO;AAAA,MAC5C;AAAA,IACF,CAAC;AAED,WAAO;AAAA,EACT;AAAA,EAEA,mBAAmB,MAA4C;AAC7D,UAAM,YAAY,KAAK,gBAAgB;AACvC,UAAM,OAAqC,CAAC;AAE5C,cAAU,QAAQ,CAAC,aAAa;AAC9B,YAAM,MAAM,aAAa,QAAQ;AACjC,UAAI,KAAK;AACP,aAAK,QAAQ,IAAI,GAAG,GAAG,OAAO,IAAI;AAAA,MACpC;AAAA,IACF,CAAC;AAED,WAAO;AAAA,EACT;AACF;;;ACpGO,IAAM,mBAAmB,CAC9B,WACA,aACA,eACmB;AACnB,SAAO,CAAC,QAA0B,aAAuB;AACvD,QAAI,CAAC,SAAU,OAAM,IAAI,MAAM,GAAG,SAAS,sCAAsC;AAEjF,WAAO;AAAA,MACL,OAAO;AAAA,MACP,WAAW,WAAW,OAAO,GAAG;AAAA,MAChC,QAAQ;AAAA,MACR,SAAS,MAAM,SAAS,QAAQ;AAAA,MAChC,UAAU,IAAI,gBAAgB,QAAQ,WAAW,OAAO,GAAG,CAAC;AAAA,MAC5D,SAAS,IAAI,eAAe,MAAM;AAAA,MAClC,YAAY,IAAI,kBAAkB;AAAA,MAClC,UAAU,SAAS;AAAA,MACnB,UAAU,IAAI,gBAAgB,WAAW,OAAO,GAAG,GAAG,MAAM;AAAA,MAC5D,YAAY,MAAM,SAAS,WAAW;AAAA,MACtC,cAAc,MAAM,SAAS,aAAa;AAAA,MAC1C,YAAY,IAAI,kBAAkB,QAAQ,WAAW,OAAO,GAAG,CAAC;AAAA,IAClE;AAAA,EACF;AACF;;;AC3BO,IAAM,oBAA+B;AAErC,IAAM,iBAAiC;AAAA,EAC5C,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,UAAU;AAAA,EACV,SAAS;AACX;AAEO,IAAM,qBAAqC,iBAAiB,mBAAmB,OAAO;AAAA,EAC3F,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,aAAa;AAAA,EACf;AAAA,EACA,SAAS;AAAA,IACP,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,aAAa;AAAA,EACf;AAAA,EACA,SAAS;AAAA,IACP,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,aAAa;AAAA,EACf;AACF,CAAC;;;ACrCM,IAAM,gBAA2B;AAEjC,IAAM,kBAAkC;AAAA,EAC7C,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,UAAU;AAAA,EACV,SAAS;AACX;AAEO,IAAM,iBAAiC,iBAAiB,eAAe,QAAQ;AAAA,EACpF,SAAS;AAAA,IACP,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,aAAa;AAAA,EACf;AAAA,EACA,SAAS;AAAA,IACP,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,aAAa;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,aAAa;AAAA,EACf;AACF,CAAC;;;ACrCM,IAAM,oBAA+B;AAErC,IAAM,iBAAiC;AAAA,EAC5C,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,UAAU;AAAA,EACV,SAAS;AACX;AAEO,IAAM,qBAAqC,iBAAiB,mBAAmB,OAAO;AAAA,EAC3F,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,aAAa;AAAA,EACf;AAAA,EACA,SAAS;AAAA,IACP,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,aAAa;AAAA,EACf;AAAA,EACA,SAAS;AAAA,IACP,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,aAAa;AAAA,EACf;AACF,CAAC;;;ACnCM,IAAM,oBAAoB,CAAC,QAA0B,aAAkC;AAAA,EAC5F,mBAAmB,QAAQ,QAAQ;AAAA,EACnC,mBAAmB,QAAQ,QAAQ;AAAA,EACnC,eAAe,QAAQ,QAAQ;AACjC;AAEO,IAAM,sBAAsB,MAAmB,CAAC,mBAAmB,eAAe,iBAAiB;","names":["getProviderUrl","ethers","EthereumExplorers","ArbitrumExplorers","BaseExplorers","WarpConstants","ethers","WarpConstants","getProviderUrl","ethers","url"]}
|
|
1
|
+
{"version":3,"sources":["../src/chains/arbitrum.ts","../src/WarpEvmDataLoader.ts","../src/LogoService.ts","../src/WarpEvmExecutor.ts","../src/constants.ts","../src/WarpEvmResults.ts","../src/WarpEvmSerializer.ts","../src/WarpEvmExplorer.ts","../src/chains/common.ts","../src/chains/base.ts","../src/chains/combined.ts","../src/chains/ethereum.ts"],"sourcesContent":["import { AdapterFactory, WarpChainAsset, WarpChainName } from '@vleap/warps'\nimport { createEvmAdapter } from './common'\n\nexport const NativeTokenArb: WarpChainAsset = {\n chain: WarpChainName.Arbitrum,\n identifier: 'ARB',\n name: 'ARB',\n decimals: 18,\n logoUrl: 'https://vleap.ai/images/tokens/arb.svg',\n}\n\nexport const getArbitrumAdapter: AdapterFactory = createEvmAdapter(WarpChainName.Arbitrum, 'arb', {\n mainnet: {\n name: WarpChainName.Arbitrum,\n displayName: 'Arbitrum',\n chainId: '42161',\n blockTime: 1000,\n addressHrp: '0x',\n defaultApiUrl: 'https://arb1.arbitrum.io/rpc',\n nativeToken: NativeTokenArb,\n },\n testnet: {\n name: WarpChainName.Arbitrum,\n displayName: 'Arbitrum Sepolia',\n chainId: '421614',\n blockTime: 1000,\n addressHrp: '0x',\n defaultApiUrl: 'https://sepolia-rollup.arbitrum.io/rpc',\n nativeToken: NativeTokenArb,\n },\n devnet: {\n name: WarpChainName.Arbitrum,\n displayName: 'Arbitrum Sepolia',\n chainId: '421614',\n blockTime: 1000,\n addressHrp: '0x',\n defaultApiUrl: 'https://sepolia-rollup.arbitrum.io/rpc',\n nativeToken: NativeTokenArb,\n },\n})\n","import {\n AdapterWarpDataLoader,\n getProviderUrl,\n WarpChainAccount,\n WarpChainAction,\n WarpChainAsset,\n WarpChainInfo,\n WarpClientConfig,\n WarpDataLoaderOptions,\n} from '@vleap/warps'\nimport { ethers } from 'ethers'\nimport { EvmLogoService } from './LogoService'\n\n// ERC20 ABI for token interactions\nconst ERC20_ABI = [\n 'function balanceOf(address owner) view returns (uint256)',\n 'function decimals() view returns (uint8)',\n 'function name() view returns (string)',\n 'function symbol() view returns (string)',\n 'function totalSupply() view returns (uint256)',\n]\n\n// ERC20 Transfer event for token detection\nconst ERC20_TRANSFER_EVENT = 'event Transfer(address indexed from, address indexed to, uint256 value)'\n\n// Known token lists for popular chains\nconst KNOWN_TOKENS: Record<string, Record<string, { name: string; symbol: string; decimals: number; logoUrl?: string }>> = {\n ethereum: {\n '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48': {\n name: 'USD Coin',\n symbol: 'USDC',\n decimals: 6,\n logoUrl: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png',\n },\n '0xdAC17F958D2ee523a2206206994597C13D831ec7': {\n name: 'Tether USD',\n symbol: 'USDT',\n decimals: 6,\n logoUrl: 'https://assets.coingecko.com/coins/images/325/small/Tether.png',\n },\n '0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599': {\n name: 'Wrapped Bitcoin',\n symbol: 'WBTC',\n decimals: 8,\n logoUrl: 'https://assets.coingecko.com/coins/images/7598/small/wrapped_bitcoin_wbtc.png',\n },\n '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2': {\n name: 'Wrapped Ether',\n symbol: 'WETH',\n decimals: 18,\n logoUrl: 'https://assets.coingecko.com/coins/images/2518/small/weth.png',\n },\n '0x6B175474E89094C44Da98b954EedeAC495271d0F': {\n name: 'Dai Stablecoin',\n symbol: 'DAI',\n decimals: 18,\n logoUrl: 'https://assets.coingecko.com/coins/images/9956/small/4943.png',\n },\n // Sepolia testnet tokens\n '0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238': {\n name: 'USD Coin',\n symbol: 'USDC',\n decimals: 6,\n logoUrl: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png',\n },\n '0x7169D38820dfd117C3FA1f22a697dBA58d90BA06': {\n name: 'Tether USD',\n symbol: 'USDT',\n decimals: 6,\n logoUrl: 'https://assets.coingecko.com/coins/images/325/small/Tether.png',\n },\n '0x7b79995e5f793A07Bc00c21412e50Ecae098E7f9': {\n name: 'Wrapped Ether',\n symbol: 'WETH',\n decimals: 18,\n logoUrl: 'https://assets.coingecko.com/coins/images/2518/small/weth.png',\n },\n },\n arbitrum: {\n '0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8': {\n name: 'USD Coin',\n symbol: 'USDC',\n decimals: 6,\n logoUrl: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png',\n },\n '0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9': {\n name: 'Tether USD',\n symbol: 'USDT',\n decimals: 6,\n logoUrl: 'https://assets.coingecko.com/coins/images/325/small/Tether.png',\n },\n '0x82aF49447D8a07e3bd95BD0d56f35241523fBab1': {\n name: 'Wrapped Ether',\n symbol: 'WETH',\n decimals: 18,\n logoUrl: 'https://assets.coingecko.com/coins/images/2518/small/weth.png',\n },\n },\n base: {\n '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913': {\n name: 'USD Coin',\n symbol: 'USDC',\n decimals: 6,\n logoUrl: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png',\n },\n '0x4200000000000000000000000000000000000006': {\n name: 'Wrapped Ether',\n symbol: 'WETH',\n decimals: 18,\n logoUrl: 'https://assets.coingecko.com/coins/images/2518/small/weth.png',\n },\n '0x036CbD53842c5426634e7929541eC2318f3dCF7e': {\n name: 'USD Coin',\n symbol: 'USDC',\n decimals: 6,\n logoUrl: 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png',\n },\n '0x808456652fdb597867f38412077A9182bf77359F': {\n name: 'Euro Coin',\n symbol: 'EURC',\n decimals: 6,\n logoUrl: 'https://assets.coingecko.com/coins/images/3318/small/euro-coin.png',\n },\n '0xcbB7C0006F23900c38EB856149F799620fcb8A4a': {\n name: 'Coinbase Wrapped BTC',\n symbol: 'CBETH',\n decimals: 8,\n logoUrl: 'https://assets.coingecko.com/coins/images/7598/small/wrapped_bitcoin_wbtc.png',\n },\n },\n}\n\ninterface TokenMetadata {\n name: string\n symbol: string\n decimals: number\n logoUrl?: string\n}\n\ninterface TokenBalance {\n tokenAddress: string\n balance: bigint\n metadata: TokenMetadata\n}\n\nexport class WarpEvmDataLoader implements AdapterWarpDataLoader {\n private provider: ethers.JsonRpcProvider\n\n constructor(\n private readonly config: WarpClientConfig,\n private readonly chain: WarpChainInfo\n ) {\n const apiUrl = getProviderUrl(this.config, this.chain.name, this.config.env, this.chain.defaultApiUrl)\n // Create provider with explicit network configuration using ethers.Network\n const network = new ethers.Network(this.chain.name, parseInt(this.chain.chainId))\n this.provider = new ethers.JsonRpcProvider(apiUrl, network)\n }\n\n async getAccount(address: string): Promise<WarpChainAccount> {\n try {\n const balance = await this.provider.getBalance(address)\n\n return {\n chain: this.chain.name,\n address,\n balance,\n }\n } catch (error) {\n throw new Error(`Failed to get account balance for ${address}: ${error}`)\n }\n }\n\n async getAccountAssets(address: string): Promise<WarpChainAsset[]> {\n try {\n const assets: WarpChainAsset[] = []\n\n // Get ERC20 token balances\n const tokenBalances = await this.getERC20TokenBalances(address)\n\n for (const tokenBalance of tokenBalances) {\n if (tokenBalance.balance > 0n) {\n const logoUrl =\n tokenBalance.metadata.logoUrl ||\n (await EvmLogoService.getLogoUrl(\n this.chain.name,\n tokenBalance.tokenAddress,\n tokenBalance.metadata.name,\n tokenBalance.metadata.symbol\n ))\n\n assets.push({\n chain: this.chain.name,\n identifier: tokenBalance.tokenAddress,\n name: tokenBalance.metadata.name,\n amount: tokenBalance.balance,\n decimals: tokenBalance.metadata.decimals,\n logoUrl: logoUrl || '',\n })\n }\n }\n\n return assets\n } catch (error) {\n throw new Error(`Failed to get account assets for ${address}: ${error}`)\n }\n }\n\n async getAccountActions(address: string, options?: WarpDataLoaderOptions): Promise<WarpChainAction[]> {\n return []\n }\n\n private async getERC20TokenBalances(address: string): Promise<TokenBalance[]> {\n const tokenBalances: TokenBalance[] = []\n\n // Get known tokens for this chain\n const knownTokens = KNOWN_TOKENS[this.chain.name] || {}\n\n // Process known tokens first\n for (const [tokenAddress, metadata] of Object.entries(knownTokens)) {\n try {\n const balance = await this.getTokenBalance(address, tokenAddress)\n if (balance > 0n) {\n tokenBalances.push({\n tokenAddress,\n balance,\n metadata,\n })\n }\n } catch (error) {\n // Skip tokens that fail to load\n }\n }\n\n // Try to detect additional tokens from transfer events\n const additionalTokens = await this.detectTokensFromEvents(address)\n for (const tokenAddress of additionalTokens) {\n if (!knownTokens[tokenAddress]) {\n try {\n const metadata = await this.getTokenMetadata(tokenAddress)\n const balance = await this.getTokenBalance(address, tokenAddress)\n if (balance > 0n) {\n tokenBalances.push({\n tokenAddress,\n balance,\n metadata,\n })\n }\n } catch (error) {\n // Skip tokens that fail to load\n }\n }\n }\n\n return tokenBalances\n }\n\n private async getTokenBalance(address: string, tokenAddress: string): Promise<bigint> {\n try {\n const contract = new ethers.Contract(tokenAddress, ERC20_ABI, this.provider)\n const balance = await contract.balanceOf(address)\n return balance\n } catch (error) {\n throw new Error(`Failed to get token balance: ${error}`)\n }\n }\n\n private async getTokenMetadata(tokenAddress: string): Promise<TokenMetadata> {\n try {\n const tokenInfo = await EvmLogoService.getTokenInfo(this.chain.name, tokenAddress)\n\n if (tokenInfo.name && tokenInfo.symbol && tokenInfo.decimals !== undefined) {\n return {\n name: tokenInfo.name,\n symbol: tokenInfo.symbol,\n decimals: tokenInfo.decimals,\n logoUrl: tokenInfo.logoURI,\n }\n }\n\n const contract = new ethers.Contract(tokenAddress, ERC20_ABI, this.provider)\n const [name, symbol, decimals] = await Promise.all([\n contract.name().catch(() => tokenInfo.name || 'Unknown Token'),\n contract.symbol().catch(() => tokenInfo.symbol || 'UNKNOWN'),\n contract.decimals().catch(() => tokenInfo.decimals || 18),\n ])\n\n return {\n name: name || tokenInfo.name || 'Unknown Token',\n symbol: symbol || tokenInfo.symbol || 'UNKNOWN',\n decimals: decimals || tokenInfo.decimals || 18,\n logoUrl: tokenInfo.logoURI,\n }\n } catch (error) {\n throw new Error(`Failed to get token metadata: ${error}`)\n }\n }\n\n private async detectTokensFromEvents(address: string): Promise<string[]> {\n try {\n // Get recent blocks to scan for transfer events\n const currentBlock = await this.provider.getBlockNumber()\n const fromBlock = Math.max(0, currentBlock - 10000) // Scan last 10k blocks\n\n // Create filter for Transfer events where the address is the recipient\n const filter = {\n fromBlock,\n toBlock: currentBlock,\n topics: [\n ethers.id('Transfer(address,address,uint256)'),\n null, // from address (any)\n ethers.zeroPadValue(address, 32), // to address (our target)\n ],\n }\n\n const logs = await this.provider.getLogs(filter)\n\n // Extract unique token addresses from transfer events\n const tokenAddresses = new Set<string>()\n for (const log of logs) {\n tokenAddresses.add(log.address)\n }\n\n return Array.from(tokenAddresses)\n } catch (error) {\n return []\n }\n }\n\n // Additional utility methods for enhanced token support\n async getTokenInfo(tokenAddress: string): Promise<TokenMetadata | null> {\n try {\n return await this.getTokenMetadata(tokenAddress)\n } catch (error) {\n // Silently fail for invalid addresses or network issues\n return null\n }\n }\n\n async getTokenBalanceForAddress(address: string, tokenAddress: string): Promise<bigint> {\n try {\n return await this.getTokenBalance(address, tokenAddress)\n } catch (error) {\n throw new Error(`Failed to get token balance for ${tokenAddress}: ${error}`)\n }\n }\n\n async getMultipleTokenBalances(address: string, tokenAddresses: string[]): Promise<Map<string, bigint>> {\n const balances = new Map<string, bigint>()\n\n await Promise.all(\n tokenAddresses.map(async (tokenAddress) => {\n try {\n const balance = await this.getTokenBalance(address, tokenAddress)\n balances.set(tokenAddress, balance)\n } catch (error) {\n // Silently fail for invalid addresses or network issues\n balances.set(tokenAddress, 0n)\n }\n })\n )\n\n return balances\n }\n\n async getAccountTokens(address: string): Promise<WarpChainAsset[]> {\n return this.getAccountAssets(address)\n }\n\n async getTokenMetadataPublic(tokenAddress: string): Promise<TokenMetadata | null> {\n try {\n return await this.getTokenMetadata(tokenAddress)\n } catch (error) {\n return null\n }\n }\n\n async getChainInfo(): Promise<{ chainId: string; blockTime: number }> {\n try {\n const network = await this.provider.getNetwork()\n const latestBlock = await this.provider.getBlock('latest')\n\n return {\n chainId: network.chainId.toString(),\n blockTime: latestBlock?.timestamp ? Date.now() / 1000 - latestBlock.timestamp : 12,\n }\n } catch (error) {\n throw new Error(`Failed to get chain info: ${error}`)\n }\n }\n}\n","interface TokenInfo {\n name?: string\n symbol?: string\n logoURI?: string\n decimals?: number\n}\n\ninterface TokenListResponse {\n tokens: Array<{\n chainId: number\n address: string\n name: string\n symbol: string\n decimals: number\n logoURI?: string\n }>\n}\n\nconst CHAIN_IDS: Record<string, number> = {\n ethereum: 1,\n arbitrum: 42161,\n base: 8453,\n}\n\nconst FALLBACK_LOGOS: Record<string, Record<string, string>> = {\n ethereum: {\n '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48': 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png',\n '0xdAC17F958D2ee523a2206206994597C13D831ec7': 'https://assets.coingecko.com/coins/images/325/small/Tether.png',\n '0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599': 'https://assets.coingecko.com/coins/images/7598/small/wrapped_bitcoin_wbtc.png',\n '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2': 'https://assets.coingecko.com/coins/images/2518/small/weth.png',\n '0x6B175474E89094C44Da98b954EedeAC495271d0F': 'https://assets.coingecko.com/coins/images/9956/small/4943.png',\n },\n arbitrum: {\n '0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8': 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png',\n '0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9': 'https://assets.coingecko.com/coins/images/325/small/Tether.png',\n '0x82aF49447D8a07e3bd95BD0d56f35241523fBab1': 'https://assets.coingecko.com/coins/images/2518/small/weth.png',\n },\n base: {\n '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913': 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png',\n '0x4200000000000000000000000000000000000006': 'https://assets.coingecko.com/coins/images/2518/small/weth.png',\n '0x036CbD53842c5426634e7929541eC2318f3dCF7e': 'https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png',\n '0x808456652fdb597867f38412077A9182bf77359F': 'https://assets.coingecko.com/coins/images/3318/small/euro-coin.png',\n '0xcbB7C0006F23900c38EB856149F799620fcb8A4a': 'https://assets.coingecko.com/coins/images/7598/small/wrapped_bitcoin_wbtc.png',\n },\n}\n\nconst TOKEN_LISTS = [\n 'https://tokens.uniswap.org',\n 'https://raw.githubusercontent.com/compound-finance/token-list/master/compound.tokenlist.json',\n 'https://tokens.1inch.io',\n]\n\nconst logoCache = new Map<string, string>()\nconst tokenInfoCache = new Map<string, TokenInfo>()\nconst tokenListCache = new Map<string, TokenInfo>()\n\nexport class EvmLogoService {\n static async getTokenInfo(chainName: string, tokenAddress: string): Promise<TokenInfo> {\n const cacheKey = `${chainName}:${tokenAddress.toLowerCase()}`\n\n if (tokenInfoCache.has(cacheKey)) {\n return tokenInfoCache.get(cacheKey)!\n }\n\n let tokenInfo: TokenInfo = {}\n\n try {\n tokenInfo = await this.fetchFromTokenLists(chainName, tokenAddress)\n } catch (error) {}\n\n if (!tokenInfo.logoURI) {\n try {\n tokenInfo = { ...tokenInfo, ...(await this.fetchFromDefiLlama(chainName, tokenAddress)) }\n } catch (error) {}\n }\n\n tokenInfoCache.set(cacheKey, tokenInfo)\n return tokenInfo\n }\n\n static async getLogoUrl(chainName: string, tokenAddress: string, tokenName?: string, tokenSymbol?: string): Promise<string> {\n const cacheKey = `${chainName}:${tokenAddress.toLowerCase()}`\n\n if (logoCache.has(cacheKey)) {\n return logoCache.get(cacheKey)!\n }\n\n let logoUrl = ''\n\n const fallbackLogos = FALLBACK_LOGOS[chainName]\n if (fallbackLogos && fallbackLogos[tokenAddress]) {\n logoUrl = fallbackLogos[tokenAddress]\n } else {\n const tokenInfo = await this.getTokenInfo(chainName, tokenAddress)\n logoUrl = tokenInfo.logoURI || ''\n\n if (!logoUrl && (tokenSymbol || tokenName)) {\n try {\n logoUrl = await this.fetchFromTrustWallet(chainName, tokenAddress)\n } catch (error) {}\n }\n }\n\n logoCache.set(cacheKey, logoUrl)\n return logoUrl\n }\n\n private static async fetchFromTokenLists(chainName: string, tokenAddress: string): Promise<TokenInfo> {\n const chainId = CHAIN_IDS[chainName]\n if (!chainId) return {}\n\n const normalizedAddress = tokenAddress.toLowerCase()\n\n if (tokenListCache.has(`${chainId}:${normalizedAddress}`)) {\n return tokenListCache.get(`${chainId}:${normalizedAddress}`) || {}\n }\n\n for (const tokenListUrl of TOKEN_LISTS) {\n try {\n const response = await fetch(tokenListUrl, {\n headers: { Accept: 'application/json' },\n signal: AbortSignal.timeout(5000),\n })\n\n if (response.ok) {\n const data: TokenListResponse = await response.json()\n\n const token = data.tokens.find((t) => t.chainId === chainId && t.address.toLowerCase() === normalizedAddress)\n\n if (token) {\n const tokenInfo: TokenInfo = {\n name: token.name,\n symbol: token.symbol,\n decimals: token.decimals,\n logoURI: token.logoURI,\n }\n tokenListCache.set(`${chainId}:${normalizedAddress}`, tokenInfo)\n return tokenInfo\n }\n }\n } catch (error) {\n continue\n }\n }\n\n return {}\n }\n\n private static async fetchFromDefiLlama(chainName: string, tokenAddress: string): Promise<TokenInfo> {\n try {\n const chainMapping: Record<string, string> = {\n ethereum: 'ethereum',\n arbitrum: 'arbitrum',\n base: 'base',\n }\n\n const chain = chainMapping[chainName]\n if (!chain) return {}\n\n const response = await fetch(`https://coins.llama.fi/prices/current/${chain}:${tokenAddress}`, { signal: AbortSignal.timeout(5000) })\n\n if (response.ok) {\n const data = await response.json()\n const coinData = data.coins?.[`${chain}:${tokenAddress}`]\n\n if (coinData) {\n return {\n symbol: coinData.symbol,\n logoURI: coinData.logoURI,\n }\n }\n }\n } catch (error) {}\n\n return {}\n }\n\n private static async fetchFromTrustWallet(chainName: string, tokenAddress: string): Promise<string> {\n try {\n const chainMapping: Record<string, string> = {\n ethereum: 'ethereum',\n arbitrum: 'arbitrum',\n base: 'base',\n }\n\n const chain = chainMapping[chainName]\n if (!chain) return ''\n\n const logoUrl = `https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/${chain}/assets/${tokenAddress}/logo.png`\n\n const response = await fetch(logoUrl, {\n method: 'HEAD',\n signal: AbortSignal.timeout(3000),\n })\n\n if (response.ok) {\n return logoUrl\n }\n } catch (error) {}\n\n return ''\n }\n\n static clearCache(): void {\n logoCache.clear()\n tokenInfoCache.clear()\n tokenListCache.clear()\n }\n\n static getCacheSize(): number {\n return logoCache.size + tokenInfoCache.size + tokenListCache.size\n }\n}\n","import {\n AdapterWarpExecutor,\n applyResultsToMessages,\n getNextInfo,\n getProviderUrl,\n getWarpActionByIndex,\n WarpActionInputType,\n WarpChainAssetValue,\n WarpChainInfo,\n WarpClientConfig,\n WarpExecutable,\n WarpExecution,\n WarpQueryAction,\n} from '@vleap/warps'\nimport { ethers } from 'ethers'\nimport { WarpEvmConstants } from './constants'\nimport { WarpEvmResults } from './WarpEvmResults'\nimport { WarpEvmSerializer } from './WarpEvmSerializer'\n\nexport class WarpEvmExecutor implements AdapterWarpExecutor {\n private readonly serializer: WarpEvmSerializer\n private readonly provider: ethers.JsonRpcProvider\n private readonly results: WarpEvmResults\n\n constructor(\n private readonly config: WarpClientConfig,\n private readonly chain: WarpChainInfo\n ) {\n this.serializer = new WarpEvmSerializer()\n const apiUrl = getProviderUrl(this.config, chain.name, this.config.env, this.chain.defaultApiUrl)\n // Create provider with explicit network configuration using ethers.Network\n const network = new ethers.Network(this.chain.name, parseInt(this.chain.chainId))\n this.provider = new ethers.JsonRpcProvider(apiUrl, network)\n this.results = new WarpEvmResults(config, this.chain)\n }\n\n async createTransaction(executable: WarpExecutable): Promise<ethers.TransactionRequest> {\n const action = getWarpActionByIndex(executable.warp, executable.action)\n\n let tx: ethers.TransactionRequest | null = null\n if (action.type === 'transfer') {\n tx = await this.createTransferTransaction(executable)\n } else if (action.type === 'contract') {\n tx = await this.createContractCallTransaction(executable)\n } else if (action.type === 'query') {\n throw new Error('WarpEvmExecutor: Invalid action type for createTransaction; Use executeQuery instead')\n } else if (action.type === 'collect') {\n throw new Error('WarpEvmExecutor: Invalid action type for createTransaction; Use executeCollect instead')\n }\n\n if (!tx) throw new Error(`WarpEvmExecutor: Invalid action type (${action.type})`)\n\n return tx\n }\n\n async createTransferTransaction(executable: WarpExecutable): Promise<ethers.TransactionRequest> {\n const userWallet = this.config.user?.wallets?.[executable.chain.name]\n if (!userWallet) throw new Error('WarpEvmExecutor: createTransfer - user address not set')\n\n if (!ethers.isAddress(executable.destination)) {\n throw new Error(`WarpEvmExecutor: Invalid destination address: ${executable.destination}`)\n }\n\n // Handle token transfers\n if (executable.transfers && executable.transfers.length > 0) {\n return this.createTokenTransferTransaction(executable, userWallet)\n }\n\n // Native token transfer\n const tx: ethers.TransactionRequest = {\n to: executable.destination,\n value: executable.value,\n data: executable.data ? this.serializer.stringToTyped(executable.data) : '0x',\n }\n\n return this.estimateGasAndSetDefaults(tx, userWallet)\n }\n\n async createContractCallTransaction(executable: WarpExecutable): Promise<ethers.TransactionRequest> {\n const userWallet = this.config.user?.wallets?.[executable.chain.name]\n if (!userWallet) throw new Error('WarpEvmExecutor: createContractCall - user address not set')\n\n const action = getWarpActionByIndex(executable.warp, executable.action)\n if (!action || !('func' in action) || !action.func) {\n throw new Error('WarpEvmExecutor: Contract action must have a function name')\n }\n\n // Validate destination address\n if (!ethers.isAddress(executable.destination)) {\n throw new Error(`WarpEvmExecutor: Invalid contract address: ${executable.destination}`)\n }\n\n try {\n const iface = new ethers.Interface([`function ${action.func}`])\n const encodedData = iface.encodeFunctionData(action.func, executable.args)\n\n const tx: ethers.TransactionRequest = {\n to: executable.destination,\n value: executable.value,\n data: encodedData,\n }\n\n return this.estimateGasAndSetDefaults(tx, userWallet)\n } catch (error) {\n throw new Error(`WarpEvmExecutor: Failed to encode function data for ${action.func}: ${error}`)\n }\n }\n\n private async createTokenTransferTransaction(executable: WarpExecutable, userWallet: string): Promise<ethers.TransactionRequest> {\n if (executable.transfers.length === 0) {\n throw new Error('WarpEvmExecutor: No transfers provided')\n }\n\n // Check if we have a native token defined for this chain\n if (!this.chain.nativeToken?.identifier) {\n throw new Error('WarpEvmExecutor: No native token defined for this chain')\n }\n\n // Separate native token transfers from ERC-20 token transfers\n const nativeTokenTransfers = executable.transfers.filter((transfer) => transfer.identifier === this.chain.nativeToken!.identifier)\n const erc20Transfers = executable.transfers.filter((transfer) => transfer.identifier !== this.chain.nativeToken!.identifier)\n\n // Handle single native token transfer\n if (nativeTokenTransfers.length === 1 && erc20Transfers.length === 0) {\n const transfer = nativeTokenTransfers[0]\n\n // Validate native token amount\n if (transfer.amount <= 0n) {\n throw new Error('WarpEvmExecutor: Native token transfer amount must be positive')\n }\n\n const tx: ethers.TransactionRequest = {\n to: executable.destination,\n value: transfer.amount,\n data: '0x',\n }\n\n return this.estimateGasAndSetDefaults(tx, userWallet)\n }\n\n // Handle single ERC-20 token transfer\n if (nativeTokenTransfers.length === 0 && erc20Transfers.length === 1) {\n return this.createSingleTokenTransfer(executable, erc20Transfers[0], userWallet)\n }\n\n // Handle multiple transfers (not yet supported)\n if (executable.transfers.length > 1) {\n throw new Error('WarpEvmExecutor: Multiple token transfers not yet supported')\n }\n\n // This should never happen, but just in case\n throw new Error('WarpEvmExecutor: Invalid transfer configuration')\n }\n\n private async createSingleTokenTransfer(\n executable: WarpExecutable,\n transfer: WarpChainAssetValue,\n userWallet: string\n ): Promise<ethers.TransactionRequest> {\n if (!ethers.isAddress(transfer.identifier)) {\n throw new Error(`WarpEvmExecutor: Invalid token address: ${transfer.identifier}`)\n }\n\n // ERC-20 transfer function signature: transfer(address to, uint256 amount)\n const transferInterface = new ethers.Interface(['function transfer(address to, uint256 amount) returns (bool)'])\n\n const encodedData = transferInterface.encodeFunctionData('transfer', [executable.destination, transfer.amount])\n\n const tx: ethers.TransactionRequest = {\n to: transfer.identifier, // Token contract address\n value: 0n, // No native token value for ERC-20 transfers\n data: encodedData,\n }\n\n return this.estimateGasAndSetDefaults(tx, userWallet)\n }\n\n async executeQuery(executable: WarpExecutable): Promise<WarpExecution> {\n const action = getWarpActionByIndex(executable.warp, executable.action) as WarpQueryAction\n if (action.type !== 'query') {\n throw new Error(`WarpEvmExecutor: Invalid action type for executeQuery: ${action.type}`)\n }\n if (!action.func) {\n throw new Error('WarpEvmExecutor: Query action must have a function name')\n }\n\n // Validate destination address\n if (!ethers.isAddress(executable.destination)) {\n throw new Error(`WarpEvmExecutor: Invalid contract address for query: ${executable.destination}`)\n }\n\n try {\n const iface = new ethers.Interface([`function ${action.func}`])\n const encodedData = iface.encodeFunctionData(action.func, executable.args)\n\n const result = await this.provider.call({\n to: executable.destination,\n data: encodedData,\n })\n\n const decodedResult = iface.decodeFunctionResult(action.func, result)\n const isSuccess = true\n\n const { values, valuesRaw, results } = await this.results.extractQueryResults(\n executable.warp,\n decodedResult,\n executable.action,\n executable.resolvedInputs\n )\n\n const next = getNextInfo(this.config, [], executable.warp, executable.action, results)\n\n return {\n success: isSuccess,\n warp: executable.warp,\n action: executable.action,\n user: this.config.user?.wallets?.[executable.chain.name] || null,\n txHash: null,\n tx: null,\n next,\n values,\n valuesRaw,\n results,\n messages: applyResultsToMessages(executable.warp, results),\n }\n } catch (error) {\n return {\n success: false,\n warp: executable.warp,\n action: executable.action,\n user: this.config.user?.wallets?.[executable.chain.name] || null,\n txHash: null,\n tx: null,\n next: null,\n values: [],\n valuesRaw: [],\n results: {},\n messages: {},\n }\n }\n }\n\n async preprocessInput(chain: WarpChainInfo, input: string, type: WarpActionInputType, value: string): Promise<string> {\n return input\n }\n\n private async estimateGasAndSetDefaults(tx: ethers.TransactionRequest, from: string): Promise<ethers.TransactionRequest> {\n try {\n const gasEstimate = await this.provider.estimateGas({\n ...tx,\n from,\n })\n\n // Validate gas estimate\n if (gasEstimate < BigInt(WarpEvmConstants.Validation.MinGasLimit)) {\n throw new Error(`Gas estimate too low: ${gasEstimate}`)\n }\n if (gasEstimate > BigInt(WarpEvmConstants.Validation.MaxGasLimit)) {\n throw new Error(`Gas estimate too high: ${gasEstimate}`)\n }\n\n const feeData = await this.provider.getFeeData()\n\n // Handle both EIP-1559 and legacy gas pricing\n if (feeData.maxFeePerGas && feeData.maxPriorityFeePerGas) {\n // EIP-1559 pricing\n return {\n ...tx,\n chainId: BigInt(this.chain.chainId),\n gasLimit: gasEstimate,\n maxFeePerGas: feeData.maxFeePerGas,\n maxPriorityFeePerGas: feeData.maxPriorityFeePerGas,\n }\n } else if (feeData.gasPrice) {\n // Legacy pricing\n return {\n ...tx,\n chainId: BigInt(this.chain.chainId),\n gasLimit: gasEstimate,\n gasPrice: feeData.gasPrice,\n }\n } else {\n // Fallback to default values\n return {\n ...tx,\n chainId: BigInt(this.chain.chainId),\n gasLimit: gasEstimate,\n gasPrice: ethers.parseUnits(WarpEvmConstants.GasPrice.Default, 'wei'),\n }\n }\n } catch (error) {\n // If gas estimation fails, use default values based on transaction type\n let defaultGasLimit = BigInt(WarpEvmConstants.GasLimit.Default)\n\n // Determine gas limit based on transaction type\n if (tx.data && tx.data !== '0x') {\n // Check if this is a token transfer by looking for ERC-20 transfer function signature\n if (tx.data.startsWith('0xa9059cbb')) {\n // transfer(address,uint256) function signature\n defaultGasLimit = BigInt(WarpEvmConstants.GasLimit.TokenTransfer)\n } else {\n defaultGasLimit = BigInt(WarpEvmConstants.GasLimit.ContractCall)\n }\n } else {\n defaultGasLimit = BigInt(WarpEvmConstants.GasLimit.Transfer)\n }\n\n return {\n ...tx,\n chainId: BigInt(this.chain.chainId),\n gasLimit: defaultGasLimit,\n gasPrice: ethers.parseUnits(WarpEvmConstants.GasPrice.Default, 'wei'),\n }\n }\n }\n\n async signMessage(message: string, privateKey: string): Promise<string> {\n try {\n const wallet = new ethers.Wallet(privateKey)\n const signature = await wallet.signMessage(message)\n return signature\n } catch (error) {\n throw new Error(`Failed to sign message: ${error}`)\n }\n }\n\n async verifyMessage(message: string, signature: string): Promise<string> {\n try {\n const recoveredAddress = ethers.verifyMessage(message, signature)\n return recoveredAddress\n } catch (error) {\n throw new Error(`Failed to verify message: ${error}`)\n }\n }\n}\n","export const WarpEvmConstants = {\n GasLimit: {\n Default: 21000,\n ContractCall: 100000,\n ContractDeploy: 500000,\n Transfer: 21000,\n TokenTransfer: 65000, // ERC-20 transfer gas limit\n Approve: 46000,\n Swap: 200000,\n },\n GasPrice: {\n Default: '20000000000',\n },\n Validation: {\n MinGasLimit: 21000,\n MaxGasLimit: 30000000,\n },\n}\n\nexport enum EthereumExplorers {\n Etherscan = 'etherscan',\n EtherscanSepolia = 'etherscan_sepolia',\n Ethplorer = 'ethplorer',\n Blockscout = 'blockscout',\n BlockscoutSepolia = 'blockscout_sepolia',\n}\n\nexport enum ArbitrumExplorers {\n Arbiscan = 'arbiscan',\n ArbiscanSepolia = 'arbiscan_sepolia',\n BlockscoutArbitrum = 'blockscout_arbitrum',\n BlockscoutArbitrumSepolia = 'blockscout_arbitrum_sepolia',\n}\n\nexport enum BaseExplorers {\n Basescan = 'basescan',\n BasescanSepolia = 'basescan_sepolia',\n BlockscoutBase = 'blockscout_base',\n BlockscoutBaseSepolia = 'blockscout_base_sepolia',\n}\n\nexport type ExplorerName = EthereumExplorers | ArbitrumExplorers | BaseExplorers\n\nexport const EvmExplorers = {\n ethereum: {\n mainnet: [EthereumExplorers.Etherscan, EthereumExplorers.Ethplorer, EthereumExplorers.Blockscout] as const,\n testnet: [EthereumExplorers.EtherscanSepolia, EthereumExplorers.BlockscoutSepolia] as const,\n devnet: [EthereumExplorers.EtherscanSepolia, EthereumExplorers.BlockscoutSepolia] as const,\n },\n arbitrum: {\n mainnet: [ArbitrumExplorers.Arbiscan, ArbitrumExplorers.BlockscoutArbitrum] as const,\n testnet: [ArbitrumExplorers.ArbiscanSepolia, ArbitrumExplorers.BlockscoutArbitrumSepolia] as const,\n devnet: [ArbitrumExplorers.ArbiscanSepolia, ArbitrumExplorers.BlockscoutArbitrumSepolia] as const,\n },\n base: {\n mainnet: [BaseExplorers.Basescan, BaseExplorers.BlockscoutBase] as const,\n testnet: [BaseExplorers.BasescanSepolia, BaseExplorers.BlockscoutBaseSepolia] as const,\n devnet: [BaseExplorers.BasescanSepolia, BaseExplorers.BlockscoutBaseSepolia] as const,\n },\n} as const\n\nexport const ExplorerUrls: Record<ExplorerName, string> = {\n [EthereumExplorers.Etherscan]: 'https://etherscan.io',\n [EthereumExplorers.EtherscanSepolia]: 'https://sepolia.etherscan.io',\n [EthereumExplorers.Ethplorer]: 'https://ethplorer.io',\n [EthereumExplorers.Blockscout]: 'https://eth.blockscout.com',\n [EthereumExplorers.BlockscoutSepolia]: 'https://sepolia.blockscout.com',\n\n [ArbitrumExplorers.Arbiscan]: 'https://arbiscan.io',\n [ArbitrumExplorers.ArbiscanSepolia]: 'https://sepolia.arbiscan.io',\n [ArbitrumExplorers.BlockscoutArbitrum]: 'https://arbitrum.blockscout.com',\n [ArbitrumExplorers.BlockscoutArbitrumSepolia]: 'https://sepolia.blockscout.com',\n\n [BaseExplorers.Basescan]: 'https://basescan.org',\n [BaseExplorers.BasescanSepolia]: 'https://sepolia.basescan.org',\n [BaseExplorers.BlockscoutBase]: 'https://base.blockscout.com',\n [BaseExplorers.BlockscoutBaseSepolia]: 'https://sepolia.blockscout.com',\n}\n","import {\n AdapterWarpResults,\n evaluateResultsCommon,\n getProviderUrl,\n parseResultsOutIndex,\n ResolvedInput,\n Warp,\n WarpChainInfo,\n WarpClientConfig,\n WarpConstants,\n WarpExecution,\n WarpExecutionResults,\n} from '@vleap/warps'\nimport { ethers } from 'ethers'\nimport { WarpEvmSerializer } from './WarpEvmSerializer'\n\nexport class WarpEvmResults implements AdapterWarpResults {\n private readonly serializer: WarpEvmSerializer\n private readonly provider: ethers.JsonRpcProvider\n\n constructor(\n private readonly config: WarpClientConfig,\n private readonly chain?: WarpChainInfo\n ) {\n this.serializer = new WarpEvmSerializer()\n // Use chain-specific provider if available, otherwise fallback to ethereum\n if (this.chain) {\n const apiUrl = getProviderUrl(this.config, this.chain.name, this.config.env, this.chain.defaultApiUrl)\n const network = new ethers.Network(this.chain.name, parseInt(this.chain.chainId))\n this.provider = new ethers.JsonRpcProvider(apiUrl, network)\n } else {\n // Fallback for backward compatibility\n const apiUrl = getProviderUrl(this.config, 'ethereum', this.config.env, 'https://ethereum-rpc.publicnode.com')\n const network = new ethers.Network('ethereum', 1)\n this.provider = new ethers.JsonRpcProvider(apiUrl, network)\n }\n }\n\n async getTransactionExecutionResults(warp: Warp, tx: ethers.TransactionReceipt): Promise<WarpExecution> {\n const success = tx.status === 1\n const gasUsed = tx.gasUsed?.toString() || '0'\n const gasPrice = tx.gasPrice?.toString() || '0'\n const blockNumber = tx.blockNumber?.toString() || '0'\n const transactionHash = tx.hash\n\n const logs = tx.logs.map((log) => ({\n address: log.address,\n topics: log.topics,\n data: log.data,\n blockNumber: log.blockNumber?.toString() || '0',\n transactionHash: log.transactionHash,\n index: log.index?.toString() || '0',\n }))\n\n return {\n success,\n warp,\n action: 0,\n user: this.config.user?.wallets?.evm || null,\n txHash: transactionHash,\n tx,\n next: null,\n values: [transactionHash, blockNumber, gasUsed, gasPrice, ...(logs.length > 0 ? logs : [])],\n valuesRaw: [transactionHash, blockNumber, gasUsed, gasPrice, ...(logs.length > 0 ? logs : [])],\n results: {},\n messages: {},\n }\n }\n\n async extractQueryResults(\n warp: Warp,\n typedValues: any[],\n actionIndex: number,\n inputs: ResolvedInput[]\n ): Promise<{ values: any[]; valuesRaw: any[]; results: WarpExecutionResults }> {\n const values = typedValues.map((t) => this.serializer.typedToString(t))\n const valuesRaw = typedValues.map((t) => this.serializer.typedToNative(t)[1])\n let results: WarpExecutionResults = {}\n\n if (!warp.results) return { values, valuesRaw, results }\n\n const getNestedValue = (path: string): unknown => {\n const indices = path\n .split('.')\n .slice(1)\n .map((i) => parseInt(i) - 1)\n if (indices.length === 0) return undefined\n let value: any = valuesRaw[indices[0]]\n for (let i = 1; i < indices.length; i++) {\n if (value === undefined || value === null) return undefined\n value = value[indices[i]]\n }\n return value\n }\n\n for (const [key, path] of Object.entries(warp.results)) {\n if (path.startsWith(WarpConstants.Transform.Prefix)) continue\n const currentActionIndex = parseResultsOutIndex(path)\n if (currentActionIndex !== null && currentActionIndex !== actionIndex) {\n results[key] = null\n continue\n }\n if (path.startsWith('out.') || path === 'out' || path.startsWith('out[')) {\n results[key] = getNestedValue(path) || null\n } else {\n results[key] = path\n }\n }\n\n return { values, valuesRaw, results: await evaluateResultsCommon(warp, results, actionIndex, inputs) }\n }\n\n async getTransactionStatus(\n txHash: string\n ): Promise<{ status: 'pending' | 'confirmed' | 'failed'; blockNumber?: number; gasUsed?: bigint }> {\n try {\n const receipt = await this.provider.getTransactionReceipt(txHash)\n\n if (!receipt) {\n return { status: 'pending' }\n }\n\n return {\n status: receipt.status === 1 ? 'confirmed' : 'failed',\n blockNumber: receipt.blockNumber,\n gasUsed: receipt.gasUsed,\n }\n } catch (error) {\n throw new Error(`Failed to get transaction status: ${error}`)\n }\n }\n\n async getTransactionReceipt(txHash: string): Promise<ethers.TransactionReceipt | null> {\n try {\n return await this.provider.getTransactionReceipt(txHash)\n } catch (error) {\n return null\n }\n }\n}\n","import {\n AdapterWarpSerializer,\n BaseWarpActionInputType,\n WarpActionInputType,\n WarpAdapterGenericType,\n WarpConstants,\n WarpNativeValue,\n WarpSerializer,\n} from '@vleap/warps'\nimport { ethers } from 'ethers'\n\nconst SplitParamsRegex = new RegExp(`${WarpConstants.ArgParamsSeparator}(.*)`)\n\nexport class WarpEvmSerializer implements AdapterWarpSerializer {\n public readonly coreSerializer: WarpSerializer\n\n constructor() {\n this.coreSerializer = new WarpSerializer()\n }\n\n typedToString(value: any): string {\n if (typeof value === 'string') {\n if (ethers.isAddress(value)) {\n return `address:${value}`\n }\n if (ethers.isHexString(value) && !ethers.isAddress(value)) {\n return `hex:${value}`\n }\n return `string:${value}`\n }\n if (typeof value === 'number') {\n if (Number.isInteger(value)) {\n if (value >= 0 && value <= 255) return `uint8:${value}`\n if (value >= 0 && value <= 65535) return `uint16:${value}`\n if (value >= 0 && value <= 4294967295) return `uint32:${value}`\n return `uint64:${value}`\n }\n return `string:${value}`\n }\n if (typeof value === 'bigint') {\n return `biguint:${value.toString()}`\n }\n if (typeof value === 'boolean') {\n return `boolean:${value}`\n }\n if (Array.isArray(value)) {\n if (value.length === 0) return `list:string:`\n const types = value.map((item) => this.typedToString(item).split(WarpConstants.ArgParamsSeparator)[0]) as BaseWarpActionInputType[]\n const type = types[0] as BaseWarpActionInputType\n const values = value.map((item) => this.typedToString(item).split(WarpConstants.ArgParamsSeparator)[1]) as WarpNativeValue[]\n return `list:${type}:${values.join(',')}`\n }\n if (value === null || value === undefined) {\n return `string:null`\n }\n return `string:${String(value)}`\n }\n\n typedToNative(value: any): [WarpActionInputType, WarpNativeValue] {\n const stringValue = this.typedToString(value)\n const [type, ...valueParts] = stringValue.split(WarpConstants.ArgParamsSeparator)\n const nativeValue = valueParts.join(WarpConstants.ArgParamsSeparator)\n return [type, this.parseNativeValue(type, nativeValue)]\n }\n\n nativeToTyped(type: WarpActionInputType, value: WarpNativeValue): any {\n switch (type) {\n case 'string':\n return String(value)\n case 'uint8':\n case 'uint16':\n case 'uint32':\n case 'uint64':\n return BigInt(value as string | number)\n case 'biguint':\n return BigInt(value as string | number)\n case 'boolean':\n return Boolean(value)\n case 'address':\n return String(value)\n case 'hex':\n return String(value)\n default:\n if (type.startsWith('list:')) {\n const [, itemType, itemsStr] = type.split(':')\n if (!itemsStr) return []\n const items = itemsStr.split(',')\n return items.map((item) => this.nativeToTyped(itemType, item))\n }\n return String(value)\n }\n }\n\n nativeToType(type: BaseWarpActionInputType): WarpAdapterGenericType {\n switch (type) {\n case 'string':\n return 'string'\n case 'uint8':\n case 'uint16':\n case 'uint32':\n case 'uint64':\n case 'biguint':\n return 'bigint'\n case 'boolean':\n return 'boolean'\n case 'address':\n return 'string'\n case 'hex':\n return 'string'\n default:\n return 'string'\n }\n }\n\n stringToTyped(value: string): any {\n const parts = value.split(WarpConstants.ArgParamsSeparator, 2)\n if (parts.length < 2) {\n return value\n }\n\n const [type, stringValue] = parts\n\n switch (type) {\n case 'string':\n return stringValue\n case 'uint8':\n case 'uint16':\n case 'uint32':\n case 'uint64':\n return BigInt(stringValue)\n case 'biguint':\n return BigInt(stringValue)\n case 'boolean':\n return stringValue === 'true'\n case 'address':\n return stringValue\n case 'hex':\n return stringValue\n default:\n if (type.startsWith('list:')) {\n const [, itemType, itemsStr] = type.split(':')\n if (!itemsStr) return []\n const items = itemsStr.split(',')\n return items.map((item) => this.stringToTyped(`${itemType}:${item}`))\n }\n return stringValue\n }\n }\n\n private parseNativeValue(type: string, value: string): WarpNativeValue {\n switch (type) {\n case 'string':\n return value\n case 'uint8':\n case 'uint16':\n case 'uint32':\n case 'uint64':\n case 'biguint':\n return BigInt(value)\n case 'boolean':\n return value === 'true'\n case 'address':\n return value\n case 'hex':\n return value\n default:\n return value\n }\n }\n}\n","import { AdapterWarpExplorer, WarpChainInfo, WarpClientConfig } from '@vleap/warps'\nimport { EvmExplorers, ExplorerName, ExplorerUrls } from './constants'\n\nexport class WarpEvmExplorer implements AdapterWarpExplorer {\n constructor(\n private readonly chain: WarpChainInfo,\n private readonly config: WarpClientConfig\n ) {}\n\n private getExplorers(): readonly ExplorerName[] {\n const chainExplorers = EvmExplorers[this.chain.name as keyof typeof EvmExplorers]\n if (!chainExplorers) {\n return ['Default' as ExplorerName]\n }\n\n const explorers = chainExplorers[this.config.env]\n if (!explorers) {\n return ['Default' as ExplorerName]\n }\n\n return explorers\n }\n\n private getPrimaryExplorer(): ExplorerName {\n const explorers = this.getExplorers()\n return explorers[0]\n }\n\n private getExplorerUrlByName(explorer?: ExplorerName): string {\n const userPreference = this.config.preferences?.explorers?.[this.chain.name]\n\n if (userPreference && !explorer) {\n const url = ExplorerUrls[userPreference as ExplorerName]\n if (url) return url\n }\n\n if (explorer) {\n const url = ExplorerUrls[explorer]\n if (url) return url\n }\n\n const primaryExplorer = this.getPrimaryExplorer()\n const url = ExplorerUrls[primaryExplorer]\n return url || ExplorerUrls[primaryExplorer]\n }\n\n getAccountUrl(address: string, explorer?: ExplorerName): string {\n const baseUrl = this.getExplorerUrlByName(explorer)\n return `${baseUrl}/address/${address}`\n }\n\n getTransactionUrl(hash: string, explorer?: ExplorerName): string {\n const baseUrl = this.getExplorerUrlByName(explorer)\n return `${baseUrl}/tx/${hash}`\n }\n\n getBlockUrl(blockNumber: string | number, explorer?: ExplorerName): string {\n const baseUrl = this.getExplorerUrlByName(explorer)\n return `${baseUrl}/block/${blockNumber}`\n }\n\n getAssetUrl(identifier: string, explorer?: ExplorerName): string {\n const baseUrl = this.getExplorerUrlByName(explorer)\n return `${baseUrl}/token/${identifier}`\n }\n\n getContractUrl(address: string, explorer?: ExplorerName): string {\n const baseUrl = this.getExplorerUrlByName(explorer)\n return `${baseUrl}/address/${address}`\n }\n\n getAllExplorers(): readonly ExplorerName[] {\n return this.getExplorers()\n }\n\n getExplorerByName(name: string): ExplorerName | undefined {\n const explorers = this.getExplorers()\n return explorers.find((explorer) => explorer.toLowerCase() === name.toLowerCase())\n }\n\n getAccountUrls(address: string): Record<ExplorerName, string> {\n const explorers = this.getAllExplorers()\n const urls: Record<ExplorerName, string> = {} as Record<ExplorerName, string>\n\n explorers.forEach((explorer) => {\n const url = ExplorerUrls[explorer]\n if (url) {\n urls[explorer] = `${url}/address/${address}`\n }\n })\n\n return urls\n }\n\n getTransactionUrls(hash: string): Record<ExplorerName, string> {\n const explorers = this.getAllExplorers()\n const urls: Record<ExplorerName, string> = {} as Record<ExplorerName, string>\n\n explorers.forEach((explorer) => {\n const url = ExplorerUrls[explorer]\n if (url) {\n urls[explorer] = `${url}/tx/${hash}`\n }\n })\n\n return urls\n }\n\n getAssetUrls(identifier: string): Record<ExplorerName, string> {\n const explorers = this.getAllExplorers()\n const urls: Record<ExplorerName, string> = {} as Record<ExplorerName, string>\n\n explorers.forEach((explorer) => {\n const url = ExplorerUrls[explorer]\n if (url) {\n urls[explorer] = `${url}/token/${identifier}`\n }\n })\n\n return urls\n }\n\n getContractUrls(address: string): Record<ExplorerName, string> {\n const explorers = this.getAllExplorers()\n const urls: Record<ExplorerName, string> = {} as Record<ExplorerName, string>\n\n explorers.forEach((explorer) => {\n const url = ExplorerUrls[explorer]\n if (url) {\n urls[explorer] = `${url}/address/${address}`\n }\n })\n\n return urls\n }\n\n getBlockUrls(blockNumber: string | number): Record<ExplorerName, string> {\n const explorers = this.getAllExplorers()\n const urls: Record<ExplorerName, string> = {} as Record<ExplorerName, string>\n\n explorers.forEach((explorer) => {\n const url = ExplorerUrls[explorer]\n if (url) {\n urls[explorer] = `${url}/block/${blockNumber}`\n }\n })\n\n return urls\n }\n}\n","import { Adapter, AdapterFactory, WarpChainEnv, WarpChainInfo, WarpClientConfig } from '@vleap/warps'\nimport { WarpEvmDataLoader } from '../WarpEvmDataLoader'\nimport { WarpEvmExecutor } from '../WarpEvmExecutor'\nimport { WarpEvmExplorer } from '../WarpEvmExplorer'\nimport { WarpEvmResults } from '../WarpEvmResults'\nimport { WarpEvmSerializer } from '../WarpEvmSerializer'\n\nexport const createEvmAdapter = (\n chainName: string,\n chainPrefix: string,\n chainInfos: Record<WarpChainEnv, WarpChainInfo>\n): AdapterFactory => {\n return (config: WarpClientConfig, fallback?: Adapter) => {\n if (!fallback) throw new Error(`${chainName} adapter requires a fallback adapter`)\n\n return {\n chain: chainName,\n chainInfo: chainInfos[config.env],\n prefix: chainPrefix,\n builder: () => fallback.builder(),\n executor: new WarpEvmExecutor(config, chainInfos[config.env]),\n results: new WarpEvmResults(config, chainInfos[config.env]),\n serializer: new WarpEvmSerializer(),\n registry: fallback.registry,\n explorer: new WarpEvmExplorer(chainInfos[config.env], config),\n abiBuilder: () => fallback.abiBuilder(),\n brandBuilder: () => fallback.brandBuilder(),\n dataLoader: new WarpEvmDataLoader(config, chainInfos[config.env]),\n }\n }\n}\n","import { AdapterFactory, WarpChainAsset, WarpChainName } from '@vleap/warps'\nimport { createEvmAdapter } from './common'\n\nexport const NativeTokenBase: WarpChainAsset = {\n chain: WarpChainName.Base,\n identifier: 'ETH',\n name: 'ETH',\n decimals: 18,\n logoUrl: 'https://vleap.ai/images/tokens/eth.svg',\n}\n\nexport const getBaseAdapter: AdapterFactory = createEvmAdapter(WarpChainName.Base, 'base', {\n mainnet: {\n name: WarpChainName.Base,\n displayName: 'Base',\n chainId: '8453',\n blockTime: 2000,\n addressHrp: '0x',\n defaultApiUrl: 'https://mainnet.base.org',\n nativeToken: NativeTokenBase,\n },\n testnet: {\n name: WarpChainName.Base,\n displayName: 'Base Sepolia',\n chainId: '84532',\n blockTime: 2000,\n addressHrp: '0x',\n defaultApiUrl: 'https://sepolia.base.org',\n nativeToken: NativeTokenBase,\n },\n devnet: {\n name: WarpChainName.Base,\n displayName: 'Base Sepolia',\n chainId: '84532',\n blockTime: 2000,\n addressHrp: '0x',\n defaultApiUrl: 'https://sepolia.base.org',\n nativeToken: NativeTokenBase,\n },\n})\n","import { Adapter, WarpChain, WarpChainName, WarpClientConfig } from '@vleap/warps'\nimport { getArbitrumAdapter } from './arbitrum'\nimport { getBaseAdapter } from './base'\nimport { getEthereumAdapter } from './ethereum'\n\nexport const getAllEvmAdapters = (config: WarpClientConfig, fallback?: Adapter): Adapter[] => [\n getEthereumAdapter(config, fallback),\n getArbitrumAdapter(config, fallback),\n getBaseAdapter(config, fallback),\n]\n\nexport const getAllEvmChainNames = (): WarpChain[] => [WarpChainName.Ethereum, WarpChainName.Base, WarpChainName.Arbitrum]\n","import { AdapterFactory, WarpChainAsset, WarpChainName } from '@vleap/warps'\nimport { createEvmAdapter } from './common'\n\nexport const NativeTokenEth: WarpChainAsset = {\n chain: WarpChainName.Ethereum,\n identifier: 'ETH',\n name: 'ETH',\n decimals: 18,\n logoUrl: 'https://vleap.ai/images/tokens/eth.svg',\n}\n\nexport const getEthereumAdapter: AdapterFactory = createEvmAdapter(WarpChainName.Ethereum, 'eth', {\n mainnet: {\n name: WarpChainName.Ethereum,\n displayName: 'Ethereum Mainnet',\n chainId: '1',\n blockTime: 12000,\n addressHrp: '0x',\n defaultApiUrl: 'https://ethereum-rpc.publicnode.com',\n nativeToken: NativeTokenEth,\n },\n testnet: {\n name: WarpChainName.Ethereum,\n displayName: 'Ethereum Sepolia',\n chainId: '11155111',\n blockTime: 12000,\n addressHrp: '0x',\n defaultApiUrl: 'https://ethereum-sepolia-rpc.publicnode.com',\n nativeToken: NativeTokenEth,\n },\n devnet: {\n name: WarpChainName.Ethereum,\n displayName: 'Ethereum Sepolia',\n chainId: '11155111',\n blockTime: 12000,\n addressHrp: '0x',\n defaultApiUrl: 'https://ethereum-sepolia-rpc.publicnode.com',\n nativeToken: NativeTokenEth,\n },\n})\n"],"mappings":";AAAA,SAAyC,qBAAqB;;;ACA9D;AAAA,EAEE;AAAA,OAOK;AACP,SAAS,cAAc;;;ACQvB,IAAM,YAAoC;AAAA,EACxC,UAAU;AAAA,EACV,UAAU;AAAA,EACV,MAAM;AACR;AAEA,IAAM,iBAAyD;AAAA,EAC7D,UAAU;AAAA,IACR,8CAA8C;AAAA,IAC9C,8CAA8C;AAAA,IAC9C,8CAA8C;AAAA,IAC9C,8CAA8C;AAAA,IAC9C,8CAA8C;AAAA,EAChD;AAAA,EACA,UAAU;AAAA,IACR,8CAA8C;AAAA,IAC9C,8CAA8C;AAAA,IAC9C,8CAA8C;AAAA,EAChD;AAAA,EACA,MAAM;AAAA,IACJ,8CAA8C;AAAA,IAC9C,8CAA8C;AAAA,IAC9C,8CAA8C;AAAA,IAC9C,8CAA8C;AAAA,IAC9C,8CAA8C;AAAA,EAChD;AACF;AAEA,IAAM,cAAc;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,YAAY,oBAAI,IAAoB;AAC1C,IAAM,iBAAiB,oBAAI,IAAuB;AAClD,IAAM,iBAAiB,oBAAI,IAAuB;AAE3C,IAAM,iBAAN,MAAqB;AAAA,EAC1B,aAAa,aAAa,WAAmB,cAA0C;AACrF,UAAM,WAAW,GAAG,SAAS,IAAI,aAAa,YAAY,CAAC;AAE3D,QAAI,eAAe,IAAI,QAAQ,GAAG;AAChC,aAAO,eAAe,IAAI,QAAQ;AAAA,IACpC;AAEA,QAAI,YAAuB,CAAC;AAE5B,QAAI;AACF,kBAAY,MAAM,KAAK,oBAAoB,WAAW,YAAY;AAAA,IACpE,SAAS,OAAO;AAAA,IAAC;AAEjB,QAAI,CAAC,UAAU,SAAS;AACtB,UAAI;AACF,oBAAY,EAAE,GAAG,WAAW,GAAI,MAAM,KAAK,mBAAmB,WAAW,YAAY,EAAG;AAAA,MAC1F,SAAS,OAAO;AAAA,MAAC;AAAA,IACnB;AAEA,mBAAe,IAAI,UAAU,SAAS;AACtC,WAAO;AAAA,EACT;AAAA,EAEA,aAAa,WAAW,WAAmB,cAAsB,WAAoB,aAAuC;AAC1H,UAAM,WAAW,GAAG,SAAS,IAAI,aAAa,YAAY,CAAC;AAE3D,QAAI,UAAU,IAAI,QAAQ,GAAG;AAC3B,aAAO,UAAU,IAAI,QAAQ;AAAA,IAC/B;AAEA,QAAI,UAAU;AAEd,UAAM,gBAAgB,eAAe,SAAS;AAC9C,QAAI,iBAAiB,cAAc,YAAY,GAAG;AAChD,gBAAU,cAAc,YAAY;AAAA,IACtC,OAAO;AACL,YAAM,YAAY,MAAM,KAAK,aAAa,WAAW,YAAY;AACjE,gBAAU,UAAU,WAAW;AAE/B,UAAI,CAAC,YAAY,eAAe,YAAY;AAC1C,YAAI;AACF,oBAAU,MAAM,KAAK,qBAAqB,WAAW,YAAY;AAAA,QACnE,SAAS,OAAO;AAAA,QAAC;AAAA,MACnB;AAAA,IACF;AAEA,cAAU,IAAI,UAAU,OAAO;AAC/B,WAAO;AAAA,EACT;AAAA,EAEA,aAAqB,oBAAoB,WAAmB,cAA0C;AACpG,UAAM,UAAU,UAAU,SAAS;AACnC,QAAI,CAAC,QAAS,QAAO,CAAC;AAEtB,UAAM,oBAAoB,aAAa,YAAY;AAEnD,QAAI,eAAe,IAAI,GAAG,OAAO,IAAI,iBAAiB,EAAE,GAAG;AACzD,aAAO,eAAe,IAAI,GAAG,OAAO,IAAI,iBAAiB,EAAE,KAAK,CAAC;AAAA,IACnE;AAEA,eAAW,gBAAgB,aAAa;AACtC,UAAI;AACF,cAAM,WAAW,MAAM,MAAM,cAAc;AAAA,UACzC,SAAS,EAAE,QAAQ,mBAAmB;AAAA,UACtC,QAAQ,YAAY,QAAQ,GAAI;AAAA,QAClC,CAAC;AAED,YAAI,SAAS,IAAI;AACf,gBAAM,OAA0B,MAAM,SAAS,KAAK;AAEpD,gBAAM,QAAQ,KAAK,OAAO,KAAK,CAAC,MAAM,EAAE,YAAY,WAAW,EAAE,QAAQ,YAAY,MAAM,iBAAiB;AAE5G,cAAI,OAAO;AACT,kBAAM,YAAuB;AAAA,cAC3B,MAAM,MAAM;AAAA,cACZ,QAAQ,MAAM;AAAA,cACd,UAAU,MAAM;AAAA,cAChB,SAAS,MAAM;AAAA,YACjB;AACA,2BAAe,IAAI,GAAG,OAAO,IAAI,iBAAiB,IAAI,SAAS;AAC/D,mBAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd;AAAA,MACF;AAAA,IACF;AAEA,WAAO,CAAC;AAAA,EACV;AAAA,EAEA,aAAqB,mBAAmB,WAAmB,cAA0C;AACnG,QAAI;AACF,YAAM,eAAuC;AAAA,QAC3C,UAAU;AAAA,QACV,UAAU;AAAA,QACV,MAAM;AAAA,MACR;AAEA,YAAM,QAAQ,aAAa,SAAS;AACpC,UAAI,CAAC,MAAO,QAAO,CAAC;AAEpB,YAAM,WAAW,MAAM,MAAM,yCAAyC,KAAK,IAAI,YAAY,IAAI,EAAE,QAAQ,YAAY,QAAQ,GAAI,EAAE,CAAC;AAEpI,UAAI,SAAS,IAAI;AACf,cAAM,OAAO,MAAM,SAAS,KAAK;AACjC,cAAM,WAAW,KAAK,QAAQ,GAAG,KAAK,IAAI,YAAY,EAAE;AAExD,YAAI,UAAU;AACZ,iBAAO;AAAA,YACL,QAAQ,SAAS;AAAA,YACjB,SAAS,SAAS;AAAA,UACpB;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AAAA,IAAC;AAEjB,WAAO,CAAC;AAAA,EACV;AAAA,EAEA,aAAqB,qBAAqB,WAAmB,cAAuC;AAClG,QAAI;AACF,YAAM,eAAuC;AAAA,QAC3C,UAAU;AAAA,QACV,UAAU;AAAA,QACV,MAAM;AAAA,MACR;AAEA,YAAM,QAAQ,aAAa,SAAS;AACpC,UAAI,CAAC,MAAO,QAAO;AAEnB,YAAM,UAAU,2EAA2E,KAAK,WAAW,YAAY;AAEvH,YAAM,WAAW,MAAM,MAAM,SAAS;AAAA,QACpC,QAAQ;AAAA,QACR,QAAQ,YAAY,QAAQ,GAAI;AAAA,MAClC,CAAC;AAED,UAAI,SAAS,IAAI;AACf,eAAO;AAAA,MACT;AAAA,IACF,SAAS,OAAO;AAAA,IAAC;AAEjB,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,aAAmB;AACxB,cAAU,MAAM;AAChB,mBAAe,MAAM;AACrB,mBAAe,MAAM;AAAA,EACvB;AAAA,EAEA,OAAO,eAAuB;AAC5B,WAAO,UAAU,OAAO,eAAe,OAAO,eAAe;AAAA,EAC/D;AACF;;;ADtMA,IAAM,YAAY;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAMA,IAAM,eAAqH;AAAA,EACzH,UAAU;AAAA,IACR,8CAA8C;AAAA,MAC5C,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,IACA,8CAA8C;AAAA,MAC5C,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,IACA,8CAA8C;AAAA,MAC5C,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,IACA,8CAA8C;AAAA,MAC5C,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,IACA,8CAA8C;AAAA,MAC5C,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA;AAAA,IAEA,8CAA8C;AAAA,MAC5C,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,IACA,8CAA8C;AAAA,MAC5C,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,IACA,8CAA8C;AAAA,MAC5C,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR,8CAA8C;AAAA,MAC5C,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,IACA,8CAA8C;AAAA,MAC5C,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,IACA,8CAA8C;AAAA,MAC5C,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,MAAM;AAAA,IACJ,8CAA8C;AAAA,MAC5C,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,IACA,8CAA8C;AAAA,MAC5C,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,IACA,8CAA8C;AAAA,MAC5C,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,IACA,8CAA8C;AAAA,MAC5C,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,IACA,8CAA8C;AAAA,MAC5C,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,EACF;AACF;AAeO,IAAM,oBAAN,MAAyD;AAAA,EAG9D,YACmB,QACA,OACjB;AAFiB;AACA;AAEjB,UAAM,SAAS,eAAe,KAAK,QAAQ,KAAK,MAAM,MAAM,KAAK,OAAO,KAAK,KAAK,MAAM,aAAa;AAErG,UAAM,UAAU,IAAI,OAAO,QAAQ,KAAK,MAAM,MAAM,SAAS,KAAK,MAAM,OAAO,CAAC;AAChF,SAAK,WAAW,IAAI,OAAO,gBAAgB,QAAQ,OAAO;AAAA,EAC5D;AAAA,EAEA,MAAM,WAAW,SAA4C;AAC3D,QAAI;AACF,YAAM,UAAU,MAAM,KAAK,SAAS,WAAW,OAAO;AAEtD,aAAO;AAAA,QACL,OAAO,KAAK,MAAM;AAAA,QAClB;AAAA,QACA;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,YAAM,IAAI,MAAM,qCAAqC,OAAO,KAAK,KAAK,EAAE;AAAA,IAC1E;AAAA,EACF;AAAA,EAEA,MAAM,iBAAiB,SAA4C;AACjE,QAAI;AACF,YAAM,SAA2B,CAAC;AAGlC,YAAM,gBAAgB,MAAM,KAAK,sBAAsB,OAAO;AAE9D,iBAAW,gBAAgB,eAAe;AACxC,YAAI,aAAa,UAAU,IAAI;AAC7B,gBAAM,UACJ,aAAa,SAAS,WACrB,MAAM,eAAe;AAAA,YACpB,KAAK,MAAM;AAAA,YACX,aAAa;AAAA,YACb,aAAa,SAAS;AAAA,YACtB,aAAa,SAAS;AAAA,UACxB;AAEF,iBAAO,KAAK;AAAA,YACV,OAAO,KAAK,MAAM;AAAA,YAClB,YAAY,aAAa;AAAA,YACzB,MAAM,aAAa,SAAS;AAAA,YAC5B,QAAQ,aAAa;AAAA,YACrB,UAAU,aAAa,SAAS;AAAA,YAChC,SAAS,WAAW;AAAA,UACtB,CAAC;AAAA,QACH;AAAA,MACF;AAEA,aAAO;AAAA,IACT,SAAS,OAAO;AACd,YAAM,IAAI,MAAM,oCAAoC,OAAO,KAAK,KAAK,EAAE;AAAA,IACzE;AAAA,EACF;AAAA,EAEA,MAAM,kBAAkB,SAAiB,SAA6D;AACpG,WAAO,CAAC;AAAA,EACV;AAAA,EAEA,MAAc,sBAAsB,SAA0C;AAC5E,UAAM,gBAAgC,CAAC;AAGvC,UAAM,cAAc,aAAa,KAAK,MAAM,IAAI,KAAK,CAAC;AAGtD,eAAW,CAAC,cAAc,QAAQ,KAAK,OAAO,QAAQ,WAAW,GAAG;AAClE,UAAI;AACF,cAAM,UAAU,MAAM,KAAK,gBAAgB,SAAS,YAAY;AAChE,YAAI,UAAU,IAAI;AAChB,wBAAc,KAAK;AAAA,YACjB;AAAA,YACA;AAAA,YACA;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF,SAAS,OAAO;AAAA,MAEhB;AAAA,IACF;AAGA,UAAM,mBAAmB,MAAM,KAAK,uBAAuB,OAAO;AAClE,eAAW,gBAAgB,kBAAkB;AAC3C,UAAI,CAAC,YAAY,YAAY,GAAG;AAC9B,YAAI;AACF,gBAAM,WAAW,MAAM,KAAK,iBAAiB,YAAY;AACzD,gBAAM,UAAU,MAAM,KAAK,gBAAgB,SAAS,YAAY;AAChE,cAAI,UAAU,IAAI;AAChB,0BAAc,KAAK;AAAA,cACjB;AAAA,cACA;AAAA,cACA;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF,SAAS,OAAO;AAAA,QAEhB;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,gBAAgB,SAAiB,cAAuC;AACpF,QAAI;AACF,YAAM,WAAW,IAAI,OAAO,SAAS,cAAc,WAAW,KAAK,QAAQ;AAC3E,YAAM,UAAU,MAAM,SAAS,UAAU,OAAO;AAChD,aAAO;AAAA,IACT,SAAS,OAAO;AACd,YAAM,IAAI,MAAM,gCAAgC,KAAK,EAAE;AAAA,IACzD;AAAA,EACF;AAAA,EAEA,MAAc,iBAAiB,cAA8C;AAC3E,QAAI;AACF,YAAM,YAAY,MAAM,eAAe,aAAa,KAAK,MAAM,MAAM,YAAY;AAEjF,UAAI,UAAU,QAAQ,UAAU,UAAU,UAAU,aAAa,QAAW;AAC1E,eAAO;AAAA,UACL,MAAM,UAAU;AAAA,UAChB,QAAQ,UAAU;AAAA,UAClB,UAAU,UAAU;AAAA,UACpB,SAAS,UAAU;AAAA,QACrB;AAAA,MACF;AAEA,YAAM,WAAW,IAAI,OAAO,SAAS,cAAc,WAAW,KAAK,QAAQ;AAC3E,YAAM,CAAC,MAAM,QAAQ,QAAQ,IAAI,MAAM,QAAQ,IAAI;AAAA,QACjD,SAAS,KAAK,EAAE,MAAM,MAAM,UAAU,QAAQ,eAAe;AAAA,QAC7D,SAAS,OAAO,EAAE,MAAM,MAAM,UAAU,UAAU,SAAS;AAAA,QAC3D,SAAS,SAAS,EAAE,MAAM,MAAM,UAAU,YAAY,EAAE;AAAA,MAC1D,CAAC;AAED,aAAO;AAAA,QACL,MAAM,QAAQ,UAAU,QAAQ;AAAA,QAChC,QAAQ,UAAU,UAAU,UAAU;AAAA,QACtC,UAAU,YAAY,UAAU,YAAY;AAAA,QAC5C,SAAS,UAAU;AAAA,MACrB;AAAA,IACF,SAAS,OAAO;AACd,YAAM,IAAI,MAAM,iCAAiC,KAAK,EAAE;AAAA,IAC1D;AAAA,EACF;AAAA,EAEA,MAAc,uBAAuB,SAAoC;AACvE,QAAI;AAEF,YAAM,eAAe,MAAM,KAAK,SAAS,eAAe;AACxD,YAAM,YAAY,KAAK,IAAI,GAAG,eAAe,GAAK;AAGlD,YAAM,SAAS;AAAA,QACb;AAAA,QACA,SAAS;AAAA,QACT,QAAQ;AAAA,UACN,OAAO,GAAG,mCAAmC;AAAA,UAC7C;AAAA;AAAA,UACA,OAAO,aAAa,SAAS,EAAE;AAAA;AAAA,QACjC;AAAA,MACF;AAEA,YAAM,OAAO,MAAM,KAAK,SAAS,QAAQ,MAAM;AAG/C,YAAM,iBAAiB,oBAAI,IAAY;AACvC,iBAAW,OAAO,MAAM;AACtB,uBAAe,IAAI,IAAI,OAAO;AAAA,MAChC;AAEA,aAAO,MAAM,KAAK,cAAc;AAAA,IAClC,SAAS,OAAO;AACd,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,aAAa,cAAqD;AACtE,QAAI;AACF,aAAO,MAAM,KAAK,iBAAiB,YAAY;AAAA,IACjD,SAAS,OAAO;AAEd,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,0BAA0B,SAAiB,cAAuC;AACtF,QAAI;AACF,aAAO,MAAM,KAAK,gBAAgB,SAAS,YAAY;AAAA,IACzD,SAAS,OAAO;AACd,YAAM,IAAI,MAAM,mCAAmC,YAAY,KAAK,KAAK,EAAE;AAAA,IAC7E;AAAA,EACF;AAAA,EAEA,MAAM,yBAAyB,SAAiB,gBAAwD;AACtG,UAAM,WAAW,oBAAI,IAAoB;AAEzC,UAAM,QAAQ;AAAA,MACZ,eAAe,IAAI,OAAO,iBAAiB;AACzC,YAAI;AACF,gBAAM,UAAU,MAAM,KAAK,gBAAgB,SAAS,YAAY;AAChE,mBAAS,IAAI,cAAc,OAAO;AAAA,QACpC,SAAS,OAAO;AAEd,mBAAS,IAAI,cAAc,EAAE;AAAA,QAC/B;AAAA,MACF,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,iBAAiB,SAA4C;AACjE,WAAO,KAAK,iBAAiB,OAAO;AAAA,EACtC;AAAA,EAEA,MAAM,uBAAuB,cAAqD;AAChF,QAAI;AACF,aAAO,MAAM,KAAK,iBAAiB,YAAY;AAAA,IACjD,SAAS,OAAO;AACd,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,eAAgE;AACpE,QAAI;AACF,YAAM,UAAU,MAAM,KAAK,SAAS,WAAW;AAC/C,YAAM,cAAc,MAAM,KAAK,SAAS,SAAS,QAAQ;AAEzD,aAAO;AAAA,QACL,SAAS,QAAQ,QAAQ,SAAS;AAAA,QAClC,WAAW,aAAa,YAAY,KAAK,IAAI,IAAI,MAAO,YAAY,YAAY;AAAA,MAClF;AAAA,IACF,SAAS,OAAO;AACd,YAAM,IAAI,MAAM,6BAA6B,KAAK,EAAE;AAAA,IACtD;AAAA,EACF;AACF;;;AErYA;AAAA,EAEE;AAAA,EACA;AAAA,EACA,kBAAAA;AAAA,EACA;AAAA,OAQK;AACP,SAAS,UAAAC,eAAc;;;ACdhB,IAAM,mBAAmB;AAAA,EAC9B,UAAU;AAAA,IACR,SAAS;AAAA,IACT,cAAc;AAAA,IACd,gBAAgB;AAAA,IAChB,UAAU;AAAA,IACV,eAAe;AAAA;AAAA,IACf,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AAAA,EACA,UAAU;AAAA,IACR,SAAS;AAAA,EACX;AAAA,EACA,YAAY;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,EACf;AACF;AAEO,IAAK,oBAAL,kBAAKC,uBAAL;AACL,EAAAA,mBAAA,eAAY;AACZ,EAAAA,mBAAA,sBAAmB;AACnB,EAAAA,mBAAA,eAAY;AACZ,EAAAA,mBAAA,gBAAa;AACb,EAAAA,mBAAA,uBAAoB;AALV,SAAAA;AAAA,GAAA;AAQL,IAAK,oBAAL,kBAAKC,uBAAL;AACL,EAAAA,mBAAA,cAAW;AACX,EAAAA,mBAAA,qBAAkB;AAClB,EAAAA,mBAAA,wBAAqB;AACrB,EAAAA,mBAAA,+BAA4B;AAJlB,SAAAA;AAAA,GAAA;AAOL,IAAK,gBAAL,kBAAKC,mBAAL;AACL,EAAAA,eAAA,cAAW;AACX,EAAAA,eAAA,qBAAkB;AAClB,EAAAA,eAAA,oBAAiB;AACjB,EAAAA,eAAA,2BAAwB;AAJd,SAAAA;AAAA,GAAA;AASL,IAAM,eAAe;AAAA,EAC1B,UAAU;AAAA,IACR,SAAS,CAAC,6BAA6B,6BAA6B,6BAA4B;AAAA,IAChG,SAAS,CAAC,4CAAoC,4CAAmC;AAAA,IACjF,QAAQ,CAAC,4CAAoC,4CAAmC;AAAA,EAClF;AAAA,EACA,UAAU;AAAA,IACR,SAAS,CAAC,2BAA4B,8CAAoC;AAAA,IAC1E,SAAS,CAAC,0CAAmC,6DAA2C;AAAA,IACxF,QAAQ,CAAC,0CAAmC,6DAA2C;AAAA,EACzF;AAAA,EACA,MAAM;AAAA,IACJ,SAAS,CAAC,2BAAwB,sCAA4B;AAAA,IAC9D,SAAS,CAAC,0CAA+B,qDAAmC;AAAA,IAC5E,QAAQ,CAAC,0CAA+B,qDAAmC;AAAA,EAC7E;AACF;AAEO,IAAM,eAA6C;AAAA,EACxD,CAAC,2BAA2B,GAAG;AAAA,EAC/B,CAAC,0CAAkC,GAAG;AAAA,EACtC,CAAC,2BAA2B,GAAG;AAAA,EAC/B,CAAC,6BAA4B,GAAG;AAAA,EAChC,CAAC,4CAAmC,GAAG;AAAA,EAEvC,CAAC,yBAA0B,GAAG;AAAA,EAC9B,CAAC,wCAAiC,GAAG;AAAA,EACrC,CAAC,8CAAoC,GAAG;AAAA,EACxC,CAAC,6DAA2C,GAAG;AAAA,EAE/C,CAAC,yBAAsB,GAAG;AAAA,EAC1B,CAAC,wCAA6B,GAAG;AAAA,EACjC,CAAC,sCAA4B,GAAG;AAAA,EAChC,CAAC,qDAAmC,GAAG;AACzC;;;AC7EA;AAAA,EAEE;AAAA,EACA,kBAAAC;AAAA,EACA;AAAA,EAKA,iBAAAC;AAAA,OAGK;AACP,SAAS,UAAAC,eAAc;;;ACbvB;AAAA,EAKE;AAAA,EAEA;AAAA,OACK;AACP,SAAS,UAAAC,eAAc;AAEvB,IAAM,mBAAmB,IAAI,OAAO,GAAG,cAAc,kBAAkB,MAAM;AAEtE,IAAM,oBAAN,MAAyD;AAAA,EAG9D,cAAc;AACZ,SAAK,iBAAiB,IAAI,eAAe;AAAA,EAC3C;AAAA,EAEA,cAAc,OAAoB;AAChC,QAAI,OAAO,UAAU,UAAU;AAC7B,UAAIA,QAAO,UAAU,KAAK,GAAG;AAC3B,eAAO,WAAW,KAAK;AAAA,MACzB;AACA,UAAIA,QAAO,YAAY,KAAK,KAAK,CAACA,QAAO,UAAU,KAAK,GAAG;AACzD,eAAO,OAAO,KAAK;AAAA,MACrB;AACA,aAAO,UAAU,KAAK;AAAA,IACxB;AACA,QAAI,OAAO,UAAU,UAAU;AAC7B,UAAI,OAAO,UAAU,KAAK,GAAG;AAC3B,YAAI,SAAS,KAAK,SAAS,IAAK,QAAO,SAAS,KAAK;AACrD,YAAI,SAAS,KAAK,SAAS,MAAO,QAAO,UAAU,KAAK;AACxD,YAAI,SAAS,KAAK,SAAS,WAAY,QAAO,UAAU,KAAK;AAC7D,eAAO,UAAU,KAAK;AAAA,MACxB;AACA,aAAO,UAAU,KAAK;AAAA,IACxB;AACA,QAAI,OAAO,UAAU,UAAU;AAC7B,aAAO,WAAW,MAAM,SAAS,CAAC;AAAA,IACpC;AACA,QAAI,OAAO,UAAU,WAAW;AAC9B,aAAO,WAAW,KAAK;AAAA,IACzB;AACA,QAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,UAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,YAAM,QAAQ,MAAM,IAAI,CAAC,SAAS,KAAK,cAAc,IAAI,EAAE,MAAM,cAAc,kBAAkB,EAAE,CAAC,CAAC;AACrG,YAAM,OAAO,MAAM,CAAC;AACpB,YAAM,SAAS,MAAM,IAAI,CAAC,SAAS,KAAK,cAAc,IAAI,EAAE,MAAM,cAAc,kBAAkB,EAAE,CAAC,CAAC;AACtG,aAAO,QAAQ,IAAI,IAAI,OAAO,KAAK,GAAG,CAAC;AAAA,IACzC;AACA,QAAI,UAAU,QAAQ,UAAU,QAAW;AACzC,aAAO;AAAA,IACT;AACA,WAAO,UAAU,OAAO,KAAK,CAAC;AAAA,EAChC;AAAA,EAEA,cAAc,OAAoD;AAChE,UAAM,cAAc,KAAK,cAAc,KAAK;AAC5C,UAAM,CAAC,MAAM,GAAG,UAAU,IAAI,YAAY,MAAM,cAAc,kBAAkB;AAChF,UAAM,cAAc,WAAW,KAAK,cAAc,kBAAkB;AACpE,WAAO,CAAC,MAAM,KAAK,iBAAiB,MAAM,WAAW,CAAC;AAAA,EACxD;AAAA,EAEA,cAAc,MAA2B,OAA6B;AACpE,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,eAAO,OAAO,KAAK;AAAA,MACrB,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,eAAO,OAAO,KAAwB;AAAA,MACxC,KAAK;AACH,eAAO,OAAO,KAAwB;AAAA,MACxC,KAAK;AACH,eAAO,QAAQ,KAAK;AAAA,MACtB,KAAK;AACH,eAAO,OAAO,KAAK;AAAA,MACrB,KAAK;AACH,eAAO,OAAO,KAAK;AAAA,MACrB;AACE,YAAI,KAAK,WAAW,OAAO,GAAG;AAC5B,gBAAM,CAAC,EAAE,UAAU,QAAQ,IAAI,KAAK,MAAM,GAAG;AAC7C,cAAI,CAAC,SAAU,QAAO,CAAC;AACvB,gBAAM,QAAQ,SAAS,MAAM,GAAG;AAChC,iBAAO,MAAM,IAAI,CAAC,SAAS,KAAK,cAAc,UAAU,IAAI,CAAC;AAAA,QAC/D;AACA,eAAO,OAAO,KAAK;AAAA,IACvB;AAAA,EACF;AAAA,EAEA,aAAa,MAAuD;AAClE,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT;AACE,eAAO;AAAA,IACX;AAAA,EACF;AAAA,EAEA,cAAc,OAAoB;AAChC,UAAM,QAAQ,MAAM,MAAM,cAAc,oBAAoB,CAAC;AAC7D,QAAI,MAAM,SAAS,GAAG;AACpB,aAAO;AAAA,IACT;AAEA,UAAM,CAAC,MAAM,WAAW,IAAI;AAE5B,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,eAAO,OAAO,WAAW;AAAA,MAC3B,KAAK;AACH,eAAO,OAAO,WAAW;AAAA,MAC3B,KAAK;AACH,eAAO,gBAAgB;AAAA,MACzB,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT;AACE,YAAI,KAAK,WAAW,OAAO,GAAG;AAC5B,gBAAM,CAAC,EAAE,UAAU,QAAQ,IAAI,KAAK,MAAM,GAAG;AAC7C,cAAI,CAAC,SAAU,QAAO,CAAC;AACvB,gBAAM,QAAQ,SAAS,MAAM,GAAG;AAChC,iBAAO,MAAM,IAAI,CAAC,SAAS,KAAK,cAAc,GAAG,QAAQ,IAAI,IAAI,EAAE,CAAC;AAAA,QACtE;AACA,eAAO;AAAA,IACX;AAAA,EACF;AAAA,EAEQ,iBAAiB,MAAc,OAAgC;AACrE,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,eAAO,OAAO,KAAK;AAAA,MACrB,KAAK;AACH,eAAO,UAAU;AAAA,MACnB,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT;AACE,eAAO;AAAA,IACX;AAAA,EACF;AACF;;;ADzJO,IAAM,iBAAN,MAAmD;AAAA,EAIxD,YACmB,QACA,OACjB;AAFiB;AACA;AAEjB,SAAK,aAAa,IAAI,kBAAkB;AAExC,QAAI,KAAK,OAAO;AACd,YAAM,SAASC,gBAAe,KAAK,QAAQ,KAAK,MAAM,MAAM,KAAK,OAAO,KAAK,KAAK,MAAM,aAAa;AACrG,YAAM,UAAU,IAAIC,QAAO,QAAQ,KAAK,MAAM,MAAM,SAAS,KAAK,MAAM,OAAO,CAAC;AAChF,WAAK,WAAW,IAAIA,QAAO,gBAAgB,QAAQ,OAAO;AAAA,IAC5D,OAAO;AAEL,YAAM,SAASD,gBAAe,KAAK,QAAQ,YAAY,KAAK,OAAO,KAAK,qCAAqC;AAC7G,YAAM,UAAU,IAAIC,QAAO,QAAQ,YAAY,CAAC;AAChD,WAAK,WAAW,IAAIA,QAAO,gBAAgB,QAAQ,OAAO;AAAA,IAC5D;AAAA,EACF;AAAA,EAEA,MAAM,+BAA+B,MAAY,IAAuD;AACtG,UAAM,UAAU,GAAG,WAAW;AAC9B,UAAM,UAAU,GAAG,SAAS,SAAS,KAAK;AAC1C,UAAM,WAAW,GAAG,UAAU,SAAS,KAAK;AAC5C,UAAM,cAAc,GAAG,aAAa,SAAS,KAAK;AAClD,UAAM,kBAAkB,GAAG;AAE3B,UAAM,OAAO,GAAG,KAAK,IAAI,CAAC,SAAS;AAAA,MACjC,SAAS,IAAI;AAAA,MACb,QAAQ,IAAI;AAAA,MACZ,MAAM,IAAI;AAAA,MACV,aAAa,IAAI,aAAa,SAAS,KAAK;AAAA,MAC5C,iBAAiB,IAAI;AAAA,MACrB,OAAO,IAAI,OAAO,SAAS,KAAK;AAAA,IAClC,EAAE;AAEF,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR,MAAM,KAAK,OAAO,MAAM,SAAS,OAAO;AAAA,MACxC,QAAQ;AAAA,MACR;AAAA,MACA,MAAM;AAAA,MACN,QAAQ,CAAC,iBAAiB,aAAa,SAAS,UAAU,GAAI,KAAK,SAAS,IAAI,OAAO,CAAC,CAAE;AAAA,MAC1F,WAAW,CAAC,iBAAiB,aAAa,SAAS,UAAU,GAAI,KAAK,SAAS,IAAI,OAAO,CAAC,CAAE;AAAA,MAC7F,SAAS,CAAC;AAAA,MACV,UAAU,CAAC;AAAA,IACb;AAAA,EACF;AAAA,EAEA,MAAM,oBACJ,MACA,aACA,aACA,QAC6E;AAC7E,UAAM,SAAS,YAAY,IAAI,CAAC,MAAM,KAAK,WAAW,cAAc,CAAC,CAAC;AACtE,UAAM,YAAY,YAAY,IAAI,CAAC,MAAM,KAAK,WAAW,cAAc,CAAC,EAAE,CAAC,CAAC;AAC5E,QAAI,UAAgC,CAAC;AAErC,QAAI,CAAC,KAAK,QAAS,QAAO,EAAE,QAAQ,WAAW,QAAQ;AAEvD,UAAM,iBAAiB,CAAC,SAA0B;AAChD,YAAM,UAAU,KACb,MAAM,GAAG,EACT,MAAM,CAAC,EACP,IAAI,CAAC,MAAM,SAAS,CAAC,IAAI,CAAC;AAC7B,UAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,UAAI,QAAa,UAAU,QAAQ,CAAC,CAAC;AACrC,eAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,YAAI,UAAU,UAAa,UAAU,KAAM,QAAO;AAClD,gBAAQ,MAAM,QAAQ,CAAC,CAAC;AAAA,MAC1B;AACA,aAAO;AAAA,IACT;AAEA,eAAW,CAAC,KAAK,IAAI,KAAK,OAAO,QAAQ,KAAK,OAAO,GAAG;AACtD,UAAI,KAAK,WAAWC,eAAc,UAAU,MAAM,EAAG;AACrD,YAAM,qBAAqB,qBAAqB,IAAI;AACpD,UAAI,uBAAuB,QAAQ,uBAAuB,aAAa;AACrE,gBAAQ,GAAG,IAAI;AACf;AAAA,MACF;AACA,UAAI,KAAK,WAAW,MAAM,KAAK,SAAS,SAAS,KAAK,WAAW,MAAM,GAAG;AACxE,gBAAQ,GAAG,IAAI,eAAe,IAAI,KAAK;AAAA,MACzC,OAAO;AACL,gBAAQ,GAAG,IAAI;AAAA,MACjB;AAAA,IACF;AAEA,WAAO,EAAE,QAAQ,WAAW,SAAS,MAAM,sBAAsB,MAAM,SAAS,aAAa,MAAM,EAAE;AAAA,EACvG;AAAA,EAEA,MAAM,qBACJ,QACiG;AACjG,QAAI;AACF,YAAM,UAAU,MAAM,KAAK,SAAS,sBAAsB,MAAM;AAEhE,UAAI,CAAC,SAAS;AACZ,eAAO,EAAE,QAAQ,UAAU;AAAA,MAC7B;AAEA,aAAO;AAAA,QACL,QAAQ,QAAQ,WAAW,IAAI,cAAc;AAAA,QAC7C,aAAa,QAAQ;AAAA,QACrB,SAAS,QAAQ;AAAA,MACnB;AAAA,IACF,SAAS,OAAO;AACd,YAAM,IAAI,MAAM,qCAAqC,KAAK,EAAE;AAAA,IAC9D;AAAA,EACF;AAAA,EAEA,MAAM,sBAAsB,QAA2D;AACrF,QAAI;AACF,aAAO,MAAM,KAAK,SAAS,sBAAsB,MAAM;AAAA,IACzD,SAAS,OAAO;AACd,aAAO;AAAA,IACT;AAAA,EACF;AACF;;;AFxHO,IAAM,kBAAN,MAAqD;AAAA,EAK1D,YACmB,QACA,OACjB;AAFiB;AACA;AAEjB,SAAK,aAAa,IAAI,kBAAkB;AACxC,UAAM,SAASC,gBAAe,KAAK,QAAQ,MAAM,MAAM,KAAK,OAAO,KAAK,KAAK,MAAM,aAAa;AAEhG,UAAM,UAAU,IAAIC,QAAO,QAAQ,KAAK,MAAM,MAAM,SAAS,KAAK,MAAM,OAAO,CAAC;AAChF,SAAK,WAAW,IAAIA,QAAO,gBAAgB,QAAQ,OAAO;AAC1D,SAAK,UAAU,IAAI,eAAe,QAAQ,KAAK,KAAK;AAAA,EACtD;AAAA,EAEA,MAAM,kBAAkB,YAAgE;AACtF,UAAM,SAAS,qBAAqB,WAAW,MAAM,WAAW,MAAM;AAEtE,QAAI,KAAuC;AAC3C,QAAI,OAAO,SAAS,YAAY;AAC9B,WAAK,MAAM,KAAK,0BAA0B,UAAU;AAAA,IACtD,WAAW,OAAO,SAAS,YAAY;AACrC,WAAK,MAAM,KAAK,8BAA8B,UAAU;AAAA,IAC1D,WAAW,OAAO,SAAS,SAAS;AAClC,YAAM,IAAI,MAAM,sFAAsF;AAAA,IACxG,WAAW,OAAO,SAAS,WAAW;AACpC,YAAM,IAAI,MAAM,wFAAwF;AAAA,IAC1G;AAEA,QAAI,CAAC,GAAI,OAAM,IAAI,MAAM,yCAAyC,OAAO,IAAI,GAAG;AAEhF,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,0BAA0B,YAAgE;AAC9F,UAAM,aAAa,KAAK,OAAO,MAAM,UAAU,WAAW,MAAM,IAAI;AACpE,QAAI,CAAC,WAAY,OAAM,IAAI,MAAM,wDAAwD;AAEzF,QAAI,CAACA,QAAO,UAAU,WAAW,WAAW,GAAG;AAC7C,YAAM,IAAI,MAAM,iDAAiD,WAAW,WAAW,EAAE;AAAA,IAC3F;AAGA,QAAI,WAAW,aAAa,WAAW,UAAU,SAAS,GAAG;AAC3D,aAAO,KAAK,+BAA+B,YAAY,UAAU;AAAA,IACnE;AAGA,UAAM,KAAgC;AAAA,MACpC,IAAI,WAAW;AAAA,MACf,OAAO,WAAW;AAAA,MAClB,MAAM,WAAW,OAAO,KAAK,WAAW,cAAc,WAAW,IAAI,IAAI;AAAA,IAC3E;AAEA,WAAO,KAAK,0BAA0B,IAAI,UAAU;AAAA,EACtD;AAAA,EAEA,MAAM,8BAA8B,YAAgE;AAClG,UAAM,aAAa,KAAK,OAAO,MAAM,UAAU,WAAW,MAAM,IAAI;AACpE,QAAI,CAAC,WAAY,OAAM,IAAI,MAAM,4DAA4D;AAE7F,UAAM,SAAS,qBAAqB,WAAW,MAAM,WAAW,MAAM;AACtE,QAAI,CAAC,UAAU,EAAE,UAAU,WAAW,CAAC,OAAO,MAAM;AAClD,YAAM,IAAI,MAAM,4DAA4D;AAAA,IAC9E;AAGA,QAAI,CAACA,QAAO,UAAU,WAAW,WAAW,GAAG;AAC7C,YAAM,IAAI,MAAM,8CAA8C,WAAW,WAAW,EAAE;AAAA,IACxF;AAEA,QAAI;AACF,YAAM,QAAQ,IAAIA,QAAO,UAAU,CAAC,YAAY,OAAO,IAAI,EAAE,CAAC;AAC9D,YAAM,cAAc,MAAM,mBAAmB,OAAO,MAAM,WAAW,IAAI;AAEzE,YAAM,KAAgC;AAAA,QACpC,IAAI,WAAW;AAAA,QACf,OAAO,WAAW;AAAA,QAClB,MAAM;AAAA,MACR;AAEA,aAAO,KAAK,0BAA0B,IAAI,UAAU;AAAA,IACtD,SAAS,OAAO;AACd,YAAM,IAAI,MAAM,uDAAuD,OAAO,IAAI,KAAK,KAAK,EAAE;AAAA,IAChG;AAAA,EACF;AAAA,EAEA,MAAc,+BAA+B,YAA4B,YAAwD;AAC/H,QAAI,WAAW,UAAU,WAAW,GAAG;AACrC,YAAM,IAAI,MAAM,wCAAwC;AAAA,IAC1D;AAGA,QAAI,CAAC,KAAK,MAAM,aAAa,YAAY;AACvC,YAAM,IAAI,MAAM,yDAAyD;AAAA,IAC3E;AAGA,UAAM,uBAAuB,WAAW,UAAU,OAAO,CAAC,aAAa,SAAS,eAAe,KAAK,MAAM,YAAa,UAAU;AACjI,UAAM,iBAAiB,WAAW,UAAU,OAAO,CAAC,aAAa,SAAS,eAAe,KAAK,MAAM,YAAa,UAAU;AAG3H,QAAI,qBAAqB,WAAW,KAAK,eAAe,WAAW,GAAG;AACpE,YAAM,WAAW,qBAAqB,CAAC;AAGvC,UAAI,SAAS,UAAU,IAAI;AACzB,cAAM,IAAI,MAAM,gEAAgE;AAAA,MAClF;AAEA,YAAM,KAAgC;AAAA,QACpC,IAAI,WAAW;AAAA,QACf,OAAO,SAAS;AAAA,QAChB,MAAM;AAAA,MACR;AAEA,aAAO,KAAK,0BAA0B,IAAI,UAAU;AAAA,IACtD;AAGA,QAAI,qBAAqB,WAAW,KAAK,eAAe,WAAW,GAAG;AACpE,aAAO,KAAK,0BAA0B,YAAY,eAAe,CAAC,GAAG,UAAU;AAAA,IACjF;AAGA,QAAI,WAAW,UAAU,SAAS,GAAG;AACnC,YAAM,IAAI,MAAM,6DAA6D;AAAA,IAC/E;AAGA,UAAM,IAAI,MAAM,iDAAiD;AAAA,EACnE;AAAA,EAEA,MAAc,0BACZ,YACA,UACA,YACoC;AACpC,QAAI,CAACA,QAAO,UAAU,SAAS,UAAU,GAAG;AAC1C,YAAM,IAAI,MAAM,2CAA2C,SAAS,UAAU,EAAE;AAAA,IAClF;AAGA,UAAM,oBAAoB,IAAIA,QAAO,UAAU,CAAC,8DAA8D,CAAC;AAE/G,UAAM,cAAc,kBAAkB,mBAAmB,YAAY,CAAC,WAAW,aAAa,SAAS,MAAM,CAAC;AAE9G,UAAM,KAAgC;AAAA,MACpC,IAAI,SAAS;AAAA;AAAA,MACb,OAAO;AAAA;AAAA,MACP,MAAM;AAAA,IACR;AAEA,WAAO,KAAK,0BAA0B,IAAI,UAAU;AAAA,EACtD;AAAA,EAEA,MAAM,aAAa,YAAoD;AACrE,UAAM,SAAS,qBAAqB,WAAW,MAAM,WAAW,MAAM;AACtE,QAAI,OAAO,SAAS,SAAS;AAC3B,YAAM,IAAI,MAAM,0DAA0D,OAAO,IAAI,EAAE;AAAA,IACzF;AACA,QAAI,CAAC,OAAO,MAAM;AAChB,YAAM,IAAI,MAAM,yDAAyD;AAAA,IAC3E;AAGA,QAAI,CAACA,QAAO,UAAU,WAAW,WAAW,GAAG;AAC7C,YAAM,IAAI,MAAM,wDAAwD,WAAW,WAAW,EAAE;AAAA,IAClG;AAEA,QAAI;AACF,YAAM,QAAQ,IAAIA,QAAO,UAAU,CAAC,YAAY,OAAO,IAAI,EAAE,CAAC;AAC9D,YAAM,cAAc,MAAM,mBAAmB,OAAO,MAAM,WAAW,IAAI;AAEzE,YAAM,SAAS,MAAM,KAAK,SAAS,KAAK;AAAA,QACtC,IAAI,WAAW;AAAA,QACf,MAAM;AAAA,MACR,CAAC;AAED,YAAM,gBAAgB,MAAM,qBAAqB,OAAO,MAAM,MAAM;AACpE,YAAM,YAAY;AAElB,YAAM,EAAE,QAAQ,WAAW,QAAQ,IAAI,MAAM,KAAK,QAAQ;AAAA,QACxD,WAAW;AAAA,QACX;AAAA,QACA,WAAW;AAAA,QACX,WAAW;AAAA,MACb;AAEA,YAAM,OAAO,YAAY,KAAK,QAAQ,CAAC,GAAG,WAAW,MAAM,WAAW,QAAQ,OAAO;AAErF,aAAO;AAAA,QACL,SAAS;AAAA,QACT,MAAM,WAAW;AAAA,QACjB,QAAQ,WAAW;AAAA,QACnB,MAAM,KAAK,OAAO,MAAM,UAAU,WAAW,MAAM,IAAI,KAAK;AAAA,QAC5D,QAAQ;AAAA,QACR,IAAI;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,UAAU,uBAAuB,WAAW,MAAM,OAAO;AAAA,MAC3D;AAAA,IACF,SAAS,OAAO;AACd,aAAO;AAAA,QACL,SAAS;AAAA,QACT,MAAM,WAAW;AAAA,QACjB,QAAQ,WAAW;AAAA,QACnB,MAAM,KAAK,OAAO,MAAM,UAAU,WAAW,MAAM,IAAI,KAAK;AAAA,QAC5D,QAAQ;AAAA,QACR,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,QAAQ,CAAC;AAAA,QACT,WAAW,CAAC;AAAA,QACZ,SAAS,CAAC;AAAA,QACV,UAAU,CAAC;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,gBAAgB,OAAsB,OAAe,MAA2B,OAAgC;AACpH,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,0BAA0B,IAA+B,MAAkD;AACvH,QAAI;AACF,YAAM,cAAc,MAAM,KAAK,SAAS,YAAY;AAAA,QAClD,GAAG;AAAA,QACH;AAAA,MACF,CAAC;AAGD,UAAI,cAAc,OAAO,iBAAiB,WAAW,WAAW,GAAG;AACjE,cAAM,IAAI,MAAM,yBAAyB,WAAW,EAAE;AAAA,MACxD;AACA,UAAI,cAAc,OAAO,iBAAiB,WAAW,WAAW,GAAG;AACjE,cAAM,IAAI,MAAM,0BAA0B,WAAW,EAAE;AAAA,MACzD;AAEA,YAAM,UAAU,MAAM,KAAK,SAAS,WAAW;AAG/C,UAAI,QAAQ,gBAAgB,QAAQ,sBAAsB;AAExD,eAAO;AAAA,UACL,GAAG;AAAA,UACH,SAAS,OAAO,KAAK,MAAM,OAAO;AAAA,UAClC,UAAU;AAAA,UACV,cAAc,QAAQ;AAAA,UACtB,sBAAsB,QAAQ;AAAA,QAChC;AAAA,MACF,WAAW,QAAQ,UAAU;AAE3B,eAAO;AAAA,UACL,GAAG;AAAA,UACH,SAAS,OAAO,KAAK,MAAM,OAAO;AAAA,UAClC,UAAU;AAAA,UACV,UAAU,QAAQ;AAAA,QACpB;AAAA,MACF,OAAO;AAEL,eAAO;AAAA,UACL,GAAG;AAAA,UACH,SAAS,OAAO,KAAK,MAAM,OAAO;AAAA,UAClC,UAAU;AAAA,UACV,UAAUA,QAAO,WAAW,iBAAiB,SAAS,SAAS,KAAK;AAAA,QACtE;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AAEd,UAAI,kBAAkB,OAAO,iBAAiB,SAAS,OAAO;AAG9D,UAAI,GAAG,QAAQ,GAAG,SAAS,MAAM;AAE/B,YAAI,GAAG,KAAK,WAAW,YAAY,GAAG;AAEpC,4BAAkB,OAAO,iBAAiB,SAAS,aAAa;AAAA,QAClE,OAAO;AACL,4BAAkB,OAAO,iBAAiB,SAAS,YAAY;AAAA,QACjE;AAAA,MACF,OAAO;AACL,0BAAkB,OAAO,iBAAiB,SAAS,QAAQ;AAAA,MAC7D;AAEA,aAAO;AAAA,QACL,GAAG;AAAA,QACH,SAAS,OAAO,KAAK,MAAM,OAAO;AAAA,QAClC,UAAU;AAAA,QACV,UAAUA,QAAO,WAAW,iBAAiB,SAAS,SAAS,KAAK;AAAA,MACtE;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,YAAY,SAAiB,YAAqC;AACtE,QAAI;AACF,YAAM,SAAS,IAAIA,QAAO,OAAO,UAAU;AAC3C,YAAM,YAAY,MAAM,OAAO,YAAY,OAAO;AAClD,aAAO;AAAA,IACT,SAAS,OAAO;AACd,YAAM,IAAI,MAAM,2BAA2B,KAAK,EAAE;AAAA,IACpD;AAAA,EACF;AAAA,EAEA,MAAM,cAAc,SAAiB,WAAoC;AACvE,QAAI;AACF,YAAM,mBAAmBA,QAAO,cAAc,SAAS,SAAS;AAChE,aAAO;AAAA,IACT,SAAS,OAAO;AACd,YAAM,IAAI,MAAM,6BAA6B,KAAK,EAAE;AAAA,IACtD;AAAA,EACF;AACF;;;AI3UO,IAAM,kBAAN,MAAqD;AAAA,EAC1D,YACmB,OACA,QACjB;AAFiB;AACA;AAAA,EAChB;AAAA,EAEK,eAAwC;AAC9C,UAAM,iBAAiB,aAAa,KAAK,MAAM,IAAiC;AAChF,QAAI,CAAC,gBAAgB;AACnB,aAAO,CAAC,SAAyB;AAAA,IACnC;AAEA,UAAM,YAAY,eAAe,KAAK,OAAO,GAAG;AAChD,QAAI,CAAC,WAAW;AACd,aAAO,CAAC,SAAyB;AAAA,IACnC;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,qBAAmC;AACzC,UAAM,YAAY,KAAK,aAAa;AACpC,WAAO,UAAU,CAAC;AAAA,EACpB;AAAA,EAEQ,qBAAqB,UAAiC;AAC5D,UAAM,iBAAiB,KAAK,OAAO,aAAa,YAAY,KAAK,MAAM,IAAI;AAE3E,QAAI,kBAAkB,CAAC,UAAU;AAC/B,YAAMC,OAAM,aAAa,cAA8B;AACvD,UAAIA,KAAK,QAAOA;AAAA,IAClB;AAEA,QAAI,UAAU;AACZ,YAAMA,OAAM,aAAa,QAAQ;AACjC,UAAIA,KAAK,QAAOA;AAAA,IAClB;AAEA,UAAM,kBAAkB,KAAK,mBAAmB;AAChD,UAAM,MAAM,aAAa,eAAe;AACxC,WAAO,OAAO,aAAa,eAAe;AAAA,EAC5C;AAAA,EAEA,cAAc,SAAiB,UAAiC;AAC9D,UAAM,UAAU,KAAK,qBAAqB,QAAQ;AAClD,WAAO,GAAG,OAAO,YAAY,OAAO;AAAA,EACtC;AAAA,EAEA,kBAAkB,MAAc,UAAiC;AAC/D,UAAM,UAAU,KAAK,qBAAqB,QAAQ;AAClD,WAAO,GAAG,OAAO,OAAO,IAAI;AAAA,EAC9B;AAAA,EAEA,YAAY,aAA8B,UAAiC;AACzE,UAAM,UAAU,KAAK,qBAAqB,QAAQ;AAClD,WAAO,GAAG,OAAO,UAAU,WAAW;AAAA,EACxC;AAAA,EAEA,YAAY,YAAoB,UAAiC;AAC/D,UAAM,UAAU,KAAK,qBAAqB,QAAQ;AAClD,WAAO,GAAG,OAAO,UAAU,UAAU;AAAA,EACvC;AAAA,EAEA,eAAe,SAAiB,UAAiC;AAC/D,UAAM,UAAU,KAAK,qBAAqB,QAAQ;AAClD,WAAO,GAAG,OAAO,YAAY,OAAO;AAAA,EACtC;AAAA,EAEA,kBAA2C;AACzC,WAAO,KAAK,aAAa;AAAA,EAC3B;AAAA,EAEA,kBAAkB,MAAwC;AACxD,UAAM,YAAY,KAAK,aAAa;AACpC,WAAO,UAAU,KAAK,CAAC,aAAa,SAAS,YAAY,MAAM,KAAK,YAAY,CAAC;AAAA,EACnF;AAAA,EAEA,eAAe,SAA+C;AAC5D,UAAM,YAAY,KAAK,gBAAgB;AACvC,UAAM,OAAqC,CAAC;AAE5C,cAAU,QAAQ,CAAC,aAAa;AAC9B,YAAM,MAAM,aAAa,QAAQ;AACjC,UAAI,KAAK;AACP,aAAK,QAAQ,IAAI,GAAG,GAAG,YAAY,OAAO;AAAA,MAC5C;AAAA,IACF,CAAC;AAED,WAAO;AAAA,EACT;AAAA,EAEA,mBAAmB,MAA4C;AAC7D,UAAM,YAAY,KAAK,gBAAgB;AACvC,UAAM,OAAqC,CAAC;AAE5C,cAAU,QAAQ,CAAC,aAAa;AAC9B,YAAM,MAAM,aAAa,QAAQ;AACjC,UAAI,KAAK;AACP,aAAK,QAAQ,IAAI,GAAG,GAAG,OAAO,IAAI;AAAA,MACpC;AAAA,IACF,CAAC;AAED,WAAO;AAAA,EACT;AAAA,EAEA,aAAa,YAAkD;AAC7D,UAAM,YAAY,KAAK,gBAAgB;AACvC,UAAM,OAAqC,CAAC;AAE5C,cAAU,QAAQ,CAAC,aAAa;AAC9B,YAAM,MAAM,aAAa,QAAQ;AACjC,UAAI,KAAK;AACP,aAAK,QAAQ,IAAI,GAAG,GAAG,UAAU,UAAU;AAAA,MAC7C;AAAA,IACF,CAAC;AAED,WAAO;AAAA,EACT;AAAA,EAEA,gBAAgB,SAA+C;AAC7D,UAAM,YAAY,KAAK,gBAAgB;AACvC,UAAM,OAAqC,CAAC;AAE5C,cAAU,QAAQ,CAAC,aAAa;AAC9B,YAAM,MAAM,aAAa,QAAQ;AACjC,UAAI,KAAK;AACP,aAAK,QAAQ,IAAI,GAAG,GAAG,YAAY,OAAO;AAAA,MAC5C;AAAA,IACF,CAAC;AAED,WAAO;AAAA,EACT;AAAA,EAEA,aAAa,aAA4D;AACvE,UAAM,YAAY,KAAK,gBAAgB;AACvC,UAAM,OAAqC,CAAC;AAE5C,cAAU,QAAQ,CAAC,aAAa;AAC9B,YAAM,MAAM,aAAa,QAAQ;AACjC,UAAI,KAAK;AACP,aAAK,QAAQ,IAAI,GAAG,GAAG,UAAU,WAAW;AAAA,MAC9C;AAAA,IACF,CAAC;AAED,WAAO;AAAA,EACT;AACF;;;AC9IO,IAAM,mBAAmB,CAC9B,WACA,aACA,eACmB;AACnB,SAAO,CAAC,QAA0B,aAAuB;AACvD,QAAI,CAAC,SAAU,OAAM,IAAI,MAAM,GAAG,SAAS,sCAAsC;AAEjF,WAAO;AAAA,MACL,OAAO;AAAA,MACP,WAAW,WAAW,OAAO,GAAG;AAAA,MAChC,QAAQ;AAAA,MACR,SAAS,MAAM,SAAS,QAAQ;AAAA,MAChC,UAAU,IAAI,gBAAgB,QAAQ,WAAW,OAAO,GAAG,CAAC;AAAA,MAC5D,SAAS,IAAI,eAAe,QAAQ,WAAW,OAAO,GAAG,CAAC;AAAA,MAC1D,YAAY,IAAI,kBAAkB;AAAA,MAClC,UAAU,SAAS;AAAA,MACnB,UAAU,IAAI,gBAAgB,WAAW,OAAO,GAAG,GAAG,MAAM;AAAA,MAC5D,YAAY,MAAM,SAAS,WAAW;AAAA,MACtC,cAAc,MAAM,SAAS,aAAa;AAAA,MAC1C,YAAY,IAAI,kBAAkB,QAAQ,WAAW,OAAO,GAAG,CAAC;AAAA,IAClE;AAAA,EACF;AACF;;;AR3BO,IAAM,iBAAiC;AAAA,EAC5C,OAAO,cAAc;AAAA,EACrB,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,UAAU;AAAA,EACV,SAAS;AACX;AAEO,IAAM,qBAAqC,iBAAiB,cAAc,UAAU,OAAO;AAAA,EAChG,SAAS;AAAA,IACP,MAAM,cAAc;AAAA,IACpB,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,aAAa;AAAA,EACf;AAAA,EACA,SAAS;AAAA,IACP,MAAM,cAAc;AAAA,IACpB,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,aAAa;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,IACN,MAAM,cAAc;AAAA,IACpB,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,aAAa;AAAA,EACf;AACF,CAAC;;;ASvCD,SAAyC,iBAAAC,sBAAqB;AAGvD,IAAM,kBAAkC;AAAA,EAC7C,OAAOC,eAAc;AAAA,EACrB,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,UAAU;AAAA,EACV,SAAS;AACX;AAEO,IAAM,iBAAiC,iBAAiBA,eAAc,MAAM,QAAQ;AAAA,EACzF,SAAS;AAAA,IACP,MAAMA,eAAc;AAAA,IACpB,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,aAAa;AAAA,EACf;AAAA,EACA,SAAS;AAAA,IACP,MAAMA,eAAc;AAAA,IACpB,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,aAAa;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,IACN,MAAMA,eAAc;AAAA,IACpB,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,aAAa;AAAA,EACf;AACF,CAAC;;;ACvCD,SAA6B,iBAAAC,sBAAuC;;;ACApE,SAAyC,iBAAAC,sBAAqB;AAGvD,IAAM,iBAAiC;AAAA,EAC5C,OAAOC,eAAc;AAAA,EACrB,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,UAAU;AAAA,EACV,SAAS;AACX;AAEO,IAAM,qBAAqC,iBAAiBA,eAAc,UAAU,OAAO;AAAA,EAChG,SAAS;AAAA,IACP,MAAMA,eAAc;AAAA,IACpB,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,aAAa;AAAA,EACf;AAAA,EACA,SAAS;AAAA,IACP,MAAMA,eAAc;AAAA,IACpB,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,aAAa;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,IACN,MAAMA,eAAc;AAAA,IACpB,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,aAAa;AAAA,EACf;AACF,CAAC;;;ADlCM,IAAM,oBAAoB,CAAC,QAA0B,aAAkC;AAAA,EAC5F,mBAAmB,QAAQ,QAAQ;AAAA,EACnC,mBAAmB,QAAQ,QAAQ;AAAA,EACnC,eAAe,QAAQ,QAAQ;AACjC;AAEO,IAAM,sBAAsB,MAAmB,CAACC,eAAc,UAAUA,eAAc,MAAMA,eAAc,QAAQ;","names":["getProviderUrl","ethers","EthereumExplorers","ArbitrumExplorers","BaseExplorers","getProviderUrl","WarpConstants","ethers","ethers","getProviderUrl","ethers","WarpConstants","getProviderUrl","ethers","url","WarpChainName","WarpChainName","WarpChainName","WarpChainName","WarpChainName","WarpChainName"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vleap/warps-adapter-evm",
|
|
3
|
-
"version": "0.2.0-alpha.
|
|
3
|
+
"version": "0.2.0-alpha.19",
|
|
4
4
|
"description": "EVM adapter for Warps SDK",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -37,6 +37,6 @@
|
|
|
37
37
|
},
|
|
38
38
|
"dependencies": {
|
|
39
39
|
"ethers": "^6.15.0",
|
|
40
|
-
"@vleap/warps": "^3.0.0-alpha.
|
|
40
|
+
"@vleap/warps": "^3.0.0-alpha.86"
|
|
41
41
|
}
|
|
42
42
|
}
|