@paraswap/dex-lib 2.12.12-rfqtests.0 → 2.12.12
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/build/abi/augustus.json +375 -0
- package/build/abi/woo-fi-v2/IntegrationHelper.abi.json +116 -0
- package/build/abi/woo-fi-v2/WooOracleV2.abi.json +358 -0
- package/build/abi/woo-fi-v2/WooPPV2.abi.json +580 -0
- package/build/config.js +3 -3
- package/build/dex/aave-v3/tokens/arbitrum.json +20 -20
- package/build/dex/aave-v3/tokens/avalanche.json +44 -20
- package/build/dex/aave-v3/tokens/fantom.json +30 -30
- package/build/dex/aave-v3/tokens/optimism.json +18 -18
- package/build/dex/aave-v3/tokens/polygon.json +60 -42
- package/build/dex/generic-rfq/validators.d.ts +1 -1
- package/build/dex/generic-rfq/validators.js +26 -36
- package/build/dex/generic-rfq/validators.js.map +1 -1
- package/build/dex/hashflow/rate-fetcher.d.ts +14 -0
- package/build/dex/hashflow/rate-fetcher.js +37 -0
- package/build/dex/hashflow/rate-fetcher.js.map +1 -0
- package/build/dex/hashflow/validators.d.ts +3 -0
- package/build/dex/hashflow/validators.js +12 -0
- package/build/dex/hashflow/validators.js.map +1 -0
- package/build/dex/{test-aave-v3 → test-dex}/config.d.ts +1 -1
- package/build/dex/{test-aave-v3 → test-dex}/config.js +3 -3
- package/build/dex/test-dex/config.js.map +1 -0
- package/build/dex/{test-aave-v3/test-aave-v3-pool.d.ts → test-dex/test-dex-pool.d.ts} +3 -3
- package/build/dex/{test-aave-v3/test-aave-v3-pool.js → test-dex/test-dex-pool.js} +7 -7
- package/build/dex/test-dex/test-dex-pool.js.map +1 -0
- package/build/dex/{test-aave-v3/test-aave-v3.d.ts → test-dex/test-dex.d.ts} +8 -8
- package/build/dex/{test-aave-v3/test-aave-v3.js → test-dex/test-dex.js} +7 -7
- package/build/dex/test-dex/test-dex.js.map +1 -0
- package/build/dex/{test-aave-v3 → test-dex}/types.d.ts +1 -1
- package/build/dex/{test-aave-v3 → test-dex}/types.js.map +1 -1
- package/build/dex/uniswap-v3/config.js +13 -0
- package/build/dex/uniswap-v3/config.js.map +1 -1
- package/build/dex/woo-fi-v2/config.d.ts +4 -0
- package/build/dex/woo-fi-v2/config.js +87 -0
- package/build/dex/woo-fi-v2/config.js.map +1 -0
- package/build/dex/woo-fi-v2/constants.d.ts +5 -0
- package/build/dex/woo-fi-v2/constants.js +15 -0
- package/build/dex/woo-fi-v2/constants.js.map +1 -0
- package/build/dex/woo-fi-v2/decoders.d.ts +6 -0
- package/build/dex/woo-fi-v2/decoders.js +29 -0
- package/build/dex/woo-fi-v2/decoders.js.map +1 -0
- package/build/dex/woo-fi-v2/types.d.ts +41 -0
- package/build/dex/woo-fi-v2/types.js +3 -0
- package/build/dex/woo-fi-v2/types.js.map +1 -0
- package/build/dex/woo-fi-v2/utils.d.ts +2 -0
- package/build/dex/woo-fi-v2/utils.js +24 -0
- package/build/dex/woo-fi-v2/utils.js.map +1 -0
- package/build/dex/woo-fi-v2/woo-fi-math.d.ts +16 -0
- package/build/dex/woo-fi-v2/woo-fi-math.js +137 -0
- package/build/dex/woo-fi-v2/woo-fi-math.js.map +1 -0
- package/build/dex/woo-fi-v2/woo-fi-v2-math.d.ts +16 -0
- package/build/dex/woo-fi-v2/woo-fi-v2-math.js +137 -0
- package/build/dex/woo-fi-v2/woo-fi-v2-math.js.map +1 -0
- package/build/dex/woo-fi-v2/woo-fi-v2-pool.d.ts +12 -0
- package/build/dex/woo-fi-v2/woo-fi-v2-pool.js +79 -0
- package/build/dex/woo-fi-v2/woo-fi-v2-pool.js.map +1 -0
- package/build/dex/woo-fi-v2/woo-fi-v2.d.ts +52 -0
- package/build/dex/woo-fi-v2/woo-fi-v2.js +310 -0
- package/build/dex/woo-fi-v2/woo-fi-v2.js.map +1 -0
- package/build/lib/log-messages-suppressor.d.ts +30 -0
- package/build/lib/log-messages-suppressor.js +107 -0
- package/build/lib/log-messages-suppressor.js.map +1 -0
- package/build/lib/stateful-rpc-poller/state-polling-manager.d.ts +23 -0
- package/build/lib/stateful-rpc-poller/state-polling-manager.js +173 -0
- package/build/lib/stateful-rpc-poller/state-polling-manager.js.map +1 -0
- package/build/lib/stateful-rpc-poller/stateful-rpc-poller.d.ts +72 -0
- package/build/lib/stateful-rpc-poller/stateful-rpc-poller.js +369 -0
- package/build/lib/stateful-rpc-poller/stateful-rpc-poller.js.map +1 -0
- package/build/lib/stateful-rpc-poller/types.d.ts +35 -0
- package/build/lib/stateful-rpc-poller/types.js +10 -0
- package/build/lib/stateful-rpc-poller/types.js.map +1 -0
- package/build/lib/stateful-rpc-poller/utils.d.ts +4 -0
- package/build/lib/stateful-rpc-poller/utils.js +17 -0
- package/build/lib/stateful-rpc-poller/utils.js.map +1 -0
- package/build/lib/validators.d.ts +7 -0
- package/build/lib/validators.js +27 -0
- package/build/lib/validators.js.map +1 -0
- package/package.json +1 -1
- package/src/config.ts +3 -3
- package/src/dex/generic-rfq/generic-rfq-e2e.test.ts +71 -85
- package/src/dex/generic-rfq/validators.test.ts +32 -6
- package/src/dex/generic-rfq/validators.ts +32 -57
- package/src/dex/uniswap-v3/config.ts +13 -0
- package/src/dex/uniswap-v3/uniswap-v3-e2e.test.ts +76 -0
- package/tests/constants-e2e.ts +0 -2
- package/tests/utils-e2e.ts +48 -59
- package/.idea/codeStyles/codeStyleConfig.xml +0 -5
- package/.idea/misc.xml +0 -6
- package/.idea/modules.xml +0 -8
- package/.idea/vcs.xml +0 -6
- package/.vscode/launch.json +0 -21
- package/build/dex/aave-v3/tokens/mainnet.json +0 -44
- package/build/dex/balancer-v2/VirtualBoostedPool.d.ts +0 -79
- package/build/dex/balancer-v2/VirtualBoostedPool.js +0 -382
- package/build/dex/balancer-v2/VirtualBoostedPool.js.map +0 -1
- package/build/dex/test-aave-v3/config.js.map +0 -1
- package/build/dex/test-aave-v3/test-aave-v3-pool.js.map +0 -1
- package/build/dex/test-aave-v3/test-aave-v3.js.map +0 -1
- package/src/dex/generic-rfq/generic-rfq-e2e-arbitrum.test.ts +0 -360
- package/src/dex/generic-rfq/generic-rfq-e2e-bsc.test.ts +0 -346
- package/src/dex/generic-rfq/generic-rfq-e2e-polygon.test.ts +0 -360
- /package/build/dex/{test-aave-v3 → test-dex}/types.js +0 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { PoolState, TokenState } from './types';
|
|
2
|
+
import { Address, Logger } from '../../types';
|
|
3
|
+
export declare class WooFiV2Math {
|
|
4
|
+
private readonly logger;
|
|
5
|
+
private readonly _quoteToken;
|
|
6
|
+
state: PoolState;
|
|
7
|
+
constructor(logger: Logger, _quoteToken: Address);
|
|
8
|
+
query(fromToken: Address, toToken: Address, fromAmounts: bigint[]): bigint[] | null;
|
|
9
|
+
_querySellBase(baseToken: Address, baseAmounts: bigint[]): bigint[] | null;
|
|
10
|
+
_querySellQuote(baseToken: Address, quoteAmounts: bigint[]): bigint[] | null;
|
|
11
|
+
_queryBaseToBase(baseToken1: Address, baseToken2: Address, base1Amounts: bigint[]): bigint[] | null;
|
|
12
|
+
protected _takeFeeAndCheckReserve(amounts: bigint[], feeRate: bigint): bigint[];
|
|
13
|
+
protected _takeFee(amounts: bigint[], feeRate: bigint): bigint[];
|
|
14
|
+
protected _calcQuoteAmountSellBase(baseToken: Address, baseAmounts: bigint[], state: TokenState): bigint[];
|
|
15
|
+
protected _calcBaseAmountSellQuote(baseToken: string, quoteAmounts: bigint[], state: TokenState): bigint[];
|
|
16
|
+
}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WooFiV2Math = void 0;
|
|
4
|
+
const bigint_constants_1 = require("../../bigint-constants");
|
|
5
|
+
const constants_1 = require("./constants");
|
|
6
|
+
function handleMathError(e, logger) {
|
|
7
|
+
if (e instanceof Error && e.message.startsWith('WooGuardian:')) {
|
|
8
|
+
logger.warn('WooFi Guardian check Error:', e);
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
logger.error('Unexpected error in WooFi math:', e);
|
|
12
|
+
}
|
|
13
|
+
function max(a, b) {
|
|
14
|
+
return a > b ? a : b;
|
|
15
|
+
}
|
|
16
|
+
class WooFiV2Math {
|
|
17
|
+
constructor(logger, _quoteToken) {
|
|
18
|
+
this.logger = logger;
|
|
19
|
+
this._quoteToken = _quoteToken;
|
|
20
|
+
this.state = constants_1.NULL_STATE;
|
|
21
|
+
}
|
|
22
|
+
query(fromToken, toToken, fromAmounts) {
|
|
23
|
+
try {
|
|
24
|
+
if (fromToken === this._quoteToken) {
|
|
25
|
+
return this._querySellQuote(toToken, fromAmounts);
|
|
26
|
+
}
|
|
27
|
+
else if (toToken === this._quoteToken) {
|
|
28
|
+
return this._querySellBase(fromToken, fromAmounts);
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
return this._queryBaseToBase(fromToken, toToken, fromAmounts);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
catch (e) {
|
|
35
|
+
handleMathError(e, this.logger);
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
_querySellBase(baseToken, baseAmounts) {
|
|
40
|
+
try {
|
|
41
|
+
const _state = this.state.tokenStates[baseToken];
|
|
42
|
+
let quoteAmounts = this._calcQuoteAmountSellBase(baseToken, baseAmounts, _state);
|
|
43
|
+
quoteAmounts = quoteAmounts.map(amount => {
|
|
44
|
+
return amount <= this.state.tokenInfos[this._quoteToken].reserve
|
|
45
|
+
? amount
|
|
46
|
+
: 0n;
|
|
47
|
+
});
|
|
48
|
+
const feeRate = this.state.tokenInfos[baseToken].feeRate;
|
|
49
|
+
return this._takeFee(quoteAmounts, feeRate);
|
|
50
|
+
}
|
|
51
|
+
catch (e) {
|
|
52
|
+
handleMathError(e, this.logger);
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
_querySellQuote(baseToken, quoteAmounts) {
|
|
57
|
+
try {
|
|
58
|
+
const feeRate = this.state.tokenInfos[baseToken].feeRate;
|
|
59
|
+
quoteAmounts = this._takeFee(quoteAmounts, feeRate);
|
|
60
|
+
const _state = this.state.tokenStates[baseToken];
|
|
61
|
+
let toAmounts = this._calcBaseAmountSellQuote(baseToken, quoteAmounts, _state);
|
|
62
|
+
const baseReserve = this.state.tokenInfos[baseToken].reserve;
|
|
63
|
+
return toAmounts.map(amount => {
|
|
64
|
+
return amount <= baseReserve ? amount : 0n;
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
catch (e) {
|
|
68
|
+
handleMathError(e, this.logger);
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
_queryBaseToBase(baseToken1, baseToken2, base1Amounts) {
|
|
73
|
+
try {
|
|
74
|
+
let state1 = this.state.tokenStates[baseToken1];
|
|
75
|
+
let state2 = this.state.tokenStates[baseToken2];
|
|
76
|
+
const feeRate1 = this.state.tokenInfos[baseToken1].feeRate;
|
|
77
|
+
const feeRate2 = this.state.tokenInfos[baseToken2].feeRate;
|
|
78
|
+
const spread = max(state1.spread, state2.spread) / 2n;
|
|
79
|
+
const feeRate = max(feeRate1, feeRate2);
|
|
80
|
+
state1.spread = spread;
|
|
81
|
+
state2.spread = spread;
|
|
82
|
+
let quoteAmounts = this._calcQuoteAmountSellBase(baseToken1, base1Amounts, state1);
|
|
83
|
+
quoteAmounts = this._takeFeeAndCheckReserve(quoteAmounts, feeRate);
|
|
84
|
+
let toAmounts = this._calcBaseAmountSellQuote(baseToken2, quoteAmounts, state2);
|
|
85
|
+
return toAmounts.map(toAmount => {
|
|
86
|
+
return toAmount <= this.state.tokenInfos[baseToken2].reserve
|
|
87
|
+
? toAmount
|
|
88
|
+
: 0n;
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
catch (e) {
|
|
92
|
+
handleMathError(e, this.logger);
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
_takeFeeAndCheckReserve(amounts, feeRate) {
|
|
97
|
+
return amounts.map(amount => {
|
|
98
|
+
if (amount === 0n)
|
|
99
|
+
return 0n;
|
|
100
|
+
const lpFee = (amount * feeRate) / bigint_constants_1.BI_POWS[5];
|
|
101
|
+
const reserve = this.state.tokenInfos[this._quoteToken].reserve;
|
|
102
|
+
return lpFee > reserve ? 0n : amount - lpFee;
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
_takeFee(amounts, feeRate) {
|
|
106
|
+
return amounts.map(amount => {
|
|
107
|
+
const lpFee = (amount * feeRate) / bigint_constants_1.BI_POWS[5];
|
|
108
|
+
return amount === 0n ? 0n : amount - lpFee;
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
_calcQuoteAmountSellBase(baseToken, baseAmounts, state) {
|
|
112
|
+
let { priceDec, quoteDec, baseDec } = this.state.decimals[baseToken];
|
|
113
|
+
return baseAmounts.map(baseAmount => {
|
|
114
|
+
if (baseAmount === 0n)
|
|
115
|
+
return 0n;
|
|
116
|
+
const coef = bigint_constants_1.BI_POWS[18] -
|
|
117
|
+
(state.coeff * baseAmount * state.price) / baseDec / priceDec -
|
|
118
|
+
state.spread;
|
|
119
|
+
return ((((baseAmount * quoteDec * state.price) / priceDec) * coef) /
|
|
120
|
+
bigint_constants_1.BI_POWS[18] /
|
|
121
|
+
baseDec);
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
_calcBaseAmountSellQuote(baseToken, quoteAmounts, state) {
|
|
125
|
+
let { priceDec, quoteDec, baseDec } = this.state.decimals[baseToken];
|
|
126
|
+
return quoteAmounts.map(quoteAmount => {
|
|
127
|
+
if (quoteAmount === 0n)
|
|
128
|
+
return 0n;
|
|
129
|
+
const coef = bigint_constants_1.BI_POWS[18] - (quoteAmount * state.coeff) / quoteDec - state.spread;
|
|
130
|
+
return ((((quoteAmount * baseDec * priceDec) / state.price) * coef) /
|
|
131
|
+
bigint_constants_1.BI_POWS[18] /
|
|
132
|
+
quoteDec);
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
exports.WooFiV2Math = WooFiV2Math;
|
|
137
|
+
//# sourceMappingURL=woo-fi-v2-math.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"woo-fi-v2-math.js","sourceRoot":"","sources":["../../../src/dex/woo-fi-v2/woo-fi-v2-math.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { IDexHelper } from '../../dex-helper/idex-helper';
|
|
2
|
+
import { DexParams, MulticallResultOutputs, PoolState } from './types';
|
|
3
|
+
import { StatefulRpcPoller } from '../../lib/stateful-rpc-poller/stateful-rpc-poller';
|
|
4
|
+
import { MultiCallParams } from '../../lib/multi-wrapper';
|
|
5
|
+
import { Token } from '../../types';
|
|
6
|
+
export declare class WooFiV2PollingPool extends StatefulRpcPoller<PoolState, MulticallResultOutputs> {
|
|
7
|
+
protected config: DexParams;
|
|
8
|
+
protected tokens: Token[];
|
|
9
|
+
constructor(dexKey: string, poolIdentifier: string, dexHelper: IDexHelper, config: DexParams, tokens: Token[]);
|
|
10
|
+
protected _getFetchStateMultiCalls(): MultiCallParams<MulticallResultOutputs>[];
|
|
11
|
+
protected _parseStateFromMultiResults(multiOutputs: MulticallResultOutputs[]): PoolState;
|
|
12
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.WooFiV2PollingPool = void 0;
|
|
7
|
+
const lodash_1 = __importDefault(require("lodash"));
|
|
8
|
+
const stateful_rpc_poller_1 = require("../../lib/stateful-rpc-poller/stateful-rpc-poller");
|
|
9
|
+
const utils_1 = require("../../lib/stateful-rpc-poller/utils");
|
|
10
|
+
const state_polling_manager_1 = require("../../lib/stateful-rpc-poller/state-polling-manager");
|
|
11
|
+
const decoders_1 = require("../../lib/decoders");
|
|
12
|
+
const utils_2 = require("./utils");
|
|
13
|
+
const decoders_2 = require("./decoders");
|
|
14
|
+
class WooFiV2PollingPool extends stateful_rpc_poller_1.StatefulRpcPoller {
|
|
15
|
+
constructor(dexKey, poolIdentifier, dexHelper, config,
|
|
16
|
+
// It already includes quoteToken
|
|
17
|
+
tokens) {
|
|
18
|
+
const callbacks = (0, utils_1.pollingManagerCbExtractor)(state_polling_manager_1.StatePollingManager.getInstance(dexHelper));
|
|
19
|
+
super(dexKey, poolIdentifier, dexHelper, 0, 0, false, callbacks);
|
|
20
|
+
this.config = config;
|
|
21
|
+
this.tokens = tokens;
|
|
22
|
+
}
|
|
23
|
+
_getFetchStateMultiCalls() {
|
|
24
|
+
return [
|
|
25
|
+
{
|
|
26
|
+
target: this.config.wooPPV2Address,
|
|
27
|
+
callData: utils_2.ifaces.PPV2.encodeFunctionData('paused', []),
|
|
28
|
+
decodeFunction: decoders_1.booleanDecode,
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
target: this.config.wooOracleV2Address,
|
|
32
|
+
callData: utils_2.ifaces.oracleV2.encodeFunctionData('timestamp', []),
|
|
33
|
+
decodeFunction: decoders_1.uint256ToBigInt,
|
|
34
|
+
},
|
|
35
|
+
].concat(this.tokens
|
|
36
|
+
.map(t => [
|
|
37
|
+
{
|
|
38
|
+
target: this.config.wooPPV2Address,
|
|
39
|
+
callData: utils_2.ifaces.PPV2.encodeFunctionData('tokenInfos', [t.address]),
|
|
40
|
+
decodeFunction: decoders_2.tokenInfoDecoder,
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
target: this.config.wooPPV2Address,
|
|
44
|
+
callData: utils_2.ifaces.PPV2.encodeFunctionData('decimalInfo', [
|
|
45
|
+
t.address,
|
|
46
|
+
]),
|
|
47
|
+
decodeFunction: decoders_2.decimalInfoDecoder,
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
target: this.config.wooOracleV2Address,
|
|
51
|
+
callData: utils_2.ifaces.oracleV2.encodeFunctionData('state', [t.address]),
|
|
52
|
+
decodeFunction: decoders_2.stateDecoder,
|
|
53
|
+
},
|
|
54
|
+
])
|
|
55
|
+
.flat());
|
|
56
|
+
}
|
|
57
|
+
_parseStateFromMultiResults(multiOutputs) {
|
|
58
|
+
const [isPaused, oracleTimestamp, ...remained] = multiOutputs;
|
|
59
|
+
const tokenInfos = {};
|
|
60
|
+
const decimals = {};
|
|
61
|
+
const tokenStates = {};
|
|
62
|
+
lodash_1.default.chunk(remained, 3).forEach((chunk, i) => {
|
|
63
|
+
const [tokenInfo, decimalInfo, tokenState] = chunk;
|
|
64
|
+
const token = this.tokens[i];
|
|
65
|
+
tokenInfos[token.address] = tokenInfo;
|
|
66
|
+
decimals[token.address] = decimalInfo;
|
|
67
|
+
tokenStates[token.address] = tokenState;
|
|
68
|
+
});
|
|
69
|
+
return {
|
|
70
|
+
tokenInfos,
|
|
71
|
+
tokenStates,
|
|
72
|
+
decimals,
|
|
73
|
+
oracleTimestamp,
|
|
74
|
+
isPaused,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
exports.WooFiV2PollingPool = WooFiV2PollingPool;
|
|
79
|
+
//# sourceMappingURL=woo-fi-v2-pool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"woo-fi-v2-pool.js","sourceRoot":"","sources":["../../../src/dex/woo-fi-v2/woo-fi-v2-pool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { Token, Address, ExchangePrices, PoolPrices, AdapterExchangeParam, SimpleExchangeParam, PoolLiquidity, Logger } from '../../types';
|
|
2
|
+
import { SwapSide, Network } from '../../constants';
|
|
3
|
+
import { IDex } from '../../dex/idex';
|
|
4
|
+
import { IDexHelper } from '../../dex-helper/idex-helper';
|
|
5
|
+
import { WooFiV2Data, DexParams } from './types';
|
|
6
|
+
import { SimpleExchange } from '../simple-exchange';
|
|
7
|
+
import { WooFiV2PollingPool } from './woo-fi-v2-pool';
|
|
8
|
+
import { WooFiV2Math } from './woo-fi-v2-math';
|
|
9
|
+
import { StatePollingManager } from '../../lib/stateful-rpc-poller/state-polling-manager';
|
|
10
|
+
export declare class WooFiV2 extends SimpleExchange implements IDex<WooFiV2Data> {
|
|
11
|
+
protected network: Network;
|
|
12
|
+
readonly dexHelper: IDexHelper;
|
|
13
|
+
protected adapters: import("../../types").AdapterMappings;
|
|
14
|
+
readonly config: DexParams;
|
|
15
|
+
readonly math: WooFiV2Math;
|
|
16
|
+
protected pollingManager: StatePollingManager;
|
|
17
|
+
protected pollingPool?: WooFiV2PollingPool;
|
|
18
|
+
readonly hasConstantPriceLargeAmounts = false;
|
|
19
|
+
readonly needWrapNative = true;
|
|
20
|
+
readonly isFeeOnTransferSupported = false;
|
|
21
|
+
readonly quoteTokenAddress: Address;
|
|
22
|
+
protected _baseTokens?: Token[];
|
|
23
|
+
protected rebateTo?: Address;
|
|
24
|
+
tokenByAddress?: Record<Address, Token>;
|
|
25
|
+
vaultUSDBalance: number;
|
|
26
|
+
static dexKeysWithNetwork: {
|
|
27
|
+
key: string;
|
|
28
|
+
networks: Network[];
|
|
29
|
+
}[];
|
|
30
|
+
logger: Logger;
|
|
31
|
+
constructor(network: Network, dexKey: string, dexHelper: IDexHelper, adapters?: import("../../types").AdapterMappings, config?: DexParams);
|
|
32
|
+
private _toLowerForAllConfigAddresses;
|
|
33
|
+
get baseTokens(): Token[];
|
|
34
|
+
initializePricing(blockNumber: number): Promise<void>;
|
|
35
|
+
getAdapters(side: SwapSide): {
|
|
36
|
+
name: string;
|
|
37
|
+
index: number;
|
|
38
|
+
}[] | null;
|
|
39
|
+
getPoolIdentifiers(srcToken: Token, destToken: Token, side: SwapSide, blockNumber: number): Promise<string[]>;
|
|
40
|
+
getIdentifier(): string;
|
|
41
|
+
getPricesVolume(srcToken: Token, destToken: Token, amounts: bigint[], side: SwapSide, blockNumber: number, limitPools?: string[]): Promise<null | ExchangePrices<WooFiV2Data>>;
|
|
42
|
+
getCalldataGasCost(poolPrices: PoolPrices<WooFiV2Data>): number | number[];
|
|
43
|
+
getAdapterParam(srcToken: string, destToken: string, srcAmount: string, destAmount: string, data: WooFiV2Data, side: SwapSide): AdapterExchangeParam;
|
|
44
|
+
getSimpleParam(srcToken: string, destToken: string, srcAmount: string, destAmount: string, data: WooFiV2Data, side: SwapSide): Promise<SimpleExchangeParam>;
|
|
45
|
+
updatePoolState(): Promise<void>;
|
|
46
|
+
getTopPoolsForToken(tokenAddress: Address, limit: number): Promise<PoolLiquidity[]>;
|
|
47
|
+
private _initializeTokenByAddress;
|
|
48
|
+
_fetchBaseTokensAndFeeWallet(): Promise<Address[]>;
|
|
49
|
+
_fetchDecimals(baseTokenAddresses: Address[]): Promise<number[]>;
|
|
50
|
+
initializeTokensAndAddresses(): Promise<void>;
|
|
51
|
+
private _initializePollingPool;
|
|
52
|
+
}
|
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.WooFiV2 = void 0;
|
|
27
|
+
const constants_1 = require("../../constants");
|
|
28
|
+
const CALLDATA_GAS_COST = __importStar(require("../../calldata-gas-cost"));
|
|
29
|
+
const utils_1 = require("../../utils");
|
|
30
|
+
const decoders_1 = require("../../lib/decoders");
|
|
31
|
+
const simple_exchange_1 = require("../simple-exchange");
|
|
32
|
+
const config_1 = require("./config");
|
|
33
|
+
const woo_fi_v2_pool_1 = require("./woo-fi-v2-pool");
|
|
34
|
+
const woo_fi_v2_math_1 = require("./woo-fi-v2-math");
|
|
35
|
+
const constants_2 = require("./constants");
|
|
36
|
+
const ts_essentials_1 = require("ts-essentials");
|
|
37
|
+
const ethers_1 = require("ethers");
|
|
38
|
+
const decoders_2 = require("../../lib/decoders");
|
|
39
|
+
const utils_2 = require("./utils");
|
|
40
|
+
const state_polling_manager_1 = require("../../lib/stateful-rpc-poller/state-polling-manager");
|
|
41
|
+
class WooFiV2 extends simple_exchange_1.SimpleExchange {
|
|
42
|
+
constructor(network, dexKey, dexHelper, adapters = config_1.Adapters[network] || {}, config = config_1.WooFiV2Config[dexKey][network]) {
|
|
43
|
+
super(dexHelper, dexKey);
|
|
44
|
+
this.network = network;
|
|
45
|
+
this.dexHelper = dexHelper;
|
|
46
|
+
this.adapters = adapters;
|
|
47
|
+
this.config = config;
|
|
48
|
+
this.hasConstantPriceLargeAmounts = false;
|
|
49
|
+
this.needWrapNative = true;
|
|
50
|
+
this.isFeeOnTransferSupported = false;
|
|
51
|
+
this.vaultUSDBalance = 0;
|
|
52
|
+
const loggerName = `${dexKey}-${network}`;
|
|
53
|
+
this.logger = dexHelper.getLogger(loggerName);
|
|
54
|
+
// Normalise once all config addresses and use across all scenarios
|
|
55
|
+
this.config = this._toLowerForAllConfigAddresses();
|
|
56
|
+
this.quoteTokenAddress = this.config.quoteToken.address;
|
|
57
|
+
// Do not do it singleton, because different networks will have different
|
|
58
|
+
// states at the same time
|
|
59
|
+
this.math = new woo_fi_v2_math_1.WooFiV2Math(dexHelper.getLogger(`${loggerName}_math`), this.quoteTokenAddress);
|
|
60
|
+
this.pollingManager = state_polling_manager_1.StatePollingManager.getInstance(dexHelper);
|
|
61
|
+
}
|
|
62
|
+
_toLowerForAllConfigAddresses() {
|
|
63
|
+
// If new config property will be added, the TS will throw compile error
|
|
64
|
+
const newConfig = {
|
|
65
|
+
wooPPV2Address: this.config.wooPPV2Address.toLowerCase(),
|
|
66
|
+
wooOracleV2Address: this.config.wooOracleV2Address.toLowerCase(),
|
|
67
|
+
integrationHelperAddress: this.config.integrationHelperAddress.toLowerCase(),
|
|
68
|
+
quoteToken: {
|
|
69
|
+
...this.config.quoteToken,
|
|
70
|
+
address: this.config.quoteToken.address.toLowerCase(),
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
return newConfig;
|
|
74
|
+
}
|
|
75
|
+
get baseTokens() {
|
|
76
|
+
if (!this._baseTokens) {
|
|
77
|
+
throw new Error(`Base tokens are not set for ${this.dexKey}-${this.network}. Not properly initialized`);
|
|
78
|
+
}
|
|
79
|
+
return this._baseTokens;
|
|
80
|
+
}
|
|
81
|
+
async initializePricing(blockNumber) {
|
|
82
|
+
await this.initializeTokensAndAddresses();
|
|
83
|
+
this._initializePollingPool();
|
|
84
|
+
}
|
|
85
|
+
getAdapters(side) {
|
|
86
|
+
return this.adapters[side] ? this.adapters[side] : null;
|
|
87
|
+
}
|
|
88
|
+
async getPoolIdentifiers(srcToken, destToken, side, blockNumber) {
|
|
89
|
+
if (side === constants_1.SwapSide.BUY)
|
|
90
|
+
return [];
|
|
91
|
+
if (this.tokenByAddress === undefined) {
|
|
92
|
+
this.logger.error(`tokenByAddress is undefined in getPoolIdentifiers`);
|
|
93
|
+
return [];
|
|
94
|
+
}
|
|
95
|
+
const _srcToken = this.dexHelper.config.wrapETH(srcToken);
|
|
96
|
+
const _destToken = this.dexHelper.config.wrapETH(destToken);
|
|
97
|
+
const _srcAddress = _srcToken.address.toLowerCase();
|
|
98
|
+
const _destAddress = _destToken.address.toLowerCase();
|
|
99
|
+
if (_srcAddress === _destAddress)
|
|
100
|
+
return [];
|
|
101
|
+
if (!this.tokenByAddress[_srcAddress] ||
|
|
102
|
+
!this.tokenByAddress[_destAddress]) {
|
|
103
|
+
return [];
|
|
104
|
+
}
|
|
105
|
+
return [this.getIdentifier()];
|
|
106
|
+
}
|
|
107
|
+
getIdentifier() {
|
|
108
|
+
return `${this.dexKey}_wooppv2`;
|
|
109
|
+
}
|
|
110
|
+
async getPricesVolume(srcToken, destToken, amounts, side, blockNumber, limitPools) {
|
|
111
|
+
if (side === constants_1.SwapSide.BUY)
|
|
112
|
+
return null;
|
|
113
|
+
try {
|
|
114
|
+
if (this.tokenByAddress === undefined) {
|
|
115
|
+
this.logger.error(`tokenByAddress is undefined in getPricesVolume`);
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
const _srcToken = this.dexHelper.config.wrapETH(srcToken);
|
|
119
|
+
const _destToken = this.dexHelper.config.wrapETH(destToken);
|
|
120
|
+
const _srcAddress = _srcToken.address.toLowerCase();
|
|
121
|
+
const _destAddress = _destToken.address.toLowerCase();
|
|
122
|
+
if (_srcAddress === _destAddress)
|
|
123
|
+
return null;
|
|
124
|
+
if (!this.tokenByAddress[_srcAddress] ||
|
|
125
|
+
!this.tokenByAddress[_destAddress])
|
|
126
|
+
return null;
|
|
127
|
+
const expectedIdentifier = this.getIdentifier();
|
|
128
|
+
if (limitPools !== undefined &&
|
|
129
|
+
!limitPools.some(p => p === expectedIdentifier))
|
|
130
|
+
return null;
|
|
131
|
+
const unitVolume = (0, utils_1.getBigIntPow)(_srcToken.decimals);
|
|
132
|
+
const _amounts = [unitVolume, ...amounts.slice(1)];
|
|
133
|
+
(0, ts_essentials_1.assert)(this.pollingPool, 'pollingPool is not initialized in getPricesVolume');
|
|
134
|
+
const state = await this.pollingPool.getState(blockNumber);
|
|
135
|
+
if (state === null) {
|
|
136
|
+
this.logger.error(`State is null in getPricesVolume`);
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
if (state.value.isPaused) {
|
|
140
|
+
this.logger.warn(`${this.dexKey} is paused on ${this.network} in getPricesVolume`);
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
this.math.state = state.value;
|
|
144
|
+
const _prices = this.math.query(_srcAddress, _destAddress, _amounts);
|
|
145
|
+
if (!_prices)
|
|
146
|
+
return null;
|
|
147
|
+
const unit = _prices[0];
|
|
148
|
+
return [
|
|
149
|
+
{
|
|
150
|
+
unit,
|
|
151
|
+
prices: [0n, ..._prices.slice(1)],
|
|
152
|
+
data: {},
|
|
153
|
+
poolIdentifier: expectedIdentifier,
|
|
154
|
+
exchange: this.dexKey,
|
|
155
|
+
gasCost: constants_2.WOO_FI_V2_GAS_COST,
|
|
156
|
+
poolAddresses: [this.config.wooPPV2Address],
|
|
157
|
+
},
|
|
158
|
+
];
|
|
159
|
+
}
|
|
160
|
+
catch (e) {
|
|
161
|
+
this.logger.error(`Error_getPricesVolume ${srcToken.symbol || srcToken.address}, ${destToken.symbol || destToken.address}, ${side}:`, e);
|
|
162
|
+
return null;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
getCalldataGasCost(poolPrices) {
|
|
166
|
+
return CALLDATA_GAS_COST.DEX_OVERHEAD + CALLDATA_GAS_COST.ADDRESS;
|
|
167
|
+
}
|
|
168
|
+
getAdapterParam(srcToken, destToken, srcAmount, destAmount, data, side) {
|
|
169
|
+
if (side === constants_1.SwapSide.BUY)
|
|
170
|
+
throw new Error(`Buy not supported`);
|
|
171
|
+
let rebateTo = this.rebateTo;
|
|
172
|
+
if (rebateTo === undefined) {
|
|
173
|
+
this.logger.error(`rebateTo is undefined in getAdapterParam`);
|
|
174
|
+
rebateTo = constants_1.NULL_ADDRESS;
|
|
175
|
+
}
|
|
176
|
+
const payload = this.abiCoder.encodeParameter('address', rebateTo);
|
|
177
|
+
return {
|
|
178
|
+
targetExchange: this.config.wooPPV2Address,
|
|
179
|
+
payload,
|
|
180
|
+
networkFee: '0',
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
async getSimpleParam(srcToken, destToken, srcAmount, destAmount, data, side) {
|
|
184
|
+
if (side === constants_1.SwapSide.BUY)
|
|
185
|
+
throw new Error(`Buy not supported`);
|
|
186
|
+
const _srcToken = srcToken.toLowerCase();
|
|
187
|
+
const _destToken = destToken.toLowerCase();
|
|
188
|
+
let rebateTo = this.rebateTo;
|
|
189
|
+
if (rebateTo === undefined) {
|
|
190
|
+
this.logger.error(`rebateTo is undefined in getAdapterParam`);
|
|
191
|
+
rebateTo = constants_1.NULL_ADDRESS;
|
|
192
|
+
}
|
|
193
|
+
const swapData = utils_2.ifaces.PPV2.encodeFunctionData('swap', [
|
|
194
|
+
_srcToken,
|
|
195
|
+
_destToken,
|
|
196
|
+
srcAmount,
|
|
197
|
+
constants_2.MIN_CONVERSION_RATE,
|
|
198
|
+
this.augustusAddress,
|
|
199
|
+
rebateTo,
|
|
200
|
+
]);
|
|
201
|
+
const transferParams = this.erc20Interface.encodeFunctionData('transfer', [
|
|
202
|
+
this.config.wooPPV2Address,
|
|
203
|
+
srcAmount,
|
|
204
|
+
]);
|
|
205
|
+
return {
|
|
206
|
+
callees: [srcToken, this.config.wooPPV2Address],
|
|
207
|
+
calldata: [transferParams, swapData],
|
|
208
|
+
values: ['0', '0'],
|
|
209
|
+
networkFee: '0',
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
async updatePoolState() {
|
|
213
|
+
await this.initializeTokensAndAddresses();
|
|
214
|
+
this._initializePollingPool();
|
|
215
|
+
if (this.tokenByAddress === undefined) {
|
|
216
|
+
this.logger.error(`tokenByAddress is undefined in updatePoolState`);
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
(0, ts_essentials_1.assert)(this.pollingPool, 'pollingPool is not initialized in updatePoolState');
|
|
220
|
+
const state = await this.pollingPool.getState();
|
|
221
|
+
if (!state) {
|
|
222
|
+
this.logger.error(`Failed to updatePoolState. State is null. VaultUSDBalance: ${this.vaultUSDBalance} was not updated`);
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
const tokenBalancesUSD = await Promise.all(Object.values(this.tokenByAddress).map(t => this.dexHelper.getTokenUSDPrice(t, state.value.tokenInfos[t.address].reserve)));
|
|
226
|
+
this.vaultUSDBalance = tokenBalancesUSD.reduce((sum, curr) => sum + curr);
|
|
227
|
+
}
|
|
228
|
+
async getTopPoolsForToken(tokenAddress, limit) {
|
|
229
|
+
const wrappedTokenAddress = this.dexHelper.config
|
|
230
|
+
.wrapETH({ address: tokenAddress, decimals: 0 })
|
|
231
|
+
.address.toLowerCase();
|
|
232
|
+
if (this.tokenByAddress === undefined) {
|
|
233
|
+
this.logger.error(`tokenByAddress is undefined in getTopPoolsForToken`);
|
|
234
|
+
return [];
|
|
235
|
+
}
|
|
236
|
+
if (!this.tokenByAddress[wrappedTokenAddress])
|
|
237
|
+
return [];
|
|
238
|
+
(0, ts_essentials_1.assert)(this.pollingPool, 'pollingPool is not initialized in getTopPoolsForToken');
|
|
239
|
+
const latestState = await this.pollingPool.getState();
|
|
240
|
+
if (!latestState)
|
|
241
|
+
return [];
|
|
242
|
+
if (latestState.value.isPaused) {
|
|
243
|
+
this.logger.warn(`Paused on ${this.network} in getTopPoolsForToken`);
|
|
244
|
+
return [];
|
|
245
|
+
}
|
|
246
|
+
const connectorTokens = wrappedTokenAddress === this.quoteTokenAddress
|
|
247
|
+
? this.baseTokens
|
|
248
|
+
: [this.tokenByAddress[this.quoteTokenAddress]];
|
|
249
|
+
return [
|
|
250
|
+
{
|
|
251
|
+
exchange: this.dexKey,
|
|
252
|
+
address: this.config.wooPPV2Address,
|
|
253
|
+
connectorTokens,
|
|
254
|
+
liquidityUSD: this.vaultUSDBalance,
|
|
255
|
+
},
|
|
256
|
+
];
|
|
257
|
+
}
|
|
258
|
+
_initializeTokenByAddress(baseTokens) {
|
|
259
|
+
this.tokenByAddress = baseTokens.reduce((acc, cur) => {
|
|
260
|
+
acc[cur.address] = cur;
|
|
261
|
+
return acc;
|
|
262
|
+
}, { [this.quoteTokenAddress]: this.config.quoteToken });
|
|
263
|
+
}
|
|
264
|
+
async _fetchBaseTokensAndFeeWallet() {
|
|
265
|
+
return (await this.dexHelper.multiWrapper.aggregate([
|
|
266
|
+
{
|
|
267
|
+
target: this.augustusAddress,
|
|
268
|
+
callData: this.augustusInterface.encodeFunctionData('getFeeWallet', []),
|
|
269
|
+
decodeFunction: decoders_2.addressDecode,
|
|
270
|
+
},
|
|
271
|
+
{
|
|
272
|
+
target: this.config.integrationHelperAddress,
|
|
273
|
+
callData: utils_2.ifaces.integrationHelper.encodeFunctionData('allBaseTokens'),
|
|
274
|
+
decodeFunction: decoders_1.addressArrayDecode,
|
|
275
|
+
},
|
|
276
|
+
])).flat();
|
|
277
|
+
}
|
|
278
|
+
async _fetchDecimals(baseTokenAddresses) {
|
|
279
|
+
return this.dexHelper.multiWrapper.aggregate(baseTokenAddresses.map(address => {
|
|
280
|
+
return {
|
|
281
|
+
target: address,
|
|
282
|
+
callData: this.erc20Interface.encodeFunctionData('decimals'),
|
|
283
|
+
decodeFunction: decoders_1.uint8ToNumber,
|
|
284
|
+
};
|
|
285
|
+
}));
|
|
286
|
+
}
|
|
287
|
+
async initializeTokensAndAddresses() {
|
|
288
|
+
const [rebateTo, ...baseTokenAddresses] = await this._fetchBaseTokensAndFeeWallet();
|
|
289
|
+
(0, ts_essentials_1.assert)(ethers_1.ethers.utils.isAddress(rebateTo), 'Invalid rebateTo address');
|
|
290
|
+
this.rebateTo = rebateTo;
|
|
291
|
+
const decimals = await this._fetchDecimals(baseTokenAddresses);
|
|
292
|
+
(0, ts_essentials_1.assert)(decimals.length === baseTokenAddresses.length, 'Decimals length mismatch');
|
|
293
|
+
this._baseTokens = baseTokenAddresses.reduce((acc, curr, i) => {
|
|
294
|
+
acc.push({
|
|
295
|
+
address: curr,
|
|
296
|
+
decimals: decimals[i],
|
|
297
|
+
});
|
|
298
|
+
return acc;
|
|
299
|
+
}, []);
|
|
300
|
+
this._initializeTokenByAddress(this.baseTokens);
|
|
301
|
+
}
|
|
302
|
+
_initializePollingPool() {
|
|
303
|
+
(0, ts_essentials_1.assert)(this.tokenByAddress, 'tokenByAddress is not properly');
|
|
304
|
+
this.pollingPool = new woo_fi_v2_pool_1.WooFiV2PollingPool(this.dexKey, this.getIdentifier(), this.dexHelper, this.config, Object.values(this.tokenByAddress));
|
|
305
|
+
this.pollingManager.initializeAllPendingPools();
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
exports.WooFiV2 = WooFiV2;
|
|
309
|
+
WooFiV2.dexKeysWithNetwork = (0, utils_1.getDexKeysWithNetwork)(config_1.WooFiV2Config);
|
|
310
|
+
//# sourceMappingURL=woo-fi-v2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"woo-fi-v2.js","sourceRoot":"","sources":["../../../src/dex/woo-fi-v2/woo-fi-v2.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAUA,+CAAkE;AAClE,2EAA6D;AAC7D,uCAAkE;AAElE,iDAAuE;AAGvE,wDAAoD;AACpD,qCAAmD;AACnD,qDAAsD;AACtD,qDAA+C;AAC/C,2CAAsE;AACtE,iDAAuC;AACvC,mCAAgC;AAChC,iDAAmD;AACnD,mCAAiC;AACjC,+FAA0F;AAE1F,MAAa,OAAQ,SAAQ,gCAAc;IA2BzC,YACY,OAAgB,EAC1B,MAAc,EACL,SAAqB,EACpB,WAAW,iBAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EACnC,SAAS,sBAAa,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;QAEhD,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QANf,YAAO,GAAP,OAAO,CAAS;QAEjB,cAAS,GAAT,SAAS,CAAY;QACpB,aAAQ,GAAR,QAAQ,CAA0B;QACnC,WAAM,GAAN,MAAM,CAAiC;QAzBzC,iCAA4B,GAAG,KAAK,CAAC;QACrC,mBAAc,GAAG,IAAI,CAAC;QAEtB,6BAAwB,GAAG,KAAK,CAAC;QAU1C,oBAAe,GAAW,CAAC,CAAC;QAe1B,MAAM,UAAU,GAAG,GAAG,MAAM,IAAI,OAAO,EAAE,CAAC;QAC1C,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAE9C,mEAAmE;QACnE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,6BAA6B,EAAE,CAAC;QAEnD,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC;QAExD,yEAAyE;QACzE,0BAA0B;QAC1B,IAAI,CAAC,IAAI,GAAG,IAAI,4BAAW,CACzB,SAAS,CAAC,SAAS,CAAC,GAAG,UAAU,OAAO,CAAC,EACzC,IAAI,CAAC,iBAAiB,CACvB,CAAC;QACF,IAAI,CAAC,cAAc,GAAG,2CAAmB,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IACnE,CAAC;IAEO,6BAA6B;QACnC,wEAAwE;QACxE,MAAM,SAAS,GAAc;YAC3B,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,WAAW,EAAE;YACxD,kBAAkB,EAAE,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,WAAW,EAAE;YAChE,wBAAwB,EACtB,IAAI,CAAC,MAAM,CAAC,wBAAwB,CAAC,WAAW,EAAE;YACpD,UAAU,EAAE;gBACV,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU;gBACzB,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,WAAW,EAAE;aACtD;SACF,CAAC;QACF,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,UAAU;QACZ,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YACrB,MAAM,IAAI,KAAK,CACb,+BAA+B,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,OAAO,4BAA4B,CACvF,CAAC;SACH;QACD,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,WAAmB;QACzC,MAAM,IAAI,CAAC,4BAA4B,EAAE,CAAC;QAC1C,IAAI,CAAC,sBAAsB,EAAE,CAAC;IAChC,CAAC;IAED,WAAW,CAAC,IAAc;QACxB,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1D,CAAC;IAED,KAAK,CAAC,kBAAkB,CACtB,QAAe,EACf,SAAgB,EAChB,IAAc,EACd,WAAmB;QAEnB,IAAI,IAAI,KAAK,oBAAQ,CAAC,GAAG;YAAE,OAAO,EAAE,CAAC;QAErC,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS,EAAE;YACrC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;YACvE,OAAO,EAAE,CAAC;SACX;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC1D,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAE5D,MAAM,WAAW,GAAG,SAAS,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QACpD,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QAEtD,IAAI,WAAW,KAAK,YAAY;YAAE,OAAO,EAAE,CAAC;QAE5C,IACE,CAAC,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC;YACjC,CAAC,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,EAClC;YACA,OAAO,EAAE,CAAC;SACX;QAED,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;IAChC,CAAC;IAED,aAAa;QACX,OAAO,GAAG,IAAI,CAAC,MAAM,UAAU,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,eAAe,CACnB,QAAe,EACf,SAAgB,EAChB,OAAiB,EACjB,IAAc,EACd,WAAmB,EACnB,UAAqB;QAErB,IAAI,IAAI,KAAK,oBAAQ,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QAEvC,IAAI;YACF,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS,EAAE;gBACrC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;gBACpE,OAAO,IAAI,CAAC;aACb;YAED,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC1D,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAE5D,MAAM,WAAW,GAAG,SAAS,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YACpD,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YAEtD,IAAI,WAAW,KAAK,YAAY;gBAAE,OAAO,IAAI,CAAC;YAE9C,IACE,CAAC,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC;gBACjC,CAAC,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC;gBAElC,OAAO,IAAI,CAAC;YAEd,MAAM,kBAAkB,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YAEhD,IACE,UAAU,KAAK,SAAS;gBACxB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,kBAAkB,CAAC;gBAE/C,OAAO,IAAI,CAAC;YAEd,MAAM,UAAU,GAAG,IAAA,oBAAY,EAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YAEpD,MAAM,QAAQ,GAAG,CAAC,UAAU,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAEnD,IAAA,sBAAM,EACJ,IAAI,CAAC,WAAW,EAChB,mDAAmD,CACpD,CAAC;YAEF,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;YAE3D,IAAI,KAAK,KAAK,IAAI,EAAE;gBAClB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;gBACtD,OAAO,IAAI,CAAC;aACb;YAED,IAAI,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE;gBACxB,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,GAAG,IAAI,CAAC,MAAM,iBAAiB,IAAI,CAAC,OAAO,qBAAqB,CACjE,CAAC;gBACF,OAAO,IAAI,CAAC;aACb;YAED,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;YAE9B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;YAErE,IAAI,CAAC,OAAO;gBAAE,OAAO,IAAI,CAAC;YAE1B,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YAExB,OAAO;gBACL;oBACE,IAAI;oBACJ,MAAM,EAAE,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;oBACjC,IAAI,EAAE,EAAE;oBACR,cAAc,EAAE,kBAAkB;oBAClC,QAAQ,EAAE,IAAI,CAAC,MAAM;oBACrB,OAAO,EAAE,8BAAkB;oBAC3B,aAAa,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;iBAC5C;aACF,CAAC;SACH;QAAC,OAAO,CAAC,EAAE;YACV,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,yBAAyB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,OAAO,KAC1D,SAAS,CAAC,MAAM,IAAI,SAAS,CAAC,OAChC,KAAK,IAAI,GAAG,EACZ,CAAC,CACF,CAAC;YACF,OAAO,IAAI,CAAC;SACb;IACH,CAAC;IAED,kBAAkB,CAAC,UAAmC;QACpD,OAAO,iBAAiB,CAAC,YAAY,GAAG,iBAAiB,CAAC,OAAO,CAAC;IACpE,CAAC;IAED,eAAe,CACb,QAAgB,EAChB,SAAiB,EACjB,SAAiB,EACjB,UAAkB,EAClB,IAAiB,EACjB,IAAc;QAEd,IAAI,IAAI,KAAK,oBAAQ,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAEhE,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC7B,IAAI,QAAQ,KAAK,SAAS,EAAE;YAC1B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;YAC9D,QAAQ,GAAG,wBAAY,CAAC;SACzB;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAEnE,OAAO;YACL,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc;YAC1C,OAAO;YACP,UAAU,EAAE,GAAG;SAChB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,cAAc,CAClB,QAAgB,EAChB,SAAiB,EACjB,SAAiB,EACjB,UAAkB,EAClB,IAAiB,EACjB,IAAc;QAEd,IAAI,IAAI,KAAK,oBAAQ,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAEhE,MAAM,SAAS,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;QACzC,MAAM,UAAU,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;QAE3C,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC7B,IAAI,QAAQ,KAAK,SAAS,EAAE;YAC1B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;YAC9D,QAAQ,GAAG,wBAAY,CAAC;SACzB;QAED,MAAM,QAAQ,GAAG,cAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE;YACtD,SAAS;YACT,UAAU;YACV,SAAS;YACT,+BAAmB;YACnB,IAAI,CAAC,eAAe;YACpB,QAAQ;SACT,CAAC,CAAC;QAEH,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,UAAU,EAAE;YACxE,IAAI,CAAC,MAAM,CAAC,cAAc;YAC1B,SAAS;SACV,CAAC,CAAC;QAEH,OAAO;YACL,OAAO,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;YAC/C,QAAQ,EAAE,CAAC,cAAc,EAAE,QAAQ,CAAC;YACpC,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC;YAClB,UAAU,EAAE,GAAG;SAChB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,MAAM,IAAI,CAAC,4BAA4B,EAAE,CAAC;QAC1C,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAE9B,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS,EAAE;YACrC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;YACpE,OAAO;SACR;QAED,IAAA,sBAAM,EACJ,IAAI,CAAC,WAAW,EAChB,mDAAmD,CACpD,CAAC;QACF,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;QAEhD,IAAI,CAAC,KAAK,EAAE;YACV,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,8DAA8D,IAAI,CAAC,eAAe,kBAAkB,CACrG,CAAC;YACF,OAAO;SACR;QAED,MAAM,gBAAgB,GAAG,MAAM,OAAO,CAAC,GAAG,CACxC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CACzC,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAC7B,CAAC,EACD,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAC1C,CACF,CACF,CAAC;QACF,IAAI,CAAC,eAAe,GAAG,gBAAgB,CAAC,MAAM,CAC5C,CAAC,GAAW,EAAE,IAAY,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,CAC1C,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,mBAAmB,CACvB,YAAqB,EACrB,KAAa;QAEb,MAAM,mBAAmB,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM;aAC9C,OAAO,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;aAC/C,OAAO,CAAC,WAAW,EAAE,CAAC;QAEzB,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS,EAAE;YACrC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;YACxE,OAAO,EAAE,CAAC;SACX;QAED,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,mBAAmB,CAAC;YAAE,OAAO,EAAE,CAAC;QAEzD,IAAA,sBAAM,EACJ,IAAI,CAAC,WAAW,EAChB,uDAAuD,CACxD,CAAC;QACF,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;QACtD,IAAI,CAAC,WAAW;YAAE,OAAO,EAAE,CAAC;QAE5B,IAAI,WAAW,CAAC,KAAK,CAAC,QAAQ,EAAE;YAC9B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,OAAO,yBAAyB,CAAC,CAAC;YACrE,OAAO,EAAE,CAAC;SACX;QAED,MAAM,eAAe,GACnB,mBAAmB,KAAK,IAAI,CAAC,iBAAiB;YAC5C,CAAC,CAAC,IAAI,CAAC,UAAU;YACjB,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;QAEpD,OAAO;YACL;gBACE,QAAQ,EAAE,IAAI,CAAC,MAAM;gBACrB,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc;gBACnC,eAAe;gBACf,YAAY,EAAE,IAAI,CAAC,eAAe;aACnC;SACF,CAAC;IACJ,CAAC;IAEO,yBAAyB,CAAC,UAAmB;QACnD,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC,MAAM,CACrC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YACX,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC;YACvB,OAAO,GAAG,CAAC;QACb,CAAC,EACD,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CACrD,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,4BAA4B;QAChC,OAAO,CACL,MAAM,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,SAAS,CAAC;YAC1C;gBACE,MAAM,EAAE,IAAI,CAAC,eAAe;gBAC5B,QAAQ,EAAE,IAAI,CAAC,iBAAiB,CAAC,kBAAkB,CACjD,cAAc,EACd,EAAE,CACH;gBACD,cAAc,EAAE,wBAAa;aAC9B;YACD;gBACE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,wBAAwB;gBAC5C,QAAQ,EACN,cAAM,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,eAAe,CAAC;gBAC9D,cAAc,EAAE,6BAAkB;aACnC;SACF,CAAC,CACH,CAAC,IAAI,EAAE,CAAC;IACX,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,kBAA6B;QAChD,OAAO,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,SAAS,CAC1C,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;YAC/B,OAAO;gBACL,MAAM,EAAE,OAAO;gBACf,QAAQ,EAAE,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,UAAU,CAAC;gBAC5D,cAAc,EAAE,wBAAa;aAC9B,CAAC;QACJ,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,4BAA4B;QAChC,MAAM,CAAC,QAAQ,EAAE,GAAG,kBAAkB,CAAC,GACrC,MAAM,IAAI,CAAC,4BAA4B,EAAE,CAAC;QAE5C,IAAA,sBAAM,EAAC,eAAM,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,0BAA0B,CAAC,CAAC;QAErE,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC;QAE/D,IAAA,sBAAM,EACJ,QAAQ,CAAC,MAAM,KAAK,kBAAkB,CAAC,MAAM,EAC7C,0BAA0B,CAC3B,CAAC;QAEF,IAAI,CAAC,WAAW,GAAG,kBAAkB,CAAC,MAAM,CAAU,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE;YACrE,GAAG,CAAC,IAAI,CAAC;gBACP,OAAO,EAAE,IAAI;gBACb,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;aACtB,CAAC,CAAC;YACH,OAAO,GAAG,CAAC;QACb,CAAC,EAAE,EAAE,CAAC,CAAC;QAEP,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAClD,CAAC;IAEO,sBAAsB;QAC5B,IAAA,sBAAM,EAAC,IAAI,CAAC,cAAc,EAAE,gCAAgC,CAAC,CAAC;QAE9D,IAAI,CAAC,WAAW,GAAG,IAAI,mCAAkB,CACvC,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,aAAa,EAAE,EACpB,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,MAAM,EACX,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CACnC,CAAC;QAEF,IAAI,CAAC,cAAc,CAAC,yBAAyB,EAAE,CAAC;IAClD,CAAC;;AAtbH,0BAubC;AAjae,0BAAkB,GAC9B,IAAA,6BAAqB,EAAC,sBAAa,CAAC,CAAC"}
|