@affluent-org/sdk 0.0.2 → 0.0.4
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/build/Account.compiled.json +1 -0
- package/dist/build/Receipt.compiled.json +1 -0
- package/dist/build/WTONWallet.compiled.json +1 -0
- package/dist/common/cache.d.ts +16 -0
- package/dist/common/cache.js +96 -0
- package/dist/common/service.d.ts +20 -0
- package/dist/common/service.js +69 -0
- package/dist/common/type.d.ts +14 -0
- package/dist/common/type.js +2 -0
- package/dist/common/unknown-contract.d.ts +14 -0
- package/dist/common/unknown-contract.js +18 -0
- package/dist/common/versions.d.ts +14 -0
- package/dist/common/versions.js +22 -0
- package/dist/constants/pool.d.ts +1 -0
- package/dist/constants/pool.js +2 -0
- package/dist/contracts/_mock/simple-oracle.d.ts +34 -0
- package/dist/contracts/_mock/simple-oracle.js +73 -0
- package/dist/contracts/vault/share-vault/type.d.ts +30 -0
- package/dist/contracts/vault/share-vault/type.js +2 -0
- package/dist/contracts/vault/strategy-vault/utils.d.ts +6 -0
- package/dist/contracts/vault/strategy-vault/utils.js +32 -0
- package/dist/factorial.d.ts +14 -0
- package/dist/factorial.js +20 -0
- package/dist/farm.d.ts +92 -0
- package/dist/farm.js +209 -0
- package/dist/monitor.d.ts +57 -0
- package/dist/monitor.js +527 -0
- package/dist/monitorCacheV1.d.ts +52 -0
- package/dist/monitorCacheV1.js +504 -0
- package/dist/oracle/oracle-v2.d.ts +39 -0
- package/dist/oracle/oracle-v2.js +151 -0
- package/dist/oracle/oracle.d.ts +107 -0
- package/dist/oracle/oracle.js +392 -0
- package/dist/periphery.d.ts +259 -0
- package/dist/periphery.js +1087 -0
- package/dist/pool.d.ts +216 -0
- package/dist/pool.js +2298 -0
- package/dist/poolCacheV1.d.ts +139 -0
- package/dist/poolCacheV1.js +1841 -0
- package/dist/rfq-auction.d.ts +75 -0
- package/dist/rfq-auction.js +220 -0
- package/dist/rfq-batch.d.ts +112 -0
- package/dist/rfq-batch.js +284 -0
- package/dist/services/share-vault/computation.d.ts +14 -17
- package/dist/services/share-vault/computation.js +39 -0
- package/dist/services/share-vault/index.d.ts +37 -0
- package/dist/services/share-vault/index.js +12 -3
- package/dist/services/share-vault/query.d.ts +38 -8
- package/dist/services/share-vault/query.js +20 -27
- package/dist/services/share-vault/type.d.ts +19 -0
- package/dist/services/share-vault/type.js +2 -0
- package/dist/services/share-vault/user/index.js +3 -1
- package/dist/services/strategy-vault/computation.d.ts +1 -0
- package/dist/services/strategy-vault/computation.js +15 -0
- package/dist/services/strategy-vault/index.d.ts +139 -0
- package/dist/services/strategy-vault/index.js +9 -0
- package/dist/services/strategy-vault/query.d.ts +147 -0
- package/dist/services/strategy-vault/query.js +72 -0
- package/dist/services/strategy-vault/type.d.ts +2 -0
- package/dist/services/strategy-vault/type.js +2 -0
- package/dist/share-vault.d.ts +91 -0
- package/dist/share-vault.js +747 -0
- package/dist/stonfi.d.ts +18 -0
- package/dist/stonfi.js +76 -0
- package/dist/strategy_vault/base.d.ts +399 -0
- package/dist/strategy_vault/base.js +1199 -0
- package/dist/strategy_vault/index.d.ts +3 -0
- package/dist/strategy_vault/index.js +7 -0
- package/dist/strategy_vault/steps.d.ts +49 -0
- package/dist/strategy_vault/steps.js +170 -0
- package/dist/types/action.d.ts +55 -0
- package/dist/types/action.js +2 -0
- package/dist/types/address.d.ts +7 -0
- package/dist/types/address.js +2 -0
- package/dist/types/messages.d.ts +7 -0
- package/dist/types/messages.js +2 -0
- package/dist/types/params.d.ts +19 -0
- package/dist/types/params.js +2 -0
- package/dist/types/pool.d.ts +83 -0
- package/dist/types/pool.js +2 -0
- package/dist/types/transaction.d.ts +40 -0
- package/dist/types/transaction.js +2 -0
- package/dist/utils/_parse_temp/JumpIRM.d.ts +37 -0
- package/dist/utils/_parse_temp/JumpIRM.js +71 -0
- package/dist/utils/_parse_temp/Pool.d.ts +559 -0
- package/dist/utils/_parse_temp/Pool.js +1023 -0
- package/dist/utils/_parse_temp/ShareVault.d.ts +264 -0
- package/dist/utils/_parse_temp/ShareVault.js +479 -0
- package/dist/utils/_parse_temp/StrategyVault.d.ts +729 -0
- package/dist/utils/_parse_temp/StrategyVault.js +1865 -0
- package/dist/utils/_parse_temp/parseMsgBody.d.ts +13 -0
- package/dist/utils/_parse_temp/parseMsgBody.js +313 -0
- package/dist/utils/assert.d.ts +1 -0
- package/dist/utils/assert.js +9 -0
- package/dist/utils/client-for-parameter.d.ts +12 -0
- package/dist/utils/client-for-parameter.js +97 -0
- package/dist/utils/oracle/index.d.ts +4 -0
- package/dist/utils/oracle/index.js +19 -0
- package/dist/utils/oracle/redstone/helper.d.ts +22 -0
- package/dist/utils/oracle/redstone/helper.js +186 -0
- package/dist/utils/tracer.d.ts +13 -0
- package/dist/utils/tracer.js +137 -0
- package/dist/utils/tracker/index.d.ts +5 -0
- package/dist/utils/tracker/index.js +118 -0
- package/dist/utils/tracker/query-id-generactor.d.ts +2 -0
- package/dist/utils/tracker/query-id-generactor.js +12 -0
- package/dist/utils/tracker/type.d.ts +34 -0
- package/dist/utils/tracker/type.js +2 -0
- package/package.json +1 -1
|
@@ -0,0 +1,504 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MonitorCacheV1 = void 0;
|
|
4
|
+
const ton_1 = require("@ton/ton");
|
|
5
|
+
const pool_1 = require("./contracts/core/pool");
|
|
6
|
+
const type_1 = require("./contracts/oracle/redstone-onchain-oracle/type");
|
|
7
|
+
const account_1 = require("./contracts/core/account");
|
|
8
|
+
const tracker_1 = require("./utils/tracker");
|
|
9
|
+
const parser_1 = require("./utils/parser");
|
|
10
|
+
const redstone_onchain_oracle_1 = require("./contracts/oracle/redstone-onchain-oracle");
|
|
11
|
+
const strategy_vault_1 = require("./contracts/vault/strategy-vault");
|
|
12
|
+
const service_1 = require("./common/service");
|
|
13
|
+
const readonlyCachedRedstone_1 = require("./utils/oracle/redstone/readonlyCachedRedstone");
|
|
14
|
+
const toAddress = (value) => {
|
|
15
|
+
if (value instanceof ton_1.Address) {
|
|
16
|
+
return value;
|
|
17
|
+
}
|
|
18
|
+
return ton_1.Address.parse(value);
|
|
19
|
+
};
|
|
20
|
+
const toString = (value) => {
|
|
21
|
+
if (value instanceof ton_1.Address) {
|
|
22
|
+
return value.toString();
|
|
23
|
+
}
|
|
24
|
+
return value;
|
|
25
|
+
};
|
|
26
|
+
class MonitorCacheV1 extends service_1.ServiceBaseV1 {
|
|
27
|
+
// user -> asset -> wallet
|
|
28
|
+
accountAddresses = {};
|
|
29
|
+
async getAccountAddress(owner, pool) {
|
|
30
|
+
this.accountAddresses[owner] ||= {};
|
|
31
|
+
if (!this.accountAddresses[owner][pool]) {
|
|
32
|
+
const poolContract = this.open(pool_1.Pool.createFromAddress(toAddress(pool)));
|
|
33
|
+
this.accountAddresses[owner][pool] = await poolContract.getAccountAddress(toAddress(owner));
|
|
34
|
+
}
|
|
35
|
+
return this.accountAddresses[owner][pool];
|
|
36
|
+
}
|
|
37
|
+
async findAndCallback(target, step, createdLt, callbackFn) {
|
|
38
|
+
const matchedTx = await (0, tracker_1.findTx)(this.client, toAddress(target), createdLt.toString(), step);
|
|
39
|
+
step.matchedTx = matchedTx;
|
|
40
|
+
if (matchedTx.inMessage?.body) {
|
|
41
|
+
const parsed = (0, parser_1.parseActionNotification)(matchedTx.inMessage.body);
|
|
42
|
+
if (parsed) {
|
|
43
|
+
step.actionNotificationResult = parsed;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
if (callbackFn)
|
|
47
|
+
callbackFn(step);
|
|
48
|
+
return matchedTx;
|
|
49
|
+
}
|
|
50
|
+
async updateOnchainData(onchainDataInfo) {
|
|
51
|
+
for (let [asset, data] of Object.entries(onchainDataInfo)) {
|
|
52
|
+
if (data.sourceType === redstone_onchain_oracle_1.RedstoneOnchainOracle.SourceType.tonstakers &&
|
|
53
|
+
"underlyingAddress" in data) {
|
|
54
|
+
const result = await this.client
|
|
55
|
+
.provider(ton_1.Address.parse(data.sourceAddress.toString()))
|
|
56
|
+
.get("get_pool_state", []);
|
|
57
|
+
result.stack.readBigNumber();
|
|
58
|
+
data.underlyingReserve = result.stack.readBigNumber();
|
|
59
|
+
data.totalSupply = result.stack.readBigNumber();
|
|
60
|
+
}
|
|
61
|
+
else if (data.sourceType === redstone_onchain_oracle_1.RedstoneOnchainOracle.SourceType.dedust &&
|
|
62
|
+
data.assetType === type_1.AssetType.MultiAsset) {
|
|
63
|
+
if (this.network === "mainnet") {
|
|
64
|
+
const results = await Promise.all([
|
|
65
|
+
this.client
|
|
66
|
+
.provider(ton_1.Address.parse(data.sourceAddress.toString()))
|
|
67
|
+
.get("get_reserves", []),
|
|
68
|
+
this.client
|
|
69
|
+
.provider(ton_1.Address.parse(data.sourceAddress.toString()))
|
|
70
|
+
.get("get_jetton_data", []),
|
|
71
|
+
]);
|
|
72
|
+
data.underlying0Reserve = results[0].stack.readBigNumber();
|
|
73
|
+
data.underlying1Reserve = results[0].stack.readBigNumber();
|
|
74
|
+
data.totalSupply = results[1].stack.readBigNumber();
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
const result = await this.client
|
|
78
|
+
.provider(ton_1.Address.parse(data.sourceAddress.toString()))
|
|
79
|
+
.get("get_pool_state", []);
|
|
80
|
+
result.stack.readBigNumber();
|
|
81
|
+
data.underlying0Reserve = result.stack.readBigNumber();
|
|
82
|
+
data.underlying1Reserve = result.stack.readBigNumber();
|
|
83
|
+
data.totalSupply = result.stack.readBigNumber();
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
else if (data.sourceType === redstone_onchain_oracle_1.RedstoneOnchainOracle.SourceType.stonfi &&
|
|
87
|
+
data.assetType === type_1.AssetType.MultiAsset) {
|
|
88
|
+
if (this.network === "mainnet") {
|
|
89
|
+
const result = await this.client
|
|
90
|
+
.provider(ton_1.Address.parse(data.sourceAddress.toString()))
|
|
91
|
+
.get("get_pool_data", []);
|
|
92
|
+
result.stack.readNumber();
|
|
93
|
+
result.stack.readAddress();
|
|
94
|
+
data.totalSupply = result.stack.readBigNumber();
|
|
95
|
+
data.underlying0Reserve = result.stack.readBigNumber();
|
|
96
|
+
data.underlying1Reserve = result.stack.readBigNumber();
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
const result = await this.client
|
|
100
|
+
.provider(ton_1.Address.parse(data.sourceAddress.toString()))
|
|
101
|
+
.get("get_pool_state", []);
|
|
102
|
+
result.stack.readBigNumber();
|
|
103
|
+
data.underlying0Reserve = result.stack.readBigNumber();
|
|
104
|
+
data.underlying1Reserve = result.stack.readBigNumber();
|
|
105
|
+
data.totalSupply = result.stack.readBigNumber();
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
else if (data.sourceType === redstone_onchain_oracle_1.RedstoneOnchainOracle.SourceType.storm &&
|
|
109
|
+
data.assetType === type_1.AssetType.SingleAsset) {
|
|
110
|
+
if (this.network === "mainnet") {
|
|
111
|
+
const results = await this.client
|
|
112
|
+
.provider(ton_1.Address.parse(data.sourceAddress.toString()))
|
|
113
|
+
.get("get_vault_data", []);
|
|
114
|
+
const jettonWalletAddress = results.stack.readAddress();
|
|
115
|
+
const lpRate = results.stack.readBigNumber();
|
|
116
|
+
const lpTotalSupply = results.stack.readBigNumber();
|
|
117
|
+
const freeBalance = results.stack.readBigNumber();
|
|
118
|
+
const lockedBalance = results.stack.readBigNumber();
|
|
119
|
+
const withdrawLockedBalance = results.stack.readBigNumber();
|
|
120
|
+
const stakersBalance = results.stack.readBigNumber();
|
|
121
|
+
const executorsBalance = results.stack.readBigNumber();
|
|
122
|
+
data.underlyingReserve = lpRate;
|
|
123
|
+
if (!data.totalSupply) {
|
|
124
|
+
data.totalSupply = BigInt(1e9);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
else if (data.sourceType === redstone_onchain_oracle_1.RedstoneOnchainOracle.SourceType.tradoor &&
|
|
131
|
+
data.assetType === type_1.AssetType.SingleAsset) {
|
|
132
|
+
if (this.network === "mainnet") {
|
|
133
|
+
const results = await this.client
|
|
134
|
+
.provider(ton_1.Address.parse(data.sourceAddress.toString()))
|
|
135
|
+
.get("tlpPrice", []);
|
|
136
|
+
const lpRate = results.stack.readBigNumber();
|
|
137
|
+
data.underlyingReserve = lpRate;
|
|
138
|
+
if (!data.totalSupply) {
|
|
139
|
+
data.totalSupply = BigInt(18e9);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return onchainDataInfo;
|
|
145
|
+
}
|
|
146
|
+
async getRedstonePrices(assets, poolData) {
|
|
147
|
+
return this.getRedstonePricesNew(assets, poolData.oracleConfig);
|
|
148
|
+
}
|
|
149
|
+
async getRedstonePricesNew(assets, oracleConfig) {
|
|
150
|
+
const result = redstone_onchain_oracle_1.RedstoneOnchainOracle.getOracleRequestParams(assets, oracleConfig);
|
|
151
|
+
const redstonePrices = await readonlyCachedRedstone_1.ReadonlyCachedRedstone.getPrices(result.redstoneAssetNames);
|
|
152
|
+
const prices = {};
|
|
153
|
+
const onchainData = {};
|
|
154
|
+
redstonePrices.forEach((item) => {
|
|
155
|
+
try {
|
|
156
|
+
const redstoneAssetInfo = oracleConfig.redstoneAssetInfo[item.feedId.toString()];
|
|
157
|
+
if (redstoneAssetInfo.assetType === 0) {
|
|
158
|
+
prices[redstoneAssetInfo.address.toString()] = {
|
|
159
|
+
type: type_1.AssetType.Native,
|
|
160
|
+
timestamp: item.timestamp,
|
|
161
|
+
price: (item.price * BigInt(1e8)) / redstoneAssetInfo.precision,
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
else if (redstoneAssetInfo.assetType === 1) {
|
|
165
|
+
onchainData[redstoneAssetInfo.address.toString()] = {
|
|
166
|
+
assetType: type_1.AssetType.SingleAsset,
|
|
167
|
+
underlyingAddress: redstoneAssetInfo.underlyingAddress,
|
|
168
|
+
underlyingReserve: item.price,
|
|
169
|
+
totalSupply: redstoneAssetInfo.precision,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
catch (e) {
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
return { redstonePrices: prices, onchainData };
|
|
177
|
+
}
|
|
178
|
+
calculatePrices(_prices, oracleData) {
|
|
179
|
+
const prices = { ..._prices };
|
|
180
|
+
let oracles = Object.entries(oracleData);
|
|
181
|
+
while (oracles.length !== 0) {
|
|
182
|
+
const restOracles = [];
|
|
183
|
+
for (let [asset, onchainDataInfo] of oracles) {
|
|
184
|
+
if (!onchainDataInfo)
|
|
185
|
+
throw "not found onchain data info1";
|
|
186
|
+
if (onchainDataInfo.assetType === type_1.AssetType.SingleAsset) {
|
|
187
|
+
if (prices[onchainDataInfo.underlyingAddress.toString()]) {
|
|
188
|
+
const underlyingPriceInfo = prices[onchainDataInfo.underlyingAddress.toString()];
|
|
189
|
+
prices[asset.toString()] = {
|
|
190
|
+
type: type_1.AssetType.SingleAsset,
|
|
191
|
+
price: (underlyingPriceInfo.price *
|
|
192
|
+
onchainDataInfo.underlyingReserve) /
|
|
193
|
+
onchainDataInfo.totalSupply,
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
restOracles.push([asset, onchainDataInfo]);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
else if (onchainDataInfo.assetType === type_1.AssetType.MultiAsset) {
|
|
201
|
+
if (prices[onchainDataInfo.underlying0Address.toString()] &&
|
|
202
|
+
prices[onchainDataInfo.underlying1Address.toString()]) {
|
|
203
|
+
const underlying0PriceInfo = prices[onchainDataInfo.underlying0Address.toString()];
|
|
204
|
+
const underlying1PriceInfo = prices[onchainDataInfo.underlying1Address.toString()];
|
|
205
|
+
const price0 = (underlying0PriceInfo.price *
|
|
206
|
+
onchainDataInfo.underlying0Reserve) /
|
|
207
|
+
onchainDataInfo.totalSupply;
|
|
208
|
+
const price1 = (underlying1PriceInfo.price *
|
|
209
|
+
onchainDataInfo.underlying1Reserve) /
|
|
210
|
+
onchainDataInfo.totalSupply;
|
|
211
|
+
prices[asset.toString()] = {
|
|
212
|
+
type: type_1.AssetType.MultiAsset,
|
|
213
|
+
price: price0 + price1,
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
restOracles.push([asset, onchainDataInfo]);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
else if (onchainDataInfo.assetType === type_1.AssetType.Native) {
|
|
221
|
+
}
|
|
222
|
+
else {
|
|
223
|
+
throw `invalid asset type ${onchainDataInfo.assetType}`;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
oracles = restOracles;
|
|
227
|
+
}
|
|
228
|
+
return prices;
|
|
229
|
+
}
|
|
230
|
+
decomposeAccountStatus(accountStatus, prices, onchainData) {
|
|
231
|
+
const accumStatus = {};
|
|
232
|
+
let userAssets = Object.values(accountStatus);
|
|
233
|
+
while (userAssets.length !== 0) {
|
|
234
|
+
const restUserAssets = [];
|
|
235
|
+
for (let i = 0; i < userAssets.length; i++) {
|
|
236
|
+
const state = userAssets[i];
|
|
237
|
+
if (state.supply > 0n || state.borrow > 0n) {
|
|
238
|
+
if (!accumStatus[userAssets[i].address.toString()])
|
|
239
|
+
accumStatus[userAssets[i].address.toString()] = {
|
|
240
|
+
supply: 0n,
|
|
241
|
+
borrow: 0n,
|
|
242
|
+
};
|
|
243
|
+
if (state.supply > 0n) {
|
|
244
|
+
accumStatus[userAssets[i].address.toString()].supply +=
|
|
245
|
+
state.supply;
|
|
246
|
+
}
|
|
247
|
+
if (state.borrow > 0n) {
|
|
248
|
+
accumStatus[userAssets[i].address.toString()].borrow +=
|
|
249
|
+
state.borrow;
|
|
250
|
+
}
|
|
251
|
+
const onchainDataInfo = onchainData[state.address.toString()];
|
|
252
|
+
if (!onchainDataInfo && !prices[state.address.toString()]) {
|
|
253
|
+
throw "not found onchain data info2";
|
|
254
|
+
}
|
|
255
|
+
if (onchainDataInfo) {
|
|
256
|
+
if (onchainDataInfo.assetType === type_1.AssetType.SingleAsset &&
|
|
257
|
+
onchainDataInfo.underlyingReserve &&
|
|
258
|
+
onchainDataInfo.totalSupply) {
|
|
259
|
+
const underlyingSupply = (state.supply * onchainDataInfo.underlyingReserve) /
|
|
260
|
+
onchainDataInfo.totalSupply;
|
|
261
|
+
const underlyingBorrow = (state.borrow * onchainDataInfo.underlyingReserve) /
|
|
262
|
+
onchainDataInfo.totalSupply;
|
|
263
|
+
restUserAssets.push({
|
|
264
|
+
address: onchainDataInfo.underlyingAddress,
|
|
265
|
+
supply: underlyingSupply,
|
|
266
|
+
borrow: underlyingBorrow,
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
else if (onchainDataInfo.assetType === type_1.AssetType.MultiAsset &&
|
|
270
|
+
onchainDataInfo.underlying0Reserve &&
|
|
271
|
+
onchainDataInfo.underlying1Reserve &&
|
|
272
|
+
onchainDataInfo.totalSupply) {
|
|
273
|
+
const underlying0Supply = (state.supply * onchainDataInfo.underlying0Reserve) /
|
|
274
|
+
onchainDataInfo.totalSupply;
|
|
275
|
+
const underlying0Borrow = (state.borrow * onchainDataInfo.underlying0Reserve) /
|
|
276
|
+
onchainDataInfo.totalSupply;
|
|
277
|
+
restUserAssets.push({
|
|
278
|
+
address: onchainDataInfo.underlying0Address,
|
|
279
|
+
supply: underlying0Supply,
|
|
280
|
+
borrow: underlying0Borrow,
|
|
281
|
+
});
|
|
282
|
+
const underlying1Supply = (state.supply * onchainDataInfo.underlying1Reserve) /
|
|
283
|
+
onchainDataInfo.totalSupply;
|
|
284
|
+
const underlying1Borrow = (state.borrow * onchainDataInfo.underlying1Reserve) /
|
|
285
|
+
onchainDataInfo.totalSupply;
|
|
286
|
+
restUserAssets.push({
|
|
287
|
+
address: onchainDataInfo.underlying1Address,
|
|
288
|
+
supply: underlying1Supply,
|
|
289
|
+
borrow: underlying1Borrow,
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
userAssets = restUserAssets;
|
|
296
|
+
}
|
|
297
|
+
return accumStatus;
|
|
298
|
+
}
|
|
299
|
+
calculateRisk(decomposedAccountStatus, prices, poolData) {
|
|
300
|
+
let collateral = 0n;
|
|
301
|
+
let debt = 0n;
|
|
302
|
+
let risk = 0n;
|
|
303
|
+
Object.entries(decomposedAccountStatus).forEach(([asset, status]) => {
|
|
304
|
+
const price = prices[asset];
|
|
305
|
+
const suppliedValue = (BigInt(status.supply) * price.price) / BigInt(1e8);
|
|
306
|
+
const borrowedValue = (BigInt(status.borrow) * price.price) / BigInt(1e8);
|
|
307
|
+
const isCollateral = poolData.assets[asset].isCollateral;
|
|
308
|
+
if (price.type === type_1.AssetType.Native) {
|
|
309
|
+
if (isCollateral) {
|
|
310
|
+
collateral += suppliedValue;
|
|
311
|
+
}
|
|
312
|
+
debt += borrowedValue;
|
|
313
|
+
}
|
|
314
|
+
if (isCollateral) {
|
|
315
|
+
const delta = suppliedValue > borrowedValue
|
|
316
|
+
? suppliedValue - borrowedValue
|
|
317
|
+
: borrowedValue - suppliedValue;
|
|
318
|
+
risk += (delta * poolData.assets[asset].riskFactor) / BigInt(1e4);
|
|
319
|
+
}
|
|
320
|
+
else {
|
|
321
|
+
risk +=
|
|
322
|
+
(borrowedValue * poolData.assets[asset].riskFactor) / BigInt(1e4);
|
|
323
|
+
}
|
|
324
|
+
});
|
|
325
|
+
if (collateral === 0n && debt === 0n) {
|
|
326
|
+
return {
|
|
327
|
+
result: true,
|
|
328
|
+
healthy: true,
|
|
329
|
+
unhealthy: false,
|
|
330
|
+
collateral,
|
|
331
|
+
debt,
|
|
332
|
+
risk,
|
|
333
|
+
riskRatio: 0n,
|
|
334
|
+
leverageRatio: 0n,
|
|
335
|
+
};
|
|
336
|
+
}
|
|
337
|
+
const netValue = collateral - debt;
|
|
338
|
+
if (netValue <= 0n) {
|
|
339
|
+
return {
|
|
340
|
+
result: false,
|
|
341
|
+
healthy: false,
|
|
342
|
+
unhealthy: true,
|
|
343
|
+
collateral,
|
|
344
|
+
debt,
|
|
345
|
+
risk,
|
|
346
|
+
riskRatio: 2n ** 128n - 1n,
|
|
347
|
+
leverageRatio: 2n ** 128n - 1n,
|
|
348
|
+
};
|
|
349
|
+
}
|
|
350
|
+
const leverageRatio = (collateral * BigInt(1e4)) / netValue;
|
|
351
|
+
const riskRatio = (risk * BigInt(1e4)) / netValue;
|
|
352
|
+
const unhealthy = poolData.liquidateLeverageRatio === 0n
|
|
353
|
+
? riskRatio > poolData.liquidateVarRatio
|
|
354
|
+
: leverageRatio > poolData.liquidateLeverageRatio ||
|
|
355
|
+
riskRatio > poolData.liquidateVarRatio;
|
|
356
|
+
return {
|
|
357
|
+
result: !unhealthy,
|
|
358
|
+
healthy: !unhealthy,
|
|
359
|
+
unhealthy: unhealthy,
|
|
360
|
+
collateral,
|
|
361
|
+
debt,
|
|
362
|
+
risk,
|
|
363
|
+
riskRatio,
|
|
364
|
+
leverageRatio,
|
|
365
|
+
};
|
|
366
|
+
}
|
|
367
|
+
async getOracleRequestParams(assets, oracleConfig) {
|
|
368
|
+
return redstone_onchain_oracle_1.RedstoneOnchainOracle.getOracleRequestParams(assets, oracleConfig);
|
|
369
|
+
}
|
|
370
|
+
async isHealthy(poolAddress, ownerAddress) {
|
|
371
|
+
const pool = this.open(pool_1.Pool.createFromAddress(toAddress(poolAddress)));
|
|
372
|
+
const borrowerAccountAddress = await this.getAccountAddress(toString(ownerAddress), toString(poolAddress));
|
|
373
|
+
const borrowerAccount = this.open(account_1.Account.createFromAddress(toAddress(borrowerAccountAddress)));
|
|
374
|
+
const poolData = pool_1.Pool.simulateAccrueInterest(await pool.getPoolData());
|
|
375
|
+
let accountData;
|
|
376
|
+
try {
|
|
377
|
+
accountData = account_1.Account.convertShareToAmount(await borrowerAccount.getAccountData(), poolData);
|
|
378
|
+
}
|
|
379
|
+
catch (e) {
|
|
380
|
+
return {
|
|
381
|
+
result: true,
|
|
382
|
+
healthy: true,
|
|
383
|
+
unhealthy: false,
|
|
384
|
+
collateral: 0n,
|
|
385
|
+
debt: 0n,
|
|
386
|
+
risk: 0n,
|
|
387
|
+
riskRatio: 0n,
|
|
388
|
+
leverageRatio: 0n,
|
|
389
|
+
};
|
|
390
|
+
}
|
|
391
|
+
const assets = account_1.Account.haveAssets(accountData);
|
|
392
|
+
if (assets.length === 0) {
|
|
393
|
+
return {
|
|
394
|
+
result: true,
|
|
395
|
+
healthy: true,
|
|
396
|
+
unhealthy: false,
|
|
397
|
+
collateral: 0n,
|
|
398
|
+
debt: 0n,
|
|
399
|
+
risk: 0n,
|
|
400
|
+
riskRatio: 0n,
|
|
401
|
+
leverageRatio: 0n,
|
|
402
|
+
};
|
|
403
|
+
}
|
|
404
|
+
const result = redstone_onchain_oracle_1.RedstoneOnchainOracle.getOracleRequestParams(assets, poolData.oracleConfig);
|
|
405
|
+
const { redstonePrices, onchainData: od } = await this.getRedstonePrices(assets, poolData);
|
|
406
|
+
const onchainData2 = await this.updateOnchainData(poolData.oracleConfig.assetOnchainDataInfo);
|
|
407
|
+
const onchainData = { ...od, ...onchainData2 };
|
|
408
|
+
Object.keys(onchainData).forEach((key) => {
|
|
409
|
+
if (!result.requestAssets.map((item) => item.toString()).includes(key) &&
|
|
410
|
+
!result.redstoneAssets.map((item) => item.toString()).includes(key)) {
|
|
411
|
+
delete onchainData[key];
|
|
412
|
+
}
|
|
413
|
+
});
|
|
414
|
+
const prices = this.calculatePrices(redstonePrices, onchainData);
|
|
415
|
+
const decomposedAccountStatus = this.decomposeAccountStatus(accountData.status, prices, onchainData);
|
|
416
|
+
return this.calculateRisk(decomposedAccountStatus, prices, poolData);
|
|
417
|
+
}
|
|
418
|
+
async getPricesNew(assets, oracleConfig) {
|
|
419
|
+
const { redstonePrices, onchainData: od } = await this.getRedstonePricesNew(assets, oracleConfig);
|
|
420
|
+
const _onchainData = await this.updateOnchainData(oracleConfig.assetOnchainDataInfo);
|
|
421
|
+
const onchainData = { ...od, ..._onchainData };
|
|
422
|
+
const prices = this.calculatePrices(redstonePrices, onchainData);
|
|
423
|
+
return prices;
|
|
424
|
+
}
|
|
425
|
+
async getAssetPricesInPool(poolAddress) {
|
|
426
|
+
const pool = this.open(pool_1.Pool.createFromAddress(toAddress(poolAddress)));
|
|
427
|
+
const poolData = (await pool.getPoolData());
|
|
428
|
+
const assets = Object.keys(poolData.assets);
|
|
429
|
+
return await this.getPricesNew(assets, poolData.oracleConfig);
|
|
430
|
+
}
|
|
431
|
+
async getAssetPricesInVault(vaultAddress) {
|
|
432
|
+
const vault = this.open(strategy_vault_1.StrategyVault.createFromAddress(toAddress(vaultAddress)));
|
|
433
|
+
const vaultData = (await vault.getVaultData());
|
|
434
|
+
const assets = Object.keys(vaultData.assets);
|
|
435
|
+
return await this.getPricesNew(assets, vaultData.oracleConfig);
|
|
436
|
+
}
|
|
437
|
+
async getPrices(poolAddress) {
|
|
438
|
+
const pool = this.open(pool_1.Pool.createFromAddress(toAddress(poolAddress)));
|
|
439
|
+
const poolData = (await pool.getPoolData());
|
|
440
|
+
const assets = Object.keys(poolData.assets);
|
|
441
|
+
return await this.getPricesNew(assets, poolData.oracleConfig);
|
|
442
|
+
}
|
|
443
|
+
async getPricesAndOnchainData(poolData) {
|
|
444
|
+
const assets = Object.keys(poolData.assets);
|
|
445
|
+
const { redstonePrices, onchainData: od } = await this.getRedstonePrices(assets, poolData);
|
|
446
|
+
const onchainData2 = await this.updateOnchainData(poolData.oracleConfig.assetOnchainDataInfo);
|
|
447
|
+
const onchainData = { ...od, ...onchainData2 };
|
|
448
|
+
const prices = this.calculatePrices(redstonePrices, onchainData);
|
|
449
|
+
return { prices, onchainData };
|
|
450
|
+
}
|
|
451
|
+
async getPoolData(poolAddress) {
|
|
452
|
+
if (!(poolAddress instanceof ton_1.Address)) {
|
|
453
|
+
poolAddress = ton_1.Address.parse(poolAddress);
|
|
454
|
+
}
|
|
455
|
+
const pool = this.open(pool_1.Pool.createFromAddress(poolAddress));
|
|
456
|
+
return await pool.getPoolData();
|
|
457
|
+
}
|
|
458
|
+
async getAccountData(address) {
|
|
459
|
+
const account = this.open(account_1.Account.createFromAddress(toAddress(address)));
|
|
460
|
+
return await account.getAccountData();
|
|
461
|
+
}
|
|
462
|
+
calculateHealth(_poolData, _accountData, prices, onchainData) {
|
|
463
|
+
const poolData = pool_1.Pool.simulateAccrueInterest(_poolData);
|
|
464
|
+
let accountData;
|
|
465
|
+
try {
|
|
466
|
+
accountData = account_1.Account.convertShareToAmount(_accountData, poolData);
|
|
467
|
+
}
|
|
468
|
+
catch (e) {
|
|
469
|
+
return {
|
|
470
|
+
result: true,
|
|
471
|
+
healthy: true,
|
|
472
|
+
unhealthy: false,
|
|
473
|
+
collateral: 0n,
|
|
474
|
+
debt: 0n,
|
|
475
|
+
risk: 0n,
|
|
476
|
+
riskRatio: 0n,
|
|
477
|
+
leverageRatio: 0n,
|
|
478
|
+
};
|
|
479
|
+
}
|
|
480
|
+
const assets = account_1.Account.haveAssets(accountData);
|
|
481
|
+
if (assets.length === 0) {
|
|
482
|
+
return {
|
|
483
|
+
result: true,
|
|
484
|
+
healthy: true,
|
|
485
|
+
unhealthy: false,
|
|
486
|
+
collateral: 0n,
|
|
487
|
+
debt: 0n,
|
|
488
|
+
risk: 0n,
|
|
489
|
+
riskRatio: 0n,
|
|
490
|
+
leverageRatio: 0n,
|
|
491
|
+
};
|
|
492
|
+
}
|
|
493
|
+
const result = redstone_onchain_oracle_1.RedstoneOnchainOracle.getOracleRequestParams(assets, poolData.oracleConfig);
|
|
494
|
+
Object.keys(onchainData).forEach((key) => {
|
|
495
|
+
if (!result.requestAssets.map((item) => item.toString()).includes(key) &&
|
|
496
|
+
!result.redstoneAssets.map((item) => item.toString()).includes(key)) {
|
|
497
|
+
delete onchainData[key];
|
|
498
|
+
}
|
|
499
|
+
});
|
|
500
|
+
const decomposedAccountStatus = this.decomposeAccountStatus(accountData.status, prices, onchainData);
|
|
501
|
+
return this.calculateRisk(decomposedAccountStatus, prices, poolData);
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
exports.MonitorCacheV1 = MonitorCacheV1;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { Address } from "@ton/core";
|
|
2
|
+
import { ServiceBaseV1 } from "../common/service";
|
|
3
|
+
import { AddressInput } from "../contracts/common/type";
|
|
4
|
+
import { StrategyVaultState } from "../contracts/vault/strategy-vault";
|
|
5
|
+
import { PoolState } from "../contracts/core/pool/type";
|
|
6
|
+
import { AccountState } from "../contracts/core/account/type";
|
|
7
|
+
export declare class AddressBucket {
|
|
8
|
+
readonly assets: Set<string>;
|
|
9
|
+
readonly pools: Set<string>;
|
|
10
|
+
readonly vaults: Set<string>;
|
|
11
|
+
constructor(assets?: Set<string>, pools?: Set<string>, vaults?: Set<string>);
|
|
12
|
+
getAssets(): string[];
|
|
13
|
+
getVaultAssets(): string[];
|
|
14
|
+
getPools(): string[];
|
|
15
|
+
add(other: AddressBucket): this;
|
|
16
|
+
array(): {
|
|
17
|
+
assets: string[];
|
|
18
|
+
pools: string[];
|
|
19
|
+
vaults: string[];
|
|
20
|
+
};
|
|
21
|
+
totalSize(): number;
|
|
22
|
+
}
|
|
23
|
+
export declare class OracleLibsV2 extends ServiceBaseV1 {
|
|
24
|
+
getOracleParamsForPoolSupplyAndRepay(poolAddress: AddressInput, assetAddress: AddressInput, poolData?: PoolState, bucket?: AddressBucket): Promise<{
|
|
25
|
+
oracleParams: import("@ton/core").Cell;
|
|
26
|
+
bucket: AddressBucket;
|
|
27
|
+
}>;
|
|
28
|
+
getOracleParamsForPoolBorrowAndWithdraw(poolAddress: AddressInput, actorAddress: AddressInput, assetAddress: AddressInput, poolData?: PoolState, accountData?: AccountState, bucket?: AddressBucket): Promise<{
|
|
29
|
+
oracleParams: import("@ton/core").Cell;
|
|
30
|
+
bucket: AddressBucket;
|
|
31
|
+
}>;
|
|
32
|
+
getOracleParamsForStrategyVault(vaultAddress: AddressInput, vaultData?: StrategyVaultState, bucket?: AddressBucket): Promise<{
|
|
33
|
+
oracleParams: import("@ton/core").Cell;
|
|
34
|
+
bucket: AddressBucket;
|
|
35
|
+
}>;
|
|
36
|
+
makeOracleParams(bucket: AddressBucket, oracleConfig: any): Promise<import("@ton/core").Cell>;
|
|
37
|
+
strategyVaultAddressBucket(vault: Address, bucket?: AddressBucket): Promise<AddressBucket>;
|
|
38
|
+
makeAnyAddressBucket(asset: Address, bucket?: AddressBucket): Promise<AddressBucket>;
|
|
39
|
+
}
|