@paraswap/dex-lib 3.8.37 → 3.8.39-bebop
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/USDM.json +807 -0
- package/build/abi/bebop/BebopSettlement.abi.json +2137 -0
- package/build/abi/cables/CablesMainnetRFQ.json +1073 -0
- package/build/abi/wUSDM.json +757 -0
- package/build/config.js +7 -0
- package/build/config.js.map +1 -1
- package/build/dex/bebop/bebop.d.ts +55 -0
- package/build/dex/bebop/bebop.js +524 -0
- package/build/dex/bebop/bebop.js.map +1 -0
- package/build/dex/bebop/config.d.ts +3 -0
- package/build/dex/bebop/config.js +38 -0
- package/build/dex/bebop/config.js.map +1 -0
- package/build/dex/bebop/constants.d.ts +9 -0
- package/build/dex/bebop/constants.js +13 -0
- package/build/dex/bebop/constants.js.map +1 -0
- package/build/dex/bebop/rate-fetcher.d.ts +22 -0
- package/build/dex/bebop/rate-fetcher.js +80 -0
- package/build/dex/bebop/rate-fetcher.js.map +1 -0
- package/build/dex/bebop/types.d.ts +76 -0
- package/build/dex/bebop/types.js +3 -0
- package/build/dex/bebop/types.js.map +1 -0
- package/build/dex/bebop/validators.d.ts +4 -0
- package/build/dex/bebop/validators.js +42 -0
- package/build/dex/bebop/validators.js.map +1 -0
- package/build/dex/bebop/websocket-fetcher.d.ts +35 -0
- package/build/dex/bebop/websocket-fetcher.js +87 -0
- package/build/dex/bebop/websocket-fetcher.js.map +1 -0
- package/build/dex/cables/cables.d.ts +64 -0
- package/build/dex/cables/cables.js +445 -0
- package/build/dex/cables/cables.js.map +1 -0
- package/build/dex/cables/config.d.ts +4 -0
- package/build/dex/cables/config.js +15 -0
- package/build/dex/cables/config.js.map +1 -0
- package/build/dex/cables/constants.d.ts +19 -0
- package/build/dex/cables/constants.js +26 -0
- package/build/dex/cables/constants.js.map +1 -0
- package/build/dex/cables/rate-fetcher.d.ts +34 -0
- package/build/dex/cables/rate-fetcher.js +117 -0
- package/build/dex/cables/rate-fetcher.js.map +1 -0
- package/build/dex/cables/types.d.ts +106 -0
- package/build/dex/cables/types.js +12 -0
- package/build/dex/cables/types.js.map +1 -0
- package/build/dex/cables/validators.d.ts +5 -0
- package/build/dex/cables/validators.js +49 -0
- package/build/dex/cables/validators.js.map +1 -0
- package/build/dex/index.js +2 -0
- package/build/dex/index.js.map +1 -1
- package/build/dex/spark/config.js +25 -0
- package/build/dex/spark/config.js.map +1 -1
- package/build/dex/spark/scripts/validate-state.js +1 -1
- package/build/dex/spark/scripts/validate-state.js.map +1 -1
- package/build/dex/spark/spark-sdai-pool.d.ts +7 -3
- package/build/dex/spark/spark-sdai-pool.js +24 -28
- package/build/dex/spark/spark-sdai-pool.js.map +1 -1
- package/build/dex/spark/spark.d.ts +10 -5
- package/build/dex/spark/spark.js +46 -31
- package/build/dex/spark/spark.js.map +1 -1
- package/build/dex/spark/types.d.ts +6 -0
- package/build/dex/spark/types.js.map +1 -1
- package/build/dex/spark/utils.d.ts +3 -1
- package/build/dex/spark/utils.js +43 -7
- package/build/dex/spark/utils.js.map +1 -1
- package/build/dex/woo-fi-v2/woo-fi-v2-pool.d.ts +2 -2
- package/build/dex/woo-fi-v2/woo-fi-v2-pool.js +30 -9
- package/build/dex/woo-fi-v2/woo-fi-v2-pool.js.map +1 -1
- package/build/dex/woo-fi-v2/woo-fi-v2.js +1 -1
- package/build/dex/woo-fi-v2/woo-fi-v2.js.map +1 -1
- package/build/dex/wusdm/config.d.ts +3 -0
- package/build/dex/wusdm/config.js +29 -0
- package/build/dex/wusdm/config.js.map +1 -0
- package/build/dex/wusdm/types.d.ts +10 -0
- package/build/dex/wusdm/types.js +3 -0
- package/build/dex/wusdm/types.js.map +1 -0
- package/build/dex/wusdm/wusdm.d.ts +39 -0
- package/build/dex/wusdm/wusdm.js +212 -0
- package/build/dex/wusdm/wusdm.js.map +1 -0
- package/build/lib/fetcher/wsFetcher.d.ts +35 -0
- package/build/lib/fetcher/wsFetcher.js +87 -0
- package/build/lib/fetcher/wsFetcher.js.map +1 -0
- package/build/types.d.ts +1 -0
- package/package.json +4 -2
- package/src/abi/bebop/BebopSettlement.abi.json +2137 -0
- package/src/abi/sdai/SavingsUSDS.abi.json +720 -0
- package/src/config.ts +8 -0
- package/src/dex/bebop/bebop-e2e.test.ts +195 -0
- package/src/dex/bebop/bebop-integration.test.ts +170 -0
- package/src/dex/bebop/bebop.ts +732 -0
- package/src/dex/bebop/config.ts +37 -0
- package/src/dex/bebop/constants.ts +9 -0
- package/src/dex/bebop/rate-fetcher.ts +138 -0
- package/src/dex/bebop/types.ts +81 -0
- package/src/dex/bebop/validators.ts +43 -0
- package/src/dex/index.ts +2 -0
- package/src/dex/spark/config.ts +24 -0
- package/src/dex/spark/scripts/validate-state.ts +1 -0
- package/src/dex/spark/spark-e2e.test.ts +25 -21
- package/src/dex/spark/spark-events.test.ts +77 -62
- package/src/dex/spark/spark-integration.test.ts +290 -7
- package/src/dex/spark/spark-sdai-pool.ts +22 -19
- package/src/dex/spark/spark.ts +62 -36
- package/src/dex/spark/types.ts +6 -0
- package/src/dex/spark/utils.ts +83 -19
- package/src/dex/woo-fi-v2/woo-fi-v2-pool.ts +58 -27
- package/src/dex/woo-fi-v2/woo-fi-v2.ts +1 -2
- package/src/lib/fetcher/wsFetcher.ts +126 -0
- package/src/types.ts +1 -0
- package/tests/constants-e2e.ts +5 -0
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RateFetcher = void 0;
|
|
4
|
+
const constants_1 = require("../../constants");
|
|
5
|
+
const fetcher_1 = require("../../lib/fetcher/fetcher");
|
|
6
|
+
const validators_1 = require("../../lib/validators");
|
|
7
|
+
const validators_2 = require("./validators");
|
|
8
|
+
const wsFetcher_1 = require("../../lib/fetcher/wsFetcher");
|
|
9
|
+
class RateFetcher {
|
|
10
|
+
constructor(dexHelper, dexKey, network, logger, config) {
|
|
11
|
+
this.dexHelper = dexHelper;
|
|
12
|
+
this.dexKey = dexKey;
|
|
13
|
+
this.network = network;
|
|
14
|
+
this.logger = logger;
|
|
15
|
+
this.pricesCacheKey = config.rateConfig.pricesCacheKey;
|
|
16
|
+
this.pricesCacheTTL = config.rateConfig.pricesCacheTTLSecs;
|
|
17
|
+
this.pricesFetcher = new wsFetcher_1.WebSocketFetcher({
|
|
18
|
+
info: {
|
|
19
|
+
requestOptions: config.rateConfig.pricesReqParams,
|
|
20
|
+
caster: (data) => {
|
|
21
|
+
return (0, validators_1.validateAndCast)(data, validators_2.pricesResponseValidator);
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
handler: this.handlePricesResponse.bind(this),
|
|
25
|
+
}, logger);
|
|
26
|
+
this.tokensAddrCacheKey = config.rateConfig.tokensAddrCacheKey;
|
|
27
|
+
this.tokensCacheKey = config.rateConfig.tokensCacheKey;
|
|
28
|
+
this.tokensCacheTTL = config.rateConfig.tokensCacheTTLSecs;
|
|
29
|
+
this.tokensFetcher = new fetcher_1.Fetcher(dexHelper.httpRequest, {
|
|
30
|
+
info: {
|
|
31
|
+
requestOptions: config.rateConfig.tokensReqParams,
|
|
32
|
+
caster: (data) => {
|
|
33
|
+
return (0, validators_1.validateAndCast)(data, validators_2.tokensResponseValidator);
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
handler: this.handleTokensResponse.bind(this),
|
|
37
|
+
}, config.rateConfig.tokensIntervalMs, logger);
|
|
38
|
+
}
|
|
39
|
+
start() {
|
|
40
|
+
this.pricesFetcher.startPolling();
|
|
41
|
+
this.tokensFetcher.startPolling();
|
|
42
|
+
}
|
|
43
|
+
stop() {
|
|
44
|
+
this.pricesFetcher.stopPolling();
|
|
45
|
+
this.tokensFetcher.stopPolling();
|
|
46
|
+
}
|
|
47
|
+
handleTokensResponse(resp) {
|
|
48
|
+
const tokenMap = {};
|
|
49
|
+
const tokenAddrMap = {};
|
|
50
|
+
Object.keys(resp.tokens).forEach(tokenSymbol => {
|
|
51
|
+
const token = resp.tokens[tokenSymbol];
|
|
52
|
+
const tokenData = {
|
|
53
|
+
address: token.contractAddress.toLowerCase(),
|
|
54
|
+
symbol: token.ticker,
|
|
55
|
+
decimals: token.decimals,
|
|
56
|
+
};
|
|
57
|
+
tokenAddrMap[token.contractAddress.toLowerCase()] = tokenData;
|
|
58
|
+
tokenMap[token.ticker.toLowerCase()] = tokenData;
|
|
59
|
+
});
|
|
60
|
+
this.dexHelper.cache.setex(this.dexKey, this.network, this.tokensCacheKey, this.tokensCacheTTL, JSON.stringify(tokenMap));
|
|
61
|
+
this.dexHelper.cache.setex(this.dexKey, this.network, this.tokensAddrCacheKey, this.tokensCacheTTL, JSON.stringify(tokenAddrMap));
|
|
62
|
+
}
|
|
63
|
+
handlePricesResponse(resp) {
|
|
64
|
+
const wethAddress = this.dexHelper.config.data.wrappedNativeTokenAddress.toLowerCase();
|
|
65
|
+
const normalizedPrices = {};
|
|
66
|
+
for (const [pair, levels] of Object.entries(resp)) {
|
|
67
|
+
normalizedPrices[pair.toLowerCase()] = levels;
|
|
68
|
+
const [base, quote] = pair.split('/');
|
|
69
|
+
// Also enter native token prices. Pricing doesn't come with these
|
|
70
|
+
if (base.toLowerCase() === wethAddress ||
|
|
71
|
+
quote.toLowerCase() === wethAddress) {
|
|
72
|
+
const nativePair = pair.replace(base, constants_1.ETHER_ADDRESS);
|
|
73
|
+
normalizedPrices[nativePair.toLowerCase()] = levels;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
this.dexHelper.cache.setex(this.dexKey, this.network, this.pricesCacheKey, this.pricesCacheTTL, JSON.stringify(normalizedPrices));
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
exports.RateFetcher = RateFetcher;
|
|
80
|
+
//# sourceMappingURL=rate-fetcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-fetcher.js","sourceRoot":"","sources":["../../../src/dex/bebop/rate-fetcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { SwapSide } from '../../constants';
|
|
2
|
+
import { RequestHeaders } from '../../dex-helper';
|
|
3
|
+
export declare type BebopRateFetcherConfig = {
|
|
4
|
+
rateConfig: {
|
|
5
|
+
pricesReqParams: {
|
|
6
|
+
url: string;
|
|
7
|
+
headers?: RequestHeaders;
|
|
8
|
+
params?: any;
|
|
9
|
+
};
|
|
10
|
+
tokensReqParams: {
|
|
11
|
+
url: string;
|
|
12
|
+
headers?: RequestHeaders;
|
|
13
|
+
params?: any;
|
|
14
|
+
};
|
|
15
|
+
tokensIntervalMs: number;
|
|
16
|
+
pricesCacheKey: string;
|
|
17
|
+
tokensAddrCacheKey: string;
|
|
18
|
+
tokensCacheKey: string;
|
|
19
|
+
pricesCacheTTLSecs: number;
|
|
20
|
+
tokensCacheTTLSecs: number;
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
export declare type TokenDataMap = {
|
|
24
|
+
[index: string]: BebopToken;
|
|
25
|
+
};
|
|
26
|
+
export declare type BebopToken = {
|
|
27
|
+
decimals: number;
|
|
28
|
+
contractAddress: string;
|
|
29
|
+
ticker: string;
|
|
30
|
+
};
|
|
31
|
+
export declare type BebopTokensResponse = {
|
|
32
|
+
tokens: {
|
|
33
|
+
[symbol: string]: BebopToken;
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
export declare type BebopLevel = [price: number, size: number];
|
|
37
|
+
export declare type BebopPair = {
|
|
38
|
+
bids: BebopLevel[];
|
|
39
|
+
asks: BebopLevel[];
|
|
40
|
+
last_update_ts: number;
|
|
41
|
+
};
|
|
42
|
+
export declare type BebopPricingResponse = {
|
|
43
|
+
[pair: string]: BebopPair;
|
|
44
|
+
};
|
|
45
|
+
export interface BebopTx {
|
|
46
|
+
to: string;
|
|
47
|
+
value: string;
|
|
48
|
+
data: string;
|
|
49
|
+
from: string;
|
|
50
|
+
gas: number;
|
|
51
|
+
}
|
|
52
|
+
export declare type BebopTokenAmount = {
|
|
53
|
+
amount: string;
|
|
54
|
+
priceUsd: number;
|
|
55
|
+
};
|
|
56
|
+
export declare type BebopData = {
|
|
57
|
+
expiry?: number;
|
|
58
|
+
buyTokens?: {
|
|
59
|
+
[address: string]: BebopTokenAmount;
|
|
60
|
+
};
|
|
61
|
+
sellTokens?: {
|
|
62
|
+
[address: string]: BebopTokenAmount;
|
|
63
|
+
};
|
|
64
|
+
tx?: BebopTx;
|
|
65
|
+
};
|
|
66
|
+
export declare type DexParams = {
|
|
67
|
+
settlementAddress: string;
|
|
68
|
+
chainName: string;
|
|
69
|
+
middleTokens: string[];
|
|
70
|
+
};
|
|
71
|
+
export declare type RoutingInstruction = {
|
|
72
|
+
side: SwapSide;
|
|
73
|
+
book: BebopPair;
|
|
74
|
+
pair: string;
|
|
75
|
+
targetQuote: boolean;
|
|
76
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/dex/bebop/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,42 @@
|
|
|
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.blacklistResponseValidator = exports.tokensResponseValidator = exports.pricesResponseValidator = void 0;
|
|
7
|
+
const joi_1 = __importDefault(require("joi"));
|
|
8
|
+
// const pairValidator = joi.object({
|
|
9
|
+
// base: joi.string().min(1).required(),
|
|
10
|
+
// quote: joi.string().min(1).required(),
|
|
11
|
+
// liquidityUSD: joi.number().min(0).required(),
|
|
12
|
+
// baseAddress: joi.string().min(1).required(),
|
|
13
|
+
// quoteAddress: joi.string().min(1).required(),
|
|
14
|
+
// baseDecimals: joi.number().min(0).required(),
|
|
15
|
+
// quoteDecimals: joi.number().min(0).required(),
|
|
16
|
+
// });
|
|
17
|
+
// export const pairsResponseValidator = joi
|
|
18
|
+
// .object()
|
|
19
|
+
// .pattern(joi.string(), pairValidator);
|
|
20
|
+
const levelValidator = joi_1.default.array().items(joi_1.default.number()).length(2);
|
|
21
|
+
const pairValidator = joi_1.default.object({
|
|
22
|
+
bids: joi_1.default.array().items(levelValidator).required(),
|
|
23
|
+
asks: joi_1.default.array().items(levelValidator).required(),
|
|
24
|
+
last_update_ts: joi_1.default.number().min(0).required(),
|
|
25
|
+
});
|
|
26
|
+
exports.pricesResponseValidator = joi_1.default
|
|
27
|
+
.object()
|
|
28
|
+
.pattern(joi_1.default.string(), pairValidator);
|
|
29
|
+
const tokenValidator = joi_1.default
|
|
30
|
+
.object({
|
|
31
|
+
ticker: joi_1.default.string().min(1).required(),
|
|
32
|
+
contractAddress: joi_1.default.string().min(1).required(),
|
|
33
|
+
decimals: joi_1.default.number().min(0).required(),
|
|
34
|
+
})
|
|
35
|
+
.unknown(true);
|
|
36
|
+
exports.tokensResponseValidator = joi_1.default.object({
|
|
37
|
+
tokens: joi_1.default.object().pattern(joi_1.default.string(), tokenValidator),
|
|
38
|
+
});
|
|
39
|
+
exports.blacklistResponseValidator = joi_1.default.object({
|
|
40
|
+
blacklist: joi_1.default.array().items(joi_1.default.string().min(1)).required(),
|
|
41
|
+
});
|
|
42
|
+
//# sourceMappingURL=validators.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validators.js","sourceRoot":"","sources":["../../../src/dex/bebop/validators.ts"],"names":[],"mappings":";;;;;;AAAA,8CAAsB;AAEtB,qCAAqC;AACrC,0CAA0C;AAC1C,2CAA2C;AAC3C,kDAAkD;AAClD,iDAAiD;AACjD,kDAAkD;AAClD,kDAAkD;AAClD,mDAAmD;AACnD,MAAM;AAEN,4CAA4C;AAC5C,cAAc;AACd,2CAA2C;AAE3C,MAAM,cAAc,GAAG,aAAG,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,aAAG,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAEjE,MAAM,aAAa,GAAG,aAAG,CAAC,MAAM,CAAC;IAC/B,IAAI,EAAE,aAAG,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,QAAQ,EAAE;IAClD,IAAI,EAAE,aAAG,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,QAAQ,EAAE;IAClD,cAAc,EAAE,aAAG,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;CAC/C,CAAC,CAAC;AAEU,QAAA,uBAAuB,GAAG,aAAG;KACvC,MAAM,EAAE;KACR,OAAO,CAAC,aAAG,CAAC,MAAM,EAAE,EAAE,aAAa,CAAC,CAAC;AAExC,MAAM,cAAc,GAAG,aAAG;KACvB,MAAM,CAAC;IACN,MAAM,EAAE,aAAG,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACtC,eAAe,EAAE,aAAG,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC/C,QAAQ,EAAE,aAAG,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;CACzC,CAAC;KACD,OAAO,CAAC,IAAI,CAAC,CAAC;AAEJ,QAAA,uBAAuB,GAAG,aAAG,CAAC,MAAM,CAAC;IAChD,MAAM,EAAE,aAAG,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,aAAG,CAAC,MAAM,EAAE,EAAE,cAAc,CAAC;CAC3D,CAAC,CAAC;AAEU,QAAA,0BAA0B,GAAG,aAAG,CAAC,MAAM,CAAC;IACnD,SAAS,EAAE,aAAG,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,aAAG,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;CAC7D,CAAC,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { Logger } from 'log4js';
|
|
2
|
+
import { RequestConfig, Response } from '../../dex-helper/irequest-wrapper';
|
|
3
|
+
export declare class SkippingRequest {
|
|
4
|
+
message: string;
|
|
5
|
+
constructor(message?: string);
|
|
6
|
+
}
|
|
7
|
+
export declare type RequestInfo<T> = {
|
|
8
|
+
requestFunc?: (options: RequestConfig) => Promise<Response<T> | SkippingRequest>;
|
|
9
|
+
requestOptions: RequestConfig;
|
|
10
|
+
caster: (data: unknown) => T;
|
|
11
|
+
authenticate?: (options: RequestConfig) => RequestConfig;
|
|
12
|
+
excludedFieldsCaching?: string[];
|
|
13
|
+
};
|
|
14
|
+
export declare type RequestInfoWithHandler<T> = {
|
|
15
|
+
info: RequestInfo<T>;
|
|
16
|
+
handler: (data: T) => void;
|
|
17
|
+
};
|
|
18
|
+
export declare class WebSocketFetcher<T> {
|
|
19
|
+
private logger;
|
|
20
|
+
private requests;
|
|
21
|
+
lastFetchSucceeded: boolean;
|
|
22
|
+
private stop;
|
|
23
|
+
private ws;
|
|
24
|
+
private connection;
|
|
25
|
+
constructor(requestsInfo: RequestInfoWithHandler<T>, logger: Logger);
|
|
26
|
+
private connected;
|
|
27
|
+
private connectFailed;
|
|
28
|
+
private onClose;
|
|
29
|
+
private onError;
|
|
30
|
+
private onMessage;
|
|
31
|
+
private connect;
|
|
32
|
+
startPolling(): void;
|
|
33
|
+
stopPolling(): void;
|
|
34
|
+
isPolling(): boolean;
|
|
35
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WebSocketFetcher = exports.SkippingRequest = void 0;
|
|
4
|
+
const websocket_1 = require("websocket");
|
|
5
|
+
class SkippingRequest {
|
|
6
|
+
constructor(message = '') {
|
|
7
|
+
this.message = message;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
exports.SkippingRequest = SkippingRequest;
|
|
11
|
+
class WebSocketFetcher {
|
|
12
|
+
constructor(requestsInfo, logger) {
|
|
13
|
+
this.logger = logger;
|
|
14
|
+
this.lastFetchSucceeded = false;
|
|
15
|
+
this.stop = true;
|
|
16
|
+
this.ws = new websocket_1.client();
|
|
17
|
+
this.connection = null;
|
|
18
|
+
this.requests = requestsInfo;
|
|
19
|
+
this.ws.on('connect', this.connected.bind(this));
|
|
20
|
+
this.ws.on('connectFailed', this.connectFailed.bind(this));
|
|
21
|
+
}
|
|
22
|
+
connected(connection) {
|
|
23
|
+
this.connection = connection;
|
|
24
|
+
this.logger.info(`Connected to ${this.requests.info.requestOptions.url}`);
|
|
25
|
+
this.connection.on('error', this.onError.bind(this));
|
|
26
|
+
this.connection.on('close', this.onClose.bind(this));
|
|
27
|
+
this.connection.on('message', this.onMessage.bind(this));
|
|
28
|
+
}
|
|
29
|
+
connectFailed(error) {
|
|
30
|
+
this.logger.error(`Connect Error: ${error.toString()}`);
|
|
31
|
+
}
|
|
32
|
+
onClose() {
|
|
33
|
+
this.logger.info(`Connection closed`);
|
|
34
|
+
}
|
|
35
|
+
onError(error) {
|
|
36
|
+
this.logger.error(`Connection Error: ${error.toString()}`);
|
|
37
|
+
}
|
|
38
|
+
onMessage(message) {
|
|
39
|
+
if (message.type === 'utf8') {
|
|
40
|
+
const response = JSON.parse(message.utf8Data);
|
|
41
|
+
const reqInfo = this.requests;
|
|
42
|
+
const info = reqInfo.info;
|
|
43
|
+
const options = reqInfo.info.requestOptions;
|
|
44
|
+
this.logger.debug(`(${options.url}) received new data`);
|
|
45
|
+
try {
|
|
46
|
+
const parsedData = info.caster(response);
|
|
47
|
+
reqInfo.handler(parsedData);
|
|
48
|
+
}
|
|
49
|
+
catch (e) {
|
|
50
|
+
this.logger.info(e);
|
|
51
|
+
this.logger.info(`(${options.url}) received incorrect data ${JSON.stringify(response).replace(/(?:\r\n|\r|\n)/g, ' ')}`, e);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
connect() {
|
|
57
|
+
const authorization = this.requests.info.requestOptions.headers.authorization;
|
|
58
|
+
const name = this.requests.info.requestOptions.headers.name;
|
|
59
|
+
if (typeof authorization !== 'string') {
|
|
60
|
+
throw new Error('Authorization header is not a string');
|
|
61
|
+
}
|
|
62
|
+
if (typeof name !== 'string') {
|
|
63
|
+
throw new Error('Name header is not a string');
|
|
64
|
+
}
|
|
65
|
+
this.ws.connect(this.requests.info.requestOptions.url, undefined, undefined, {
|
|
66
|
+
Authorization: authorization,
|
|
67
|
+
name: name,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
startPolling() {
|
|
71
|
+
this.stop = false;
|
|
72
|
+
this.connect();
|
|
73
|
+
this.logger.info(`Connection started for ${this.requests.info.requestOptions.url}`);
|
|
74
|
+
}
|
|
75
|
+
stopPolling() {
|
|
76
|
+
if (this.connection) {
|
|
77
|
+
this.connection.close();
|
|
78
|
+
}
|
|
79
|
+
this.stop = true;
|
|
80
|
+
this.logger.info(`Connection stopped for ${this.requests.info.requestOptions.url}`);
|
|
81
|
+
}
|
|
82
|
+
isPolling() {
|
|
83
|
+
return !this.stop;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
exports.WebSocketFetcher = WebSocketFetcher;
|
|
87
|
+
//# sourceMappingURL=websocket-fetcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websocket-fetcher.js","sourceRoot":"","sources":["../../../src/dex/bebop/websocket-fetcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { Address, NumberAsString, OptimalSwapExchange, SwapSide } from '@paraswap/core';
|
|
2
|
+
import { AsyncOrSync } from 'ts-essentials';
|
|
3
|
+
import { Network } from '../../constants';
|
|
4
|
+
import { IDexHelper } from '../../dex-helper';
|
|
5
|
+
import { AdapterExchangeParam, DexExchangeParam, ExchangePrices, ExchangeTxInfo, Logger, PoolLiquidity, PoolPrices, PreprocessTransactionOptions, Token, TransferFeeParams } from '../../types';
|
|
6
|
+
import { IDex } from '../idex';
|
|
7
|
+
import { SimpleExchange } from '../simple-exchange';
|
|
8
|
+
import { CablesData } from './types';
|
|
9
|
+
import { Interface } from 'ethers/lib/utils';
|
|
10
|
+
export declare class Cables extends SimpleExchange implements IDex<any> {
|
|
11
|
+
readonly network: Network;
|
|
12
|
+
readonly dexKey: string;
|
|
13
|
+
readonly dexHelper: IDexHelper;
|
|
14
|
+
readonly mainnetRFQAddress: string;
|
|
15
|
+
protected rfqInterface: Interface;
|
|
16
|
+
static dexKeysWithNetwork: {
|
|
17
|
+
key: string;
|
|
18
|
+
networks: Network[];
|
|
19
|
+
}[];
|
|
20
|
+
private rateFetcher;
|
|
21
|
+
logger: Logger;
|
|
22
|
+
private tokensMap;
|
|
23
|
+
constructor(network: Network, dexKey: string, dexHelper: IDexHelper, mainnetRFQAddress?: string, rfqInterface?: Interface);
|
|
24
|
+
hasConstantPriceLargeAmounts: boolean;
|
|
25
|
+
needsSequentialPreprocessing?: boolean | undefined;
|
|
26
|
+
getNetworkFee?(srcToken: Address, destToken: Address, srcAmount: NumberAsString, destAmount: NumberAsString, data: CablesData, side: SwapSide): NumberAsString;
|
|
27
|
+
preProcessTransaction?(optimalSwapExchange: OptimalSwapExchange<CablesData>, srcToken: Token, destToken: Token, side: SwapSide, options: PreprocessTransactionOptions): Promise<[OptimalSwapExchange<CablesData>, ExchangeTxInfo]>;
|
|
28
|
+
getTokenFromAddress(address: Address): Token;
|
|
29
|
+
getDexParam(srcToken: Address, destToken: Address, srcAmount: NumberAsString, destAmount: NumberAsString, recipient: Address, data: CablesData, side: SwapSide): DexExchangeParam;
|
|
30
|
+
getAdapterParam(srcToken: string, destToken: string, srcAmount: string, destAmount: string, data: CablesData, side: SwapSide): AdapterExchangeParam;
|
|
31
|
+
normalizeToken(token: Token): Token;
|
|
32
|
+
normalizeTokenAddress(address: Address): Address;
|
|
33
|
+
/**
|
|
34
|
+
* POOLS
|
|
35
|
+
*/
|
|
36
|
+
getPoolIdentifier(srcAddress: Address, destAddress: Address, mm?: string): string;
|
|
37
|
+
getPoolIdentifiers(srcToken: Token, destToken: Token, side: SwapSide, blockNumber: number): Promise<string[]>;
|
|
38
|
+
getPricesVolume(srcToken: Token, destToken: Token, amounts: bigint[], side: SwapSide, blockNumber: number, limitPools?: string[], transferFees?: TransferFeeParams, isFirstSwap?: boolean): Promise<ExchangePrices<CablesData> | null>;
|
|
39
|
+
getCalldataGasCost(poolPrices: PoolPrices<CablesData>): number | number[];
|
|
40
|
+
initializePricing(blockNumber: number): Promise<void>;
|
|
41
|
+
getAdapters(side: SwapSide): {
|
|
42
|
+
name: string;
|
|
43
|
+
index: number;
|
|
44
|
+
}[] | null;
|
|
45
|
+
releaseResources?(): AsyncOrSync<void>;
|
|
46
|
+
addMasterPool?(poolKey: string, blockNumber: number): AsyncOrSync<boolean>;
|
|
47
|
+
/**
|
|
48
|
+
* Blacklist
|
|
49
|
+
*/
|
|
50
|
+
isBlacklisted?(userAddress?: Address): AsyncOrSync<boolean>;
|
|
51
|
+
setBlacklist?(userAddress?: Address): AsyncOrSync<boolean>;
|
|
52
|
+
updatePoolState?(): AsyncOrSync<void>;
|
|
53
|
+
getTopPoolsForToken(tokenAddress: Address, limit: number): AsyncOrSync<PoolLiquidity[]>;
|
|
54
|
+
/**
|
|
55
|
+
* CACHED UTILS
|
|
56
|
+
*/
|
|
57
|
+
getCachedTokens(): Promise<any>;
|
|
58
|
+
getCachedPairs(): Promise<any>;
|
|
59
|
+
getCachedPrices(): Promise<any>;
|
|
60
|
+
getCachedTokensAddr(): Promise<any>;
|
|
61
|
+
getPairString(baseToken: Token, quoteToken: Token): string;
|
|
62
|
+
private findKeyByAddress;
|
|
63
|
+
getPairData(srcToken: Token, destToken: Token): Promise<any>;
|
|
64
|
+
}
|