lynx-client 0.0.29 → 0.0.31
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/index.js +4 -0
- package/dist/cjs/lib/priceFeeds/flare/flareFeedConstants.js +38 -0
- package/dist/cjs/lib/priceFeeds/flare/flareFeedFunctions.js +19 -0
- package/dist/cjs/lib/priceFeeds/interfaces.js +2 -0
- package/dist/cjs/lib/priceFeeds/pyth/pythFeedConstants.js +7 -1
- package/dist/cjs/lib/priceFeeds/pyth/pythFeedFunctions.js +8 -0
- package/dist/cjs/lib/priceFeeds/pyth/pythPriceData.js +51 -0
- package/dist/esm/index.d.ts +4 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +4 -0
- package/dist/esm/lib/priceFeeds/flare/flareFeedConstants.d.ts +4 -0
- package/dist/esm/lib/priceFeeds/flare/flareFeedConstants.d.ts.map +1 -0
- package/dist/esm/lib/priceFeeds/flare/flareFeedConstants.js +38 -0
- package/dist/esm/lib/priceFeeds/flare/flareFeedFunctions.d.ts +12 -0
- package/dist/esm/lib/priceFeeds/flare/flareFeedFunctions.d.ts.map +1 -0
- package/dist/esm/lib/priceFeeds/flare/flareFeedFunctions.js +19 -0
- package/dist/esm/lib/priceFeeds/interfaces.d.ts +13 -0
- package/dist/esm/lib/priceFeeds/interfaces.d.ts.map +1 -0
- package/dist/esm/lib/priceFeeds/interfaces.js +2 -0
- package/dist/esm/lib/priceFeeds/pyth/pythFeedConstants.d.ts +1 -0
- package/dist/esm/lib/priceFeeds/pyth/pythFeedConstants.d.ts.map +1 -1
- package/dist/esm/lib/priceFeeds/pyth/pythFeedConstants.js +7 -1
- package/dist/esm/lib/priceFeeds/pyth/pythFeedFunctions.d.ts +5 -0
- package/dist/esm/lib/priceFeeds/pyth/pythFeedFunctions.d.ts.map +1 -1
- package/dist/esm/lib/priceFeeds/pyth/pythFeedFunctions.js +8 -0
- package/dist/esm/lib/priceFeeds/pyth/pythPriceData.d.ts +10 -0
- package/dist/esm/lib/priceFeeds/pyth/pythPriceData.d.ts.map +1 -0
- package/dist/esm/lib/priceFeeds/pyth/pythPriceData.js +51 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/lib/priceFeeds/flare/flareFeedConstants.d.ts +4 -0
- package/dist/types/lib/priceFeeds/flare/flareFeedConstants.d.ts.map +1 -0
- package/dist/types/lib/priceFeeds/flare/flareFeedFunctions.d.ts +12 -0
- package/dist/types/lib/priceFeeds/flare/flareFeedFunctions.d.ts.map +1 -0
- package/dist/types/lib/priceFeeds/interfaces.d.ts +13 -0
- package/dist/types/lib/priceFeeds/interfaces.d.ts.map +1 -0
- package/dist/types/lib/priceFeeds/pyth/pythFeedConstants.d.ts +1 -0
- package/dist/types/lib/priceFeeds/pyth/pythFeedConstants.d.ts.map +1 -1
- package/dist/types/lib/priceFeeds/pyth/pythFeedFunctions.d.ts +5 -0
- package/dist/types/lib/priceFeeds/pyth/pythFeedFunctions.d.ts.map +1 -1
- package/dist/types/lib/priceFeeds/pyth/pythPriceData.d.ts +10 -0
- package/dist/types/lib/priceFeeds/pyth/pythPriceData.d.ts.map +1 -0
- package/package.json +1 -1
package/dist/cjs/index.js
CHANGED
|
@@ -36,6 +36,10 @@ __exportStar(require("./lib/constants/groupIds"), exports);
|
|
|
36
36
|
__exportStar(require("./lib/constants/feeIds"), exports);
|
|
37
37
|
__exportStar(require("./lib/priceFeeds/pyth/pythFeedConstants"), exports);
|
|
38
38
|
__exportStar(require("./lib/priceFeeds/pyth/pythFeedFunctions"), exports);
|
|
39
|
+
__exportStar(require("./lib/priceFeeds/pyth/pythPriceData"), exports);
|
|
40
|
+
__exportStar(require("./lib/priceFeeds/interfaces"), exports);
|
|
41
|
+
__exportStar(require("./lib/priceFeeds/flare/flareFeedConstants"), exports);
|
|
42
|
+
__exportStar(require("./lib/priceFeeds/flare/flareFeedFunctions"), exports);
|
|
39
43
|
__exportStar(require("./lib/addresses/lensAddresses"), exports);
|
|
40
44
|
__exportStar(require("./lib/addresses/systemAddresses"), exports);
|
|
41
45
|
__exportStar(require("./lib/contractsIntegration/deployedContractsConnector"), exports);
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FLARE_PRICE_FEED_ID_TO_PAIR = exports.FLARE_PAIRS_PRICE_FEED_IDS = void 0;
|
|
4
|
+
const pairIds_1 = require("../../constants/pairIds");
|
|
5
|
+
// You can find the ids of prices at https://flare-systems-explorer.flare.network/price-feeds
|
|
6
|
+
exports.FLARE_PAIRS_PRICE_FEED_IDS = {
|
|
7
|
+
[pairIds_1.PAIR_CONFIGS_IDS.BTC_USD]: "0x014254432f55534400000000000000000000000000",
|
|
8
|
+
[pairIds_1.PAIR_CONFIGS_IDS.ETH_USD]: "0x014554482f55534400000000000000000000000000",
|
|
9
|
+
[pairIds_1.PAIR_CONFIGS_IDS.BNB_USD]: "0x01424e422f55534400000000000000000000000000",
|
|
10
|
+
// [PAIR_CONFIGS_IDS.FTM_USD]: "5c6c0d2386e3352356c3ab84434fafb5ea067ac2678a38a338c4a69ddc4bdb0c",
|
|
11
|
+
// NOTE : Using S instead of deprecated FTM
|
|
12
|
+
[pairIds_1.PAIR_CONFIGS_IDS.FTM_USD]: "0x01532f555344000000000000000000000000000000",
|
|
13
|
+
[pairIds_1.PAIR_CONFIGS_IDS.SOL_USD]: "0x01534f4c2f55534400000000000000000000000000",
|
|
14
|
+
[pairIds_1.PAIR_CONFIGS_IDS.XRP_USD]: "0x015852502f55534400000000000000000000000000",
|
|
15
|
+
[pairIds_1.PAIR_CONFIGS_IDS.S_USD]: "0x01532f555344000000000000000000000000000000",
|
|
16
|
+
[pairIds_1.PAIR_CONFIGS_IDS.FLR_USD]: "0x01464c522f55534400000000000000000000000000",
|
|
17
|
+
[pairIds_1.PAIR_CONFIGS_IDS.EUR_USD]: "",
|
|
18
|
+
[pairIds_1.PAIR_CONFIGS_IDS.GBP_USD]: "",
|
|
19
|
+
[pairIds_1.PAIR_CONFIGS_IDS.AUD_USD]: "",
|
|
20
|
+
[pairIds_1.PAIR_CONFIGS_IDS.NZD_USD]: "",
|
|
21
|
+
[pairIds_1.PAIR_CONFIGS_IDS.USD_JPY]: "",
|
|
22
|
+
[pairIds_1.PAIR_CONFIGS_IDS.USD_CHF]: "",
|
|
23
|
+
// NOTE : CAT pair will have the same price feed id as the non-CAT pair
|
|
24
|
+
[pairIds_1.PAIR_CONFIGS_IDS.BTC_USD_CAT]: "",
|
|
25
|
+
[pairIds_1.PAIR_CONFIGS_IDS.ETH_USD_CAT]: "",
|
|
26
|
+
[pairIds_1.PAIR_CONFIGS_IDS.EUR_USD_CAT]: "",
|
|
27
|
+
[pairIds_1.PAIR_CONFIGS_IDS.GBP_USD_CAT]: "",
|
|
28
|
+
[pairIds_1.PAIR_CONFIGS_IDS.AUD_USD_CAT]: "",
|
|
29
|
+
[pairIds_1.PAIR_CONFIGS_IDS.NZD_USD_CAT]: "",
|
|
30
|
+
[pairIds_1.PAIR_CONFIGS_IDS.USD_JPY_CAT]: "",
|
|
31
|
+
[pairIds_1.PAIR_CONFIGS_IDS.USD_CHF_CAT]: "",
|
|
32
|
+
};
|
|
33
|
+
// Reverse mapping
|
|
34
|
+
exports.FLARE_PRICE_FEED_ID_TO_PAIR = Object.entries(exports.FLARE_PAIRS_PRICE_FEED_IDS).reduce((acc, [pairId, feedId]) => {
|
|
35
|
+
if (feedId)
|
|
36
|
+
acc[feedId] = parseInt(pairId);
|
|
37
|
+
return acc;
|
|
38
|
+
}, {});
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getFlareFeedIdForPair = getFlareFeedIdForPair;
|
|
4
|
+
exports.getPairIdForFlareFeedId = getPairIdForFlareFeedId;
|
|
5
|
+
const flareFeedConstants_1 = require("./flareFeedConstants");
|
|
6
|
+
/**
|
|
7
|
+
* Get the Flare feed id for a pair
|
|
8
|
+
* @param pairId The pair id
|
|
9
|
+
*/
|
|
10
|
+
function getFlareFeedIdForPair(pairId) {
|
|
11
|
+
return flareFeedConstants_1.FLARE_PAIRS_PRICE_FEED_IDS[pairId];
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Get the Pair ID for Flare Feed ID (reversal lookup)
|
|
15
|
+
* @param feedId The Flare feed id
|
|
16
|
+
*/
|
|
17
|
+
function getPairIdForFlareFeedId(feedId) {
|
|
18
|
+
return flareFeedConstants_1.FLARE_PRICE_FEED_ID_TO_PAIR[feedId];
|
|
19
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.PYTH_PAIRS_PRICE_FEED_IDS = exports.PYTH_PRICE_ENTRIES = exports.PYTH_PRICE_KEYS = void 0;
|
|
3
|
+
exports.PYTH_PRICE_FEED_ID_TO_PAIR = exports.PYTH_PAIRS_PRICE_FEED_IDS = exports.PYTH_PRICE_ENTRIES = exports.PYTH_PRICE_KEYS = void 0;
|
|
4
4
|
const pairIds_1 = require("../../constants/pairIds");
|
|
5
5
|
exports.PYTH_PRICE_KEYS = {
|
|
6
6
|
[pairIds_1.PAIR_CONFIGS_IDS.BTC_USD]: "Crypto.BTC/USD",
|
|
@@ -62,3 +62,9 @@ exports.PYTH_PAIRS_PRICE_FEED_IDS = {
|
|
|
62
62
|
[pairIds_1.PAIR_CONFIGS_IDS.USD_JPY_CAT]: "",
|
|
63
63
|
[pairIds_1.PAIR_CONFIGS_IDS.USD_CHF_CAT]: "",
|
|
64
64
|
};
|
|
65
|
+
// Reverse mapping
|
|
66
|
+
exports.PYTH_PRICE_FEED_ID_TO_PAIR = Object.entries(exports.PYTH_PAIRS_PRICE_FEED_IDS).reduce((acc, [pairId, feedId]) => {
|
|
67
|
+
if (feedId)
|
|
68
|
+
acc[feedId] = parseInt(pairId);
|
|
69
|
+
return acc;
|
|
70
|
+
}, {});
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.getPythFeedIdForPair = getPythFeedIdForPair;
|
|
4
|
+
exports.getPairIdForPythFeedId = getPairIdForPythFeedId;
|
|
4
5
|
const pythFeedConstants_1 = require("./pythFeedConstants");
|
|
5
6
|
/**
|
|
6
7
|
* Get the Pyth feed id for a pair
|
|
@@ -9,3 +10,10 @@ const pythFeedConstants_1 = require("./pythFeedConstants");
|
|
|
9
10
|
function getPythFeedIdForPair(pairId) {
|
|
10
11
|
return pythFeedConstants_1.PYTH_PRICE_KEYS[pairId];
|
|
11
12
|
}
|
|
13
|
+
/**
|
|
14
|
+
* Get the Pair ID for Pyth Feed ID (reversal lookup)
|
|
15
|
+
* @param feedId The Pyth feed id
|
|
16
|
+
*/
|
|
17
|
+
function getPairIdForPythFeedId(feedId) {
|
|
18
|
+
return pythFeedConstants_1.PYTH_PRICE_FEED_ID_TO_PAIR[feedId];
|
|
19
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getPricesForTimestamp = getPricesForTimestamp;
|
|
4
|
+
const scales_1 = require("../../constants/scales");
|
|
5
|
+
const lynxScalesUtils_1 = require("../../lynxSystem/lynxScalesUtils");
|
|
6
|
+
const bignumbers_1 = require("../../utils/bignumbers");
|
|
7
|
+
/**
|
|
8
|
+
* Helper function to parse Pyth API response data into CombinedPriceData
|
|
9
|
+
*/
|
|
10
|
+
function parseResponse(data) {
|
|
11
|
+
const encodedPrice = data.binary?.data ? `0x${data.binary.data}` : "";
|
|
12
|
+
// Handle both response formats - direct parsed[0] and nested parsed[0].price
|
|
13
|
+
const priceData = data.parsed?.[0]?.price || data.parsed?.[0];
|
|
14
|
+
if (!priceData) {
|
|
15
|
+
throw new Error("Invalid Pyth API response: missing price data");
|
|
16
|
+
}
|
|
17
|
+
const expo = priceData.expo;
|
|
18
|
+
const price = priceData.price;
|
|
19
|
+
const conf = priceData.conf;
|
|
20
|
+
const publishTime = priceData.publish_time;
|
|
21
|
+
const priceInScale = (0, bignumbers_1.floatToUnitsBn)(Number(price), scales_1.PRICES_SCALE + expo);
|
|
22
|
+
const confInScale = (0, bignumbers_1.floatToUnitsBn)(Number(conf), scales_1.PRICES_SCALE + expo);
|
|
23
|
+
return {
|
|
24
|
+
encodedPrice,
|
|
25
|
+
priceInUnits: (0, lynxScalesUtils_1.priceBnToFloat)(priceInScale),
|
|
26
|
+
priceConfidenceInUnits: (0, lynxScalesUtils_1.priceBnToFloat)(confInScale),
|
|
27
|
+
priceTimestamp: Number(publishTime),
|
|
28
|
+
priceInScale,
|
|
29
|
+
confInScale,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Fetches historical price data from Pyth for a specific timestamp or later
|
|
34
|
+
* Only searches forward in time (timestamp >= startTimestamp), never backwards
|
|
35
|
+
* @param priceFeedId - The Pyth price feed ID
|
|
36
|
+
* @param startTimestamp - The minimum timestamp to search from
|
|
37
|
+
* @param maxTimeGap - Maximum seconds to search forward from startTimestamp
|
|
38
|
+
*/
|
|
39
|
+
async function getPricesForTimestamp(priceFeedId, startTimestamp, maxTimeGap) {
|
|
40
|
+
const hermesUrl = "https://hermes.pyth.network";
|
|
41
|
+
const buildUrl = (timestamp) => `${hermesUrl}/v2/updates/price/${timestamp}?ids[]=${priceFeedId}&encoding=hex`;
|
|
42
|
+
// Try timestamps from startTimestamp onwards, incrementing by 1 second
|
|
43
|
+
for (let offset = 0; offset <= maxTimeGap; offset++) {
|
|
44
|
+
const timestamp = startTimestamp + offset;
|
|
45
|
+
const response = await fetch(buildUrl(timestamp));
|
|
46
|
+
if (response.ok) {
|
|
47
|
+
return parseResponse(await response.json());
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
throw new Error(`No price found for asset ${priceFeedId} at or within ${maxTimeGap}s after timestamp ${startTimestamp}`);
|
|
51
|
+
}
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -19,6 +19,10 @@ export * from "./lib/constants/groupIds";
|
|
|
19
19
|
export * from "./lib/constants/feeIds";
|
|
20
20
|
export * from "./lib/priceFeeds/pyth/pythFeedConstants";
|
|
21
21
|
export * from "./lib/priceFeeds/pyth/pythFeedFunctions";
|
|
22
|
+
export * from "./lib/priceFeeds/pyth/pythPriceData";
|
|
23
|
+
export * from "./lib/priceFeeds/interfaces";
|
|
24
|
+
export * from "./lib/priceFeeds/flare/flareFeedConstants";
|
|
25
|
+
export * from "./lib/priceFeeds/flare/flareFeedFunctions";
|
|
22
26
|
export * from "./lib/addresses/lensAddresses";
|
|
23
27
|
export * from "./lib/addresses/systemAddresses";
|
|
24
28
|
export * from "./lib/contractsIntegration/deployedContractsConnector";
|
package/dist/esm/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../index.ts"],"names":[],"mappings":"AAAA,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AAExC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yCAAyC,CAAC;AACxD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,kCAAkC,CAAC;AACjD,cAAc,mBAAmB,CAAC;AAClC,cAAc,2CAA2C,CAAC;AAE1D,cAAc,+BAA+B,CAAC;AAC9C,cAAc,kCAAkC,CAAC;AACjD,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AAEvC,cAAc,yCAAyC,CAAC;AACxD,cAAc,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../index.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/index.js
CHANGED
|
@@ -36,6 +36,10 @@ __exportStar(require("./lib/constants/groupIds"), exports);
|
|
|
36
36
|
__exportStar(require("./lib/constants/feeIds"), exports);
|
|
37
37
|
__exportStar(require("./lib/priceFeeds/pyth/pythFeedConstants"), exports);
|
|
38
38
|
__exportStar(require("./lib/priceFeeds/pyth/pythFeedFunctions"), exports);
|
|
39
|
+
__exportStar(require("./lib/priceFeeds/pyth/pythPriceData"), exports);
|
|
40
|
+
__exportStar(require("./lib/priceFeeds/interfaces"), exports);
|
|
41
|
+
__exportStar(require("./lib/priceFeeds/flare/flareFeedConstants"), exports);
|
|
42
|
+
__exportStar(require("./lib/priceFeeds/flare/flareFeedFunctions"), exports);
|
|
39
43
|
__exportStar(require("./lib/addresses/lensAddresses"), exports);
|
|
40
44
|
__exportStar(require("./lib/addresses/systemAddresses"), exports);
|
|
41
45
|
__exportStar(require("./lib/contractsIntegration/deployedContractsConnector"), exports);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flareFeedConstants.d.ts","sourceRoot":"","sources":["../../../../../lib/priceFeeds/flare/flareFeedConstants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAGrE,eAAO,MAAM,0BAA0B,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAyC/D,CAAC;AAGF,eAAO,MAAM,2BAA2B,0BAKlC,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FLARE_PRICE_FEED_ID_TO_PAIR = exports.FLARE_PAIRS_PRICE_FEED_IDS = void 0;
|
|
4
|
+
const pairIds_1 = require("../../constants/pairIds");
|
|
5
|
+
// You can find the ids of prices at https://flare-systems-explorer.flare.network/price-feeds
|
|
6
|
+
exports.FLARE_PAIRS_PRICE_FEED_IDS = {
|
|
7
|
+
[pairIds_1.PAIR_CONFIGS_IDS.BTC_USD]: "0x014254432f55534400000000000000000000000000",
|
|
8
|
+
[pairIds_1.PAIR_CONFIGS_IDS.ETH_USD]: "0x014554482f55534400000000000000000000000000",
|
|
9
|
+
[pairIds_1.PAIR_CONFIGS_IDS.BNB_USD]: "0x01424e422f55534400000000000000000000000000",
|
|
10
|
+
// [PAIR_CONFIGS_IDS.FTM_USD]: "5c6c0d2386e3352356c3ab84434fafb5ea067ac2678a38a338c4a69ddc4bdb0c",
|
|
11
|
+
// NOTE : Using S instead of deprecated FTM
|
|
12
|
+
[pairIds_1.PAIR_CONFIGS_IDS.FTM_USD]: "0x01532f555344000000000000000000000000000000",
|
|
13
|
+
[pairIds_1.PAIR_CONFIGS_IDS.SOL_USD]: "0x01534f4c2f55534400000000000000000000000000",
|
|
14
|
+
[pairIds_1.PAIR_CONFIGS_IDS.XRP_USD]: "0x015852502f55534400000000000000000000000000",
|
|
15
|
+
[pairIds_1.PAIR_CONFIGS_IDS.S_USD]: "0x01532f555344000000000000000000000000000000",
|
|
16
|
+
[pairIds_1.PAIR_CONFIGS_IDS.FLR_USD]: "0x01464c522f55534400000000000000000000000000",
|
|
17
|
+
[pairIds_1.PAIR_CONFIGS_IDS.EUR_USD]: "",
|
|
18
|
+
[pairIds_1.PAIR_CONFIGS_IDS.GBP_USD]: "",
|
|
19
|
+
[pairIds_1.PAIR_CONFIGS_IDS.AUD_USD]: "",
|
|
20
|
+
[pairIds_1.PAIR_CONFIGS_IDS.NZD_USD]: "",
|
|
21
|
+
[pairIds_1.PAIR_CONFIGS_IDS.USD_JPY]: "",
|
|
22
|
+
[pairIds_1.PAIR_CONFIGS_IDS.USD_CHF]: "",
|
|
23
|
+
// NOTE : CAT pair will have the same price feed id as the non-CAT pair
|
|
24
|
+
[pairIds_1.PAIR_CONFIGS_IDS.BTC_USD_CAT]: "",
|
|
25
|
+
[pairIds_1.PAIR_CONFIGS_IDS.ETH_USD_CAT]: "",
|
|
26
|
+
[pairIds_1.PAIR_CONFIGS_IDS.EUR_USD_CAT]: "",
|
|
27
|
+
[pairIds_1.PAIR_CONFIGS_IDS.GBP_USD_CAT]: "",
|
|
28
|
+
[pairIds_1.PAIR_CONFIGS_IDS.AUD_USD_CAT]: "",
|
|
29
|
+
[pairIds_1.PAIR_CONFIGS_IDS.NZD_USD_CAT]: "",
|
|
30
|
+
[pairIds_1.PAIR_CONFIGS_IDS.USD_JPY_CAT]: "",
|
|
31
|
+
[pairIds_1.PAIR_CONFIGS_IDS.USD_CHF_CAT]: "",
|
|
32
|
+
};
|
|
33
|
+
// Reverse mapping
|
|
34
|
+
exports.FLARE_PRICE_FEED_ID_TO_PAIR = Object.entries(exports.FLARE_PAIRS_PRICE_FEED_IDS).reduce((acc, [pairId, feedId]) => {
|
|
35
|
+
if (feedId)
|
|
36
|
+
acc[feedId] = parseInt(pairId);
|
|
37
|
+
return acc;
|
|
38
|
+
}, {});
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { TPairIds } from "../../constants/pairIds";
|
|
2
|
+
/**
|
|
3
|
+
* Get the Flare feed id for a pair
|
|
4
|
+
* @param pairId The pair id
|
|
5
|
+
*/
|
|
6
|
+
export declare function getFlareFeedIdForPair(pairId: TPairIds): string;
|
|
7
|
+
/**
|
|
8
|
+
* Get the Pair ID for Flare Feed ID (reversal lookup)
|
|
9
|
+
* @param feedId The Flare feed id
|
|
10
|
+
*/
|
|
11
|
+
export declare function getPairIdForFlareFeedId(feedId: string): TPairIds;
|
|
12
|
+
//# sourceMappingURL=flareFeedFunctions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flareFeedFunctions.d.ts","sourceRoot":"","sources":["../../../../../lib/priceFeeds/flare/flareFeedFunctions.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAEnD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,QAAQ,GAAG,MAAM,CAE9D;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAEhE"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getFlareFeedIdForPair = getFlareFeedIdForPair;
|
|
4
|
+
exports.getPairIdForFlareFeedId = getPairIdForFlareFeedId;
|
|
5
|
+
const flareFeedConstants_1 = require("./flareFeedConstants");
|
|
6
|
+
/**
|
|
7
|
+
* Get the Flare feed id for a pair
|
|
8
|
+
* @param pairId The pair id
|
|
9
|
+
*/
|
|
10
|
+
function getFlareFeedIdForPair(pairId) {
|
|
11
|
+
return flareFeedConstants_1.FLARE_PAIRS_PRICE_FEED_IDS[pairId];
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Get the Pair ID for Flare Feed ID (reversal lookup)
|
|
15
|
+
* @param feedId The Flare feed id
|
|
16
|
+
*/
|
|
17
|
+
function getPairIdForFlareFeedId(feedId) {
|
|
18
|
+
return flareFeedConstants_1.FLARE_PRICE_FEED_ID_TO_PAIR[feedId];
|
|
19
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface PriceData {
|
|
2
|
+
encodedPrice: string;
|
|
3
|
+
priceInUnits: number;
|
|
4
|
+
priceTimestamp: number;
|
|
5
|
+
priceConfidenceInUnits: number;
|
|
6
|
+
fee?: bigint;
|
|
7
|
+
}
|
|
8
|
+
export interface RawPriceData {
|
|
9
|
+
priceInScale: bigint;
|
|
10
|
+
confInScale: bigint;
|
|
11
|
+
}
|
|
12
|
+
export type CombinedPriceData = RawPriceData & PriceData;
|
|
13
|
+
//# sourceMappingURL=interfaces.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../../../lib/priceFeeds/interfaces.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,iBAAiB,GAAG,YAAY,GAAG,SAAS,CAAC"}
|
|
@@ -2,4 +2,5 @@ import { TPairIds } from "../../constants/pairIds";
|
|
|
2
2
|
export declare const PYTH_PRICE_KEYS: Record<TPairIds, string>;
|
|
3
3
|
export declare const PYTH_PRICE_ENTRIES: [TPairIds, string][];
|
|
4
4
|
export declare const PYTH_PAIRS_PRICE_FEED_IDS: Record<TPairIds, string>;
|
|
5
|
+
export declare const PYTH_PRICE_FEED_ID_TO_PAIR: Record<string, TPairIds>;
|
|
5
6
|
//# sourceMappingURL=pythFeedConstants.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pythFeedConstants.d.ts","sourceRoot":"","sources":["../../../../../lib/priceFeeds/pyth/pythFeedConstants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAErE,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAgCpD,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,EAKjD,CAAC;AAGH,eAAO,MAAM,yBAAyB,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAyC9D,CAAC"}
|
|
1
|
+
{"version":3,"file":"pythFeedConstants.d.ts","sourceRoot":"","sources":["../../../../../lib/priceFeeds/pyth/pythFeedConstants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAErE,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAgCpD,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,EAKjD,CAAC;AAGH,eAAO,MAAM,yBAAyB,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAyC9D,CAAC;AAGF,eAAO,MAAM,0BAA0B,0BAKjC,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.PYTH_PAIRS_PRICE_FEED_IDS = exports.PYTH_PRICE_ENTRIES = exports.PYTH_PRICE_KEYS = void 0;
|
|
3
|
+
exports.PYTH_PRICE_FEED_ID_TO_PAIR = exports.PYTH_PAIRS_PRICE_FEED_IDS = exports.PYTH_PRICE_ENTRIES = exports.PYTH_PRICE_KEYS = void 0;
|
|
4
4
|
const pairIds_1 = require("../../constants/pairIds");
|
|
5
5
|
exports.PYTH_PRICE_KEYS = {
|
|
6
6
|
[pairIds_1.PAIR_CONFIGS_IDS.BTC_USD]: "Crypto.BTC/USD",
|
|
@@ -62,3 +62,9 @@ exports.PYTH_PAIRS_PRICE_FEED_IDS = {
|
|
|
62
62
|
[pairIds_1.PAIR_CONFIGS_IDS.USD_JPY_CAT]: "",
|
|
63
63
|
[pairIds_1.PAIR_CONFIGS_IDS.USD_CHF_CAT]: "",
|
|
64
64
|
};
|
|
65
|
+
// Reverse mapping
|
|
66
|
+
exports.PYTH_PRICE_FEED_ID_TO_PAIR = Object.entries(exports.PYTH_PAIRS_PRICE_FEED_IDS).reduce((acc, [pairId, feedId]) => {
|
|
67
|
+
if (feedId)
|
|
68
|
+
acc[feedId] = parseInt(pairId);
|
|
69
|
+
return acc;
|
|
70
|
+
}, {});
|
|
@@ -4,4 +4,9 @@ import { TPairIds } from "../../constants/pairIds";
|
|
|
4
4
|
* @param pairId The pair id
|
|
5
5
|
*/
|
|
6
6
|
export declare function getPythFeedIdForPair(pairId: TPairIds): string;
|
|
7
|
+
/**
|
|
8
|
+
* Get the Pair ID for Pyth Feed ID (reversal lookup)
|
|
9
|
+
* @param feedId The Pyth feed id
|
|
10
|
+
*/
|
|
11
|
+
export declare function getPairIdForPythFeedId(feedId: string): TPairIds;
|
|
7
12
|
//# sourceMappingURL=pythFeedFunctions.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pythFeedFunctions.d.ts","sourceRoot":"","sources":["../../../../../lib/priceFeeds/pyth/pythFeedFunctions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAEnD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,QAAQ,GAAG,MAAM,CAE7D"}
|
|
1
|
+
{"version":3,"file":"pythFeedFunctions.d.ts","sourceRoot":"","sources":["../../../../../lib/priceFeeds/pyth/pythFeedFunctions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAEnD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,QAAQ,GAAG,MAAM,CAE7D;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAE/D"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.getPythFeedIdForPair = getPythFeedIdForPair;
|
|
4
|
+
exports.getPairIdForPythFeedId = getPairIdForPythFeedId;
|
|
4
5
|
const pythFeedConstants_1 = require("./pythFeedConstants");
|
|
5
6
|
/**
|
|
6
7
|
* Get the Pyth feed id for a pair
|
|
@@ -9,3 +10,10 @@ const pythFeedConstants_1 = require("./pythFeedConstants");
|
|
|
9
10
|
function getPythFeedIdForPair(pairId) {
|
|
10
11
|
return pythFeedConstants_1.PYTH_PRICE_KEYS[pairId];
|
|
11
12
|
}
|
|
13
|
+
/**
|
|
14
|
+
* Get the Pair ID for Pyth Feed ID (reversal lookup)
|
|
15
|
+
* @param feedId The Pyth feed id
|
|
16
|
+
*/
|
|
17
|
+
function getPairIdForPythFeedId(feedId) {
|
|
18
|
+
return pythFeedConstants_1.PYTH_PRICE_FEED_ID_TO_PAIR[feedId];
|
|
19
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { CombinedPriceData } from "../interfaces";
|
|
2
|
+
/**
|
|
3
|
+
* Fetches historical price data from Pyth for a specific timestamp or later
|
|
4
|
+
* Only searches forward in time (timestamp >= startTimestamp), never backwards
|
|
5
|
+
* @param priceFeedId - The Pyth price feed ID
|
|
6
|
+
* @param startTimestamp - The minimum timestamp to search from
|
|
7
|
+
* @param maxTimeGap - Maximum seconds to search forward from startTimestamp
|
|
8
|
+
*/
|
|
9
|
+
export declare function getPricesForTimestamp(priceFeedId: string, startTimestamp: number, maxTimeGap: number): Promise<CombinedPriceData>;
|
|
10
|
+
//# sourceMappingURL=pythPriceData.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pythPriceData.d.ts","sourceRoot":"","sources":["../../../../../lib/priceFeeds/pyth/pythPriceData.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAgClD;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,iBAAiB,CAAC,CAiB5B"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getPricesForTimestamp = getPricesForTimestamp;
|
|
4
|
+
const scales_1 = require("../../constants/scales");
|
|
5
|
+
const lynxScalesUtils_1 = require("../../lynxSystem/lynxScalesUtils");
|
|
6
|
+
const bignumbers_1 = require("../../utils/bignumbers");
|
|
7
|
+
/**
|
|
8
|
+
* Helper function to parse Pyth API response data into CombinedPriceData
|
|
9
|
+
*/
|
|
10
|
+
function parseResponse(data) {
|
|
11
|
+
const encodedPrice = data.binary?.data ? `0x${data.binary.data}` : "";
|
|
12
|
+
// Handle both response formats - direct parsed[0] and nested parsed[0].price
|
|
13
|
+
const priceData = data.parsed?.[0]?.price || data.parsed?.[0];
|
|
14
|
+
if (!priceData) {
|
|
15
|
+
throw new Error("Invalid Pyth API response: missing price data");
|
|
16
|
+
}
|
|
17
|
+
const expo = priceData.expo;
|
|
18
|
+
const price = priceData.price;
|
|
19
|
+
const conf = priceData.conf;
|
|
20
|
+
const publishTime = priceData.publish_time;
|
|
21
|
+
const priceInScale = (0, bignumbers_1.floatToUnitsBn)(Number(price), scales_1.PRICES_SCALE + expo);
|
|
22
|
+
const confInScale = (0, bignumbers_1.floatToUnitsBn)(Number(conf), scales_1.PRICES_SCALE + expo);
|
|
23
|
+
return {
|
|
24
|
+
encodedPrice,
|
|
25
|
+
priceInUnits: (0, lynxScalesUtils_1.priceBnToFloat)(priceInScale),
|
|
26
|
+
priceConfidenceInUnits: (0, lynxScalesUtils_1.priceBnToFloat)(confInScale),
|
|
27
|
+
priceTimestamp: Number(publishTime),
|
|
28
|
+
priceInScale,
|
|
29
|
+
confInScale,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Fetches historical price data from Pyth for a specific timestamp or later
|
|
34
|
+
* Only searches forward in time (timestamp >= startTimestamp), never backwards
|
|
35
|
+
* @param priceFeedId - The Pyth price feed ID
|
|
36
|
+
* @param startTimestamp - The minimum timestamp to search from
|
|
37
|
+
* @param maxTimeGap - Maximum seconds to search forward from startTimestamp
|
|
38
|
+
*/
|
|
39
|
+
async function getPricesForTimestamp(priceFeedId, startTimestamp, maxTimeGap) {
|
|
40
|
+
const hermesUrl = "https://hermes.pyth.network";
|
|
41
|
+
const buildUrl = (timestamp) => `${hermesUrl}/v2/updates/price/${timestamp}?ids[]=${priceFeedId}&encoding=hex`;
|
|
42
|
+
// Try timestamps from startTimestamp onwards, incrementing by 1 second
|
|
43
|
+
for (let offset = 0; offset <= maxTimeGap; offset++) {
|
|
44
|
+
const timestamp = startTimestamp + offset;
|
|
45
|
+
const response = await fetch(buildUrl(timestamp));
|
|
46
|
+
if (response.ok) {
|
|
47
|
+
return parseResponse(await response.json());
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
throw new Error(`No price found for asset ${priceFeedId} at or within ${maxTimeGap}s after timestamp ${startTimestamp}`);
|
|
51
|
+
}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -19,6 +19,10 @@ export * from "./lib/constants/groupIds";
|
|
|
19
19
|
export * from "./lib/constants/feeIds";
|
|
20
20
|
export * from "./lib/priceFeeds/pyth/pythFeedConstants";
|
|
21
21
|
export * from "./lib/priceFeeds/pyth/pythFeedFunctions";
|
|
22
|
+
export * from "./lib/priceFeeds/pyth/pythPriceData";
|
|
23
|
+
export * from "./lib/priceFeeds/interfaces";
|
|
24
|
+
export * from "./lib/priceFeeds/flare/flareFeedConstants";
|
|
25
|
+
export * from "./lib/priceFeeds/flare/flareFeedFunctions";
|
|
22
26
|
export * from "./lib/addresses/lensAddresses";
|
|
23
27
|
export * from "./lib/addresses/systemAddresses";
|
|
24
28
|
export * from "./lib/contractsIntegration/deployedContractsConnector";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../index.ts"],"names":[],"mappings":"AAAA,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AAExC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yCAAyC,CAAC;AACxD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,kCAAkC,CAAC;AACjD,cAAc,mBAAmB,CAAC;AAClC,cAAc,2CAA2C,CAAC;AAE1D,cAAc,+BAA+B,CAAC;AAC9C,cAAc,kCAAkC,CAAC;AACjD,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AAEvC,cAAc,yCAAyC,CAAC;AACxD,cAAc,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../index.ts"],"names":[],"mappings":"AAAA,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AAExC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yCAAyC,CAAC;AACxD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,kCAAkC,CAAC;AACjD,cAAc,mBAAmB,CAAC;AAClC,cAAc,2CAA2C,CAAC;AAE1D,cAAc,+BAA+B,CAAC;AAC9C,cAAc,kCAAkC,CAAC;AACjD,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AAEvC,cAAc,yCAAyC,CAAC;AACxD,cAAc,yCAAyC,CAAC;AACxD,cAAc,qCAAqC,CAAC;AACpD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2CAA2C,CAAC;AAC1D,cAAc,2CAA2C,CAAC;AAE1D,cAAc,+BAA+B,CAAC;AAC9C,cAAc,iCAAiC,CAAC;AAEhD,cAAc,uDAAuD,CAAC;AAEtE,cAAc,iDAAiD,CAAC;AAChE,cAAc,gDAAgD,CAAC;AAC/D,cAAc,4CAA4C,CAAC;AAC3D,cAAc,6CAA6C,CAAC;AAC5D,OAAO,EAAE,2BAA2B,EAAE,MAAM,wDAAwD,CAAC;AACrG,YAAY,EAAE,4BAA4B,EAAE,MAAM,wDAAwD,CAAC;AAC3G,OAAO,EAAE,+BAA+B,EAAE,MAAM,4DAA4D,CAAC;AAC7G,YAAY,EAAE,gCAAgC,EAAE,MAAM,4DAA4D,CAAC;AACnH,OAAO,EAAE,2BAA2B,EAAE,MAAM,wDAAwD,CAAC;AACrG,YAAY,EAAE,4BAA4B,EAAE,MAAM,wDAAwD,CAAC;AAC3G,OAAO,EAAE,sBAAsB,EAAE,MAAM,mDAAmD,CAAC;AAC3F,YAAY,EACV,uBAAuB,EACvB,gDAAgD,EAChD,mDAAmD,EACnD,4CAA4C,EAC5C,6CAA6C,EAC7C,iDAAiD,EACjD,cAAc,EACd,qBAAqB,IAAI,oCAAoC,EAC7D,0BAA0B,EAC1B,wBAAwB,EACzB,MAAM,mDAAmD,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,kDAAkD,CAAC;AACzF,YAAY,EACV,sBAAsB,EACtB,+CAA+C,EAC/C,gDAAgD,EAChD,4CAA4C,EAC5C,gDAAgD,IAAI,gDAAgD,EACpG,eAAe,EACf,kBAAkB,EACnB,MAAM,kDAAkD,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,8CAA8C,CAAC;AACjF,YAAY,EACV,kBAAkB,EAClB,yCAAyC,EACzC,2CAA2C,EAC3C,2CAA2C,EAC3C,wCAAwC,EACxC,gDAAgD,EAChD,uCAAuC,EACvC,iBAAiB,EACjB,eAAe,EAChB,MAAM,8CAA8C,CAAC;AACtD,OAAO,EAAE,oCAAoC,EAAE,MAAM,iEAAiE,CAAC;AACvH,YAAY,EACV,qCAAqC,EACrC,wDAAwD,EACxD,yDAAyD,EACzD,0DAA0D,EAC3D,MAAM,iEAAiE,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,6CAA6C,CAAC;AAC/E,YAAY,EACV,iBAAiB,EACjB,uCAAuC,EACvC,2CAA2C,EAC3C,qCAAqC,EACrC,oCAAoC,EACpC,mCAAmC,EACnC,wCAAwC,EACxC,gDAAgD,EAChD,sCAAsC,EACtC,uCAAuC,EACvC,8BAA8B,EAC9B,kCAAkC,EAClC,qCAAqC,EACrC,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,6CAA6C,CAAC;AACrD,OAAO,EAAE,6CAA6C,EAAE,MAAM,0EAA0E,CAAC;AACzI,YAAY,EACV,8CAA8C,EAC9C,qEAAqE,EACrE,8EAA8E,EAC9E,oEAAoE,EACrE,MAAM,0EAA0E,CAAC;AAClF,OAAO,EAAE,WAAW,EAAE,MAAM,wCAAwC,CAAC;AACrE,YAAY,EACV,YAAY,EACZ,mCAAmC,EACnC,kCAAkC,EAClC,wCAAwC,EACxC,iCAAiC,EACjC,mCAAmC,EACnC,gBAAgB,EACjB,MAAM,wCAAwC,CAAC;AAChD,OAAO,EAAE,uBAAuB,EAAE,MAAM,oDAAoD,CAAC;AAC7F,YAAY,EACV,wBAAwB,EACxB,8CAA8C,EAC9C,4CAA4C,EAC5C,+CAA+C,EAC/C,uCAAuC,EACvC,wCAAwC,EACxC,2CAA2C,EAC3C,2CAA2C,EAC3C,8CAA8C,EAC9C,kDAAkD,EAClD,+CAA+C,EAC/C,8CAA8C,EAC9C,4CAA4C,EAC5C,yCAAyC,EACzC,0BAA0B,EAC1B,gCAAgC,EAChC,yBAAyB,EACzB,kBAAkB,EACnB,MAAM,oDAAoD,CAAC;AAE5D,cAAc,uDAAuD,CAAC;AACtE,cAAc,yDAAyD,CAAC;AACxE,cAAc,oDAAoD,CAAC;AACnE,cAAc,2CAA2C,CAAC;AAC1D,cAAc,iDAAiD,CAAC;AAEhE,cAAc,+DAA+D,CAAC;AAC9E,cAAc,iEAAiE,CAAC;AAChF,cAAc,mDAAmD,CAAC;AAClE,cAAc,4DAA4D,CAAC;AAC3E,cAAc,yDAAyD,CAAC;AAGxE,YAAY,EAAE,aAAa,EAAE,MAAM,uDAAuD,CAAC;AAC3F,YAAY,EAAE,UAAU,EAAE,MAAM,oDAAoD,CAAC;AACrF,YAAY,EAAE,iBAAiB,EAAE,MAAM,+DAA+D,CAAC;AACvG,YAAY,EAAE,cAAc,EAAE,MAAM,4DAA4D,CAAC;AACjG,YAAY,EAAE,cAAc,EAAE,MAAM,yDAAyD,CAAC;AAC9F,YAAY,EAAE,WAAW,EAAE,MAAM,sDAAsD,CAAC;AACxF,YAAY,EAAE,eAAe,EAAE,MAAM,8DAA8D,CAAC;AACpG,YAAY,EAAE,UAAU,EAAE,MAAM,oDAAoD,CAAC;AAGrF,YAAY,EAAE,SAAS,EAAE,MAAM,sDAAsD,CAAC;AACtF,YAAY,EAAE,gBAAgB,EAAE,MAAM,oEAAoE,CAAC;AAG3G,YAAY,EAAE,IAAI,EAAE,MAAM,8CAA8C,CAAC;AAGzE,YAAY,EAAE,sCAAsC,EAAE,MAAM,0FAA0F,CAAC;AAGvJ,YAAY,EAAE,sBAAsB,EAAE,MAAM,uEAAuE,CAAC;AACpH,YAAY,EAAE,0BAA0B,EAAE,MAAM,2EAA2E,CAAC;AAC5H,YAAY,EAAE,sBAAsB,EAAE,MAAM,uEAAuE,CAAC;AAGpH,YAAY,EAAE,iBAAiB,EAAE,MAAM,kEAAkE,CAAC;AAG1G,YAAY,EAAE,gBAAgB,EAAE,MAAM,gEAAgE,CAAC;AAGvG,YAAY,EAAE,UAAU,EAAE,MAAM,4DAA4D,CAAC;AAC7F,YAAY,EAAE,6BAA6B,EAAE,MAAM,0EAA0E,CAAC;AAG9H,OAAO,EAAE,gCAAgC,EAAE,MAAM,mGAAmG,CAAC;AACrJ,OAAO,EAAE,oCAAoC,EAAE,MAAM,2GAA2G,CAAC;AACjK,OAAO,EAAE,gCAAgC,EAAE,MAAM,mGAAmG,CAAC;AAGrJ,cAAc,kFAAkF,CAAC;AACjG,cAAc,oFAAoF,CAAC;AACnG,cAAc,sEAAsE,CAAC;AACrF,cAAc,+EAA+E,CAAC;AAC9F,cAAc,4EAA4E,CAAC;AAG3F,cAAc,0FAA0F,CAAC;AACzG,cAAc,8FAA8F,CAAC;AAC7G,cAAc,0FAA0F,CAAC;AAGzG,cAAc,qFAAqF,CAAC;AAGpG,cAAc,mFAAmF,CAAC;AAGlG,cAAc,+EAA+E,CAAC;AAC9F,cAAc,6FAA6F,CAAC;AAG5G,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flareFeedConstants.d.ts","sourceRoot":"","sources":["../../../../../lib/priceFeeds/flare/flareFeedConstants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAGrE,eAAO,MAAM,0BAA0B,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAyC/D,CAAC;AAGF,eAAO,MAAM,2BAA2B,0BAKlC,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { TPairIds } from "../../constants/pairIds";
|
|
2
|
+
/**
|
|
3
|
+
* Get the Flare feed id for a pair
|
|
4
|
+
* @param pairId The pair id
|
|
5
|
+
*/
|
|
6
|
+
export declare function getFlareFeedIdForPair(pairId: TPairIds): string;
|
|
7
|
+
/**
|
|
8
|
+
* Get the Pair ID for Flare Feed ID (reversal lookup)
|
|
9
|
+
* @param feedId The Flare feed id
|
|
10
|
+
*/
|
|
11
|
+
export declare function getPairIdForFlareFeedId(feedId: string): TPairIds;
|
|
12
|
+
//# sourceMappingURL=flareFeedFunctions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flareFeedFunctions.d.ts","sourceRoot":"","sources":["../../../../../lib/priceFeeds/flare/flareFeedFunctions.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAEnD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,QAAQ,GAAG,MAAM,CAE9D;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAEhE"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface PriceData {
|
|
2
|
+
encodedPrice: string;
|
|
3
|
+
priceInUnits: number;
|
|
4
|
+
priceTimestamp: number;
|
|
5
|
+
priceConfidenceInUnits: number;
|
|
6
|
+
fee?: bigint;
|
|
7
|
+
}
|
|
8
|
+
export interface RawPriceData {
|
|
9
|
+
priceInScale: bigint;
|
|
10
|
+
confInScale: bigint;
|
|
11
|
+
}
|
|
12
|
+
export type CombinedPriceData = RawPriceData & PriceData;
|
|
13
|
+
//# sourceMappingURL=interfaces.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../../../lib/priceFeeds/interfaces.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,iBAAiB,GAAG,YAAY,GAAG,SAAS,CAAC"}
|
|
@@ -2,4 +2,5 @@ import { TPairIds } from "../../constants/pairIds";
|
|
|
2
2
|
export declare const PYTH_PRICE_KEYS: Record<TPairIds, string>;
|
|
3
3
|
export declare const PYTH_PRICE_ENTRIES: [TPairIds, string][];
|
|
4
4
|
export declare const PYTH_PAIRS_PRICE_FEED_IDS: Record<TPairIds, string>;
|
|
5
|
+
export declare const PYTH_PRICE_FEED_ID_TO_PAIR: Record<string, TPairIds>;
|
|
5
6
|
//# sourceMappingURL=pythFeedConstants.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pythFeedConstants.d.ts","sourceRoot":"","sources":["../../../../../lib/priceFeeds/pyth/pythFeedConstants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAErE,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAgCpD,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,EAKjD,CAAC;AAGH,eAAO,MAAM,yBAAyB,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAyC9D,CAAC"}
|
|
1
|
+
{"version":3,"file":"pythFeedConstants.d.ts","sourceRoot":"","sources":["../../../../../lib/priceFeeds/pyth/pythFeedConstants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAErE,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAgCpD,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,EAKjD,CAAC;AAGH,eAAO,MAAM,yBAAyB,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAyC9D,CAAC;AAGF,eAAO,MAAM,0BAA0B,0BAKjC,CAAC"}
|
|
@@ -4,4 +4,9 @@ import { TPairIds } from "../../constants/pairIds";
|
|
|
4
4
|
* @param pairId The pair id
|
|
5
5
|
*/
|
|
6
6
|
export declare function getPythFeedIdForPair(pairId: TPairIds): string;
|
|
7
|
+
/**
|
|
8
|
+
* Get the Pair ID for Pyth Feed ID (reversal lookup)
|
|
9
|
+
* @param feedId The Pyth feed id
|
|
10
|
+
*/
|
|
11
|
+
export declare function getPairIdForPythFeedId(feedId: string): TPairIds;
|
|
7
12
|
//# sourceMappingURL=pythFeedFunctions.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pythFeedFunctions.d.ts","sourceRoot":"","sources":["../../../../../lib/priceFeeds/pyth/pythFeedFunctions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAEnD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,QAAQ,GAAG,MAAM,CAE7D"}
|
|
1
|
+
{"version":3,"file":"pythFeedFunctions.d.ts","sourceRoot":"","sources":["../../../../../lib/priceFeeds/pyth/pythFeedFunctions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAEnD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,QAAQ,GAAG,MAAM,CAE7D;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAE/D"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { CombinedPriceData } from "../interfaces";
|
|
2
|
+
/**
|
|
3
|
+
* Fetches historical price data from Pyth for a specific timestamp or later
|
|
4
|
+
* Only searches forward in time (timestamp >= startTimestamp), never backwards
|
|
5
|
+
* @param priceFeedId - The Pyth price feed ID
|
|
6
|
+
* @param startTimestamp - The minimum timestamp to search from
|
|
7
|
+
* @param maxTimeGap - Maximum seconds to search forward from startTimestamp
|
|
8
|
+
*/
|
|
9
|
+
export declare function getPricesForTimestamp(priceFeedId: string, startTimestamp: number, maxTimeGap: number): Promise<CombinedPriceData>;
|
|
10
|
+
//# sourceMappingURL=pythPriceData.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pythPriceData.d.ts","sourceRoot":"","sources":["../../../../../lib/priceFeeds/pyth/pythPriceData.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAgClD;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,iBAAiB,CAAC,CAiB5B"}
|