@evaafi/sdk 0.5.3 → 0.5.5

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.
@@ -10,20 +10,16 @@ import {
10
10
  storeStateInit,
11
11
  } from '@ton/core';
12
12
  import {
13
- EVAA_MASTER_MAINNET,
14
- EVAA_MASTER_TESTNET,
15
13
  FEES,
16
- LENDING_CODE,
17
- MAINNET_VERSION,
18
14
  OPCODES,
19
- TESTNET_VERSION,
20
- } from '../constants';
15
+ } from '../constants/general';
21
16
  import { Maybe } from '@ton/core/dist/utils/maybe';
22
17
  import { EvaaUser } from './UserContract';
23
18
  import { parseMasterData } from '../api/parser';
24
- import { MasterData } from '../types/Master';
19
+ import { MasterData, PoolAssetConfig, PoolConfig, PoolJettonAssetConfig, PoolTonAssetConfig } from '../types/Master';
25
20
  import { JettonWallet } from './JettonWallet';
26
21
  import { getUserJettonWallet } from '../utils/userJettonWallet';
22
+ import { getPrices, MAINNET_POOL_CONFIG } from '..';
27
23
 
28
24
  /**
29
25
  * Parameters for the Evaa contract
@@ -31,7 +27,7 @@ import { getUserJettonWallet } from '../utils/userJettonWallet';
31
27
  * @property debug - true to enable debug mode (optional)
32
28
  */
33
29
  export type EvaaParameters = {
34
- testnet: boolean;
30
+ poolConfig: PoolConfig;
35
31
  debug?: boolean;
36
32
  };
37
33
 
