@evaafi/sdk 0.5.5 → 0.5.6-a

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 (42) hide show
  1. package/dist/api/math.d.ts +22 -3
  2. package/dist/api/math.js +141 -50
  3. package/dist/api/parser.d.ts +3 -3
  4. package/dist/api/parser.js +32 -15
  5. package/dist/config.d.ts +1 -0
  6. package/dist/config.js +4 -0
  7. package/dist/constants/assets.d.ts +2 -3
  8. package/dist/constants/assets.js +10 -2
  9. package/dist/constants/general.d.ts +3 -2
  10. package/dist/constants/general.js +6 -5
  11. package/dist/constants/pools.d.ts +0 -1
  12. package/dist/constants/pools.js +1 -14
  13. package/dist/constants.d.ts +4 -4
  14. package/dist/constants.js +15 -7
  15. package/dist/contracts/MasterContract.d.ts +13 -45
  16. package/dist/contracts/MasterContract.js +8 -10
  17. package/dist/contracts/UserContract.js +7 -7
  18. package/dist/index.d.ts +4 -3
  19. package/dist/index.js +3 -2
  20. package/dist/types/Master.d.ts +8 -7
  21. package/dist/types/User.d.ts +5 -5
  22. package/dist/utils/merkleProof.d.ts +4 -0
  23. package/dist/utils/merkleProof.js +108 -0
  24. package/dist/utils/priceUtils.d.ts +55 -0
  25. package/dist/utils/priceUtils.js +117 -0
  26. package/dist/utils/userJettonWallet.d.ts +2 -2
  27. package/dist/utils/userJettonWallet.js +4 -0
  28. package/dist/utils/utils.d.ts +2 -0
  29. package/dist/utils/utils.js +7 -0
  30. package/package.json +2 -3
  31. package/src/api/math.ts +169 -51
  32. package/src/api/parser.ts +50 -25
  33. package/src/constants/assets.ts +11 -3
  34. package/src/constants/general.ts +6 -4
  35. package/src/constants/pools.ts +1 -15
  36. package/src/contracts/MasterContract.ts +23 -65
  37. package/src/contracts/UserContract.ts +8 -10
  38. package/src/index.ts +2 -6
  39. package/src/types/Master.ts +9 -8
  40. package/src/types/User.ts +5 -5
  41. package/src/utils/userJettonWallet.ts +6 -2
  42. package/src/utils/utils.ts +6 -0
@@ -1,4 +1,4 @@
1
- import { AssetConfig, AssetData, AssetInterest, ExtendedAssetData, ExtendedAssetsConfig, ExtendedAssetsData, MasterConstants } from '../types/Master';
1
+ import { AgregatedBalances, AssetConfig, AssetData, AssetInterest, ExtendedAssetData, ExtendedAssetsConfig, ExtendedAssetsData, MasterConstants, PoolConfig } from '../types/Master';
2
2
  import { Dictionary } from '@ton/core';
3
3
  import { LiquidationData, PredictHealthFactorArgs, UserBalance } from '../types/User';
4
4
  export declare function mulFactor(decimal: bigint, a: bigint, b: bigint): bigint;
