@affluent-org/sdk 0.0.4 → 0.0.5

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 (29) hide show
  1. package/dist/common/transform.d.ts +93 -0
  2. package/dist/common/transform.js +351 -0
  3. package/dist/common/types.d.ts +144 -0
  4. package/dist/common/types.js +11 -0
  5. package/dist/contracts/oracle/redstone-onchain-oracle/type.d.ts +1 -1
  6. package/dist/services/composite-oracle/codec.d.ts +76 -0
  7. package/dist/services/composite-oracle/codec.js +281 -0
  8. package/dist/services/composite-oracle/computation.d.ts +9 -15
  9. package/dist/services/composite-oracle/computation.js +44 -36
  10. package/dist/services/composite-oracle/index.d.ts +2 -2
  11. package/dist/services/composite-oracle/index.js +2 -2
  12. package/dist/services/composite-oracle/query.d.ts +6 -6
  13. package/dist/services/composite-oracle/query.js +7 -46
  14. package/dist/services/pool/computation.d.ts +3 -9
  15. package/dist/services/pool/computation.js +16 -30
  16. package/dist/services/pool/oracle.d.ts +2 -2
  17. package/dist/services/pool/query.d.ts +1 -1
  18. package/dist/services/rfq-auction/oracle.d.ts +2 -2
  19. package/dist/services/rfq-batch/oracle.d.ts +2 -2
  20. package/dist/services/share-vault/index.d.ts +2 -32
  21. package/dist/services/share-vault/query.d.ts +5 -32
  22. package/dist/services/share-vault/query.js +25 -12
  23. package/dist/services/strategy-vault/index.d.ts +9 -134
  24. package/dist/services/strategy-vault/index.js +5 -1
  25. package/dist/services/strategy-vault/oracle.d.ts +3 -3
  26. package/dist/services/strategy-vault/query.d.ts +14 -143
  27. package/dist/services/strategy-vault/query.js +28 -40
  28. package/dist/utils/risk_calculator/risk_calculator.d.ts +3 -3
  29. package/package.json +1 -1
