@paraswap/dex-lib 2.49.2-dackieswapv3-base.0 → 2.49.2-hashflow

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 (175) hide show
  1. package/build/abi/Redstone.json +739 -0
  2. package/build/abi/angle/stagToken.json +963 -0
  3. package/build/abi/angle-transmuter/MorphoOracle.json +193 -0
  4. package/build/abi/angle-transmuter/MorphoVault.json +2506 -0
  5. package/build/abi/angle-transmuter/Pyth.json +1534 -0
  6. package/build/abi/angle-transmuter/Transmuter.json +1711 -0
  7. package/build/abi/pharaoh/PharaohPool.abi.json +1582 -0
  8. package/build/abi/smardex/smardex-factory.json +185 -0
  9. package/build/abi/smardex/smardex-pool.json +578 -0
  10. package/build/abi/smardex/smardex-router.json +648 -0
  11. package/build/abi/trader-joe-v2_1/FactoryABI.json +1208 -0
  12. package/build/abi/trader-joe-v2_1/PairABI.json +1493 -0
  13. package/build/abi/trader-joe-v2_1/RouterABI.json +1489 -0
  14. package/build/abi/trader-joe-v2_1/StateMulticall.json +193 -0
  15. package/build/dex/angle-staked-stable/angle-staked-stable-pool.d.ts +55 -0
  16. package/build/dex/angle-staked-stable/angle-staked-stable-pool.js +183 -0
  17. package/build/dex/angle-staked-stable/angle-staked-stable-pool.js.map +1 -0
  18. package/build/dex/angle-staked-stable/angle-staked-stable.d.ts +50 -0
  19. package/build/dex/angle-staked-stable/angle-staked-stable.js +278 -0
  20. package/build/dex/angle-staked-stable/angle-staked-stable.js.map +1 -0
  21. package/build/dex/angle-staked-stable/config.d.ts +4 -0
  22. package/build/dex/angle-staked-stable/config.js +131 -0
  23. package/build/dex/angle-staked-stable/config.js.map +1 -0
  24. package/build/dex/angle-staked-stable/types.d.ts +17 -0
  25. package/build/dex/angle-staked-stable/types.js +3 -0
  26. package/build/dex/angle-staked-stable/types.js.map +1 -0
  27. package/build/dex/angle-transmuter/angle-transmuter-pool.d.ts +61 -0
  28. package/build/dex/angle-transmuter/angle-transmuter-pool.js +415 -0
  29. package/build/dex/angle-transmuter/angle-transmuter-pool.js.map +1 -0
  30. package/build/dex/angle-transmuter/angle-transmuter.d.ts +59 -0
  31. package/build/dex/angle-transmuter/angle-transmuter.js +262 -0
  32. package/build/dex/angle-transmuter/angle-transmuter.js.map +1 -0
  33. package/build/dex/angle-transmuter/backedOracle.d.ts +19 -0
  34. package/build/dex/angle-transmuter/backedOracle.js +56 -0
  35. package/build/dex/angle-transmuter/backedOracle.js.map +1 -0
  36. package/build/dex/angle-transmuter/config.d.ts +4 -0
  37. package/build/dex/angle-transmuter/config.js +30 -0
  38. package/build/dex/angle-transmuter/config.js.map +1 -0
  39. package/build/dex/angle-transmuter/constants.d.ts +77 -0
  40. package/build/dex/angle-transmuter/constants.js +94 -0
  41. package/build/dex/angle-transmuter/constants.js.map +1 -0
  42. package/build/dex/angle-transmuter/morphoOracle.d.ts +42 -0
  43. package/build/dex/angle-transmuter/morphoOracle.js +179 -0
  44. package/build/dex/angle-transmuter/morphoOracle.js.map +1 -0
  45. package/build/dex/angle-transmuter/morphoVault.d.ts +19 -0
  46. package/build/dex/angle-transmuter/morphoVault.js +78 -0
  47. package/build/dex/angle-transmuter/morphoVault.js.map +1 -0
  48. package/build/dex/angle-transmuter/pyth.d.ts +19 -0
  49. package/build/dex/angle-transmuter/pyth.js +70 -0
  50. package/build/dex/angle-transmuter/pyth.js.map +1 -0
  51. package/build/dex/angle-transmuter/redstone.d.ts +20 -0
  52. package/build/dex/angle-transmuter/redstone.js +73 -0
  53. package/build/dex/angle-transmuter/redstone.js.map +1 -0
  54. package/build/dex/angle-transmuter/transmuter.d.ts +52 -0
  55. package/build/dex/angle-transmuter/transmuter.js +374 -0
  56. package/build/dex/angle-transmuter/transmuter.js.map +1 -0
  57. package/build/dex/angle-transmuter/types.d.ts +188 -0
  58. package/build/dex/angle-transmuter/types.js +33 -0
  59. package/build/dex/angle-transmuter/types.js.map +1 -0
  60. package/build/dex/angle-transmuter/utils.d.ts +9 -0
  61. package/build/dex/angle-transmuter/utils.js +252 -0
  62. package/build/dex/angle-transmuter/utils.js.map +1 -0
  63. package/build/dex/hashflow/constants.d.ts +27 -0
  64. package/build/dex/hashflow/constants.js +29 -1
  65. package/build/dex/hashflow/constants.js.map +1 -1
  66. package/build/dex/hashflow/hashflow.d.ts +3 -2
  67. package/build/dex/hashflow/hashflow.js +77 -12
  68. package/build/dex/hashflow/hashflow.js.map +1 -1
  69. package/build/dex/hashflow/types.d.ts +11 -0
  70. package/build/dex/hashflow/types.js +9 -0
  71. package/build/dex/hashflow/types.js.map +1 -1
  72. package/build/dex/index.js +2 -0
  73. package/build/dex/index.js.map +1 -1
  74. package/build/dex/pancakeswap-v3/config.js +0 -15
  75. package/build/dex/pancakeswap-v3/config.js.map +1 -1
  76. package/build/dex/pancakeswap-v3/pancakeswap-v3.js +1 -1
  77. package/build/dex/pancakeswap-v3/pancakeswap-v3.js.map +1 -1
  78. package/build/dex/smardex/subgraph-queries.d.ts +1 -0
  79. package/build/dex/smardex/subgraph-queries.js +17 -0
  80. package/build/dex/smardex/subgraph-queries.js.map +1 -0
  81. package/build/dex/smardex/usd-reserves.d.ts +23 -0
  82. package/build/dex/smardex/usd-reserves.js +86 -0
  83. package/build/dex/smardex/usd-reserves.js.map +1 -0
  84. package/build/dex/solidly/config.js +12 -0
  85. package/build/dex/solidly/config.js.map +1 -1
  86. package/build/dex/solidly/forks-override/pharaohV1.d.ts +8 -0
  87. package/build/dex/solidly/forks-override/pharaohV1.js +15 -0
  88. package/build/dex/solidly/forks-override/pharaohV1.js.map +1 -0
  89. package/build/dex/solidly/solidly.js +1 -0
  90. package/build/dex/solidly/solidly.js.map +1 -1
  91. package/build/dex/trader-joe-v2-1-2/config.d.ts +4 -0
  92. package/build/dex/trader-joe-v2-1-2/config.js +47 -0
  93. package/build/dex/trader-joe-v2-1-2/config.js.map +1 -0
  94. package/build/dex/trader-joe-v2-1-2/constants.d.ts +20 -0
  95. package/build/dex/trader-joe-v2-1-2/constants.js +22 -0
  96. package/build/dex/trader-joe-v2-1-2/constants.js.map +1 -0
  97. package/build/dex/trader-joe-v2-1-2/math/index.d.ts +37 -0
  98. package/build/dex/trader-joe-v2-1-2/math/index.js +291 -0
  99. package/build/dex/trader-joe-v2-1-2/math/index.js.map +1 -0
  100. package/build/dex/trader-joe-v2-1-2/trader-joe-v2-1-2-pool.d.ts +60 -0
  101. package/build/dex/trader-joe-v2-1-2/trader-joe-v2-1-2-pool.js +248 -0
  102. package/build/dex/trader-joe-v2-1-2/trader-joe-v2-1-2-pool.js.map +1 -0
  103. package/build/dex/trader-joe-v2-1-2/trader-joe-v2-1-2.d.ts +53 -0
  104. package/build/dex/trader-joe-v2-1-2/trader-joe-v2-1-2.js +307 -0
  105. package/build/dex/trader-joe-v2-1-2/trader-joe-v2-1-2.js.map +1 -0
  106. package/build/dex/trader-joe-v2-1-2/types.d.ts +82 -0
  107. package/build/dex/trader-joe-v2-1-2/types.js +9 -0
  108. package/build/dex/trader-joe-v2-1-2/types.js.map +1 -0
  109. package/build/dex/trader-joe-v2_1/config.d.ts +4 -0
  110. package/build/dex/trader-joe-v2_1/config.js +47 -0
  111. package/build/dex/trader-joe-v2_1/config.js.map +1 -0
  112. package/build/dex/trader-joe-v2_1/constants.d.ts +20 -0
  113. package/build/dex/trader-joe-v2_1/constants.js +22 -0
  114. package/build/dex/trader-joe-v2_1/constants.js.map +1 -0
  115. package/build/dex/trader-joe-v2_1/math/index.d.ts +37 -0
  116. package/build/dex/trader-joe-v2_1/math/index.js +291 -0
  117. package/build/dex/trader-joe-v2_1/math/index.js.map +1 -0
  118. package/build/dex/trader-joe-v2_1/trader-joe-v2.1.d.ts +0 -0
  119. package/build/dex/trader-joe-v2_1/trader-joe-v2.1.js +384 -0
  120. package/build/dex/trader-joe-v2_1/trader-joe-v2.1.js.map +1 -0
  121. package/build/dex/trader-joe-v2_1/trader-joe-v2_1-pool.d.ts +60 -0
  122. package/build/dex/trader-joe-v2_1/trader-joe-v2_1-pool.js +247 -0
  123. package/build/dex/trader-joe-v2_1/trader-joe-v2_1-pool.js.map +1 -0
  124. package/build/dex/trader-joe-v2_1/trader-joe-v2_1.d.ts +53 -0
  125. package/build/dex/trader-joe-v2_1/trader-joe-v2_1.js +307 -0
  126. package/build/dex/trader-joe-v2_1/trader-joe-v2_1.js.map +1 -0
  127. package/build/dex/trader-joe-v2_1/types.d.ts +82 -0
  128. package/build/dex/trader-joe-v2_1/types.js +9 -0
  129. package/build/dex/trader-joe-v2_1/types.js.map +1 -0
  130. package/build/dex/uniswap-v3/config.js +1 -1
  131. package/build/dex/uniswap-v3/config.js.map +1 -1
  132. package/build/dex/uniswap-v3/uniswap-v3.js +1 -1
  133. package/build/dex/uniswap-v3/uniswap-v3.js.map +1 -1
  134. package/build/dex/wombat/wombat-pool-poller.d.ts +22 -0
  135. package/build/dex/wombat/wombat-pool-poller.js +164 -0
  136. package/build/dex/wombat/wombat-pool-poller.js.map +1 -0
  137. package/build/dex-helper/Cache.d.ts +31 -0
  138. package/build/dex-helper/Cache.js +106 -0
  139. package/build/dex-helper/Cache.js.map +1 -0
  140. package/build/dex-helper/RedisBatcher.d.ts +20 -0
  141. package/build/dex-helper/RedisBatcher.js +75 -0
  142. package/build/dex-helper/RedisBatcher.js.map +1 -0
  143. package/build/dex-helper/RedisWrapper.d.ts +37 -0
  144. package/build/dex-helper/RedisWrapper.js +165 -0
  145. package/build/dex-helper/RedisWrapper.js.map +1 -0
  146. package/package.json +1 -1
  147. package/src/dex/hashflow/constants.ts +32 -0
  148. package/src/dex/hashflow/hashflow.ts +131 -19
  149. package/src/dex/hashflow/types.ts +20 -2
  150. package/src/dex/index.ts +2 -0
  151. package/src/dex/pancakeswap-v3/config.ts +0 -16
  152. package/src/dex/pancakeswap-v3/pancakeswap-v3.ts +1 -3
  153. package/src/dex/solidly/config.ts +14 -0
  154. package/src/dex/solidly/forks-override/pharaohV1.ts +10 -0
  155. package/src/dex/solidly/solidly-e2e.test.ts +21 -0
  156. package/src/dex/solidly/solidly-integration.test.ts +143 -0
  157. package/src/dex/solidly/solidly.ts +1 -0
  158. package/src/dex/uniswap-v3/config.ts +1 -1
  159. package/src/dex/uniswap-v3/uniswap-v3-e2e.test.ts +2 -2
  160. package/src/dex/uniswap-v3/uniswap-v3-integration.test.ts +2 -2
  161. package/src/dex/uniswap-v3/uniswap-v3.ts +1 -1
  162. package/tests/constants-e2e.ts +5 -0
  163. package/.vscode/launch.json +0 -53
  164. package/.vscode/settings.json +0 -2
  165. package/.vscode/tasks.json +0 -15
  166. package/build/abi/uniswap-v3/AlienBaseV3Router.abi.json +0 -52
  167. package/build/dex/solidly-v3/scripts/check-event-pool-event.d.ts +0 -1
  168. package/build/dex/solidly-v3/scripts/check-event-pool-event.js +0 -53
  169. package/build/dex/solidly-v3/scripts/check-event-pool-event.js.map +0 -1
  170. package/build/dex/uniswap-v3/forks/alien-base-v3/alien-base-v3.d.ts +0 -17
  171. package/build/dex/uniswap-v3/forks/alien-base-v3/alien-base-v3.js +0 -64
  172. package/build/dex/uniswap-v3/forks/alien-base-v3/alien-base-v3.js.map +0 -1
  173. package/build/dex/uniswap-v3/forks/alien-v3/alien-v3.d.ts +0 -17
  174. package/build/dex/uniswap-v3/forks/alien-v3/alien-v3.js +0 -79
  175. package/build/dex/uniswap-v3/forks/alien-v3/alien-v3.js.map +0 -1
