@affluent-org/sdk 0.0.2 → 0.0.3

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 (104) hide show
  1. package/dist/build/Account.compiled.json +1 -0
  2. package/dist/build/Receipt.compiled.json +1 -0
  3. package/dist/build/WTONWallet.compiled.json +1 -0
  4. package/dist/common/cache.d.ts +16 -0
  5. package/dist/common/cache.js +96 -0
  6. package/dist/common/service.d.ts +20 -0
  7. package/dist/common/service.js +69 -0
  8. package/dist/common/type.d.ts +14 -0
  9. package/dist/common/type.js +2 -0
  10. package/dist/common/unknown-contract.d.ts +14 -0
  11. package/dist/common/unknown-contract.js +18 -0
  12. package/dist/common/versions.d.ts +14 -0
  13. package/dist/common/versions.js +22 -0
  14. package/dist/constants/pool.d.ts +1 -0
  15. package/dist/constants/pool.js +2 -0
  16. package/dist/contracts/_mock/simple-oracle.d.ts +34 -0
  17. package/dist/contracts/_mock/simple-oracle.js +73 -0
  18. package/dist/contracts/vault/share-vault/type.d.ts +30 -0
  19. package/dist/contracts/vault/share-vault/type.js +2 -0
  20. package/dist/contracts/vault/strategy-vault/utils.d.ts +6 -0
  21. package/dist/contracts/vault/strategy-vault/utils.js +32 -0
  22. package/dist/factorial.d.ts +14 -0
  23. package/dist/factorial.js +20 -0
  24. package/dist/farm.d.ts +92 -0
  25. package/dist/farm.js +209 -0
  26. package/dist/monitor.d.ts +57 -0
  27. package/dist/monitor.js +527 -0
  28. package/dist/monitorCacheV1.d.ts +52 -0
  29. package/dist/monitorCacheV1.js +504 -0
  30. package/dist/oracle/oracle-v2.d.ts +39 -0
  31. package/dist/oracle/oracle-v2.js +151 -0
  32. package/dist/oracle/oracle.d.ts +107 -0
  33. package/dist/oracle/oracle.js +392 -0
  34. package/dist/periphery.d.ts +259 -0
  35. package/dist/periphery.js +1087 -0
  36. package/dist/pool.d.ts +216 -0
  37. package/dist/pool.js +2298 -0
  38. package/dist/poolCacheV1.d.ts +139 -0
  39. package/dist/poolCacheV1.js +1841 -0
  40. package/dist/rfq-auction.d.ts +75 -0
  41. package/dist/rfq-auction.js +220 -0
  42. package/dist/rfq-batch.d.ts +112 -0
  43. package/dist/rfq-batch.js +284 -0
  44. package/dist/services/share-vault/computation.d.ts +14 -17
  45. package/dist/services/share-vault/computation.js +39 -0
  46. package/dist/services/share-vault/index.js +6 -3
  47. package/dist/services/share-vault/query.d.ts +38 -8
  48. package/dist/services/share-vault/query.js +20 -27
  49. package/dist/services/share-vault/type.d.ts +19 -0
  50. package/dist/services/share-vault/type.js +2 -0
  51. package/dist/services/share-vault/user/index.js +3 -1
  52. package/dist/services/strategy-vault/computation.d.ts +1 -0
  53. package/dist/services/strategy-vault/computation.js +15 -0
  54. package/dist/services/strategy-vault/query.d.ts +147 -0
  55. package/dist/services/strategy-vault/query.js +67 -0
  56. package/dist/services/strategy-vault/type.d.ts +2 -0
  57. package/dist/services/strategy-vault/type.js +2 -0
  58. package/dist/share-vault.d.ts +91 -0
  59. package/dist/share-vault.js +747 -0
  60. package/dist/stonfi.d.ts +18 -0
  61. package/dist/stonfi.js +76 -0
  62. package/dist/strategy_vault/base.d.ts +399 -0
  63. package/dist/strategy_vault/base.js +1199 -0
  64. package/dist/strategy_vault/index.d.ts +3 -0
  65. package/dist/strategy_vault/index.js +7 -0
  66. package/dist/strategy_vault/steps.d.ts +49 -0
  67. package/dist/strategy_vault/steps.js +170 -0
  68. package/dist/types/action.d.ts +55 -0
  69. package/dist/types/action.js +2 -0
  70. package/dist/types/messages.d.ts +7 -0
  71. package/dist/types/messages.js +2 -0
  72. package/dist/types/params.d.ts +19 -0
  73. package/dist/types/params.js +2 -0
  74. package/dist/types/pool.d.ts +83 -0
  75. package/dist/types/pool.js +2 -0
  76. package/dist/types/transaction.d.ts +40 -0
  77. package/dist/types/transaction.js +2 -0
  78. package/dist/utils/_parse_temp/JumpIRM.d.ts +37 -0
  79. package/dist/utils/_parse_temp/JumpIRM.js +71 -0
  80. package/dist/utils/_parse_temp/Pool.d.ts +559 -0
  81. package/dist/utils/_parse_temp/Pool.js +1023 -0
  82. package/dist/utils/_parse_temp/ShareVault.d.ts +264 -0
  83. package/dist/utils/_parse_temp/ShareVault.js +479 -0
  84. package/dist/utils/_parse_temp/StrategyVault.d.ts +729 -0
  85. package/dist/utils/_parse_temp/StrategyVault.js +1865 -0
  86. package/dist/utils/_parse_temp/parseMsgBody.d.ts +13 -0
  87. package/dist/utils/_parse_temp/parseMsgBody.js +313 -0
  88. package/dist/utils/assert.d.ts +1 -0
  89. package/dist/utils/assert.js +9 -0
  90. package/dist/utils/client-for-parameter.d.ts +12 -0
  91. package/dist/utils/client-for-parameter.js +97 -0
  92. package/dist/utils/oracle/index.d.ts +4 -0
  93. package/dist/utils/oracle/index.js +19 -0
  94. package/dist/utils/oracle/redstone/helper.d.ts +22 -0
  95. package/dist/utils/oracle/redstone/helper.js +186 -0
  96. package/dist/utils/tracer.d.ts +13 -0
  97. package/dist/utils/tracer.js +137 -0
  98. package/dist/utils/tracker/index.d.ts +5 -0
  99. package/dist/utils/tracker/index.js +118 -0
  100. package/dist/utils/tracker/query-id-generactor.d.ts +2 -0
  101. package/dist/utils/tracker/query-id-generactor.js +12 -0
  102. package/dist/utils/tracker/type.d.ts +34 -0
  103. package/dist/utils/tracker/type.js +2 -0
  104. package/package.json +1 -1
