@paraswap/dex-lib 2.37.2 → 2.37.4-current-fee-ramses-v2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (201) hide show
  1. package/.idea/aws.xml +17 -0
  2. package/.idea/codeStyles/Project.xml +19 -0
  3. package/.idea/codeStyles/codeStyleConfig.xml +5 -0
  4. package/.idea/misc.xml +6 -0
  5. package/.idea/modules.xml +8 -0
  6. package/.idea/paraswap-dex-lib.iml +9 -0
  7. package/.idea/vcs.xml +6 -0
  8. package/build/abi/algebra/AlgebraPool.abi.json +727 -0
  9. package/build/abi/curve-v1/StableSwapFRXETH.json +889 -0
  10. package/build/abi/curve-v1/StableSwapWBETH.json +1223 -0
  11. package/build/abi/dexalot/DexalotMainnetRFQ.json +887 -0
  12. package/build/abi/pancakeswap-v3/PancakeswapV3Factory.abi.json +300 -0
  13. package/build/abi/ramses-v2/RamsesV2Pool.abi.json +1580 -0
  14. package/build/abi/sushiswap-v3/QuoterV2.json +267 -0
  15. package/build/abi/sushiswap-v3/RouterProcessor3.json +289 -0
  16. package/build/abi/uniswap-v3/UniswapV3Factory.abi.json +148 -0
  17. package/build/abi/wBETH.json +1527 -0
  18. package/build/dex/algebra/algebra-factory.d.ts +25 -0
  19. package/build/dex/algebra/algebra-factory.js +43 -0
  20. package/build/dex/algebra/algebra-factory.js.map +1 -0
  21. package/build/dex/algebra/algebra-pool.d.ts +46 -0
  22. package/build/dex/algebra/algebra-pool.js +336 -0
  23. package/build/dex/algebra/algebra-pool.js.map +1 -0
  24. package/build/dex/algebra/algebra.d.ts +3 -0
  25. package/build/dex/algebra/algebra.js +27 -5
  26. package/build/dex/algebra/algebra.js.map +1 -1
  27. package/build/dex/algebra/config.js +0 -1
  28. package/build/dex/algebra/config.js.map +1 -1
  29. package/build/dex/algebra/types.d.ts +1 -1
  30. package/build/dex/curve-v1/pools/frxETHpool.d.ts +7 -0
  31. package/build/dex/curve-v1/pools/frxETHpool.js +27 -0
  32. package/build/dex/curve-v1/pools/frxETHpool.js.map +1 -0
  33. package/build/dex/curve-v1/pools/wbETHpool.d.ts +29 -0
  34. package/build/dex/curve-v1/pools/wbETHpool.js +408 -0
  35. package/build/dex/curve-v1/pools/wbETHpool.js.map +1 -0
  36. package/build/dex/{test-dex → dexalot}/config.d.ts +1 -1
  37. package/build/dex/dexalot/config.js +18 -0
  38. package/build/dex/dexalot/config.js.map +1 -0
  39. package/build/dex/dexalot/constants.d.ts +15 -0
  40. package/build/dex/dexalot/constants.js +22 -0
  41. package/build/dex/dexalot/constants.js.map +1 -0
  42. package/build/dex/dexalot/dexalot.d.ts +69 -0
  43. package/build/dex/dexalot/dexalot.js +646 -0
  44. package/build/dex/dexalot/dexalot.js.map +1 -0
  45. package/build/dex/dexalot/rate-fetcher.d.ts +28 -0
  46. package/build/dex/dexalot/rate-fetcher.js +100 -0
  47. package/build/dex/dexalot/rate-fetcher.js.map +1 -0
  48. package/build/dex/dexalot/types.d.ts +114 -0
  49. package/build/dex/dexalot/types.js +12 -0
  50. package/build/dex/dexalot/types.js.map +1 -0
  51. package/build/dex/dexalot/validators.d.ts +5 -0
  52. package/build/dex/dexalot/validators.js +45 -0
  53. package/build/dex/dexalot/validators.js.map +1 -0
  54. package/build/dex/pancakeswap-v3/pancakeswap-v3-factory.d.ts +26 -0
  55. package/build/dex/pancakeswap-v3/pancakeswap-v3-factory.js +44 -0
  56. package/build/dex/pancakeswap-v3/pancakeswap-v3-factory.js.map +1 -0
  57. package/build/dex/pancakeswap-v3/pancakeswap-v3.d.ts +3 -0
  58. package/build/dex/pancakeswap-v3/pancakeswap-v3.js +26 -2
  59. package/build/dex/pancakeswap-v3/pancakeswap-v3.js.map +1 -1
  60. package/build/dex/pancakeswap-v3/types.d.ts +14 -0
  61. package/build/dex/{test-dex → pancakeswap-v3}/types.js.map +1 -1
  62. package/build/dex/ramses-v2/config.d.ts +4 -0
  63. package/build/dex/ramses-v2/config.js +28 -0
  64. package/build/dex/ramses-v2/config.js.map +1 -0
  65. package/build/dex/ramses-v2/constants.d.ts +28 -0
  66. package/build/dex/ramses-v2/constants.js +35 -0
  67. package/build/dex/ramses-v2/constants.js.map +1 -0
  68. package/build/dex/ramses-v2/contract-math/BitMath.d.ts +4 -0
  69. package/build/dex/ramses-v2/contract-math/BitMath.js +93 -0
  70. package/build/dex/ramses-v2/contract-math/BitMath.js.map +1 -0
  71. package/build/dex/ramses-v2/contract-math/FixedPoint128.d.ts +3 -0
  72. package/build/dex/ramses-v2/contract-math/FixedPoint128.js +8 -0
  73. package/build/dex/ramses-v2/contract-math/FixedPoint128.js.map +1 -0
  74. package/build/dex/ramses-v2/contract-math/FixedPoint96.d.ts +4 -0
  75. package/build/dex/ramses-v2/contract-math/FixedPoint96.js +9 -0
  76. package/build/dex/ramses-v2/contract-math/FixedPoint96.js.map +1 -0
  77. package/build/dex/ramses-v2/contract-math/FullMath.d.ts +4 -0
  78. package/build/dex/ramses-v2/contract-math/FullMath.js +19 -0
  79. package/build/dex/ramses-v2/contract-math/FullMath.js.map +1 -0
  80. package/build/dex/ramses-v2/contract-math/LiquidityMath.d.ts +3 -0
  81. package/build/dex/ramses-v2/contract-math/LiquidityMath.js +22 -0
  82. package/build/dex/ramses-v2/contract-math/LiquidityMath.js.map +1 -0
  83. package/build/dex/ramses-v2/contract-math/Oracle.d.ts +10 -0
  84. package/build/dex/ramses-v2/contract-math/Oracle.js +133 -0
  85. package/build/dex/ramses-v2/contract-math/Oracle.js.map +1 -0
  86. package/build/dex/ramses-v2/contract-math/SqrtPriceMath.d.ts +10 -0
  87. package/build/dex/ramses-v2/contract-math/SqrtPriceMath.js +91 -0
  88. package/build/dex/ramses-v2/contract-math/SqrtPriceMath.js.map +1 -0
  89. package/build/dex/ramses-v2/contract-math/SwapMath.d.ts +8 -0
  90. package/build/dex/ramses-v2/contract-math/SwapMath.js +70 -0
  91. package/build/dex/ramses-v2/contract-math/SwapMath.js.map +1 -0
  92. package/build/dex/ramses-v2/contract-math/Tick.d.ts +7 -0
  93. package/build/dex/ramses-v2/contract-math/Tick.js +45 -0
  94. package/build/dex/ramses-v2/contract-math/Tick.js.map +1 -0
  95. package/build/dex/ramses-v2/contract-math/TickBitMap.d.ts +8 -0
  96. package/build/dex/ramses-v2/contract-math/TickBitMap.js +87 -0
  97. package/build/dex/ramses-v2/contract-math/TickBitMap.js.map +1 -0
  98. package/build/dex/ramses-v2/contract-math/TickMath.d.ts +8 -0
  99. package/build/dex/ramses-v2/contract-math/TickMath.js +162 -0
  100. package/build/dex/ramses-v2/contract-math/TickMath.js.map +1 -0
  101. package/build/dex/ramses-v2/contract-math/UnsafeMath.d.ts +3 -0
  102. package/build/dex/ramses-v2/contract-math/UnsafeMath.js +10 -0
  103. package/build/dex/ramses-v2/contract-math/UnsafeMath.js.map +1 -0
  104. package/build/dex/ramses-v2/contract-math/uniswap-v3-math.d.ts +18 -0
  105. package/build/dex/ramses-v2/contract-math/uniswap-v3-math.js +392 -0
  106. package/build/dex/ramses-v2/contract-math/uniswap-v3-math.js.map +1 -0
  107. package/build/dex/ramses-v2/contract-math/utils.d.ts +3 -0
  108. package/build/dex/ramses-v2/contract-math/utils.js +16 -0
  109. package/build/dex/ramses-v2/contract-math/utils.js.map +1 -0
  110. package/build/dex/ramses-v2/ramses-v2-pool.d.ts +42 -0
  111. package/build/dex/ramses-v2/ramses-v2-pool.js +307 -0
  112. package/build/dex/ramses-v2/ramses-v2-pool.js.map +1 -0
  113. package/build/dex/ramses-v2/ramses-v2.d.ts +61 -0
  114. package/build/dex/ramses-v2/ramses-v2.js +690 -0
  115. package/build/dex/ramses-v2/ramses-v2.js.map +1 -0
  116. package/build/dex/ramses-v2/types.d.ts +154 -0
  117. package/build/dex/ramses-v2/types.js +9 -0
  118. package/build/dex/ramses-v2/types.js.map +1 -0
  119. package/build/dex/ramses-v2/utils.d.ts +6 -0
  120. package/build/dex/ramses-v2/utils.js +71 -0
  121. package/build/dex/ramses-v2/utils.js.map +1 -0
  122. package/build/dex/sushiswap-v3/config.d.ts +4 -0
  123. package/build/dex/sushiswap-v3/config.js +132 -0
  124. package/build/dex/sushiswap-v3/config.js.map +1 -0
  125. package/build/dex/sushiswap-v3/constants.d.ts +4 -0
  126. package/build/dex/sushiswap-v3/constants.js +32 -0
  127. package/build/dex/sushiswap-v3/constants.js.map +1 -0
  128. package/build/dex/sushiswap-v3/sushiswap-v3-original.d.ts +56 -0
  129. package/build/dex/sushiswap-v3/sushiswap-v3-original.js +598 -0
  130. package/build/dex/sushiswap-v3/sushiswap-v3-original.js.map +1 -0
  131. package/build/dex/sushiswap-v3/sushiswap-v3-pool.d.ts +1 -0
  132. package/build/dex/sushiswap-v3/sushiswap-v3-pool.js +6 -0
  133. package/build/dex/sushiswap-v3/sushiswap-v3-pool.js.map +1 -0
  134. package/build/dex/sushiswap-v3/sushiswap-v3.d.ts +21 -0
  135. package/build/dex/sushiswap-v3/sushiswap-v3.js +58 -0
  136. package/build/dex/sushiswap-v3/sushiswap-v3.js.map +1 -0
  137. package/build/dex/sushiswap-v3/token.d.ts +6 -0
  138. package/build/dex/sushiswap-v3/token.js +23 -0
  139. package/build/dex/sushiswap-v3/token.js.map +1 -0
  140. package/build/dex/sushiswap-v3/types.d.ts +15 -0
  141. package/build/dex/sushiswap-v3/types.js +18 -0
  142. package/build/dex/sushiswap-v3/types.js.map +1 -0
  143. package/build/dex/uniswap-v3/config.js +2 -0
  144. package/build/dex/uniswap-v3/config.js.map +1 -1
  145. package/build/dex/uniswap-v3/forks/ramses-v2/ramses-v2-pool.d.ts +7 -0
  146. package/build/dex/uniswap-v3/forks/ramses-v2/ramses-v2-pool.js +87 -0
  147. package/build/dex/uniswap-v3/forks/ramses-v2/ramses-v2-pool.js.map +1 -0
  148. package/build/dex/uniswap-v3/types.d.ts +3 -0
  149. package/build/dex/uniswap-v3/types.js.map +1 -1
  150. package/build/dex/uniswap-v3/uniswap-v3-factory.d.ts +26 -0
  151. package/build/dex/uniswap-v3/uniswap-v3-factory.js +44 -0
  152. package/build/dex/uniswap-v3/uniswap-v3-factory.js.map +1 -0
  153. package/build/dex/uniswap-v3/uniswap-v3-pool.d.ts +7 -5
  154. package/build/dex/uniswap-v3/uniswap-v3-pool.js.map +1 -1
  155. package/build/dex/uniswap-v3/uniswap-v3.d.ts +3 -0
  156. package/build/dex/uniswap-v3/uniswap-v3.js +33 -5
  157. package/build/dex/uniswap-v3/uniswap-v3.js.map +1 -1
  158. package/build/dex-helper/dummy-dex-helper.js +3 -0
  159. package/build/dex-helper/dummy-dex-helper.js.map +1 -1
  160. package/build/dex-helper/icache.d.ts +1 -0
  161. package/package.json +1 -1
  162. package/src/abi/pancakeswap-v3/PancakeswapV3Factory.abi.json +300 -0
  163. package/src/abi/ramses-v2/RamsesV2Pool.abi.json +1580 -0
  164. package/src/dex/algebra/algebra-factory.ts +70 -0
  165. package/src/dex/algebra/algebra.ts +47 -6
  166. package/src/dex/algebra/config.ts +0 -1
  167. package/src/dex/algebra/types.ts +2 -1
  168. package/src/dex/pancakeswap-v3/pancakeswap-v3-factory.ts +73 -0
  169. package/src/dex/pancakeswap-v3/pancakeswap-v3.ts +50 -2
  170. package/src/dex/uniswap-v3/config.ts +2 -0
  171. package/src/dex/uniswap-v3/forks/ramses-v2/ramses-v2-pool.ts +104 -0
  172. package/src/dex/uniswap-v3/types.ts +4 -0
  173. package/src/dex/uniswap-v3/uniswap-v3-factory.ts +73 -0
  174. package/src/dex/uniswap-v3/uniswap-v3-pool.ts +6 -4
  175. package/src/dex/uniswap-v3/uniswap-v3.ts +72 -22
  176. package/src/dex-helper/dummy-dex-helper.ts +4 -0
  177. package/src/dex-helper/icache.ts +2 -0
  178. package/build/abi/quickPerps/fast-price-events.json +0 -70
  179. package/build/abi/quickPerps/fast-price-feed.json +0 -748
  180. package/build/abi/quickPerps/reader.json +0 -313
  181. package/build/abi/quickPerps/vault-price-feed.json +0 -477
  182. package/build/abi/quickPerps/vault.json +0 -1953
  183. package/build/dex/maverick-v1/scripts/event-sequence.d.ts +0 -1
  184. package/build/dex/maverick-v1/scripts/event-sequence.js +0 -110
  185. package/build/dex/maverick-v1/scripts/event-sequence.js.map +0 -1
  186. package/build/dex/test-dex/config.js +0 -15
  187. package/build/dex/test-dex/config.js.map +0 -1
  188. package/build/dex/test-dex/test-dex-pool.d.ts +0 -39
  189. package/build/dex/test-dex/test-dex-pool.js +0 -63
  190. package/build/dex/test-dex/test-dex-pool.js.map +0 -1
  191. package/build/dex/test-dex/test-dex.d.ts +0 -37
  192. package/build/dex/test-dex/test-dex.js +0 -126
  193. package/build/dex/test-dex/test-dex.js.map +0 -1
  194. package/build/dex/test-dex/types.d.ts +0 -6
  195. package/build/dex/woo-fi-v2/woo-fi-math.d.ts +0 -16
  196. package/build/dex/woo-fi-v2/woo-fi-math.js +0 -137
  197. package/build/dex/woo-fi-v2/woo-fi-math.js.map +0 -1
  198. package/build/workers.d.ts +0 -0
  199. package/build/workers.js +0 -2
  200. package/build/workers.js.map +0 -1
  201. /package/build/dex/{test-dex → pancakeswap-v3}/types.js +0 -0
