@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 CHANGED
@@ -1,18 +1,17 @@
1
- import { WarpChain, WarpChainAsset, AdapterFactory, WarpClientConfig, Adapter, AdapterWarpExecutor, WarpChainInfo, WarpExecutable, WarpExecution, WarpActionInputType, AdapterWarpExplorer, AdapterWarpResults, Warp, ResolvedInput, WarpExecutionResults, AdapterWarpSerializer, WarpSerializer, WarpNativeValue, BaseWarpActionInputType, WarpAdapterGenericType } from '@vleap/warps';
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 ChainNameEthereum: WarpChain;
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
- constructor(config: WarpClientConfig);
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, ChainNameArbitrum, ChainNameBase, ChainNameEthereum, EthereumExplorers, EvmExplorers, type ExplorerName, ExplorerUrls, NativeTokenArb, NativeTokenBase, NativeTokenEth, WarpEvmConstants, WarpEvmExecutor, WarpEvmExplorer, WarpEvmResults, WarpEvmSerializer, getAllEvmAdapters, getAllEvmChainNames, getArbitrumAdapter, getBaseAdapter, getEthereumAdapter };
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 { getProviderUrl } from "@vleap/warps";
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
- this.provider = new ethers.JsonRpcProvider(apiUrl);
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 getProviderUrl2,
491
+ getProviderUrl as getProviderUrl3,
461
492
  getWarpActionByIndex
462
493
  } from "@vleap/warps";
463
- import { ethers as ethers3 } from "ethers";
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 = getProviderUrl2(this.config, chain.name, this.config.env, this.chain.defaultApiUrl);
772
- this.provider = new ethers3.JsonRpcProvider(apiUrl);
773
- this.results = new WarpEvmResults(config);
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 (!ethers3.isAddress(executable.destination)) {
862
+ if (!ethers4.isAddress(executable.destination)) {
794
863
  throw new Error(`WarpEvmExecutor: Invalid destination address: ${executable.destination}`);
795
864
  }
796
- if (executable.value < 0) {
797
- throw new Error(`WarpEvmExecutor: Transfer value cannot be negative: ${executable.value}`);
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 (!ethers3.isAddress(executable.destination)) {
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 ethers3.Interface([`function ${action.func}`]);
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 (!ethers3.isAddress(executable.destination)) {
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 ethers3.Interface([`function ${action.func}`]);
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
- const typedValue = this.serializer.stringToTyped(value);
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: ethers3.parseUnits(WarpEvmConstants.GasPrice.Default, "wei")
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
- defaultGasLimit = BigInt(WarpEvmConstants.GasLimit.ContractCall);
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: ethers3.parseUnits(WarpEvmConstants.GasPrice.Default, "wei")
1052
+ gasPrice: ethers4.parseUnits(WarpEvmConstants.GasPrice.Default, "wei")
957
1053
  };
958
1054
  }
959
1055
  }
960
1056
  async signMessage(message, privateKey) {
961
- throw new Error("Not implemented");
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(ChainNameArbitrum, "arb", {
1081
- devnet: {
1082
- name: ChainNameArbitrum,
1083
- displayName: "Arbitrum Devnet",
1084
- chainId: "421614",
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://sepolia-rollup.arbitrum.io/rpc",
1230
+ defaultApiUrl: "https://arb1.arbitrum.io/rpc",
1088
1231
  nativeToken: NativeTokenArb
1089
1232
  },
1090
1233
  testnet: {
1091
- name: ChainNameArbitrum,
1092
- displayName: "Arbitrum Testnet",
1093
- chainId: "421613",
1234
+ name: WarpChainName.Arbitrum,
1235
+ displayName: "Arbitrum Sepolia",
1236
+ chainId: "421614",
1094
1237
  blockTime: 1e3,
1095
1238
  addressHrp: "0x",
1096
- defaultApiUrl: "https://goerli-rollup.arbitrum.io/rpc",
1239
+ defaultApiUrl: "https://sepolia-rollup.arbitrum.io/rpc",
1097
1240
  nativeToken: NativeTokenArb
1098
1241
  },
1099
- mainnet: {
1100
- name: ChainNameArbitrum,
1101
- displayName: "Arbitrum",
1102
- chainId: "42161",
1242
+ devnet: {
1243
+ name: WarpChainName.Arbitrum,
1244
+ displayName: "Arbitrum Sepolia",
1245
+ chainId: "421614",
1103
1246
  blockTime: 1e3,
1104
1247
  addressHrp: "0x",
1105
- defaultApiUrl: "https://arb1.arbitrum.io/rpc",
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
- var ChainNameBase = "base";
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(ChainNameBase, "base", {
1262
+ var getBaseAdapter = createEvmAdapter(WarpChainName2.Base, "base", {
1119
1263
  mainnet: {
1120
- name: ChainNameBase,
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: ChainNameBase,
1130
- displayName: "Base Testnet",
1131
- chainId: "84531",
1273
+ name: WarpChainName2.Base,
1274
+ displayName: "Base Sepolia",
1275
+ chainId: "84532",
1132
1276
  blockTime: 2e3,
1133
1277
  addressHrp: "0x",
1134
- defaultApiUrl: "https://goerli.base.org",
1278
+ defaultApiUrl: "https://sepolia.base.org",
1135
1279
  nativeToken: NativeTokenBase
1136
1280
  },
1137
1281
  devnet: {
1138
- name: ChainNameBase,
1139
- displayName: "Base Devnet",
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
- var ChainNameEthereum = "ethereum";
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(ChainNameEthereum, "eth", {
1157
- devnet: {
1158
- name: ChainNameEthereum,
1159
- displayName: "Ethereum Devnet",
1160
- chainId: "11155111",
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-sepolia-rpc.publicnode.com",
1311
+ defaultApiUrl: "https://ethereum-rpc.publicnode.com",
1164
1312
  nativeToken: NativeTokenEth
1165
1313
  },
1166
1314
  testnet: {
1167
- name: ChainNameEthereum,
1168
- displayName: "Ethereum Testnet",
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
- mainnet: {
1176
- name: ChainNameEthereum,
1177
- displayName: "Ethereum Mainnet",
1178
- chainId: "1",
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 = () => [ChainNameArbitrum, ChainNameBase, ChainNameEthereum];
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,
@@ -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":"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","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":"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","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.18",
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.85"
40
+ "@vleap/warps": "^3.0.0-alpha.86"
41
41
  }
42
42
  }