@w3lib/evm-batch-call 0.6.0 → 0.8.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 +54 -0
- package/README.md +367 -3
- package/contracts/TokenProbe.sol +103 -0
- package/dist/aggregate.d.ts.map +1 -1
- package/dist/aggregate.js +114 -3
- package/dist/aggregate.js.map +1 -1
- package/dist/approvals.d.ts +169 -0
- package/dist/approvals.d.ts.map +1 -0
- package/dist/approvals.js +310 -0
- package/dist/approvals.js.map +1 -0
- package/dist/chains.d.ts.map +1 -1
- package/dist/chains.js +4 -0
- package/dist/chains.js.map +1 -1
- package/dist/dividends.d.ts +135 -0
- package/dist/dividends.d.ts.map +1 -0
- package/dist/dividends.js +253 -0
- package/dist/dividends.js.map +1 -0
- package/dist/fees.d.ts +97 -0
- package/dist/fees.d.ts.map +1 -0
- package/dist/fees.js +115 -0
- package/dist/fees.js.map +1 -0
- package/dist/history.d.ts +154 -0
- package/dist/history.d.ts.map +1 -0
- package/dist/history.js +247 -0
- package/dist/history.js.map +1 -0
- package/dist/historySources.d.ts +32 -0
- package/dist/historySources.d.ts.map +1 -0
- package/dist/historySources.js +319 -0
- package/dist/historySources.js.map +1 -0
- package/dist/http.d.ts +10 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +30 -0
- package/dist/http.js.map +1 -0
- package/dist/liquidity/v3.d.ts +2 -0
- package/dist/liquidity/v3.d.ts.map +1 -1
- package/dist/liquidity/v3.js +1 -1
- package/dist/liquidity/v3.js.map +1 -1
- package/dist/liquidity/v4.d.ts +21 -0
- package/dist/liquidity/v4.d.ts.map +1 -1
- package/dist/liquidity/v4.js +4 -3
- package/dist/liquidity/v4.js.map +1 -1
- package/dist/lp.d.ts +10 -1
- package/dist/lp.d.ts.map +1 -1
- package/dist/lp.js +19 -2
- package/dist/lp.js.map +1 -1
- package/dist/lpV4.d.ts +4 -0
- package/dist/lpV4.d.ts.map +1 -1
- package/dist/lpV4.js +27 -3
- package/dist/lpV4.js.map +1 -1
- package/dist/multicall.d.ts.map +1 -1
- package/dist/multicall.js +3 -0
- package/dist/multicall.js.map +1 -1
- package/dist/names.d.ts +55 -0
- package/dist/names.d.ts.map +1 -0
- package/dist/names.js +93 -0
- package/dist/names.js.map +1 -0
- package/dist/owner.d.ts +4 -26
- package/dist/owner.d.ts.map +1 -1
- package/dist/owner.js +7 -112
- package/dist/owner.js.map +1 -1
- package/dist/permit.d.ts +137 -0
- package/dist/permit.d.ts.map +1 -0
- package/dist/permit.js +355 -0
- package/dist/permit.js.map +1 -0
- package/dist/portfolio.d.ts +56 -0
- package/dist/portfolio.d.ts.map +1 -0
- package/dist/portfolio.js +54 -0
- package/dist/portfolio.js.map +1 -0
- package/dist/price.d.ts +95 -0
- package/dist/price.d.ts.map +1 -0
- package/dist/price.js +329 -0
- package/dist/price.js.map +1 -0
- package/dist/rewards/farms.d.ts +26 -0
- package/dist/rewards/farms.d.ts.map +1 -0
- package/dist/rewards/farms.js +210 -0
- package/dist/rewards/farms.js.map +1 -0
- package/dist/rewards/index.d.ts +42 -0
- package/dist/rewards/index.d.ts.map +1 -0
- package/dist/rewards/index.js +382 -0
- package/dist/rewards/index.js.map +1 -0
- package/dist/rewards/types.d.ts +170 -0
- package/dist/rewards/types.d.ts.map +1 -0
- package/dist/rewards/types.js +2 -0
- package/dist/rewards/types.js.map +1 -0
- package/dist/risk.d.ts +42 -0
- package/dist/risk.d.ts.map +1 -0
- package/dist/risk.js +134 -0
- package/dist/risk.js.map +1 -0
- package/dist/rpcNodes.d.ts.map +1 -1
- package/dist/rpcNodes.js +18 -0
- package/dist/rpcNodes.js.map +1 -1
- package/dist/simulate.d.ts +186 -0
- package/dist/simulate.d.ts.map +1 -0
- package/dist/simulate.js +559 -0
- package/dist/simulate.js.map +1 -0
- package/dist/simulateDecode.d.ts +33 -0
- package/dist/simulateDecode.d.ts.map +1 -0
- package/dist/simulateDecode.js +321 -0
- package/dist/simulateDecode.js.map +1 -0
- package/dist/smartAccount/account.d.ts +31 -0
- package/dist/smartAccount/account.d.ts.map +1 -0
- package/dist/smartAccount/account.js +33 -0
- package/dist/smartAccount/account.js.map +1 -0
- package/dist/smartAccount/clients.d.ts +77 -0
- package/dist/smartAccount/clients.d.ts.map +1 -0
- package/dist/smartAccount/clients.js +122 -0
- package/dist/smartAccount/clients.js.map +1 -0
- package/dist/smartAccount/eip5792.d.ts +77 -0
- package/dist/smartAccount/eip5792.d.ts.map +1 -0
- package/dist/smartAccount/eip5792.js +152 -0
- package/dist/smartAccount/eip5792.js.map +1 -0
- package/dist/smartAccount/send.d.ts +40 -0
- package/dist/smartAccount/send.d.ts.map +1 -0
- package/dist/smartAccount/send.js +271 -0
- package/dist/smartAccount/send.js.map +1 -0
- package/dist/smartAccount/userOp.d.ts +91 -0
- package/dist/smartAccount/userOp.d.ts.map +1 -0
- package/dist/smartAccount/userOp.js +124 -0
- package/dist/smartAccount/userOp.js.map +1 -0
- package/dist/subpaths/approvals.d.ts +26 -0
- package/dist/subpaths/approvals.d.ts.map +1 -0
- package/dist/subpaths/approvals.js +27 -0
- package/dist/subpaths/approvals.js.map +1 -0
- package/dist/subpaths/dividends.d.ts +28 -0
- package/dist/subpaths/dividends.d.ts.map +1 -0
- package/dist/subpaths/dividends.js +29 -0
- package/dist/subpaths/dividends.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 +22 -0
- package/dist/subpaths/history.d.ts.map +1 -0
- package/dist/subpaths/history.js +23 -0
- package/dist/subpaths/history.js.map +1 -0
- package/dist/subpaths/names.d.ts +35 -0
- package/dist/subpaths/names.d.ts.map +1 -0
- package/dist/subpaths/names.js +39 -0
- package/dist/subpaths/names.js.map +1 -0
- package/dist/subpaths/permit.d.ts +14 -0
- package/dist/subpaths/permit.d.ts.map +1 -0
- package/dist/subpaths/permit.js +14 -0
- package/dist/subpaths/permit.js.map +1 -0
- package/dist/subpaths/price.d.ts +38 -0
- package/dist/subpaths/price.d.ts.map +1 -0
- package/dist/subpaths/price.js +40 -0
- package/dist/subpaths/price.js.map +1 -0
- package/dist/subpaths/rewards.d.ts +27 -0
- package/dist/subpaths/rewards.d.ts.map +1 -0
- package/dist/subpaths/rewards.js +25 -0
- package/dist/subpaths/rewards.js.map +1 -0
- package/dist/subpaths/risk.d.ts +19 -0
- package/dist/subpaths/risk.d.ts.map +1 -0
- package/dist/subpaths/risk.js +20 -0
- package/dist/subpaths/risk.js.map +1 -0
- package/dist/subpaths/simulate.d.ts +25 -0
- package/dist/subpaths/simulate.d.ts.map +1 -0
- package/dist/subpaths/simulate.js +28 -0
- package/dist/subpaths/simulate.js.map +1 -0
- package/dist/subpaths/smart-account.d.ts +24 -0
- package/dist/subpaths/smart-account.d.ts.map +1 -0
- package/dist/subpaths/smart-account.js +24 -0
- package/dist/subpaths/smart-account.js.map +1 -0
- package/dist/subpaths/swap.d.ts +19 -0
- package/dist/subpaths/swap.d.ts.map +1 -0
- package/dist/subpaths/swap.js +20 -0
- package/dist/subpaths/swap.js.map +1 -0
- package/dist/swap.d.ts +168 -0
- package/dist/swap.d.ts.map +1 -0
- package/dist/swap.js +387 -0
- package/dist/swap.js.map +1 -0
- package/dist/tokenProbe.d.ts +3 -0
- package/dist/tokenProbe.d.ts.map +1 -0
- package/dist/tokenProbe.js +4 -0
- package/dist/tokenProbe.js.map +1 -0
- package/dist/write/batch.d.ts +34 -2
- package/dist/write/batch.d.ts.map +1 -1
- package/dist/write/batch.js +22 -3
- package/dist/write/batch.js.map +1 -1
- package/dist/write/collect.d.ts +9 -0
- package/dist/write/collect.d.ts.map +1 -1
- package/dist/write/collect.js +41 -1
- package/dist/write/collect.js.map +1 -1
- package/dist/write/send.d.ts +4 -0
- package/dist/write/send.d.ts.map +1 -1
- package/dist/write/send.js.map +1 -1
- package/dist/write/signer.d.ts +5 -1
- package/dist/write/signer.d.ts.map +1 -1
- package/dist/write/signer.js.map +1 -1
- package/dist/write/transfer.d.ts +5 -3
- package/dist/write/transfer.d.ts.map +1 -1
- package/dist/write/transfer.js +12 -6
- package/dist/write/transfer.js.map +1 -1
- package/dist/write/tron.d.ts +25 -0
- package/dist/write/tron.d.ts.map +1 -1
- package/dist/write/tron.js +26 -0
- package/dist/write/tron.js.map +1 -1
- package/package.json +73 -16
- package/src/aggregate.ts +110 -3
- package/src/approvals.ts +462 -0
- package/src/chains.ts +4 -0
- package/src/dividends.ts +360 -0
- package/src/fees.ts +201 -0
- package/src/history.ts +367 -0
- package/src/historySources.ts +360 -0
- package/src/http.ts +34 -0
- package/src/liquidity/v3.ts +1 -1
- package/src/liquidity/v4.ts +4 -3
- package/src/lp.ts +21 -2
- package/src/lpV4.ts +32 -2
- package/src/multicall.ts +3 -0
- package/src/names.ts +141 -0
- package/src/owner.ts +7 -138
- package/src/permit.ts +457 -0
- package/src/portfolio.ts +98 -0
- package/src/price.ts +415 -0
- package/src/rewards/farms.ts +229 -0
- package/src/rewards/index.ts +431 -0
- package/src/rewards/types.ts +179 -0
- package/src/risk.ts +166 -0
- package/src/rpcNodes.ts +18 -0
- package/src/simulate.ts +727 -0
- package/src/simulateDecode.ts +352 -0
- package/src/smartAccount/account.ts +63 -0
- package/src/smartAccount/clients.ts +180 -0
- package/src/smartAccount/eip5792.ts +187 -0
- package/src/smartAccount/send.ts +341 -0
- package/src/smartAccount/userOp.ts +180 -0
- package/src/subpaths/approvals.ts +48 -0
- package/src/subpaths/dividends.ts +47 -0
- package/src/subpaths/fees.ts +43 -0
- package/src/subpaths/history.ts +41 -0
- package/src/subpaths/names.ts +43 -0
- package/src/subpaths/permit.ts +39 -0
- package/src/subpaths/price.ts +60 -0
- package/src/subpaths/rewards.ts +46 -0
- package/src/subpaths/risk.ts +23 -0
- package/src/subpaths/simulate.ts +51 -0
- package/src/subpaths/smart-account.ts +40 -0
- package/src/subpaths/swap.ts +36 -0
- package/src/swap.ts +534 -0
- package/src/tokenProbe.ts +5 -0
- package/src/write/batch.ts +44 -5
- package/src/write/collect.ts +60 -1
- package/src/write/send.ts +4 -0
- package/src/write/signer.ts +5 -1
- package/src/write/transfer.ts +17 -10
- package/src/write/tron.ts +43 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/rewards/types.ts"],"names":[],"mappings":""}
|
package/dist/risk.d.ts
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { type LpProtocol } from './lp.js';
|
|
2
|
+
import type { Provider } from './provider.js';
|
|
3
|
+
export type ProbeStage = 'ok' | 'buy-failed' | 'transfer-failed' | 'approve-failed' | 'sell-failed';
|
|
4
|
+
export interface TokenRisk {
|
|
5
|
+
token: string;
|
|
6
|
+
/** 模拟用的 V2 协议和池子(代币 / 包装主币里包装主币一侧最深的);没有池子时为 null */
|
|
7
|
+
protocol: string | null;
|
|
8
|
+
pool: string | null;
|
|
9
|
+
/** 模拟到哪一步:ok 全部成功;buy-failed 买不进(可能还没开放交易、限制了合约地址);sell-failed 卖不出(貔貅盘) */
|
|
10
|
+
stage: ProbeStage | null;
|
|
11
|
+
/** 卖不出,或卖出税 ≥ 90% */
|
|
12
|
+
honeypot: boolean | null;
|
|
13
|
+
/** 税率(0~1):实际数量比 Router 报价少多少;对应的步骤没跑到时为 null */
|
|
14
|
+
buyTax: number | null;
|
|
15
|
+
sellTax: number | null;
|
|
16
|
+
transferTax: number | null;
|
|
17
|
+
/** 买入 / 卖出消耗的 gas(异常高可能有额外逻辑) */
|
|
18
|
+
buyGas: number | null;
|
|
19
|
+
sellGas: number | null;
|
|
20
|
+
/** EIP-1967 代理的实现合约(可升级:规则以后可以改);不是代理时为 null */
|
|
21
|
+
implementation: string | null;
|
|
22
|
+
/** owner():没有这个方法时为 null;零地址表示已放弃 */
|
|
23
|
+
owner: string | null;
|
|
24
|
+
/** 汇总的风险标记:honeypot、cannot-buy、high-buy-tax / high-sell-tax / high-transfer-tax(> 10%)、has-tax(> 0.5%)、proxy、owned、no-pool */
|
|
25
|
+
flags: string[];
|
|
26
|
+
}
|
|
27
|
+
export interface TokenRiskOptions {
|
|
28
|
+
/** 模拟买入用的主币数量(最小单位),默认包装主币储备的 1 / 1000,最多 1 个主币 */
|
|
29
|
+
amount?: bigint;
|
|
30
|
+
/** 用哪些 V2 协议的池子,默认这条链内置表里有 Router 的 V2 协议 */
|
|
31
|
+
protocols?: readonly LpProtocol[];
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* 检查代币的风险(每个代币一次模拟的 eth_call,加上一次 multicall 找池子、读 owner)。
|
|
35
|
+
*
|
|
36
|
+
* ```ts
|
|
37
|
+
* const [risk] = await tokenRisks(provider, [token])
|
|
38
|
+
* // { stage: 'ok', honeypot: false, buyTax: 0.05, sellTax: 0.05, transferTax: 0, flags: ['has-tax', 'owned'], … }
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
export declare function tokenRisks(provider: Provider, tokens: readonly string[], options?: TokenRiskOptions): Promise<TokenRisk[]>;
|
|
42
|
+
//# sourceMappingURL=risk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"risk.d.ts","sourceRoot":"","sources":["../src/risk.ts"],"names":[],"mappings":"AAOA,OAAO,EAAiC,KAAK,UAAU,EAAE,MAAM,SAAS,CAAA;AACxE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAK7C,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,YAAY,GAAG,iBAAiB,GAAG,gBAAgB,GAAG,aAAa,CAAA;AAEnG,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAA;IACb,qDAAqD;IACrD,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,2EAA2E;IAC3E,KAAK,EAAE,UAAU,GAAG,IAAI,CAAA;IACxB,qBAAqB;IACrB,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAA;IACxB,iDAAiD;IACjD,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,iCAAiC;IACjC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,gDAAgD;IAChD,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,qCAAqC;IACrC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,8HAA8H;IAC9H,KAAK,EAAE,MAAM,EAAE,CAAA;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,mDAAmD;IACnD,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,6CAA6C;IAC7C,SAAS,CAAC,EAAE,SAAS,UAAU,EAAE,CAAA;CAClC;AAaD;;;;;;;GAOG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAgFpI"}
|
package/dist/risk.js
ADDED
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 代币风险检查(子路径 `@w3lib/evm-batch-call/risk`):在 eth_call 里模拟“买入 → 转账 → 卖出”(deployless 的探测合约,不部署、不发交易),
|
|
3
|
+
* 算出买入税、转账税、卖出税,判断能不能卖(貔貅盘);另外看合约是不是可升级的代理、owner 有没有放弃。
|
|
4
|
+
* 只能检查在内置 V2 协议里有 代币 / 包装主币 池子的代币;Tron 不支持
|
|
5
|
+
*/
|
|
6
|
+
import { AbiCoder, Interface, concat } from 'ethers';
|
|
7
|
+
import { LP_PROTOCOLS, LP_QUOTE_TOKENS } from './lp.js';
|
|
8
|
+
import { TOKEN_PROBE_BYTECODE } from './tokenProbe.js';
|
|
9
|
+
import { isExecutionError } from './errors.js';
|
|
10
|
+
import { isTronChain } from './tron.js';
|
|
11
|
+
const coder = AbiCoder.defaultAbiCoder();
|
|
12
|
+
const factoryInterface = new Interface(['function getPair(address tokenA, address tokenB) view returns (address)']);
|
|
13
|
+
const pairInterface = new Interface(['function token0() view returns (address)', 'function getReserves() view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast)']);
|
|
14
|
+
const ownerInterface = new Interface(['function owner() view returns (address)']);
|
|
15
|
+
/** EIP-1967 的实现合约槽位:bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1) */
|
|
16
|
+
const IMPLEMENTATION_SLOT = '0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc';
|
|
17
|
+
const STAGES = ['ok', 'buy-failed', 'transfer-failed', 'approve-failed', 'sell-failed'];
|
|
18
|
+
const ZERO = '0x0000000000000000000000000000000000000000';
|
|
19
|
+
/**
|
|
20
|
+
* 检查代币的风险(每个代币一次模拟的 eth_call,加上一次 multicall 找池子、读 owner)。
|
|
21
|
+
*
|
|
22
|
+
* ```ts
|
|
23
|
+
* const [risk] = await tokenRisks(provider, [token])
|
|
24
|
+
* // { stage: 'ok', honeypot: false, buyTax: 0.05, sellTax: 0.05, transferTax: 0, flags: ['has-tax', 'owned'], … }
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export async function tokenRisks(provider, tokens, options = {}) {
|
|
28
|
+
const chainId = await provider.getChainId();
|
|
29
|
+
if (isTronChain(chainId))
|
|
30
|
+
throw new Error('tokenRisks is not supported on Tron');
|
|
31
|
+
const wrapped = LP_QUOTE_TOKENS[chainId]?.[0];
|
|
32
|
+
const protocols = (options.protocols ?? LP_PROTOCOLS.filter((p) => p.chainId === chainId)).filter((p) => p.version === 'v2' && p.router && p.factory);
|
|
33
|
+
if (!wrapped || !protocols.length)
|
|
34
|
+
throw new Error(`No V2 protocol with a router on chain ${chainId}`);
|
|
35
|
+
// 1. 每个代币在每个 V2 协议里和包装主币的池子,以及 owner()
|
|
36
|
+
const pairCalls = tokens.flatMap((t) => protocols.map((p) => provider.contract(p.factory, factoryInterface).getPair(t, wrapped)));
|
|
37
|
+
const ownerCalls = tokens.map((t) => provider.contract(t, ownerInterface).owner());
|
|
38
|
+
const first = await provider.tryAll([...pairCalls, ...ownerCalls]);
|
|
39
|
+
const pairs = first.slice(0, pairCalls.length);
|
|
40
|
+
const owners = first.slice(pairCalls.length);
|
|
41
|
+
const found = pairs.flatMap((pair, i) => (pair && pair.toLowerCase() !== ZERO ? [{ i, pair }] : []));
|
|
42
|
+
const reserves = found.length
|
|
43
|
+
? await provider.tryAll(found.flatMap(({ pair }) => [provider.contract(pair, pairInterface).token0(), provider.contract(pair, pairInterface).getReserves()]))
|
|
44
|
+
: [];
|
|
45
|
+
// 每个代币:包装主币一侧最深的池子
|
|
46
|
+
const best = tokens.map(() => null);
|
|
47
|
+
found.forEach(({ i, pair }, k) => {
|
|
48
|
+
const token0 = reserves[k * 2];
|
|
49
|
+
const r = reserves[k * 2 + 1];
|
|
50
|
+
if (!token0 || !r)
|
|
51
|
+
return;
|
|
52
|
+
const wrappedReserve = token0.toLowerCase() === wrapped.toLowerCase() ? r[0] : r[1];
|
|
53
|
+
const t = Math.floor(i / protocols.length);
|
|
54
|
+
const current = best[t];
|
|
55
|
+
if (wrappedReserve > 0n && (!current || wrappedReserve > current.wrappedReserve))
|
|
56
|
+
best[t] = { protocol: protocols[i % protocols.length], pair, wrappedReserve };
|
|
57
|
+
});
|
|
58
|
+
const { runOnNodes } = await import('./write/rpc.js');
|
|
59
|
+
const node = (method, fn, isFinal) => runOnNodes(provider.rpc, method, (n) => fn(n), isFinal);
|
|
60
|
+
const ONE = 10n ** 18n;
|
|
61
|
+
return Promise.all(tokens.map(async (token, t) => {
|
|
62
|
+
const pick = best[t];
|
|
63
|
+
const owner = owners[t] ?? null;
|
|
64
|
+
const implementation = await node('getStorage', (n) => (n.getStorage ? n.getStorage(token, IMPLEMENTATION_SLOT) : Promise.resolve('0x')))
|
|
65
|
+
.then((slot) => (slot && BigInt(slot) !== 0n ? `0x${slot.slice(-40)}` : null))
|
|
66
|
+
.catch(() => null);
|
|
67
|
+
const base = { token, implementation, owner, buyTax: null, sellTax: null, transferTax: null, buyGas: null, sellGas: null };
|
|
68
|
+
if (!pick)
|
|
69
|
+
return { ...base, protocol: null, pool: null, stage: null, honeypot: null, flags: flagsOf({ ...base, stage: null, honeypot: null }, true) };
|
|
70
|
+
const amount = options.amount ?? min(pick.wrappedReserve / 1000n, ONE);
|
|
71
|
+
// deployless:没有 to 的 eth_call 执行构造函数;从包装主币合约发起(它持有大量主币,eth_call 不需要签名)
|
|
72
|
+
const data = concat([TOKEN_PROBE_BYTECODE, coder.encode(['address', 'address', 'address'], [pick.protocol.router, token, pick.pair])]);
|
|
73
|
+
let decoded = null;
|
|
74
|
+
try {
|
|
75
|
+
// 探测合约自己不会 revert(每一步都 try);执行出错(如买入时代币合约把调用方拒之门外导致整体 revert)算买不进,
|
|
76
|
+
// 节点、网络、限频的错误照常抛出,不当成代币的风险
|
|
77
|
+
const out = await node('call', (n) => n.call({ from: wrapped, data, value: amount }), isExecutionError);
|
|
78
|
+
decoded = coder.decode(new Array(11).fill('uint256'), out).toArray();
|
|
79
|
+
}
|
|
80
|
+
catch (err) {
|
|
81
|
+
if (!isExecutionError(err))
|
|
82
|
+
throw err;
|
|
83
|
+
decoded = null;
|
|
84
|
+
}
|
|
85
|
+
if (!decoded) {
|
|
86
|
+
const failed = { ...base, protocol: pick.protocol.id, pool: pick.pair, stage: 'buy-failed', honeypot: null };
|
|
87
|
+
return { ...failed, flags: flagsOf(failed, false) };
|
|
88
|
+
}
|
|
89
|
+
const [stageIndex, buyQuote, bought, transferSent, transferReceived, sellAmount, sellQuote, sold, buyGas, sellGas, pairReceived] = decoded;
|
|
90
|
+
const stage = STAGES[Number(stageIndex)] ?? 'buy-failed';
|
|
91
|
+
const tax = (actual, expected) => (expected > 0n ? Math.max(0, 1 - Number((actual * 1000000n) / expected) / 1_000_000) : null);
|
|
92
|
+
const result = {
|
|
93
|
+
...base,
|
|
94
|
+
protocol: pick.protocol.id,
|
|
95
|
+
pool: pick.pair,
|
|
96
|
+
stage,
|
|
97
|
+
buyTax: stage === 'buy-failed' ? null : tax(bought, buyQuote),
|
|
98
|
+
transferTax: stage === 'ok' || stage === 'approve-failed' || stage === 'sell-failed' ? tax(transferReceived, transferSent) : null,
|
|
99
|
+
// 卖出税:池子实际收到的代币(转账时扣的税,精确),和实际换回的主币比报价少多少(有的代币卖出时顺便把收来的税也卖进同一个池子,
|
|
100
|
+
// 池子那边看不出来),取较大的
|
|
101
|
+
sellTax: stage === 'ok' ? Math.max(tax(pairReceived, sellAmount) ?? 0, tax(sold, sellQuote) ?? 0) : null,
|
|
102
|
+
buyGas: stage === 'buy-failed' ? null : Number(buyGas),
|
|
103
|
+
sellGas: stage === 'ok' ? Number(sellGas) : null,
|
|
104
|
+
honeypot: stage === 'sell-failed' || stage === 'transfer-failed' || stage === 'approve-failed' ? true : stage === 'ok' ? (tax(sold, sellQuote) ?? 0) >= 0.9 : null,
|
|
105
|
+
};
|
|
106
|
+
return { ...result, flags: flagsOf(result, false) };
|
|
107
|
+
}));
|
|
108
|
+
}
|
|
109
|
+
const min = (a, b) => (a < b ? a : b);
|
|
110
|
+
function flagsOf(r, noPool) {
|
|
111
|
+
const flags = [];
|
|
112
|
+
if (noPool)
|
|
113
|
+
flags.push('no-pool');
|
|
114
|
+
if (r.honeypot)
|
|
115
|
+
flags.push('honeypot');
|
|
116
|
+
if (r.stage === 'buy-failed')
|
|
117
|
+
flags.push('cannot-buy');
|
|
118
|
+
for (const [name, value] of [
|
|
119
|
+
['buy', r.buyTax],
|
|
120
|
+
['sell', r.sellTax],
|
|
121
|
+
['transfer', r.transferTax],
|
|
122
|
+
]) {
|
|
123
|
+
if (value !== null && value > 0.1)
|
|
124
|
+
flags.push(`high-${name}-tax`);
|
|
125
|
+
}
|
|
126
|
+
if ([r.buyTax, r.sellTax, r.transferTax].some((v) => v !== null && v > 0.005))
|
|
127
|
+
flags.push('has-tax');
|
|
128
|
+
if (r.implementation)
|
|
129
|
+
flags.push('proxy');
|
|
130
|
+
if (r.owner && r.owner.toLowerCase() !== ZERO)
|
|
131
|
+
flags.push('owned');
|
|
132
|
+
return flags;
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=risk.js.map
|
package/dist/risk.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"risk.js","sourceRoot":"","sources":["../src/risk.ts"],"names":[],"mappings":"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"}
|
package/dist/rpcNodes.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rpcNodes.d.ts","sourceRoot":"","sources":["../src/rpcNodes.ts"],"names":[],"mappings":"AAGA,gCAAgC;AAChC,eAAO,MAAM,gBAAgB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"rpcNodes.d.ts","sourceRoot":"","sources":["../src/rpcNodes.ts"],"names":[],"mappings":"AAGA,gCAAgC;AAChC,eAAO,MAAM,gBAAgB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAuMxE,CAAA;AAED,6CAA6C;AAC7C,eAAO,MAAM,kBAAkB,EAAE,SAAS,MAAM,EAK/C,CAAA"}
|
package/dist/rpcNodes.js
CHANGED
|
@@ -182,6 +182,24 @@ export const DEFAULT_RPC_URLS = {
|
|
|
182
182
|
'https://rpc-qnd.inkonchain.com',
|
|
183
183
|
'https://ink.api.pocket.network',
|
|
184
184
|
],
|
|
185
|
+
// 星空链(Starry)
|
|
186
|
+
202308: [
|
|
187
|
+
'https://rpc.starryscan.com',
|
|
188
|
+
],
|
|
189
|
+
// conflux
|
|
190
|
+
1030: [
|
|
191
|
+
'https://evm.confluxrpc.com',
|
|
192
|
+
],
|
|
193
|
+
// injective
|
|
194
|
+
1776: [
|
|
195
|
+
'https://sentry.evm-rpc.injective.network',
|
|
196
|
+
'https://injectiveevm-rpc.polkachu.com',
|
|
197
|
+
],
|
|
198
|
+
// pharos
|
|
199
|
+
1672: [
|
|
200
|
+
'https://rpc.pharos.xyz',
|
|
201
|
+
'https://infra.originstake.com/pharos/evm',
|
|
202
|
+
],
|
|
185
203
|
};
|
|
186
204
|
/** Tron 主网全节点 HTTP API(均支持跨域与 deployless) */
|
|
187
205
|
export const DEFAULT_TRON_HOSTS = [
|
package/dist/rpcNodes.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rpcNodes.js","sourceRoot":"","sources":["../src/rpcNodes.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"rpcNodes.js","sourceRoot":"","sources":["../src/rpcNodes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 交易模拟(子路径 `@w3lib/evm-batch-call/simulate`):发送前先看会发生什么——成不成功、花多少 gas、哪些资产进出、给了什么授权、风险提示。
|
|
3
|
+
*
|
|
4
|
+
* - EVM:`eth_simulateV1`(公共节点 publicnode / drpc / mainnet.base.org / bsc-dataseed 等都支持):一次请求执行一串交易、状态逐笔延续,
|
|
5
|
+
* `traceTransfers` 把主币转账也变成日志;资产变化和授权变化都从日志里算(ERC20 / 721 / 1155 Transfer、WETH Deposit / Withdrawal、Approval、
|
|
6
|
+
* ApprovalForAll、Permit2 Approval)。不支持时退回 `eth_call` + `eth_estimateGas`:只能知道成不成功和 gas,资产变化只能按 calldata 估
|
|
7
|
+
* - Tron:`triggerconstantcontract`(能量、日志里的 TRC20 Transfer / Approval);TRX 的变化只有 call_value
|
|
8
|
+
*/
|
|
9
|
+
import { type BigNumberish } from 'ethers';
|
|
10
|
+
import type { BlockTag } from './aggregate.js';
|
|
11
|
+
import type { Provider } from './provider.js';
|
|
12
|
+
import { type DecodedCall } from './simulateDecode.js';
|
|
13
|
+
export { decodeCalldata, decodeRevert, type DecodedCall, type DecodedType } from './simulateDecode.js';
|
|
14
|
+
/** 要模拟的交易,字段与 buildSwap / buildRevokes / 流动性构建的 transactions 里的一致(多出来的字段忽略) */
|
|
15
|
+
export interface SimulateTx {
|
|
16
|
+
from?: string;
|
|
17
|
+
to?: string;
|
|
18
|
+
data?: string;
|
|
19
|
+
/** 附带的主币(最小单位;Tron 是 sun) */
|
|
20
|
+
value?: BigNumberish;
|
|
21
|
+
gas?: BigNumberish;
|
|
22
|
+
}
|
|
23
|
+
/** 状态覆盖(eth_call / eth_simulateV1 的格式):改余额、nonce、代码、存储 */
|
|
24
|
+
export type StateOverrides = Record<string, {
|
|
25
|
+
balance?: string;
|
|
26
|
+
nonce?: string;
|
|
27
|
+
code?: string;
|
|
28
|
+
state?: Record<string, string>;
|
|
29
|
+
stateDiff?: Record<string, string>;
|
|
30
|
+
}>;
|
|
31
|
+
export interface SimulateOptions {
|
|
32
|
+
/** 发送者(交易里没有 from 时用),也是资产变化 / 授权变化的主体 */
|
|
33
|
+
from?: string;
|
|
34
|
+
/** 另外要统计资产变化、授权的地址(默认只有 from) */
|
|
35
|
+
watch?: readonly string[];
|
|
36
|
+
/** 按这个区块的状态模拟(默认最新) */
|
|
37
|
+
blockTag?: BlockTag;
|
|
38
|
+
stateOverrides?: StateOverrides;
|
|
39
|
+
/** 每笔交易的 gas 上限,默认 min(1000 万, 2500 万 / 笔数):不同节点限制一个模拟里的总 gas */
|
|
40
|
+
gas?: bigint;
|
|
41
|
+
/** 估算手续费(gasUsed × 当前 gas 价格;不含 L1 数据费),默认 true */
|
|
42
|
+
fee?: boolean;
|
|
43
|
+
/** 给资产变化带美元价值(用 /price,按需加载):true 用默认价格源,或传 tokenPrices 的 sources */
|
|
44
|
+
usd?: boolean | import('./price.js').TokenPricesOptions['sources'];
|
|
45
|
+
/** 对收到的代币做风险检查(用 /risk,按需加载,只支持 EVM 的 V2 池子能买卖的代币),有问题时加进 warnings */
|
|
46
|
+
risk?: boolean;
|
|
47
|
+
/** 不用 eth_simulateV1,直接 eth_call + estimateGas(调试 / 节点行为不一致时) */
|
|
48
|
+
forceCall?: boolean;
|
|
49
|
+
}
|
|
50
|
+
export type WarningSeverity = 'info' | 'warn' | 'danger';
|
|
51
|
+
export interface SimulationWarning {
|
|
52
|
+
severity: WarningSeverity;
|
|
53
|
+
/**
|
|
54
|
+
* unlimited-approval / unknown-spender / approve-to-eoa / unlimited-nft-approval / no-code / large-value /
|
|
55
|
+
* token-risk / unknown-method / no-logs / no-state / reverted
|
|
56
|
+
*/
|
|
57
|
+
code: string;
|
|
58
|
+
message: string;
|
|
59
|
+
/** 相关地址:授权类提示是被授权方,token-risk 是代币 */
|
|
60
|
+
address?: string;
|
|
61
|
+
}
|
|
62
|
+
export interface BalanceChange {
|
|
63
|
+
address: string;
|
|
64
|
+
/** 代币地址;主币是 'native' */
|
|
65
|
+
asset: string;
|
|
66
|
+
symbol: string | null;
|
|
67
|
+
decimals: number;
|
|
68
|
+
/** 带符号的最小单位数量 */
|
|
69
|
+
delta: string;
|
|
70
|
+
formatted: string;
|
|
71
|
+
usd?: number | null;
|
|
72
|
+
/** NFT(721 / 1155):tokenId,数量是个数 */
|
|
73
|
+
tokenId?: string;
|
|
74
|
+
standard: 'native' | 'erc20' | 'erc721' | 'erc1155';
|
|
75
|
+
}
|
|
76
|
+
export interface ApprovalChange {
|
|
77
|
+
type: 'erc20' | 'permit2' | 'nft' | 'nft-token';
|
|
78
|
+
owner: string;
|
|
79
|
+
/** 代币 / NFT 合约 */
|
|
80
|
+
token: string;
|
|
81
|
+
symbol: string | null;
|
|
82
|
+
/** 被授权方(ERC20 的 spender、Permit2 的 spender、NFT 的 operator / approved) */
|
|
83
|
+
spender: string;
|
|
84
|
+
spenderName?: string;
|
|
85
|
+
/** 新的额度(最小单位);NFT 的 ApprovalForAll 是 '1' / '0',单个 NFT 是 tokenId */
|
|
86
|
+
amount: string;
|
|
87
|
+
unlimited: boolean;
|
|
88
|
+
/** 授权被取消(额度 0 / setApprovalForAll false) */
|
|
89
|
+
revoked: boolean;
|
|
90
|
+
/** Permit2:授权到期的时间(秒) */
|
|
91
|
+
expiration?: number;
|
|
92
|
+
}
|
|
93
|
+
/** 一条转账(所有地址之间的,不只是 from 的) */
|
|
94
|
+
export interface SimulatedTransfer {
|
|
95
|
+
asset: string;
|
|
96
|
+
from: string;
|
|
97
|
+
to: string;
|
|
98
|
+
amount: string;
|
|
99
|
+
tokenId?: string;
|
|
100
|
+
standard: BalanceChange['standard'];
|
|
101
|
+
}
|
|
102
|
+
export interface SimulationResult {
|
|
103
|
+
success: boolean;
|
|
104
|
+
/** 失败原因:解码后的 revert 原因(Error / Panic / 常见自定义错误)或节点给的错误信息 */
|
|
105
|
+
error?: string;
|
|
106
|
+
/** revert 的原始数据 */
|
|
107
|
+
revertData?: string;
|
|
108
|
+
/** 消耗的 gas(Tron 是能量) */
|
|
109
|
+
gasUsed: string;
|
|
110
|
+
/** 估算的手续费(wei),不含 L1 数据费;Tron 没有 */
|
|
111
|
+
fee?: string;
|
|
112
|
+
balanceChanges: BalanceChange[];
|
|
113
|
+
approvalChanges: ApprovalChange[];
|
|
114
|
+
decoded: {
|
|
115
|
+
type: DecodedCall['type'];
|
|
116
|
+
protocol?: string;
|
|
117
|
+
method?: string;
|
|
118
|
+
summary: string;
|
|
119
|
+
args?: Record<string, unknown>;
|
|
120
|
+
calls?: DecodedCall[];
|
|
121
|
+
};
|
|
122
|
+
warnings: SimulationWarning[];
|
|
123
|
+
transfers: SimulatedTransfer[];
|
|
124
|
+
/** 原始日志 */
|
|
125
|
+
logs?: Array<{
|
|
126
|
+
address: string;
|
|
127
|
+
topics: string[];
|
|
128
|
+
data: string;
|
|
129
|
+
}>;
|
|
130
|
+
/** 用的模拟方式:'simulateV1'(有日志)、'eth_call'(只有成败和 gas)、'tron' */
|
|
131
|
+
mode: 'simulateV1' | 'eth_call' | 'tron';
|
|
132
|
+
returnData?: string;
|
|
133
|
+
}
|
|
134
|
+
export interface BatchSimulationResult {
|
|
135
|
+
/** 全部成功 */
|
|
136
|
+
success: boolean;
|
|
137
|
+
/** 每笔交易的结果,与输入一一对应 */
|
|
138
|
+
results: SimulationResult[];
|
|
139
|
+
/** 第一笔失败的下标 */
|
|
140
|
+
failedIndex?: number;
|
|
141
|
+
gasUsed: string;
|
|
142
|
+
fee?: string;
|
|
143
|
+
/** 汇总(同一个资产、同一个地址的变化相加;授权取最后的状态) */
|
|
144
|
+
balanceChanges: BalanceChange[];
|
|
145
|
+
approvalChanges: ApprovalChange[];
|
|
146
|
+
warnings: SimulationWarning[];
|
|
147
|
+
mode: SimulationResult['mode'];
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* 模拟一笔交易(不签名、不发送)。可以直接传 `buildSwap` / `buildRevokes` / 流动性构建里的交易。
|
|
151
|
+
*
|
|
152
|
+
* ```ts
|
|
153
|
+
* const plan = await buildSwap(provider, user, { tokenIn, tokenOut, amountInFormatted: '1' })
|
|
154
|
+
* const sim = await simulate(provider, plan.transactions[1], { from: user }) // 兑换这一笔(授权在前,没发出去时用 simulateBatch)
|
|
155
|
+
* if (!sim.success) throw new Error(sim.error)
|
|
156
|
+
* sim.balanceChanges // [{ asset: 'native', delta: '-1000…', formatted: '-1', … }, { asset: USDC, formatted: '2300.5', … }]
|
|
157
|
+
* sim.warnings // [{ severity: 'warn', code: 'unknown-spender', … }]
|
|
158
|
+
* ```
|
|
159
|
+
*/
|
|
160
|
+
export declare function simulate(provider: Provider, tx: SimulateTx, options?: SimulateOptions): Promise<SimulationResult>;
|
|
161
|
+
/**
|
|
162
|
+
* 按顺序模拟一串依赖前一笔的交易(如先 approve 再兑换:`plan.transactions`)。eth_simulateV1 在同一个区块里依次执行,状态延续;
|
|
163
|
+
* 不支持的节点退回单笔 eth_call,后面的交易看不到前面的结果(结果里有 `no-state` 提示;Tron 同理)。
|
|
164
|
+
*
|
|
165
|
+
* ```ts
|
|
166
|
+
* const sim = await simulateBatch(provider, plan.transactions, { from: user, usd: true })
|
|
167
|
+
* sim.success; sim.balanceChanges // 汇总:整个流程你付出 / 收到什么
|
|
168
|
+
* ```
|
|
169
|
+
*/
|
|
170
|
+
export declare function simulateBatch(provider: Provider, txs: readonly SimulateTx[] | {
|
|
171
|
+
transactions: readonly SimulateTx[];
|
|
172
|
+
}, options?: SimulateOptions): Promise<BatchSimulationResult>;
|
|
173
|
+
/**
|
|
174
|
+
* 模拟通过才发送的一行守卫:`simulate` 失败或有 danger 级别的提示时抛错,否则返回模拟结果,由调用方继续发送。
|
|
175
|
+
*
|
|
176
|
+
* ```ts
|
|
177
|
+
* await assertSimulation(simulate(provider, tx, { from }))
|
|
178
|
+
* await batchCall(provider, key, [{ to: tx.to, data: tx.data, value: tx.value }])
|
|
179
|
+
* ```
|
|
180
|
+
*/
|
|
181
|
+
export declare function assertSimulation<T extends Pick<SimulationResult, 'success' | 'error' | 'warnings'> | Pick<BatchSimulationResult, 'success' | 'warnings'> & {
|
|
182
|
+
results: Array<Pick<SimulationResult, 'error'>>;
|
|
183
|
+
}>(simulation: Promise<T> | T, options?: {
|
|
184
|
+
allowDanger?: boolean;
|
|
185
|
+
}): Promise<T>;
|
|
186
|
+
//# sourceMappingURL=simulate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simulate.d.ts","sourceRoot":"","sources":["../src/simulate.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAA0B,KAAK,YAAY,EAAE,MAAM,QAAQ,CAAA;AAGlE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAK9C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAC7C,OAAO,EAAgC,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAGpF,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAEtG,+EAA+E;AAC/E,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,6BAA6B;IAC7B,KAAK,CAAC,EAAE,YAAY,CAAA;IACpB,GAAG,CAAC,EAAE,YAAY,CAAA;CACnB;AAED,0DAA0D;AAC1D,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAAC,CAAA;AAEpK,MAAM,WAAW,eAAe;IAC9B,0CAA0C;IAC1C,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,iCAAiC;IACjC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACzB,uBAAuB;IACvB,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,cAAc,CAAC,EAAE,cAAc,CAAA;IAC/B,iEAAiE;IACjE,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,mDAAmD;IACnD,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,qEAAqE;IACrE,GAAG,CAAC,EAAE,OAAO,GAAG,OAAO,YAAY,EAAE,kBAAkB,CAAC,SAAS,CAAC,CAAA;IAClE,sEAAsE;IACtE,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,iEAAiE;IACjE,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAA;AAExD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,eAAe,CAAA;IACzB;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,qCAAqC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,wBAAwB;IACxB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,QAAQ,EAAE,MAAM,CAAA;IAChB,iBAAiB;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,oCAAoC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAA;CACpD;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,KAAK,GAAG,WAAW,CAAA;IAC/C,KAAK,EAAE,MAAM,CAAA;IACb,kBAAkB;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,wEAAwE;IACxE,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,mEAAmE;IACnE,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,OAAO,CAAA;IAClB,4CAA4C;IAC5C,OAAO,EAAE,OAAO,CAAA;IAChB,yBAAyB;IACzB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,+BAA+B;AAC/B,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC,CAAA;CACpC;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAA;IAChB,4DAA4D;IAC5D,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,mBAAmB;IACnB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,wBAAwB;IACxB,OAAO,EAAE,MAAM,CAAA;IACf,oCAAoC;IACpC,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,cAAc,EAAE,aAAa,EAAE,CAAA;IAC/B,eAAe,EAAE,cAAc,EAAE,CAAA;IACjC,OAAO,EAAE;QACP,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;QACzB,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,OAAO,EAAE,MAAM,CAAA;QACf,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QAC9B,KAAK,CAAC,EAAE,WAAW,EAAE,CAAA;KACtB,CAAA;IACD,QAAQ,EAAE,iBAAiB,EAAE,CAAA;IAC7B,SAAS,EAAE,iBAAiB,EAAE,CAAA;IAC9B,WAAW;IACX,IAAI,CAAC,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACjE,4DAA4D;IAC5D,IAAI,EAAE,YAAY,GAAG,UAAU,GAAG,MAAM,CAAA;IACxC,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,qBAAqB;IACpC,WAAW;IACX,OAAO,EAAE,OAAO,CAAA;IAChB,sBAAsB;IACtB,OAAO,EAAE,gBAAgB,EAAE,CAAA;IAC3B,eAAe;IACf,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,OAAO,EAAE,MAAM,CAAA;IACf,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,oCAAoC;IACpC,cAAc,EAAE,aAAa,EAAE,CAAA;IAC/B,eAAe,EAAE,cAAc,EAAE,CAAA;IACjC,QAAQ,EAAE,iBAAiB,EAAE,CAAA;IAC7B,IAAI,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAA;CAC/B;AA6eD;;;;;;;;;;GAUG;AACH,wBAAsB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAG3H;AAED;;;;;;;;GAQG;AACH,wBAAsB,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,UAAU,EAAE,GAAG;IAAE,YAAY,EAAE,SAAS,UAAU,EAAE,CAAA;CAAE,EAAE,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CA+B3L;AAED;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CAAC,CAAC,SAAS,IAAI,CAAC,gBAAgB,EAAE,SAAS,GAAG,OAAO,GAAG,UAAU,CAAC,GAAG,IAAI,CAAC,qBAAqB,EAAE,SAAS,GAAG,UAAU,CAAC,GAAG;IAAE,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC,CAAA;CAAE,EACnN,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,EAC1B,OAAO,GAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAA;CAAO,GACtC,OAAO,CAAC,CAAC,CAAC,CASZ"}
|