@@ -0,0 +1,284 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RFQBatchV1 = void 0;
4
+ const ton_1 = require("@ton/ton");
5
+ const utils_1 = require("./contracts/common/utils");
6
+ const service_1 = require("./common/service");
7
+ const jetton_minter_1 = require("./contracts/jetton/jetton-minter");
8
+ const jetton_wallet_1 = require("./contracts/jetton/jetton-wallet");
9
+ const rfq_batch_1 = require("./contracts/rfq/rfq_batch");
10
+ const redstone_onchain_oracle_1 = require("./contracts/oracle/redstone-onchain-oracle");
11
+ const redstoneHelper_1 = require("./utils/oracle/redstone/redstoneHelper");
12
+ const strategy_vault_1 = require("./contracts/vault/strategy-vault");
13
+ const unknown_contract_1 = require("./common/unknown-contract");
14
+ const share_vault_1 = require("./contracts/vault/share-vault");
15
+ const oracle_1 = require("./oracle/oracle");
16
+ class RFQBatchV1 extends service_1.ServiceBaseV1 {
17
+ async sendAddOrder(sender, params, value) {
18
+ const rfqBatch = this.getByContract(rfq_batch_1.RFQBatch, (0, utils_1.toAddress)(params.rfqBatchAddress));
19
+ const rfqData = await rfqBatch.getRfqData();
20
+ const forwardPayload = rfq_batch_1.RFQBatch.createOrderMsg((0, utils_1.toAddress)(params.senderAddress), params.forwardTonAmount, params.forwardPayload);
21
+ const assetContract = this.getByContract(jetton_minter_1.JettonMinter, (0, utils_1.toAddress)(params.assetAddress));
22
+ const assetWalletAddress = await assetContract.getWalletAddress((0, utils_1.toAddress)(params.senderAddress));
23
+ const assetWallet = this.getByContract(jetton_wallet_1.JettonWallet, assetWalletAddress);
24
+ const wtonAddress = (0, utils_1.toAddress)(this.contracts.WTON);
25
+ // TODO - WTON
26
+ await assetWallet.sendTransfer(sender, value ?? (0, ton_1.toNano)(0.2), {
27
+ recipient: (0, utils_1.toAddress)(params.rfqBatchAddress),
28
+ response: sender.address,
29
+ amount: params.amount,
30
+ forwardTonAmount: (0, ton_1.toNano)(0.1),
31
+ forwardPayload: forwardPayload,
32
+ });
33
+ }
34
+ async sendSettle(sender, params, value) {
35
+ const rfqBatch = this.getByContract(rfq_batch_1.RFQBatch, (0, utils_1.toAddress)(params.rfqBatchAddress));
36
+ const rfqBatchData = await rfqBatch.getRfqData();
37
+ const oracleLibs = new oracle_1.OracleLibs(this.client, this.network);
38
+ const { oracleParams, bucket } = await oracleLibs.getOracleParamsForRFQBatch(rfqBatchData);
39
+ const forwardPayload = rfq_batch_1.RFQBatch.createSettleMsg(oracleParams);
40
+ const assetContract = this.getByContract(jetton_minter_1.JettonMinter, (0, utils_1.toAddress)(params.assetAddress));
41
+ const assetWalletAddress = await assetContract.getWalletAddress((0, utils_1.toAddress)(params.senderAddress));
42
+ const assetWallet = this.getByContract(jetton_wallet_1.JettonWallet, assetWalletAddress);
43
+ // TODO - WTON
44
+ const wtonAddress = (0, utils_1.toAddress)(this.contracts.WTON);
45
+ const oracleCalculateGas = BigInt(bucket.assets.size + bucket.pools.size + bucket.vaults.size) *
46
+ (0, ton_1.toNano)(0.06);
47
+ const forwardTonAmount = oracleCalculateGas + (0, ton_1.toNano)(0.4);
48
+ const sendValue = value ?? forwardTonAmount + (0, ton_1.toNano)(0.1);
49
+ await assetWallet.sendTransfer(sender, sendValue, {
50
+ recipient: (0, utils_1.toAddress)(params.rfqBatchAddress),
51
+ response: sender.address,
52
+ amount: params.amount,
53
+ forwardTonAmount,
54
+ forwardPayload,
55
+ });
56
+ }
57
+ async separateAssets(_assets, oracleConfig) {
58
+ const noVaultAssets = [
59
+ ...Object.values(oracleConfig.redstoneAssetInfo).map((item) => item.address.toString()),
60
+ ...Object.keys(oracleConfig.assetOnchainDataInfo).map((item) => item),
61
+ ];
62
+ const assets = [];
63
+ const vaultAssets = [];
64
+ for (const asset of _assets) {
65
+ if (noVaultAssets.includes(asset.toString())) {
66
+ assets.push(asset);
67
+ }
68
+ else {
69
+ vaultAssets.push(asset);
70
+ }
71
+ }
72
+ return {
73
+ assets,
74
+ vaultAssets,
75
+ };
76
+ }
77
+ async getParsedVaults(vaultAddresses) {
78
+ const decomposedVault = {};
79
+ for (let vaultAddress of vaultAddresses) {
80
+ const state = await this.getByContract(unknown_contract_1.UnknownContract, vaultAddress).getState();
81
+ if (state.state.type === "active" && state.state.data) {
82
+ const data = ton_1.Cell.fromBoc(state.state.data)[0];
83
+ try {
84
+ const vaultData = strategy_vault_1.StrategyVault.parseVaultData(data);
85
+ const vaultDataa = {
86
+ totalSupply: vaultData.totalSupply,
87
+ assets: Object.keys(vaultData.assets).reduce((acc, asset) => {
88
+ acc[asset] = vaultData.assets[asset].cash;
89
+ return acc;
90
+ }, {}),
91
+ poolPositions: Object.keys(vaultData.factorialPools).reduce((acc, pool) => {
92
+ acc[pool] = Object.keys(vaultData.factorialPools[pool]).reduce((acc, asset) => {
93
+ acc[asset] = {
94
+ supply: vaultData.factorialPools[pool][asset].supply,
95
+ borrow: vaultData.factorialPools[pool][asset].borrow,
96
+ };
97
+ return acc;
98
+ }, {});
99
+ return acc;
100
+ }, {}),
101
+ };
102
+ decomposedVault[vaultAddress.toString()] = vaultDataa;
103
+ }
104
+ catch (e) {
105
+ const vaultData = share_vault_1.ShareVault.parseVaultData(data);
106
+ const vaultDataa = {
107
+ totalSupply: vaultData.totalSupply,
108
+ assets: {
109
+ [vaultData.asset.toString()]: vaultData.cash,
110
+ },
111
+ poolPositions: Object.values(vaultData.whitelistedPools).reduce((acc, pool) => {
112
+ acc[pool.address.toString()] = {
113
+ [vaultData.asset.toString()]: {
114
+ supply: pool.supply,
115
+ borrow: 0n,
116
+ },
117
+ };
118
+ return acc;
119
+ }, {}),
120
+ };
121
+ decomposedVault[vaultAddress.toString()] = vaultDataa;
122
+ }
123
+ }
124
+ }
125
+ return decomposedVault;
126
+ }
127
+ async getExposures(vaults) {
128
+ const assets = new Set();
129
+ const pools = new Set();
130
+ for (let vault of Object.values(vaults)) {
131
+ const _assets = vault.assets;
132
+ for (let asset of Object.keys(_assets)) {
133
+ const position = vault.assets[asset];
134
+ assets.add(asset);
135
+ }
136
+ for (let pool of Object.keys(vault.poolPositions)) {
137
+ const _assets = vault.poolPositions[pool];
138
+ for (let asset of Object.keys(_assets)) {
139
+ const position = vault.poolPositions[pool][asset];
140
+ if (position.supply > 0n || position.borrow > 0n) {
141
+ pools.add(pool);
142
+ assets.add(asset);
143
+ }
144
+ }
145
+ }
146
+ }
147
+ const result = { pools: [...pools], assets: [...assets] };
148
+ return result;
149
+ }
150
+ async getOracleParams(rfqBatchAddress) {
151
+ const rfqBatch = this.getByContract(rfq_batch_1.RFQBatch, (0, utils_1.toAddress)(rfqBatchAddress));
152
+ const rfqBatchData = await rfqBatch.getRfqData();
153
+ const oracleConfig = rfqBatchData.oracleConfig;
154
+ let { assets, vaultAssets } = await this.separateAssets([
155
+ rfqBatchData.asset0Address.toString(),
156
+ rfqBatchData.asset1Address.toString(),
157
+ ], oracleConfig);
158
+ const vaultPositions = await this.getParsedVaults(vaultAssets);
159
+ const exposures = await this.getExposures(vaultPositions);
160
+ const exposurePools = exposures.pools;
161
+ assets = [...new Set([...assets, ...exposures.assets])];
162
+ let requestFactorialPoolsCell = exposurePools.length > 0
163
+ ? redstone_onchain_oracle_1.RedstoneOnchainOracle.createAddressToTupleCell(exposurePools.map((pool) => ton_1.Address.parse(pool)))
164
+ : null;
165
+ let requestFactorialVaultsCell = vaultAssets.length > 0
166
+ ? redstone_onchain_oracle_1.RedstoneOnchainOracle.createAddressToTupleCell(vaultAssets.map((vault) => ton_1.Address.parse(vault)))
167
+ : null;
168
+ let requestFactorialCell = (0, ton_1.beginCell)()
169
+ .storeMaybeRef(requestFactorialPoolsCell)
170
+ .storeMaybeRef(requestFactorialVaultsCell)
171
+ .endCell();
172
+ assets = [...new Set([...assets, ...exposures.assets])];
173
+ const result = redstone_onchain_oracle_1.RedstoneOnchainOracle.getOracleRequestParams(assets, oracleConfig);
174
+ const helper = (0, redstoneHelper_1.createRedstoneHelper)("prod");
175
+ const payload = await helper.createPayload(result.redstoneAssetNames);
176
+ const requestAssetCell = redstone_onchain_oracle_1.RedstoneOnchainOracle.createAddressToTupleCell(result.requestAssets);
177
+ const dataFeedIdsTupleBuilder = new ton_1.TupleBuilder();
178
+ result.feedIds.forEach((item) => dataFeedIdsTupleBuilder.writeNumber(item));
179
+ const feedIdCell = (0, ton_1.serializeTuple)(dataFeedIdsTupleBuilder.build());
180
+ const oracleParams = (0, ton_1.beginCell)()
181
+ .storeRef(feedIdCell)
182
+ .storeRef(payload)
183
+ .storeRef(requestAssetCell)
184
+ .storeRef(requestFactorialCell)
185
+ .endCell();
186
+ return oracleParams;
187
+ }
188
+ async sendLock(sender, params, value) {
189
+ const rfqBatch = this.getByContract(rfq_batch_1.RFQBatch, (0, utils_1.toAddress)(params.rfqBatchAddress));
190
+ await rfqBatch.sendLock(sender, value ?? (0, ton_1.toNano)(0.1));
191
+ }
192
+ async sendCancelOrder(sender, params, value) {
193
+ const rfqBatch = this.getByContract(rfq_batch_1.RFQBatch, (0, utils_1.toAddress)(params.rfqBatchAddress));
194
+ const rfqBatchData = await rfqBatch.getRfqData();
195
+ const assetIdx = rfqBatchData.asset0Address.toString() ===
196
+ (0, utils_1.toAddress)(params.assetAddress).toString()
197
+ ? 0
198
+ : rfqBatchData.asset1Address.toString() ===
199
+ (0, utils_1.toAddress)(params.assetAddress).toString()
200
+ ? 1
201
+ : -1;
202
+ if (assetIdx === -1)
203
+ throw new Error("Asset not found");
204
+ await rfqBatch.sendCancelOrder(sender, value ?? (0, ton_1.toNano)(0.1), {
205
+ assetIdx,
206
+ });
207
+ }
208
+ async sendPayout(sender, params, value) {
209
+ const rfqBatch = this.getByContract(rfq_batch_1.RFQBatch, (0, utils_1.toAddress)(params.rfqBatchAddress));
210
+ const rfqBatchData = await rfqBatch.getRfqData();
211
+ const assetIdx = rfqBatchData.asset0Address.toString() ===
212
+ (0, utils_1.toAddress)(params.assetAddress).toString()
213
+ ? 0
214
+ : rfqBatchData.asset1Address.toString() ===
215
+ (0, utils_1.toAddress)(params.assetAddress).toString()
216
+ ? 1
217
+ : -1;
218
+ if (assetIdx === -1)
219
+ throw new Error("Asset not found");
220
+ await rfqBatch.sendPayout(sender, value ?? (0, ton_1.toNano)(0.1), {
221
+ assetIdx,
222
+ count: params.count,
223
+ });
224
+ }
225
+ async sendReopen(sender, params, value) {
226
+ const rfqBatch = this.getByContract(rfq_batch_1.RFQBatch, (0, utils_1.toAddress)(params.rfqBatchAddress));
227
+ await rfqBatch.sendReopen(sender, value ?? (0, ton_1.toNano)(0.1));
228
+ }
229
+ async sendCollectFee(sender, params, value) {
230
+ const rfqBatch = this.getByContract(rfq_batch_1.RFQBatch, (0, utils_1.toAddress)(params.rfqBatchAddress));
231
+ await rfqBatch.sendCollectFee(sender, value ?? (0, ton_1.toNano)(0.1));
232
+ }
233
+ async getRfqBatchData(rfqBatchAddress) {
234
+ const rfqBatch = this.getByContract(rfq_batch_1.RFQBatch, (0, utils_1.toAddress)(rfqBatchAddress));
235
+ return await rfqBatch.getRfqData();
236
+ }
237
+ async createInternalAddOrder(sender, params, value) {
238
+ const rfqBatch = this.getByContract(rfq_batch_1.RFQBatch, (0, utils_1.toAddress)(params.rfqBatchAddress));
239
+ const rfqData = await rfqBatch.getRfqData();
240
+ const forwardPayload = rfq_batch_1.RFQBatch.createOrderMsg((0, utils_1.toAddress)(params.senderAddress), params.forwardTonAmount, params.forwardPayload);
241
+ const assetContract = this.getByContract(jetton_minter_1.JettonMinter, (0, utils_1.toAddress)(params.assetAddress));
242
+ const assetWalletAddress = await assetContract.getWalletAddress((0, utils_1.toAddress)(params.senderAddress));
243
+ const assetWallet = this.getByContract(jetton_wallet_1.JettonWallet, assetWalletAddress);
244
+ const wtonAddress = (0, utils_1.toAddress)(this.contracts.WTON);
245
+ // TODO - WTON
246
+ await assetWallet.sendTransfer(sender, value ?? (0, ton_1.toNano)(0.2), {
247
+ recipient: (0, utils_1.toAddress)(params.rfqBatchAddress),
248
+ response: sender.address,
249
+ amount: params.amount,
250
+ forwardTonAmount: (0, ton_1.toNano)(0.1),
251
+ forwardPayload: forwardPayload,
252
+ });
253
+ return assetWallet.createInternalTransfer(value ?? (0, ton_1.toNano)(0.2), {
254
+ recipient: (0, utils_1.toAddress)(params.rfqBatchAddress),
255
+ response: sender.address,
256
+ amount: params.amount,
257
+ forwardTonAmount: (0, ton_1.toNano)(0.1),
258
+ forwardPayload: forwardPayload,
259
+ });
260
+ }
261
+ async createInternalCancelOrder(params, value) {
262
+ const rfqBatch = this.getByContract(rfq_batch_1.RFQBatch, (0, utils_1.toAddress)(params.rfqBatchAddress));
263
+ const rfqBatchData = await rfqBatch.getRfqData();
264
+ const assetIdx = rfqBatchData.asset0Address.toString() ===
265
+ (0, utils_1.toAddress)(params.assetAddress).toString()
266
+ ? 0
267
+ : rfqBatchData.asset1Address.toString() ===
268
+ (0, utils_1.toAddress)(params.assetAddress).toString()
269
+ ? 1
270
+ : -1;
271
+ if (assetIdx === -1)
272
+ throw new Error("Asset not found");
273
+ return {
274
+ to: (0, utils_1.toAddress)(params.rfqBatchAddress),
275
+ value: value ?? (0, ton_1.toNano)(0.1),
276
+ body: (0, ton_1.beginCell)()
277
+ .storeUint(rfq_batch_1.RFQBatch.Op.CancelOrder, 32)
278
+ .storeUint(0, 64)
279
+ .storeUint(assetIdx, 1)
280
+ .endCell(),
281
+ };
282
+ }
283
+ }
284
+ exports.RFQBatchV1 = RFQBatchV1;
@@ -1,24 +1,21 @@
1
1
  import { ShareVaultState } from "../../contracts/vault/share-vault";