@@ -0,0 +1,281 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VaultNativeDecomposedValueContext = exports.VaultValueContext = exports.VaultAmountContext = exports.VaultStateContext = exports.PoolContext = exports.PoolAsset = exports.AmountPosition = exports.ValuePosition = exports.SharePosition = exports.Position = void 0;
4
+ const pool_1 = require("../../contracts/core/pool");
5
+ const types_1 = require("./types");
6
+ class Position {
7
+ supply;
8
+ borrow;
9
+ constructor(supply, borrow) {
10
+ this.supply = supply;
11
+ this.borrow = borrow;
12
+ }
13
+ apply(supply, borrow) {
14
+ this.supply += supply;
15
+ this.borrow += borrow;
16
+ return this;
17
+ }
18
+ applyPosition(position) {
19
+ this.supply += position.supply;
20
+ this.borrow += position.borrow;
21
+ return this;
22
+ }
23
+ clone() {
24
+ return new this.constructor(this.supply, this.borrow);
25
+ }
26
+ }
27
+ exports.Position = Position;
28
+ class SharePosition extends Position {
29
+ toAmountPosition(PoolContext) {
30
+ return new AmountPosition((0, pool_1.shareToAmount)(this.supply, PoolContext.amount.supply, PoolContext.share.supply), (0, pool_1.shareToAmount)(this.borrow, PoolContext.amount.borrow, PoolContext.share.borrow));
31
+ }
32
+ }
33
+ exports.SharePosition = SharePosition;
34
+ class ValuePosition extends Position {
35
+ // TODO: price?
36
+ net() {
37
+ return this.supply - this.borrow;
38
+ }
39
+ }
40
+ exports.ValuePosition = ValuePosition;
41
+ class AmountPosition extends ValuePosition {
42
+ toValuePosition(price) {
43
+ return new ValuePosition(this.supply * price, this.borrow * price);
44
+ }
45
+ net() {
46
+ return this.supply - this.borrow;
47
+ }
48
+ }
49
+ exports.AmountPosition = AmountPosition;
50
+ class PoolAsset {
51
+ amount;
52
+ share;
53
+ constructor(amount, share) {
54
+ this.amount = amount;
55
+ this.share = share;
56
+ }
57
+ }
58
+ exports.PoolAsset = PoolAsset;
59
+ ;
60
+ class PoolContext {
61
+ address;
62
+ assets;
63
+ constructor(address, assets = {}) {
64
+ this.address = address;
65
+ this.assets = assets;
66
+ }
67
+ static fromPoolState(poolState) {
68
+ const assets = {};
69
+ Object.entries(poolState.assets)
70
+ .forEach(([asset, assetState]) => {
71
+ assets[asset] = {
72
+ amount: new AmountPosition(assetState.totalSupplyAmount, assetState.totalBorrowAmount),
73
+ share: new SharePosition(assetState.totalSupplyShare, assetState.totalBorrowShare),
74
+ };
75
+ });
76
+ return new this(poolState.address.toString(), assets);
77
+ }
78
+ }
79
+ exports.PoolContext = PoolContext;
80
+ class VaultStateContext {
81
+ address;
82
+ totalSupply;
83
+ assets;
84
+ pools;
85
+ constructor(address, totalSupply, assets, // amount
86
+ pools // share
87
+ ) {
88
+ this.address = address;
89
+ this.totalSupply = totalSupply;
90
+ this.assets = assets;
91
+ this.pools = pools;
92
+ }
93
+ static fromShareVaultState(vaultState) {
94
+ const asset = vaultState.asset.toString();
95
+ const assets = {
96
+ [asset]: new AmountPosition(vaultState.cash, 0n),
97
+ };
98
+ const pools = {};
99
+ Object.entries(vaultState.whitelistedPools)
100
+ .forEach(([pool, poolState]) => {
101
+ pools[pool] = {
102
+ [asset]: new SharePosition(poolState.supply, 0n),
103
+ };
104
+ });
105
+ return new this(vaultState.address.toString(), vaultState.totalSupply, assets, pools);
106
+ }
107
+ static fromStrategyVaultState(vaultState) {
108
+ const assets = {};
109
+ Object.entries(vaultState.assets)
110
+ .forEach(([asset, assetState]) => {
111
+ assets[asset] = new AmountPosition(assetState.cash, 0n);
112
+ });
113
+ const pools = {};
114
+ Object.entries(vaultState.factorialPools)
115
+ .forEach(([pool, poolState]) => {
116
+ const poolEntry = {};
117
+ Object.entries(poolState)
118
+ .forEach(([asset, assetState]) => {
119
+ poolEntry[asset] = new SharePosition(assetState.supply, assetState.borrow);
120
+ });
121
+ pools[pool] = poolEntry;
122
+ });
123
+ return new this(vaultState.address.toString(), vaultState.totalSupply, assets, pools);
124
+ }
125
+ toAmountContext(poolContexts) {
126
+ return VaultAmountContext.fromVaultStateContext(this, poolContexts);
127
+ }
128
+ }
129
+ exports.VaultStateContext = VaultStateContext;
130
+ class VaultAmountContext {
131
+ address;
132
+ totalSupply;
133
+ assets;
134
+ pools;
135
+ constructor(address, totalSupply, assets, pools) {
136
+ this.address = address;
137
+ this.totalSupply = totalSupply;
138
+ this.assets = assets;
139
+ this.pools = pools;
140
+ }
141
+ static fromVaultStateContext(VaultStateContext, poolContexts) {
142
+ const assets = {};
143
+ Object.entries(VaultStateContext.assets)
144
+ .forEach(([asset, amount]) => assets[asset] = amount.clone());
145
+ const pools = {};
146
+ Object.entries(VaultStateContext.pools)
147
+ .forEach(([pool, poolState]) => {
148
+ const poolEntry = {};
149
+ Object.entries(poolState)
150
+ .forEach(([asset, assetState]) => {
151
+ poolEntry[asset] = new AmountPosition((0, pool_1.shareToAmount)(assetState.supply, poolContexts[pool].assets[asset].amount.supply, poolContexts[pool].assets[asset].share.supply), (0, pool_1.shareToAmount)(assetState.borrow, poolContexts[pool].assets[asset].amount.borrow, poolContexts[pool].assets[asset].share.borrow));
152
+ });
153
+ pools[pool] = poolEntry;
154
+ });
155
+ return new this(VaultStateContext.address, VaultStateContext.totalSupply, assets, pools);
156
+ }
157
+ toValueContext(prices) {
158
+ return VaultValueContext.fromAmountContext(this, prices);
159
+ }
160
+ net() {
161
+ const net = {};
162
+ Object.entries(this.assets)
163
+ .forEach(([asset, position]) => {
164
+ net[asset] = position.clone();
165
+ });
166
+ Object.entries(this.pools)
167
+ .forEach(([pool, poolState]) => {
168
+ Object.entries(poolState)
169
+ .forEach(([asset, assetState]) => {
170
+ net[asset] = (net[asset] ?? new ValuePosition(0n, 0n)).applyPosition(assetState);
171
+ });
172
+ });
173
+ return net;
174
+ }
175
+ }
176
+ exports.VaultAmountContext = VaultAmountContext;
177
+ class VaultValueContext {
178
+ address;
179
+ assets;
180
+ pools;
181
+ constructor(address, assets, pools) {
182
+ this.address = address;
183
+ this.assets = assets;
184
+ this.pools = pools;
185
+ }
186
+ static fromAmountContext(amountContext, prices) {
187
+ const assets = {};
188
+ Object.entries(amountContext.assets)
189
+ .forEach(([asset, position]) => assets[asset] = position.toValuePosition(prices[asset].price));
190
+ const pools = {};
191
+ Object.entries(amountContext.pools)
192
+ .forEach(([pool, poolState]) => {
193
+ const poolEntry = {};
194
+ Object.entries(poolState)
195
+ .forEach(([asset, assetState]) => poolEntry[asset] = assetState.toValuePosition(prices[asset].price));
196
+ pools[pool] = poolEntry;
197
+ });
198
+ return new this(amountContext.address, assets, pools);
199
+ }
200
+ get totalValue() {
201
+ let totalValue = 0n;
202
+ Object.entries(this.assets)
203
+ .forEach(([asset, position]) => {
204
+ totalValue += position.supply;
205
+ });
206
+ Object.entries(this.pools)
207
+ .forEach(([pool, poolState]) => {
208
+ Object.entries(poolState)
209
+ .forEach(([asset, assetState]) => {
210
+ totalValue += assetState.supply - assetState.borrow;
211
+ });
212
+ });
213
+ return totalValue;
214
+ }
215
+ net() {
216
+ const net = {};
217
+ Object.entries(this.assets)
218
+ .forEach(([asset, position]) => {
219
+ net[asset] = position.clone();
220
+ });
221
+ Object.entries(this.pools)
222
+ .forEach(([pool, poolState]) => {
223
+ Object.entries(poolState)
224
+ .forEach(([asset, assetState]) => {
225
+ net[asset] = (net[asset] ?? new ValuePosition(0n, 0n)).applyPosition(assetState);
226
+ });
227
+ });
228
+ return net;
229
+ }
230
+ nativeDecompose(prices) {
231
+ return VaultNativeDecomposedValueContext.fromValueContext(this, prices);
232
+ }
233
+ }
234
+ exports.VaultValueContext = VaultValueContext;
235
+ class VaultNativeDecomposedValueContext extends VaultValueContext {
236
+ static fromValueContext(valueContext, prices) {
237
+ const assetsNativePositions = {};
238
+ VaultNativeDecomposedValueContext.decomposeContext(valueContext.assets, prices, assetsNativePositions);
239
+ const poolsNativePositions = {};
240
+ Object.entries(valueContext.pools)
241
+ .forEach(([pool, poolPosition]) => {
242
+ const nativePoolPosition = {};
243
+ VaultNativeDecomposedValueContext.decomposeContext(poolPosition, prices, nativePoolPosition);
244
+ poolsNativePositions[pool] = nativePoolPosition;
245
+ });
246
+ return new this(valueContext.address, assetsNativePositions, poolsNativePositions);
247
+ }
248
+ static decomposeContext(valueContext, prices, nativeAssets) {
249
+ Object.entries(valueContext)
250
+ .forEach(([asset, position]) => {
251
+ const price = prices[asset];
252
+ if (price.type === types_1.CompositeAssetType.NATIVE) {
253
+ nativeAssets[asset] = (nativeAssets[asset] ?? new ValuePosition(0n, 0n)).applyPosition(position);
254
+ }
255
+ else if (price.type === types_1.CompositeAssetType.SYNTHETIC1) {
256
+ if (prices[price.additionalData.underlying].type !== types_1.CompositeAssetType.NATIVE)
257
+ throw new Error(`Invalid underlying asset type: ${price.additionalData.underlying}`);
258
+ nativeAssets[price.additionalData.underlying] = (nativeAssets[price.additionalData.underlying] ?? new ValuePosition(0n, 0n))
259
+ .apply(position.supply * price.additionalData.reserve / price.additionalData.totalSupply, position.borrow * price.additionalData.reserve / price.additionalData.totalSupply);
260
+ }
261
+ else if (price.type === types_1.CompositeAssetType.SYNTHETIC2) {
262
+ if (prices[price.additionalData0.underlying].type !== types_1.CompositeAssetType.NATIVE)
263
+ throw new Error(`Invalid underlying asset type: ${price.additionalData0.underlying}`);
264
+ if (prices[price.additionalData1.underlying].type !== types_1.CompositeAssetType.NATIVE)
265
+ throw new Error(`Invalid underlying asset type: ${price.additionalData1.underlying}`);
266
+ nativeAssets[price.additionalData0.underlying] = (nativeAssets[price.additionalData0.underlying] ?? new ValuePosition(0n, 0n))
267
+ .apply(position.supply * price.additionalData0.reserve / price.additionalData0.totalSupply, position.borrow * price.additionalData0.reserve / price.additionalData0.totalSupply);
268
+ nativeAssets[price.additionalData1.underlying] = (nativeAssets[price.additionalData1.underlying] ?? new ValuePosition(0n, 0n))
269
+ .apply(position.supply * price.additionalData1.reserve / price.additionalData1.totalSupply, position.borrow * price.additionalData1.reserve / price.additionalData1.totalSupply);
270
+ }
271
+ else if (price.type === types_1.CompositeAssetType.VAULT) {
272
+ VaultNativeDecomposedValueContext.decomposeContext(valueContext, prices, nativeAssets);
273
+ }
274
+ else {
275
+ throw new Error(`Invalid asset type: ${price}`);
276
+ }
277
+ });
278
+ return nativeAssets;
279
+ }
280
+ }
281
+ exports.VaultNativeDecomposedValueContext = VaultNativeDecomposedValueContext;
@@ -1,6 +1,6 @@
1
1
  import { Cell } from "@ton/core";