@@ -0,0 +1,25 @@
1
+ import { Interface } from '@ethersproject/abi';
2
+ import { DeepReadonly } from 'ts-essentials';
3
+ import { IDexHelper } from '../../dex-helper/idex-helper';
4
+ import { StatefulEventSubscriber } from '../../stateful-event-subscriber';
5
+ import { Address, Log, Logger } from '../../types';
6
+ import { LogDescription } from 'ethers/lib/utils';
7
+ import { FactoryState } from './types';
8
+ export declare type OnPoolCreatedCallback = ({ token0, token1, }: {
9
+ token0: string;
10
+ token1: string;
11
+ }) => Promise<void>;
12
+ export declare class AlgebraFactory extends StatefulEventSubscriber<FactoryState> {
13
+ readonly dexHelper: IDexHelper;
14
+ protected readonly factoryAddress: Address;
15
+ protected readonly onPoolCreated: OnPoolCreatedCallback;
16
+ handlers: {
17
+ [event: string]: (event: any) => Promise<void>;
18
+ };
19
+ logDecoder: (log: Log) => any;
20
+ readonly factoryIface: Interface;
21
+ constructor(dexHelper: IDexHelper, parentName: string, factoryAddress: Address, logger: Logger, onPoolCreated: OnPoolCreatedCallback, mapKey?: string);
22
+ generateState(): FactoryState;
23
+ protected processLog(_: DeepReadonly<FactoryState>, log: Readonly<Log>): Promise<FactoryState>;
24
+ handleNewPool(event: LogDescription): Promise<void>;
25
+ }
@@ -0,0 +1,43 @@
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.AlgebraFactory = void 0;
7
+ const abi_1 = require("@ethersproject/abi");
8
+ const AlgebraFactory_v1_1_abi_json_1 = __importDefault(require("../../abi/algebra/AlgebraFactory-v1_1.abi.json"));
9
+ const stateful_event_subscriber_1 = require("../../stateful-event-subscriber");
10
+ /*
11
+ * "Stateless" event subscriber in order to capture "PoolCreated" event on new pools created.
12
+ * State is present, but it's a placeholder to actually make the events reach handlers (if there's no previous state - `processBlockLogs` is not called)
13
+ */
14
+ class AlgebraFactory extends stateful_event_subscriber_1.StatefulEventSubscriber {
15
+ constructor(dexHelper, parentName, factoryAddress, logger, onPoolCreated, mapKey = '') {
16
+ super(parentName, `${parentName} Factory`, dexHelper, logger, true, mapKey);
17
+ this.dexHelper = dexHelper;
18
+ this.factoryAddress = factoryAddress;
19
+ this.onPoolCreated = onPoolCreated;
20
+ this.handlers = {};
21
+ this.factoryIface = new abi_1.Interface(AlgebraFactory_v1_1_abi_json_1.default);
22
+ this.addressesSubscribed = [factoryAddress];
23
+ this.logDecoder = (log) => this.factoryIface.parseLog(log);
24
+ this.handlers['Pool'] = this.handleNewPool.bind(this);
25
+ }
26
+ generateState() {
27
+ return {};
28
+ }
29
+ async processLog(_, log) {
30
+ const event = this.logDecoder(log);
31
+ if (event.name in this.handlers) {
32
+ await this.handlers[event.name](event);
33
+ }
34
+ return {};
35
+ }
36
+ async handleNewPool(event) {
37
+ const token0 = event.args.token0;
38
+ const token1 = event.args.token1;
39
+ await this.onPoolCreated({ token0, token1 });
40
+ }
41
+ }
42
+ exports.AlgebraFactory = AlgebraFactory;
43
+ //# sourceMappingURL=algebra-factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"algebra-factory.js","sourceRoot":"","sources":["../../../src/dex/algebra/algebra-factory.ts"],"names":[],"mappings":";;;;;;AAAA,4CAA+C;AAE/C,kHAAwE;AAExE,+EAA0E;AAa1E;;;GAGG;AACH,MAAa,cAAe,SAAQ,mDAAqC;IASvE,YACW,SAAqB,EAC9B,UAAkB,EACC,cAAuB,EAC1C,MAAc,EACK,aAAoC,EACvD,SAAiB,EAAE;QAEnB,KAAK,CAAC,UAAU,EAAE,GAAG,UAAU,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAPnE,cAAS,GAAT,SAAS,CAAY;QAEX,mBAAc,GAAd,cAAc,CAAS;QAEvB,kBAAa,GAAb,aAAa,CAAuB;QAbzD,aAAQ,GAEJ,EAAE,CAAC;QAIS,iBAAY,GAAG,IAAI,eAAS,CAAC,sCAAU,CAAC,CAAC;QAYvD,IAAI,CAAC,mBAAmB,GAAG,CAAC,cAAc,CAAC,CAAC;QAE5C,IAAI,CAAC,UAAU,GAAG,CAAC,GAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAEhE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxD,CAAC;IAED,aAAa;QACX,OAAO,EAAE,CAAC;IACZ,CAAC;IAES,KAAK,CAAC,UAAU,CACxB,CAA6B,EAC7B,GAAkB;QAElB,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE;YAC/B,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC;SACxC;QAED,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,KAAqB;QACvC,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;QACjC,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;QAEjC,MAAM,IAAI,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC/C,CAAC;CACF;AAhDD,wCAgDC"}
@@ -0,0 +1,46 @@
1
+ import { Interface } from '@ethersproject/abi';
2
+ import { DeepReadonly } from 'ts-essentials';
3
+ import { Address, BlockHeader, Log, Logger } from '../../types';
4
+ import { InitializeStateOptions, StatefulEventSubscriber } from '../../stateful-event-subscriber';
5
+ import { IDexHelper } from '../../dex-helper/idex-helper';
6
+ import { PoolState } from './types';
7
+ import { Contract } from 'web3-eth-contract';
8
+ import { DecodedStateMultiCallResultWithRelativeBitmaps } from './types';
9
+ export declare class AlgebraEventPool extends StatefulEventSubscriber<PoolState> {
10
+ readonly dexHelper: IDexHelper;
11
+ readonly stateMultiContract: Contract;
12
+ readonly erc20Interface: Interface;
13
+ protected readonly factoryAddress: Address;
14
+ readonly poolInitCodeHash: string;
15
+ readonly poolDeployer: string;
16
+ handlers: {
17
+ [event: string]: (event: any, state: DeepReadonly<PoolState>, log: Readonly<Log>, blockHeader: BlockHeader) => DeepReadonly<PoolState> | null;
18
+ };
19
+ logDecoder: (log: Log) => any;
20
+ addressesSubscribed: string[];
21
+ private _poolAddress?;
22
+ readonly token0: Address;
23
+ readonly token1: Address;
24
+ readonly poolIface: Interface;
25
+ initFailed: boolean;
26
+ initRetryAttemptCount: number;
27
+ constructor(dexHelper: IDexHelper, parentName: string, stateMultiContract: Contract, erc20Interface: Interface, factoryAddress: Address, token0: Address, token1: Address, logger: Logger, mapKey: string | undefined, poolInitCodeHash: string, poolDeployer: string);
28
+ get poolAddress(): Address;
29
+ set poolAddress(address: Address);
30
+ initialize(blockNumber: number, options?: InitializeStateOptions<PoolState>): Promise<void>;
31
+ protected processBlockLogs(state: DeepReadonly<PoolState>, logs: Readonly<Log>[], blockHeader: Readonly<BlockHeader>): Promise<DeepReadonly<PoolState> | null>;
32
+ protected processLog(state: DeepReadonly<PoolState>, log: Readonly<Log>, blockHeader: Readonly<BlockHeader>): DeepReadonly<PoolState> | null;
33
+ getBitmapRangeToRequest(): bigint;
34
+ private _fetchPoolStateSingleStep;
35
+ private _fetchPoolStateMultiStep;
36
+ _fetchInitStateMultiStrategies(blockNumber: number): Promise<[bigint, bigint, DecodedStateMultiCallResultWithRelativeBitmaps]>;
37
+ generateState(blockNumber: number): Promise<Readonly<PoolState>>;
38
+ handleSwapEvent(event: any, pool: PoolState, log: Log, blockHeader: BlockHeader): PoolState;
39
+ handleMintEvent(event: any, pool: PoolState, log: Log, blockHeader: BlockHeader): PoolState;
40
+ handleBurnEvent(event: any, pool: PoolState, log: Log, blockHeader: BlockHeader): PoolState;
41
+ handleNewFee(event: any, pool: PoolState, log: Log, blockHeader: BlockHeader): PoolState;
42
+ handleCollectEvent(event: any, pool: PoolState, log: Log, blockHeader: BlockHeader): PoolState;
43
+ handleFlashEvent(event: any, pool: PoolState, log: Log, blockHeader: BlockHeader): PoolState;
44
+ handleCommunityFee(event: any, pool: PoolState, log: Log, blockHeader: BlockHeader): PoolState;
45
+ private _computePoolAddress;
46
+ }
@@ -0,0 +1,336 @@
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.AlgebraEventPool = void 0;
7
+ const lodash_1 = __importDefault(require("lodash"));
8
+ const abi_1 = require("@ethersproject/abi");
9
+ const ts_essentials_1 = require("ts-essentials");
10
+ const utils_1 = require("../../utils");
11
+ const stateful_event_subscriber_1 = require("../../stateful-event-subscriber");
12
+ const ethers_1 = require("ethers");
13
+ const AlgebraPool_abi_json_1 = __importDefault(require("../../abi/algebra/AlgebraPool.abi.json"));
14
+ const constants_1 = require("../uniswap-v3/constants");
15
+ const decoders_1 = require("../../lib/decoders");
16
+ const utils_2 = require("./utils");
17
+ const AlgebraMath_1 = require("./lib/AlgebraMath");
18
+ const TickBitMap_1 = require("../uniswap-v3/contract-math/TickBitMap");
19
+ const utils_3 = require("../uniswap-v3/contract-math/utils");
20
+ const Constants_1 = require("./lib/Constants");
21
+ const constants_2 = require("../../constants");
22
+ class AlgebraEventPool extends stateful_event_subscriber_1.StatefulEventSubscriber {
23
+ constructor(dexHelper, parentName, stateMultiContract, erc20Interface, factoryAddress, token0, token1, logger, mapKey = '', poolInitCodeHash, poolDeployer) {
24
+ super(parentName, `${token0}_${token1}`, dexHelper, logger, true, mapKey);
25
+ this.dexHelper = dexHelper;
26
+ this.stateMultiContract = stateMultiContract;
27
+ this.erc20Interface = erc20Interface;
28
+ this.factoryAddress = factoryAddress;
29
+ this.poolInitCodeHash = poolInitCodeHash;
30
+ this.poolDeployer = poolDeployer;
31
+ this.handlers = {};
32
+ this.poolIface = new abi_1.Interface(AlgebraPool_abi_json_1.default);
33
+ this.initFailed = false;
34
+ this.initRetryAttemptCount = 0;
35
+ this.token0 = token0.toLowerCase();
36
+ this.token1 = token1.toLowerCase();
37
+ this.logDecoder = (log) => this.poolIface.parseLog(log);
38
+ this.addressesSubscribed = new Array(1);
39
+ this.handlers['Fee'] = this.handleNewFee.bind(this);
40
+ this.handlers['Swap'] = this.handleSwapEvent.bind(this);
41
+ this.handlers['Mint'] = this.handleMintEvent.bind(this);
42
+ this.handlers['Burn'] = this.handleBurnEvent.bind(this);
43
+ this.handlers['Flash'] = this.handleFlashEvent.bind(this);
44
+ this.handlers['Collect'] = this.handleCollectEvent.bind(this);
45
+ this.handlers['CommunityFee'] = this.handleCommunityFee.bind(this);
46
+ }
47
+ get poolAddress() {
48
+ if (this._poolAddress === undefined) {
49
+ this._poolAddress = this._computePoolAddress(this.token0, this.token1);
50
+ }
51
+ return this._poolAddress;
52
+ }
53
+ set poolAddress(address) {
54
+ this._poolAddress = address.toLowerCase();
55
+ }
56
+ async initialize(blockNumber, options) {
57
+ await super.initialize(blockNumber, options);
58
+ }
59
+ async processBlockLogs(state, logs, blockHeader) {
60
+ const newState = await super.processBlockLogs(state, logs, blockHeader);
61
+ if (newState && !newState.isValid) {
62
+ return await this.generateState(blockHeader.number);
63
+ }
64
+ return newState;
65
+ }
66
+ processLog(state, log, blockHeader) {
67
+ try {
68
+ const event = this.logDecoder(log);
69
+ if (event.name in this.handlers) {
70
+ // Because we have observations in array which is mutable by nature, there is a
71
+ // ts compile error: https://stackoverflow.com/questions/53412934/disable-allowing-assigning-readonly-types-to-non-readonly-types
72
+ // And there is no good workaround, so turn off the type checker for this line
73
+ const _state = lodash_1.default.cloneDeep(state);
74
+ try {
75
+ const newState = this.handlers[event.name](event, _state, log, blockHeader);
76
+ return newState;
77
+ }
78
+ catch (e) {
79
+ if (e instanceof Error &&
80
+ e.message.endsWith(constants_1.OUT_OF_RANGE_ERROR_POSTFIX)) {
81
+ this.logger.warn(`${this.parentName}: Pool ${this.poolAddress} on ${this.dexHelper.config.data.network} is out of TickBitmap requested range. Re-query the state. ${JSON.stringify(event)}`, e);
82
+ }
83
+ else {
84
+ this.logger.error(`${this.parentName}: Pool ${this.poolAddress}, ` +
85
+ `network=${this.dexHelper.config.data.network}: Unexpected ` +
86
+ `error while handling event on blockNumber=${blockHeader.number}, ` +
87
+ `blockHash=${blockHeader.hash} and parentHash=${blockHeader.parentHash} for QuickSwapV3, ${JSON.stringify(event)}`, e);
88
+ }
89
+ _state.isValid = false;
90
+ return _state;
91
+ }
92
+ }
93
+ }
94
+ catch (e) {
95
+ (0, utils_1.catchParseLogError)(e, this.logger);
96
+ }
97
+ return null; // ignore unrecognized event
98
+ }
99
+ getBitmapRangeToRequest() {
100
+ return constants_1.TICK_BITMAP_TO_USE + constants_1.TICK_BITMAP_BUFFER;
101
+ }
102
+ async _fetchPoolStateSingleStep(blockNumber) {
103
+ const callData = [
104
+ {
105
+ target: this.token0,
106
+ callData: this.erc20Interface.encodeFunctionData('balanceOf', [
107
+ this.poolAddress,
108
+ ]),
109
+ decodeFunction: decoders_1.uint256ToBigInt,
110
+ },
111
+ {
112
+ target: this.token1,
113
+ callData: this.erc20Interface.encodeFunctionData('balanceOf', [
114
+ this.poolAddress,
115
+ ]),
116
+ decodeFunction: decoders_1.uint256ToBigInt,
117
+ },
118
+ {
119
+ target: this.stateMultiContract.options.address,
120
+ callData: this.stateMultiContract.methods
121
+ .getFullStateWithRelativeBitmaps(this.factoryAddress, this.token0, this.token1, this.getBitmapRangeToRequest(), this.getBitmapRangeToRequest())
122
+ .encodeABI(),
123
+ decodeFunction: utils_2.decodeStateMultiCallResultWithRelativeBitmaps,
124
+ },
125
+ ];
126
+ const [resBalance0, resBalance1, resState] = await this.dexHelper.multiWrapper.tryAggregate(false, callData, blockNumber, this.dexHelper.multiWrapper.defaultBatchSize, false);
127
+ (0, ts_essentials_1.assert)(resState.success, 'Pool does not exist');
128
+ const [balance0, balance1, _state] = [
129
+ resBalance0.returnData,
130
+ resBalance1.returnData,
131
+ resState.returnData,
132
+ ];
133
+ return [balance0, balance1, _state];
134
+ }
135
+ async _fetchPoolStateMultiStep(blockNumber) {
136
+ const balancesAndGlobalStateCalldata = [
137
+ {
138
+ target: this.token0,
139
+ callData: this.erc20Interface.encodeFunctionData('balanceOf', [
140
+ this.poolAddress,
141
+ ]),
142
+ decodeFunction: decoders_1.uint256ToBigInt,
143
+ },
144
+ {
145
+ target: this.token1,
146
+ callData: this.erc20Interface.encodeFunctionData('balanceOf', [
147
+ this.poolAddress,
148
+ ]),
149
+ decodeFunction: decoders_1.uint256ToBigInt,
150
+ },
151
+ {
152
+ target: this.stateMultiContract.options.address,
153
+ callData: this.stateMultiContract.methods
154
+ .getFullStateWithoutTicks(this.factoryAddress, this.token0, this.token1, 0, 0)
155
+ .encodeABI(),
156
+ decodeFunction: utils_2.decodeStateMultiCallResultWithRelativeBitmaps,
157
+ },
158
+ ];
159
+ const [resBalance0, resBalance1, stateWithoutTicksAndTickBitmap] = await this.dexHelper.multiWrapper.tryAggregate(false, balancesAndGlobalStateCalldata, blockNumber, this.dexHelper.multiWrapper.defaultBatchSize, false);
160
+ (0, ts_essentials_1.assert)(stateWithoutTicksAndTickBitmap.success, 'Pool does not exist');
161
+ const [balance0, balance1, _stateWithoutTicksAndTickBitmap] = [
162
+ resBalance0.returnData,
163
+ resBalance1.returnData,
164
+ stateWithoutTicksAndTickBitmap.returnData,
165
+ ];
166
+ const { globalState: { tick }, } = _stateWithoutTicksAndTickBitmap;
167
+ const currentBitmapIndex = (0, utils_1.int16)((BigInt(tick) / Constants_1.Constants.TICK_SPACING) >> 8n);
168
+ const buffer = this.getBitmapRangeToRequest();
169
+ const startBitMapIndex = currentBitmapIndex - buffer;
170
+ const endBitMapIndex = currentBitmapIndex + buffer;
171
+ const allBitMapIndices = Array.from({ length: 2 * Number(buffer) + 1 }, () => startBitMapIndex + endBitMapIndex);
172
+ const ticksAndBitMaps = await Promise.all(allBitMapIndices.map(relativeTick => {
173
+ return this.stateMultiContract.methods
174
+ .getAdditionalBitmapWithTicks(this.factoryAddress, this.token0, this.token1, relativeTick, relativeTick)
175
+ .call();
176
+ }));
177
+ const _state = {
178
+ ..._stateWithoutTicksAndTickBitmap,
179
+ tickBitmap: ticksAndBitMaps.flatMap(v => v[0]),
180
+ ticks: ticksAndBitMaps.flatMap(v => v[1]),
181
+ };
182
+ return [balance0, balance1, _state];
183
+ }
184
+ async _fetchInitStateMultiStrategies(blockNumber) {
185
+ try {
186
+ return await this._fetchPoolStateSingleStep(blockNumber);
187
+ }
188
+ catch (e) {
189
+ if (e instanceof Error && e.message.includes('Pool does not exist'))
190
+ throw e;
191
+ if (this.dexHelper.config.data.network != constants_2.Network.ZKEVM)
192
+ throw e;
193
+ return this._fetchPoolStateMultiStep(blockNumber);
194
+ }
195
+ }
196
+ async generateState(blockNumber) {
197
+ const [balance0, balance1, _state] = await this._fetchInitStateMultiStrategies(blockNumber);
198
+ const tickBitmap = {};
199
+ const ticks = {};
200
+ (0, utils_3._reduceTickBitmap)(tickBitmap, _state.tickBitmap);
201
+ (0, utils_3._reduceTicks)(ticks, _state.ticks);
202
+ const globalState = {
203
+ communityFeeToken0: (0, utils_1.bigIntify)(_state.globalState.communityFeeToken0),
204
+ communityFeeToken1: (0, utils_1.bigIntify)(_state.globalState.communityFeeToken1),
205
+ fee: (0, utils_1.bigIntify)(_state.globalState.fee),
206
+ price: (0, utils_1.bigIntify)(_state.globalState.price),
207
+ tick: (0, utils_1.bigIntify)(_state.globalState.tick),
208
+ };
209
+ const currentTick = globalState.tick;
210
+ const startTickBitmap = TickBitMap_1.TickBitMap.position(BigInt(currentTick) / Constants_1.Constants.TICK_SPACING)[0];
211
+ return {
212
+ pool: _state.pool,
213
+ blockTimestamp: (0, utils_1.bigIntify)(_state.blockTimestamp),
214
+ globalState,
215
+ liquidity: (0, utils_1.bigIntify)(_state.liquidity),
216
+ tickSpacing: Constants_1.Constants.TICK_SPACING,
217
+ maxLiquidityPerTick: Constants_1.Constants.MAX_LIQUIDITY_PER_TICK,
218
+ tickBitmap,
219
+ ticks,
220
+ startTickBitmap,
221
+ isValid: true,
222
+ balance0,
223
+ balance1,
224
+ };
225
+ }
226
+ handleSwapEvent(event, pool, log, blockHeader) {
227
+ const newSqrtPriceX96 = (0, utils_1.bigIntify)(event.args.price);
228
+ const amount0 = (0, utils_1.bigIntify)(event.args.amount0);
229
+ const amount1 = (0, utils_1.bigIntify)(event.args.amount1);
230
+ const newTick = (0, utils_1.bigIntify)(event.args.tick);
231
+ const newLiquidity = (0, utils_1.bigIntify)(event.args.liquidity);
232
+ pool.blockTimestamp = (0, utils_1.bigIntify)(blockHeader.timestamp);
233
+ if (amount0 <= 0n && amount1 <= 0n) {
234
+ this.logger.error(`${this.parentName}: amount0 <= 0n && amount1 <= 0n for ` +
235
+ `${this.poolAddress} and ${blockHeader.number}. Check why it happened`);
236
+ pool.isValid = false;
237
+ return pool;
238
+ }
239
+ else {
240
+ const zeroForOne = amount0 > 0n;
241
+ const [, , , , , communityFee] = AlgebraMath_1.AlgebraMath._calculateSwapAndLock(pool, zeroForOne, newSqrtPriceX96, newTick, newLiquidity);
242
+ if (zeroForOne) {
243
+ if (amount1 < 0n) {
244
+ pool.balance1 -= BigInt.asUintN(256, -amount1);
245
+ }
246
+ else {
247
+ this.logger.error(`In swapEvent for pool ${pool.pool} received incorrect values ${zeroForOne} and ${amount1}`);
248
+ pool.isValid = false;
249
+ }
250
+ // This is not correct fully, because pool may get more tokens then it needs, but
251
+ // it is not accounted in internal state, it should be good enough
252
+ pool.balance0 += BigInt.asUintN(256, amount0);
253
+ }
254
+ else {
255
+ if (amount0 < 0n) {
256
+ pool.balance0 -= BigInt.asUintN(256, -amount0);
257
+ }
258
+ else {
259
+ this.logger.error(`In swapEvent for pool ${pool.pool} received incorrect values ${zeroForOne} and ${amount0}`);
260
+ pool.isValid = false;
261
+ }
262
+ pool.balance1 += BigInt.asUintN(256, amount1);
263
+ }
264
+ if (communityFee > 0n) {
265
+ // _payCommunityFee
266
+ if (zeroForOne) {
267
+ pool.balance0 -= communityFee;
268
+ }
269
+ else {
270
+ pool.balance1 -= communityFee;
271
+ }
272
+ }
273
+ return pool;
274
+ }
275
+ }
276
+ handleMintEvent(event, pool, log, blockHeader) {
277
+ const bottomTick = (0, utils_1.bigIntify)(event.args.bottomTick);
278
+ const topTick = (0, utils_1.bigIntify)(event.args.topTick);
279
+ const liquidityActual = (0, utils_1.bigIntify)(event.args.liquidityAmount);
280
+ const amount0 = (0, utils_1.bigIntify)(event.args.amount0);
281
+ const amount1 = (0, utils_1.bigIntify)(event.args.amount1);
282
+ pool.blockTimestamp = (0, utils_1.bigIntify)(blockHeader.timestamp);
283
+ AlgebraMath_1.AlgebraMath._updatePositionTicksAndFees(pool, bottomTick, topTick, liquidityActual);
284
+ pool.balance0 += amount0;
285
+ pool.balance1 += amount1;
286
+ return pool;
287
+ }
288
+ handleBurnEvent(event, pool, log, blockHeader) {
289
+ const bottomTick = (0, utils_1.bigIntify)(event.args.bottomTick);
290
+ const topTick = (0, utils_1.bigIntify)(event.args.topTick);
291
+ const amount = (0, utils_1.bigIntify)(event.args.liquidityAmount);
292
+ pool.blockTimestamp = (0, utils_1.bigIntify)(blockHeader.timestamp);
293
+ AlgebraMath_1.AlgebraMath._updatePositionTicksAndFees(pool, bottomTick, topTick, -BigInt.asIntN(128, BigInt.asIntN(256, amount)));
294
+ // no balance change
295
+ return pool;
296
+ }
297
+ handleNewFee(event, pool, log, blockHeader) {
298
+ const fee = (0, utils_1.bigIntify)(event.args.fee);
299
+ pool.globalState.fee = fee;
300
+ pool.blockTimestamp = (0, utils_1.bigIntify)(blockHeader.timestamp);
301
+ return pool;
302
+ }
303
+ handleCollectEvent(event, pool, log, blockHeader) {
304
+ const amount0 = (0, utils_1.bigIntify)(event.args.amount0);
305
+ const amount1 = (0, utils_1.bigIntify)(event.args.amount1);
306
+ pool.balance0 -= amount0;
307
+ pool.balance1 -= amount1;
308
+ pool.blockTimestamp = (0, utils_1.bigIntify)(blockHeader.timestamp);
309
+ return pool;
310
+ }
311
+ handleFlashEvent(event, pool, log, blockHeader) {
312
+ const paid0 = (0, utils_1.bigIntify)(event.args.paid0);
313
+ const paid1 = (0, utils_1.bigIntify)(event.args.paid1);
314
+ pool.balance0 += paid0;
315
+ pool.balance1 += paid1;
316
+ pool.blockTimestamp = (0, utils_1.bigIntify)(blockHeader.timestamp);
317
+ return pool;
318
+ }
319
+ handleCommunityFee(event, pool, log, blockHeader) {
320
+ const communityFeeToken0 = (0, utils_1.bigIntify)(event.ags.communityFee0New);
321
+ const communityFeeToken1 = (0, utils_1.bigIntify)(event.ags.communityFee1New);
322
+ pool.globalState.communityFeeToken0 = communityFeeToken0;
323
+ pool.globalState.communityFeeToken1 = communityFeeToken1;
324
+ pool.blockTimestamp = (0, utils_1.bigIntify)(blockHeader.timestamp);
325
+ return pool;
326
+ }
327
+ _computePoolAddress(token0, token1) {
328
+ // https://github.com/Uniswap/v3-periphery/blob/main/contracts/libraries/PoolAddress.sol
329
+ if (token0 > token1)
330
+ [token0, token1] = [token1, token0];
331
+ const encodedKey = ethers_1.ethers.utils.keccak256(ethers_1.ethers.utils.defaultAbiCoder.encode(['address', 'address'], [token0, token1]));
332
+ return ethers_1.ethers.utils.getCreate2Address(this.poolDeployer, encodedKey, this.poolInitCodeHash);
333
+ }
334
+ }
335
+ exports.AlgebraEventPool = AlgebraEventPool;
336
+ //# sourceMappingURL=algebra-pool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"algebra-pool.js","sourceRoot":"","sources":["../../../src/dex/algebra/algebra-pool.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,7 @@ import { SimpleExchange } from '../simple-exchange';
8
8
  import { Interface } from 'ethers/lib/utils';