2
+ import { getPoolInfoForShareVault } from "./query";
3
+ import { PoolInfoForShareVault, PoolTuple } from "./type";
2
4
  /**
3
- * Pool info for ShareVault calculations
5
+ * Get pools sorted by target weight ratio for withdrawal ordering
4
6
  */
5
- export type PoolInfoForShareVault = {
6
- cash: bigint;
7
- totalSupplyAmount: bigint;
8
- totalSupplyShare: bigint;
9
- vaultSupplyAmount: bigint;
10
- };
7
+ export declare function getPoolTupleSortedByTargetWeight(whitelistedPools: ShareVaultState["whitelistedPools"], totalAssetAmount: bigint, totalTargetWeight: bigint, poolInfoForShareVault: Record<string, PoolInfoForShareVault>): PoolTuple[];
11
8
  /**
12
- * Pool tuple with calculated values for withdrawal ordering
9
+ * Estimate how many pools need to be withdrawn from to fulfill a withdrawal request
13
10
  */
14
- export type PoolTuple = {
15
- poolAddress: string;
16
- targetWeight: bigint;
17
- targetWeightRatio: number;
18
- supply: bigint;
19
- withdrawableAmount: bigint;
20
- };
11
+ export declare function estimateWithdrawPoolCount(vaultData: ShareVaultState, poolInfo: Awaited<ReturnType<typeof getPoolInfoForShareVault>>, requestedShares: bigint): Promise<{
12
+ count: number;
13
+ sortedPools: PoolTuple[];
14
+ }>;
21
15
  /**
22
- * Get pools sorted by target weight ratio for withdrawal ordering
16
+ * Get share vault exchange info
23
17
  */
