@evaafi/sdk 0.9.0 → 0.9.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (132) hide show
  1. package/dist/api/feeds.d.ts +16 -24
  2. package/dist/api/feeds.js +22 -49
  3. package/dist/api/math.d.ts +1 -1
  4. package/dist/api/math.js +55 -38
  5. package/dist/api/parser.d.ts +2 -2
  6. package/dist/api/parser.js +3 -3
  7. package/dist/api/parsers/PythOracleParser.d.ts +3 -2
  8. package/dist/api/parsers/PythOracleParser.js +2 -1
  9. package/dist/api/prices.d.ts +1 -0
  10. package/dist/api/prices.js +2 -1
  11. package/dist/constants/assets/assetId.d.ts +3 -1
  12. package/dist/constants/assets/assetId.js +5 -1
  13. package/dist/constants/assets/mainnet.d.ts +2 -0
  14. package/dist/constants/assets/mainnet.js +13 -1
  15. package/dist/constants/general/index.d.ts +25 -11
  16. package/dist/constants/general/index.js +15 -1
  17. package/dist/constants/general/mainnet.d.ts +1 -0
  18. package/dist/constants/general/mainnet.js +2 -1
  19. package/dist/constants/pools/mainnet.d.ts +4 -0
  20. package/dist/constants/pools/mainnet.js +45 -28
  21. package/dist/constants/pools/testnet.js +14 -6
  22. package/dist/contracts/AbstractMaster.d.ts +239 -127
  23. package/dist/contracts/AbstractMaster.js +101 -16
  24. package/dist/contracts/ClassicMaster.d.ts +12 -12
  25. package/dist/contracts/PythMaster.d.ts +41 -24
  26. package/dist/contracts/PythMaster.js +61 -76
  27. package/dist/contracts/PythOracle.d.ts +16 -0
  28. package/dist/contracts/PythOracle.js +19 -0
  29. package/dist/contracts/index.d.ts +1 -0
  30. package/dist/contracts/index.js +1 -0
  31. package/dist/index.d.ts +1 -1
  32. package/dist/index.js +1 -1
  33. package/dist/{prices → oracles}/Types.d.ts +1 -4
  34. package/dist/oracles/collectors/AbstractCollector.d.ts +10 -0
  35. package/dist/oracles/collectors/AbstractCollector.js +6 -0
  36. package/dist/oracles/collectors/ClassicCollector.d.ts +22 -0
  37. package/dist/oracles/collectors/ClassicCollector.js +192 -0
  38. package/dist/oracles/collectors/PythCollector.d.ts +27 -0
  39. package/dist/oracles/collectors/PythCollector.js +252 -0
  40. package/dist/oracles/collectors/index.d.ts +3 -0
  41. package/dist/oracles/collectors/index.js +19 -0
  42. package/dist/{prices → oracles}/index.d.ts +2 -3
  43. package/dist/{prices → oracles}/index.js +2 -3
  44. package/dist/oracles/prices/AbstractPrices.d.ts +33 -0
  45. package/dist/oracles/prices/AbstractPrices.js +40 -0
  46. package/dist/oracles/prices/ClassicPrices.d.ts +19 -0
  47. package/dist/oracles/prices/ClassicPrices.js +48 -0
  48. package/dist/oracles/prices/PythPrices.d.ts +18 -0
  49. package/dist/oracles/prices/PythPrices.js +32 -0
  50. package/dist/oracles/prices/index.d.ts +3 -0
  51. package/dist/oracles/prices/index.js +19 -0
  52. package/dist/{prices → oracles}/utils.d.ts +7 -1
  53. package/dist/{prices → oracles}/utils.js +10 -1
  54. package/dist/rewards/RewardMaster.d.ts +1 -0
  55. package/dist/rewards/RewardUser.d.ts +1 -0
  56. package/dist/types/Master.d.ts +5 -5
  57. package/dist/types/MasterRewards.d.ts +1 -0
  58. package/dist/types/UserRewards.d.ts +1 -0
  59. package/dist/utils/fivaUtils.d.ts +2 -0
  60. package/dist/utils/fivaUtils.js +19 -0
  61. package/dist/utils/sha256BigInt.d.ts +1 -0
  62. package/dist/utils/userJettonWallet.js +15 -1
  63. package/package.json +2 -3
  64. package/src/api/feeds.ts +24 -60
  65. package/src/api/math.ts +118 -90
  66. package/src/api/parser.ts +5 -5
  67. package/src/api/parsers/PythOracleParser.ts +6 -2
  68. package/src/api/prices.ts +2 -1
  69. package/src/constants/assets/assetId.ts +7 -1
  70. package/src/constants/assets/mainnet.ts +24 -0
  71. package/src/constants/general/index.ts +16 -1
  72. package/src/constants/general/mainnet.ts +1 -0
  73. package/src/constants/pools/mainnet.ts +42 -38
  74. package/src/constants/pools/testnet.ts +17 -8
  75. package/src/contracts/AbstractMaster.ts +272 -144
  76. package/src/contracts/ClassicMaster.ts +12 -12
  77. package/src/contracts/PythMaster.ts +130 -123
  78. package/src/contracts/PythOracle.ts +20 -0
  79. package/src/contracts/index.ts +2 -0
  80. package/src/index.ts +1 -1
  81. package/src/{prices → oracles}/Types.ts +0 -5
  82. package/src/oracles/collectors/AbstractCollector.ts +22 -0
  83. package/src/oracles/collectors/ClassicCollector.ts +263 -0
  84. package/src/oracles/collectors/PythCollector.ts +358 -0
  85. package/src/oracles/collectors/index.ts +3 -0
  86. package/src/{prices → oracles}/index.ts +2 -3
  87. package/src/oracles/prices/AbstractPrices.ts +59 -0
  88. package/src/oracles/prices/ClassicPrices.ts +52 -0
  89. package/src/oracles/prices/PythPrices.ts +40 -0
  90. package/src/oracles/prices/index.ts +3 -0
  91. package/src/{prices → oracles}/utils.ts +12 -1
  92. package/src/types/Master.ts +4 -6
  93. package/src/utils/fivaUtils.ts +19 -0
  94. package/src/utils/userJettonWallet.ts +18 -1
  95. package/dist/api/pyth.d.ts +0 -16
  96. package/dist/api/pyth.js +0 -35
  97. package/dist/constants/assets.d.ts +0 -48
  98. package/dist/constants/assets.js +0 -176
  99. package/dist/constants/general.d.ts +0 -67
  100. package/dist/constants/general.js +0 -75
  101. package/dist/constants/pools.d.ts +0 -13
  102. package/dist/constants/pools.js +0 -120
  103. package/dist/contracts/MasterContract.d.ts +0 -156
  104. package/dist/contracts/MasterContract.js +0 -260
  105. package/dist/prices/Oracle.interface.d.ts +0 -9
  106. package/dist/prices/Oracle.interface.js +0 -2
  107. package/dist/prices/Prices.d.ts +0 -11
  108. package/dist/prices/Prices.js +0 -53
  109. package/dist/prices/PricesCollector.d.ts +0 -22
  110. package/dist/prices/PricesCollector.js +0 -146
  111. package/dist/prices/PythCollector.d.ts +0 -22
  112. package/dist/prices/PythCollector.js +0 -217
  113. package/src/prices/Oracle.interface.ts +0 -18
  114. package/src/prices/Prices.ts +0 -45
  115. package/src/prices/PricesCollector.ts +0 -169
  116. package/src/prices/PythCollector.ts +0 -294
  117. /package/dist/{prices → oracles}/Types.js +0 -0
  118. /package/dist/{prices → oracles}/constants.d.ts +0 -0
  119. /package/dist/{prices → oracles}/constants.js +0 -0
  120. /package/dist/{prices → oracles}/sources/Backend.d.ts +0 -0
  121. /package/dist/{prices → oracles}/sources/Backend.js +0 -0
  122. /package/dist/{prices → oracles}/sources/Icp.d.ts +0 -0
  123. /package/dist/{prices → oracles}/sources/Icp.js +0 -0
  124. /package/dist/{prices → oracles}/sources/PriceSource.d.ts +0 -0
  125. /package/dist/{prices → oracles}/sources/PriceSource.js +0 -0
  126. /package/dist/{prices → oracles}/sources/index.d.ts +0 -0
  127. /package/dist/{prices → oracles}/sources/index.js +0 -0
  128. /package/src/{prices → oracles}/constants.ts +0 -0
  129. /package/src/{prices → oracles}/sources/Backend.ts +0 -0
  130. /package/src/{prices → oracles}/sources/Icp.ts +0 -0
  131. /package/src/{prices → oracles}/sources/PriceSource.ts +0 -0
  132. /package/src/{prices → oracles}/sources/index.ts +0 -0