9
9
  import { AlgebraEventPoolV1_1 } from './algebra-pool-v1_1';
10
10
  import { AlgebraEventPoolV1_9 } from './algebra-pool-v1_9';
11
+ import { OnPoolCreatedCallback } from './algebra-factory';
11
12
  declare type IAlgebraEventPool = AlgebraEventPoolV1_1 | AlgebraEventPoolV1_9;
12
13
  export declare class Algebra extends SimpleExchange implements IDex<AlgebraData> {
13
14
  protected network: Network;
@@ -16,6 +17,7 @@ export declare class Algebra extends SimpleExchange implements IDex<AlgebraData>
16
17
  readonly routerIface: Interface;
17
18
  readonly quoterIface: Interface;
18
19
  readonly config: DexParams;
20
+ private readonly factory;
19
21
  readonly isFeeOnTransferSupported: boolean;
20
22
  protected eventPools: Record<string, IAlgebraEventPool | null>;
21
23
  readonly hasConstantPriceLargeAmounts = false;
@@ -38,6 +40,7 @@ export declare class Algebra extends SimpleExchange implements IDex<AlgebraData>
38
40
  }[] | null;
39
41
  getPoolIdentifier(srcAddress: Address, destAddress: Address): string;
40
42
  initializePricing(blockNumber: number): Promise<void>;
