@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.
- package/dist/IChainWallet.d.ts +5 -1
- package/dist/IChainWallet.js.map +1 -1
- package/dist/constant.d.ts +16 -0
- package/dist/constant.js +19 -3
- package/dist/constant.js.map +1 -1
- package/dist/evm/evm.d.ts +6 -1
- package/dist/evm/evm.js +36 -45
- package/dist/evm/evm.js.map +1 -1
- package/dist/evm/transactionParsing.d.ts +3687 -0
- package/dist/evm/transactionParsing.js +441 -0
- package/dist/evm/transactionParsing.js.map +1 -0
- package/dist/evm/utils.d.ts +2 -9
- package/dist/evm/utils.js +17 -16
- package/dist/evm/utils.js.map +1 -1
- package/dist/helpers/index.d.ts +4 -0
- package/dist/helpers/index.js +13 -0
- package/dist/helpers/index.js.map +1 -0
- package/dist/svm/constant.d.ts +15 -0
- package/dist/svm/constant.js +25 -0
- package/dist/svm/constant.js.map +1 -0
- package/dist/svm/svm.d.ts +5 -2
- package/dist/svm/svm.js +10 -0
- package/dist/svm/svm.js.map +1 -1
- package/dist/svm/transactionParsing.d.ts +28 -0
- package/dist/svm/transactionParsing.js +207 -0
- package/dist/svm/transactionParsing.js.map +1 -0
- package/dist/svm/utils.d.ts +3 -2
- package/dist/svm/utils.js +45 -4
- package/dist/svm/utils.js.map +1 -1
- package/dist/test.d.ts +1 -1
- package/dist/test.js +47 -9
- package/dist/test.js.map +1 -1
- package/dist/types.d.ts +5 -1
- package/dist/types.js.map +1 -1
- package/package.json +4 -2
- package/utils/IChainWallet.ts +6 -2
- package/utils/constant.ts +22 -4
- package/utils/evm/evm.ts +53 -48
- package/utils/evm/transactionParsing.ts +639 -0
- package/utils/evm/utils.ts +26 -25
- package/utils/helpers/index.ts +11 -0
- package/utils/svm/constant.ts +29 -0
- package/utils/svm/svm.ts +14 -2
- package/utils/svm/transactionParsing.ts +294 -0
- package/utils/svm/utils.ts +60 -13
- package/utils/test.ts +56 -6
- 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
|
-
|
|
9
|
-
const
|
|
10
|
-
const
|
|
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 =
|
|
16
|
-
const x = exports.testUserKeyPair instanceof
|
|
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:
|
|
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:
|
|
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
|
|
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.
|
|
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,
|
|
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:
|
|
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;
|
|
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.
|
|
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",
|
package/utils/IChainWallet.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import {
|
|
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
|
|
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:
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
508
|
+
|
|
504
509
|
throw new Error(`Kyber swap failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
505
510
|
}
|
|
506
511
|
}
|