Skip to content

Commit 9f8a44e

Browse files
authored
Merge pull request #21 from evaafi/sdk-v062a
Sdk v062a
2 parents 1768558 + 09860c0 commit 9f8a44e

File tree

8 files changed

+40
-22
lines changed

8 files changed

+40
-22
lines changed

CHANGELOG.md

+7
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,13 @@ All notable changes to this project will be documented in this file.
44
The format is based on [Keep a Changelog](https://keepachangelog.com/)
55
and this project adheres to [Semantic Versioning](https://semver.org/).
66

7+
## 0.6.2-a - 2024-12-13
8+
### Added
9+
- new field in UserLiteData ```user.data.realPrincipals``` -
10+
principals before applying dusts
11+
### Fixed
12+
- getPricesForWithdraw/getPricesForLiquidate they should now be called with a different argument
13+
714
## 0.6.2 - 2024-11-21
815
### Added
916
- ALTS Pool

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@evaafi/sdk",
3-
"version": "0.6.2",
3+
"version": "0.6.2-a",
44
"description": "The EVAA SDK is designed to easily integrate with the EVAA lending protocol on TON blockchain.",
55
"main": "dist/index.js",
66
"files": [

src/api/parser.ts

+6-2
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,8 @@ export function parseUserLiteData(
208208
const codeVersion = userSlice.loadCoins();
209209
const masterAddress = userSlice.loadAddress();
210210
const userAddress = userSlice.loadAddress();
211-
const principalsDict = userSlice.loadDict(Dictionary.Keys.BigUint(256), Dictionary.Values.BigInt(64));
211+
const realPrincipals = userSlice.loadDict(Dictionary.Keys.BigUint(256), Dictionary.Values.BigInt(64));
212+
const principalsDict = Dictionary.empty(Dictionary.Keys.BigUint(256), Dictionary.Values.BigInt(64));
212213
const userState = userSlice.loadInt(64);
213214

214215
let trackingSupplyIndex = 0n;
@@ -237,7 +238,7 @@ export function parseUserLiteData(
237238
const assetData = assetsData.get(asset.assetId) as ExtendedAssetData;
238239
const assetConfig = assetsConfig.get(asset.assetId) as AssetConfig;
239240

240-
let principal = principalsDict.get(asset.assetId) || 0n;
241+
let principal = realPrincipals.get(asset.assetId) || 0n;
241242
let balance = presentValue(assetData.sRate, assetData.bRate, principal, masterConstants);
242243

243244
if (applyDust && (principal > 0 && (principal < assetConfig.dust))) {
@@ -247,6 +248,8 @@ export function parseUserLiteData(
247248
type: BalanceType.supply,
248249
};
249250
principalsDict.set(asset.assetId, 0n);
251+
} else {
252+
principalsDict.set(asset.assetId, principal);
250253
}
251254
userBalances.set(asset.assetId, balance);
252255
}
@@ -257,6 +260,7 @@ export function parseUserLiteData(
257260
masterAddress: masterAddress,
258261
ownerAddress: userAddress,
259262
principals: principalsDict,
263+
realPrincipals: realPrincipals,
260264
state: userState,
261265
balances: userBalances,
262266
trackingSupplyIndex: trackingSupplyIndex,

src/constants/general.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ export const NULL_ADDRESS = Address.parse('UQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
2323
export const EVAA_MASTER_MAINNET = Address.parse('EQC8rUZqR_pWV1BylWUlPNBzyiTYVoBEmQkMIQDZXICfnuRr');
2424
export const MAINNET_VERSION = 6;
2525
export const EVAA_MASTER_TESTNET = Address.parse('EQDLsg3w-iBj26Gww7neYoJAxiT2t77Zo8ro56b0yuHsPp3C');
26-
export const TESTNET_VERSION = 0;
26+
export const TESTNET_VERSION = 1;
2727
export const EVAA_LP_MAINNET = Address.parse('EQBIlZX2URWkXCSg3QF2MJZU-wC5XkBoLww-hdWk2G37Jc6N');
2828
export const EVAA_LP_MAINNET_VERSION = 3;
2929
export const EVAA_ALTS_MAINNET = Address.parse('EQANURVS3fhBO9bivig34iyJQi97FhMbpivo1aUEAS2GYSu-');

src/constants/pools.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ export const MAINNET_POOL_CONFIG: PoolConfig = {
1515
STTON_MAINNET,
1616
TSTON_MAINNET,
1717
USDT_MAINNET,
18-
UTON_MAINNET // announce
18+
// UTON_MAINNET // announce
1919
],
2020
lendingCode: LENDING_CODE
2121
};

src/prices/PricesCollector.ts

+9-5
Original file line numberDiff line numberDiff line change
@@ -29,18 +29,18 @@ export class PricesCollector {
2929

3030
// TODO Make UserData class and incapsulate raw bigintegers
3131

32-
async getPricesForLiquidate(userPrincipals: Dictionary<bigint, bigint>, retries: number = 1, timeout: number = 3000): Promise<Prices> {
33-
const assets = userPrincipals.keys().map(x => this.#poolConfig.poolAssetsConfig.find(asset => asset.assetId == x));
32+
async getPricesForLiquidate(realPrincipals: Dictionary<bigint, bigint>, retries: number = 1, timeout: number = 3000): Promise<Prices> {
33+
const assets = this.#filterEmptyPrincipalsAndAssets(realPrincipals);
3434
if (assets.includes(undefined)) {
3535
throw new Error("User from another pool");
3636
}
3737
return await this.getPrices(assets.map(x => x!), retries, timeout);
3838
}
3939

4040

41-
async getPricesForWithdraw(userPrincipals: Dictionary<bigint, bigint>, withdrawAsset: PoolAssetConfig, collateralToDebt = false, retries: number = 1, timeout: number = 3000): Promise<Prices> {
42-
let assets = userPrincipals.keys().map(x => this.#poolConfig.poolAssetsConfig.find(asset => asset.assetId == x));
43-
if (checkNotInDebtAtAll(userPrincipals) && userPrincipals.has(withdrawAsset.assetId) && !collateralToDebt) {
41+
async getPricesForWithdraw(realPrincipals: Dictionary<bigint, bigint>, withdrawAsset: PoolAssetConfig, collateralToDebt = false, retries: number = 1, timeout: number = 3000): Promise<Prices> {
42+
let assets = this.#filterEmptyPrincipalsAndAssets(realPrincipals);
43+
if (checkNotInDebtAtAll(realPrincipals) && (realPrincipals.get(withdrawAsset.assetId) ?? 0n) > 0n && !collateralToDebt) {
4444
return new Prices(Dictionary.empty<bigint, bigint>(), Cell.EMPTY);
4545
}
4646

@@ -132,4 +132,8 @@ export class PricesCollector {
132132
this.#prices = this.#prices.filter(verifyPricesTimestamp());
133133
return this.#prices.length;
134134
}
135+
136+
#filterEmptyPrincipalsAndAssets(principals: Dictionary<bigint, bigint>) {
137+
return principals.keys().filter(x => principals.get(x)! > 0n).map(x => this.#poolConfig.poolAssetsConfig.find(asset => asset.assetId == x));
138+
}
135139
}

src/types/User.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Address, Cell, Dictionary } from '@ton/core';
1+
import { Address, BitBuilder, Cell, Dictionary } from '@ton/core';
22
import { AssetConfig, ExtendedAssetData, ExtendedAssetsConfig, ExtendedAssetsData, MasterConfig, MasterConstants, PoolAssetConfig, PoolConfig } from './Master';
33

44
export enum BalanceType {
@@ -38,6 +38,7 @@ export type UserLiteData = {
3838
masterAddress: Address;
3939
ownerAddress: Address;
4040
principals: Dictionary<bigint, bigint>;
41+
realPrincipals: Dictionary<bigint, bigint>; // principals before applying dusts
4142
state: number;
4243
balances: Dictionary<bigint, UserBalance>;
4344
trackingSupplyIndex: bigint;
@@ -59,7 +60,6 @@ export type UserDataActive = UserLiteData & {
5960
limitUsedPercent: number;
6061
limitUsed: bigint;
6162
healthFactor: number;
62-
6363
liquidationData: LiquidationData;
6464
};
6565

tests/dust_test.ts

+13-10
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {BalanceChangeType, createAssetConfig, Evaa, EVAA_MASTER_MAINNET, getPrices, MAINNET_LP_POOL_CONFIG, MAINNET_POOL_CONFIG, TESTNET_POOL_CONFIG, UserDataActive} from '../src';
1+
import {BalanceChangeType, createAssetConfig, Evaa, EVAA_MASTER_MAINNET, getPrices, MAINNET_LP_POOL_CONFIG, MAINNET_POOL_CONFIG, PricesCollector, TESTNET_POOL_CONFIG, USDT_MAINNET, UserDataActive} from '../src';
22
import {Address, beginCell, Dictionary, TonClient} from '@ton/ton';
33
import dotenv from 'dotenv';
44
import { predictHealthFactor } from '../src/api/math';
@@ -8,30 +8,33 @@ let client: TonClient;
88
beforeAll(async () => {
99
dotenv.config();
1010
client = new TonClient({
11-
endpoint: 'https://testnet.toncenter.com/api/v2/jsonRPC',
12-
apiKey: process.env.RPC_API_KEY,
11+
endpoint: 'https://toncenter.com/api/v2/jsonRPC',
12+
apiKey: process.env.RPC_API_KEY_MAINNET,
1313
});
1414
});
1515

1616
test('Manual dust check', async () => {
17-
const evaa = client.open(new Evaa({poolConfig: TESTNET_POOL_CONFIG}));
17+
const evaa = client.open(new Evaa({poolConfig: MAINNET_POOL_CONFIG}));
1818
await evaa.getSync();
19-
const user = client.open(await evaa.openUserContract(Address.parseFriendly("0QAq-I1fRZcegpp2bDALewjsXfdYRnYqE7KMA8DIi98EQLBd").address));
19+
const user = client.open(await evaa.openUserContract(Address.parseFriendly("UQD0x5tVfMGTgUJpOvn6as58kKJEremAaXq8_rP3rA2bW3D9").address));
2020

21-
const priceData = await evaa.getPrices();
21+
const collector = new PricesCollector(MAINNET_POOL_CONFIG);
2222
//console.log('priceData', priceData);
23-
await user.getSync(evaa.data!.assetsData, evaa.data!.assetsConfig, priceData!.dict);
23+
await user.getSync(evaa.data!.assetsData, evaa.data!.assetsConfig, (await collector.getPrices()).dict, true);
2424

2525
if (user.data?.type != 'active') {
2626
console.log('User is inactive');
2727
return;
2828
}
29-
console.log('User principals')
30-
for (const asset of TESTNET_POOL_CONFIG.poolAssetsConfig) {
29+
console.log('User principals');
30+
console.log('realPrincipals', user.data.realPrincipals);
31+
console.log('userPrincipal', user.data.principals);
32+
console.log('getPricesForWithdraw', (await collector.getPricesForWithdraw(user.data.realPrincipals, USDT_MAINNET)).dict);
33+
/*for (const asset of TESTNET_POOL_CONFIG.poolAssetsConfig) {
3134
if (!user.data.principals.has(asset.assetId)) {
3235
continue;
3336
}
3437
console.log('Asset: ', ' dust ', evaa.data?.assetsConfig.get(asset.assetId)?.dust, ' principal ', user.data.principals.get(asset.assetId),
3538
' Withdrawal limits ', user.data.withdrawalLimits.get(asset.assetId), ' balances ', user.data.balances);
36-
}
39+
}*/
3740
});

0 commit comments

Comments
 (0)