@@ -58,7 +54,6 @@ export type SupplyBaseParameters = {
58
54
  includeUserCode: boolean;
59
55
  amount: bigint;
60
56
  userAddress: Address;
61
- assetID: bigint;
62
57
  /* Will be in v6
63
58
  amountToTransfer: bigint;
64
59
  payload: Cell; */
@@ -68,7 +63,7 @@ export type SupplyBaseParameters = {
68
63
  * @property type - 'ton'
69
64
  */
70
65
  export type TonSupplyParameters = SupplyBaseParameters & {
71
- type: 'ton';
66
+ asset: PoolAssetConfig;
72
67
  };
73
68
  /**
74
69
  * Parameters for the jetton supply message
@@ -76,12 +71,16 @@ export type TonSupplyParameters = SupplyBaseParameters & {
76
71
  */
77
72
  export type JettonSupplyParameters = SupplyBaseParameters &
78
73
  JettonMessageParameters & {
79
- type: 'jetton';
74
+ asset: PoolJettonAssetConfig & PoolAssetConfig;
80
75
  };
81
76
 
77
+ export type SupplyParameters = TonSupplyParameters | JettonSupplyParameters;
78
+
79
+
82
80
  /**
83
81
  * Parameters for the withdraw message
84
82
  * @property queryID - unique query ID
83
+ * * @property assetID - asset ID
85
84
  * @property assetID - asset ID
86
85
  * @property amount - amount to withdraw
87
86
  * @property userAddress - user address
@@ -90,11 +89,11 @@ export type JettonSupplyParameters = SupplyBaseParameters &
90
89
  */
91
90
  export type WithdrawParameters = {
92
91
  queryID: bigint;
93
- assetID: bigint;
94
92
  amount: bigint;
95
93
  userAddress: Address;
96
94
  includeUserCode: boolean;
97
95
  priceData: Cell;
96
+ asset: PoolAssetConfig;
98
97
  /* Will be in v6
99
98
  amountToTransfer: bigint;
100
99
  payload: Cell; */
@@ -137,7 +136,7 @@ export type LiquidationBaseParameters = LiquidationBaseData & {
137
136
  * @property type - 'ton'
138
137
  */
139
138
  export type TonLiquidationParameters = LiquidationBaseParameters & {
140
- type: 'ton';
139
+ asset: PoolAssetConfig;
141
140
  };
142
141
  /**
143
142
  * Parameters for the jetton liquidation message
@@ -145,15 +144,15 @@ export type TonLiquidationParameters = LiquidationBaseParameters & {
145
144
  */
146
145
  export type JettonLiquidationParameters = LiquidationBaseParameters &
147
146
  JettonMessageParameters & {
148
- type: 'jetton';
147
+ asset: PoolAssetConfig & PoolJettonAssetConfig
149
148
  };
150
149
 
151
150
  /**
152
151
  * Evaa master contract wrapper
153
152
  */
154
153
  export class Evaa implements Contract {
155
- readonly address: Address = EVAA_MASTER_MAINNET;
156
- readonly network: 'mainnet' | 'testnet' = 'mainnet';
154
+ readonly address: Address;
155
+ private poolConfig: PoolConfig;
157
156
  private readonly debug?: boolean;
158
157
  private _data?: MasterData;
159
158
  private lastSync = 0;
@@ -163,10 +162,8 @@ export class Evaa implements Contract {
163
162
  * @param parameters Evaa contract parameters
164
163
  */
165
164
  constructor(parameters?: EvaaParameters) {
166
- if (parameters?.testnet) {
167
- this.network = 'testnet';
168
- this.address = EVAA_MASTER_TESTNET;
169
- }
165
+ this.poolConfig = parameters?.poolConfig ?? MAINNET_POOL_CONFIG;
166
+ this.address = this.poolConfig.masterAddress;
170
167
  this.debug = parameters?.debug;
171
168
  }
172
169
 
@@ -174,16 +171,18 @@ export class Evaa implements Contract {
174
171
  * Create supply message
175
172
  * @returns supply message as a cell
176
173
  */
177
- createSupplyMessage(parameters: TonSupplyParameters | JettonSupplyParameters): Cell {
178
- if (parameters.type === 'jetton') {
174
+ createSupplyMessage(parameters: SupplyParameters): Cell {
175
+ if ('jettonMasterAddress' in parameters.asset) {
176
+ const jettonParams = parameters as JettonSupplyParameters;
177
+
179
178
  return beginCell()
180
179
  .storeUint(OPCODES.JETTON_TRANSFER, 32)
181
180
  .storeUint(parameters.queryID, 64)
182
181
  .storeCoins(parameters.amount)
183
182
  .storeAddress(this.address)
184
- .storeAddress(parameters.responseAddress ?? parameters.userAddress)
183
+ .storeAddress(jettonParams.responseAddress ?? parameters.userAddress)
185
184
  .storeBit(0)
186
- .storeCoins(parameters.forwardAmount ?? FEES.SUPPLY_JETTON_FWD)
185
+ .storeCoins(jettonParams.forwardAmount ?? FEES.SUPPLY_JETTON_FWD)
187
186
  .storeBit(1)
188
187
  .storeRef(
189
188
  beginCell()
@@ -218,7 +217,7 @@ export class Evaa implements Contract {
218
217
  return beginCell()
219
218
  .storeUint(OPCODES.WITHDRAW, 32)
220
219
  .storeUint(parameters.queryID, 64)
221
- .storeUint(parameters.assetID, 256)
220
+ .storeUint(parameters.asset.assetId, 256)
222
221
  .storeUint(parameters.amount, 64)
223
222
  .storeAddress(parameters.userAddress)
224
223
  .storeInt(parameters.includeUserCode ? -1 : 0, 2)
@@ -234,15 +233,17 @@ export class Evaa implements Contract {
234
233
  * @returns liquidation message as a cell
235
234
  */
236
235
  createLiquidationMessage(parameters: TonLiquidationParameters | JettonLiquidationParameters): Cell {
237
- if (parameters.type === 'jetton') {
236
+ if ('jettonMasterAddress' in parameters.asset) {
237
+ const jettonParams = parameters as JettonLiquidationParameters;
238
+
238
239
  return beginCell()
239
240
  .storeUint(OPCODES.JETTON_TRANSFER, 32)
240
241
  .storeUint(parameters.queryID, 64)
241
242
  .storeCoins(parameters.liquidationAmount)
242
243
  .storeAddress(this.address)
243
- .storeAddress(parameters.responseAddress ?? parameters.liquidatorAddress)
244
+ .storeAddress(jettonParams.responseAddress ?? parameters.liquidatorAddress)
244
245
  .storeBit(0)
245
- .storeCoins(parameters.forwardAmount ?? FEES.LIQUIDATION_JETTON_FWD)
246
+ .storeCoins(jettonParams.forwardAmount ?? FEES.LIQUIDATION_JETTON_FWD)
246
247
  .storeBit(1)
247
248
  .storeRef(
248
249
  beginCell()
@@ -279,7 +280,7 @@ export class Evaa implements Contract {
279
280
  * @param userAddress
280
281
  * @returns user contract address
281
282
  */
282
- calculateUserSCAddr(userAddress: Address): Address {
283
+ calculateUserSCAddr(userAddress: Address, lendingCode: Cell): Address {
283
284
  const lendingData = beginCell()
284
285
  .storeAddress(this.address)
285
286
  .storeAddress(userAddress)
@@ -290,7 +291,7 @@ export class Evaa implements Contract {
290
291
  const stateInit = beginCell()
291
292
  .store(
292
293
  storeStateInit({
293
- code: LENDING_CODE,
294
+ code: lendingCode,
294
295
  data: lendingData,
295
296
  }),
296
297
  )
@@ -304,7 +305,7 @@ export class Evaa implements Contract {
304
305
  * @returns user contract
305
306
  */
306
307
  openUserContract(userAddress: Address): EvaaUser {
307
- return EvaaUser.createFromAddress(this.calculateUserSCAddr(userAddress), this.network === 'testnet');
308
+ return EvaaUser.createFromAddress(this.calculateUserSCAddr(userAddress, this.poolConfig.lendingCode), this.poolConfig);
308
309
  }
309
310
 
310
311
  getOpenedUserContract(provider: ContractProvider, userAddress: Address): OpenedContract<EvaaUser> {
@@ -326,12 +327,13 @@ export class Evaa implements Contract {
326
327
  ) {
327
328
  const message = this.createSupplyMessage(parameters);
328
329
 
329
- if (parameters.type === 'jetton') {
330
+ if ('jettonMasterAddress' in parameters.asset) {
330
331
  if (!via.address) {
331
332
  throw Error('Via address is required for jetton supply');
332
333
  }
334
+
333
335
  const jettonWallet = provider.open(
334
- JettonWallet.createFromAddress(getUserJettonWallet(via.address, parameters.assetID, this.network)),
336
+ JettonWallet.createFromAddress(getUserJettonWallet(via.address, parameters.asset)),
335
337
  );
336
338
  await jettonWallet.sendTransfer(via, value, message);
337
339
  } else {
@@ -340,11 +342,13 @@ export class Evaa implements Contract {
340
342
  sendMode: SendMode.PAY_GAS_SEPARATELY + SendMode.IGNORE_ERRORS,
341
343
  body: message,
342
344
  });
345
+
343
346
  }
344
347
  }
345
348
 
346
349
  async sendWithdraw(provider: ContractProvider, via: Sender, value: bigint, parameters: WithdrawParameters) {
347
350
  const message = this.createWithdrawMessage(parameters);
351
+
348
352
  await provider.internal(via, {
349
353
  value,
350
354
  sendMode: SendMode.PAY_GAS_SEPARATELY + SendMode.IGNORE_ERRORS,
@@ -360,12 +364,13 @@ export class Evaa implements Contract {
360
364
  ) {
361
365
  const message = this.createLiquidationMessage(parameters);
362
366
 
363
- if (parameters.type === 'jetton') {
367
+ if ('jettonMasterAddress' in parameters.asset) {
364
368
  if (!via.address) {
365
369
  throw Error('Via address is required for jetton liquidation');
366
370
  }
371
+
367
372
  const jettonWallet = provider.open(
368
- JettonWallet.createFromAddress(getUserJettonWallet(via.address, parameters.loanAsset, this.network)),
373
+ JettonWallet.createFromAddress(getUserJettonWallet(via.address, parameters.asset)),
369
374
  );
370
375
  await jettonWallet.sendTransfer(via, value, message);
371
376
  } else {
@@ -405,15 +410,10 @@ export class Evaa implements Contract {
405
410
  async getSync(provider: ContractProvider) {
406
411
  const state = (await provider.getState()).state;
407
412
  if (state.type === 'active') {
408
- this._data = parseMasterData(state.data!.toString('base64'), this.network === 'testnet');
409
- if (this.network === 'testnet' && this._data.upgradeConfig.masterCodeVersion !== TESTNET_VERSION) {
413
+ this._data = parseMasterData(state.data!.toString('base64'), this.poolConfig.poolAssetsConfig, this.poolConfig.masterConstants);
414
+ if (this._data.upgradeConfig.masterCodeVersion !== this.poolConfig.masterVersion) {
410
415
  throw Error(
411
- `Outdated SDK version. It supports only master code version ${TESTNET_VERSION} on testnet, but the current master code version is ${this._data.upgradeConfig.masterCodeVersion}`,
412
- );
413
- }
414
- if (this.network === 'mainnet' && this._data.upgradeConfig.masterCodeVersion !== MAINNET_VERSION) {
415
- throw Error(
416
- `Outdated SDK version. It supports only master code version ${MAINNET_VERSION} on mainnet, but the current master code version is ${this._data.upgradeConfig.masterCodeVersion}`,
416
+ `Outdated SDK pool version. It supports only master code version ${this.poolConfig.masterVersion}, but the current master code version is ${this._data.upgradeConfig.masterCodeVersion}`,
417
417
  );
418
418
  }
419
419
  this.lastSync = Math.floor(Date.now() / 1000);
@@ -421,4 +421,12 @@ export class Evaa implements Contract {
421
421
  throw Error('Master contract is not active');
422
422
  }
423
423
  }
424
+
425
+ async getPrices(provider: ContractProvider, endpoints?: string[]) {
426
+ if ((endpoints?.length ?? 0) > 0) {
427
+ return await getPrices(endpoints, this.poolConfig.nftId);
428
+ } else {
429
+ return await getPrices(undefined, this.poolConfig.nftId);
430
+ }
431
+ }
424
432
  }
@@ -1,38 +1,39 @@
1
1
  import { Address, beginCell, Cell, Contract, ContractProvider, Dictionary, Sender, SendMode } from '@ton/core';
2
2
  import { UserData, UserLiteData } from '../types/User';
3
3
  import { parseUserData, parseUserLiteData } from '../api/parser';
4
- import { AssetConfig, ExtendedAssetData } from '../types/Master';
4
+ import { AssetConfig, ExtendedAssetData, ExtendedAssetsConfig, ExtendedAssetsData, PoolConfig } from '../types/Master';
5
5
  import { LiquidationBaseData } from './MasterContract';
6
- import { MAINNET_ASSETS_ID, OPCODES } from '../constants';
6
+ import { OPCODES } from '../constants/general';
7
+ import { MAINNET_POOL_CONFIG } from '../constants/pools';
8
+ import { TON_MAINNET } from '../constants/assets';
7
9
 
8
10
  /**
9
11
  * User contract wrapper
10
12
  */
11
13
  export class EvaaUser implements Contract {
12
14
  readonly address: Address;
13
- readonly testnet: boolean = false;
14
15
  private lastSync = 0;
15
16
  private _liteData?: UserLiteData;
16
17
  private _data?: UserData;
18
+ private poolConfig: PoolConfig;
17
19
 
18
20
  /**
19
21
  * Create user contract wrapper from address
20
22
  * @param address user contract address
21
- * @param testnet testnet flag
22
23
  */
23
- static createFromAddress(address: Address, testnet: boolean = false) {
24
- return new EvaaUser(address, testnet);
24
+ static createFromAddress(address: Address, poolConfig: PoolConfig = MAINNET_POOL_CONFIG) {
25
+ return new EvaaUser(address, poolConfig);
25
26
  }
26
27
 
27
- private constructor(address: Address, testnet: boolean = false) {
28
+ private constructor(address: Address, poolConfig: PoolConfig = MAINNET_POOL_CONFIG) {
28
29
  this.address = address;
29
- this.testnet = testnet;
30
+ this.poolConfig = poolConfig;
30
31
  }
31
32
 
32
33
  async getSyncLite(
33
34
  provider: ContractProvider,
34
- assetsData: Dictionary<bigint, ExtendedAssetData>,
35
- assetsConfig: Dictionary<bigint, AssetConfig>,
35
+ assetsData: ExtendedAssetsData,
36
+ assetsConfig: ExtendedAssetsConfig,
36
37
  ) {
37
38
  const state = (await provider.getState()).state;
38
39
  if (state.type === 'active') {
@@ -40,7 +41,8 @@ export class EvaaUser implements Contract {
40
41
  state.data!.toString('base64'),
41
42
  assetsData,
42
43
  assetsConfig,
43
- this.testnet,
44
+ this.poolConfig.poolAssetsConfig,
45
+ this.poolConfig.masterConstants
44
46
  );
45
47
  this.lastSync = Math.floor(Date.now() / 1000);
46
48
  } else {
@@ -57,12 +59,12 @@ export class EvaaUser implements Contract {
57
59
  * @returns true if user data was calculated
58
60
  */
59
61
  calculateUserData(
60
- assetsData: Dictionary<bigint, ExtendedAssetData>,
61
- assetsConfig: Dictionary<bigint, AssetConfig>,
62
+ assetsData: ExtendedAssetsData,
63
+ assetsConfig: ExtendedAssetsConfig,
62
64
  prices: Dictionary<bigint, bigint>,
63
65
  ): boolean {
64
66
  if (this._liteData) {
65
- this._data = parseUserData(this._liteData, assetsData, assetsConfig, prices, this.testnet);
67
+ this._data = parseUserData(this._liteData, assetsData, assetsConfig, prices, this.poolConfig.poolAssetsConfig, this.poolConfig.masterConstants);
66
68
  return true;
67
69
  }
68
70
  return false;
@@ -92,8 +94,8 @@ export class EvaaUser implements Contract {
92
94
 
93
95
  async getSync(
94
96
  provider: ContractProvider,
95
- assetsData: Dictionary<bigint, ExtendedAssetData>,
96
- assetsConfig: Dictionary<bigint, AssetConfig>,
97
+ assetsData: ExtendedAssetsData,
98
+ assetsConfig: ExtendedAssetsConfig,
97
99
  prices: Dictionary<bigint, bigint>,
98
100
  ) {
99
101
  const state = (await provider.getState()).state;
@@ -102,9 +104,10 @@ export class EvaaUser implements Contract {
102
104
  state.data!.toString('base64'),
103
105
  assetsData,
104
106
  assetsConfig,
105
- this.testnet,
107
+ this.poolConfig.poolAssetsConfig,
108
+ this.poolConfig.masterConstants
106
109
  );
107
- this._data = parseUserData(this._liteData, assetsData, assetsConfig, prices, this.testnet);
110
+ this._data = parseUserData(this._liteData, assetsData, assetsConfig, prices, this.poolConfig.poolAssetsConfig, this.poolConfig.masterConstants);
108
111
  this.lastSync = Math.floor(Date.now() / 1000);
109
112
  } else {
110
113
  this._data = { type: 'inactive' };
@@ -154,7 +157,7 @@ export class EvaaUser implements Contract {
154
157
  collateralAsset: this._data.liquidationData.greatestCollateralAsset,
155
158
  minCollateralAmount: this._data.liquidationData.minCollateralAmount,
156
159
  liquidationAmount: this._data.liquidationData.liquidationAmount,
157
- tonLiquidation: this._data.liquidationData.greatestLoanAsset === MAINNET_ASSETS_ID.TON,
160
+ tonLiquidation: this._data.liquidationData.greatestLoanAsset === TON_MAINNET.assetId,
158
161
  };
159
162
  }
160
163
  }
package/src/index.ts CHANGED
@@ -9,6 +9,7 @@ export {
9
9
  calculateAssetData,
10
10
  calculateAssetInterest,
11
11
  getAvailableToBorrow,
12
+ calculateMaximumWithdrawAmount,
12
13
  presentValue,
13
14
  calculateLiquidationData,
14
15
  } from './api/math';
@@ -45,6 +46,11 @@ export {
45
46
  AssetApy,
46
47
  ExtendedAssetData,
47
48
  MasterData,
49
+ PoolConfig,
50
+ ExtendedAssetsData,
51
+ ExtendedAssetsConfig,
52
+ PoolAssetConfig,
53
+ PoolAssetsConfig,
48
54
  } from './types/Master';
49
55
  export {
50
56
  BalanceType,
@@ -65,12 +71,35 @@ export {
65
71
  MAINNET_VERSION,
66
72
  EVAA_MASTER_TESTNET,
67
73
  TESTNET_VERSION,
68
- JETTON_MASTER_ADDRESSES,
69
- MASTER_CONSTANTS,
70
74
  LENDING_CODE,
71
75
  OPCODES,
72
76
  FEES,
73
- } from './constants';
77
+ MASTER_CONSTANTS
78
+ } from './constants/general';
79
+
80
+ export {
81
+ MAINNET_POOL_CONFIG,
82
+ TESTNET_POOL_CONFIG,
83
+ MAINNET_LP_POOL_CONFIG,
84
+ TESTNET_LP_POOL_CONFIG
85
+ } from './constants/pools';
86
+
87
+ export {
88
+ TON_MAINNET,
89
+ USDT_MAINNET,
90
+ TONUSDT_DEDUST_MAINNET,
91
+ TON_STORM_MAINNET,
92
+ USDT_STORM_MAINNET,
93
+ JUSDT_MAINNET,
94
+ JUSDC_MAINNET,
95
+ STTON_MAINNET,
96
+ TSTON_MAINNET,
97
+ JUSDT_TESTNET,
98
+ JUSDC_TESTNET,
99
+ STTON_TESTNET,
100
+ } from './constants/assets';
101
+
102
+ export * from './constants/assets'
74
103
 
75
104
  // Utils
76
105
  export { getLastSentBoc, getTonConnectSender } from './utils/tonConnectSender';
@@ -1,5 +1,38 @@
1
1
  import { Address, Cell, Dictionary } from '@ton/core';
2
2
 
3
+ export type MasterConstants = {
4
+ FACTOR_SCALE: bigint,
5
+ ASSET_COEFFICIENT_SCALE: bigint,
6
+ ASSET_PRICE_SCALE: bigint,
7
+ ASSET_RESERVE_FACTOR_SCALE: bigint,
8
+ ASSET_LIQUIDATION_RESERVE_FACTOR_SCALE: bigint,
9
+ ASSET_ORIGINATION_FEE_SCALE: bigint
10
+ };
11
+
12
+ export type PoolAssetConfig = (PoolTonAssetConfig | PoolJettonAssetConfig) & {
13
+ name: string;
14
+ };
15
+ export type PoolAssetsConfig = PoolAssetConfig[];
16
+
17
+ export type PoolTonAssetConfig = {
18
+ assetId: bigint;
19
+ }
20
+
21
+ export type PoolJettonAssetConfig = {
22
+ assetId: bigint;
23
+ jettonMasterAddress: Address;
24
+ jettonWalletCode: Cell;
25
+ }
26
+
27
+ export type PoolConfig = {
28
+ masterAddress: Address;
29
+ masterVersion: number;
30
+ masterConstants: MasterConstants;
31
+ nftId: string;
32
+ poolAssetsConfig: PoolAssetsConfig;
33
+ lendingCode: Cell;
34
+ };
35
+
3
36
  export type UpgradeConfig = {
4
37
  masterCodeVersion: number;
5
38
  userCodeVersion: number;
@@ -67,13 +100,15 @@ export type AssetApy = {
67
100
  };
68
101
 
69
102
  export type ExtendedAssetData = AssetData & AssetInterest & AssetApy;
103
+ export type ExtendedAssetsData = Dictionary<bigint, ExtendedAssetData>;
104
+ export type ExtendedAssetsConfig = Dictionary<bigint, AssetConfig>;
70
105
 
71
106
  export type MasterData = {
72
107
  meta: string;
73
108
  upgradeConfig: UpgradeConfig;
74
109
  masterConfig: MasterConfig;
75
- assetsConfig: Dictionary<bigint, AssetConfig>;
76
- assetsData: Dictionary<bigint, ExtendedAssetData>;
110
+ assetsConfig: ExtendedAssetsConfig;
111
+ assetsData: ExtendedAssetsData;
77
112
  assetsReserves: Dictionary<bigint, bigint>;
78
113
  apy: {
79
114
  supply: Dictionary<bigint, number>;
package/src/types/User.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { Address, Cell, Dictionary } from '@ton/core';
2
- import { AssetConfig, ExtendedAssetData } from './Master';
2
+ import { AssetConfig, ExtendedAssetData, ExtendedAssetsConfig, ExtendedAssetsData, MasterConfig, MasterConstants } from './Master';
3
3
 
4
4
  export enum BalanceType {
5
5
  supply = 'supply',
@@ -88,6 +88,7 @@ export type PredictHealthFactorArgs = {
88
88
  tokenSymbol: string;
89
89
  balances: Dictionary<bigint, bigint>;
90
90
  prices: Dictionary<bigint, bigint>;
91
- assetsData: Dictionary<bigint, ExtendedAssetData>;
92
- assetsConfig: Dictionary<bigint, AssetConfig>;
91
+ assetsData: ExtendedAssetsData;
92
+ assetsConfig: ExtendedAssetsConfig;
93
+ masterConstants: MasterConstants;
93
94
  };
@@ -1,68 +1,72 @@
1
1
  import { Address, beginCell, Cell, storeStateInit } from '@ton/core';
2
- import { JETTON_MASTER_ADDRESSES, JETTON_WALLETS_CODE, MAINNET_ASSETS_ID } from '../constants';
2
+ import { PoolAssetConfig, PoolJettonAssetConfig } from '../types/Master';
3
+
4
+ export function getUserJettonWallet(ownerAddress: Address, poolAssetConfig: PoolAssetConfig & PoolJettonAssetConfig) {
5
+ const jettonMasterAddress = poolAssetConfig.jettonMasterAddress;
6
+ const jettonWalletCode = poolAssetConfig.jettonWalletCode;
7
+
8
+ if (poolAssetConfig.name === 'USDT') {
9
+ const lib_prep = beginCell().storeUint(2, 8).storeBuffer(jettonWalletCode.hash()).endCell();
10
+ const jwallet_code = new Cell({ exotic: true, bits: lib_prep.bits, refs: lib_prep.refs });
11
+
12
+ const jettonData = beginCell()
13
+ .storeUint(0, 4)
14
+ .storeCoins(0)
15
+ .storeAddress(ownerAddress)
16
+ .storeAddress(jettonMasterAddress)
17
+ .endCell();
18
+
19
+ const stateInit = beginCell()
20
+ .store(
21
+ storeStateInit({
22
+ code: jwallet_code,
23
+ data: jettonData
24
+ })
25
+ )
26
+ .endCell();
27
+ return new Address(0, stateInit.hash());
28
+ }
29
+
30
+ if (poolAssetConfig.name === 'tsTON') {
31
+ const lib_prep = beginCell().storeUint(2, 8).storeBuffer(jettonWalletCode.hash()).endCell();
32
+ const jwallet_code = new Cell({ exotic: true, bits: lib_prep.bits, refs: lib_prep.refs });
33
+
34
+ const jettonData = beginCell()
35
+ .storeCoins(0)
36
+ .storeAddress(ownerAddress)
37
+ .storeAddress(jettonMasterAddress)
38
+ .storeRef(jwallet_code)
39
+ .storeCoins(0)
40
+ .storeUint(0, 48)
41
+ .endCell();
3
42
 
4
- export function getUserJettonWallet(ownerAddress: Address, assetID: bigint, network: 'mainnet' | 'testnet'): Address {
5
- const builder = beginCell().storeCoins(0).storeAddress(ownerAddress);
6
- let jettonWalletCode: Cell;
7
- switch (assetID) {
8
- case MAINNET_ASSETS_ID.jUSDT:
9
- if (network === 'mainnet') {
10
- builder.storeAddress(JETTON_MASTER_ADDRESSES.jUSDT_MAINNET);
11
- jettonWalletCode = JETTON_WALLETS_CODE.jUSDT_MAINNET;
12
- } else {
13
- builder.storeAddress(JETTON_MASTER_ADDRESSES.jUSDT_TESTNET);
14
- jettonWalletCode = JETTON_WALLETS_CODE.jUSDT_TESTNET;
15
- }
16
- break;
17
- case MAINNET_ASSETS_ID.jUSDC:
18
- if (network === 'mainnet') {
19
- builder.storeAddress(JETTON_MASTER_ADDRESSES.jUSDC_MAINNET);
20
- jettonWalletCode = JETTON_WALLETS_CODE.jUSDC_MAINNET;
21
- } else {
22
- builder.storeAddress(JETTON_MASTER_ADDRESSES.jUSDC_TESTNET);
23
- jettonWalletCode = JETTON_WALLETS_CODE.jUSDC_TESTNET;
24
- }
25
- break;
26
- case MAINNET_ASSETS_ID.stTON:
27
- if (network === 'mainnet') {
28
- builder.storeAddress(JETTON_MASTER_ADDRESSES.stTON_MAINNET);
29
- jettonWalletCode = JETTON_WALLETS_CODE.stTON_MAINNET;
30
- } else {
31
- builder.storeAddress(JETTON_MASTER_ADDRESSES.stTON_TESTNET);
32
- jettonWalletCode = JETTON_WALLETS_CODE.stTON_TESTNET;
33
- }
34
- break;
35
- case MAINNET_ASSETS_ID.tsTON:
36
- if (network === 'mainnet') {
37
- builder.storeAddress(JETTON_MASTER_ADDRESSES.tsTON_MAINNET);
38
- jettonWalletCode = JETTON_WALLETS_CODE.tsTON_MAINNET;
39
- } else {
40
- // builder.storeAddress(JETTON_MASTER_ADDRESSES.tsTON_TESTNET);
41
- // jettonWalletCode = JETTON_WALLETS_CODE.tsTON_TESTNET;
42
- throw new Error('tsTON is not supported on testnet');
43
- }
44
- break;
45
- case MAINNET_ASSETS_ID.USDT:
46
- if (network === 'mainnet') {
47
- builder.storeAddress(JETTON_MASTER_ADDRESSES.USDT_MAINNET);
48
- jettonWalletCode = JETTON_WALLETS_CODE.USDT_MAINNET;
49
- } else {
50
- // builder.storeAddress(JETTON_MASTER_ADDRESSES.USDT_TESTNET);
51
- // jettonWalletCode = JETTON_WALLETS_CODE.USDT_TESTNET;
52
- throw new Error('USDT is not supported on testnet');
53
- }
54
- break;
55
- default:
56
- throw new Error('Unsupported asset');
57
- }
58
- const data = builder.storeRef(jettonWalletCode).endCell();
59
43
  const stateInit = beginCell()
60
- .store(
61
- storeStateInit({
62
- code: jettonWalletCode,
63
- data: data,
64
- }),
65
- )
66
- .endCell();
44
+ .store(
45
+ storeStateInit({
46
+ code: jwallet_code,
47
+ data: jettonData
48
+ })
49
+ )
50
+ .endCell();
51
+
67
52
  return new Address(0, stateInit.hash());
53
+ }
54
+
55
+ const jettonData = beginCell()
56
+ .storeCoins(0)
57
+ .storeAddress(ownerAddress)
58
+ .storeAddress(jettonMasterAddress)
59
+ .storeRef(jettonWalletCode)
60
+ .endCell();
61
+
62
+ const stateInit = beginCell()
63
+ .store(
64
+ storeStateInit({
65
+ code: jettonWalletCode,
66
+ data: jettonData
67
+ })
68
+ )
69
+ .endCell();
70
+
71
+ return new Address(0, stateInit.hash());
68
72
  }