@paraswap/dex-lib 3.8.24 → 3.8.25

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 (219) hide show
  1. package/.vscode/launch.json +16 -0
  2. package/.vscode/settings.json +3 -0
  3. package/build/abi/Uncompressor.json +250 -0
  4. package/build/abi/integral/factory.json +333 -0
  5. package/build/abi/integral/oracle.json +501 -0
  6. package/build/abi/{inception/inception-ineth-pool.json → integral/pool.json} +522 -543
  7. package/build/abi/integral/relayer.json +1536 -0
  8. package/build/dex/aave-v1/aave-v1.d.ts +1 -2
  9. package/build/dex/aave-v1/aave-v1.js +0 -22
  10. package/build/dex/aave-v1/aave-v1.js.map +1 -1
  11. package/build/dex/bProtocol.d.ts +18 -0
  12. package/build/dex/bProtocol.js +39 -0
  13. package/build/dex/bProtocol.js.map +1 -0
  14. package/build/dex/bancor.d.ts +26 -0
  15. package/build/dex/bancor.js +58 -0
  16. package/build/dex/bancor.js.map +1 -0
  17. package/build/dex/compound.d.ts +18 -0
  18. package/build/dex/compound.js +46 -0
  19. package/build/dex/compound.js.map +1 -0
  20. package/build/dex/curve-v2.d.ts +58 -0
  21. package/build/dex/curve-v2.js +180 -0
  22. package/build/dex/curve-v2.js.map +1 -0
  23. package/build/dex/dodo-v1.d.ts +33 -0
  24. package/build/dex/dodo-v1.js +63 -0
  25. package/build/dex/dodo-v1.js.map +1 -0
  26. package/build/dex/etherfi/etherfi.d.ts +26 -0
  27. package/build/dex/etherfi/etherfi.js +96 -0
  28. package/build/dex/etherfi/etherfi.js.map +1 -0
  29. package/build/dex/index.js +2 -0
  30. package/build/dex/index.js.map +1 -1
  31. package/build/dex/integral/config.d.ts +4 -0
  32. package/build/dex/integral/config.js +20 -0
  33. package/build/dex/integral/config.js.map +1 -0
  34. package/build/dex/integral/context.d.ts +40 -0
  35. package/build/dex/integral/context.js +158 -0
  36. package/build/dex/integral/context.js.map +1 -0
  37. package/build/dex/integral/helpers.d.ts +17 -0
  38. package/build/dex/integral/helpers.js +157 -0
  39. package/build/dex/integral/helpers.js.map +1 -0
  40. package/build/dex/integral/integral-factory.d.ts +24 -0
  41. package/build/dex/integral/integral-factory.js +95 -0
  42. package/build/dex/integral/integral-factory.js.map +1 -0
  43. package/build/dex/integral/integral-pool.d.ts +50 -0
  44. package/build/dex/integral/integral-pool.js +149 -0
  45. package/build/dex/integral/integral-pool.js.map +1 -0
  46. package/build/dex/integral/integral-pricing.d.ts +18 -0
  47. package/build/dex/integral/integral-pricing.js +114 -0
  48. package/build/dex/integral/integral-pricing.js.map +1 -0
  49. package/build/dex/integral/integral-relayer.d.ts +42 -0
  50. package/build/dex/integral/integral-relayer.js +192 -0
  51. package/build/dex/integral/integral-relayer.js.map +1 -0
  52. package/build/dex/integral/integral-token.d.ts +27 -0
  53. package/build/dex/integral/integral-token.js +59 -0
  54. package/build/dex/integral/integral-token.js.map +1 -0
  55. package/build/dex/{inception/inception-native.d.ts → integral/integral.d.ts} +19 -21
  56. package/build/dex/integral/integral.js +376 -0
  57. package/build/dex/integral/integral.js.map +1 -0
  58. package/build/dex/integral/types.d.ts +85 -0
  59. package/build/dex/integral/types.js +9 -0
  60. package/build/dex/integral/types.js.map +1 -0
  61. package/build/dex/integral/utils-e2e.d.ts +9 -0
  62. package/build/dex/integral/utils-e2e.js +131 -0
  63. package/build/dex/integral/utils-e2e.js.map +1 -0
  64. package/build/dex/integral/utils.d.ts +17 -0
  65. package/build/dex/integral/utils.js +94 -0
  66. package/build/dex/integral/utils.js.map +1 -0
  67. package/build/dex/lido.d.ts +19 -0
  68. package/build/dex/lido.js +42 -0
  69. package/build/dex/lido.js.map +1 -0
  70. package/build/dex/onebit.d.ts +25 -0
  71. package/build/dex/onebit.js +42 -0
  72. package/build/dex/onebit.js.map +1 -0
  73. package/build/dex/oswap/oswap-pool.js +8 -8
  74. package/build/dex/oswap/oswap-pool.js.map +1 -1
  75. package/build/dex/oswap/oswap.d.ts +3 -3
  76. package/build/dex/oswap/oswap.js +21 -12
  77. package/build/dex/oswap/oswap.js.map +1 -1
  78. package/build/dex/oswap/types.d.ts +4 -4
  79. package/build/dex/platypus/platypus.d.ts +1 -2
  80. package/build/dex/platypus/platypus.js +0 -31
  81. package/build/dex/platypus/platypus.js.map +1 -1
  82. package/build/dex/sdai/config.d.ts +11 -0
  83. package/build/dex/sdai/config.js +21 -0
  84. package/build/dex/sdai/config.js.map +1 -0
  85. package/build/dex/sdai/constants.d.ts +2 -0
  86. package/build/dex/sdai/constants.js +6 -0
  87. package/build/dex/sdai/constants.js.map +1 -0
  88. package/build/dex/sdai/scripts/validate-state.d.ts +1 -0
  89. package/build/dex/sdai/scripts/validate-state.js +102 -0
  90. package/build/dex/sdai/scripts/validate-state.js.map +1 -0
  91. package/build/dex/sdai/sdai-pool.d.ts +16 -0
  92. package/build/dex/sdai/sdai-pool.js +85 -0
  93. package/build/dex/sdai/sdai-pool.js.map +1 -0
  94. package/build/dex/sdai/sdai.d.ts +51 -0
  95. package/build/dex/sdai/sdai.js +172 -0
  96. package/build/dex/sdai/sdai.js.map +1 -0
  97. package/build/dex/sdai/types.d.ts +21 -0
  98. package/build/dex/sdai/types.js +11 -0
  99. package/build/dex/sdai/types.js.map +1 -0
  100. package/build/dex/sdai/utils.d.ts +4 -0
  101. package/build/dex/sdai/utils.js +39 -0
  102. package/build/dex/sdai/utils.js.map +1 -0
  103. package/build/dex/smoothy.d.ts +26 -0
  104. package/build/dex/smoothy.js +48 -0
  105. package/build/dex/smoothy.js.map +1 -0
  106. package/build/dex/stable-pool.d.ts +28 -0
  107. package/build/dex/stable-pool.js +62 -0
  108. package/build/dex/stable-pool.js.map +1 -0
  109. package/build/dex/swaap-v1/swaap-v1.d.ts +1 -2
  110. package/build/dex/swaap-v1/swaap-v1.js +0 -10
  111. package/build/dex/swaap-v1/swaap-v1.js.map +1 -1
  112. package/build/dex/trader-joe-v2.1/optimizer.d.ts +2 -0
  113. package/build/dex/trader-joe-v2.1/optimizer.js +44 -0
  114. package/build/dex/trader-joe-v2.1/optimizer.js.map +1 -0
  115. package/build/dex/trader-joe-v2.1.d.ts +43 -0
  116. package/build/dex/trader-joe-v2.1.js +79 -0
  117. package/build/dex/trader-joe-v2.1.js.map +1 -0
  118. package/build/executor/compressor/Compressor.d.ts +23 -0
  119. package/build/executor/compressor/Compressor.js +144 -0
  120. package/build/executor/compressor/Compressor.js.map +1 -0
  121. package/build/executor/compressor/compress.d.ts +17 -0
  122. package/build/executor/compressor/compress.js +187 -0
  123. package/build/executor/compressor/compress.js.map +1 -0
  124. package/build/executor/compressor/compress_functions/addressSubstitution.d.ts +6 -0
  125. package/build/executor/compressor/compress_functions/addressSubstitution.js +29 -0
  126. package/build/executor/compressor/compress_functions/addressSubstitution.js.map +1 -0
  127. package/build/executor/compressor/compress_functions/addressSubstitutionFromObject.d.ts +10 -0
  128. package/build/executor/compressor/compress_functions/addressSubstitutionFromObject.js +40 -0
  129. package/build/executor/compressor/compress_functions/addressSubstitutionFromObject.js.map +1 -0
  130. package/build/executor/compressor/compress_functions/byteSubstitution.d.ts +11 -0
  131. package/build/executor/compressor/compress_functions/byteSubstitution.js +64 -0
  132. package/build/executor/compressor/compress_functions/byteSubstitution.js.map +1 -0
  133. package/build/executor/compressor/compress_functions/ffSubstitution.d.ts +7 -0
  134. package/build/executor/compressor/compress_functions/ffSubstitution.js +54 -0
  135. package/build/executor/compressor/compress_functions/ffSubstitution.js.map +1 -0
  136. package/build/executor/compressor/compress_functions/findLongestAndSubstitute.d.ts +8 -0
  137. package/build/executor/compressor/compress_functions/findLongestAndSubstitute.js +67 -0
  138. package/build/executor/compressor/compress_functions/findLongestAndSubstitute.js.map +1 -0
  139. package/build/executor/compressor/compress_functions/findLongestAndSubstitute_old.d.ts +8 -0
  140. package/build/executor/compressor/compress_functions/findLongestAndSubstitute_old.js +61 -0
  141. package/build/executor/compressor/compress_functions/findLongestAndSubstitute_old.js.map +1 -0
  142. package/build/executor/compressor/compress_functions/reverseAddressSubstitution.d.ts +6 -0
  143. package/build/executor/compressor/compress_functions/reverseAddressSubstitution.js +37 -0
  144. package/build/executor/compressor/compress_functions/reverseAddressSubstitution.js.map +1 -0
  145. package/build/executor/compressor/compress_functions/searchUnusedBytes.d.ts +9 -0
  146. package/build/executor/compressor/compress_functions/searchUnusedBytes.js +33 -0
  147. package/build/executor/compressor/compress_functions/searchUnusedBytes.js.map +1 -0
  148. package/build/executor/compressor/fetchSaved.d.ts +0 -0
  149. package/build/executor/compressor/fetchSaved.js +17 -0
  150. package/build/executor/compressor/fetchSaved.js.map +1 -0
  151. package/build/executor/compressor/utils/computeCostL2.d.ts +2 -0
  152. package/build/executor/compressor/utils/computeCostL2.js +14 -0
  153. package/build/executor/compressor/utils/computeCostL2.js.map +1 -0
  154. package/build/executor/compressor/utils/findLongestDuplicatedString.d.ts +2 -0
  155. package/build/executor/compressor/utils/findLongestDuplicatedString.js +30 -0
  156. package/build/executor/compressor/utils/findLongestDuplicatedString.js.map +1 -0
  157. package/build/executor/compressor/utils/getAllIndexes.d.ts +2 -0
  158. package/build/executor/compressor/utils/getAllIndexes.js +12 -0
  159. package/build/executor/compressor/utils/getAllIndexes.js.map +1 -0
  160. package/build/executor/compressor/utils/getByteForAddress.d.ts +2 -0
  161. package/build/executor/compressor/utils/getByteForAddress.js +14 -0
  162. package/build/executor/compressor/utils/getByteForAddress.js.map +1 -0
  163. package/build/executor/compressor/utils/intTo2Bytes.d.ts +2 -0
  164. package/build/executor/compressor/utils/intTo2Bytes.js +14 -0
  165. package/build/executor/compressor/utils/intTo2Bytes.js.map +1 -0
  166. package/build/executor/compressor/utils/intTo3Bytes.d.ts +2 -0
  167. package/build/executor/compressor/utils/intTo3Bytes.js +18 -0
  168. package/build/executor/compressor/utils/intTo3Bytes.js.map +1 -0
  169. package/build/executor/compressor/utils/intToByte.d.ts +2 -0
  170. package/build/executor/compressor/utils/intToByte.js +10 -0
  171. package/build/executor/compressor/utils/intToByte.js.map +1 -0
  172. package/package.json +1 -1
  173. package/src/abi/oswap/oswap.abi.json +452 -0
  174. package/src/dex/index.ts +2 -0
  175. package/src/dex/oswap/config.ts +32 -0
  176. package/src/dex/oswap/oswap-e2e.test.ts +91 -0
  177. package/src/dex/oswap/oswap-events.test.ts +88 -0
  178. package/src/dex/oswap/oswap-integration.test.ts +291 -0
  179. package/src/dex/oswap/oswap-pool.ts +190 -0
  180. package/src/dex/oswap/oswap.ts +414 -0
  181. package/src/dex/oswap/types.ts +29 -0
  182. package/build/abi/inception/inception-ineth.json +0 -609
  183. package/build/abi/inception/inception-ratio-feed.json +0 -93
  184. package/build/abi/inception/inception-vault.json +0 -991
  185. package/build/dex/idle-dao/idle-dao-pool.d.ts +0 -56
  186. package/build/dex/idle-dao/idle-dao-pool.js +0 -176
  187. package/build/dex/idle-dao/idle-dao-pool.js.map +0 -1
  188. package/build/dex/idle-dao/idle-dao-pooling-pool.d.ts +0 -16
  189. package/build/dex/idle-dao/idle-dao-pooling-pool.js +0 -57
  190. package/build/dex/idle-dao/idle-dao-pooling-pool.js.map +0 -1
  191. package/build/dex/idle-dao/scripts.d.ts +0 -9
  192. package/build/dex/idle-dao/scripts.js +0 -552
  193. package/build/dex/idle-dao/scripts.js.map +0 -1
  194. package/build/dex/inception/config.d.ts +0 -5
  195. package/build/dex/inception/config.js +0 -112
  196. package/build/dex/inception/config.js.map +0 -1
  197. package/build/dex/inception/inception-event-pool.d.ts +0 -23
  198. package/build/dex/inception/inception-event-pool.js +0 -34
  199. package/build/dex/inception/inception-event-pool.js.map +0 -1
  200. package/build/dex/inception/inception-native.js +0 -131
  201. package/build/dex/inception/inception-native.js.map +0 -1
  202. package/build/dex/inception/inception-pool.d.ts +0 -18
  203. package/build/dex/inception/inception-pool.js +0 -32
  204. package/build/dex/inception/inception-pool.js.map +0 -1
  205. package/build/dex/inception/inception-price-feed.d.ts +0 -19
  206. package/build/dex/inception/inception-price-feed.js +0 -51
  207. package/build/dex/inception/inception-price-feed.js.map +0 -1
  208. package/build/dex/inception/inception.d.ts +0 -44
  209. package/build/dex/inception/inception.js +0 -162
  210. package/build/dex/inception/inception.js.map +0 -1
  211. package/build/dex/inception/tokens.d.ts +0 -9
  212. package/build/dex/inception/tokens.js +0 -28
  213. package/build/dex/inception/tokens.js.map +0 -1
  214. package/build/dex/inception/types.d.ts +0 -22
  215. package/build/dex/inception/types.js +0 -3
  216. package/build/dex/inception/types.js.map +0 -1
  217. package/build/dex/inception/utils.d.ts +0 -7
  218. package/build/dex/inception/utils.js +0 -58
  219. package/build/dex/inception/utils.js.map +0 -1
