@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,295 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createOracleExposures = createOracleExposures;
4
+ exports.applyPrice = applyPrice;
5
+ exports.calculateSyntheticPrices = calculateSyntheticPrices;
6
+ exports.computePoolPositionsValue = computePoolPositionsValue;
7
+ exports.computeVaultValue = computeVaultValue;
8
+ exports.calculateVaultPrices = calculateVaultPrices;
9
+ exports.computeCompositePrices = computeCompositePrices;
10
+ exports.getExposures = getExposures;
11
+ exports.separateAssets = separateAssets;
12
+ exports.updateOnchainInternalData = updateOnchainInternalData;
13
+ exports.buildOracleParamsCellFromPayload = buildOracleParamsCellFromPayload;
14
+ exports.buildOracleParamsCell = buildOracleParamsCell;
15
+ const core_1 = require("@ton/core");
16
+ const types_1 = require("./types");
17
+ const pool_1 = require("../../contracts/core/pool");
18
+ const type_1 = require("../../contracts/oracle/redstone-onchain-oracle/type");
19
+ const redstone_onchain_oracle_1 = require("../../contracts/oracle/redstone-onchain-oracle");
20
+ const redstoneHelper_1 = require("../../utils/oracle/redstone/redstoneHelper");
21
+ function createOracleExposures() {
22
+ return {
23
+ assets: new Set(),
24
+ pools: new Set(),
25
+ vaults: new Set(),
26
+ totalSize() {
27
+ return this.assets.size + this.pools.size + this.vaults.size;
28
+ },
29
+ };
30
+ }
31
+ function applyPrice(amount, price) {
32
+ return (amount * price) / types_1.DECIMALS_OF_PRICE;
33
+ }
34
+ function calculateSyntheticPrices(rawPrices, syntheticCompositions) {
35
+ const prices = { ...rawPrices };
36
+ let pendingAssets = Object.entries(syntheticCompositions);
37
+ while (pendingAssets.length > 0) {
38
+ const stillPending = [];
39
+ for (const [assetAddress, data] of pendingAssets) {
40
+ if (data.assetType === types_1.CompositeAssetType.SYNTHETIC1) {
41
+ const underlyingPrice = prices[data.underlyingAddress.toString()];
42
+ if (underlyingPrice) {
43
+ prices[assetAddress] = {
44
+ type: types_1.CompositeAssetType.SYNTHETIC1,
45
+ price: (underlyingPrice.price * data.underlyingReserve) / data.totalSupply,
46
+ };
47
+ }
48
+ else {
49
+ stillPending.push([assetAddress, data]);
50
+ }
51
+ }
52
+ else if (data.assetType === types_1.CompositeAssetType.SYNTHETIC2) {
53
+ const price0 = prices[data.underlying0Address.toString()];
54
+ const price1 = prices[data.underlying1Address.toString()];
55
+ if (price0 && price1) {
56
+ const value0 = (price0.price * data.underlying0Reserve) / data.totalSupply;
57
+ const value1 = (price1.price * data.underlying1Reserve) / data.totalSupply;
58
+ prices[assetAddress] = {
59
+ type: types_1.CompositeAssetType.SYNTHETIC2,
60
+ price: value0 + value1,
61
+ };
62
+ }
63
+ else {
64
+ stillPending.push([assetAddress, data]);
65
+ }
66
+ }
67
+ }
68
+ if (stillPending.length === pendingAssets.length && stillPending.length > 0) {
69
+ throw new Error(`Circular dependency: ${stillPending.map(([addr]) => addr).join(", ")}`);
70
+ }
71
+ pendingAssets = stillPending;
72
+ }
73
+ return prices;
74
+ }
75
+ function computePoolPositionsValue(poolPositions, poolInfos, prices) {
76
+ const decomposed = {};
77
+ const assetAmounts = {};
78
+ let totalValue = 0n;
79
+ for (const [poolAddress, assetPositions] of Object.entries(poolPositions)) {
80
+ const poolInfo = poolInfos[poolAddress];
81
+ if (!poolInfo)
82
+ continue;
83
+ for (const [assetAddress, position] of Object.entries(assetPositions)) {
84
+ const assetInfo = poolInfo[assetAddress];
85
+ if (!assetInfo)
86
+ continue;
87
+ const amounts = (0, pool_1.positionShareToAmount)(position, assetInfo);
88
+ if (!decomposed[assetAddress]) {
89
+ decomposed[assetAddress] = { supply: 0n, borrow: 0n };
90
+ }
91
+ decomposed[assetAddress].supply += amounts.supply;
92
+ decomposed[assetAddress].borrow += amounts.borrow;
93
+ const netAmount = amounts.supply - amounts.borrow;
94
+ assetAmounts[assetAddress] = (assetAmounts[assetAddress] ?? 0n) + netAmount;
95
+ const price = prices[assetAddress];
96
+ if (price) {
97
+ totalValue += applyPrice(netAmount, price.price);
98
+ }
99
+ }
100
+ }
101
+ return { totalValue, decomposed, assetAmounts };
102
+ }
103
+ function computeVaultValue(vault, poolInfos, prices) {
104
+ let cashValue = 0n;
105
+ const decomposed = {};
106
+ for (const [assetAddress, amount] of Object.entries(vault.assets)) {
107
+ const price = prices[assetAddress];
108
+ if (price && amount > 0n) {
109
+ cashValue += applyPrice(amount, price.price);
110
+ }
111
+ decomposed[assetAddress] = { supply: amount, borrow: 0n };
112
+ }
113
+ const poolResult = computePoolPositionsValue(vault.poolPositions, poolInfos, prices);
114
+ for (const [assetAddress, amounts] of Object.entries(poolResult.decomposed)) {
115
+ if (decomposed[assetAddress]) {
116
+ decomposed[assetAddress].supply += amounts.supply;
117
+ decomposed[assetAddress].borrow += amounts.borrow;
118
+ }
119
+ else {
120
+ decomposed[assetAddress] = amounts;
121
+ }
122
+ }
123
+ const totalValue = cashValue + poolResult.totalValue;
124
+ const price = vault.totalSupply === 0n ? 0n : (totalValue * types_1.DECIMALS_OF_PRICE) / vault.totalSupply;
125
+ return { totalValue, price, decomposed };
126
+ }
127
+ function calculateVaultPrices(vaultPositions, poolInfos, assetPrices) {
128
+ const vaultPrices = {};
129
+ const combinedPrices = { ...assetPrices };
130
+ const pendingVaults = { ...vaultPositions };
131
+ while (Object.keys(pendingVaults).length > 0) {
132
+ const vaultAddresses = Object.keys(pendingVaults);
133
+ let resolved = false;
134
+ for (const vaultAddress of vaultAddresses) {
135
+ const vault = pendingVaults[vaultAddress];
136
+ try {
137
+ const requiredAssets = new Set();
138
+ for (const assetAddress of Object.keys(vault.assets)) {
139
+ if (vault.assets[assetAddress] > 0n) {
140
+ requiredAssets.add(assetAddress);
141
+ }
142
+ }
143
+ for (const poolPositions of Object.values(vault.poolPositions)) {
144
+ for (const [assetAddress, position] of Object.entries(poolPositions)) {
145
+ if (position.supply > 0n || position.borrow > 0n) {
146
+ requiredAssets.add(assetAddress);
147
+ }
148
+ }
149
+ }
150
+ let allPricesAvailable = true;
151
+ for (const asset of requiredAssets) {
152
+ if (!combinedPrices[asset]) {
153
+ allPricesAvailable = false;
154
+ break;
155
+ }
156
+ }
157
+ if (!allPricesAvailable)
158
+ continue;
159
+ const result = computeVaultValue(vault, poolInfos, combinedPrices);
160
+ vaultPrices[vaultAddress] = {
161
+ type: types_1.CompositeAssetType.VAULT,
162
+ price: result.price,
163
+ additionalData: {
164
+ decomposed: result.decomposed,
165
+ totalSupply: vault.totalSupply,
166
+ },
167
+ };
168
+ combinedPrices[vaultAddress] = {
169
+ type: types_1.CompositeAssetType.VAULT,
170
+ price: result.price,
171
+ };
172
+ delete pendingVaults[vaultAddress];
173
+ resolved = true;
174
+ }
175
+ catch (e) {
176
+ // Continue to next vault
177
+ }
178
+ }
179
+ if (!resolved && Object.keys(pendingVaults).length > 0) {
180
+ for (const vaultAddress of Object.keys(pendingVaults)) {
181
+ vaultPrices[vaultAddress] = {
182
+ type: types_1.CompositeAssetType.VAULT,
183
+ price: 0n,
184
+ additionalData: {
185
+ decomposed: {},
186
+ totalSupply: pendingVaults[vaultAddress].totalSupply,
187
+ },
188
+ };
189
+ delete pendingVaults[vaultAddress];
190
+ }
191
+ }
192
+ }
193
+ return vaultPrices;
194
+ }
195
+ function computeCompositePrices(input) {
196
+ const assetPrices = calculateSyntheticPrices(input.rawPrices, input.syntheticCompositions);
197
+ const vaultPrices = calculateVaultPrices(input.vaultPositions, input.poolInfos, assetPrices);
198
+ const allPrices = { ...assetPrices };
199
+ for (const [address, entry] of Object.entries(vaultPrices)) {
200
+ allPrices[address] = { type: entry.type, price: entry.price };
201
+ }
202
+ return { assetPrices, vaultPrices, allPrices };
203
+ }
204
+ function getExposures(vaultPositions) {
205
+ const assets = new Set();
206
+ const pools = new Set();
207
+ for (const vault of Object.values(vaultPositions)) {
208
+ for (const [asset, amount] of Object.entries(vault.assets)) {
209
+ if (amount > 0n)
210
+ assets.add(asset);
211
+ }
212
+ for (const [poolAddress, poolPositions] of Object.entries(vault.poolPositions)) {
213
+ for (const [asset, position] of Object.entries(poolPositions)) {
214
+ if (position.supply > 0n || position.borrow > 0n) {
215
+ pools.add(poolAddress);
216
+ assets.add(asset);
217
+ }
218
+ }
219
+ }
220
+ }
221
+ return { assets: [...assets], pools: [...pools] };
222
+ }
223
+ function separateAssets(allAssets, oracleConfig) {
224
+ const knownAssets = new Set();
225
+ if (oracleConfig.redstoneAssetInfo) {
226
+ for (const info of Object.values(oracleConfig.redstoneAssetInfo)) {
227
+ knownAssets.add(info.address.toString());
228
+ }
229
+ }
230
+ if (oracleConfig.assetOnchainDataInfo) {
231
+ for (const address of Object.keys(oracleConfig.assetOnchainDataInfo)) {
232
+ knownAssets.add(address);
233
+ }
234
+ }
235
+ const assets = [];
236
+ const vaultAssets = [];
237
+ for (const asset of allAssets) {
238
+ if (knownAssets.has(asset)) {
239
+ assets.push(asset);
240
+ }
241
+ else {
242
+ vaultAssets.push(asset);
243
+ }
244
+ }
245
+ return { assets, vaultAssets };
246
+ }
247
+ function updateOnchainInternalData(prices, onchainData) {
248
+ for (const [asset, data] of Object.entries(onchainData)) {
249
+ if (data.sourceType === redstone_onchain_oracle_1.RedstoneOnchainOracle.SourceType.internal) {
250
+ prices[asset] = {
251
+ type: type_1.AssetType.Native,
252
+ price: data.price,
253
+ timestamp: Date.now(),
254
+ };
255
+ }
256
+ }
257
+ return prices;
258
+ }
259
+ // ============================================================
260
+ // Oracle Params Cell Building
261
+ // ============================================================
262
+ /**
263
+ * Build oracle params Cell from pre-fetched Redstone payload
264
+ * Pure computation - no network calls
265
+ */
266
+ function buildOracleParamsCellFromPayload(assets, oracleConfig, payload, pools, vaults) {
267
+ const requestParams = redstone_onchain_oracle_1.RedstoneOnchainOracle.getOracleRequestParams(assets, oracleConfig);
268
+ const requestAssetCell = redstone_onchain_oracle_1.RedstoneOnchainOracle.createAddressToTupleCell(requestParams.requestAssets);
269
+ const dataFeedIdsTupleBuilder = new core_1.TupleBuilder();
270
+ requestParams.feedIds.forEach((item) => dataFeedIdsTupleBuilder.writeNumber(item));
271
+ const feedIdCell = (0, core_1.serializeTuple)(dataFeedIdsTupleBuilder.build());
272
+ const requestFactorialPoolsCell = pools.length > 0 ? redstone_onchain_oracle_1.RedstoneOnchainOracle.createAddressToTupleCell(pools.map((p) => core_1.Address.parse(p))) : null;
273
+ const requestFactorialVaultsCell = vaults.length > 0 ? redstone_onchain_oracle_1.RedstoneOnchainOracle.createAddressToTupleCell(vaults.map((v) => core_1.Address.parse(v))) : null;
274
+ const requestFactorialCell = (0, core_1.beginCell)()
275
+ .storeMaybeRef(requestFactorialPoolsCell)
276
+ .storeMaybeRef(requestFactorialVaultsCell)
277
+ .endCell();
278
+ return (0, core_1.beginCell)()
279
+ .storeRef(feedIdCell)
280
+ .storeRef(payload)
281
+ .storeRef(requestAssetCell)
282
+ .storeRef(requestFactorialCell)
283
+ .endCell();
284
+ }
285
+ /**
286
+ * Build oracle params Cell - fetches Redstone payload and builds Cell
287
+ */
288
+ async function buildOracleParamsCell(assets, oracleConfig, pools, vaults) {
289
+ const requestParams = redstone_onchain_oracle_1.RedstoneOnchainOracle.getOracleRequestParams(assets, oracleConfig);
290
+ // Fetch Redstone payload
291
+ const helper = (0, redstoneHelper_1.createRedstoneHelper)("prod");
292
+ const payload = await helper.createPayload(requestParams.redstoneAssetNames);
293
+ // Pure computation
294
+ return buildOracleParamsCellFromPayload(assets, oracleConfig, payload, pools, vaults);
295
+ }
@@ -0,0 +1,45 @@
1
+ import { AddressLike } from "../../contracts/common/type";
2
+ import { StrategyVaultState } from "../../contracts/vault/strategy-vault";
3
+ import { Prices, CompositeOracleResult, CompositeOracleInput } from "./types";
4
+ import { CompositeOracleFetcher } from "./query";
5
+ export * from "./types";
6
+ export * from "./computation";
7
+ export { CompositeOracleFetcher, OracleContext } from "./query";
8
+ export declare class CompositeOracleV1 extends CompositeOracleFetcher {
9
+ /**
10
+ * Fetch all data needed for price computation
11
+ * Call once, compute multiple times
12
+ */
13
+ fetchAll(vaultAddress: AddressLike, vaultData?: StrategyVaultState, extraAssets?: {
14
+ assets: string[];
15
+ vaultAssets: string[];
16
+ }): Promise<CompositeOracleInput & {
17
+ oracleConfig: any;
18
+ }>;
19
+ /**
20
+ * Compute prices from pre-fetched data (pure computation, no I/O)
21
+ */
22
+ compute(input: CompositeOracleInput): CompositeOracleResult;
23
+ /**
24
+ * Get vault price (convenience method: fetch + compute)
25
+ */
26
+ getVaultPrice(vaultAddress: AddressLike, vaultData?: StrategyVaultState): Promise<bigint>;
27
+ /**
28
+ * Get vault price with full details (convenience method: fetch + compute)
29
+ */
30
+ getVaultPriceWithDetails(vaultAddress: AddressLike, vaultData?: StrategyVaultState): Promise<CompositeOracleResult & {
31
+ targetVaultAddress: string;
32
+ price: bigint;
33
+ }>;
34
+ /**
35
+ * Get all asset prices (convenience method: fetch + compute)
36
+ */
37
+ getAllAssetPrices(vaultAddress: AddressLike, vaultData?: StrategyVaultState): Promise<Prices>;
38
+ /**
39
+ * Get total vault value (convenience method: fetch + compute)
40
+ */
41
+ getTotalValue(vaultAddress: AddressLike, vaultData?: StrategyVaultState): Promise<bigint>;
42
+ static compute(input: CompositeOracleInput): CompositeOracleResult;
43
+ static getVaultPriceFromInput(input: CompositeOracleInput, vaultAddress: string): bigint;
44
+ static getTotalValueFromInput(input: CompositeOracleInput, vaultAddress: string): bigint;
45
+ }
@@ -0,0 +1,110 @@
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.CompositeOracleV1 = exports.CompositeOracleFetcher = void 0;
18
+ const utils_1 = require("../../contracts/common/utils");
19
+ const types_1 = require("./types");
20
+ const computation_1 = require("./computation");
21
+ const query_1 = require("./query");
22
+ __exportStar(require("./types"), exports);
23
+ __exportStar(require("./computation"), exports);
24
+ var query_2 = require("./query");
25
+ Object.defineProperty(exports, "CompositeOracleFetcher", { enumerable: true, get: function () { return query_2.CompositeOracleFetcher; } });
26
+ class CompositeOracleV1 extends query_1.CompositeOracleFetcher {
27
+ /**
28
+ * Fetch all data needed for price computation
29
+ * Call once, compute multiple times
30
+ */
31
+ async fetchAll(vaultAddress, vaultData, extraAssets) {
32
+ const ctx = await this.getOracleContext(vaultAddress, vaultData, extraAssets);
33
+ const { rawPrices, onchainData: redstoneSyntheticData } = await this.fetchRawPrices(ctx.allRequiredAssets, ctx.oracleConfig);
34
+ const additionalSyntheticData = await this.fetchOnchainData(ctx.oracleConfig.assetOnchainDataInfo ?? {});
35
+ const syntheticCompositions = { ...redstoneSyntheticData, ...additionalSyntheticData };
36
+ (0, computation_1.updateOnchainInternalData)(rawPrices, ctx.oracleConfig.assetOnchainDataInfo ?? {});
37
+ const poolInfos = await this.fetchPoolInfos(ctx.exposures.pools);
38
+ return {
39
+ rawPrices,
40
+ syntheticCompositions,
41
+ vaultPositions: ctx.vaultPositions,
42
+ poolInfos,
43
+ oracleConfig: ctx.oracleConfig,
44
+ };
45
+ }
46
+ /**
47
+ * Compute prices from pre-fetched data (pure computation, no I/O)
48
+ */
49
+ compute(input) {
50
+ return (0, computation_1.computeCompositePrices)(input);
51
+ }
52
+ /**
53
+ * Get vault price (convenience method: fetch + compute)
54
+ */
55
+ async getVaultPrice(vaultAddress, vaultData) {
56
+ const input = await this.fetchAll(vaultAddress, vaultData);
57
+ const result = this.compute(input);
58
+ return result.vaultPrices[(0, utils_1.toAddress)(vaultAddress).toString()]?.price ?? 0n;
59
+ }
60
+ /**
61
+ * Get vault price with full details (convenience method: fetch + compute)
62
+ */
63
+ async getVaultPriceWithDetails(vaultAddress, vaultData) {
64
+ const input = await this.fetchAll(vaultAddress, vaultData);
65
+ const result = this.compute(input);
66
+ const targetVaultAddress = (0, utils_1.toAddress)(vaultAddress).toString();
67
+ const price = result.vaultPrices[targetVaultAddress]?.price ?? 0n;
68
+ return { ...result, targetVaultAddress, price };
69
+ }
70
+ /**
71
+ * Get all asset prices (convenience method: fetch + compute)
72
+ */
73
+ async getAllAssetPrices(vaultAddress, vaultData) {
74
+ const input = await this.fetchAll(vaultAddress, vaultData);
75
+ const result = this.compute(input);
76
+ return result.allPrices;
77
+ }
78
+ /**
79
+ * Get total vault value (convenience method: fetch + compute)
80
+ */
81
+ async getTotalValue(vaultAddress, vaultData) {
82
+ const input = await this.fetchAll(vaultAddress, vaultData);
83
+ const result = this.compute(input);
84
+ const targetVaultAddress = (0, utils_1.toAddress)(vaultAddress).toString();
85
+ const vaultPriceEntry = result.vaultPrices[targetVaultAddress];
86
+ if (!vaultPriceEntry || vaultPriceEntry.additionalData.totalSupply === 0n) {
87
+ return 0n;
88
+ }
89
+ return (vaultPriceEntry.price * vaultPriceEntry.additionalData.totalSupply) / types_1.DECIMALS_OF_PRICE;
90
+ }
91
+ // ============================================================
92
+ // Static computation methods (no instance needed)
93
+ // ============================================================
94
+ static compute(input) {
95
+ return (0, computation_1.computeCompositePrices)(input);
96
+ }
97
+ static getVaultPriceFromInput(input, vaultAddress) {
98
+ const result = (0, computation_1.computeCompositePrices)(input);
99
+ return result.vaultPrices[vaultAddress]?.price ?? 0n;
100
+ }
101
+ static getTotalValueFromInput(input, vaultAddress) {
102
+ const result = (0, computation_1.computeCompositePrices)(input);
103
+ const vaultPriceEntry = result.vaultPrices[vaultAddress];
104
+ if (!vaultPriceEntry || vaultPriceEntry.additionalData.totalSupply === 0n) {
105
+ return 0n;
106
+ }
107
+ return (vaultPriceEntry.price * vaultPriceEntry.additionalData.totalSupply) / types_1.DECIMALS_OF_PRICE;
108
+ }
109
+ }
110
+ exports.CompositeOracleV1 = CompositeOracleV1;
@@ -0,0 +1,36 @@
1
+ import { Address } from "@ton/core";
2
+ import { AffluentContext } from "../../context";
3
+ import { AddressLike } from "../../contracts/common/type";
4
+ import { OnchainDataInfo } from "../../contracts/oracle/redstone-onchain-oracle/type";
5
+ import { StrategyVaultState } from "../../contracts/vault/strategy-vault";
6
+ import { Prices, OnchainDataMap, VaultPositions, PoolInfos } from "./types";
7
+ export type OracleContext = {
8
+ vaultData: StrategyVaultState;
9
+ oracleConfig: any;
10
+ assets: string[];
11
+ vaultAssets: string[];
12
+ vaultPositions: VaultPositions;
13
+ exposures: {
14
+ assets: string[];
15
+ pools: string[];
16
+ };
17
+ allRequiredAssets: string[];
18
+ };
19
+ export declare class CompositeOracleFetcher {
20
+ protected ctx: AffluentContext;
21
+ constructor(ctx?: AffluentContext);
22
+ /**
23
+ * Get oracle context - shared data needed for both price computation and on-chain params
24
+ */
25
+ getOracleContext(vaultAddress: AddressLike, vaultData?: StrategyVaultState, extraAssets?: {
26
+ assets: string[];
27
+ vaultAssets: string[];
28
+ }): Promise<OracleContext>;
29
+ fetchRawPrices(assets: string[], oracleConfig: any): Promise<{
30
+ rawPrices: Prices;
31
+ onchainData: OnchainDataMap;
32
+ }>;
33
+ fetchOnchainData(onchainDataInfo: OnchainDataInfo): Promise<OnchainDataMap>;
34
+ fetchVaultPositions(vaultAddresses: (Address | string)[]): Promise<VaultPositions>;
35
+ fetchPoolInfos(poolAddresses: string[]): Promise<PoolInfos>;
36
+ }