@@ -0,0 +1,252 @@
1
+ "use strict";
2
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
3
+ if (kind === "m") throw new TypeError("Private method is not writable");
4
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
5
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
6
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
7
+ };
8
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
9
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
10
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
11
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
12
+ };
13
+ var _PythCollector_instances, _PythCollector_parsedFeedsMap, _PythCollector_pythConfig, _PythCollector_poolAssetsConfig, _PythCollector_allowedRefTokens, _PythCollector_assetToFeeds, _PythCollector_getPythFeedsUpdates, _PythCollector_fetchPythUpdatesWithRetry, _PythCollector_filterEmptyPrincipalsAndAssets;
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.PythCollector = void 0;
16
+ const hermes_client_1 = require("@pythnetwork/hermes-client");
17
+ const core_1 = require("@ton/core");
18
+ const math_1 = require("../../api/math");
19
+ const prices_1 = require("../../api/prices");
20
+ const general_1 = require("../../constants/general");
21
+ const utils_1 = require("../../utils/utils");
22
+ const constants_1 = require("../constants");
23
+ const PythPrices_1 = require("../prices/PythPrices");
24
+ const AbstractCollector_1 = require("./AbstractCollector");
25
+ class PythCollector extends AbstractCollector_1.AbstractCollector {
26
+ constructor(config) {
27
+ super();
28
+ _PythCollector_instances.add(this);
29
+ _PythCollector_parsedFeedsMap.set(this, new Map());
30
+ _PythCollector_pythConfig.set(this, void 0);
31
+ _PythCollector_poolAssetsConfig.set(this, void 0);
32
+ _PythCollector_allowedRefTokens.set(this, void 0);
33
+ _PythCollector_assetToFeeds.set(this, new Map());
34
+ __classPrivateFieldSet(this, _PythCollector_pythConfig, config.pythConfig, "f");
35
+ __classPrivateFieldSet(this, _PythCollector_poolAssetsConfig, config.poolAssetsConfig, "f");
36
+ __classPrivateFieldSet(this, _PythCollector_allowedRefTokens, config.pythOracle.allowedRefTokens, "f");
37
+ for (const [feedId, feedMap] of config.pythOracle.feedsMap) {
38
+ __classPrivateFieldGet(this, _PythCollector_parsedFeedsMap, "f").set(feedId, feedMap);
39
+ }
40
+ for (const [feedId, connectedFeed] of __classPrivateFieldGet(this, _PythCollector_parsedFeedsMap, "f")) {
41
+ __classPrivateFieldGet(this, _PythCollector_assetToFeeds, "f").set(connectedFeed.assetId, [feedId, connectedFeed.feedId]);
42
+ }
43
+ }
44
+ async getPricesForLiquidate(realPrincipals, fetchConfig) {
45
+ const assets = __classPrivateFieldGet(this, _PythCollector_instances, "m", _PythCollector_filterEmptyPrincipalsAndAssets).call(this, realPrincipals);
46
+ if (assets.includes(undefined)) {
47
+ throw new Error('User from another pool');
48
+ }
49
+ return await this.getPrices(assets.map((x) => x), fetchConfig);
50
+ }
51
+ async getPricesForSupplyWithdraw(realPrincipals, supplyAsset, withdrawAsset, collateralToDebt, fetchConfig) {
52
+ let assets = __classPrivateFieldGet(this, _PythCollector_instances, "m", _PythCollector_filterEmptyPrincipalsAndAssets).call(this, realPrincipals);
53
+ if (assets.includes(undefined)) {
54
+ throw new Error('User from another pool');
55
+ }
56
+ if (!assets.find((a) => a?.assetId === supplyAsset.assetId)) {
57
+ assets.push(supplyAsset);
58
+ }
59
+ if (!assets.find((a) => a?.assetId === withdrawAsset.assetId)) {
60
+ assets.push(withdrawAsset);
61
+ }
62
+ if (collateralToDebt && assets.length == 1) {
63
+ throw new Error('Cannot debt only one supplied asset');
64
+ }
65
+ return this.getPrices(assets.map((x) => x), fetchConfig);
66
+ }
67
+ async getPrices(assets = __classPrivateFieldGet(this, _PythCollector_poolAssetsConfig, "f"), fetchConfig) {
68
+ // Declare variables at the beginning
69
+ let minPublishTime;
70
+ let maxPublishTime;
71
+ if (assets.length === 0) {
72
+ return PythPrices_1.PythPrices.createEmptyPrices();
73
+ }
74
+ const requestedFeeds = new Set();
75
+ const requestedRefAssets = new Set();
76
+ for (const asset of assets) {
77
+ if (__classPrivateFieldGet(this, _PythCollector_allowedRefTokens, "f").has(asset.assetId)) {
78
+ const refTokenId = __classPrivateFieldGet(this, _PythCollector_allowedRefTokens, "f").get(asset.assetId);
79
+ if (__classPrivateFieldGet(this, _PythCollector_assetToFeeds, "f").has(refTokenId)) {
80
+ const [feedId, refFeedId] = __classPrivateFieldGet(this, _PythCollector_assetToFeeds, "f").get(refTokenId);
81
+ requestedFeeds.add(feedId);
82
+ if (refFeedId !== '0x0') {
83
+ requestedFeeds.add(refFeedId);
84
+ }
85
+ }
86
+ requestedRefAssets.add(asset);
87
+ }
88
+ if (__classPrivateFieldGet(this, _PythCollector_assetToFeeds, "f").has(asset.assetId)) {
89
+ const [feedId, refFeedId] = __classPrivateFieldGet(this, _PythCollector_assetToFeeds, "f").get(asset.assetId);
90
+ requestedFeeds.add(feedId);
91
+ if (refFeedId !== '0x0') {
92
+ requestedFeeds.add(refFeedId);
93
+ }
94
+ }
95
+ }
96
+ const targetFeeds = Array.from(requestedFeeds);
97
+ const refAssets = Array.from(requestedRefAssets);
98
+ const pythUpdates = await __classPrivateFieldGet(this, _PythCollector_instances, "m", _PythCollector_fetchPythUpdatesWithRetry).call(this, targetFeeds, fetchConfig);
99
+ // Calculate min and max publish times for validation
100
+ if (pythUpdates.parsed && pythUpdates.parsed.length > 0) {
101
+ let tmin = pythUpdates.parsed[0].price.publish_time;
102
+ let tmax = tmin;
103
+ for (let i = 1; i < pythUpdates.parsed.length; i++) {
104
+ const publishTime = pythUpdates.parsed[i].price.publish_time;
105
+ if (publishTime < tmin)
106
+ tmin = publishTime;
107
+ if (publishTime > tmax)
108
+ tmax = publishTime;
109
+ }
110
+ if (tmax - tmin > constants_1.TTL_ORACLE_DATA_SEC) {
111
+ throw new Error(`Price feeds don't fit in a single 3-minute window. Time span: ${tmax - tmin} seconds (max allowed: ${constants_1.TTL_ORACLE_DATA_SEC})`);
112
+ }
113
+ minPublishTime = tmin;
114
+ maxPublishTime = tmin + constants_1.TTL_ORACLE_DATA_SEC;
115
+ }
116
+ const pricesDict = core_1.Dictionary.empty();
117
+ const pythPriceUpdates = pythUpdates.parsed;
118
+ if (pythPriceUpdates) {
119
+ // Only set prices for requested assets, not all possible mapped assets
120
+ const requestedAssetIds = new Set(assets.map((a) => a.assetId));
121
+ for (const u of pythPriceUpdates) {
122
+ const feedId = `0x${u.id}`;
123
+ const price = (BigInt(u.price.price) * BigInt(10 ** 9)) / BigInt(10 ** (u.price.expo * -1));
124
+ // Find the feed mapping for this feedId and always set the price for the mapped asset
125
+ const feedMapItem = __classPrivateFieldGet(this, _PythCollector_parsedFeedsMap, "f").get(feedId);
126
+ if (feedMapItem) {
127
+ pricesDict.set(feedMapItem.assetId, price);
128
+ }
129
+ // Handle reference tokens - check if any asset uses this feed as a reference
130
+ for (const asset of assets) {
131
+ if (__classPrivateFieldGet(this, _PythCollector_allowedRefTokens, "f").has(asset.assetId)) {
132
+ const refTokenId = __classPrivateFieldGet(this, _PythCollector_allowedRefTokens, "f").get(asset.assetId);
133
+ const refFeeds = __classPrivateFieldGet(this, _PythCollector_assetToFeeds, "f").get(refTokenId);
134
+ if (refFeeds && (refFeeds[0] === feedId || refFeeds[1] === feedId)) {
135
+ if (requestedAssetIds.has(asset.assetId)) {
136
+ // For allowedRefTokens, both asset and reference token should have the same price
137
+ // Set the same price for both the asset and its reference token
138
+ pricesDict.set(asset.assetId, price);
139
+ pricesDict.set(refTokenId, price);
140
+ }
141
+ }
142
+ }
143
+ }
144
+ }
145
+ // Apply dynamic scaling for liquid staking tokens based on feedsMap configuration
146
+ // For each asset that has a feedId (not '0x0'), apply scaling: asset_price = asset_rate * base_price / ASSET_PRICE_SCALE
147
+ for (const [feedId, feedMapItem] of __classPrivateFieldGet(this, _PythCollector_parsedFeedsMap, "f")) {
148
+ if (feedMapItem.feedId !== '0x0') {
149
+ const assetPrice = pricesDict.get(feedMapItem.assetId);
150
+ const baseFeedMapItem = __classPrivateFieldGet(this, _PythCollector_parsedFeedsMap, "f").get(feedMapItem.feedId);
151
+ const basePrice = baseFeedMapItem ? pricesDict.get(baseFeedMapItem.assetId) : undefined;
152
+ if (assetPrice && basePrice) {
153
+ const scaledPrice = (assetPrice * basePrice) / general_1.ASSET_PRICE_SCALE;
154
+ pricesDict.set(feedMapItem.assetId, scaledPrice);
155
+ }
156
+ }
157
+ }
158
+ // Apply scaling for reference tokens (allowedRefTokens)
159
+ // For assets that reference other tokens, they should have the SAME price as their reference token
160
+ // This is different from feedsMap scaling where we multiply rates
161
+ for (const asset of assets) {
162
+ if (__classPrivateFieldGet(this, _PythCollector_allowedRefTokens, "f").has(asset.assetId)) {
163
+ const refTokenId = __classPrivateFieldGet(this, _PythCollector_allowedRefTokens, "f").get(asset.assetId);
164
+ const refTokenPrice = pricesDict.get(refTokenId);
165
+ if (refTokenPrice && requestedAssetIds.has(asset.assetId)) {
166
+ // For allowedRefTokens, the asset price should equal the reference token price
167
+ pricesDict.set(asset.assetId, refTokenPrice);
168
+ }
169
+ }
170
+ }
171
+ // Check that all requested assets have prices
172
+ const missing = assets.map((a) => a.assetId).filter((id) => pricesDict.get(id) === undefined);
173
+ if (missing.length) {
174
+ throw new Error(`Missing prices for ${missing.length} asset(s): ${missing.map((x) => x.toString()).join(', ')}`);
175
+ }
176
+ const dataCell = (0, prices_1.packPythUpdatesData)(pythUpdates.binary);
177
+ return new PythPrices_1.PythPrices({
178
+ dict: pricesDict,
179
+ dataCell,
180
+ minPublishTime,
181
+ maxPublishTime,
182
+ refAssets,
183
+ targetFeeds,
184
+ binaryUpdate: pythUpdates.binary,
185
+ });
186
+ }
187
+ return PythPrices_1.PythPrices.createEmptyPrices();
188
+ }
189
+ async getPricesForWithdraw(realPrincipals, withdrawAsset, collateralToDebt = false, fetchConfig) {
190
+ let assets = __classPrivateFieldGet(this, _PythCollector_instances, "m", _PythCollector_filterEmptyPrincipalsAndAssets).call(this, realPrincipals);
191
+ if ((0, math_1.checkNotInDebtAtAll)(realPrincipals) &&
192
+ (realPrincipals.get(withdrawAsset.assetId) ?? 0n) > 0n &&
193
+ !collateralToDebt) {
194
+ return PythPrices_1.PythPrices.createEmptyPrices();
195
+ }
196
+ if (assets.includes(undefined)) {
197
+ throw new Error('User from another pool');
198
+ }
199
+ if (!assets.includes(withdrawAsset)) {
200
+ assets.push(withdrawAsset);
201
+ }
202
+ if (collateralToDebt && assets.length == 1) {
203
+ throw new Error('Cannot debt only one supplied asset');
204
+ }
205
+ return await this.getPrices(assets.map((x) => x), fetchConfig);
206
+ }
207
+ /**
208
+ * Creates a list of required feed IDs for the given assets
209
+ * @param assets - Array of pool asset configurations
210
+ * @returns Array of unique feed IDs required for the assets
211
+ */
212
+ createRequiredFeedsList(assets) {
213
+ const requestedFeeds = new Set();
214
+ for (const asset of assets) {
215
+ const addFeedsForAsset = (assetId) => {
216
+ if (__classPrivateFieldGet(this, _PythCollector_assetToFeeds, "f").has(assetId)) {
217
+ const [feedId, refFeedId] = __classPrivateFieldGet(this, _PythCollector_assetToFeeds, "f").get(assetId);
218
+ requestedFeeds.add(feedId);
219
+ if (refFeedId !== '0x0') {
220
+ requestedFeeds.add(refFeedId);
221
+ }
222
+ }
223
+ };
224
+ if (__classPrivateFieldGet(this, _PythCollector_allowedRefTokens, "f").has(asset.assetId)) {
225
+ const refTokenId = __classPrivateFieldGet(this, _PythCollector_allowedRefTokens, "f").get(asset.assetId);
226
+ addFeedsForAsset(refTokenId);
227
+ }
228
+ addFeedsForAsset(asset.assetId);
229
+ }
230
+ return Array.from(requestedFeeds);
231
+ }
232
+ }
233
+ exports.PythCollector = PythCollector;
234
+ _PythCollector_parsedFeedsMap = new WeakMap(), _PythCollector_pythConfig = new WeakMap(), _PythCollector_poolAssetsConfig = new WeakMap(), _PythCollector_allowedRefTokens = new WeakMap(), _PythCollector_assetToFeeds = new WeakMap(), _PythCollector_instances = new WeakSet(), _PythCollector_getPythFeedsUpdates =
235
+ /**
236
+ * Updates feeds data from specified endpoint
237
+ * @param feedIds list of pyth feed ids to fetch
238
+ * @returns binary - buffer of feeds update, parsed - json feeds data
239
+ */
240
+ async function _PythCollector_getPythFeedsUpdates(feedIds) {
241
+ const latestPriceUpdates = await Promise.any(__classPrivateFieldGet(this, _PythCollector_pythConfig, "f").pythEndpoints.map((x) => new hermes_client_1.HermesClient(x).getLatestPriceUpdates(feedIds, { encoding: 'hex' })));
242
+ const parsed = latestPriceUpdates['parsed'];
243
+ const binary = Buffer.from(latestPriceUpdates.binary.data[0], 'hex');
244
+ return { binary, parsed };
245
+ }, _PythCollector_fetchPythUpdatesWithRetry = async function _PythCollector_fetchPythUpdatesWithRetry(requiredFeeds, fetchConfig) {
246
+ return (0, utils_1.proxyFetchRetries)(__classPrivateFieldGet(this, _PythCollector_instances, "m", _PythCollector_getPythFeedsUpdates).call(this, requiredFeeds), fetchConfig);
247
+ }, _PythCollector_filterEmptyPrincipalsAndAssets = function _PythCollector_filterEmptyPrincipalsAndAssets(principals) {
248
+ return principals
249
+ .keys()
250
+ .filter((x) => principals.get(x) != 0n)
251
+ .map((x) => __classPrivateFieldGet(this, _PythCollector_poolAssetsConfig, "f").find((asset) => asset.assetId == x));
252
+ };
@@ -0,0 +1,3 @@
1
+ export * from './AbstractCollector';
2
+ export * from './ClassicCollector';
3
+ export * from './PythCollector';
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./AbstractCollector"), exports);
18
+ __exportStar(require("./ClassicCollector"), exports);
19
+ __exportStar(require("./PythCollector"), exports);
@@ -1,7 +1,6 @@
1
+ export * from './collectors';
1
2
  export * from './constants';
