@affluent-org/sdk 0.0.3 → 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.
- package/dist/common/transform.d.ts +93 -0
- package/dist/common/transform.js +351 -0
- package/dist/common/types.d.ts +144 -0
- package/dist/common/types.js +11 -0
- package/dist/contracts/oracle/redstone-onchain-oracle/type.d.ts +1 -1
- package/dist/services/composite-oracle/codec.d.ts +76 -0
- package/dist/services/composite-oracle/codec.js +281 -0
- package/dist/services/composite-oracle/computation.d.ts +9 -15
- package/dist/services/composite-oracle/computation.js +44 -36
- package/dist/services/composite-oracle/index.d.ts +2 -2
- package/dist/services/composite-oracle/index.js +2 -2
- package/dist/services/composite-oracle/query.d.ts +6 -6
- package/dist/services/composite-oracle/query.js +7 -46
- package/dist/services/pool/computation.d.ts +3 -9
- package/dist/services/pool/computation.js +16 -30
- package/dist/services/pool/oracle.d.ts +2 -2
- package/dist/services/pool/query.d.ts +1 -1
- package/dist/services/rfq-auction/oracle.d.ts +2 -2
- package/dist/services/rfq-batch/oracle.d.ts +2 -2
- package/dist/services/share-vault/index.d.ts +7 -0
- package/dist/services/share-vault/index.js +6 -0
- package/dist/services/share-vault/query.d.ts +5 -32
- package/dist/services/share-vault/query.js +25 -12
- package/dist/services/strategy-vault/index.d.ts +14 -0
- package/dist/services/strategy-vault/index.js +13 -0
- package/dist/services/strategy-vault/oracle.d.ts +3 -3
- package/dist/services/strategy-vault/query.d.ts +14 -143
- package/dist/services/strategy-vault/query.js +42 -49
- package/dist/types/address.d.ts +7 -0
- package/dist/types/address.js +2 -0
- package/dist/utils/risk_calculator/risk_calculator.d.ts +3 -3
- 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,
|
|
3
|
-
import {
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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("
|
|
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 =
|
|
57
|
-
const value1 =
|
|
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 =
|
|
88
|
-
if (
|
|
89
|
-
decomposed[assetAddress]
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
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] =
|
|
124
|
+
decomposed[assetAddress] = amount.clone();
|
|
112
125
|
}
|
|
113
|
-
const poolResult = computePoolPositionsValue(vault.
|
|
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].
|
|
117
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
169
|
-
|
|
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] =
|
|
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.
|
|
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 "
|
|
3
|
+
import { Prices, CompositeOracleResult, CompositeOracleInput } from "../../common/types";
|
|
4
4
|
import { CompositeOracleFetcher } from "./query";
|
|
5
|
-
export * from "
|
|
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("
|
|
19
|
+
const types_1 = require("../../common/types");
|
|
20
20
|
const computation_1 = require("./computation");
|
|
21
21
|
const query_1 = require("./query");
|
|
22
|
-
__exportStar(require("
|
|
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,
|
|
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:
|
|
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:
|
|
31
|
+
onchainData: SyntheticCompositions;
|
|
32
32
|
}>;
|
|
33
|
-
fetchOnchainData(onchainDataInfo: OnchainDataInfo): Promise<
|
|
34
|
-
fetchVaultPositions(vaultAddresses: (Address | string)[]): Promise<
|
|
35
|
-
fetchPoolInfos(poolAddresses: string[]): Promise<
|
|
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("
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
}
|