24
- export declare function getPoolTupleSortedByTargetWeight(whitelistedPools: ShareVaultState["whitelistedPools"], totalAssetAmount: bigint, totalTargetWeight: bigint, poolInfoForShareVault: Record<string, PoolInfoForShareVault>): PoolTuple[];
18
+ export declare function getExchangeRate(vaultData: ShareVaultState, poolInfo: Awaited<ReturnType<typeof getPoolInfoForShareVault>>): {
19
+ netAmount: bigint;
20
+ exr: number;
21
+ };
@@ -1,6 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getPoolTupleSortedByTargetWeight = getPoolTupleSortedByTargetWeight;
4
+ exports.estimateWithdrawPoolCount = estimateWithdrawPoolCount;
5
+ exports.getExchangeRate = getExchangeRate;
4
6
  // ============================================================
5
7
  // Pure Computation (no I/O)
6
8
  // ============================================================
@@ -40,3 +42,40 @@ function getPoolTupleSortedByTargetWeight(whitelistedPools, totalAssetAmount, to
40
42
  return b.targetWeightRatio - a.targetWeightRatio;
41
43
  });
42
44
  }
45
+ /**
46
+ * Estimate how many pools need to be withdrawn from to fulfill a withdrawal request
47
+ */
48
+ async function estimateWithdrawPoolCount(vaultData, poolInfo, requestedShares) {
49
+ const totalAssetAmount = Object.values(poolInfo).reduce((acc, p) => acc + p.vaultSupplyAmount, 0n) + vaultData.cash;
50
+ const sortedPools = getPoolTupleSortedByTargetWeight(vaultData.whitelistedPools, totalAssetAmount, vaultData.totalTargetWeight, poolInfo);
51
+ if (vaultData.totalSupply === 0n) {
52
+ return { count: 0, sortedPools };
53
+ }
54
+ const requestedAmount = (requestedShares * totalAssetAmount) / vaultData.totalSupply;
55
+ let remainingAmount = requestedAmount - vaultData.cash;
56
+ if (remainingAmount <= 0n) {
57
+ return { count: 0, sortedPools };
58
+ }
59
+ let count = 0;
60
+ for (const pool of sortedPools) {
61
+ if (remainingAmount <= 0n)
62
+ break;
63
+ remainingAmount -= pool.withdrawableAmount;
64
+ count++;
65
+ }
66
+ return { count, sortedPools };
67
+ }
68
+ /**
69
+ * Get share vault exchange info
70
+ */
71
+ function getExchangeRate(vaultData, poolInfo) {
72
+ const vaultPosition = vaultData.whitelistedPools;
73
+ let netAmount = vaultData.cash;
74
+ for (const [poolAddress, position] of Object.entries(vaultPosition)) {
75
+ netAmount += poolInfo[poolAddress].totalSupplyAmount * position.supply / poolInfo[poolAddress].totalSupplyShare;
76
+ }
77
+ return {
78
+ netAmount,
79
+ exr: Number(netAmount) / Number(vaultData.totalSupply),
80
+ };
81
+ }
@@ -41,6 +41,7 @@ const context_1 = require("../../context");
41
41
  const send_msg_1 = require("../../lib/send-msg");
