@w3lib/solana-batch-call 0.4.0 → 0.6.0
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/CHANGELOG.md +45 -0
- package/README.md +343 -3
- package/dist/approvals.d.ts +129 -0
- package/dist/approvals.d.ts.map +1 -0
- package/dist/approvals.js +221 -0
- package/dist/approvals.js.map +1 -0
- package/dist/batchPlan.d.ts +52 -0
- package/dist/batchPlan.d.ts.map +1 -0
- package/dist/batchPlan.js +85 -0
- package/dist/batchPlan.js.map +1 -0
- package/dist/claim.d.ts +161 -0
- package/dist/claim.d.ts.map +1 -0
- package/dist/claim.js +197 -0
- package/dist/claim.js.map +1 -0
- package/dist/decode.d.ts +22 -0
- package/dist/decode.d.ts.map +1 -0
- package/dist/decode.js +187 -0
- package/dist/decode.js.map +1 -0
- package/dist/describe.d.ts +26 -0
- package/dist/describe.d.ts.map +1 -0
- package/dist/describe.js +58 -0
- package/dist/describe.js.map +1 -0
- package/dist/fees.d.ts +89 -0
- package/dist/fees.d.ts.map +1 -0
- package/dist/fees.js +166 -0
- package/dist/fees.js.map +1 -0
- package/dist/history.d.ts +125 -0
- package/dist/history.d.ts.map +1 -0
- package/dist/history.js +231 -0
- package/dist/history.js.map +1 -0
- package/dist/historyHelius.d.ts +52 -0
- package/dist/historyHelius.d.ts.map +1 -0
- package/dist/historyHelius.js +125 -0
- package/dist/historyHelius.js.map +1 -0
- package/dist/layout.d.ts +2 -0
- package/dist/layout.d.ts.map +1 -1
- package/dist/layout.js +2 -2
- package/dist/layout.js.map +1 -1
- package/dist/liquidity/orca.d.ts +6 -0
- package/dist/liquidity/orca.d.ts.map +1 -1
- package/dist/liquidity/orca.js +14 -3
- package/dist/liquidity/orca.js.map +1 -1
- package/dist/liquidity/raydiumClmm.d.ts +6 -0
- package/dist/liquidity/raydiumClmm.d.ts.map +1 -1
- package/dist/liquidity/raydiumClmm.js +12 -5
- package/dist/liquidity/raydiumClmm.js.map +1 -1
- package/dist/lp.d.ts +55 -15
- package/dist/lp.d.ts.map +1 -1
- package/dist/lp.js +98 -46
- package/dist/lp.js.map +1 -1
- package/dist/lpMath.d.ts +22 -0
- package/dist/lpMath.d.ts.map +1 -1
- package/dist/lpMath.js +21 -0
- package/dist/lpMath.js.map +1 -1
- package/dist/names.d.ts +68 -0
- package/dist/names.d.ts.map +1 -0
- package/dist/names.js +257 -0
- package/dist/names.js.map +1 -0
- package/dist/pools.d.ts +9 -0
- package/dist/pools.d.ts.map +1 -0
- package/dist/pools.js +45 -0
- package/dist/pools.js.map +1 -0
- package/dist/portfolio.d.ts +64 -0
- package/dist/portfolio.d.ts.map +1 -0
- package/dist/portfolio.js +57 -0
- package/dist/portfolio.js.map +1 -0
- package/dist/price.d.ts +90 -0
- package/dist/price.d.ts.map +1 -0
- package/dist/price.js +287 -0
- package/dist/price.js.map +1 -0
- package/dist/programs.d.ts +19 -0
- package/dist/programs.d.ts.map +1 -0
- package/dist/programs.js +175 -0
- package/dist/programs.js.map +1 -0
- package/dist/reclaim.d.ts +190 -0
- package/dist/reclaim.d.ts.map +1 -0
- package/dist/reclaim.js +399 -0
- package/dist/reclaim.js.map +1 -0
- package/dist/risk.d.ts +84 -0
- package/dist/risk.d.ts.map +1 -0
- package/dist/risk.js +211 -0
- package/dist/risk.js.map +1 -0
- package/dist/rpc.d.ts +2 -0
- package/dist/rpc.d.ts.map +1 -1
- package/dist/rpc.js +36 -10
- package/dist/rpc.js.map +1 -1
- package/dist/simulate.d.ts +106 -0
- package/dist/simulate.d.ts.map +1 -0
- package/dist/simulate.js +418 -0
- package/dist/simulate.js.map +1 -0
- package/dist/subpaths/approvals.d.ts +29 -0
- package/dist/subpaths/approvals.d.ts.map +1 -0
- package/dist/subpaths/approvals.js +30 -0
- package/dist/subpaths/approvals.js.map +1 -0
- package/dist/subpaths/claim.d.ts +31 -0
- package/dist/subpaths/claim.d.ts.map +1 -0
- package/dist/subpaths/claim.js +31 -0
- package/dist/subpaths/claim.js.map +1 -0
- package/dist/subpaths/fees.d.ts +23 -0
- package/dist/subpaths/fees.d.ts.map +1 -0
- package/dist/subpaths/fees.js +25 -0
- package/dist/subpaths/fees.js.map +1 -0
- package/dist/subpaths/history.d.ts +21 -0
- package/dist/subpaths/history.d.ts.map +1 -0
- package/dist/subpaths/history.js +22 -0
- package/dist/subpaths/history.js.map +1 -0
- package/dist/subpaths/lp.d.ts +2 -2
- package/dist/subpaths/lp.d.ts.map +1 -1
- package/dist/subpaths/lp.js +2 -2
- package/dist/subpaths/lp.js.map +1 -1
- package/dist/subpaths/names.d.ts +37 -0
- package/dist/subpaths/names.d.ts.map +1 -0
- package/dist/subpaths/names.js +27 -0
- package/dist/subpaths/names.js.map +1 -0
- package/dist/subpaths/price.d.ts +40 -0
- package/dist/subpaths/price.d.ts.map +1 -0
- package/dist/subpaths/price.js +43 -0
- package/dist/subpaths/price.js.map +1 -0
- package/dist/subpaths/reclaim.d.ts +34 -0
- package/dist/subpaths/reclaim.d.ts.map +1 -0
- package/dist/subpaths/reclaim.js +34 -0
- package/dist/subpaths/reclaim.js.map +1 -0
- package/dist/subpaths/risk.d.ts +28 -0
- package/dist/subpaths/risk.d.ts.map +1 -0
- package/dist/subpaths/risk.js +30 -0
- package/dist/subpaths/risk.js.map +1 -0
- package/dist/subpaths/simulate.d.ts +22 -0
- package/dist/subpaths/simulate.d.ts.map +1 -0
- package/dist/subpaths/simulate.js +23 -0
- package/dist/subpaths/simulate.js.map +1 -0
- package/dist/subpaths/swap.d.ts +22 -0
- package/dist/subpaths/swap.d.ts.map +1 -0
- package/dist/subpaths/swap.js +21 -0
- package/dist/subpaths/swap.js.map +1 -0
- package/dist/subpaths/write.d.ts +1 -1
- package/dist/subpaths/write.d.ts.map +1 -1
- package/dist/subpaths/write.js +1 -1
- package/dist/subpaths/write.js.map +1 -1
- package/dist/swap/amm.d.ts +20 -0
- package/dist/swap/amm.d.ts.map +1 -0
- package/dist/swap/amm.js +77 -0
- package/dist/swap/amm.js.map +1 -0
- package/dist/swap/clmmMath.d.ts +24 -0
- package/dist/swap/clmmMath.d.ts.map +1 -0
- package/dist/swap/clmmMath.js +82 -0
- package/dist/swap/clmmMath.js.map +1 -0
- package/dist/swap/common.d.ts +68 -0
- package/dist/swap/common.d.ts.map +1 -0
- package/dist/swap/common.js +65 -0
- package/dist/swap/common.js.map +1 -0
- package/dist/swap/cpmm.d.ts +28 -0
- package/dist/swap/cpmm.d.ts.map +1 -0
- package/dist/swap/cpmm.js +113 -0
- package/dist/swap/cpmm.js.map +1 -0
- package/dist/swap/index.d.ts +145 -0
- package/dist/swap/index.d.ts.map +1 -0
- package/dist/swap/index.js +349 -0
- package/dist/swap/index.js.map +1 -0
- package/dist/swap/orca.d.ts +50 -0
- package/dist/swap/orca.d.ts.map +1 -0
- package/dist/swap/orca.js +382 -0
- package/dist/swap/orca.js.map +1 -0
- package/dist/swap/raydiumClmm.d.ts +62 -0
- package/dist/swap/raydiumClmm.d.ts.map +1 -0
- package/dist/swap/raydiumClmm.js +447 -0
- package/dist/swap/raydiumClmm.js.map +1 -0
- package/dist/tradeCheck.d.ts +45 -0
- package/dist/tradeCheck.d.ts.map +1 -0
- package/dist/tradeCheck.js +131 -0
- package/dist/tradeCheck.js.map +1 -0
- package/dist/write/instructions.d.ts +9 -0
- package/dist/write/instructions.d.ts.map +1 -1
- package/dist/write/instructions.js +40 -1
- package/dist/write/instructions.js.map +1 -1
- package/dist/write/transaction.d.ts +23 -0
- package/dist/write/transaction.d.ts.map +1 -1
- package/dist/write/transaction.js +50 -0
- package/dist/write/transaction.js.map +1 -1
- package/package.json +66 -14
- package/src/approvals.ts +358 -0
- package/src/batchPlan.ts +137 -0
- package/src/claim.ts +323 -0
- package/src/decode.ts +202 -0
- package/src/describe.ts +77 -0
- package/src/fees.ts +259 -0
- package/src/history.ts +336 -0
- package/src/historyHelius.ts +136 -0
- package/src/layout.ts +2 -2
- package/src/liquidity/orca.ts +15 -5
- package/src/liquidity/raydiumClmm.ts +13 -5
- package/src/lp.ts +148 -59
- package/src/lpMath.ts +38 -0
- package/src/names.ts +329 -0
- package/src/pools.ts +43 -0
- package/src/portfolio.ts +124 -0
- package/src/price.ts +366 -0
- package/src/programs.ts +216 -0
- package/src/reclaim.ts +547 -0
- package/src/risk.ts +243 -0
- package/src/rpc.ts +39 -10
- package/src/simulate.ts +535 -0
- package/src/subpaths/approvals.ts +47 -0
- package/src/subpaths/claim.ts +53 -0
- package/src/subpaths/fees.ts +41 -0
- package/src/subpaths/history.ts +38 -0
- package/src/subpaths/lp.ts +5 -1
- package/src/subpaths/names.ts +45 -0
- package/src/subpaths/price.ts +62 -0
- package/src/subpaths/reclaim.ts +57 -0
- package/src/subpaths/risk.ts +36 -0
- package/src/subpaths/simulate.ts +37 -0
- package/src/subpaths/swap.ts +41 -0
- package/src/subpaths/write.ts +2 -0
- package/src/swap/amm.ts +88 -0
- package/src/swap/clmmMath.ts +96 -0
- package/src/swap/common.ts +113 -0
- package/src/swap/cpmm.ts +132 -0
- package/src/swap/index.ts +467 -0
- package/src/swap/orca.ts +397 -0
- package/src/swap/raydiumClmm.ts +464 -0
- package/src/tradeCheck.ts +166 -0
- package/src/write/instructions.ts +43 -1
- package/src/write/transaction.ts +62 -0
package/dist/claim.js
ADDED
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
import { isAddress } from './address.js';
|
|
2
|
+
import { buildCollectFees } from './liquidity/index.js';
|
|
3
|
+
import { lpPositions } from './lp.js';
|
|
4
|
+
import { defillamaPrices } from './price.js';
|
|
5
|
+
import { simulatePlan, sendCalls } from './batchPlan.js';
|
|
6
|
+
import { formatUnits } from './layout.js';
|
|
7
|
+
import { mapPool } from './write/send.js';
|
|
8
|
+
const MAX_ERROR = 200;
|
|
9
|
+
/**
|
|
10
|
+
* 预览能领取的手续费和挖矿奖励(只读取,不构建交易):每个仓位的两种手续费、每个奖励的数量和美元价值,以及按代币汇总。
|
|
11
|
+
* 奖励照搬程序的结算:池子的奖励增长按时间摊给当前流动性,再按仓位区间内的增长计算
|
|
12
|
+
*
|
|
13
|
+
* ```ts
|
|
14
|
+
* const c = await claimable(client, owner)
|
|
15
|
+
* c.totalUsd // 全部能领的美元价值
|
|
16
|
+
* c.positions[0].rewards // [{ index: 0, symbol: 'RAY', formatted: '0.042698', usd: 0.083 }]
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export async function claimable(client, owner, query = {}) {
|
|
20
|
+
if (!isAddress(owner)) {
|
|
21
|
+
throw new Error(`Invalid owner address: ${owner}`);
|
|
22
|
+
}
|
|
23
|
+
const { signal } = query;
|
|
24
|
+
const protocols = query.protocols ? [...query.protocols] : ['orca-whirlpool', 'raydium-clmm'];
|
|
25
|
+
const list = (await lpPositions(client, owner, { protocols, mints: query.mints, rewards: true, now: query.now, signal })).filter((p) => p.type === 'clmm');
|
|
26
|
+
const warnings = [];
|
|
27
|
+
const mints = [...new Set(list.flatMap((p) => [p.token0.mint, p.token1.mint, ...(p.rewards ?? []).map((r) => r.mint)]))];
|
|
28
|
+
const source = query.prices === false ? null : query.prices && query.prices !== true ? query.prices : defillamaPrices();
|
|
29
|
+
let priceMap = new Map();
|
|
30
|
+
if (source && mints.length) {
|
|
31
|
+
try {
|
|
32
|
+
priceMap = await source.prices({ mints, fetch: query.fetch ?? ((...args) => fetch(...args)), signal, client });
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
if (signal?.aborted)
|
|
36
|
+
throw err;
|
|
37
|
+
warnings.push(`Price lookup failed (${(err instanceof Error ? err.message : String(err)).slice(0, MAX_ERROR)}): usd values are null`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
const amountOf = (token, amount) => {
|
|
41
|
+
const formatted = amount === null || token.decimals === null ? null : formatUnits(amount, token.decimals);
|
|
42
|
+
const price = priceMap.get(token.mint);
|
|
43
|
+
// 数量为 0 的不需要价格
|
|
44
|
+
const usd = amount === 0n ? 0 : formatted === null || price === undefined || !source ? null : Number(formatted) * price;
|
|
45
|
+
return { mint: token.mint, symbol: token.symbol, decimals: token.decimals, amount: amount === null ? null : amount.toString(), formatted, usd };
|
|
46
|
+
};
|
|
47
|
+
const sum = (items) => (items.some((i) => i.usd === null) ? null : items.reduce((acc, i) => acc + i.usd, 0));
|
|
48
|
+
const positions = [];
|
|
49
|
+
for (const p of list) {
|
|
50
|
+
const fees = [amountOf(p.token0, p.fees0 === null ? null : BigInt(p.fees0)), amountOf(p.token1, p.fees1 === null ? null : BigInt(p.fees1))];
|
|
51
|
+
const rewards = (p.rewards ?? []).map((r) => ({ ...amountOf(r, r.amount === null ? null : BigInt(r.amount)), index: r.index }));
|
|
52
|
+
const unknown = [...fees, ...rewards].some((x) => x.amount === null);
|
|
53
|
+
if (!unknown && [...fees, ...rewards].every((x) => x.amount === '0'))
|
|
54
|
+
continue;
|
|
55
|
+
positions.push({
|
|
56
|
+
protocol: p.protocol,
|
|
57
|
+
protocolName: p.protocolName,
|
|
58
|
+
positionMint: p.positionMint,
|
|
59
|
+
position: p.position,
|
|
60
|
+
pool: p.pool,
|
|
61
|
+
token0: p.token0,
|
|
62
|
+
token1: p.token1,
|
|
63
|
+
liquidity: p.liquidity,
|
|
64
|
+
inRange: p.inRange,
|
|
65
|
+
fees,
|
|
66
|
+
rewards,
|
|
67
|
+
feesUsd: sum(fees),
|
|
68
|
+
rewardsUsd: sum(rewards),
|
|
69
|
+
totalUsd: sum([...fees, ...rewards]),
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
positions.sort((a, b) => (b.totalUsd ?? -1) - (a.totalUsd ?? -1));
|
|
73
|
+
if (positions.some((p) => [...p.fees, ...p.rewards].some((x) => x.amount === null))) {
|
|
74
|
+
warnings.push("Some positions' tick arrays could not be read: their amounts are null (they are still included)");
|
|
75
|
+
}
|
|
76
|
+
// 按代币汇总
|
|
77
|
+
const byMint = new Map();
|
|
78
|
+
for (const item of positions.flatMap((p) => [...p.fees, ...p.rewards])) {
|
|
79
|
+
const entry = byMint.get(item.mint) ?? { token: item, amount: 0n, unknown: false };
|
|
80
|
+
entry.amount += BigInt(item.amount ?? 0);
|
|
81
|
+
entry.unknown ||= item.amount === null;
|
|
82
|
+
byMint.set(item.mint, entry);
|
|
83
|
+
}
|
|
84
|
+
// 有读不到的数量时保留该代币(即使已读到的部分为 0),标记 incomplete,美元价值为 null
|
|
85
|
+
const tokens = [...byMint.values()]
|
|
86
|
+
.filter((e) => e.unknown || e.amount !== 0n)
|
|
87
|
+
.map((e) => (e.unknown ? { ...amountOf(e.token, e.amount), usd: null, incomplete: true } : amountOf(e.token, e.amount)));
|
|
88
|
+
const sumKnown = (items) => (items.some((x) => x === null) ? null : items.reduce((acc, x) => acc + x, 0));
|
|
89
|
+
return {
|
|
90
|
+
owner,
|
|
91
|
+
positions,
|
|
92
|
+
tokens,
|
|
93
|
+
incomplete: tokens.some((t) => t.incomplete),
|
|
94
|
+
feesUsd: sumKnown(positions.map((p) => p.feesUsd)),
|
|
95
|
+
rewardsUsd: sumKnown(positions.map((p) => p.rewardsUsd)),
|
|
96
|
+
totalUsd: sumKnown(positions.map((p) => p.totalUsd)),
|
|
97
|
+
warnings,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* 构建批量领取(只读取、不签名):每个仓位一个调用,指令来自 /liquidity 的 buildCollectFees,构建时重新读取仓位。
|
|
102
|
+
* 打包成交易由 simulateClaim / claimAll(batchCall)完成
|
|
103
|
+
*
|
|
104
|
+
* ```ts
|
|
105
|
+
* const c = await claimable(client, owner)
|
|
106
|
+
* const plan = await buildClaimAll(client, owner, c.positions)
|
|
107
|
+
* ```
|
|
108
|
+
*/
|
|
109
|
+
export async function buildClaimAll(client, owner, positions, options = {}) {
|
|
110
|
+
if (!isAddress(owner)) {
|
|
111
|
+
throw new Error(`Invalid owner address: ${owner}`);
|
|
112
|
+
}
|
|
113
|
+
const unique = [...new Map(positions.map((p) => [p.positionMint, p])).values()];
|
|
114
|
+
const calls = [];
|
|
115
|
+
const failed = [];
|
|
116
|
+
const built = await mapPool(unique, options.concurrency ?? 4, async (position) => {
|
|
117
|
+
try {
|
|
118
|
+
const plan = await buildCollectFees(client, owner, { position: { protocol: position.protocol, positionMint: position.positionMint, pool: position.pool } }, { native: options.native, signal: options.signal });
|
|
119
|
+
return { position, plan, error: null };
|
|
120
|
+
}
|
|
121
|
+
catch (err) {
|
|
122
|
+
if (options.signal?.aborted)
|
|
123
|
+
throw err;
|
|
124
|
+
return { position, plan: null, error: (err instanceof Error ? err.message : String(err)).slice(0, MAX_ERROR) };
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
for (const item of built) {
|
|
128
|
+
if (item.plan === null) {
|
|
129
|
+
failed.push({ position: item.position, error: item.error });
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
calls.push({ owner, protocol: item.position.protocol, positionMint: item.position.positionMint, plan: item.plan, instructions: item.plan.steps.flatMap((s) => s.instructions) });
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return { owner, calls, failed };
|
|
136
|
+
}
|
|
137
|
+
/** 用 /simulate 模拟构建好的批量领取(不签名、不发送):逐笔交易的结果、哪些仓位会失败、收到的代币合计 */
|
|
138
|
+
export async function simulateClaim(client, plan, options = {}) {
|
|
139
|
+
const sim = await simulatePlan(client, plan.calls, options);
|
|
140
|
+
const totals = new Map();
|
|
141
|
+
const payer = options.feePayer ?? plan.owner;
|
|
142
|
+
for (const { simulation } of sim.transactions) {
|
|
143
|
+
for (const change of simulation.balanceChanges) {
|
|
144
|
+
if (change.address !== payer && change.address !== plan.owner)
|
|
145
|
+
continue;
|
|
146
|
+
const entry = totals.get(change.asset) ?? { change, delta: 0n, usd: undefined };
|
|
147
|
+
entry.delta += BigInt(change.delta);
|
|
148
|
+
// 美元价值是所有变化的合计(任何一笔没有价格就是 null);都没有 usd 字段时不给
|
|
149
|
+
if (change.usd !== undefined)
|
|
150
|
+
entry.usd = entry.usd === null || change.usd === null ? null : (entry.usd ?? 0) + change.usd;
|
|
151
|
+
totals.set(change.asset, entry);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
const received = [...totals.values()]
|
|
155
|
+
.filter((e) => e.delta !== 0n)
|
|
156
|
+
.map((e) => ({
|
|
157
|
+
asset: e.change.asset,
|
|
158
|
+
symbol: e.change.symbol,
|
|
159
|
+
decimals: e.change.decimals,
|
|
160
|
+
delta: e.delta.toString(),
|
|
161
|
+
formatted: `${e.delta < 0n ? '-' : ''}${formatUnits(e.delta < 0n ? -e.delta : e.delta, e.change.decimals)}`,
|
|
162
|
+
...(e.usd !== undefined ? { usd: e.usd } : {}),
|
|
163
|
+
}));
|
|
164
|
+
return { ...sim, received };
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* 批量领取:构建 → 模拟 → 用 from 签名发送(钱包同 /write 的 batchCall,多个仓位打包进同一笔交易,feePayer 可以替 owner 付手续费)。
|
|
168
|
+
* positions 不传时先预览、领取全部有东西可领的仓位;一个仓位失败不影响其他的。dryRun: true 只构建和模拟(不签名,from 只用来取地址)
|
|
169
|
+
*
|
|
170
|
+
* ```ts
|
|
171
|
+
* await claimAll(client, key) // 全部
|
|
172
|
+
* await claimAll(client, key, c.positions.slice(0, 5), { dryRun: true })
|
|
173
|
+
* ```
|
|
174
|
+
*/
|
|
175
|
+
export async function claimAll(client, from, positions, options = {}) {
|
|
176
|
+
const { resolveSigner } = await import('./write/signer.js');
|
|
177
|
+
const owner = (await resolveSigner(from)).address;
|
|
178
|
+
const minUsd = options.minUsd ?? 0;
|
|
179
|
+
const targets = (positions ?? (await claimable(client, owner, { signal: options.signal })).positions).filter((p) => p.totalUsd === undefined || p.totalUsd === null || p.totalUsd >= minUsd);
|
|
180
|
+
const plan = await buildClaimAll(client, owner, targets, options);
|
|
181
|
+
const feePayer = options.feePayer === undefined ? undefined : (await resolveSigner(options.feePayer)).address;
|
|
182
|
+
const simulation = options.simulate === false && !options.dryRun ? null : await simulateClaim(client, plan, { feePayer, signal: options.signal, batchSize: (options.mode ?? 'pack') === 'tx' ? 1 : options.batchSize });
|
|
183
|
+
const failed = new Map(simulation?.failed.map((f) => [f.index, f.error]));
|
|
184
|
+
const sent = options.dryRun ? [] : await sendCalls(client, from, plan.calls.filter((_, i) => !failed.has(i)), options);
|
|
185
|
+
let next = 0;
|
|
186
|
+
const results = plan.calls.map((call, index) => {
|
|
187
|
+
const base = { protocol: call.protocol, positionMint: call.positionMint };
|
|
188
|
+
const error = failed.get(index);
|
|
189
|
+
if (error !== undefined)
|
|
190
|
+
return { index, from: owner, status: 'failed', signature: null, slot: null, fee: null, computeUnits: null, error, ...base };
|
|
191
|
+
if (options.dryRun)
|
|
192
|
+
return { index, from: owner, status: 'simulated', signature: null, slot: null, fee: null, computeUnits: null, error: null, ...base };
|
|
193
|
+
return { ...sent[next++], index, ...base };
|
|
194
|
+
});
|
|
195
|
+
return { plan, simulation, results };
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=claim.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claim.js","sourceRoot":"","sources":["../src/claim.ts"],"names":[],"mappings":"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"}
|
package/dist/decode.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type IxType } from './programs.js';
|
|
2
|
+
export interface DecodedInstruction {
|
|
3
|
+
/** 在交易里的下标(顶层指令) */
|
|
4
|
+
index: number;
|
|
5
|
+
programId: string;
|
|
6
|
+
/** 程序名;不认识时为 null */
|
|
7
|
+
program: string | null;
|
|
8
|
+
type: IxType;
|
|
9
|
+
protocol?: string;
|
|
10
|
+
method?: string;
|
|
11
|
+
summary: string;
|
|
12
|
+
/** 金额都是最小单位的十进制字符串 */
|
|
13
|
+
args?: Record<string, unknown>;
|
|
14
|
+
}
|
|
15
|
+
/** Token 的 SetAuthority 的权限类型 */
|
|
16
|
+
export declare const AUTHORITY_TYPES: readonly ["MintTokens", "FreezeAccount", "AccountOwner", "CloseAccount", "TransferFeeConfig", "WithheldWithdraw", "CloseMint", "InterestRate", "PermanentDelegate", "ConfidentialTransferMint", "TransferHookProgramId", "ConfidentialTransferFeeConfig", "MetadataPointer", "GroupPointer", "GroupMemberPointer"];
|
|
17
|
+
/**
|
|
18
|
+
* 解码一条指令。accounts 是指令用到的账户地址(已按指令里的下标解析,包含地址查找表里的),data 是指令数据。
|
|
19
|
+
* 数据格式不对时不抛错,按“不认识的指令”返回
|
|
20
|
+
*/
|
|
21
|
+
export declare function decodeInstruction(index: number, programId: string, accounts: readonly string[], data: Uint8Array): DecodedInstruction;
|
|
22
|
+
//# sourceMappingURL=decode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decode.d.ts","sourceRoot":"","sources":["../src/decode.ts"],"names":[],"mappings":"AAMA,OAAO,EAAmF,KAAK,MAAM,EAAE,MAAM,eAAe,CAAA;AAE5H,MAAM,WAAW,kBAAkB;IACjC,oBAAoB;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,qBAAqB;IACrB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,sBAAsB;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC/B;AAED,iCAAiC;AACjC,eAAO,MAAM,eAAe,oTAGlB,CAAA;AA8BV;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,UAAU,GAAG,kBAAkB,CAerI"}
|
package/dist/decode.js
ADDED
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 指令解码(/simulate 和 /history 共用):System、SPL Token / Token-2022、关联代币账户、计算预算、Memo、升级程序加载器,
|
|
3
|
+
* 以及 programs.ts 里认得的 DEX / 聚合器(协议 + 指令名 + 大类)。其他程序只给程序名(认得时)和大类 contract / unknown
|
|
4
|
+
*/
|
|
5
|
+
import { encodeAddress } from './address.js';
|
|
6
|
+
import { ASSOCIATED_TOKEN_PROGRAM_ID, SYSTEM_PROGRAM_ID, TOKEN_2022_PROGRAM_ID, TOKEN_PROGRAM_ID } from './constants.js';
|
|
7
|
+
import { BPF_LOADER_UPGRADEABLE, COMPUTE_BUDGET, MEMO_V1, MEMO_V2, PROGRAMS, knownMethod } from './programs.js';
|
|
8
|
+
/** Token 的 SetAuthority 的权限类型 */
|
|
9
|
+
export const AUTHORITY_TYPES = [
|
|
10
|
+
'MintTokens', 'FreezeAccount', 'AccountOwner', 'CloseAccount', 'TransferFeeConfig', 'WithheldWithdraw', 'CloseMint', 'InterestRate',
|
|
11
|
+
'PermanentDelegate', 'ConfidentialTransferMint', 'TransferHookProgramId', 'ConfidentialTransferFeeConfig', 'MetadataPointer', 'GroupPointer', 'GroupMemberPointer',
|
|
12
|
+
];
|
|
13
|
+
const short = (a) => (a ? `${a.slice(0, 4)}…${a.slice(-4)}` : '?');
|
|
14
|
+
class Data {
|
|
15
|
+
bytes;
|
|
16
|
+
view;
|
|
17
|
+
offset = 0;
|
|
18
|
+
constructor(bytes) {
|
|
19
|
+
this.bytes = bytes;
|
|
20
|
+
this.view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
21
|
+
}
|
|
22
|
+
u8() {
|
|
23
|
+
return this.view.getUint8(this.offset++);
|
|
24
|
+
}
|
|
25
|
+
u32() {
|
|
26
|
+
const v = this.view.getUint32(this.offset, true);
|
|
27
|
+
this.offset += 4;
|
|
28
|
+
return v;
|
|
29
|
+
}
|
|
30
|
+
u64() {
|
|
31
|
+
const v = this.view.getBigUint64(this.offset, true);
|
|
32
|
+
this.offset += 8;
|
|
33
|
+
return v;
|
|
34
|
+
}
|
|
35
|
+
key() {
|
|
36
|
+
const v = encodeAddress(this.bytes.slice(this.offset, this.offset + 32));
|
|
37
|
+
this.offset += 32;
|
|
38
|
+
return v;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* 解码一条指令。accounts 是指令用到的账户地址(已按指令里的下标解析,包含地址查找表里的),data 是指令数据。
|
|
43
|
+
* 数据格式不对时不抛错,按“不认识的指令”返回
|
|
44
|
+
*/
|
|
45
|
+
export function decodeInstruction(index, programId, accounts, data) {
|
|
46
|
+
const info = PROGRAMS[programId];
|
|
47
|
+
const base = { index, programId, program: info?.name ?? null };
|
|
48
|
+
try {
|
|
49
|
+
const decoded = decodeKnown(programId, accounts, data);
|
|
50
|
+
if (decoded)
|
|
51
|
+
return { ...base, ...decoded };
|
|
52
|
+
const known = knownMethod(programId, data);
|
|
53
|
+
if (known) {
|
|
54
|
+
return { ...base, type: known[1], protocol: info?.protocol, method: known[0], summary: `${info?.protocol ?? info?.name} ${known[0]}` };
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
// 数据不符合格式:当作不认识
|
|
59
|
+
}
|
|
60
|
+
if (info)
|
|
61
|
+
return { ...base, type: 'contract', protocol: info.protocol, summary: `Call ${info.name}` };
|
|
62
|
+
return { ...base, type: 'unknown', summary: `Call unknown program ${short(programId)}` };
|
|
63
|
+
}
|
|
64
|
+
function decodeKnown(programId, a, data) {
|
|
65
|
+
const d = new Data(data);
|
|
66
|
+
switch (programId) {
|
|
67
|
+
case SYSTEM_PROGRAM_ID:
|
|
68
|
+
return decodeSystem(d, a);
|
|
69
|
+
case TOKEN_PROGRAM_ID:
|
|
70
|
+
case TOKEN_2022_PROGRAM_ID:
|
|
71
|
+
return decodeToken(d, a);
|
|
72
|
+
case ASSOCIATED_TOKEN_PROGRAM_ID: {
|
|
73
|
+
const method = data.length === 0 || data[0] === 0 ? 'create' : data[0] === 1 ? 'createIdempotent' : 'recoverNested';
|
|
74
|
+
return { type: 'setup', method, summary: `Create token account for ${short(a[2])}`, args: { payer: a[0], account: a[1], owner: a[2], mint: a[3] } };
|
|
75
|
+
}
|
|
76
|
+
case COMPUTE_BUDGET: {
|
|
77
|
+
const tag = d.u8();
|
|
78
|
+
if (tag === 2)
|
|
79
|
+
return { type: 'budget', method: 'setComputeUnitLimit', summary: 'Set compute unit limit', args: { units: d.u32() } };
|
|
80
|
+
if (tag === 3)
|
|
81
|
+
return { type: 'budget', method: 'setComputeUnitPrice', summary: 'Set priority fee', args: { microLamports: d.u64().toString() } };
|
|
82
|
+
return { type: 'budget', summary: 'Compute budget' };
|
|
83
|
+
}
|
|
84
|
+
case MEMO_V1:
|
|
85
|
+
case MEMO_V2:
|
|
86
|
+
return { type: 'memo', method: 'memo', summary: 'Memo', args: { text: new TextDecoder().decode(data) } };
|
|
87
|
+
case BPF_LOADER_UPGRADEABLE: {
|
|
88
|
+
const tag = d.u32();
|
|
89
|
+
const method = ['initializeBuffer', 'write', 'deploy', 'upgrade', 'setAuthority', 'close', 'extendProgram', 'setAuthorityChecked'][tag];
|
|
90
|
+
return { type: 'contract', method, summary: `Program loader: ${method ?? `instruction ${tag}`}`, args: { program: a[tag === 3 ? 1 : 0] } };
|
|
91
|
+
}
|
|
92
|
+
default:
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
function decodeSystem(d, a) {
|
|
97
|
+
const tag = d.u32();
|
|
98
|
+
switch (tag) {
|
|
99
|
+
case 0: {
|
|
100
|
+
const lamports = d.u64();
|
|
101
|
+
const space = d.u64();
|
|
102
|
+
return { type: 'setup', method: 'createAccount', summary: `Create account ${short(a[1])}`, args: { from: a[0], account: a[1], lamports: lamports.toString(), space: space.toString(), owner: d.key() } };
|
|
103
|
+
}
|
|
104
|
+
case 1: {
|
|
105
|
+
const owner = d.key();
|
|
106
|
+
return { type: 'approve', method: 'assign', summary: `Assign ${short(a[0])} to program ${short(owner)}`, args: { account: a[0], owner } };
|
|
107
|
+
}
|
|
108
|
+
case 2: {
|
|
109
|
+
const lamports = d.u64();
|
|
110
|
+
return { type: 'transfer', method: 'transfer', summary: `Transfer SOL to ${short(a[1])}`, args: { from: a[0], to: a[1], lamports: lamports.toString() } };
|
|
111
|
+
}
|
|
112
|
+
case 11: {
|
|
113
|
+
const lamports = d.u64();
|
|
114
|
+
return { type: 'transfer', method: 'transferWithSeed', summary: `Transfer SOL to ${short(a[2])}`, args: { from: a[0], to: a[2], lamports: lamports.toString() } };
|
|
115
|
+
}
|
|
116
|
+
case 5: {
|
|
117
|
+
const lamports = d.u64();
|
|
118
|
+
return { type: 'transfer', method: 'withdrawNonce', summary: `Withdraw nonce account to ${short(a[1])}`, args: { from: a[0], to: a[1], lamports: lamports.toString() } };
|
|
119
|
+
}
|
|
120
|
+
case 10:
|
|
121
|
+
return { type: 'approve', method: 'assignWithSeed', summary: `Assign ${short(a[0])} to another program`, args: { account: a[0] } };
|
|
122
|
+
default:
|
|
123
|
+
return { type: 'setup', summary: 'System instruction', method: ['createAccount', 'assign', 'transfer', 'createAccountWithSeed', 'advanceNonce', 'withdrawNonce', 'initializeNonce', 'authorizeNonce', 'allocate', 'allocateWithSeed'][tag] };
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
function decodeToken(d, a) {
|
|
127
|
+
const tag = d.u8();
|
|
128
|
+
const amountArgs = (extra, amount) => ({ ...extra, amount: amount.toString() });
|
|
129
|
+
switch (tag) {
|
|
130
|
+
case 3: {
|
|
131
|
+
const amount = d.u64();
|
|
132
|
+
return { type: 'transfer', method: 'transfer', summary: `Transfer tokens to ${short(a[1])}`, args: amountArgs({ source: a[0], destination: a[1], authority: a[2] }, amount) };
|
|
133
|
+
}
|
|
134
|
+
case 12: {
|
|
135
|
+
const amount = d.u64();
|
|
136
|
+
return { type: 'transfer', method: 'transferChecked', summary: `Transfer tokens to ${short(a[2])}`, args: amountArgs({ source: a[0], mint: a[1], destination: a[2], authority: a[3] }, amount) };
|
|
137
|
+
}
|
|
138
|
+
case 26: {
|
|
139
|
+
const sub = d.u8();
|
|
140
|
+
if (sub === 1) {
|
|
141
|
+
const amount = d.u64();
|
|
142
|
+
return { type: 'transfer', method: 'transferCheckedWithFee', summary: `Transfer tokens to ${short(a[2])}`, args: amountArgs({ source: a[0], mint: a[1], destination: a[2], authority: a[3] }, amount) };
|
|
143
|
+
}
|
|
144
|
+
return { type: 'setup', method: 'transferFeeExtension', summary: 'Token-2022 transfer fee instruction' };
|
|
145
|
+
}
|
|
146
|
+
case 4: {
|
|
147
|
+
const amount = d.u64();
|
|
148
|
+
return { type: 'approve', method: 'approve', summary: `Approve ${short(a[1])} to spend tokens`, args: amountArgs({ account: a[0], delegate: a[1], owner: a[2] }, amount) };
|
|
149
|
+
}
|
|
150
|
+
case 13: {
|
|
151
|
+
const amount = d.u64();
|
|
152
|
+
return { type: 'approve', method: 'approveChecked', summary: `Approve ${short(a[2])} to spend tokens`, args: amountArgs({ account: a[0], mint: a[1], delegate: a[2], owner: a[3] }, amount) };
|
|
153
|
+
}
|
|
154
|
+
case 5:
|
|
155
|
+
return { type: 'approve', method: 'revoke', summary: 'Revoke token delegate', args: { account: a[0], owner: a[1] } };
|
|
156
|
+
case 6: {
|
|
157
|
+
const authorityType = AUTHORITY_TYPES[d.u8()] ?? 'Unknown';
|
|
158
|
+
const newAuthority = d.u8() === 1 ? d.key() : null;
|
|
159
|
+
return {
|
|
160
|
+
type: 'approve',
|
|
161
|
+
method: 'setAuthority',
|
|
162
|
+
summary: newAuthority ? `Set ${authorityType} authority to ${short(newAuthority)}` : `Remove ${authorityType} authority`,
|
|
163
|
+
args: { account: a[0], authorityType, newAuthority },
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
case 7:
|
|
167
|
+
case 14: {
|
|
168
|
+
const amount = d.u64();
|
|
169
|
+
return { type: 'mint', method: tag === 7 ? 'mintTo' : 'mintToChecked', summary: `Mint tokens to ${short(a[1])}`, args: amountArgs({ mint: a[0], destination: a[1] }, amount) };
|
|
170
|
+
}
|
|
171
|
+
case 8:
|
|
172
|
+
case 15: {
|
|
173
|
+
const amount = d.u64();
|
|
174
|
+
return { type: 'burn', method: tag === 8 ? 'burn' : 'burnChecked', summary: 'Burn tokens', args: amountArgs({ account: a[0], mint: a[1] }, amount) };
|
|
175
|
+
}
|
|
176
|
+
case 9:
|
|
177
|
+
return { type: 'close', method: 'closeAccount', summary: `Close token account ${short(a[0])}`, args: { account: a[0], destination: a[1], owner: a[2] } };
|
|
178
|
+
case 17:
|
|
179
|
+
return { type: 'setup', method: 'syncNative', summary: 'Sync wrapped SOL', args: { account: a[0] } };
|
|
180
|
+
case 10:
|
|
181
|
+
case 11:
|
|
182
|
+
return { type: 'contract', method: tag === 10 ? 'freezeAccount' : 'thawAccount', summary: tag === 10 ? 'Freeze token account' : 'Thaw token account', args: { account: a[0] } };
|
|
183
|
+
default:
|
|
184
|
+
return { type: 'setup', summary: tag <= 25 ? 'Initialize token account / mint' : 'Token-2022 extension instruction' };
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=decode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decode.js","sourceRoot":"","sources":["../src/decode.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/** 交易的类型和一句话说明(/simulate 和 /history 共用):指令的大类 + 钱包的余额变化 */
|
|
2
|
+
import type { DecodedInstruction } from './decode.js';
|
|
3
|
+
export interface AssetDelta {
|
|
4
|
+
asset: string;
|
|
5
|
+
symbol: string;
|
|
6
|
+
decimals: number;
|
|
7
|
+
/** 带符号的最小单位十进制字符串 */
|
|
8
|
+
delta: string;
|
|
9
|
+
formatted: string;
|
|
10
|
+
}
|
|
11
|
+
export type TxKind = 'transfer' | 'swap' | 'approve' | 'liquidity' | 'mint' | 'contract' | 'unknown';
|
|
12
|
+
export interface Classified {
|
|
13
|
+
type: TxKind;
|
|
14
|
+
protocol?: string;
|
|
15
|
+
method?: string;
|
|
16
|
+
/** 没有认得的指令、按余额变化(一个资产减少、另一个增加)推断为 swap */
|
|
17
|
+
inferred?: boolean;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* 判断类型:先看认得的指令(流动性 > 兑换 > 授权 > 铸造),再看是不是只有转账;有不认得的程序时,
|
|
21
|
+
* 钱包一个资产减少、另一个增加就推断为兑换,否则是合约调用(程序认得)或未知。没有任何有意义的指令(只有建账户、关闭等)时为 null
|
|
22
|
+
*/
|
|
23
|
+
export declare function classify(ixs: readonly DecodedInstruction[], changes: readonly Pick<AssetDelta, 'asset' | 'delta'>[]): Classified | null;
|
|
24
|
+
/** 一句话说明,如 “Swap 1 SOL for 150.2 USDC on Jupiter” */
|
|
25
|
+
export declare function describe(kind: Classified | null, ixs: readonly DecodedInstruction[], changes: readonly AssetDelta[], counterparty?: string): string;
|
|
26
|
+
//# sourceMappingURL=describe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"describe.d.ts","sourceRoot":"","sources":["../src/describe.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAGrD,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,qBAAqB;IACrB,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,MAAM,MAAM,GAAG,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,WAAW,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,CAAA;AAEpG,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAID;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,SAAS,kBAAkB,EAAE,EAAE,OAAO,EAAE,SAAS,IAAI,CAAC,UAAU,EAAE,OAAO,GAAG,OAAO,CAAC,EAAE,GAAG,UAAU,GAAG,IAAI,CAkBvI;AAKD,qDAAqD;AACrD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,EAAE,GAAG,EAAE,SAAS,kBAAkB,EAAE,EAAE,OAAO,EAAE,SAAS,UAAU,EAAE,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAuBnJ"}
|
package/dist/describe.js
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { PROGRAMS } from './programs.js';
|
|
2
|
+
const short = (a) => `${a.slice(0, 4)}…${a.slice(-4)}`;
|
|
3
|
+
/**
|
|
4
|
+
* 判断类型:先看认得的指令(流动性 > 兑换 > 授权 > 铸造),再看是不是只有转账;有不认得的程序时,
|
|
5
|
+
* 钱包一个资产减少、另一个增加就推断为兑换,否则是合约调用(程序认得)或未知。没有任何有意义的指令(只有建账户、关闭等)时为 null
|
|
6
|
+
*/
|
|
7
|
+
export function classify(ixs, changes) {
|
|
8
|
+
const pick = (type) => ixs.find((ix) => ix.type === type);
|
|
9
|
+
const result = (ix, type) => ({ type, protocol: ix.protocol, method: ix.method });
|
|
10
|
+
for (const type of ['liquidity', 'swap', 'approve', 'mint']) {
|
|
11
|
+
const ix = pick(type);
|
|
12
|
+
if (ix)
|
|
13
|
+
return result(ix, type);
|
|
14
|
+
}
|
|
15
|
+
const others = ixs.filter((ix) => ix.type === 'contract' || ix.type === 'unknown');
|
|
16
|
+
const out = changes.filter((c) => c.delta.startsWith('-'));
|
|
17
|
+
const received = changes.filter((c) => !c.delta.startsWith('-') && c.delta !== '0');
|
|
18
|
+
if (others.length) {
|
|
19
|
+
const first = others.find((ix) => ix.protocol) ?? others[0];
|
|
20
|
+
if (out.length && received.some((r) => out.some((o) => o.asset !== r.asset)))
|
|
21
|
+
return { type: 'swap', protocol: first.protocol, inferred: true };
|
|
22
|
+
return { type: others.some((ix) => PROGRAMS[ix.programId]) ? 'contract' : 'unknown', protocol: first.protocol, method: first.method };
|
|
23
|
+
}
|
|
24
|
+
const transfer = pick('transfer');
|
|
25
|
+
if (transfer)
|
|
26
|
+
return result(transfer, 'transfer');
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
const amount = (c) => `${c.formatted.replace(/^-/, '')} ${c.symbol}`;
|
|
30
|
+
const join = (list) => list.map(amount).join(' + ');
|
|
31
|
+
/** 一句话说明,如 “Swap 1 SOL for 150.2 USDC on Jupiter” */
|
|
32
|
+
export function describe(kind, ixs, changes, counterparty) {
|
|
33
|
+
const out = changes.filter((c) => c.delta.startsWith('-'));
|
|
34
|
+
const received = changes.filter((c) => !c.delta.startsWith('-') && c.delta !== '0');
|
|
35
|
+
const via = kind?.protocol ? ` on ${kind.protocol}` : '';
|
|
36
|
+
switch (kind?.type) {
|
|
37
|
+
case 'swap':
|
|
38
|
+
return out.length && received.length ? `Swap ${join(out)} for ${join(received)}${via}` : `Swap${via}`;
|
|
39
|
+
case 'transfer':
|
|
40
|
+
if (out.length && !received.length)
|
|
41
|
+
return `Send ${join(out)}${counterparty ? ` to ${short(counterparty)}` : ''}`;
|
|
42
|
+
if (received.length && !out.length)
|
|
43
|
+
return `Receive ${join(received)}${counterparty ? ` from ${short(counterparty)}` : ''}`;
|
|
44
|
+
return ixs.find((ix) => ix.type === 'transfer')?.summary ?? 'Transfer';
|
|
45
|
+
case 'liquidity':
|
|
46
|
+
return `${kind.method ? kind.method.replace(/_/g, ' ') : 'Liquidity'}${via}${out.length ? `: pay ${join(out)}` : ''}${received.length ? `${out.length ? ',' : ':'} receive ${join(received)}` : ''}`;
|
|
47
|
+
case 'approve':
|
|
48
|
+
return ixs.find((ix) => ix.type === 'approve')?.summary ?? 'Approve';
|
|
49
|
+
case 'mint':
|
|
50
|
+
return `Mint${received.length ? `: receive ${join(received)}` : ''}${via}`;
|
|
51
|
+
case 'contract':
|
|
52
|
+
case 'unknown':
|
|
53
|
+
return `${ixs.find((ix) => ix.type === kind.type)?.summary ?? 'Call program'}${out.length ? `, pay ${join(out)}` : ''}${received.length ? `, receive ${join(received)}` : ''}`;
|
|
54
|
+
default:
|
|
55
|
+
return ixs.find((ix) => ix.type === 'close')?.summary ?? (changes.length ? `Balance change: ${join(changes)}` : 'No balance change');
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=describe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"describe.js","sourceRoot":"","sources":["../src/describe.ts"],"names":[],"mappings":"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"}
|