@evaafi/sdk 0.9.0 → 0.9.2-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 (129) hide show
  1. package/dist/api/feeds.d.ts +15 -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.js +2 -1
  10. package/dist/constants/assets/assetId.d.ts +3 -1
  11. package/dist/constants/assets/assetId.js +5 -1
  12. package/dist/constants/assets/mainnet.d.ts +2 -0
  13. package/dist/constants/assets/mainnet.js +13 -1
  14. package/dist/constants/general/index.d.ts +25 -11
  15. package/dist/constants/general/index.js +15 -1
  16. package/dist/constants/general/mainnet.d.ts +2 -1
  17. package/dist/constants/general/mainnet.js +3 -2
  18. package/dist/constants/pools/mainnet.d.ts +4 -0
  19. package/dist/constants/pools/mainnet.js +45 -28
  20. package/dist/constants/pools/testnet.js +14 -6
  21. package/dist/contracts/AbstractMaster.d.ts +239 -127
  22. package/dist/contracts/AbstractMaster.js +101 -16
  23. package/dist/contracts/ClassicMaster.d.ts +12 -12
  24. package/dist/contracts/PythMaster.d.ts +40 -24
  25. package/dist/contracts/PythMaster.js +61 -76
  26. package/dist/contracts/PythOracle.d.ts +15 -0
  27. package/dist/contracts/PythOracle.js +19 -0
  28. package/dist/contracts/index.d.ts +1 -0
  29. package/dist/contracts/index.js +1 -0
  30. package/dist/index.d.ts +1 -1
  31. package/dist/index.js +1 -1
  32. package/dist/{prices → oracles}/Types.d.ts +0 -4
  33. package/dist/oracles/collectors/AbstractCollector.d.ts +10 -0
  34. package/dist/oracles/collectors/AbstractCollector.js +6 -0
  35. package/dist/oracles/collectors/ClassicCollector.d.ts +22 -0
  36. package/dist/oracles/collectors/ClassicCollector.js +192 -0
  37. package/dist/oracles/collectors/PythCollector.d.ts +27 -0
  38. package/dist/oracles/collectors/PythCollector.js +266 -0
  39. package/dist/oracles/collectors/index.d.ts +3 -0
  40. package/dist/oracles/collectors/index.js +19 -0
  41. package/dist/{prices → oracles}/index.d.ts +2 -3
  42. package/dist/{prices → oracles}/index.js +2 -3
  43. package/dist/oracles/prices/AbstractPrices.d.ts +33 -0
  44. package/dist/oracles/prices/AbstractPrices.js +40 -0
  45. package/dist/oracles/prices/ClassicPrices.d.ts +19 -0
  46. package/dist/oracles/prices/ClassicPrices.js +48 -0
  47. package/dist/oracles/prices/PythPrices.d.ts +17 -0
  48. package/dist/oracles/prices/PythPrices.js +32 -0
  49. package/dist/oracles/prices/index.d.ts +3 -0
  50. package/dist/oracles/prices/index.js +19 -0
  51. package/dist/{prices → oracles}/sources/Backend.js +11 -8
  52. package/dist/{prices → oracles}/sources/Icp.js +10 -6
  53. package/dist/{prices → oracles}/utils.d.ts +6 -1
  54. package/dist/{prices → oracles}/utils.js +10 -1
  55. package/dist/types/Master.d.ts +4 -5
  56. package/dist/utils/fivaUtils.d.ts +2 -0
  57. package/dist/utils/fivaUtils.js +19 -0
  58. package/dist/utils/userJettonWallet.js +15 -1
  59. package/dist/utils/utils.d.ts +1 -1
  60. package/dist/utils/utils.js +4 -2
  61. package/package.json +1 -1
  62. package/src/api/feeds.ts +24 -60
  63. package/src/api/math.ts +118 -90
  64. package/src/api/parser.ts +5 -5
  65. package/src/api/parsers/PythOracleParser.ts +6 -2
  66. package/src/api/prices.ts +2 -1
  67. package/src/constants/assets/assetId.ts +7 -1
  68. package/src/constants/assets/mainnet.ts +24 -0
  69. package/src/constants/general/index.ts +16 -1
  70. package/src/constants/general/mainnet.ts +2 -1
  71. package/src/constants/pools/mainnet.ts +42 -38
  72. package/src/constants/pools/testnet.ts +17 -8
  73. package/src/contracts/AbstractMaster.ts +272 -144
  74. package/src/contracts/ClassicMaster.ts +12 -12
  75. package/src/contracts/PythMaster.ts +130 -123
  76. package/src/contracts/PythOracle.ts +20 -0
  77. package/src/contracts/index.ts +2 -0
  78. package/src/index.ts +1 -1
  79. package/src/{prices → oracles}/Types.ts +0 -5
  80. package/src/oracles/collectors/AbstractCollector.ts +22 -0
  81. package/src/oracles/collectors/ClassicCollector.ts +263 -0
  82. package/src/oracles/collectors/PythCollector.ts +372 -0
  83. package/src/oracles/collectors/index.ts +3 -0
  84. package/src/{prices → oracles}/index.ts +2 -3
  85. package/src/oracles/prices/AbstractPrices.ts +59 -0
  86. package/src/oracles/prices/ClassicPrices.ts +52 -0
  87. package/src/oracles/prices/PythPrices.ts +40 -0
  88. package/src/oracles/prices/index.ts +3 -0
  89. package/src/{prices → oracles}/sources/Backend.ts +12 -11
  90. package/src/{prices → oracles}/sources/Icp.ts +10 -9
  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/src/utils/utils.ts +4 -2
  96. package/dist/api/pyth.d.ts +0 -16
  97. package/dist/api/pyth.js +0 -35
  98. package/dist/constants/assets.d.ts +0 -48
  99. package/dist/constants/assets.js +0 -176
  100. package/dist/constants/general.d.ts +0 -67
  101. package/dist/constants/general.js +0 -75
  102. package/dist/constants/pools.d.ts +0 -13
  103. package/dist/constants/pools.js +0 -120
  104. package/dist/contracts/MasterContract.d.ts +0 -156
  105. package/dist/contracts/MasterContract.js +0 -260
  106. package/dist/prices/Oracle.interface.d.ts +0 -9
  107. package/dist/prices/Oracle.interface.js +0 -2
  108. package/dist/prices/Prices.d.ts +0 -11
  109. package/dist/prices/Prices.js +0 -53
  110. package/dist/prices/PricesCollector.d.ts +0 -22
  111. package/dist/prices/PricesCollector.js +0 -146
  112. package/dist/prices/PythCollector.d.ts +0 -22
  113. package/dist/prices/PythCollector.js +0 -217
  114. package/src/prices/Oracle.interface.ts +0 -18
  115. package/src/prices/Prices.ts +0 -45
  116. package/src/prices/PricesCollector.ts +0 -169
  117. package/src/prices/PythCollector.ts +0 -294
  118. /package/dist/{prices → oracles}/Types.js +0 -0
  119. /package/dist/{prices → oracles}/constants.d.ts +0 -0
  120. /package/dist/{prices → oracles}/constants.js +0 -0
  121. /package/dist/{prices → oracles}/sources/Backend.d.ts +0 -0
  122. /package/dist/{prices → oracles}/sources/Icp.d.ts +0 -0
  123. /package/dist/{prices → oracles}/sources/PriceSource.d.ts +0 -0
  124. /package/dist/{prices → oracles}/sources/PriceSource.js +0 -0
  125. /package/dist/{prices → oracles}/sources/index.d.ts +0 -0
  126. /package/dist/{prices → oracles}/sources/index.js +0 -0
  127. /package/src/{prices → oracles}/constants.ts +0 -0
  128. /package/src/{prices → oracles}/sources/PriceSource.ts +0 -0
  129. /package/src/{prices → oracles}/sources/index.ts +0 -0