42
42
  const query = __importStar(require("./query"));
43
43
  exports.query = query;
44
+ const computation = __importStar(require("./computation"));
44
45
  const owner = __importStar(require("./owner"));
45
46
  exports.owner = owner;
46
47
  const manager = __importStar(require("./manager"));
@@ -76,14 +77,16 @@ class ShareVaultServiceV1 {
76
77
  return query.getPoolInfoForShareVault(this.ctx, vaultData);
77
78
  }
78
79
  getPoolTupleSortedByTargetWeight(whitelistedPools, totalAssetAmount, totalTargetWeight, poolInfoForShareVault) {
79
- return query.getPoolTupleSortedByTargetWeight(whitelistedPools, totalAssetAmount, totalTargetWeight, poolInfoForShareVault);
80
+ return computation.getPoolTupleSortedByTargetWeight(whitelistedPools, totalAssetAmount, totalTargetWeight, poolInfoForShareVault);
80
81
  }
81
82
  async estimateWithdrawPoolCount(vaultData, requestedShares) {
82
- return query.estimateWithdrawPoolCount(this.ctx, vaultData, requestedShares);
83
+ const poolInfo = await query.getPoolInfoForShareVault(this.ctx, vaultData);
84
+ return computation.estimateWithdrawPoolCount(vaultData, poolInfo, requestedShares);
83
85
  }
