@paraswap/dex-lib 4.5.10 → 4.5.12-fluid-dex-lite.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/build/abi/bunni-v2/BunniHook.abi.json +1921 -0
- package/build/abi/bunni-v2/BunniHub.abi.json +1598 -0
- package/build/abi/bunni-v2/BunniToken.abi.json +833 -0
- package/build/abi/bunni-v2/FeeOverrideHooklet.abi.json +1947 -0
- package/build/abi/bunni-v2/FloodPlain.abi.json +1195 -0
- package/build/abi/bunni-v2/PoolManager.abi.json +1366 -0
- package/build/abi/bunni-v2/V4Quoter.abi.json +637 -0
- package/build/abi/fluid-dex-lite/FluidDexLite.abi.json +262 -0
- package/build/abi/miro-migrator/MiroMigrator.abi.json +19 -36
- package/build/abi/pangolin-v3/PangolinV3StateMulticall.abi.json +796 -0
- package/build/abi/ring-v2/few-wrapped-token.json +587 -0
- package/build/abi/ring-v2/ring-v2-factory.json +125 -0
- package/build/abi/ring-v2/ring-v2-pool.json +461 -0
- package/build/abi/ring-v2/ring-v2-router.json +332 -0
- package/build/abi/uniswap-v4/hooks/cabalcoin-hook.abi.json +682 -0
- package/build/abi/uniswap-v4/hooks/fee-hook.abi.json +1335 -0
- package/build/config.js +13 -13
- package/build/dex/balancer-v3/config.d.ts +1 -1
- package/build/dex/balancer-v3/config.js +23 -1
- package/build/dex/balancer-v3/config.js.map +1 -1
- package/build/dex/bunni-v2/bunni-v2-pool.d.ts +61 -0
- package/build/dex/bunni-v2/bunni-v2-pool.js +495 -0
- package/build/dex/bunni-v2/bunni-v2-pool.js.map +1 -0
- package/build/dex/bunni-v2/bunni-v2.d.ts +49 -0
- package/build/dex/bunni-v2/bunni-v2.js +435 -0
- package/build/dex/bunni-v2/bunni-v2.js.map +1 -0
- package/build/dex/bunni-v2/config.d.ts +3 -0
- package/build/dex/bunni-v2/config.js +130 -0
- package/build/dex/bunni-v2/config.js.map +1 -0
- package/build/dex/bunni-v2/encoder.d.ts +19 -0
- package/build/dex/bunni-v2/encoder.js +400 -0
- package/build/dex/bunni-v2/encoder.js.map +1 -0
- package/build/dex/bunni-v2/getOnChainState.d.ts +25 -0
- package/build/dex/bunni-v2/getOnChainState.js +455 -0
- package/build/dex/bunni-v2/getOnChainState.js.map +1 -0
- package/build/dex/bunni-v2/hook/BunniSwapMath.d.ts +7 -0
- package/build/dex/bunni-v2/hook/BunniSwapMath.js +198 -0
- package/build/dex/bunni-v2/hook/BunniSwapMath.js.map +1 -0
- package/build/dex/bunni-v2/hook/SwapMath.d.ts +8 -0
- package/build/dex/bunni-v2/hook/SwapMath.js +65 -0
- package/build/dex/bunni-v2/hook/SwapMath.js.map +1 -0
- package/build/dex/bunni-v2/hooklet/FeeOverrideHooklet.d.ts +33 -0
- package/build/dex/bunni-v2/hooklet/FeeOverrideHooklet.js +33 -0
- package/build/dex/bunni-v2/hooklet/FeeOverrideHooklet.js.map +1 -0
- package/build/dex/bunni-v2/hooklet/index.d.ts +21 -0
- package/build/dex/bunni-v2/hooklet/index.js +64 -0
- package/build/dex/bunni-v2/hooklet/index.js.map +1 -0
- package/build/dex/bunni-v2/ldf/CarpetedDoubleGeometricDistribution.d.ts +70 -0
- package/build/dex/bunni-v2/ldf/CarpetedDoubleGeometricDistribution.js +277 -0
- package/build/dex/bunni-v2/ldf/CarpetedDoubleGeometricDistribution.js.map +1 -0
- package/build/dex/bunni-v2/ldf/CarpetedGeometricDistribution.d.ts +64 -0
- package/build/dex/bunni-v2/ldf/CarpetedGeometricDistribution.js +262 -0
- package/build/dex/bunni-v2/ldf/CarpetedGeometricDistribution.js.map +1 -0
- package/build/dex/bunni-v2/ldf/DoubleGeometricDistribution.d.ts +60 -0
- package/build/dex/bunni-v2/ldf/DoubleGeometricDistribution.js +224 -0
- package/build/dex/bunni-v2/ldf/DoubleGeometricDistribution.js.map +1 -0
- package/build/dex/bunni-v2/ldf/GeometricDistribution.d.ts +56 -0
- package/build/dex/bunni-v2/ldf/GeometricDistribution.js +489 -0
- package/build/dex/bunni-v2/ldf/GeometricDistribution.js.map +1 -0
- package/build/dex/bunni-v2/ldf/LDFType.d.ts +5 -0
- package/build/dex/bunni-v2/ldf/LDFType.js +10 -0
- package/build/dex/bunni-v2/ldf/LDFType.js.map +1 -0
- package/build/dex/bunni-v2/ldf/ShiftMode.d.ts +7 -0
- package/build/dex/bunni-v2/ldf/ShiftMode.js +19 -0
- package/build/dex/bunni-v2/ldf/ShiftMode.js.map +1 -0
- package/build/dex/bunni-v2/ldf/UniformDistribution.d.ts +55 -0
- package/build/dex/bunni-v2/ldf/UniformDistribution.js +291 -0
- package/build/dex/bunni-v2/ldf/UniformDistribution.js.map +1 -0
- package/build/dex/bunni-v2/ldf/index.d.ts +15 -0
- package/build/dex/bunni-v2/ldf/index.js +21 -0
- package/build/dex/bunni-v2/ldf/index.js.map +1 -0
- package/build/dex/bunni-v2/lib/AmAmmPayload.d.ts +4 -0
- package/build/dex/bunni-v2/lib/AmAmmPayload.js +10 -0
- package/build/dex/bunni-v2/lib/AmAmmPayload.js.map +1 -0
- package/build/dex/bunni-v2/lib/BitMath.d.ts +4 -0
- package/build/dex/bunni-v2/lib/BitMath.js +24 -0
- package/build/dex/bunni-v2/lib/BitMath.js.map +1 -0
- package/build/dex/bunni-v2/lib/Constants.d.ts +14 -0
- package/build/dex/bunni-v2/lib/Constants.js +18 -0
- package/build/dex/bunni-v2/lib/Constants.js.map +1 -0
- package/build/dex/bunni-v2/lib/ExpMath.d.ts +5 -0
- package/build/dex/bunni-v2/lib/ExpMath.js +121 -0
- package/build/dex/bunni-v2/lib/ExpMath.js.map +1 -0
- package/build/dex/bunni-v2/lib/FeeMath.d.ts +2 -0
- package/build/dex/bunni-v2/lib/FeeMath.js +27 -0
- package/build/dex/bunni-v2/lib/FeeMath.js.map +1 -0
- package/build/dex/bunni-v2/lib/FixedPointMath.d.ts +3 -0
- package/build/dex/bunni-v2/lib/FixedPointMath.js +15 -0
- package/build/dex/bunni-v2/lib/FixedPointMath.js.map +1 -0
- package/build/dex/bunni-v2/lib/FullMathX96.d.ts +4 -0
- package/build/dex/bunni-v2/lib/FullMathX96.js +21 -0
- package/build/dex/bunni-v2/lib/FullMathX96.js.map +1 -0
- package/build/dex/bunni-v2/lib/IdleBalance.d.ts +11 -0
- package/build/dex/bunni-v2/lib/IdleBalance.js +33 -0
- package/build/dex/bunni-v2/lib/IdleBalance.js.map +1 -0
- package/build/dex/bunni-v2/lib/LiquidityAmounts.d.ts +6 -0
- package/build/dex/bunni-v2/lib/LiquidityAmounts.js +25 -0
- package/build/dex/bunni-v2/lib/LiquidityAmounts.js.map +1 -0
- package/build/dex/bunni-v2/lib/Math.d.ts +28 -0
- package/build/dex/bunni-v2/lib/Math.js +169 -0
- package/build/dex/bunni-v2/lib/Math.js.map +1 -0
- package/build/dex/bunni-v2/lib/Oracle.d.ts +27 -0
- package/build/dex/bunni-v2/lib/Oracle.js +180 -0
- package/build/dex/bunni-v2/lib/Oracle.js.map +1 -0
- package/build/dex/bunni-v2/lib/QueryLDF.d.ts +12 -0
- package/build/dex/bunni-v2/lib/QueryLDF.js +90 -0
- package/build/dex/bunni-v2/lib/QueryLDF.js.map +1 -0
- package/build/dex/bunni-v2/lib/QueryTwap.d.ts +2 -0
- package/build/dex/bunni-v2/lib/QueryTwap.js +13 -0
- package/build/dex/bunni-v2/lib/QueryTwap.js.map +1 -0
- package/build/dex/bunni-v2/lib/SqrtPriceMath.d.ts +8 -0
- package/build/dex/bunni-v2/lib/SqrtPriceMath.js +84 -0
- package/build/dex/bunni-v2/lib/SqrtPriceMath.js.map +1 -0
- package/build/dex/bunni-v2/lib/TickMath.d.ts +11 -0
- package/build/dex/bunni-v2/lib/TickMath.js +100 -0
- package/build/dex/bunni-v2/lib/TickMath.js.map +1 -0
- package/build/dex/bunni-v2/lib/VaultMath.d.ts +2 -0
- package/build/dex/bunni-v2/lib/VaultMath.js +11 -0
- package/build/dex/bunni-v2/lib/VaultMath.js.map +1 -0
- package/build/dex/bunni-v2/logic/AmAmm.d.ts +11 -0
- package/build/dex/bunni-v2/logic/AmAmm.js +156 -0
- package/build/dex/bunni-v2/logic/AmAmm.js.map +1 -0
- package/build/dex/bunni-v2/logic/BunniHookLogic.d.ts +10 -0
- package/build/dex/bunni-v2/logic/BunniHookLogic.js +298 -0
- package/build/dex/bunni-v2/logic/BunniHookLogic.js.map +1 -0
- package/build/dex/bunni-v2/logic/BunniHubLogic.d.ts +5 -0
- package/build/dex/bunni-v2/logic/BunniHubLogic.js +245 -0
- package/build/dex/bunni-v2/logic/BunniHubLogic.js.map +1 -0
- package/build/dex/bunni-v2/logic/BunniQuoter.d.ts +12 -0
- package/build/dex/bunni-v2/logic/BunniQuoter.js +201 -0
- package/build/dex/bunni-v2/logic/BunniQuoter.js.map +1 -0
- package/build/dex/bunni-v2/subgraph.d.ts +7 -0
- package/build/dex/bunni-v2/subgraph.js +184 -0
- package/build/dex/bunni-v2/subgraph.js.map +1 -0
- package/build/dex/bunni-v2/types.d.ts +256 -0
- package/build/dex/bunni-v2/types.js +3 -0
- package/build/dex/bunni-v2/types.js.map +1 -0
- package/build/dex/bunni-v2/utils.d.ts +12 -0
- package/build/dex/bunni-v2/utils.js +181 -0
- package/build/dex/bunni-v2/utils.js.map +1 -0
- package/build/dex/fluid-dex-lite/config.d.ts +3 -0
- package/build/dex/fluid-dex-lite/config.js +12 -0
- package/build/dex/fluid-dex-lite/config.js.map +1 -0
- package/build/dex/fluid-dex-lite/fluid-dex-lite-math.d.ts +63 -0
- package/build/dex/fluid-dex-lite/fluid-dex-lite-math.js +543 -0
- package/build/dex/fluid-dex-lite/fluid-dex-lite-math.js.map +1 -0
- package/build/dex/fluid-dex-lite/fluid-dex-lite-pool.d.ts +31 -0
- package/build/dex/fluid-dex-lite/fluid-dex-lite-pool.js +105 -0
- package/build/dex/fluid-dex-lite/fluid-dex-lite-pool.js.map +1 -0
- package/build/dex/fluid-dex-lite/fluid-dex-lite.d.ts +45 -0
- package/build/dex/fluid-dex-lite/fluid-dex-lite.js +461 -0
- package/build/dex/fluid-dex-lite/fluid-dex-lite.js.map +1 -0
- package/build/dex/fluid-dex-lite/types.d.ts +54 -0
- package/build/dex/fluid-dex-lite/types.js +3 -0
- package/build/dex/fluid-dex-lite/types.js.map +1 -0
- package/build/dex/fluid-dex-lite/utils.d.ts +12 -0
- package/build/dex/fluid-dex-lite/utils.js +51 -0
- package/build/dex/fluid-dex-lite/utils.js.map +1 -0
- package/build/dex/index.js +2 -0
- package/build/dex/index.js.map +1 -1
- package/build/dex/miro-migrator/config.js +10 -3
- package/build/dex/miro-migrator/config.js.map +1 -1
- package/build/dex/miro-migrator/constants.d.ts +1 -2
- package/build/dex/miro-migrator/constants.js +2 -3
- package/build/dex/miro-migrator/constants.js.map +1 -1
- package/build/dex/miro-migrator/miro-migrator-pool.d.ts +5 -9
- package/build/dex/miro-migrator/miro-migrator-pool.js +30 -49
- package/build/dex/miro-migrator/miro-migrator-pool.js.map +1 -1
- package/build/dex/miro-migrator/miro-migrator-state.d.ts +27 -0
- package/build/dex/miro-migrator/miro-migrator-state.js +89 -0
- package/build/dex/miro-migrator/miro-migrator-state.js.map +1 -0
- package/build/dex/miro-migrator/miro-migrator.d.ts +4 -5
- package/build/dex/miro-migrator/miro-migrator.js +83 -41
- package/build/dex/miro-migrator/miro-migrator.js.map +1 -1
- package/build/dex/miro-migrator/types.d.ts +4 -2
- package/build/dex/miro-migrator/types.js +2 -1
- package/build/dex/miro-migrator/types.js.map +1 -1
- package/build/dex/uniswap-v3/forks/pangolin-v3/utils.d.ts +4 -0
- package/build/dex/uniswap-v3/forks/pangolin-v3/utils.js +56 -0
- package/build/dex/uniswap-v3/forks/pangolin-v3/utils.js.map +1 -0
- package/build/dex/uniswap-v4/hooks/cabalcoin-hook/cabalcoin-hook-pool.d.ts +7 -0
- package/build/dex/uniswap-v4/hooks/cabalcoin-hook/cabalcoin-hook-pool.js +28 -0
- package/build/dex/uniswap-v4/hooks/cabalcoin-hook/cabalcoin-hook-pool.js.map +1 -0
- package/build/dex/uniswap-v4/hooks/cabalcoin-hook/types.d.ts +0 -0
- package/build/dex/uniswap-v4/hooks/cabalcoin-hook/types.js +2 -0
- package/build/dex/uniswap-v4/hooks/cabalcoin-hook/types.js.map +1 -0
- package/build/dex/uniswap-v4/hooks/fee-hook/fee-hook-pool.d.ts +7 -0
- package/build/dex/uniswap-v4/hooks/fee-hook/fee-hook-pool.js +28 -0
- package/build/dex/uniswap-v4/hooks/fee-hook/fee-hook-pool.js.map +1 -0
- package/build/dex/uniswap-v4/hooks/fee-hook/types.d.ts +0 -0
- package/build/dex/uniswap-v4/hooks/fee-hook/types.js +2 -0
- package/build/dex/uniswap-v4/hooks/fee-hook/types.js.map +1 -0
- package/build/dex/uniswap-v4/hooks/index.d.ts +2 -0
- package/build/dex/uniswap-v4/hooks/index.js +8 -0
- package/build/dex/uniswap-v4/hooks/index.js.map +1 -0
- package/build/dex/usdc-transmuter/usdc-transmuter-pool.d.ts +26 -0
- package/build/dex/usdc-transmuter/usdc-transmuter-pool.js +75 -0
- package/build/dex/usdc-transmuter/usdc-transmuter-pool.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,105 @@
|
|
|
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.FluidDexLiteEventPool = void 0;
|
|
7
|
+
const abi_1 = require("@ethersproject/abi");
|
|
8
|
+
const stateful_event_subscriber_1 = require("../../stateful-event-subscriber");
|
|
9
|
+
const FluidDexLite_abi_json_1 = __importDefault(require("../../abi/fluid-dex-lite/FluidDexLite.abi.json"));
|
|
10
|
+
const fluid_dex_lite_math_1 = require("./fluid-dex-lite-math");
|
|
11
|
+
const utils_1 = require("./utils");
|
|
12
|
+
const utils_2 = require("../../utils");
|
|
13
|
+
// Storage slot constants from DexLiteSlotsLink
|
|
14
|
+
const DEX_LITE_DEXES_LIST_SLOT = 1;
|
|
15
|
+
const DEX_LITE_DEX_VARIABLES_SLOT = 2;
|
|
16
|
+
const DEX_LITE_CENTER_PRICE_SHIFT_SLOT = 3;
|
|
17
|
+
const DEX_LITE_RANGE_SHIFT_SLOT = 4;
|
|
18
|
+
const DEX_LITE_THRESHOLD_SHIFT_SLOT = 5;
|
|
19
|
+
class FluidDexLiteEventPool extends stateful_event_subscriber_1.StatefulEventSubscriber {
|
|
20
|
+
parentName;
|
|
21
|
+
network;
|
|
22
|
+
dexHelper;
|
|
23
|
+
fluidDexLiteIface;
|
|
24
|
+
fluidDexLiteAddress;
|
|
25
|
+
decoder = (log) => this.fluidDexLiteIface.parseLog(log);
|
|
26
|
+
handlers = {};
|
|
27
|
+
logDecoder;
|
|
28
|
+
addressesSubscribed;
|
|
29
|
+
poolParams;
|
|
30
|
+
constructor(parentName, network, dexHelper, logger, mapKey, fluidDexLiteIface = new abi_1.Interface(FluidDexLite_abi_json_1.default), poolParams, fluidDexLiteAddress) {
|
|
31
|
+
super(parentName, `${mapKey}`, dexHelper, logger);
|
|
32
|
+
this.parentName = parentName;
|
|
33
|
+
this.network = network;
|
|
34
|
+
this.dexHelper = dexHelper;
|
|
35
|
+
this.fluidDexLiteIface = fluidDexLiteIface;
|
|
36
|
+
this.fluidDexLiteAddress = fluidDexLiteAddress;
|
|
37
|
+
this.poolParams = poolParams;
|
|
38
|
+
this.logDecoder = (log) => this.fluidDexLiteIface.parseLog(log);
|
|
39
|
+
this.addressesSubscribed = [fluidDexLiteAddress];
|
|
40
|
+
// Add handlers for all events that update state
|
|
41
|
+
this.handlers['LogSwap'] = this.handleLogSwap.bind(this);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* The function is called every time any of the subscribed
|
|
45
|
+
* addresses release log. The function accepts the current
|
|
46
|
+
* state, updates the state according to the log, and returns
|
|
47
|
+
* the updated state.
|
|
48
|
+
*/
|
|
49
|
+
processLog(state, log, blockHeader) {
|
|
50
|
+
try {
|
|
51
|
+
const event = this.logDecoder(log);
|
|
52
|
+
if (event.name in this.handlers) {
|
|
53
|
+
return this.handlers[event.name](event, state, log, blockHeader);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
catch (e) {
|
|
57
|
+
(0, utils_2.catchParseLogError)(e, this.logger);
|
|
58
|
+
}
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* The function generates state using on-chain calls.
|
|
63
|
+
*/
|
|
64
|
+
async generateState(blockNumber) {
|
|
65
|
+
const dexIdBytes = this.poolParams.dexId;
|
|
66
|
+
const slots = [
|
|
67
|
+
DEX_LITE_DEX_VARIABLES_SLOT,
|
|
68
|
+
DEX_LITE_CENTER_PRICE_SHIFT_SLOT,
|
|
69
|
+
DEX_LITE_RANGE_SHIFT_SLOT,
|
|
70
|
+
DEX_LITE_THRESHOLD_SHIFT_SLOT,
|
|
71
|
+
].map(slot => (0, utils_1.calculateMappingStorageSlot)(slot, dexIdBytes));
|
|
72
|
+
const calls = slots.map(slot => (0, utils_1.readFromStorageCall)(this.fluidDexLiteAddress, this.fluidDexLiteIface, slot));
|
|
73
|
+
const [{ returnData: dexVariables }, { returnData: centerPriceShift }, { returnData: rangeShift }, { returnData: thresholdShift },] = await this.dexHelper.multiWrapper.tryAggregate(false, calls, blockNumber);
|
|
74
|
+
const lastInteractionTimestamp = (centerPriceShift >>
|
|
75
|
+
BigInt(fluid_dex_lite_math_1.BITS_DEX_LITE_CENTER_PRICE_SHIFT_LAST_INTERACTION_TIMESTAMP)) &
|
|
76
|
+
fluid_dex_lite_math_1.X33;
|
|
77
|
+
return {
|
|
78
|
+
dexVariables,
|
|
79
|
+
centerPriceShift,
|
|
80
|
+
rangeShift,
|
|
81
|
+
thresholdShift,
|
|
82
|
+
lastInteractionTimestamp,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
// Event handlers
|
|
86
|
+
handleLogSwap(event, state, log, blockHeader) {
|
|
87
|
+
const dexId = (0, utils_1.normalizeDexId)(this.poolParams.dexId);
|
|
88
|
+
const swapData = event.args.swapData;
|
|
89
|
+
if (!swapData)
|
|
90
|
+
return state;
|
|
91
|
+
// Extract first 64 bits (8 bytes) as dexId
|
|
92
|
+
const extractedDexId = (BigInt(swapData) & fluid_dex_lite_math_1.X64).toString(16);
|
|
93
|
+
const eventDexId = (0, utils_1.normalizeDexId)(extractedDexId);
|
|
94
|
+
if (eventDexId !== dexId) {
|
|
95
|
+
// Not for this pool, skip silently
|
|
96
|
+
return state;
|
|
97
|
+
}
|
|
98
|
+
return {
|
|
99
|
+
...state,
|
|
100
|
+
dexVariables: BigInt(event.args.dexVariables),
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
exports.FluidDexLiteEventPool = FluidDexLiteEventPool;
|
|
105
|
+
//# sourceMappingURL=fluid-dex-lite-pool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fluid-dex-lite-pool.js","sourceRoot":"","sources":["../../../src/dex/fluid-dex-lite/fluid-dex-lite-pool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { Token, Address, ExchangePrices, PoolPrices, AdapterExchangeParam, SimpleExchangeParam, PoolLiquidity, Logger, DexExchangeParam, NumberAsString } from '../../types';
|
|
2
|
+
import { SwapSide, Network } from '../../constants';
|
|
3
|
+
import { IDex } from '../../dex/idex';
|
|
4
|
+
import { IDexHelper } from '../../dex-helper/idex-helper';
|
|
5
|
+
import { FluidDexLiteData, PoolParams } from './types';
|
|
6
|
+
import { SimpleExchange } from '../simple-exchange';
|
|
7
|
+
import { FluidDexLiteEventPool } from './fluid-dex-lite-pool';
|
|
8
|
+
import { Interface } from '@ethersproject/abi';
|
|
9
|
+
export declare class FluidDexLite extends SimpleExchange implements IDex<FluidDexLiteData> {
|
|
10
|
+
readonly network: Network;
|
|
11
|
+
readonly dexKey: string;
|
|
12
|
+
readonly dexHelper: IDexHelper;
|
|
13
|
+
protected eventPools: {
|
|
14
|
+
[key: string]: FluidDexLiteEventPool | null;
|
|
15
|
+
};
|
|
16
|
+
pools: PoolParams[];
|
|
17
|
+
readonly hasConstantPriceLargeAmounts = false;
|
|
18
|
+
readonly needWrapNative = true;
|
|
19
|
+
readonly isFeeOnTransferSupported = false;
|
|
20
|
+
static dexKeysWithNetwork: {
|
|
21
|
+
key: string;
|
|
22
|
+
networks: Network[];
|
|
23
|
+
}[];
|
|
24
|
+
logger: Logger;
|
|
25
|
+
fluidDexLiteIface: Interface;
|
|
26
|
+
dexLiteAddress: Address;
|
|
27
|
+
constructor(network: Network, dexKey: string, dexHelper: IDexHelper);
|
|
28
|
+
initializePricing(blockNumber: number): Promise<void>;
|
|
29
|
+
private loadDexesList;
|
|
30
|
+
private initializeEventPools;
|
|
31
|
+
private getPoolForTokens;
|
|
32
|
+
private getEventPool;
|
|
33
|
+
private getGasCost;
|
|
34
|
+
getAdapters(side: SwapSide): {
|
|
35
|
+
name: string;
|
|
36
|
+
index: number;
|
|
37
|
+
}[] | null;
|
|
38
|
+
getPoolIdentifiers(srcToken: Token, destToken: Token, side: SwapSide, blockNumber: number): Promise<string[]>;
|
|
39
|
+
getPricesVolume(srcToken: Token, destToken: Token, amounts: bigint[], side: SwapSide, blockNumber: number, limitPools?: string[]): Promise<null | ExchangePrices<FluidDexLiteData>>;
|
|
40
|
+
getCalldataGasCost(poolPrices: PoolPrices<FluidDexLiteData>): number | number[];
|
|
41
|
+
getAdapterParam(srcToken: string, destToken: string, srcAmount: string, destAmount: string, data: FluidDexLiteData, side: SwapSide): AdapterExchangeParam;
|
|
42
|
+
getDexParam(srcToken: Address, destToken: Address, srcAmount: NumberAsString, destAmount: NumberAsString, recipient: Address, data: FluidDexLiteData, side: SwapSide): DexExchangeParam;
|
|
43
|
+
getSimpleParam(srcToken: string, destToken: string, srcAmount: string, destAmount: string, data: FluidDexLiteData, side: SwapSide): Promise<SimpleExchangeParam>;
|
|
44
|
+
getTopPoolsForToken(tokenAddress: Address, limit: number): Promise<PoolLiquidity[]>;
|
|
45
|
+
}
|
|
@@ -0,0 +1,461 @@
|
|
|
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 () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.FluidDexLite = void 0;
|
|
40
|
+
const constants_1 = require("../../constants");
|
|
41
|
+
const CALLDATA_GAS_COST = __importStar(require("../../calldata-gas-cost"));
|
|
42
|
+
const utils_1 = require("../../utils");
|
|
43
|
+
const fluid_dex_lite_math_1 = require("./fluid-dex-lite-math");
|
|
44
|
+
const simple_exchange_1 = require("../simple-exchange");
|
|
45
|
+
const config_1 = require("./config");
|
|
46
|
+
const fluid_dex_lite_pool_1 = require("./fluid-dex-lite-pool");
|
|
47
|
+
const FluidDexLite_abi_json_1 = __importDefault(require("../../abi/fluid-dex-lite/FluidDexLite.abi.json"));
|
|
48
|
+
const abi_1 = require("@ethersproject/abi");
|
|
49
|
+
const abi_2 = require("@ethersproject/abi");
|
|
50
|
+
const web3_utils_1 = require("web3-utils");
|
|
51
|
+
const fluid_dex_lite_math_2 = require("./fluid-dex-lite-math");
|
|
52
|
+
const utils_2 = require("../../executor/utils");
|
|
53
|
+
const bigint_constants_1 = require("../../bigint-constants");
|
|
54
|
+
const utils_3 = require("./utils");
|
|
55
|
+
// Storage slot constants
|
|
56
|
+
const DEX_LITE_DEXES_LIST_SLOT = 1;
|
|
57
|
+
class FluidDexLite extends simple_exchange_1.SimpleExchange {
|
|
58
|
+
network;
|
|
59
|
+
dexKey;
|
|
60
|
+
dexHelper;
|
|
61
|
+
eventPools = {};
|
|
62
|
+
pools = [];
|
|
63
|
+
hasConstantPriceLargeAmounts = false;
|
|
64
|
+
needWrapNative = true;
|
|
65
|
+
isFeeOnTransferSupported = false;
|
|
66
|
+
static dexKeysWithNetwork = (0, utils_1.getDexKeysWithNetwork)(config_1.FluidDexLiteConfig);
|
|
67
|
+
logger;
|
|
68
|
+
fluidDexLiteIface;
|
|
69
|
+
dexLiteAddress;
|
|
70
|
+
constructor(network, dexKey, dexHelper) {
|
|
71
|
+
super(dexHelper, dexKey);
|
|
72
|
+
this.network = network;
|
|
73
|
+
this.dexKey = dexKey;
|
|
74
|
+
this.dexHelper = dexHelper;
|
|
75
|
+
this.logger = dexHelper.getLogger(dexKey);
|
|
76
|
+
this.fluidDexLiteIface = new abi_1.Interface(FluidDexLite_abi_json_1.default);
|
|
77
|
+
const config = config_1.FluidDexLiteConfig[dexKey][network];
|
|
78
|
+
if (!config) {
|
|
79
|
+
throw new Error(`No config found for ${dexKey} on network ${network}`);
|
|
80
|
+
}
|
|
81
|
+
this.dexLiteAddress = config.dexLiteAddress;
|
|
82
|
+
}
|
|
83
|
+
// Initialize pricing is called once in the start of
|
|
84
|
+
// pricing service. It is intended to setup the integration
|
|
85
|
+
// for pricing requests.
|
|
86
|
+
async initializePricing(blockNumber) {
|
|
87
|
+
try {
|
|
88
|
+
// Step 1: Read the _dexesList array from storage
|
|
89
|
+
await this.loadDexesList(blockNumber);
|
|
90
|
+
// Step 2: Initialize event pools for each dex
|
|
91
|
+
await this.initializeEventPools(blockNumber);
|
|
92
|
+
this.logger.info(`FluidDexLite: Initialized ${this.pools.length} pools`);
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
this.logger.error('FluidDexLite: Failed to initialize pricing', error);
|
|
96
|
+
throw error;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// Load all dex pools from the _dexesList storage array
|
|
100
|
+
async loadDexesList(blockNumber) {
|
|
101
|
+
try {
|
|
102
|
+
const [lengthResult] = await this.dexHelper.multiWrapper.tryAggregate(false, [
|
|
103
|
+
(0, utils_3.readFromStorageCall)(this.dexLiteAddress, this.fluidDexLiteIface, (0, utils_3.encodeSlot)(DEX_LITE_DEXES_LIST_SLOT)),
|
|
104
|
+
], blockNumber);
|
|
105
|
+
const arrayLength = Number(lengthResult.returnData);
|
|
106
|
+
if (arrayLength === 0) {
|
|
107
|
+
this.logger.info(`${this.dexKey}: No dex pools found in _dexesList`);
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
const arrayBaseSlot = (0, web3_utils_1.keccak256)(abi_2.defaultAbiCoder.encode(['uint256'], [DEX_LITE_DEXES_LIST_SLOT]));
|
|
111
|
+
const callDataList = [];
|
|
112
|
+
for (let i = 0; i < arrayLength; i++) {
|
|
113
|
+
const baseIndex = BigInt(arrayBaseSlot) + BigInt(i * 3);
|
|
114
|
+
callDataList.push((0, utils_3.readFromStorageCall)(this.dexLiteAddress, this.fluidDexLiteIface, (0, utils_3.encodeSlot)(baseIndex)), // token0
|
|
115
|
+
(0, utils_3.readFromStorageCall)(this.dexLiteAddress, this.fluidDexLiteIface, (0, utils_3.encodeSlot)(baseIndex + 1n)), // token1
|
|
116
|
+
(0, utils_3.readFromStorageCall)(this.dexLiteAddress, this.fluidDexLiteIface, (0, utils_3.encodeSlot)(baseIndex + 2n)));
|
|
117
|
+
}
|
|
118
|
+
const results = await this.dexHelper.multiWrapper.tryAggregate(false, callDataList, blockNumber, this.dexHelper.multiWrapper.defaultBatchSize, false);
|
|
119
|
+
const dexesList = [];
|
|
120
|
+
for (let i = 0; i < arrayLength; i++) {
|
|
121
|
+
const resultIndex = i * 3;
|
|
122
|
+
if (resultIndex + 2 >= results.length) {
|
|
123
|
+
this.logger.warn(`${this.dexKey}: Missing results for pool ${i}, skipping`);
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
const token0 = results[resultIndex].returnData;
|
|
127
|
+
const token1 = results[resultIndex + 1].returnData;
|
|
128
|
+
const salt = results[resultIndex + 2].returnData;
|
|
129
|
+
if (token0 === 0n || token1 === 0n) {
|
|
130
|
+
this.logger.debug(`${this.dexKey}: Invalid token addresses for pool ${i}, skipping`);
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
dexesList.push({
|
|
134
|
+
token0: '0x' + token0.toString(16).padStart(40, '0'),
|
|
135
|
+
token1: '0x' + token1.toString(16).padStart(40, '0'),
|
|
136
|
+
salt: '0x' + salt.toString(16).padStart(64, '0'),
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
this.pools = dexesList.map(dexKey => ({
|
|
140
|
+
dexId: (0, utils_3.calculateDexId)(dexKey),
|
|
141
|
+
dexKey,
|
|
142
|
+
}));
|
|
143
|
+
this.logger.info(`${this.dexKey}: Loaded ${this.pools.length} dex pools`);
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
this.logger.error(`${this.dexKey}: Failed to load dexes list`, error);
|
|
147
|
+
throw error;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
// Initialize event pools for tracking state changes
|
|
151
|
+
async initializeEventPools(blockNumber) {
|
|
152
|
+
for (const pool of this.pools) {
|
|
153
|
+
const mapKey = `${pool.dexKey.token0}_${pool.dexKey.token1}_${pool.dexKey.salt}`.toLowerCase();
|
|
154
|
+
try {
|
|
155
|
+
const eventPool = new fluid_dex_lite_pool_1.FluidDexLiteEventPool(this.dexKey, this.network, this.dexHelper, this.logger, mapKey, this.fluidDexLiteIface, pool, this.dexLiteAddress);
|
|
156
|
+
await eventPool.initialize(blockNumber);
|
|
157
|
+
this.eventPools[mapKey] = eventPool;
|
|
158
|
+
this.logger.debug(`${this.dexKey}: Initialized event pool for ${mapKey}`);
|
|
159
|
+
}
|
|
160
|
+
catch (error) {
|
|
161
|
+
this.eventPools[mapKey] = null;
|
|
162
|
+
this.logger.error(`${this.dexKey}: Failed to initialize event pool for ${pool.dexId}, ${error}`);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
// Helper function to get pool by token addresses
|
|
167
|
+
getPoolForTokens(srcToken, destToken) {
|
|
168
|
+
const srcAddr = srcToken.toLowerCase();
|
|
169
|
+
const destAddr = destToken.toLowerCase();
|
|
170
|
+
return (this.pools.find(pool => {
|
|
171
|
+
const token0 = pool.dexKey.token0.toLowerCase();
|
|
172
|
+
const token1 = pool.dexKey.token1.toLowerCase();
|
|
173
|
+
return ((token0 === srcAddr && token1 === destAddr) ||
|
|
174
|
+
(token0 === destAddr && token1 === srcAddr));
|
|
175
|
+
}) || null);
|
|
176
|
+
}
|
|
177
|
+
// Helper function to get event pool
|
|
178
|
+
getEventPool(pool) {
|
|
179
|
+
const mapKey = `${pool.dexKey.token0}_${pool.dexKey.token1}_${pool.dexKey.salt}`.toLowerCase();
|
|
180
|
+
return this.eventPools[mapKey] || null;
|
|
181
|
+
}
|
|
182
|
+
// Get estimated gas cost for a swap
|
|
183
|
+
getGasCost() {
|
|
184
|
+
// Default gas cost estimate for FluidDexLite swaps
|
|
185
|
+
// This should be calibrated based on actual gas usage
|
|
186
|
+
return 10000;
|
|
187
|
+
}
|
|
188
|
+
// Legacy: was only used for V5
|
|
189
|
+
// Returns the list of contract adapters (name and index)
|
|
190
|
+
// for a buy/sell. Return null if there are no adapters.
|
|
191
|
+
getAdapters(side) {
|
|
192
|
+
return null;
|
|
193
|
+
}
|
|
194
|
+
// Returns list of pool identifiers that can be used
|
|
195
|
+
// for a given swap. poolIdentifiers must be unique
|
|
196
|
+
// across DEXes.
|
|
197
|
+
async getPoolIdentifiers(srcToken, destToken, side, blockNumber) {
|
|
198
|
+
const pool = this.getPoolForTokens(srcToken.address, destToken.address);
|
|
199
|
+
if (!pool) {
|
|
200
|
+
return [];
|
|
201
|
+
}
|
|
202
|
+
// Check if pool has liquidity
|
|
203
|
+
const eventPool = this.getEventPool(pool);
|
|
204
|
+
if (!eventPool) {
|
|
205
|
+
return [];
|
|
206
|
+
}
|
|
207
|
+
try {
|
|
208
|
+
const state = eventPool.getState(blockNumber);
|
|
209
|
+
if (!state) {
|
|
210
|
+
return [];
|
|
211
|
+
}
|
|
212
|
+
// Check if pool has sufficient liquidity
|
|
213
|
+
if (state.dexVariables === 0n) {
|
|
214
|
+
return [];
|
|
215
|
+
}
|
|
216
|
+
return [`${this.dexKey}_${pool.dexId}`.toLowerCase()];
|
|
217
|
+
}
|
|
218
|
+
catch (error) {
|
|
219
|
+
this.logger.debug(`FluidDexLite: Error getting pool state for ${pool.dexId}`, error);
|
|
220
|
+
return [];
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
// Returns pool prices for amounts.
|
|
224
|
+
async getPricesVolume(srcToken, destToken, amounts, side, blockNumber, limitPools) {
|
|
225
|
+
try {
|
|
226
|
+
const pool = this.getPoolForTokens(srcToken.address, destToken.address);
|
|
227
|
+
if (!pool)
|
|
228
|
+
return null;
|
|
229
|
+
const poolIdentifier = `${this.dexKey}_${pool.dexId}`.toLowerCase();
|
|
230
|
+
if (limitPools?.length && !limitPools.includes(poolIdentifier))
|
|
231
|
+
return null;
|
|
232
|
+
const eventPool = this.getEventPool(pool);
|
|
233
|
+
const state = eventPool?.getState(blockNumber);
|
|
234
|
+
if (!state || state.dexVariables === 0n)
|
|
235
|
+
return null;
|
|
236
|
+
const swap0To1 = pool.dexKey.token0.toLowerCase() === srcToken.address.toLowerCase();
|
|
237
|
+
// Initialize result arrays with zero for index 0
|
|
238
|
+
const prices = [0n];
|
|
239
|
+
const gasCost = [0];
|
|
240
|
+
// Compute swap results for all amounts (except the 0th)
|
|
241
|
+
for (let i = 1; i < amounts.length; i++) {
|
|
242
|
+
try {
|
|
243
|
+
const { amountIn, amountOut } = (0, fluid_dex_lite_math_2.calculateSwap)(state, swap0To1, amounts[i], side);
|
|
244
|
+
prices.push(side === constants_1.SwapSide.SELL ? amountOut : amountIn);
|
|
245
|
+
gasCost.push(this.getGasCost());
|
|
246
|
+
}
|
|
247
|
+
catch (err) {
|
|
248
|
+
this.logger.error(`${this.dexKey}: Error calculating swap for amount ${amounts[i]}`, err);
|
|
249
|
+
prices.push(0n);
|
|
250
|
+
gasCost.push(0);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
// Get unit amount (1 token with proper decimals)
|
|
254
|
+
const unitAmount = bigint_constants_1.BI_POWS[side === constants_1.SwapSide.SELL ? srcToken.decimals : destToken.decimals];
|
|
255
|
+
let unit = 0n;
|
|
256
|
+
try {
|
|
257
|
+
const { amountIn, amountOut } = (0, fluid_dex_lite_math_2.calculateSwap)(state, swap0To1, unitAmount, side);
|
|
258
|
+
unit = side === constants_1.SwapSide.SELL ? amountOut : amountIn;
|
|
259
|
+
}
|
|
260
|
+
catch (err) {
|
|
261
|
+
this.logger.debug(`${this.dexKey}: Error calculating unit price`, err);
|
|
262
|
+
}
|
|
263
|
+
return [
|
|
264
|
+
{
|
|
265
|
+
prices,
|
|
266
|
+
unit,
|
|
267
|
+
gasCost,
|
|
268
|
+
exchange: this.dexKey,
|
|
269
|
+
poolIdentifier,
|
|
270
|
+
data: {
|
|
271
|
+
exchange: this.dexLiteAddress,
|
|
272
|
+
dexKey: pool.dexKey,
|
|
273
|
+
swap0To1,
|
|
274
|
+
},
|
|
275
|
+
poolAddresses: [this.dexLiteAddress],
|
|
276
|
+
},
|
|
277
|
+
];
|
|
278
|
+
}
|
|
279
|
+
catch (error) {
|
|
280
|
+
this.logger.error(`${this.dexKey}: Error in getPricesVolume`, error);
|
|
281
|
+
return null;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
// Returns estimated gas cost of calldata for this DEX in multiSwap
|
|
285
|
+
getCalldataGasCost(poolPrices) {
|
|
286
|
+
return CALLDATA_GAS_COST.DEX_NO_PAYLOAD;
|
|
287
|
+
}
|
|
288
|
+
// Encode params required by the exchange adapter
|
|
289
|
+
getAdapterParam(srcToken, destToken, srcAmount, destAmount, data, side) {
|
|
290
|
+
const { exchange } = data;
|
|
291
|
+
// Encode here the payload for adapter
|
|
292
|
+
const payload = '';
|
|
293
|
+
return {
|
|
294
|
+
targetExchange: exchange,
|
|
295
|
+
payload,
|
|
296
|
+
networkFee: '0',
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
// Step 4: Generate calldata for Augustus to swap through FluidDexLite
|
|
300
|
+
getDexParam(srcToken, destToken, srcAmount, destAmount, recipient, data, side) {
|
|
301
|
+
const { dexKey, swap0To1 } = data;
|
|
302
|
+
const { token0, token1, salt } = dexKey;
|
|
303
|
+
const [t0, t1, s] = [token0, token1, salt].map(t => t.toLowerCase());
|
|
304
|
+
const [src, dest] = [srcToken, destToken].map(t => t.toLowerCase());
|
|
305
|
+
// Ensure the pool exists
|
|
306
|
+
const poolExists = this.pools.some(p => p.dexKey.token0.toLowerCase() === t0 &&
|
|
307
|
+
p.dexKey.token1.toLowerCase() === t1 &&
|
|
308
|
+
p.dexKey.salt.toLowerCase() === s);
|
|
309
|
+
if (!poolExists) {
|
|
310
|
+
throw new Error(`${this.dexKey}: Pool not found for tokens ${token0}/${token1} with salt ${salt}`);
|
|
311
|
+
}
|
|
312
|
+
// Validate the swap direction matches the token addresses
|
|
313
|
+
if (swap0To1 !== (src === t0)) {
|
|
314
|
+
throw new Error(`${this.dexKey}: Swap direction mismatch. Expected swap0To1: ${src === t0}, got: ${swap0To1}`);
|
|
315
|
+
}
|
|
316
|
+
// Validate that srcToken and destToken are actually part of this pool
|
|
317
|
+
if (![t0, t1].includes(src) || ![t0, t1].includes(dest)) {
|
|
318
|
+
throw new Error(`${this.dexKey}: Tokens ${srcToken}/${destToken} are not part of pool ${token0}/${token1}`);
|
|
319
|
+
}
|
|
320
|
+
// Determine swap amount and limits based on side
|
|
321
|
+
let amountSpecified;
|
|
322
|
+
let amountLimit;
|
|
323
|
+
if (side === constants_1.SwapSide.SELL) {
|
|
324
|
+
// Exact input: positive amountSpecified, amountLimit is minimum output
|
|
325
|
+
amountSpecified = srcAmount;
|
|
326
|
+
amountLimit = destAmount;
|
|
327
|
+
}
|
|
328
|
+
else {
|
|
329
|
+
// Exact output: negative amountSpecified, amountLimit is maximum input
|
|
330
|
+
amountSpecified = `-${destAmount}`;
|
|
331
|
+
amountLimit = srcAmount;
|
|
332
|
+
}
|
|
333
|
+
// Encode swapSingle function call
|
|
334
|
+
const swapData = this.fluidDexLiteIface.encodeFunctionData('swapSingle', [
|
|
335
|
+
dexKey, // DexKey calldata dexKey_
|
|
336
|
+
swap0To1, // bool swap0To1_
|
|
337
|
+
amountSpecified, // int256 amountSpecified_
|
|
338
|
+
amountLimit, // uint256 amountLimit_
|
|
339
|
+
recipient, // address to_
|
|
340
|
+
false, // bool isCallback_ (set to false for now)
|
|
341
|
+
'0x', // bytes calldata callbackData_ (empty)
|
|
342
|
+
'0x', // bytes calldata extraData_ (empty)
|
|
343
|
+
]);
|
|
344
|
+
return {
|
|
345
|
+
needWrapNative: this.needWrapNative, // FluidDexLite can handle ETH directly
|
|
346
|
+
dexFuncHasRecipient: true, // Has to_ parameter for recipient
|
|
347
|
+
exchangeData: swapData, // Encoded swapSingle call
|
|
348
|
+
targetExchange: this.dexLiteAddress, // FluidDexLite contract address
|
|
349
|
+
spender: this.dexLiteAddress, // Approve tokens to FluidDexLite contract
|
|
350
|
+
returnAmountPos: (0, utils_2.extractReturnAmountPosition)(this.fluidDexLiteIface, 'swapSingle', 'amountUnspecified_'),
|
|
351
|
+
};
|
|
352
|
+
}
|
|
353
|
+
// Legacy compatibility method for SimpleExchange
|
|
354
|
+
async getSimpleParam(srcToken, destToken, srcAmount, destAmount, data, side) {
|
|
355
|
+
const { dexKey, swap0To1 } = data;
|
|
356
|
+
// Determine swap amount and limits based on side
|
|
357
|
+
let amountSpecified;
|
|
358
|
+
let amountLimit;
|
|
359
|
+
if (side === constants_1.SwapSide.SELL) {
|
|
360
|
+
// Exact input: positive amountSpecified, amountLimit is minimum output
|
|
361
|
+
amountSpecified = srcAmount;
|
|
362
|
+
amountLimit = destAmount;
|
|
363
|
+
}
|
|
364
|
+
else {
|
|
365
|
+
// Exact output: negative amountSpecified, amountLimit is maximum input
|
|
366
|
+
amountSpecified = `-${destAmount}`;
|
|
367
|
+
amountLimit = srcAmount;
|
|
368
|
+
}
|
|
369
|
+
// Encode swapSingle function call with Augustus as recipient
|
|
370
|
+
const swapData = this.fluidDexLiteIface.encodeFunctionData('swapSingle', [
|
|
371
|
+
dexKey, // DexKey calldata dexKey_
|
|
372
|
+
swap0To1, // bool swap0To1_
|
|
373
|
+
amountSpecified, // int256 amountSpecified_
|
|
374
|
+
amountLimit, // uint256 amountLimit_
|
|
375
|
+
this.augustusAddress, // address to_ (Augustus for simple swaps)
|
|
376
|
+
false, // bool isCallback_ (set to false for now)
|
|
377
|
+
'0x', // bytes calldata callbackData_ (empty)
|
|
378
|
+
'0x', // bytes calldata extraData_ (empty)
|
|
379
|
+
]);
|
|
380
|
+
return {
|
|
381
|
+
callees: [this.dexLiteAddress],
|
|
382
|
+
calldata: [swapData],
|
|
383
|
+
values: ['0'],
|
|
384
|
+
networkFee: '0',
|
|
385
|
+
};
|
|
386
|
+
}
|
|
387
|
+
// Returns list of top pools based on liquidity.
|
|
388
|
+
async getTopPoolsForToken(tokenAddress, limit) {
|
|
389
|
+
try {
|
|
390
|
+
const normalizedTokenAddress = tokenAddress.toLowerCase();
|
|
391
|
+
const relevantPools = this.pools.filter(pool => pool.dexKey.token0.toLowerCase() === normalizedTokenAddress ||
|
|
392
|
+
pool.dexKey.token1.toLowerCase() === normalizedTokenAddress);
|
|
393
|
+
const poolLiquidity = [];
|
|
394
|
+
const currentBlock = await this.dexHelper.web3Provider.eth.getBlockNumber();
|
|
395
|
+
for (const pool of relevantPools.slice(0, limit * 2)) {
|
|
396
|
+
// Fetch more to filter out inactive ones
|
|
397
|
+
const eventPool = this.getEventPool(pool);
|
|
398
|
+
if (!eventPool)
|
|
399
|
+
continue;
|
|
400
|
+
try {
|
|
401
|
+
const state = eventPool.getState(currentBlock);
|
|
402
|
+
if (!state || state.dexVariables === 0n) {
|
|
403
|
+
// Skip pools with no liquidity
|
|
404
|
+
continue;
|
|
405
|
+
}
|
|
406
|
+
// Unpack dex variables to get token supplies
|
|
407
|
+
const unpackedVars = (0, fluid_dex_lite_math_1.unpackDexVariables)(state.dexVariables);
|
|
408
|
+
// Calculate liquidity based on adjusted total supplies
|
|
409
|
+
// These represent the actual liquidity available in the pool
|
|
410
|
+
const token0Supply = unpackedVars.token0TotalSupplyAdjusted;
|
|
411
|
+
const token1Supply = unpackedVars.token1TotalSupplyAdjusted;
|
|
412
|
+
if (token0Supply === 0n || token1Supply === 0n) {
|
|
413
|
+
// Skip pools with no liquidity
|
|
414
|
+
continue;
|
|
415
|
+
}
|
|
416
|
+
// Get decimals for proper scaling
|
|
417
|
+
const token0Decimals = Number(unpackedVars.token0Decimals);
|
|
418
|
+
const token1Decimals = Number(unpackedVars.token1Decimals);
|
|
419
|
+
// Calculate geometric mean of liquidity as a proxy for USD value
|
|
420
|
+
// Convert to 18 decimal standard for calculation
|
|
421
|
+
const token0LiquidityNormalized = token0Supply * 10n ** (18n - BigInt(token0Decimals));
|
|
422
|
+
const token1LiquidityNormalized = token1Supply * 10n ** (18n - BigInt(token1Decimals));
|
|
423
|
+
// Simple geometric mean calculation (sqrt(a * b))
|
|
424
|
+
const geometricMeanSquared = token0LiquidityNormalized * token1LiquidityNormalized;
|
|
425
|
+
const liquidityUSD = Number((0, fluid_dex_lite_math_1.sqrt)(geometricMeanSquared) / 10n ** 18n);
|
|
426
|
+
// Log liquidity result for debugging
|
|
427
|
+
this.logger.debug(`Pool ${pool.dexId} liquidity: $${liquidityUSD.toLocaleString()}`);
|
|
428
|
+
// Determine connector token (the other token in the pair)
|
|
429
|
+
const connectorToken = pool.dexKey.token0.toLowerCase() === normalizedTokenAddress
|
|
430
|
+
? {
|
|
431
|
+
address: pool.dexKey.token1,
|
|
432
|
+
decimals: token1Decimals,
|
|
433
|
+
}
|
|
434
|
+
: {
|
|
435
|
+
address: pool.dexKey.token0,
|
|
436
|
+
decimals: token0Decimals,
|
|
437
|
+
};
|
|
438
|
+
poolLiquidity.push({
|
|
439
|
+
exchange: this.dexKey,
|
|
440
|
+
address: this.dexLiteAddress,
|
|
441
|
+
connectorTokens: [connectorToken],
|
|
442
|
+
liquidityUSD,
|
|
443
|
+
});
|
|
444
|
+
}
|
|
445
|
+
catch (error) {
|
|
446
|
+
this.logger.debug(`FluidDexLite: Error getting liquidity for pool ${pool.dexId}`, error);
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
// Sort by liquidity and return top pools
|
|
450
|
+
return poolLiquidity
|
|
451
|
+
.sort((a, b) => b.liquidityUSD - a.liquidityUSD)
|
|
452
|
+
.slice(0, limit);
|
|
453
|
+
}
|
|
454
|
+
catch (error) {
|
|
455
|
+
this.logger.error('FluidDexLite: Error in getTopPoolsForToken', error);
|
|
456
|
+
return [];
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
exports.FluidDexLite = FluidDexLite;
|
|
461
|
+
//# sourceMappingURL=fluid-dex-lite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fluid-dex-lite.js","sourceRoot":"","sources":["../../../src/dex/fluid-dex-lite/fluid-dex-lite.ts"],"names":[],"mappings":"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"}
|