@paraswap/dex-lib 3.8.28-fm.2 → 3.8.28
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/.vscode/launch.json +53 -0
- package/.vscode/settings.json +2 -0
- package/.vscode/tasks.json +15 -0
- package/build/abi/AaveV1_lending_pool.json +27 -0
- package/build/abi/BProtocol.json +1155 -0
- package/build/abi/Jarvis.json +1172 -0
- package/build/abi/MStableAsset.json +1545 -0
- package/build/abi/OneInchLp.json +1304 -0
- package/build/abi/Onebit.json +736 -0
- package/build/abi/Shell.json +1294 -0
- package/build/abi/TraderJoeV2Router.json +50 -0
- package/build/abi/platypus/asset.json +490 -0
- package/build/abi/platypus/avax-pool.json +820 -0
- package/build/abi/platypus/oracle.json +119 -0
- package/build/abi/platypus/pool.json +677 -0
- package/build/abi/smardex/all/smardex-router.json +648 -0
- package/build/abi/smardex/layer-1/smardex-factory.json +242 -0
- package/build/abi/smardex/layer-1/smardex-pool.json +506 -0
- package/build/abi/smardex/layer-2/smardex-factory.json +185 -0
- package/build/abi/smardex/layer-2/smardex-pool.json +578 -0
- package/build/abi/swaap-v1/pool.json +1346 -0
- package/build/abi/uniswap-v3/AlienBaseV3Router.abi.json +52 -0
- package/build/abi/wombat/pool.json +1289 -0
- package/build/abi/zrx.v2.json +1967 -0
- package/build/abi/zrx.v3.json +3454 -0
- package/build/abi/zrx.v4.json +2193 -0
- package/build/config.js +18 -18
- package/build/dex/OneInchLp.d.ts +24 -0
- package/build/dex/OneInchLp.js +43 -0
- package/build/dex/OneInchLp.js.map +1 -0
- package/build/dex/aave-v1/aave-v1.d.ts +34 -0
- package/build/dex/aave-v1/aave-v1.js +181 -0
- package/build/dex/aave-v1/aave-v1.js.map +1 -0
- package/build/dex/aave-v1/config.d.ts +11 -0
- package/build/dex/aave-v1/config.js +20 -0
- package/build/dex/aave-v1/config.js.map +1 -0
- package/build/dex/aave-v1/tokens-mainnet.json +134 -0
- package/build/dex/aave-v1/tokens.d.ts +3 -0
- package/build/dex/aave-v1/tokens.js +50 -0
- package/build/dex/aave-v1/tokens.js.map +1 -0
- package/build/dex/aave-v1/types.d.ts +12 -0
- package/build/dex/aave-v1/types.js +3 -0
- package/build/dex/aave-v1/types.js.map +1 -0
- package/build/dex/aave-v2/tokens-avalanche.json +44 -0
- package/build/dex/aave-v2/tokens-mainnet.json +188 -0
- package/build/dex/aave-v2/tokens-polygon.json +44 -0
- package/build/dex/bProtocol/bProtocol.d.ts +15 -0
- package/build/dex/bProtocol/bProtocol.js +56 -0
- package/build/dex/bProtocol/bProtocol.js.map +1 -0
- package/build/dex/bProtocol/types.d.ts +11 -0
- package/build/dex/bProtocol/types.js +8 -0
- package/build/dex/bProtocol/types.js.map +1 -0
- package/build/dex/bProtocol.d.ts +18 -0
- package/build/dex/bProtocol.js +39 -0
- package/build/dex/bProtocol.js.map +1 -0
- package/build/dex/balancer-v1/balancer-v1.d.ts +2 -2
- package/build/dex/balancer-v1/balancer-v1.js +2 -2
- package/build/dex/balancer-v1/balancer-v1.js.map +1 -1
- package/build/dex/balancer-v2/balancer-v2.d.ts +2 -2
- package/build/dex/balancer-v2/balancer-v2.js +2 -2
- package/build/dex/balancer-v2/balancer-v2.js.map +1 -1
- package/build/dex/bancor.d.ts +26 -0
- package/build/dex/bancor.js +58 -0
- package/build/dex/bancor.js.map +1 -0
- package/build/dex/camelot/camelot.d.ts +2 -2
- package/build/dex/camelot/camelot.js +4 -4
- package/build/dex/camelot/camelot.js.map +1 -1
- package/build/dex/compound.d.ts +18 -0
- package/build/dex/compound.js +46 -0
- package/build/dex/compound.js.map +1 -0
- package/build/dex/curve-v1/curve-v1.d.ts +1 -1
- package/build/dex/curve-v1/curve-v1.js +2 -2
- package/build/dex/curve-v1/curve-v1.js.map +1 -1
- package/build/dex/curve-v1-factory/curve-v1-factory.d.ts +1 -1
- package/build/dex/curve-v1-factory/curve-v1-factory.js +5 -4
- package/build/dex/curve-v1-factory/curve-v1-factory.js.map +1 -1
- package/build/dex/curve-v2.d.ts +58 -0
- package/build/dex/curve-v2.js +180 -0
- package/build/dex/curve-v2.js.map +1 -0
- package/build/dex/dexalot/dexalot.js +4 -0
- package/build/dex/dexalot/dexalot.js.map +1 -1
- package/build/dex/dodo-v1.d.ts +33 -0
- package/build/dex/dodo-v1.js +63 -0
- package/build/dex/dodo-v1.js.map +1 -0
- package/build/dex/gmx/gmx.d.ts +2 -2
- package/build/dex/gmx/gmx.js +2 -2
- package/build/dex/gmx/gmx.js.map +1 -1
- package/build/dex/gmx/pool.d.ts +2 -2
- package/build/dex/gmx/pool.js +3 -7
- package/build/dex/gmx/pool.js.map +1 -1
- package/build/dex/hashflow/hashflow.js +4 -0
- package/build/dex/hashflow/hashflow.js.map +1 -1
- package/build/dex/idex.d.ts +1 -1
- package/build/dex/infusion/infusion.d.ts +2 -2
- package/build/dex/infusion/infusion.js +4 -4
- package/build/dex/infusion/infusion.js.map +1 -1
- package/build/dex/jarvis.d.ts +56 -0
- package/build/dex/jarvis.js +163 -0
- package/build/dex/jarvis.js.map +1 -0
- package/build/dex/lido.d.ts +19 -0
- package/build/dex/lido.js +42 -0
- package/build/dex/lido.js.map +1 -0
- package/build/dex/mStable.d.ts +44 -0
- package/build/dex/mStable.js +75 -0
- package/build/dex/mStable.js.map +1 -0
- package/build/dex/maker-psm/scripts/gem.abi.json +136 -0
- package/build/dex/maker-psm/scripts/validate-state.d.ts +0 -0
- package/build/dex/maker-psm/scripts/validate-state.js +185 -0
- package/build/dex/maker-psm/scripts/validate-state.js.map +1 -0
- package/build/dex/maker-psm/scripts/vat.abi.json +243 -0
- package/build/dex/onebit/onebit.d.ts +16 -0
- package/build/dex/onebit/onebit.js +61 -0
- package/build/dex/onebit/onebit.js.map +1 -0
- package/build/dex/onebit/types.d.ts +14 -0
- package/build/dex/onebit/types.js +8 -0
- package/build/dex/onebit/types.js.map +1 -0
- package/build/dex/onebit.d.ts +25 -0
- package/build/dex/onebit.js +42 -0
- package/build/dex/onebit.js.map +1 -0
- package/build/dex/oswap/oswap-pool.d.ts +1 -1
- package/build/dex/oswap/oswap-pool.js +1 -3
- package/build/dex/oswap/oswap-pool.js.map +1 -1
- package/build/dex/oswap/oswap.d.ts +1 -1
- package/build/dex/oswap/oswap.js +2 -6
- package/build/dex/oswap/oswap.js.map +1 -1
- package/build/dex/platypus/asset.d.ts +14 -0
- package/build/dex/platypus/asset.js +97 -0
- package/build/dex/platypus/asset.js.map +1 -0
- package/build/dex/platypus/config.d.ts +11 -0
- package/build/dex/platypus/config.js +69 -0
- package/build/dex/platypus/config.js.map +1 -0
- package/build/dex/platypus/platypus.d.ts +63 -0
- package/build/dex/platypus/platypus.js +487 -0
- package/build/dex/platypus/platypus.js.map +1 -0
- package/build/dex/platypus/pool-avax.d.ts +8 -0
- package/build/dex/platypus/pool-avax.js +54 -0
- package/build/dex/platypus/pool-avax.js.map +1 -0
- package/build/dex/platypus/pool-base.d.ts +19 -0
- package/build/dex/platypus/pool-base.js +86 -0
- package/build/dex/platypus/pool-base.js.map +1 -0
- package/build/dex/platypus/pool-pure.d.ts +8 -0
- package/build/dex/platypus/pool-pure.js +37 -0
- package/build/dex/platypus/pool-pure.js.map +1 -0
- package/build/dex/platypus/pool-subscriber.d.ts +14 -0
- package/build/dex/platypus/pool-subscriber.js +167 -0
- package/build/dex/platypus/pool-subscriber.js.map +1 -0
- package/build/dex/platypus/pool.d.ts +8 -0
- package/build/dex/platypus/pool.js +58 -0
- package/build/dex/platypus/pool.js.map +1 -0
- package/build/dex/platypus/types.d.ts +92 -0
- package/build/dex/platypus/types.js +10 -0
- package/build/dex/platypus/types.js.map +1 -0
- package/build/dex/quickswap/spiritswap-v3.d.ts +6 -0
- package/build/dex/quickswap/spiritswap-v3.js +19 -0
- package/build/dex/quickswap/spiritswap-v3.js.map +1 -0
- package/build/dex/shell.d.ts +25 -0
- package/build/dex/shell.js +41 -0
- package/build/dex/shell.js.map +1 -0
- package/build/dex/smardex/config.d.ts +4 -0
- package/build/dex/smardex/config.js +64 -0
- package/build/dex/smardex/config.js.map +1 -0
- package/build/dex/smardex/constants.d.ts +18 -0
- package/build/dex/smardex/constants.js +33 -0
- package/build/dex/smardex/constants.js.map +1 -0
- package/build/dex/smardex/sdk/constants.d.ts +6 -0
- package/build/dex/smardex/sdk/constants.js +13 -0
- package/build/dex/smardex/sdk/constants.js.map +1 -0
- package/build/dex/smardex/sdk/core.d.ts +113 -0
- package/build/dex/smardex/sdk/core.js +499 -0
- package/build/dex/smardex/sdk/core.js.map +1 -0
- package/build/dex/smardex/sdk/errors.d.ts +15 -0
- package/build/dex/smardex/sdk/errors.js +22 -0
- package/build/dex/smardex/sdk/errors.js.map +1 -0
- package/build/dex/smardex/sdk/types.d.ts +62 -0
- package/build/dex/smardex/sdk/types.js +3 -0
- package/build/dex/smardex/sdk/types.js.map +1 -0
- package/build/dex/smardex/sdk/utils.d.ts +44 -0
- package/build/dex/smardex/sdk/utils.js +133 -0
- package/build/dex/smardex/sdk/utils.js.map +1 -0
- package/build/dex/smardex/smardex-event-pool.d.ts +28 -0
- package/build/dex/smardex/smardex-event-pool.js +119 -0
- package/build/dex/smardex/smardex-event-pool.js.map +1 -0
- package/build/dex/smardex/smardex.d.ts +65 -0
- package/build/dex/smardex/smardex.js +519 -0
- package/build/dex/smardex/smardex.js.map +1 -0
- package/build/dex/smardex/types.d.ts +55 -0
- package/build/dex/smardex/types.js +3 -0
- package/build/dex/smardex/types.js.map +1 -0
- package/build/dex/smoothy.d.ts +26 -0
- package/build/dex/smoothy.js +48 -0
- package/build/dex/smoothy.js.map +1 -0
- package/build/dex/solidly/forks-override/cone.d.ts +22 -0
- package/build/dex/solidly/forks-override/cone.js +53 -0
- package/build/dex/solidly/forks-override/cone.js.map +1 -0
- package/build/dex/solidly/forks-override/solisnek.d.ts +8 -0
- package/build/dex/solidly/forks-override/solisnek.js +15 -0
- package/build/dex/solidly/forks-override/solisnek.js.map +1 -0
- package/build/dex/solidly/solidly.d.ts +2 -2
- package/build/dex/solidly/solidly.js +4 -4
- package/build/dex/solidly/solidly.js.map +1 -1
- package/build/dex/solidly-v3/scripts/check-event-pool-event.d.ts +1 -0
- package/build/dex/solidly-v3/scripts/check-event-pool-event.js +53 -0
- package/build/dex/solidly-v3/scripts/check-event-pool-event.js.map +1 -0
- package/build/dex/stable-pool.d.ts +28 -0
- package/build/dex/stable-pool.js +55 -0
- package/build/dex/stable-pool.js.map +1 -0
- package/build/dex/swaap-v1/config.d.ts +17 -0
- package/build/dex/swaap-v1/config.js +56 -0
- package/build/dex/swaap-v1/config.js.map +1 -0
- package/build/dex/swaap-v1/constants.d.ts +6 -0
- package/build/dex/swaap-v1/constants.js +17 -0
- package/build/dex/swaap-v1/constants.js.map +1 -0
- package/build/dex/swaap-v1/libraries/ChainlinkUtils.d.ts +25 -0
- package/build/dex/swaap-v1/libraries/ChainlinkUtils.js +62 -0
- package/build/dex/swaap-v1/libraries/ChainlinkUtils.js.map +1 -0
- package/build/dex/swaap-v1/libraries/Const.d.ts +18 -0
- package/build/dex/swaap-v1/libraries/Const.js +26 -0
- package/build/dex/swaap-v1/libraries/Const.js.map +1 -0
- package/build/dex/swaap-v1/libraries/GeometricBrownianMotion.d.ts +77 -0
- package/build/dex/swaap-v1/libraries/GeometricBrownianMotion.js +316 -0
- package/build/dex/swaap-v1/libraries/GeometricBrownianMotion.js.map +1 -0
- package/build/dex/swaap-v1/libraries/LogExpMath.d.ts +75 -0
- package/build/dex/swaap-v1/libraries/LogExpMath.js +418 -0
- package/build/dex/swaap-v1/libraries/LogExpMath.js.map +1 -0
- package/build/dex/swaap-v1/libraries/MathMMM.d.ts +185 -0
- package/build/dex/swaap-v1/libraries/MathMMM.js +453 -0
- package/build/dex/swaap-v1/libraries/MathMMM.js.map +1 -0
- package/build/dex/swaap-v1/libraries/Num.d.ts +31 -0
- package/build/dex/swaap-v1/libraries/Num.js +167 -0
- package/build/dex/swaap-v1/libraries/Num.js.map +1 -0
- package/build/dex/swaap-v1/libraries/PoolQuotations.d.ts +23 -0
- package/build/dex/swaap-v1/libraries/PoolQuotations.js +131 -0
- package/build/dex/swaap-v1/libraries/PoolQuotations.js.map +1 -0
- package/build/dex/swaap-v1/libraries/Struct.d.ts +56 -0
- package/build/dex/swaap-v1/libraries/Struct.js +3 -0
- package/build/dex/swaap-v1/libraries/Struct.js.map +1 -0
- package/build/dex/swaap-v1/swaap-v1-pool.d.ts +45 -0
- package/build/dex/swaap-v1/swaap-v1-pool.js +656 -0
- package/build/dex/swaap-v1/swaap-v1-pool.js.map +1 -0
- package/build/dex/swaap-v1/swaap-v1.d.ts +62 -0
- package/build/dex/swaap-v1/swaap-v1.js +383 -0
- package/build/dex/swaap-v1/swaap-v1.js.map +1 -0
- package/build/dex/swaap-v1/types.d.ts +106 -0
- package/build/dex/swaap-v1/types.js +9 -0
- package/build/dex/swaap-v1/types.js.map +1 -0
- package/build/dex/trader-joe-v2.1/trader-joe-v2.1-new.d.ts +7 -0
- package/build/dex/trader-joe-v2.1/trader-joe-v2.1-new.js +20 -0
- package/build/dex/trader-joe-v2.1/trader-joe-v2.1-new.js.map +1 -0
- package/build/dex/trader-joe-v2.1.d.ts +43 -0
- package/build/dex/trader-joe-v2.1.js +79 -0
- package/build/dex/trader-joe-v2.1.js.map +1 -0
- package/build/dex/trader-joe-v2.d.ts +40 -0
- package/build/dex/trader-joe-v2.js +74 -0
- package/build/dex/trader-joe-v2.js.map +1 -0
- package/build/dex/uniswap-v2/uniswap-v2.d.ts +2 -2
- package/build/dex/uniswap-v2/uniswap-v2.js +4 -4
- package/build/dex/uniswap-v2/uniswap-v2.js.map +1 -1
- package/build/dex/uniswap-v3/forks/alien-base-v3/alien-base-v3.d.ts +17 -0
- package/build/dex/uniswap-v3/forks/alien-base-v3/alien-base-v3.js +64 -0
- package/build/dex/uniswap-v3/forks/alien-base-v3/alien-base-v3.js.map +1 -0
- package/build/dex/uniswap-v3/forks/alien-v3/alien-v3.d.ts +17 -0
- package/build/dex/uniswap-v3/forks/alien-v3/alien-v3.js +79 -0
- package/build/dex/uniswap-v3/forks/alien-v3/alien-v3.js.map +1 -0
- package/build/dex/uniswap-v3/uniswap-v3.d.ts +2 -2
- package/build/dex/uniswap-v3/uniswap-v3.js +2 -4
- package/build/dex/uniswap-v3/uniswap-v3.js.map +1 -1
- package/build/dex/zerox/config.d.ts +2 -0
- package/build/dex/zerox/config.js +33 -0
- package/build/dex/zerox/config.js.map +1 -0
- package/build/dex/zerox/index.d.ts +22 -0
- package/build/dex/zerox/index.js +225 -0
- package/build/dex/zerox/index.js.map +1 -0
- package/build/dex/zerox/order.d.ts +88 -0
- package/build/dex/zerox/order.js +53 -0
- package/build/dex/zerox/order.js.map +1 -0
- package/build/dex/zerox/types.d.ts +73 -0
- package/build/dex/zerox/types.js +21 -0
- package/build/dex/zerox/types.js.map +1 -0
- package/build/executor/types.d.ts +3 -1
- package/build/executor/types.js +2 -0
- package/build/executor/types.js.map +1 -1
- package/build/pricing-helper.d.ts +2 -2
- package/build/pricing-helper.js +5 -9
- package/build/pricing-helper.js.map +1 -1
- package/package.json +1 -1
- package/src/config.ts +18 -18
- package/src/dex/balancer-v1/balancer-v1.ts +1 -5
- package/src/dex/balancer-v2/balancer-v2.ts +1 -5
- package/src/dex/camelot/camelot.ts +3 -9
- package/src/dex/curve-v1/curve-v1.ts +1 -3
- package/src/dex/curve-v1-factory/curve-v1-factory.ts +4 -5
- package/src/dex/dexalot/dexalot.ts +4 -0
- package/src/dex/gmx/gmx.ts +0 -5
- package/src/dex/gmx/pool.ts +2 -8
- package/src/dex/hashflow/hashflow.ts +4 -0
- package/src/dex/idex.ts +0 -1
- package/src/dex/infusion/infusion.ts +3 -9
- package/src/dex/oswap/oswap-pool.ts +1 -3
- package/src/dex/oswap/oswap.ts +2 -8
- package/src/dex/solidly/solidly.ts +3 -9
- package/src/dex/uniswap-v2/uniswap-v2.ts +3 -9
- package/src/dex/uniswap-v3/uniswap-v3.ts +8 -14
- package/src/executor/types.ts +2 -0
- package/src/pricing-helper.ts +4 -27
- package/build/dex-utils.d.ts +0 -3
- package/build/dex-utils.js +0 -10
- package/build/dex-utils.js.map +0 -1
- package/build/stateful-dual-synchronizer.d.ts +0 -46
- package/build/stateful-dual-synchronizer.js +0 -300
- package/build/stateful-dual-synchronizer.js.map +0 -1
|
@@ -151,11 +151,7 @@ export class Infusion extends UniswapV2 {
|
|
|
151
151
|
return pair;
|
|
152
152
|
}
|
|
153
153
|
|
|
154
|
-
async batchCatchUpPairs(
|
|
155
|
-
pairs: [Token, Token][],
|
|
156
|
-
blockNumber: number,
|
|
157
|
-
fmode?: boolean,
|
|
158
|
-
) {
|
|
154
|
+
async batchCatchUpPairs(pairs: [Token, Token][], blockNumber: number) {
|
|
159
155
|
if (!blockNumber) return;
|
|
160
156
|
const pairsToFetch: InfusionPair[] = [];
|
|
161
157
|
for (const _pair of pairs) {
|
|
@@ -167,7 +163,7 @@ export class Infusion extends UniswapV2 {
|
|
|
167
163
|
if (!(pair && pair.exchange)) continue;
|
|
168
164
|
if (!pair.pool) {
|
|
169
165
|
pairsToFetch.push(pair);
|
|
170
|
-
} else if (!
|
|
166
|
+
} else if (!pair.pool.getState(blockNumber)) {
|
|
171
167
|
pairsToFetch.push(pair);
|
|
172
168
|
}
|
|
173
169
|
}
|
|
@@ -281,8 +277,6 @@ export class Infusion extends UniswapV2 {
|
|
|
281
277
|
srcDexFee: 0,
|
|
282
278
|
destDexFee: 0,
|
|
283
279
|
},
|
|
284
|
-
isFirstSwap?: boolean,
|
|
285
|
-
fmode?: boolean,
|
|
286
280
|
): Promise<ExchangePrices<InfusionData> | null> {
|
|
287
281
|
try {
|
|
288
282
|
if (side === SwapSide.BUY) return null; // Buy side not implemented yet
|
|
@@ -300,7 +294,7 @@ export class Infusion extends UniswapV2 {
|
|
|
300
294
|
.sort((a, b) => (a > b ? 1 : -1))
|
|
301
295
|
.join('_');
|
|
302
296
|
|
|
303
|
-
await this.batchCatchUpPairs([[from, to]], blockNumber
|
|
297
|
+
await this.batchCatchUpPairs([[from, to]], blockNumber);
|
|
304
298
|
|
|
305
299
|
const resultPromises = [false, true].map(async stable => {
|
|
306
300
|
// We don't support fee on transfer for stable pools yet
|
|
@@ -126,11 +126,9 @@ export class OSwapEventPool extends StatefulEventSubscriber<OSwapPoolState> {
|
|
|
126
126
|
async getStateOrGenerate(
|
|
127
127
|
blockNumber: number,
|
|
128
128
|
readonly: boolean = true,
|
|
129
|
-
|
|
130
|
-
): Promise<OSwapPoolState | null> {
|
|
129
|
+
): Promise<OSwapPoolState> {
|
|
131
130
|
let state = this.getState(blockNumber);
|
|
132
131
|
if (!state) {
|
|
133
|
-
if (fmode) return null;
|
|
134
132
|
state = await this.generateState(blockNumber);
|
|
135
133
|
if (!readonly) this.setState(state, blockNumber);
|
|
136
134
|
}
|
package/src/dex/oswap/oswap.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Interface } from '@ethersproject/abi';
|
|
2
|
-
import {
|
|
2
|
+
import { AsyncOrSync } from 'ts-essentials';
|
|
3
3
|
import {
|
|
4
4
|
Token,
|
|
5
5
|
Address,
|
|
@@ -203,8 +203,6 @@ export class OSwap extends SimpleExchange implements IDex<OSwapData> {
|
|
|
203
203
|
srcDexFee: 0,
|
|
204
204
|
destDexFee: 0,
|
|
205
205
|
},
|
|
206
|
-
isFirstSwap?: boolean,
|
|
207
|
-
fmode?: boolean,
|
|
208
206
|
): Promise<null | ExchangePrices<OSwapData>> {
|
|
209
207
|
try {
|
|
210
208
|
// Get the pool to use.
|
|
@@ -222,9 +220,7 @@ export class OSwap extends SimpleExchange implements IDex<OSwapData> {
|
|
|
222
220
|
return null;
|
|
223
221
|
}
|
|
224
222
|
|
|
225
|
-
const state = await eventPool.getStateOrGenerate(blockNumber
|
|
226
|
-
|
|
227
|
-
if (!state) return null;
|
|
223
|
+
const state = await eventPool.getStateOrGenerate(blockNumber);
|
|
228
224
|
|
|
229
225
|
// Calculate the prices
|
|
230
226
|
const unitAmount = getBigIntPow(18);
|
|
@@ -383,8 +379,6 @@ export class OSwap extends SimpleExchange implements IDex<OSwapData> {
|
|
|
383
379
|
await this.dexHelper.web3Provider.eth.getBlockNumber();
|
|
384
380
|
const state = await eventPool.getStateOrGenerate(blockNumber);
|
|
385
381
|
|
|
386
|
-
assert(state, 'OSwap pool state not found');
|
|
387
|
-
|
|
388
382
|
const usd0 = await this.dexHelper.getTokenUSDPrice(
|
|
389
383
|
{ address: pool.token0, decimals: 18 },
|
|
390
384
|
BigInt(state.balance0),
|
|
@@ -171,11 +171,7 @@ export class Solidly extends UniswapV2 {
|
|
|
171
171
|
return pair;
|
|
172
172
|
}
|
|
173
173
|
|
|
174
|
-
async batchCatchUpPairs(
|
|
175
|
-
pairs: [Token, Token][],
|
|
176
|
-
blockNumber: number,
|
|
177
|
-
fmode?: boolean,
|
|
178
|
-
) {
|
|
174
|
+
async batchCatchUpPairs(pairs: [Token, Token][], blockNumber: number) {
|
|
179
175
|
if (!blockNumber) return;
|
|
180
176
|
const pairsToFetch: SolidlyPair[] = [];
|
|
181
177
|
for (const _pair of pairs) {
|
|
@@ -184,7 +180,7 @@ export class Solidly extends UniswapV2 {
|
|
|
184
180
|
if (!(pair && pair.exchange)) continue;
|
|
185
181
|
if (!pair.pool) {
|
|
186
182
|
pairsToFetch.push(pair);
|
|
187
|
-
} else if (!
|
|
183
|
+
} else if (!pair.pool.getState(blockNumber)) {
|
|
188
184
|
pairsToFetch.push(pair);
|
|
189
185
|
}
|
|
190
186
|
}
|
|
@@ -310,8 +306,6 @@ export class Solidly extends UniswapV2 {
|
|
|
310
306
|
srcDexFee: 0,
|
|
311
307
|
destDexFee: 0,
|
|
312
308
|
},
|
|
313
|
-
isFirstSwap?: boolean,
|
|
314
|
-
fmode?: boolean,
|
|
315
309
|
): Promise<ExchangePrices<UniswapV2Data> | null> {
|
|
316
310
|
try {
|
|
317
311
|
if (side === SwapSide.BUY) return null; // Buy side not implemented yet
|
|
@@ -329,7 +323,7 @@ export class Solidly extends UniswapV2 {
|
|
|
329
323
|
.sort((a, b) => (a > b ? 1 : -1))
|
|
330
324
|
.join('_');
|
|
331
325
|
|
|
332
|
-
await this.batchCatchUpPairs([[from, to]], blockNumber
|
|
326
|
+
await this.batchCatchUpPairs([[from, to]], blockNumber);
|
|
333
327
|
|
|
334
328
|
const resultPromises = [false, true].map(async stable => {
|
|
335
329
|
// We don't support fee on transfer for stable pools yet
|
|
@@ -445,11 +445,7 @@ export class UniswapV2
|
|
|
445
445
|
}
|
|
446
446
|
}
|
|
447
447
|
|
|
448
|
-
async batchCatchUpPairs(
|
|
449
|
-
pairs: [Token, Token][],
|
|
450
|
-
blockNumber: number,
|
|
451
|
-
fmode?: boolean,
|
|
452
|
-
) {
|
|
448
|
+
async batchCatchUpPairs(pairs: [Token, Token][], blockNumber: number) {
|
|
453
449
|
if (!blockNumber) return;
|
|
454
450
|
const pairsToFetch: UniswapV2Pair[] = [];
|
|
455
451
|
for (const _pair of pairs) {
|
|
@@ -457,7 +453,7 @@ export class UniswapV2
|
|
|
457
453
|
if (!(pair && pair.exchange)) continue;
|
|
458
454
|
if (!pair.pool) {
|
|
459
455
|
pairsToFetch.push(pair);
|
|
460
|
-
} else if (!
|
|
456
|
+
} else if (!pair.pool.getState(blockNumber)) {
|
|
461
457
|
pairsToFetch.push(pair);
|
|
462
458
|
}
|
|
463
459
|
}
|
|
@@ -564,8 +560,6 @@ export class UniswapV2
|
|
|
564
560
|
srcDexFee: 0,
|
|
565
561
|
destDexFee: 0,
|
|
566
562
|
},
|
|
567
|
-
isFirstSwap?: boolean,
|
|
568
|
-
fmode?: boolean,
|
|
569
563
|
): Promise<ExchangePrices<UniswapV2Data> | null> {
|
|
570
564
|
try {
|
|
571
565
|
const from = this.dexHelper.config.wrapETH(_from);
|
|
@@ -587,7 +581,7 @@ export class UniswapV2
|
|
|
587
581
|
if (limitPools && limitPools.every(p => p !== poolIdentifier))
|
|
588
582
|
return null;
|
|
589
583
|
|
|
590
|
-
await this.batchCatchUpPairs([[from, to]], blockNumber
|
|
584
|
+
await this.batchCatchUpPairs([[from, to]], blockNumber);
|
|
591
585
|
const isSell = side === SwapSide.SELL;
|
|
592
586
|
const pairParam = await this.getPairOrderedParams(
|
|
593
587
|
from,
|
|
@@ -14,7 +14,6 @@ import {
|
|
|
14
14
|
PreprocessTransactionOptions,
|
|
15
15
|
SimpleExchangeParam,
|
|
16
16
|
Token,
|
|
17
|
-
TransferFeeParams,
|
|
18
17
|
TxInfo,
|
|
19
18
|
} from '../../types';
|
|
20
19
|
import { CACHE_PREFIX, Network, SwapSide } from '../../constants';
|
|
@@ -662,9 +661,6 @@ export class UniswapV3
|
|
|
662
661
|
side: SwapSide,
|
|
663
662
|
blockNumber: number,
|
|
664
663
|
limitPools?: string[],
|
|
665
|
-
transferFees?: TransferFeeParams,
|
|
666
|
-
isFirstSwap?: boolean,
|
|
667
|
-
fmode?: boolean,
|
|
668
664
|
): Promise<null | ExchangePrices<UniswapV3Data>> {
|
|
669
665
|
try {
|
|
670
666
|
const _srcToken = this.dexHelper.config.wrapETH(srcToken);
|
|
@@ -741,16 +737,14 @@ export class UniswapV3
|
|
|
741
737
|
p => p.getState(blockNumber)!,
|
|
742
738
|
);
|
|
743
739
|
|
|
744
|
-
const rpcResultsPromise =
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
this.network === Network.ZKEVM ? [] : states,
|
|
753
|
-
);
|
|
740
|
+
const rpcResultsPromise = this.getPricingFromRpc(
|
|
741
|
+
_srcToken,
|
|
742
|
+
_destToken,
|
|
743
|
+
amounts,
|
|
744
|
+
side,
|
|
745
|
+
this.network === Network.ZKEVM ? [] : poolsToUse.poolWithoutState,
|
|
746
|
+
this.network === Network.ZKEVM ? [] : states,
|
|
747
|
+
);
|
|
754
748
|
|
|
755
749
|
const unitAmount = getBigIntPow(
|
|
756
750
|
side == SwapSide.SELL ? _srcToken.decimals : _destToken.decimals,
|
package/src/executor/types.ts
CHANGED
package/src/pricing-helper.ts
CHANGED
|
@@ -111,24 +111,14 @@ export class PricingHelper {
|
|
|
111
111
|
blockNumber: number,
|
|
112
112
|
dexKeys: string[],
|
|
113
113
|
filterConstantPricePool: boolean = false,
|
|
114
|
-
overrideTimeout?: number,
|
|
115
114
|
): Promise<{ [dexKey: string]: string[] | null }> {
|
|
116
115
|
const poolIdentifiers = await Promise.all(
|
|
117
116
|
dexKeys.map(async key => {
|
|
118
117
|
try {
|
|
119
118
|
return await new Promise<string[] | null>((resolve, reject) => {
|
|
120
|
-
const now = Date.now();
|
|
121
|
-
const timeout = overrideTimeout ?? FETCH_POOL_IDENTIFIER_TIMEOUT;
|
|
122
119
|
const timer = setTimeout(
|
|
123
|
-
() =>
|
|
124
|
-
|
|
125
|
-
new Error(
|
|
126
|
-
`Timeout of ${timeout}ms breached after ${
|
|
127
|
-
Date.now() - now
|
|
128
|
-
}ms for ${key}`,
|
|
129
|
-
),
|
|
130
|
-
),
|
|
131
|
-
timeout,
|
|
120
|
+
() => reject(new Error(`Timeout`)),
|
|
121
|
+
FETCH_POOL_IDENTIFIER_TIMEOUT,
|
|
132
122
|
);
|
|
133
123
|
const dexInstance = this.dexAdapterService.getDexByKey(key);
|
|
134
124
|
|
|
@@ -202,8 +192,6 @@ export class PricingHelper {
|
|
|
202
192
|
destDexFee: 0,
|
|
203
193
|
},
|
|
204
194
|
rollupL1ToL2GasRatio?: number,
|
|
205
|
-
overrideTimeout?: number,
|
|
206
|
-
fmode?: boolean,
|
|
207
195
|
): Promise<PoolPrices<any>[]> {
|
|
208
196
|
const dexPoolPrices = await Promise.all(
|
|
209
197
|
dexKeys.map(async key => {
|
|
@@ -214,18 +202,9 @@ export class PricingHelper {
|
|
|
214
202
|
|
|
215
203
|
return await new Promise<PoolPrices<any>[] | null>(
|
|
216
204
|
(resolve, reject) => {
|
|
217
|
-
const now = Date.now();
|
|
218
|
-
const timeout = overrideTimeout ?? FETCH_POOL_PRICES_TIMEOUT;
|
|
219
205
|
const timer = setTimeout(
|
|
220
|
-
() =>
|
|
221
|
-
|
|
222
|
-
new Error(
|
|
223
|
-
`Timeout of ${timeout}ms breached after ${
|
|
224
|
-
Date.now() - now
|
|
225
|
-
}ms for ${key}`,
|
|
226
|
-
),
|
|
227
|
-
),
|
|
228
|
-
timeout,
|
|
206
|
+
() => reject(new Error(`Timeout`)),
|
|
207
|
+
FETCH_POOL_PRICES_TIMEOUT,
|
|
229
208
|
);
|
|
230
209
|
|
|
231
210
|
const dexInstance = this.dexAdapterService.getDexByKey(key);
|
|
@@ -247,8 +226,6 @@ export class PricingHelper {
|
|
|
247
226
|
blockNumber,
|
|
248
227
|
limitPools ? limitPools : undefined,
|
|
249
228
|
transferFees,
|
|
250
|
-
false,
|
|
251
|
-
fmode,
|
|
252
229
|
)
|
|
253
230
|
.then(poolPrices => {
|
|
254
231
|
try {
|
package/build/dex-utils.d.ts
DELETED
package/build/dex-utils.js
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.DexPoolNotFoundError = void 0;
|
|
4
|
-
class DexPoolNotFoundError extends Error {
|
|
5
|
-
constructor(dexKey, poolIdentifier) {
|
|
6
|
-
super(`Pool ${poolIdentifier} not found for DEX ${dexKey}`);
|
|
7
|
-
}
|
|
8
|
-
}
|
|
9
|
-
exports.DexPoolNotFoundError = DexPoolNotFoundError;
|
|
10
|
-
//# sourceMappingURL=dex-utils.js.map
|
package/build/dex-utils.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dex-utils.js","sourceRoot":"","sources":["../src/dex-utils.ts"],"names":[],"mappings":";;;AAAA,MAAa,oBAAqB,SAAQ,KAAK;IAC7C,YAAY,MAAc,EAAE,cAAsB;QAChD,KAAK,CAAC,QAAQ,cAAc,sBAAsB,MAAM,EAAE,CAAC,CAAC;IAC9D,CAAC;CACF;AAJD,oDAIC"}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import { AsyncOrSync, DeepReadonly } from 'ts-essentials';
|
|
2
|
-
import { Log, Logger } from './types';
|
|
3
|
-
import { BlockHeader } from 'web3-eth';
|
|
4
|
-
import { EventSubscriber } from './dex-helper/iblock-manager';
|
|
5
|
-
import { IDexHelper } from './dex-helper';
|
|
6
|
-
export declare type InitializeStateOptions<State> = {
|
|
7
|
-
state?: DeepReadonly<State>;
|
|
8
|
-
initCallback?: (state: DeepReadonly<State>) => void;
|
|
9
|
-
forceRegenerate?: boolean;
|
|
10
|
-
};
|
|
11
|
-
declare type ObjectOrString<State> = DeepReadonly<State> | string;
|
|
12
|
-
declare type ObjectOrStringOrNull<State> = ObjectOrString<State> | null;
|
|
13
|
-
export declare abstract class StatefulDualSynchronizer<State> implements EventSubscriber {
|
|
14
|
-
dexKey: string;
|
|
15
|
-
poolIdentifier: string;
|
|
16
|
-
protected dexHelper: IDexHelper;
|
|
17
|
-
protected logger: Logger;
|
|
18
|
-
protected state: ObjectOrStringOrNull<State>;
|
|
19
|
-
protected stateBlockNumber: number;
|
|
20
|
-
protected stateHistory: {
|
|
21
|
-
[blockNumber: number]: ObjectOrString<State>;
|
|
22
|
-
};
|
|
23
|
-
protected invalid: boolean;
|
|
24
|
-
isTracking: () => boolean;
|
|
25
|
-
addressesSubscribed: string[];
|
|
26
|
-
parentName: string;
|
|
27
|
-
name: string;
|
|
28
|
-
isInitialized: boolean;
|
|
29
|
-
constructor(dexKey: string, poolIdentifier: string, dexHelper: IDexHelper, logger: Logger);
|
|
30
|
-
getStateBlockNumber(): Readonly<number>;
|
|
31
|
-
initialize(blockNumber: number, options?: InitializeStateOptions<State>): Promise<void>;
|
|
32
|
-
protected abstract processLog(state: DeepReadonly<State>, log: Readonly<Log>, blockHeader: Readonly<BlockHeader>): AsyncOrSync<DeepReadonly<State> | null>;
|
|
33
|
-
protected processBlockLogs(state: DeepReadonly<State>, logs: Readonly<Log>[], blockHeader: Readonly<BlockHeader>): Promise<DeepReadonly<State> | null>;
|
|
34
|
-
abstract generateState(blockNumber?: number | 'latest'): AsyncOrSync<DeepReadonly<State>>;
|
|
35
|
-
restart(blockNumber: number): void;
|
|
36
|
-
update(logs: Readonly<Log>[], blockHeaders: Readonly<{
|
|
37
|
-
[blockNumber: number]: Readonly<BlockHeader>;
|
|
38
|
-
}>): Promise<void>;
|
|
39
|
-
rollback(blockNumber: number): void;
|
|
40
|
-
invalidate(): void;
|
|
41
|
-
getState(minBlockNumber: number): DeepReadonly<State> | null;
|
|
42
|
-
getStaleState(): DeepReadonly<State> | null;
|
|
43
|
-
_setState(state: ObjectOrStringOrNull<State>, blockNumber: number): void;
|
|
44
|
-
setState(state: ObjectOrString<State>, blockNumber: number): void;
|
|
45
|
-
}
|
|
46
|
-
export {};
|
|
@@ -1,300 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.StatefulDualSynchronizer = void 0;
|
|
4
|
-
const ts_essentials_1 = require("ts-essentials");
|
|
5
|
-
const constants_1 = require("./constants");
|
|
6
|
-
const utils_1 = require("./utils");
|
|
7
|
-
// TODO: make sure that we can get either state object or string
|
|
8
|
-
class StatefulDualSynchronizer {
|
|
9
|
-
constructor(dexKey, poolIdentifier, dexHelper, logger) {
|
|
10
|
-
this.dexKey = dexKey;
|
|
11
|
-
this.poolIdentifier = poolIdentifier;
|
|
12
|
-
this.dexHelper = dexHelper;
|
|
13
|
-
this.logger = logger;
|
|
14
|
-
//The current state and its block number
|
|
15
|
-
//Derived classes should not set these directly, and instead use setState()
|
|
16
|
-
this.state = null;
|
|
17
|
-
this.stateBlockNumber = 0;
|
|
18
|
-
//Derived classes should use setState() to record a new entry
|
|
19
|
-
this.stateHistory = {};
|
|
20
|
-
//Invalid flag - indicates that the currently stored state might not be valid
|
|
21
|
-
this.invalid = false;
|
|
22
|
-
this.isTracking = () => false;
|
|
23
|
-
this.addressesSubscribed = [];
|
|
24
|
-
this.isInitialized = false;
|
|
25
|
-
this.dexKey = dexKey.toLowerCase();
|
|
26
|
-
this.poolIdentifier = poolIdentifier.toLowerCase();
|
|
27
|
-
// parentName and Name are imposed by the interface. Prefer dexKey and poolIdentifier
|
|
28
|
-
this.parentName = this.dexKey;
|
|
29
|
-
this.name = this.poolIdentifier;
|
|
30
|
-
if (!this.dexHelper.config.isSlave) {
|
|
31
|
-
this.dexHelper.dexStatePublisher.registerPool(this.dexKey, this.poolIdentifier, this);
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
getStateBlockNumber() {
|
|
35
|
-
return this.stateBlockNumber;
|
|
36
|
-
}
|
|
37
|
-
//Function which set the initial state and bounded it to blockNumber
|
|
38
|
-
//There is multiple possible case:
|
|
39
|
-
// 1. You provide a state in options object the function will initialize with the provided state
|
|
40
|
-
// with blockNumber and subscribe to logs.
|
|
41
|
-
// 2. if you are a master instance of dex-lib and no state is provided in options object
|
|
42
|
-
// then the function generate a new state with blockNumber as height and set the state with
|
|
43
|
-
// the result.
|
|
44
|
-
// 3. if you are a slave instance of dex-lib
|
|
45
|
-
// either:
|
|
46
|
-
// - If a state is found in the cache and the state is not null we set our state with the
|
|
47
|
-
// cache state and cache blockNumber. Subscribe to logs with the cache blockNumber
|
|
48
|
-
// or:
|
|
49
|
-
// - If no valid state found in cache, we generate a new state with blockNumber
|
|
50
|
-
// and se state with blockNumber. Subscribe to logs with blockNumber. The function
|
|
51
|
-
// will also publish a message to cache to tell one master version of dex-lib that this slave
|
|
52
|
-
// instance subscribed to a pool from dex this.parentName and name this.name.
|
|
53
|
-
async initialize(blockNumber, options) {
|
|
54
|
-
let masterBn = undefined;
|
|
55
|
-
if (options && options.state) {
|
|
56
|
-
this.setState(options.state, blockNumber);
|
|
57
|
-
}
|
|
58
|
-
else {
|
|
59
|
-
if (this.dexHelper.config.isSlave) {
|
|
60
|
-
let updatedState = await this.dexHelper.dexStateSubscriber.requestDEXPoolState(this.dexKey, this.poolIdentifier, blockNumber);
|
|
61
|
-
this.setState(updatedState, blockNumber);
|
|
62
|
-
}
|
|
63
|
-
else {
|
|
64
|
-
// if you are not a slave instance always generate new state
|
|
65
|
-
this.logger.info(`${this.dexKey}: ${this.poolIdentifier}: cache generating state`);
|
|
66
|
-
const state = await this.generateState(blockNumber);
|
|
67
|
-
this.setState(state, blockNumber);
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
// apply a callback on the state
|
|
71
|
-
if (options && options.initCallback) {
|
|
72
|
-
if (this.state) {
|
|
73
|
-
(0, ts_essentials_1.assert)(typeof this.state !== 'string', 'LOGIC ERROR: state is serialised');
|
|
74
|
-
options.initCallback(this.state);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
if (this.dexHelper.config.isSlave) {
|
|
78
|
-
this.dexHelper.dexStateSubscriber.subscribeToDEXPoolUpdates(this.dexKey, this.poolIdentifier, (state, blockNumber) => {
|
|
79
|
-
this.setState(state, blockNumber);
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
else {
|
|
83
|
-
this.dexHelper.blockManager.subscribeToLogs(this, this.addressesSubscribed, masterBn || blockNumber);
|
|
84
|
-
}
|
|
85
|
-
this.isInitialized = true;
|
|
86
|
-
}
|
|
87
|
-
//This function processes all logs for a single block (the block number is
|
|
88
|
-
//contained in each of the logs). It is not allowed to call this function
|
|
89
|
-
//with an empty logs array. The default implementation here will just call
|
|
90
|
-
//processLog for each of the logs; it may be overridden, if block specific
|
|
91
|
-
//handling or handling multiple logs at once is needed. Null should be
|
|
92
|
-
//returned if none of the provided logs affect the state.
|
|
93
|
-
async processBlockLogs(state, logs, blockHeader) {
|
|
94
|
-
let nextState = null;
|
|
95
|
-
for (const log of logs) {
|
|
96
|
-
const retState = await this.processLog(nextState || state, log, blockHeader);
|
|
97
|
-
if (retState)
|
|
98
|
-
nextState = retState;
|
|
99
|
-
}
|
|
100
|
-
return nextState;
|
|
101
|
-
}
|
|
102
|
-
restart(blockNumber) {
|
|
103
|
-
for (const _bn of Object.keys(this.stateHistory)) {
|
|
104
|
-
const bn = +_bn;
|
|
105
|
-
if (bn >= blockNumber)
|
|
106
|
-
break;
|
|
107
|
-
delete this.stateHistory[bn];
|
|
108
|
-
}
|
|
109
|
-
if (this.state && this.stateBlockNumber < blockNumber) {
|
|
110
|
-
this.logger.info(`StatefulDualSynchronizer restart, bn: ${blockNumber}, state_bn: ${this.stateBlockNumber}: ${this.dexKey}: ${this.poolIdentifier}`);
|
|
111
|
-
this._setState(null, blockNumber);
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
//Implementation must call setState() for every block in which the state
|
|
115
|
-
//changes and must ignore any logs that aren't newer than the oldest state
|
|
116
|
-
//stored. If state is not set or null, then the implementation should derive
|
|
117
|
-
//the state by another method for the block number of the first log, ignore
|
|
118
|
-
//all logs with that block number and then proceed as normal for the remaining
|
|
119
|
-
//logs. Remember to clear the invalid flag, even if there are no logs!
|
|
120
|
-
//A default implementation is provided here, but could be overridden.
|
|
121
|
-
async update(logs, blockHeaders) {
|
|
122
|
-
if (this.dexHelper.config.isSlave) {
|
|
123
|
-
throw new Error('LOGIC ERROR: we should expect to listen to events on slave instances');
|
|
124
|
-
}
|
|
125
|
-
let index = 0;
|
|
126
|
-
let lastBlockNumber;
|
|
127
|
-
while (index < logs.length) {
|
|
128
|
-
const blockNumber = logs[index].blockNumber;
|
|
129
|
-
if (index && blockNumber <= lastBlockNumber) {
|
|
130
|
-
this.logger.error('update() received blocks out of order!');
|
|
131
|
-
}
|
|
132
|
-
const blockHeader = blockHeaders[blockNumber];
|
|
133
|
-
if (!blockHeader) {
|
|
134
|
-
this.logger.error('update() missing block header!');
|
|
135
|
-
}
|
|
136
|
-
let lastLogIndex = logs[index].logIndex;
|
|
137
|
-
let indexBlockEnd = index + 1;
|
|
138
|
-
while (indexBlockEnd < logs.length &&
|
|
139
|
-
logs[indexBlockEnd].blockNumber === blockNumber) {
|
|
140
|
-
if (logs[indexBlockEnd].logIndex <= lastLogIndex) {
|
|
141
|
-
this.logger.error('update() received logs out of order!');
|
|
142
|
-
}
|
|
143
|
-
lastLogIndex = logs[indexBlockEnd].logIndex;
|
|
144
|
-
++indexBlockEnd;
|
|
145
|
-
}
|
|
146
|
-
if (!this.state) {
|
|
147
|
-
const freshState = await this.generateState(blockNumber);
|
|
148
|
-
this.setState(freshState, blockNumber);
|
|
149
|
-
}
|
|
150
|
-
//Find the last state before the blockNumber of the logs
|
|
151
|
-
let stateBeforeLog;
|
|
152
|
-
for (const _bn of Object.keys(this.stateHistory)) {
|
|
153
|
-
const bn = +_bn;
|
|
154
|
-
if (bn >= blockNumber)
|
|
155
|
-
break;
|
|
156
|
-
stateBeforeLog = this.stateHistory[bn];
|
|
157
|
-
}
|
|
158
|
-
//Ignoring logs if there's no older state to play them onto
|
|
159
|
-
if (stateBeforeLog) {
|
|
160
|
-
(0, ts_essentials_1.assert)(typeof stateBeforeLog !== 'string', 'LOGIC ERROR: state is serialised');
|
|
161
|
-
const nextState = await this.processBlockLogs(stateBeforeLog, logs.slice(index, indexBlockEnd), blockHeader);
|
|
162
|
-
if (nextState)
|
|
163
|
-
this.setState(nextState, blockNumber);
|
|
164
|
-
}
|
|
165
|
-
lastBlockNumber = blockNumber;
|
|
166
|
-
index = indexBlockEnd;
|
|
167
|
-
}
|
|
168
|
-
this.invalid = false;
|
|
169
|
-
if (!this.dexHelper.config.isSlave && this.state === null) {
|
|
170
|
-
const network = this.dexHelper.config.data.network;
|
|
171
|
-
const createNewState = async () => {
|
|
172
|
-
if (this.state !== null) {
|
|
173
|
-
return true;
|
|
174
|
-
}
|
|
175
|
-
const latestBlockNumber = this.dexHelper.blockManager.getLatestBlockNumber();
|
|
176
|
-
this.logger.warn(`${network}: ${this.dexKey}: ${this.poolIdentifier}: master generate (latest: ${latestBlockNumber}) new state because state is null`);
|
|
177
|
-
try {
|
|
178
|
-
const state = await this.generateState(latestBlockNumber);
|
|
179
|
-
this.setState(state, latestBlockNumber);
|
|
180
|
-
return true;
|
|
181
|
-
}
|
|
182
|
-
catch (e) {
|
|
183
|
-
this.logger.error(`${network}: ${this.dexKey} ${this.poolIdentifier}: (${latestBlockNumber}) failed fetch state:`, e);
|
|
184
|
-
}
|
|
185
|
-
return false;
|
|
186
|
-
};
|
|
187
|
-
this.dexHelper.promiseScheduler.addPromise(createNewState);
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
//Removes all states that are beyond the given block number and sets the
|
|
191
|
-
//current state to the latest one that is left, if any, unless the invalid
|
|
192
|
-
//flag is not set, in which case the most recent state can be kept.
|
|
193
|
-
rollback(blockNumber) {
|
|
194
|
-
if (this.invalid) {
|
|
195
|
-
let lastBn = undefined;
|
|
196
|
-
//loop in the ascending order of the blockNumber. V8 property when object keys are number.
|
|
197
|
-
for (const bn of Object.keys(this.stateHistory)) {
|
|
198
|
-
const bnAsNumber = +bn;
|
|
199
|
-
if (bnAsNumber > blockNumber) {
|
|
200
|
-
delete this.stateHistory[+bn];
|
|
201
|
-
}
|
|
202
|
-
else {
|
|
203
|
-
lastBn = bnAsNumber;
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
if (lastBn) {
|
|
207
|
-
this._setState(this.stateHistory[lastBn], lastBn);
|
|
208
|
-
}
|
|
209
|
-
else {
|
|
210
|
-
this.logger.info(`StatefulDualSynchronizer rollback, bn: ${blockNumber}: ${this.dexKey}: ${this.poolIdentifier}`);
|
|
211
|
-
this._setState(null, blockNumber);
|
|
212
|
-
// TODO: explore generating new state on invalidation
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
else {
|
|
216
|
-
//Keep the current state in this.state and in the history
|
|
217
|
-
for (const _bn of Object.keys(this.stateHistory)) {
|
|
218
|
-
const bn = +_bn;
|
|
219
|
-
if (+bn > blockNumber && +bn !== this.stateBlockNumber) {
|
|
220
|
-
delete this.stateHistory[bn];
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
invalidate() {
|
|
226
|
-
this.logger.info(`StatefulDualSynchronizer invalidate: ${this.dexKey}: ${this.poolIdentifier}`);
|
|
227
|
-
this.invalid = true;
|
|
228
|
-
// TODO: explore generating new state on invalidation
|
|
229
|
-
}
|
|
230
|
-
//May return a state that is more recent than the block number specified, or
|
|
231
|
-
//will return null if a recent enough state cannot be found, in which case the
|
|
232
|
-
//caller should derive a state using another method (at an exact block
|
|
233
|
-
//number), possibly using generateState(), and set it on this object using
|
|
234
|
-
//setState. In case isTracking() returns true, it is assumed that the stored
|
|
235
|
-
//state is current and so the minBlockNumber will be disregarded.
|
|
236
|
-
getState(minBlockNumber) {
|
|
237
|
-
if (!this.state || this.invalid)
|
|
238
|
-
return null;
|
|
239
|
-
if (this.dexHelper.config.isSlave) {
|
|
240
|
-
if (this.dexHelper.dexStateSubscriber.isSynced(minBlockNumber) ||
|
|
241
|
-
this.stateBlockNumber >= minBlockNumber) {
|
|
242
|
-
if (typeof this.state === 'string') {
|
|
243
|
-
this.state = utils_1.Utils.Parse(this.state);
|
|
244
|
-
}
|
|
245
|
-
(0, ts_essentials_1.assert)(typeof this.state !== 'string', 'LOGIC ERROR: state is serialised');
|
|
246
|
-
return this.state;
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
else {
|
|
250
|
-
if (this.isTracking() || this.stateBlockNumber >= minBlockNumber) {
|
|
251
|
-
if (typeof this.state === 'string') {
|
|
252
|
-
this.state = utils_1.Utils.Parse(this.state);
|
|
253
|
-
}
|
|
254
|
-
(0, ts_essentials_1.assert)(typeof this.state !== 'string', 'LOGIC ERROR: state is serialised');
|
|
255
|
-
return this.state;
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
return null; // DEX need to implement an fallback strategy here
|
|
259
|
-
}
|
|
260
|
-
// Returns the last set state. The state might be invalid or not updated.
|
|
261
|
-
getStaleState() {
|
|
262
|
-
if (typeof this.state === 'string') {
|
|
263
|
-
this.state = utils_1.Utils.Parse(this.state);
|
|
264
|
-
}
|
|
265
|
-
(0, ts_essentials_1.assert)(typeof this.state !== 'string', 'LOGIC ERROR: state is serialised');
|
|
266
|
-
return this.state;
|
|
267
|
-
}
|
|
268
|
-
_setState(state, blockNumber) {
|
|
269
|
-
this.state = state;
|
|
270
|
-
this.stateBlockNumber = blockNumber;
|
|
271
|
-
}
|
|
272
|
-
//Saves the state into the stateHistory, and cleans up any old state that is
|
|
273
|
-
//no longer needed. If the blockNumber is greater than or equal to the
|
|
274
|
-
//current state, then the current state will be updated and the invalid flag
|
|
275
|
-
//can be reset.
|
|
276
|
-
setState(state, blockNumber) {
|
|
277
|
-
if (!blockNumber) {
|
|
278
|
-
this.logger.error('setState() with blockNumber', blockNumber);
|
|
279
|
-
return;
|
|
280
|
-
}
|
|
281
|
-
this.stateHistory[blockNumber] = state;
|
|
282
|
-
if (!this.state || blockNumber >= this.stateBlockNumber) {
|
|
283
|
-
this._setState(state, blockNumber);
|
|
284
|
-
this.invalid = false;
|
|
285
|
-
}
|
|
286
|
-
const minBlockNumberToKeep = this.stateBlockNumber - constants_1.MAX_BLOCKS_HISTORY;
|
|
287
|
-
let lastBlockNumber;
|
|
288
|
-
for (const bn of Object.keys(this.stateHistory)) {
|
|
289
|
-
if (+bn <= minBlockNumberToKeep) {
|
|
290
|
-
if (lastBlockNumber)
|
|
291
|
-
delete this.stateHistory[lastBlockNumber];
|
|
292
|
-
}
|
|
293
|
-
if (+bn >= minBlockNumberToKeep)
|
|
294
|
-
break;
|
|
295
|
-
lastBlockNumber = +bn;
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
exports.StatefulDualSynchronizer = StatefulDualSynchronizer;
|
|
300
|
-
//# sourceMappingURL=stateful-dual-synchronizer.js.map
|