@affluent-org/sdk 0.0.2 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/build/Account.compiled.json +1 -0
- package/dist/build/Receipt.compiled.json +1 -0
- package/dist/build/WTONWallet.compiled.json +1 -0
- package/dist/common/cache.d.ts +16 -0
- package/dist/common/cache.js +96 -0
- package/dist/common/service.d.ts +20 -0
- package/dist/common/service.js +69 -0
- package/dist/common/type.d.ts +14 -0
- package/dist/common/type.js +2 -0
- package/dist/common/unknown-contract.d.ts +14 -0
- package/dist/common/unknown-contract.js +18 -0
- package/dist/common/versions.d.ts +14 -0
- package/dist/common/versions.js +22 -0
- package/dist/constants/pool.d.ts +1 -0
- package/dist/constants/pool.js +2 -0
- package/dist/contracts/_mock/simple-oracle.d.ts +34 -0
- package/dist/contracts/_mock/simple-oracle.js +73 -0
- package/dist/contracts/vault/share-vault/type.d.ts +30 -0
- package/dist/contracts/vault/share-vault/type.js +2 -0
- package/dist/contracts/vault/strategy-vault/utils.d.ts +6 -0
- package/dist/contracts/vault/strategy-vault/utils.js +32 -0
- package/dist/factorial.d.ts +14 -0
- package/dist/factorial.js +20 -0
- package/dist/farm.d.ts +92 -0
- package/dist/farm.js +209 -0
- package/dist/monitor.d.ts +57 -0
- package/dist/monitor.js +527 -0
- package/dist/monitorCacheV1.d.ts +52 -0
- package/dist/monitorCacheV1.js +504 -0
- package/dist/oracle/oracle-v2.d.ts +39 -0
- package/dist/oracle/oracle-v2.js +151 -0
- package/dist/oracle/oracle.d.ts +107 -0
- package/dist/oracle/oracle.js +392 -0
- package/dist/periphery.d.ts +259 -0
- package/dist/periphery.js +1087 -0
- package/dist/pool.d.ts +216 -0
- package/dist/pool.js +2298 -0
- package/dist/poolCacheV1.d.ts +139 -0
- package/dist/poolCacheV1.js +1841 -0
- package/dist/rfq-auction.d.ts +75 -0
- package/dist/rfq-auction.js +220 -0
- package/dist/rfq-batch.d.ts +112 -0
- package/dist/rfq-batch.js +284 -0
- package/dist/services/share-vault/computation.d.ts +14 -17
- package/dist/services/share-vault/computation.js +39 -0
- package/dist/services/share-vault/index.js +6 -3
- package/dist/services/share-vault/query.d.ts +38 -8
- package/dist/services/share-vault/query.js +20 -27
- package/dist/services/share-vault/type.d.ts +19 -0
- package/dist/services/share-vault/type.js +2 -0
- package/dist/services/share-vault/user/index.js +3 -1
- package/dist/services/strategy-vault/computation.d.ts +1 -0
- package/dist/services/strategy-vault/computation.js +15 -0
- package/dist/services/strategy-vault/query.d.ts +147 -0
- package/dist/services/strategy-vault/query.js +67 -0
- package/dist/services/strategy-vault/type.d.ts +2 -0
- package/dist/services/strategy-vault/type.js +2 -0
- package/dist/share-vault.d.ts +91 -0
- package/dist/share-vault.js +747 -0
- package/dist/stonfi.d.ts +18 -0
- package/dist/stonfi.js +76 -0
- package/dist/strategy_vault/base.d.ts +399 -0
- package/dist/strategy_vault/base.js +1199 -0
- package/dist/strategy_vault/index.d.ts +3 -0
- package/dist/strategy_vault/index.js +7 -0
- package/dist/strategy_vault/steps.d.ts +49 -0
- package/dist/strategy_vault/steps.js +170 -0
- package/dist/types/action.d.ts +55 -0
- package/dist/types/action.js +2 -0
- package/dist/types/messages.d.ts +7 -0
- package/dist/types/messages.js +2 -0
- package/dist/types/params.d.ts +19 -0
- package/dist/types/params.js +2 -0
- package/dist/types/pool.d.ts +83 -0
- package/dist/types/pool.js +2 -0
- package/dist/types/transaction.d.ts +40 -0
- package/dist/types/transaction.js +2 -0
- package/dist/utils/_parse_temp/JumpIRM.d.ts +37 -0
- package/dist/utils/_parse_temp/JumpIRM.js +71 -0
- package/dist/utils/_parse_temp/Pool.d.ts +559 -0
- package/dist/utils/_parse_temp/Pool.js +1023 -0
- package/dist/utils/_parse_temp/ShareVault.d.ts +264 -0
- package/dist/utils/_parse_temp/ShareVault.js +479 -0
- package/dist/utils/_parse_temp/StrategyVault.d.ts +729 -0
- package/dist/utils/_parse_temp/StrategyVault.js +1865 -0
- package/dist/utils/_parse_temp/parseMsgBody.d.ts +13 -0
- package/dist/utils/_parse_temp/parseMsgBody.js +313 -0
- package/dist/utils/assert.d.ts +1 -0
- package/dist/utils/assert.js +9 -0
- package/dist/utils/client-for-parameter.d.ts +12 -0
- package/dist/utils/client-for-parameter.js +97 -0
- package/dist/utils/oracle/index.d.ts +4 -0
- package/dist/utils/oracle/index.js +19 -0
- package/dist/utils/oracle/redstone/helper.d.ts +22 -0
- package/dist/utils/oracle/redstone/helper.js +186 -0
- package/dist/utils/tracer.d.ts +13 -0
- package/dist/utils/tracer.js +137 -0
- package/dist/utils/tracker/index.d.ts +5 -0
- package/dist/utils/tracker/index.js +118 -0
- package/dist/utils/tracker/query-id-generactor.d.ts +2 -0
- package/dist/utils/tracker/query-id-generactor.js +12 -0
- package/dist/utils/tracker/type.d.ts +34 -0
- package/dist/utils/tracker/type.js +2 -0
- package/package.json +1 -1
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OracleLibsV2 = exports.AddressBucket = void 0;
|
|
4
|
+
const core_1 = require("@ton/core");
|
|
5
|
+
const service_1 = require("../common/service");
|
|
6
|
+
const utils_1 = require("../contracts/common/utils");
|
|
7
|
+
const redstone_onchain_oracle_1 = require("../contracts/oracle/redstone-onchain-oracle");
|
|
8
|
+
const strategy_vault_1 = require("../contracts/vault/strategy-vault");
|
|
9
|
+
const redstoneHelper_1 = require("../utils/oracle/redstone/redstoneHelper");
|
|
10
|
+
const pool_1 = require("../contracts/core/pool");
|
|
11
|
+
const account_1 = require("../contracts/core/account");
|
|
12
|
+
class AddressBucket {
|
|
13
|
+
assets;
|
|
14
|
+
pools;
|
|
15
|
+
vaults;
|
|
16
|
+
constructor(assets = new Set(), pools = new Set(), vaults = new Set()) {
|
|
17
|
+
this.assets = assets;
|
|
18
|
+
this.pools = pools;
|
|
19
|
+
this.vaults = vaults;
|
|
20
|
+
}
|
|
21
|
+
getAssets() {
|
|
22
|
+
return [...this.assets];
|
|
23
|
+
}
|
|
24
|
+
getVaultAssets() {
|
|
25
|
+
return [...this.vaults];
|
|
26
|
+
}
|
|
27
|
+
getPools() {
|
|
28
|
+
return [...this.pools];
|
|
29
|
+
}
|
|
30
|
+
add(other) {
|
|
31
|
+
other.assets.forEach((asset) => this.assets.add(asset));
|
|
32
|
+
other.pools.forEach((pool) => this.pools.add(pool));
|
|
33
|
+
other.vaults.forEach((vault) => this.vaults.add(vault));
|
|
34
|
+
return this;
|
|
35
|
+
}
|
|
36
|
+
array() {
|
|
37
|
+
return {
|
|
38
|
+
assets: [...this.assets],
|
|
39
|
+
pools: [...this.pools],
|
|
40
|
+
vaults: [...this.vaults],
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
totalSize() {
|
|
44
|
+
return this.assets.size + this.pools.size + this.vaults.size;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
exports.AddressBucket = AddressBucket;
|
|
48
|
+
class OracleLibsV2 extends service_1.ServiceBaseV1 {
|
|
49
|
+
async getOracleParamsForPoolSupplyAndRepay(poolAddress, assetAddress, poolData, bucket = new AddressBucket()) {
|
|
50
|
+
const pool = this.getByContract(pool_1.Pool, poolAddress);
|
|
51
|
+
poolData ??= await pool.getPoolData();
|
|
52
|
+
bucket ??= await this.makeAnyAddressBucket((0, utils_1.toAddress)(assetAddress), bucket);
|
|
53
|
+
const oracleParams = await this.makeOracleParams(bucket, poolData.oracleConfig);
|
|
54
|
+
return {
|
|
55
|
+
oracleParams,
|
|
56
|
+
bucket,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
async getOracleParamsForPoolBorrowAndWithdraw(poolAddress, actorAddress, assetAddress, poolData, accountData, bucket = new AddressBucket()) {
|
|
60
|
+
const pool = this.getByContract(pool_1.Pool, poolAddress);
|
|
61
|
+
const actorAccount = this.getByContract(account_1.Account, await pool.getAccountAddress((0, utils_1.toAddress)(actorAddress)));
|
|
62
|
+
poolData ??= await pool.getPoolData();
|
|
63
|
+
accountData ??= await actorAccount.getAccountData();
|
|
64
|
+
for (const [asset, position] of Object.entries(accountData.status)) {
|
|
65
|
+
if (position.supply > 0 || position.borrow > 0) {
|
|
66
|
+
await this.makeAnyAddressBucket((0, utils_1.toAddress)(asset), bucket);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
bucket ??= await this.makeAnyAddressBucket((0, utils_1.toAddress)(assetAddress), bucket);
|
|
70
|
+
const oracleParams = await this.makeOracleParams(bucket, poolData.oracleConfig);
|
|
71
|
+
return {
|
|
72
|
+
oracleParams,
|
|
73
|
+
bucket,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
async getOracleParamsForStrategyVault(vaultAddress, vaultData, bucket = new AddressBucket()) {
|
|
77
|
+
const vault = this.getByContract(strategy_vault_1.StrategyVault, vaultAddress);
|
|
78
|
+
vaultData ??= await vault.getVaultData();
|
|
79
|
+
bucket = await this.strategyVaultAddressBucket(vault.address, bucket);
|
|
80
|
+
const oracleParams = await this.makeOracleParams(bucket, vaultData.oracleConfig);
|
|
81
|
+
return {
|
|
82
|
+
oracleParams,
|
|
83
|
+
bucket,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
async makeOracleParams(bucket, oracleConfig) {
|
|
87
|
+
const { assets, pools, vaults } = bucket.array();
|
|
88
|
+
const result = redstone_onchain_oracle_1.RedstoneOnchainOracle.getOracleRequestParams(assets,
|
|
89
|
+
// @ts-ignore
|
|
90
|
+
oracleConfig);
|
|
91
|
+
const dataFeedIdsTupleBuilder = new core_1.TupleBuilder();
|
|
92
|
+
result.feedIds.forEach((item) => dataFeedIdsTupleBuilder.writeNumber(item));
|
|
93
|
+
const feedIdCell = (0, core_1.serializeTuple)(dataFeedIdsTupleBuilder.build());
|
|
94
|
+
const payload = await (0, redstoneHelper_1.createRedstoneHelper)("prod").createPayload(result.redstoneAssetNames);
|
|
95
|
+
const requestAssetCell = redstone_onchain_oracle_1.RedstoneOnchainOracle.createAddressToTupleCell(result.requestAssets);
|
|
96
|
+
const requestFactorialCell = (0, core_1.beginCell)()
|
|
97
|
+
.storeMaybeRef(pools.length > 0
|
|
98
|
+
? redstone_onchain_oracle_1.RedstoneOnchainOracle.createAddressToTupleCell(pools.map((pool) => core_1.Address.parse(pool)))
|
|
99
|
+
: null)
|
|
100
|
+
.storeMaybeRef(vaults.length > 0
|
|
101
|
+
? redstone_onchain_oracle_1.RedstoneOnchainOracle.createAddressToTupleCell(vaults.map((vault) => core_1.Address.parse(vault)))
|
|
102
|
+
: null)
|
|
103
|
+
.endCell();
|
|
104
|
+
const oracleParams = (0, core_1.beginCell)()
|
|
105
|
+
.storeRef(feedIdCell)
|
|
106
|
+
.storeRef(payload)
|
|
107
|
+
.storeRef(requestAssetCell)
|
|
108
|
+
.storeRef(requestFactorialCell)
|
|
109
|
+
.endCell();
|
|
110
|
+
return oracleParams;
|
|
111
|
+
}
|
|
112
|
+
async strategyVaultAddressBucket(vault, bucket = new AddressBucket()) {
|
|
113
|
+
const vaultAddress = vault.toString();
|
|
114
|
+
const assetType = await this.getAssetType(vaultAddress);
|
|
115
|
+
if (assetType.type !== "strategy-vault") {
|
|
116
|
+
throw new Error("Vault is not a strategy vault");
|
|
117
|
+
}
|
|
118
|
+
for (const poolAddress of Object.keys(assetType.data.factorialPools)) {
|
|
119
|
+
bucket.pools.add(poolAddress);
|
|
120
|
+
}
|
|
121
|
+
await Promise.all(Object.keys(assetType.data.assets)
|
|
122
|
+
.map((asset) => core_1.Address.parse(asset))
|
|
123
|
+
.map((asset) => this.makeAnyAddressBucket(asset, bucket)));
|
|
124
|
+
return bucket;
|
|
125
|
+
}
|
|
126
|
+
async makeAnyAddressBucket(asset, bucket = new AddressBucket()) {
|
|
127
|
+
const assetAddress = asset.toString();
|
|
128
|
+
const assetType = await this.getAssetType(assetAddress);
|
|
129
|
+
if (assetType.type === "underlying-asset") {
|
|
130
|
+
bucket.assets.add(assetAddress.toString());
|
|
131
|
+
}
|
|
132
|
+
else if (assetType.type === "share-vault") {
|
|
133
|
+
bucket.vaults.add(assetAddress.toString());
|
|
134
|
+
for (const poolAddress of Object.keys(assetType.data.whitelistedPools)) {
|
|
135
|
+
bucket.pools.add(poolAddress);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
else if (assetType.type === "strategy-vault") {
|
|
139
|
+
bucket.vaults.add(assetAddress.toString());
|
|
140
|
+
for (const poolAddress of Object.keys(assetType.data.factorialPools)) {
|
|
141
|
+
bucket.pools.add(poolAddress);
|
|
142
|
+
}
|
|
143
|
+
await Promise.all(Object.keys(assetType.data.assets)
|
|
144
|
+
.map((asset) => core_1.Address.parse(asset))
|
|
145
|
+
.map((asset) => this.makeAnyAddressBucket(asset, bucket)));
|
|
146
|
+
}
|
|
147
|
+
// unknown or (should) pool address
|
|
148
|
+
return bucket;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
exports.OracleLibsV2 = OracleLibsV2;
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { Address, Cell, OpenedContract } from "@ton/core";
|
|
2
|
+
import { ServiceBaseV1 } from "../common/service";
|
|
3
|
+
import { ShareVault } from "../contracts/vault/share-vault";
|
|
4
|
+
import { StrategyVault } from "../contracts/vault/strategy-vault";
|
|
5
|
+
import { ShareVaultState } from "../contracts/vault/share-vault/type";
|
|
6
|
+
import { RFQAuction } from "../contracts/rfq/rfq_auction";
|
|
7
|
+
import { Pool } from "../contracts/core/pool";
|
|
8
|
+
import { PoolState } from "../contracts/core/pool/type";
|
|
9
|
+
import { RFQBatch } from "../contracts/rfq/rfq_batch";
|
|
10
|
+
type AssetAddress = string;
|
|
11
|
+
type PoolAddress = string;
|
|
12
|
+
declare class AssetPosition {
|
|
13
|
+
readonly cash: bigint;
|
|
14
|
+
constructor(cash: bigint);
|
|
15
|
+
}
|
|
16
|
+
declare class PoolAssetPosition {
|
|
17
|
+
readonly supply: bigint;
|
|
18
|
+
readonly borrow: bigint;
|
|
19
|
+
constructor(supply: bigint, borrow: bigint);
|
|
20
|
+
static fromPosition(position: {
|
|
21
|
+
supply: bigint;
|
|
22
|
+
borrow: bigint;
|
|
23
|
+
}): PoolAssetPosition;
|
|
24
|
+
}
|
|
25
|
+
type PoolPosition = Record<AssetAddress, PoolAssetPosition>;
|
|
26
|
+
type AssetUnderPool = {
|
|
27
|
+
cash: bigint;
|
|
28
|
+
supply: bigint;
|
|
29
|
+
borrow: bigint;
|
|
30
|
+
supplyShare: bigint;
|
|
31
|
+
borrowShare: bigint;
|
|
32
|
+
};
|
|
33
|
+
export declare class PoolValueStatus {
|
|
34
|
+
readonly status: Record<AssetAddress, AssetUnderPool>;
|
|
35
|
+
readonly oracleConfig: any;
|
|
36
|
+
readonly underlyingAssets: Record<AssetAddress, AssetUnderPool>;
|
|
37
|
+
readonly vaultAssets: Record<AssetAddress, AssetUnderPool>;
|
|
38
|
+
readonly oracleAssets: Set<string>;
|
|
39
|
+
constructor(status: Record<AssetAddress, AssetUnderPool>, oracleConfig: any);
|
|
40
|
+
static fromPool(pool: OpenedContract<Pool>): Promise<PoolValueStatus>;
|
|
41
|
+
static fromPoolData(poolData: PoolState): PoolValueStatus;
|
|
42
|
+
bucket(bucket?: AddressBucket): AddressBucket;
|
|
43
|
+
}
|
|
44
|
+
export declare class ShareVaultValueStatus {
|
|
45
|
+
readonly assets: Record<AssetAddress, AssetPosition>;
|
|
46
|
+
readonly pools: Record<PoolAddress, PoolPosition>;
|
|
47
|
+
readonly totalSupply: bigint;
|
|
48
|
+
constructor(assets: Record<AssetAddress, AssetPosition>, pools: Record<PoolAddress, PoolPosition>, totalSupply: bigint);
|
|
49
|
+
static fromVault(vault: OpenedContract<ShareVault>): Promise<ShareVaultValueStatus>;
|
|
50
|
+
static fromVaultData(vaultData: ShareVaultState | ReturnType<typeof ShareVault.parseVaultData>): ShareVaultValueStatus;
|
|
51
|
+
bucket(bucket?: AddressBucket): AddressBucket;
|
|
52
|
+
}
|
|
53
|
+
export declare class StrategyVaultValueStatus {
|
|
54
|
+
readonly assets: Record<AssetAddress, AssetPosition>;
|
|
55
|
+
readonly pools: Record<PoolAddress, PoolPosition>;
|
|
56
|
+
readonly totalSupply: bigint;
|
|
57
|
+
readonly oracleConfig: any;
|
|
58
|
+
readonly underlyingAssets: Record<AssetAddress, AssetPosition>;
|
|
59
|
+
readonly vaultAssets: Record<AssetAddress, AssetPosition>;
|
|
60
|
+
readonly oracleAssets: Set<string>;
|
|
61
|
+
constructor(assets: Record<AssetAddress, AssetPosition>, pools: Record<PoolAddress, PoolPosition>, totalSupply: bigint, oracleConfig: any);
|
|
62
|
+
static fromVault(vault: OpenedContract<StrategyVault>): Promise<StrategyVaultValueStatus>;
|
|
63
|
+
static fromVaultData(vaultData: ReturnType<typeof StrategyVault.parseVaultData>): StrategyVaultValueStatus;
|
|
64
|
+
bucket(bucket?: AddressBucket): AddressBucket;
|
|
65
|
+
}
|
|
66
|
+
export declare class AddressBucket {
|
|
67
|
+
readonly assets: Set<string>;
|
|
68
|
+
readonly pools: Set<string>;
|
|
69
|
+
readonly vaults: Set<string>;
|
|
70
|
+
constructor(assets?: Set<string>, pools?: Set<string>, vaults?: Set<string>);
|
|
71
|
+
getAssets(): string[];
|
|
72
|
+
getVaultAssets(): string[];
|
|
73
|
+
getPools(): string[];
|
|
74
|
+
updatePoolAssetStatus(poolAssetStatus: Record<string, AssetUnderPool>): void;
|
|
75
|
+
updateVaultAssetPositions(vaultAssetPositions: Record<string, AssetPosition>): void;
|
|
76
|
+
updateVaultPoolPositions(vaultPoolPositions: Record<string, PoolPosition>): void;
|
|
77
|
+
add(other: AddressBucket): this;
|
|
78
|
+
object(): {
|
|
79
|
+
assets: string[];
|
|
80
|
+
pools: string[];
|
|
81
|
+
vaults: string[];
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
export declare class OracleLibs extends ServiceBaseV1 {
|
|
85
|
+
getOracleParamsForPool(poolData: PoolState, anyAssets?: string[], bucket?: AddressBucket): Promise<Cell>;
|
|
86
|
+
getOracleParamsForStrategyVault(vaultData: ReturnType<typeof StrategyVault.parseVaultData>, anyAssets?: string[], bucket?: AddressBucket): Promise<Cell>;
|
|
87
|
+
getOracleParamsForStrategyVaultV2(vaultData: ReturnType<typeof StrategyVault.parseVaultData>, anyAssets?: string[], bucket?: AddressBucket): Promise<{
|
|
88
|
+
oracleParams: Cell;
|
|
89
|
+
bucket: AddressBucket;
|
|
90
|
+
}>;
|
|
91
|
+
getOracleParamsForStrategyVaultRFQAuction(rfqAuctionData: ReturnType<typeof RFQAuction.parseRfqStorage>, bucket?: AddressBucket): Promise<Cell>;
|
|
92
|
+
getOracleParamsForRFQBatch(rfqBatchData: ReturnType<typeof RFQBatch.parseRFQBatchStorage>, bucket?: AddressBucket): Promise<{
|
|
93
|
+
oracleParams: Cell;
|
|
94
|
+
bucket: AddressBucket;
|
|
95
|
+
}>;
|
|
96
|
+
flattenOraclePool(pool: PoolValueStatus, bucket?: AddressBucket): Promise<AddressBucket>;
|
|
97
|
+
flattenOracleShareVault(shareVault: ShareVaultValueStatus, bucket?: AddressBucket): Promise<AddressBucket>;
|
|
98
|
+
flattenOracleStrategyVault(strategyVault: StrategyVaultValueStatus, bucket?: AddressBucket): Promise<AddressBucket>;
|
|
99
|
+
getUnderlyingAssetFilter(oracleConfig: any, noneVaultFilter?: AddressBucket): AddressBucket;
|
|
100
|
+
flattenAssets(oracleConfig: any, anyAssets?: string[], bucket?: AddressBucket): Promise<AddressBucket>;
|
|
101
|
+
makeOracleParams(bucket: AddressBucket, oracleConfig: any): Promise<Cell>;
|
|
102
|
+
getParsedVaults(vaultAddresses: (Address | string)[], bucket?: AddressBucket): Promise<{
|
|
103
|
+
strategyVaults: Record<string, StrategyVaultValueStatus>;
|
|
104
|
+
shareVaults: Record<string, ShareVaultValueStatus>;
|
|
105
|
+
}>;
|
|
106
|
+
}
|
|
107
|
+
export {};
|
|
@@ -0,0 +1,392 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OracleLibs = exports.AddressBucket = exports.StrategyVaultValueStatus = exports.ShareVaultValueStatus = exports.PoolValueStatus = void 0;
|
|
4
|
+
const core_1 = require("@ton/core");
|
|
5
|
+
const service_1 = require("../common/service");
|
|
6
|
+
const redstone_onchain_oracle_1 = require("../contracts/oracle/redstone-onchain-oracle");
|
|
7
|
+
const share_vault_1 = require("../contracts/vault/share-vault");
|
|
8
|
+
const strategy_vault_1 = require("../contracts/vault/strategy-vault");
|
|
9
|
+
const redstoneHelper_1 = require("../utils/oracle/redstone/redstoneHelper");
|
|
10
|
+
const unknown_contract_1 = require("../common/unknown-contract");
|
|
11
|
+
class AssetPosition {
|
|
12
|
+
cash;
|
|
13
|
+
constructor(cash) {
|
|
14
|
+
this.cash = cash;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
class PoolAssetPosition {
|
|
18
|
+
supply;
|
|
19
|
+
borrow;
|
|
20
|
+
constructor(supply, borrow) {
|
|
21
|
+
this.supply = supply;
|
|
22
|
+
this.borrow = borrow;
|
|
23
|
+
}
|
|
24
|
+
static fromPosition(position) {
|
|
25
|
+
return new PoolAssetPosition(position.supply, position.borrow);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
class PoolValueStatus {
|
|
29
|
+
status;
|
|
30
|
+
oracleConfig;
|
|
31
|
+
underlyingAssets = {};
|
|
32
|
+
vaultAssets = {};
|
|
33
|
+
oracleAssets = new Set();
|
|
34
|
+
constructor(status, oracleConfig) {
|
|
35
|
+
this.status = status;
|
|
36
|
+
this.oracleConfig = oracleConfig;
|
|
37
|
+
Object.values(oracleConfig.redstoneAssetInfo).forEach((item) => {
|
|
38
|
+
this.oracleAssets.add(item.address.toString());
|
|
39
|
+
});
|
|
40
|
+
Object.keys(oracleConfig.assetOnchainDataInfo).forEach((item) => {
|
|
41
|
+
this.oracleAssets.add(item);
|
|
42
|
+
});
|
|
43
|
+
Object.entries(this.status).forEach(([asset, position]) => {
|
|
44
|
+
if (this.oracleAssets.has(asset)) {
|
|
45
|
+
this.underlyingAssets[asset] = position;
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
this.vaultAssets[asset] = position;
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
static async fromPool(pool) {
|
|
53
|
+
const poolData = await pool.getPoolData();
|
|
54
|
+
return PoolValueStatus.fromPoolData(poolData);
|
|
55
|
+
}
|
|
56
|
+
static fromPoolData(poolData) {
|
|
57
|
+
const poolStatus = {};
|
|
58
|
+
Object.entries(poolData.assets).forEach(([asset, assetData]) => {
|
|
59
|
+
poolStatus[asset] = {
|
|
60
|
+
cash: assetData.cash,
|
|
61
|
+
supply: assetData.totalSupplyAmount,
|
|
62
|
+
borrow: assetData.totalBorrowAmount,
|
|
63
|
+
supplyShare: assetData.totalSupplyShare,
|
|
64
|
+
borrowShare: assetData.totalBorrowShare,
|
|
65
|
+
};
|
|
66
|
+
});
|
|
67
|
+
return new PoolValueStatus(poolStatus, poolData.oracleConfig);
|
|
68
|
+
}
|
|
69
|
+
bucket(bucket = new AddressBucket()) {
|
|
70
|
+
for (const [asset, position] of Object.entries(this.underlyingAssets)) {
|
|
71
|
+
if (position.supply > 0 || position.borrow > 0) {
|
|
72
|
+
bucket.assets.add(asset);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
for (const [asset, position] of Object.entries(this.vaultAssets)) {
|
|
76
|
+
if (position.supply > 0 || position.borrow > 0) {
|
|
77
|
+
bucket.vaults.add(asset);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return bucket;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
exports.PoolValueStatus = PoolValueStatus;
|
|
84
|
+
class ShareVaultValueStatus {
|
|
85
|
+
assets;
|
|
86
|
+
pools;
|
|
87
|
+
totalSupply;
|
|
88
|
+
constructor(assets, pools, totalSupply) {
|
|
89
|
+
this.assets = assets;
|
|
90
|
+
this.pools = pools;
|
|
91
|
+
this.totalSupply = totalSupply;
|
|
92
|
+
}
|
|
93
|
+
static async fromVault(vault) {
|
|
94
|
+
const vaultData = await vault.getVaultData();
|
|
95
|
+
return ShareVaultValueStatus.fromVaultData(vaultData);
|
|
96
|
+
}
|
|
97
|
+
static fromVaultData(vaultData) {
|
|
98
|
+
const asset = vaultData.asset.toString();
|
|
99
|
+
const assets = {
|
|
100
|
+
[asset]: new AssetPosition(vaultData.cash),
|
|
101
|
+
};
|
|
102
|
+
const pools = {};
|
|
103
|
+
Object.values(vaultData.whitelistedPools).map((pool) => {
|
|
104
|
+
pools[pool.address.toString()] = {
|
|
105
|
+
[asset]: new PoolAssetPosition(pool.supply, 0n),
|
|
106
|
+
};
|
|
107
|
+
});
|
|
108
|
+
return new ShareVaultValueStatus(assets, pools, vaultData.totalSupply);
|
|
109
|
+
}
|
|
110
|
+
bucket(bucket = new AddressBucket()) {
|
|
111
|
+
bucket.updateVaultAssetPositions(this.assets);
|
|
112
|
+
bucket.updateVaultPoolPositions(this.pools);
|
|
113
|
+
return bucket;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
exports.ShareVaultValueStatus = ShareVaultValueStatus;
|
|
117
|
+
class StrategyVaultValueStatus {
|
|
118
|
+
assets;
|
|
119
|
+
pools;
|
|
120
|
+
totalSupply;
|
|
121
|
+
oracleConfig;
|
|
122
|
+
underlyingAssets = {};
|
|
123
|
+
vaultAssets = {};
|
|
124
|
+
oracleAssets = new Set();
|
|
125
|
+
constructor(assets, pools, totalSupply, oracleConfig) {
|
|
126
|
+
this.assets = assets;
|
|
127
|
+
this.pools = pools;
|
|
128
|
+
this.totalSupply = totalSupply;
|
|
129
|
+
this.oracleConfig = oracleConfig;
|
|
130
|
+
Object.values(oracleConfig.redstoneAssetInfo).forEach((item) => {
|
|
131
|
+
this.oracleAssets.add(item.address.toString());
|
|
132
|
+
});
|
|
133
|
+
Object.keys(oracleConfig.assetOnchainDataInfo).forEach((item) => {
|
|
134
|
+
this.oracleAssets.add(item);
|
|
135
|
+
});
|
|
136
|
+
Object.entries(this.assets).forEach(([asset, position]) => {
|
|
137
|
+
if (this.oracleAssets.has(asset)) {
|
|
138
|
+
this.underlyingAssets[asset] = position;
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
this.vaultAssets[asset] = position;
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
static async fromVault(vault) {
|
|
146
|
+
const vaultData = await vault.getVaultData();
|
|
147
|
+
return StrategyVaultValueStatus.fromVaultData(vaultData);
|
|
148
|
+
}
|
|
149
|
+
static fromVaultData(vaultData) {
|
|
150
|
+
const assets = {};
|
|
151
|
+
Object.entries(vaultData.assets).forEach(([asset, assetData]) => {
|
|
152
|
+
assets[asset] = new AssetPosition(assetData.cash);
|
|
153
|
+
});
|
|
154
|
+
const pools = {};
|
|
155
|
+
Object.entries(vaultData.factorialPools).forEach(([pool, poolAssets]) => {
|
|
156
|
+
const poolPosition = {};
|
|
157
|
+
Object.entries(poolAssets).forEach(([asset, position]) => {
|
|
158
|
+
poolPosition[asset] = PoolAssetPosition.fromPosition(position);
|
|
159
|
+
});
|
|
160
|
+
pools[pool] = poolPosition;
|
|
161
|
+
});
|
|
162
|
+
return new StrategyVaultValueStatus(assets, pools, vaultData.totalSupply, vaultData.oracleConfig);
|
|
163
|
+
}
|
|
164
|
+
bucket(bucket = new AddressBucket()) {
|
|
165
|
+
bucket.updateVaultAssetPositions(this.underlyingAssets);
|
|
166
|
+
bucket.updateVaultPoolPositions(this.pools);
|
|
167
|
+
return bucket;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
exports.StrategyVaultValueStatus = StrategyVaultValueStatus;
|
|
171
|
+
class AddressBucket {
|
|
172
|
+
assets;
|
|
173
|
+
pools;
|
|
174
|
+
vaults;
|
|
175
|
+
constructor(assets = new Set(), pools = new Set(), vaults = new Set()) {
|
|
176
|
+
this.assets = assets;
|
|
177
|
+
this.pools = pools;
|
|
178
|
+
this.vaults = vaults;
|
|
179
|
+
}
|
|
180
|
+
getAssets() {
|
|
181
|
+
return [...this.assets];
|
|
182
|
+
}
|
|
183
|
+
getVaultAssets() {
|
|
184
|
+
return [...this.vaults];
|
|
185
|
+
}
|
|
186
|
+
getPools() {
|
|
187
|
+
return [...this.pools];
|
|
188
|
+
}
|
|
189
|
+
updatePoolAssetStatus(poolAssetStatus) {
|
|
190
|
+
for (const [asset, position] of Object.entries(poolAssetStatus)) {
|
|
191
|
+
if (position.supply > 0 || position.borrow > 0) {
|
|
192
|
+
this.assets.add(asset);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
updateVaultAssetPositions(vaultAssetPositions) {
|
|
197
|
+
for (const [asset, position] of Object.entries(vaultAssetPositions)) {
|
|
198
|
+
if (position.cash > 0) {
|
|
199
|
+
this.assets.add(asset);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
updateVaultPoolPositions(vaultPoolPositions) {
|
|
204
|
+
for (const [poolAddress, poolPosition] of Object.entries(vaultPoolPositions)) {
|
|
205
|
+
for (const [_, position] of Object.entries(poolPosition)) {
|
|
206
|
+
if (position.supply > 0 || position.borrow > 0) {
|
|
207
|
+
this.pools.add(poolAddress);
|
|
208
|
+
break;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
add(other) {
|
|
214
|
+
other.assets.forEach((asset) => this.assets.add(asset));
|
|
215
|
+
other.pools.forEach((pool) => this.pools.add(pool));
|
|
216
|
+
other.vaults.forEach((vault) => this.vaults.add(vault));
|
|
217
|
+
return this;
|
|
218
|
+
}
|
|
219
|
+
object() {
|
|
220
|
+
return {
|
|
221
|
+
assets: [...this.assets],
|
|
222
|
+
pools: [...this.pools],
|
|
223
|
+
vaults: [...this.vaults],
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
exports.AddressBucket = AddressBucket;
|
|
228
|
+
class OracleLibs extends service_1.ServiceBaseV1 {
|
|
229
|
+
async getOracleParamsForPool(poolData, anyAssets = [], bucket = new AddressBucket()) {
|
|
230
|
+
const poolValueStatus = PoolValueStatus.fromPoolData(poolData);
|
|
231
|
+
await this.flattenOraclePool(poolValueStatus, bucket);
|
|
232
|
+
await this.flattenAssets(poolData.oracleConfig, anyAssets, bucket);
|
|
233
|
+
return this.makeOracleParams(bucket, poolData.oracleConfig);
|
|
234
|
+
}
|
|
235
|
+
async getOracleParamsForStrategyVault(vaultData, anyAssets = [], bucket = new AddressBucket()) {
|
|
236
|
+
const vaultStatus = StrategyVaultValueStatus.fromVaultData(vaultData);
|
|
237
|
+
await this.flattenOracleStrategyVault(vaultStatus, bucket);
|
|
238
|
+
await this.flattenAssets(vaultData.oracleConfig, anyAssets, bucket);
|
|
239
|
+
return this.makeOracleParams(bucket, vaultData.oracleConfig);
|
|
240
|
+
}
|
|
241
|
+
async getOracleParamsForStrategyVaultV2(vaultData, anyAssets = [], bucket = new AddressBucket()) {
|
|
242
|
+
const oracleParams = await this.getOracleParamsForStrategyVault(vaultData, anyAssets, bucket);
|
|
243
|
+
return {
|
|
244
|
+
oracleParams,
|
|
245
|
+
bucket,
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
async getOracleParamsForStrategyVaultRFQAuction(rfqAuctionData, bucket = new AddressBucket()) {
|
|
249
|
+
await this.flattenAssets(rfqAuctionData.oracleConfig, [
|
|
250
|
+
rfqAuctionData.sellAssetAddress.toString(),
|
|
251
|
+
rfqAuctionData.buyAssetAddress.toString(),
|
|
252
|
+
], bucket);
|
|
253
|
+
return this.makeOracleParams(bucket, rfqAuctionData.oracleConfig);
|
|
254
|
+
}
|
|
255
|
+
async getOracleParamsForRFQBatch(rfqBatchData, bucket = new AddressBucket()) {
|
|
256
|
+
await this.flattenAssets(rfqBatchData.oracleConfig, [
|
|
257
|
+
rfqBatchData.asset0Address.toString(),
|
|
258
|
+
rfqBatchData.asset1Address.toString(),
|
|
259
|
+
], bucket);
|
|
260
|
+
const oracleParams = await this.makeOracleParams(bucket, rfqBatchData.oracleConfig);
|
|
261
|
+
return {
|
|
262
|
+
oracleParams,
|
|
263
|
+
bucket,
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
async flattenOraclePool(pool, bucket = new AddressBucket()) {
|
|
267
|
+
bucket.updatePoolAssetStatus(pool.underlyingAssets);
|
|
268
|
+
const parsedVault = await this.getParsedVaults(Object.entries(pool.vaultAssets)
|
|
269
|
+
.filter(([_, position]) => position.cash > 0)
|
|
270
|
+
.map(([asset, _]) => asset), bucket);
|
|
271
|
+
Object.values(parsedVault.strategyVaults).forEach((vault) => {
|
|
272
|
+
this.flattenOracleStrategyVault(vault, bucket);
|
|
273
|
+
});
|
|
274
|
+
Object.values(parsedVault.shareVaults).forEach((vault) => {
|
|
275
|
+
this.flattenOracleShareVault(vault, bucket);
|
|
276
|
+
});
|
|
277
|
+
return bucket;
|
|
278
|
+
}
|
|
279
|
+
async flattenOracleShareVault(shareVault, bucket = new AddressBucket()) {
|
|
280
|
+
bucket.updateVaultAssetPositions(shareVault.assets);
|
|
281
|
+
bucket.updateVaultPoolPositions(shareVault.pools);
|
|
282
|
+
return bucket;
|
|
283
|
+
}
|
|
284
|
+
async flattenOracleStrategyVault(strategyVault, bucket = new AddressBucket()) {
|
|
285
|
+
bucket.updateVaultAssetPositions(strategyVault.underlyingAssets);
|
|
286
|
+
bucket.updateVaultPoolPositions(strategyVault.pools);
|
|
287
|
+
const parsedVault = await this.getParsedVaults(Object.entries(strategyVault.vaultAssets)
|
|
288
|
+
.filter(([_, position]) => position.cash > 0)
|
|
289
|
+
.map(([asset, _]) => asset), bucket);
|
|
290
|
+
Object.values(parsedVault.strategyVaults).forEach((vault) => {
|
|
291
|
+
this.flattenOracleStrategyVault(vault, bucket);
|
|
292
|
+
});
|
|
293
|
+
Object.values(parsedVault.shareVaults).forEach((vault) => {
|
|
294
|
+
this.flattenOracleShareVault(vault, bucket);
|
|
295
|
+
});
|
|
296
|
+
return bucket;
|
|
297
|
+
}
|
|
298
|
+
getUnderlyingAssetFilter(oracleConfig, noneVaultFilter = new AddressBucket()) {
|
|
299
|
+
Object.values(oracleConfig.redstoneAssetInfo).map((item) => {
|
|
300
|
+
noneVaultFilter.assets.add(item.address.toString());
|
|
301
|
+
});
|
|
302
|
+
Object.keys(oracleConfig.assetOnchainDataInfo).map((item) => {
|
|
303
|
+
noneVaultFilter.assets.add(item);
|
|
304
|
+
});
|
|
305
|
+
return noneVaultFilter;
|
|
306
|
+
}
|
|
307
|
+
async flattenAssets(oracleConfig, anyAssets = [], bucket = new AddressBucket()) {
|
|
308
|
+
const noneVaultFilter = this.getUnderlyingAssetFilter(oracleConfig);
|
|
309
|
+
const assets = new Set();
|
|
310
|
+
const anyVaults = new Set();
|
|
311
|
+
anyAssets.forEach((asset) => {
|
|
312
|
+
if (noneVaultFilter.assets.has(asset)) {
|
|
313
|
+
bucket.assets.add(asset);
|
|
314
|
+
assets.add(asset);
|
|
315
|
+
}
|
|
316
|
+
else {
|
|
317
|
+
anyVaults.add(asset);
|
|
318
|
+
}
|
|
319
|
+
});
|
|
320
|
+
const { strategyVaults, shareVaults } = await this.getParsedVaults([...anyVaults], bucket);
|
|
321
|
+
Object.values(strategyVaults).forEach((vault) => {
|
|
322
|
+
this.flattenOracleStrategyVault(vault, bucket);
|
|
323
|
+
});
|
|
324
|
+
Object.values(shareVaults).forEach((vault) => {
|
|
325
|
+
this.flattenOracleShareVault(vault, bucket);
|
|
326
|
+
});
|
|
327
|
+
return bucket;
|
|
328
|
+
}
|
|
329
|
+
async makeOracleParams(bucket, oracleConfig) {
|
|
330
|
+
const { assets, pools, vaults } = bucket.object();
|
|
331
|
+
const requestFactorialPoolsCell = pools.length > 0
|
|
332
|
+
? redstone_onchain_oracle_1.RedstoneOnchainOracle.createAddressToTupleCell(pools.map((pool) => core_1.Address.parse(pool)))
|
|
333
|
+
: null;
|
|
334
|
+
const requestFactorialVaultsCell = vaults.length > 0
|
|
335
|
+
? redstone_onchain_oracle_1.RedstoneOnchainOracle.createAddressToTupleCell(vaults.map((vault) => core_1.Address.parse(vault)))
|
|
336
|
+
: null;
|
|
337
|
+
const requestFactorialCell = (0, core_1.beginCell)()
|
|
338
|
+
.storeMaybeRef(requestFactorialPoolsCell)
|
|
339
|
+
.storeMaybeRef(requestFactorialVaultsCell)
|
|
340
|
+
.endCell();
|
|
341
|
+
const result = redstone_onchain_oracle_1.RedstoneOnchainOracle.getOracleRequestParams(assets,
|
|
342
|
+
// @ts-ignore
|
|
343
|
+
oracleConfig);
|
|
344
|
+
const helper = (0, redstoneHelper_1.createRedstoneHelper)("prod");
|
|
345
|
+
const payload = await helper.createPayload(result.redstoneAssetNames);
|
|
346
|
+
const requestAssetCell = redstone_onchain_oracle_1.RedstoneOnchainOracle.createAddressToTupleCell(result.requestAssets);
|
|
347
|
+
const dataFeedIdsTupleBuilder = new core_1.TupleBuilder();
|
|
348
|
+
result.feedIds.forEach((item) => dataFeedIdsTupleBuilder.writeNumber(item));
|
|
349
|
+
const feedIdCell = (0, core_1.serializeTuple)(dataFeedIdsTupleBuilder.build());
|
|
350
|
+
const oracleParams = (0, core_1.beginCell)()
|
|
351
|
+
.storeRef(feedIdCell)
|
|
352
|
+
.storeRef(payload)
|
|
353
|
+
.storeRef(requestAssetCell)
|
|
354
|
+
.storeRef(requestFactorialCell)
|
|
355
|
+
.endCell();
|
|
356
|
+
return oracleParams;
|
|
357
|
+
}
|
|
358
|
+
async getParsedVaults(vaultAddresses, bucket = new AddressBucket()) {
|
|
359
|
+
const strategyVaults = {};
|
|
360
|
+
const shareVaults = {};
|
|
361
|
+
await Promise.all(vaultAddresses.map(async (vaultAddress) => {
|
|
362
|
+
if (bucket.vaults.has(vaultAddress.toString())) {
|
|
363
|
+
return;
|
|
364
|
+
}
|
|
365
|
+
const state = await this.getByContract(unknown_contract_1.UnknownContract, vaultAddress).getState();
|
|
366
|
+
if (state.state.type === "active" && state.state.data) {
|
|
367
|
+
const data = core_1.Cell.fromBoc(state.state.data)[0];
|
|
368
|
+
try {
|
|
369
|
+
bucket.vaults.add(vaultAddress.toString());
|
|
370
|
+
const vaultData = strategy_vault_1.StrategyVault.parseVaultData(data);
|
|
371
|
+
await this.flattenAssets(vaultData.oracleConfig, Object.keys(vaultData.assets), bucket);
|
|
372
|
+
const vaultStatus = StrategyVaultValueStatus.fromVaultData(vaultData);
|
|
373
|
+
strategyVaults[vaultAddress.toString()] = vaultStatus;
|
|
374
|
+
Object.keys(vaultStatus.pools).forEach((pool) => {
|
|
375
|
+
bucket.pools.add(pool);
|
|
376
|
+
});
|
|
377
|
+
}
|
|
378
|
+
catch (e) {
|
|
379
|
+
bucket.vaults.add(vaultAddress.toString());
|
|
380
|
+
const vaultData = share_vault_1.ShareVault.parseVaultData(data);
|
|
381
|
+
const vaultStatus = ShareVaultValueStatus.fromVaultData(vaultData);
|
|
382
|
+
shareVaults[vaultAddress.toString()] = vaultStatus;
|
|
383
|
+
Object.keys(vaultStatus.pools).forEach((pool) => {
|
|
384
|
+
bucket.pools.add(pool);
|
|
385
|
+
});
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
}));
|
|
389
|
+
return { strategyVaults, shareVaults };
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
exports.OracleLibs = OracleLibs;
|