zo-sdk 0.1.2 → 0.1.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/abstract/BaseAPI.cjs +3 -4
- package/dist/abstract/BaseAPI.cjs.map +1 -1
- package/dist/abstract/BaseAPI.d.cts +13 -13
- package/dist/abstract/BaseAPI.d.cts.map +1 -1
- package/dist/abstract/BaseAPI.d.mts +13 -13
- package/dist/abstract/BaseAPI.d.mts.map +1 -1
- package/dist/abstract/BaseAPI.mjs +3 -4
- package/dist/abstract/BaseAPI.mjs.map +1 -1
- package/dist/abstract/BaseDataAPI.cjs +2 -2
- package/dist/abstract/BaseDataAPI.cjs.map +1 -1
- package/dist/abstract/BaseDataAPI.d.cts +2 -2
- package/dist/abstract/BaseDataAPI.d.cts.map +1 -1
- package/dist/abstract/BaseDataAPI.d.mts +2 -2
- package/dist/abstract/BaseDataAPI.d.mts.map +1 -1
- package/dist/abstract/BaseDataAPI.mjs +2 -2
- package/dist/abstract/BaseDataAPI.mjs.map +1 -1
- package/dist/abstract/index.cjs +3 -3
- package/dist/abstract/index.cjs.map +1 -1
- package/dist/abstract/index.d.cts +1 -1
- package/dist/abstract/index.d.cts.map +1 -1
- package/dist/abstract/index.d.mts +1 -1
- package/dist/abstract/index.d.mts.map +1 -1
- package/dist/abstract/index.mjs +1 -1
- package/dist/abstract/index.mjs.map +1 -1
- package/dist/api.cjs +2 -1
- package/dist/api.cjs.map +1 -1
- package/dist/api.d.cts.map +1 -1
- package/dist/api.d.mts.map +1 -1
- package/dist/api.mjs +2 -1
- package/dist/api.mjs.map +1 -1
- package/dist/bcs.cjs.map +1 -1
- package/dist/bcs.d.cts.map +1 -1
- package/dist/bcs.d.mts.map +1 -1
- package/dist/bcs.mjs.map +1 -1
- package/dist/consts/deployments-slp-mainnet.json +0 -70
- package/dist/consts/deployments-usdz-mainnet.json +1 -133
- package/dist/consts/index.cjs +21 -14
- package/dist/consts/index.cjs.map +1 -1
- package/dist/consts/index.d.cts.map +1 -1
- package/dist/consts/index.d.mts.map +1 -1
- package/dist/consts/index.mjs +21 -14
- package/dist/consts/index.mjs.map +1 -1
- package/dist/factory/SDKFactory.cjs +21 -14
- package/dist/factory/SDKFactory.cjs.map +1 -1
- package/dist/factory/SDKFactory.d.cts +4 -4
- package/dist/factory/SDKFactory.d.cts.map +1 -1
- package/dist/factory/SDKFactory.d.mts +4 -4
- package/dist/factory/SDKFactory.d.mts.map +1 -1
- package/dist/factory/SDKFactory.mjs +22 -15
- package/dist/factory/SDKFactory.mjs.map +1 -1
- package/dist/implementations/SLPAPI.cjs +143 -110
- package/dist/implementations/SLPAPI.cjs.map +1 -1
- package/dist/implementations/SLPAPI.d.cts +49 -47
- package/dist/implementations/SLPAPI.d.cts.map +1 -1
- package/dist/implementations/SLPAPI.d.mts +49 -47
- package/dist/implementations/SLPAPI.d.mts.map +1 -1
- package/dist/implementations/SLPAPI.mjs +143 -110
- package/dist/implementations/SLPAPI.mjs.map +1 -1
- package/dist/implementations/SLPDataAPI.cjs +98 -89
- package/dist/implementations/SLPDataAPI.cjs.map +1 -1
- package/dist/implementations/SLPDataAPI.d.cts +21 -21
- package/dist/implementations/SLPDataAPI.d.cts.map +1 -1
- package/dist/implementations/SLPDataAPI.d.mts +21 -21
- package/dist/implementations/SLPDataAPI.d.mts.map +1 -1
- package/dist/implementations/SLPDataAPI.mjs +98 -89
- package/dist/implementations/SLPDataAPI.mjs.map +1 -1
- package/dist/implementations/USDZAPI.cjs +128 -84
- package/dist/implementations/USDZAPI.cjs.map +1 -1
- package/dist/implementations/USDZAPI.d.cts +46 -45
- package/dist/implementations/USDZAPI.d.cts.map +1 -1
- package/dist/implementations/USDZAPI.d.mts +46 -45
- package/dist/implementations/USDZAPI.d.mts.map +1 -1
- package/dist/implementations/USDZAPI.mjs +128 -84
- package/dist/implementations/USDZAPI.mjs.map +1 -1
- package/dist/implementations/USDZDataAPI.cjs +48 -47
- package/dist/implementations/USDZDataAPI.cjs.map +1 -1
- package/dist/implementations/USDZDataAPI.d.cts +19 -19
- package/dist/implementations/USDZDataAPI.d.cts.map +1 -1
- package/dist/implementations/USDZDataAPI.d.mts +19 -19
- package/dist/implementations/USDZDataAPI.d.mts.map +1 -1
- package/dist/implementations/USDZDataAPI.mjs +49 -48
- package/dist/implementations/USDZDataAPI.mjs.map +1 -1
- package/dist/implementations/ZLPAPI.cjs +137 -89
- package/dist/implementations/ZLPAPI.cjs.map +1 -1
- package/dist/implementations/ZLPAPI.d.cts +50 -48
- package/dist/implementations/ZLPAPI.d.cts.map +1 -1
- package/dist/implementations/ZLPAPI.d.mts +50 -48
- package/dist/implementations/ZLPAPI.d.mts.map +1 -1
- package/dist/implementations/ZLPAPI.mjs +137 -89
- package/dist/implementations/ZLPAPI.mjs.map +1 -1
- package/dist/implementations/ZLPDataAPI.cjs +62 -63
- package/dist/implementations/ZLPDataAPI.cjs.map +1 -1
- package/dist/implementations/ZLPDataAPI.d.cts +19 -19
- package/dist/implementations/ZLPDataAPI.d.cts.map +1 -1
- package/dist/implementations/ZLPDataAPI.d.mts +19 -19
- package/dist/implementations/ZLPDataAPI.d.mts.map +1 -1
- package/dist/implementations/ZLPDataAPI.mjs +63 -64
- package/dist/implementations/ZLPDataAPI.mjs.map +1 -1
- package/dist/implementations/index.cjs +5 -5
- package/dist/implementations/index.cjs.map +1 -1
- package/dist/implementations/index.d.cts +2 -2
- package/dist/implementations/index.d.cts.map +1 -1
- package/dist/implementations/index.d.mts +2 -2
- package/dist/implementations/index.d.mts.map +1 -1
- package/dist/implementations/index.mjs +2 -2
- package/dist/implementations/index.mjs.map +1 -1
- package/dist/index.cjs +9 -9
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +6 -6
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +6 -6
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +6 -6
- package/dist/index.mjs.map +1 -1
- package/dist/interfaces/base.cjs +0 -1
- package/dist/interfaces/base.cjs.map +1 -1
- package/dist/interfaces/base.d.cts +57 -57
- package/dist/interfaces/base.d.cts.map +1 -1
- package/dist/interfaces/base.d.mts +57 -57
- package/dist/interfaces/base.d.mts.map +1 -1
- package/dist/interfaces/base.mjs +1 -1
- package/dist/interfaces/base.mjs.map +1 -1
- package/dist/interfaces/index.d.cts +4 -4
- package/dist/interfaces/index.d.cts.map +1 -1
- package/dist/interfaces/index.d.mts +4 -4
- package/dist/interfaces/index.d.mts.map +1 -1
- package/dist/interfaces/slp.cjs +0 -2
- package/dist/interfaces/slp.cjs.map +1 -1
- package/dist/interfaces/slp.d.cts +5 -5
- package/dist/interfaces/slp.d.cts.map +1 -1
- package/dist/interfaces/slp.d.mts +5 -5
- package/dist/interfaces/slp.d.mts.map +1 -1
- package/dist/interfaces/slp.mjs +1 -2
- package/dist/interfaces/slp.mjs.map +1 -1
- package/dist/interfaces/usdz.d.cts +1 -1
- package/dist/interfaces/usdz.d.cts.map +1 -1
- package/dist/interfaces/usdz.d.mts +1 -1
- package/dist/interfaces/usdz.d.mts.map +1 -1
- package/dist/interfaces/zlp.d.cts +5 -5
- package/dist/interfaces/zlp.d.cts.map +1 -1
- package/dist/interfaces/zlp.d.mts +5 -5
- package/dist/interfaces/zlp.d.mts.map +1 -1
- package/dist/oracle.cjs +12 -2
- package/dist/oracle.cjs.map +1 -1
- package/dist/oracle.d.cts +4 -3
- package/dist/oracle.d.cts.map +1 -1
- package/dist/oracle.d.mts +4 -3
- package/dist/oracle.d.mts.map +1 -1
- package/dist/oracle.mjs +13 -3
- package/dist/oracle.mjs.map +1 -1
- package/dist/utils.cjs +1 -1
- package/dist/utils.cjs.map +1 -1
- package/dist/utils.d.cts.map +1 -1
- package/dist/utils.d.mts.map +1 -1
- package/dist/utils.mjs +1 -1
- package/dist/utils.mjs.map +1 -1
- package/eslint.config.mjs +18 -0
- package/package.json +16 -15
- package/src/abstract/BaseAPI.ts +55 -49
- package/src/abstract/BaseDataAPI.ts +19 -17
- package/src/abstract/index.ts +1 -1
- package/src/api.ts +3 -1
- package/src/bcs.ts +9 -9
- package/src/consts/deployments-slp-mainnet.json +0 -70
- package/src/consts/deployments-usdz-mainnet.json +1 -133
- package/src/consts/index.ts +22 -15
- package/src/factory/SDKFactory.ts +49 -41
- package/src/implementations/SLPAPI.ts +299 -210
- package/src/implementations/SLPDataAPI.ts +163 -146
- package/src/implementations/USDZAPI.ts +238 -133
- package/src/implementations/USDZDataAPI.ts +79 -74
- package/src/implementations/ZLPAPI.ts +296 -174
- package/src/implementations/ZLPDataAPI.ts +93 -88
- package/src/implementations/index.ts +3 -3
- package/src/index.ts +17 -17
- package/src/interfaces/base.ts +123 -116
- package/src/interfaces/index.ts +14 -17
- package/src/interfaces/slp.ts +20 -19
- package/src/interfaces/usdz.ts +13 -13
- package/src/interfaces/zlp.ts +22 -21
- package/src/oracle.ts +25 -5
- package/src/utils.ts +9 -9
- package/tsconfig.json +1 -1
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
/* eslint-disable no-await-in-loop */
|
|
1
2
|
/**
|
|
2
3
|
* USDZ DataAPI implementation
|
|
3
4
|
* Implements USDZ-specific data access methods
|
|
@@ -6,44 +7,46 @@
|
|
|
6
7
|
import type { DynamicFieldInfo, SuiClient } from '@mysten/sui/client'
|
|
7
8
|
import type { Transaction } from '@mysten/sui/transactions'
|
|
8
9
|
import { SUI_CLOCK_OBJECT_ID } from '@mysten/sui/utils'
|
|
10
|
+
|
|
11
|
+
import { BaseDataAPI } from '../abstract'
|
|
9
12
|
import type { Network } from '../consts'
|
|
10
|
-
import { LPToken,
|
|
13
|
+
import { LPToken, SECONDS_PER_EIGHT_HOUR, USDZ_TOKEN_DECIMALS } from '../consts'
|
|
11
14
|
import type {
|
|
15
|
+
IBaseHistoryResponse,
|
|
16
|
+
IBaseStaked,
|
|
17
|
+
IBaseStakePool,
|
|
12
18
|
IUSDZDataAPI,
|
|
13
|
-
|
|
19
|
+
IUSDZFundingFeeModel,
|
|
14
20
|
IUSDZMarketInfo,
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
IUSDZPositionInfo,
|
|
21
|
+
IUSDZMarketValuationInfo,
|
|
22
|
+
IUSDZOrderCapInfo,
|
|
18
23
|
IUSDZOrderInfo,
|
|
19
|
-
IUSDZFundingFeeModel,
|
|
20
|
-
IUSDZPositionConfig,
|
|
21
24
|
IUSDZPositionCapInfo,
|
|
22
|
-
|
|
23
|
-
|
|
25
|
+
IUSDZPositionConfig,
|
|
26
|
+
IUSDZPositionInfo,
|
|
24
27
|
IUSDZRebaseFeeModel,
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
+
IUSDZReservingFeeModel,
|
|
29
|
+
IUSDZSymbolInfo,
|
|
30
|
+
IUSDZVaultInfo,
|
|
28
31
|
} from '../interfaces'
|
|
29
|
-
import {
|
|
30
|
-
import { parseSymbolKey, parseValue, suiSymbolToSymbol, joinSymbol } from '../utils'
|
|
32
|
+
import { joinSymbol, parseSymbolKey, parseValue, suiSymbolToSymbol } from '../utils'
|
|
31
33
|
|
|
32
34
|
export class USDZDataAPI extends BaseDataAPI implements IUSDZDataAPI {
|
|
33
35
|
constructor(
|
|
34
36
|
network: Network,
|
|
35
37
|
provider: SuiClient,
|
|
36
38
|
apiEndpoint: string,
|
|
37
|
-
connectionURL: string
|
|
39
|
+
connectionURL: string,
|
|
38
40
|
) {
|
|
39
41
|
super(network, provider, apiEndpoint, connectionURL, LPToken.USDZ)
|
|
40
42
|
}
|
|
41
43
|
|
|
42
|
-
public getStaked(
|
|
43
|
-
throw new Error(
|
|
44
|
+
public getStaked(_owner: string): Promise<IBaseStaked> {
|
|
45
|
+
throw new Error(`${this.constructor.name}: Method not implemented.`)
|
|
44
46
|
}
|
|
47
|
+
|
|
45
48
|
public getStakePool(): Promise<IBaseStakePool> {
|
|
46
|
-
throw new Error(
|
|
49
|
+
throw new Error(`${this.constructor.name}: Method not implemented.`)
|
|
47
50
|
}
|
|
48
51
|
|
|
49
52
|
/**
|
|
@@ -133,22 +136,22 @@ export class USDZDataAPI extends BaseDataAPI implements IUSDZDataAPI {
|
|
|
133
136
|
|
|
134
137
|
const vaultPromises = Object.keys(this.consts.zoCore.vaults).map(async (vault) => {
|
|
135
138
|
const vaultInfo = await this.getVaultInfo(vault)
|
|
136
|
-
const reservingFeeDelta =
|
|
139
|
+
const reservingFeeDelta = USDZDataAPI.calculateVaultReservingFee(vaultInfo, vaultInfo.reservingFeeModel, Date.now() / 1000)
|
|
137
140
|
return (reservingFeeDelta + vaultInfo.liquidity + vaultInfo.reservedAmount) * (await this.getOraclePrice(vault)).getPriceUnchecked().getPriceAsNumberUnchecked() / (10 ** this.consts.coins[vault].decimals)
|
|
138
141
|
})
|
|
139
142
|
|
|
140
143
|
const symbolPromises = Object.keys(this.consts.zoCore.symbols).map(async (symbol) => {
|
|
141
144
|
const [direction, tokenId] = parseSymbolKey(symbol)
|
|
142
145
|
const symbolInfo = await this.getSymbolInfo(tokenId, direction === 'long')
|
|
143
|
-
const deltaSize =
|
|
144
|
-
const fundingFeeDelta =
|
|
146
|
+
const deltaSize = USDZDataAPI.calcDeltaSize(symbolInfo, (await this.getOraclePrice(tokenId)).getPriceUnchecked().getPriceAsNumberUnchecked())
|
|
147
|
+
const fundingFeeDelta = USDZDataAPI.calculateSymbolFundingFee(symbolInfo, symbolInfo.fundingFeeModel, (await this.getOraclePrice(tokenId)).getPriceUnchecked().getPriceAsNumberUnchecked(), marketInfo.lpSupplyWithDecimals, Date.now() / 1000)
|
|
145
148
|
return fundingFeeDelta + deltaSize
|
|
146
149
|
})
|
|
147
150
|
|
|
148
151
|
const [vaultValues, symbolValues] = await Promise.all([Promise.all(vaultPromises), Promise.all(symbolPromises)])
|
|
149
152
|
|
|
150
|
-
value = vaultValues.reduce((acc, curr) => acc + curr, 0)
|
|
151
|
-
value += symbolValues.reduce((acc, curr) => acc + curr, 0)
|
|
153
|
+
value = vaultValues.reduce((acc: number, curr: number) => acc + curr, 0)
|
|
154
|
+
value += symbolValues.reduce((acc: number, curr: number) => acc + curr, 0)
|
|
152
155
|
|
|
153
156
|
usdzPrice = value / marketInfo.lpSupplyWithDecimals
|
|
154
157
|
|
|
@@ -174,7 +177,7 @@ export class USDZDataAPI extends BaseDataAPI implements IUSDZDataAPI {
|
|
|
174
177
|
showContent: true,
|
|
175
178
|
},
|
|
176
179
|
})
|
|
177
|
-
return
|
|
180
|
+
return USDZDataAPI.parseMarketInfo(rawData)
|
|
178
181
|
}
|
|
179
182
|
|
|
180
183
|
/**
|
|
@@ -227,12 +230,12 @@ export class USDZDataAPI extends BaseDataAPI implements IUSDZDataAPI {
|
|
|
227
230
|
showContent: true,
|
|
228
231
|
},
|
|
229
232
|
})
|
|
230
|
-
return
|
|
233
|
+
return USDZDataAPI.parsePositionConfig(rawData)
|
|
231
234
|
}
|
|
232
235
|
|
|
233
236
|
public async getPositionCapInfoList(owner: string): Promise<IUSDZPositionCapInfo[]> {
|
|
234
237
|
const positionCapInfoList: IUSDZPositionCapInfo[] = []
|
|
235
|
-
let cursor: string | undefined | null
|
|
238
|
+
let cursor: string | undefined | null
|
|
236
239
|
let hasNextPage = true
|
|
237
240
|
|
|
238
241
|
while (hasNextPage) {
|
|
@@ -269,7 +272,7 @@ export class USDZDataAPI extends BaseDataAPI implements IUSDZDataAPI {
|
|
|
269
272
|
return positionCapInfoList
|
|
270
273
|
}
|
|
271
274
|
|
|
272
|
-
public async getPositionInfoList(positionCapInfoList: IUSDZPositionCapInfo[], owner: string, batchSize
|
|
275
|
+
public async getPositionInfoList(positionCapInfoList: IUSDZPositionCapInfo[], owner: string, batchSize = 10) {
|
|
273
276
|
const positionInfoList: IUSDZPositionInfo[] = []
|
|
274
277
|
|
|
275
278
|
// Process in batches of 10
|
|
@@ -289,7 +292,8 @@ export class USDZDataAPI extends BaseDataAPI implements IUSDZDataAPI {
|
|
|
289
292
|
},
|
|
290
293
|
})
|
|
291
294
|
positionInfoList.push(await this.parsePositionInfo(positionRaw, positionCapInfo.positionCapId))
|
|
292
|
-
}
|
|
295
|
+
}
|
|
296
|
+
catch (error) {
|
|
293
297
|
// Position might have been deleted after force settlement
|
|
294
298
|
console.warn(`Failed to parse position info for position cap ID ${positionCapInfo.positionCapId}: ${error}`)
|
|
295
299
|
// Continue with next position without adding this one to the list
|
|
@@ -303,11 +307,11 @@ export class USDZDataAPI extends BaseDataAPI implements IUSDZDataAPI {
|
|
|
303
307
|
public async getOpenPositions(): Promise<IUSDZPositionInfo[]> {
|
|
304
308
|
let positionDynamicFields: DynamicFieldInfo[] = []
|
|
305
309
|
let _continue = true
|
|
306
|
-
let cursor
|
|
310
|
+
let cursor
|
|
307
311
|
while (_continue) {
|
|
308
312
|
// data here will be a list of dynamic fields containing name and value
|
|
309
|
-
const { data, nextCursor, hasNextPage }
|
|
310
|
-
await this.provider.getDynamicFields({
|
|
313
|
+
const { data, nextCursor, hasNextPage }
|
|
314
|
+
= await this.provider.getDynamicFields({
|
|
311
315
|
parentId: this.consts.zoCore.positionsParent,
|
|
312
316
|
cursor,
|
|
313
317
|
})
|
|
@@ -320,7 +324,7 @@ export class USDZDataAPI extends BaseDataAPI implements IUSDZDataAPI {
|
|
|
320
324
|
// then we query by dynamic field names and order by time
|
|
321
325
|
const positionInfoList: IUSDZPositionInfo[] = []
|
|
322
326
|
await Promise.all(
|
|
323
|
-
positionDynamicFields.map(async positionDynamicField => {
|
|
327
|
+
positionDynamicFields.map(async (positionDynamicField) => {
|
|
324
328
|
const positionRaw = await this.provider.getDynamicFieldObject({
|
|
325
329
|
parentId: this.consts.zoCore.positionsParent,
|
|
326
330
|
name: positionDynamicField.name,
|
|
@@ -345,7 +349,7 @@ export class USDZDataAPI extends BaseDataAPI implements IUSDZDataAPI {
|
|
|
345
349
|
|
|
346
350
|
public async getOrderCapInfoList(owner: string): Promise<IUSDZOrderCapInfo[]> {
|
|
347
351
|
const orderCapInfoList: IUSDZOrderCapInfo[] = []
|
|
348
|
-
let cursor: string | undefined | null
|
|
352
|
+
let cursor: string | undefined | null
|
|
349
353
|
let hasNextPage = true
|
|
350
354
|
|
|
351
355
|
while (hasNextPage) {
|
|
@@ -383,7 +387,7 @@ export class USDZDataAPI extends BaseDataAPI implements IUSDZDataAPI {
|
|
|
383
387
|
return orderCapInfoList
|
|
384
388
|
}
|
|
385
389
|
|
|
386
|
-
public async getOrderInfoList(orderCapInfoList: IUSDZOrderCapInfo[], owner: string, batchSize
|
|
390
|
+
public async getOrderInfoList(orderCapInfoList: IUSDZOrderCapInfo[], owner: string, batchSize = 10) {
|
|
387
391
|
const orderInfoList: IUSDZOrderInfo[] = []
|
|
388
392
|
|
|
389
393
|
// Process in batches of 10
|
|
@@ -407,7 +411,8 @@ export class USDZDataAPI extends BaseDataAPI implements IUSDZDataAPI {
|
|
|
407
411
|
},
|
|
408
412
|
})
|
|
409
413
|
orderInfoList.push(this.parseOrderInfo(orderRaw, orderCapInfo.orderCapId))
|
|
410
|
-
}
|
|
414
|
+
}
|
|
415
|
+
catch (error) {
|
|
411
416
|
// Order might have been deleted
|
|
412
417
|
console.warn(`Failed to parse order info for order cap ID ${orderCapInfo.orderCapId}: ${error}`)
|
|
413
418
|
// Continue with next order without adding this one to the list
|
|
@@ -437,7 +442,7 @@ export class USDZDataAPI extends BaseDataAPI implements IUSDZDataAPI {
|
|
|
437
442
|
/**
|
|
438
443
|
* Gets rebase fee model for USDZ
|
|
439
444
|
*/
|
|
440
|
-
public async getRebaseFeeModel(): Promise<{ base: number
|
|
445
|
+
public async getRebaseFeeModel(): Promise<{ base: number, multiplier: number }> {
|
|
441
446
|
this.validateCache()
|
|
442
447
|
if (this.rebaseFeeModelCache) {
|
|
443
448
|
return this.rebaseFeeModelCache
|
|
@@ -448,10 +453,10 @@ export class USDZDataAPI extends BaseDataAPI implements IUSDZDataAPI {
|
|
|
448
453
|
showContent: true,
|
|
449
454
|
},
|
|
450
455
|
})
|
|
451
|
-
return
|
|
456
|
+
return USDZDataAPI.parseRebaseFeeModel(rawData)
|
|
452
457
|
}
|
|
453
458
|
|
|
454
|
-
public async fundingFeeRate(indexToken: string, long: boolean
|
|
459
|
+
public async fundingFeeRate(indexToken: string, long: boolean): Promise<number> {
|
|
455
460
|
const symbol = await this.getSymbolInfo(indexToken, long)
|
|
456
461
|
if (symbol.lastUpdate <= 0) {
|
|
457
462
|
return 0
|
|
@@ -461,9 +466,9 @@ export class USDZDataAPI extends BaseDataAPI implements IUSDZDataAPI {
|
|
|
461
466
|
const model = symbol.fundingFeeModel
|
|
462
467
|
const elapsed = SECONDS_PER_EIGHT_HOUR
|
|
463
468
|
|
|
464
|
-
const deltaSize =
|
|
469
|
+
const deltaSize = USDZDataAPI.calcDeltaSize(symbol, price)
|
|
465
470
|
const pnlPerLp = (symbol.realisedPnl + symbol.unrealisedFundingFeeValue + deltaSize) / lpSupplyAmount
|
|
466
|
-
return
|
|
471
|
+
return USDZDataAPI.calcFundingFeeRate(model, pnlPerLp, elapsed)
|
|
467
472
|
}
|
|
468
473
|
|
|
469
474
|
public async rebaseFeeRate(collateralToken: string, increase: boolean, amount: number): Promise<number> {
|
|
@@ -474,7 +479,7 @@ export class USDZDataAPI extends BaseDataAPI implements IUSDZDataAPI {
|
|
|
474
479
|
const value = amount * (await this.getOraclePrice(collateralToken)).getPriceUnchecked().getPriceAsNumberUnchecked() / (10 ** this.consts.coins[collateralToken].decimals)
|
|
475
480
|
const vaultPromises = Object.keys(this.consts.zoCore.vaults).map(async (vault) => {
|
|
476
481
|
const vaultInfo = await this.getVaultInfo(vault)
|
|
477
|
-
const reservingFeeDelta =
|
|
482
|
+
const reservingFeeDelta = USDZDataAPI.calculateVaultReservingFee(vaultInfo, vaultInfo.reservingFeeModel, Date.now() / 1000)
|
|
478
483
|
const res = (reservingFeeDelta + vaultInfo.liquidity + vaultInfo.reservedAmount) * (await this.getOraclePrice(vault)).getPriceUnchecked().getPriceAsNumberUnchecked() / (10 ** this.consts.coins[vault].decimals)
|
|
479
484
|
if (collateralToken === vault) {
|
|
480
485
|
vaultValue = res
|
|
@@ -491,7 +496,7 @@ export class USDZDataAPI extends BaseDataAPI implements IUSDZDataAPI {
|
|
|
491
496
|
.map(e => Number.parseInt(e.weight, 10))
|
|
492
497
|
.reduce((acc, curr) => acc + curr, 0)
|
|
493
498
|
|
|
494
|
-
return
|
|
499
|
+
return USDZDataAPI.calcRebaseFeeRate(
|
|
495
500
|
await this.getRebaseFeeModel(),
|
|
496
501
|
increase,
|
|
497
502
|
(vaultValue + value) / (totalVaultValue + value),
|
|
@@ -503,7 +508,7 @@ export class USDZDataAPI extends BaseDataAPI implements IUSDZDataAPI {
|
|
|
503
508
|
const vaultInfo = await this.getVaultInfo(collateralToken)
|
|
504
509
|
const vaultSupply = vaultInfo.liquidity + vaultInfo.reservedAmount + vaultInfo.unrealisedReservingFeeAmount + amount
|
|
505
510
|
const utilization = vaultSupply ? ((vaultInfo.reservedAmount + amount) / vaultSupply) : 0
|
|
506
|
-
return
|
|
511
|
+
return USDZDataAPI.calcReservingFeeRate(vaultInfo.reservingFeeModel, utilization, SECONDS_PER_EIGHT_HOUR)
|
|
507
512
|
}
|
|
508
513
|
|
|
509
514
|
public async getHistory(trader: string, page: number, limit: number, orderType?: string, symbol?: string): Promise<IBaseHistoryResponse> {
|
|
@@ -542,53 +547,53 @@ export class USDZDataAPI extends BaseDataAPI implements IUSDZDataAPI {
|
|
|
542
547
|
}
|
|
543
548
|
|
|
544
549
|
// Private helper methods
|
|
545
|
-
private calcFundingFeeRate(model: IUSDZFundingFeeModel, pnlPerRate: number, elapsed: number): number {
|
|
550
|
+
private static calcFundingFeeRate(model: IUSDZFundingFeeModel, pnlPerRate: number, elapsed: number): number {
|
|
546
551
|
const dailyRate = Math.min(model.multiplier * Math.abs(pnlPerRate), model.max)
|
|
547
552
|
const secondsRate = dailyRate * elapsed / SECONDS_PER_EIGHT_HOUR
|
|
548
553
|
return pnlPerRate >= 0 ? -secondsRate : secondsRate
|
|
549
554
|
}
|
|
550
555
|
|
|
551
|
-
private calcAccFundingFeeRate(symbol: IUSDZSymbolInfo, model: IUSDZFundingFeeModel, price: number, lpSupplyAmount: number, timestamp: number): number {
|
|
556
|
+
private static calcAccFundingFeeRate(symbol: IUSDZSymbolInfo, model: IUSDZFundingFeeModel, price: number, lpSupplyAmount: number, timestamp: number): number {
|
|
552
557
|
if (symbol.lastUpdate > 0) {
|
|
553
558
|
const elapsed = timestamp - symbol.lastUpdate
|
|
554
559
|
if (elapsed > 0) {
|
|
555
|
-
const deltaSize =
|
|
560
|
+
const deltaSize = USDZDataAPI.calcDeltaSize(symbol, price)
|
|
556
561
|
const pnlPerLp = (symbol.realisedPnl + symbol.unrealisedFundingFeeValue + deltaSize) / lpSupplyAmount
|
|
557
|
-
return symbol.accFundingRate +
|
|
562
|
+
return symbol.accFundingRate + USDZDataAPI.calcFundingFeeRate(model, pnlPerLp, elapsed)
|
|
558
563
|
}
|
|
559
564
|
}
|
|
560
565
|
return symbol.accFundingRate
|
|
561
566
|
}
|
|
562
567
|
|
|
563
|
-
private calculateSymbolFundingFee(symbol: IUSDZSymbolInfo, model: IUSDZFundingFeeModel, price: number, lpSupplyAmount: number, timestamp: number): number {
|
|
564
|
-
const accFundingRate =
|
|
568
|
+
private static calculateSymbolFundingFee(symbol: IUSDZSymbolInfo, model: IUSDZFundingFeeModel, price: number, lpSupplyAmount: number, timestamp: number): number {
|
|
569
|
+
const accFundingRate = USDZDataAPI.calcAccFundingFeeRate(symbol, model, price, lpSupplyAmount, timestamp)
|
|
565
570
|
return symbol.unrealisedFundingFeeValue + (accFundingRate - symbol.accFundingRate) * symbol.openingSize
|
|
566
571
|
}
|
|
567
572
|
|
|
568
|
-
private calculatePositionReserveFee(position: IUSDZPositionInfo, vault: IUSDZVaultInfo, model: IUSDZReservingFeeModel, timestamp: number): number {
|
|
569
|
-
const accReservingRate =
|
|
573
|
+
private static calculatePositionReserveFee(position: IUSDZPositionInfo, vault: IUSDZVaultInfo, model: IUSDZReservingFeeModel, timestamp: number): number {
|
|
574
|
+
const accReservingRate = USDZDataAPI.calcAccReservingFeeRate(vault, model, timestamp)
|
|
570
575
|
return position.reservingFeeAmount + (accReservingRate - vault.accReservingRate) * position.collateralAmount
|
|
571
576
|
}
|
|
572
577
|
|
|
573
|
-
private calcAccReservingFeeRate(vault: IUSDZVaultInfo, model: IUSDZReservingFeeModel, timestamp: number): number {
|
|
578
|
+
private static calcAccReservingFeeRate(vault: IUSDZVaultInfo, model: IUSDZReservingFeeModel, timestamp: number): number {
|
|
574
579
|
if (vault.lastUpdate > 0) {
|
|
575
580
|
const elapsed = timestamp - vault.lastUpdate
|
|
576
581
|
if (elapsed > 0) {
|
|
577
|
-
const utilization =
|
|
578
|
-
return vault.accReservingRate +
|
|
582
|
+
const utilization = USDZDataAPI.vaultUtilization(vault)
|
|
583
|
+
return vault.accReservingRate + USDZDataAPI.calcReservingFeeRate(model, utilization, elapsed)
|
|
579
584
|
}
|
|
580
585
|
}
|
|
581
586
|
return vault.accReservingRate
|
|
582
587
|
}
|
|
583
588
|
|
|
584
|
-
private calcRebaseFeeRate(model: IUSDZRebaseFeeModel, increase: boolean, ratio: number, targetRatio: number): number {
|
|
589
|
+
private static calcRebaseFeeRate(model: IUSDZRebaseFeeModel, increase: boolean, ratio: number, targetRatio: number): number {
|
|
585
590
|
if ((increase && ratio <= targetRatio) || (!increase && ratio >= targetRatio)) {
|
|
586
591
|
return model.base
|
|
587
592
|
}
|
|
588
593
|
return model.base + model.multiplier * Math.abs(ratio - targetRatio)
|
|
589
594
|
}
|
|
590
595
|
|
|
591
|
-
private vaultUtilization(vault: IUSDZVaultInfo): number {
|
|
596
|
+
private static vaultUtilization(vault: IUSDZVaultInfo): number {
|
|
592
597
|
const supplyAmount = vault.liquidity + vault.reservedAmount + vault.unrealisedReservingFeeAmount
|
|
593
598
|
if (supplyAmount === 0) {
|
|
594
599
|
return 0
|
|
@@ -596,16 +601,16 @@ export class USDZDataAPI extends BaseDataAPI implements IUSDZDataAPI {
|
|
|
596
601
|
return vault.reservedAmount / supplyAmount
|
|
597
602
|
}
|
|
598
603
|
|
|
599
|
-
private calcReservingFeeRate(model: IUSDZReservingFeeModel, utilization: number, elapsed: number): number {
|
|
604
|
+
private static calcReservingFeeRate(model: IUSDZReservingFeeModel, utilization: number, elapsed: number): number {
|
|
600
605
|
return model.multiplier * utilization * elapsed / SECONDS_PER_EIGHT_HOUR
|
|
601
606
|
}
|
|
602
607
|
|
|
603
|
-
private calcDeltaSize(symbol: IUSDZSymbolInfo, price: number): number {
|
|
608
|
+
private static calcDeltaSize(symbol: IUSDZSymbolInfo, price: number): number {
|
|
604
609
|
const latestSize = symbol.openingAmount / symbol.priceConfig.precision * price
|
|
605
610
|
return symbol.long ? symbol.openingSize - latestSize : latestSize - symbol.openingSize
|
|
606
611
|
}
|
|
607
612
|
|
|
608
|
-
private parseMarketInfo(raw: any): IUSDZMarketInfo {
|
|
613
|
+
private static parseMarketInfo(raw: any): IUSDZMarketInfo {
|
|
609
614
|
const content = raw.data.content.fields
|
|
610
615
|
|
|
611
616
|
return {
|
|
@@ -629,7 +634,7 @@ export class USDZDataAPI extends BaseDataAPI implements IUSDZDataAPI {
|
|
|
629
634
|
showContent: true,
|
|
630
635
|
},
|
|
631
636
|
})
|
|
632
|
-
const reservingFeeModel =
|
|
637
|
+
const reservingFeeModel = USDZDataAPI.parseReservingFeeModel(reservingFeeModelRaw)
|
|
633
638
|
|
|
634
639
|
return {
|
|
635
640
|
liquidity: parseValue(vaultFields.liquidity),
|
|
@@ -660,7 +665,7 @@ export class USDZDataAPI extends BaseDataAPI implements IUSDZDataAPI {
|
|
|
660
665
|
showContent: true,
|
|
661
666
|
},
|
|
662
667
|
})
|
|
663
|
-
const fundingFeeModel =
|
|
668
|
+
const fundingFeeModel = USDZDataAPI.parseFundingFeeModel(fundingFeeModelRaw)
|
|
664
669
|
|
|
665
670
|
return {
|
|
666
671
|
openingSize: parseValue(fields.opening_size),
|
|
@@ -683,7 +688,7 @@ export class USDZDataAPI extends BaseDataAPI implements IUSDZDataAPI {
|
|
|
683
688
|
}
|
|
684
689
|
}
|
|
685
690
|
|
|
686
|
-
private parsePositionConfig(raw: any): IUSDZPositionConfig {
|
|
691
|
+
private static parsePositionConfig(raw: any): IUSDZPositionConfig {
|
|
687
692
|
const positionConfigFields = raw.data.content.fields.inner.fields
|
|
688
693
|
|
|
689
694
|
return {
|
|
@@ -723,18 +728,18 @@ export class USDZDataAPI extends BaseDataAPI implements IUSDZDataAPI {
|
|
|
723
728
|
openTimestamp: parseValue(positionFields.open_timestamp),
|
|
724
729
|
}
|
|
725
730
|
|
|
726
|
-
positionInfo.reservingFeeAmount =
|
|
727
|
-
positionInfo.fundingFeeValue =
|
|
731
|
+
positionInfo.reservingFeeAmount = USDZDataAPI.calculatePositionReserveFee(positionInfo, await this.getVaultInfo(positionInfo.collateralToken), (await this.getVaultInfo(positionInfo.collateralToken)).reservingFeeModel, Date.now() / 1000)
|
|
732
|
+
positionInfo.fundingFeeValue = USDZDataAPI.calculatePositionFundingFee(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)
|
|
728
733
|
|
|
729
734
|
return positionInfo
|
|
730
735
|
}
|
|
731
736
|
|
|
732
|
-
private calculatePositionFundingFee(position: IUSDZPositionInfo, symbol: IUSDZSymbolInfo, model: IUSDZFundingFeeModel, price: number, lpSupplyAmount: number, timestamp: number): number {
|
|
733
|
-
const accFundingRate =
|
|
737
|
+
private static calculatePositionFundingFee(position: IUSDZPositionInfo, symbol: IUSDZSymbolInfo, model: IUSDZFundingFeeModel, price: number, lpSupplyAmount: number, timestamp: number): number {
|
|
738
|
+
const accFundingRate = USDZDataAPI.calcAccFundingFeeRate(symbol, model, price, lpSupplyAmount, timestamp)
|
|
734
739
|
return position.fundingFeeValue + (accFundingRate - symbol.accFundingRate) * position.positionSize
|
|
735
740
|
}
|
|
736
741
|
|
|
737
|
-
private parseRebaseFeeModel(raw: any): { base: number
|
|
742
|
+
private static parseRebaseFeeModel(raw: any): { base: number, multiplier: number } {
|
|
738
743
|
const { fields } = raw.data.content
|
|
739
744
|
|
|
740
745
|
return {
|
|
@@ -743,14 +748,14 @@ export class USDZDataAPI extends BaseDataAPI implements IUSDZDataAPI {
|
|
|
743
748
|
}
|
|
744
749
|
}
|
|
745
750
|
|
|
746
|
-
private parseReservingFeeModel(raw: any): { multiplier: number } {
|
|
751
|
+
private static parseReservingFeeModel(raw: any): { multiplier: number } {
|
|
747
752
|
const content = raw.data.content.fields
|
|
748
753
|
return {
|
|
749
754
|
multiplier: parseValue(content.multiplier),
|
|
750
755
|
}
|
|
751
756
|
}
|
|
752
757
|
|
|
753
|
-
private parseFundingFeeModel(raw: any): { multiplier: number
|
|
758
|
+
private static parseFundingFeeModel(raw: any): { multiplier: number, max: number } {
|
|
754
759
|
const content = raw.data.content.fields
|
|
755
760
|
return {
|
|
756
761
|
multiplier: parseValue(content.multiplier),
|
|
@@ -813,14 +818,14 @@ export class USDZDataAPI extends BaseDataAPI implements IUSDZDataAPI {
|
|
|
813
818
|
return Number.parseFloat(await res.text() || '0')
|
|
814
819
|
}
|
|
815
820
|
|
|
816
|
-
private calculateVaultReservingFee(
|
|
821
|
+
private static calculateVaultReservingFee(
|
|
817
822
|
vaultInfo: IUSDZVaultInfo,
|
|
818
823
|
reservingFeeModel: { multiplier: number },
|
|
819
|
-
currentTime: number
|
|
824
|
+
currentTime: number,
|
|
820
825
|
): number {
|
|
821
826
|
const timeDelta = currentTime - vaultInfo.lastUpdate
|
|
822
827
|
const periods = Math.floor(timeDelta / SECONDS_PER_EIGHT_HOUR)
|
|
823
|
-
return vaultInfo.unrealisedReservingFeeAmount
|
|
824
|
-
(vaultInfo.reservedAmount * reservingFeeModel.multiplier * periods) / 1e18
|
|
828
|
+
return vaultInfo.unrealisedReservingFeeAmount
|
|
829
|
+
+ (vaultInfo.reservedAmount * reservingFeeModel.multiplier * periods) / 1e18
|
|
825
830
|
}
|
|
826
|
-
}
|
|
831
|
+
}
|