@@ -1,6 +1,6 @@
1
1
  /// <reference types="node" />
2
2
  import { Address, Cell, Dictionary } from '@ton/core';
3
- import { Oracle } from '../prices/Oracle.interface';
3
+ import { AbstractCollector } from '../oracles';
4
4
  export { FeedMapItem, parseFeedsMapDict } from '../api/feeds';
5
5
  export type MasterConstants = {
6
6
  FACTOR_SCALE: bigint;
@@ -15,7 +15,6 @@ export type MasterConstants = {
15
15
  ASSET_BRATE_SCALE: bigint;
16
16
  COLLATERAL_WORTH_THRESHOLD: bigint;
17
17
  };
18
- export type PoolAssetsConfig = PoolAssetConfig[];
19
18
  export type PoolAssetConfig = {
20
19
  name: string;
21
20
  assetId: bigint;
@@ -26,9 +25,9 @@ export type PoolConfig = {
26
25
  masterAddress: Address;
27
26
  masterVersion: number;
28
27
  masterConstants: MasterConstants;
29
- poolAssetsConfig: PoolAssetsConfig;
28
+ poolAssetsConfig: PoolAssetConfig[];
30
29
  lendingCode: Cell;
31
- oracles: Oracle;
30
+ collector: AbstractCollector;
32
31
  };
33
32
  export type UpgradeConfig = {
34
33
  masterCodeVersion: number;
@@ -70,7 +69,7 @@ export type AssetData = {
70
69
  bRate: bigint;
71
70
  totalSupply: bigint;
72
71
  totalBorrow: bigint;
73
- lastAccural: bigint;
72
+ lastAccrual: bigint;
74
73
  balance: bigint;
75
74
  trackingSupplyIndex: bigint;
76
75
  trackingBorrowIndex: bigint;
@@ -0,0 +1,2 @@
1
+ import { Address } from "@ton/core";
2
+ export declare function calculateCloseAddress(address: Address, closeToAddress: Address): Address;
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.calculateCloseAddress = void 0;
4
+ const core_1 = require("@ton/core");
5
+ const sha256BigInt_1 = require("./sha256BigInt");
6
+ function calculateCloseAddress(address, closeToAddress) {
7
+ const curHashpart = BigInt('0x' + address.hash.toString('hex'));
8
+ const desiredHashpart = BigInt('0x' + closeToAddress.hash.toString('hex'));
9
+ const rewriteBits = 8;
10
+ const mask = (1n << BigInt(256 - rewriteBits)) - 1n;
11
+ const antimask = invertBigInt(mask, 256);
12
+ const newHashpart = (curHashpart & mask) | (desiredHashpart & antimask);
13
+ return new core_1.Address(0, (0, sha256BigInt_1.bigIntToBuffer)(newHashpart));
14
+ }
15
+ exports.calculateCloseAddress = calculateCloseAddress;
16
+ function invertBigInt(value, bits) {
17
+ const maxValue = (1n << BigInt(bits)) - 1n;
18
+ return value ^ maxValue;
19
+ }
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getUserJettonWallet = void 0;
4
4
  const core_1 = require("@ton/core");
5
5
  const assets_1 = require("../constants/assets");
6
+ const fivaUtils_1 = require("./fivaUtils");
6
7
  function getUserJettonData(ownerAddress, assetName, jettonWalletCode, jettonMasterAddress) {
7
8
  switch (assetName) {
8
9
  case 'DOGS':
@@ -16,6 +17,7 @@ function getUserJettonData(ownerAddress, assetName, jettonWalletCode, jettonMast
16
17
  .storeAddress(jettonMasterAddress)
17
18
  .endCell();
18
19
  case 'PT_tsUSDe_01Sep2025':
20
+ case 'PT_tsUSDe_18Dec2025':
19
21
  return (0, core_1.beginCell)()
20
22
  .storeCoins(0)
21
23
  .storeAddress(ownerAddress)
@@ -65,12 +67,24 @@ function getUserJettonWallet(ownerAddress, poolAssetConfig) {
65
67
  jettonWalletCode = new core_1.Cell({ exotic: true, bits: lib_prep.bits, refs: lib_prep.refs });
66
68
  }
67
69
  const jettonData = getUserJettonData(ownerAddress, assetName, jettonWalletCode, poolAssetConfig.jettonMasterAddress);
68
- const stateInit = (0, core_1.beginCell)()
70
+ let stateInit = (0, core_1.beginCell)()
69
71
  .store((0, core_1.storeStateInit)({
70
72
  code: jettonWalletCode,
71
73
  data: jettonData
72
74
  }))
73
75
  .endCell();
76
+ if (poolAssetConfig.name === 'PT_tsUSDe_18Dec2025') {
77
+ stateInit = (0, core_1.beginCell)()
78
+ .storeUint(1, 1) // fixed_prefix_length
79
+ .storeUint(8, 5) // rewrite_bits
80
+ .storeUint(0, 1) // special (Maybe=0)
81
+ .storeMaybeRef(jettonWalletCode) // code (Maybe)
82
+ .storeMaybeRef(jettonData) // data (Maybe)
83
+ .storeUint(0, 1) // libraries empty
84
+ .endCell();
85
+ const addr = new core_1.Address(0, stateInit.hash());
86
+ return (0, fivaUtils_1.calculateCloseAddress)(addr, poolAssetConfig.jettonMasterAddress);
87
+ }
74
88
  return new core_1.Address(0, stateInit.hash());
75
89
  }
76
90
  exports.getUserJettonWallet = getUserJettonWallet;
@@ -7,5 +7,5 @@ export interface FetchConfig {
7
7
  timeout: number;
8
8
  }
9
9
  export declare const DefaultFetchConfig: FetchConfig;
10
- export declare function proxyFetchRetries<T>(fetch: Promise<T>, config?: FetchConfig): Promise<T>;
10
+ export declare function proxyFetchRetries<T>(factory: () => Promise<T>, config?: FetchConfig): Promise<T>;
11
11
  export declare function isValidSubaccountId(subaccountId: number): boolean;
@@ -18,14 +18,16 @@ exports.DefaultFetchConfig = {
18
18
  retries: 3,
19
19
  timeout: 1000,
20
20
  };
21
- async function proxyFetchRetries(fetch, config = exports.DefaultFetchConfig) {
21
+ async function proxyFetchRetries(factory, config = exports.DefaultFetchConfig) {
22
22
  let lastError = null;
23
23
  for (let attempt = 0; attempt <= config.retries; attempt++) {
24
24
  try {
25
25
  const timeoutPromise = new Promise((_, reject) => {
26
26
  setTimeout(() => reject(new Error('Request timeout')), config.timeout);
27
27
  });
28
- return await Promise.race([fetch, timeoutPromise]);
28
+ // Create a fresh promise per attempt
29
+ const result = await Promise.race([factory(), timeoutPromise]);
30
+ return result;
29
31
  }
30
32
  catch (error) {
31
33
  lastError = error instanceof Error ? error : new Error(String(error));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@evaafi/sdk",
3
- "version": "0.9.0",
3
+ "version": "0.9.2-a",
4
4
  "description": "The EVAA SDK is designed to easily integrate with the EVAA lending protocol on TON blockchain.",
5
5
  "main": "dist/index.js",
6
6
  "files": [
package/src/api/feeds.ts CHANGED
@@ -1,14 +1,16 @@
1
+ import { HexString } from '@pythnetwork/hermes-client';
1
2
  import { Dictionary } from '@ton/ton';
2
3
  import { Buffer } from 'buffer';
3
- import { ASSET_ID } from '../constants/assets';
4
4
 
5
- export const PYTH_TON_PRICE_FEED_ID = '0x8963217838ab4cf5cadc172203c1f0b763fbaa45f346d8ee50ba994bbcac3026';
6
- export const PYTH_USDT_PRICE_FEED_ID = '0x2b89b9dc8fdf9f34709a5b106b472f0f39bb6ca9ce04b0fd7f2e971688e2e53b';
7
- export const PYTH_STTON_PRICE_FEED_ID = '0x9145e059026a4d5a46f3b96408f7e572e33b3257b9c2dbe8dba551c772762002';
8
- export const PYTH_TSTON_PRICE_FEED_ID = '0x3d1784128eeab5961ec60648fe497d3901eebd211b7f51e4bb0db9f024977d25';
9
- export const PYTH_USDC_PRICE_FEED_ID = '0xeaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a';
10
- export const PYTH_USDE_PRICE_FEED_ID = '0x6ec879b1e9963de5ee97e9c8710b742d6228252a5e2ca12d4ae81d7fe5ee8c5d';
11
- export const PYTH_TSUSDE_PRICE_FEED_ID = '0xcbe184846426619a60f51056d26efecb0537ad3a73b1e965fe695d06a257cb19';
5
+ export const FEED_ID = {
6
+ TON: '0x8963217838ab4cf5cadc172203c1f0b763fbaa45f346d8ee50ba994bbcac3026',
7
+ USDT: '0x2b89b9dc8fdf9f34709a5b106b472f0f39bb6ca9ce04b0fd7f2e971688e2e53b',
8
+ stTON: '0x9145e059026a4d5a46f3b96408f7e572e33b3257b9c2dbe8dba551c772762002',
9
+ tsTON: '0x3d1784128eeab5961ec60648fe497d3901eebd211b7f51e4bb0db9f024977d25',
10
+ USDC: '0xeaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a',
11
+ USDe: '0x6ec879b1e9963de5ee97e9c8710b742d6228252a5e2ca12d4ae81d7fe5ee8c5d',
12
+ tsUSDe: '0xcbe184846426619a60f51056d26efecb0537ad3a73b1e965fe695d06a257cb19',
13
+ };
12
14
 
13
15
  export function bigintToBuffer(value: bigint, size: number): Buffer {
14
16
  if (value < 0n) {
@@ -21,70 +23,32 @@ export function bigintToBuffer(value: bigint, size: number): Buffer {
21
23
  return Buffer.from(padded, 'hex');
22
24
  }
23
25
 
24
- export const packConnectedFeeds = (evaa_id: bigint, reffered_id: bigint) => {
25
- return Buffer.concat([bigintToBuffer(evaa_id, 32), bigintToBuffer(reffered_id, 32)]);
26
+ export const packConnectedFeeds = (evaa_id: bigint, feedId: HexString) => {
27
+ return Buffer.concat([bigintToBuffer(evaa_id, 32), bigintToBuffer(BigInt(feedId), 32)]);
26
28
  };
27
29
 
28
- export const EVAA_TON_PRICE_FEED_ID = ASSET_ID.TON;
29
- export const EVAA_NOT_PRICE_FEED_ID = ASSET_ID.NOT;
30
- export const EVAA_DOGS_PRICE_FEED_ID = ASSET_ID.DOGS;
31
- export const EVAA_USDT_PRICE_FEED_ID = ASSET_ID.USDT;
32
- export const EVAA_STTON_PRICE_FEED_ID = ASSET_ID.stTON;
33
- export const EVAA_TSTON_PRICE_FEED_ID = ASSET_ID.tsTON;
34
- export const EVAA_JUSDC_PRICE_FEED_ID = ASSET_ID.jUSDC;
35
- export const EVAA_JUSDT_PRICE_FEED_ID = ASSET_ID.jUSDT;
36
- export const EVAA_USDE_PRICE_FEED_ID = ASSET_ID.USDe;
37
- export const EVAA_TSUSDE_PRICE_FEED_ID = ASSET_ID.tsUSDe;
38
-
39
- export const MAIN_POOL_FEEDS_MAP: Dictionary<bigint, Buffer> = (() => {
40
- const map = Dictionary.empty<bigint, Buffer>();
41
- map.set(BigInt(PYTH_TON_PRICE_FEED_ID), packConnectedFeeds(EVAA_TON_PRICE_FEED_ID, 0n));
42
- map.set(BigInt(PYTH_USDT_PRICE_FEED_ID), packConnectedFeeds(EVAA_USDT_PRICE_FEED_ID, 0n));
43
- map.set(
44
- BigInt(PYTH_STTON_PRICE_FEED_ID),
45
- packConnectedFeeds(EVAA_STTON_PRICE_FEED_ID, BigInt(PYTH_TON_PRICE_FEED_ID)),
46
- );
47
- map.set(
48
- BigInt(PYTH_TSTON_PRICE_FEED_ID),
49
- packConnectedFeeds(EVAA_TSTON_PRICE_FEED_ID, BigInt(PYTH_TON_PRICE_FEED_ID)),
50
- );
51
- map.set(BigInt(PYTH_USDC_PRICE_FEED_ID), packConnectedFeeds(EVAA_JUSDC_PRICE_FEED_ID, 0n));
52
- map.set(BigInt(PYTH_USDT_PRICE_FEED_ID), packConnectedFeeds(EVAA_JUSDT_PRICE_FEED_ID, 0n));
53
- map.set(BigInt(PYTH_USDE_PRICE_FEED_ID), packConnectedFeeds(EVAA_USDE_PRICE_FEED_ID, 0n));
54
- map.set(BigInt(PYTH_TSUSDE_PRICE_FEED_ID), packConnectedFeeds(EVAA_TSUSDE_PRICE_FEED_ID, 0n));
55
- return map;
56
- })();
30
+ export const unpackConnectedFeeds = (buffer: Buffer): FeedMapItem => {
31
+ return {
32
+ assetId: BigInt(`0x${buffer.toString('hex', 0, 32)}`),
33
+ feedId: `0x${buffer.toString('hex', 32)}`,
34
+ };
35
+ };
57
36
 
58
37
  export type FeedMapItem = {
59
- evaaId: bigint;
60
- referredPythFeed: bigint;
38
+ assetId: bigint;
39
+ feedId: HexString;
61
40
  };
62
41
 
63
42
  export function parseFeedsMapDict(dict: Dictionary<bigint, Buffer>) {
64
- const parsedData = new Map<bigint, FeedMapItem>();
43
+ const parsedData = new Map<HexString, FeedMapItem>();
65
44
  for (const key of dict.keys()) {
66
45
  const buffer = dict.get(key)!;
67
46
 
68
- const hex1 = '0x' + buffer.toString('hex', 0, 32);
69
- const hex2 = '0x' + buffer.toString('hex', 32);
47
+ const assetId = BigInt(`0x${buffer.toString('hex', 0, 32)}`);
48
+ const feedId = `0x${buffer.toString('hex', 32)}`;
70
49
 
71
- const evaaId = BigInt(hex1);
72
- const referredPythFeed = BigInt(hex2);
73
-
74
- parsedData.set(key, { evaaId, referredPythFeed });
50
+ parsedData.set(`0x${key.toString(16)}`, { assetId, feedId });
75
51
  }
76
52
 
77
53
  return parsedData;
78
54
  }
79
-
80
- export const TESTNET_ALLOWED_REF_TOKENS: Dictionary<bigint, bigint> = (() => {
81
- const map = Dictionary.empty<bigint, bigint>();
82
- map.set(BigInt(EVAA_JUSDT_PRICE_FEED_ID), BigInt(EVAA_USDT_PRICE_FEED_ID));
83
- return map;
84
- })();
85
-
86
- export const TESTNET_FEEDS_MAP: Dictionary<bigint, Buffer> = (() => {
87
- const map = Dictionary.empty<bigint, Buffer>();
88
- map.set(BigInt(PYTH_TON_PRICE_FEED_ID), packConnectedFeeds(EVAA_TON_PRICE_FEED_ID, 0n));
89
- return map;
90
- })();