@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.
- package/dist/api/math.d.ts +11 -8
- package/dist/api/math.js +77 -35
- package/dist/api/parser.d.ts +4 -4
- package/dist/api/parser.js +42 -50
- package/dist/api/prices.d.ts +1 -1
- package/dist/api/prices.js +5 -5
- package/dist/constants/assets.d.ts +16 -0
- package/dist/constants/assets.js +77 -0
- package/dist/constants/general.d.ts +38 -0
- package/dist/constants/general.js +41 -0
- package/dist/constants/pools.d.ts +5 -0
- package/dist/constants/pools.js +60 -0
- package/dist/contracts/MasterContract.d.ts +13 -11
- package/dist/contracts/MasterContract.js +39 -35
- package/dist/contracts/UserContract.d.ts +6 -7
- package/dist/contracts/UserContract.js +13 -13
- package/dist/index.d.ts +6 -3
- package/dist/index.js +44 -11
- package/dist/types/Master.d.ts +32 -2
- package/dist/types/User.d.ts +4 -3
- package/dist/utils/userJettonWallet.d.ts +2 -1
- package/dist/utils/userJettonWallet.js +45 -61
- package/package.json +9 -1
- package/src/api/math.ts +106 -39
- package/src/api/parser.ts +54 -65
- package/src/api/prices.ts +5 -5
- package/src/constants/assets.ts +117 -0
- package/src/constants/general.ts +54 -0
- package/src/constants/pools.ts +63 -0
- package/src/contracts/MasterContract.ts +51 -43
- package/src/contracts/UserContract.ts +22 -19
- package/src/index.ts +32 -3
- package/src/types/Master.ts +37 -2
- package/src/types/User.ts +4 -3
- package/src/utils/userJettonWallet.ts +67 -63
- package/src/constants.ts +0 -127
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
156
|
-
|
|
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
|
-
|
|
167
|
-
|
|
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:
|
|
178
|
-
if (parameters.
|
|
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(
|
|
183
|
+
.storeAddress(jettonParams.responseAddress ?? parameters.userAddress)
|
|
185
184
|
.storeBit(0)
|
|
186
|
-
.storeCoins(
|
|
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.
|
|
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.
|
|
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(
|
|
244
|
+
.storeAddress(jettonParams.responseAddress ?? parameters.liquidatorAddress)
|
|
244
245
|
.storeBit(0)
|
|
245
|
-
.storeCoins(
|
|
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:
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
409
|
-
if (this.
|
|
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 ${
|
|
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 {
|
|
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,
|
|
24
|
-
return new EvaaUser(address,
|
|
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,
|
|
28
|
+
private constructor(address: Address, poolConfig: PoolConfig = MAINNET_POOL_CONFIG) {
|
|
28
29
|
this.address = address;
|
|
29
|
-
this.
|
|
30
|
+
this.poolConfig = poolConfig;
|
|
30
31
|
}
|
|
31
32
|
|
|
32
33
|
async getSyncLite(
|
|
33
34
|
provider: ContractProvider,
|
|
34
|
-
assetsData:
|
|
35
|
-
assetsConfig:
|
|
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.
|
|
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:
|
|
61
|
-
assetsConfig:
|
|
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.
|
|
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:
|
|
96
|
-
assetsConfig:
|
|
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.
|
|
107
|
+
this.poolConfig.poolAssetsConfig,
|
|
108
|
+
this.poolConfig.masterConstants
|
|
106
109
|
);
|
|
107
|
-
this._data = parseUserData(this._liteData, assetsData, assetsConfig, prices, this.
|
|
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 ===
|
|
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
|
-
|
|
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';
|
package/src/types/Master.ts
CHANGED
|
@@ -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:
|
|
76
|
-
assetsData:
|
|
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:
|
|
92
|
-
assetsConfig:
|
|
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 {
|
|
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
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
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
|
}
|