@w3lib/solana-batch-call 0.5.0 → 0.7.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.
Files changed (220) hide show
  1. package/CHANGELOG.md +47 -0
  2. package/README.md +129 -9
  3. package/dist/accountReader.d.ts +57 -0
  4. package/dist/accountReader.d.ts.map +1 -0
  5. package/dist/accountReader.js +149 -0
  6. package/dist/accountReader.js.map +1 -0
  7. package/dist/address.d.ts +9 -0
  8. package/dist/address.d.ts.map +1 -1
  9. package/dist/address.js +36 -6
  10. package/dist/address.js.map +1 -1
  11. package/dist/approvals.d.ts +5 -3
  12. package/dist/approvals.d.ts.map +1 -1
  13. package/dist/approvals.js +25 -36
  14. package/dist/approvals.js.map +1 -1
  15. package/dist/balances.d.ts +178 -0
  16. package/dist/balances.d.ts.map +1 -0
  17. package/dist/balances.js +524 -0
  18. package/dist/balances.js.map +1 -0
  19. package/dist/batchPlan.d.ts +52 -0
  20. package/dist/batchPlan.d.ts.map +1 -0
  21. package/dist/batchPlan.js +64 -0
  22. package/dist/batchPlan.js.map +1 -0
  23. package/dist/bytes.d.ts +31 -0
  24. package/dist/bytes.d.ts.map +1 -0
  25. package/dist/bytes.js +74 -0
  26. package/dist/bytes.js.map +1 -0
  27. package/dist/claim.d.ts +163 -0
  28. package/dist/claim.d.ts.map +1 -0
  29. package/dist/claim.js +197 -0
  30. package/dist/claim.js.map +1 -0
  31. package/dist/client.d.ts +26 -41
  32. package/dist/client.d.ts.map +1 -1
  33. package/dist/client.js +41 -986
  34. package/dist/client.js.map +1 -1
  35. package/dist/clientConfig.d.ts +11 -0
  36. package/dist/clientConfig.d.ts.map +1 -0
  37. package/dist/clientConfig.js +3 -0
  38. package/dist/clientConfig.js.map +1 -0
  39. package/dist/decode.d.ts +22 -0
  40. package/dist/decode.d.ts.map +1 -0
  41. package/dist/decode.js +160 -0
  42. package/dist/decode.js.map +1 -0
  43. package/dist/describe.d.ts +26 -0
  44. package/dist/describe.d.ts.map +1 -0
  45. package/dist/describe.js +58 -0
  46. package/dist/describe.js.map +1 -0
  47. package/dist/fees.d.ts.map +1 -1
  48. package/dist/fees.js +2 -12
  49. package/dist/fees.js.map +1 -1
  50. package/dist/history.d.ts +125 -0
  51. package/dist/history.d.ts.map +1 -0
  52. package/dist/history.js +220 -0
  53. package/dist/history.js.map +1 -0
  54. package/dist/historyHelius.d.ts +52 -0
  55. package/dist/historyHelius.d.ts.map +1 -0
  56. package/dist/historyHelius.js +125 -0
  57. package/dist/historyHelius.js.map +1 -0
  58. package/dist/index.d.ts +3 -3
  59. package/dist/index.d.ts.map +1 -1
  60. package/dist/index.js +1 -1
  61. package/dist/index.js.map +1 -1
  62. package/dist/layout.d.ts +21 -0
  63. package/dist/layout.d.ts.map +1 -1
  64. package/dist/layout.js +50 -69
  65. package/dist/layout.js.map +1 -1
  66. package/dist/liquidity/common.js +2 -2
  67. package/dist/liquidity/common.js.map +1 -1
  68. package/dist/liquidity/orca.d.ts +6 -0
  69. package/dist/liquidity/orca.d.ts.map +1 -1
  70. package/dist/liquidity/orca.js +14 -3
  71. package/dist/liquidity/orca.js.map +1 -1
  72. package/dist/liquidity/raydiumClmm.d.ts +6 -0
  73. package/dist/liquidity/raydiumClmm.d.ts.map +1 -1
  74. package/dist/liquidity/raydiumClmm.js +12 -5
  75. package/dist/liquidity/raydiumClmm.js.map +1 -1
  76. package/dist/lp.d.ts +55 -12
  77. package/dist/lp.d.ts.map +1 -1
  78. package/dist/lp.js +158 -70
  79. package/dist/lp.js.map +1 -1
  80. package/dist/lpMath.d.ts +22 -0
  81. package/dist/lpMath.d.ts.map +1 -1
  82. package/dist/lpMath.js +21 -0
  83. package/dist/lpMath.js.map +1 -1
  84. package/dist/portfolio.d.ts.map +1 -1
  85. package/dist/portfolio.js +3 -8
  86. package/dist/portfolio.js.map +1 -1
  87. package/dist/programs.d.ts +19 -0
  88. package/dist/programs.d.ts.map +1 -0
  89. package/dist/programs.js +175 -0
  90. package/dist/programs.js.map +1 -0
  91. package/dist/reclaim.d.ts +192 -0
  92. package/dist/reclaim.d.ts.map +1 -0
  93. package/dist/reclaim.js +399 -0
  94. package/dist/reclaim.js.map +1 -0
  95. package/dist/risk.js +2 -2
  96. package/dist/risk.js.map +1 -1
  97. package/dist/rpc.d.ts +30 -7
  98. package/dist/rpc.d.ts.map +1 -1
  99. package/dist/rpc.js +404 -111
  100. package/dist/rpc.js.map +1 -1
  101. package/dist/simulate.d.ts +106 -0
  102. package/dist/simulate.d.ts.map +1 -0
  103. package/dist/simulate.js +395 -0
  104. package/dist/simulate.js.map +1 -0
  105. package/dist/source.d.ts +8 -4
  106. package/dist/source.d.ts.map +1 -1
  107. package/dist/source.js +11 -4
  108. package/dist/source.js.map +1 -1
  109. package/dist/subpaths/approvals.d.ts +3 -3
  110. package/dist/subpaths/approvals.d.ts.map +1 -1
  111. package/dist/subpaths/approvals.js.map +1 -1
  112. package/dist/subpaths/claim.d.ts +31 -0
  113. package/dist/subpaths/claim.d.ts.map +1 -0
  114. package/dist/subpaths/claim.js +31 -0
  115. package/dist/subpaths/claim.js.map +1 -0
  116. package/dist/subpaths/history.d.ts +21 -0
  117. package/dist/subpaths/history.d.ts.map +1 -0
  118. package/dist/subpaths/history.js +22 -0
  119. package/dist/subpaths/history.js.map +1 -0
  120. package/dist/subpaths/lp.d.ts +2 -2
  121. package/dist/subpaths/lp.d.ts.map +1 -1
  122. package/dist/subpaths/lp.js +2 -2
  123. package/dist/subpaths/lp.js.map +1 -1
  124. package/dist/subpaths/reclaim.d.ts +34 -0
  125. package/dist/subpaths/reclaim.d.ts.map +1 -0
  126. package/dist/subpaths/reclaim.js +34 -0
  127. package/dist/subpaths/reclaim.js.map +1 -0
  128. package/dist/subpaths/simulate.d.ts +22 -0
  129. package/dist/subpaths/simulate.d.ts.map +1 -0
  130. package/dist/subpaths/simulate.js +23 -0
  131. package/dist/subpaths/simulate.js.map +1 -0
  132. package/dist/swap/index.js +3 -3
  133. package/dist/swap/index.js.map +1 -1
  134. package/dist/tokenDetails.d.ts +12 -0
  135. package/dist/tokenDetails.d.ts.map +1 -0
  136. package/dist/tokenDetails.js +196 -0
  137. package/dist/tokenDetails.js.map +1 -0
  138. package/dist/tokenMeta.d.ts +63 -0
  139. package/dist/tokenMeta.d.ts.map +1 -0
  140. package/dist/tokenMeta.js +226 -0
  141. package/dist/tokenMeta.js.map +1 -0
  142. package/dist/tradeCheck.js +3 -3
  143. package/dist/tradeCheck.js.map +1 -1
  144. package/dist/util.d.ts +22 -0
  145. package/dist/util.d.ts.map +1 -0
  146. package/dist/util.js +107 -0
  147. package/dist/util.js.map +1 -0
  148. package/dist/write/chain.d.ts +51 -0
  149. package/dist/write/chain.d.ts.map +1 -0
  150. package/dist/write/chain.js +184 -0
  151. package/dist/write/chain.js.map +1 -0
  152. package/dist/write/collect.js +2 -2
  153. package/dist/write/collect.js.map +1 -1
  154. package/dist/write/errors.d.ts +10 -0
  155. package/dist/write/errors.d.ts.map +1 -0
  156. package/dist/write/errors.js +77 -0
  157. package/dist/write/errors.js.map +1 -0
  158. package/dist/write/instructions.d.ts +2 -0
  159. package/dist/write/instructions.d.ts.map +1 -1
  160. package/dist/write/instructions.js +16 -0
  161. package/dist/write/instructions.js.map +1 -1
  162. package/dist/write/pack.d.ts +28 -0
  163. package/dist/write/pack.d.ts.map +1 -0
  164. package/dist/write/pack.js +125 -0
  165. package/dist/write/pack.js.map +1 -0
  166. package/dist/write/send.d.ts +23 -9
  167. package/dist/write/send.d.ts.map +1 -1
  168. package/dist/write/send.js +53 -351
  169. package/dist/write/send.js.map +1 -1
  170. package/dist/write/tracker.d.ts +24 -0
  171. package/dist/write/tracker.d.ts.map +1 -0
  172. package/dist/write/tracker.js +129 -0
  173. package/dist/write/tracker.js.map +1 -0
  174. package/package.json +21 -1
  175. package/src/accountReader.ts +187 -0
  176. package/src/address.ts +41 -6
  177. package/src/approvals.ts +36 -44
  178. package/src/balances.ts +678 -0
  179. package/src/batchPlan.ts +117 -0
  180. package/src/bytes.ts +89 -0
  181. package/src/claim.ts +327 -0
  182. package/src/client.ts +59 -1239
  183. package/src/clientConfig.ts +12 -0
  184. package/src/decode.ts +176 -0
  185. package/src/describe.ts +77 -0
  186. package/src/fees.ts +2 -9
  187. package/src/history.ts +325 -0
  188. package/src/historyHelius.ts +136 -0
  189. package/src/index.ts +13 -1
  190. package/src/layout.ts +63 -82
  191. package/src/liquidity/common.ts +2 -2
  192. package/src/liquidity/orca.ts +15 -5
  193. package/src/liquidity/raydiumClmm.ts +13 -5
  194. package/src/lp.ts +226 -75
  195. package/src/lpMath.ts +38 -0
  196. package/src/portfolio.ts +8 -11
  197. package/src/programs.ts +216 -0
  198. package/src/reclaim.ts +550 -0
  199. package/src/risk.ts +2 -2
  200. package/src/rpc.ts +476 -118
  201. package/src/simulate.ts +517 -0
  202. package/src/source.ts +14 -5
  203. package/src/subpaths/approvals.ts +3 -2
  204. package/src/subpaths/claim.ts +54 -0
  205. package/src/subpaths/history.ts +38 -0
  206. package/src/subpaths/lp.ts +5 -1
  207. package/src/subpaths/reclaim.ts +58 -0
  208. package/src/subpaths/simulate.ts +37 -0
  209. package/src/swap/index.ts +3 -3
  210. package/src/tokenDetails.ts +240 -0
  211. package/src/tokenMeta.ts +270 -0
  212. package/src/tradeCheck.ts +3 -3
  213. package/src/util.ts +110 -0
  214. package/src/write/chain.ts +218 -0
  215. package/src/write/collect.ts +2 -2
  216. package/src/write/errors.ts +82 -0
  217. package/src/write/instructions.ts +17 -0
  218. package/src/write/pack.ts +142 -0
  219. package/src/write/send.ts +74 -407
  220. package/src/write/tracker.ts +152 -0
