@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.
Files changed (218) hide show
  1. package/.prettierrc +11 -0
  2. package/Refactoring.md +548 -0
  3. package/dist/_compiled/Account.compiled.json +1 -0
  4. package/dist/_compiled/Receipt.compiled.json +1 -0
  5. package/dist/_compiled/WTONWallet.compiled.json +1 -0
  6. package/dist/_compiled/index.d.ts +4 -0
  7. package/dist/_compiled/index.js +12 -0
  8. package/dist/affluent.d.ts +14 -0
  9. package/dist/affluent.js +20 -0
  10. package/dist/constants/constants.d.ts +2 -0
  11. package/dist/constants/constants.js +5 -0
  12. package/dist/constants/contracts.d.ts +9 -0
  13. package/dist/constants/contracts.js +18 -0
  14. package/dist/context.d.ts +43 -0
  15. package/dist/context.js +90 -0
  16. package/dist/contracts/common/type.d.ts +16 -0
  17. package/dist/contracts/common/type.js +2 -0
  18. package/dist/contracts/common/utils.d.ts +3 -0
  19. package/dist/contracts/common/utils.js +16 -0
  20. package/dist/contracts/core/account/index.d.ts +38 -0
  21. package/dist/contracts/core/account/index.js +128 -0
  22. package/dist/contracts/core/account/type.d.ts +18 -0
  23. package/dist/contracts/core/account/type.js +2 -0
  24. package/dist/contracts/core/pool/index.d.ts +149 -0
  25. package/dist/contracts/core/pool/index.js +379 -0
  26. package/dist/contracts/core/pool/serializer.d.ts +15 -0
  27. package/dist/contracts/core/pool/serializer.js +307 -0
  28. package/dist/contracts/core/pool/type.d.ts +136 -0
  29. package/dist/contracts/core/pool/type.js +2 -0
  30. package/dist/contracts/dedust-farm/MockDedustFarm.d.ts +41 -0
  31. package/dist/contracts/dedust-farm/MockDedustFarm.js +79 -0
  32. package/dist/contracts/external/tonstaker.d.ts +18 -0
  33. package/dist/contracts/external/tonstaker.js +26 -0
  34. package/dist/contracts/factory/factory.d.ts +24 -0
  35. package/dist/contracts/factory/factory.js +58 -0
  36. package/dist/contracts/factory/type.d.ts +11 -0
  37. package/dist/contracts/factory/type.js +2 -0
  38. package/dist/contracts/farm/distributor.d.ts +43 -0
  39. package/dist/contracts/farm/distributor.js +83 -0
  40. package/dist/contracts/farm/receipt.d.ts +40 -0
  41. package/dist/contracts/farm/receipt.js +68 -0
  42. package/dist/contracts/irm/jump-irm/serializer.d.ts +4 -0
  43. package/dist/contracts/irm/jump-irm/serializer.js +26 -0
  44. package/dist/contracts/irm/jump-irm/type.d.ts +8 -0
  45. package/dist/contracts/irm/jump-irm/type.js +2 -0
  46. package/dist/contracts/jetton/jetton-minter.d.ts +23 -0
  47. package/dist/contracts/jetton/jetton-minter.js +46 -0
  48. package/dist/contracts/jetton/jetton-wallet.d.ts +67 -0
  49. package/dist/contracts/jetton/jetton-wallet.js +119 -0
  50. package/dist/contracts/jetton/type.d.ts +7 -0
  51. package/dist/contracts/jetton/type.js +2 -0
  52. package/dist/contracts/liquid_token/dedust/minter.d.ts +56 -0
  53. package/dist/contracts/liquid_token/dedust/minter.js +112 -0
  54. package/dist/contracts/liquid_token/dedust/wallet.d.ts +127 -0
  55. package/dist/contracts/liquid_token/dedust/wallet.js +213 -0
  56. package/dist/contracts/liquid_token/stonfi/LFStonfiJettonMinter.d.ts +53 -0
  57. package/dist/contracts/liquid_token/stonfi/LFStonfiJettonMinter.js +110 -0
  58. package/dist/contracts/liquid_token/stonfi/LFStonfiJettonWallet.d.ts +169 -0
  59. package/dist/contracts/liquid_token/stonfi/LFStonfiJettonWallet.js +288 -0
  60. package/dist/contracts/oracle/composite-onchain-oracle/index.d.ts +108 -0
  61. package/dist/contracts/oracle/composite-onchain-oracle/index.js +185 -0
  62. package/dist/contracts/oracle/parser.d.ts +7 -0
  63. package/dist/contracts/oracle/parser.js +77 -0
  64. package/dist/contracts/oracle/redstone-onchain-oracle/index.d.ts +56 -0
  65. package/dist/contracts/oracle/redstone-onchain-oracle/index.js +159 -0
  66. package/dist/contracts/oracle/redstone-onchain-oracle/serializer.d.ts +4 -0
  67. package/dist/contracts/oracle/redstone-onchain-oracle/serializer.js +137 -0
  68. package/dist/contracts/oracle/redstone-onchain-oracle/type.d.ts +57 -0
  69. package/dist/contracts/oracle/redstone-onchain-oracle/type.js +18 -0
  70. package/dist/contracts/oracle/redstone-oracle/serializer.d.ts +3 -0
  71. package/dist/contracts/oracle/redstone-oracle/serializer.js +30 -0
  72. package/dist/contracts/oracle/redstone-oracle/type.d.ts +9 -0
  73. package/dist/contracts/oracle/redstone-oracle/type.js +2 -0
  74. package/dist/contracts/oracle/redstone-parser.d.ts +9 -0
  75. package/dist/contracts/oracle/redstone-parser.js +58 -0
  76. package/dist/contracts/rfq/rfq_auction/index.d.ts +216 -0
  77. package/dist/contracts/rfq/rfq_auction/index.js +334 -0
  78. package/dist/contracts/rfq/rfq_batch/index.d.ts +346 -0
  79. package/dist/contracts/rfq/rfq_batch/index.js +448 -0
  80. package/dist/contracts/rfq/rfq_event_emitter/index.d.ts +132 -0
  81. package/dist/contracts/rfq/rfq_event_emitter/index.js +143 -0
  82. package/dist/contracts/stonfi-farm/MockStonfiFarmItem.d.ts +41 -0
  83. package/dist/contracts/stonfi-farm/MockStonfiFarmItem.js +83 -0
  84. package/dist/contracts/stonfi-farm/MockStonfiFarmMinter.d.ts +45 -0
  85. package/dist/contracts/stonfi-farm/MockStonfiFarmMinter.js +92 -0
  86. package/dist/contracts/unknown-contract/index.d.ts +14 -0
  87. package/dist/contracts/unknown-contract/index.js +18 -0
  88. package/dist/contracts/vault/share-vault/index.d.ts +206 -0
  89. package/dist/contracts/vault/share-vault/index.js +373 -0
  90. package/dist/contracts/vault/strategy-vault/codec.d.ts +710 -0
  91. package/dist/contracts/vault/strategy-vault/codec.js +1256 -0
  92. package/dist/contracts/vault/strategy-vault/computation.d.ts +11 -0
  93. package/dist/contracts/vault/strategy-vault/computation.js +56 -0
  94. package/dist/contracts/vault/strategy-vault/constants.d.ts +163 -0
  95. package/dist/contracts/vault/strategy-vault/constants.js +170 -0
  96. package/dist/contracts/vault/strategy-vault/index.d.ts +587 -0
  97. package/dist/contracts/vault/strategy-vault/index.js +406 -0
  98. package/dist/contracts/vault/strategy-vault/type.d.ts +115 -0
  99. package/dist/contracts/vault/strategy-vault/type.js +2 -0
  100. package/dist/contracts/wton/jetton-minter.d.ts +35 -0
  101. package/dist/contracts/wton/jetton-minter.js +71 -0
  102. package/dist/contracts/wton/jetton-wallet.d.ts +90 -0
  103. package/dist/contracts/wton/jetton-wallet.js +153 -0
  104. package/dist/contracts/wton/type.d.ts +7 -0
  105. package/dist/contracts/wton/type.js +2 -0
  106. package/dist/index.d.ts +34 -0
  107. package/dist/index.js +65 -0
  108. package/dist/lib/assert.d.ts +1 -0
  109. package/dist/lib/assert.js +9 -0
  110. package/dist/lib/query-cache.d.ts +5 -0
  111. package/dist/lib/query-cache.js +57 -0
  112. package/dist/lib/send-msg.d.ts +11 -0
  113. package/dist/lib/send-msg.js +9 -0
  114. package/dist/services/composite-oracle/computation.d.ts +55 -0
  115. package/dist/services/composite-oracle/computation.js +295 -0
  116. package/dist/services/composite-oracle/index.d.ts +45 -0
  117. package/dist/services/composite-oracle/index.js +110 -0
  118. package/dist/services/composite-oracle/query.d.ts +36 -0
  119. package/dist/services/composite-oracle/query.js +251 -0
  120. package/dist/services/composite-oracle/types.d.ts +82 -0
  121. package/dist/services/composite-oracle/types.js +11 -0
  122. package/dist/services/pool/computation.d.ts +75 -0
  123. package/dist/services/pool/computation.js +219 -0
  124. package/dist/services/pool/index.d.ts +94 -0
  125. package/dist/services/pool/index.js +139 -0
  126. package/dist/services/pool/oracle.d.ts +20 -0
  127. package/dist/services/pool/oracle.js +61 -0
  128. package/dist/services/pool/owner/index.d.ts +37 -0
  129. package/dist/services/pool/owner/index.js +76 -0
  130. package/dist/services/pool/owner/types.d.ts +18 -0
  131. package/dist/services/pool/owner/types.js +2 -0
  132. package/dist/services/pool/query.d.ts +64 -0
  133. package/dist/services/pool/query.js +282 -0
  134. package/dist/services/pool/user/index.d.ts +86 -0
  135. package/dist/services/pool/user/index.js +285 -0
  136. package/dist/services/pool/user/types.d.ts +44 -0
  137. package/dist/services/pool/user/types.js +2 -0
  138. package/dist/services/rfq-auction/index.d.ts +81 -0
  139. package/dist/services/rfq-auction/index.js +93 -0
  140. package/dist/services/rfq-auction/oracle.d.ts +19 -0
  141. package/dist/services/rfq-auction/oracle.js +60 -0
  142. package/dist/services/rfq-auction/query.d.ts +50 -0
  143. package/dist/services/rfq-auction/query.js +19 -0
  144. package/dist/services/rfq-auction/user/index.d.ts +63 -0
  145. package/dist/services/rfq-auction/user/index.js +218 -0
  146. package/dist/services/rfq-auction/user/types.d.ts +29 -0
  147. package/dist/services/rfq-auction/user/types.js +2 -0
  148. package/dist/services/rfq-batch/index.d.ts +78 -0
  149. package/dist/services/rfq-batch/index.js +132 -0
  150. package/dist/services/rfq-batch/oracle.d.ts +22 -0
  151. package/dist/services/rfq-batch/oracle.js +54 -0
  152. package/dist/services/rfq-batch/query.d.ts +46 -0
  153. package/dist/services/rfq-batch/query.js +34 -0
  154. package/dist/services/rfq-batch/user/index.d.ts +79 -0
  155. package/dist/services/rfq-batch/user/index.js +171 -0
  156. package/dist/services/rfq-batch/user/types.d.ts +37 -0
  157. package/dist/services/rfq-batch/user/types.js +2 -0
  158. package/dist/services/share-vault/computation.d.ts +24 -0
  159. package/dist/services/share-vault/computation.js +42 -0
  160. package/dist/services/share-vault/index.d.ts +90 -0
  161. package/dist/services/share-vault/index.js +128 -0
  162. package/dist/services/share-vault/manager/index.d.ts +40 -0
  163. package/dist/services/share-vault/manager/index.js +111 -0
  164. package/dist/services/share-vault/manager/types.d.ts +23 -0
  165. package/dist/services/share-vault/manager/types.js +2 -0
  166. package/dist/services/share-vault/owner/index.d.ts +64 -0
  167. package/dist/services/share-vault/owner/index.js +122 -0
  168. package/dist/services/share-vault/owner/types.d.ts +33 -0
  169. package/dist/services/share-vault/owner/types.js +2 -0
  170. package/dist/services/share-vault/query.d.ts +34 -0
  171. package/dist/services/share-vault/query.js +138 -0
  172. package/dist/services/share-vault/user/index.d.ts +33 -0
  173. package/dist/services/share-vault/user/index.js +106 -0
  174. package/dist/services/share-vault/user/types.d.ts +13 -0
  175. package/dist/services/share-vault/user/types.js +2 -0
  176. package/dist/services/strategy-vault/index.d.ts +2124 -0
  177. package/dist/services/strategy-vault/index.js +268 -0
  178. package/dist/services/strategy-vault/manager/index.d.ts +1968 -0
  179. package/dist/services/strategy-vault/manager/index.js +475 -0
  180. package/dist/services/strategy-vault/manager/types.d.ts +144 -0
  181. package/dist/services/strategy-vault/manager/types.js +2 -0
  182. package/dist/services/strategy-vault/oracle.d.ts +66 -0
  183. package/dist/services/strategy-vault/oracle.js +162 -0
  184. package/dist/services/strategy-vault/owner/index.d.ts +277 -0
  185. package/dist/services/strategy-vault/owner/index.js +333 -0
  186. package/dist/services/strategy-vault/owner/types.d.ts +146 -0
  187. package/dist/services/strategy-vault/owner/types.js +2 -0
  188. package/dist/services/strategy-vault/query.d.ts +138 -0
  189. package/dist/services/strategy-vault/query.js +59 -0
  190. package/dist/services/strategy-vault/user/index.d.ts +89 -0
  191. package/dist/services/strategy-vault/user/index.js +219 -0
  192. package/dist/services/strategy-vault/user/types.d.ts +46 -0
  193. package/dist/services/strategy-vault/user/types.js +2 -0
  194. package/dist/types/sender.d.ts +7 -0
  195. package/dist/types/sender.js +2 -0
  196. package/dist/utils/action-parser.d.ts +7 -0
  197. package/dist/utils/action-parser.js +20 -0
  198. package/dist/utils/external-message-hash.d.ts +45 -0
  199. package/dist/utils/external-message-hash.js +65 -0
  200. package/dist/utils/oracle/redstone/readonlyCachedRedstone.d.ts +3 -0
  201. package/dist/utils/oracle/redstone/readonlyCachedRedstone.js +25 -0
  202. package/dist/utils/oracle/redstone/redstoneHelper.d.ts +21 -0
  203. package/dist/utils/oracle/redstone/redstoneHelper.js +228 -0
  204. package/dist/utils/parser.d.ts +40 -0
  205. package/dist/utils/parser.js +580 -0
  206. package/dist/utils/pending-tracker/index.d.ts +14 -0
  207. package/dist/utils/pending-tracker/index.js +34 -0
  208. package/dist/utils/pending-tracker/trackable-sender.d.ts +16 -0
  209. package/dist/utils/pending-tracker/trackable-sender.js +87 -0
  210. package/dist/utils/pending-tracker/type.d.ts +78 -0
  211. package/dist/utils/pending-tracker/type.js +2 -0
  212. package/dist/utils/pending-tracker/v3-client.d.ts +31 -0
  213. package/dist/utils/pending-tracker/v3-client.js +104 -0
  214. package/dist/utils/risk_calculator/risk_calculator.d.ts +45 -0
  215. package/dist/utils/risk_calculator/risk_calculator.js +332 -0
  216. package/dist/utils/utils.d.ts +5 -0
  217. package/dist/utils/utils.js +12 -0
  218. 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
+ }