zo-sdk 0.0.4 → 0.0.6
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/.gitattributes +4 -0
- package/.prettierrc.js +5 -0
- package/babel.config.js +11 -0
- package/dist/api.d.ts +25 -0
- package/dist/api.js +397 -0
- package/dist/api.js.map +1 -0
- package/dist/consts/deployments-mainnet.json +28 -0
- package/dist/consts/deployments-testnet.json +93 -0
- package/dist/consts/index.d.ts +65 -0
- package/dist/consts/index.js +103 -0
- package/dist/consts/index.js.map +1 -0
- package/dist/consts/price_id_to_object_id.mainnet.json +1 -0
- package/dist/consts/price_id_to_object_id.testnet.json +17 -0
- package/dist/consts/staking/deployments-mainnet.json +12 -0
- package/dist/consts/staking/deployments-testnet.json +11 -0
- package/dist/data.d.ts +220 -0
- package/dist/data.js +753 -0
- package/dist/data.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/oracle.d.ts +23 -0
- package/dist/oracle.js +135 -0
- package/dist/oracle.js.map +1 -0
- package/dist/utils.d.ts +45 -0
- package/dist/utils.js +144 -0
- package/dist/utils.js.map +1 -0
- package/package.json +29 -30
- package/src/consts/index.ts +19 -19
- package/src/utils.ts +5 -6
- package/tsconfig.json +9 -19
package/dist/data.js
ADDED
|
@@ -0,0 +1,753 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* eslint-disable class-methods-use-this */
|
|
3
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
4
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
5
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
6
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
7
|
+
};
|
|
8
|
+
var _DataAPI_instances, _DataAPI_parseMarketInfo, _DataAPI_parseVaultInfo, _DataAPI_parseSymbolInfo, _DataAPI_parseRebaseFeeModel, _DataAPI_parseReservingFeeModel, _DataAPI_parseFundingFeeModel, _DataAPI_parsePositionConfig, _DataAPI_parsePositionInfo, _DataAPI_parseOrderInfo, _DataAPI_calcRebaseFeeRate, _DataAPI_calcReservingFeeRate, _DataAPI_calcFundingFeeRate, _DataAPI_vaultUtilization, _DataAPI_calcAccReservingFeeRate, _DataAPI_calcDeltaSize, _DataAPI_calcAccFundingFeeRate, _DataAPI_calculateSymbolFundingFee, _DataAPI_calculatePositionFundingFee, _DataAPI_calculateVaultReservingFee, _DataAPI_calculatePositionReserveFee, _DataAPI_parseStakePool, _DataAPI_parseCredential, _DataAPI_refreshPool;
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.DataAPI = void 0;
|
|
11
|
+
const utils_1 = require("@mysten/sui/utils");
|
|
12
|
+
const consts_1 = require("./consts");
|
|
13
|
+
const oracle_1 = require("./oracle");
|
|
14
|
+
const utils_2 = require("./utils");
|
|
15
|
+
;
|
|
16
|
+
class DataAPI extends oracle_1.OracleAPI {
|
|
17
|
+
constructor(network, provider, apiEndpoint, connectionURL) {
|
|
18
|
+
super(network, provider, connectionURL);
|
|
19
|
+
_DataAPI_instances.add(this);
|
|
20
|
+
this.vaultInfoCache = {};
|
|
21
|
+
this.symbolInfoCache = {};
|
|
22
|
+
this.marketInfoCache = null;
|
|
23
|
+
this.positionConfigCache = {};
|
|
24
|
+
this.rebaseFeeModelCache = null;
|
|
25
|
+
this.lastUpdate = 0;
|
|
26
|
+
this.validateCache = () => {
|
|
27
|
+
super.validateCache();
|
|
28
|
+
if (this.lastUpdate + 1000 * 60 * 3 < Date.now()) {
|
|
29
|
+
this.lastUpdate = Date.now();
|
|
30
|
+
this.vaultInfoCache = {};
|
|
31
|
+
this.symbolInfoCache = {};
|
|
32
|
+
this.marketInfoCache = null;
|
|
33
|
+
this.positionConfigCache = {};
|
|
34
|
+
this.rebaseFeeModelCache = null;
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
this.valuateVaults = (tx) => {
|
|
38
|
+
const vaultsValuation = tx.moveCall({
|
|
39
|
+
target: `${this.consts.zoCore.package}::market::create_vaults_valuation`,
|
|
40
|
+
typeArguments: [`${this.consts.zoCore.package}::zlp::ZLP`],
|
|
41
|
+
arguments: [
|
|
42
|
+
tx.object(utils_1.SUI_CLOCK_OBJECT_ID),
|
|
43
|
+
tx.object(this.consts.zoCore.market),
|
|
44
|
+
],
|
|
45
|
+
});
|
|
46
|
+
for (const key of Object.keys(this.consts.zoCore.vaults)) {
|
|
47
|
+
const vault = this.consts.zoCore.vaults[key];
|
|
48
|
+
tx.moveCall({
|
|
49
|
+
// todo
|
|
50
|
+
target: `${this.consts.zoCore.package}::market::valuate_vault`,
|
|
51
|
+
typeArguments: [
|
|
52
|
+
`${this.consts.zoCore.package}::zlp::ZLP`,
|
|
53
|
+
this.consts.coins[key].module,
|
|
54
|
+
],
|
|
55
|
+
arguments: [
|
|
56
|
+
tx.object(this.consts.zoCore.market),
|
|
57
|
+
tx.object(vault.reservingFeeModel),
|
|
58
|
+
tx.object(this.consts.pythFeeder.feeder[key]),
|
|
59
|
+
vaultsValuation,
|
|
60
|
+
],
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
return vaultsValuation;
|
|
64
|
+
};
|
|
65
|
+
this.valuateSymbols = (tx) => {
|
|
66
|
+
const symbolsValuation = tx.moveCall({
|
|
67
|
+
target: `${this.consts.zoCore.package}::market::create_symbols_valuation`,
|
|
68
|
+
typeArguments: [`${this.consts.zoCore.package}::zlp::ZLP`],
|
|
69
|
+
arguments: [
|
|
70
|
+
tx.object(utils_1.SUI_CLOCK_OBJECT_ID),
|
|
71
|
+
tx.object(this.consts.zoCore.market),
|
|
72
|
+
],
|
|
73
|
+
});
|
|
74
|
+
for (const key of Object.keys(this.consts.zoCore.symbols)) {
|
|
75
|
+
const [direction, token] = (0, utils_2.parseSymbolKey)(key);
|
|
76
|
+
const symbol = this.consts.zoCore.symbols[key];
|
|
77
|
+
tx.moveCall({
|
|
78
|
+
target: `${this.consts.zoCore.package}::market::valuate_symbol`,
|
|
79
|
+
typeArguments: [
|
|
80
|
+
`${this.consts.zoCore.package}::zlp::ZLP`,
|
|
81
|
+
this.consts.coins[token].module,
|
|
82
|
+
`${this.consts.zoCore.package}::market::${direction.toUpperCase()}`,
|
|
83
|
+
],
|
|
84
|
+
arguments: [
|
|
85
|
+
tx.object(this.consts.zoCore.market),
|
|
86
|
+
tx.object(symbol.fundingFeeModel),
|
|
87
|
+
tx.object(this.consts.pythFeeder.feeder[token]),
|
|
88
|
+
symbolsValuation,
|
|
89
|
+
],
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
return symbolsValuation;
|
|
93
|
+
};
|
|
94
|
+
this.valuate = (tx) => {
|
|
95
|
+
const vaultsValuation = this.valuateVaults(tx);
|
|
96
|
+
const symbolsValuation = this.valuateSymbols(tx);
|
|
97
|
+
return {
|
|
98
|
+
vaultsValuation,
|
|
99
|
+
symbolsValuation,
|
|
100
|
+
};
|
|
101
|
+
};
|
|
102
|
+
_DataAPI_parseVaultInfo.set(this, async (raw) => {
|
|
103
|
+
const vaultFields = raw.data.content.fields.value.fields;
|
|
104
|
+
const reservingFeeModelAddr = vaultFields.reserving_fee_model;
|
|
105
|
+
const reservingFeeModelRaw = await this.provider.getObject({
|
|
106
|
+
id: reservingFeeModelAddr,
|
|
107
|
+
options: {
|
|
108
|
+
showContent: true,
|
|
109
|
+
},
|
|
110
|
+
});
|
|
111
|
+
const reservingFeeModel = __classPrivateFieldGet(this, _DataAPI_instances, "m", _DataAPI_parseReservingFeeModel).call(this, reservingFeeModelRaw);
|
|
112
|
+
return {
|
|
113
|
+
liquidity: (0, utils_2.parseValue)(vaultFields.liquidity),
|
|
114
|
+
reservedAmount: (0, utils_2.parseValue)(vaultFields.reserved_amount),
|
|
115
|
+
unrealisedReservingFeeAmount: (0, utils_2.parseValue)(vaultFields.unrealised_reserving_fee_amount),
|
|
116
|
+
accReservingRate: (0, utils_2.parseValue)(vaultFields.acc_reserving_rate),
|
|
117
|
+
enabled: vaultFields.enabled,
|
|
118
|
+
weight: (0, utils_2.parseValue)(vaultFields.weight),
|
|
119
|
+
lastUpdate: (0, utils_2.parseValue)(vaultFields.last_update),
|
|
120
|
+
reservingFeeModel,
|
|
121
|
+
priceConfig: {
|
|
122
|
+
maxInterval: (0, utils_2.parseValue)(vaultFields.price_config.fields.max_interval),
|
|
123
|
+
maxConfidence: (0, utils_2.parseValue)(vaultFields.price_config.fields.max_confidence),
|
|
124
|
+
precision: (0, utils_2.parseValue)(vaultFields.price_config.fields.precision),
|
|
125
|
+
feeder: vaultFields.price_config.fields.feeder,
|
|
126
|
+
},
|
|
127
|
+
};
|
|
128
|
+
});
|
|
129
|
+
_DataAPI_parseSymbolInfo.set(this, async (raw, long) => {
|
|
130
|
+
const { fields } = raw.data.content.fields.value;
|
|
131
|
+
const fundingFeeModelAddr = fields.funding_fee_model;
|
|
132
|
+
const fundingFeeModelRaw = await this.provider.getObject({
|
|
133
|
+
id: fundingFeeModelAddr,
|
|
134
|
+
options: {
|
|
135
|
+
showContent: true,
|
|
136
|
+
},
|
|
137
|
+
});
|
|
138
|
+
const fundingFeeModel = __classPrivateFieldGet(this, _DataAPI_instances, "m", _DataAPI_parseFundingFeeModel).call(this, fundingFeeModelRaw);
|
|
139
|
+
return {
|
|
140
|
+
openingSize: (0, utils_2.parseValue)(fields.opening_size),
|
|
141
|
+
openingAmount: (0, utils_2.parseValue)(fields.opening_amount),
|
|
142
|
+
accFundingRate: (0, utils_2.parseValue)(fields.acc_funding_rate),
|
|
143
|
+
realisedPnl: (0, utils_2.parseValue)(fields.realised_pnl),
|
|
144
|
+
unrealisedFundingFeeValue: (0, utils_2.parseValue)(fields.unrealised_funding_fee_value),
|
|
145
|
+
openEnabled: fields.open_enabled,
|
|
146
|
+
liquidateEnabled: fields.liquidate_enabled,
|
|
147
|
+
decreaseEnabled: fields.decrease_enabled,
|
|
148
|
+
lastUpdate: (0, utils_2.parseValue)(fields.last_update),
|
|
149
|
+
fundingFeeModel,
|
|
150
|
+
long,
|
|
151
|
+
priceConfig: {
|
|
152
|
+
maxInterval: (0, utils_2.parseValue)(fields.price_config.fields.max_interval),
|
|
153
|
+
maxConfidence: (0, utils_2.parseValue)(fields.price_config.fields.max_confidence),
|
|
154
|
+
precision: (0, utils_2.parseValue)(fields.price_config.fields.precision),
|
|
155
|
+
feeder: fields.price_config.fields.feeder,
|
|
156
|
+
},
|
|
157
|
+
};
|
|
158
|
+
});
|
|
159
|
+
this.fundingFeeRate = async (indexToken, long) => {
|
|
160
|
+
const symbol = await this.getSymbolInfo(indexToken, long);
|
|
161
|
+
if (symbol.lastUpdate <= 0) {
|
|
162
|
+
return 0;
|
|
163
|
+
}
|
|
164
|
+
const price = (await this.getOraclePrice(indexToken)).getPriceUnchecked().getPriceAsNumberUnchecked();
|
|
165
|
+
const lpSupplyAmount = (await this.getMarketInfo()).lpSupplyWithDecimals;
|
|
166
|
+
const model = symbol.fundingFeeModel;
|
|
167
|
+
const elapsed = consts_1.SECONDS_PER_EIGHT_HOUR;
|
|
168
|
+
const deltaSize = __classPrivateFieldGet(this, _DataAPI_instances, "m", _DataAPI_calcDeltaSize).call(this, symbol, price);
|
|
169
|
+
const pnlPerLp = (symbol.realisedPnl + symbol.unrealisedFundingFeeValue + deltaSize) / lpSupplyAmount;
|
|
170
|
+
return __classPrivateFieldGet(this, _DataAPI_instances, "m", _DataAPI_calcFundingFeeRate).call(this, model, pnlPerLp, elapsed);
|
|
171
|
+
};
|
|
172
|
+
this.rebaseFeeRate = async (collateralToken, increase, amount) => {
|
|
173
|
+
let vaultValue = 0;
|
|
174
|
+
if (!increase && amount > 0) {
|
|
175
|
+
amount = -amount;
|
|
176
|
+
}
|
|
177
|
+
const value = amount * (await this.getOraclePrice(collateralToken)).getPriceUnchecked().getPriceAsNumberUnchecked() / (10 ** this.consts.coins[collateralToken].decimals);
|
|
178
|
+
const vaultPromises = Object.keys(this.consts.zoCore.vaults).map(async (vault) => {
|
|
179
|
+
const vaultInfo = await this.getVaultInfo(vault);
|
|
180
|
+
const reservingFeeDelta = __classPrivateFieldGet(this, _DataAPI_instances, "m", _DataAPI_calculateVaultReservingFee).call(this, vaultInfo, vaultInfo.reservingFeeModel, Date.now() / 1000);
|
|
181
|
+
const res = (reservingFeeDelta + vaultInfo.liquidity + vaultInfo.reservedAmount) * (await this.getOraclePrice(vault)).getPriceUnchecked().getPriceAsNumberUnchecked() / (10 ** this.consts.coins[vault].decimals);
|
|
182
|
+
if (collateralToken === vault) {
|
|
183
|
+
vaultValue = res;
|
|
184
|
+
}
|
|
185
|
+
return res;
|
|
186
|
+
});
|
|
187
|
+
const vaultValues = await Promise.all(vaultPromises);
|
|
188
|
+
const totalVaultValue = vaultValues.reduce((acc, curr) => acc + curr, 0);
|
|
189
|
+
const targetRatio = Number.parseInt(this.consts.zoCore.vaults[collateralToken].weight, 10) / Object.values(this.consts.zoCore.vaults)
|
|
190
|
+
.map(e => Number.parseInt(e.weight, 10))
|
|
191
|
+
.reduce((acc, curr) => acc + curr, 0);
|
|
192
|
+
return __classPrivateFieldGet(this, _DataAPI_instances, "m", _DataAPI_calcRebaseFeeRate).call(this, await this.getRebaseFeeModel(), increase, (vaultValue + value) / (totalVaultValue + value), targetRatio);
|
|
193
|
+
};
|
|
194
|
+
this.reservingFeeRate = async (collateralToken, amount = 0) => {
|
|
195
|
+
const vaultInfo = await this.getVaultInfo(collateralToken);
|
|
196
|
+
const vaultSupply = vaultInfo.liquidity + vaultInfo.reservedAmount + vaultInfo.unrealisedReservingFeeAmount + amount;
|
|
197
|
+
const utilization = vaultSupply ? ((vaultInfo.reservedAmount + amount) / vaultSupply) : 0;
|
|
198
|
+
return __classPrivateFieldGet(this, _DataAPI_instances, "m", _DataAPI_calcReservingFeeRate).call(this, vaultInfo.reservingFeeModel, utilization, consts_1.SECONDS_PER_EIGHT_HOUR);
|
|
199
|
+
};
|
|
200
|
+
this.getProxiedHistories = async (trader) => {
|
|
201
|
+
const url = `${this.apiEndpoint}/traderEvents?trader=${trader}`;
|
|
202
|
+
const res = await fetch(url, {
|
|
203
|
+
method: 'GET',
|
|
204
|
+
headers: {
|
|
205
|
+
'Content-Type': 'application/json',
|
|
206
|
+
},
|
|
207
|
+
});
|
|
208
|
+
const historyInfoList = await res.json();
|
|
209
|
+
return historyInfoList;
|
|
210
|
+
};
|
|
211
|
+
this.getStaked = async (owner) => {
|
|
212
|
+
const rawCredentials = await this.provider.getOwnedObjects({
|
|
213
|
+
owner,
|
|
214
|
+
filter: {
|
|
215
|
+
MoveModule: {
|
|
216
|
+
package: this.consts.zoStaking.package,
|
|
217
|
+
module: 'pool',
|
|
218
|
+
},
|
|
219
|
+
},
|
|
220
|
+
options: {
|
|
221
|
+
showType: true,
|
|
222
|
+
showContent: true,
|
|
223
|
+
},
|
|
224
|
+
});
|
|
225
|
+
const pool = await this.getStakePool();
|
|
226
|
+
const credentials = rawCredentials.data.map((item) => __classPrivateFieldGet(this, _DataAPI_instances, "m", _DataAPI_parseCredential).call(this, item, pool));
|
|
227
|
+
return {
|
|
228
|
+
credentials,
|
|
229
|
+
amount: credentials.reduce((acc, cur) => acc + cur.amount, BigInt(0)),
|
|
230
|
+
claimable: credentials.reduce((acc, cur) => acc + cur.claimable, BigInt(0)),
|
|
231
|
+
};
|
|
232
|
+
};
|
|
233
|
+
this.getStakePool = async () => {
|
|
234
|
+
const raw = await this.provider.getObject({
|
|
235
|
+
id: this.consts.zoStaking.pool,
|
|
236
|
+
options: {
|
|
237
|
+
showContent: true,
|
|
238
|
+
},
|
|
239
|
+
});
|
|
240
|
+
return __classPrivateFieldGet(this, _DataAPI_instances, "m", _DataAPI_parseStakePool).call(this, raw);
|
|
241
|
+
};
|
|
242
|
+
this.provider = provider || (0, utils_2.createJsonRpcProvider)(network);
|
|
243
|
+
this.apiEndpoint = apiEndpoint;
|
|
244
|
+
}
|
|
245
|
+
async getPastFee(days = 7) {
|
|
246
|
+
// FIXME: Use Sentio data
|
|
247
|
+
const url = `${this.apiEndpoint}/histories/proxy/fee?days=${days}`;
|
|
248
|
+
const res = await fetch(url, {
|
|
249
|
+
method: 'GET',
|
|
250
|
+
headers: {
|
|
251
|
+
'Content-Type': 'application/json',
|
|
252
|
+
},
|
|
253
|
+
});
|
|
254
|
+
return Number.parseFloat(await res.text() || '0');
|
|
255
|
+
}
|
|
256
|
+
async valuateMarket() {
|
|
257
|
+
const marketInfo = await this.getMarketInfo();
|
|
258
|
+
const days = 7;
|
|
259
|
+
const fee = await this.getPastFee(days);
|
|
260
|
+
let zlpPrice = 0;
|
|
261
|
+
let value = 0;
|
|
262
|
+
const vaultPromises = Object.keys(this.consts.zoCore.vaults).map(async (vault) => {
|
|
263
|
+
const vaultInfo = await this.getVaultInfo(vault);
|
|
264
|
+
const reservingFeeDelta = __classPrivateFieldGet(this, _DataAPI_instances, "m", _DataAPI_calculateVaultReservingFee).call(this, vaultInfo, vaultInfo.reservingFeeModel, Date.now() / 1000);
|
|
265
|
+
return (reservingFeeDelta + vaultInfo.liquidity + vaultInfo.reservedAmount) * (await this.getOraclePrice(vault)).getPriceUnchecked().getPriceAsNumberUnchecked() / (10 ** this.consts.coins[vault].decimals);
|
|
266
|
+
});
|
|
267
|
+
const symbolPromises = Object.keys(this.consts.zoCore.symbols).map(async (symbol) => {
|
|
268
|
+
const [direction, tokenId] = (0, utils_2.parseSymbolKey)(symbol);
|
|
269
|
+
const symbolInfo = await this.getSymbolInfo(tokenId, direction === 'long');
|
|
270
|
+
const deltaSize = __classPrivateFieldGet(this, _DataAPI_instances, "m", _DataAPI_calcDeltaSize).call(this, symbolInfo, (await this.getOraclePrice(tokenId)).getPriceUnchecked().getPriceAsNumberUnchecked());
|
|
271
|
+
const fundingFeeDelta = __classPrivateFieldGet(this, _DataAPI_instances, "m", _DataAPI_calculateSymbolFundingFee).call(this, symbolInfo, symbolInfo.fundingFeeModel, (await this.getOraclePrice(tokenId)).getPriceUnchecked().getPriceAsNumberUnchecked(), marketInfo.lpSupplyWithDecimals, Date.now() / 1000);
|
|
272
|
+
return fundingFeeDelta + deltaSize;
|
|
273
|
+
});
|
|
274
|
+
const [vaultValues, symbolValues] = await Promise.all([Promise.all(vaultPromises), Promise.all(symbolPromises)]);
|
|
275
|
+
value = vaultValues.reduce((acc, curr) => acc + curr, 0);
|
|
276
|
+
value += symbolValues.reduce((acc, curr) => acc + curr, 0);
|
|
277
|
+
zlpPrice = value / marketInfo.lpSupplyWithDecimals;
|
|
278
|
+
return {
|
|
279
|
+
marketCap: value,
|
|
280
|
+
zlpPrice,
|
|
281
|
+
zlpSupply: marketInfo.lpSupplyWithDecimals,
|
|
282
|
+
apr: (fee / value) * 365 / days,
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
async getMarketInfo() {
|
|
286
|
+
this.validateCache();
|
|
287
|
+
if (this.marketInfoCache) {
|
|
288
|
+
return this.marketInfoCache;
|
|
289
|
+
}
|
|
290
|
+
const rawData = await this.provider.getObject({
|
|
291
|
+
id: this.consts.zoCore.market,
|
|
292
|
+
options: {
|
|
293
|
+
showContent: true,
|
|
294
|
+
},
|
|
295
|
+
});
|
|
296
|
+
return __classPrivateFieldGet(this, _DataAPI_instances, "m", _DataAPI_parseMarketInfo).call(this, rawData);
|
|
297
|
+
}
|
|
298
|
+
async getVaultInfo(vaultToken) {
|
|
299
|
+
this.validateCache();
|
|
300
|
+
if (this.vaultInfoCache[vaultToken]) {
|
|
301
|
+
return this.vaultInfoCache[vaultToken];
|
|
302
|
+
}
|
|
303
|
+
const rawData = await this.provider.getDynamicFieldObject({
|
|
304
|
+
parentId: this.consts.zoCore.vaultsParent,
|
|
305
|
+
name: {
|
|
306
|
+
type: `${this.consts.zoCore.package}::market::VaultName<${this.consts.coins[vaultToken].module}>`,
|
|
307
|
+
value: { dummy_field: false },
|
|
308
|
+
},
|
|
309
|
+
});
|
|
310
|
+
return await __classPrivateFieldGet(this, _DataAPI_parseVaultInfo, "f").call(this, rawData);
|
|
311
|
+
}
|
|
312
|
+
async getSymbolInfo(indexToken, long) {
|
|
313
|
+
this.validateCache();
|
|
314
|
+
const symbol = (0, utils_2.joinSymbol)(long ? 'long' : 'short', indexToken);
|
|
315
|
+
if (this.symbolInfoCache[symbol]) {
|
|
316
|
+
return this.symbolInfoCache[symbol];
|
|
317
|
+
}
|
|
318
|
+
const rawData = await this.provider.getDynamicFieldObject({
|
|
319
|
+
parentId: this.consts.zoCore.symbolsParent,
|
|
320
|
+
name: {
|
|
321
|
+
type: `${this.consts.zoCore.package}::market::SymbolName<${this.consts.coins[indexToken].module}, ${this.consts.zoCore.package}::market::${long ? 'LONG' : 'SHORT'}>`,
|
|
322
|
+
value: { dummy_field: false },
|
|
323
|
+
},
|
|
324
|
+
});
|
|
325
|
+
return await __classPrivateFieldGet(this, _DataAPI_parseSymbolInfo, "f").call(this, rawData, long);
|
|
326
|
+
}
|
|
327
|
+
async getPositionConfig(indexToken, long) {
|
|
328
|
+
this.validateCache();
|
|
329
|
+
const symbol = (0, utils_2.joinSymbol)(long ? 'long' : 'short', indexToken);
|
|
330
|
+
if (this.positionConfigCache[symbol]) {
|
|
331
|
+
return this.positionConfigCache[symbol];
|
|
332
|
+
}
|
|
333
|
+
const rawData = await this.provider.getObject({
|
|
334
|
+
id: this.consts.zoCore.symbols[symbol].positionConfig,
|
|
335
|
+
options: {
|
|
336
|
+
showContent: true,
|
|
337
|
+
},
|
|
338
|
+
});
|
|
339
|
+
return __classPrivateFieldGet(this, _DataAPI_instances, "m", _DataAPI_parsePositionConfig).call(this, rawData);
|
|
340
|
+
}
|
|
341
|
+
async getPositionCapInfoList(owner) {
|
|
342
|
+
const positionCaps = await this.provider.getOwnedObjects({
|
|
343
|
+
owner,
|
|
344
|
+
filter: {
|
|
345
|
+
MoveModule: {
|
|
346
|
+
package: this.consts.zoCore.package,
|
|
347
|
+
module: 'market',
|
|
348
|
+
},
|
|
349
|
+
},
|
|
350
|
+
options: {
|
|
351
|
+
showType: true,
|
|
352
|
+
},
|
|
353
|
+
});
|
|
354
|
+
const positionCapInfoList = [];
|
|
355
|
+
for (const positionCap of positionCaps.data) {
|
|
356
|
+
if (positionCap.data?.type?.includes('PositionCap')) {
|
|
357
|
+
positionCapInfoList.push({
|
|
358
|
+
positionCapId: positionCap.data.objectId,
|
|
359
|
+
symbol0: positionCap.data.type.split('<')[1].split(',')[0].trim(),
|
|
360
|
+
symbol1: positionCap.data.type.split('<')[1].split(',')[1].split(',')[0].trim(),
|
|
361
|
+
long: positionCap.data.type.includes('LONG'),
|
|
362
|
+
});
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
return positionCapInfoList;
|
|
366
|
+
}
|
|
367
|
+
async getPositionInfoList(positionCapInfoList, owner) {
|
|
368
|
+
const positionInfoList = [];
|
|
369
|
+
await Promise.all(positionCapInfoList.map(async (positionCapInfo) => {
|
|
370
|
+
const positionRaw = await this.provider.getDynamicFieldObject({
|
|
371
|
+
parentId: this.consts.zoCore.positionsParent,
|
|
372
|
+
name: {
|
|
373
|
+
type: `${this.consts.zoCore.package}::market::PositionName<${positionCapInfo.symbol0}, ${positionCapInfo.symbol1}, ${this.consts.zoCore.package}::market::${positionCapInfo.long ? 'LONG' : 'SHORT'}>`,
|
|
374
|
+
value: {
|
|
375
|
+
owner,
|
|
376
|
+
id: positionCapInfo.positionCapId,
|
|
377
|
+
},
|
|
378
|
+
},
|
|
379
|
+
});
|
|
380
|
+
positionInfoList.push(await __classPrivateFieldGet(this, _DataAPI_instances, "m", _DataAPI_parsePositionInfo).call(this, positionRaw, positionCapInfo.positionCapId));
|
|
381
|
+
}));
|
|
382
|
+
return positionInfoList.sort((a, b) => a.openTimestamp > b.openTimestamp ? 1 : -1);
|
|
383
|
+
}
|
|
384
|
+
async getOrderCapInfoList(owner) {
|
|
385
|
+
const orderCaps = await this.provider.getOwnedObjects({
|
|
386
|
+
owner,
|
|
387
|
+
filter: {
|
|
388
|
+
MoveModule: {
|
|
389
|
+
package: this.consts.zoCore.package,
|
|
390
|
+
module: 'market',
|
|
391
|
+
},
|
|
392
|
+
},
|
|
393
|
+
options: {
|
|
394
|
+
showType: true,
|
|
395
|
+
showContent: true,
|
|
396
|
+
},
|
|
397
|
+
});
|
|
398
|
+
const orderCapInfoList = [];
|
|
399
|
+
for (const orderCap of orderCaps.data) {
|
|
400
|
+
if (orderCap.data?.type?.includes('OrderCap')) {
|
|
401
|
+
orderCapInfoList.push({
|
|
402
|
+
orderCapId: orderCap.data.objectId,
|
|
403
|
+
symbol0: orderCap.data.type.split('<')[1].split(',')[0].trim(),
|
|
404
|
+
symbol1: orderCap.data.type.split('<')[1].split(',')[1].split(',')[0].trim(),
|
|
405
|
+
long: orderCap.data.type.includes('LONG'),
|
|
406
|
+
positionId: orderCap.data.content?.fields?.position_id,
|
|
407
|
+
});
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
return orderCapInfoList;
|
|
411
|
+
}
|
|
412
|
+
async getOrderInfoList(orderCapInfoList, owner) {
|
|
413
|
+
const orderInfoList = [];
|
|
414
|
+
await Promise.all(orderCapInfoList.map(async (orderCapInfo) => {
|
|
415
|
+
const orderRaw = await this.provider.getDynamicFieldObject({
|
|
416
|
+
parentId: this.consts.zoCore.ordersParent,
|
|
417
|
+
name: {
|
|
418
|
+
type: `${this.consts.zoCore.package}::market::OrderName<${orderCapInfo.symbol0}, ${orderCapInfo.symbol1}, ${this.consts.zoCore.package}::market::${orderCapInfo.long ? 'LONG' : 'SHORT'}, ${this.consts.coins.sui.module}>`,
|
|
419
|
+
value: {
|
|
420
|
+
owner,
|
|
421
|
+
id: orderCapInfo.orderCapId,
|
|
422
|
+
position_id: {
|
|
423
|
+
vec: orderCapInfo.positionId ? [orderCapInfo.positionId] : [],
|
|
424
|
+
},
|
|
425
|
+
},
|
|
426
|
+
},
|
|
427
|
+
});
|
|
428
|
+
orderInfoList.push(__classPrivateFieldGet(this, _DataAPI_instances, "m", _DataAPI_parseOrderInfo).call(this, orderRaw, orderCapInfo.orderCapId));
|
|
429
|
+
}));
|
|
430
|
+
return orderInfoList.sort((a, b) => a.createdAt > b.createdAt ? 1 : -1);
|
|
431
|
+
}
|
|
432
|
+
async getRebaseFeeModel() {
|
|
433
|
+
this.validateCache();
|
|
434
|
+
if (this.rebaseFeeModelCache) {
|
|
435
|
+
return this.rebaseFeeModelCache;
|
|
436
|
+
}
|
|
437
|
+
const rawData = await this.provider.getObject({
|
|
438
|
+
id: this.consts.zoCore.rebaseFeeModel,
|
|
439
|
+
options: {
|
|
440
|
+
showContent: true,
|
|
441
|
+
},
|
|
442
|
+
});
|
|
443
|
+
return __classPrivateFieldGet(this, _DataAPI_instances, "m", _DataAPI_parseRebaseFeeModel).call(this, rawData);
|
|
444
|
+
}
|
|
445
|
+
async getReferralData(referree) {
|
|
446
|
+
const raw = await this.provider.getDynamicFieldObject({
|
|
447
|
+
parentId: this.consts.zoCore.referralsParent,
|
|
448
|
+
name: {
|
|
449
|
+
type: 'address',
|
|
450
|
+
value: referree,
|
|
451
|
+
},
|
|
452
|
+
});
|
|
453
|
+
return raw;
|
|
454
|
+
}
|
|
455
|
+
async hasReferral(referree) {
|
|
456
|
+
const raw = await this.getReferralData(referree);
|
|
457
|
+
return !raw.error;
|
|
458
|
+
}
|
|
459
|
+
async getReferreeFromReferrer(referrer) {
|
|
460
|
+
const url = new URL(`${this.apiEndpoint}/executions`);
|
|
461
|
+
const data = {
|
|
462
|
+
projectId: `${this.network === 'mainnet' ? 'nCBQRfhN' : 'C5iFbF6X'}`,
|
|
463
|
+
projectSlug: `zo-${this.network}`,
|
|
464
|
+
projectOwner: 'zo',
|
|
465
|
+
sqlQuery: {
|
|
466
|
+
sql: `SELECT referralSender, timestamp from \`Referral_Added\` WHERE referralReferrer = '${referrer}'`,
|
|
467
|
+
size: 100,
|
|
468
|
+
},
|
|
469
|
+
};
|
|
470
|
+
const res = await fetch(url, {
|
|
471
|
+
method: 'POST',
|
|
472
|
+
headers: {
|
|
473
|
+
'Content-Type': 'application/json',
|
|
474
|
+
},
|
|
475
|
+
body: JSON.stringify(data),
|
|
476
|
+
});
|
|
477
|
+
return (await res.json()).result.rows.map((e) => ({ address: e.referralSender, date: new Date(e.timestamp) }));
|
|
478
|
+
}
|
|
479
|
+
async getReferreeDetail(referree) {
|
|
480
|
+
const url = new URL(`${this.apiEndpoint}/executions`);
|
|
481
|
+
const data = {
|
|
482
|
+
projectId: `${this.network === 'mainnet' ? 'nCBQRfhN' : 'C5iFbF6X'}`,
|
|
483
|
+
projectSlug: `zo-${this.network}`,
|
|
484
|
+
projectOwner: 'zo',
|
|
485
|
+
sqlQuery: {
|
|
486
|
+
sql: `SELECT sum(volume) as volumeUsd, sum(rebate) as rebateUsd FROM \`User_Interaction\` WHERE distinct_id = '${referree}' and rebate != 0`,
|
|
487
|
+
size: 100,
|
|
488
|
+
},
|
|
489
|
+
};
|
|
490
|
+
const res = await fetch(url, {
|
|
491
|
+
method: 'POST',
|
|
492
|
+
headers: {
|
|
493
|
+
'Content-Type': 'application/json',
|
|
494
|
+
},
|
|
495
|
+
body: JSON.stringify(data),
|
|
496
|
+
});
|
|
497
|
+
const row = (await res.json()).result.rows[0];
|
|
498
|
+
return {
|
|
499
|
+
volumeUsd: Number.parseFloat(row.volumeUsd),
|
|
500
|
+
rebateUsd: Number.parseFloat(row.rebateUsd),
|
|
501
|
+
};
|
|
502
|
+
}
|
|
503
|
+
async getReferrerDetail(referrer) {
|
|
504
|
+
const url = new URL(`${this.apiEndpoint}/executions`);
|
|
505
|
+
const data = {
|
|
506
|
+
projectId: `${this.network === 'mainnet' ? 'nCBQRfhN' : 'C5iFbF6X'}`,
|
|
507
|
+
projectSlug: `zo-${this.network}`,
|
|
508
|
+
projectOwner: 'zo',
|
|
509
|
+
sqlQuery: {
|
|
510
|
+
sql: `SELECT sum(volume) as volumeUsd, sum(rebate) as rebateUsd FROM \`User_Interaction\` WHERE referralReceiver = '${referrer}' and rebate != 0`,
|
|
511
|
+
size: 100,
|
|
512
|
+
},
|
|
513
|
+
};
|
|
514
|
+
const res = await fetch(url, {
|
|
515
|
+
method: 'POST',
|
|
516
|
+
headers: {
|
|
517
|
+
'Content-Type': 'application/json',
|
|
518
|
+
},
|
|
519
|
+
body: JSON.stringify(data),
|
|
520
|
+
});
|
|
521
|
+
const row = (await res.json()).result.rows[0];
|
|
522
|
+
return {
|
|
523
|
+
volumeUsd: Number.parseFloat(row.volumeUsd),
|
|
524
|
+
rebateUsd: Number.parseFloat(row.rebateUsd),
|
|
525
|
+
};
|
|
526
|
+
}
|
|
527
|
+
async getReferralTxs(referrer) {
|
|
528
|
+
const url = new URL(`${this.apiEndpoint}/executions`);
|
|
529
|
+
const data = {
|
|
530
|
+
projectId: `${this.network === 'mainnet' ? 'nCBQRfhN' : 'C5iFbF6X'}`,
|
|
531
|
+
projectSlug: `zo-${this.network}`,
|
|
532
|
+
projectOwner: 'zo',
|
|
533
|
+
sqlQuery: {
|
|
534
|
+
sql: `SELECT distinct_id, volume, rebate, timestamp, transaction_hash FROM \`User_Interaction\` WHERE referralReceiver = '${referrer}' and rebate != 0 order by timestamp desc`,
|
|
535
|
+
size: 100,
|
|
536
|
+
},
|
|
537
|
+
};
|
|
538
|
+
const res = await fetch(url, {
|
|
539
|
+
method: 'POST',
|
|
540
|
+
headers: {
|
|
541
|
+
'Content-Type': 'application/json',
|
|
542
|
+
},
|
|
543
|
+
body: JSON.stringify(data),
|
|
544
|
+
});
|
|
545
|
+
const { rows } = (await res.json()).result;
|
|
546
|
+
return rows.map((e) => {
|
|
547
|
+
return {
|
|
548
|
+
referree: e.distinct_id,
|
|
549
|
+
volume: Number.parseFloat(e.volume),
|
|
550
|
+
rebate: Number.parseFloat(e.rebate),
|
|
551
|
+
date: new Date(e.timestamp),
|
|
552
|
+
tx: e.transaction_hash,
|
|
553
|
+
};
|
|
554
|
+
});
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
exports.DataAPI = DataAPI;
|
|
558
|
+
_DataAPI_parseVaultInfo = new WeakMap(), _DataAPI_parseSymbolInfo = new WeakMap(), _DataAPI_instances = new WeakSet(), _DataAPI_parseMarketInfo = function _DataAPI_parseMarketInfo(raw) {
|
|
559
|
+
const content = raw.data.content.fields;
|
|
560
|
+
return {
|
|
561
|
+
lpSupply: content.lp_supply.fields.value,
|
|
562
|
+
positionId: content.positions.fields.id.id,
|
|
563
|
+
vaultId: content.vaults.fields.id.id,
|
|
564
|
+
symbolId: content.symbols.fields.id.id,
|
|
565
|
+
referralId: content.referrals.fields.id.id,
|
|
566
|
+
orderId: content.orders.fields.id.id,
|
|
567
|
+
rebaseFeeModel: content.rebase_fee_model,
|
|
568
|
+
lpSupplyWithDecimals: content.lp_supply.fields.value / (10 ** consts_1.ZLP_TOKEN_DECIMALS),
|
|
569
|
+
};
|
|
570
|
+
}, _DataAPI_parseRebaseFeeModel = function _DataAPI_parseRebaseFeeModel(raw) {
|
|
571
|
+
const { fields } = raw.data.content;
|
|
572
|
+
return {
|
|
573
|
+
base: (0, utils_2.parseValue)(fields.base),
|
|
574
|
+
multiplier: (0, utils_2.parseValue)(fields.multiplier),
|
|
575
|
+
};
|
|
576
|
+
}, _DataAPI_parseReservingFeeModel = function _DataAPI_parseReservingFeeModel(raw) {
|
|
577
|
+
const { fields } = raw.data.content;
|
|
578
|
+
return {
|
|
579
|
+
multiplier: (0, utils_2.parseValue)(fields.multiplier),
|
|
580
|
+
};
|
|
581
|
+
}, _DataAPI_parseFundingFeeModel = function _DataAPI_parseFundingFeeModel(raw) {
|
|
582
|
+
const { fields } = raw.data.content;
|
|
583
|
+
return {
|
|
584
|
+
multiplier: (0, utils_2.parseValue)(fields.multiplier),
|
|
585
|
+
max: (0, utils_2.parseValue)(fields.max),
|
|
586
|
+
};
|
|
587
|
+
}, _DataAPI_parsePositionConfig = function _DataAPI_parsePositionConfig(raw) {
|
|
588
|
+
const positionConfigFields = raw.data.content.fields.inner.fields;
|
|
589
|
+
return {
|
|
590
|
+
decreaseFeeBps: (0, utils_2.parseValue)(positionConfigFields.decrease_fee_bps),
|
|
591
|
+
liquidationBonus: (0, utils_2.parseValue)(positionConfigFields.liquidation_bonus),
|
|
592
|
+
liquidationThreshold: (0, utils_2.parseValue)(positionConfigFields.liquidation_threshold),
|
|
593
|
+
maxLeverage: (0, utils_2.parseValue)(positionConfigFields.max_leverage),
|
|
594
|
+
minHoldingDuration: (0, utils_2.parseValue)(positionConfigFields.min_holding_duration),
|
|
595
|
+
openFeeBps: (0, utils_2.parseValue)(positionConfigFields.open_fee_bps),
|
|
596
|
+
maxReservedMultiplier: (0, utils_2.parseValue)(positionConfigFields.max_reserved_multiplier),
|
|
597
|
+
minCollateralValue: (0, utils_2.parseValue)(positionConfigFields.min_collateral_value),
|
|
598
|
+
};
|
|
599
|
+
}, _DataAPI_parsePositionInfo = async function _DataAPI_parsePositionInfo(raw, id_) {
|
|
600
|
+
const { content } = raw.data;
|
|
601
|
+
const { fields } = content;
|
|
602
|
+
const positionFields = fields.value.fields;
|
|
603
|
+
const dataType = fields.name.type;
|
|
604
|
+
const positionInfo = {
|
|
605
|
+
id: id_,
|
|
606
|
+
long: dataType.includes('::market::LONG'),
|
|
607
|
+
owner: fields.name.fields.owner,
|
|
608
|
+
version: Number.parseInt(raw.data.version, 10),
|
|
609
|
+
collateralToken: (0, utils_2.suiSymbolToSymbol)(dataType.split('<')[1].split(',')[0].trim(), this.consts),
|
|
610
|
+
indexToken: (0, utils_2.suiSymbolToSymbol)(dataType.split(',')[1].trim(), this.consts),
|
|
611
|
+
collateralAmount: (0, utils_2.parseValue)(positionFields.collateral),
|
|
612
|
+
positionAmount: (0, utils_2.parseValue)(positionFields.position_amount),
|
|
613
|
+
reservedAmount: (0, utils_2.parseValue)(positionFields.reserved),
|
|
614
|
+
positionSize: (0, utils_2.parseValue)(positionFields.position_size),
|
|
615
|
+
lastFundingRate: (0, utils_2.parseValue)(positionFields.last_funding_rate),
|
|
616
|
+
lastReservingRate: (0, utils_2.parseValue)(positionFields.last_reserving_rate),
|
|
617
|
+
reservingFeeAmount: (0, utils_2.parseValue)(positionFields.reserving_fee_amount),
|
|
618
|
+
fundingFeeValue: (0, utils_2.parseValue)(positionFields.funding_fee_value),
|
|
619
|
+
closed: positionFields.closed,
|
|
620
|
+
openTimestamp: (0, utils_2.parseValue)(positionFields.open_timestamp),
|
|
621
|
+
};
|
|
622
|
+
positionInfo.reservingFeeAmount = __classPrivateFieldGet(this, _DataAPI_instances, "m", _DataAPI_calculatePositionReserveFee).call(this, positionInfo, await this.getVaultInfo(positionInfo.collateralToken), (await this.getVaultInfo(positionInfo.collateralToken)).reservingFeeModel, Date.now() / 1000);
|
|
623
|
+
positionInfo.fundingFeeValue = __classPrivateFieldGet(this, _DataAPI_instances, "m", _DataAPI_calculatePositionFundingFee).call(this, positionInfo, await this.getSymbolInfo(positionInfo.indexToken, positionInfo.long), (await this.getSymbolInfo(positionInfo.indexToken, positionInfo.long)).fundingFeeModel, (await this.getOraclePrice(positionInfo.indexToken)).getPriceUnchecked().getPriceAsNumberUnchecked(), (await this.getMarketInfo()).lpSupplyWithDecimals, Date.now() / 1000);
|
|
624
|
+
return positionInfo;
|
|
625
|
+
}, _DataAPI_parseOrderInfo = function _DataAPI_parseOrderInfo(raw, capId) {
|
|
626
|
+
const { content } = raw.data;
|
|
627
|
+
const { fields } = content.fields.value;
|
|
628
|
+
// Extract tokens from dataType
|
|
629
|
+
const dataType = content.type;
|
|
630
|
+
const orderType = content.fields.value.type.includes('OpenPositionOrder') ? 'OPEN_POSITION' : 'DECREASE_POSITION';
|
|
631
|
+
const ret = {
|
|
632
|
+
id: content.fields.id.id,
|
|
633
|
+
capId,
|
|
634
|
+
executed: fields.executed,
|
|
635
|
+
owner: content.fields.name.fields.owner,
|
|
636
|
+
collateralToken: (0, utils_2.suiSymbolToSymbol)(dataType.split('<')[2].split(',')[0].trim(), this.consts),
|
|
637
|
+
indexToken: (0, utils_2.suiSymbolToSymbol)(dataType.split(',')[1].trim(), this.consts),
|
|
638
|
+
feeToken: (0, utils_2.suiSymbolToSymbol)(dataType.split(',')[3].split('>')[0].trim(), this.consts),
|
|
639
|
+
indexPrice: (0, utils_2.parseValue)(fields.limited_index_price.fields.price || fields.limited_index_price),
|
|
640
|
+
collateralPriceThreshold: (0, utils_2.parseValue)(fields.collateral_price_threshold),
|
|
641
|
+
feeAmount: BigInt(fields.fee),
|
|
642
|
+
long: dataType.includes('::market::LONG'),
|
|
643
|
+
orderType,
|
|
644
|
+
createdAt: (0, utils_2.parseValue)(fields.created_at),
|
|
645
|
+
v11Order: !fields.limited_index_price.fields.price,
|
|
646
|
+
};
|
|
647
|
+
if (orderType === 'OPEN_POSITION') {
|
|
648
|
+
ret.openOrder = {
|
|
649
|
+
reserveAmount: BigInt(fields.reserve_amount),
|
|
650
|
+
collateralAmount: BigInt(fields.collateral),
|
|
651
|
+
openAmount: BigInt(fields.open_amount),
|
|
652
|
+
};
|
|
653
|
+
}
|
|
654
|
+
else {
|
|
655
|
+
ret.decreaseOrder = {
|
|
656
|
+
decreaseAmount: BigInt(fields.decrease_amount),
|
|
657
|
+
takeProfit: fields.take_profit,
|
|
658
|
+
};
|
|
659
|
+
}
|
|
660
|
+
return ret;
|
|
661
|
+
}, _DataAPI_calcRebaseFeeRate = function _DataAPI_calcRebaseFeeRate(model, increase, ratio, targetRatio) {
|
|
662
|
+
if ((increase && ratio <= targetRatio) || (!increase && ratio >= targetRatio)) {
|
|
663
|
+
return model.base;
|
|
664
|
+
}
|
|
665
|
+
return model.base + model.multiplier * Math.abs(ratio - targetRatio);
|
|
666
|
+
}, _DataAPI_calcReservingFeeRate = function _DataAPI_calcReservingFeeRate(model, utilization, elapsed) {
|
|
667
|
+
return model.multiplier * utilization * elapsed / consts_1.SECONDS_PER_EIGHT_HOUR;
|
|
668
|
+
}, _DataAPI_calcFundingFeeRate = function _DataAPI_calcFundingFeeRate(model, pnlPerRate, elapsed) {
|
|
669
|
+
const dailyRate = Math.min(model.multiplier * Math.abs(pnlPerRate), model.max);
|
|
670
|
+
const secondsRate = dailyRate * elapsed / consts_1.SECONDS_PER_EIGHT_HOUR;
|
|
671
|
+
return pnlPerRate >= 0 ? -secondsRate : secondsRate;
|
|
672
|
+
}, _DataAPI_vaultUtilization = function _DataAPI_vaultUtilization(vault) {
|
|
673
|
+
const supplyAmount = vault.liquidity + vault.reservedAmount + vault.unrealisedReservingFeeAmount;
|
|
674
|
+
if (supplyAmount === 0) {
|
|
675
|
+
return 0;
|
|
676
|
+
}
|
|
677
|
+
return vault.reservedAmount / supplyAmount;
|
|
678
|
+
}, _DataAPI_calcAccReservingFeeRate = function _DataAPI_calcAccReservingFeeRate(vault, model, timestamp) {
|
|
679
|
+
if (vault.lastUpdate > 0) {
|
|
680
|
+
const elapsed = timestamp - vault.lastUpdate;
|
|
681
|
+
if (elapsed > 0) {
|
|
682
|
+
const utilization = __classPrivateFieldGet(this, _DataAPI_instances, "m", _DataAPI_vaultUtilization).call(this, vault);
|
|
683
|
+
return vault.accReservingRate + __classPrivateFieldGet(this, _DataAPI_instances, "m", _DataAPI_calcReservingFeeRate).call(this, model, utilization, elapsed);
|
|
684
|
+
}
|
|
685
|
+
}
|
|
686
|
+
return vault.accReservingRate;
|
|
687
|
+
}, _DataAPI_calcDeltaSize = function _DataAPI_calcDeltaSize(symbol, price) {
|
|
688
|
+
const latestSize = symbol.openingAmount / symbol.priceConfig.precision * price;
|
|
689
|
+
return symbol.long ? symbol.openingSize - latestSize : latestSize - symbol.openingSize;
|
|
690
|
+
}, _DataAPI_calcAccFundingFeeRate = function _DataAPI_calcAccFundingFeeRate(symbol, model, price, lpSupplyAmount, timestamp) {
|
|
691
|
+
if (symbol.lastUpdate > 0) {
|
|
692
|
+
const elapsed = timestamp - symbol.lastUpdate;
|
|
693
|
+
if (elapsed > 0) {
|
|
694
|
+
const deltaSize = __classPrivateFieldGet(this, _DataAPI_instances, "m", _DataAPI_calcDeltaSize).call(this, symbol, price);
|
|
695
|
+
const pnlPerLp = (symbol.realisedPnl + symbol.unrealisedFundingFeeValue + deltaSize) / lpSupplyAmount;
|
|
696
|
+
return symbol.accFundingRate + __classPrivateFieldGet(this, _DataAPI_instances, "m", _DataAPI_calcFundingFeeRate).call(this, model, pnlPerLp, elapsed);
|
|
697
|
+
}
|
|
698
|
+
}
|
|
699
|
+
return symbol.accFundingRate;
|
|
700
|
+
}, _DataAPI_calculateSymbolFundingFee = function _DataAPI_calculateSymbolFundingFee(symbol, model, price, lpSupplyAmount, timestamp) {
|
|
701
|
+
const accFundingRate = __classPrivateFieldGet(this, _DataAPI_instances, "m", _DataAPI_calcAccFundingFeeRate).call(this, symbol, model, price, lpSupplyAmount, timestamp);
|
|
702
|
+
return symbol.unrealisedFundingFeeValue + (accFundingRate - symbol.accFundingRate) * symbol.openingSize;
|
|
703
|
+
}, _DataAPI_calculatePositionFundingFee = function _DataAPI_calculatePositionFundingFee(position, symbol, model, price, lpSupplyAmount, timestamp) {
|
|
704
|
+
const accFundingRate = __classPrivateFieldGet(this, _DataAPI_instances, "m", _DataAPI_calcAccFundingFeeRate).call(this, symbol, model, price, lpSupplyAmount, timestamp);
|
|
705
|
+
return position.fundingFeeValue + (accFundingRate - symbol.accFundingRate) * position.positionSize;
|
|
706
|
+
}, _DataAPI_calculateVaultReservingFee = function _DataAPI_calculateVaultReservingFee(vault, model, timestamp) {
|
|
707
|
+
const accReservingRate = __classPrivateFieldGet(this, _DataAPI_instances, "m", _DataAPI_calcAccReservingFeeRate).call(this, vault, model, timestamp);
|
|
708
|
+
return vault.unrealisedReservingFeeAmount + (accReservingRate - vault.accReservingRate) * vault.reservedAmount;
|
|
709
|
+
}, _DataAPI_calculatePositionReserveFee = function _DataAPI_calculatePositionReserveFee(position, vault, model, timestamp) {
|
|
710
|
+
const accReservingRate = __classPrivateFieldGet(this, _DataAPI_instances, "m", _DataAPI_calcAccReservingFeeRate).call(this, vault, model, timestamp);
|
|
711
|
+
return position.reservingFeeAmount + (accReservingRate - vault.accReservingRate) * position.collateralAmount;
|
|
712
|
+
}, _DataAPI_parseStakePool = function _DataAPI_parseStakePool(raw) {
|
|
713
|
+
const content = raw.data.content.fields;
|
|
714
|
+
const pool = {
|
|
715
|
+
id: content.id.id,
|
|
716
|
+
enabled: content.enabled,
|
|
717
|
+
lastUpdatedTime: (0, utils_2.parseValue)(content.last_updated_time),
|
|
718
|
+
stakedAmount: BigInt(content.staked_amount),
|
|
719
|
+
reward: BigInt(content.reward),
|
|
720
|
+
startTime: (0, utils_2.parseValue)(content.start_time),
|
|
721
|
+
endTime: (0, utils_2.parseValue)(content.end_time),
|
|
722
|
+
accRewardPerShare: BigInt(content.acc_reward_per_share),
|
|
723
|
+
lockDuration: (0, utils_2.parseValue)(content.lock_duration),
|
|
724
|
+
};
|
|
725
|
+
__classPrivateFieldGet(this, _DataAPI_instances, "m", _DataAPI_refreshPool).call(this, pool, Math.floor(Date.now() / 1000));
|
|
726
|
+
return pool;
|
|
727
|
+
}, _DataAPI_parseCredential = function _DataAPI_parseCredential(raw, pool) {
|
|
728
|
+
const stakedAmount = BigInt(raw.data.content.fields.stake);
|
|
729
|
+
const accRewardPerShare = BigInt(raw.data.content.fields.acc_reward_per_share);
|
|
730
|
+
return {
|
|
731
|
+
id: raw.data.objectId,
|
|
732
|
+
lockUntil: (0, utils_2.parseValue)(raw.data.content.fields.lock_until),
|
|
733
|
+
amount: stakedAmount,
|
|
734
|
+
accRewardPerShare,
|
|
735
|
+
claimable: ((pool.accRewardPerShare - accRewardPerShare) * stakedAmount) / BigInt(1e18),
|
|
736
|
+
};
|
|
737
|
+
}, _DataAPI_refreshPool = function _DataAPI_refreshPool(pool, timestamp) {
|
|
738
|
+
if (timestamp === pool.lastUpdatedTime || timestamp < pool.startTime) {
|
|
739
|
+
return;
|
|
740
|
+
}
|
|
741
|
+
if (pool.lastUpdatedTime === pool.endTime || pool.stakedAmount === BigInt(0)) {
|
|
742
|
+
return;
|
|
743
|
+
}
|
|
744
|
+
if (timestamp > pool.endTime) {
|
|
745
|
+
timestamp = pool.endTime;
|
|
746
|
+
}
|
|
747
|
+
const rewardAmount = pool.reward * BigInt(timestamp - pool.lastUpdatedTime)
|
|
748
|
+
/ BigInt(pool.endTime - pool.lastUpdatedTime);
|
|
749
|
+
pool.lastUpdatedTime = timestamp;
|
|
750
|
+
const rewardPerShare = rewardAmount * BigInt(1e18) / pool.stakedAmount;
|
|
751
|
+
pool.accRewardPerShare += rewardPerShare;
|
|
752
|
+
};
|
|
753
|
+
//# sourceMappingURL=data.js.map
|