@@ -0,0 +1,20 @@
1
+ import { ChainableCommander } from 'ioredis';
2
+ export declare type BatchedCmd = {
3
+ makeCmd: (chain: ChainableCommander) => void;
4
+ cb: (result: string | null) => boolean;
5
+ };
6
+ declare class DexlibRedisBatcher {
7
+ private intervalTimeMs;
8
+ private interval?;
9
+ private _lastLoggedAt;
10
+ private isAlreadyRunning;
11
+ private cmds;
12
+ private tmpCmds;
13
+ constructor(intervalTimeMs: number);
14
+ enable(): void;
15
+ disable(): void;
16
+ addCmd(cmd: BatchedCmd): void;
17
+ execute(): Promise<void>;
18
+ }
19
+ export declare const redisBatcher: DexlibRedisBatcher;
20
+ export {};
@@ -0,0 +1,75 @@
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.redisBatcher = void 0;
7
+ const RedisWrapper_1 = __importDefault(require("./RedisWrapper"));
8
+ const REDIS_BATCHER_INTERVAL_MS = 100;
9
+ const LOG_PERIOD_MS = 10 * 1000;
10
+ const logger = console;
11
+ class DexlibRedisBatcher {
12
+ constructor(intervalTimeMs) {
13
+ this.intervalTimeMs = intervalTimeMs;
14
+ this._lastLoggedAt = 0;
15
+ this.isAlreadyRunning = false;
16
+ this.cmds = [];
17
+ this.tmpCmds = [];
18
+ }
19
+ enable() {
20
+ this.interval = setInterval(this.execute.bind(this), this.intervalTimeMs);
21
+ }
22
+ disable() {
23
+ if (this.interval) {
24
+ clearInterval(this.interval);
25
+ this.interval = undefined;
26
+ }
27
+ }
28
+ addCmd(cmd) {
29
+ this.tmpCmds.push(cmd);
30
+ }
31
+ async execute() {
32
+ if (this.isAlreadyRunning) {
33
+ return;
34
+ }
35
+ try {
36
+ this.isAlreadyRunning = true;
37
+ const cmdsCount = this.tmpCmds.length + this.cmds.length;
38
+ if (cmdsCount === 0) {
39
+ return;
40
+ }
41
+ logger.trace(`execute ${cmdsCount} cmds`);
42
+ this.tmpCmds.forEach(cmd => this.cmds.push(cmd));
43
+ this.tmpCmds.length = 0;
44
+ const results = await RedisWrapper_1.default.batchReadOnlyCmds(this.cmds);
45
+ this.cmds = this.cmds.filter((cmd, index) => {
46
+ if (!results) {
47
+ logger.error('no results');
48
+ return true;
49
+ }
50
+ const res = results[index];
51
+ if (!res) {
52
+ logger.error('error in execute empty result');
53
+ return true;
54
+ }
55
+ if (res[0]) {
56
+ logger.error('error in execute, res[0] =', res[0]);
57
+ return true;
58
+ }
59
+ return !cmd.cb(res[1]);
60
+ });
61
+ if (this.cmds.length && Date.now() - this._lastLoggedAt > LOG_PERIOD_MS) {
62
+ logger.info(`still some cmds to run ${this.cmds.length}`);
63
+ this._lastLoggedAt = Date.now();
64
+ }
65
+ }
66
+ catch (e) {
67
+ logger.error('error in execute:', e);
68
+ }
69
+ finally {
70
+ this.isAlreadyRunning = false;
71
+ }
72
+ }
73
+ }
74
+ exports.redisBatcher = new DexlibRedisBatcher(REDIS_BATCHER_INTERVAL_MS);
75
+ //# sourceMappingURL=RedisBatcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RedisBatcher.js","sourceRoot":"","sources":["../../src/dex-helper/RedisBatcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import { Redis } from 'ioredis';
2
+ interface Pool<T> extends Array<T> {
3
+ next: () => T;
4
+ }
5
+ export declare class DexlibRedisWrapper {
6
+ static MAX_SCORE_VALUE: number;
7
+ private redisMasterUrl;
8
+ private redisSlavesUrl;
9
+ masterPool: Pool<Redis>;
10
+ slavesPool: Pool<Redis>;
11
+ connect(redisMasterUrl?: string, redisSlavesUrl?: string, connectionPerPool?: number): Promise<void>;
12
+ private _checkConnected;
13
+ checkConnected(): void;
14
+ close(): Promise<void>;
15
+ get(key: string): Promise<string | null>;
16
+ set(key: string, value: string): Promise<"OK">;
17
+ setex(key: string, seconds: number, value: string): Promise<"OK">;
18
+ incrWithTTLSec(key: string, ttlSec: number): Promise<number>;
19
+ sismember(set: string, key: string): Promise<number>;
20
+ publish(channel: string, value: string): Promise<number>;
21
+ subscribe(channel: string, cb: (channel: string, message: string) => void): Promise<unknown>;
22
+ del(key: string): Promise<number>;
23
+ zremrangebyscore(key: string, min: number, max: number): Promise<number>;
24
+ zadd(key: string, bulkItemsToAdd: (number | string)[], option?: 'NX'): Promise<number>;
25
+ zrem(key: string, membersKeys: string[]): Promise<number>;
26
+ zscore(key: string, member: string): Promise<string | null>;
27
+ hset(mapKey: string, mappings: Record<string, string>): Promise<number | undefined>;
28
+ hdel(mapKey: string, keys: string[]): Promise<number>;
29
+ hget(keyMap: string, key: string): Promise<string | null>;
30
+ hmget(keyMap: string, keys: string[]): Promise<(string | null)[]>;
31
+ hgetAll(keyMap: string): Promise<Record<string, string>>;
32
+ zrangebyscore(key: string, min: number, max: number, isWithScores?: boolean): Promise<string[]>;
33
+ zcount(key: string, min: number, max: number): Promise<number>;
34
+ sadd(set: string, keys: string[], ttl?: number): Promise<number | [error: Error | null, result: unknown][] | null>;
35
+ }
36
+ declare const _default: DexlibRedisWrapper;
37
+ export default _default;
@@ -0,0 +1,165 @@
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.DexlibRedisWrapper = void 0;
7
+ const ioredis_1 = __importDefault(require("ioredis"));
8
+ const logger = console;
9
+ const IOREDIS_OPTION = {
10
+ enableAutoPipelining: true,
11
+ lazyConnect: true,
12
+ stringNumbers: true,
13
+ };
14
+ function makePool(url, connectionPerPool) {
15
+ const pool = Array.apply(null, new Array(connectionPerPool)).map(() => new ioredis_1.default(url, IOREDIS_OPTION));
16
+ const lastIdx = pool.length - 1;
17
+ pool.idx = 0;
18
+ pool.next = () => {
19
+ const n = pool[pool.idx];
20
+ pool.idx = pool.idx === lastIdx ? 0 : pool.idx + 1;
21
+ return n;
22
+ };
23
+ return pool;
24
+ }
25
+ class DexlibRedisWrapper {
26
+ constructor() {
27
+ this.redisMasterUrl = '';
28
+ this.redisSlavesUrl = '';
29
+ }
30
+ async connect(redisMasterUrl = 'redis://localhost:32768', redisSlavesUrl = 'redis://localhost:32768', connectionPerPool = 5) {
31
+ this.redisMasterUrl = redisMasterUrl;
32
+ this.redisSlavesUrl = redisSlavesUrl;
33
+ this.masterPool = makePool(redisMasterUrl, connectionPerPool);
34
+ this.slavesPool = makePool(redisSlavesUrl, connectionPerPool);
35
+ try {
36
+ logger.info(`Connecting to REDIS... ${this.redisMasterUrl}`);
37
+ await Promise.all([...this.masterPool, ...this.slavesPool].map(redis => redis.connect()));
38
+ logger.info('Connected to REDIS');
39
+ }
40
+ catch (e) {
41
+ logger.error(`Connecting to REDIS ${e}`);
42
+ throw e;
43
+ }
44
+ }
45
+ _checkConnected(redis) {
46
+ if (redis.status !== 'ready') {
47
+ throw new Error('Redis connection down!');
48
+ }
49
+ }
50
+ checkConnected() {
51
+ this.masterPool.forEach(this._checkConnected);
52
+ this.slavesPool.forEach(this._checkConnected);
53
+ }
54
+ async close() {
55
+ try {
56
+ logger.info('Closing REDIS...');
57
+ await Promise.all([...this.masterPool, ...this.slavesPool].map(redis => redis.quit()));
58
+ logger.info('Closed REDIS');
59
+ }
60
+ catch (e) {
61
+ logger.error(`Closing REDIS ${e}`);
62
+ throw e;
63
+ }
64
+ }
65
+ async get(key) {
66
+ return this.slavesPool.next().get(key);
67
+ }
68
+ set(key, value) {
69
+ return this.masterPool.next().set(key, value);
70
+ }
71
+ setex(key, seconds, value) {
72
+ return this.masterPool.next().setex(key, seconds, value);
73
+ }
74
+ async incrWithTTLSec(key, ttlSec) {
75
+ const results = await this.masterPool
76
+ .next()
77
+ .multi()
78
+ .incr(key)
79
+ .expire(key, ttlSec)
80
+ .exec();
81
+ if (!results || results[0] === null) {
82
+ throw new Error(`incrWithTTLSec failed`);
83
+ }
84
+ return parseInt(results[0][1], 10);
85
+ }
86
+ async sismember(set, key) {
87
+ const res = await this.masterPool.next().sismember(set, key);
88
+ return typeof res === 'number' ? res : parseInt(res, 10);
89
+ }
90
+ publish(channel, value) {
91
+ return this.masterPool.next().publish(channel, value);
92
+ }
93
+ subscribe(channel, cb) {
94
+ const redis = new ioredis_1.default(this.redisSlavesUrl, IOREDIS_OPTION);
95
+ redis.on('error', (error) => {
96
+ logger.error(`redis_subscribe_error(${channel}): ${error}`);
97
+ });
98
+ redis.on('connect', () => logger.info(`Redis_subscriber_connected(${channel})`));
99
+ redis.on('message', cb);
100
+ return redis.subscribe(channel);
101
+ }
102
+ async del(key) {
103
+ return this.masterPool.next().del(key);
104
+ }
105
+ async zremrangebyscore(key, min, max) {
106
+ return this.masterPool.next().zremrangebyscore(key, min, max);
107
+ }
108
+ async zadd(key, bulkItemsToAdd, option) {
109
+ return option === undefined
110
+ ? this.masterPool.next().zadd(key, ...bulkItemsToAdd)
111
+ : this.masterPool.next().zadd(key, option, ...bulkItemsToAdd);
112
+ }
113
+ async zrem(key, membersKeys) {
114
+ return this.masterPool.next().zrem(key, membersKeys);
115
+ }
116
+ async zscore(key, member) {
117
+ return this.slavesPool.next().zscore(key, member);
118
+ }
119
+ async hset(mapKey, mappings) {
120
+ if (!Object.keys(mappings).length) {
121
+ return;
122
+ }
123
+ return this.masterPool.next().hset(mapKey, mappings);
124
+ }
125
+ async hdel(mapKey, keys) {
126
+ if (keys.length === 0) {
127
+ return 0;
128
+ }
129
+ return this.masterPool.next().hdel(mapKey, ...keys);
130
+ }
131
+ async hget(keyMap, key) {
132
+ return this.slavesPool.next().hget(keyMap, key);
133
+ }
134
+ async hmget(keyMap, keys) {
135
+ return this.slavesPool.next().hmget(keyMap, ...keys);
136
+ }
137
+ async hgetAll(keyMap) {
138
+ return this.slavesPool.next().hgetall(keyMap);
139
+ }
140
+ async zrangebyscore(key, min, max, isWithScores = false) {
141
+ return isWithScores
142
+ ? this.slavesPool.next().zrangebyscore(key, min, max, 'WITHSCORES')
143
+ : this.slavesPool.next().zrangebyscore(key, min, max);
144
+ }
145
+ async zcount(key, min, max) {
146
+ return this.slavesPool.next().zcount(key, min, max);
147
+ }
148
+ async sadd(set, keys, ttl) {
149
+ if (ttl) {
150
+ return this.masterPool
151
+ .next()
152
+ .multi()
153
+ .sadd(set, keys)
154
+ .expire(set, ttl)
155
+ .exec();
156
+ }
157
+ else {
158
+ return this.masterPool.next().sadd(set, keys);
159
+ }
160
+ }
161
+ }
162
+ exports.DexlibRedisWrapper = DexlibRedisWrapper;
163
+ DexlibRedisWrapper.MAX_SCORE_VALUE = 9007199254740991;
164
+ exports.default = new DexlibRedisWrapper();
165
+ //# sourceMappingURL=RedisWrapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RedisWrapper.js","sourceRoot":"","sources":["../../src/dex-helper/RedisWrapper.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@paraswap/dex-lib",
3
- "version": "2.49.2-dackieswapv3-base.0",
3
+ "version": "2.49.2-hashflow",
4
4
  "main": "build/index.js",
