@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.
- package/dist/build/Account.compiled.json +1 -0
- package/dist/build/Receipt.compiled.json +1 -0
- package/dist/build/WTONWallet.compiled.json +1 -0
- package/dist/common/cache.d.ts +16 -0
- package/dist/common/cache.js +96 -0
- package/dist/common/service.d.ts +20 -0
- package/dist/common/service.js +69 -0
- package/dist/common/type.d.ts +14 -0
- package/dist/common/type.js +2 -0
- package/dist/common/unknown-contract.d.ts +14 -0
- package/dist/common/unknown-contract.js +18 -0
- package/dist/common/versions.d.ts +14 -0
- package/dist/common/versions.js +22 -0
- package/dist/constants/pool.d.ts +1 -0
- package/dist/constants/pool.js +2 -0
- package/dist/contracts/_mock/simple-oracle.d.ts +34 -0
- package/dist/contracts/_mock/simple-oracle.js +73 -0
- package/dist/contracts/vault/share-vault/type.d.ts +30 -0
- package/dist/contracts/vault/share-vault/type.js +2 -0
- package/dist/contracts/vault/strategy-vault/utils.d.ts +6 -0
- package/dist/contracts/vault/strategy-vault/utils.js +32 -0
- package/dist/factorial.d.ts +14 -0
- package/dist/factorial.js +20 -0
- package/dist/farm.d.ts +92 -0
- package/dist/farm.js +209 -0
- package/dist/monitor.d.ts +57 -0
- package/dist/monitor.js +527 -0
- package/dist/monitorCacheV1.d.ts +52 -0
- package/dist/monitorCacheV1.js +504 -0
- package/dist/oracle/oracle-v2.d.ts +39 -0
- package/dist/oracle/oracle-v2.js +151 -0
- package/dist/oracle/oracle.d.ts +107 -0
- package/dist/oracle/oracle.js +392 -0
- package/dist/periphery.d.ts +259 -0
- package/dist/periphery.js +1087 -0
- package/dist/pool.d.ts +216 -0
- package/dist/pool.js +2298 -0
- package/dist/poolCacheV1.d.ts +139 -0
- package/dist/poolCacheV1.js +1841 -0
- package/dist/rfq-auction.d.ts +75 -0
- package/dist/rfq-auction.js +220 -0
- package/dist/rfq-batch.d.ts +112 -0
- package/dist/rfq-batch.js +284 -0
- package/dist/services/share-vault/computation.d.ts +14 -17
- package/dist/services/share-vault/computation.js +39 -0
- package/dist/services/share-vault/index.js +6 -3
- package/dist/services/share-vault/query.d.ts +38 -8
- package/dist/services/share-vault/query.js +20 -27
- package/dist/services/share-vault/type.d.ts +19 -0
- package/dist/services/share-vault/type.js +2 -0
- package/dist/services/share-vault/user/index.js +3 -1
- package/dist/services/strategy-vault/computation.d.ts +1 -0
- package/dist/services/strategy-vault/computation.js +15 -0
- package/dist/services/strategy-vault/query.d.ts +147 -0
- package/dist/services/strategy-vault/query.js +67 -0
- package/dist/services/strategy-vault/type.d.ts +2 -0
- package/dist/services/strategy-vault/type.js +2 -0
- package/dist/share-vault.d.ts +91 -0
- package/dist/share-vault.js +747 -0
- package/dist/stonfi.d.ts +18 -0
- package/dist/stonfi.js +76 -0
- package/dist/strategy_vault/base.d.ts +399 -0
- package/dist/strategy_vault/base.js +1199 -0
- package/dist/strategy_vault/index.d.ts +3 -0
- package/dist/strategy_vault/index.js +7 -0
- package/dist/strategy_vault/steps.d.ts +49 -0
- package/dist/strategy_vault/steps.js +170 -0
- package/dist/types/action.d.ts +55 -0
- package/dist/types/action.js +2 -0
- package/dist/types/messages.d.ts +7 -0
- package/dist/types/messages.js +2 -0
- package/dist/types/params.d.ts +19 -0
- package/dist/types/params.js +2 -0
- package/dist/types/pool.d.ts +83 -0
- package/dist/types/pool.js +2 -0
- package/dist/types/transaction.d.ts +40 -0
- package/dist/types/transaction.js +2 -0
- package/dist/utils/_parse_temp/JumpIRM.d.ts +37 -0
- package/dist/utils/_parse_temp/JumpIRM.js +71 -0
- package/dist/utils/_parse_temp/Pool.d.ts +559 -0
- package/dist/utils/_parse_temp/Pool.js +1023 -0
- package/dist/utils/_parse_temp/ShareVault.d.ts +264 -0
- package/dist/utils/_parse_temp/ShareVault.js +479 -0
- package/dist/utils/_parse_temp/StrategyVault.d.ts +729 -0
- package/dist/utils/_parse_temp/StrategyVault.js +1865 -0
- package/dist/utils/_parse_temp/parseMsgBody.d.ts +13 -0
- package/dist/utils/_parse_temp/parseMsgBody.js +313 -0
- package/dist/utils/assert.d.ts +1 -0
- package/dist/utils/assert.js +9 -0
- package/dist/utils/client-for-parameter.d.ts +12 -0
- package/dist/utils/client-for-parameter.js +97 -0
- package/dist/utils/oracle/index.d.ts +4 -0
- package/dist/utils/oracle/index.js +19 -0
- package/dist/utils/oracle/redstone/helper.d.ts +22 -0
- package/dist/utils/oracle/redstone/helper.js +186 -0
- package/dist/utils/tracer.d.ts +13 -0
- package/dist/utils/tracer.js +137 -0
- package/dist/utils/tracker/index.d.ts +5 -0
- package/dist/utils/tracker/index.js +118 -0
- package/dist/utils/tracker/query-id-generactor.d.ts +2 -0
- package/dist/utils/tracker/query-id-generactor.js +12 -0
- package/dist/utils/tracker/type.d.ts +34 -0
- package/dist/utils/tracker/type.js +2 -0
- package/package.json +1 -1
|
@@ -0,0 +1,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
|
-
*
|
|
5
|
+
* Get pools sorted by target weight ratio for withdrawal ordering
|
|
4
6
|
*/
|
|
5
|
-
export
|
|
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
|
-
*
|
|
9
|
+
* Estimate how many pools need to be withdrawn from to fulfill a withdrawal request
|
|
13
10
|
*/
|
|
14
|
-
export
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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
|
|
16
|
+
* Get share vault exchange info
|
|
23
17
|
*/
|
|
24
|
-
export declare function
|
|
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
|
|
80
|
+
return computation.getPoolTupleSortedByTargetWeight(whitelistedPools, totalAssetAmount, totalTargetWeight, poolInfoForShareVault);
|
|
80
81
|
}
|
|
81
82
|
async estimateWithdrawPoolCount(vaultData, requestedShares) {
|
|
82
|
-
|
|
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
|
-
|
|
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
|
|
7
|
-
export { PoolInfoForShareVault, PoolTuple
|
|
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
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
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
|
+
};
|
|
@@ -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
|
|
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
|
+
}
|