@affluent-org/sdk 0.0.1
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/.prettierrc +11 -0
- package/Refactoring.md +548 -0
- package/dist/_compiled/Account.compiled.json +1 -0
- package/dist/_compiled/Receipt.compiled.json +1 -0
- package/dist/_compiled/WTONWallet.compiled.json +1 -0
- package/dist/_compiled/index.d.ts +4 -0
- package/dist/_compiled/index.js +12 -0
- package/dist/affluent.d.ts +14 -0
- package/dist/affluent.js +20 -0
- package/dist/constants/constants.d.ts +2 -0
- package/dist/constants/constants.js +5 -0
- package/dist/constants/contracts.d.ts +9 -0
- package/dist/constants/contracts.js +18 -0
- package/dist/context.d.ts +43 -0
- package/dist/context.js +90 -0
- package/dist/contracts/common/type.d.ts +16 -0
- package/dist/contracts/common/type.js +2 -0
- package/dist/contracts/common/utils.d.ts +3 -0
- package/dist/contracts/common/utils.js +16 -0
- package/dist/contracts/core/account/index.d.ts +38 -0
- package/dist/contracts/core/account/index.js +128 -0
- package/dist/contracts/core/account/type.d.ts +18 -0
- package/dist/contracts/core/account/type.js +2 -0
- package/dist/contracts/core/pool/index.d.ts +149 -0
- package/dist/contracts/core/pool/index.js +379 -0
- package/dist/contracts/core/pool/serializer.d.ts +15 -0
- package/dist/contracts/core/pool/serializer.js +307 -0
- package/dist/contracts/core/pool/type.d.ts +136 -0
- package/dist/contracts/core/pool/type.js +2 -0
- package/dist/contracts/dedust-farm/MockDedustFarm.d.ts +41 -0
- package/dist/contracts/dedust-farm/MockDedustFarm.js +79 -0
- package/dist/contracts/external/tonstaker.d.ts +18 -0
- package/dist/contracts/external/tonstaker.js +26 -0
- package/dist/contracts/factory/factory.d.ts +24 -0
- package/dist/contracts/factory/factory.js +58 -0
- package/dist/contracts/factory/type.d.ts +11 -0
- package/dist/contracts/factory/type.js +2 -0
- package/dist/contracts/farm/distributor.d.ts +43 -0
- package/dist/contracts/farm/distributor.js +83 -0
- package/dist/contracts/farm/receipt.d.ts +40 -0
- package/dist/contracts/farm/receipt.js +68 -0
- package/dist/contracts/irm/jump-irm/serializer.d.ts +4 -0
- package/dist/contracts/irm/jump-irm/serializer.js +26 -0
- package/dist/contracts/irm/jump-irm/type.d.ts +8 -0
- package/dist/contracts/irm/jump-irm/type.js +2 -0
- package/dist/contracts/jetton/jetton-minter.d.ts +23 -0
- package/dist/contracts/jetton/jetton-minter.js +46 -0
- package/dist/contracts/jetton/jetton-wallet.d.ts +67 -0
- package/dist/contracts/jetton/jetton-wallet.js +119 -0
- package/dist/contracts/jetton/type.d.ts +7 -0
- package/dist/contracts/jetton/type.js +2 -0
- package/dist/contracts/liquid_token/dedust/minter.d.ts +56 -0
- package/dist/contracts/liquid_token/dedust/minter.js +112 -0
- package/dist/contracts/liquid_token/dedust/wallet.d.ts +127 -0
- package/dist/contracts/liquid_token/dedust/wallet.js +213 -0
- package/dist/contracts/liquid_token/stonfi/LFStonfiJettonMinter.d.ts +53 -0
- package/dist/contracts/liquid_token/stonfi/LFStonfiJettonMinter.js +110 -0
- package/dist/contracts/liquid_token/stonfi/LFStonfiJettonWallet.d.ts +169 -0
- package/dist/contracts/liquid_token/stonfi/LFStonfiJettonWallet.js +288 -0
- package/dist/contracts/oracle/composite-onchain-oracle/index.d.ts +108 -0
- package/dist/contracts/oracle/composite-onchain-oracle/index.js +185 -0
- package/dist/contracts/oracle/parser.d.ts +7 -0
- package/dist/contracts/oracle/parser.js +77 -0
- package/dist/contracts/oracle/redstone-onchain-oracle/index.d.ts +56 -0
- package/dist/contracts/oracle/redstone-onchain-oracle/index.js +159 -0
- package/dist/contracts/oracle/redstone-onchain-oracle/serializer.d.ts +4 -0
- package/dist/contracts/oracle/redstone-onchain-oracle/serializer.js +137 -0
- package/dist/contracts/oracle/redstone-onchain-oracle/type.d.ts +57 -0
- package/dist/contracts/oracle/redstone-onchain-oracle/type.js +18 -0
- package/dist/contracts/oracle/redstone-oracle/serializer.d.ts +3 -0
- package/dist/contracts/oracle/redstone-oracle/serializer.js +30 -0
- package/dist/contracts/oracle/redstone-oracle/type.d.ts +9 -0
- package/dist/contracts/oracle/redstone-oracle/type.js +2 -0
- package/dist/contracts/oracle/redstone-parser.d.ts +9 -0
- package/dist/contracts/oracle/redstone-parser.js +58 -0
- package/dist/contracts/rfq/rfq_auction/index.d.ts +216 -0
- package/dist/contracts/rfq/rfq_auction/index.js +334 -0
- package/dist/contracts/rfq/rfq_batch/index.d.ts +346 -0
- package/dist/contracts/rfq/rfq_batch/index.js +448 -0
- package/dist/contracts/rfq/rfq_event_emitter/index.d.ts +132 -0
- package/dist/contracts/rfq/rfq_event_emitter/index.js +143 -0
- package/dist/contracts/stonfi-farm/MockStonfiFarmItem.d.ts +41 -0
- package/dist/contracts/stonfi-farm/MockStonfiFarmItem.js +83 -0
- package/dist/contracts/stonfi-farm/MockStonfiFarmMinter.d.ts +45 -0
- package/dist/contracts/stonfi-farm/MockStonfiFarmMinter.js +92 -0
- package/dist/contracts/unknown-contract/index.d.ts +14 -0
- package/dist/contracts/unknown-contract/index.js +18 -0
- package/dist/contracts/vault/share-vault/index.d.ts +206 -0
- package/dist/contracts/vault/share-vault/index.js +373 -0
- package/dist/contracts/vault/strategy-vault/codec.d.ts +710 -0
- package/dist/contracts/vault/strategy-vault/codec.js +1256 -0
- package/dist/contracts/vault/strategy-vault/computation.d.ts +11 -0
- package/dist/contracts/vault/strategy-vault/computation.js +56 -0
- package/dist/contracts/vault/strategy-vault/constants.d.ts +163 -0
- package/dist/contracts/vault/strategy-vault/constants.js +170 -0
- package/dist/contracts/vault/strategy-vault/index.d.ts +587 -0
- package/dist/contracts/vault/strategy-vault/index.js +406 -0
- package/dist/contracts/vault/strategy-vault/type.d.ts +115 -0
- package/dist/contracts/vault/strategy-vault/type.js +2 -0
- package/dist/contracts/wton/jetton-minter.d.ts +35 -0
- package/dist/contracts/wton/jetton-minter.js +71 -0
- package/dist/contracts/wton/jetton-wallet.d.ts +90 -0
- package/dist/contracts/wton/jetton-wallet.js +153 -0
- package/dist/contracts/wton/type.d.ts +7 -0
- package/dist/contracts/wton/type.js +2 -0
- package/dist/index.d.ts +34 -0
- package/dist/index.js +65 -0
- package/dist/lib/assert.d.ts +1 -0
- package/dist/lib/assert.js +9 -0
- package/dist/lib/query-cache.d.ts +5 -0
- package/dist/lib/query-cache.js +57 -0
- package/dist/lib/send-msg.d.ts +11 -0
- package/dist/lib/send-msg.js +9 -0
- package/dist/services/composite-oracle/computation.d.ts +55 -0
- package/dist/services/composite-oracle/computation.js +295 -0
- package/dist/services/composite-oracle/index.d.ts +45 -0
- package/dist/services/composite-oracle/index.js +110 -0
- package/dist/services/composite-oracle/query.d.ts +36 -0
- package/dist/services/composite-oracle/query.js +251 -0
- package/dist/services/composite-oracle/types.d.ts +82 -0
- package/dist/services/composite-oracle/types.js +11 -0
- package/dist/services/pool/computation.d.ts +75 -0
- package/dist/services/pool/computation.js +219 -0
- package/dist/services/pool/index.d.ts +94 -0
- package/dist/services/pool/index.js +139 -0
- package/dist/services/pool/oracle.d.ts +20 -0
- package/dist/services/pool/oracle.js +61 -0
- package/dist/services/pool/owner/index.d.ts +37 -0
- package/dist/services/pool/owner/index.js +76 -0
- package/dist/services/pool/owner/types.d.ts +18 -0
- package/dist/services/pool/owner/types.js +2 -0
- package/dist/services/pool/query.d.ts +64 -0
- package/dist/services/pool/query.js +282 -0
- package/dist/services/pool/user/index.d.ts +86 -0
- package/dist/services/pool/user/index.js +285 -0
- package/dist/services/pool/user/types.d.ts +44 -0
- package/dist/services/pool/user/types.js +2 -0
- package/dist/services/rfq-auction/index.d.ts +81 -0
- package/dist/services/rfq-auction/index.js +93 -0
- package/dist/services/rfq-auction/oracle.d.ts +19 -0
- package/dist/services/rfq-auction/oracle.js +60 -0
- package/dist/services/rfq-auction/query.d.ts +50 -0
- package/dist/services/rfq-auction/query.js +19 -0
- package/dist/services/rfq-auction/user/index.d.ts +63 -0
- package/dist/services/rfq-auction/user/index.js +218 -0
- package/dist/services/rfq-auction/user/types.d.ts +29 -0
- package/dist/services/rfq-auction/user/types.js +2 -0
- package/dist/services/rfq-batch/index.d.ts +78 -0
- package/dist/services/rfq-batch/index.js +132 -0
- package/dist/services/rfq-batch/oracle.d.ts +22 -0
- package/dist/services/rfq-batch/oracle.js +54 -0
- package/dist/services/rfq-batch/query.d.ts +46 -0
- package/dist/services/rfq-batch/query.js +34 -0
- package/dist/services/rfq-batch/user/index.d.ts +79 -0
- package/dist/services/rfq-batch/user/index.js +171 -0
- package/dist/services/rfq-batch/user/types.d.ts +37 -0
- package/dist/services/rfq-batch/user/types.js +2 -0
- package/dist/services/share-vault/computation.d.ts +24 -0
- package/dist/services/share-vault/computation.js +42 -0
- package/dist/services/share-vault/index.d.ts +90 -0
- package/dist/services/share-vault/index.js +128 -0
- package/dist/services/share-vault/manager/index.d.ts +40 -0
- package/dist/services/share-vault/manager/index.js +111 -0
- package/dist/services/share-vault/manager/types.d.ts +23 -0
- package/dist/services/share-vault/manager/types.js +2 -0
- package/dist/services/share-vault/owner/index.d.ts +64 -0
- package/dist/services/share-vault/owner/index.js +122 -0
- package/dist/services/share-vault/owner/types.d.ts +33 -0
- package/dist/services/share-vault/owner/types.js +2 -0
- package/dist/services/share-vault/query.d.ts +34 -0
- package/dist/services/share-vault/query.js +138 -0
- package/dist/services/share-vault/user/index.d.ts +33 -0
- package/dist/services/share-vault/user/index.js +106 -0
- package/dist/services/share-vault/user/types.d.ts +13 -0
- package/dist/services/share-vault/user/types.js +2 -0
- package/dist/services/strategy-vault/index.d.ts +2124 -0
- package/dist/services/strategy-vault/index.js +268 -0
- package/dist/services/strategy-vault/manager/index.d.ts +1968 -0
- package/dist/services/strategy-vault/manager/index.js +475 -0
- package/dist/services/strategy-vault/manager/types.d.ts +144 -0
- package/dist/services/strategy-vault/manager/types.js +2 -0
- package/dist/services/strategy-vault/oracle.d.ts +66 -0
- package/dist/services/strategy-vault/oracle.js +162 -0
- package/dist/services/strategy-vault/owner/index.d.ts +277 -0
- package/dist/services/strategy-vault/owner/index.js +333 -0
- package/dist/services/strategy-vault/owner/types.d.ts +146 -0
- package/dist/services/strategy-vault/owner/types.js +2 -0
- package/dist/services/strategy-vault/query.d.ts +138 -0
- package/dist/services/strategy-vault/query.js +59 -0
- package/dist/services/strategy-vault/user/index.d.ts +89 -0
- package/dist/services/strategy-vault/user/index.js +219 -0
- package/dist/services/strategy-vault/user/types.d.ts +46 -0
- package/dist/services/strategy-vault/user/types.js +2 -0
- package/dist/types/sender.d.ts +7 -0
- package/dist/types/sender.js +2 -0
- package/dist/utils/action-parser.d.ts +7 -0
- package/dist/utils/action-parser.js +20 -0
- package/dist/utils/external-message-hash.d.ts +45 -0
- package/dist/utils/external-message-hash.js +65 -0
- package/dist/utils/oracle/redstone/readonlyCachedRedstone.d.ts +3 -0
- package/dist/utils/oracle/redstone/readonlyCachedRedstone.js +25 -0
- package/dist/utils/oracle/redstone/redstoneHelper.d.ts +21 -0
- package/dist/utils/oracle/redstone/redstoneHelper.js +228 -0
- package/dist/utils/parser.d.ts +40 -0
- package/dist/utils/parser.js +580 -0
- package/dist/utils/pending-tracker/index.d.ts +14 -0
- package/dist/utils/pending-tracker/index.js +34 -0
- package/dist/utils/pending-tracker/trackable-sender.d.ts +16 -0
- package/dist/utils/pending-tracker/trackable-sender.js +87 -0
- package/dist/utils/pending-tracker/type.d.ts +78 -0
- package/dist/utils/pending-tracker/type.js +2 -0
- package/dist/utils/pending-tracker/v3-client.d.ts +31 -0
- package/dist/utils/pending-tracker/v3-client.js +104 -0
- package/dist/utils/risk_calculator/risk_calculator.d.ts +45 -0
- package/dist/utils/risk_calculator/risk_calculator.js +332 -0
- package/dist/utils/utils.d.ts +5 -0
- package/dist/utils/utils.js +12 -0
- package/package.json +46 -0
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getPool = getPool;
|
|
4
|
+
exports.getPoolData = getPoolData;
|
|
5
|
+
exports.getAccountAddress = getAccountAddress;
|
|
6
|
+
exports.getAccount = getAccount;
|
|
7
|
+
exports.getAccountData = getAccountData;
|
|
8
|
+
exports.getPricesAndCompositions = getPricesAndCompositions;
|
|
9
|
+
exports.getPrices = getPrices;
|
|
10
|
+
exports.isHealthy = isHealthy;
|
|
11
|
+
exports.calculateMaxBorrowableAmount = calculateMaxBorrowableAmount;
|
|
12
|
+
exports.calculateMaxWithdrawableAmount = calculateMaxWithdrawableAmount;
|
|
13
|
+
const core_1 = require("@ton/core");
|
|
14
|
+
const utils_1 = require("../../contracts/common/utils");
|
|
15
|
+
const pool_1 = require("../../contracts/core/pool");
|
|
16
|
+
const account_1 = require("../../contracts/core/account");
|
|
17
|
+
const query_1 = require("../composite-oracle/query");
|
|
18
|
+
const computation_1 = require("../composite-oracle/computation");
|
|
19
|
+
const risk_calculator_1 = require("../../utils/risk_calculator/risk_calculator");
|
|
20
|
+
const utils_2 = require("../../utils/utils");
|
|
21
|
+
const computation_2 = require("./computation");
|
|
22
|
+
// ============================================================
|
|
23
|
+
// Basic Queries (Data Fetching)
|
|
24
|
+
// ============================================================
|
|
25
|
+
/**
|
|
26
|
+
* Get Pool contract instance
|
|
27
|
+
*/
|
|
28
|
+
function getPool(ctx, poolAddress) {
|
|
29
|
+
return ctx.getByContract(pool_1.Pool, (0, utils_1.toAddress)(poolAddress));
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Get Pool data
|
|
33
|
+
*/
|
|
34
|
+
async function getPoolData(ctx, poolAddress) {
|
|
35
|
+
const pool = getPool(ctx, poolAddress);
|
|
36
|
+
return pool.getPoolData();
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Get Account address for a user in a pool
|
|
40
|
+
*/
|
|
41
|
+
async function getAccountAddress(ctx, poolAddress, userAddress) {
|
|
42
|
+
const pool = getPool(ctx, poolAddress);
|
|
43
|
+
return pool.getAccountAddress((0, utils_1.toAddress)(userAddress));
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Get Account contract instance
|
|
47
|
+
*/
|
|
48
|
+
async function getAccount(ctx, poolAddress, userAddress) {
|
|
49
|
+
const accountAddress = await getAccountAddress(ctx, poolAddress, userAddress);
|
|
50
|
+
return ctx.getByContract(account_1.Account, accountAddress);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Get Account data for a user in a pool
|
|
54
|
+
*/
|
|
55
|
+
async function getAccountData(ctx, poolAddress, userAddress) {
|
|
56
|
+
const pool = getPool(ctx, poolAddress);
|
|
57
|
+
const poolData = await pool.getPoolData();
|
|
58
|
+
const assets = poolData.assets;
|
|
59
|
+
const accountAddress = await pool.getAccountAddress((0, utils_1.toAddress)(userAddress));
|
|
60
|
+
const account = ctx.getByContract(account_1.Account, accountAddress);
|
|
61
|
+
const emptyStatus = Object.keys(assets).reduce((acc, asset) => {
|
|
62
|
+
acc[asset] = {
|
|
63
|
+
address: core_1.Address.parse(asset),
|
|
64
|
+
supply: 0n,
|
|
65
|
+
borrow: 0n,
|
|
66
|
+
};
|
|
67
|
+
return acc;
|
|
68
|
+
}, {});
|
|
69
|
+
try {
|
|
70
|
+
const accountDataFromOnchain = await account.getAccountData();
|
|
71
|
+
return {
|
|
72
|
+
...accountDataFromOnchain,
|
|
73
|
+
status: { ...emptyStatus, ...accountDataFromOnchain.status },
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
return {
|
|
78
|
+
address: (0, utils_1.toAddress)(userAddress),
|
|
79
|
+
pool: (0, utils_1.toAddress)(poolAddress),
|
|
80
|
+
owner: poolData.owner,
|
|
81
|
+
status: emptyStatus,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// ============================================================
|
|
86
|
+
// Price Queries (Fetch + Compute)
|
|
87
|
+
// ============================================================
|
|
88
|
+
/**
|
|
89
|
+
* Get prices and vault compositions for all assets in a pool
|
|
90
|
+
*/
|
|
91
|
+
async function getPricesAndCompositions(ctx, poolAddress) {
|
|
92
|
+
const pool = getPool(ctx, poolAddress);
|
|
93
|
+
const poolData = await pool.getPoolData();
|
|
94
|
+
const oracleConfig = poolData.oracleConfig;
|
|
95
|
+
const allAssets = Object.keys(poolData.assets);
|
|
96
|
+
const { vaultAssets } = (0, computation_1.separateAssets)(allAssets, oracleConfig);
|
|
97
|
+
const fetcher = new query_1.CompositeOracleFetcher(ctx);
|
|
98
|
+
const [{ rawPrices, onchainData: redstoneSyntheticData }, additionalSyntheticData, vaultPositions, poolInfos] = await Promise.all([
|
|
99
|
+
fetcher.fetchRawPrices(allAssets, oracleConfig),
|
|
100
|
+
fetcher.fetchOnchainData(oracleConfig.assetOnchainDataInfo ?? {}),
|
|
101
|
+
fetcher.fetchVaultPositions(vaultAssets.map((v) => core_1.Address.parse(v))),
|
|
102
|
+
fetcher.fetchPoolInfos([]),
|
|
103
|
+
]);
|
|
104
|
+
const result = (0, computation_1.computeCompositePrices)({
|
|
105
|
+
rawPrices,
|
|
106
|
+
syntheticCompositions: { ...redstoneSyntheticData, ...additionalSyntheticData },
|
|
107
|
+
vaultPositions,
|
|
108
|
+
poolInfos,
|
|
109
|
+
});
|
|
110
|
+
const vaultCompositions = Object.fromEntries(Object.entries(result.vaultPrices).map(([k, v]) => [k, v.additionalData]));
|
|
111
|
+
return { prices: result.allPrices, vaultCompositions };
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Get prices for all assets in a pool
|
|
115
|
+
* @deprecated Use getPricesAndCompositions instead
|
|
116
|
+
*/
|
|
117
|
+
async function getPrices(ctx, poolAddress) {
|
|
118
|
+
const { prices } = await getPricesAndCompositions(ctx, poolAddress);
|
|
119
|
+
return prices;
|
|
120
|
+
}
|
|
121
|
+
// ============================================================
|
|
122
|
+
// Health Queries (Fetch + Compute)
|
|
123
|
+
// ============================================================
|
|
124
|
+
/**
|
|
125
|
+
* Check if account is healthy
|
|
126
|
+
* Fetches pool data, account data, and prices, then calculates health
|
|
127
|
+
*/
|
|
128
|
+
async function isHealthy(ctx, poolAddress, ownerAddress, delta) {
|
|
129
|
+
const pool = getPool(ctx, poolAddress);
|
|
130
|
+
const poolData = (0, computation_2.simulateAccrueInterest)(await pool.getPoolData());
|
|
131
|
+
const accountAddress = await pool.getAccountAddress((0, utils_1.toAddress)(ownerAddress));
|
|
132
|
+
const account = ctx.getByContract(account_1.Account, accountAddress);
|
|
133
|
+
let accountData;
|
|
134
|
+
try {
|
|
135
|
+
accountData = (0, computation_2.convertShareToAmount)(await account.getAccountData(), poolData);
|
|
136
|
+
if (delta) {
|
|
137
|
+
accountData = (0, computation_2.applyDelta)(accountData, delta);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
return {
|
|
142
|
+
result: true,
|
|
143
|
+
healthy: true,
|
|
144
|
+
unhealthy: false,
|
|
145
|
+
collateral: 0n,
|
|
146
|
+
debt: 0n,
|
|
147
|
+
risk: 0n,
|
|
148
|
+
riskRatio: 0n,
|
|
149
|
+
leverageRatio: 0n,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
const assets = (0, computation_2.haveAssets)(accountData);
|
|
153
|
+
if (assets.length === 0) {
|
|
154
|
+
return {
|
|
155
|
+
result: true,
|
|
156
|
+
healthy: true,
|
|
157
|
+
unhealthy: false,
|
|
158
|
+
collateral: 0n,
|
|
159
|
+
debt: 0n,
|
|
160
|
+
risk: 0n,
|
|
161
|
+
riskRatio: 0n,
|
|
162
|
+
leverageRatio: 0n,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
const { prices, vaultCompositions } = await getPricesAndCompositions(ctx, poolAddress);
|
|
166
|
+
const oracleConfig = poolData.oracleConfig;
|
|
167
|
+
return (0, computation_2.isHealthyFromData)(poolData, accountData.status, prices, oracleConfig.assetOnchainDataInfo ?? {}, vaultCompositions);
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Calculate maximum borrowable amount for an asset
|
|
171
|
+
*/
|
|
172
|
+
async function calculateMaxBorrowableAmount(ctx, params) {
|
|
173
|
+
const { borrowerAddress, poolAddress, tokenAddress, BUFFER = 100n } = params;
|
|
174
|
+
const pool = getPool(ctx, poolAddress);
|
|
175
|
+
const poolData = (0, computation_2.simulateAccrueInterest)(await pool.getPoolData());
|
|
176
|
+
const accountAddress = await pool.getAccountAddress(borrowerAddress);
|
|
177
|
+
const account = ctx.getByContract(account_1.Account, accountAddress);
|
|
178
|
+
const accountState = (0, computation_2.convertShareToAmount)(await account.getAccountData(), poolData);
|
|
179
|
+
const cash = poolData.assets[tokenAddress].cash;
|
|
180
|
+
const { prices, vaultCompositions } = await getPricesAndCompositions(ctx, poolAddress);
|
|
181
|
+
const oracleConfig = poolData.oracleConfig;
|
|
182
|
+
const syntheticCompositions = oracleConfig.assetOnchainDataInfo ?? {};
|
|
183
|
+
const beforeHealth = (0, computation_2.isHealthyFromData)(poolData, accountState.status, prices, syntheticCompositions, vaultCompositions);
|
|
184
|
+
const riskCalculator = new risk_calculator_1.RiskCalculator(accountState.status, prices, syntheticCompositions, poolData);
|
|
185
|
+
const deltaSolutionsForTargetRatio = riskCalculator.calculateDeltaForTargetRiskRatio(poolData.maxLoanVarRatio - BUFFER, tokenAddress);
|
|
186
|
+
const deltaSolutionForLeverage = riskCalculator.calculateDeltaForTargetLeverage(poolData.maxLoanLeverageRatio - BUFFER, tokenAddress, "borrow");
|
|
187
|
+
const solutionsForTargetRatio = deltaSolutionsForTargetRatio.map((solution) => (0, utils_2.bigIntMin)([solution.delta, 0n]) * -1n);
|
|
188
|
+
const hasAnswer = solutionsForTargetRatio.length > 0;
|
|
189
|
+
const solutionForTargetRatio = hasAnswer ? (0, utils_2.bigIntMin)(solutionsForTargetRatio) : utils_2.MAX256;
|
|
190
|
+
const solutionForLeverage = deltaSolutionForLeverage.delta >= 0n ? deltaSolutionForLeverage.delta : 0n;
|
|
191
|
+
const maxBorrowableAmount = (0, utils_2.bigIntMin)([solutionForTargetRatio, solutionForLeverage, cash]);
|
|
192
|
+
let reason;
|
|
193
|
+
if (maxBorrowableAmount === solutionForTargetRatio) {
|
|
194
|
+
reason = "RISK_RATIO_CONSTRAINT";
|
|
195
|
+
}
|
|
196
|
+
else if (maxBorrowableAmount === solutionForLeverage) {
|
|
197
|
+
reason = "LEVERAGE_CONSTRAINT";
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
reason = "POOL_CASH_CONSTRAINT";
|
|
201
|
+
}
|
|
202
|
+
const accountState2 = (0, computation_2.applyDelta)(accountState, {
|
|
203
|
+
[tokenAddress]: {
|
|
204
|
+
address: core_1.Address.parse(tokenAddress),
|
|
205
|
+
supply: 0n,
|
|
206
|
+
borrow: maxBorrowableAmount,
|
|
207
|
+
},
|
|
208
|
+
});
|
|
209
|
+
const afterHealth = (0, computation_2.isHealthyFromData)(poolData, accountState2.status, prices, syntheticCompositions, vaultCompositions);
|
|
210
|
+
return {
|
|
211
|
+
amount: maxBorrowableAmount,
|
|
212
|
+
reason,
|
|
213
|
+
beforeAccountHealth: beforeHealth,
|
|
214
|
+
afterAccountHealth: afterHealth,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Calculate maximum withdrawable amount for an asset
|
|
219
|
+
*/
|
|
220
|
+
async function calculateMaxWithdrawableAmount(ctx, params) {
|
|
221
|
+
const { withdrawerAddress, poolAddress, tokenAddress, BUFFER = 100n } = params;
|
|
222
|
+
const pool = getPool(ctx, poolAddress);
|
|
223
|
+
const poolData = (0, computation_2.simulateAccrueInterest)(await pool.getPoolData());
|
|
224
|
+
const accountAddress = await pool.getAccountAddress(withdrawerAddress);
|
|
225
|
+
const account = ctx.getByContract(account_1.Account, accountAddress);
|
|
226
|
+
const accountState = (0, computation_2.convertShareToAmount)(await account.getAccountData(), poolData);
|
|
227
|
+
const cash = poolData.assets[tokenAddress]?.cash ?? 0n;
|
|
228
|
+
const hasNoPosition = Object.values(accountState.status).every((value) => value.borrow === 0n && value.supply === 0n);
|
|
229
|
+
if (hasNoPosition) {
|
|
230
|
+
return { amount: 0n, reason: "USER_SUPPLY_CONSTRAINT" };
|
|
231
|
+
}
|
|
232
|
+
const hasNoBorrowedAmount = Object.values(accountState.status).every((value) => value.borrow === 0n);
|
|
233
|
+
if (hasNoBorrowedAmount) {
|
|
234
|
+
const supplyAmount = accountState.status[tokenAddress]?.supply ?? 0n;
|
|
235
|
+
if (supplyAmount > cash) {
|
|
236
|
+
return { amount: cash, reason: "POOL_CASH_CONSTRAINT" };
|
|
237
|
+
}
|
|
238
|
+
else {
|
|
239
|
+
return { amount: supplyAmount, reason: "USER_SUPPLY_CONSTRAINT" };
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
const { prices, vaultCompositions } = await getPricesAndCompositions(ctx, poolAddress);
|
|
243
|
+
const oracleConfig = poolData.oracleConfig;
|
|
244
|
+
const syntheticCompositions = oracleConfig.assetOnchainDataInfo ?? {};
|
|
245
|
+
const beforeHealth = (0, computation_2.isHealthyFromData)(poolData, accountState.status, prices, syntheticCompositions, vaultCompositions);
|
|
246
|
+
const riskCalculator = new risk_calculator_1.RiskCalculator(accountState.status, prices, syntheticCompositions, poolData);
|
|
247
|
+
const deltaSolutionsForTargetRatio = riskCalculator.calculateDeltaForTargetRiskRatio(poolData.maxLoanVarRatio - BUFFER, tokenAddress);
|
|
248
|
+
const deltaSolutionForLeverage = riskCalculator.calculateDeltaForTargetLeverage(poolData.maxLoanLeverageRatio - BUFFER, tokenAddress, "supply");
|
|
249
|
+
const solutionsForTargetRatio = deltaSolutionsForTargetRatio.map((solution) => (0, utils_2.bigIntMin)([solution.delta, 0n]) * -1n);
|
|
250
|
+
const hasTargetRatioAnswer = solutionsForTargetRatio.length > 0;
|
|
251
|
+
const solutionForTargetRatio = hasTargetRatioAnswer ? (0, utils_2.bigIntMin)(solutionsForTargetRatio) : utils_2.MAX256;
|
|
252
|
+
const solutionForLeverage = (0, utils_2.bigIntMin)([deltaSolutionForLeverage.delta, 0n]) * -1n;
|
|
253
|
+
const userSupplyAmount = accountState.status[tokenAddress]?.supply ?? 0n;
|
|
254
|
+
const maxWithdrawableAmount = (0, utils_2.bigIntMin)([userSupplyAmount, solutionForTargetRatio, solutionForLeverage, cash]);
|
|
255
|
+
let reason;
|
|
256
|
+
if (maxWithdrawableAmount === solutionForTargetRatio) {
|
|
257
|
+
reason = "RISK_RATIO_CONSTRAINT";
|
|
258
|
+
}
|
|
259
|
+
else if (maxWithdrawableAmount === solutionForLeverage) {
|
|
260
|
+
reason = "LEVERAGE_CONSTRAINT";
|
|
261
|
+
}
|
|
262
|
+
else if (maxWithdrawableAmount === cash) {
|
|
263
|
+
reason = "POOL_CASH_CONSTRAINT";
|
|
264
|
+
}
|
|
265
|
+
else {
|
|
266
|
+
reason = "USER_SUPPLY_CONSTRAINT";
|
|
267
|
+
}
|
|
268
|
+
const accountState2 = (0, computation_2.applyDelta)(accountState, {
|
|
269
|
+
[tokenAddress]: {
|
|
270
|
+
address: core_1.Address.parse(tokenAddress),
|
|
271
|
+
supply: -maxWithdrawableAmount,
|
|
272
|
+
borrow: 0n,
|
|
273
|
+
},
|
|
274
|
+
});
|
|
275
|
+
const afterHealth = (0, computation_2.isHealthyFromData)(poolData, accountState2.status, prices, syntheticCompositions, vaultCompositions);
|
|
276
|
+
return {
|
|
277
|
+
amount: maxWithdrawableAmount,
|
|
278
|
+
reason,
|
|
279
|
+
beforeAccountHealth: beforeHealth,
|
|
280
|
+
afterAccountHealth: afterHealth,
|
|
281
|
+
};
|
|
282
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { Address, Cell } from "@ton/core";
|
|
2
|
+
import { AffluentContext } from "../../../context";
|
|
3
|
+
import { AddressSender } from "../../../types/sender";
|
|
4
|
+
import { SupplyParams, WithdrawParams, BorrowParams, RepayParams, LiquidateParams } from "./types";
|
|
5
|
+
export * from "./types";
|
|
6
|
+
export declare function createSupplyMsg(ctx: AffluentContext, sender: AddressSender, params: SupplyParams, value?: bigint): Promise<{
|
|
7
|
+
opts: {
|
|
8
|
+
recipient: Address;
|
|
9
|
+
amount: bigint;
|
|
10
|
+
response: Address;
|
|
11
|
+
forwardTonAmount: bigint;
|
|
12
|
+
forwardPayload: Cell;
|
|
13
|
+
queryId: bigint | undefined;
|
|
14
|
+
};
|
|
15
|
+
input: {
|
|
16
|
+
to: Address;
|
|
17
|
+
value: bigint;
|
|
18
|
+
body: Cell;
|
|
19
|
+
};
|
|
20
|
+
}>;
|
|
21
|
+
export declare function createWithdrawMsg(ctx: AffluentContext, sender: AddressSender, params: WithdrawParams, value?: bigint): Promise<{
|
|
22
|
+
opts: {
|
|
23
|
+
asset: Address;
|
|
24
|
+
isShare: boolean;
|
|
25
|
+
amount: bigint;
|
|
26
|
+
recipient: Address;
|
|
27
|
+
response: Address;
|
|
28
|
+
jettonForwardTonAmount: bigint;
|
|
29
|
+
jettonForwardPayload: Cell | null;
|
|
30
|
+
oracleParams: Cell | null;
|
|
31
|
+
queryId: bigint | undefined;
|
|
32
|
+
};
|
|
33
|
+
input: {
|
|
34
|
+
to: Address;
|
|
35
|
+
value: bigint;
|
|
36
|
+
body: Cell;
|
|
37
|
+
};
|
|
38
|
+
}>;
|
|
39
|
+
export declare function createBorrowMsg(ctx: AffluentContext, sender: AddressSender, params: BorrowParams, value?: bigint): Promise<{
|
|
40
|
+
opts: {
|
|
41
|
+
asset: Address;
|
|
42
|
+
isShare: boolean;
|
|
43
|
+
amount: bigint;
|
|
44
|
+
recipient: Address;
|
|
45
|
+
response: Address;
|
|
46
|
+
jettonForwardTonAmount: bigint;
|
|
47
|
+
jettonForwardPayload: Cell | null;
|
|
48
|
+
oracleParams: Cell | null;
|
|
49
|
+
queryId: bigint | undefined;
|
|
50
|
+
};
|
|
51
|
+
input: {
|
|
52
|
+
to: Address;
|
|
53
|
+
value: bigint;
|
|
54
|
+
body: Cell;
|
|
55
|
+
};
|
|
56
|
+
}>;
|
|
57
|
+
export declare function createRepayMsg(ctx: AffluentContext, sender: AddressSender, params: RepayParams, value?: bigint): Promise<{
|
|
58
|
+
opts: {
|
|
59
|
+
recipient: Address;
|
|
60
|
+
amount: bigint;
|
|
61
|
+
response: Address;
|
|
62
|
+
forwardTonAmount: bigint;
|
|
63
|
+
forwardPayload: Cell;
|
|
64
|
+
queryId: bigint | undefined;
|
|
65
|
+
};
|
|
66
|
+
input: {
|
|
67
|
+
to: Address;
|
|
68
|
+
value: bigint;
|
|
69
|
+
body: Cell;
|
|
70
|
+
};
|
|
71
|
+
}>;
|
|
72
|
+
export declare function createLiquidateMsg(ctx: AffluentContext, sender: AddressSender, params: LiquidateParams, value?: bigint): Promise<{
|
|
73
|
+
opts: {
|
|
74
|
+
recipient: Address;
|
|
75
|
+
amount: bigint;
|
|
76
|
+
response: Address;
|
|
77
|
+
forwardTonAmount: bigint;
|
|
78
|
+
forwardPayload: Cell;
|
|
79
|
+
queryId: bigint | undefined;
|
|
80
|
+
};
|
|
81
|
+
input: {
|
|
82
|
+
to: Address;
|
|
83
|
+
value: bigint;
|
|
84
|
+
body: Cell;
|
|
85
|
+
};
|
|
86
|
+
}>;
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.createSupplyMsg = createSupplyMsg;
|
|
18
|
+
exports.createWithdrawMsg = createWithdrawMsg;
|
|
19
|
+
exports.createBorrowMsg = createBorrowMsg;
|
|
20
|
+
exports.createRepayMsg = createRepayMsg;
|
|
21
|
+
exports.createLiquidateMsg = createLiquidateMsg;
|
|
22
|
+
const core_1 = require("@ton/core");
|
|
23
|
+
const utils_1 = require("../../../contracts/common/utils");
|
|
24
|
+
const pool_1 = require("../../../contracts/core/pool");
|
|
25
|
+
const account_1 = require("../../../contracts/core/account");
|
|
26
|
+
const jetton_minter_1 = require("../../../contracts/jetton/jetton-minter");
|
|
27
|
+
const jetton_wallet_1 = require("../../../contracts/jetton/jetton-wallet");
|
|
28
|
+
const jetton_wallet_2 = require("../../../contracts/wton/jetton-wallet");
|
|
29
|
+
const jetton_minter_2 = require("../../../contracts/wton/jetton-minter");
|
|
30
|
+
const oracle_1 = require("../oracle");
|
|
31
|
+
__exportStar(require("./types"), exports);
|
|
32
|
+
// ============================================================
|
|
33
|
+
// Shared Helpers
|
|
34
|
+
// ============================================================
|
|
35
|
+
async function getJettonWalletAddress(ctx, ownerAddress, assetAddress) {
|
|
36
|
+
if (ctx.isWTON(assetAddress)) {
|
|
37
|
+
const poolWalletAddress = await ctx.getByContract(jetton_minter_1.JettonMinter, assetAddress).getWalletAddress(ownerAddress);
|
|
38
|
+
return poolWalletAddress;
|
|
39
|
+
}
|
|
40
|
+
const jettonMinter = ctx.getByContract(jetton_minter_1.JettonMinter, assetAddress);
|
|
41
|
+
return jettonMinter.getWalletAddress(ownerAddress);
|
|
42
|
+
}
|
|
43
|
+
function getWTONParams(ctx, assetAddress) {
|
|
44
|
+
const isWTON = ctx.isWTON(assetAddress);
|
|
45
|
+
return {
|
|
46
|
+
isWTON,
|
|
47
|
+
jettonForwardTonAmount: isWTON ? (0, core_1.toNano)(0.02) : 0n,
|
|
48
|
+
jettonForwardPayload: isWTON ? jetton_minter_2.WTON_UNWRAP_CELL : null,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
// ============================================================
|
|
52
|
+
// Supply
|
|
53
|
+
// ============================================================
|
|
54
|
+
async function createSupplyMsg(ctx, sender, params, value) {
|
|
55
|
+
const poolAddress = (0, utils_1.toAddress)(params.poolAddress);
|
|
56
|
+
const assetAddress = (0, utils_1.toAddress)(params.assetAddress);
|
|
57
|
+
const recipientAddress = params.recipientAddress ? (0, utils_1.toAddress)(params.recipientAddress) : sender.address;
|
|
58
|
+
const pool = ctx.getByContract(pool_1.Pool, poolAddress);
|
|
59
|
+
const poolData = await pool.getPoolData();
|
|
60
|
+
const { isWTON, jettonForwardTonAmount, jettonForwardPayload } = getWTONParams(ctx, assetAddress);
|
|
61
|
+
const gas = pool_1.Pool.calculateGasFee(pool_1.Pool.Op.Supply, pool_1.Pool.Gas.baseFee, pool_1.Pool.Gas.forwardFee, jettonForwardTonAmount, !poolData.oracle, false, poolData.minimumGasFee);
|
|
62
|
+
const forwardPayload = pool_1.Pool.createSupplyPayload({
|
|
63
|
+
asset: assetAddress,
|
|
64
|
+
recipient: recipientAddress,
|
|
65
|
+
response: sender.address,
|
|
66
|
+
jettonForwardTonAmount,
|
|
67
|
+
jettonForwardPayload,
|
|
68
|
+
});
|
|
69
|
+
const opts = {
|
|
70
|
+
recipient: poolAddress,
|
|
71
|
+
amount: params.amount,
|
|
72
|
+
response: sender.address,
|
|
73
|
+
forwardTonAmount: gas,
|
|
74
|
+
forwardPayload,
|
|
75
|
+
queryId: params.queryId,
|
|
76
|
+
};
|
|
77
|
+
if (isWTON) {
|
|
78
|
+
const poolWalletAddress = await getJettonWalletAddress(ctx, poolAddress, assetAddress);
|
|
79
|
+
const poolWTONWallet = ctx.getByContract(jetton_wallet_2.WTONWallet, poolWalletAddress);
|
|
80
|
+
return {
|
|
81
|
+
opts,
|
|
82
|
+
input: {
|
|
83
|
+
to: poolWTONWallet.address,
|
|
84
|
+
value: value ?? jetton_wallet_2.WTONWallet.Gas.ExternalTransfer,
|
|
85
|
+
body: poolWTONWallet.createExternalTransferBody(opts),
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
const senderWalletAddress = await getJettonWalletAddress(ctx, sender.address, assetAddress);
|
|
91
|
+
const senderWallet = ctx.getByContract(jetton_wallet_1.JettonWallet, senderWalletAddress);
|
|
92
|
+
return {
|
|
93
|
+
opts,
|
|
94
|
+
input: {
|
|
95
|
+
to: senderWallet.address,
|
|
96
|
+
value: value ?? gas + jetton_wallet_1.JettonWallet.Gas.Transfer,
|
|
97
|
+
body: senderWallet.createTransferBody(opts),
|
|
98
|
+
},
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// ============================================================
|
|
103
|
+
// Withdraw
|
|
104
|
+
// ============================================================
|
|
105
|
+
async function createWithdrawMsg(ctx, sender, params, value) {
|
|
106
|
+
const poolAddress = (0, utils_1.toAddress)(params.poolAddress);
|
|
107
|
+
const assetAddress = (0, utils_1.toAddress)(params.assetAddress);
|
|
108
|
+
const recipientAddress = params.recipientAddress ? (0, utils_1.toAddress)(params.recipientAddress) : sender.address;
|
|
109
|
+
const pool = ctx.getByContract(pool_1.Pool, poolAddress);
|
|
110
|
+
const poolData = await pool.getPoolData();
|
|
111
|
+
const accountAddress = await pool.getAccountAddress(sender.address);
|
|
112
|
+
const account = ctx.getByContract(account_1.Account, accountAddress);
|
|
113
|
+
const { isWTON, jettonForwardTonAmount, jettonForwardPayload } = getWTONParams(ctx, assetAddress);
|
|
114
|
+
let oracleParams = null;
|
|
115
|
+
try {
|
|
116
|
+
const accountData = await account.getAccountData();
|
|
117
|
+
if (account_1.Account.haveBorrow(accountData)) {
|
|
118
|
+
oracleParams = await (0, oracle_1.getOracleParams)(ctx, poolAddress, sender.address, assetAddress);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
// Account not deployed, no borrow
|
|
123
|
+
}
|
|
124
|
+
const gas = pool_1.Pool.calculateGasFee(pool_1.Pool.Op.Withdraw, pool_1.Pool.Gas.baseFee, pool_1.Pool.Gas.forwardFee, jettonForwardTonAmount, !poolData.oracle, !!oracleParams, poolData.minimumGasFee);
|
|
125
|
+
const opts = {
|
|
126
|
+
asset: assetAddress,
|
|
127
|
+
isShare: params.isShare ?? false,
|
|
128
|
+
amount: params.amount,
|
|
129
|
+
recipient: recipientAddress,
|
|
130
|
+
response: sender.address,
|
|
131
|
+
jettonForwardTonAmount,
|
|
132
|
+
jettonForwardPayload,
|
|
133
|
+
oracleParams,
|
|
134
|
+
queryId: params.queryId,
|
|
135
|
+
};
|
|
136
|
+
return {
|
|
137
|
+
opts,
|
|
138
|
+
input: {
|
|
139
|
+
to: pool.address,
|
|
140
|
+
value: value ?? gas + (0, core_1.toNano)(0.4),
|
|
141
|
+
body: pool_1.Pool.createWithdrawMsgBody(opts),
|
|
142
|
+
},
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
// ============================================================
|
|
146
|
+
// Borrow
|
|
147
|
+
// ============================================================
|
|
148
|
+
async function createBorrowMsg(ctx, sender, params, value) {
|
|
149
|
+
const poolAddress = (0, utils_1.toAddress)(params.poolAddress);
|
|
150
|
+
const assetAddress = (0, utils_1.toAddress)(params.assetAddress);
|
|
151
|
+
const recipientAddress = params.recipientAddress ? (0, utils_1.toAddress)(params.recipientAddress) : sender.address;
|
|
152
|
+
const pool = ctx.getByContract(pool_1.Pool, poolAddress);
|
|
153
|
+
const poolData = await pool.getPoolData();
|
|
154
|
+
const { isWTON, jettonForwardTonAmount, jettonForwardPayload } = getWTONParams(ctx, assetAddress);
|
|
155
|
+
const oracleParams = await (0, oracle_1.getOracleParams)(ctx, poolAddress, sender.address, assetAddress);
|
|
156
|
+
const gas = pool_1.Pool.calculateGasFee(pool_1.Pool.Op.Borrow, pool_1.Pool.Gas.baseFee, pool_1.Pool.Gas.forwardFee, jettonForwardTonAmount, !poolData.oracle, true, poolData.minimumGasFee);
|
|
157
|
+
const opts = {
|
|
158
|
+
asset: assetAddress,
|
|
159
|
+
isShare: params.isShare ?? false,
|
|
160
|
+
amount: params.amount,
|
|
161
|
+
recipient: recipientAddress,
|
|
162
|
+
response: sender.address,
|
|
163
|
+
jettonForwardTonAmount,
|
|
164
|
+
jettonForwardPayload,
|
|
165
|
+
oracleParams,
|
|
166
|
+
queryId: params.queryId,
|
|
167
|
+
};
|
|
168
|
+
return {
|
|
169
|
+
opts,
|
|
170
|
+
input: {
|
|
171
|
+
to: pool.address,
|
|
172
|
+
value: value ?? gas,
|
|
173
|
+
body: pool_1.Pool.createBorrowMsgBody(opts),
|
|
174
|
+
},
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
// ============================================================
|
|
178
|
+
// Repay
|
|
179
|
+
// ============================================================
|
|
180
|
+
async function createRepayMsg(ctx, sender, params, value) {
|
|
181
|
+
const poolAddress = (0, utils_1.toAddress)(params.poolAddress);
|
|
182
|
+
const assetAddress = (0, utils_1.toAddress)(params.assetAddress);
|
|
183
|
+
const recipientAddress = params.recipientAddress ? (0, utils_1.toAddress)(params.recipientAddress) : sender.address;
|
|
184
|
+
const pool = ctx.getByContract(pool_1.Pool, poolAddress);
|
|
185
|
+
const poolData = await pool.getPoolData();
|
|
186
|
+
const { isWTON, jettonForwardTonAmount, jettonForwardPayload } = getWTONParams(ctx, assetAddress);
|
|
187
|
+
const gas = pool_1.Pool.calculateGasFee(pool_1.Pool.Op.Repay, pool_1.Pool.Gas.baseFee, pool_1.Pool.Gas.forwardFee, jettonForwardTonAmount, !poolData.oracle, false, poolData.minimumGasFee);
|
|
188
|
+
const forwardPayload = pool_1.Pool.createRepayPayload({
|
|
189
|
+
asset: assetAddress,
|
|
190
|
+
recipient: recipientAddress,
|
|
191
|
+
response: sender.address,
|
|
192
|
+
jettonForwardTonAmount,
|
|
193
|
+
jettonForwardPayload,
|
|
194
|
+
});
|
|
195
|
+
const opts = {
|
|
196
|
+
recipient: poolAddress,
|
|
197
|
+
amount: params.amount,
|
|
198
|
+
response: sender.address,
|
|
199
|
+
forwardTonAmount: gas,
|
|
200
|
+
forwardPayload,
|
|
201
|
+
queryId: params.queryId,
|
|
202
|
+
};
|
|
203
|
+
if (isWTON) {
|
|
204
|
+
const poolWalletAddress = await getJettonWalletAddress(ctx, poolAddress, assetAddress);
|
|
205
|
+
const poolWTONWallet = ctx.getByContract(jetton_wallet_2.WTONWallet, poolWalletAddress);
|
|
206
|
+
return {
|
|
207
|
+
opts,
|
|
208
|
+
input: {
|
|
209
|
+
to: poolWTONWallet.address,
|
|
210
|
+
value: value ?? jetton_wallet_2.WTONWallet.Gas.ExternalTransfer,
|
|
211
|
+
body: poolWTONWallet.createExternalTransferBody(opts),
|
|
212
|
+
},
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
const senderWalletAddress = await getJettonWalletAddress(ctx, sender.address, assetAddress);
|
|
217
|
+
const senderWallet = ctx.getByContract(jetton_wallet_1.JettonWallet, senderWalletAddress);
|
|
218
|
+
return {
|
|
219
|
+
opts,
|
|
220
|
+
input: {
|
|
221
|
+
to: senderWallet.address,
|
|
222
|
+
value: value ?? gas + jetton_wallet_1.JettonWallet.Gas.Transfer,
|
|
223
|
+
body: senderWallet.createTransferBody(opts),
|
|
224
|
+
},
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
// ============================================================
|
|
229
|
+
// Liquidate
|
|
230
|
+
// ============================================================
|
|
231
|
+
async function createLiquidateMsg(ctx, sender, params, value) {
|
|
232
|
+
const poolAddress = (0, utils_1.toAddress)(params.poolAddress);
|
|
233
|
+
const repayAssetAddress = (0, utils_1.toAddress)(params.repayAssetAddress);
|
|
234
|
+
const seizeAssetAddress = (0, utils_1.toAddress)(params.seizeAssetAddress);
|
|
235
|
+
const borrowerAddress = (0, utils_1.toAddress)(params.borrowerAddress);
|
|
236
|
+
const pool = ctx.getByContract(pool_1.Pool, poolAddress);
|
|
237
|
+
const poolData = await pool.getPoolData();
|
|
238
|
+
const { isWTON, jettonForwardTonAmount, jettonForwardPayload } = getWTONParams(ctx, repayAssetAddress);
|
|
239
|
+
const oracleParams = await (0, oracle_1.getOracleParams)(ctx, poolAddress, borrowerAddress, repayAssetAddress);
|
|
240
|
+
if (!oracleParams) {
|
|
241
|
+
throw new Error("Failed to get oracle params for liquidation - borrower has no positions");
|
|
242
|
+
}
|
|
243
|
+
const gas = pool_1.Pool.calculateGasFee(pool_1.Pool.Op.Liquidate, pool_1.Pool.Gas.baseFee, pool_1.Pool.Gas.forwardFee, jettonForwardTonAmount, !poolData.oracle, false, poolData.minimumGasFee);
|
|
244
|
+
const forwardPayload = pool_1.Pool.createLiquidatePayload({
|
|
245
|
+
repayAsset: repayAssetAddress,
|
|
246
|
+
seizeAsset: seizeAssetAddress,
|
|
247
|
+
borrower: borrowerAddress,
|
|
248
|
+
response: sender.address,
|
|
249
|
+
jettonForwardTonAmount,
|
|
250
|
+
jettonForwardPayload,
|
|
251
|
+
oracleParams,
|
|
252
|
+
});
|
|
253
|
+
const opts = {
|
|
254
|
+
recipient: poolAddress,
|
|
255
|
+
amount: params.amount,
|
|
256
|
+
response: sender.address,
|
|
257
|
+
forwardTonAmount: gas,
|
|
258
|
+
forwardPayload,
|
|
259
|
+
queryId: params.queryId,
|
|
260
|
+
};
|
|
261
|
+
if (isWTON) {
|
|
262
|
+
const poolWalletAddress = await getJettonWalletAddress(ctx, poolAddress, repayAssetAddress);
|
|
263
|
+
const poolWTONWallet = ctx.getByContract(jetton_wallet_2.WTONWallet, poolWalletAddress);
|
|
264
|
+
return {
|
|
265
|
+
opts,
|
|
266
|
+
input: {
|
|
267
|
+
to: poolWTONWallet.address,
|
|
268
|
+
value: value ?? jetton_wallet_2.WTONWallet.Gas.ExternalTransfer,
|
|
269
|
+
body: poolWTONWallet.createExternalTransferBody(opts),
|
|
270
|
+
},
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
else {
|
|
274
|
+
const senderWalletAddress = await getJettonWalletAddress(ctx, sender.address, repayAssetAddress);
|
|
275
|
+
const senderWallet = ctx.getByContract(jetton_wallet_1.JettonWallet, senderWalletAddress);
|
|
276
|
+
return {
|
|
277
|
+
opts,
|
|
278
|
+
input: {
|
|
279
|
+
to: senderWallet.address,
|
|
280
|
+
value: value ?? gas + jetton_wallet_1.JettonWallet.Gas.Transfer,
|
|
281
|
+
body: senderWallet.createTransferBody(opts),
|
|
282
|
+
},
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
}
|