5
5
  "types": "build/index.d.ts",
6
6
  "repository": "https://github.com/paraswap/paraswap-dex-lib",
@@ -20,3 +20,35 @@ export const HASHFLOW_GAS_COST = 100_000;
20
20
 
21
21
  export const HASHFLOW_MIN_SLIPPAGE_FACTOR_THRESHOLD_FOR_RESTRICTION =
22
22
  new BigNumber('0.001');
23
+
24
+ export const RESTRICT_79_TTL_MS = 60 * 30 * 1000; // 30 mins
25
+ export const RESTRICT_SLIPPAGE_TTL_MS = 60 * 30 * 1000; // 30 mins
26
+ export const RESTRICT_84_TTL_MS = 60 * 10 * 1000; // 10 mins
27
+ export const RESTRICT_76_TTL_MS = 60 * 30 * 1000; // 30 mins
28
+ export const RESTRICT_82_TTL_MS = 60 * 30 * 1000; // 30 mins
29
+ export const RESTRICT_42_TTL_MS = 60 * 60 * 1000; // 60 mins
30
+ export const RESTRICT_85_TTL_MS = 60 * 20 * 1000; // 20 mins
31
+ export const RESTRICT_74_TTL_MS = 60 * 20 * 1000; // 20 mins
32
+ export const RESTRICT_UNKNOWN_TTL_MS = 60 * 60 * 1000; // 30 mins
33
+ export const RESTRICT_MISSING_QUOTE_DATA_TTL_MS = 60 * 10 * 1000; // 10 mins
34
+ export const RESTRICT_MISSING_SIGNATURE_TTL_MS = 60 * 10 * 1000; // 10 mins
35
+
36
+ export const UNKNOWN_ERROR_CODE = 'UNKNOWN';
37
+
38
+ export const ERROR_CODE_TO_RESTRICT_TTL = {
39
+ '79': RESTRICT_79_TTL_MS, // {"code":79,"message":"Below minimum amount"}
40
+ SLIPPAGE: RESTRICT_SLIPPAGE_TTL_MS, // Error: Hashflow-56: too much slippage on quote SELL quoteTokenAmount 800317519410129900 / destAmount 848781022570196154 < 0.995
41
+ '84': RESTRICT_84_TTL_MS, // {"code":84,"message":"Rate Limit"}
42
+ '76': RESTRICT_76_TTL_MS, // {"code":76,"message":"Exceeds supported amounts"}
43
+ '82': RESTRICT_82_TTL_MS, // {"code":82,"message":"No maker supports this request"}
44
+ '42': RESTRICT_42_TTL_MS, // {"code":42,"message":"Unknown error"}
45
+ '85': RESTRICT_85_TTL_MS, // {"code":85,"message":"Markets too volatile"}
46
+ '74': RESTRICT_74_TTL_MS, // {"code":74,"message":"No maker could quote"}
47
+ MISSING_QUOTE_DATA: RESTRICT_MISSING_QUOTE_DATA_TTL_MS, // missing quote data
48
+ MISSING_SIGNATURE_DATA: RESTRICT_MISSING_SIGNATURE_TTL_MS, // missing signature
49
+ [UNKNOWN_ERROR_CODE]: RESTRICT_UNKNOWN_TTL_MS, // unknown error
50
+ };
51
+
52
+ // not actually consecutive, meaning is if the error appeared > CONSECUTIVE_ERROR_THRESHOLD times within CONSECUTIVE_ERROR_TIMESPAN_MS ms -> restrict mm for ERROR_CODE_TO_RESTRICT_TTL[errorCode] ms
53
+ export const CONSECUTIVE_ERROR_TIMESPAN_MS = 60 * 60 * 1000; // 1 hour
54
+ export const CONSECUTIVE_ERROR_THRESHOLD = 3;
@@ -33,11 +33,14 @@ import {
33
33
  SimpleExchangeParam,
34
34
  Token,
35
35
  } from '../../types';