84
86
  /** @deprecated Use estimateWithdrawPoolCount instead */
85
87
  async estimateWithdrawLiquidityFulfillmentPoolCount(vaultData, requestedShares) {
86
- return query.estimateWithdrawPoolCount(this.ctx, vaultData, requestedShares);
88
+ const poolInfo = await query.getPoolInfoForShareVault(this.ctx, vaultData);
89
+ return computation.estimateWithdrawPoolCount(vaultData, poolInfo, requestedShares);
87
90
  }
88
91
  // ============================================================
89
92
  // Owner
@@ -3,8 +3,8 @@ import { AffluentContext } from "../../context";
3
3
  import { AddressInput, AddressLike } from "../../contracts/common/type";
4
4
  import { ShareVault, ShareVaultState } from "../../contracts/vault/share-vault";
5
5
  import { JettonWallet } from "../../contracts/jetton/jetton-wallet";
6
- import { PoolInfoForShareVault, PoolTuple } from "./computation";
7
- export { PoolInfoForShareVault, PoolTuple, getPoolTupleSortedByTargetWeight } from "./computation";
6
+ import { PoolInfoForShareVault } from "./type";
7
+ export { PoolInfoForShareVault, PoolTuple } from "./type";
8
8
  /**
9
9
  * Get ShareVault contract instance
10
10
  */
