forgex-cli 1.0.58 → 1.0.61
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/README.md +375 -368
- package/dist/bin/forgex.d.ts +5 -5
- package/dist/bin/forgex.js +14 -14
- package/dist/bin/forgex.js.map +1 -1
- package/dist/src/adapters/codex-adapter.d.ts +90 -90
- package/dist/src/adapters/codex-adapter.d.ts.map +1 -1
- package/dist/src/adapters/codex-adapter.js +76 -76
- package/dist/src/adapters/codex-adapter.js.map +1 -1
- package/dist/src/adapters/connection.d.ts +6 -6
- package/dist/src/adapters/connection.js +8 -8
- package/dist/src/adapters/connection.js.map +1 -1
- package/dist/src/adapters/ipfs.d.ts +3 -3
- package/dist/src/adapters/ipfs.js +3 -3
- package/dist/src/adapters/jito-adapter.d.ts +85 -85
- package/dist/src/adapters/jito-adapter.d.ts.map +1 -1
- package/dist/src/adapters/jito-adapter.js +111 -111
- package/dist/src/adapters/jito-adapter.js.map +1 -1
- package/dist/src/adapters/rpc-adapter.d.ts +53 -53
- package/dist/src/adapters/rpc-adapter.d.ts.map +1 -1
- package/dist/src/adapters/rpc-adapter.js +69 -69
- package/dist/src/adapters/rpc-adapter.js.map +1 -1
- package/dist/src/adapters/sdk-adapter.d.ts +21 -21
- package/dist/src/adapters/sdk-adapter.d.ts.map +1 -1
- package/dist/src/adapters/sdk-adapter.js +79 -79
- package/dist/src/adapters/sdk-adapter.js.map +1 -1
- package/dist/src/commands/config/index.d.ts +1 -1
- package/dist/src/commands/config/index.js +15 -15
- package/dist/src/commands/config/index.js.map +1 -1
- package/dist/src/commands/query/index.d.ts +2 -2
- package/dist/src/commands/query/index.js +82 -82
- package/dist/src/commands/query/index.js.map +1 -1
- package/dist/src/commands/token/index.d.ts +8 -8
- package/dist/src/commands/token/index.js +73 -73
- package/dist/src/commands/token/index.js.map +1 -1
- package/dist/src/commands/tools/index.d.ts +9 -9
- package/dist/src/commands/tools/index.js +137 -137
- package/dist/src/commands/tools/index.js.map +1 -1
- package/dist/src/commands/trade/index.d.ts +2 -2
- package/dist/src/commands/trade/index.js +82 -82
- package/dist/src/commands/trade/index.js.map +1 -1
- package/dist/src/commands/transfer/index.d.ts +8 -8
- package/dist/src/commands/transfer/index.js +106 -106
- package/dist/src/commands/transfer/index.js.map +1 -1
- package/dist/src/commands/wallet/index.d.ts +1 -1
- package/dist/src/commands/wallet/index.js +175 -175
- package/dist/src/commands/wallet/index.js.map +1 -1
- package/dist/src/config.d.ts +26 -26
- package/dist/src/config.d.ts.map +1 -1
- package/dist/src/config.js +28 -28
- package/dist/src/config.js.map +1 -1
- package/dist/src/const/index.js +1 -1
- package/dist/src/const/index.js.map +1 -1
- package/dist/src/data-source.d.ts +81 -81
- package/dist/src/data-source.d.ts.map +1 -1
- package/dist/src/data-source.js +149 -149
- package/dist/src/data-source.js.map +1 -1
- package/dist/src/data-store/index.d.ts +22 -22
- package/dist/src/data-store/index.d.ts.map +1 -1
- package/dist/src/data-store/index.js +46 -46
- package/dist/src/data-store/index.js.map +1 -1
- package/dist/src/data-store/types.d.ts +3 -3
- package/dist/src/data-store/types.js +3 -3
- package/dist/src/index.d.ts +2 -2
- package/dist/src/index.js +10 -10
- package/dist/src/index.js.map +1 -1
- package/dist/src/output.d.ts +18 -18
- package/dist/src/output.d.ts.map +1 -1
- package/dist/src/output.js +34 -34
- package/dist/src/output.js.map +1 -1
- package/dist/src/shims/store.d.ts +3 -2
- package/dist/src/shims/store.d.ts.map +1 -1
- package/dist/src/shims/store.js +6 -5
- package/dist/src/shims/store.js.map +1 -1
- package/dist/src/sol-sdk/batch/create.d.ts +4 -1
- package/dist/src/sol-sdk/batch/create.d.ts.map +1 -1
- package/dist/src/sol-sdk/batch/create.js +44 -44
- package/dist/src/sol-sdk/batch/create.js.map +1 -1
- package/dist/src/sol-sdk/batch/index.js +135 -135
- package/dist/src/sol-sdk/batch/index.js.map +1 -1
- package/dist/src/sol-sdk/calc.d.ts +63 -63
- package/dist/src/sol-sdk/calc.d.ts.map +1 -1
- package/dist/src/sol-sdk/calc.js +120 -120
- package/dist/src/sol-sdk/calc.js.map +1 -1
- package/dist/src/sol-sdk/jito/index.js +12 -12
- package/dist/src/sol-sdk/jito/index.js.map +1 -1
- package/dist/src/sol-sdk/launchlab/instructions/create.js +10 -10
- package/dist/src/sol-sdk/launchlab/instructions/create.js.map +1 -1
- package/dist/src/sol-sdk/meteora/index.d.ts +5 -5
- package/dist/src/sol-sdk/meteora/index.js +11 -11
- package/dist/src/sol-sdk/meteora/index.js.map +1 -1
- package/dist/src/sol-sdk/meteora/instructions/buy.js +8 -8
- package/dist/src/sol-sdk/meteora/instructions/buy.js.map +1 -1
- package/dist/src/sol-sdk/meteora/instructions/sell.js +6 -6
- package/dist/src/sol-sdk/meteora/instructions/sell.js.map +1 -1
- package/dist/src/sol-sdk/pump/index.js +3 -3
- package/dist/src/sol-sdk/pump/index.js.map +1 -1
- package/dist/src/sol-sdk/pump/instructions/buy.d.ts +12 -12
- package/dist/src/sol-sdk/pump/instructions/buy.d.ts.map +1 -1
- package/dist/src/sol-sdk/pump/instructions/buy.js +26 -26
- package/dist/src/sol-sdk/pump/instructions/buy.js.map +1 -1
- package/dist/src/sol-sdk/pump/instructions/createAndBuy.d.ts +13 -13
- package/dist/src/sol-sdk/pump/instructions/createAndBuy.js +17 -17
- package/dist/src/sol-sdk/pump/instructions/createAndBuy.js.map +1 -1
- package/dist/src/sol-sdk/pump/instructions/sell.d.ts +2 -2
- package/dist/src/sol-sdk/pump/instructions/sell.d.ts.map +1 -1
- package/dist/src/sol-sdk/pump/instructions/sell.js +7 -7
- package/dist/src/sol-sdk/pump/instructions/sell.js.map +1 -1
- package/dist/src/sol-sdk/pumpswap/index.d.ts +4 -4
- package/dist/src/sol-sdk/pumpswap/index.js +5 -5
- package/dist/src/sol-sdk/pumpswap/index.js.map +1 -1
- package/dist/src/sol-sdk/pumpswap/instructions/buy.d.ts +8 -8
- package/dist/src/sol-sdk/pumpswap/instructions/buy.js +19 -19
- package/dist/src/sol-sdk/pumpswap/instructions/buy.js.map +1 -1
- package/dist/src/sol-sdk/pumpswap/instructions/migrate.js +2 -2
- package/dist/src/sol-sdk/pumpswap/instructions/migrate.js.map +1 -1
- package/dist/src/sol-sdk/pumpswap/instructions/sell.js +4 -4
- package/dist/src/sol-sdk/pumpswap/instructions/sell.js.map +1 -1
- package/dist/src/sol-sdk/pumpswap/rpc/index.js +1 -1
- package/dist/src/sol-sdk/pumpswap/rpc/index.js.map +1 -1
- package/dist/src/sol-sdk/raydium/instructions/cpmmSell.js +3 -3
- package/dist/src/sol-sdk/raydium/instructions/cpmmSell.js.map +1 -1
- package/dist/src/sol-sdk/raydium/instructions/sell.d.ts +40 -8520
- package/dist/src/sol-sdk/raydium/instructions/sell.d.ts.map +1 -1
- package/dist/src/sol-sdk/raydium/instructions/sell.js +6 -6
- package/dist/src/sol-sdk/raydium/instructions/sell.js.map +1 -1
- package/dist/src/sol-sdk/raydium/rpc/index.d.ts +4 -4
- package/dist/src/sol-sdk/rpc/index.d.ts +14 -14
- package/dist/src/sol-sdk/rpc/index.d.ts.map +1 -1
- package/dist/src/sol-sdk/rpc/index.js +17 -17
- package/dist/src/sol-sdk/rpc/index.js.map +1 -1
- package/dist/src/sol-sdk/transfer/index.js +5 -5
- package/dist/src/sol-sdk/transfer/index.js.map +1 -1
- package/dist/src/sol-sdk/turnover/index.d.ts +3 -3
- package/dist/src/sol-sdk/turnover/index.js +56 -56
- package/dist/src/sol-sdk/turnover/index.js.map +1 -1
- package/dist/src/telemetry.d.ts +8 -8
- package/dist/src/telemetry.d.ts.map +1 -1
- package/dist/src/telemetry.js +28 -27
- package/dist/src/telemetry.js.map +1 -1
- package/dist/src/tx-tracker/detail-adapter.d.ts +53 -53
- package/dist/src/tx-tracker/detail-adapter.d.ts.map +1 -1
- package/dist/src/tx-tracker/detail-adapter.js +68 -68
- package/dist/src/tx-tracker/detail-adapter.js.map +1 -1
- package/dist/src/tx-tracker/index.d.ts +67 -67
- package/dist/src/tx-tracker/index.d.ts.map +1 -1
- package/dist/src/tx-tracker/index.js +103 -103
- package/dist/src/tx-tracker/index.js.map +1 -1
- package/dist/src/types/index.d.ts +10 -10
- package/dist/src/types/index.d.ts.map +1 -1
- package/dist/src/types/websocket.js +1 -1
- package/dist/src/types/websocket.js.map +1 -1
- package/dist/src/utils/index.js +20 -20
- package/dist/src/utils/index.js.map +1 -1
- package/dist/src/wallet-store.d.ts +51 -51
- package/dist/src/wallet-store.d.ts.map +1 -1
- package/dist/src/wallet-store.js +104 -104
- package/dist/src/wallet-store.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../src/telemetry.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEtE,+DAA+D;AAC/D,
|
|
1
|
+
{"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../src/telemetry.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,99 +1,99 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* ForgeX CLI TxDetailAdapter --
|
|
2
|
+
* ForgeX CLI TxDetailAdapter -- Transaction detail field adapter
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* CLI DataStore
|
|
4
|
+
* Maps raw transaction data (ParsedTransactionDetail) returned by RPC
|
|
5
|
+
* to the CLI DataStore TransactionRecord structure.
|
|
6
6
|
*
|
|
7
|
-
*
|
|
8
|
-
* -
|
|
9
|
-
* -
|
|
10
|
-
* -
|
|
11
|
-
* -
|
|
12
|
-
* -
|
|
7
|
+
* Core responsibilities:
|
|
8
|
+
* - Calculate SOL delta from preBalances / postBalances
|
|
9
|
+
* - Calculate Token delta from preTokenBalances / postTokenBalances
|
|
10
|
+
* - Compute execution price (pricePerToken = |solChange| / |tokenChange|)
|
|
11
|
+
* - Extract fees
|
|
12
|
+
* - Update position data from transaction records (avgBuyPrice, realizedPnl, etc.)
|
|
13
13
|
*
|
|
14
|
-
*
|
|
14
|
+
* Design reference: ARCH-DESIGN-v2.md Section 3.4
|
|
15
15
|
*/
|
|
16
16
|
import type { ParsedTransactionDetail } from '../adapters/rpc-adapter.js';
|
|
17
17
|
import type { TransactionRecord, WalletHolding } from '../data-store/types.js';
|
|
18
|
-
/**
|
|
18
|
+
/** Tracking context (passed in by TxTracker) */
|
|
19
19
|
export interface TrackingContext {
|
|
20
|
-
/**
|
|
20
|
+
/** Token contract address */
|
|
21
21
|
ca: string;
|
|
22
|
-
/**
|
|
22
|
+
/** Wallet group ID */
|
|
23
23
|
groupId: number;
|
|
24
|
-
/**
|
|
24
|
+
/** Transaction type */
|
|
25
25
|
txType: 'buy' | 'sell' | 'transfer_in' | 'transfer_out' | 'turnover';
|
|
26
|
-
/**
|
|
26
|
+
/** List of wallet addresses involved in the transaction */
|
|
27
27
|
wallets: string[];
|
|
28
|
-
/**
|
|
28
|
+
/** Expected SOL amount (for validation, optional) */
|
|
29
29
|
expectedAmountSol?: number;
|
|
30
|
-
/** Jito Bundle ID (
|
|
30
|
+
/** Jito Bundle ID (if any) */
|
|
31
31
|
jitoBundle?: string;
|
|
32
32
|
}
|
|
33
33
|
export declare class TxDetailAdapter {
|
|
34
34
|
/**
|
|
35
|
-
*
|
|
36
|
-
*
|
|
35
|
+
* Core adaptation method:
|
|
36
|
+
* Extracts and maps raw RPC transaction data into a TransactionRecord.
|
|
37
37
|
*
|
|
38
|
-
*
|
|
39
|
-
* 1.
|
|
40
|
-
* 2.
|
|
41
|
-
* 3.
|
|
42
|
-
* 4.
|
|
43
|
-
* 5.
|
|
38
|
+
* Parsing flow:
|
|
39
|
+
* 1. Find target wallet index in accountKeys
|
|
40
|
+
* 2. Compare preBalances vs postBalances via index to compute SOL delta
|
|
41
|
+
* 3. Filter preTokenBalances / postTokenBalances by target token and wallet to compute Token delta
|
|
42
|
+
* 4. Compute execution price: |SOL delta - fee| / |Token delta|
|
|
43
|
+
* 5. Assemble TransactionRecord
|
|
44
44
|
*
|
|
45
|
-
* @param txHash
|
|
46
|
-
* @param detail RPC
|
|
47
|
-
* @param context
|
|
45
|
+
* @param txHash Transaction signature
|
|
46
|
+
* @param detail Parsed transaction detail from RPC
|
|
47
|
+
* @param context Tracking context
|
|
48
48
|
* @returns TransactionRecord
|
|
49
49
|
*/
|
|
50
50
|
adaptToTransactionRecord(txHash: string, detail: ParsedTransactionDetail, context: TrackingContext): TransactionRecord;
|
|
51
51
|
/**
|
|
52
|
-
*
|
|
52
|
+
* Update position data based on transaction record.
|
|
53
53
|
*
|
|
54
|
-
*
|
|
55
|
-
* - buy:
|
|
56
|
-
* - sell:
|
|
57
|
-
* - transfer_in:
|
|
58
|
-
* - transfer_out:
|
|
59
|
-
* - turnover:
|
|
54
|
+
* Update logic:
|
|
55
|
+
* - buy: increase tokenBalance, totalBought, totalCostSol; recalculate avgBuyPrice
|
|
56
|
+
* - sell: decrease tokenBalance, increase totalSold, totalRevenueSol; calculate realizedPnl
|
|
57
|
+
* - transfer_in: increase tokenBalance (no cost impact)
|
|
58
|
+
* - transfer_out: decrease tokenBalance (no cost impact)
|
|
59
|
+
* - turnover: no position update (turnover does not change net position)
|
|
60
60
|
*
|
|
61
|
-
* @param currentHolding
|
|
62
|
-
* @param tx
|
|
63
|
-
* @returns
|
|
61
|
+
* @param currentHolding Current position data
|
|
62
|
+
* @param tx Transaction record
|
|
63
|
+
* @returns Updated position data (new object, original not mutated)
|
|
64
64
|
*/
|
|
65
65
|
updateHoldingFromTx(currentHolding: WalletHolding, tx: TransactionRecord): WalletHolding;
|
|
66
66
|
/**
|
|
67
|
-
*
|
|
67
|
+
* Create an empty initial holding for the given wallet
|
|
68
68
|
*/
|
|
69
69
|
createEmptyHolding(walletAddress: string): WalletHolding;
|
|
70
70
|
/**
|
|
71
|
-
*
|
|
72
|
-
*
|
|
71
|
+
* Find the target wallet index in accountKeys.
|
|
72
|
+
* Prioritizes matching the first wallet address (primary wallet).
|
|
73
73
|
*/
|
|
74
74
|
private findWalletIndex;
|
|
75
75
|
/**
|
|
76
|
-
*
|
|
77
|
-
*
|
|
78
|
-
*
|
|
76
|
+
* Resolve the actual wallet address used.
|
|
77
|
+
* If a matching wallet is found in accountKeys, return that address;
|
|
78
|
+
* otherwise fall back to context.wallets[0].
|
|
79
79
|
*/
|
|
80
80
|
private resolveWalletAddress;
|
|
81
81
|
/**
|
|
82
|
-
*
|
|
82
|
+
* Calculate Token balance delta.
|
|
83
83
|
*
|
|
84
|
-
*
|
|
85
|
-
* - mint ===
|
|
86
|
-
* - owner
|
|
84
|
+
* Filters preTokenBalances and postTokenBalances where:
|
|
85
|
+
* - mint === target token contract address
|
|
86
|
+
* - owner is one of the participating wallets
|
|
87
87
|
*
|
|
88
|
-
*
|
|
88
|
+
* Then computes post - pre to get the delta.
|
|
89
89
|
*
|
|
90
|
-
*
|
|
91
|
-
*
|
|
90
|
+
* Note: the owner field in preTokenBalances/postTokenBalances may be absent;
|
|
91
|
+
* in that case, owner is determined via accountIndex -> accountKeys mapping.
|
|
92
92
|
*/
|
|
93
93
|
private calculateTokenChange;
|
|
94
94
|
/**
|
|
95
|
-
*
|
|
96
|
-
*
|
|
95
|
+
* Sum token balance for the specified token and wallets from the tokenBalances array.
|
|
96
|
+
* Supports direct matching via owner field, or indirect matching via accountIndex -> accountKeys.
|
|
97
97
|
*/
|
|
98
98
|
private sumTokenBalance;
|
|
99
99
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detail-adapter.d.ts","sourceRoot":"","sources":["../../../src/tx-tracker/detail-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAC1E,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAM/E,
|
|
1
|
+
{"version":3,"file":"detail-adapter.d.ts","sourceRoot":"","sources":["../../../src/tx-tracker/detail-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAC1E,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAM/E,gDAAgD;AAChD,MAAM,WAAW,eAAe;IAC9B,6BAA6B;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,sBAAsB;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,uBAAuB;IACvB,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,aAAa,GAAG,cAAc,GAAG,UAAU,CAAC;IACrE,2DAA2D;IAC3D,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,qDAAqD;IACrD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,8BAA8B;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AA6BD,qBAAa,eAAe;IAC1B;;;;;;;;;;;;;;;OAeG;IACH,wBAAwB,CACtB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,uBAAuB,EAC/B,OAAO,EAAE,eAAe,GACvB,iBAAiB;IA8CpB;;;;;;;;;;;;;OAaG;IACH,mBAAmB,CAAC,cAAc,EAAE,aAAa,EAAE,EAAE,EAAE,iBAAiB,GAAG,aAAa;IA0DxF;;OAEG;IACH,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,aAAa;IAkBxD;;;OAGG;IACH,OAAO,CAAC,eAAe;IASvB;;;;OAIG;IACH,OAAO,CAAC,oBAAoB;IAO5B;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,oBAAoB;IAY5B;;;OAGG;IACH,OAAO,CAAC,eAAe;CA6BxB"}
|
|
@@ -1,55 +1,55 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* ForgeX CLI TxDetailAdapter --
|
|
2
|
+
* ForgeX CLI TxDetailAdapter -- Transaction detail field adapter
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* CLI DataStore
|
|
4
|
+
* Maps raw transaction data (ParsedTransactionDetail) returned by RPC
|
|
5
|
+
* to the CLI DataStore TransactionRecord structure.
|
|
6
6
|
*
|
|
7
|
-
*
|
|
8
|
-
* -
|
|
9
|
-
* -
|
|
10
|
-
* -
|
|
11
|
-
* -
|
|
12
|
-
* -
|
|
7
|
+
* Core responsibilities:
|
|
8
|
+
* - Calculate SOL delta from preBalances / postBalances
|
|
9
|
+
* - Calculate Token delta from preTokenBalances / postTokenBalances
|
|
10
|
+
* - Compute execution price (pricePerToken = |solChange| / |tokenChange|)
|
|
11
|
+
* - Extract fees
|
|
12
|
+
* - Update position data from transaction records (avgBuyPrice, realizedPnl, etc.)
|
|
13
13
|
*
|
|
14
|
-
*
|
|
14
|
+
* Design reference: ARCH-DESIGN-v2.md Section 3.4
|
|
15
15
|
*/
|
|
16
16
|
// ============================================================
|
|
17
|
-
// TxDetailAdapter
|
|
17
|
+
// TxDetailAdapter Implementation
|
|
18
18
|
// ============================================================
|
|
19
19
|
export class TxDetailAdapter {
|
|
20
20
|
/**
|
|
21
|
-
*
|
|
22
|
-
*
|
|
21
|
+
* Core adaptation method:
|
|
22
|
+
* Extracts and maps raw RPC transaction data into a TransactionRecord.
|
|
23
23
|
*
|
|
24
|
-
*
|
|
25
|
-
* 1.
|
|
26
|
-
* 2.
|
|
27
|
-
* 3.
|
|
28
|
-
* 4.
|
|
29
|
-
* 5.
|
|
24
|
+
* Parsing flow:
|
|
25
|
+
* 1. Find target wallet index in accountKeys
|
|
26
|
+
* 2. Compare preBalances vs postBalances via index to compute SOL delta
|
|
27
|
+
* 3. Filter preTokenBalances / postTokenBalances by target token and wallet to compute Token delta
|
|
28
|
+
* 4. Compute execution price: |SOL delta - fee| / |Token delta|
|
|
29
|
+
* 5. Assemble TransactionRecord
|
|
30
30
|
*
|
|
31
|
-
* @param txHash
|
|
32
|
-
* @param detail RPC
|
|
33
|
-
* @param context
|
|
31
|
+
* @param txHash Transaction signature
|
|
32
|
+
* @param detail Parsed transaction detail from RPC
|
|
33
|
+
* @param context Tracking context
|
|
34
34
|
* @returns TransactionRecord
|
|
35
35
|
*/
|
|
36
36
|
adaptToTransactionRecord(txHash, detail, context) {
|
|
37
37
|
const { accountKeys, preBalances, postBalances, preTokenBalances, postTokenBalances, fee, err, slot, blockTime } = detail;
|
|
38
|
-
// 1.
|
|
38
|
+
// 1. Find target wallet index in accountKeys
|
|
39
39
|
const walletIndex = this.findWalletIndex(accountKeys, context.wallets);
|
|
40
|
-
// 2.
|
|
40
|
+
// 2. Calculate SOL delta (lamports -> SOL)
|
|
41
41
|
const solChangeLamports = walletIndex >= 0 ? (postBalances[walletIndex] ?? 0) - (preBalances[walletIndex] ?? 0) : 0;
|
|
42
42
|
const solChange = solChangeLamports / 1e9;
|
|
43
|
-
// 3.
|
|
43
|
+
// 3. Calculate Token delta
|
|
44
44
|
const tokenChange = this.calculateTokenChange(preTokenBalances, postTokenBalances, context.ca, context.wallets, accountKeys);
|
|
45
|
-
// 4.
|
|
46
|
-
//
|
|
47
|
-
//
|
|
48
|
-
//
|
|
45
|
+
// 4. Calculate execution price
|
|
46
|
+
// For buy: spend SOL to get Token, solChange is negative, tokenChange is positive
|
|
47
|
+
// For sell: spend Token to get SOL, solChange is positive, tokenChange is negative
|
|
48
|
+
// Price = |net SOL delta (minus fee)| / |Token delta|
|
|
49
49
|
const feeInSol = (fee || 0) / 1e9;
|
|
50
50
|
const netSolChange = Math.abs(solChange) - feeInSol;
|
|
51
51
|
const pricePerToken = tokenChange !== 0 ? Math.max(0, netSolChange) / Math.abs(tokenChange) : 0;
|
|
52
|
-
// 5.
|
|
52
|
+
// 5. Assemble record
|
|
53
53
|
return {
|
|
54
54
|
txHash,
|
|
55
55
|
txType: context.txType,
|
|
@@ -66,18 +66,18 @@ export class TxDetailAdapter {
|
|
|
66
66
|
};
|
|
67
67
|
}
|
|
68
68
|
/**
|
|
69
|
-
*
|
|
69
|
+
* Update position data based on transaction record.
|
|
70
70
|
*
|
|
71
|
-
*
|
|
72
|
-
* - buy:
|
|
73
|
-
* - sell:
|
|
74
|
-
* - transfer_in:
|
|
75
|
-
* - transfer_out:
|
|
76
|
-
* - turnover:
|
|
71
|
+
* Update logic:
|
|
72
|
+
* - buy: increase tokenBalance, totalBought, totalCostSol; recalculate avgBuyPrice
|
|
73
|
+
* - sell: decrease tokenBalance, increase totalSold, totalRevenueSol; calculate realizedPnl
|
|
74
|
+
* - transfer_in: increase tokenBalance (no cost impact)
|
|
75
|
+
* - transfer_out: decrease tokenBalance (no cost impact)
|
|
76
|
+
* - turnover: no position update (turnover does not change net position)
|
|
77
77
|
*
|
|
78
|
-
* @param currentHolding
|
|
79
|
-
* @param tx
|
|
80
|
-
* @returns
|
|
78
|
+
* @param currentHolding Current position data
|
|
79
|
+
* @param tx Transaction record
|
|
80
|
+
* @returns Updated position data (new object, original not mutated)
|
|
81
81
|
*/
|
|
82
82
|
updateHoldingFromTx(currentHolding, tx) {
|
|
83
83
|
const updated = { ...currentHolding };
|
|
@@ -88,7 +88,7 @@ export class TxDetailAdapter {
|
|
|
88
88
|
updated.totalBought += boughtTokens;
|
|
89
89
|
updated.totalCostSol += costSol;
|
|
90
90
|
updated.tokenBalance += boughtTokens;
|
|
91
|
-
//
|
|
91
|
+
// Recalculate average buy price (weighted average)
|
|
92
92
|
if (updated.totalBought > 0) {
|
|
93
93
|
updated.avgBuyPrice = updated.totalCostSol / updated.totalBought;
|
|
94
94
|
}
|
|
@@ -100,34 +100,34 @@ export class TxDetailAdapter {
|
|
|
100
100
|
updated.totalSold += soldTokens;
|
|
101
101
|
updated.totalRevenueSol += revenueSol;
|
|
102
102
|
updated.tokenBalance = Math.max(0, updated.tokenBalance - soldTokens);
|
|
103
|
-
//
|
|
104
|
-
// realizedPnl +=
|
|
103
|
+
// Calculate realized PnL for this sell
|
|
104
|
+
// realizedPnl += sell revenue - sold quantity * average buy cost
|
|
105
105
|
const soldCost = soldTokens * updated.avgBuyPrice;
|
|
106
106
|
updated.realizedPnl += revenueSol - soldCost;
|
|
107
107
|
break;
|
|
108
108
|
}
|
|
109
109
|
case 'transfer_in': {
|
|
110
|
-
//
|
|
110
|
+
// Transfer in: increase balance, no cost impact
|
|
111
111
|
const transferredIn = Math.abs(tx.amountToken);
|
|
112
112
|
updated.tokenBalance += transferredIn;
|
|
113
113
|
break;
|
|
114
114
|
}
|
|
115
115
|
case 'transfer_out': {
|
|
116
|
-
//
|
|
116
|
+
// Transfer out: decrease balance, no cost impact
|
|
117
117
|
const transferredOut = Math.abs(tx.amountToken);
|
|
118
118
|
updated.tokenBalance = Math.max(0, updated.tokenBalance - transferredOut);
|
|
119
119
|
break;
|
|
120
120
|
}
|
|
121
121
|
case 'turnover': {
|
|
122
|
-
//
|
|
123
|
-
//
|
|
122
|
+
// Turnover: no net position change
|
|
123
|
+
// Turnover is essentially a hedged buy+sell operation; net position remains unchanged
|
|
124
124
|
break;
|
|
125
125
|
}
|
|
126
126
|
}
|
|
127
127
|
return updated;
|
|
128
128
|
}
|
|
129
129
|
/**
|
|
130
|
-
*
|
|
130
|
+
* Create an empty initial holding for the given wallet
|
|
131
131
|
*/
|
|
132
132
|
createEmptyHolding(walletAddress) {
|
|
133
133
|
return {
|
|
@@ -143,14 +143,14 @@ export class TxDetailAdapter {
|
|
|
143
143
|
};
|
|
144
144
|
}
|
|
145
145
|
// ============================================================
|
|
146
|
-
//
|
|
146
|
+
// Private Methods
|
|
147
147
|
// ============================================================
|
|
148
148
|
/**
|
|
149
|
-
*
|
|
150
|
-
*
|
|
149
|
+
* Find the target wallet index in accountKeys.
|
|
150
|
+
* Prioritizes matching the first wallet address (primary wallet).
|
|
151
151
|
*/
|
|
152
152
|
findWalletIndex(accountKeys, wallets) {
|
|
153
|
-
//
|
|
153
|
+
// Try exact match starting from the first wallet (primary wallet)
|
|
154
154
|
for (const wallet of wallets) {
|
|
155
155
|
const idx = accountKeys.indexOf(wallet);
|
|
156
156
|
if (idx >= 0)
|
|
@@ -159,9 +159,9 @@ export class TxDetailAdapter {
|
|
|
159
159
|
return -1;
|
|
160
160
|
}
|
|
161
161
|
/**
|
|
162
|
-
*
|
|
163
|
-
*
|
|
164
|
-
*
|
|
162
|
+
* Resolve the actual wallet address used.
|
|
163
|
+
* If a matching wallet is found in accountKeys, return that address;
|
|
164
|
+
* otherwise fall back to context.wallets[0].
|
|
165
165
|
*/
|
|
166
166
|
resolveWalletAddress(accountKeys, wallets, walletIndex) {
|
|
167
167
|
if (walletIndex >= 0 && walletIndex < accountKeys.length) {
|
|
@@ -170,16 +170,16 @@ export class TxDetailAdapter {
|
|
|
170
170
|
return wallets[0] || '';
|
|
171
171
|
}
|
|
172
172
|
/**
|
|
173
|
-
*
|
|
173
|
+
* Calculate Token balance delta.
|
|
174
174
|
*
|
|
175
|
-
*
|
|
176
|
-
* - mint ===
|
|
177
|
-
* - owner
|
|
175
|
+
* Filters preTokenBalances and postTokenBalances where:
|
|
176
|
+
* - mint === target token contract address
|
|
177
|
+
* - owner is one of the participating wallets
|
|
178
178
|
*
|
|
179
|
-
*
|
|
179
|
+
* Then computes post - pre to get the delta.
|
|
180
180
|
*
|
|
181
|
-
*
|
|
182
|
-
*
|
|
181
|
+
* Note: the owner field in preTokenBalances/postTokenBalances may be absent;
|
|
182
|
+
* in that case, owner is determined via accountIndex -> accountKeys mapping.
|
|
183
183
|
*/
|
|
184
184
|
calculateTokenChange(preTokenBalances, postTokenBalances, tokenMint, walletAddresses, accountKeys) {
|
|
185
185
|
const preBalance = this.sumTokenBalance(preTokenBalances, tokenMint, walletAddresses, accountKeys);
|
|
@@ -187,25 +187,25 @@ export class TxDetailAdapter {
|
|
|
187
187
|
return postBalance - preBalance;
|
|
188
188
|
}
|
|
189
189
|
/**
|
|
190
|
-
*
|
|
191
|
-
*
|
|
190
|
+
* Sum token balance for the specified token and wallets from the tokenBalances array.
|
|
191
|
+
* Supports direct matching via owner field, or indirect matching via accountIndex -> accountKeys.
|
|
192
192
|
*/
|
|
193
193
|
sumTokenBalance(tokenBalances, tokenMint, walletAddresses, accountKeys) {
|
|
194
194
|
if (!Array.isArray(tokenBalances))
|
|
195
195
|
return 0;
|
|
196
196
|
let total = 0;
|
|
197
197
|
for (const entry of tokenBalances) {
|
|
198
|
-
//
|
|
198
|
+
// Only care about the target token
|
|
199
199
|
if (entry.mint !== tokenMint)
|
|
200
200
|
continue;
|
|
201
|
-
//
|
|
201
|
+
// Determine owner: prefer entry.owner, otherwise look up via accountIndex
|
|
202
202
|
const owner = entry.owner || (entry.accountIndex >= 0 ? accountKeys[entry.accountIndex] : undefined);
|
|
203
203
|
if (!owner)
|
|
204
204
|
continue;
|
|
205
|
-
//
|
|
205
|
+
// Check if owner is one of the participating wallets
|
|
206
206
|
if (!walletAddresses.includes(owner))
|
|
207
207
|
continue;
|
|
208
|
-
//
|
|
208
|
+
// Get uiAmount
|
|
209
209
|
const uiAmount = entry.uiTokenAmount?.uiAmount ?? 0;
|
|
210
210
|
total += uiAmount;
|
|
211
211
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detail-adapter.js","sourceRoot":"","sources":["../../../src/tx-tracker/detail-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAgDH,+DAA+D;AAC/D,
|
|
1
|
+
{"version":3,"file":"detail-adapter.js","sourceRoot":"","sources":["../../../src/tx-tracker/detail-adapter.ts"],"names":[],"mappings":"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"}
|