@deserialize/multi-vm-wallet 1.2.11 → 1.2.21

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.
Files changed (47) hide show
  1. package/dist/IChainWallet.d.ts +5 -1
  2. package/dist/IChainWallet.js.map +1 -1
  3. package/dist/constant.d.ts +16 -0
  4. package/dist/constant.js +19 -3
  5. package/dist/constant.js.map +1 -1
  6. package/dist/evm/evm.d.ts +6 -1
  7. package/dist/evm/evm.js +36 -45
  8. package/dist/evm/evm.js.map +1 -1
  9. package/dist/evm/transactionParsing.d.ts +3687 -0
  10. package/dist/evm/transactionParsing.js +441 -0
  11. package/dist/evm/transactionParsing.js.map +1 -0
  12. package/dist/evm/utils.d.ts +2 -9
  13. package/dist/evm/utils.js +17 -16
  14. package/dist/evm/utils.js.map +1 -1
  15. package/dist/helpers/index.d.ts +4 -0
  16. package/dist/helpers/index.js +13 -0
  17. package/dist/helpers/index.js.map +1 -0
  18. package/dist/svm/constant.d.ts +15 -0
  19. package/dist/svm/constant.js +25 -0
  20. package/dist/svm/constant.js.map +1 -0
  21. package/dist/svm/svm.d.ts +5 -2
  22. package/dist/svm/svm.js +10 -0
  23. package/dist/svm/svm.js.map +1 -1
  24. package/dist/svm/transactionParsing.d.ts +28 -0
  25. package/dist/svm/transactionParsing.js +207 -0
  26. package/dist/svm/transactionParsing.js.map +1 -0
  27. package/dist/svm/utils.d.ts +3 -2
  28. package/dist/svm/utils.js +45 -4
  29. package/dist/svm/utils.js.map +1 -1
  30. package/dist/test.d.ts +1 -1
  31. package/dist/test.js +47 -9
  32. package/dist/test.js.map +1 -1
  33. package/dist/types.d.ts +5 -1
  34. package/dist/types.js.map +1 -1
  35. package/package.json +4 -2
  36. package/utils/IChainWallet.ts +6 -2
  37. package/utils/constant.ts +22 -4
  38. package/utils/evm/evm.ts +53 -48
  39. package/utils/evm/transactionParsing.ts +639 -0
  40. package/utils/evm/utils.ts +26 -25
  41. package/utils/helpers/index.ts +11 -0
  42. package/utils/svm/constant.ts +29 -0
  43. package/utils/svm/svm.ts +14 -2
  44. package/utils/svm/transactionParsing.ts +294 -0
  45. package/utils/svm/utils.ts +60 -13
  46. package/utils/test.ts +56 -6
  47. package/utils/types.ts +6 -1
package/dist/test.js CHANGED
@@ -5,15 +5,19 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.testUserKeyPair = void 0;
7
7
  const bs58_1 = __importDefault(require("bs58"));
8
- // import { GenerateNewMnemonic } from "./bip32";
9
- const svm_1 = require("./svm");
10
- const _1 = require(".");
8
+ const web3_js_1 = require("@solana/web3.js");
9
+ const evm_1 = require("./evm");
10
+ const transactionParsing_1 = require("./evm/transactionParsing");
11
+ const viem_1 = require("viem");
12
+ const chains_1 = require("viem/chains");
11
13
  // const mnemonic = GenerateNewMnemonic()
12
14
  // console.log('mnemonic: ', mnemonic);
13
15
  // const seed = VM.mnemonicToSeed(mnemonic)
14
16
  const pKey = "4QxETeX9pndiF1XNghUiDTnZnHq3cfjmuPLBJysrgocsLq1yb8w96aPWALa8ZnRZWmDU4wM8Tg8d1ZRVVByj7uXE";