@@ -25,10 +25,40 @@ export declare function getVaultWallet(ctx: AffluentContext, vaultAddress: Addre
25
25
  * Get pool info for all whitelisted pools
26
26
  */
27
27
  export declare function getPoolInfoForShareVault(ctx: AffluentContext, vaultData: ShareVaultState): Promise<Record<string, PoolInfoForShareVault>>;
28
- /**
29
- * Estimate how many pools need to be withdrawn from to fulfill a withdrawal request
30
- */
31
- export declare function estimateWithdrawPoolCount(ctx: AffluentContext, vaultData: ShareVaultState, requestedShares: bigint): Promise<{
32
- count: number;
33
- sortedPools: PoolTuple[];
28
+ export declare function getValuationContext(ctx: AffluentContext, vaultAddress: AddressInput): Promise<{
29
+ storage: {
30
+ totalSupply: bigint;
31
+ owner: Address | null;
32
+ manager: Address | null;
33
+ asset: Address;
34
+ balance: bigint;
35
+ cash: bigint;
36
+ totalTargetWeight: bigint;
37
+ nextAggregatorIndex: bigint;
38
+ isWtonVault: boolean;
39
+ assetWallet: Address | null;
40
+ whitelistedPools: Record<string, {
41
+ isWhitelisted: boolean;
42
+ targetWeight: bigint;
43
+ supply: bigint;
44
+ } & {
45
+ address: Address;
46
+ }>;
47
+ minimumGasFee: {
48
+ supply: bigint;
49
+ withdraw: bigint;
50
+ factorialSupply: bigint;
51
+ factorialWithdraw: bigint;
52
+ mintVaultShareTokens: bigint;
53
+ };
54
+ code: import("@ton/core").Cell;
55
+ address: Address;
56
+ };
57
+ totalSupply: bigint;
58
+ asset: Address;
59
+ reserve: bigint;
60
+ poolPositions: Record<string, PoolInfoForShareVault>;
61
+ netAmount: bigint;
62
+ exr: number;
34
63
  }>;
64
+ export declare function getEXR(ctx: AffluentContext, vaultAddress: AddressInput): Promise<number>;
@@ -33,22 +33,19 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.getPoolTupleSortedByTargetWeight = void 0;
37
36
  exports.getVault = getVault;
38
37
  exports.getVaultData = getVaultData;
39
38
  exports.getVaultWalletAddress = getVaultWalletAddress;
40
39
  exports.getVaultWallet = getVaultWallet;
41
40
  exports.getPoolInfoForShareVault = getPoolInfoForShareVault;
42
- exports.estimateWithdrawPoolCount = estimateWithdrawPoolCount;
41
+ exports.getValuationContext = getValuationContext;
42
+ exports.getEXR = getEXR;
43
43
  const core_1 = require("@ton/core");
44
44
  const utils_1 = require("../../contracts/common/utils");
45
45
  const share_vault_1 = require("../../contracts/vault/share-vault");
46
46
  const pool_1 = require("../../contracts/core/pool");
47
47
  const jetton_wallet_1 = require("../../contracts/jetton/jetton-wallet");
48
48
  const computation_1 = require("./computation");
49
- // Re-export computation functions and types
50
- var computation_2 = require("./computation");
51
- Object.defineProperty(exports, "getPoolTupleSortedByTargetWeight", { enumerable: true, get: function () { return computation_2.getPoolTupleSortedByTargetWeight; } });
52
49
  /**
53
50
  * Get ShareVault contract instance
54
51
  */
@@ -112,27 +109,23 @@ async function getPoolInfoForShareVault(ctx, vaultData) {
112
109
  }
113
110
  return poolInfo;
114
111
  }
115
- /**
116
- * Estimate how many pools need to be withdrawn from to fulfill a withdrawal request
117
- */
118
- async function estimateWithdrawPoolCount(ctx, vaultData, requestedShares) {
112
+ async function getValuationContext(ctx, vaultAddress) {
113
+ const vault = getVault(ctx, vaultAddress);
114
+ const vaultData = await vault.getVaultData();
119
115
  const poolInfo = await getPoolInfoForShareVault(ctx, vaultData);
120
- const totalAssetAmount = Object.values(poolInfo).reduce((acc, p) => acc + p.vaultSupplyAmount, 0n) + vaultData.cash;
121
- const sortedPools = (0, computation_1.getPoolTupleSortedByTargetWeight)(vaultData.whitelistedPools, totalAssetAmount, vaultData.totalTargetWeight, poolInfo);
122
- if (vaultData.totalSupply === 0n) {
123
- return { count: 0, sortedPools };
124
- }
125
- const requestedAmount = (requestedShares * totalAssetAmount) / vaultData.totalSupply;
126
- let remainingAmount = requestedAmount - vaultData.cash;
127
- if (remainingAmount <= 0n) {
128
- return { count: 0, sortedPools };
129
- }
130
- let count = 0;
131
- for (const pool of sortedPools) {
132
- if (remainingAmount <= 0n)
133
- break;
134
- remainingAmount -= pool.withdrawableAmount;
135
- count++;
136
- }
137
- return { count, sortedPools };
116
+ const exrInfo = (0, computation_1.getExchangeRate)(vaultData, poolInfo);
117
+ return {
118
+ storage: vaultData,
119
+ totalSupply: vaultData.totalSupply,
120
+ asset: vaultData.asset,
121
+ reserve: vaultData.cash,
122
+ poolPositions: poolInfo,
123
+ netAmount: exrInfo.netAmount,
124
+ exr: exrInfo.exr,
125
+ };
126
+ }
127
+ async function getEXR(ctx, vaultAddress) {
128
+ return getValuationContext(ctx, vaultAddress).then((vaultCtx) => {
129
+ return vaultCtx.exr;
130
+ });
138
131
  }
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Pool info for ShareVault calculations
3
+ */
4
+ export type PoolInfoForShareVault = {
5
+ cash: bigint;
6
+ totalSupplyAmount: bigint;
7
+ totalSupplyShare: bigint;
8
+ vaultSupplyAmount: bigint;
9
+ };
10
+ /**
11
+ * Pool tuple with calculated values for withdrawal ordering
12
+ */
13
+ export type PoolTuple = {
14
+ poolAddress: string;
15
+ targetWeight: bigint;
16
+ targetWeightRatio: number;
17
+ supply: bigint;
18
+ withdrawableAmount: bigint;
19
+ };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -23,6 +23,7 @@ const jetton_wallet_1 = require("../../../contracts/jetton/jetton-wallet");
23
23
  const jetton_wallet_2 = require("../../../contracts/wton/jetton-wallet");
24
24
  const jetton_minter_2 = require("../../../contracts/wton/jetton-minter");
25
25
  const query_1 = require("../query");
26
+ const computation_1 = require("../computation");
26
27
  __exportStar(require("./types"), exports);
27
28
  // ============================================================
28
29
  // Supply
@@ -82,7 +83,8 @@ async function createWithdrawMsg(ctx, sender, params, value) {
82
83
  const assetAddress = vaultData.asset;
83
84
  const isWTON = ctx.isWTON(assetAddress);
84
85
  // Estimate pool count for gas calculation
85
- const { count: poolCount } = await (0, query_1.estimateWithdrawPoolCount)(ctx, vaultData, params.amount);
86
+ const poolInfo = await (0, query_1.getPoolInfoForShareVault)(ctx, vaultData);
87
+ const { count: poolCount } = await (0, computation_1.estimateWithdrawPoolCount)(vaultData, poolInfo, params.amount);
86
88
  const gas = share_vault_1.ShareVault.calculateGasFee(share_vault_1.ShareVault.Op.Withdraw, share_vault_1.ShareVault.Gas.baseFee, poolCount, vaultData.minimumGasFee, isWTON);
87
89
  const forwardPayload = share_vault_1.ShareVault.createWithdrawForwardPayload({
88
90
  jettonForwardTonAmount: isWTON ? jetton_minter_2.WTON_UNWRAP_GAS : 0n,
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ function getStrategyVaultExchangeInfo(vaultData, poolInfo) {
4
+ const priceInfo = {};
5
+ for (const assetAddress of Object.keys(vaultData.assets)) {
6
+ priceInfo[assetAddress] = 0n;
7
+ }
8
+ return {
9
+ totalSupply: vaultData.totalSupply,
10
+ price: 0n,
11
+ exr: (assetAddress) => 0,
12
+ toShares: (assetAddress, amount) => 0n,
13
+ toAmount: (assetAddress, shares) => 0n,
14
+ };
15
+ }