@paraswap/dex-lib 2.12.12-rfqtests.1 → 2.12.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/build/abi/augustus.json +375 -0
  2. package/build/abi/woo-fi-v2/IntegrationHelper.abi.json +116 -0
  3. package/build/abi/woo-fi-v2/WooOracleV2.abi.json +358 -0
  4. package/build/abi/woo-fi-v2/WooPPV2.abi.json +580 -0
  5. package/build/config.js +3 -3
  6. package/build/dex/aave-v3/tokens/arbitrum.json +20 -20
  7. package/build/dex/aave-v3/tokens/avalanche.json +44 -20
  8. package/build/dex/aave-v3/tokens/fantom.json +30 -30
  9. package/build/dex/aave-v3/tokens/optimism.json +18 -18
  10. package/build/dex/aave-v3/tokens/polygon.json +60 -42
  11. package/build/dex/generic-rfq/rate-fetcher.js +0 -1
  12. package/build/dex/generic-rfq/rate-fetcher.js.map +1 -1
  13. package/build/dex/generic-rfq/validators.d.ts +1 -1
  14. package/build/dex/generic-rfq/validators.js +26 -36
  15. package/build/dex/generic-rfq/validators.js.map +1 -1
  16. package/build/dex/hashflow/rate-fetcher.d.ts +14 -0
  17. package/build/dex/hashflow/rate-fetcher.js +37 -0
  18. package/build/dex/hashflow/rate-fetcher.js.map +1 -0
  19. package/build/dex/hashflow/validators.d.ts +3 -0
  20. package/build/dex/hashflow/validators.js +12 -0
  21. package/build/dex/hashflow/validators.js.map +1 -0
  22. package/build/dex/{test-aave-v3 → test-dex}/config.d.ts +1 -1
  23. package/build/dex/{test-aave-v3 → test-dex}/config.js +3 -3
  24. package/build/dex/test-dex/config.js.map +1 -0
  25. package/build/dex/{test-aave-v3/test-aave-v3-pool.d.ts → test-dex/test-dex-pool.d.ts} +3 -3
  26. package/build/dex/{test-aave-v3/test-aave-v3-pool.js → test-dex/test-dex-pool.js} +7 -7
  27. package/build/dex/test-dex/test-dex-pool.js.map +1 -0
  28. package/build/dex/{test-aave-v3/test-aave-v3.d.ts → test-dex/test-dex.d.ts} +8 -8
  29. package/build/dex/{test-aave-v3/test-aave-v3.js → test-dex/test-dex.js} +7 -7
  30. package/build/dex/test-dex/test-dex.js.map +1 -0
  31. package/build/dex/{test-aave-v3 → test-dex}/types.d.ts +1 -1
  32. package/build/dex/{test-aave-v3 → test-dex}/types.js.map +1 -1
  33. package/build/dex/uniswap-v3/config.js +13 -0
  34. package/build/dex/uniswap-v3/config.js.map +1 -1
  35. package/build/dex/woo-fi-v2/config.d.ts +4 -0
  36. package/build/dex/woo-fi-v2/config.js +87 -0
  37. package/build/dex/woo-fi-v2/config.js.map +1 -0
  38. package/build/dex/woo-fi-v2/constants.d.ts +5 -0
  39. package/build/dex/woo-fi-v2/constants.js +15 -0
  40. package/build/dex/woo-fi-v2/constants.js.map +1 -0
  41. package/build/dex/woo-fi-v2/decoders.d.ts +6 -0
  42. package/build/dex/woo-fi-v2/decoders.js +29 -0
  43. package/build/dex/woo-fi-v2/decoders.js.map +1 -0
  44. package/build/dex/woo-fi-v2/types.d.ts +41 -0
  45. package/build/dex/woo-fi-v2/types.js +3 -0
  46. package/build/dex/woo-fi-v2/types.js.map +1 -0
  47. package/build/dex/woo-fi-v2/utils.d.ts +2 -0
  48. package/build/dex/woo-fi-v2/utils.js +24 -0
  49. package/build/dex/woo-fi-v2/utils.js.map +1 -0
  50. package/build/dex/woo-fi-v2/woo-fi-math.d.ts +16 -0
  51. package/build/dex/woo-fi-v2/woo-fi-math.js +137 -0
  52. package/build/dex/woo-fi-v2/woo-fi-math.js.map +1 -0
  53. package/build/dex/woo-fi-v2/woo-fi-v2-math.d.ts +16 -0
  54. package/build/dex/woo-fi-v2/woo-fi-v2-math.js +137 -0
  55. package/build/dex/woo-fi-v2/woo-fi-v2-math.js.map +1 -0
  56. package/build/dex/woo-fi-v2/woo-fi-v2-pool.d.ts +12 -0
  57. package/build/dex/woo-fi-v2/woo-fi-v2-pool.js +79 -0
  58. package/build/dex/woo-fi-v2/woo-fi-v2-pool.js.map +1 -0
  59. package/build/dex/woo-fi-v2/woo-fi-v2.d.ts +52 -0
  60. package/build/dex/woo-fi-v2/woo-fi-v2.js +310 -0
  61. package/build/dex/woo-fi-v2/woo-fi-v2.js.map +1 -0
  62. package/build/lib/log-messages-suppressor.d.ts +30 -0
  63. package/build/lib/log-messages-suppressor.js +107 -0
  64. package/build/lib/log-messages-suppressor.js.map +1 -0
  65. package/build/lib/stateful-rpc-poller/state-polling-manager.d.ts +23 -0
  66. package/build/lib/stateful-rpc-poller/state-polling-manager.js +173 -0
  67. package/build/lib/stateful-rpc-poller/state-polling-manager.js.map +1 -0
  68. package/build/lib/stateful-rpc-poller/stateful-rpc-poller.d.ts +72 -0
  69. package/build/lib/stateful-rpc-poller/stateful-rpc-poller.js +369 -0
  70. package/build/lib/stateful-rpc-poller/stateful-rpc-poller.js.map +1 -0
  71. package/build/lib/stateful-rpc-poller/types.d.ts +35 -0
  72. package/build/lib/stateful-rpc-poller/types.js +10 -0
  73. package/build/lib/stateful-rpc-poller/types.js.map +1 -0
  74. package/build/lib/stateful-rpc-poller/utils.d.ts +4 -0
  75. package/build/lib/stateful-rpc-poller/utils.js +17 -0
  76. package/build/lib/stateful-rpc-poller/utils.js.map +1 -0
  77. package/build/lib/validators.d.ts +7 -0
  78. package/build/lib/validators.js +27 -0
  79. package/build/lib/validators.js.map +1 -0
  80. package/package.json +1 -1
  81. package/src/config.ts +3 -3
  82. package/src/dex/generic-rfq/generic-rfq-e2e.test.ts +71 -85
  83. package/src/dex/generic-rfq/rate-fetcher.ts +0 -1
  84. package/src/dex/generic-rfq/validators.test.ts +32 -6
  85. package/src/dex/generic-rfq/validators.ts +32 -57
  86. package/src/dex/uniswap-v3/config.ts +13 -0
  87. package/src/dex/uniswap-v3/uniswap-v3-e2e.test.ts +76 -0
  88. package/tests/constants-e2e.ts +0 -2
  89. package/tests/utils-e2e.ts +48 -59
  90. package/.idea/codeStyles/codeStyleConfig.xml +0 -5
  91. package/.idea/misc.xml +0 -6
  92. package/.idea/modules.xml +0 -8
  93. package/.idea/vcs.xml +0 -6
  94. package/.vscode/launch.json +0 -21
  95. package/build/dex/aave-v3/tokens/mainnet.json +0 -44
  96. package/build/dex/balancer-v2/VirtualBoostedPool.d.ts +0 -79
  97. package/build/dex/balancer-v2/VirtualBoostedPool.js +0 -382
  98. package/build/dex/balancer-v2/VirtualBoostedPool.js.map +0 -1
  99. package/build/dex/test-aave-v3/config.js.map +0 -1
  100. package/build/dex/test-aave-v3/test-aave-v3-pool.js.map +0 -1
  101. package/build/dex/test-aave-v3/test-aave-v3.js.map +0 -1
  102. package/src/dex/generic-rfq/generic-rfq-e2e-arbitrum.test.ts +0 -360
  103. package/src/dex/generic-rfq/generic-rfq-e2e-bsc.test.ts +0 -346
  104. package/src/dex/generic-rfq/generic-rfq-e2e-polygon.test.ts +0 -360
  105. /package/build/dex/{test-aave-v3 → test-dex}/types.js +0 -0