36
- import { getDexKeysWithNetwork } from '../../utils';
36
+ import { getDexKeysWithNetwork, Utils } from '../../utils';
37
37
  import { TooStrictSlippageCheckError } from '../generic-rfq/types';
38
38
  import { SimpleExchange } from '../simple-exchange';
39
39
  import { Adapters, HashflowConfig } from './config';
40
40
  import {
41
+ CONSECUTIVE_ERROR_THRESHOLD,
42
+ CONSECUTIVE_ERROR_TIMESPAN_MS,
43
+ ERROR_CODE_TO_RESTRICT_TTL,
41
44
  HASHFLOW_API_CLIENT_NAME,
42
45
  HASHFLOW_API_MARKET_MAKERS_POLLING_INTERVAL_MS,
43
46
  HASHFLOW_API_PRICES_POLLING_INTERVAL_MS,
@@ -48,9 +51,12 @@ import {
48
51
  HASHFLOW_MIN_SLIPPAGE_FACTOR_THRESHOLD_FOR_RESTRICTION,
49
52
  HASHFLOW_MM_RESTRICT_TTL_S,
50
53
  HASHFLOW_PRICES_CACHES_TTL_S,
54
+ UNKNOWN_ERROR_CODE,
51
55
  } from './constants';
52
56
  import { RateFetcher } from './rate-fetcher';
53
57
  import {
58
+ CacheErrorCodesData,
59
+ ErrorCode,
54
60
  HashflowData,
55
61
  PriceLevel,
56
62
  RfqError,
@@ -69,6 +75,7 @@ export class Hashflow extends SimpleExchange implements IDex<HashflowData> {
69
75
  private hashFlowAuthToken: string;
70
76
  private disabledMMs: Set<string>;
71
77
  private runtimeMMsRestrictHashMapKey: string;
78
+ private runtimeMMsRestrictHashMapErrorCodesKey: string;
72
79
 
73
80
  private pricesCacheKey: string;
74
81
  private marketMakersCacheKey: string;
@@ -108,6 +115,8 @@ export class Hashflow extends SimpleExchange implements IDex<HashflowData> {
108
115
  this.disabledMMs = new Set(dexHelper.config.data.hashFlowDisabledMMs);
109
116
  this.runtimeMMsRestrictHashMapKey =
110
117
  `${CACHE_PREFIX}_${this.dexKey}_${this.network}_restricted_mms`.toLowerCase();
118
+ this.runtimeMMsRestrictHashMapErrorCodesKey =
119
+ `${CACHE_PREFIX}_${this.dexKey}_${this.network}_restricted_mms_error_codes`.toLowerCase();
111
120
 
112
121
  this.rateFetcher = new RateFetcher(
113
122
  this.dexHelper,
@@ -595,7 +604,7 @@ export class Hashflow extends SimpleExchange implements IDex<HashflowData> {
595
604
  normalizedDestToken.address,
596
605
  )}: ${JSON.stringify(rfq)}`;
597
606
  this.logger.warn(message);
598
- throw new RfqError(message);
607
+ throw new RfqError(message, `${rfq?.error?.code}` as ErrorCode);
599
608
  } else if (!rfq.quotes[0].quoteData) {
600
609
  const message = `${this.dexKey}-${
601
610
  this.network
@@ -604,7 +613,7 @@ export class Hashflow extends SimpleExchange implements IDex<HashflowData> {
604
613
  normalizedDestToken.address,
605
614
  )}. Missing quote data`;
606
615
  this.logger.warn(message);
607
- throw new RfqError(message);
616
+ throw new RfqError(message, 'MISSING_QUOTE_DATA');
608
617
  } else if (!rfq.quotes[0].signature) {
609
618
  const message = `${this.dexKey}-${
610
619
  this.network
@@ -613,7 +622,7 @@ export class Hashflow extends SimpleExchange implements IDex<HashflowData> {
613
622
  normalizedDestToken.address,
614
623
  )}. Missing signature`;
615
624
  this.logger.warn(message);
616
- throw new RfqError(message);
625
+ throw new RfqError(message, 'MISSING_SIGNATURE_DATA');
617
626
  }
618
627
 
619
628
  assert(
@@ -729,7 +738,13 @@ export class Hashflow extends SimpleExchange implements IDex<HashflowData> {
729
738
  this.logger.warn(
730
739
  `${this.dexKey}-${this.network} MM unknown preprocess transaction error: ${e}`,
731
740
  );
732
- await this.restrictMM(mm);
741
+ const code =
742
+ e instanceof RfqError || e instanceof SlippageCheckError
743
+ ? e?.code || UNKNOWN_ERROR_CODE
744
+ : UNKNOWN_ERROR_CODE;
745
+ await this.restrictMM(mm, code).catch(err =>
746
+ this.logger.warn(`Failed to restrict MM ${mm}: ${err}`),
747
+ );
733
748
  }
734
749
  }
735
750
 
@@ -737,24 +752,121 @@ export class Hashflow extends SimpleExchange implements IDex<HashflowData> {
737
752
  }
738
753
  }
739
754
 
740
- async restrictMM(mm: string): Promise<void> {
741
- this.logger.warn(
742
- `${this.dexKey}-${this.network}: ${mm} was restricted for ${HASHFLOW_MM_RESTRICT_TTL_S} sec. due to fails`,
743
- );
744
-
745
- // We use timestamp for creation date to later discern if it already expired or not
746
- await this.dexHelper.cache.hset(
747
- this.runtimeMMsRestrictHashMapKey,
755
+ async restrictMM(mm: string, errorCode: ErrorCode): Promise<void> {
756
+ const errorCodesRaw = await this.dexHelper.cache.hget(
757
+ this.runtimeMMsRestrictHashMapErrorCodesKey,
748
758
  mm,
749
- Date.now().toString(),
750
759
  );
751
760
 
752
- // Expiry cache because it has levels for blacklisted MM
753
- this.dexHelper.cache.del(this.dexKey, this.network, 'levels').catch(e => {
754
- this.logger.error(
755
- `${this.dexKey}-${this.network}: Failed to delete levels cache: ${e.message}`,
761
+ const errorCodes: CacheErrorCodesData = Utils.Parse(errorCodesRaw) || {};
762
+
763
+ const error = errorCodes?.[errorCode];
764
+
765
+ if (
766
+ !error ||
767
+ error.addedDatetimeMS + CONSECUTIVE_ERROR_TIMESPAN_MS < Date.now()
768
+ ) {
769
+ this.logger.warn(
770
+ `${this.dexKey}-${this.network}: First encounter of error code=${errorCode} for ${mm} OR error ocurred outside of threshold, setting up counter`,
756
771
  );
757
- });
772
+ const data: CacheErrorCodesData = {
773
+ ...errorCodes,
774
+ [errorCode]: {
775
+ count: 1,
776
+ addedDatetimeMS: Date.now(),
777
+ },
778
+ };
779
+ await this.dexHelper.cache.hset(
780
+ this.runtimeMMsRestrictHashMapErrorCodesKey,
781
+ mm,
782
+ Utils.Serialize(data),
783
+ );
784
+ return;
785
+ } else {
786
+ const restrictTTLMs =
787
+ ERROR_CODE_TO_RESTRICT_TTL[errorCode] ||
788
+ ERROR_CODE_TO_RESTRICT_TTL[UNKNOWN_ERROR_CODE];
789
+
790
+ if (error.count + 1 > CONSECUTIVE_ERROR_THRESHOLD) {
791
+ this.logger.warn(
792
+ `${this.dexKey}-${this.network}: ${mm} was restricted for ${
793
+ restrictTTLMs / 1000
794
+ } sec. due to ${errorCode} happening ${
795
+ error.count + 1
796
+ } times within last ${Math.floor(
797
+ CONSECUTIVE_ERROR_TIMESPAN_MS / 1000 / 60,
798
+ )} minutes`,
799
+ );
800
+
801
+ // date added is checked against HASHFLOW_MM_RESTRICT_TTL_S, as a hack we set a date so that it's checked against specific ttls based on error type to not change parsing logic for mms
802
+ // Example: ttl for a particular error is 20 minutes (< default 60 minutes)
803
+ //
804
+ // Meaning we need to set `addedDatetimeMS` for restrict hash as Date.now() + 40 minutes (diff between default restrict ttl=1h and particular error restrict ttl = 20 minutes). So the `addedDatetimeMS` is in the future, and after 20 minutes mm will not be considered as restricted
805
+ //
806
+ //
807
+ // Example 2: ttl for a particular error is 80 minutes (> default 60 minutes)
808
+ //
809
+ // Meaning we need to set `addedDatetimeMS` for restrict hash as Date.now() - 20 minutes, then after an hour (default) it'll still be 20 minutes left for restriction to be cleared
810
+
811
+ const defaultRestrictTTLMS = Math.floor(
812
+ HASHFLOW_MM_RESTRICT_TTL_S * 1000,
813
+ );
814
+ const dateModifierMS =
815
+ defaultRestrictTTLMS > restrictTTLMs
816
+ ? defaultRestrictTTLMS - restrictTTLMs
817
+ : -(restrictTTLMs - defaultRestrictTTLMS);
818
+
819
+ const date = (Date.now() + dateModifierMS).toString();
820
+
821
+ // We use timestamp for creation date to later discern if it already expired or not
822
+ await this.dexHelper.cache.hset(
823
+ this.runtimeMMsRestrictHashMapKey,
824
+ mm,
825
+ date,
826
+ );
827
+
828
+ // resetting error count
829
+ const data: CacheErrorCodesData = {
830
+ ...errorCodes,
831
+ [errorCode]: {
832
+ count: 1,
833
+ addedDatetimeMS: Date.now(),
834
+ },
835
+ };
836
+ await this.dexHelper.cache.hset(
837
+ this.runtimeMMsRestrictHashMapErrorCodesKey,
838
+ mm,
839
+ Utils.Serialize(data),
840
+ );
841
+
842
+ // Expiry cache because it has levels for blacklisted MM
843
+ await this.dexHelper.cache
844
+ .del(this.dexKey, this.network, 'levels')
845
+ .catch(e => {
846
+ this.logger.error(
847
+ `${this.dexKey}-${this.network}: Failed to delete levels cache: ${e.message}`,
848
+ );
849
+ });
850
+ return;
851
+ } else {
852
+ const newCount = +error.count + 1;
853
+ this.logger.warn(
854
+ `${this.dexKey}-${this.network}: ${mm} Error with code: ${errorCode} happened ${newCount} times (below or equal to the limit: ${CONSECUTIVE_ERROR_THRESHOLD}), updating counter`,
855
+ );
856
+ const data: CacheErrorCodesData = {
857
+ ...errorCodes,
858
+ [errorCode]: {
859
+ count: newCount,
860
+ addedDatetimeMS: error.addedDatetimeMS, // initial date stays
861
+ },
862
+ };
863
+ await this.dexHelper.cache.hset(
864
+ this.runtimeMMsRestrictHashMapErrorCodesKey,
865
+ mm,
866
+ Utils.Serialize(data),
867
+ );
868
+ }
869
+ }
758
870
  }
759
871
 
760
872
  getCalldataGasCost(poolPrices: PoolPrices<HashflowData>): number | number[] {
@@ -1,5 +1,6 @@
1
1
  import { Chain, QuoteData } from '@hashflow/taker-js/dist/types/common';
2
2
  import { RequestHeaders } from '../../dex-helper';
3
+ import { ERROR_CODE_TO_RESTRICT_TTL, UNKNOWN_ERROR_CODE } from './constants';
3
4
 
4
5
  export type HashflowData = {
5
6
  mm: string;
@@ -16,14 +17,22 @@ export interface PriceLevel {
16
17
  p: string;
17
18
  }
18
19
 
19
- export class RfqError extends Error {}
20
+ export class RfqError extends Error {
21
+ code: ErrorCode;
22
+ constructor(message: string, code: ErrorCode = UNKNOWN_ERROR_CODE) {
23
+ super(message);
24
+ this.code = code;
25
+ }
26
+ }
20
27
 
21
28
  export enum RFQType {
22
29
  RFQT = 0,
23
30
  RFQM = 1,
24
31
  }
25
32
 
26
- export class SlippageCheckError extends Error {}
33
+ export class SlippageCheckError extends Error {
34
+ code: ErrorCode = 'SLIPPAGE';
35
+ }
27
36
 
28
37
  export type HashflowRatesLevel = {
29
38
  pair: Record<string, string>;
@@ -63,3 +72,12 @@ export type HashflowRateFetcherConfig = {
63
72
  marketMakersCacheTTLSecs: number;
64
73
  };
65
74
  };
75
+
76
+ export type ErrorCode = keyof typeof ERROR_CODE_TO_RESTRICT_TTL;
77
+
78
+ export type CacheErrorCodesData = {
79
+ [code in ErrorCode]: {
80
+ addedDatetimeMS: number;
81
+ count: number;
82
+ } | null;
83
+ };
package/src/dex/index.ts CHANGED
@@ -85,6 +85,7 @@ import { Dexalot } from './dexalot/dexalot';
85
85
  import { Smardex } from './smardex/smardex';
86
86
  import { Wombat } from './wombat/wombat';
87
87
  import { Swell } from './swell/swell';
88
+ import { PharaohV1 } from './solidly/forks-override/pharaohV1';
88
89
  import { EtherFi } from './etherfi';
89
90
 
90
91
  const LegacyDexes = [
@@ -168,6 +169,7 @@ const Dexes = [
168
169
  Smardex,
169
170
  Wombat,
170
171
  Swell,
172
+ PharaohV1,
171
173
  ];
172
174
 
173
175
  export type LegacyDexConstructor = new (dexHelper: IDexHelper) => IDexTxBuilder<
@@ -69,22 +69,6 @@ export const PancakeswapV3Config: DexConfigMap<DexParams> = {
69
69
  'https://api.studio.thegraph.com/query/45376/exchange-v3-base/version/latest',
70
70
  },
71
71
  },
72
- DackieSwapV3: {
73
- [Network.BASE]: {
74
- factory: '0x3D237AC6D2f425D2E890Cc99198818cc1FA48870',
75
- quoter: '0x4fDBD73aD4B1DDde594BF05497C15f76308eFfb9',
76
- deployer: '0x4f205D69834f9B101b9289F7AFFAc9B77B3fF9b7',
77
- router: '0x4030ebafeb76e5fc848891076dfe315993800ba5',
78
- supportedFees: [10000n, 2500n, 500n, 100n],
79
- stateMulticall: '0xeBF40A40CA3D4310Bf53048F48e860656e1D7C81',
80
- uniswapMulticall: '0x091e99cb1C49331a94dD62755D168E941AbD0693',
81
- chunksCount: 10,
82
- initRetryFrequency: 10,
83
- initHash: `0x6ce8eb472fa82df5469c6ab6d485f17c3ad13c8cd7af59b3d4a8026c5ce0f7e2`,
84
- subgraphURL:
85
- 'https://api.studio.thegraph.com/query/50473/exchange-clmm/version/latest',
86
- },
87
- },
88
72
  };
89
73
 
90
74
  export const Adapters: Record<number, AdapterMappings> = {