@@ -17,8 +17,27 @@ export declare function calculateCurrentRates(assetConfig: AssetConfig, assetDat
17
17
  export declare function calculateAssetData(assetsConfigDict: ExtendedAssetsConfig, assetsDataDict: Dictionary<bigint, AssetData>, assetId: bigint, masterConstants: MasterConstants): ExtendedAssetData;
18
18
  export declare function calculateAssetInterest(assetConfig: AssetConfig, assetData: AssetData, masterConstants: MasterConstants): AssetInterest;
19
19
  export declare function checkNotInDebtAtAll(principals: Dictionary<bigint, bigint>): boolean;
20
- export declare function calculateMaximumWithdrawAmount(assetsConfig: ExtendedAssetsConfig, assetsData: ExtendedAssetsData, principals: Dictionary<bigint, bigint>, prices: Dictionary<bigint, bigint>, masterConstants: MasterConstants, assetId: bigint): bigint;
20
+ export declare function getAgregatedBalances(assetsData: ExtendedAssetsData, assetsConfig: ExtendedAssetsConfig, principals: Dictionary<bigint, bigint>, prices: Dictionary<bigint, bigint>, masterConstants: MasterConstants): AgregatedBalances;
21
+ /**
22
+ * @deprecated The method should be used only for main contract v5
23
+ */
24
+ export declare function isV5MainPoolContract(poolConfig: PoolConfig): boolean;
25
+ /**
26
+ * @deprecated The method should be used only for main contract v5
27
+ */
28
+ export declare function calculateMaximumWithdrawAmountOld(assetsConfig: ExtendedAssetsConfig, assetsData: ExtendedAssetsData, principals: Dictionary<bigint, bigint>, prices: Dictionary<bigint, bigint>, masterConstants: MasterConstants, assetId: bigint): bigint;
29
+ export declare function calculateMaximumWithdrawAmount(// todo v6 ifelse dust not debt at all is fixed?
30
+ assetsConfig: ExtendedAssetsConfig, assetsData: ExtendedAssetsData, principals: Dictionary<bigint, bigint>, prices: Dictionary<bigint, bigint>, masterConstants: MasterConstants, assetId: bigint): bigint;
21
31
  export declare function getAvailableToBorrow(assetsConfig: ExtendedAssetsConfig, assetsData: ExtendedAssetsData, principals: Dictionary<bigint, bigint>, prices: Dictionary<bigint, bigint>, masterConstants: MasterConstants): bigint;
22
32
  export declare function presentValue(sRate: bigint, bRate: bigint, principalValue: bigint, masterConstants: MasterConstants): UserBalance;
23
- export declare function calculateLiquidationData(assetsConfig: ExtendedAssetsConfig, assetsData: ExtendedAssetsData, principals: Dictionary<bigint, bigint>, prices: Dictionary<bigint, bigint>, masterConstants: MasterConstants): LiquidationData;
33
+ /**
34
+ *
35
+ * @param assetsConfig
36
+ * @param assetsData
37
+ * @param principals
38
+ * @param prices
39
+ * @param poolConfig
40
+ * @returns can return UNDEFINED_ASSET if there are no assets
41
+ */
42
+ export declare function calculateLiquidationData(assetsConfig: ExtendedAssetsConfig, assetsData: ExtendedAssetsData, principals: Dictionary<bigint, bigint>, prices: Dictionary<bigint, bigint>, poolConfig: PoolConfig): LiquidationData;
24
43
  export declare function predictHealthFactor(args: PredictHealthFactorArgs): number;
package/dist/api/math.js CHANGED
@@ -1,8 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.predictHealthFactor = exports.calculateLiquidationData = exports.presentValue = exports.getAvailableToBorrow = exports.calculateMaximumWithdrawAmount = exports.checkNotInDebtAtAll = exports.calculateAssetInterest = exports.calculateAssetData = exports.calculateCurrentRates = exports.calculatePresentValue = exports.bigIntMin = exports.bigIntMax = exports.mulDivC = exports.mulDiv = exports.mulFactor = void 0;
3
+ exports.predictHealthFactor = exports.calculateLiquidationData = exports.presentValue = exports.getAvailableToBorrow = exports.calculateMaximumWithdrawAmount = exports.calculateMaximumWithdrawAmountOld = exports.isV5MainPoolContract = exports.getAgregatedBalances = exports.checkNotInDebtAtAll = exports.calculateAssetInterest = exports.calculateAssetData = exports.calculateCurrentRates = exports.calculatePresentValue = exports.bigIntMin = exports.bigIntMax = exports.mulDivC = exports.mulDiv = exports.mulFactor = void 0;
4
4
  const User_1 = require("../types/User");
5
5
  const sha256BigInt_1 = require("../utils/sha256BigInt");
6
+ const assets_1 = require("../constants/assets");
7
+ const __1 = require("..");
6
8
  function mulFactor(decimal, a, b) {
7
9
  return (a * b) / decimal;
8
10
  }
@@ -12,8 +14,9 @@ function mulDiv(x, y, z) {
12
14
  }
13
15
  exports.mulDiv = mulDiv;
14
16
  function mulDivC(x, y, z) {
15
- const mul = x * y;
16
- return mul / z + (mul % z ? 1n : 0n);
17
+ //const mul = x * y;
18
+ //return mul / z + (mul % z ? 1n : 0n);
19
+ return BigInt(Math.ceil(Number(x * y) / Number(z)));
17
20
  }
18
21
  exports.mulDivC = mulDivC;
19
22
  function bigIntMax(...args) {
@@ -102,7 +105,83 @@ function checkNotInDebtAtAll(principals) {
102
105
  return principals.values().every(x => x >= 0n);
103
106
  }
104
107
  exports.checkNotInDebtAtAll = checkNotInDebtAtAll;
105
- function calculateMaximumWithdrawAmount(assetsConfig, assetsData, principals, prices, masterConstants, assetId) {
108
+ function getAgregatedBalances(assetsData, assetsConfig, principals, prices, masterConstants) {
109
+ let user_total_supply = 0n;
110
+ let user_total_borrow = 0n;
111
+ for (const [assetId, principal] of principals) {
112
+ if (principal) {
113
+ if (!prices.has(assetId)) {
114
+ return { totalSupply: 0n, totalBorrow: 0n };
115
+ }
116
+ const price = prices.get(assetId);
117
+ const assetData = assetsData.get(assetId);
118
+ const assetConfig = assetsConfig.get(assetId);
119
+ // console.log('price', price);
120
+ if (principal < 0) {
121
+ user_total_borrow += presentValue(assetData.sRate, assetData.bRate, principal, masterConstants).amount * price / 10n ** assetConfig.decimals;
122
+ }
123
+ else {
124
+ user_total_supply += presentValue(assetData.sRate, assetData.bRate, principal, masterConstants).amount * price / 10n ** assetConfig.decimals;
125
+ }
126
+ // console.log('aggregated', assetId, presentValue(assetData.sRate, assetData.bRate, principal, masterConstants).type, presentValue(assetData.sRate, assetData.bRate, principal, masterConstants).amount * price / 10n ** assetConfig.decimals)
127
+ }
128
+ }
129
+ return { totalSupply: user_total_supply, totalBorrow: user_total_borrow };
130
+ }
131
+ exports.getAgregatedBalances = getAgregatedBalances;
132
+ /**
133
+ * @deprecated The method should be used only for main contract v5
134
+ */
135
+ function isV5MainPoolContract(poolConfig) {
136
+ if ((poolConfig.masterAddress == __1.MAINNET_POOL_CONFIG.masterAddress && poolConfig.masterVersion == 5) ||
137
+ (poolConfig.masterAddress == __1.TESTNET_POOL_CONFIG.masterAddress && poolConfig.masterVersion == 5)) {
138
+ return true;
139
+ }
140
+ else {
141
+ return false;
142
+ }
143
+ }
144
+ exports.isV5MainPoolContract = isV5MainPoolContract;
145
+ /**
146
+ * @deprecated The method should be used only for main contract v5
147
+ */
148
+ function calculateMaximumWithdrawAmountOld(assetsConfig, assetsData, principals, prices, masterConstants, assetId) {
149
+ let withdrawAmountMax = 0n;
150
+ const assetConfig = assetsConfig.get(assetId);
151
+ const assetData = assetsData.get(assetId);
152
+ const oldPrincipal = principals.get(assetId);
153
+ const oldPresentValue = presentValue(assetData.sRate, assetData.bRate, oldPrincipal, masterConstants);
154
+ if (oldPresentValue.amount > assetConfig.dust) {
155
+ if (checkNotInDebtAtAll(principals)) {
156
+ withdrawAmountMax = oldPresentValue.amount;
157
+ }
158
+ else {
159
+ if (!prices.has(assetId)) {
160
+ return 0n;
161
+ }
162
+ //const borrowable = getAvailableToBorrow(assetsConfig, assetsData, principals, prices, masterConstants);
163
+ const price = prices.get(assetId);
164
+ const agregatedBalances = getAgregatedBalances(assetsData, assetsConfig, principals, prices, masterConstants);
165
+ let maxAmountToReclaim = mulDiv(agregatedBalances.totalSupply - mulDivC(agregatedBalances.totalBorrow, masterConstants.ASSET_COEFFICIENT_SCALE, assetConfig.collateralFactor), 10n ** assetConfig.decimals, price);
166
+ withdrawAmountMax = bigIntMin(maxAmountToReclaim, oldPresentValue.amount);
167
+ //console.log('agregatedBalances', agregatedBalances);
168
+ //console.log('masterConstants.ASSET_COEFFICIENT_SCALE', masterConstants.ASSET_COEFFICIENT_SCALE);
169
+ //console.log('assetConfig.collateralFactor', assetConfig.collateralFactor);
170
+ //console.log('sekay', maxAmountToReclaim, oldPresentValue.amount);
171
+ }
172
+ }
173
+ else {
174
+ if (!prices.has(assetId)) {
175
+ return 0n;
176
+ }
177
+ const price = prices.get(assetId);
178
+ return getAvailableToBorrow(assetsConfig, assetsData, principals, prices, masterConstants) * (10n ** assetConfig.decimals) / price;
179
+ }
180
+ return withdrawAmountMax;
181
+ }
182
+ exports.calculateMaximumWithdrawAmountOld = calculateMaximumWithdrawAmountOld;
183
+ function calculateMaximumWithdrawAmount(// todo v6 ifelse dust not debt at all is fixed?
184
+ assetsConfig, assetsData, principals, prices, masterConstants, assetId) {
106
185
  let withdrawAmountMax = 0n;
107
186
  const assetConfig = assetsConfig.get(assetId);
108
187
  const assetData = assetsData.get(assetId);
@@ -179,62 +258,74 @@ function presentValue(sRate, bRate, principalValue, masterConstants) {
179
258
  }
180
259
  }
181
260
  exports.presentValue = presentValue;
182
- function calculateLiquidationData(assetsConfig, assetsData, principals, prices, masterConstants) {
183
- let gCollateralValue = 0n;
184
- let gCollateralAsset = 0n;
185
- let gLoanValue = 0n;
186
- let gLoanAsset = 0n;
261
+ /**
262
+ *
263
+ * @param assetsConfig
264
+ * @param assetsData
265
+ * @param principals
266
+ * @param prices
267
+ * @param poolConfig
268
+ * @returns can return UNDEFINED_ASSET if there are no assets
269
+ */
270
+ function calculateLiquidationData(assetsConfig, assetsData, principals, prices, poolConfig) {
271
+ let collateralValue = 0n;
272
+ let collateralAsset = assets_1.UNDEFINED_ASSET;
273
+ let loanValue = 0n;
274
+ let loanAsset = assets_1.UNDEFINED_ASSET;
187
275
  let totalDebt = 0n;
188
276
  let totalLimit = 0n;
189
- for (const key of principals.keys()) {
190
- const principal = principals.get(key);
191
- const assetConfig = assetsConfig.get(key);
192
- const assetData = assetsData.get(key);
277
+ for (const asset of poolConfig.poolAssetsConfig) {
278
+ if (!principals.has(asset.assetId)) {
279
+ continue;
280
+ }
281
+ const principal = principals.get(asset.assetId);
282
+ const assetConfig = assetsConfig.get(asset.assetId);
283
+ const assetData = assetsData.get(asset.assetId);
193
284
  const balance = principal > 0 ? (principal * assetData.sRate) / BigInt(1e12) : (principal * assetData.bRate) / BigInt(1e12);
194
285
  if (balance > 0) {
195
- const assetWorth = (balance * prices.get(key)) / 10n ** assetConfig.decimals;
196
- totalLimit += (assetWorth * assetConfig.liquidationThreshold) / masterConstants.ASSET_COEFFICIENT_SCALE;
197
- if (assetWorth > gCollateralValue) {
198
- gCollateralValue = assetWorth;
199
- gCollateralAsset = key;
286
+ const assetWorth = (balance * prices.get(asset.assetId)) / 10n ** assetConfig.decimals;
287
+ totalLimit += (assetWorth * assetConfig.liquidationThreshold) / poolConfig.masterConstants.ASSET_COEFFICIENT_SCALE;
288
+ if (assetWorth > collateralValue) {
289
+ collateralValue = assetWorth;
290
+ collateralAsset = asset;
200
291
  }
201
292
  }
202
293
  else if (balance < 0) {
203
- const assetWorth = (-balance * prices.get(key)) / 10n ** assetConfig.decimals;
294
+ const assetWorth = (-balance * prices.get(asset.assetId)) / 10n ** assetConfig.decimals;
204
295
  totalDebt += assetWorth;
205
- if (assetWorth > gLoanValue) {
206
- gLoanValue = assetWorth;
207
- gLoanAsset = key;
296
+ if (assetWorth > loanValue) {
297
+ loanValue = assetWorth;
298
+ loanAsset = asset;
208
299
  }
209
300
  }
210
301
  }
211
- if (totalLimit < totalDebt) {
212
- const gLoanAssetPrice = prices.get(gLoanAsset);
302
+ if (collateralAsset.assetId !== assets_1.UNDEFINED_ASSET.assetId && totalLimit < totalDebt) {
303
+ const loanAssetPrice = prices.get(loanAsset.assetId);
213
304
  const values = [];
214
- const gCollateralAssetConfig = assetsConfig.get(gCollateralAsset);
215
- const gLoanAssetConfig = assetsConfig.get(gLoanAsset);
216
- const liquidationBonus = gCollateralAssetConfig.liquidationBonus;
217
- const loanDecimal = 10n ** gLoanAssetConfig.decimals;
218
- values.push((bigIntMax(gCollateralValue / 2n, bigIntMin(gCollateralValue, 10000000000n)) *
219
- loanDecimal *
220
- masterConstants.ASSET_COEFFICIENT_SCALE) /
305
+ const collateralAssetConfig = assetsConfig.get(collateralAsset.assetId);
306
+ const loanAssetConfig = assetsConfig.get(loanAsset.assetId);
307
+ const liquidationBonus = collateralAssetConfig.liquidationBonus;
308
+ const loanScale = 10n ** loanAssetConfig.decimals;
309
+ values.push((bigIntMax(collateralValue / 2n, bigIntMin(collateralValue, 100000000000n)) *
310
+ loanScale *
311
+ poolConfig.masterConstants.ASSET_COEFFICIENT_SCALE) /
221
312
  liquidationBonus /
222
- gLoanAssetPrice);
223
- values.push((gLoanValue * loanDecimal) / gLoanAssetPrice);
313
+ loanAssetPrice);
314
+ values.push((loanValue * loanScale) / loanAssetPrice);
224
315
  const liquidationAmount = bigIntMin(...values) - 5n;
225
- const gCollateralAssetPrice = prices.get(gCollateralAsset);
226
- const collateralDecimal = 10n ** gCollateralAssetConfig.decimals;
227
- let minCollateralAmount = (((liquidationAmount * gLoanAssetPrice * liquidationBonus) / 10000n) * collateralDecimal) /
228
- gCollateralAssetPrice /
229
- loanDecimal -
316
+ const collateralAssetPrice = prices.get(collateralAsset.assetId);
317
+ const collateralDecimal = 10n ** collateralAssetConfig.decimals;
318
+ let minCollateralAmount = (((liquidationAmount * loanAssetPrice * liquidationBonus) / poolConfig.masterConstants.ASSET_LIQUIDATION_BONUS_SCALE) * collateralDecimal) /
319
+ collateralAssetPrice /
320
+ loanScale -
230
321
  10n;
231
322
  minCollateralAmount = (minCollateralAmount * 97n) / 100n;
232
323
  if (minCollateralAmount / collateralDecimal >= 1n) {
233
324
  return {
234
- greatestCollateralAsset: gCollateralAsset,
235
- greatestCollateralValue: gCollateralValue,
236
- greatestLoanAsset: gLoanAsset,
237
- greatestLoanValue: gLoanValue,
325
+ greatestCollateralAsset: collateralAsset,
326
+ greatestCollateralValue: collateralValue,
327
+ greatestLoanAsset: loanAsset,
328
+ greatestLoanValue: loanValue,
238
329
  totalDebt,
239
330
  totalLimit,
240
331
  liquidable: true,
@@ -244,10 +335,10 @@ function calculateLiquidationData(assetsConfig, assetsData, principals, prices,
244
335
  }
245
336
  }
246
337
  return {
247
- greatestCollateralAsset: gCollateralAsset,
248
- greatestCollateralValue: gCollateralValue,
249
- greatestLoanAsset: gLoanAsset,
250
- greatestLoanValue: gLoanValue,
338
+ greatestCollateralAsset: collateralAsset,
339
+ greatestCollateralValue: collateralValue,
340
+ greatestLoanAsset: loanAsset,
341
+ greatestLoanValue: loanValue,
251
342
  totalDebt,
252
343
  totalLimit,
253
344
  liquidable: false,
@@ -255,7 +346,7 @@ function calculateLiquidationData(assetsConfig, assetsData, principals, prices,
255
346
  }
256
347
  exports.calculateLiquidationData = calculateLiquidationData;
257
348
  function predictHealthFactor(args) {
258
- const liquidationData = calculateLiquidationData(args.assetsConfig, args.assetsData, args.balances, args.prices, args.masterConstants);
349
+ const liquidationData = calculateLiquidationData(args.assetsConfig, args.assetsData, args.principals, args.prices, args.poolConfig);
259
350
  const tokenHash = (0, sha256BigInt_1.sha256Hash)(args.tokenSymbol);
260
351
  const assetConfig = args.assetsConfig.get(tokenHash);
261
352
  const assetPrice = Number(args.prices.get(tokenHash));
@@ -267,16 +358,16 @@ function predictHealthFactor(args) {
267
358
  const changeType = args.balanceChangeType;
268
359
  if (currentAmount != null && currentAmount != 0n) {
269
360
  if (changeType == User_1.BalanceChangeType.Borrow) {
270
- totalBorrow += currentBalance * (1 + Number(assetConfig.originationFee) / Number(args.masterConstants.ASSET_ORIGINATION_FEE_SCALE));
361
+ totalBorrow += currentBalance * (1 + Number(assetConfig.originationFee) / Number(args.poolConfig.masterConstants.ASSET_ORIGINATION_FEE_SCALE));
271
362
  }
272
363
  else if (changeType == User_1.BalanceChangeType.Repay) {
273
364
  totalBorrow -= currentBalance;
274
365
  }
275
366
  else if (changeType == User_1.BalanceChangeType.Withdraw) {
276
- totalLimit -= currentBalance * Number(assetConfig.liquidationThreshold) / Number(args.masterConstants.ASSET_COEFFICIENT_SCALE);
367
+ totalLimit -= currentBalance * Number(assetConfig.liquidationThreshold) / Number(args.poolConfig.masterConstants.ASSET_COEFFICIENT_SCALE);
277
368
  }
278
369
  else if (changeType == User_1.BalanceChangeType.Supply) {
279
- totalLimit += currentBalance * Number(assetConfig.liquidationThreshold) / Number(args.masterConstants.ASSET_COEFFICIENT_SCALE);
370
+ totalLimit += currentBalance * Number(assetConfig.liquidationThreshold) / Number(args.poolConfig.masterConstants.ASSET_COEFFICIENT_SCALE);
280
371
  }
281
372
  }
282
373
  if (Number(totalLimit) == 0) {
@@ -1,8 +1,8 @@
1
1
  import { Dictionary, DictionaryValue } from '@ton/core';
2
- import { AssetConfig, AssetData, ExtendedAssetsConfig, ExtendedAssetsData, MasterConstants, MasterData, PoolAssetsConfig } from '../types/Master';
2
+ import { AssetConfig, AssetData, ExtendedAssetsConfig, ExtendedAssetsData, MasterConstants, MasterData, PoolAssetsConfig, PoolConfig } from '../types/Master';
3
3
  import { UserData, UserLiteData } from '../types/User';
4
4
  export declare function createAssetData(): DictionaryValue<AssetData>;
5
5
  export declare function createAssetConfig(): DictionaryValue<AssetConfig>;
6
6
  export declare function parseMasterData(masterDataBOC: string, poolAssetsConfig: PoolAssetsConfig, masterConstants: MasterConstants): MasterData;
7
- export declare function parseUserLiteData(userDataBOC: string, assetsData: ExtendedAssetsData, assetsConfig: ExtendedAssetsConfig, poolAssetsConfig: PoolAssetsConfig, masterConstants: MasterConstants, testnet?: boolean, applyDust?: boolean): UserLiteData;
8
- export declare function parseUserData(userLiteData: UserLiteData, assetsData: ExtendedAssetsData, assetsConfig: ExtendedAssetsConfig, prices: Dictionary<bigint, bigint>, poolAssetConfig: PoolAssetsConfig, masterConstants: MasterConstants, applyDust?: boolean): UserData;
7
+ export declare function parseUserLiteData(userDataBOC: string, assetsData: ExtendedAssetsData, assetsConfig: ExtendedAssetsConfig, poolConfig: PoolConfig, applyDust?: boolean): UserLiteData;
8
+ export declare function parseUserData(userLiteData: UserLiteData, assetsData: ExtendedAssetsData, assetsConfig: ExtendedAssetsConfig, prices: Dictionary<bigint, bigint>, poolConfig: PoolConfig, applyDust?: boolean): UserData;
@@ -181,7 +181,9 @@ function parseMasterData(masterDataBOC, poolAssetsConfig, masterConstants) {
181
181
  };
182
182
  }
183
183
  exports.parseMasterData = parseMasterData;
184
- function parseUserLiteData(userDataBOC, assetsData, assetsConfig, poolAssetsConfig, masterConstants, testnet = false, applyDust = false) {
184
+ function parseUserLiteData(userDataBOC, assetsData, assetsConfig, poolConfig, applyDust = true) {
185
+ const poolAssetsConfig = poolConfig.poolAssetsConfig;
186
+ const masterConstants = poolConfig.masterConstants;
185
187
  const userSlice = core_1.Cell.fromBase64(userDataBOC).beginParse();
186
188
  const codeVersion = userSlice.loadCoins();
187
189
  const masterAddress = userSlice.loadAddress();
@@ -213,14 +215,20 @@ function parseUserLiteData(userDataBOC, assetsData, assetsConfig, poolAssetsConf
213
215
  }
214
216
  */
215
217
  userSlice.endParse();
218
+ const isV5Main = (0, math_1.isV5MainPoolContract)(poolConfig);
216
219
  const userBalances = core_1.Dictionary.empty();
217
220
  for (const [_, asset] of Object.entries(poolAssetsConfig)) {
218
221
  const assetData = assetsData.get(asset.assetId);
219
222
  const assetConfig = assetsConfig.get(asset.assetId);
220
- let principals = principalsDict.get(asset.assetId) || 0n;
221
- const balance = (0, math_1.presentValue)(assetData.sRate, assetData.bRate, principals, masterConstants);
222
- if (applyDust && (principals > -assetConfig.dust && balance.amount < assetConfig.dust)) { // v6 will be abs(principals) < dust
223
- principals = 0n;
223
+ let principal = principalsDict.get(asset.assetId) || 0n;
224
+ let balance = (0, math_1.presentValue)(assetData.sRate, assetData.bRate, principal, masterConstants);
225
+ let leftBorder = isV5Main ? balance.amount : principal;
226
+ if (applyDust && (principal > 0 && (leftBorder < assetConfig.dust))) { // v6 will be abs(principals) < dust
227
+ principal = 0n;
228
+ balance = {
229
+ amount: 0n,
230
+ type: User_1.BalanceType.supply,
231
+ };
224
232
  principalsDict.set(asset.assetId, 0n);
225
233
  }
226
234
  userBalances.set(asset.assetId, balance);
@@ -244,23 +252,27 @@ function parseUserLiteData(userDataBOC, assetsData, assetsConfig, poolAssetsConf
244
252
  };
245
253
  }
246
254
  exports.parseUserLiteData = parseUserLiteData;
247
- function parseUserData(userLiteData, assetsData, assetsConfig, prices, poolAssetConfig, masterConstants, applyDust = false) {
255
+ function parseUserData(userLiteData, assetsData, assetsConfig, prices, poolConfig, applyDust = true) {
256
+ const poolAssetsConfig = poolConfig.poolAssetsConfig;
257
+ const masterConstants = poolConfig.masterConstants;
248
258
  const withdrawalLimits = core_1.Dictionary.empty();
249
259
  const borrowLimits = core_1.Dictionary.empty();
250
260
  let supplyBalance = 0n;
251
261
  let borrowBalance = 0n;
252
- for (const [_, asset] of Object.entries(poolAssetConfig)) {
262
+ const isV5Main = (0, math_1.isV5MainPoolContract)(poolConfig);
263
+ for (const [_, asset] of Object.entries(poolAssetsConfig)) {
253
264
  const assetData = assetsData.get(asset.assetId);
254
265
  const assetConfig = assetsConfig.get(asset.assetId);
255
- let principals = userLiteData.principals.get(asset.assetId) || 0n;
256
- const balance = (0, math_1.presentValue)(assetData.sRate, assetData.bRate, principals, masterConstants);
257
- if (applyDust && (principals > -assetConfig.dust && balance.amount < assetConfig.dust)) { // v6 will be abs(principals) < dust
258
- principals = 0n;
266
+ let principal = userLiteData.principals.get(asset.assetId) || 0n;
267
+ const balance = (0, math_1.presentValue)(assetData.sRate, assetData.bRate, principal, masterConstants);
268
+ let leftBorder = isV5Main ? balance.amount : principal;
269
+ if (applyDust && (principal > 0 && (leftBorder < assetConfig.dust))) { // v6 will be abs(principals) < dust
270
+ principal = 0n;
259
271
  userLiteData.principals.set(asset.assetId, 0n);
260
272
  }
261
273
  userLiteData.balances.set(asset.assetId, balance);
262
274
  }
263
- for (const [_, asset] of Object.entries(poolAssetConfig)) {
275
+ for (const [_, asset] of Object.entries(poolAssetsConfig)) {
264
276
  const assetConfig = assetsConfig.get(asset.assetId);
265
277
  const balance = userLiteData.balances.get(asset.assetId);
266
278
  if (balance.type === User_1.BalanceType.supply) {
@@ -271,12 +283,17 @@ function parseUserData(userLiteData, assetsData, assetsConfig, prices, poolAsset
271
283
  }
272
284
  }
273
285
  const availableToBorrow = (0, math_1.getAvailableToBorrow)(assetsConfig, assetsData, userLiteData.principals, prices, masterConstants);
274
- for (const [_, asset] of Object.entries(poolAssetConfig)) {
286
+ for (const [_, asset] of Object.entries(poolAssetsConfig)) {
275
287
  const assetConfig = assetsConfig.get(asset.assetId);
276
288
  const assetData = assetsData.get(asset.assetId);
277
289
  const balance = userLiteData.balances.get(asset.assetId);
278
290
  if (balance.type === User_1.BalanceType.supply) {
279
- withdrawalLimits.set(asset.assetId, (0, math_1.calculateMaximumWithdrawAmount)(assetsConfig, assetsData, userLiteData.principals, prices, masterConstants, asset.assetId));
291
+ if ((0, math_1.isV5MainPoolContract)(poolConfig)) {
292
+ withdrawalLimits.set(asset.assetId, (0, math_1.calculateMaximumWithdrawAmountOld)(assetsConfig, assetsData, userLiteData.principals, prices, masterConstants, asset.assetId));
293
+ }
294
+ else {
295
+ withdrawalLimits.set(asset.assetId, (0, math_1.calculateMaximumWithdrawAmount)(assetsConfig, assetsData, userLiteData.principals, prices, masterConstants, asset.assetId));
296
+ }
280
297
  }
281
298
  borrowLimits.set(asset.assetId, (0, math_1.bigIntMin)((availableToBorrow * 10n ** assetConfig.decimals) / prices.get(asset.assetId), assetData.balance));
282
299
  }
@@ -284,7 +301,7 @@ function parseUserData(userLiteData, assetsData, assetsConfig, prices, poolAsset
284
301
  const limitUsedPercent = limitUsed === 0n
285
302
  ? 0
286
303
  : Number(BigInt(1e9) - (availableToBorrow * BigInt(1e9)) / (borrowBalance + availableToBorrow)) / 1e7;
287
- const liquidationData = (0, math_1.calculateLiquidationData)(assetsConfig, assetsData, userLiteData.principals, prices, masterConstants);
304
+ const liquidationData = (0, math_1.calculateLiquidationData)(assetsConfig, assetsData, userLiteData.principals, prices, poolConfig);
288
305
  const healthFactor = 1 - Number(liquidationData.totalDebt) / Number(liquidationData.totalLimit);
289
306
  return {
290
307
  ...userLiteData,
@@ -0,0 +1 @@
1
+ export declare const TTL_ORACLE_DATA_SEC = 170;
package/dist/config.js ADDED
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TTL_ORACLE_DATA_SEC = void 0;
4
+ exports.TTL_ORACLE_DATA_SEC = 170; // todo back to 120
@@ -1,8 +1,7 @@
1
1
  import { PoolAssetConfig } from "../types/Master";
2
+ export declare const UNDEFINED_ASSET: PoolAssetConfig;
2
3
  export declare const TON_MAINNET: PoolAssetConfig;
3
- export declare const TON_TESTNET: import("../types/Master").PoolTonAssetConfig & {
4
- name: string;
5
- };
4
+ export declare const TON_TESTNET: PoolAssetConfig;
6
5
  export declare const JUSDT_MAINNET: PoolAssetConfig;
7
6
  export declare const JUSDC_MAINNET: PoolAssetConfig;
8
7
  export declare const STTON_MAINNET: PoolAssetConfig;
@@ -1,12 +1,20 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.USDT_STORM_MAINNET = exports.TON_STORM_MAINNET = exports.TONUSDT_DEDUST_MAINNET = exports.STTON_TESTNET = exports.JUSDC_TESTNET = exports.JUSDT_TESTNET = exports.USDT_MAINNET = exports.TSTON_MAINNET = exports.STTON_MAINNET = exports.JUSDC_MAINNET = exports.JUSDT_MAINNET = exports.TON_TESTNET = exports.TON_MAINNET = void 0;
3
+ exports.USDT_STORM_MAINNET = exports.TON_STORM_MAINNET = exports.TONUSDT_DEDUST_MAINNET = exports.STTON_TESTNET = exports.JUSDC_TESTNET = exports.JUSDT_TESTNET = exports.USDT_MAINNET = exports.TSTON_MAINNET = exports.STTON_MAINNET = exports.JUSDC_MAINNET = exports.JUSDT_MAINNET = exports.TON_TESTNET = exports.TON_MAINNET = exports.UNDEFINED_ASSET = void 0;
4
4
  const core_1 = require("@ton/core");
5
5
  const sha256BigInt_1 = require("../utils/sha256BigInt");
6
6
  const general_1 = require("./general");
7
+ exports.UNDEFINED_ASSET = {
8
+ name: 'undefined_asset',
9
+ assetId: -1n,
10
+ jettonMasterAddress: general_1.NULL_ADDRESS, // fake
11
+ jettonWalletCode: core_1.Cell.EMPTY
12
+ };
7
13
  exports.TON_MAINNET = {
8
14
  name: 'TON',
9
- assetId: (0, sha256BigInt_1.sha256Hash)('TON')
15
+ assetId: (0, sha256BigInt_1.sha256Hash)('TON'),
16
+ jettonMasterAddress: general_1.NULL_ADDRESS, // fake
17
+ jettonWalletCode: core_1.Cell.EMPTY
10
18
  };
11
19
  exports.TON_TESTNET = exports.TON_MAINNET;
12
20
  exports.JUSDT_MAINNET = {
@@ -6,13 +6,14 @@ export declare const MASTER_CONSTANTS: {
6
6
  ASSET_RESERVE_FACTOR_SCALE: bigint;
7
7
  ASSET_LIQUIDATION_RESERVE_FACTOR_SCALE: bigint;
8
8
  ASSET_ORIGINATION_FEE_SCALE: bigint;
9
+ ASSET_LIQUIDATION_THRESHOLD_SCALE: bigint;
10
+ ASSET_LIQUIDATION_BONUS_SCALE: bigint;
9
11
  };
12
+ export declare const NULL_ADDRESS: Address;
10
13
  export declare const EVAA_MASTER_MAINNET: Address;
11
14
  export declare const MAINNET_VERSION = 5;
12
15
  export declare const EVAA_MASTER_TESTNET: Address;
13
16
  export declare const TESTNET_VERSION = 5;
14
- export declare const EVAA_LP_TESTNET: Address;
15
- export declare const EVAA_LP_TESTNET_VERSION = 5;
16
17
  export declare const EVAA_LP_MAINNET: Address;
17
18
  export declare const EVAA_LP_MAINNET_VERSION = 0;
18
19
  export declare const MAIN_POOL_NFT_ID = "0xfb9874544d76ca49c5db9cc3e5121e4c018bc8a2fb2bfe8f2a38c5b9963492f5";
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.FEES = exports.OPCODES = exports.JETTON_WALLET_STANDART_CODE_TESTNET = exports.JETTON_WALLET_STANDART_CODE = exports.LENDING_CODE = exports.LP_POOL_NFT_ID = exports.MAIN_POOL_NFT_ID = exports.EVAA_LP_MAINNET_VERSION = exports.EVAA_LP_MAINNET = exports.EVAA_LP_TESTNET_VERSION = exports.EVAA_LP_TESTNET = exports.TESTNET_VERSION = exports.EVAA_MASTER_TESTNET = exports.MAINNET_VERSION = exports.EVAA_MASTER_MAINNET = exports.MASTER_CONSTANTS = void 0;
3
+ exports.FEES = exports.OPCODES = exports.JETTON_WALLET_STANDART_CODE_TESTNET = exports.JETTON_WALLET_STANDART_CODE = exports.LENDING_CODE = exports.LP_POOL_NFT_ID = exports.MAIN_POOL_NFT_ID = exports.EVAA_LP_MAINNET_VERSION = exports.EVAA_LP_MAINNET = exports.TESTNET_VERSION = exports.EVAA_MASTER_TESTNET = exports.MAINNET_VERSION = exports.EVAA_MASTER_MAINNET = exports.NULL_ADDRESS = exports.MASTER_CONSTANTS = void 0;
4
4
  const core_1 = require("@ton/core");
5
5
  exports.MASTER_CONSTANTS = {
6
6
  FACTOR_SCALE: BigInt(1e12),
@@ -8,14 +8,15 @@ exports.MASTER_CONSTANTS = {
8
8
  ASSET_PRICE_SCALE: BigInt(1e9),
9
9
  ASSET_RESERVE_FACTOR_SCALE: 10000n,
10
10
  ASSET_LIQUIDATION_RESERVE_FACTOR_SCALE: 10000n,
11
- ASSET_ORIGINATION_FEE_SCALE: BigInt(1e9)
11
+ ASSET_ORIGINATION_FEE_SCALE: BigInt(1e9),
12
+ ASSET_LIQUIDATION_THRESHOLD_SCALE: 10000n,
13
+ ASSET_LIQUIDATION_BONUS_SCALE: 10000n,
12
14
  };
15
+ exports.NULL_ADDRESS = core_1.Address.parse('UQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJKZ');
13
16
  exports.EVAA_MASTER_MAINNET = core_1.Address.parse('EQC8rUZqR_pWV1BylWUlPNBzyiTYVoBEmQkMIQDZXICfnuRr');
14
17
  exports.MAINNET_VERSION = 5;
15
- exports.EVAA_MASTER_TESTNET = core_1.Address.parse('EQCoIxsE8m0Q_Ui9uM-2RPtVWXqHK0ttuW2Mccuaj4FfdkLl');
18
+ exports.EVAA_MASTER_TESTNET = core_1.Address.parse('EQCoIxsE8m0Q_Ui9uM-2RPtVWXqHK0ttuW2Mccuaj4FfdkLl'); // EQBghPVKxgauOyrcyNYNwE2MRRnebaNpDGpVDQLbml_LIXnK
16
19
  exports.TESTNET_VERSION = 5;
17
- exports.EVAA_LP_TESTNET = core_1.Address.parse('EQBghPVKxgauOyrcyNYNwE2MRRnebaNpDGpVDQLbml_LIXnK');
18
- exports.EVAA_LP_TESTNET_VERSION = 5;
19
20
  exports.EVAA_LP_MAINNET = core_1.Address.parse('EQBIlZX2URWkXCSg3QF2MJZU-wC5XkBoLww-hdWk2G37Jc6N');
20
21
  exports.EVAA_LP_MAINNET_VERSION = 0;
21
22
  exports.MAIN_POOL_NFT_ID = '0xfb9874544d76ca49c5db9cc3e5121e4c018bc8a2fb2bfe8f2a38c5b9963492f5';
@@ -1,5 +1,4 @@
1
1
  import { PoolConfig } from "../types/Master";
2
2
  export declare const MAINNET_POOL_CONFIG: PoolConfig;
3
3
  export declare const TESTNET_POOL_CONFIG: PoolConfig;
4
- export declare const TESTNET_LP_POOL_CONFIG: PoolConfig;
5
4
  export declare const MAINNET_LP_POOL_CONFIG: PoolConfig;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.MAINNET_LP_POOL_CONFIG = exports.TESTNET_LP_POOL_CONFIG = exports.TESTNET_POOL_CONFIG = exports.MAINNET_POOL_CONFIG = void 0;
3
+ exports.MAINNET_LP_POOL_CONFIG = exports.TESTNET_POOL_CONFIG = exports.MAINNET_POOL_CONFIG = void 0;
4
4
  const assets_1 = require("./assets");
5
5
  const general_1 = require("./general");
6
6
  exports.MAINNET_POOL_CONFIG = {
@@ -31,19 +31,6 @@ exports.TESTNET_POOL_CONFIG = {
31
31
  ],
32
32
  lendingCode: general_1.LENDING_CODE
33
33
  };
34
- exports.TESTNET_LP_POOL_CONFIG = {
35
- masterAddress: general_1.EVAA_LP_TESTNET,
36
- masterVersion: general_1.EVAA_LP_TESTNET_VERSION,
37
- masterConstants: general_1.MASTER_CONSTANTS,
38
- nftId: general_1.LP_POOL_NFT_ID,
39
- poolAssetsConfig: [
40
- assets_1.TON_MAINNET,
41
- assets_1.JUSDT_TESTNET,
42
- assets_1.JUSDC_TESTNET,
43
- assets_1.STTON_TESTNET
44
- ],
45
- lendingCode: general_1.LENDING_CODE
46
- };
47
34
  exports.MAINNET_LP_POOL_CONFIG = {
48
35
  masterAddress: general_1.EVAA_LP_MAINNET,
49
36
  masterVersion: general_1.EVAA_LP_MAINNET_VERSION,
@@ -1,16 +1,16 @@
1
1
  import { Address, Cell } from '@ton/core';
2
+ import { OracleNFT } from './types/Master';
2
3
  export declare const EVAA_MASTER_MAINNET: Address;
3
- export declare const MAINNET_VERSION = 5;
4
+ export declare const MAINNET_VERSION = 0;
4
5
  export declare const EVAA_MASTER_TESTNET: Address;
5
- export declare const TESTNET_VERSION = 5;
6
- export declare const NFT_ID = "0xfb9874544d76ca49c5db9cc3e5121e4c018bc8a2fb2bfe8f2a38c5b9963492f5";
6
+ export declare const TESTNET_VERSION = 6;
7
+ export declare const ORACLE_NFTS: OracleNFT[];
7
8
  export declare const MAINNET_ASSETS_ID: {
8
9
  TON: bigint;
9
10
  jUSDT: bigint;
10
11
  jUSDC: bigint;
11
12
  stTON: bigint;
12
13
  tsTON: bigint;
13
- USDT: bigint;
14
14
  };
15
15
  export declare const TESTNET_ASSETS_ID: {
16
16
  TON: bigint;
package/dist/constants.js CHANGED
@@ -1,20 +1,28 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.FEES = exports.OPCODES = exports.JETTON_WALLETS_CODE = exports.LENDING_CODE = exports.MASTER_CONSTANTS = exports.JETTON_MASTER_ADDRESSES = exports.TESTNET_ASSETS_ID = exports.MAINNET_ASSETS_ID = exports.NFT_ID = exports.TESTNET_VERSION = exports.EVAA_MASTER_TESTNET = exports.MAINNET_VERSION = exports.EVAA_MASTER_MAINNET = void 0;
3
+ exports.FEES = exports.OPCODES = exports.JETTON_WALLETS_CODE = exports.LENDING_CODE = exports.MASTER_CONSTANTS = exports.JETTON_MASTER_ADDRESSES = exports.TESTNET_ASSETS_ID = exports.MAINNET_ASSETS_ID = exports.ORACLE_NFTS = exports.TESTNET_VERSION = exports.EVAA_MASTER_TESTNET = exports.MAINNET_VERSION = exports.EVAA_MASTER_MAINNET = void 0;
4
4
  const core_1 = require("@ton/core");
5
5
  const sha256BigInt_1 = require("./utils/sha256BigInt");
6
- exports.EVAA_MASTER_MAINNET = core_1.Address.parse('EQC8rUZqR_pWV1BylWUlPNBzyiTYVoBEmQkMIQDZXICfnuRr');
7
- exports.MAINNET_VERSION = 5;
8
- exports.EVAA_MASTER_TESTNET = core_1.Address.parse('kQCj7qf3i2Cbf1GVtZCinla7lIvE7l3MBMsJMTfAja3BdoRP');
9
- exports.TESTNET_VERSION = 5;
10
- exports.NFT_ID = '0xfb9874544d76ca49c5db9cc3e5121e4c018bc8a2fb2bfe8f2a38c5b9963492f5';
6
+ //todo set back to EQC8rUZqR_pWV1BylWUlPNBzyiTYVoBEmQkMIQDZXICfnuRr
7
+ exports.EVAA_MASTER_MAINNET = core_1.Address.parse('EQC_hR5L4G3vkPG0VODURYoohp_3hlMW-gZiGp89HwyulZK4');
8
+ //todo set back to 5 (todo set at 6 on 10.10.2024)
9
+ exports.MAINNET_VERSION = 0;
10
+ exports.EVAA_MASTER_TESTNET = core_1.Address.parse('kQC92pF4XWatZY9-ZS6SGW6s-dCpjk9NtEkdXQ7vFHJUAdT9');
11
+ exports.TESTNET_VERSION = 6;
12
+ exports.ORACLE_NFTS = [
13
+ { id: 0, address: '0xd3a8c0b9fd44fd25a49289c631e3ac45689281f2f8cf0744400b4c65bed38e5d' },
14
+ { id: 1, address: '0x2c21cabdaa89739de16bde7bc44e86401fac334a3c7e55305fe5e7563043e191' },
15
+ { id: 2, address: '0x2eb258ce7b5d02466ab8a178ad8b0ba6ffa7b58ef21de3dc3b6dd359a1e16af0' },
16
+ { id: 3, address: '0xf9a0769954b4430bca95149fb3d876deb7799d8f74852e0ad4ccc5778ce68b52' },
17
+ ];
11
18
  exports.MAINNET_ASSETS_ID = {
12
19
  TON: (0, sha256BigInt_1.sha256Hash)('TON'),
13
20
  jUSDT: (0, sha256BigInt_1.sha256Hash)('jUSDT'),
14
21
  jUSDC: (0, sha256BigInt_1.sha256Hash)('jUSDC'),
15
22
  stTON: (0, sha256BigInt_1.sha256Hash)('stTON'),
16
23
  tsTON: (0, sha256BigInt_1.sha256Hash)('tsTON'),
17
- USDT: (0, sha256BigInt_1.sha256Hash)('USDT'),
24
+ //todo uncomment
25
+ // USDT: sha256Hash('USDT'),
18
26
  };
19
27
  exports.TESTNET_ASSETS_ID = {
20
28
  TON: (0, sha256BigInt_1.sha256Hash)('TON'),