@@ -0,0 +1,173 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StatePollingManager = void 0;
4
+ const console_1 = require("console");
5
+ const log4js_1 = require("../log4js");
6
+ class StatePollingManager {
7
+ constructor(dexHelper) {
8
+ this.dexHelper = dexHelper;
9
+ this._lastProcessedBlockNumber = 0;
10
+ this._registeredPendingPools = [];
11
+ // ALl registered instances from identifier to instance
12
+ this._poolsToInstances = {};
13
+ // This pools will be updated if we see new block and the time has come
14
+ this._poolsToBeUpdated = new Set();
15
+ // This pools wont be updated before we change _isStateToBeUpdated to true
16
+ this._idlePools = new Set();
17
+ this.logger = (0, log4js_1.getLogger)(`${this.constructor.name}-${dexHelper.config.data.network}`);
18
+ if (this.isMaster) {
19
+ }
20
+ }
21
+ static getInstance(dexHelper) {
22
+ const network = dexHelper.config.data.network;
23
+ if (StatePollingManager.__instances[network] === undefined) {
24
+ StatePollingManager.__instances[network] = new StatePollingManager(dexHelper);
25
+ }
26
+ return StatePollingManager.__instances[network];
27
+ }
28
+ get isMaster() {
29
+ return !this.dexHelper.config.isSlave;
30
+ }
31
+ enableStateTracking(identifierKey) {
32
+ (0, console_1.assert)(this._poolsToInstances[identifierKey] !== undefined, `enableTracking: pool with identifierKey=${identifierKey} is not initialized`);
33
+ this._poolsToBeUpdated.add(identifierKey);
34
+ this._idlePools.delete(identifierKey);
35
+ }
36
+ disableStateTracking(identifierKey) {
37
+ (0, console_1.assert)(this._poolsToInstances[identifierKey] !== undefined, `disableStateTracking: pool with identifierKey=${identifierKey} is not initialized`);
38
+ this._poolsToBeUpdated.delete(identifierKey);
39
+ this._idlePools.add(identifierKey);
40
+ }
41
+ async onBlockNumber(blockNumber) {
42
+ if (!this.isMaster) {
43
+ return;
44
+ }
45
+ // Events-client calls several times for the same blockNumber sometimes
46
+ // I want to filter them. The only condition, that matters is that blockNumbers are the same
47
+ if (this._lastProcessedBlockNumber === blockNumber) {
48
+ return;
49
+ }
50
+ this._lastProcessedBlockNumber = blockNumber;
51
+ const poolsToBeUpdated = [];
52
+ Array.from(this._poolsToBeUpdated).forEach(p => {
53
+ const pool = this._keyToPoolInstance(p);
54
+ // We always expect pools in _poolsToBeUpdated to participate in updates
55
+ (0, console_1.assert)(pool.isPoolParticipateInUpdates, `onBlockNumber: pool=${p} from ${pool.dexKey} is not participate in updates`);
56
+ if (!pool.isPoolInTheMiddleOfUpdate &&
57
+ pool.isTimeToTriggerUpdate(blockNumber)) {
58
+ pool.isPoolInTheMiddleOfUpdate = true;
59
+ poolsToBeUpdated.push(pool);
60
+ }
61
+ });
62
+ if (poolsToBeUpdated.length === 0) {
63
+ this.logger.debug(`onBlockNumber=${blockNumber} no pools to be updated. Skipping`);
64
+ return;
65
+ }
66
+ this._updatePoolStates(poolsToBeUpdated)
67
+ .then(receivedBlockNumber => {
68
+ // There is no guarantee that we receive latest state. This is our best effort
69
+ if (receivedBlockNumber < blockNumber) {
70
+ this.logger.warn(`onBlockNumber=${blockNumber} at least for some pools receivedBlockNumber=${receivedBlockNumber} is lower than expected`);
71
+ }
72
+ })
73
+ .catch(e => this.logger.error(`onBlockNumber=${blockNumber} error while updating pools: ${e}`))
74
+ .finally(() => {
75
+ poolsToBeUpdated.forEach(pool => {
76
+ pool.isPoolInTheMiddleOfUpdate = false;
77
+ });
78
+ });
79
+ }
80
+ async _updatePoolStates(poolsToBeUpdated, blockNumber = 'latest', numberOfChunks) {
81
+ const indexDividers = [];
82
+ const multiCalls = poolsToBeUpdated
83
+ .map((p, i) => {
84
+ const callData = p.getFetchStateWithBlockInfoMultiCalls();
85
+ indexDividers.push(callData.length);
86
+ return callData;
87
+ })
88
+ .flat();
89
+ (0, console_1.assert)(indexDividers.length === poolsToBeUpdated.length, 'indexDividers.length === poolsToBeUpdated.length');
90
+ const results = (await this.dexHelper.multiWrapper.tryAggregate(false, multiCalls, blockNumber, numberOfChunks));
91
+ let minBlockNumber = 0;
92
+ const lastUpdatedAtMs = Date.now();
93
+ // Let's pack each result into relevant pools
94
+ const unFlattenedResults = [];
95
+ let accumulatedStart = 0;
96
+ indexDividers.forEach(divider => {
97
+ unFlattenedResults.push(results.slice(accumulatedStart, accumulatedStart + divider));
98
+ accumulatedStart += divider;
99
+ });
100
+ (0, console_1.assert)(unFlattenedResults.length === poolsToBeUpdated.length, 'unFlattenedResults.length === poolsToBeUpdated.length');
101
+ await Promise.all(unFlattenedResults.map(async (result, index) => {
102
+ const pool = poolsToBeUpdated[index];
103
+ try {
104
+ const parsedStateResult = pool.parseStateFromMultiResultsWithBlockInfo(result, lastUpdatedAtMs);
105
+ minBlockNumber = Math.min(parsedStateResult.blockNumber, minBlockNumber);
106
+ await pool.setState(parsedStateResult.value, parsedStateResult.blockNumber, parsedStateResult.lastUpdatedAtMs);
107
+ }
108
+ catch (e) {
109
+ this.logger.error(`onBlockNumber=${blockNumber} error while parsing state from multicall for pool=${pool.identifierKey} from ${pool.dexKey}: ${e}`);
110
+ }
111
+ }));
112
+ return minBlockNumber;
113
+ }
114
+ // When this method is called, we expect that all pools are initialized
115
+ _keyToPoolInstance(identifierKey) {
116
+ const pool = this._poolsToInstances[identifierKey];
117
+ (0, console_1.assert)(pool !== undefined, `keyToPoolInstance: pool=${identifierKey} is undefined`);
118
+ return pool;
119
+ }
120
+ // Once you instantiated all your pools, you should trigger at the end of initializing this method
121
+ // So all state will be initialized. It is not part of constructor, because and that time we don't have
122
+ // all classes built
123
+ initializeAllPendingPools() {
124
+ if (this._registeredPendingPools.length === 0) {
125
+ return;
126
+ }
127
+ this._registeredPendingPools.forEach(p => {
128
+ this.initializePool(p);
129
+ });
130
+ this._registeredPendingPools = [];
131
+ }
132
+ registerPendingPool(statefulRpcPoller) {
133
+ if (this._poolsToInstances[statefulRpcPoller.identifierKey]) {
134
+ this.logger.error(`Attempt to register initialized pool=${statefulRpcPoller.identifierKey}`);
135
+ return;
136
+ }
137
+ const alreadyRegisteredAsPending = this._registeredPendingPools.some(p => p.identifierKey === statefulRpcPoller.identifierKey);
138
+ if (alreadyRegisteredAsPending) {
139
+ this.logger.error(`Attempt to register pool=${statefulRpcPoller.identifierKey} twice`);
140
+ return;
141
+ }
142
+ this._registeredPendingPools.push(statefulRpcPoller);
143
+ }
144
+ initializePool(statefulRpcPoller) {
145
+ const { identifierKey } = statefulRpcPoller;
146
+ if (this._idlePools.has(identifierKey) ||
147
+ this._poolsToBeUpdated.has(identifierKey) ||
148
+ this._poolsToInstances.hasOwnProperty(identifierKey)) {
149
+ this.logger.warn(`Attempt to reinitialize existing poolIdentifier=` +
150
+ `${identifierKey}. Maybe there is memory leak`);
151
+ }
152
+ else {
153
+ this._poolsToInstances[identifierKey] = statefulRpcPoller;
154
+ statefulRpcPoller.isPoolParticipateInUpdates
155
+ ? this._poolsToBeUpdated.add(identifierKey)
156
+ : this._idlePools.add(identifierKey);
157
+ const currentBlockNumber = this.dexHelper.blockManager.getActiveChainHead()?.number;
158
+ (0, console_1.assert)(currentBlockNumber !== undefined, 'currentBlockNumber !== undefined');
159
+ statefulRpcPoller
160
+ .initializeState()
161
+ .then(() => {
162
+ this.logger.info(`Successfully initialized pool=${identifierKey}`);
163
+ })
164
+ .catch(e => {
165
+ // Must never happen
166
+ this.logger.error(`initializePool: pool=${identifierKey} from ${statefulRpcPoller.dexKey} error while initializing state: ${e}`);
167
+ });
168
+ }
169
+ }
170
+ }
171
+ exports.StatePollingManager = StatePollingManager;
172
+ StatePollingManager.__instances = {};
173
+ //# sourceMappingURL=state-polling-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-polling-manager.js","sourceRoot":"","sources":["../../../src/lib/stateful-rpc-poller/state-polling-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ import { Logger, LogLevels } from '../../types';
2
+ import { IDexHelper } from '../../dex-helper';
3
+ import { IStatefulRpcPoller, ObjWithUpdateInfo, PollingManagerControllersCb, StateSources } from './types';
4
+ import { MultiCallParams, MultiResult } from '../multi-wrapper';
5
+ import { LogMessagesSuppressor, MessageInfo } from '../log-messages-suppressor';
6
+ declare const StatefulRPCPollerMessages: {
7
+ readonly ERROR_FETCHING_STATE_FROM_CACHE: "Unexpected error while fetching state from Cache";
8
+ readonly ERROR_FETCHING_STATE_FROM_RPC: "Unexpected error while fetching state from RPC";
9
+ readonly ERROR_SAVING_LIQUIDITY_IN_CACHE: "Unexpected error while saving liquidity in Cache";
10
+ readonly ERROR_SAVING_STATE_IN_CACHE: "Unexpected error while saving state in Cache";
11
+ readonly FALLBACK_TO_RPC: "Failed to retrieve updated state from cache. Falling back to RPC";
12
+ readonly LIQUIDITY_INFO_IS_OUTDATED: string;
13
+ };
14
+ export declare abstract class StatefulRpcPoller<State, M> implements IStatefulRpcPoller<State, M> {
15
+ readonly dexKey: string;
16
+ protected dexHelper: IDexHelper;
17
+ protected liquidityThresholdForUpdate: number;
18
+ protected liquidityUpdateAllowedDelayMs: number;
19
+ protected isLiquidityTracked: boolean;
20
+ protected managerCbControllers: PollingManagerControllersCb;
21
+ protected maxAllowedStateDelayInBlocks: number;
22
+ protected blocksBackToTriggerUpdate: number;
23
+ protected liquidityUpdatePeriodMs: number;
24
+ static StatefulRPCPollerMessages: Record<keyof typeof StatefulRPCPollerMessages, MessageInfo<typeof StatefulRPCPollerMessages>>;
25
+ protected _stateWithUpdateInfo?: ObjWithUpdateInfo<State>;
26
+ protected _liquidityInUSDWithUpdateInfo: ObjWithUpdateInfo<number>;
27
+ readonly cacheStateKey: string;
28
+ readonly cacheLiquidityMapKey: string;
29
+ protected _cachedMultiCallData?: [
30
+ MultiCallParams<number>,
31
+ ...MultiCallParams<M>[]
32
+ ];
33
+ protected _getBlockNumberMultiCall: MultiCallParams<number>;
34
+ readonly entityName: string;
35
+ protected logMessagesSuppressor: LogMessagesSuppressor<typeof StatefulRPCPollerMessages>;
36
+ protected _isPoolParticipateInUpdates: boolean;
37
+ protected _isPoolInTheMiddleOfUpdate: boolean;
38
+ readonly identifierKey: string;
39
+ protected logger: Logger;
40
+ constructor(dexKey: string, poolIdentifier: string, dexHelper: IDexHelper, liquidityThresholdForUpdate: number, liquidityUpdateAllowedDelayMs: number, isLiquidityTracked: boolean, managerCbControllers: PollingManagerControllersCb, maxAllowedStateDelayInBlocks?: number, blocksBackToTriggerUpdate?: number, liquidityUpdatePeriodMs?: number);
41
+ get network(): number;
42
+ protected get isMaster(): boolean;
43
+ protected _isStateOutdated(checkForBlockNumber: number, stateValidBlockNumber: number, stateValidityBlockNumDelay: number): boolean;
44
+ protected _isStateOutdatedForUse(checkForBlockNumber: number, stateValidBlockNumber: number): boolean;
45
+ isTimeToTriggerUpdate(blocknumber: number): boolean;
46
+ protected _retrieveStateWithChecks(retriever: () => Promise<ObjWithUpdateInfo<State> | null>, blockNumber: number | 'latest', source: StateSources): Promise<ObjWithUpdateInfo<State> | null>;
47
+ getState(blockNumber?: number | 'latest', forInitialization?: boolean, saveInMemory?: boolean): Promise<ObjWithUpdateInfo<State> | null>;
48
+ protected _logMessageWithSuppression(msgKey: keyof typeof StatefulRPCPollerMessages, ...args: unknown[]): void;
49
+ protected _immediateLogMessage(message: string, level: LogLevels, ...args: unknown[]): void;
50
+ get isPoolParticipateInUpdates(): boolean;
51
+ set isPoolParticipateInUpdates(value: boolean);
52
+ get isPoolInTheMiddleOfUpdate(): boolean;
53
+ set isPoolInTheMiddleOfUpdate(value: boolean);
54
+ protected abstract _getFetchStateMultiCalls(): MultiCallParams<M>[];
55
+ getFetchStateWithBlockInfoMultiCalls(): [
56
+ MultiCallParams<number>,
57
+ ...MultiCallParams<M>[]
58
+ ];
59
+ protected abstract _parseStateFromMultiResults(multiOutputs: M[]): State;
60
+ parseStateFromMultiResultsWithBlockInfo(multiOutputs: [MultiResult<number>, ...MultiResult<M>[]], lastUpdatedAtMs: number): ObjWithUpdateInfo<State>;
61
+ fetchLatestStateFromRpc(): Promise<ObjWithUpdateInfo<State> | null>;
62
+ setState(state: State, blockNumber: number, lastUpdatedAtMs: number): Promise<void>;
63
+ protected _saveStateInCache(): Promise<boolean>;
64
+ protected _saveLiquidityInCache(): Promise<boolean>;
65
+ fetchStateFromCache(): Promise<ObjWithUpdateInfo<State> | null>;
66
+ protected _fetchLiquidityFromCache(): Promise<ObjWithUpdateInfo<number> | null>;
67
+ setLiquidity(newLiquidityInUSD: number, lastUpdatedAtMs: number, blockNumber?: number): Promise<void>;
68
+ protected _adjustIsStateToBeUpdated(): void;
69
+ protected _getExpiryTimeForCachedLiquidity(): number;
70
+ initializeState(): Promise<void>;
71
+ }
72
+ export {};
@@ -0,0 +1,369 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StatefulRpcPoller = void 0;
4
+ const types_1 = require("./types");
5
+ const constants_1 = require("../../constants");
6
+ const decoders_1 = require("../decoders");
7
+ const ts_essentials_1 = require("ts-essentials");
8
+ const log4js_1 = require("../log4js");
9
+ const log_messages_suppressor_1 = require("../log-messages-suppressor");
10
+ const utils_1 = require("../../utils");
11
+ const utils_2 = require("./utils");
12
+ const StatefulRPCPollerMessages = {
13
+ ERROR_FETCHING_STATE_FROM_CACHE: `Unexpected error while fetching state from Cache`,
14
+ ERROR_FETCHING_STATE_FROM_RPC: `Unexpected error while fetching state from RPC`,
15
+ ERROR_SAVING_LIQUIDITY_IN_CACHE: `Unexpected error while saving liquidity in Cache`,
16
+ ERROR_SAVING_STATE_IN_CACHE: `Unexpected error while saving state in Cache`,
17
+ FALLBACK_TO_RPC: `Failed to retrieve updated state from cache. Falling back to RPC`,
18
+ LIQUIDITY_INFO_IS_OUTDATED: `Liquidity info in USD is outdated. Wil be updating ` +
19
+ `every pool that is outdated to not degrade performance`,
20
+ };
21
+ const DEFAULT_LIQUIDITY_UPDATE_PERIOD_MS = 2 * 60 * 1000;
22
+ const DEFAULT_STATE_INIT_RETRY_MS = 1000;
23
+ class StatefulRpcPoller {
24
+ constructor(dexKey, poolIdentifier, dexHelper,
25
+ // If liquidity is less than this value, we will not update state
26
+ liquidityThresholdForUpdate,
27
+ // If for some reason liquidity update is broken, for this delay we will still
28
+ // continue to serve update state
29
+ liquidityUpdateAllowedDelayMs,
30
+ // For some pools we don't worry about liquidity and want always to keep state updated
31
+ isLiquidityTracked,
32
+ // Polling manager callbacks. They are useful when you want
33
+ // to give some change information in reverse way.
34
+ // For example, you changed liquidity state, notify manager to
35
+ // not poll that particular pools
36
+ managerCbControllers,
37
+ // If the state is outdated more than this amount of blocks, we will not use this state anymore
38
+ maxAllowedStateDelayInBlocks = dexHelper.config.data
39
+ .rpcPollingMaxAllowedStateDelayInBlocks,
40
+ // When cross this threshold we will trigger update. The idea is this number is less than
41
+ // maxAllowedStateDelayToUpdate, so we trigger update before state become invalid.
42
+ // If blocksBackToTriggerUpdate = maxAllowedStateDelayInBlocks, we will do our best
43
+ // effort to keep up with a tip of chain: trigger update on every new block
44
+ blocksBackToTriggerUpdate = dexHelper.config.data
45
+ .rpcPollingBlocksBackToTriggerUpdate, liquidityUpdatePeriodMs = DEFAULT_LIQUIDITY_UPDATE_PERIOD_MS) {
46
+ this.dexKey = dexKey;
47
+ this.dexHelper = dexHelper;
48
+ this.liquidityThresholdForUpdate = liquidityThresholdForUpdate;
49
+ this.liquidityUpdateAllowedDelayMs = liquidityUpdateAllowedDelayMs;
50
+ this.isLiquidityTracked = isLiquidityTracked;
51
+ this.managerCbControllers = managerCbControllers;
52
+ this.maxAllowedStateDelayInBlocks = maxAllowedStateDelayInBlocks;
53
+ this.blocksBackToTriggerUpdate = blocksBackToTriggerUpdate;
54
+ this.liquidityUpdatePeriodMs = liquidityUpdatePeriodMs;
55
+ // This values is used to determine if current pool will participate in update or not
56
+ // We don't want to keep track of state for pools without liquidity
57
+ this._liquidityInUSDWithUpdateInfo = {
58
+ value: 0,
59
+ blockNumber: 0,
60
+ lastUpdatedAtMs: 0,
61
+ };
62
+ // This flag is changed only via isPoolParticipateInUpdates setter
63
+ // It is used to determine if we should update state or not
64
+ this._isPoolParticipateInUpdates = true;
65
+ this._isPoolInTheMiddleOfUpdate = false;
66
+ // Don't make it too custom, like adding poolIdentifier. It will break log suppressor
67
+ // If we are really need to do that, update log Suppressor to handle that case
68
+ // The idea is to have one entity name per Dex level, not pool level
69
+ this.entityName = `StatefulPoller-${this.dexKey}-${this.dexHelper.config.data.network}`;
70
+ // I made it a little bit different from poolIdentifier, because usually
71
+ // pool identifier doesn't contain network information and it may occasionally
72
+ // collide across chains, though that scenario is very unlikely to happen
73
+ // For consumers they still can use poolIdentifier to get instance, but since
74
+ // we always give network information, it is better we can hide this implementation detail
75
+ this.identifierKey = (0, utils_2.getIdentifierKeyForRpcPoller)(poolIdentifier, this.network);
76
+ this.cacheLiquidityMapKey =
77
+ `${constants_1.CACHE_PREFIX}_${this.network}_${this.dexKey}_liquidity_usd`.toLowerCase();
78
+ this.cacheStateKey =
79
+ `${constants_1.CACHE_PREFIX}_${this.network}_${this.dexKey}_states`.toLowerCase();
80
+ this.logger = (0, log4js_1.getLogger)(`${this.entityName}`);
81
+ (0, ts_essentials_1.assert)(this.maxAllowedStateDelayInBlocks >= 0, `${this.dexKey}-${this.network}-${this.identifierKey}: ` +
82
+ `Max allowed state delay must be >= 0. Received ${this.maxAllowedStateDelayInBlocks}`);
83
+ (0, ts_essentials_1.assert)(this.blocksBackToTriggerUpdate >= 0, `${this.dexKey}-${this.network}-${this.identifierKey}: ` +
84
+ `Blocks back to trigger update must be >= 0. Received ${this.blocksBackToTriggerUpdate}`);
85
+ // You can not go more blocks back than you allow to be delayed
86
+ (0, ts_essentials_1.assert)(this.blocksBackToTriggerUpdate <= this.maxAllowedStateDelayInBlocks, `${this.dexKey}-${this.network}-${this.identifierKey}: ` +
87
+ `Blocks back to trigger update must be <= maxAllowedStateDelayInBlocks. ` +
88
+ `Received ${this.blocksBackToTriggerUpdate} > ${this.maxAllowedStateDelayInBlocks}`);
89
+ this._getBlockNumberMultiCall = {
90
+ target: this.dexHelper.multiContract.options.address,
91
+ callData: this.dexHelper.multiContract.methods
92
+ .getBlockNumber()
93
+ .encodeABI(),
94
+ decodeFunction: decoders_1.uint256DecodeToNumber,
95
+ };
96
+ this.logMessagesSuppressor = log_messages_suppressor_1.LogMessagesSuppressor.getLogSuppressorInstance(this.entityName, StatefulRpcPoller.StatefulRPCPollerMessages, this.logger);
97
+ // This is done to not rely on manual initialize pool call.
98
+ // Any time new pool initialized, it is already automatically registered in polling manager
99
+ this.managerCbControllers.registerPendingPool(this);
100
+ }
101
+ get network() {
102
+ return this.dexHelper.config.data.network;
103
+ }
104
+ get isMaster() {
105
+ return !this.dexHelper.config.isSlave;
106
+ }
107
+ _isStateOutdated(checkForBlockNumber, stateValidBlockNumber, stateValidityBlockNumDelay) {
108
+ return (checkForBlockNumber - stateValidBlockNumber > stateValidityBlockNumDelay);
109
+ }
110
+ _isStateOutdatedForUse(checkForBlockNumber, stateValidBlockNumber) {
111
+ return this._isStateOutdated(checkForBlockNumber, stateValidBlockNumber, this.maxAllowedStateDelayInBlocks);
112
+ }
113
+ isTimeToTriggerUpdate(blocknumber) {
114
+ return this._isStateOutdated(blocknumber, this._stateWithUpdateInfo?.blockNumber || 0, this.blocksBackToTriggerUpdate);
115
+ }
116
+ async _retrieveStateWithChecks(retriever, blockNumber, source) {
117
+ const state = await retriever();
118
+ if (state) {
119
+ if (blockNumber === 'latest' ||
120
+ !this._isStateOutdatedForUse(blockNumber, state.blockNumber)) {
121
+ return state;
122
+ }
123
+ else {
124
+ this._immediateLogMessage(`State from ${source} is outdated. Valid for number ${state.blockNumber}, but requested for ${blockNumber}. Diff ${blockNumber - state.blockNumber} blocks`, 'trace');
125
+ }
126
+ }
127
+ else {
128
+ if (source === types_1.StateSources.LOCAL_MEMORY) {
129
+ this._immediateLogMessage(`State is not initialized in memory`, 'error');
130
+ }
131
+ else {
132
+ this._immediateLogMessage(`State from ${source} is not available`, 'trace');
133
+ }
134
+ }
135
+ return null;
136
+ }
137
+ async getState(blockNumber = 'latest', forInitialization = false,
138
+ // If we found that state in memory is outdated, then we save it for future use
139
+ saveInMemory = true) {
140
+ // If it is for initialization purposes, we for sure doesn't have state in memory
141
+ if (!forInitialization) {
142
+ // Try to get with least effort from local memory
143
+ const localState = await this._retrieveStateWithChecks(async () => this._stateWithUpdateInfo ?? null, blockNumber, types_1.StateSources.LOCAL_MEMORY);
144
+ if (localState !== null) {
145
+ return localState;
146
+ }
147
+ }
148
+ // If we failed to get from memory. Try to fetch state from cache
149
+ try {
150
+ const cacheState = await this._retrieveStateWithChecks(async () => (await this.fetchStateFromCache()) ?? null, blockNumber, types_1.StateSources.CACHE);
151
+ if (cacheState !== null) {
152
+ if (saveInMemory) {
153
+ // We want to save latest available state in memory for future use
154
+ // This await shouldn't slow down because if we are slave, we won't save state in cache
155
+ await this.setState(cacheState.value, cacheState.blockNumber, cacheState.lastUpdatedAtMs);
156
+ }
157
+ return cacheState;
158
+ }
159
+ }
160
+ catch (e) {
161
+ this._logMessageWithSuppression(`ERROR_FETCHING_STATE_FROM_CACHE`, e);
162
+ }
163
+ this._logMessageWithSuppression('FALLBACK_TO_RPC');
164
+ // As a last step. If we failed everything above, try to fetch from RPC
165
+ try {
166
+ const rpcState = await this._retrieveStateWithChecks(async () => (await this.fetchLatestStateFromRpc()) ?? null, blockNumber, types_1.StateSources.RPC);
167
+ if (rpcState !== null) {
168
+ if (saveInMemory) {
169
+ // We want to save latest available state in memory for future use
170
+ // This await shouldn't slow down because if we are slave, we won't save state in cache
171
+ await this.setState(rpcState.value, rpcState.blockNumber, rpcState.lastUpdatedAtMs);
172
+ return rpcState;
173
+ }
174
+ }
175
+ }
176
+ catch (e) {
177
+ this._logMessageWithSuppression('ERROR_FETCHING_STATE_FROM_RPC', e);
178
+ }
179
+ // If nothing works, then we can not do anything here and skip this pool
180
+ return null;
181
+ }
182
+ _logMessageWithSuppression(msgKey, ...args) {
183
+ this.logMessagesSuppressor.logMessage(msgKey, this.identifierKey, ...args);
184
+ }
185
+ _immediateLogMessage(message, level, ...args) {
186
+ this.logger[level](`${this.entityName}: ${message}`, ...args);
187
+ }
188
+ get isPoolParticipateInUpdates() {
189
+ return this._isPoolParticipateInUpdates;
190
+ }
191
+ set isPoolParticipateInUpdates(value) {
192
+ // If we change state update status, we always keep relevant info in manager
193
+ value
194
+ ? this.managerCbControllers.enableStateTracking(this.identifierKey)
195
+ : this.managerCbControllers.disableStateTracking(this.identifierKey);
196
+ this._isPoolParticipateInUpdates = value;
197
+ }
198
+ get isPoolInTheMiddleOfUpdate() {
199
+ return this._isPoolInTheMiddleOfUpdate;
200
+ }
201
+ set isPoolInTheMiddleOfUpdate(value) {
202
+ this._isPoolInTheMiddleOfUpdate = value;
203
+ }
204
+ getFetchStateWithBlockInfoMultiCalls() {
205
+ if (this._cachedMultiCallData === undefined) {
206
+ const stateMultiCalls = this._getFetchStateMultiCalls();
207
+ this._cachedMultiCallData = [
208
+ this._getBlockNumberMultiCall,
209
+ ...stateMultiCalls,
210
+ ];
211
+ }
212
+ return this._cachedMultiCallData;
213
+ }
214
+ parseStateFromMultiResultsWithBlockInfo(multiOutputs, lastUpdatedAtMs) {
215
+ // By abstract I mean for abstract method which must be implemented
216
+ const [blockNumber, ...outputsForAbstract] = multiOutputs.map((m, i) => {
217
+ if (!m.success) {
218
+ throw new Error(`${this.entityName} failed to get multicall with index ${i}`);
219
+ }
220
+ return m.returnData;
221
+ });
222
+ return {
223
+ value: this._parseStateFromMultiResults(outputsForAbstract),
224
+ blockNumber,
225
+ lastUpdatedAtMs,
226
+ };
227
+ }
228
+ async fetchLatestStateFromRpc() {
229
+ const multiCalls = this.getFetchStateWithBlockInfoMultiCalls();
230
+ try {
231
+ const lastUpdatedAtMs = Date.now();
232
+ const aggregatedResults = (await this.dexHelper.multiWrapper.tryAggregate(true, multiCalls));
233
+ return this.parseStateFromMultiResultsWithBlockInfo(aggregatedResults, lastUpdatedAtMs);
234
+ }
235
+ catch (e) {
236
+ this._logMessageWithSuppression('ERROR_FETCHING_STATE_FROM_RPC', e);
237
+ }
238
+ return null;
239
+ }
240
+ async setState(state, blockNumber, lastUpdatedAtMs) {
241
+ if (this._stateWithUpdateInfo === undefined) {
242
+ this._stateWithUpdateInfo = {
243
+ value: state,
244
+ blockNumber,
245
+ lastUpdatedAtMs,
246
+ };
247
+ }
248
+ else {
249
+ this._stateWithUpdateInfo.value = state;
250
+ this._stateWithUpdateInfo.blockNumber = blockNumber;
251
+ this._stateWithUpdateInfo.lastUpdatedAtMs = lastUpdatedAtMs;
252
+ }
253
+ // Master version must keep cache up to date
254
+ if (this.isMaster) {
255
+ await this._saveStateInCache();
256
+ }
257
+ }
258
+ async _saveStateInCache() {
259
+ try {
260
+ await this.dexHelper.cache.hset(this.cacheStateKey, this.identifierKey, utils_1.Utils.Serialize(this._stateWithUpdateInfo));
261
+ return true;
262
+ }
263
+ catch (e) {
264
+ this._logMessageWithSuppression('ERROR_SAVING_STATE_IN_CACHE', e);
265
+ }
266
+ return false;
267
+ }
268
+ async _saveLiquidityInCache() {
269
+ try {
270
+ await this.dexHelper.cache.setex(this.dexKey, this.network, this.cacheLiquidityMapKey, this._getExpiryTimeForCachedLiquidity(), JSON.stringify(this._liquidityInUSDWithUpdateInfo));
271
+ return true;
272
+ }
273
+ catch (e) {
274
+ this._logMessageWithSuppression('ERROR_SAVING_LIQUIDITY_IN_CACHE', e);
275
+ }
276
+ return false;
277
+ }
278
+ async fetchStateFromCache() {
279
+ const resultUnparsed = await this.dexHelper.cache.hget(this.cacheStateKey, this.identifierKey);
280
+ if (resultUnparsed !== null) {
281
+ return utils_1.Utils.Parse(resultUnparsed);
282
+ }
283
+ return null;
284
+ }
285
+ async _fetchLiquidityFromCache() {
286
+ const resultUnparsed = await this.dexHelper.cache.get(this.dexKey, this.network, this.cacheStateKey);
287
+ if (resultUnparsed !== null) {
288
+ return utils_1.Utils.Parse(resultUnparsed);
289
+ }
290
+ return null;
291
+ }
292
+ async setLiquidity(newLiquidityInUSD, lastUpdatedAtMs, blockNumber) {
293
+ this._liquidityInUSDWithUpdateInfo.value = newLiquidityInUSD;
294
+ this._liquidityInUSDWithUpdateInfo.lastUpdatedAtMs = lastUpdatedAtMs;
295
+ this._liquidityInUSDWithUpdateInfo.blockNumber = blockNumber || 0;
296
+ this._adjustIsStateToBeUpdated();
297
+ if (this.isMaster) {
298
+ await this._saveLiquidityInCache();
299
+ }
300
+ }
301
+ _adjustIsStateToBeUpdated() {
302
+ if (this.isLiquidityTracked) {
303
+ if (Date.now() - this._liquidityInUSDWithUpdateInfo.lastUpdatedAtMs >
304
+ this.liquidityUpdateAllowedDelayMs) {
305
+ this._logMessageWithSuppression('LIQUIDITY_INFO_IS_OUTDATED', `Last updated at ${this._liquidityInUSDWithUpdateInfo.lastUpdatedAtMs}`);
306
+ this.isPoolParticipateInUpdates = true;
307
+ }
308
+ else {
309
+ this.isPoolParticipateInUpdates =
310
+ this._liquidityInUSDWithUpdateInfo.value >=
311
+ this.liquidityThresholdForUpdate;
312
+ }
313
+ }
314
+ }
315
+ _getExpiryTimeForCachedLiquidity() {
316
+ // Give it 10 minutes margin to recover
317
+ return Math.floor(this.liquidityUpdatePeriodMs / 1000) + 10 * 60 * 1000;
318
+ }
319
+ async initializeState() {
320
+ try {
321
+ const state = await this.fetchLatestStateFromRpc();
322
+ if (state === null) {
323
+ this.logger.error(`initializePool: pool=${this.identifierKey} from ${this.dexKey} state is null. Retry in ${DEFAULT_STATE_INIT_RETRY_MS} ms`);
324
+ }
325
+ else {
326
+ this.setState(state.value, state.blockNumber, state.lastUpdatedAtMs);
327
+ return;
328
+ }
329
+ }
330
+ catch (e) {
331
+ this.logger.error(`initializePool: pool=${this.identifierKey} from ${this.dexKey} failed to initialize state from RPC. Retry in ${DEFAULT_STATE_INIT_RETRY_MS} ms`, e);
332
+ }
333
+ setTimeout(() => this.initializeState(), DEFAULT_STATE_INIT_RETRY_MS);
334
+ }
335
+ }
336
+ exports.StatefulRpcPoller = StatefulRpcPoller;
337
+ StatefulRpcPoller.StatefulRPCPollerMessages = {
338
+ ERROR_FETCHING_STATE_FROM_CACHE: {
339
+ key: 'ERROR_FETCHING_STATE_FROM_CACHE',
340
+ message: StatefulRPCPollerMessages.ERROR_FETCHING_STATE_FROM_CACHE,
341
+ logLevel: 'error',
342
+ },
343
+ ERROR_FETCHING_STATE_FROM_RPC: {
344
+ key: 'ERROR_FETCHING_STATE_FROM_RPC',
345
+ message: StatefulRPCPollerMessages.ERROR_FETCHING_STATE_FROM_RPC,
346
+ logLevel: 'error',
347
+ },
348
+ ERROR_SAVING_LIQUIDITY_IN_CACHE: {
349
+ key: 'ERROR_SAVING_LIQUIDITY_IN_CACHE',
350
+ message: StatefulRPCPollerMessages.ERROR_SAVING_LIQUIDITY_IN_CACHE,
351
+ logLevel: 'error',
352
+ },
353
+ ERROR_SAVING_STATE_IN_CACHE: {
354
+ key: 'ERROR_SAVING_STATE_IN_CACHE',
355
+ message: StatefulRPCPollerMessages.ERROR_SAVING_STATE_IN_CACHE,
356
+ logLevel: 'error',
357
+ },
358
+ LIQUIDITY_INFO_IS_OUTDATED: {
359
+ key: 'LIQUIDITY_INFO_IS_OUTDATED',
360
+ message: StatefulRPCPollerMessages.LIQUIDITY_INFO_IS_OUTDATED,
361
+ logLevel: 'error',
362
+ },
363
+ FALLBACK_TO_RPC: {
364
+ key: 'FALLBACK_TO_RPC',
365
+ message: StatefulRPCPollerMessages.FALLBACK_TO_RPC,
366
+ logLevel: 'warn',
367
+ },
368
+ };
369
+ //# sourceMappingURL=stateful-rpc-poller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stateful-rpc-poller.js","sourceRoot":"","sources":["../../../src/lib/stateful-rpc-poller/stateful-rpc-poller.ts"],"names":[],"mappings":"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"}