15
- exports.testUserKeyPair = _1.Keypair.fromSecretKey(bs58_1.default.decode(pKey));
16
- const x = exports.testUserKeyPair instanceof _1.Keypair;
17
+ exports.testUserKeyPair = web3_js_1.Keypair.fromSecretKey(bs58_1.default.decode(pKey));
18
+ const x = exports.testUserKeyPair instanceof web3_js_1.Keypair;
19
+ const evePrivateKey = "0x4c0883a69102937d6231471b5dbb6204fe5129617082792ae468d01a3f362318";
20
+ const evmPrivateKey2 = "0x0123456789012345678901234567890123456789012345678901234567890123";
17
21
  // const vm = new SVMVM(seed)
18
22
  // const vmFromMnemonic = SVMVM.fromMnemonic(mnemonic)
19
23
  // const keyFromMnemonic = vmFromMnemonic.generatePrivateKey(0)
@@ -21,7 +25,7 @@ const x = exports.testUserKeyPair instanceof _1.Keypair;
21
25
  // const key = vm.generatePrivateKey(0)
22
26
  // console.log('key: ', key.privateKey.publicKey);
23
27
  const chainConfig = {
24
- chainId: "solana-mainnet",
28
+ chainId: 123456789,
25
29
  name: "Solana",
26
30
  rpcUrl: "https://solana-mainnet.g.alchemy.com/v2/vB5mKztdJeFdz9RkW99Qf",
27
31
  explorerUrl: "https://explorer.solana.com",
@@ -29,16 +33,19 @@ const chainConfig = {
29
33
  confirmationNo: 1,
30
34
  };
31
35
  const evmChainConfig = {
32
- chainId: "evm-mainnet",
36
+ chainId: 8453,
33
37
  name: "Ethereum",
34
38
  rpcUrl: "https://eth-mainnet.g.alchemy.com/v2/vB5mKztdJeFdz9RkW99Qf",
35
39
  explorerUrl: "https://explorer.ethereum.com",
36
40
  nativeToken: { name: "Ethereum", symbol: "ETH", decimals: 18 },
37
41
  confirmationNo: 1,
38
42
  };
39
- const wallet = new svm_1.SVMChainWallet(chainConfig, exports.testUserKeyPair, 0);
43
+ // const wallet = new SVMChainWallet(chainConfig, testUserKeyPair, 0)
44
+ const wallet = new evm_1.EVMChainWallet(evmChainConfig, evmPrivateKey2, 0);
40
45
  // console.log('wallet: ', wallet);
41
- wallet.getNativeBalance().then(e => console.log('native balance: ', e));
46
+ // wallet.discoverToken().then(e => console.log('discovered tokens: ', e))
47
+ // wallet.getNativeBalance().then(e => console.log('native balance: ', e))
48
+ console.log('address: ', wallet.address);
42
49
  // const toBuy = new PublicKey("9BB6NFEcjBCtnNLFko2FqVQBq8HHM13kCyYcdQbgpump")
43
50
  // wallet.swap({
44
51
  // name: NATIVE_MINT.toBase58(),
@@ -48,4 +55,35 @@ wallet.getNativeBalance().then(e => console.log('native balance: ', e));
48
55
  // }, toBuy, 0.005,).then(res => console.log(res))
49
56
  // console.log('wal: ', wal.address);
50
57
  // wal.getNativeBalance().then(e => console.log(e))
58
+ const RPC_URL = chainConfig.rpcUrl;
59
+ const connection = new web3_js_1.Connection(RPC_URL);
60
+ /**
61
+ * Fetches and logs the token metadata for a given mint address.
62
+ * @param mintAddress - The mint address of the token.
63
+ */
64
+ // get transaction history
65
+ // getTransactionHistory(
66
+ // connection,
67
+ // wallet.address,
68
+ // {
69
+ // limit: 2,
70
+ // before: "5RKG5zKJdz9PqWSav1J358hm1GtfnV1QnYcrw3sRpY7aCgT7f4HTKnp4c9pXrJRujcHHisu3Z6jdtbzq5aTRbikq"
71
+ // }
72
+ // ).then((history: any) => {
73
+ // console.log("Transaction History:", history);
74
+ // }).catch((error: any) => {
75
+ // console.error("Error fetching transaction history:", error);
76
+ // });
77
+ const client = (0, viem_1.createPublicClient)({
78
+ chain: chains_1.base,
79
+ transport: (0, viem_1.http)(chains_1.base.rpcUrls.default.http[0]),
80
+ });
81
+ (0, transactionParsing_1.getEVMTransactionHistory)(client, "0x9C82CE0e125F61AdE50BC0c19638F6Ba93d71D5e", {
82
+ startBlock: BigInt(37427020)
83
+ // before: "0xabc..."
84
+ }).then((history) => {
85
+ console.log("EVM Transaction History:", history);
86
+ }).catch((error) => {
87
+ console.error("Error fetching EVM transaction history:", error);
88
+ });
51
89
  //# sourceMappingURL=test.js.map
package/dist/test.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"test.js","sourceRoot":"","sources":["../utils/test.ts"],"names":[],"mappings":";;;;;;AAGA,gDAA0B;AAE1B,iDAAiD;AACjD,+BAA8C;AAG9C,wBAA4B;AAC5B,yCAAyC;AAGzC,uCAAuC;AAEvC,2CAA2C;AAC3C,MAAM,IAAI,GAAG,0FAA0F,CAAA;AAE1F,QAAA,eAAe,GAAG,UAAO,CAAC,aAAa,CAAC,cAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AAC1E,MAAM,CAAC,GAAG,uBAAe,YAAY,UAAO,CAAC;AAC7C,6BAA6B;AAG7B,sDAAsD;AACtD,+DAA+D;AAC/D,0EAA0E;AAC1E,uCAAuC;AACvC,kDAAkD;AAClD,MAAM,WAAW,GAAsB;IACnC,OAAO,EAAE,gBAAgB;IACzB,IAAI,EAAE,QAAQ;IACd,MAAM,EAAE,+DAA+D;IACvE,WAAW,EAAE,6BAA6B;IAC1C,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE;IAC3D,cAAc,EAAE,CAAC;CAEpB,CAAA;AAED,MAAM,cAAc,GAAsB;IACtC,OAAO,EAAE,aAAa;IACtB,IAAI,EAAE,UAAU;IAChB,MAAM,EAAE,4DAA4D;IACpE,WAAW,EAAE,+BAA+B;IAC5C,WAAW,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE;IAC9D,cAAc,EAAE,CAAC;CACpB,CAAA;AAGD,MAAM,MAAM,GAAG,IAAI,oBAAc,CAAC,WAAW,EAAE,uBAAe,EAAE,CAAC,CAAC,CAAA;AAClE,mCAAmC;AAEnC,MAAM,CAAC,gBAAgB,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC,CAAA;AACvE,8EAA8E;AAC9E,gBAAgB;AAChB,oCAAoC;AACpC,uCAAuC;AACvC,sCAAsC;AACtC,kBAAkB;AAClB,kDAAkD;AAGlD,qCAAqC;AACrC,mDAAmD"}
1
+ {"version":3,"file":"test.js","sourceRoot":"","sources":["../utils/test.ts"],"names":[],"mappings":";;;;;;AAGA,gDAA0B;AAE1B,6CAAiE;AAKjE,+BAAuC;AAEvC,iEAAoE;AACpE,+BAA8D;AAC9D,wCAA+C;AAC/C,yCAAyC;AAGzC,uCAAuC;AAEvC,2CAA2C;AAC3C,MAAM,IAAI,GAAG,0FAA0F,CAAA;AAE1F,QAAA,eAAe,GAAG,iBAAO,CAAC,aAAa,CAAC,cAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AAC1E,MAAM,CAAC,GAAG,uBAAe,YAAY,iBAAO,CAAC;AAC7C,MAAM,aAAa,GAAG,oEAAoE,CAAA;AAC1F,MAAM,cAAc,GAAG,oEAAoE,CAAA;AAE3F,6BAA6B;AAG7B,sDAAsD;AACtD,+DAA+D;AAC/D,0EAA0E;AAC1E,uCAAuC;AACvC,kDAAkD;AAClD,MAAM,WAAW,GAAsB;IACnC,OAAO,EAAE,SAAS;IAClB,IAAI,EAAE,QAAQ;IACd,MAAM,EAAE,+DAA+D;IACvE,WAAW,EAAE,6BAA6B;IAC1C,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE;IAC3D,cAAc,EAAE,CAAC;CAEpB,CAAA;AAED,MAAM,cAAc,GAAsB;IACtC,OAAO,EAAE,IAAI;IACb,IAAI,EAAE,UAAU;IAChB,MAAM,EAAE,4DAA4D;IACpE,WAAW,EAAE,+BAA+B;IAC5C,WAAW,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE;IAC9D,cAAc,EAAE,CAAC;CACpB,CAAA;AAGD,qEAAqE;AACrE,MAAM,MAAM,GAAG,IAAI,oBAAc,CAAC,cAAc,EAAE,cAAc,EAAE,CAAC,CAAC,CAAA;AACpE,mCAAmC;AAEnC,0EAA0E;AAC1E,0EAA0E;AAC1E,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;AACzC,8EAA8E;AAC9E,gBAAgB;AAChB,oCAAoC;AACpC,uCAAuC;AACvC,sCAAsC;AACtC,kBAAkB;AAClB,kDAAkD;AAGlD,qCAAqC;AACrC,mDAAmD;AAOnD,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC;AACnC,MAAM,UAAU,GAAG,IAAI,oBAAU,CAAC,OAAO,CAAC,CAAC;AAE3C;;;GAGG;AAEH,0BAA0B;AAC1B,yBAAyB;AACzB,kBAAkB;AAClB,sBAAsB;AACtB,QAAQ;AACR,oBAAoB;AACpB,6GAA6G;AAC7G,QAAQ;AACR,6BAA6B;AAC7B,oDAAoD;AACpD,6BAA6B;AAC7B,mEAAmE;AACnE,MAAM;AACN,MAAM,MAAM,GAAG,IAAA,yBAAkB,EAAC;IAC9B,KAAK,EAAE,aAAI;IACX,SAAS,EAAE,IAAA,WAAI,EAAC,aAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;CAChD,CAAC,CAAA;AAEF,IAAA,6CAAwB,EAAC,MAAsB,EAAE,4CAA4C,EAAE;IAC3F,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC5B,qBAAqB;CACxB,CAAC,CAAC,IAAI,CAAC,CAAC,OAAY,EAAE,EAAE;IACrB,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,OAAO,CAAC,CAAC;AACrD,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAU,EAAE,EAAE;IACpB,OAAO,CAAC,KAAK,CAAC,yCAAyC,EAAE,KAAK,CAAC,CAAC;AACpE,CAAC,CAAC,CAAC"}
package/dist/types.d.ts CHANGED
@@ -2,7 +2,7 @@ import BN from "bn.js";
2
2
  import { EVMVM } from "./evm";
