@paraswap/dex-lib 2.12.12-rfqtests.0 → 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.
- package/build/abi/augustus.json +375 -0
- package/build/abi/woo-fi-v2/IntegrationHelper.abi.json +116 -0
- package/build/abi/woo-fi-v2/WooOracleV2.abi.json +358 -0
- package/build/abi/woo-fi-v2/WooPPV2.abi.json +580 -0
- package/build/config.js +3 -3
- package/build/dex/aave-v3/tokens/arbitrum.json +20 -20
- package/build/dex/aave-v3/tokens/avalanche.json +44 -20
- package/build/dex/aave-v3/tokens/fantom.json +30 -30
- package/build/dex/aave-v3/tokens/optimism.json +18 -18
- package/build/dex/aave-v3/tokens/polygon.json +60 -42
- package/build/dex/generic-rfq/validators.d.ts +1 -1
- package/build/dex/generic-rfq/validators.js +26 -36
- package/build/dex/generic-rfq/validators.js.map +1 -1
- package/build/dex/hashflow/rate-fetcher.d.ts +14 -0
- package/build/dex/hashflow/rate-fetcher.js +37 -0
- package/build/dex/hashflow/rate-fetcher.js.map +1 -0
- package/build/dex/hashflow/validators.d.ts +3 -0
- package/build/dex/hashflow/validators.js +12 -0
- package/build/dex/hashflow/validators.js.map +1 -0
- package/build/dex/{test-aave-v3 → test-dex}/config.d.ts +1 -1
- package/build/dex/{test-aave-v3 → test-dex}/config.js +3 -3
- package/build/dex/test-dex/config.js.map +1 -0
- package/build/dex/{test-aave-v3/test-aave-v3-pool.d.ts → test-dex/test-dex-pool.d.ts} +3 -3
- package/build/dex/{test-aave-v3/test-aave-v3-pool.js → test-dex/test-dex-pool.js} +7 -7
- package/build/dex/test-dex/test-dex-pool.js.map +1 -0
- package/build/dex/{test-aave-v3/test-aave-v3.d.ts → test-dex/test-dex.d.ts} +8 -8
- package/build/dex/{test-aave-v3/test-aave-v3.js → test-dex/test-dex.js} +7 -7
- package/build/dex/test-dex/test-dex.js.map +1 -0
- package/build/dex/{test-aave-v3 → test-dex}/types.d.ts +1 -1
- package/build/dex/{test-aave-v3 → test-dex}/types.js.map +1 -1
- package/build/dex/uniswap-v3/config.js +13 -0
- package/build/dex/uniswap-v3/config.js.map +1 -1
- package/build/dex/woo-fi-v2/config.d.ts +4 -0
- package/build/dex/woo-fi-v2/config.js +87 -0
- package/build/dex/woo-fi-v2/config.js.map +1 -0
- package/build/dex/woo-fi-v2/constants.d.ts +5 -0
- package/build/dex/woo-fi-v2/constants.js +15 -0
- package/build/dex/woo-fi-v2/constants.js.map +1 -0
- package/build/dex/woo-fi-v2/decoders.d.ts +6 -0
- package/build/dex/woo-fi-v2/decoders.js +29 -0
- package/build/dex/woo-fi-v2/decoders.js.map +1 -0
- package/build/dex/woo-fi-v2/types.d.ts +41 -0
- package/build/dex/woo-fi-v2/types.js +3 -0
- package/build/dex/woo-fi-v2/types.js.map +1 -0
- package/build/dex/woo-fi-v2/utils.d.ts +2 -0
- package/build/dex/woo-fi-v2/utils.js +24 -0
- package/build/dex/woo-fi-v2/utils.js.map +1 -0
- package/build/dex/woo-fi-v2/woo-fi-math.d.ts +16 -0
- package/build/dex/woo-fi-v2/woo-fi-math.js +137 -0
- package/build/dex/woo-fi-v2/woo-fi-math.js.map +1 -0
- package/build/dex/woo-fi-v2/woo-fi-v2-math.d.ts +16 -0
- package/build/dex/woo-fi-v2/woo-fi-v2-math.js +137 -0
- package/build/dex/woo-fi-v2/woo-fi-v2-math.js.map +1 -0
- package/build/dex/woo-fi-v2/woo-fi-v2-pool.d.ts +12 -0
- package/build/dex/woo-fi-v2/woo-fi-v2-pool.js +79 -0
- package/build/dex/woo-fi-v2/woo-fi-v2-pool.js.map +1 -0
- package/build/dex/woo-fi-v2/woo-fi-v2.d.ts +52 -0
- package/build/dex/woo-fi-v2/woo-fi-v2.js +310 -0
- package/build/dex/woo-fi-v2/woo-fi-v2.js.map +1 -0
- package/build/lib/log-messages-suppressor.d.ts +30 -0
- package/build/lib/log-messages-suppressor.js +107 -0
- package/build/lib/log-messages-suppressor.js.map +1 -0
- package/build/lib/stateful-rpc-poller/state-polling-manager.d.ts +23 -0
- package/build/lib/stateful-rpc-poller/state-polling-manager.js +173 -0
- package/build/lib/stateful-rpc-poller/state-polling-manager.js.map +1 -0
- package/build/lib/stateful-rpc-poller/stateful-rpc-poller.d.ts +72 -0
- package/build/lib/stateful-rpc-poller/stateful-rpc-poller.js +369 -0
- package/build/lib/stateful-rpc-poller/stateful-rpc-poller.js.map +1 -0
- package/build/lib/stateful-rpc-poller/types.d.ts +35 -0
- package/build/lib/stateful-rpc-poller/types.js +10 -0
- package/build/lib/stateful-rpc-poller/types.js.map +1 -0
- package/build/lib/stateful-rpc-poller/utils.d.ts +4 -0
- package/build/lib/stateful-rpc-poller/utils.js +17 -0
- package/build/lib/stateful-rpc-poller/utils.js.map +1 -0
- package/build/lib/validators.d.ts +7 -0
- package/build/lib/validators.js +27 -0
- package/build/lib/validators.js.map +1 -0
- package/package.json +1 -1
- package/src/config.ts +3 -3
- package/src/dex/generic-rfq/generic-rfq-e2e.test.ts +71 -85
- package/src/dex/generic-rfq/validators.test.ts +32 -6
- package/src/dex/generic-rfq/validators.ts +32 -57
- package/src/dex/uniswap-v3/config.ts +13 -0
- package/src/dex/uniswap-v3/uniswap-v3-e2e.test.ts +76 -0
- package/tests/constants-e2e.ts +0 -2
- package/tests/utils-e2e.ts +48 -59
- package/.idea/codeStyles/codeStyleConfig.xml +0 -5
- package/.idea/misc.xml +0 -6
- package/.idea/modules.xml +0 -8
- package/.idea/vcs.xml +0 -6
- package/.vscode/launch.json +0 -21
- package/build/dex/aave-v3/tokens/mainnet.json +0 -44
- package/build/dex/balancer-v2/VirtualBoostedPool.d.ts +0 -79
- package/build/dex/balancer-v2/VirtualBoostedPool.js +0 -382
- package/build/dex/balancer-v2/VirtualBoostedPool.js.map +0 -1
- package/build/dex/test-aave-v3/config.js.map +0 -1
- package/build/dex/test-aave-v3/test-aave-v3-pool.js.map +0 -1
- package/build/dex/test-aave-v3/test-aave-v3.js.map +0 -1
- package/src/dex/generic-rfq/generic-rfq-e2e-arbitrum.test.ts +0 -360
- package/src/dex/generic-rfq/generic-rfq-e2e-bsc.test.ts +0 -346
- package/src/dex/generic-rfq/generic-rfq-e2e-polygon.test.ts +0 -360
- /package/build/dex/{test-aave-v3 → test-dex}/types.js +0 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Logger, LogLevels } from '../types';
|
|
2
|
+
export declare const DEFAULT_LOG_PUBLISH_PERIOD_MS = 60000;
|
|
3
|
+
export declare const DEFAULT_LOG_DISCARD_PERIOD_MS: number;
|
|
4
|
+
export declare const DEFAULT_LOG_MAX_IDENTITIES_TO_SHOW = 10;
|
|
5
|
+
export declare type StandardStringEnum = Readonly<Record<string, string>>;
|
|
6
|
+
export declare type MessageInfo<T extends StandardStringEnum> = {
|
|
7
|
+
key: keyof T;
|
|
8
|
+
message: T[keyof T];
|
|
9
|
+
logLevel: LogLevels;
|
|
10
|
+
};
|
|
11
|
+
export declare type MessageData = {
|
|
12
|
+
counter: number;
|
|
13
|
+
lastLoggedAtMs: number;
|
|
14
|
+
identificationInfos: string[];
|
|
15
|
+
};
|
|
16
|
+
export declare type AggregatedLogForEntity<T extends StandardStringEnum> = {
|
|
17
|
+
[key in keyof T]?: MessageData;
|
|
18
|
+
};
|
|
19
|
+
export declare class LogMessagesSuppressor<T extends StandardStringEnum> {
|
|
20
|
+
readonly entityName: string;
|
|
21
|
+
private _allMessages;
|
|
22
|
+
protected logger: Logger;
|
|
23
|
+
static instances: Record<string, LogMessagesSuppressor<any>>;
|
|
24
|
+
private _aggregatedLogs;
|
|
25
|
+
constructor(entityName: string, _allMessages: Record<keyof T, MessageInfo<T>>, logger: Logger);
|
|
26
|
+
static getLogSuppressorInstance<T extends StandardStringEnum>(entityName: string, allMessages: Record<keyof T, MessageInfo<T>>, logger: Logger): LogMessagesSuppressor<any>;
|
|
27
|
+
logMessage(msgKey: keyof T, identificationInfo?: string, ...args: unknown[]): void;
|
|
28
|
+
private _formatLogMessage;
|
|
29
|
+
private _clearMessageData;
|
|
30
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
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.LogMessagesSuppressor = exports.DEFAULT_LOG_MAX_IDENTITIES_TO_SHOW = exports.DEFAULT_LOG_DISCARD_PERIOD_MS = exports.DEFAULT_LOG_PUBLISH_PERIOD_MS = void 0;
|
|
7
|
+
const ts_essentials_1 = require("ts-essentials");
|
|
8
|
+
const lodash_1 = __importDefault(require("lodash"));
|
|
9
|
+
exports.DEFAULT_LOG_PUBLISH_PERIOD_MS = 60000;
|
|
10
|
+
// After this period previous logs, even if unpublished, would be discarded
|
|
11
|
+
// Because most likely they are outdated
|
|
12
|
+
exports.DEFAULT_LOG_DISCARD_PERIOD_MS = 15 * 60 * 1000;
|
|
13
|
+
// We may have hundreds of pools failing at the same time,
|
|
14
|
+
// and we don't want to show them all
|
|
15
|
+
exports.DEFAULT_LOG_MAX_IDENTITIES_TO_SHOW = 10;
|
|
16
|
+
/*
|
|
17
|
+
* This is helper module to reduce frequency of logging of spamming messages
|
|
18
|
+
*
|
|
19
|
+
* 1. You can only have predefined set of log messages to log
|
|
20
|
+
* First time log message is received, it is published with all arguments.
|
|
21
|
+
* Limitation - message can not include variables, but you can pass them as args
|
|
22
|
+
* If within cooldown period received another message of the same category, it
|
|
23
|
+
* is not published, but counter is increased with addition of some entity identifier
|
|
24
|
+
*
|
|
25
|
+
* 2. There is no background task running. In order to keep relevance of logs,
|
|
26
|
+
* if after certain amount of time we didn't receive logs, then we discarded accumulated ones
|
|
27
|
+
* on the next received ones and only publish relevant ones
|
|
28
|
+
*/
|
|
29
|
+
class LogMessagesSuppressor {
|
|
30
|
+
constructor(entityName, _allMessages, logger) {
|
|
31
|
+
this.entityName = entityName;
|
|
32
|
+
this._allMessages = _allMessages;
|
|
33
|
+
this.logger = logger;
|
|
34
|
+
this._aggregatedLogs = {};
|
|
35
|
+
}
|
|
36
|
+
static getLogSuppressorInstance(entityName, allMessages, logger) {
|
|
37
|
+
const instance = LogMessagesSuppressor.instances[entityName];
|
|
38
|
+
if (instance === undefined) {
|
|
39
|
+
LogMessagesSuppressor.instances[entityName] =
|
|
40
|
+
new LogMessagesSuppressor(entityName, allMessages, logger);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
(0, ts_essentials_1.assert)(lodash_1.default.isEqual(allMessages, instance._allMessages), 'getLogSuppressorInstance: try to get existing instance with different allMessagesInfo');
|
|
44
|
+
(0, ts_essentials_1.assert)(lodash_1.default.isEqual(logger, instance.logger), 'getLogSuppressorInstance: try to get existing instance with different logger');
|
|
45
|
+
}
|
|
46
|
+
return LogMessagesSuppressor.instances[entityName];
|
|
47
|
+
}
|
|
48
|
+
logMessage(msgKey, identificationInfo = '', ...args) {
|
|
49
|
+
const msgInfo = this._allMessages[msgKey];
|
|
50
|
+
(0, ts_essentials_1.assert)(msgInfo !== undefined, `Used unrecognized msgKey=${String(msgKey)} to get msgInfo`);
|
|
51
|
+
if (this._aggregatedLogs[msgKey] === undefined) {
|
|
52
|
+
this._aggregatedLogs[msgKey] = {
|
|
53
|
+
counter: 0,
|
|
54
|
+
identificationInfos: identificationInfo === '' ? [] : [identificationInfo],
|
|
55
|
+
lastLoggedAtMs: 0,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
const msgData = this._aggregatedLogs[msgKey];
|
|
59
|
+
(0, ts_essentials_1.assert)(msgData !== undefined, `msgData is undefined for msgKey=${String(msgKey)}`);
|
|
60
|
+
const nowMs = Date.now();
|
|
61
|
+
const elapsedSinceLastPublish = nowMs - msgData.lastLoggedAtMs;
|
|
62
|
+
if (elapsedSinceLastPublish > exports.DEFAULT_LOG_PUBLISH_PERIOD_MS) {
|
|
63
|
+
// Accumulated logs are too old to have any relevance, so better to discard them
|
|
64
|
+
if (elapsedSinceLastPublish > exports.DEFAULT_LOG_DISCARD_PERIOD_MS) {
|
|
65
|
+
this._clearMessageData(msgData);
|
|
66
|
+
}
|
|
67
|
+
// Make actual logging
|
|
68
|
+
// Logging is done using original logger of the entity to keep module info
|
|
69
|
+
// and not override it
|
|
70
|
+
this.logger[msgInfo.logLevel](this._formatLogMessage(msgData, msgInfo.message), ...args);
|
|
71
|
+
this._clearMessageData(msgData);
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
msgData.counter++;
|
|
75
|
+
if (identificationInfo !== '') {
|
|
76
|
+
msgData.identificationInfos.push(identificationInfo);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
_formatLogMessage(msgData, message) {
|
|
81
|
+
const { counter, identificationInfos } = msgData;
|
|
82
|
+
let identities = identificationInfos && identificationInfos.length === 0
|
|
83
|
+
? ''
|
|
84
|
+
: ` for entities: ${identificationInfos.length > exports.DEFAULT_LOG_MAX_IDENTITIES_TO_SHOW
|
|
85
|
+
? identificationInfos
|
|
86
|
+
.slice(exports.DEFAULT_LOG_MAX_IDENTITIES_TO_SHOW)
|
|
87
|
+
.join(',')
|
|
88
|
+
: identificationInfos.join(',')}`;
|
|
89
|
+
if (identificationInfos &&
|
|
90
|
+
identificationInfos.length > exports.DEFAULT_LOG_MAX_IDENTITIES_TO_SHOW) {
|
|
91
|
+
identities = `${identities}... ${identificationInfos.length} total`;
|
|
92
|
+
}
|
|
93
|
+
return `${this.entityName}: logged ${counter} occurrences of: "${message}"${identities}. `;
|
|
94
|
+
}
|
|
95
|
+
_clearMessageData(messageData) {
|
|
96
|
+
messageData.counter = 0;
|
|
97
|
+
if (messageData.identificationInfos) {
|
|
98
|
+
messageData.identificationInfos.length = 0;
|
|
99
|
+
}
|
|
100
|
+
messageData.lastLoggedAtMs = Date.now();
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
exports.LogMessagesSuppressor = LogMessagesSuppressor;
|
|
104
|
+
// I don't really like this any, but couldn't come up with better solution
|
|
105
|
+
// in reasonable time. So, in order to unblock myself, do this
|
|
106
|
+
LogMessagesSuppressor.instances = {};
|
|
107
|
+
//# sourceMappingURL=log-messages-suppressor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-messages-suppressor.js","sourceRoot":"","sources":["../../src/lib/log-messages-suppressor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { IDexHelper } from '../../dex-helper';
|
|
2
|
+
import { IStatefulRpcPoller } from './types';
|
|
3
|
+
export declare class StatePollingManager {
|
|
4
|
+
protected dexHelper: IDexHelper;
|
|
5
|
+
private static __instances;
|
|
6
|
+
static getInstance(dexHelper: IDexHelper): StatePollingManager;
|
|
7
|
+
private _lastProcessedBlockNumber;
|
|
8
|
+
private logger;
|
|
9
|
+
private _registeredPendingPools;
|
|
10
|
+
private _poolsToInstances;
|
|
11
|
+
private _poolsToBeUpdated;
|
|
12
|
+
private _idlePools;
|
|
13
|
+
private constructor();
|
|
14
|
+
get isMaster(): boolean;
|
|
15
|
+
enableStateTracking(identifierKey: string): void;
|
|
16
|
+
disableStateTracking(identifierKey: string): void;
|
|
17
|
+
onBlockNumber(blockNumber: number): Promise<void>;
|
|
18
|
+
protected _updatePoolStates(poolsToBeUpdated: IStatefulRpcPoller<any, any>[], blockNumber?: number | 'latest', numberOfChunks?: number): Promise<number>;
|
|
19
|
+
private _keyToPoolInstance;
|
|
20
|
+
initializeAllPendingPools(): void;
|
|
21
|
+
registerPendingPool<T, M>(statefulRpcPoller: IStatefulRpcPoller<T, M>): void;
|
|
22
|
+
initializePool<T, M>(statefulRpcPoller: IStatefulRpcPoller<T, M>): void;
|
|
23
|
+
}
|
|
@@ -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 {};
|