2
- export * from './Prices';
3
- export * from './PricesCollector';
4
- export * from './PythCollector';
3
+ export * from './prices';
5
4
  export * from './sources';
6
5
  export * from './Types';
7
6
  export * from './utils';
@@ -14,10 +14,9 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./collectors"), exports);
17
18
  __exportStar(require("./constants"), exports);
18
- __exportStar(require("./Prices"), exports);
19
- __exportStar(require("./PricesCollector"), exports);
20
- __exportStar(require("./PythCollector"), exports);
19
+ __exportStar(require("./prices"), exports);
21
20
  __exportStar(require("./sources"), exports);
22
21
  __exportStar(require("./Types"), exports);
23
22
  __exportStar(require("./utils"), exports);
@@ -0,0 +1,33 @@
1
+ import { Cell, Dictionary } from '@ton/core';
2
+ import { PoolAssetConfig } from '../../types/Master';
3
+ /**
4
+ * Basic price data structure
5
+ * Simplified version of RawPriceData for internal processing
6
+ */
7
+ export interface PriceData {
8
+ /** Dictionary mapping asset IDs to their prices */
9
+ readonly dict: Dictionary<bigint, bigint>;
10
+ /** Serialized data cell containing price information uses for smartcontract */
11
+ readonly dataCell: Cell;
12
+ }
13
+ /**
14
+ * Configuration interface for timestamp boundaries
15
+ * Used to filter price data based on publish time
16
+ */
17
+ export interface TimestampBoundaries {
18
+ /** Maximum valid time for price data in seconds */
19
+ readonly minPublishTime?: number;
20
+ /** Minimum valid time for price data in seconds */
21
+ readonly maxPublishTime?: number;
22
+ }
23
+ export type PriceParameters = PriceData & TimestampBoundaries;
24
+ export declare abstract class AbstractPrices {
25
+ #private;
26
+ protected readonly parameters: PriceParameters;
27
+ constructor(parameters: PriceParameters);
28
+ get dict(): Dictionary<bigint, bigint>;
29
+ get dataCell(): Cell;
30
+ getAssetPrice<T extends bigint | PoolAssetConfig>(asset: T): bigint | undefined;
31
+ get minPublishTime(): number | undefined;
32
+ get maxPublishTime(): number | undefined;
33
+ }
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
3
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
4
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
5
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
6
+ };
7
+ var _AbstractPrices_instances, _AbstractPrices_extractAssetId;
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.AbstractPrices = void 0;
10
+ const core_1 = require("@ton/core");
11
+ class AbstractPrices {
12
+ constructor(parameters) {
13
+ _AbstractPrices_instances.add(this);
14
+ this.parameters = parameters;
15
+ }
16
+ get dict() {
17
+ const dict = core_1.Dictionary.empty();
18
+ for (const [key, value] of this.parameters.dict) {
19
+ dict.set(key, value);
20
+ }
21
+ return dict;
22
+ }
23
+ get dataCell() {
24
+ return new core_1.Cell(this.parameters.dataCell);
25
+ }
26
+ getAssetPrice(asset) {
27
+ const assetId = __classPrivateFieldGet(this, _AbstractPrices_instances, "m", _AbstractPrices_extractAssetId).call(this, asset);
28
+ return this.parameters.dict.get(assetId);
29
+ }
30
+ get minPublishTime() {
31
+ return this.parameters.minPublishTime;
32
+ }
33
+ get maxPublishTime() {
34
+ return this.parameters.maxPublishTime;
35
+ }
36
+ }
37
+ exports.AbstractPrices = AbstractPrices;
38
+ _AbstractPrices_instances = new WeakSet(), _AbstractPrices_extractAssetId = function _AbstractPrices_extractAssetId(asset) {
39
+ return typeof asset === 'bigint' ? asset : asset.assetId;
40
+ };
@@ -0,0 +1,19 @@
1
+ import { AbstractPrices, PriceParameters } from './AbstractPrices';
2
+ export declare enum ClassicPricesMode {
3
+ SPOT = "spot",
4
+ TWAP = "twap"
5
+ }
6
+ export declare const ClassicPricesOffset: {
7
+ spot: bigint;
8
+ twap: bigint;
9
+ };
10
+ export interface ClassicPricesParams extends PriceParameters {
11
+ readonly mode?: ClassicPricesMode;
12
+ }
13
+ export declare class ClassicPrices extends AbstractPrices {
14
+ private readonly params;
15
+ constructor(params: ClassicPricesParams);
16
+ static createEmptyTwapPrices(): ClassicPrices;
17
+ static createEmptySpotPrices(): ClassicPrices;
18
+ static createEmptyPrices(): ClassicPrices;
19
+ }
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ClassicPrices = exports.ClassicPricesOffset = exports.ClassicPricesMode = void 0;
4
+ const core_1 = require("@ton/core");
5
+ const AbstractPrices_1 = require("./AbstractPrices");
6
+ var ClassicPricesMode;
7
+ (function (ClassicPricesMode) {
8
+ ClassicPricesMode["SPOT"] = "spot";
9
+ ClassicPricesMode["TWAP"] = "twap";
10
+ })(ClassicPricesMode || (exports.ClassicPricesMode = ClassicPricesMode = {}));
11
+ exports.ClassicPricesOffset = {
12
+ [ClassicPricesMode.SPOT]: 1n,
13
+ [ClassicPricesMode.TWAP]: 0n,
14
+ };
15
+ class ClassicPrices extends AbstractPrices_1.AbstractPrices {
16
+ constructor(params) {
17
+ super(params);
18
+ this.params = params;
19
+ }
20
+ static createEmptyTwapPrices() {
21
+ return new ClassicPrices({
22
+ mode: ClassicPricesMode.TWAP,
23
+ dict: core_1.Dictionary.empty(),
24
+ dataCell: core_1.Cell.EMPTY,
25
+ minPublishTime: undefined,
26
+ maxPublishTime: undefined,
27
+ });
28
+ }
29
+ static createEmptySpotPrices() {
30
+ return new ClassicPrices({
31
+ mode: ClassicPricesMode.SPOT,
32
+ dict: core_1.Dictionary.empty(),
33
+ dataCell: core_1.Cell.EMPTY,
34
+ minPublishTime: undefined,
35
+ maxPublishTime: undefined,
36
+ });
37
+ }
38
+ static createEmptyPrices() {
39
+ return new ClassicPrices({
40
+ mode: undefined,
41
+ dict: core_1.Dictionary.empty(),
42
+ dataCell: core_1.Cell.EMPTY,
43
+ minPublishTime: undefined,
44
+ maxPublishTime: undefined,
45
+ });
46
+ }
47
+ }
48
+ exports.ClassicPrices = ClassicPrices;
@@ -0,0 +1,18 @@
1
+ /// <reference types="node" />
2
+ /// <reference types="node" />
3
+ import { HexString } from '@pythnetwork/hermes-client';
4
+ import { PoolAssetConfig } from '../../types/Master';
5
+ import { AbstractPrices, PriceParameters } from './AbstractPrices';
6
+ export interface PythPricesParams extends PriceParameters {
7
+ targetFeeds: HexString[];
8
+ refAssets: PoolAssetConfig[];
9
+ binaryUpdate: Buffer;
10
+ }
11
+ export declare class PythPrices extends AbstractPrices {
12
+ private readonly params;
13
+ constructor(params: PythPricesParams);
14
+ static createEmptyPrices(): PythPrices;
15
+ refAssets(): PoolAssetConfig[];
16
+ targetFeeds(): HexString[];
17
+ binaryUpdate(): Buffer;
18
+ }
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PythPrices = void 0;
4
+ const core_1 = require("@ton/core");
5
+ const AbstractPrices_1 = require("./AbstractPrices");
6
+ class PythPrices extends AbstractPrices_1.AbstractPrices {
7
+ constructor(params) {
8
+ super(params);
9
+ this.params = params;
10
+ }
11
+ static createEmptyPrices() {
12
+ return new PythPrices({
13
+ dict: core_1.Dictionary.empty(),
14
+ dataCell: core_1.Cell.EMPTY,
15
+ minPublishTime: undefined,
16
+ maxPublishTime: undefined,
17
+ targetFeeds: [],
18
+ refAssets: [],
19
+ binaryUpdate: Buffer.alloc(0),
20
+ });
21
+ }
22
+ refAssets() {
23
+ return this.params.refAssets;
24
+ }
25
+ targetFeeds() {
26
+ return this.params.targetFeeds;
27
+ }
28
+ binaryUpdate() {
29
+ return this.params.binaryUpdate;
30
+ }
31
+ }
32
+ exports.PythPrices = PythPrices;
@@ -0,0 +1,3 @@
1
+ export * from './AbstractPrices';
2
+ export * from './ClassicPrices';
3
+ export * from './PythPrices';
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./AbstractPrices"), exports);
18
+ __exportStar(require("./ClassicPrices"), exports);
19
+ __exportStar(require("./PythPrices"), exports);
@@ -1,9 +1,15 @@
1
1
  /// <reference types="node" />