43
+ onPoolCreatedDeleteFromNonExistingSet: OnPoolCreatedCallback;
41
44
  getPool(srcAddress: Address, destAddress: Address, blockNumber: number): Promise<IAlgebraEventPool | null>;
42
45
  addMasterPool(poolKey: string, blockNumber: number): Promise<boolean>;
43
46
  getPoolIdentifiers(srcToken: Token, destToken: Token, side: SwapSide, blockNumber: number): Promise<string[]>;
@@ -44,8 +44,9 @@ const types_1 = require("../uniswap-v3/types");
44
44
  const AlgebraMath_1 = require("./lib/AlgebraMath");
45
45
  const algebra_pool_v1_1_1 = require("./algebra-pool-v1_1");
46
46
  const algebra_pool_v1_9_1 = require("./algebra-pool-v1_9");
47
- const ALGEBRA_CLEAN_NOT_EXISTING_POOL_TTL_MS = 3 * 60 * 60 * 1000; // 3 hours
48
- const ALGEBRA_CLEAN_NOT_EXISTING_POOL_INTERVAL_MS = 30 * 60 * 1000; // Once in 30 minutes
47
+ const algebra_factory_1 = require("./algebra-factory");
48
+ const ALGEBRA_CLEAN_NOT_EXISTING_POOL_TTL_MS = 3 * 24 * 60 * 60 * 1000; // 3 days
49
+ const ALGEBRA_CLEAN_NOT_EXISTING_POOL_INTERVAL_MS = 24 * 60 * 60 * 1000; // Once in a day
49
50
  const ALGEBRA_EFFICIENCY_FACTOR = 3;