@@ -0,0 +1,24 @@
1
+ import { Interface } from '@ethersproject/abi';
2
+ import { LogDescription } from 'ethers/lib/utils';
3
+ import { IDexHelper } from '../../dex-helper';
4
+ import { StatefulEventSubscriber } from '../../stateful-event-subscriber';
5
+ import { Address, BlockHeader, Log, Logger } from '../../types';
6
+ import { FactoryState } from './types';
7
+ export declare type OnPoolCreatedCallback = (token0: Address, token1: Address, poolAddress: Address, blockNumber: number) => Promise<void>;
8
+ export declare class IntegralFactory extends StatefulEventSubscriber<FactoryState> {
9
+ readonly dexHelper: IDexHelper;
10
+ protected readonly factoryAddress: Address;
11
+ protected readonly onPoolCreated: OnPoolCreatedCallback;
12
+ handlers: {
13
+ [event: string]: (event: any, state: FactoryState, blockHeader: Readonly<BlockHeader>) => Promise<FactoryState>;
14
+ };
15
+ logDecoder: (log: Log) => any;
16
+ readonly factoryIface: Interface;
17
+ constructor(dexHelper: IDexHelper, parentName: string, factoryAddress: Address, onPoolCreated: OnPoolCreatedCallback, logger: Logger, mapKey?: string);
18
+ protected getPoolIdentifierData(): {
19
+ factory: string;
20
+ };
21
+ generateState(blockNumber?: number | 'latest'): Promise<FactoryState>;
22
+ protected processLog(state: FactoryState, log: Readonly<Log>, blockHeader: Readonly<BlockHeader>): Promise<FactoryState>;
23
+ handlePairCreated(event: LogDescription, state: FactoryState, blockHeader: Readonly<BlockHeader>): Promise<FactoryState>;
24
+ }
@@ -0,0 +1,95 @@
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.IntegralFactory = void 0;
7
+ const abi_1 = require("@ethersproject/abi");
8
+ const stateful_event_subscriber_1 = require("../../stateful-event-subscriber");
9
+ const factory_json_1 = __importDefault(require("../../abi/integral/factory.json"));
10
+ const pool_json_1 = __importDefault(require("../../abi/integral/pool.json"));
11
+ const decoders_1 = require("../../lib/decoders");
12
+ class IntegralFactory extends stateful_event_subscriber_1.StatefulEventSubscriber {
13
+ constructor(dexHelper, parentName, factoryAddress, onPoolCreated, logger, mapKey = '') {
14
+ super(parentName, `${parentName} Factory`, dexHelper, logger, true, mapKey);
15
+ this.dexHelper = dexHelper;
16
+ this.factoryAddress = factoryAddress;
17
+ this.onPoolCreated = onPoolCreated;
18
+ this.handlers = {};
19
+ this.factoryIface = new abi_1.Interface(factory_json_1.default);
20
+ this.addressesSubscribed = [factoryAddress];
21
+ this.logDecoder = (log) => this.factoryIface.parseLog(log);
22
+ this.handlers['PairCreated'] = this.handlePairCreated.bind(this);
23
+ }
24
+ getPoolIdentifierData() {
25
+ return { factory: this.factoryAddress };
26
+ }
27
+ async generateState(blockNumber) {
28
+ const factory = new this.dexHelper.web3Provider.eth.Contract(factory_json_1.default, this.factoryAddress);
29
+ const poolCountResult = await factory.methods
30
+ .allPairsLength()
31
+ .call(undefined, blockNumber);
32
+ const poolCount = Number(poolCountResult);
33
+ const poolAddressCallDatas = [
34
+ ...Array(poolCount),
35
+ ].map((_, i) => {
36
+ return {
37
+ target: this.factoryAddress,
38
+ callData: factory.methods.allPairs(i).encodeABI(),
39
+ decodeFunction: decoders_1.addressDecode,
40
+ };
41
+ });
42
+ const poolAddresses = await this.dexHelper.multiWrapper.tryAggregate(false, poolAddressCallDatas, blockNumber, this.dexHelper.multiWrapper.defaultBatchSize, false);
43
+ const poolIface = new abi_1.Interface(pool_json_1.default);
44
+ const poolInfosCallDatas = poolAddresses
45
+ .map(poolAddress => {
46
+ return [
47
+ {
48
+ target: poolAddress.returnData,
49
+ callData: poolIface.encodeFunctionData('token0', []),
50
+ decodeFunction: decoders_1.addressDecode,
51
+ },
52
+ {
53
+ target: poolAddress.returnData,
54
+ callData: poolIface.encodeFunctionData('token1', []),
55
+ decodeFunction: decoders_1.addressDecode,
56
+ },
57
+ ];
58
+ })
59
+ .flat();
60
+ const poolInfos = await this.dexHelper.multiWrapper.aggregate(poolInfosCallDatas, blockNumber);
61
+ const state = { pools: {} };
62
+ poolAddresses.forEach((poolAddress, i) => {
63
+ const tokens = [
64
+ poolInfos[i * 2].toLowerCase(),
65
+ poolInfos[i * 2 + 1].toLowerCase(),
66
+ ];
67
+ state.pools[poolAddress.returnData.toLowerCase()] = {
68
+ token0: tokens[0],
69
+ token1: tokens[1],
70
+ };
71
+ });
72
+ return state;
73
+ }
74
+ async processLog(state, log, blockHeader) {
75
+ const event = this.logDecoder(log);
76
+ if (event.name in this.handlers) {
77
+ return await this.handlers[event.name](event, state, blockHeader);
78
+ }
79
+ return state;
80
+ }
81
+ async handlePairCreated(event, state, blockHeader) {
82
+ const tokens = [
83
+ event.args.token0.toLowerCase(),
84
+ event.args.token1.toLowerCase(),
85
+ ];
86
+ state.pools[event.args.pair.toLowerCase()] = {
87
+ token0: tokens[0],
88
+ token1: tokens[1],
89
+ };
90
+ await this.onPoolCreated(tokens[0], tokens[1], event.args.pair.toLowerCase(), blockHeader.number);
91
+ return state;
92
+ }
93
+ }
94
+ exports.IntegralFactory = IntegralFactory;
95
+ //# sourceMappingURL=integral-factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integral-factory.js","sourceRoot":"","sources":["../../../src/dex/integral/integral-factory.ts"],"names":[],"mappings":";;;;;;AAAA,4CAA+C;AAG/C,+EAA0E;AAG1E,mFAAiE;AACjE,6EAA2D;AAC3D,iDAAmD;AAUnD,MAAa,eAAgB,SAAQ,mDAAqC;IAaxE,YACW,SAAqB,EAC9B,UAAkB,EACC,cAAuB,EACvB,aAAoC,EACvD,MAAc,EACd,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;QACvB,kBAAa,GAAb,aAAa,CAAuB;QAhBzD,aAAQ,GAMJ,EAAE,CAAC;QAIS,iBAAY,GAAG,IAAI,eAAS,CAAC,sBAAkB,CAAC,CAAC;QAY/D,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,aAAa,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnE,CAAC;IAES,qBAAqB;QAC7B,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,WAA+B;QACjD,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAC1D,sBAAyB,EACzB,IAAI,CAAC,cAAc,CACpB,CAAC;QACF,MAAM,eAAe,GAAG,MAAM,OAAO,CAAC,OAAO;aAC1C,cAAc,EAAE;aAChB,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAChC,MAAM,SAAS,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC;QAC1C,MAAM,oBAAoB,GAA8B;YACtD,GAAG,KAAK,CAAC,SAAS,CAAC;SACpB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACb,OAAO;gBACL,MAAM,EAAE,IAAI,CAAC,cAAc;gBAC3B,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE;gBACjD,cAAc,EAAE,wBAAa;aAC9B,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,MAAM,aAAa,GACjB,MAAM,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,YAAY,CAC5C,KAAK,EACL,oBAAoB,EACpB,WAAW,EACX,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,gBAAgB,EAC5C,KAAK,CACN,CAAC;QAEJ,MAAM,SAAS,GAAG,IAAI,eAAS,CAAC,mBAAe,CAAC,CAAC;QACjD,MAAM,kBAAkB,GAA8B,aAAa;aAChE,GAAG,CAAC,WAAW,CAAC,EAAE;YACjB,OAAO;gBACL;oBACE,MAAM,EAAE,WAAW,CAAC,UAAU;oBAC9B,QAAQ,EAAE,SAAS,CAAC,kBAAkB,CAAC,QAAQ,EAAE,EAAE,CAAC;oBACpD,cAAc,EAAE,wBAAa;iBAC9B;gBACD;oBACE,MAAM,EAAE,WAAW,CAAC,UAAU;oBAC9B,QAAQ,EAAE,SAAS,CAAC,kBAAkB,CAAC,QAAQ,EAAE,EAAE,CAAC;oBACpD,cAAc,EAAE,wBAAa;iBAC9B;aACF,CAAC;QACJ,CAAC,CAAC;aACD,IAAI,EAAE,CAAC;QACV,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,SAAS,CAC3D,kBAAkB,EAClB,WAAW,CACZ,CAAC;QAEF,MAAM,KAAK,GAAiB,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;QAC1C,aAAa,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC,EAAE,EAAE;YACvC,MAAM,MAAM,GAAuB;gBACjC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE;gBAC9B,SAAS,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE;aACnC,CAAC;YACF,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,GAAG;gBAClD,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;gBACjB,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;aAClB,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,OAAO,KAAK,CAAC;IACf,CAAC;IAES,KAAK,CAAC,UAAU,CACxB,KAAmB,EACnB,GAAkB,EAClB,WAAkC;QAElC,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE;YAC/B,OAAO,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;SACnE;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,iBAAiB,CACrB,KAAqB,EACrB,KAAmB,EACnB,WAAkC;QAElC,MAAM,MAAM,GAAuB;YACjC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE;YAC/B,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE;SAChC,CAAC;QACF,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG;YAC3C,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;YACjB,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;SAClB,CAAC;QACF,MAAM,IAAI,CAAC,aAAa,CACtB,MAAM,CAAC,CAAC,CAAC,EACT,MAAM,CAAC,CAAC,CAAC,EACT,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAC7B,WAAW,CAAC,MAAM,CACnB,CAAC;QACF,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AAnID,0CAmIC"}
@@ -0,0 +1,50 @@
1
+ import { Interface } from '@ethersproject/abi';
2
+ import { LogDescription } from 'ethers/lib/utils';
3
+ import { AsyncOrSync } from 'ts-essentials';
4
+ import { BlockHeader, Log, Logger } from '../../types';
5
+ import { StatefulEventSubscriber } from '../../stateful-event-subscriber';
6
+ import { IDexHelper } from '../../dex-helper/idex-helper';
7
+ import { PoolState } from './types';
8
+ import { Address } from '../../types';
9
+ export declare class IntegralEventPool extends StatefulEventSubscriber<PoolState> {
10
+ parentName: string;
11
+ protected network: number;
12
+ protected dexHelper: IDexHelper;
13
+ protected poolIface: Interface;
14
+ handlers: {
15
+ [event: string]: (event: any, pool: PoolState, blockHeader: Readonly<BlockHeader>) => AsyncOrSync<PoolState>;
16
+ };
17
+ logDecoder: (log: Log) => any;
18
+ addressesSubscribed: string[];
19
+ readonly poolAddress: Address;
20
+ readonly token0: Address;
21
+ readonly token1: Address;
22
+ constructor(parentName: string, network: number, dexHelper: IDexHelper, poolAddress: Address, token0: Address, token1: Address, logger: Logger, poolIface?: Interface);
23
+ protected getPoolIdentifierData(): {
24
+ token0: string;
25
+ token1: string;
26
+ };
27
+ /**
28
+ * The function is called every time any of the subscribed
29
+ * addresses release log. The function accepts the current
30
+ * state, updates the state according to the log, and returns
31
+ * the updated state.
32
+ * @param state - Current state of event subscriber
33
+ * @param log - Log released by one of the subscribed addresses
34
+ * @returns Updates state of the event subscriber after the log
35
+ */
36
+ protected processLog(state: PoolState, log: Readonly<Log>, blockHeader: Readonly<BlockHeader>): Promise<PoolState | null>;
37
+ /**
38
+ * The function generates state using on-chain calls. This
39
+ * function is called to regenerate state if the event based
40
+ * system fails to fetch events and the local state is no
41
+ * more correct.
42
+ * @param blockNumber - Blocknumber for which the state should
43
+ * should be generated
44
+ * @returns state of the event subscriber at blocknumber
45
+ */
46
+ generateState(blockNumber: number): Promise<Readonly<PoolState>>;
47
+ handleSetSwapFee(event: LogDescription, pool: PoolState): PoolState;
48
+ handleSetMintFee(event: LogDescription, pool: PoolState): PoolState;
49
+ handleSetBurnFee(event: LogDescription, pool: PoolState): PoolState;
50
+ }
@@ -0,0 +1,149 @@
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.IntegralEventPool = void 0;
7
+ const abi_1 = require("@ethersproject/abi");
8
+ const stateful_event_subscriber_1 = require("../../stateful-event-subscriber");
9
+ const pool_json_1 = __importDefault(require("../../abi/integral/pool.json"));
10
+ const oracle_json_1 = __importDefault(require("../../abi/integral/oracle.json"));
11
+ const UniswapV3Pool_abi_json_1 = __importDefault(require("../../abi/uniswap-v3/UniswapV3Pool.abi.json"));
12
+ const decoders_1 = require("../../lib/decoders");
13
+ const ethers_1 = require("ethers");
14
+ class IntegralEventPool extends stateful_event_subscriber_1.StatefulEventSubscriber {
15
+ constructor(parentName, network, dexHelper, poolAddress, token0, token1, logger, poolIface = new abi_1.Interface(pool_json_1.default)) {
16
+ super(parentName, `${token0}_${token1}`, dexHelper, logger);
17
+ this.parentName = parentName;
18
+ this.network = network;
19
+ this.dexHelper = dexHelper;
20
+ this.poolIface = poolIface;
21
+ this.handlers = {};
22
+ this.token0 = token0.toLowerCase();
23
+ this.token1 = token1.toLowerCase();
24
+ this.poolAddress = poolAddress.toLowerCase();
25
+ this.logDecoder = (log) => this.poolIface.parseLog(log);
26
+ this.addressesSubscribed = [this.poolAddress];
27
+ this.handlers['SetSwapFee'] = this.handleSetSwapFee.bind(this);
28
+ this.handlers['SetMintFee'] = this.handleSetMintFee.bind(this);
29
+ this.handlers['SetBurnFee'] = this.handleSetBurnFee.bind(this);
30
+ }
31
+ getPoolIdentifierData() {
32
+ return {
33
+ token0: this.token0,
34
+ token1: this.token1,
35
+ };
36
+ }
37
+ /**
38
+ * The function is called every time any of the subscribed
39
+ * addresses release log. The function accepts the current
40
+ * state, updates the state according to the log, and returns
41
+ * the updated state.
42
+ * @param state - Current state of event subscriber
43
+ * @param log - Log released by one of the subscribed addresses
44
+ * @returns Updates state of the event subscriber after the log
45
+ */
46
+ async processLog(state, log, blockHeader) {
47
+ try {
48
+ const event = this.logDecoder(log);
49
+ if (event.name in this.handlers) {
50
+ return await this.handlers[event.name](event, state, blockHeader);
51
+ }
52
+ return state;
53
+ }
54
+ catch (e) {
55
+ this.logger.error(`Error_${this.parentName}_processLog could not parse the log with topic ${log.topics}:`, e);
56
+ return null;
57
+ }
58
+ }
59
+ /**
60
+ * The function generates state using on-chain calls. This
61
+ * function is called to regenerate state if the event based
62
+ * system fails to fetch events and the local state is no
63
+ * more correct.
64
+ * @param blockNumber - Blocknumber for which the state should
65
+ * should be generated
66
+ * @returns state of the event subscriber at blocknumber
67
+ */
68
+ async generateState(blockNumber) {
69
+ const state = {};
70
+ const pool = new this.dexHelper.web3Provider.eth.Contract(pool_json_1.default, this.poolAddress);
71
+ const poolInfoCallDatas = [
72
+ {
73
+ target: this.poolAddress,
74
+ callData: pool.methods.oracle().encodeABI(),
75
+ decodeFunction: decoders_1.addressDecode,
76
+ },
77
+ {
78
+ target: this.poolAddress,
79
+ callData: pool.methods.mintFee().encodeABI(),
80
+ decodeFunction: decoders_1.uint256ToBigInt,
81
+ },
82
+ {
83
+ target: this.poolAddress,
84
+ callData: pool.methods.burnFee().encodeABI(),
85
+ decodeFunction: decoders_1.uint256ToBigInt,
86
+ },
87
+ {
88
+ target: this.poolAddress,
89
+ callData: pool.methods.swapFee().encodeABI(),
90
+ decodeFunction: decoders_1.uint256ToBigInt,
91
+ },
92
+ ];
93
+ const poolInfos = await this.dexHelper.multiWrapper.aggregate(poolInfoCallDatas, blockNumber);
94
+ const oracleAddress = poolInfos[0].toString();
95
+ state.mintFee = BigInt(poolInfos[1]);
96
+ state.burnFee = BigInt(poolInfos[2]);
97
+ state.swapFee = BigInt(poolInfos[3]);
98
+ state.oracle = oracleAddress;
99
+ const historyState = this.getStaleState();
100
+ if (!historyState) {
101
+ const oracle = new this.dexHelper.web3Provider.eth.Contract(oracle_json_1.default, oracleAddress);
102
+ const oracleInfosCallDatas = [
103
+ {
104
+ target: oracleAddress,
105
+ callData: oracle.methods.xDecimals().encodeABI(),
106
+ decodeFunction: decoders_1.uint8ToNumber,
107
+ },
108
+ {
109
+ target: oracleAddress,
110
+ callData: oracle.methods.yDecimals().encodeABI(),
111
+ decodeFunction: decoders_1.uint8ToNumber,
112
+ },
113
+ {
114
+ target: oracleAddress,
115
+ callData: oracle.methods.uniswapPair().encodeABI(),
116
+ decodeFunction: decoders_1.addressDecode,
117
+ },
118
+ ];
119
+ const oracleInfos = await this.dexHelper.multiWrapper.aggregate(oracleInfosCallDatas, blockNumber);
120
+ state.uniswapPool = oracleInfos[2].toString();
121
+ state.decimals0 = Number(oracleInfos[0]);
122
+ state.decimals1 = Number(oracleInfos[1]);
123
+ const uniswapPool = new this.dexHelper.web3Provider.eth.Contract(UniswapV3Pool_abi_json_1.default, state.uniswapPool);
124
+ const fee = await uniswapPool.methods.fee().call(undefined, blockNumber);
125
+ state.uniswapPoolFee = BigInt(fee);
126
+ }
127
+ else {
128
+ state.uniswapPool = historyState.uniswapPool;
129
+ state.decimals0 = historyState.decimals0;
130
+ state.decimals1 = historyState.decimals1;
131
+ state.uniswapPoolFee = historyState.uniswapPoolFee;
132
+ }
133
+ return state;
134
+ }
135
+ handleSetSwapFee(event, pool) {
136
+ pool.swapFee = BigInt(ethers_1.BigNumber.from(event.args.fee).toString());
137
+ return pool;
138
+ }
139
+ handleSetMintFee(event, pool) {
140
+ pool.mintFee = BigInt(ethers_1.BigNumber.from(event.args.fee).toString());
141
+ return pool;
142
+ }
143
+ handleSetBurnFee(event, pool) {
144
+ pool.burnFee = BigInt(ethers_1.BigNumber.from(event.args.fee).toString());
145
+ return pool;
146
+ }
147
+ }
148
+ exports.IntegralEventPool = IntegralEventPool;
149
+ //# sourceMappingURL=integral-pool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integral-pool.js","sourceRoot":"","sources":["../../../src/dex/integral/integral-pool.ts"],"names":[],"mappings":";;;;;;AACA,4CAA+C;AAI/C,+EAA0E;AAG1E,6EAA2D;AAC3D,iFAA+D;AAC/D,yGAA2E;AAG3E,iDAI4B;AAE5B,mCAAmC;AAEnC,MAAa,iBAAkB,SAAQ,mDAAkC;IAiBvE,YACS,UAAkB,EACf,OAAe,EACf,SAAqB,EAC/B,WAAoB,EACpB,MAAe,EACf,MAAe,EACf,MAAc,EACJ,YAAY,IAAI,eAAS,CAAC,mBAAe,CAAC;QAEpD,KAAK,CAAC,UAAU,EAAE,GAAG,MAAM,IAAI,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;QATrD,eAAU,GAAV,UAAU,CAAQ;QACf,YAAO,GAAP,OAAO,CAAQ;QACf,cAAS,GAAT,SAAS,CAAY;QAKrB,cAAS,GAAT,SAAS,CAAiC;QAxBtD,aAAQ,GAMJ,EAAE,CAAC;QAqBL,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;QACnC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;QACnC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC,WAAW,EAAE,CAAC;QAE7C,IAAI,CAAC,UAAU,GAAG,CAAC,GAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC7D,IAAI,CAAC,mBAAmB,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC9C,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/D,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/D,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjE,CAAC;IAES,qBAAqB;QAC7B,OAAO;YACL,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC;IACJ,CAAC;IAED;;;;;;;;OAQG;IACO,KAAK,CAAC,UAAU,CACxB,KAAgB,EAChB,GAAkB,EAClB,WAAkC;QAElC,IAAI;YACF,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YACnC,IAAI,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE;gBAC/B,OAAO,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;aACnE;YACD,OAAO,KAAK,CAAC;SACd;QAAC,OAAO,CAAC,EAAE;YACV,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,SAAS,IAAI,CAAC,UAAU,kDAAkD,GAAG,CAAC,MAAM,GAAG,EACvF,CAAC,CACF,CAAC;YACF,OAAO,IAAI,CAAC;SACb;IACH,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,aAAa,CAAC,WAAmB;QACrC,MAAM,KAAK,GAAG,EAAe,CAAC;QAC9B,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CACvD,mBAA4B,EAC5B,IAAI,CAAC,WAAW,CACjB,CAAC;QACF,MAAM,iBAAiB,GAAuC;YAC5D;gBACE,MAAM,EAAE,IAAI,CAAC,WAAW;gBACxB,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE;gBAC3C,cAAc,EAAE,wBAAa;aAC9B;YACD;gBACE,MAAM,EAAE,IAAI,CAAC,WAAW;gBACxB,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,SAAS,EAAE;gBAC5C,cAAc,EAAE,0BAAe;aAChC;YACD;gBACE,MAAM,EAAE,IAAI,CAAC,WAAW;gBACxB,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,SAAS,EAAE;gBAC5C,cAAc,EAAE,0BAAe;aAChC;YACD;gBACE,MAAM,EAAE,IAAI,CAAC,WAAW;gBACxB,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,SAAS,EAAE;gBAC5C,cAAc,EAAE,0BAAe;aAChC;SACF,CAAC;QACF,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,SAAS,CAE3D,iBAAiB,EAAE,WAAW,CAAC,CAAC;QAClC,MAAM,aAAa,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QAE9C,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QACrC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QACrC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QACrC,KAAK,CAAC,MAAM,GAAG,aAAa,CAAC;QAE7B,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QAC1C,IAAI,CAAC,YAAY,EAAE;YACjB,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CACzD,qBAA8B,EAC9B,aAAa,CACd,CAAC;YACF,MAAM,oBAAoB,GAAuC;gBAC/D;oBACE,MAAM,EAAE,aAAa;oBACrB,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,SAAS,EAAE;oBAChD,cAAc,EAAE,wBAAa;iBAC9B;gBACD;oBACE,MAAM,EAAE,aAAa;oBACrB,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,SAAS,EAAE;oBAChD,cAAc,EAAE,wBAAa;iBAC9B;gBACD;oBACE,MAAM,EAAE,aAAa;oBACrB,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,SAAS,EAAE;oBAClD,cAAc,EAAE,wBAAa;iBAC9B;aACF,CAAC;YACF,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,SAAS,CAE7D,oBAAoB,EAAE,WAAW,CAAC,CAAC;YAErC,KAAK,CAAC,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;YAC9C,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;YACzC,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;YAEzC,MAAM,WAAW,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAC9D,gCAA6B,EAC7B,KAAK,CAAC,WAAW,CAClB,CAAC;YACF,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;YACzE,KAAK,CAAC,cAAc,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;SACpC;aAAM;YACL,KAAK,CAAC,WAAW,GAAG,YAAY,CAAC,WAAW,CAAC;YAC7C,KAAK,CAAC,SAAS,GAAG,YAAY,CAAC,SAAS,CAAC;YACzC,KAAK,CAAC,SAAS,GAAG,YAAY,CAAC,SAAS,CAAC;YACzC,KAAK,CAAC,cAAc,GAAG,YAAY,CAAC,cAAc,CAAC;SACpD;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,gBAAgB,CAAC,KAAqB,EAAE,IAAe;QACrD,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,kBAAS,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;QACjE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gBAAgB,CAAC,KAAqB,EAAE,IAAe;QACrD,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,kBAAS,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;QACjE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gBAAgB,CAAC,KAAqB,EAAE,IAAe;QACrD,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,kBAAS,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;QACjE,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAvLD,8CAuLC"}
@@ -0,0 +1,18 @@
1
+ import { Interface } from '@ethersproject/abi';
2
+ import { IDexHelper } from '../../dex-helper';
3
+ import { Address, Logger } from '../../types';
4
+ import { UniswapV3EventPool } from '../uniswap-v3/uniswap-v3-pool';
5
+ import { Network } from '../../constants';
6
+ import { PoolState } from '../uniswap-v3/types';
7
+ import { Observation } from './types';
8
+ import { MultiResult } from '../../lib/multi-wrapper';
9
+ import { BytesLike } from 'ethers';
10
+ export declare function decodeStateMultiCallResultWithObservation(result: MultiResult<BytesLike> | BytesLike): Observation;
11
+ export declare class IntegralPricing extends UniswapV3EventPool {
12
+ readonly dexHelper: IDexHelper;
13
+ private readonly providedPoolAddress;
14
+ constructor(dexHelper: IDexHelper, parentName: string, erc20Interface: Interface, poolAddress: Address, token0: Address, token1: Address, feeCode: bigint, logger: Logger, network: Network, mapKey?: string);
15
+ get poolAddress(): Address;
16
+ set poolAddress(_address: Address);
17
+ generateState(blockNumber: number): Promise<Readonly<PoolState>>;
18
+ }
@@ -0,0 +1,114 @@
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.IntegralPricing = exports.decodeStateMultiCallResultWithObservation = void 0;
7
+ const uniswap_v3_pool_1 = require("../uniswap-v3/uniswap-v3-pool");
8
+ const config_1 = require("../uniswap-v3/config");
9
+ const UniswapV3StateMulticall_abi_json_1 = __importDefault(require("../../abi/uniswap-v3/UniswapV3StateMulticall.abi.json"));
10
+ const utils_1 = require("../uniswap-v3/contract-math/utils");
11
+ const utils_2 = require("../../utils");
12
+ const TickBitMap_1 = require("../uniswap-v3/contract-math/TickBitMap");
13
+ const ethers_1 = require("ethers");
14
+ const decoders_1 = require("../../lib/decoders");
15
+ function decodeStateMultiCallResultWithObservation(result) {
16
+ const [isSuccess, toDecode] = (0, decoders_1.extractSuccessAndValue)(result);
17
+ if (!isSuccess || toDecode === '0x')
18
+ throw new Error(`decodeStateMultiCallResultWithRelativeBitmaps failed to get decodable result: ${result}`);
19
+ const decoded = ethers_1.ethers.utils.defaultAbiCoder.decode([
20
+ `
21
+ tuple(
22
+ uint32 blockTimestamp,
23
+ int56 tickCumulative,
24
+ uint160 secondsPerLiquidityCumulativeX128,
25
+ bool initialized,
26
+ )
27
+ `,
28
+ ], toDecode)[0];
29
+ return decoded;
30
+ }
31
+ exports.decodeStateMultiCallResultWithObservation = decodeStateMultiCallResultWithObservation;
32
+ class IntegralPricing extends uniswap_v3_pool_1.UniswapV3EventPool {
33
+ constructor(dexHelper, parentName, erc20Interface, poolAddress, token0, token1, feeCode, logger, network, mapKey = '') {
34
+ const uniswapConfig = config_1.UniswapV3Config['UniswapV3'][network];
35
+ const stateMultiContract = new dexHelper.web3Provider.eth.Contract(uniswapConfig.stateMultiCallAbi !== undefined
36
+ ? uniswapConfig.stateMultiCallAbi
37
+ : UniswapV3StateMulticall_abi_json_1.default, uniswapConfig.stateMulticall);
38
+ super(dexHelper, parentName, stateMultiContract, undefined, erc20Interface, uniswapConfig.factory, feeCode, token0, token1, logger, mapKey, uniswapConfig.initHash);
39
+ this.dexHelper = dexHelper;
40
+ this.providedPoolAddress = poolAddress;
41
+ }
42
+ get poolAddress() {
43
+ return this.providedPoolAddress;
44
+ }
45
+ set poolAddress(_address) { }
46
+ async generateState(blockNumber) {
47
+ const callData = this._getStateRequestCallData();
48
+ const [resBalance0, resBalance1, resState] = await this.dexHelper.multiWrapper.tryAggregate(false, callData, blockNumber, this.dexHelper.multiWrapper.defaultBatchSize, false);
49
+ if (!resState.success)
50
+ throw new Error('Pool does not exist');
51
+ const [balance0, balance1, _state] = [
52
+ resBalance0.returnData,
53
+ resBalance1.returnData,
54
+ resState.returnData,
55
+ ];
56
+ const observationsCallData = [
57
+ ...Array(_state.slot0.observationCardinality),
58
+ ].map((_, i) => {
59
+ return {
60
+ target: this.poolAddress,
61
+ callData: this.poolIface.encodeFunctionData('observations', [i]),
62
+ decodeFunction: decodeStateMultiCallResultWithObservation,
63
+ };
64
+ });
65
+ const resObservations = await this.dexHelper.multiWrapper.tryAggregate(false, observationsCallData, blockNumber, 13107, false);
66
+ const observations = resObservations.reduce((memo, obs, i) => {
67
+ memo[i] = {
68
+ blockTimestamp: BigInt(obs.returnData.blockTimestamp),
69
+ tickCumulative: BigInt(obs.returnData.tickCumulative.toString()),
70
+ secondsPerLiquidityCumulativeX128: BigInt(obs.returnData.secondsPerLiquidityCumulativeX128.toString()),
71
+ initialized: obs.returnData.initialized,
72
+ };
73
+ return memo;
74
+ }, {});
75
+ const tickBitmap = {};
76
+ const ticks = {};
77
+ (0, utils_1._reduceTickBitmap)(tickBitmap, _state.tickBitmap);
78
+ (0, utils_1._reduceTicks)(ticks, _state.ticks);
79
+ const currentTick = (0, utils_2.bigIntify)(_state.slot0.tick);
80
+ const tickSpacing = (0, utils_2.bigIntify)(_state.tickSpacing);
81
+ const startTickBitmap = TickBitMap_1.TickBitMap.position(currentTick / tickSpacing)[0];
82
+ const requestedRange = this.getBitmapRangeToRequest();
83
+ return {
84
+ pool: _state.pool,
85
+ blockTimestamp: (0, utils_2.bigIntify)(_state.blockTimestamp),
86
+ slot0: {
87
+ sqrtPriceX96: (0, utils_2.bigIntify)(_state.slot0.sqrtPriceX96),
88
+ tick: currentTick,
89
+ observationIndex: +_state.slot0.observationIndex,
90
+ observationCardinality: +_state.slot0.observationCardinality,
91
+ observationCardinalityNext: +_state.slot0.observationCardinalityNext,
92
+ feeProtocol: (0, utils_2.bigIntify)(_state.slot0.feeProtocol),
93
+ },
94
+ liquidity: (0, utils_2.bigIntify)(_state.liquidity),
95
+ fee: this.feeCode,
96
+ tickSpacing,
97
+ maxLiquidityPerTick: (0, utils_2.bigIntify)(_state.maxLiquidityPerTick),
98
+ tickBitmap,
99
+ ticks,
100
+ observations,
101
+ isValid: true,
102
+ startTickBitmap,
103
+ lowestKnownTick: (BigInt.asIntN(24, startTickBitmap - requestedRange) << 8n) *
104
+ tickSpacing,
105
+ highestKnownTick: ((BigInt.asIntN(24, startTickBitmap + requestedRange) << 8n) +
106
+ BigInt.asIntN(24, 255n)) *
107
+ tickSpacing,
108
+ balance0,
109
+ balance1,
110
+ };
111
+ }
112
+ }
113
+ exports.IntegralPricing = IntegralPricing;
114
+ //# sourceMappingURL=integral-pricing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integral-pricing.js","sourceRoot":"","sources":["../../../src/dex/integral/integral-pricing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import { ethers } from 'ethers';
2
+ import { Interface } from '@ethersproject/abi';
3
+ import { LogDescription } from 'ethers/lib/utils';
4
+ import { IDexHelper } from '../../dex-helper';
5
+ import { StatefulEventSubscriber } from '../../stateful-event-subscriber';
6
+ import { Address, BlockHeader, Log, Logger } from '../../types';
7
+ import { PoolInitProps, RelayerPoolState, RelayerState } from './types';
8
+ import { AsyncOrSync, DeepReadonly } from 'ts-essentials';
9
+ export declare type OnPoolEnabledSetCallback = (poolAddress: Address, poolState: RelayerPoolState, blockNumber: number) => Promise<void>;
10
+ export declare class IntegralRelayer extends StatefulEventSubscriber<RelayerState> {
11
+ readonly dexHelper: IDexHelper;
12
+ readonly erc20Interface: Interface;
13
+ readonly relayerAddress: Address;
14
+ protected readonly onPoolEnabledSet: OnPoolEnabledSetCallback;
15
+ handlers: {
16
+ [event: string]: (event: any, state: RelayerState, blockHeader: Readonly<BlockHeader>) => AsyncOrSync<RelayerState>;
17
+ };
18
+ logDecoder: (log: Log) => any;
19
+ private pools;
20
+ private orders;
21
+ readonly relayerIface: ethers.utils.Interface;
22
+ constructor(dexHelper: IDexHelper, parentName: string, erc20Interface: Interface, relayerAddress: Address, initPools: PoolInitProps, onPoolEnabledSet: OnPoolEnabledSetCallback, logger: Logger, mapKey?: string);
23
+ addPools(more: PoolInitProps): void;
24
+ getPools(): {
25
+ [poolAddress: string]: {
26
+ token0: string;
27
+ token1: string;
28
+ };
29
+ };
30
+ protected getPoolIdentifierData(): {
31
+ relayer: string;
32
+ };
33
+ executeOrder(id: bigint, blockNumber: number): void;
34
+ generateState(blockNumber?: number | 'latest'): Promise<RelayerState>;
35
+ protected processLog(state: DeepReadonly<RelayerState>, log: Readonly<Log>, blockHeader: Readonly<BlockHeader>): Promise<RelayerState>;
36
+ handleSwapFeeSet(event: LogDescription, state: RelayerState, _blockHeader: Readonly<BlockHeader>): RelayerState;
37
+ handlePairEnabledSet(event: LogDescription, state: RelayerState, blockHeader: Readonly<BlockHeader>): Promise<RelayerState>;
38
+ handleWrapEth(event: LogDescription, state: RelayerState, _blockHeader: Readonly<BlockHeader>): Promise<RelayerState>;
39
+ handleUnwrapWeth(event: LogDescription, state: RelayerState, blockHeader: Readonly<BlockHeader>): Promise<RelayerState>;
40
+ handleUpgraded(_event: LogDescription, state: RelayerState, blockHeader: Readonly<BlockHeader>): Promise<RelayerState>;
41
+ private initTokens;
42
+ }