2
+ /// <reference types="node" />
2
3
  import { Cell, Dictionary, Slice } from '@ton/core';
3
4
  import { EvaaOracle, ExtendedEvaaOracle } from '../types/Master';
4
5
  import { FetchConfig } from '../utils/utils';
6
+ import { PriceData } from './prices';
5
7
  import { PriceSource } from './sources/PriceSource';
6
- import { OraclePricesData, PriceData, PriceSourcesConfig, RawPriceData } from './Types';
8
+ import { OraclePricesData, PriceSourcesConfig, RawPriceData } from './Types';
9
+ export declare const UPDATE_PRICE_FEEDS_BASE_GAS = 300000n;
10
+ export declare const UPDATE_PRICE_FEEDS_PER_UPDATE_GAS = 90000n;
11
+ export declare const GAS_PRICE_FACTOR = 400n;
12
+ export declare function calcPythUpdateFee(numUpdates: number): bigint;
7
13
  export declare function verifyPricesTimestamp(): (priceData: RawPriceData) => boolean;
8
14
  export declare function getMedianPrice(pricesData: PriceData[], asset: bigint): bigint | null;
9
15
  export declare function packAssetsData(assetsData: {
@@ -1,12 +1,21 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.verifyRawPriceDataSign = exports.verifyPricesSign = exports.unpackMedianPrices = exports.collectAndFilterPrices = exports.generatePriceSources = exports.sumDicts = exports.packOraclesData = exports.createOracleDataProof = exports.packPrices = exports.packAssetsData = exports.getMedianPrice = exports.verifyPricesTimestamp = void 0;
3
+ exports.verifyRawPriceDataSign = exports.verifyPricesSign = exports.unpackMedianPrices = exports.collectAndFilterPrices = exports.generatePriceSources = exports.sumDicts = exports.packOraclesData = exports.createOracleDataProof = exports.packPrices = exports.packAssetsData = exports.getMedianPrice = exports.verifyPricesTimestamp = exports.calcPythUpdateFee = exports.GAS_PRICE_FACTOR = exports.UPDATE_PRICE_FEEDS_PER_UPDATE_GAS = exports.UPDATE_PRICE_FEEDS_BASE_GAS = void 0;
4
4
  const core_1 = require("@ton/core");
5
5
  const crypto_1 = require("@ton/crypto");
6
6
  const merkleProof_1 = require("../utils/merkleProof");
7
7
  const constants_1 = require("./constants");
8
8
  const Backend_1 = require("./sources/Backend");
9
9
  const Icp_1 = require("./sources/Icp");
10
+ exports.UPDATE_PRICE_FEEDS_BASE_GAS = 300000n;
11
+ exports.UPDATE_PRICE_FEEDS_PER_UPDATE_GAS = 90000n;
12
+ // Current settings in basechain are as follows: 1 unit of gas costs 400 nanotons
13
+ exports.GAS_PRICE_FACTOR = 400n;
14
+ // TODO: use PythContract for dynamic fee calc
15
+ function calcPythUpdateFee(numUpdates) {
16
+ return (exports.UPDATE_PRICE_FEEDS_BASE_GAS + exports.UPDATE_PRICE_FEEDS_PER_UPDATE_GAS * BigInt(numUpdates)) * exports.GAS_PRICE_FACTOR;
17
+ }
18
+ exports.calcPythUpdateFee = calcPythUpdateFee;
10
19
  function verifyPricesTimestamp() {
11
20
  return function (priceData) {
12
21
  const timestamp = Date.now() / 1000;
@@ -1,4 +1,5 @@
1
1
  /// <reference types="node" />
2
+ /// <reference types="node" />
2
3
  import { Address, Cell, Contract, ContractProvider, Sender, StateInit } from '@ton/ton';
3
4
  import { Maybe } from '@ton/ton/dist/utils/maybe';
4
5
  import { EvaaRewardsConfig } from '../types/MasterRewards';
@@ -1,4 +1,5 @@
1
1
  /// <reference types="node" />
2
+ /// <reference types="node" />
2
3
  import { Address, Cell, Contract, ContractProvider, Sender, StateInit } from '@ton/ton';
3
4
  import { Maybe } from '@ton/ton/dist/utils/maybe';
4
5
  import { EvaaUserRewardsConfig } from '../types/UserRewards';
@@ -1,6 +1,7 @@
1
1
  /// <reference types="node" />
2
+ /// <reference types="node" />
2
3
  import { Address, Cell, Dictionary } from '@ton/core';
3
- import { Oracle } from '../prices/Oracle.interface';
4
+ import { AbstractCollector } from '../oracles';
4
5
  export { FeedMapItem, parseFeedsMapDict } from '../api/feeds';
5
6
  export type MasterConstants = {
6
7
  FACTOR_SCALE: bigint;
@@ -15,7 +16,6 @@ export type MasterConstants = {
15
16
  ASSET_BRATE_SCALE: bigint;
16
17
  COLLATERAL_WORTH_THRESHOLD: bigint;
17
18
  };
18
- export type PoolAssetsConfig = PoolAssetConfig[];
19
19
  export type PoolAssetConfig = {
20
20
  name: string;
21
21
  assetId: bigint;
@@ -26,9 +26,9 @@ export type PoolConfig = {
26
26
  masterAddress: Address;
27
27
  masterVersion: number;
28
28
  masterConstants: MasterConstants;
29
- poolAssetsConfig: PoolAssetsConfig;
29
+ poolAssetsConfig: PoolAssetConfig[];
30
30
  lendingCode: Cell;
31
- oracles: Oracle;
31
+ collector: AbstractCollector;
32
32
  };
33
33
  export type UpgradeConfig = {
34
34
  masterCodeVersion: number;
@@ -70,7 +70,7 @@ export type AssetData = {
70
70
  bRate: bigint;
71
71
  totalSupply: bigint;
72
72
  totalBorrow: bigint;
73
- lastAccural: bigint;
73
+ lastAccrual: bigint;
74
74
  balance: bigint;
75
75
  trackingSupplyIndex: bigint;
76
76
  trackingBorrowIndex: bigint;
@@ -1,4 +1,5 @@
1
1
  /// <reference types="node" />
2
+ /// <reference types="node" />
2
3
  import { Address, Cell } from '@ton/ton';
3
4
  import { PoolAssetConfig } from './Master';
4
5
  export type EvaaRewardsConfig = {
@@ -1,4 +1,5 @@
1
1
  /// <reference types="node" />
2
+ /// <reference types="node" />
2
3
  import { Address, Cell } from '@ton/ton';
3
4
  import { PoolAssetConfig } from './Master';
4
5
  export type EvaaUserRewardsConfig = {
@@ -0,0 +1,2 @@
1
+ import { Address } from "@ton/core";
2
+ export declare function calculateCloseAddress(address: Address, closeToAddress: Address): Address;