50
51
  const ALGEBRA_TICK_GAS_COST = 24000; // Ceiled
51
52
  const ALGEBRA_TICK_BASE_OVERHEAD = 75000;
@@ -68,6 +69,26 @@ class Algebra extends simple_exchange_1.SimpleExchange {
68
69
  this.eventPools = {};
69
70
  this.hasConstantPriceLargeAmounts = false;
70
71
  this.needWrapNative = true;
72
+ /*
73
+ * When a non existing pool is queried, it's blacklisted for an arbitrary long period in order to prevent issuing too many rpc calls
74
+ * Once the pool is created, it gets immediately flagged
75
+ */
76
+ this.onPoolCreatedDeleteFromNonExistingSet = async ({ token0, token1, }) => {
77
+ const logPrefix = '[Algebra.onPoolCreatedDeleteFromNonExistingSet]';
78
+ const [_token0, _token1] = this._sortTokens(token0, token1);
79
+ const poolKey = `${token0}_${token1}`.toLowerCase();
80
+ // consider doing it only from master pool for less calls to distant cache
81
+ // delete entry locally to let local instance discover the pool
82
+ delete this.eventPools[this.getPoolIdentifier(_token0, _token1)];
83
+ try {
84
+ this.logger.info(`${logPrefix} delete pool from not existing set: ${poolKey}`);
85
+ // delete pool record from set
86
+ await this.dexHelper.cache.zrem(this.notExistingPoolSetKey, [poolKey]);
87
+ }
88
+ catch (error) {
89
+ this.logger.error(`${logPrefix} failed to delete pool from set: ${poolKey}`, error);
90
+ }
91
+ };
71
92
  this.logger = dexHelper.getLogger(dexKey + '-' + network);
72
93
  this.uniswapMulti = new this.dexHelper.web3Provider.eth.Contract(UniswapMulti_abi_json_1.default, this.config.uniswapMulticall);
73
94
  this.stateMultiContract = new this.dexHelper.web3Provider.eth.Contract(AlgebraStateMulticall_abi_json_1.default, this.config.algebraStateMulticall);
@@ -79,6 +100,7 @@ class Algebra extends simple_exchange_1.SimpleExchange {
79
100
  `${constants_1.CACHE_PREFIX}_${network}_${dexKey}_not_existings_pool_set`.toLowerCase();
80
101
  this.AlgebraPoolImplem =
81
102
  config.version === 'v1.1' ? algebra_pool_v1_1_1.AlgebraEventPoolV1_1 : algebra_pool_v1_9_1.AlgebraEventPoolV1_9;
103
+ this.factory = new algebra_factory_1.AlgebraFactory(dexHelper, dexKey, this.config.factory, this.logger, this.onPoolCreatedDeleteFromNonExistingSet);
82
104
  }
83
105
  getAdapters(side) {
84
106
  return this.adapters[side] ? this.adapters[side] : null;
@@ -88,11 +110,11 @@ class Algebra extends simple_exchange_1.SimpleExchange {
88
110
  return `${this.dexKey}_${tokenAddresses}`;
89
111
  }
90
112
  async initializePricing(blockNumber) {
91
- const cleanNonExistingPoolTTLMs = this.config.cleanExistingPoolTTLMs ||
92
- ALGEBRA_CLEAN_NOT_EXISTING_POOL_TTL_MS;
113
+ // Init listening to new pools creation
114
+ await this.factory.initialize(blockNumber);
93
115
  if (!this.dexHelper.config.isSlave) {
94
116
  const cleanExpiredNotExistingPoolsKeys = async () => {
95
- const maxTimestamp = Date.now() - cleanNonExistingPoolTTLMs;
117
+ const maxTimestamp = Date.now() - ALGEBRA_CLEAN_NOT_EXISTING_POOL_TTL_MS;
96
118
  await this.dexHelper.cache.zremrangebyscore(this.notExistingPoolSetKey, 0, maxTimestamp);
97
119
  };
98
120
  this.intervalTask = setInterval(cleanExpiredNotExistingPoolsKeys.bind(this), ALGEBRA_CLEAN_NOT_EXISTING_POOL_INTERVAL_MS);