@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/simulate.js
ADDED
|
@@ -0,0 +1,418 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 交易模拟(子路径 `@w3lib/solana-batch-call/simulate`):simulateTransaction(不验签名,换最新 blockhash)+ 钱包和交易里可写账户的前后状态,
|
|
3
|
+
* 算出余额变化、授权变化(delegate / SetAuthority / 关闭账户)、指令说明、程序错误、手续费和警告。支持 legacy 和 v0(地址查找表)交易
|
|
4
|
+
*/
|
|
5
|
+
import { base64 } from '@scure/base';
|
|
6
|
+
import { encodeAddress, isAddress } from './address.js';
|
|
7
|
+
import { NATIVE_MINT, SOL_DECIMALS, SYSTEM_PROGRAM_ID, TOKEN_2022_PROGRAM_ID, TOKEN_PROGRAM_ID } from './constants.js';
|
|
8
|
+
import { decodeInstruction } from './decode.js';
|
|
9
|
+
import { classify, describe } from './describe.js';
|
|
10
|
+
import { formatUnits, parseMint } from './layout.js';
|
|
11
|
+
import { BPF_LOADER_UPGRADEABLE, COMPUTE_BUDGET, PROGRAMS, programErrorName } from './programs.js';
|
|
12
|
+
import { MAX_ACCOUNT_LOCKS, PACKET_DATA_SIZE, compileMessage, parseMessage, serializeTransaction, splitTransaction, transactionSize, normalizeInstruction, } from './write/transaction.js';
|
|
13
|
+
const U64_HALF = 1n << 63n;
|
|
14
|
+
const HIGH_FEE_LAMPORTS = 10000000n;
|
|
15
|
+
const short = (a) => `${a.slice(0, 4)}…${a.slice(-4)}`;
|
|
16
|
+
function build(input, options) {
|
|
17
|
+
if (typeof input === 'string')
|
|
18
|
+
return { bytes: base64.decode(input), owner: options.owner, expected: [...(options.signers ?? [])] };
|
|
19
|
+
if (input instanceof Uint8Array)
|
|
20
|
+
return { bytes: input, owner: options.owner, expected: [...(options.signers ?? [])] };
|
|
21
|
+
let payer;
|
|
22
|
+
let list;
|
|
23
|
+
let expected = [...(options.signers ?? [])];
|
|
24
|
+
if (Array.isArray(input)) {
|
|
25
|
+
const calls = input;
|
|
26
|
+
payer = calls[0]?.owner;
|
|
27
|
+
list = calls.flatMap((c) => [...c.instructions]);
|
|
28
|
+
expected.push(...calls.map((c) => c.owner));
|
|
29
|
+
}
|
|
30
|
+
else if ('steps' in input) {
|
|
31
|
+
payer = input.owner;
|
|
32
|
+
const steps = options.step === undefined ? input.steps : input.steps.filter((_, i) => i === options.step);
|
|
33
|
+
list = steps.flatMap((s) => [...s.instructions]);
|
|
34
|
+
expected.push(...(input.signers ?? []).map((s) => s.address));
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
payer = input.feePayer ?? input.owner;
|
|
38
|
+
const ix = input.instructions;
|
|
39
|
+
list = Array.isArray(ix) ? [...ix] : [ix];
|
|
40
|
+
}
|
|
41
|
+
payer = options.owner ?? payer;
|
|
42
|
+
if (!payer || !isAddress(payer))
|
|
43
|
+
throw new Error('Simulation needs a valid owner / feePayer address');
|
|
44
|
+
const instructions = list.map(normalizeInstruction);
|
|
45
|
+
const hasLimit = instructions.some((ix) => ix.programId === COMPUTE_BUDGET && ix.data[0] === 2);
|
|
46
|
+
const withLimit = hasLimit ? instructions : [{ programId: COMPUTE_BUDGET, keys: [], data: new Uint8Array([2, 0xc0, 0x5c, 0x15, 0x00]) }, ...instructions];
|
|
47
|
+
const message = compileMessage(payer, withLimit, SYSTEM_PROGRAM_ID);
|
|
48
|
+
if (transactionSize(message) > PACKET_DATA_SIZE || message.accountKeys.length > MAX_ACCOUNT_LOCKS) {
|
|
49
|
+
throw new Error('The instructions do not fit in one transaction; simulate the steps one by one with the `step` option');
|
|
50
|
+
}
|
|
51
|
+
return { bytes: serializeTransaction(message, message.signers.map(() => null)), owner: payer, expected: [payer, ...expected] };
|
|
52
|
+
}
|
|
53
|
+
/** 解析交易:地址查找表里的账户读表补上(静态账户 + 表里可写的 + 表里只读的) */
|
|
54
|
+
async function resolveTransaction(client, bytes, signal) {
|
|
55
|
+
if (((bytes[0] ?? 0) & 0x80) !== 0)
|
|
56
|
+
throw new Error('Unsupported transaction format (v1): only legacy and v0 transactions can be simulated');
|
|
57
|
+
const { message } = splitTransaction(bytes);
|
|
58
|
+
const parsed = parseMessage(message);
|
|
59
|
+
const loadedWritable = [];
|
|
60
|
+
const loadedReadonly = [];
|
|
61
|
+
if (parsed.lookups.length) {
|
|
62
|
+
const tables = await client.accounts(parsed.lookups.map((l) => l.table), { signal });
|
|
63
|
+
parsed.lookups.forEach((l, i) => {
|
|
64
|
+
const data = tables[i]?.data;
|
|
65
|
+
if (!data)
|
|
66
|
+
throw new Error(`Address lookup table not found: ${l.table}`);
|
|
67
|
+
const at = (index) => {
|
|
68
|
+
const start = 56 + 32 * index;
|
|
69
|
+
if (start + 32 > data.length)
|
|
70
|
+
throw new Error(`Address lookup table ${l.table} has no entry ${index}`);
|
|
71
|
+
return encodeAddress(data.slice(start, start + 32));
|
|
72
|
+
};
|
|
73
|
+
loadedWritable.push(...l.writable.map(at));
|
|
74
|
+
loadedReadonly.push(...l.readonly.map(at));
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
const keys = [...parsed.staticKeys, ...loadedWritable, ...loadedReadonly];
|
|
78
|
+
const key = (i) => {
|
|
79
|
+
const k = keys[i];
|
|
80
|
+
if (k === undefined)
|
|
81
|
+
throw new Error('Invalid transaction: bad account index');
|
|
82
|
+
return k;
|
|
83
|
+
};
|
|
84
|
+
return {
|
|
85
|
+
version: parsed.version,
|
|
86
|
+
signers: parsed.staticKeys.slice(0, parsed.signatures),
|
|
87
|
+
keys,
|
|
88
|
+
writable: new Set([...parsed.writable, ...loadedWritable]),
|
|
89
|
+
instructions: parsed.instructions.map((ix) => ({ programId: ix.programId, accounts: ix.accounts.map(key), data: ix.data })),
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
function tokenState(snap) {
|
|
93
|
+
const d = snap?.data;
|
|
94
|
+
if (!snap || !d || (snap.owner !== TOKEN_PROGRAM_ID && snap.owner !== TOKEN_2022_PROGRAM_ID))
|
|
95
|
+
return null;
|
|
96
|
+
if (d.length !== 165 && !(d.length > 165 && d[165] === 2))
|
|
97
|
+
return null;
|
|
98
|
+
const view = new DataView(d.buffer, d.byteOffset, d.byteLength);
|
|
99
|
+
const key = (o) => encodeAddress(d.slice(o, o + 32));
|
|
100
|
+
if (d[108] === 0)
|
|
101
|
+
return null;
|
|
102
|
+
return {
|
|
103
|
+
mint: key(0),
|
|
104
|
+
owner: key(32),
|
|
105
|
+
amount: view.getBigUint64(64, true),
|
|
106
|
+
delegate: view.getUint32(72, true) === 1 ? key(76) : null,
|
|
107
|
+
delegatedAmount: view.getBigUint64(121, true),
|
|
108
|
+
closeAuthority: view.getUint32(129, true) === 1 ? key(133) : null,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
function mintAuthorities(snap) {
|
|
112
|
+
if (!snap || (snap.owner !== TOKEN_PROGRAM_ID && snap.owner !== TOKEN_2022_PROGRAM_ID))
|
|
113
|
+
return null;
|
|
114
|
+
try {
|
|
115
|
+
const m = parseMint(snap.data);
|
|
116
|
+
return { mintAuthority: m.mintAuthority, freezeAuthority: m.freezeAuthority };
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// ---- 错误 ----
|
|
123
|
+
const TX_ERRORS = {
|
|
124
|
+
InsufficientFundsForFee: 'insufficient SOL for the transaction fee',
|
|
125
|
+
AccountNotFound: 'fee payer account not found (it has no SOL)',
|
|
126
|
+
BlockhashNotFound: 'blockhash not found',
|
|
127
|
+
AccountInUse: 'account in use',
|
|
128
|
+
};
|
|
129
|
+
/** 失败原因:Anchor 日志的错误名 > 程序错误码(按失败的程序查表)> 日志里程序打印的说明 > 错误本身 */
|
|
130
|
+
export function failureText(err, logs, ixs) {
|
|
131
|
+
if (typeof err === 'string')
|
|
132
|
+
return TX_ERRORS[err] ?? err;
|
|
133
|
+
const ie = err?.InstructionError;
|
|
134
|
+
if (!ie) {
|
|
135
|
+
if (err?.InsufficientFundsForRent)
|
|
136
|
+
return 'account would be left with less SOL than the rent-exempt minimum';
|
|
137
|
+
return JSON.stringify(err);
|
|
138
|
+
}
|
|
139
|
+
const [index, reason] = ie;
|
|
140
|
+
const at = ixs[index];
|
|
141
|
+
const where = at ? `instruction ${index} (${at.program ?? short(at.programId)}${at.method ? ` ${at.method}` : ''})` : `instruction ${index}`;
|
|
142
|
+
const reversed = [...logs].reverse();
|
|
143
|
+
const anchor = reversed.find((l) => /AnchorError/.test(l));
|
|
144
|
+
const anchorText = anchor && /Error Code: (\w+)\. Error Number: (\d+)\. Error Message: (.*?)\.?$/.exec(anchor);
|
|
145
|
+
if (anchorText)
|
|
146
|
+
return `${where} failed: ${anchorText[1]} (${anchorText[2]}): ${anchorText[3]}`;
|
|
147
|
+
const custom = reason?.Custom;
|
|
148
|
+
if (custom !== undefined) {
|
|
149
|
+
const failed = reversed.map((l) => /^Program (\w+) failed: custom program error/.exec(l)?.[1]).find(Boolean) ?? at?.programId;
|
|
150
|
+
const name = programErrorName(failed, custom);
|
|
151
|
+
const detail = reversed.find((l) => /^Program log: (Error|error)/.test(l))?.replace(/^Program log: /, '');
|
|
152
|
+
return `${where} failed: ${name ?? `custom program error 0x${custom.toString(16)}`}${name ? ` (0x${custom.toString(16)})` : ''}${detail ? ` - ${detail}` : ''}`;
|
|
153
|
+
}
|
|
154
|
+
const plain = reversed.find((l) => !l.startsWith('Program ') || /^Program log: /.test(l))?.replace(/^Program log: /, '');
|
|
155
|
+
return `${where} failed: ${typeof reason === 'string' ? reason : JSON.stringify(reason)}${plain ? ` - ${plain}` : ''}`;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* 模拟一笔交易,不需要签名、不会发送。输入:base64 / 字节的交易,或本库构建器的输出
|
|
159
|
+
* (buildSwap / buildAddLiquidity… 的计划、`{ owner, instructions }`、buildRevokes / buildCloses 的结果)
|
|
160
|
+
*/
|
|
161
|
+
export async function simulate(client, input, options = {}) {
|
|
162
|
+
const { signal } = options;
|
|
163
|
+
const built = build(input, options);
|
|
164
|
+
const tx = await resolveTransaction(client, built.bytes, signal);
|
|
165
|
+
const wallet = built.owner ?? tx.signers[0];
|
|
166
|
+
if (!wallet)
|
|
167
|
+
throw new Error('Transaction has no signer');
|
|
168
|
+
const decodedIxs = tx.instructions.map((ix, i) => decodeInstruction(i, ix.programId, ix.accounts, ix.data));
|
|
169
|
+
// 要看前后状态的账户:钱包、额外要看的、交易里可写的里和钱包有关的(新建的账户、钱包的代币账户、mint);
|
|
170
|
+
// 公共节点的 simulateTransaction 一次最多返回 10 个账户(publicnode),所以先读前状态筛一遍,不够再分批模拟
|
|
171
|
+
const candidates = [...new Set([wallet, ...(options.watch ?? []).filter(isAddress), ...tx.keys.filter((k) => tx.writable.has(k))])];
|
|
172
|
+
const preAll = await client.accounts(candidates, { signal });
|
|
173
|
+
const keep = (address, i) => {
|
|
174
|
+
const before = preAll[i];
|
|
175
|
+
if (address === wallet || options.watch?.includes(address) || !before)
|
|
176
|
+
return true;
|
|
177
|
+
return tokenState(before)?.owner === wallet || mintAuthorities(before) !== null;
|
|
178
|
+
};
|
|
179
|
+
const watch = candidates.filter(keep);
|
|
180
|
+
const pre = watch.map((a) => preAll[candidates.indexOf(a)] ?? null);
|
|
181
|
+
const raw = base64.encode(built.bytes);
|
|
182
|
+
const run = (addresses) => client.request('simulateTransaction', [raw, { encoding: 'base64', sigVerify: false, replaceRecentBlockhash: true, commitment: 'confirmed', accounts: { encoding: 'base64', addresses } }], { signal });
|
|
183
|
+
let sim;
|
|
184
|
+
try {
|
|
185
|
+
sim = await run(watch);
|
|
186
|
+
}
|
|
187
|
+
catch (err) {
|
|
188
|
+
const max = Number(/maximum of (\d+) accounts/i.exec(err instanceof Error ? err.message : '')?.[1]);
|
|
189
|
+
if (!(max >= 1))
|
|
190
|
+
throw err;
|
|
191
|
+
const chunks = Array.from({ length: Math.ceil(watch.length / max) }, (_, i) => watch.slice(i * max, (i + 1) * max));
|
|
192
|
+
const parts = await Promise.all(chunks.map(run));
|
|
193
|
+
sim = { value: { ...parts[0].value, accounts: parts.every((x) => x.value.accounts) ? parts.flatMap((x) => x.value.accounts ?? []) : null } };
|
|
194
|
+
}
|
|
195
|
+
const value = sim.value;
|
|
196
|
+
const logs = value.logs ?? [];
|
|
197
|
+
const success = !value.err;
|
|
198
|
+
const post = success && value.accounts ? value.accounts.map((a) => (a ? { lamports: BigInt(a.lamports), owner: a.owner, data: base64.decode(a.data[0]) } : null)) : null;
|
|
199
|
+
const preAt = (i) => {
|
|
200
|
+
const a = pre[i];
|
|
201
|
+
return a ? { lamports: a.lamports, owner: a.owner, data: a.data } : null;
|
|
202
|
+
};
|
|
203
|
+
// 手续费:签名费 + 计算单元上限 × 单价
|
|
204
|
+
let limit = null;
|
|
205
|
+
let price = 0n;
|
|
206
|
+
for (const ix of tx.instructions) {
|
|
207
|
+
if (ix.programId !== COMPUTE_BUDGET)
|
|
208
|
+
continue;
|
|
209
|
+
const view = new DataView(ix.data.buffer, ix.data.byteOffset, ix.data.byteLength);
|
|
210
|
+
if (ix.data[0] === 2 && ix.data.length >= 5)
|
|
211
|
+
limit = BigInt(view.getUint32(1, true));
|
|
212
|
+
if (ix.data[0] === 3 && ix.data.length >= 9)
|
|
213
|
+
price = view.getBigUint64(1, true);
|
|
214
|
+
}
|
|
215
|
+
const nonBudget = tx.instructions.filter((ix) => ix.programId !== COMPUTE_BUDGET).length;
|
|
216
|
+
const units = BigInt(Math.min(1_400_000, limit !== null ? Number(limit) : 200_000 * nonBudget));
|
|
217
|
+
const fee = 5000n * BigInt(tx.signers.length) + (price * units + 999999n) / 1000000n;
|
|
218
|
+
const feePayer = tx.signers[0];
|
|
219
|
+
const warnings = [];
|
|
220
|
+
const warn = (code, severity, message, address) => warnings.push({ code, severity, message, address });
|
|
221
|
+
const approvalChanges = [];
|
|
222
|
+
const tokenDeltas = new Map();
|
|
223
|
+
let nativeDelta = 0n;
|
|
224
|
+
const mints = new Set();
|
|
225
|
+
if (post) {
|
|
226
|
+
watch.forEach((address, i) => {
|
|
227
|
+
const before = preAt(i);
|
|
228
|
+
const after = post[i] ?? null;
|
|
229
|
+
if (address === wallet) {
|
|
230
|
+
nativeDelta = (after?.lamports ?? 0n) - (before?.lamports ?? 0n);
|
|
231
|
+
if (before && after && before.owner === SYSTEM_PROGRAM_ID && after.owner !== SYSTEM_PROGRAM_ID) {
|
|
232
|
+
approvalChanges.push({ kind: 'authority-changed', account: address, authorityType: 'AccountOwner', authority: after.owner, previousAuthority: before.owner });
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
const a = tokenState(before);
|
|
236
|
+
const b = tokenState(after);
|
|
237
|
+
const mine = (t) => t?.owner === wallet;
|
|
238
|
+
const mint = (a ?? b)?.mint;
|
|
239
|
+
if (mint && (mine(a) || mine(b))) {
|
|
240
|
+
mints.add(mint);
|
|
241
|
+
tokenDeltas.set(mint, (tokenDeltas.get(mint) ?? 0n) + (mine(b) ? b.amount : 0n) - (mine(a) ? a.amount : 0n));
|
|
242
|
+
const common = { account: address, mint, owner: wallet };
|
|
243
|
+
if (a && !b) {
|
|
244
|
+
approvalChanges.push({ ...common, kind: 'account-closed', balance: a.amount.toString() });
|
|
245
|
+
}
|
|
246
|
+
else if (b) {
|
|
247
|
+
const unlimited = b.delegatedAmount >= U64_HALF;
|
|
248
|
+
if (b.delegate && !a?.delegate)
|
|
249
|
+
approvalChanges.push({ ...common, kind: 'delegate-set', delegate: b.delegate, previousDelegate: null, amount: b.delegatedAmount.toString(), unlimited });
|
|
250
|
+
else if (b.delegate && a?.delegate && (a.delegate !== b.delegate || b.delegatedAmount > a.delegatedAmount)) {
|
|
251
|
+
approvalChanges.push({ ...common, kind: 'delegate-changed', delegate: b.delegate, previousDelegate: a.delegate, amount: b.delegatedAmount.toString(), unlimited });
|
|
252
|
+
}
|
|
253
|
+
else if (!b.delegate && a?.delegate)
|
|
254
|
+
approvalChanges.push({ ...common, kind: 'delegate-revoked', delegate: null, previousDelegate: a.delegate, amount: '0' });
|
|
255
|
+
if (a && a.owner !== b.owner)
|
|
256
|
+
approvalChanges.push({ ...common, kind: 'authority-changed', authorityType: 'AccountOwner', authority: b.owner, previousAuthority: a.owner });
|
|
257
|
+
if (a && a.closeAuthority !== b.closeAuthority) {
|
|
258
|
+
approvalChanges.push({ ...common, kind: 'authority-changed', authorityType: 'CloseAccount', authority: b.closeAuthority, previousAuthority: a.closeAuthority });
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
const ma = mintAuthorities(before);
|
|
263
|
+
const mb = mintAuthorities(after);
|
|
264
|
+
if (ma && mb) {
|
|
265
|
+
for (const [type, field] of [['MintTokens', 'mintAuthority'], ['FreezeAccount', 'freezeAuthority']]) {
|
|
266
|
+
if (ma[field] !== mb[field])
|
|
267
|
+
approvalChanges.push({ kind: 'authority-changed', account: address, mint: address, authorityType: type, authority: mb[field], previousAuthority: ma[field] });
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
else {
|
|
273
|
+
// 没有模拟后的状态(模拟失败):只能按指令判断授权
|
|
274
|
+
for (const ix of decodedIxs) {
|
|
275
|
+
const args = ix.args;
|
|
276
|
+
if (ix.method === 'approve' || ix.method === 'approveChecked') {
|
|
277
|
+
approvalChanges.push({ kind: 'delegate-set', account: args?.account, mint: args?.mint ?? undefined, owner: args?.owner, delegate: args?.delegate, amount: args?.amount, unlimited: BigInt(args?.amount ?? 0) >= U64_HALF });
|
|
278
|
+
}
|
|
279
|
+
else if (ix.method === 'setAuthority') {
|
|
280
|
+
approvalChanges.push({ kind: 'authority-changed', account: args?.account, authorityType: args?.authorityType, authority: args?.newAuthority });
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
for (const ix of decodedIxs) {
|
|
285
|
+
const args = ix.args;
|
|
286
|
+
if (ix.method === 'closeAccount') {
|
|
287
|
+
const closed = approvalChanges.find((c) => c.kind === 'account-closed' && c.account === args?.account);
|
|
288
|
+
if (closed)
|
|
289
|
+
closed.destination = args?.destination;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
// 余额变化:钱包的 SOL(不含手续费)和代币,Wrapped SOL 并入 SOL
|
|
293
|
+
const balanceChanges = [];
|
|
294
|
+
if (post) {
|
|
295
|
+
const wsol = tokenDeltas.get(NATIVE_MINT) ?? 0n;
|
|
296
|
+
tokenDeltas.delete(NATIVE_MINT);
|
|
297
|
+
mints.delete(NATIVE_MINT);
|
|
298
|
+
const sol = nativeDelta + (feePayer === wallet ? fee : 0n) + wsol;
|
|
299
|
+
if (sol !== 0n)
|
|
300
|
+
balanceChanges.push({ address: wallet, asset: 'native', symbol: 'SOL', decimals: SOL_DECIMALS, delta: sol.toString(), formatted: formatUnits(sol, SOL_DECIMALS) });
|
|
301
|
+
const ids = [...tokenDeltas.entries()].filter(([, v]) => v !== 0n);
|
|
302
|
+
const details = ids.length
|
|
303
|
+
? await client.tokens(ids.map(([m]) => m), { fields: ['symbol', 'decimals'], signal }).catch(() => null)
|
|
304
|
+
: [];
|
|
305
|
+
if (!details)
|
|
306
|
+
warn('metadata-unavailable', 'info', 'Token symbols / decimals could not be read');
|
|
307
|
+
ids.forEach(([mint, delta], i) => {
|
|
308
|
+
const detail = details?.[i];
|
|
309
|
+
const decimals = detail?.decimals ?? 0;
|
|
310
|
+
balanceChanges.push({ address: wallet, asset: mint, symbol: detail?.symbol ?? short(mint), decimals, delta: delta.toString(), formatted: formatUnits(delta, decimals) });
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
const kind = classify(decodedIxs, balanceChanges);
|
|
314
|
+
const recipient = decodedIxs.find((ix) => ix.type === 'transfer')?.args;
|
|
315
|
+
const decoded = {
|
|
316
|
+
type: kind?.type ?? 'unknown',
|
|
317
|
+
protocol: kind?.protocol,
|
|
318
|
+
method: kind?.method,
|
|
319
|
+
summary: describe(kind, decodedIxs, balanceChanges, recipient?.to ?? recipient?.destination),
|
|
320
|
+
inferred: kind?.inferred,
|
|
321
|
+
instructions: decodedIxs,
|
|
322
|
+
};
|
|
323
|
+
// ---- 警告 ----
|
|
324
|
+
if (!success)
|
|
325
|
+
warn('simulation-failed', 'warn', 'The transaction fails in simulation');
|
|
326
|
+
for (const c of approvalChanges) {
|
|
327
|
+
if (c.kind === 'delegate-set' || c.kind === 'delegate-changed') {
|
|
328
|
+
warn(c.unlimited ? 'unlimited-delegate' : 'delegate-approved', c.unlimited ? 'danger' : 'warn', `${short(c.delegate)} can spend ${c.unlimited ? 'an unlimited amount of' : c.amount} of the tokens in ${short(c.account)}`, c.delegate);
|
|
329
|
+
}
|
|
330
|
+
else if (c.kind === 'authority-changed') {
|
|
331
|
+
const sev = c.authorityType === 'AccountOwner' || c.authorityType === 'CloseAccount' ? 'danger' : 'warn';
|
|
332
|
+
warn('authority-changed', sev, `${c.authorityType} authority of ${short(c.account)} changes to ${c.authority ? short(c.authority) : 'none'}`, c.authority ?? undefined);
|
|
333
|
+
}
|
|
334
|
+
else if (c.kind === 'account-closed' && c.destination && c.destination !== wallet) {
|
|
335
|
+
warn('close-to-other', 'warn', `Closing ${short(c.account)}${c.balance && c.balance !== '0' ? ` (balance ${c.balance})` : ''} sends its lamports to ${short(c.destination)}`, c.destination);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
for (const ix of decodedIxs) {
|
|
339
|
+
if (ix.method === 'assign' || ix.method === 'assignWithSeed')
|
|
340
|
+
warn('assign-owner', 'danger', `Assigns ${short(String(ix.args?.account))} to another program`, String(ix.args?.account));
|
|
341
|
+
if (ix.programId === BPF_LOADER_UPGRADEABLE && (ix.method === 'upgrade' || ix.method === 'setAuthority'))
|
|
342
|
+
warn('program-upgrade', 'danger', `Program loader instruction: ${ix.method}`);
|
|
343
|
+
}
|
|
344
|
+
const unknown = new Set(decodedIxs.filter((ix) => !PROGRAMS[ix.programId]).map((ix) => ix.programId));
|
|
345
|
+
for (const program of unknown)
|
|
346
|
+
warn('unknown-program', 'warn', `Calls an unrecognized program ${short(program)}`, program);
|
|
347
|
+
const expected = new Set(built.expected.length ? built.expected : [wallet]);
|
|
348
|
+
expected.add(wallet);
|
|
349
|
+
for (const s of tx.signers) {
|
|
350
|
+
if (!expected.has(s))
|
|
351
|
+
warn('unexpected-signer', 'warn', `The transaction also needs a signature from ${short(s)}`, s);
|
|
352
|
+
}
|
|
353
|
+
if (!tx.signers.includes(wallet))
|
|
354
|
+
warn('wallet-not-signer', 'info', `${short(wallet)} does not sign this transaction`, wallet);
|
|
355
|
+
if (fee > HIGH_FEE_LAMPORTS)
|
|
356
|
+
warn('high-fee', 'warn', `Network fee is ${formatUnits(fee, SOL_DECIMALS)} SOL`);
|
|
357
|
+
if (post) {
|
|
358
|
+
const walletPre = preAt(watch.indexOf(wallet))?.lamports ?? 0n;
|
|
359
|
+
const spent = -(nativeDelta + (feePayer === wallet ? fee : 0n));
|
|
360
|
+
if (walletPre > 0n && spent > 0n && spent * 10n >= walletPre * 9n)
|
|
361
|
+
warn('drains-balance', 'warn', 'Spends 90% or more of the wallet SOL balance', wallet);
|
|
362
|
+
watch.forEach((address, i) => {
|
|
363
|
+
if (address === wallet)
|
|
364
|
+
return;
|
|
365
|
+
const before = preAt(i);
|
|
366
|
+
const after = post[i] ?? null;
|
|
367
|
+
const isDestination = decodedIxs.some((ix) => (ix.method === 'transfer' || ix.method === 'transferWithSeed') && ix.programId === SYSTEM_PROGRAM_ID && ix.args?.to === address);
|
|
368
|
+
if (isDestination && (!before || before.lamports === 0n))
|
|
369
|
+
warn('new-recipient', 'warn', `${short(address)} has never held SOL (new account)`, address);
|
|
370
|
+
const t = tokenState(after);
|
|
371
|
+
if (!before && t && t.owner !== wallet && decodedIxs.some((ix) => ix.type === 'transfer' && ix.args?.destination === address)) {
|
|
372
|
+
warn('new-recipient', 'warn', `${short(t.owner)} did not have a token account for this mint yet`, t.owner);
|
|
373
|
+
}
|
|
374
|
+
});
|
|
375
|
+
}
|
|
376
|
+
const result = {
|
|
377
|
+
success,
|
|
378
|
+
...(success ? {} : { error: failureText(value.err, logs, decodedIxs) }),
|
|
379
|
+
gasUsed: String(value.unitsConsumed ?? 0),
|
|
380
|
+
fee: fee.toString(),
|
|
381
|
+
balanceChanges,
|
|
382
|
+
approvalChanges,
|
|
383
|
+
decoded,
|
|
384
|
+
warnings,
|
|
385
|
+
logs,
|
|
386
|
+
signers: tx.signers,
|
|
387
|
+
version: tx.version,
|
|
388
|
+
};
|
|
389
|
+
// ---- 可选:价格、风险(按需加载) ----
|
|
390
|
+
const assets = balanceChanges.map((c) => (c.asset === 'native' ? NATIVE_MINT : c.asset));
|
|
391
|
+
if (options.prices && balanceChanges.length) {
|
|
392
|
+
const { tokenPrices } = await import('./price.js');
|
|
393
|
+
const sources = Array.isArray(options.prices) ? { sources: options.prices } : {};
|
|
394
|
+
const prices = await tokenPrices(client, assets, { ...sources, signal, fetch: options.fetch }).catch(() => null);
|
|
395
|
+
balanceChanges.forEach((c, i) => {
|
|
396
|
+
const p = prices?.[i]?.price;
|
|
397
|
+
c.usd = p == null ? null : Number(c.formatted) * p;
|
|
398
|
+
});
|
|
399
|
+
}
|
|
400
|
+
if (options.risk) {
|
|
401
|
+
const tokens = [...mints].filter((m) => balanceChanges.some((c) => c.asset === m));
|
|
402
|
+
if (tokens.length) {
|
|
403
|
+
const { tokenRisks } = await import('./risk.js');
|
|
404
|
+
const risks = await tokenRisks(client, tokens, { signal }).catch(() => null);
|
|
405
|
+
if (risks) {
|
|
406
|
+
result.risks = Object.fromEntries(risks.map((r) => [r.mint, r.flags]));
|
|
407
|
+
const severe = ['permanent-delegate', 'transfer-hook', 'high-transfer-fee', 'non-transferable', 'default-frozen', 'paused', 'not-found'];
|
|
408
|
+
for (const r of risks) {
|
|
409
|
+
const hit = r.flags.filter((f) => severe.includes(f));
|
|
410
|
+
if (hit.length)
|
|
411
|
+
warn('token-risk', 'warn', `${short(r.mint)}: ${hit.join(', ')}`, r.mint);
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
return result;
|
|
417
|
+
}
|
|
418
|
+
//# sourceMappingURL=simulate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simulate.js","sourceRoot":"","sources":["../src/simulate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 授权管理(子路径 `@w3lib/solana-batch-call/approvals`):批量查地址的代币账户给出的授权(delegate)、可以关闭回收租金的空账户,
|
|
3
|
+
* 批量撤销 / 关闭。不放在主入口,不用时打包不会带上这部分代码;发送的代码按需加载。
|
|
4
|
+
*
|
|
5
|
+
* ```ts
|
|
6
|
+
* import { closeTokenAccounts, getApprovals, revokeApprovals } from '@w3lib/solana-batch-call/approvals'
|
|
7
|
+
*
|
|
8
|
+
* const list = await getApprovals(owner, { mints: [USDC, BONK] })
|
|
9
|
+
* await revokeApprovals(client, key, list)
|
|
10
|
+
* await closeTokenAccounts(client, key, list.filter((a) => a.amount === '0'))
|
|
11
|
+
* ```
|
|
12
|
+
*/
|
|
13
|
+
import { type ApprovalsQuery, type TokenAccountApproval } from '../approvals.js';
|
|
14
|
+
import { type ShortcutOptions } from '../shortcuts.js';
|
|
15
|
+
export { approvals, buildCloses, buildRevokes, closeTokenAccounts, parseTokenAccountState, revokeApprovals, type ApprovalCall, type ApprovalResult, type ApprovalsQuery, type BuildClosesOptions, type CloseAccountsOptions, type CloseBlocker, type TokenAccountApproval, } from '../approvals.js';
|
|
16
|
+
export { closeAccount, harvestWithheldTokensToMint, revoke } from '../write/instructions.js';
|
|
17
|
+
export interface GetApprovalsOptions extends ApprovalsQuery, ShortcutOptions {
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* 查地址的代币账户给出的授权和可以关闭的空账户,节点参数与 getBalances 相同。
|
|
21
|
+
*
|
|
22
|
+
* ```ts
|
|
23
|
+
* await getApprovals(owner, { mints: [USDC, BONK] }) // 指定代币:读 ATA,免费公共节点也能用
|
|
24
|
+
* await getApprovals(owner, { provider: 'https://my-rpc…' }) // 全部代币账户:需要支持 getTokenAccountsByOwner 的节点
|
|
25
|
+
* // [{ account, mint: USDC, symbol: 'USDC', delegate: 'GYFk…', delegatedAmount: '6993125', revocable: true, closable: false, closeBlocker: 'balance', … }]
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export declare function getApprovals(owner: string, options?: GetApprovalsOptions): Promise<TokenAccountApproval[]>;
|
|
29
|
+
//# sourceMappingURL=approvals.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approvals.d.ts","sourceRoot":"","sources":["../../src/subpaths/approvals.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAa,KAAK,cAAc,EAAE,KAAK,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AAC3F,OAAO,EAAW,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAE/D,OAAO,EACL,SAAS,EACT,WAAW,EACX,YAAY,EACZ,kBAAkB,EAClB,sBAAsB,EACtB,eAAe,EACf,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,YAAY,EACjB,KAAK,oBAAoB,GAC1B,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,YAAY,EAAE,2BAA2B,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAA;AAE5F,MAAM,WAAW,mBAAoB,SAAQ,cAAc,EAAE,eAAe;CAAG;AAE/E;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAG9G"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 授权管理(子路径 `@w3lib/solana-batch-call/approvals`):批量查地址的代币账户给出的授权(delegate)、可以关闭回收租金的空账户,
|
|
3
|
+
* 批量撤销 / 关闭。不放在主入口,不用时打包不会带上这部分代码;发送的代码按需加载。
|
|
4
|
+
*
|
|
5
|
+
* ```ts
|
|
6
|
+
* import { closeTokenAccounts, getApprovals, revokeApprovals } from '@w3lib/solana-batch-call/approvals'
|
|
7
|
+
*
|
|
8
|
+
* const list = await getApprovals(owner, { mints: [USDC, BONK] })
|
|
9
|
+
* await revokeApprovals(client, key, list)
|
|
10
|
+
* await closeTokenAccounts(client, key, list.filter((a) => a.amount === '0'))
|
|
11
|
+
* ```
|
|
12
|
+
*/
|
|
13
|
+
import { approvals } from '../approvals.js';
|
|
14
|
+
import { resolve } from '../shortcuts.js';
|
|
15
|
+
export { approvals, buildCloses, buildRevokes, closeTokenAccounts, parseTokenAccountState, revokeApprovals, } from '../approvals.js';
|
|
16
|
+
export { closeAccount, harvestWithheldTokensToMint, revoke } from '../write/instructions.js';
|
|
17
|
+
/**
|
|
18
|
+
* 查地址的代币账户给出的授权和可以关闭的空账户,节点参数与 getBalances 相同。
|
|
19
|
+
*
|
|
20
|
+
* ```ts
|
|
21
|
+
* await getApprovals(owner, { mints: [USDC, BONK] }) // 指定代币:读 ATA,免费公共节点也能用
|
|
22
|
+
* await getApprovals(owner, { provider: 'https://my-rpc…' }) // 全部代币账户:需要支持 getTokenAccountsByOwner 的节点
|
|
23
|
+
* // [{ account, mint: USDC, symbol: 'USDC', delegate: 'GYFk…', delegatedAmount: '6993125', revocable: true, closable: false, closeBlocker: 'balance', … }]
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export function getApprovals(owner, options = {}) {
|
|
27
|
+
const { client, own } = resolve(options, ['mints', 'all', 'signal']);
|
|
28
|
+
return approvals(client, owner, own);
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=approvals.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approvals.js","sourceRoot":"","sources":["../../src/subpaths/approvals.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,SAAS,EAAkD,MAAM,iBAAiB,CAAA;AAC3F,OAAO,EAAE,OAAO,EAAwB,MAAM,iBAAiB,CAAA;AAE/D,OAAO,EACL,SAAS,EACT,WAAW,EACX,YAAY,EACZ,kBAAkB,EAClB,sBAAsB,EACtB,eAAe,GAQhB,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,YAAY,EAAE,2BAA2B,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAA;AAI5F;;;;;;;;GAQG;AACH,MAAM,UAAU,YAAY,CAAC,KAAa,EAAE,UAA+B,EAAE;IAC3E,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAA;IACpE,OAAO,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,CAAA;AACtC,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 批量领取(子路径 `@w3lib/solana-batch-call/claim`):Orca Whirlpool、Raydium CLMM 仓位的未领取手续费和挖矿奖励(农场奖励)。
|
|
3
|
+
* 先只读预览(每个仓位能领多少、美元价值),再把全部(或选中的)仓位的领取指令打包成交易,发送前用 /simulate 模拟。
|
|
4
|
+
* 不放在主入口,不用时打包不会带上这部分代码;指令来自 /liquidity 的 collectFees。
|
|
5
|
+
*
|
|
6
|
+
* ```ts
|
|
7
|
+
* import { claimAll, getClaimable } from '@w3lib/solana-batch-call/claim'
|
|
8
|
+
*
|
|
9
|
+
* const c = await getClaimable(owner, { provider: 'https://my-rpc…' }) // 预览,不发交易
|
|
10
|
+
* c.totalUsd // 全部能领的美元价值
|
|
11
|
+
* await claimAll(client, key, c.positions) // 批量领取
|
|
12
|
+
* ```
|
|
13
|
+
*/
|
|
14
|
+
import { type Claimable, type ClaimQuery } from '../claim.js';
|
|
15
|
+
import { type ShortcutOptions } from '../shortcuts.js';
|
|
16
|
+
export { buildClaimAll, claimAll, claimable, simulateClaim, type BuildClaimOptions, type ClaimCall, type ClaimCallResult, type ClaimOptions, type ClaimPlan, type ClaimProtocol, type ClaimQuery, type ClaimResult, type ClaimSimulation, type ClaimTarget, type Claimable, type ClaimableAmount, type ClaimablePosition, } from '../claim.js';
|
|
17
|
+
export type { PlanSimulation } from '../batchPlan.js';
|
|
18
|
+
export interface GetClaimableOptions extends ClaimQuery, ShortcutOptions {
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* 预览一个地址能领取的手续费和挖矿奖励(只读取),节点参数与 getBalances 相同。默认列出全部代币账户(需要支持 getTokenAccountsByOwner 的节点),
|
|
22
|
+
* 免费公共节点传 `mints`(仓位 NFT 的 mint)只看指定仓位。
|
|
23
|
+
*
|
|
24
|
+
* ```ts
|
|
25
|
+
* const c = await getClaimable(owner, { provider: 'https://my-rpc…' })
|
|
26
|
+
* // { totalUsd: 345.6, tokens: [{ symbol: 'SOL', formatted: '1.627', usd: 290 }, { symbol: 'RAY', formatted: '0.0427', usd: 0.08 }, …],
|
|
27
|
+
* // positions: [{ protocol: 'raydium-clmm', positionMint, fees: [{ symbol: 'SOL', … }, { symbol: 'USDC', … }], rewards: [{ index: 0, symbol: 'RAY', … }], totalUsd: 345.6 }] }
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export declare function getClaimable(owner: string, options?: GetClaimableOptions): Promise<Claimable>;
|
|
31
|
+
//# sourceMappingURL=claim.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claim.d.ts","sourceRoot":"","sources":["../../src/subpaths/claim.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAa,KAAK,SAAS,EAAE,KAAK,UAAU,EAAE,MAAM,aAAa,CAAA;AACxE,OAAO,EAAW,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAE/D,OAAO,EACL,aAAa,EACb,QAAQ,EACR,SAAS,EACT,aAAa,EACb,KAAK,iBAAiB,EACtB,KAAK,SAAS,EACd,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,eAAe,EACpB,KAAK,iBAAiB,GACvB,MAAM,aAAa,CAAA;AACpB,YAAY,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAErD,MAAM,WAAW,mBAAoB,SAAQ,UAAU,EAAE,eAAe;CAAG;AAE3E;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,SAAS,CAAC,CAGjG"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 批量领取(子路径 `@w3lib/solana-batch-call/claim`):Orca Whirlpool、Raydium CLMM 仓位的未领取手续费和挖矿奖励(农场奖励)。
|
|
3
|
+
* 先只读预览(每个仓位能领多少、美元价值),再把全部(或选中的)仓位的领取指令打包成交易,发送前用 /simulate 模拟。
|
|
4
|
+
* 不放在主入口,不用时打包不会带上这部分代码;指令来自 /liquidity 的 collectFees。
|
|
5
|
+
*
|
|
6
|
+
* ```ts
|
|
7
|
+
* import { claimAll, getClaimable } from '@w3lib/solana-batch-call/claim'
|
|
8
|
+
*
|
|
9
|
+
* const c = await getClaimable(owner, { provider: 'https://my-rpc…' }) // 预览,不发交易
|
|
10
|
+
* c.totalUsd // 全部能领的美元价值
|
|
11
|
+
* await claimAll(client, key, c.positions) // 批量领取
|
|
12
|
+
* ```
|
|
13
|
+
*/
|
|
14
|
+
import { claimable } from '../claim.js';
|
|
15
|
+
import { resolve } from '../shortcuts.js';
|
|
16
|
+
export { buildClaimAll, claimAll, claimable, simulateClaim, } from '../claim.js';
|
|
17
|
+
/**
|
|
18
|
+
* 预览一个地址能领取的手续费和挖矿奖励(只读取),节点参数与 getBalances 相同。默认列出全部代币账户(需要支持 getTokenAccountsByOwner 的节点),
|
|
19
|
+
* 免费公共节点传 `mints`(仓位 NFT 的 mint)只看指定仓位。
|
|
20
|
+
*
|
|
21
|
+
* ```ts
|
|
22
|
+
* const c = await getClaimable(owner, { provider: 'https://my-rpc…' })
|
|
23
|
+
* // { totalUsd: 345.6, tokens: [{ symbol: 'SOL', formatted: '1.627', usd: 290 }, { symbol: 'RAY', formatted: '0.0427', usd: 0.08 }, …],
|
|
24
|
+
* // positions: [{ protocol: 'raydium-clmm', positionMint, fees: [{ symbol: 'SOL', … }, { symbol: 'USDC', … }], rewards: [{ index: 0, symbol: 'RAY', … }], totalUsd: 345.6 }] }
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export function getClaimable(owner, options = {}) {
|
|
28
|
+
const { client, own } = resolve(options, ['mints', 'protocols', 'prices', 'now', 'signal']);
|
|
29
|
+
return claimable(client, owner, { ...own, ...(options.fetch ? { fetch: options.fetch } : {}) });
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=claim.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claim.js","sourceRoot":"","sources":["../../src/subpaths/claim.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,SAAS,EAAmC,MAAM,aAAa,CAAA;AACxE,OAAO,EAAE,OAAO,EAAwB,MAAM,iBAAiB,CAAA;AAE/D,OAAO,EACL,aAAa,EACb,QAAQ,EACR,SAAS,EACT,aAAa,GAcd,MAAM,aAAa,CAAA;AAKpB;;;;;;;;;GASG;AACH,MAAM,UAAU,YAAY,CAAC,KAAa,EAAE,UAA+B,EAAE;IAC3E,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAA;IAC3F,OAAO,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,GAAG,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;AACjG,CAAC"}
|