@d8x/perpetuals-sdk 0.7.7 → 0.7.8
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/dist/cjs/abi/IPyth.json +471 -0
- package/dist/cjs/abi/OracleFactory.json +457 -0
- package/dist/cjs/accountTrade.js +134 -243
- package/dist/cjs/accountTrade.js.map +1 -1
- package/dist/cjs/brokerTool.js +144 -290
- package/dist/cjs/brokerTool.js.map +1 -1
- package/dist/cjs/config/priceFeedConfig.json +1 -1
- package/dist/cjs/contracts/IPyth.d.ts +234 -0
- package/dist/cjs/contracts/IPyth.js +3 -0
- package/dist/cjs/contracts/IPyth.js.map +1 -0
- package/dist/cjs/contracts/OracleFactory.d.ts +288 -0
- package/dist/cjs/contracts/OracleFactory.js +3 -0
- package/dist/cjs/contracts/OracleFactory.js.map +1 -0
- package/dist/cjs/contracts/factories/ERC20__factory.js +9 -12
- package/dist/cjs/contracts/factories/ERC20__factory.js.map +1 -1
- package/dist/cjs/contracts/factories/IPerpetualManager__factory.js +9 -12
- package/dist/cjs/contracts/factories/IPerpetualManager__factory.js.map +1 -1
- package/dist/cjs/contracts/factories/IPyth__factory.d.ts +367 -0
- package/dist/cjs/contracts/factories/IPyth__factory.js +489 -0
- package/dist/cjs/contracts/factories/IPyth__factory.js.map +1 -0
- package/dist/cjs/contracts/factories/LimitOrderBookFactory__factory.js +9 -12
- package/dist/cjs/contracts/factories/LimitOrderBookFactory__factory.js.map +1 -1
- package/dist/cjs/contracts/factories/LimitOrderBook__factory.js +9 -12
- package/dist/cjs/contracts/factories/LimitOrderBook__factory.js.map +1 -1
- package/dist/cjs/contracts/factories/MockTokenSwap__factory.js +9 -12
- package/dist/cjs/contracts/factories/MockTokenSwap__factory.js.map +1 -1
- package/dist/cjs/contracts/factories/OracleFactory__factory.d.ts +361 -0
- package/dist/cjs/contracts/factories/OracleFactory__factory.js +475 -0
- package/dist/cjs/contracts/factories/OracleFactory__factory.js.map +1 -0
- package/dist/cjs/contracts/factories/ShareToken__factory.js +9 -12
- package/dist/cjs/contracts/factories/ShareToken__factory.js.map +1 -1
- package/dist/cjs/contracts/factories/index.d.ts +2 -0
- package/dist/cjs/contracts/factories/index.js +5 -1
- package/dist/cjs/contracts/factories/index.js.map +1 -1
- package/dist/cjs/contracts/index.d.ts +4 -0
- package/dist/cjs/contracts/index.js +6 -2
- package/dist/cjs/contracts/index.js.map +1 -1
- package/dist/cjs/d8XMath.js +65 -66
- package/dist/cjs/d8XMath.js.map +1 -1
- package/dist/cjs/index.d.ts +2 -1
- package/dist/cjs/index.js +14 -12
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/liquidatorTool.js +80 -137
- package/dist/cjs/liquidatorTool.js.map +1 -1
- package/dist/cjs/liquidityProviderTool.js +33 -65
- package/dist/cjs/liquidityProviderTool.js.map +1 -1
- package/dist/cjs/marketData.js +635 -978
- package/dist/cjs/marketData.js.map +1 -1
- package/dist/cjs/nodeSDKTypes.js +10 -22
- package/dist/cjs/nodeSDKTypes.js.map +1 -1
- package/dist/cjs/orderReferrerTool.js +200 -323
- package/dist/cjs/orderReferrerTool.js.map +1 -1
- package/dist/cjs/perpetualDataHandler.js +404 -550
- package/dist/cjs/perpetualDataHandler.js.map +1 -1
- package/dist/cjs/perpetualEventHandler.js +129 -190
- package/dist/cjs/perpetualEventHandler.js.map +1 -1
- package/dist/cjs/priceFeeds.js +223 -335
- package/dist/cjs/priceFeeds.js.map +1 -1
- package/dist/cjs/traderDigests.js +20 -23
- package/dist/cjs/traderDigests.js.map +1 -1
- package/dist/cjs/traderInterface.js +54 -87
- package/dist/cjs/traderInterface.js.map +1 -1
- package/dist/cjs/triangulator.js +34 -38
- package/dist/cjs/triangulator.js.map +1 -1
- package/dist/cjs/utils.js +18 -32
- package/dist/cjs/utils.js.map +1 -1
- package/dist/cjs/version.d.ts +1 -1
- package/dist/cjs/version.js +1 -1
- package/dist/cjs/writeAccessHandler.js +78 -112
- package/dist/cjs/writeAccessHandler.js.map +1 -1
- package/dist/esm/abi/IPyth.json +471 -0
- package/dist/esm/abi/OracleFactory.json +457 -0
- package/dist/esm/accountTrade.js +126 -237
- package/dist/esm/accountTrade.js.map +1 -1
- package/dist/esm/brokerTool.js +136 -284
- package/dist/esm/brokerTool.js.map +1 -1
- package/dist/esm/config/priceFeedConfig.json +1 -1
- package/dist/esm/contracts/IPyth.d.ts +234 -0
- package/dist/esm/contracts/IPyth.js +2 -0
- package/dist/esm/contracts/IPyth.js.map +1 -0
- package/dist/esm/contracts/OracleFactory.d.ts +288 -0
- package/dist/esm/contracts/OracleFactory.js +2 -0
- package/dist/esm/contracts/OracleFactory.js.map +1 -0
- package/dist/esm/contracts/factories/ERC20__factory.js +8 -12
- package/dist/esm/contracts/factories/ERC20__factory.js.map +1 -1
- package/dist/esm/contracts/factories/IPerpetualManager__factory.js +8 -12
- package/dist/esm/contracts/factories/IPerpetualManager__factory.js.map +1 -1
- package/dist/esm/contracts/factories/IPyth__factory.d.ts +367 -0
- package/dist/esm/contracts/factories/IPyth__factory.js +485 -0
- package/dist/esm/contracts/factories/IPyth__factory.js.map +1 -0
- package/dist/esm/contracts/factories/LimitOrderBookFactory__factory.js +8 -12
- package/dist/esm/contracts/factories/LimitOrderBookFactory__factory.js.map +1 -1
- package/dist/esm/contracts/factories/LimitOrderBook__factory.js +8 -12
- package/dist/esm/contracts/factories/LimitOrderBook__factory.js.map +1 -1
- package/dist/esm/contracts/factories/MockTokenSwap__factory.js +8 -12
- package/dist/esm/contracts/factories/MockTokenSwap__factory.js.map +1 -1
- package/dist/esm/contracts/factories/OracleFactory__factory.d.ts +361 -0
- package/dist/esm/contracts/factories/OracleFactory__factory.js +471 -0
- package/dist/esm/contracts/factories/OracleFactory__factory.js.map +1 -0
- package/dist/esm/contracts/factories/ShareToken__factory.js +8 -12
- package/dist/esm/contracts/factories/ShareToken__factory.js.map +1 -1
- package/dist/esm/contracts/factories/index.d.ts +2 -0
- package/dist/esm/contracts/factories/index.js +2 -0
- package/dist/esm/contracts/factories/index.js.map +1 -1
- package/dist/esm/contracts/index.d.ts +4 -0
- package/dist/esm/contracts/index.js +2 -0
- package/dist/esm/contracts/index.js.map +1 -1
- package/dist/esm/d8XMath.js +63 -64
- package/dist/esm/d8XMath.js.map +1 -1
- package/dist/esm/index.d.ts +2 -1
- package/dist/esm/index.js +2 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/liquidatorTool.js +77 -136
- package/dist/esm/liquidatorTool.js.map +1 -1
- package/dist/esm/liquidityProviderTool.js +29 -63
- package/dist/esm/liquidityProviderTool.js.map +1 -1
- package/dist/esm/marketData.js +626 -971
- package/dist/esm/marketData.js.map +1 -1
- package/dist/esm/nodeSDKTypes.js +36 -48
- package/dist/esm/nodeSDKTypes.js.map +1 -1
- package/dist/esm/orderReferrerTool.js +194 -319
- package/dist/esm/orderReferrerTool.js.map +1 -1
- package/dist/esm/perpetualDataHandler.js +394 -542
- package/dist/esm/perpetualDataHandler.js.map +1 -1
- package/dist/esm/perpetualEventHandler.js +126 -188
- package/dist/esm/perpetualEventHandler.js.map +1 -1
- package/dist/esm/priceFeeds.js +218 -332
- package/dist/esm/priceFeeds.js.map +1 -1
- package/dist/esm/traderDigests.js +15 -19
- package/dist/esm/traderDigests.js.map +1 -1
- package/dist/esm/traderInterface.js +48 -83
- package/dist/esm/traderInterface.js.map +1 -1
- package/dist/esm/triangulator.js +34 -39
- package/dist/esm/triangulator.js.map +1 -1
- package/dist/esm/utils.js +16 -30
- package/dist/esm/utils.js.map +1 -1
- package/dist/esm/version.d.ts +1 -1
- package/dist/esm/version.js +1 -1
- package/dist/esm/version.js.map +1 -1
- package/dist/esm/writeAccessHandler.js +69 -105
- package/dist/esm/writeAccessHandler.js.map +1 -1
- package/package.json +1 -1
- package/src/abi/IPyth.json +471 -0
- package/src/abi/OracleFactory.json +457 -0
- package/src/accountTrade.ts +1 -6
- package/src/config/priceFeedConfig.json +1 -1
- package/src/contracts/IPyth.ts +571 -0
- package/src/contracts/OracleFactory.ts +708 -0
- package/src/contracts/factories/IPyth__factory.ts +489 -0
- package/src/contracts/factories/{zkevmTestnet/ShareToken__factory.ts → OracleFactory__factory.ts} +222 -206
- package/src/contracts/factories/index.ts +2 -0
- package/src/contracts/index.ts +4 -0
- package/src/index.ts +2 -0
- package/src/orderReferrerTool.ts +1 -3
- package/src/priceFeeds.ts +1 -1
- package/src/version.ts +1 -1
- package/src/contracts/factories/zkevmTestnet/IPerpetualManager__factory.ts +0 -5804
- package/src/contracts/factories/zkevmTestnet/LimitOrderBookFactory__factory.ts +0 -263
- package/src/contracts/factories/zkevmTestnet/LimitOrderBook__factory.ts +0 -1131
- package/src/contracts/factories/zkevmTestnet/index.ts +0 -7
- package/src/contracts/zkevmTestnet/IPerpetualManager.ts +0 -7109
- package/src/contracts/zkevmTestnet/LimitOrderBook.ts +0 -1341
- package/src/contracts/zkevmTestnet/LimitOrderBookFactory.ts +0 -472
- package/src/contracts/zkevmTestnet/ShareToken.ts +0 -695
- package/src/contracts/zkevmTestnet/index.ts +0 -7
package/dist/cjs/priceFeeds.js
CHANGED
|
@@ -1,22 +1,21 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
const bignumber_1 = require("@ethersproject/bignumber");
|
|
5
|
+
const triangulator_1 = tslib_1.__importDefault(require("./triangulator"));
|
|
6
|
+
const d8XMath_1 = require("./d8XMath");
|
|
7
|
+
const buffer_1 = require("buffer");
|
|
8
8
|
/**
|
|
9
9
|
* This class communicates with the REST API that provides price-data that is
|
|
10
10
|
* to be submitted to the smart contracts for certain functions such as
|
|
11
11
|
* trader liquidations, trade executions, change of trader margin amount.
|
|
12
12
|
*/
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
var _a;
|
|
13
|
+
class PriceFeeds {
|
|
14
|
+
constructor(dataHandler, priceFeedConfigNetwork) {
|
|
16
15
|
this.THRESHOLD_MARKET_CLOSED_SEC = 15; // smallest lag for which we consider the market as being closed
|
|
17
|
-
|
|
16
|
+
let configs = require("./config/priceFeedConfig.json");
|
|
18
17
|
this.config = PriceFeeds._selectConfig(configs, priceFeedConfigNetwork);
|
|
19
|
-
|
|
18
|
+
[this.feedInfo, this.feedEndpoints] = PriceFeeds._constructFeedInfo(this.config);
|
|
20
19
|
this.dataHandler = dataHandler;
|
|
21
20
|
this.triangulations = new Map();
|
|
22
21
|
}
|
|
@@ -24,140 +23,84 @@ var PriceFeeds = /** @class */ (function () {
|
|
|
24
23
|
* Pre-processing of triangulations for symbols, given the price feeds
|
|
25
24
|
* @param symbols set of symbols we want to triangulate from price feeds
|
|
26
25
|
*/
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
for (var _c = tslib_1.__values(this.feedInfo), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
32
|
-
var _e = tslib_1.__read(_d.value, 2), value = _e[1];
|
|
33
|
-
feedSymbols.push(value.symbol);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
37
|
-
finally {
|
|
38
|
-
try {
|
|
39
|
-
if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
|
|
40
|
-
}
|
|
41
|
-
finally { if (e_1) throw e_1.error; }
|
|
26
|
+
initializeTriangulations(symbols) {
|
|
27
|
+
let feedSymbols = new Array();
|
|
28
|
+
for (let [, value] of this.feedInfo) {
|
|
29
|
+
feedSymbols.push(value.symbol);
|
|
42
30
|
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
var triangulation = triangulator_1.default.triangulate(feedSymbols, symbol);
|
|
47
|
-
this.triangulations.set(symbol, triangulation);
|
|
48
|
-
}
|
|
31
|
+
for (let symbol of symbols.values()) {
|
|
32
|
+
let triangulation = triangulator_1.default.triangulate(feedSymbols, symbol);
|
|
33
|
+
this.triangulations.set(symbol, triangulation);
|
|
49
34
|
}
|
|
50
|
-
|
|
51
|
-
finally {
|
|
52
|
-
try {
|
|
53
|
-
if (_g && !_g.done && (_b = _f.return)) _b.call(_f);
|
|
54
|
-
}
|
|
55
|
-
finally { if (e_2) throw e_2.error; }
|
|
56
|
-
}
|
|
57
|
-
};
|
|
35
|
+
}
|
|
58
36
|
/**
|
|
59
37
|
* Get required information to be able to submit a blockchain transaction with price-update
|
|
60
38
|
* such as trade execution, liquidation
|
|
61
39
|
* @param symbol symbol of perpetual, e.g., BTC-USD-MATIC
|
|
62
40
|
* @returns PriceFeedSubmission, index prices, market closed information
|
|
63
41
|
*/
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
idxPrices[1] = _idxPrices[1];
|
|
79
|
-
mktClosed[1] = _mktClosed[1];
|
|
80
|
-
}
|
|
81
|
-
return [2 /*return*/, { submission: submission, pxS2S3: idxPrices, mktClosed: mktClosed }];
|
|
82
|
-
}
|
|
83
|
-
});
|
|
84
|
-
});
|
|
85
|
-
};
|
|
42
|
+
async fetchFeedPriceInfoAndIndicesForPerpetual(symbol) {
|
|
43
|
+
let indexSymbols = this.dataHandler.getIndexSymbols(symbol);
|
|
44
|
+
// fetch prices from required price-feeds (REST)
|
|
45
|
+
let submission = await this.fetchLatestFeedPriceInfoForPerpetual(symbol);
|
|
46
|
+
// calculate index-prices from price-feeds
|
|
47
|
+
let [_idxPrices, _mktClosed] = this.calculateTriangulatedPricesFromFeedInfo(indexSymbols.filter((x) => x != ""), submission);
|
|
48
|
+
let idxPrices = [_idxPrices[0], 0];
|
|
49
|
+
let mktClosed = [_mktClosed[0], false];
|
|
50
|
+
if (idxPrices.length > 1) {
|
|
51
|
+
idxPrices[1] = _idxPrices[1];
|
|
52
|
+
mktClosed[1] = _mktClosed[1];
|
|
53
|
+
}
|
|
54
|
+
return { submission: submission, pxS2S3: idxPrices, mktClosed: mktClosed };
|
|
55
|
+
}
|
|
86
56
|
/**
|
|
87
57
|
* Get all prices/isMarketClosed for the provided symbols via
|
|
88
58
|
* "latest_price_feeds" and triangulation. Triangulation must be defined in config, unless
|
|
89
59
|
* it is a direct price feed.
|
|
90
60
|
* @returns map of feed-price symbol to price/isMarketClosed
|
|
91
61
|
*/
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
symMap = new Map();
|
|
102
|
-
for (k = 0; k < symbols.length; k++) {
|
|
103
|
-
symMap.set(symbols[k], [prices[k], mktClosed[k]]);
|
|
104
|
-
}
|
|
105
|
-
return [2 /*return*/, symMap];
|
|
106
|
-
}
|
|
107
|
-
});
|
|
108
|
-
});
|
|
109
|
-
};
|
|
62
|
+
async fetchPrices(symbols) {
|
|
63
|
+
let feedPrices = await this.fetchAllFeedPrices();
|
|
64
|
+
let [prices, mktClosed] = this.triangulatePricesFromFeedPrices(symbols, feedPrices);
|
|
65
|
+
let symMap = new Map();
|
|
66
|
+
for (let k = 0; k < symbols.length; k++) {
|
|
67
|
+
symMap.set(symbols[k], [prices[k], mktClosed[k]]);
|
|
68
|
+
}
|
|
69
|
+
return symMap;
|
|
70
|
+
}
|
|
110
71
|
/**
|
|
111
72
|
* Get index prices and market closed information for the given perpetual
|
|
112
73
|
* @param symbol perpetual symbol such as ETH-USD-MATIC
|
|
113
74
|
* @returns Index prices and market closed information
|
|
114
75
|
*/
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
for (indexSymbols_1 = tslib_1.__values(indexSymbols), indexSymbols_1_1 = indexSymbols_1.next(); !indexSymbols_1_1.done; indexSymbols_1_1 = indexSymbols_1.next()) {
|
|
126
|
-
sym = indexSymbols_1_1.value;
|
|
127
|
-
if (sym != "") {
|
|
128
|
-
triang = this.triangulations.get(sym);
|
|
129
|
-
if (triang == undefined) {
|
|
130
|
-
// no triangulation defined, so symbol must be a feed (unless misconfigured)
|
|
131
|
-
feedSymbols.push(sym);
|
|
132
|
-
}
|
|
133
|
-
else {
|
|
134
|
-
// push all required feeds to array
|
|
135
|
-
triang[0].map(function (feedSym) { return feedSymbols.push(feedSym); });
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
catch (e_3_1) { e_3 = { error: e_3_1 }; }
|
|
141
|
-
finally {
|
|
142
|
-
try {
|
|
143
|
-
if (indexSymbols_1_1 && !indexSymbols_1_1.done && (_b = indexSymbols_1.return)) _b.call(indexSymbols_1);
|
|
144
|
-
}
|
|
145
|
-
finally { if (e_3) throw e_3.error; }
|
|
146
|
-
}
|
|
147
|
-
return [4 /*yield*/, this.fetchFeedPrices(feedSymbols)];
|
|
148
|
-
case 1:
|
|
149
|
-
feedPrices = _c.sent();
|
|
150
|
-
_a = tslib_1.__read(this.triangulatePricesFromFeedPrices(indexSymbols, feedPrices), 2), prices = _a[0], mktClosed = _a[1];
|
|
151
|
-
// ensure we return an array of 2 in all cases
|
|
152
|
-
if (prices.length == 1) {
|
|
153
|
-
prices.push(0);
|
|
154
|
-
mktClosed.push(false);
|
|
155
|
-
}
|
|
156
|
-
return [2 /*return*/, { idxPrices: prices, mktClosed: mktClosed }];
|
|
76
|
+
async fetchPricesForPerpetual(symbol) {
|
|
77
|
+
let indexSymbols = this.dataHandler.getIndexSymbols(symbol).filter((x) => x != "");
|
|
78
|
+
// determine relevant price feeds
|
|
79
|
+
let feedSymbols = new Array();
|
|
80
|
+
for (let sym of indexSymbols) {
|
|
81
|
+
if (sym != "") {
|
|
82
|
+
let triang = this.triangulations.get(sym);
|
|
83
|
+
if (triang == undefined) {
|
|
84
|
+
// no triangulation defined, so symbol must be a feed (unless misconfigured)
|
|
85
|
+
feedSymbols.push(sym);
|
|
157
86
|
}
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
87
|
+
else {
|
|
88
|
+
// push all required feeds to array
|
|
89
|
+
triang[0].map((feedSym) => feedSymbols.push(feedSym));
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// get all feed prices
|
|
94
|
+
let feedPrices = await this.fetchFeedPrices(feedSymbols);
|
|
95
|
+
// triangulate
|
|
96
|
+
let [prices, mktClosed] = this.triangulatePricesFromFeedPrices(indexSymbols, feedPrices);
|
|
97
|
+
// ensure we return an array of 2 in all cases
|
|
98
|
+
if (prices.length == 1) {
|
|
99
|
+
prices.push(0);
|
|
100
|
+
mktClosed.push(false);
|
|
101
|
+
}
|
|
102
|
+
return { idxPrices: prices, mktClosed: mktClosed };
|
|
103
|
+
}
|
|
161
104
|
/**
|
|
162
105
|
* Fetch the provided feed prices and bool whether market is closed or open
|
|
163
106
|
* - requires the feeds to be defined in priceFeedConfig.json
|
|
@@ -165,68 +108,49 @@ var PriceFeeds = /** @class */ (function () {
|
|
|
165
108
|
* @param symbols array of feed-price symbols (e.g., [btc-usd, eth-usd]) or undefined
|
|
166
109
|
* @returns mapping symbol-> [price, isMarketClosed]
|
|
167
110
|
*/
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
tsSecNow = Math.round(Date.now() / 1000);
|
|
205
|
-
for (j = 0; j < pxInfo.length; j++) {
|
|
206
|
-
price = (0, d8XMath_1.decNToFloat)(bignumber_1.BigNumber.from(pxInfo[j].price), -pxInfo[j].expo);
|
|
207
|
-
isMarketClosed = tsSecNow - pxInfo[j].publish_time > this.THRESHOLD_MARKET_CLOSED_SEC;
|
|
208
|
-
resultPrices.set(symbolsOfEndpoint[k][j], [price, isMarketClosed]);
|
|
209
|
-
}
|
|
210
|
-
_b.label = 3;
|
|
211
|
-
case 3:
|
|
212
|
-
k++;
|
|
213
|
-
return [3 /*break*/, 1];
|
|
214
|
-
case 4: return [2 /*return*/, resultPrices];
|
|
215
|
-
}
|
|
216
|
-
});
|
|
217
|
-
});
|
|
218
|
-
};
|
|
111
|
+
async fetchFeedPrices(symbols) {
|
|
112
|
+
let queries = new Array(this.feedEndpoints.length);
|
|
113
|
+
let symbolsOfEndpoint = [];
|
|
114
|
+
for (let j = 0; j < queries.length; j++) {
|
|
115
|
+
symbolsOfEndpoint.push([]);
|
|
116
|
+
}
|
|
117
|
+
for (let k = 0; k < this.config.ids.length; k++) {
|
|
118
|
+
let currFeed = this.config.ids[k];
|
|
119
|
+
if (symbols != undefined && !symbols.includes(currFeed.symbol)) {
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
// feedInfo: Map<string, {symbol:string, endpointId: number}>; // priceFeedId -> symbol, endpointId
|
|
123
|
+
let endpointId = this.feedInfo.get(currFeed.id).endpointId;
|
|
124
|
+
symbolsOfEndpoint[endpointId].push(currFeed.symbol);
|
|
125
|
+
if (queries[endpointId] == undefined) {
|
|
126
|
+
// each id can have a different endpoint, but we cluster
|
|
127
|
+
// the queries into one per endpoint
|
|
128
|
+
queries[endpointId] = this.feedEndpoints[endpointId] + "/latest_price_feeds?";
|
|
129
|
+
}
|
|
130
|
+
queries[endpointId] = queries[endpointId] + "ids[]=" + currFeed.id + "&";
|
|
131
|
+
}
|
|
132
|
+
let resultPrices = new Map();
|
|
133
|
+
for (let k = 0; k < queries.length; k++) {
|
|
134
|
+
if (queries[k] == undefined) {
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
let [, pxInfo] = await this.fetchPriceQuery(queries[k]);
|
|
138
|
+
let tsSecNow = Math.round(Date.now() / 1000);
|
|
139
|
+
for (let j = 0; j < pxInfo.length; j++) {
|
|
140
|
+
let price = (0, d8XMath_1.decNToFloat)(bignumber_1.BigNumber.from(pxInfo[j].price), -pxInfo[j].expo);
|
|
141
|
+
let isMarketClosed = tsSecNow - pxInfo[j].publish_time > this.THRESHOLD_MARKET_CLOSED_SEC;
|
|
142
|
+
resultPrices.set(symbolsOfEndpoint[k][j], [price, isMarketClosed]);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
return resultPrices;
|
|
146
|
+
}
|
|
219
147
|
/**
|
|
220
148
|
* Get all configured feed prices via "latest_price_feeds"
|
|
221
149
|
* @returns map of feed-price symbol to price/isMarketClosed
|
|
222
150
|
*/
|
|
223
|
-
|
|
224
|
-
return
|
|
225
|
-
|
|
226
|
-
return [2 /*return*/, this.fetchFeedPrices()];
|
|
227
|
-
});
|
|
228
|
-
});
|
|
229
|
-
};
|
|
151
|
+
async fetchAllFeedPrices() {
|
|
152
|
+
return this.fetchFeedPrices();
|
|
153
|
+
}
|
|
230
154
|
/**
|
|
231
155
|
* Get the latest prices for a given perpetual from the offchain oracle
|
|
232
156
|
* networks
|
|
@@ -234,75 +158,64 @@ var PriceFeeds = /** @class */ (function () {
|
|
|
234
158
|
* @returns array of price feed updates that can be submitted to the smart contract
|
|
235
159
|
* and corresponding price information
|
|
236
160
|
*/
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
return [2 /*return*/, {
|
|
296
|
-
symbols: symbols,
|
|
297
|
-
priceFeedVaas: priceFeedUpdates,
|
|
298
|
-
prices: prices,
|
|
299
|
-
isMarketClosed: mktClosed,
|
|
300
|
-
timestamps: timestamps,
|
|
301
|
-
}];
|
|
302
|
-
}
|
|
303
|
-
});
|
|
304
|
-
});
|
|
305
|
-
};
|
|
161
|
+
async fetchLatestFeedPriceInfoForPerpetual(symbol) {
|
|
162
|
+
let feedIds = this.dataHandler.getPriceIds(symbol);
|
|
163
|
+
let queries = new Array(this.feedEndpoints.length);
|
|
164
|
+
// we need to preserve the order of the price feeds
|
|
165
|
+
let orderEndpointNumber = new Array();
|
|
166
|
+
// count how many prices per endpoint
|
|
167
|
+
let idCountPriceFeeds = new Array(this.feedEndpoints.length);
|
|
168
|
+
let symbols = new Array();
|
|
169
|
+
for (let k = 0; k < feedIds.length; k++) {
|
|
170
|
+
let info = this.feedInfo.get(feedIds[k]);
|
|
171
|
+
if (info == undefined) {
|
|
172
|
+
throw new Error(`priceFeeds: config for symbol ${symbol} insufficient`);
|
|
173
|
+
}
|
|
174
|
+
let id = info.endpointId;
|
|
175
|
+
symbols.push(info.symbol);
|
|
176
|
+
if (queries[id] == undefined) {
|
|
177
|
+
// each id can have a different endpoint, but we cluster
|
|
178
|
+
// the queries into one per endpoint
|
|
179
|
+
queries[id] = this.feedEndpoints[id] + "/latest_price_feeds?binary=true&";
|
|
180
|
+
idCountPriceFeeds[id] = 0;
|
|
181
|
+
}
|
|
182
|
+
queries[id] = queries[id] + "ids[]=" + feedIds[k] + "&";
|
|
183
|
+
orderEndpointNumber.push(id * 100 + idCountPriceFeeds[id]);
|
|
184
|
+
idCountPriceFeeds[id] = idCountPriceFeeds[id] + 1;
|
|
185
|
+
}
|
|
186
|
+
let data = await Promise.all(queries.map(async (q) => {
|
|
187
|
+
if (q != undefined) {
|
|
188
|
+
return this.fetchVAAQuery(q);
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
return [[], []];
|
|
192
|
+
}
|
|
193
|
+
}));
|
|
194
|
+
// re-order arrays so we preserve the order of the feeds
|
|
195
|
+
const priceFeedUpdates = new Array();
|
|
196
|
+
const prices = new Array();
|
|
197
|
+
const mktClosed = new Array();
|
|
198
|
+
const timestamps = new Array();
|
|
199
|
+
const tsSecNow = Math.round(Date.now() / 1000);
|
|
200
|
+
for (let k = 0; k < orderEndpointNumber.length; k++) {
|
|
201
|
+
let endpointId = Math.floor(orderEndpointNumber[k] / 100);
|
|
202
|
+
let idWithinEndpoint = orderEndpointNumber[k] - 100 * endpointId;
|
|
203
|
+
priceFeedUpdates.push(data[endpointId][0][idWithinEndpoint]);
|
|
204
|
+
let pxInfo = data[endpointId][1][idWithinEndpoint];
|
|
205
|
+
let price = (0, d8XMath_1.decNToFloat)(bignumber_1.BigNumber.from(pxInfo.price), -pxInfo.expo);
|
|
206
|
+
let isMarketClosed = tsSecNow - pxInfo.publish_time > this.THRESHOLD_MARKET_CLOSED_SEC;
|
|
207
|
+
mktClosed.push(isMarketClosed);
|
|
208
|
+
prices.push(price);
|
|
209
|
+
timestamps.push(pxInfo.publish_time);
|
|
210
|
+
}
|
|
211
|
+
return {
|
|
212
|
+
symbols: symbols,
|
|
213
|
+
priceFeedVaas: priceFeedUpdates,
|
|
214
|
+
prices: prices,
|
|
215
|
+
isMarketClosed: mktClosed,
|
|
216
|
+
timestamps: timestamps,
|
|
217
|
+
};
|
|
218
|
+
}
|
|
306
219
|
/**
|
|
307
220
|
* Extract pair-prices from underlying price feeds via triangulation
|
|
308
221
|
* The function either needs a direct price feed or a defined triangulation to succesfully
|
|
@@ -311,13 +224,13 @@ var PriceFeeds = /** @class */ (function () {
|
|
|
311
224
|
* @param feeds data obtained via fetchLatestFeedPriceInfo or fetchLatestFeedPrices
|
|
312
225
|
* @returns array of prices with same order as symbols
|
|
313
226
|
*/
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
for (
|
|
227
|
+
calculateTriangulatedPricesFromFeedInfo(symbols, feeds) {
|
|
228
|
+
let priceMap = new Map();
|
|
229
|
+
for (let j = 0; j < feeds.prices.length; j++) {
|
|
317
230
|
priceMap.set(feeds.symbols[j], [feeds.prices[j], feeds.isMarketClosed[j]]);
|
|
318
231
|
}
|
|
319
232
|
return this.triangulatePricesFromFeedPrices(symbols, priceMap);
|
|
320
|
-
}
|
|
233
|
+
}
|
|
321
234
|
/**
|
|
322
235
|
* Extract pair-prices from underlying price feeds via triangulation
|
|
323
236
|
* The function either needs a direct price feed or a defined triangulation to succesfully
|
|
@@ -326,15 +239,15 @@ var PriceFeeds = /** @class */ (function () {
|
|
|
326
239
|
* @param feeds data obtained via fetchLatestFeedPriceInfo or fetchLatestFeedPrices
|
|
327
240
|
* @returns array of prices with same order as symbols
|
|
328
241
|
*/
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
for (
|
|
333
|
-
|
|
242
|
+
triangulatePricesFromFeedPrices(symbols, feedPriceMap) {
|
|
243
|
+
let prices = new Array();
|
|
244
|
+
let mktClosed = new Array();
|
|
245
|
+
for (let k = 0; k < symbols.length; k++) {
|
|
246
|
+
let triangulation = this.triangulations.get(symbols[k]);
|
|
334
247
|
if (triangulation == undefined) {
|
|
335
|
-
|
|
248
|
+
let feedPrice = feedPriceMap.get(symbols[k]);
|
|
336
249
|
if (feedPrice == undefined) {
|
|
337
|
-
throw new Error(
|
|
250
|
+
throw new Error(`PriceFeeds: no triangulation defined for ${symbols[k]}`);
|
|
338
251
|
}
|
|
339
252
|
else {
|
|
340
253
|
prices.push(feedPrice[0]); //price
|
|
@@ -342,110 +255,86 @@ var PriceFeeds = /** @class */ (function () {
|
|
|
342
255
|
continue;
|
|
343
256
|
}
|
|
344
257
|
}
|
|
345
|
-
|
|
258
|
+
let [px, isMktClosed] = triangulator_1.default.calculateTriangulatedPrice(triangulation, feedPriceMap);
|
|
346
259
|
prices.push(px);
|
|
347
260
|
mktClosed.push(isMktClosed);
|
|
348
261
|
}
|
|
349
262
|
return [prices, mktClosed];
|
|
350
|
-
}
|
|
263
|
+
}
|
|
351
264
|
/**
|
|
352
265
|
* Queries the REST endpoint and returns parsed VAA price data
|
|
353
266
|
* @param query query price-info from endpoint
|
|
354
267
|
* @returns vaa and price info
|
|
355
268
|
*/
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
priceFeedUpdates = new Array();
|
|
373
|
-
px = new Array();
|
|
374
|
-
for (k = 0; k < values.length; k++) {
|
|
375
|
-
vaa = values[k].vaa;
|
|
376
|
-
priceFeedUpdates.push("0x" + buffer_1.Buffer.from(vaa, "base64").toString("hex"));
|
|
377
|
-
px.push(values[k].price);
|
|
378
|
-
}
|
|
379
|
-
return [2 /*return*/, [priceFeedUpdates, px]];
|
|
380
|
-
}
|
|
381
|
-
});
|
|
382
|
-
});
|
|
383
|
-
};
|
|
269
|
+
async fetchVAAQuery(query) {
|
|
270
|
+
const headers = { headers: { "Content-Type": "application/json" } };
|
|
271
|
+
let response = await fetch(query, headers);
|
|
272
|
+
if (!response.ok) {
|
|
273
|
+
throw new Error(`Failed to fetch posts (${response.status}): ${response.statusText}`);
|
|
274
|
+
}
|
|
275
|
+
let values = (await response.json());
|
|
276
|
+
const priceFeedUpdates = new Array();
|
|
277
|
+
const px = new Array();
|
|
278
|
+
for (let k = 0; k < values.length; k++) {
|
|
279
|
+
const vaa = values[k].vaa;
|
|
280
|
+
priceFeedUpdates.push("0x" + buffer_1.Buffer.from(vaa, "base64").toString("hex"));
|
|
281
|
+
px.push(values[k].price);
|
|
282
|
+
}
|
|
283
|
+
return [priceFeedUpdates, px];
|
|
284
|
+
}
|
|
384
285
|
/**
|
|
385
286
|
* Queries the REST endpoint and returns parsed price data
|
|
386
287
|
* @param query query price-info from endpoint
|
|
387
288
|
* @returns vaa and price info
|
|
388
289
|
*/
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
values = _a.sent();
|
|
405
|
-
priceFeedUpdates = new Array();
|
|
406
|
-
px = new Array();
|
|
407
|
-
for (k = 0; k < values.length; k++) {
|
|
408
|
-
priceFeedUpdates.push("0x" + buffer_1.Buffer.from(values[k].id, "base64").toString("hex"));
|
|
409
|
-
px.push(values[k].price);
|
|
410
|
-
}
|
|
411
|
-
return [2 /*return*/, [priceFeedUpdates, px]];
|
|
412
|
-
}
|
|
413
|
-
});
|
|
414
|
-
});
|
|
415
|
-
};
|
|
290
|
+
async fetchPriceQuery(query) {
|
|
291
|
+
const headers = { headers: { "Content-Type": "application/json" } };
|
|
292
|
+
let response = await fetch(query, headers);
|
|
293
|
+
if (!response.ok) {
|
|
294
|
+
throw new Error(`Failed to fetch posts (${response.status}): ${response.statusText}`);
|
|
295
|
+
}
|
|
296
|
+
let values = await response.json();
|
|
297
|
+
const priceFeedUpdates = new Array();
|
|
298
|
+
const px = new Array();
|
|
299
|
+
for (let k = 0; k < values.length; k++) {
|
|
300
|
+
priceFeedUpdates.push("0x" + buffer_1.Buffer.from(values[k].id, "base64").toString("hex"));
|
|
301
|
+
px.push(values[k].price);
|
|
302
|
+
}
|
|
303
|
+
return [priceFeedUpdates, px];
|
|
304
|
+
}
|
|
416
305
|
/**
|
|
417
306
|
* Searches for configuration for given network
|
|
418
307
|
* @param configs pricefeed configuration from json
|
|
419
308
|
* @param network e.g. testnet
|
|
420
309
|
* @returns selected configuration
|
|
421
310
|
*/
|
|
422
|
-
|
|
423
|
-
|
|
311
|
+
static _selectConfig(configs, network) {
|
|
312
|
+
let k = 0;
|
|
424
313
|
while (k < configs.length) {
|
|
425
314
|
if (configs[k].network == network) {
|
|
426
315
|
return configs[k];
|
|
427
316
|
}
|
|
428
317
|
k = k + 1;
|
|
429
318
|
}
|
|
430
|
-
throw new Error(
|
|
431
|
-
}
|
|
319
|
+
throw new Error(`PriceFeeds: config not found for network ${network}`);
|
|
320
|
+
}
|
|
432
321
|
/**
|
|
433
322
|
* Wraps configuration into convenient data-structure
|
|
434
323
|
* @param config configuration for the selected network
|
|
435
324
|
* @returns feedInfo-map and endPoints-array
|
|
436
325
|
*/
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
for (
|
|
326
|
+
static _constructFeedInfo(config) {
|
|
327
|
+
let feed = new Map();
|
|
328
|
+
let endpointId = -1;
|
|
329
|
+
let type = "";
|
|
330
|
+
let feedEndpoints = new Array();
|
|
331
|
+
for (let k = 0; k < config.endpoints.length; k++) {
|
|
443
332
|
feedEndpoints.push(config.endpoints[k].endpoint);
|
|
444
333
|
}
|
|
445
|
-
for (
|
|
334
|
+
for (let k = 0; k < config.ids.length; k++) {
|
|
446
335
|
if (type != config.ids[k].type) {
|
|
447
336
|
type = config.ids[k].type;
|
|
448
|
-
|
|
337
|
+
let j = 0;
|
|
449
338
|
while (j < config.endpoints.length) {
|
|
450
339
|
if (config.endpoints[j].type == type) {
|
|
451
340
|
endpointId = j;
|
|
@@ -454,14 +343,13 @@ var PriceFeeds = /** @class */ (function () {
|
|
|
454
343
|
j++;
|
|
455
344
|
}
|
|
456
345
|
if (config.endpoints[endpointId].type != type) {
|
|
457
|
-
throw new Error(
|
|
346
|
+
throw new Error(`priceFeeds: no enpoint found for ${type} check priceFeedConfig`);
|
|
458
347
|
}
|
|
459
348
|
}
|
|
460
349
|
feed.set(config.ids[k].id, { symbol: config.ids[k].symbol.toUpperCase(), endpointId: endpointId });
|
|
461
350
|
}
|
|
462
351
|
return [feed, feedEndpoints];
|
|
463
|
-
}
|
|
464
|
-
|
|
465
|
-
}());
|
|
352
|
+
}
|
|
353
|
+
}
|
|
466
354
|
exports.default = PriceFeeds;
|
|
467
355
|
//# sourceMappingURL=priceFeeds.js.map
|