@@ -0,0 +1,524 @@
1
+ // 余额的三种查法(ATA、扫描全部代币账户、按 mint 查全部代币账户)、持仓列表和补读代币信息
2
+ import { base64 } from '@scure/base';
3
+ import { attachSlot, FAILED, queryContext } from './accountReader.js';
4
+ import { getAssociatedTokenAddress, getMetadataAddress, InvalidAddressError, isAddress } from './address.js';
5
+ import { NATIVE_MINT, SOL_DECIMALS, TOKEN_2022_PROGRAM_ID, TOKEN_PROGRAM_ID } from './constants.js';
6
+ import { formatUnits, parseTokenAccount } from './layout.js';
7
+ import { RpcError } from './rpc.js';
8
+ import { nftsOf } from './tokenDetails.js';
9
+ import { getMeta, isSmallOwner, learnMeta, learnOwner, setMeta } from './tokenMeta.js';
10
+ import { SharedAbort } from './util.js';
11
+ export const TOKEN_PROGRAMS = [TOKEN_PROGRAM_ID, TOKEN_2022_PROGRAM_ID];
12
+ // 用 Map:普通对象会让 'constructor' 等原型上的名字通过校验
13
+ const PROGRAM_ALIASES = new Map([
14
+ ['spl', TOKEN_PROGRAM_ID],
15
+ ['token-2022', TOKEN_2022_PROGRAM_ID],
16
+ [TOKEN_PROGRAM_ID, TOKEN_PROGRAM_ID],
17
+ [TOKEN_2022_PROGRAM_ID, TOKEN_2022_PROGRAM_ID],
18
+ ]);
19
+ /**
20
+ * 简写 / 程序地址转成程序地址(顺序固定为 Token、Token-2022)。
21
+ * 不认识的值和空数组报错,避免拼错或漏选时悄悄过滤掉全部代币
22
+ */
23
+ export function resolvePrograms(tokenPrograms) {
24
+ if (tokenPrograms === undefined) {
25
+ return TOKEN_PROGRAMS;
26
+ }
27
+ if (tokenPrograms.length === 0) {
28
+ throw new Error(`tokenPrograms is empty (expected 'spl' and / or 'token-2022'; omit it to include both)`);
29
+ }
30
+ const wanted = new Set(tokenPrograms.map((value) => {
31
+ const program = PROGRAM_ALIASES.get(value);
32
+ if (!program) {
33
+ throw new Error(`Unknown token program: ${value} (expected 'spl', 'token-2022' or a token program id)`);
34
+ }
35
+ return program;
36
+ }));
37
+ return TOKEN_PROGRAMS.filter((program) => wanted.has(program));
38
+ }
39
+ /** 所属程序已知且不在允许范围内 */
40
+ export function isExcluded(tokenProgram, allowed) {
41
+ return tokenProgram !== undefined && !allowed.includes(tokenProgram);
42
+ }
43
+ /** 按 mint 汇总后精度 0、数量 1 的持仓视为 NFT(ownerTokens 与 ownerNfts 共用) */
44
+ export function isNftHolding(holding) {
45
+ return holding.decimals === 0 && holding.amount === 1n;
46
+ }
47
+ const metaLoads = new Map();
48
+ /** jsonParsed 结果里的一个代币账户:节点解析好的直接取;退回 base64 的自己解析(这时没有 decimals,要从 mint 账户补) */
49
+ export function readTokenEntry(entry) {
50
+ const data = entry.account?.data;
51
+ if (data && !Array.isArray(data) && typeof data === 'object') {
52
+ const info = data.parsed?.info;
53
+ if (info?.mint && info.tokenAmount?.decimals !== undefined) {
54
+ return { mint: info.mint, amount: BigInt(info.tokenAmount.amount ?? '0'), decimals: info.tokenAmount.decimals };
55
+ }
56
+ }
57
+ const encoded = Array.isArray(data) ? (data[1] === 'base64' ? data[0] : undefined) : typeof data === 'string' ? data : undefined;
58
+ if (encoded === undefined) {
59
+ return null;
60
+ }
61
+ try {
62
+ const parsed = parseTokenAccount(base64.decode(encoded));
63
+ return { mint: parsed.mint, amount: parsed.amount, decimals: undefined };
64
+ }
65
+ catch {
66
+ return null;
67
+ }
68
+ }
69
+ export function balancesOf(rc, ctx, owner, mints, options, programs) {
70
+ const withSymbol = options.symbol ?? false;
71
+ if (mints === undefined || options.scan) {
72
+ return scanBalances(rc, ctx, owner, mints, withSymbol, programs);
73
+ }
74
+ if (options.accounts === 'all') {
75
+ return mintAccountBalances(rc, ctx, owner, mints, withSymbol, programs);
76
+ }
77
+ return ataBalances(rc, ctx, [{ owner, mints }], withSymbol, programs).then((lists) => lists[0]);
78
+ }
79
+ /** ATA 模式:所有钱包的 主币账户 / mint / 元数据 / ATA 一起读,结果按钱包分组 */
80
+ export async function ataBalances(rc, ctx, queries, withSymbol, allowed) {
81
+ const scope = rc.scope;
82
+ // 要数据的账户(mint、元数据、ATA)一组;钱包账户只要 lamports:已知是普通钱包(系统账户 / 不存在,数据为空)的
83
+ // 放进同一组(一个请求、同一个快照),其余(可能是数据很大的程序账户)单独一组带 dataSlice——同时发出,合并在同一个 JSON-RPC 批量请求里
84
+ const addresses = [];
85
+ const owners = [];
86
+ const plans = queries.map(({ owner, mints }) => mints.map((mint) => ataPlan(rc, owner, mint, withSymbol, allowed, addresses, owners)));
87
+ const [dataMap, ownerMap] = await rc.reader.fetchGroups([
88
+ { addresses, lamportsOnly: false },
89
+ { addresses: owners, lamportsOnly: true },
90
+ ], false, ctx);
91
+ // 记下钱包账户是否数据为空:单独读的按结果学习;已放进代币那组的,读到不再是系统账户(如被分配给程序)时移除,下次单独读
92
+ for (const owner of new Set(queries.map((q) => q.owner))) {
93
+ // null(账户不存在)也是结果,不能用 ?? 落到另一组
94
+ const account = ownerMap?.has(owner) ? ownerMap.get(owner) : dataMap?.get(owner);
95
+ if (account !== undefined && account !== FAILED) {
96
+ learnOwner(scope, owner, account);
97
+ }
98
+ }
99
+ const accounts = addresses.map((address) => dataMap?.get(address) ?? null);
100
+ const lamportsOf = (owner) => (ownerMap?.has(owner) ? ownerMap.get(owner) : dataMap?.get(owner))?.lamports ?? 0n;
101
+ return plans.map((plan) => plan.flatMap((item) => ataResult(rc, item, accounts, lamportsOf, withSymbol, allowed)));
102
+ }
103
+ export function ataPlan(rc, owner, mint, withSymbol, allowed, addresses, owners) {
104
+ const scope = rc.scope;
105
+ if (rc.nativeMints.has(mint)) {
106
+ ;
107
+ (isSmallOwner(scope, owner) ? addresses : owners).push(owner);
108
+ return { kind: 'native', mint, owner };
109
+ }
110
+ if (!isAddress(mint)) {
111
+ return { kind: 'invalid', mint };
112
+ }
113
+ const meta = getMeta(scope, mint);
114
+ // 导入的缓存里的所属程序没确认过:按未知处理(记错时不会让余额恒为 0)
115
+ const program = meta.programUnverified ? undefined : meta.tokenProgram;
116
+ if (isExcluded(program, allowed)) {
117
+ return { kind: 'excluded', mint };
118
+ }
119
+ const needMint = meta.decimals === undefined || program === undefined || (withSymbol && meta.symbol === undefined);
120
+ // 所属程序未知时只推导允许的程序的 ATA,读到 mint 账户后再确认
121
+ const programs = program ? [program] : allowed;
122
+ return {
123
+ kind: 'token',
124
+ mint,
125
+ mintIndex: needMint ? addresses.push(mint) - 1 : -1,
126
+ metadataIndex: withSymbol && meta.symbol === undefined ? addresses.push(getMetadataAddress(mint)) - 1 : -1,
127
+ atas: programs.map((program) => ({ program, index: addresses.push(getAssociatedTokenAddress(owner, mint, program)) - 1 })),
128
+ };
129
+ }
130
+ export function ataResult(rc, item, accounts, lamportsOf, withSymbol, allowed) {
131
+ const scope = rc.scope;
132
+ if (item.kind === 'native') {
133
+ const lamports = lamportsOf(item.owner);
134
+ return [
135
+ withSymbolField({ token: item.mint, native: true, balance: lamports.toString(), decimals: SOL_DECIMALS, formatted: formatUnits(lamports, SOL_DECIMALS), tokenProgram: null, success: true }, withSymbol, 'SOL'),
136
+ ];
137
+ }
138
+ if (item.kind === 'excluded') {
139
+ return [];
140
+ }
141
+ if (item.kind === 'invalid') {
142
+ return [failedBalance(item.mint, 'invalid-address', null, withSymbol, null)];
143
+ }
144
+ const mintAccount = item.mintIndex === -1 ? null : (accounts[item.mintIndex] ?? null);
145
+ const meta = learnMeta(scope, item.mint, mintAccount, item.metadataIndex === -1 ? null : (accounts[item.metadataIndex] ?? null), item.metadataIndex !== -1 && item.mintIndex !== -1);
146
+ // 代币账户由哪个程序持有就是哪个;mint 账户的 owner 也能确定程序。
147
+ // 所属程序未知时推导了两个程序的 ATA,但一个 mint 只属于一个程序,另一个程序下不可能有这个 mint 的代币账户:找到就结束
148
+ let amount = 0n;
149
+ for (const ata of item.atas) {
150
+ const account = accounts[ata.index];
151
+ if (!account || account.owner !== ata.program) {
152
+ continue;
153
+ }
154
+ try {
155
+ amount = parseTokenAccount(account.data).amount;
156
+ }
157
+ catch {
158
+ continue; // 不是代币账户
159
+ }
160
+ if (meta.tokenProgram === undefined) {
161
+ setMeta(scope, item.mint, { tokenProgram: ata.program });
162
+ meta.tokenProgram = ata.program;
163
+ }
164
+ break;
165
+ }
166
+ // 读到 mint 账户后才知道是不允许的程序
167
+ if (isExcluded(meta.tokenProgram, allowed)) {
168
+ return [];
169
+ }
170
+ if (meta.decimals === undefined) {
171
+ // decimals 未知时一定读了 mint 账户:不存在 / 存在但不是 mint
172
+ return [failedBalance(item.mint, mintAccount ? 'not-token' : 'not-found', meta.tokenProgram ?? null, withSymbol, meta.symbol ?? null)];
173
+ }
174
+ return [
175
+ withSymbolField({
176
+ token: item.mint,
177
+ native: false,
178
+ balance: amount.toString(),
179
+ decimals: meta.decimals,
180
+ formatted: formatUnits(amount, meta.decimals),
181
+ tokenProgram: meta.tokenProgram ?? null,
182
+ success: true,
183
+ }, withSymbol, meta.symbol ?? null),
184
+ ];
185
+ }
186
+ /** 扫描持有人的 SOL 余额和全部代币账户(默认 Token + Token-2022,只请求 programs 里的程序),同一代币的多个账户合计 */
187
+ export async function scanHoldings(rc, ctx, owner, programs = TOKEN_PROGRAMS, withSymbol = false) {
188
+ const [lamports, ...results] = await Promise.all([
189
+ rc.reader.call(ctx, 'getBalance', [owner, { commitment: rc.commitment }]),
190
+ ...programs.map((programId) => rc.reader.call(ctx, 'getTokenAccountsByOwner', [owner, { programId }, { encoding: 'jsonParsed', commitment: rc.commitment }])),
191
+ ]);
192
+ const entries = programs.flatMap((program, i) => (results[i]?.value ?? []).map((entry) => ({ program, entry })));
193
+ const held = await collectHoldings(rc, ctx, entries, withSymbol);
194
+ return { sol: BigInt(lamports.value), held };
195
+ }
196
+ /**
197
+ * 把 getTokenAccountsByOwner(jsonParsed)的结果按 mint 汇总。节点解析不了、退回 base64 的账户自己解析,
198
+ * decimals 读 mint 账户补上(不丢弃,也不会把余额算成 0);mint 读不到 decimals 时才跳过
199
+ */
200
+ export async function collectHoldings(rc, ctx, entries, withSymbol = false) {
201
+ const scope = rc.scope;
202
+ const read = entries.flatMap(({ program, entry }) => {
203
+ const token = readTokenEntry(entry);
204
+ return token ? [{ ...token, program: entry.account?.owner || program }] : [];
205
+ });
206
+ read.forEach(({ mint, decimals, program }) => decimals !== undefined && program !== undefined && setMeta(scope, mint, { decimals, tokenProgram: program }));
207
+ // 缺 decimals 或所属程序(节点没给账户 owner)的读 mint 账户补上;需要 symbol 时一起读,后面不必再读一遍
208
+ const unknown = [
209
+ ...new Set(read.filter((t) => getMeta(scope, t.mint).decimals === undefined || (t.program === undefined && getMeta(scope, t.mint).tokenProgram === undefined)).map((t) => t.mint)),
210
+ ];
211
+ if (unknown.length) {
212
+ // 补读 mint 不受 minContextSlot 约束、不计入扫描的 slot(decimals / 所属程序不会因为刚成交而变化);
213
+ // 节点问题时不让整次扫描失败,读不到的代币跳过
214
+ await loadMeta(rc, { signal: ctx.signal }, unknown, withSymbol, true);
215
+ }
216
+ const held = new Map();
217
+ for (const { mint, amount, program: entryProgram } of read) {
218
+ const meta = getMeta(scope, mint);
219
+ const decimals = meta.decimals;
220
+ const program = entryProgram ?? (meta.programUnverified ? undefined : meta.tokenProgram);
221
+ if (decimals === undefined || program === undefined) {
222
+ continue;
223
+ }
224
+ const prev = held.get(mint);
225
+ held.set(mint, { amount: (prev?.amount ?? 0n) + amount, decimals, program, accounts: (prev?.accounts ?? 0) + 1 });
226
+ }
227
+ return held;
228
+ }
229
+ export async function scanBalances(rc, ctx, owner, mints, withSymbol, allowed) {
230
+ // held 里只有允许的程序的代币
231
+ const { sol, held } = await scanHoldings(rc, ctx, owner, allowed, withSymbol);
232
+ // Wrapped SOL(So111…112)默认按原生 SOL 处理:余额列表里只有一项 SOL,不再列出 wSOL 代币账户
233
+ // 第一项是主币:用 nativeMints 里的地址(nativeMints 不含 So111…112 时 wSOL 作为普通代币列出,不能再拿它当 SOL)
234
+ const nativeLead = rc.nativeMints.has(NATIVE_MINT) ? NATIVE_MINT : rc.nativeMints.values().next().value;
235
+ const targets = mints ?? [
236
+ ...(nativeLead === undefined ? [] : [nativeLead]),
237
+ ...[...held].filter(([mint, h]) => h.amount > 0n && !rc.nativeMints.has(mint)).map(([mint]) => mint),
238
+ ];
239
+ // 没持有的代币(拿不到 decimals)和缺 symbol 的代币:只读 mint / 元数据账户补上,不需要 ATA
240
+ const failures = await loadMeta(rc, ctx, targets.filter((mint) => !rc.nativeMints.has(mint) && isAddress(mint)), withSymbol);
241
+ return targets.flatMap((mint) => {
242
+ if (rc.nativeMints.has(mint)) {
243
+ return [
244
+ withSymbolField({ token: mint, native: true, balance: sol.toString(), decimals: SOL_DECIMALS, formatted: formatUnits(sol, SOL_DECIMALS), tokenProgram: null, success: true }, withSymbol, 'SOL'),
245
+ ];
246
+ }
247
+ return heldBalance(rc, mint, held.get(mint), failures, withSymbol, allowed);
248
+ });
249
+ }
250
+ /**
251
+ * 指定 mints、统计全部代币账户:每个代币一次按 mint 过滤的 getTokenAccountsByOwner(同一 tick 发出,自动合并)。
252
+ * mint 不存在 / 不是代币时节点返回参数错误,按“没持有”处理,再由 #loadMeta 确认原因
253
+ */
254
+ export async function mintAccountBalances(rc, ctx, owner, mints, withSymbol, allowed) {
255
+ const scope = rc.scope;
256
+ // 导入的、未经链上确认的所属程序不用来排除代币(可能记错):照常查询,从链上学到后再按程序过滤
257
+ const queried = [
258
+ ...new Set(mints.filter((mint) => {
259
+ const meta = getMeta(scope, mint);
260
+ return !rc.nativeMints.has(mint) && isAddress(mint) && (meta.programUnverified || !isExcluded(meta.tokenProgram, allowed));
261
+ })),
262
+ ];
263
+ const [lamports, ...results] = await Promise.all([
264
+ mints.some((mint) => rc.nativeMints.has(mint))
265
+ ? rc.reader.call(ctx, 'getBalance', [owner, { commitment: rc.commitment }])
266
+ : Promise.resolve(null),
267
+ ...queried.map((mint) => rc.reader.call(ctx, 'getTokenAccountsByOwner', [owner, { mint }, { encoding: 'jsonParsed', commitment: rc.commitment }]).catch((err) => {
268
+ // "Invalid param: could not find mint" 等参数错误:mint 不存在或不是代币;节点问题照常抛出
269
+ if (err instanceof RpcError && !err.nodeFault && err.code === -32602)
270
+ return null;
271
+ throw err;
272
+ })),
273
+ ]);
274
+ const held = await collectHoldings(rc, ctx, queried.flatMap((_, i) => (results[i]?.value ?? []).map((entry) => ({ program: entry.account?.owner, entry }))), withSymbol);
275
+ // 没持有的代币补 decimals(同时确认 mint 是否存在),需要时补 symbol
276
+ const failures = await loadMeta(rc, ctx, queried, withSymbol);
277
+ const sol = BigInt(lamports?.value ?? 0);
278
+ return mints.flatMap((mint) => {
279
+ if (rc.nativeMints.has(mint)) {
280
+ return [
281
+ withSymbolField({ token: mint, native: true, balance: sol.toString(), decimals: SOL_DECIMALS, formatted: formatUnits(sol, SOL_DECIMALS), tokenProgram: null, success: true }, withSymbol, 'SOL'),
282
+ ];
283
+ }
284
+ return heldBalance(rc, mint, held.get(mint), failures, withSymbol, allowed);
285
+ });
286
+ }
287
+ /** 扫描类查询(scan / accounts: 'all')里单个代币的结果;不允许的程序返回空数组 */
288
+ export function heldBalance(rc, mint, h, failures, withSymbol, allowed) {
289
+ const scope = rc.scope;
290
+ if (!isAddress(mint)) {
291
+ return [failedBalance(mint, 'invalid-address', null, withSymbol, null)];
292
+ }
293
+ const meta = getMeta(scope, mint);
294
+ if (!h) {
295
+ // 没持有(或属于不允许的程序):余额为 0;decimals 来自 mint 账户
296
+ if (isExcluded(meta.tokenProgram, allowed)) {
297
+ return [];
298
+ }
299
+ if (meta.decimals === undefined) {
300
+ const failure = failures.get(mint);
301
+ return [failedBalance(mint, failure === 'not-token' ? 'not-token' : 'not-found', meta.tokenProgram ?? null, withSymbol, meta.symbol ?? null)];
302
+ }
303
+ return [withSymbolField({ token: mint, native: false, balance: '0', decimals: meta.decimals, formatted: '0', tokenProgram: meta.tokenProgram ?? null, success: true }, withSymbol, meta.symbol ?? null)];
304
+ }
305
+ if (isExcluded(h.program, allowed)) {
306
+ return [];
307
+ }
308
+ return [
309
+ withSymbolField({ token: mint, native: false, balance: h.amount.toString(), decimals: h.decimals, formatted: formatUnits(h.amount, h.decimals), tokenProgram: h.program, success: true }, withSymbol, meta.symbol ?? null),
310
+ ];
311
+ }
312
+ /**
313
+ * 补齐 decimals / 所属程序(以及需要时的 symbol / name):只读缺的 mint 账户和元数据账户。
314
+ * 同一 mint 正在被别的查询读取时共用那次读取(不重复发请求)。
315
+ * 返回没能补上 decimals 的 mint 及原因:failed(tolerant 为 true 时的节点问题,信息保持未知、不写缓存)、not-found、not-token;
316
+ * tolerant 为 false 时节点问题直接抛出
317
+ */
318
+ export async function loadMeta(rc, ctx, mints, withSymbol, tolerant = false) {
319
+ const scope = rc.scope;
320
+ // 查询已取消(外层已经 reject):不再发起或加入读取
321
+ if (ctx.signal?.aborted) {
322
+ throw ctx.signal.reason;
323
+ }
324
+ const waits = [];
325
+ const plan = [];
326
+ for (const mint of new Set(mints)) {
327
+ const meta = getMeta(scope, mint);
328
+ const needSymbol = withSymbol && meta.symbol === undefined;
329
+ if (meta.decimals !== undefined && meta.tokenProgram !== undefined && !needSymbol) {
330
+ continue;
331
+ }
332
+ // 正在读、slot 约束相同、且这次读取能补上需要的信息(要 symbol 时得包含元数据账户):加入它
333
+ const running = metaLoads.get(`${scope}:${mint}`);
334
+ if (running && running.minContextSlot === ctx.minContextSlot && (running.withSymbol || !needSymbol) && (!running.abort || running.abort.join(ctx.signal))) {
335
+ waits.push({ mint, promise: running.promise });
336
+ }
337
+ else {
338
+ plan.push({ mint, metadata: needSymbol ? getMetadataAddress(mint) : null });
339
+ }
340
+ }
341
+ if (plan.length) {
342
+ waits.push(...startMetaLoad(rc, ctx, plan));
343
+ }
344
+ const failures = new Map();
345
+ const outcomes = await Promise.all(waits.map((w) => w.promise));
346
+ outcomes.forEach((outcome, i) => {
347
+ const mint = waits[i].mint;
348
+ if (outcome === 'ok') {
349
+ return;
350
+ }
351
+ if (typeof outcome === 'object') {
352
+ if (!tolerant) {
353
+ throw outcome.error;
354
+ }
355
+ failures.set(mint, 'failed');
356
+ return;
357
+ }
358
+ failures.set(mint, outcome);
359
+ });
360
+ return failures;
361
+ }
362
+ /**
363
+ * 发起一次代币信息读取并登记为在途(结束后移除)。总是按 tolerant 读:节点问题时把错误带在结果里,
364
+ * 由各调用方按自己的 tolerant 决定抛出还是标记 failed。所有加入的调用方都取消后才中止
365
+ */
366
+ export function startMetaLoad(rc, ctx, plan) {
367
+ const scope = rc.scope;
368
+ const shared = ctx.signal ? new SharedAbort() : null;
369
+ shared?.join(ctx.signal);
370
+ const loadCtx = { ...ctx, signal: shared?.signal };
371
+ const failure = {};
372
+ const loaded = rc.reader.fetchAccounts(plan.flatMap(({ mint, metadata }) => (metadata ? [mint, metadata] : [mint])), true, loadCtx, failure).then((fetched) => {
373
+ // 读到的 slot 记回发起方的查询
374
+ if (loadCtx.slot !== undefined) {
375
+ ctx.slot = ctx.slot === undefined ? loadCtx.slot : Math.min(ctx.slot, loadCtx.slot);
376
+ }
377
+ const outcomes = new Map();
378
+ for (const { mint, metadata } of plan) {
379
+ const mintAccount = fetched.get(mint);
380
+ const metadataAccount = metadata ? fetched.get(metadata) : null;
381
+ // mint 和元数据账户可能落在不同的请求里:任一个没读到都算失败,不能当成“没有元数据”缓存
382
+ if (mintAccount === FAILED || metadataAccount === FAILED) {
383
+ outcomes.set(mint, { error: failure.error });
384
+ continue;
385
+ }
386
+ const learned = learnMeta(scope, mint, mintAccount ?? null, metadataAccount ?? null, metadata !== null);
387
+ outcomes.set(mint, learned.decimals === undefined ? (mintAccount ? 'not-token' : 'not-found') : 'ok');
388
+ }
389
+ return outcomes;
390
+ });
391
+ const entries = plan.map(({ mint, metadata }) => {
392
+ const key = `${scope}:${mint}`;
393
+ const promise = loaded.then((outcomes) => outcomes.get(mint));
394
+ const load = { withSymbol: metadata !== null, minContextSlot: ctx.minContextSlot, abort: shared, promise };
395
+ metaLoads.set(key, load);
396
+ const remove = () => {
397
+ if (metaLoads.get(key) === load) {
398
+ metaLoads.delete(key);
399
+ }
400
+ };
401
+ promise.then(remove, remove);
402
+ return { mint, promise };
403
+ });
404
+ loaded.then(() => shared?.done(), () => shared?.done());
405
+ return entries;
406
+ }
407
+ export function withSymbolField(balance, withSymbol, symbol) {
408
+ return withSymbol ? { ...balance, symbol } : balance;
409
+ }
410
+ /** 失败项:余额为 0,带原因 */
411
+ export function failedBalance(token, error, tokenProgram, withSymbol, symbol) {
412
+ return { ...withSymbolField({ token, native: false, balance: '0', decimals: 0, formatted: '0', tokenProgram, success: false }, withSymbol, symbol), error };
413
+ }
414
+ /** 批量查多个地址的 SOL 余额(getMultipleAccounts 只读 lamports、不读回账户数据;账户不存在视为 0) */
415
+ export async function solBalancesOf(rc, addresses, options) {
416
+ const ctx = queryContext(options);
417
+ const balances = await rc.reader.lamports(addresses, ctx);
418
+ const list = addresses.map((address, i) => {
419
+ if (!isAddress(address)) {
420
+ return { address, balance: '0', formatted: '0', success: false, error: 'invalid-address' };
421
+ }
422
+ const lamports = balances[i] ?? 0n;
423
+ return { address, balance: lamports.toString(), formatted: formatUnits(lamports, SOL_DECIMALS), success: true };
424
+ });
425
+ return attachSlot(list, ctx, options);
426
+ }
427
+ /**
428
+ * 批量查余额(主币 SOL + SPL Token + Token-2022),返回原始余额、decimals 和换算后的数值。
429
+ *
430
+ * - 传 mints:本地推导 ATA,与 mint 账户一起用 getMultipleAccounts 读完,免费节点也能用;主币只读 lamports(dataSlice),另成一组同时发出
431
+ * - 传 mints 且 accounts: 'all':每个代币按 mint 过滤查 getTokenAccountsByOwner,统计全部代币账户(含非 ATA)
432
+ * - 不传 mints(或 scan: true):用 getTokenAccountsByOwner 扫描全部代币账户,返回所有余额大于 0 的代币
433
+ * - 失败项(success: false)带 error:invalid-address(mint 地址非法)/ not-found(mint 不存在)/ not-token(不是代币 mint)
434
+ * - tokenPrograms:只返回这些类型的代币,如 ['spl'] 不含 Token-2022(传了 mints 时,结果里去掉不符合的代币)
435
+ * - minContextSlot / withSlot:要求节点高度、返回读取时的 slot,见 SlotOptions
436
+ */
437
+ export async function balancesFor(rc, owner, mints, options) {
438
+ if (!isAddress(owner)) {
439
+ throw new InvalidAddressError(`Invalid owner address: ${owner}`, owner);
440
+ }
441
+ const ctx = queryContext(options);
442
+ const list = await balancesOf(rc, ctx, owner, mints, options, resolvePrograms(options.tokenPrograms));
443
+ return attachSlot(list, ctx, options);
444
+ }
445
+ /**
446
+ * 多个钱包一次查(如多钱包的持仓列表),结果与 queries 一一对应。
447
+ * ATA 模式(默认)下所有钱包的账户合并成一次(按 100 个一组的)getMultipleAccounts;
448
+ * scan / accounts: 'all' 时每个钱包各自查询(同一 tick 发出,合并成批量请求)。其他选项与 balances() 相同;
449
+ * withSlot 时所有钱包的结果带同一个 slot(整次查询的最小值)。任一 owner 非法时报错
450
+ *
451
+ * ```ts
452
+ * await sol.multiBalances([{ owner: a, mints: [NATIVE_MINT, USDC] }, { owner: b, mints: [USDC] }])
453
+ * ```
454
+ */
455
+ export async function multiBalancesOf(rc, queries, options) {
456
+ for (const { owner } of queries) {
457
+ if (!isAddress(owner)) {
458
+ throw new InvalidAddressError(`Invalid owner address: ${owner}`, owner);
459
+ }
460
+ }
461
+ const programs = resolvePrograms(options.tokenPrograms);
462
+ const ctx = queryContext(options);
463
+ const lists = options.scan || options.accounts === 'all'
464
+ ? await Promise.all(queries.map(({ owner, mints }) => balancesOf(rc, ctx, owner, mints, options, programs)))
465
+ : await ataBalances(rc, ctx, queries, options.symbol ?? false, programs);
466
+ return lists.map((list) => attachSlot(list, ctx, options));
467
+ }
468
+ /**
469
+ * 列出持有人拥有的全部代币(SOL 在第一位),带 name / symbol,适合做资产列表。
470
+ * 需要支持 getTokenAccountsByOwner 的节点(免费公共节点大多不支持)。
471
+ *
472
+ * - 默认不含 NFT(精度 0 且数量 1)和余额为 0 的代币账户(如已清空的 ATA),可用 includeNfts / includeZero 打开
473
+ * - accounts 是该代币的代币账户数量;大于 1 时余额为所有账户的合计
474
+ * - 顺序:SOL,然后 SPL Token 的代币,再然后 Token-2022 的代币(各自按节点返回的顺序;没有价格信息,不按价值排序)
475
+ * - tokenPrograms: ['spl'] 时不含 Token-2022 代币
476
+ * - withSlot 的 slot 只算余额扫描(元数据读取不计入)
477
+ */
478
+ export async function ownerTokensOf(rc, owner, options) {
479
+ if (!isAddress(owner)) {
480
+ throw new InvalidAddressError(`Invalid owner address: ${owner}`, owner);
481
+ }
482
+ const { metadata = true, includeNative = true, includeZero = false, includeNfts = false } = options;
483
+ const scope = rc.scope;
484
+ const ctx = queryContext(options);
485
+ const { sol, held } = await scanHoldings(rc, ctx, owner, resolvePrograms(options.tokenPrograms), metadata);
486
+ const scanSlot = ctx.slot;
487
+ // Wrapped SOL 是独立的代币账户(需要 unwrap 才是 SOL),资产列表里单独列出(native: false)
488
+ const tokens = [...held].filter(([, h]) => (includeZero || h.amount > 0n) && (includeNfts || !isNftHolding(h)));
489
+ // 元数据不受 minContextSlot 约束(不会因为刚成交而变化)
490
+ const failures = metadata ? await loadMeta(rc, { signal: options.signal }, tokens.map(([mint]) => mint), true, true) : new Map();
491
+ const list = tokens.map(([mint, h]) => {
492
+ const item = {
493
+ token: mint,
494
+ native: false,
495
+ balance: h.amount.toString(),
496
+ decimals: h.decimals,
497
+ formatted: formatUnits(h.amount, h.decimals),
498
+ tokenProgram: h.program,
499
+ accounts: h.accounts,
500
+ success: true,
501
+ };
502
+ if (!metadata) {
503
+ return item;
504
+ }
505
+ const meta = getMeta(scope, mint);
506
+ const status = failures.get(mint) === 'failed' ? 'failed' : meta.name == null && meta.symbol == null ? 'missing' : 'ok';
507
+ return { ...item, name: meta.name ?? null, symbol: meta.symbol ?? null, metadataStatus: status };
508
+ });
509
+ if (includeNative) {
510
+ const sol_ = { token: NATIVE_MINT, native: true, balance: sol.toString(), decimals: SOL_DECIMALS, formatted: formatUnits(sol, SOL_DECIMALS), tokenProgram: null, accounts: 1, success: true };
511
+ list.unshift(metadata ? { ...sol_, name: 'Solana', symbol: 'SOL', metadataStatus: 'ok' } : sol_);
512
+ }
513
+ return attachSlot(list, { slot: scanSlot }, options);
514
+ }
515
+ /** 查某地址持有的全部 NFT(扫描代币账户:数量 1、精度 0),再批量读元数据。需要支持 getTokenAccountsByOwner 的节点 */
516
+ export async function ownerNftsOf(rc, owner, options) {
517
+ if (!isAddress(owner)) {
518
+ throw new InvalidAddressError(`Invalid owner address: ${owner}`, owner);
519
+ }
520
+ const { held } = await scanHoldings(rc, { signal: options.signal }, owner);
521
+ const mints = [...held].filter(([, h]) => isNftHolding(h)).map(([mint]) => mint);
522
+ return mints.length ? (await nftsOf(rc, mints, options)).filter((nft) => nft.success) : [];
523
+ }
524
+ //# sourceMappingURL=balances.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"balances.js","sourceRoot":"","sources":["../src/balances.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * 批量计划的公共部分(/reclaim、/claim 用):一组“调用”(每个调用的指令原子执行)按交易大小打包、先模拟再发送。
3
+ * 打包规则同 batchCall(相邻的调用放进同一笔交易,不超过 1232 字节和 64 个账户)
4
+ */
5
+ import type { SolanaClient } from './client.js';
6
+ import type { SimulationResult } from './simulate.js';
7
+ import type { BatchCallOptions } from './write/batch.js';
8
+ import type { WriteResult } from './write/send.js';
9
+ import type { SignerInput } from './write/signer.js';
10
+ import type { Instruction } from './write/transaction.js';
11
+ /** 一个调用:要签名的地址(代币账户 / 仓位的 owner)和原子执行的指令 */
12
+ export interface PlannedCall {
13
+ owner: string;
14
+ instructions: Instruction[];
15
+ }
16
+ /** 把调用按顺序打包成交易,返回每笔交易包含的调用下标。单个调用放不进一笔交易时自己成一笔(发送时会报“transaction too large”);规则同 batchCall(packUnits) */
17
+ export declare function packCalls(payer: string, calls: readonly PlannedCall[], batchSize?: number): number[][];
18
+ export interface PlanSimulationOptions {
19
+ /** 手续费支付者,默认第一个调用的 owner */
20
+ feePayer?: string;
21
+ /** 每笔交易最多几个调用,默认不限(只受交易大小限制) */
22
+ batchSize?: number;
23
+ /** 额外要看的地址(如收款地址) */
24
+ watch?: readonly string[];
25
+ signal?: AbortSignal;
26
+ /** 算美元价值(/simulate 的 prices) */
27
+ prices?: boolean;
28
+ fetch?: typeof fetch;
29
+ }
30
+ export interface PlanSimulation {
31
+ /** 所有交易都模拟通过 */
32
+ success: boolean;
33
+ /** 打包后的每笔交易:包含的调用下标和 /simulate 的结果 */
34
+ transactions: Array<{
35
+ calls: number[];
36
+ simulation: SimulationResult;
37
+ }>;
38
+ /** 模拟失败的调用(整笔失败时逐个重新模拟找出来):下标和原因 */
39
+ failed: Array<{
40
+ index: number;
41
+ error: string;
42
+ }>;
43
+ /** 各笔交易手续费之和(lamports,十进制字符串) */
44
+ fee: string;
45
+ /** 手续费支付者的 SOL 变化之和(lamports,带符号,不含手续费:/simulate 的 SOL 余额变化已经把手续费加回) */
46
+ payerNativeDelta: string;
47
+ }
48
+ /** 打包后逐笔用 /simulate 模拟(不签名、不发送);失败的交易逐个调用重新模拟,找出是哪些调用失败 */
49
+ export declare function simulatePlan(client: SolanaClient, calls: readonly PlannedCall[], options?: PlanSimulationOptions): Promise<PlanSimulation>;
50
+ /** 用 from 签名发送:调用的 owner 都必须是签名者本人;一个调用失败不影响后面的(continueOnError),feePayer 可以替 owner 付手续费 */
51
+ export declare function sendCalls(client: SolanaClient, from: SignerInput, calls: readonly PlannedCall[], options?: BatchCallOptions): Promise<WriteResult[]>;
52
+ //# sourceMappingURL=batchPlan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batchPlan.d.ts","sourceRoot":"","sources":["../src/batchPlan.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE/C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAExD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAEzD,4CAA4C;AAC5C,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,YAAY,EAAE,WAAW,EAAE,CAAA;CAC5B;AAED,yGAAyG;AACzG,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,WAAW,EAAE,EAAE,SAAS,SAA2B,GAAG,MAAM,EAAE,EAAE,CAExH;AAED,MAAM,WAAW,qBAAqB;IACpC,4BAA4B;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,gCAAgC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,qBAAqB;IACrB,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACzB,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,gCAAgC;IAChC,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAA;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,gBAAgB;IAChB,OAAO,EAAE,OAAO,CAAA;IAChB,sCAAsC;IACtC,YAAY,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAAC,UAAU,EAAE,gBAAgB,CAAA;KAAE,CAAC,CAAA;IACtE,oCAAoC;IACpC,MAAM,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC/C,iCAAiC;IACjC,GAAG,EAAE,MAAM,CAAA;IACX,wEAAwE;IACxE,gBAAgB,EAAE,MAAM,CAAA;CACzB;AAED,2DAA2D;AAC3D,wBAAsB,YAAY,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,WAAW,EAAE,EAAE,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAAC,cAAc,CAAC,CA8CpJ;AAED,4FAA4F;AAC5F,wBAAsB,SAAS,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,WAAW,EAAE,EAAE,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAgB9J"}