@deserialize/multi-vm-wallet 1.2.10 → 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 +4 -3
- package/dist/svm/utils.js +82 -9
- 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 +104 -13
- package/utils/test.ts +56 -6
- package/utils/types.ts +6 -1
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.HelperAPI = void 0;
|
|
4
|
+
const BASE_URL = "https://helper.decane.app";
|
|
5
|
+
class HelperAPI {
|
|
6
|
+
static async getUserToken(wallet, vm, chainId) {
|
|
7
|
+
const res = await fetch("" + BASE_URL + `/${vm}/tokens/discover?wallet=${wallet}&chainId=${chainId}`);
|
|
8
|
+
const data = await res.json();
|
|
9
|
+
return data;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
exports.HelperAPI = HelperAPI;
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../utils/helpers/index.ts"],"names":[],"mappings":";;;AAEA,MAAM,QAAQ,GAAG,2BAA2B,CAAA;AAE5C,MAAa,SAAS;IAClB,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,MAAc,EAAE,EAAW,EAAE,OAAe;QAClE,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,EAAE,GAAG,QAAQ,GAAG,IAAI,EAAE,2BAA2B,MAAM,YAAY,OAAO,EAAE,CAAC,CAAC;QACtG,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ;AAND,8BAMC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
declare const SVM_NETWORKS_NAME: {
|
|
2
|
+
readonly SOLANA_MAINNET: "SOLANA_MAINNET";
|
|
3
|
+
readonly SOLANA_TESTNET: "SOLANA_TESTNET";
|
|
4
|
+
readonly ECLIPSE_MAINNET: "ECLIPSE_MAINNET";
|
|
5
|
+
};
|
|
6
|
+
export declare const SVM_CHAIN_DETAILS: {
|
|
7
|
+
[key: string]: SVMNetwork;
|
|
8
|
+
};
|
|
9
|
+
export type SVMNetwork = typeof SVM_NETWORKS_NAME[keyof typeof SVM_NETWORKS_NAME];
|
|
10
|
+
export declare const SVM_CHAIN_CONFIG: {
|
|
11
|
+
[key in SVMNetwork]: {
|
|
12
|
+
rpcUrl: string;
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
export {};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SVM_CHAIN_CONFIG = exports.SVM_CHAIN_DETAILS = void 0;
|
|
4
|
+
const SVM_NETWORKS_NAME = {
|
|
5
|
+
SOLANA_MAINNET: "SOLANA_MAINNET",
|
|
6
|
+
SOLANA_TESTNET: "SOLANA_TESTNET",
|
|
7
|
+
ECLIPSE_MAINNET: "ECLIPSE_MAINNET"
|
|
8
|
+
};
|
|
9
|
+
exports.SVM_CHAIN_DETAILS = {
|
|
10
|
+
"123456789": SVM_NETWORKS_NAME.SOLANA_MAINNET,
|
|
11
|
+
"123456790": SVM_NETWORKS_NAME.SOLANA_TESTNET,
|
|
12
|
+
"123456791": SVM_NETWORKS_NAME.ECLIPSE_MAINNET
|
|
13
|
+
};
|
|
14
|
+
exports.SVM_CHAIN_CONFIG = {
|
|
15
|
+
[SVM_NETWORKS_NAME.SOLANA_MAINNET]: {
|
|
16
|
+
rpcUrl: "https://solana-mainnet.g.alchemy.com/v2/vB5mKztdJeFdz9RkW99Qf"
|
|
17
|
+
},
|
|
18
|
+
[SVM_NETWORKS_NAME.SOLANA_TESTNET]: {
|
|
19
|
+
rpcUrl: "https://solana-testnet.g.alchemy.com/v2/vB5mKztdJeFdz9RkW99Qf"
|
|
20
|
+
},
|
|
21
|
+
[SVM_NETWORKS_NAME.ECLIPSE_MAINNET]: {
|
|
22
|
+
rpcUrl: "https://mainnetbeta-rpc.eclipse.xyz"
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=constant.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constant.js","sourceRoot":"","sources":["../../utils/svm/constant.ts"],"names":[],"mappings":";;;AAAA,MAAM,iBAAiB,GAAG;IACtB,cAAc,EAAE,gBAAgB;IAChC,cAAc,EAAE,gBAAgB;IAChC,eAAe,EAAE,iBAAiB;CAC5B,CAAA;AAKG,QAAA,iBAAiB,GAAkC;IAC5D,WAAW,EAAE,iBAAiB,CAAC,cAAc;IAC7C,WAAW,EAAE,iBAAiB,CAAC,cAAc;IAC7C,WAAW,EAAE,iBAAiB,CAAC,eAAe;CACjD,CAAA;AAIY,QAAA,gBAAgB,GAAgD;IACzE,CAAC,iBAAiB,CAAC,cAAc,CAAC,EAAE;QAChC,MAAM,EAAE,+DAA+D;KAC1E;IACD,CAAC,iBAAiB,CAAC,cAAc,CAAC,EAAE;QAChC,MAAM,EAAE,+DAA+D;KAC1E;IACD,CAAC,iBAAiB,CAAC,eAAe,CAAC,EAAE;QACjC,MAAM,EAAE,qCAAqC;KAChD;CACJ,CAAA"}
|
package/dist/svm/svm.d.ts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { Connection, Keypair, PublicKey } from "@solana/web3.js";
|
|
2
2
|
import { VM } from "../vm";
|
|
3
3
|
import { ChainWallet } from "../IChainWallet";
|
|
4
|
-
import { Balance, ChainWalletConfig, TokenInfo, TransactionResult } from "../types";
|
|
4
|
+
import { Balance, ChainWalletConfig, UserTokenBalance, TokenInfo, TransactionResult } from "../types";
|
|
5
5
|
import { JupiterQuoteResponse } from "./utils";
|
|
6
|
+
import { SVMTransactionHistoryItem } from "./transactionParsing";
|
|
6
7
|
export declare class SVMVM extends VM<PublicKey, Keypair, Connection> {
|
|
7
|
-
getTokenInfo: (tokenAddress: PublicKey, connection: Connection) => Promise<TokenInfo>;
|
|
8
|
+
getTokenInfo: (tokenAddress: PublicKey, connection: Connection, programId?: PublicKey) => Promise<TokenInfo>;
|
|
8
9
|
static validateAddress(address: PublicKey): boolean;
|
|
9
10
|
derivationPath: string;
|
|
10
11
|
constructor(seed: string);
|
|
@@ -22,8 +23,10 @@ export declare class SVMChainWallet extends ChainWallet<PublicKey, Keypair, Conn
|
|
|
22
23
|
generateAddress(): PublicKey;
|
|
23
24
|
getNativeBalance(): Promise<Balance>;
|
|
24
25
|
getTokenBalance(tokenAddress: PublicKey): Promise<Balance>;
|
|
26
|
+
discoverToken(): Promise<UserTokenBalance<PublicKey>[]>;
|
|
25
27
|
transferNative(to: PublicKey, amount: number): Promise<TransactionResult>;
|
|
26
28
|
transferToken(token: TokenInfo, to: PublicKey, amount: number): Promise<TransactionResult>;
|
|
29
|
+
getTransactionHistory(): Promise<SVMTransactionHistoryItem[]>;
|
|
27
30
|
swap(fromToken: TokenInfo, toToken: PublicKey, amount: number, slippage?: number): Promise<TransactionResult>;
|
|
28
31
|
getSwapQuote(fromToken: TokenInfo, toToken: PublicKey, amount: number, slippage?: number): Promise<{
|
|
29
32
|
success: boolean;
|
package/dist/svm/svm.js
CHANGED
|
@@ -12,6 +12,7 @@ const utils_1 = require("./utils");
|
|
|
12
12
|
const bn_js_1 = __importDefault(require("bn.js"));
|
|
13
13
|
const tweetnacl_1 = __importDefault(require("tweetnacl"));
|
|
14
14
|
const bs58_1 = __importDefault(require("bs58"));
|
|
15
|
+
const transactionParsing_1 = require("./transactionParsing");
|
|
15
16
|
class SVMVM extends vm_1.VM {
|
|
16
17
|
static validateAddress(address) {
|
|
17
18
|
try {
|
|
@@ -81,6 +82,11 @@ class SVMChainWallet extends IChainWallet_1.ChainWallet {
|
|
|
81
82
|
// Implement token balance retrieval logic here
|
|
82
83
|
return await SVMVM.getTokenBalance(this.address, (tokenAddress), this.connection);
|
|
83
84
|
}
|
|
85
|
+
async discoverToken() {
|
|
86
|
+
// Implement token discovery logic here
|
|
87
|
+
const tokens = await (0, utils_1.discoverTokens)(this.address, this.connection);
|
|
88
|
+
return tokens;
|
|
89
|
+
}
|
|
84
90
|
async transferNative(to, amount) {
|
|
85
91
|
// Implement native transfer logic here
|
|
86
92
|
const transaction = await (0, utils_1.getTransferNativeTransaction)(this.privateKey, to, amount, this.connection);
|
|
@@ -93,6 +99,10 @@ class SVMChainWallet extends IChainWallet_1.ChainWallet {
|
|
|
93
99
|
const hash = await SVMVM.signAndSendTransaction(transaction, this.connection, [this.privateKey]);
|
|
94
100
|
return { success: true, hash }; // Placeholder
|
|
95
101
|
}
|
|
102
|
+
async getTransactionHistory() {
|
|
103
|
+
const history = await (0, transactionParsing_1.getSVMTransactionHistory)(this.connection, this.address);
|
|
104
|
+
return history;
|
|
105
|
+
}
|
|
96
106
|
async swap(fromToken, toToken, amount, slippage = 50) {
|
|
97
107
|
try {
|
|
98
108
|
if (amount <= 0) {
|
package/dist/svm/svm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"svm.js","sourceRoot":"","sources":["../../utils/svm/svm.ts"],"names":[],"mappings":";;;;;;AAAA,6CAAiE;AACjE,gDAA0D;AAC1D,8BAA2B;AAC3B,kDAA8C;AAE9C,
|
|
1
|
+
{"version":3,"file":"svm.js","sourceRoot":"","sources":["../../utils/svm/svm.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Connection, PublicKey } from '@solana/web3.js';
|
|
2
|
+
import { TransactionType } from '../constant';
|
|
3
|
+
export interface SVMTransactionHistoryItem {
|
|
4
|
+
hash: string;
|
|
5
|
+
timestamp: number | null | undefined;
|
|
6
|
+
status: 'success' | 'failed' | 'pending';
|
|
7
|
+
fee: number;
|
|
8
|
+
type: TransactionType;
|
|
9
|
+
from: string;
|
|
10
|
+
to?: string;
|
|
11
|
+
slot: number;
|
|
12
|
+
amount?: number;
|
|
13
|
+
token?: string;
|
|
14
|
+
memo?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface TransactionHistoryOptions {
|
|
17
|
+
limit?: number;
|
|
18
|
+
before?: string;
|
|
19
|
+
until?: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Fetches and parses transaction history for a Solana wallet address
|
|
23
|
+
* @param connection - Solana RPC connection
|
|
24
|
+
* @param walletAddress - Public key of the wallet (string or PublicKey)
|
|
25
|
+
* @param options - Optional parameters for pagination and filtering
|
|
26
|
+
* @returns Array of parsed transaction history items
|
|
27
|
+
*/
|
|
28
|
+
export declare function getSVMTransactionHistory(connection: Connection, walletAddress: PublicKey, options?: TransactionHistoryOptions): Promise<SVMTransactionHistoryItem[]>;
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getSVMTransactionHistory = getSVMTransactionHistory;
|
|
4
|
+
const web3_js_1 = require("@solana/web3.js");
|
|
5
|
+
const constant_1 = require("../constant");
|
|
6
|
+
/**
|
|
7
|
+
* Fetches and parses transaction history for a Solana wallet address
|
|
8
|
+
* @param connection - Solana RPC connection
|
|
9
|
+
* @param walletAddress - Public key of the wallet (string or PublicKey)
|
|
10
|
+
* @param options - Optional parameters for pagination and filtering
|
|
11
|
+
* @returns Array of parsed transaction history items
|
|
12
|
+
*/
|
|
13
|
+
async function getSVMTransactionHistory(connection, walletAddress, options = {}) {
|
|
14
|
+
const { limit = 50, before, until } = options;
|
|
15
|
+
const publicKey = typeof walletAddress === 'string'
|
|
16
|
+
? new web3_js_1.PublicKey(walletAddress)
|
|
17
|
+
: walletAddress;
|
|
18
|
+
try {
|
|
19
|
+
// Fetch signature info
|
|
20
|
+
const signatures = await connection.getSignaturesForAddress(publicKey, {
|
|
21
|
+
limit,
|
|
22
|
+
before,
|
|
23
|
+
until,
|
|
24
|
+
});
|
|
25
|
+
console.log(`Found ${signatures.length} transactions`);
|
|
26
|
+
// Fetch and parse transactions in batches to avoid rate limits
|
|
27
|
+
const transactions = await fetchTransactionsInBatches(connection, signatures, 5 // batch size
|
|
28
|
+
);
|
|
29
|
+
// Parse transactions into a user-friendly format
|
|
30
|
+
const history = [];
|
|
31
|
+
for (let i = 0; i < transactions.length; i++) {
|
|
32
|
+
const tx = transactions[i];
|
|
33
|
+
const sigInfo = signatures[i];
|
|
34
|
+
if (!tx) {
|
|
35
|
+
// Transaction might be null if it's not available
|
|
36
|
+
history.push({
|
|
37
|
+
hash: sigInfo.signature,
|
|
38
|
+
timestamp: sigInfo.blockTime,
|
|
39
|
+
slot: sigInfo.slot,
|
|
40
|
+
status: sigInfo.err ? 'failed' : 'success',
|
|
41
|
+
fee: 0,
|
|
42
|
+
type: constant_1.TRANSACTION_TYPE.UNKNOWN,
|
|
43
|
+
from: walletAddress.toBase58()
|
|
44
|
+
});
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
const parsed = parseTransaction(tx, publicKey.toBase58());
|
|
48
|
+
history.push({
|
|
49
|
+
hash: sigInfo.signature,
|
|
50
|
+
timestamp: sigInfo.blockTime,
|
|
51
|
+
slot: sigInfo.slot,
|
|
52
|
+
status: tx.meta?.err ? 'failed' : 'success',
|
|
53
|
+
fee: parsed.fee ?? 0,
|
|
54
|
+
type: parsed.type ?? constant_1.TRANSACTION_TYPE.UNKNOWN,
|
|
55
|
+
from: parsed.from ?? walletAddress.toBase58(),
|
|
56
|
+
...parsed,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
return history;
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
console.error('Error fetching transaction history:', error);
|
|
63
|
+
throw error;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Fetches transactions in batches to avoid overwhelming the RPC
|
|
68
|
+
*/
|
|
69
|
+
async function fetchTransactionsInBatches(connection, signatures, batchSize) {
|
|
70
|
+
const transactions = [];
|
|
71
|
+
for (let i = 0; i < signatures.length; i += batchSize) {
|
|
72
|
+
const batch = signatures.slice(i, i + batchSize);
|
|
73
|
+
const batchPromises = batch.map(sig => connection.getParsedTransaction(sig.signature, {
|
|
74
|
+
maxSupportedTransactionVersion: 0,
|
|
75
|
+
}));
|
|
76
|
+
const batchResults = await Promise.all(batchPromises);
|
|
77
|
+
transactions.push(...batchResults);
|
|
78
|
+
// Small delay to avoid rate limiting
|
|
79
|
+
if (i + batchSize < signatures.length) {
|
|
80
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return transactions;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Parses a transaction into a simplified format
|
|
87
|
+
*/
|
|
88
|
+
function parseTransaction(tx, walletAddress) {
|
|
89
|
+
const fee = tx.meta?.fee || 0;
|
|
90
|
+
// Try to determine transaction type and extract relevant info
|
|
91
|
+
const instructions = tx.transaction.message.instructions;
|
|
92
|
+
// Check for token transfers
|
|
93
|
+
if (tx.meta?.preTokenBalances && tx.meta?.postTokenBalances) {
|
|
94
|
+
// console.log('tx.meta: ', tx.meta);
|
|
95
|
+
const tokenTransfer = findTokenTransfer(tx.meta.preTokenBalances, tx.meta.postTokenBalances, walletAddress);
|
|
96
|
+
if (tokenTransfer) {
|
|
97
|
+
return {
|
|
98
|
+
fee,
|
|
99
|
+
type: constant_1.TRANSACTION_TYPE.TOKEN_TRANSFER,
|
|
100
|
+
from: tokenTransfer.from,
|
|
101
|
+
to: tokenTransfer.to,
|
|
102
|
+
amount: tokenTransfer.amount,
|
|
103
|
+
token: tokenTransfer.mint,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
// Check for SOL transfers
|
|
108
|
+
if (tx.meta?.preBalances && tx.meta?.postBalances) {
|
|
109
|
+
const solTransfer = findSolTransfer(tx.meta.preBalances, tx.meta.postBalances, tx.transaction.message.accountKeys, walletAddress);
|
|
110
|
+
if (solTransfer) {
|
|
111
|
+
return {
|
|
112
|
+
fee,
|
|
113
|
+
type: constant_1.TRANSACTION_TYPE.NATIVE_TRANSFER,
|
|
114
|
+
from: solTransfer.from,
|
|
115
|
+
to: solTransfer.to,
|
|
116
|
+
amount: solTransfer.amount,
|
|
117
|
+
token: 'SOL',
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
// Check for memo
|
|
122
|
+
const memo = extractMemo(instructions);
|
|
123
|
+
// Determine general type based on instructions
|
|
124
|
+
const type = determineTransactionType(instructions);
|
|
125
|
+
return {
|
|
126
|
+
fee,
|
|
127
|
+
type,
|
|
128
|
+
memo,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Finds token transfers in the transaction
|
|
133
|
+
*/
|
|
134
|
+
function findTokenTransfer(preBalances, postBalances, walletAddress) {
|
|
135
|
+
for (let i = 0; i < postBalances.length; i++) {
|
|
136
|
+
const post = postBalances[i];
|
|
137
|
+
const pre = preBalances.find(p => p.accountIndex === post.accountIndex);
|
|
138
|
+
if (!pre)
|
|
139
|
+
continue;
|
|
140
|
+
const preAmount = parseFloat(pre.uiTokenAmount.uiAmountString || "0");
|
|
141
|
+
const postAmount = parseFloat(post.uiTokenAmount.uiAmountString || "0");
|
|
142
|
+
const diff = postAmount - preAmount;
|
|
143
|
+
const from = diff < 0 ? post.owner ?? "unknown" : postBalances[i + 1]?.owner ?? "unknown";
|
|
144
|
+
let to = diff > 0 ? post.owner ?? "unknown" : postBalances[i + 1]?.owner ?? "unknown";
|
|
145
|
+
if (to === "unknown") {
|
|
146
|
+
to = diff > 0 ? post.owner ?? "unknown" : postBalances[i - 1]?.owner ?? "unknown";
|
|
147
|
+
}
|
|
148
|
+
if (from && to) {
|
|
149
|
+
if (Math.abs(diff) > 0) {
|
|
150
|
+
return {
|
|
151
|
+
from,
|
|
152
|
+
to,
|
|
153
|
+
amount: Math.abs(diff),
|
|
154
|
+
mint: post.mint,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return null;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Finds SOL transfers in the transaction
|
|
163
|
+
*/
|
|
164
|
+
function findSolTransfer(preBalances, postBalances, accountKeys, walletAddress) {
|
|
165
|
+
for (let i = 0; i < preBalances.length; i++) {
|
|
166
|
+
const diff = postBalances[i] - preBalances[i];
|
|
167
|
+
const account = accountKeys[i];
|
|
168
|
+
const accountPubkey = typeof account === 'string' ? account : account.pubkey.toBase58();
|
|
169
|
+
if (Math.abs(diff) > 5000 && accountPubkey === walletAddress) { // Ignore fee-only changes
|
|
170
|
+
return {
|
|
171
|
+
from: diff < 0 ? accountPubkey : 'unknown',
|
|
172
|
+
to: diff > 0 ? accountPubkey : 'unknown',
|
|
173
|
+
amount: Math.abs(diff) / 1e9, // Convert lamports to SOL
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
return null;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Extracts memo from transaction instructions
|
|
181
|
+
*/
|
|
182
|
+
function extractMemo(instructions) {
|
|
183
|
+
for (const instruction of instructions) {
|
|
184
|
+
if (instruction.program === 'spl-memo' || instruction.programId?.toBase58() === 'MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr') {
|
|
185
|
+
return instruction.parsed || instruction.data;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return undefined;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Determines the general type of transaction
|
|
192
|
+
*/
|
|
193
|
+
function determineTransactionType(instructions) {
|
|
194
|
+
if (instructions.length === 0)
|
|
195
|
+
return constant_1.TRANSACTION_TYPE.UNKNOWN;
|
|
196
|
+
const programs = instructions.map(i => i.program || i.programId?.toBase58());
|
|
197
|
+
if (programs.includes('spl-token'))
|
|
198
|
+
return constant_1.TRANSACTION_TYPE.TOKEN_INTERACTIONS;
|
|
199
|
+
if (programs.includes('system'))
|
|
200
|
+
return constant_1.TRANSACTION_TYPE.SYSTEM;
|
|
201
|
+
if (programs.some(p => p?.includes('Swap')))
|
|
202
|
+
return constant_1.TRANSACTION_TYPE.SWAP;
|
|
203
|
+
if (programs.some(p => p?.includes('Stake')))
|
|
204
|
+
return constant_1.TRANSACTION_TYPE.STAKING;
|
|
205
|
+
return constant_1.TRANSACTION_TYPE.PROGRAM_INTERACTION;
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=transactionParsing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transactionParsing.js","sourceRoot":"","sources":["../../utils/svm/transactionParsing.ts"],"names":[],"mappings":"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"}
|
package/dist/svm/utils.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Account } from "@solana/spl-token";
|
|
2
2
|
import { Connection, Keypair, PublicKey, TransactionInstruction, VersionedTransaction } from "@solana/web3.js";
|
|
3
|
-
import { TokenInfo } from "../types";
|
|
3
|
+
import { UserTokenBalance, TokenInfo } from "../types";
|
|
4
4
|
export interface JupiterQuoteResponse {
|
|
5
5
|
inputMint: string;
|
|
6
6
|
inAmount: string;
|
|
@@ -69,12 +69,13 @@ export declare const getTokenBalance: (address: PublicKey, token: PublicKey, con
|
|
|
69
69
|
export declare const getTokenAccountAccount: (token: PublicKey, address: PublicKey, connection: Connection) => Promise<Account | null>;
|
|
70
70
|
export declare const getTransferNativeInx: (from: PublicKey, to: PublicKey, amount: number) => Promise<TransactionInstruction>;
|
|
71
71
|
export declare const getTransferNativeTransaction: (from: Keypair, to: PublicKey, amount: number, connection: Connection) => Promise<VersionedTransaction>;
|
|
72
|
-
export declare const getTokenInfo: (tokenAddress: PublicKey, connection: Connection) => Promise<TokenInfo>;
|
|
72
|
+
export declare const getTokenInfo: (tokenAddress: PublicKey, connection: Connection, programId?: PublicKey) => Promise<TokenInfo>;
|
|
73
73
|
export declare const getTransferTokenInx: (from: PublicKey, to: PublicKey, token: TokenInfo, amount: number, connection: Connection) => Promise<TransactionInstruction[]>;
|
|
74
74
|
export declare const getTransferTokenTransaction: (from: Keypair, to: PublicKey, token: TokenInfo, amount: number, connection: Connection) => Promise<VersionedTransaction>;
|
|
75
75
|
export declare const signAndSendTransaction: (transaction: VersionedTransaction, connection: Connection, signers: Keypair[]) => Promise<string>;
|
|
76
|
+
export declare const discoverTokens: (ownerAddress: PublicKey, connection: Connection) => Promise<UserTokenBalance<PublicKey>[]>;
|
|
76
77
|
export declare const getJupiterQuote: (inputMint: string, outputMint: string, amount: number, slippageBps?: number) => Promise<JupiterQuoteResponse>;
|
|
77
|
-
export declare const buildJupiterSwapTransaction: (quote: JupiterQuoteResponse, userPublicKey: string, prioritizationFeeLamports?: number) => Promise<JupiterSwapResponse>;
|
|
78
|
+
export declare const buildJupiterSwapTransaction: (quote: JupiterQuoteResponse, userPublicKey: string, prioritizationFeeLamports?: number, useSharedAccounts?: boolean) => Promise<JupiterSwapResponse>;
|
|
78
79
|
export declare const executeJupiterSwap: (swapParams: SwapParams, connection: Connection, payer: Keypair) => Promise<SwapResult>;
|
|
79
80
|
export declare const uiAmountToBaseUnits: (uiAmount: number, decimals: number) => number;
|
|
80
81
|
export declare const baseUnitsToUiAmount: (baseAmount: string | number, decimals: number) => number;
|
package/dist/svm/utils.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
//we will write all the svm utils function here
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.validateJupiterTokens = exports.getJupiterTokenList = exports.baseUnitsToUiAmount = exports.uiAmountToBaseUnits = exports.executeJupiterSwap = exports.buildJupiterSwapTransaction = exports.getJupiterQuote = exports.signAndSendTransaction = exports.getTransferTokenTransaction = exports.getTransferTokenInx = exports.getTokenInfo = exports.getTransferNativeTransaction = exports.getTransferNativeInx = exports.getTokenAccountAccount = exports.getTokenBalance = exports.getSvmNativeBalance = exports.getProgramIdOfToken = exports.getSureAssociatedTokenAddressAndAccount = exports.createAtaAndIx = exports.createV0Transaction = void 0;
|
|
4
|
+
exports.validateJupiterTokens = exports.getJupiterTokenList = exports.baseUnitsToUiAmount = exports.uiAmountToBaseUnits = exports.executeJupiterSwap = exports.buildJupiterSwapTransaction = exports.getJupiterQuote = exports.discoverTokens = exports.signAndSendTransaction = exports.getTransferTokenTransaction = exports.getTransferTokenInx = exports.getTokenInfo = exports.getTransferNativeTransaction = exports.getTransferNativeInx = exports.getTokenAccountAccount = exports.getTokenBalance = exports.getSvmNativeBalance = exports.getProgramIdOfToken = exports.getSureAssociatedTokenAddressAndAccount = exports.createAtaAndIx = exports.createV0Transaction = void 0;
|
|
5
5
|
const spl_token_1 = require("@solana/spl-token");
|
|
6
6
|
const web3_js_1 = require("@solana/web3.js");
|
|
7
7
|
const transactionSender_1 = require("./transactionSender");
|
|
8
8
|
const bn_js_1 = require("bn.js");
|
|
9
|
+
const js_1 = require("@metaplex-foundation/js");
|
|
9
10
|
const JUPITER_BASE_URL = 'https://lite-api.jup.ag';
|
|
10
11
|
const createV0Transaction = async (connection, inX, signers, payerPubKey, blockHash) => {
|
|
11
12
|
console.log('createV0Transaction: Starting transaction creation');
|
|
@@ -163,8 +164,22 @@ const getTransferNativeTransaction = async (from, to, amount, connection) => {
|
|
|
163
164
|
return transaction;
|
|
164
165
|
};
|
|
165
166
|
exports.getTransferNativeTransaction = getTransferNativeTransaction;
|
|
166
|
-
const
|
|
167
|
+
const getMetaTokenMetaplexData = (mintAddress, connection) => {
|
|
168
|
+
const metaplex = js_1.Metaplex.make(connection);
|
|
169
|
+
return metaplex.nfts().findByMint({ mintAddress: mintAddress });
|
|
170
|
+
};
|
|
171
|
+
const getTokenInfo = async (tokenAddress, connection, programId) => {
|
|
167
172
|
let mint;
|
|
173
|
+
const metaplexData = await getMetaTokenMetaplexData(tokenAddress, connection).catch(() => null);
|
|
174
|
+
if (programId) {
|
|
175
|
+
const mint = await (0, spl_token_1.getMint)(connection, tokenAddress, "confirmed", programId);
|
|
176
|
+
return {
|
|
177
|
+
address: tokenAddress.toString(),
|
|
178
|
+
decimals: mint.decimals,
|
|
179
|
+
name: metaplexData?.name || "",
|
|
180
|
+
symbol: metaplexData?.symbol || ""
|
|
181
|
+
};
|
|
182
|
+
}
|
|
168
183
|
try {
|
|
169
184
|
mint = await (0, spl_token_1.getMint)(connection, tokenAddress, "confirmed", spl_token_1.TOKEN_PROGRAM_ID);
|
|
170
185
|
}
|
|
@@ -175,8 +190,8 @@ const getTokenInfo = async (tokenAddress, connection) => {
|
|
|
175
190
|
return {
|
|
176
191
|
address: tokenAddress.toString(),
|
|
177
192
|
decimals: mint.decimals,
|
|
178
|
-
name: "",
|
|
179
|
-
symbol: ""
|
|
193
|
+
name: metaplexData?.name || "",
|
|
194
|
+
symbol: metaplexData?.symbol || ""
|
|
180
195
|
};
|
|
181
196
|
};
|
|
182
197
|
exports.getTokenInfo = getTokenInfo;
|
|
@@ -236,6 +251,32 @@ const signAndSendTransaction = async (transaction, connection, signers) => {
|
|
|
236
251
|
return signature;
|
|
237
252
|
};
|
|
238
253
|
exports.signAndSendTransaction = signAndSendTransaction;
|
|
254
|
+
const discoverTokens = async (ownerAddress, connection) => {
|
|
255
|
+
const owner = new web3_js_1.PublicKey(ownerAddress);
|
|
256
|
+
let response = await connection.getParsedTokenAccountsByOwner(owner, {
|
|
257
|
+
programId: spl_token_1.TOKEN_PROGRAM_ID
|
|
258
|
+
});
|
|
259
|
+
console.log('response: ', response);
|
|
260
|
+
let tokens2022 = await connection.getParsedTokenAccountsByOwner(owner, {
|
|
261
|
+
programId: spl_token_1.TOKEN_2022_PROGRAM_ID
|
|
262
|
+
});
|
|
263
|
+
console.log('tokens2022: ', tokens2022);
|
|
264
|
+
response.value = response.value.concat(tokens2022.value);
|
|
265
|
+
const tokens = await Promise.all(response.value.map(async (accountInfo) => {
|
|
266
|
+
const mintAddress = accountInfo.account.data["parsed"]["info"]["mint"];
|
|
267
|
+
const mint = await (0, exports.getTokenInfo)(new web3_js_1.PublicKey(mintAddress), connection);
|
|
268
|
+
return {
|
|
269
|
+
owner: accountInfo.account.data["parsed"]["info"]["owner"],
|
|
270
|
+
address: accountInfo.account.data["parsed"]["info"]["mint"],
|
|
271
|
+
decimals: accountInfo.account.data["parsed"]["info"]["tokenAmount"]["decimals"],
|
|
272
|
+
symbol: mint.symbol,
|
|
273
|
+
name: mint.name,
|
|
274
|
+
balance: accountInfo.account.data["parsed"]["info"]["tokenAmount"]["amount"]
|
|
275
|
+
};
|
|
276
|
+
}));
|
|
277
|
+
return tokens;
|
|
278
|
+
};
|
|
279
|
+
exports.discoverTokens = discoverTokens;
|
|
239
280
|
//swap
|
|
240
281
|
//you will. use jupiter for this
|
|
241
282
|
const getJupiterQuote = async (inputMint, outputMint, amount, slippageBps = 50) => {
|
|
@@ -278,16 +319,17 @@ const getJupiterQuote = async (inputMint, outputMint, amount, slippageBps = 50)
|
|
|
278
319
|
return result;
|
|
279
320
|
};
|
|
280
321
|
exports.getJupiterQuote = getJupiterQuote;
|
|
281
|
-
const buildJupiterSwapTransaction = async (quote, userPublicKey, prioritizationFeeLamports) => {
|
|
322
|
+
const buildJupiterSwapTransaction = async (quote, userPublicKey, prioritizationFeeLamports, useSharedAccounts = true) => {
|
|
282
323
|
console.log('buildJupiterSwapTransaction: Starting');
|
|
283
324
|
console.log('User public key:', userPublicKey);
|
|
325
|
+
console.log('Use shared accounts:', useSharedAccounts);
|
|
284
326
|
const priorityFee = prioritizationFeeLamports || 5000;
|
|
285
327
|
console.log('Prioritization fee:', priorityFee);
|
|
286
328
|
const body = {
|
|
287
329
|
quoteResponse: quote,
|
|
288
330
|
userPublicKey,
|
|
289
331
|
wrapAndUnwrapSol: true,
|
|
290
|
-
useSharedAccounts:
|
|
332
|
+
useSharedAccounts: useSharedAccounts,
|
|
291
333
|
feeAccount: undefined,
|
|
292
334
|
trackingAccount: undefined,
|
|
293
335
|
computeUnitPriceMicroLamports: undefined,
|
|
@@ -314,10 +356,20 @@ const buildJupiterSwapTransaction = async (quote, userPublicKey, prioritizationF
|
|
|
314
356
|
try {
|
|
315
357
|
const error = await response.json();
|
|
316
358
|
console.log('Swap build error details:', error);
|
|
359
|
+
// Check if this is the shared accounts error
|
|
360
|
+
if (error.errorCode === 'NOT_SUPPORTED' &&
|
|
361
|
+
error.error?.includes('Simple AMMs are not supported with shared accounts')) {
|
|
362
|
+
console.log('Detected shared accounts incompatibility error');
|
|
363
|
+
throw new Error('SHARED_ACCOUNTS_NOT_SUPPORTED');
|
|
364
|
+
}
|
|
317
365
|
throw new Error(`Jupiter swap transaction build failed: ${error.message || response.statusText}`);
|
|
318
366
|
}
|
|
319
367
|
catch (parseError) {
|
|
320
368
|
console.log('Failed to parse error response:', parseError);
|
|
369
|
+
// Re-throw if it's our custom error
|
|
370
|
+
if (parseError instanceof Error && parseError.message === 'SHARED_ACCOUNTS_NOT_SUPPORTED') {
|
|
371
|
+
throw parseError;
|
|
372
|
+
}
|
|
321
373
|
throw new Error(`Jupiter swap transaction build failed: ${response.statusText}`);
|
|
322
374
|
}
|
|
323
375
|
}
|
|
@@ -343,8 +395,29 @@ const executeJupiterSwap = async (swapParams, connection, payer) => {
|
|
|
343
395
|
outputAmount: quote.outAmount,
|
|
344
396
|
priceImpact: quote.priceImpactPct
|
|
345
397
|
});
|
|
346
|
-
|
|
347
|
-
|
|
398
|
+
let swapResponse;
|
|
399
|
+
let usedSharedAccounts = true;
|
|
400
|
+
try {
|
|
401
|
+
console.log('Building swap transaction with shared accounts enabled...');
|
|
402
|
+
swapResponse = await (0, exports.buildJupiterSwapTransaction)(quote, swapParams.userPublicKey.toString(), undefined, true // Try with shared accounts first
|
|
403
|
+
);
|
|
404
|
+
console.log('Successfully built transaction with shared accounts');
|
|
405
|
+
}
|
|
406
|
+
catch (error) {
|
|
407
|
+
if (error instanceof Error && error.message === 'SHARED_ACCOUNTS_NOT_SUPPORTED') {
|
|
408
|
+
console.log('Shared accounts not supported, retrying without shared accounts...');
|
|
409
|
+
// Retry without shared accounts
|
|
410
|
+
swapResponse = await (0, exports.buildJupiterSwapTransaction)(quote, swapParams.userPublicKey.toString(), undefined, false // Retry with shared accounts disabled
|
|
411
|
+
);
|
|
412
|
+
usedSharedAccounts = false;
|
|
413
|
+
console.log('Successfully built transaction without shared accounts');
|
|
414
|
+
}
|
|
415
|
+
else {
|
|
416
|
+
// Re-throw if it's a different error
|
|
417
|
+
throw error;
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
console.log('Transaction build method:', usedSharedAccounts ? 'with shared accounts' : 'without shared accounts');
|
|
348
421
|
console.log('Deserializing transaction...');
|
|
349
422
|
const swapTransactionBuf = Buffer.from(swapResponse.swapTransaction, 'base64');
|
|
350
423
|
console.log('Transaction buffer length:', swapTransactionBuf.length);
|
|
@@ -364,7 +437,6 @@ const executeJupiterSwap = async (swapParams, connection, payer) => {
|
|
|
364
437
|
lastValidBlockHeight: blockhash.lastValidBlockHeight
|
|
365
438
|
}
|
|
366
439
|
});
|
|
367
|
-
// console.log('signature: ', signature);
|
|
368
440
|
if (!signature) {
|
|
369
441
|
console.log('Transaction failed to confirm');
|
|
370
442
|
return {
|
|
@@ -374,6 +446,7 @@ const executeJupiterSwap = async (swapParams, connection, payer) => {
|
|
|
374
446
|
}
|
|
375
447
|
const txSignature = signature.transaction.signatures[0];
|
|
376
448
|
console.log('Swap successful! Signature:', txSignature);
|
|
449
|
+
console.log('Used shared accounts:', usedSharedAccounts);
|
|
377
450
|
return {
|
|
378
451
|
success: true,
|
|
379
452
|
hash: txSignature,
|