2
- import { Prices, SyntheticCompositions, VaultPosition, VaultPositions, PoolInfos, VaultPrices, CompositeOracleResult, CompositeOracleInput } from "./types";
3
- import { AssetPriceInfo, OnchainDataInfo } from "../../contracts/oracle/redstone-onchain-oracle/type";
2
+ import { Prices, SyntheticCompositions, VaultPrices, CompositeOracleResult, CompositeOracleInput, IVaultStateContext, IPoolSharePositions, IPoolContext, IAmountPosition } from "../../common/types";
3
+ import { AssetPrices, OnchainDataInfo } from "../../contracts/oracle/redstone-onchain-oracle/type";
4
4
  export type OracleExposures = {
5
5
  assets: Set<string>;
6
6
  pools: Set<string>;
@@ -10,25 +10,19 @@ export type OracleExposures = {
10
10
  export declare function createOracleExposures(): OracleExposures;
11
11
  export declare function applyPrice(amount: bigint, price: bigint): bigint;
12
12
  export declare function calculateSyntheticPrices(rawPrices: Prices, syntheticCompositions: SyntheticCompositions): Prices;
13
- export declare function computePoolPositionsValue(poolPositions: VaultPosition["poolPositions"], poolInfos: PoolInfos, prices: Prices): {
13
+ export declare function computePoolPositionsValue(poolPositions: IPoolSharePositions, poolInfos: Record<string, IPoolContext>, prices: Prices): {
14
14
  totalValue: bigint;
15
- decomposed: Record<string, {
16
- supply: bigint;
17
- borrow: bigint;
18
- }>;
15
+ decomposed: Record<string, IAmountPosition>;
19
16
  assetAmounts: Record<string, bigint>;
20
17
  };
21
- export declare function computeVaultValue(vault: VaultPosition, poolInfos: PoolInfos, prices: Prices): {
18
+ export declare function computeVaultValue(vault: IVaultStateContext, poolInfos: Record<string, IPoolContext>, prices: Prices): {
22
19
  totalValue: bigint;
23
20
  price: bigint;
24
- decomposed: Record<string, {
25
- supply: bigint;
26
- borrow: bigint;
27
- }>;
21
+ decomposed: Record<string, IAmountPosition>;
28
22
  };
29
- export declare function calculateVaultPrices(vaultPositions: VaultPositions, poolInfos: PoolInfos, assetPrices: Prices): VaultPrices;
23
+ export declare function calculateVaultPrices(vaultPositions: Record<string, IVaultStateContext>, poolInfos: Record<string, IPoolContext>, assetPrices: Prices): VaultPrices;
30
24
  export declare function computeCompositePrices(input: CompositeOracleInput): CompositeOracleResult;
31
- export declare function getExposures(vaultPositions: VaultPositions): {
25
+ export declare function getExposures(vaultPositions: Record<string, IVaultStateContext>): {
32
26
  assets: string[];
33
27
  pools: string[];
34
28
  };
@@ -43,7 +37,7 @@ export declare function separateAssets(allAssets: string[], oracleConfig: {
43
37
  assets: string[];
44
38
  vaultAssets: string[];
45
39
  };
46
- export declare function updateOnchainInternalData(prices: AssetPriceInfo, onchainData: OnchainDataInfo): AssetPriceInfo;
40
+ export declare function updateOnchainInternalData(prices: AssetPrices, onchainData: OnchainDataInfo): AssetPrices;
47
41
  /**
48
42
  * Build oracle params Cell from pre-fetched Redstone payload
49
43
  * Pure computation - no network calls
@@ -13,11 +13,11 @@ exports.updateOnchainInternalData = updateOnchainInternalData;
13
13
  exports.buildOracleParamsCellFromPayload = buildOracleParamsCellFromPayload;
14
14
  exports.buildOracleParamsCell = buildOracleParamsCell;
15
15
  const core_1 = require("@ton/core");
16
- const types_1 = require("./types");
17
- const pool_1 = require("../../contracts/core/pool");
16
+ const types_1 = require("../../common/types");
18
17
  const type_1 = require("../../contracts/oracle/redstone-onchain-oracle/type");
19
18
  const redstone_onchain_oracle_1 = require("../../contracts/oracle/redstone-onchain-oracle");
20
19
  const redstoneHelper_1 = require("../../utils/oracle/redstone/redstoneHelper");
20
+ const utils_1 = require("../../contracts/common/utils");
21
21
  function createOracleExposures() {
22
22
  return {
23
23
  assets: new Set(),
@@ -43,6 +43,11 @@ function calculateSyntheticPrices(rawPrices, syntheticCompositions) {
43
43
  prices[assetAddress] = {
44
44
  type: types_1.CompositeAssetType.SYNTHETIC1,
45
45
  price: (underlyingPrice.price * data.underlyingReserve) / data.totalSupply,
46
+ additionalData: {
47
+ underlying: (0, utils_1.toAddress)(data.underlyingAddress).toString(),
48
+ reserve: data.underlyingReserve,
49
+ totalSupply: data.totalSupply,
50
+ },
46
51
  };
47
52
  }
48
53
  else {
@@ -53,11 +58,21 @@ function calculateSyntheticPrices(rawPrices, syntheticCompositions) {
53
58
  const price0 = prices[data.underlying0Address.toString()];
54
59
  const price1 = prices[data.underlying1Address.toString()];
55
60
  if (price0 && price1) {
56
- const value0 = (price0.price * data.underlying0Reserve) / data.totalSupply;
57
- const value1 = (price1.price * data.underlying1Reserve) / data.totalSupply;
61
+ const value0 = price0.price * data.underlying0Reserve;
62
+ const value1 = price1.price * data.underlying1Reserve;
58
63
  prices[assetAddress] = {
59
64
  type: types_1.CompositeAssetType.SYNTHETIC2,
60
- price: value0 + value1,
65
+ price: (value0 + value1) / data.totalSupply,
66
+ additionalData0: {
67
+ underlying: (0, utils_1.toAddress)(data.underlying0Address).toString(),
68
+ reserve: data.underlying0Reserve,
69
+ totalSupply: data.totalSupply,
70
+ },
71
+ additionalData1: {
72
+ underlying: (0, utils_1.toAddress)(data.underlying1Address).toString(),
73
+ reserve: data.underlying1Reserve,
74
+ totalSupply: data.totalSupply,
75
+ },
61
76
  };
62
77
  }
63
78
  else {
@@ -81,21 +96,19 @@ function computePoolPositionsValue(poolPositions, poolInfos, prices) {
81
96
  if (!poolInfo)
82
97
  continue;
83
98
  for (const [assetAddress, position] of Object.entries(assetPositions)) {
84
- const assetInfo = poolInfo[assetAddress];
99
+ const assetInfo = poolInfo.assets[assetAddress];
85
100
  if (!assetInfo)
86
101
  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;
102
+ const amounts = position.toAmountPosition(assetInfo);
103
+ if (decomposed[assetAddress])
104
+ decomposed[assetAddress].applyPosition(amounts);
105
+ else
106
+ decomposed[assetAddress] = amounts.clone();
107
+ const netAmount = amounts.net();
94
108
  assetAmounts[assetAddress] = (assetAmounts[assetAddress] ?? 0n) + netAmount;
95
109
  const price = prices[assetAddress];
96
- if (price) {
110
+ if (price)
97
111
  totalValue += applyPrice(netAmount, price.price);
98
- }
99
112
  }
100
113
  }
101
114
  return { totalValue, decomposed, assetAmounts };
@@ -105,20 +118,17 @@ function computeVaultValue(vault, poolInfos, prices) {
105
118
  const decomposed = {};
106
119
  for (const [assetAddress, amount] of Object.entries(vault.assets)) {
107
120
  const price = prices[assetAddress];
108
- if (price && amount > 0n) {
109
- cashValue += applyPrice(amount, price.price);
121
+ if (price && amount.supply > 0n) {
122
+ cashValue += applyPrice(amount.supply, price.price);
110
123
  }
111
- decomposed[assetAddress] = { supply: amount, borrow: 0n };
124
+ decomposed[assetAddress] = amount.clone();
112
125
  }
113
- const poolResult = computePoolPositionsValue(vault.poolPositions, poolInfos, prices);
126
+ const poolResult = computePoolPositionsValue(vault.pools, poolInfos, prices);
114
127
  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
- }
128
+ if (decomposed[assetAddress])
129
+ decomposed[assetAddress].applyPosition(amounts);
130
+ else
131
+ decomposed[assetAddress] = amounts.clone();
122
132
  }
123
133
  const totalValue = cashValue + poolResult.totalValue;
124
134
  const price = vault.totalSupply === 0n ? 0n : (totalValue * types_1.DECIMALS_OF_PRICE) / vault.totalSupply;
@@ -136,11 +146,11 @@ function calculateVaultPrices(vaultPositions, poolInfos, assetPrices) {
136
146
  try {
137
147
  const requiredAssets = new Set();
138
148
  for (const assetAddress of Object.keys(vault.assets)) {
139
- if (vault.assets[assetAddress] > 0n) {
149
+ if (vault.assets[assetAddress].supply > 0n) {
140
150
  requiredAssets.add(assetAddress);
141
151
  }
142
152
  }
143
- for (const poolPositions of Object.values(vault.poolPositions)) {
153
+ for (const poolPositions of Object.values(vault.pools)) {
144
154
  for (const [assetAddress, position] of Object.entries(poolPositions)) {
145
155
  if (position.supply > 0n || position.borrow > 0n) {
146
156
  requiredAssets.add(assetAddress);
@@ -157,7 +167,7 @@ function calculateVaultPrices(vaultPositions, poolInfos, assetPrices) {
157
167
  if (!allPricesAvailable)
158
168
  continue;
159
169
  const result = computeVaultValue(vault, poolInfos, combinedPrices);
160
- vaultPrices[vaultAddress] = {
170
+ const vaultPriceEntry = {
161
171
  type: types_1.CompositeAssetType.VAULT,
162
172
  price: result.price,
163
173
  additionalData: {
@@ -165,10 +175,8 @@ function calculateVaultPrices(vaultPositions, poolInfos, assetPrices) {
165
175
  totalSupply: vault.totalSupply,
166
176
  },
167
177
  };
168
- combinedPrices[vaultAddress] = {
169
- type: types_1.CompositeAssetType.VAULT,
170
- price: result.price,
171
- };
178
+ vaultPrices[vaultAddress] = vaultPriceEntry;
179
+ combinedPrices[vaultAddress] = vaultPriceEntry;
172
180
  delete pendingVaults[vaultAddress];
173
181
  resolved = true;
174
182
  }
@@ -197,7 +205,7 @@ function computeCompositePrices(input) {
197
205
  const vaultPrices = calculateVaultPrices(input.vaultPositions, input.poolInfos, assetPrices);
198
206
  const allPrices = { ...assetPrices };
199
207
  for (const [address, entry] of Object.entries(vaultPrices)) {
200
- allPrices[address] = { type: entry.type, price: entry.price };
208
+ allPrices[address] = entry;
201
209
  }
202
210
  return { assetPrices, vaultPrices, allPrices };
203
211
  }
@@ -206,10 +214,10 @@ function getExposures(vaultPositions) {
206
214
  const pools = new Set();
207
215
  for (const vault of Object.values(vaultPositions)) {
208
216
  for (const [asset, amount] of Object.entries(vault.assets)) {
209
- if (amount > 0n)
217
+ if (amount.supply > 0n)
210
218
  assets.add(asset);
211
219
  }
212
- for (const [poolAddress, poolPositions] of Object.entries(vault.poolPositions)) {
220
+ for (const [poolAddress, poolPositions] of Object.entries(vault.pools)) {
213
221
  for (const [asset, position] of Object.entries(poolPositions)) {
214
222
  if (position.supply > 0n || position.borrow > 0n) {
215
223
  pools.add(poolAddress);
@@ -1,8 +1,8 @@
1
1
  import { AddressLike } from "../../contracts/common/type";
2
2
  import { StrategyVaultState } from "../../contracts/vault/strategy-vault";
3
- import { Prices, CompositeOracleResult, CompositeOracleInput } from "./types";
3
+ import { Prices, CompositeOracleResult, CompositeOracleInput } from "../../common/types";
4
4
  import { CompositeOracleFetcher } from "./query";
5
- export * from "./types";
5
+ export * from "../../common/types";
6
6
  export * from "./computation";
7
7
  export { CompositeOracleFetcher, OracleContext } from "./query";
8
8
  export declare class CompositeOracleV1 extends CompositeOracleFetcher {
@@ -16,10 +16,10 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  exports.CompositeOracleV1 = exports.CompositeOracleFetcher = void 0;
18
18
  const utils_1 = require("../../contracts/common/utils");
19
- const types_1 = require("./types");
19
+ const types_1 = require("../../common/types");
20
20
  const computation_1 = require("./computation");
21
21
  const query_1 = require("./query");
22
- __exportStar(require("./types"), exports);
22
+ __exportStar(require("../../common/types"), exports);
23
23
  __exportStar(require("./computation"), exports);
24
24
  var query_2 = require("./query");
25
25
  Object.defineProperty(exports, "CompositeOracleFetcher", { enumerable: true, get: function () { return query_2.CompositeOracleFetcher; } });
@@ -3,13 +3,13 @@ import { AffluentContext } from "../../context";
3
3
  import { AddressLike } from "../../contracts/common/type";
4
4
  import { OnchainDataInfo } from "../../contracts/oracle/redstone-onchain-oracle/type";
5
5
  import { StrategyVaultState } from "../../contracts/vault/strategy-vault";
6
- import { Prices, OnchainDataMap, VaultPositions, PoolInfos } from "./types";
6
+ import { Prices, SyntheticCompositions, IVaultStateContext, IPoolContext } from "../../common/types";
7
7
  export type OracleContext = {
8
8
  vaultData: StrategyVaultState;
9
9
  oracleConfig: any;
10
10
  assets: string[];
11
11
  vaultAssets: string[];
12
- vaultPositions: VaultPositions;
12
+ vaultPositions: Record<string, IVaultStateContext>;
13
13
  exposures: {
14
14
  assets: string[];
15
15
  pools: string[];
@@ -28,9 +28,9 @@ export declare class CompositeOracleFetcher {
28
28
  }): Promise<OracleContext>;
29
29
  fetchRawPrices(assets: string[], oracleConfig: any): Promise<{
30
30
  rawPrices: Prices;
31
- onchainData: OnchainDataMap;
31
+ onchainData: SyntheticCompositions;
32
32
  }>;
33
- fetchOnchainData(onchainDataInfo: OnchainDataInfo): Promise<OnchainDataMap>;
34
- fetchVaultPositions(vaultAddresses: (Address | string)[]): Promise<VaultPositions>;
35
- fetchPoolInfos(poolAddresses: string[]): Promise<PoolInfos>;
33
+ fetchOnchainData(onchainDataInfo: OnchainDataInfo): Promise<SyntheticCompositions>;
34
+ fetchVaultPositions(vaultAddresses: (Address | string)[]): Promise<Record<string, IVaultStateContext>>;
35
+ fetchPoolInfos(poolAddresses: string[]): Promise<Record<string, IPoolContext>>;
36
36
  }
@@ -7,12 +7,12 @@ const utils_1 = require("../../contracts/common/utils");
7
7
  const pool_1 = require("../../contracts/core/pool");
8
8
  const redstone_onchain_oracle_1 = require("../../contracts/oracle/redstone-onchain-oracle");
9
9
  const type_1 = require("../../contracts/oracle/redstone-onchain-oracle/type");
10
- const share_vault_1 = require("../../contracts/vault/share-vault");
11
10
  const strategy_vault_1 = require("../../contracts/vault/strategy-vault");
12
11
  const readonlyCachedRedstone_1 = require("../../utils/oracle/redstone/readonlyCachedRedstone");
13
12
  const unknown_contract_1 = require("../../contracts/unknown-contract");
14
- const types_1 = require("./types");
13
+ const types_1 = require("../../common/types");
15
14
  const computation_1 = require("./computation");
15
+ const transform_1 = require("../../common/transform");
16
16
  // ============================================================
17
17
  // Query Class (I/O - fetching data)
18
18
  // ============================================================
@@ -59,8 +59,8 @@ class CompositeOracleFetcher {
59
59
  if (rainfo.assetType === 0) {
60
60
  rawPrices[rainfo.address.toString()] = {
61
61
  type: types_1.CompositeAssetType.NATIVE,
62
- timestamp: item.timestamp,
63
62
  price: (item.price * types_1.DECIMALS_OF_PRICE) / rainfo.precision,
63
+ timestamp: item.timestamp,
64
64
  };
65
65
  }
66
66
  else if (rainfo.assetType === 1) {
@@ -181,13 +181,13 @@ class CompositeOracleFetcher {
181
181
  const data = core_1.Cell.fromBoc(state.state.data)[0];
182
182
  try {
183
183
  const vaultData = strategy_vault_1.StrategyVault.parseVaultData(data);
184
- positions[addressStr] = extractStrategyVaultPosition(vaultData);
184
+ // VaultStateContext.fromStrategyVaultState(vaultData);
185
+ positions[addressStr] = transform_1.VaultStateContext.fromStrategyVaultStateCell((0, utils_1.toAddress)(vaultAddress), data);
185
186
  return;
186
187
  }
187
188
  catch (e) { }
188
189
  try {
189
- const vaultData = share_vault_1.ShareVault.parseVaultData(data);
190
- positions[addressStr] = extractShareVaultPosition(vaultData);
190
+ positions[addressStr] = transform_1.VaultStateContext.fromShareVaultStateCell((0, utils_1.toAddress)(vaultAddress), data);
191
191
  }
192
192
  catch (e) { }
193
193
  }
@@ -202,15 +202,7 @@ class CompositeOracleFetcher {
202
202
  try {
203
203
  const pool = this.ctx.getByContract(pool_1.Pool, (0, utils_1.toAddress)(poolAddress));
204
204
  const poolData = await pool.getPoolData();
205
- poolInfos[poolAddress] = {};
206
- for (const [asset, assetData] of Object.entries(poolData.assets)) {
207
- poolInfos[poolAddress][asset] = {
208
- totalSupplyAmount: assetData.totalSupplyAmount,
209
- totalSupplyShare: assetData.totalSupplyShare,
210
- totalBorrowAmount: assetData.totalBorrowAmount,
211
- totalBorrowShare: assetData.totalBorrowShare,
212
- };
213
- }
205
+ poolInfos[poolAddress] = transform_1.PoolContext.fromPoolState(poolData);
214
206
  }
215
207
  catch (e) { }
216
208
  }));
@@ -218,34 +210,3 @@ class CompositeOracleFetcher {
218
210
  }
219
211
  }
220
212
  exports.CompositeOracleFetcher = CompositeOracleFetcher;
221
- // ============================================================
222
- // Helper Functions
223
- // ============================================================
224
- function extractStrategyVaultPosition(vaultData) {
225
- const assets = {};
226
- const poolPositions = {};
227
- for (const [asset, assetData] of Object.entries(vaultData.assets)) {
228
- assets[asset] = assetData.cash;
229
- }
230
- for (const [pool, poolAssets] of Object.entries(vaultData.factorialPools)) {
231
- poolPositions[pool] = {};
232
- for (const [asset, position] of Object.entries(poolAssets)) {
233
- poolPositions[pool][asset] = { supply: position.supply, borrow: position.borrow };
234
- }
235
- }
236
- return { assets, poolPositions, totalSupply: vaultData.totalSupply };
237
- }
238
- function extractShareVaultPosition(vaultData) {
239
- const asset = vaultData.asset.toString();
240
- const poolPositions = {};
241
- for (const pool of Object.values(vaultData.whitelistedPools)) {
242
- poolPositions[pool.address.toString()] = {
243
- [asset]: { supply: pool.supply, borrow: 0n },
244
- };
245
- }
246
- return {
247
- assets: { [asset]: vaultData.cash },
248
- poolPositions,
249
- totalSupply: vaultData.totalSupply,
250
- };
251
- }