@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,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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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { MultiCallParams, MultiResult } from '../multi-wrapper';
|
|
2
|
+
export declare type ObjWithUpdateInfo<T> = {
|
|
3
|
+
value: T;
|
|
4
|
+
blockNumber: number;
|
|
5
|
+
lastUpdatedAtMs: number;
|
|
6
|
+
};
|
|
7
|
+
export interface IStatefulRpcPoller<State, M> {
|
|
8
|
+
identifierKey: string;
|
|
9
|
+
dexKey: string;
|
|
10
|
+
isPoolParticipateInUpdates: boolean;
|
|
11
|
+
isPoolInTheMiddleOfUpdate: boolean;
|
|
12
|
+
network: number;
|
|
13
|
+
isTimeToTriggerUpdate(blockNumber: number): boolean;
|
|
14
|
+
getFetchStateWithBlockInfoMultiCalls(): [
|
|
15
|
+
MultiCallParams<number>,
|
|
16
|
+
...MultiCallParams<M>[]
|
|
17
|
+
];
|
|
18
|
+
parseStateFromMultiResultsWithBlockInfo(multiOutputs: [MultiResult<number>, ...MultiResult<M>[]], lastUpdatedAtMs: number): ObjWithUpdateInfo<State>;
|
|
19
|
+
setState(state: State, blockNumber: number, lastUpdatedAtMs: number): Promise<void>;
|
|
20
|
+
fetchStateFromCache(): Promise<ObjWithUpdateInfo<State> | null>;
|
|
21
|
+
fetchLatestStateFromRpc(): Promise<ObjWithUpdateInfo<State> | null>;
|
|
22
|
+
initializeState(): Promise<void>;
|
|
23
|
+
getState(blockNumber: number): Promise<ObjWithUpdateInfo<State> | null>;
|
|
24
|
+
setLiquidity(newLiquidityInUSD: number, lastUpdatedAtMs: number, blockNumber?: number): Promise<void>;
|
|
25
|
+
}
|
|
26
|
+
export declare type PollingManagerControllersCb = {
|
|
27
|
+
enableStateTracking: (identifierKey: string) => void;
|
|
28
|
+
disableStateTracking: (identifierKey: string) => void;
|
|
29
|
+
registerPendingPool: <T, M>(statefulRpcPoller: IStatefulRpcPoller<T, M>) => void;
|
|
30
|
+
};
|
|
31
|
+
export declare enum StateSources {
|
|
32
|
+
LOCAL_MEMORY = "local_memory",
|
|
33
|
+
CACHE = "cache",
|
|
34
|
+
RPC = "rpc"
|
|
35
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.StateSources = void 0;
|
|
4
|
+
var StateSources;
|
|
5
|
+
(function (StateSources) {
|
|
6
|
+
StateSources["LOCAL_MEMORY"] = "local_memory";
|
|
7
|
+
StateSources["CACHE"] = "cache";
|
|
8
|
+
StateSources["RPC"] = "rpc";
|
|
9
|
+
})(StateSources = exports.StateSources || (exports.StateSources = {}));
|
|
10
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lib/stateful-rpc-poller/types.ts"],"names":[],"mappings":";;;AA6DA,IAAY,YAIX;AAJD,WAAY,YAAY;IACtB,6CAA6B,CAAA;IAC7B,+BAAe,CAAA;IACf,2BAAW,CAAA;AACb,CAAC,EAJW,YAAY,GAAZ,oBAAY,KAAZ,oBAAY,QAIvB"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { StatePollingManager } from './state-polling-manager';
|
|
2
|
+
import { PollingManagerControllersCb } from './types';
|
|
3
|
+
export declare function getIdentifierKeyForRpcPoller(poolIdentifier: string, network: number): string;
|
|
4
|
+
export declare function pollingManagerCbExtractor(statePollingManager: StatePollingManager): PollingManagerControllersCb;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.pollingManagerCbExtractor = exports.getIdentifierKeyForRpcPoller = void 0;
|
|
4
|
+
function getIdentifierKeyForRpcPoller(poolIdentifier, network) {
|
|
5
|
+
return `${network}_${poolIdentifier}`.toLowerCase();
|
|
6
|
+
}
|
|
7
|
+
exports.getIdentifierKeyForRpcPoller = getIdentifierKeyForRpcPoller;
|
|
8
|
+
// Helper function to extract relevant call backs for later use
|
|
9
|
+
function pollingManagerCbExtractor(statePollingManager) {
|
|
10
|
+
return {
|
|
11
|
+
enableStateTracking: statePollingManager.enableStateTracking.bind(statePollingManager),
|
|
12
|
+
disableStateTracking: statePollingManager.disableStateTracking.bind(statePollingManager),
|
|
13
|
+
registerPendingPool: statePollingManager.registerPendingPool.bind(statePollingManager),
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
exports.pollingManagerCbExtractor = pollingManagerCbExtractor;
|
|
17
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/lib/stateful-rpc-poller/utils.ts"],"names":[],"mappings":";;;AAGA,SAAgB,4BAA4B,CAC1C,cAAsB,EACtB,OAAe;IAEf,OAAO,GAAG,OAAO,IAAI,cAAc,EAAE,CAAC,WAAW,EAAE,CAAC;AACtD,CAAC;AALD,oEAKC;AAED,+DAA+D;AAC/D,SAAgB,yBAAyB,CACvC,mBAAwC;IAExC,OAAO;QACL,mBAAmB,EACjB,mBAAmB,CAAC,mBAAmB,CAAC,IAAI,CAAC,mBAAmB,CAAC;QACnE,oBAAoB,EAClB,mBAAmB,CAAC,oBAAoB,CAAC,IAAI,CAAC,mBAAmB,CAAC;QACpE,mBAAmB,EACjB,mBAAmB,CAAC,mBAAmB,CAAC,IAAI,CAAC,mBAAmB,CAAC;KACpE,CAAC;AACJ,CAAC;AAXD,8DAWC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import joi from 'joi';
|
|
2
|
+
export declare class ValidationError extends Error {
|
|
3
|
+
readonly rawMessage: string;
|
|
4
|
+
readonly key?: string;
|
|
5
|
+
constructor(message: string, key?: string);
|
|
6
|
+
}
|
|
7
|
+
export declare const validateAndCast: <T>(value: unknown, schema: joi.Schema, name?: string | undefined) => T;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validateAndCast = exports.ValidationError = void 0;
|
|
4
|
+
class ValidationError extends Error {
|
|
5
|
+
constructor(message, key) {
|
|
6
|
+
super(key !== undefined ? `'${key}': ${message}` : message);
|
|
7
|
+
this.rawMessage = message;
|
|
8
|
+
this.key = key;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
exports.ValidationError = ValidationError;
|
|
12
|
+
const validateAndCast = (value, schema, name) => {
|
|
13
|
+
const { error, value: parsed } = schema.validate(value);
|
|
14
|
+
if (error !== undefined) {
|
|
15
|
+
let message;
|
|
16
|
+
if (name) {
|
|
17
|
+
message = `"${name}" ${error.message.slice(error.message.indexOf('must'))}`;
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
message = error.message;
|
|
21
|
+
}
|
|
22
|
+
throw new ValidationError(message);
|
|
23
|
+
}
|
|
24
|
+
return parsed;
|
|
25
|
+
};
|
|
26
|
+
exports.validateAndCast = validateAndCast;
|
|
27
|
+
//# sourceMappingURL=validators.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validators.js","sourceRoot":"","sources":["../../src/lib/validators.ts"],"names":[],"mappings":";;;AAEA,MAAa,eAAgB,SAAQ,KAAK;IAKxC,YAAY,OAAe,EAAE,GAAY;QACvC,KAAK,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,GAAG,MAAM,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAC5D,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC;QAC1B,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IACjB,CAAC;CACF;AAVD,0CAUC;AAEM,MAAM,eAAe,GAAG,CAC7B,KAAc,EACd,MAAkB,EAClB,IAAa,EACV,EAAE;IACL,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAExD,IAAI,KAAK,KAAK,SAAS,EAAE;QACvB,IAAI,OAAO,CAAC;QACZ,IAAI,IAAI,EAAE;YACR,OAAO,GAAG,IAAI,IAAI,KAAK,KAAK,CAAC,OAAO,CAAC,KAAK,CACxC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAC9B,EAAE,CAAC;SACL;aAAM;YACL,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;SACzB;QACD,MAAM,IAAI,eAAe,CAAC,OAAO,CAAC,CAAC;KACpC;IACD,OAAO,MAAW,CAAC;AACrB,CAAC,CAAC;AAnBW,QAAA,eAAe,mBAmB1B"}
|
package/package.json
CHANGED
package/src/config.ts
CHANGED
|
@@ -151,9 +151,9 @@ const baseConfigs: { [network: number]: BaseConfig } = {
|
|
|
151
151
|
hashFlowDisabledMMs:
|
|
152
152
|
process.env[`HASHFLOW_DISABLED_MMS_56`]?.split(',') || [],
|
|
153
153
|
adapterAddresses: {
|
|
154
|
-
BscAdapter01: '
|
|
155
|
-
BscAdapter02: '
|
|
156
|
-
BscBuyAdapter: '
|
|
154
|
+
BscAdapter01: '0xA31d9C571DF00e0F428B0bD24c34D103E8112222',
|
|
155
|
+
BscAdapter02: '0xe102429Ef7CAaBaAA3bc2C017aC784c5F665EE82',
|
|
156
|
+
BscBuyAdapter: '0xA7f4fBCEB76a1B1c05C106a4289C28B3b91C17ca',
|
|
157
157
|
},
|
|
158
158
|
uniswapV2ExchangeRouterAddress:
|
|
159
159
|
'0x53e693c6C7FFC4446c53B205Cf513105Bf140D7b',
|