3
3
  import { SVMVM } from "./svm";
4
4
  export interface ChainWalletConfig {
5
- chainId: string | number;
5
+ chainId: number;
6
6
  name: string;
7
7
  rpcUrl: string;
8
8
  explorerUrl: string;
@@ -22,6 +22,10 @@ export interface TokenInfo {
22
22
  symbol: string;
23
23
  decimals: number;
24
24
  }
25
+ export interface UserTokenBalance<AddressType> extends TokenInfo {
26
+ balance: number;
27
+ owner: AddressType;
28
+ }
25
29
  export interface NFTInfo {
26
30
  tokenId: string;
27
31
  contractAddress: string;
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../utils/types.ts"],"names":[],"mappings":";;;AACA,+BAA8B;AAC9B,+BAA8B;AA+CjB,QAAA,YAAY,GAAG;IACxB,KAAK,EAAE,WAAK;IACZ,KAAK,EAAE,WAAK;CACN,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../utils/types.ts"],"names":[],"mappings":";;;AACA,+BAA8B;AAC9B,+BAA8B;AAoDjB,QAAA,YAAY,GAAG;IACxB,KAAK,EAAE,WAAK;IACZ,KAAK,EAAE,WAAK;CACN,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deserialize/multi-vm-wallet",
3
- "version": "1.2.11",
3
+ "version": "1.2.21",
4
4
  "devDependencies": {
5
5
  "@types/bn.js": "^5.2.0",
6
6
  "@types/crypto-js": "^4.2.2",
@@ -10,6 +10,7 @@
10
10
  "typescript": "^5.9.2"
11
11
  },
12
12
  "dependencies": {
13
+ "@metaplex-foundation/js": "^0.20.1",
13
14
  "@noble/hashes": "^1.3.3",
14
15
  "@scure/bip32": "^2.0.1",
15
16
  "@scure/bip39": "^2.0.1",
@@ -21,7 +22,8 @@
21
22
  "debonk-evm-sever-sdk": "^1.4.0",
22
23
  "ethers": "^6.15.0",
23
24
  "promise-retry": "^2.0.1",
24
- "tweetnacl": "^1.0.3"
25
+ "tweetnacl": "^1.0.3",
26
+ "viem": "^2.38.4"
25
27
  },
26
28
  "description": "Multi VM Wallet",
27
29
  "main": "dist/index.js",
@@ -1,4 +1,6 @@
1
- import { Balance, ChainWalletConfig, NFTInfo, TokenInfo, TransactionResult } from "./types";
1
+ import { EVMTransactionHistoryItem } from "./evm/transactionParsing";
2
+ import { SVMTransactionHistoryItem } from "./svm/transactionParsing";
3
+ import { Balance, ChainWalletConfig, NFTInfo, TokenInfo, TransactionResult, UserTokenBalance } from "./types";
2
4
 
3
5
  export abstract class ChainWallet<AddressType, PrivateKeyType, ConnectionType> {
4
6
  protected privateKey: PrivateKeyType;
@@ -20,7 +22,9 @@ export abstract class ChainWallet<AddressType, PrivateKeyType, ConnectionType> {
20
22
  abstract getTokenBalance(tokenAddress: AddressType): Promise<Balance>;
21
23
  abstract transferNative(to: AddressType, amount: number): Promise<TransactionResult>;
22
24
  abstract transferToken(tokenAddress: TokenInfo, to: AddressType, amount: number): Promise<TransactionResult>;
23
- abstract swap (tokenAddress: TokenInfo, to: AddressType, amount: number, slippage?: number): Promise<TransactionResult>;
25
+ abstract swap(tokenAddress: TokenInfo, to: AddressType, amount: number, slippage?: number): Promise<TransactionResult>;
26
+ abstract discoverToken(): Promise<UserTokenBalance<AddressType>[]>;
27
+ abstract getTransactionHistory(): Promise<(SVMTransactionHistoryItem | EVMTransactionHistoryItem)[]>;
24
28
 
25
29
  // abstract transferNFT(contractAddress: AddressType, tokenId: string, to: string): Promise<TransactionResult>;
26
30
  // abstract getTokenInfo(tokenAddress: string): Promise<TokenInfo>;
package/utils/constant.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { ChainWalletConfig } from "./types";
2
2
 
3
3
  export const DefaultChains: ChainWalletConfig[] = [{
4
- chainId: 501,
4
+ chainId: 123456789,
5
5
  name: "Solana Mainnet",
6
6
  rpcUrl: "https://solana-mainnet.g.alchemy.com/v2/vB5mKztdJeFdz9RkW99Qf",
7
7
  explorerUrl: "https://explorer.solana.com", // e.g. Solana Explorer
@@ -13,7 +13,6 @@ export const DefaultChains: ChainWalletConfig[] = [{
13
13
  testnet: false,
14
14
  logoUrl: "https://cryptologos.cc/logos/solana-sol-logo.png?v=040",
15
15
  vmType: "SVM"
16
-
17
16
  }
18
17
  , {
19
18
  chainId: 1,
@@ -42,7 +41,7 @@ export const DefaultChains: ChainWalletConfig[] = [{
42
41
  logoUrl: "https://cryptologos.cc/logos/bnb-bnb-logo.png?v=040",
43
42
  vmType: "EVM"
44
43
  }, {
45
- chainId: 501,
44
+ chainId: 123456791,
46
45
  name: "Eclipse Mainnet",
47
46
  rpcUrl: "https://mainnetbeta-rpc.eclipse.xyz",
48
47
  explorerUrl: "https://explorer.eclipse.xyz/", // e.g. Solana Explorer
@@ -71,4 +70,23 @@ export const DefaultChains: ChainWalletConfig[] = [{
71
70
  }
72
71
 
73
72
 
74
- ]
73
+ ]
74
+
75
+ export const TRANSACTION_TYPE = {
76
+ // CAPITALIZE THE VALUES
77
+ NATIVE_TRANSFER: 'NATIVE_TRANSFER',
78
+ TOKEN_TRANSFER: 'TOKEN_TRANSFER',
79
+ NFT_TRANSFER: 'NFT_TRANSFER',
80
+ DEPOSIT: 'DEPOSIT',
81
+ WITHDRAWAL: 'WITHDRAWAL',
82
+ CONTRACT_INTERACTION: 'CONTRACT_INTERACTION',
83
+ SWAP: 'SWAP',
84
+ STAKING: 'STAKING',
85
+ TOKEN_INTERACTIONS: 'TOKEN_INTERACTIONS',
86
+ CONTRACT_CREATION: 'CONTRACT_CREATION',
87
+ PROGRAM_INTERACTION: 'PROGRAM_INTERACTION',
88
+ SYSTEM: 'SYSTEM',
89
+ UNKNOWN: 'UNKNOWN'
90
+
91
+ } as const
92
+ export type TransactionType = keyof typeof TRANSACTION_TYPE;
package/utils/evm/evm.ts CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  import { EVMDeriveChildPrivateKey } from "../walletBip32";
8
8
  import { ChainWallet } from "../IChainWallet";
9
- import { Balance, ChainWalletConfig, NFTInfo, TokenInfo, TransactionResult } from "../types";
9
+ import { Balance, ChainWalletConfig, NFTInfo, UserTokenBalance, TokenInfo, TransactionResult } from "../types";
10
10
  import { VM } from "../vm";
11
11
  import { ethers, JsonRpcProvider, Wallet, formatUnits } from "ethers";
12
12
  import BN from "bn.js";
@@ -29,8 +29,11 @@ import {
29
29
  approveToken,
30
30
  executeContractMethod,
31
31
  getTokenInfo,
32
- DESERIALIZED_SUPPORTED_CHAINS
32
+ DESERIALIZED_SUPPORTED_CHAINS,
33
+ discoverTokens
33
34
  } from "./utils";
35
+ import { EVMTransactionHistoryItem, getEVMTransactionHistory } from "./transactionParsing";
36
+ import { createPublicClient, Hex, http, PublicClient } from "viem";
34
37
 
35
38
  interface DebonkQuoteResponse {
36
39
  tokenA: string;
@@ -110,12 +113,45 @@ export class EVMVM extends VM<string, string, JsonRpcProvider> {
110
113
  }
111
114
 
112
115
  export class EVMChainWallet extends ChainWallet<string, string, JsonRpcProvider> {
116
+ client: PublicClient
113
117
  constructor(config: ChainWalletConfig, privateKey: string, index: number) {
114
118
  super(config, privateKey, index);
115
119
  const wallet = new Wallet(privateKey);
116
120
  this.address = wallet.address;
117
121
  this.privateKey = privateKey;
118
122
  this.connection = new JsonRpcProvider(config.rpcUrl)
123
+
124
+ //client for viem
125
+ this.client = createPublicClient(
126
+ {
127
+ chain: {
128
+ rpcUrls: {
129
+ default: {
130
+ http: [config.rpcUrl]
131
+ }
132
+ },
133
+ id: config.chainId,
134
+ name: config.name,
135
+ nativeCurrency: {
136
+ name: config.nativeToken.name,
137
+ symbol: config.nativeToken.symbol,
138
+ decimals: config.nativeToken.decimals
139
+ },
140
+ blockExplorers: {
141
+ default: {
142
+ name: config.name + " Explorer",
143
+ url: config.explorerUrl,
144
+ apiUrl: config.explorerUrl
145
+ },
146
+
147
+ },
148
+ testnet: config.testnet || false
149
+
150
+ },
151
+ transport: http(config.rpcUrl)
152
+ },
153
+
154
+ )
119
155
  }
120
156
 
121
157
  getWallet(): Wallet {
@@ -136,6 +172,11 @@ export class EVMChainWallet extends ChainWallet<string, string, JsonRpcProvider>
136
172
  return await EVMVM.getTokenBalance(this.address, tokenAddress, this.connection!)
137
173
  }
138
174
 
175
+ async discoverToken(): Promise<UserTokenBalance<string>[]> {
176
+ // Implement token discovery logic here
177
+ return await discoverTokens(this.address, this.config)
178
+ }
179
+
139
180
  async transferNative(to: string, amount: number): Promise<TransactionResult> {
140
181
  // Implement native transfer logic here
141
182
  const wallet = this.getWallet()
@@ -148,6 +189,11 @@ export class EVMChainWallet extends ChainWallet<string, string, JsonRpcProvider>
148
189
  return await sendERC20Token(wallet, tokenAddress.address, to, amount.toString(), undefined, this.config.confirmationNo || 5)
149
190
  }
150
191
 
192
+ async getTransactionHistory(): Promise<EVMTransactionHistoryItem[]> {
193
+ const wallet = this.getWallet();
194
+ return await getEVMTransactionHistory(this.client, wallet.address as Hex);
195
+ }
196
+
151
197
  // Updated swap method signature to match base class so created another method to use it inside swap
152
198
  async swap(
153
199
  tokenAddress: TokenInfo,
@@ -222,20 +268,12 @@ export class EVMChainWallet extends ChainWallet<string, string, JsonRpcProvider>
222
268
 
223
269
  // Convert amount to wei (multiply by 10^18 for 18 decimal tokens)
224
270
  const amountInWei = (amount * Math.pow(10, tokenIn.decimals || 18)).toString();
225
- console.log("amountInWei", amountInWei)
271
+
226
272
  // Convert slippage from bps to percentage (e.g., 50 bps -> 0.5%)
227
273
  const slippagePercentage = slippage / 100;
228
274
 
229
- console.log("Debonk API swap params:", {
230
- tokenA: tokenInAddress,
231
- tokenB: tokenOutAddress,
232
- amountIn: amount,
233
- amountInWei: amountInWei,
234
- slippage: slippagePercentage,
235
- });
236
275
 
237
276
  // Step 1: Get quote from API
238
- console.log("Getting quote from Debonk API...");
239
277
 
240
278
  const quotePayload = {
241
279
  tokenA: tokenInAddress,
@@ -244,7 +282,6 @@ export class EVMChainWallet extends ChainWallet<string, string, JsonRpcProvider>
244
282
  dexId: "ZERO_G"
245
283
  };
246
284
 
247
- console.log("Quote request payload:", quotePayload);
248
285
 
249
286
  const quoteResponse = await fetch(`${BASE_URL}/quote`, {
250
287
  method: 'POST',
@@ -261,7 +298,6 @@ export class EVMChainWallet extends ChainWallet<string, string, JsonRpcProvider>
261
298
  }
262
299
 
263
300
  const quote: DebonkQuoteResponse = await quoteResponse.json();
264
- console.log("Quote received:", JSON.stringify(quote, null, 2));
265
301
 
266
302
  // Step 2: Fix the quote dexId for swap API (it expects "ALL")
267
303
  const modifiedQuote = {
@@ -269,14 +305,8 @@ export class EVMChainWallet extends ChainWallet<string, string, JsonRpcProvider>
269
305
  dexId: "ALL" // Change from "ZERO_G" to "ALL" as required by swap API
270
306
  };
271
307
 
272
- console.log("Modified quote for swap API:", JSON.stringify(modifiedQuote, null, 2));
273
-
274
308
  // Step 3: Get wallet address
275
309
  const walletAddress = await this.getWallet().getAddress();
276
- console.log("Wallet address:", walletAddress);
277
-
278
- // Step 4: Call swap API with modified quote
279
- console.log("Calling swap API...");
280
310
 
281
311
  const swapPayload = {
282
312
  publicKey: walletAddress,
@@ -285,7 +315,6 @@ export class EVMChainWallet extends ChainWallet<string, string, JsonRpcProvider>
285
315
 
286
316
  };
287
317
 
288
- console.log("Swap request payload:", JSON.stringify(swapPayload, null, 2));
289
318
 
290
319
  const swapResponse = await fetch(`${BASE_URL}/swap`, {
291
320
  method: 'POST',
@@ -302,17 +331,14 @@ export class EVMChainWallet extends ChainWallet<string, string, JsonRpcProvider>
302
331
  }
303
332
 
304
333
  const swapData: DebonkSwapResponse = await swapResponse.json();
305
- console.log("Swap API response:", JSON.stringify(swapData, null, 2));
306
334
 
307
335
  const wallet = this.getWallet();
308
336
  let lastTxHash = '';
309
337
 
310
338
  // Step 5: Execute each transaction sequentially
311
- console.log(`Executing ${swapData.transactions.length} transactions...`);
312
339
 
313
340
  for (let i = 0; i < swapData.transactions.length; i++) {
314
341
  const transaction = swapData.transactions[i];
315
- console.log(`Executing transaction ${i + 1} of ${swapData.transactions.length}`);
316
342
 
317
343
  // Prepare transaction object
318
344
  const txRequest = {
@@ -322,8 +348,6 @@ export class EVMChainWallet extends ChainWallet<string, string, JsonRpcProvider>
322
348
  // gasPrice: 70000000000,
323
349
  // gasLimit: 70000, // Increase significantly
324
350
  };
325
- console.log("Prepared transaction request:", txRequest);
326
- console.log(`Transaction ${i + 1} request:`, txRequest);
327
351
 
328
352
  try {
329
353
  const txResponse = await wallet.sendTransaction(txRequest);
@@ -339,11 +363,6 @@ export class EVMChainWallet extends ChainWallet<string, string, JsonRpcProvider>
339
363
  const txHash = receipt.hash || txResponse.hash;
340
364
  lastTxHash = txHash;
341
365
 
342
- console.log(`Transaction ${i + 1} confirmed:`, {
343
- hash: txHash,
344
- blockNumber: receipt.blockNumber,
345
- gasUsed: receipt.gasUsed?.toString()
346
- });
347
366
 
348
367
  } catch (txError: any) {
349
368
  console.error(`Transaction ${i + 1} failed:`, txError);
@@ -351,7 +370,7 @@ export class EVMChainWallet extends ChainWallet<string, string, JsonRpcProvider>
351
370
  }
352
371
  }
353
372
 
354
- console.log("All transactions completed successfully");
373
+
355
374
 
356
375
  return {
357
376
  success: true,
@@ -412,12 +431,7 @@ export class EVMChainWallet extends ChainWallet<string, string, JsonRpcProvider>
412
431
  isNativeOut
413
432
  );
414
433
 
415
- console.log('Kyber swap parameters:', {
416
- tokenInAddress,
417
- tokenOutAddress,
418
- formattedAmountIn,
419
- tokenInDecimals
420
- });
434
+
421
435
 
422
436
  if (isNativeIn) {
423
437
  const nativeBalance = await this.getNativeBalance();
@@ -453,7 +467,7 @@ export class EVMChainWallet extends ChainWallet<string, string, JsonRpcProvider>
453
467
  });
454
468
 
455
469
  if (!isNativeIn) {
456
- console.log('Checking token approval...');
470
+
457
471
  const approvalResult = await checkAndApprove(
458
472
  wallet,
459
473
  tokenIn.address,
@@ -487,20 +501,11 @@ export class EVMChainWallet extends ChainWallet<string, string, JsonRpcProvider>
487
501
  this.config.confirmationNo || 1,
488
502
  );
489
503
 
490
- if (result.success) {
491
- console.log(' Kyber swap completed successfully:', {
492
- hash: result.hash,
493
- gasUsed: result.gasUsed?.toString(),
494
- blockNumber: result.blockNumber
495
- });
496
- } else {
497
- console.log(' Kyber swap failed:', result);
498
- }
499
504
 
500
505
  return result;
501
506
 
502
507
  } catch (error) {
503
- console.error('Kyber swap failed:', error);
508
+
504
509
  throw new Error(`Kyber swap failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
505
510
  }
506
511
  }