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
|
* ZLP DataAPI implementation
|
|
3
4
|
* Implements ZLP-specific data access methods
|
|
@@ -6,45 +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, ZLP_TOKEN_DECIMALS } from '../consts'
|
|
11
14
|
import type {
|
|
15
|
+
IBaseHistoryResponse,
|
|
16
|
+
IBaseStaked,
|
|
17
|
+
IBaseStakePool,
|
|
12
18
|
IZLPDataAPI,
|
|
13
|
-
|
|
19
|
+
IZLPFundingFeeModel,
|
|
14
20
|
IZLPMarketInfo,
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
IZLPPositionInfo,
|
|
21
|
+
IZLPMarketValuationInfo,
|
|
22
|
+
IZLPOrderCapInfo,
|
|
18
23
|
IZLPOrderInfo,
|
|
19
|
-
IZLPFundingFeeModel,
|
|
20
|
-
IZLPPositionConfig,
|
|
21
24
|
IZLPPositionCapInfo,
|
|
22
|
-
|
|
23
|
-
|
|
25
|
+
IZLPPositionConfig,
|
|
26
|
+
IZLPPositionInfo,
|
|
24
27
|
IZLPRebaseFeeModel,
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
+
IZLPReservingFeeModel,
|
|
29
|
+
IZLPSymbolInfo,
|
|
30
|
+
IZLPVaultInfo,
|
|
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 ZLPDataAPI extends BaseDataAPI implements IZLPDataAPI {
|
|
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.ZLP)
|
|
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
|
}
|
|
45
47
|
|
|
46
48
|
public getStakePool(): Promise<IBaseStakePool> {
|
|
47
|
-
throw new Error(
|
|
49
|
+
throw new Error(`${this.constructor.name}: Method not implemented.`)
|
|
48
50
|
}
|
|
49
51
|
|
|
50
52
|
/**
|
|
@@ -134,22 +136,22 @@ export class ZLPDataAPI extends BaseDataAPI implements IZLPDataAPI {
|
|
|
134
136
|
|
|
135
137
|
const vaultPromises = Object.keys(this.consts.zoCore.vaults).map(async (vault) => {
|
|
136
138
|
const vaultInfo = await this.getVaultInfo(vault)
|
|
137
|
-
const reservingFeeDelta =
|
|
139
|
+
const reservingFeeDelta = ZLPDataAPI.calculateVaultReservingFee(vaultInfo, vaultInfo.reservingFeeModel, Date.now() / 1000)
|
|
138
140
|
return (reservingFeeDelta + vaultInfo.liquidity + vaultInfo.reservedAmount) * (await this.getOraclePrice(vault)).getPriceUnchecked().getPriceAsNumberUnchecked() / (10 ** this.consts.coins[vault].decimals)
|
|
139
141
|
})
|
|
140
142
|
|
|
141
143
|
const symbolPromises = Object.keys(this.consts.zoCore.symbols).map(async (symbol) => {
|
|
142
144
|
const [direction, tokenId] = parseSymbolKey(symbol)
|
|
143
145
|
const symbolInfo = await this.getSymbolInfo(tokenId, direction === 'long')
|
|
144
|
-
const deltaSize =
|
|
145
|
-
const fundingFeeDelta =
|
|
146
|
+
const deltaSize = ZLPDataAPI.calcDeltaSize(symbolInfo, (await this.getOraclePrice(tokenId)).getPriceUnchecked().getPriceAsNumberUnchecked())
|
|
147
|
+
const fundingFeeDelta = ZLPDataAPI.calculateSymbolFundingFee(symbolInfo, symbolInfo.fundingFeeModel, (await this.getOraclePrice(tokenId)).getPriceUnchecked().getPriceAsNumberUnchecked(), marketInfo.lpSupplyWithDecimals, Date.now() / 1000)
|
|
146
148
|
return fundingFeeDelta + deltaSize
|
|
147
149
|
})
|
|
148
150
|
|
|
149
151
|
const [vaultValues, symbolValues] = await Promise.all([Promise.all(vaultPromises), Promise.all(symbolPromises)])
|
|
150
152
|
|
|
151
|
-
value = vaultValues.reduce((acc, curr) => acc + curr, 0)
|
|
152
|
-
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)
|
|
153
155
|
|
|
154
156
|
zlpPrice = value / marketInfo.lpSupplyWithDecimals
|
|
155
157
|
|
|
@@ -175,7 +177,7 @@ export class ZLPDataAPI extends BaseDataAPI implements IZLPDataAPI {
|
|
|
175
177
|
showContent: true,
|
|
176
178
|
},
|
|
177
179
|
})
|
|
178
|
-
return
|
|
180
|
+
return ZLPDataAPI.parseMarketInfo(rawData)
|
|
179
181
|
}
|
|
180
182
|
|
|
181
183
|
/**
|
|
@@ -228,12 +230,12 @@ export class ZLPDataAPI extends BaseDataAPI implements IZLPDataAPI {
|
|
|
228
230
|
showContent: true,
|
|
229
231
|
},
|
|
230
232
|
})
|
|
231
|
-
return
|
|
233
|
+
return ZLPDataAPI.parsePositionConfig(rawData)
|
|
232
234
|
}
|
|
233
235
|
|
|
234
236
|
public async getPositionCapInfoList(owner: string): Promise<IZLPPositionCapInfo[]> {
|
|
235
237
|
const positionCapInfoList: IZLPPositionCapInfo[] = []
|
|
236
|
-
let cursor: string | undefined | null
|
|
238
|
+
let cursor: string | undefined | null
|
|
237
239
|
let hasNextPage = true
|
|
238
240
|
|
|
239
241
|
while (hasNextPage) {
|
|
@@ -270,7 +272,7 @@ export class ZLPDataAPI extends BaseDataAPI implements IZLPDataAPI {
|
|
|
270
272
|
return positionCapInfoList
|
|
271
273
|
}
|
|
272
274
|
|
|
273
|
-
public async getPositionInfoList(positionCapInfoList: IZLPPositionCapInfo[], owner: string, batchSize
|
|
275
|
+
public async getPositionInfoList(positionCapInfoList: IZLPPositionCapInfo[], owner: string, batchSize = 10) {
|
|
274
276
|
const positionInfoList: IZLPPositionInfo[] = []
|
|
275
277
|
|
|
276
278
|
// Process in batches of 10
|
|
@@ -290,7 +292,8 @@ export class ZLPDataAPI extends BaseDataAPI implements IZLPDataAPI {
|
|
|
290
292
|
},
|
|
291
293
|
})
|
|
292
294
|
positionInfoList.push(await this.parsePositionInfo(positionRaw, positionCapInfo.positionCapId))
|
|
293
|
-
}
|
|
295
|
+
}
|
|
296
|
+
catch (error) {
|
|
294
297
|
// Position might have been deleted after force settlement
|
|
295
298
|
console.warn(`Failed to parse position info for position cap ID ${positionCapInfo.positionCapId}: ${error}`)
|
|
296
299
|
// Continue with next position without adding this one to the list
|
|
@@ -301,14 +304,14 @@ export class ZLPDataAPI extends BaseDataAPI implements IZLPDataAPI {
|
|
|
301
304
|
return positionInfoList.sort((a, b) => a.openTimestamp > b.openTimestamp ? 1 : -1)
|
|
302
305
|
}
|
|
303
306
|
|
|
304
|
-
public async getOpenPositions(batchSize
|
|
307
|
+
public async getOpenPositions(batchSize = 50, symbol = 'sui'): Promise<IZLPPositionInfo[]> {
|
|
305
308
|
let positionDynamicFields: DynamicFieldInfo[] = []
|
|
306
309
|
let _continue = true
|
|
307
|
-
let cursor
|
|
310
|
+
let cursor
|
|
308
311
|
while (_continue) {
|
|
309
312
|
// data here will be a list of dynamic fields containing name and value
|
|
310
|
-
const { data, nextCursor, hasNextPage }
|
|
311
|
-
await this.provider.getDynamicFields({
|
|
313
|
+
const { data, nextCursor, hasNextPage }
|
|
314
|
+
= await this.provider.getDynamicFields({
|
|
312
315
|
parentId: this.consts.zoCore.positionsParent,
|
|
313
316
|
cursor,
|
|
314
317
|
})
|
|
@@ -319,22 +322,23 @@ export class ZLPDataAPI extends BaseDataAPI implements IZLPDataAPI {
|
|
|
319
322
|
}
|
|
320
323
|
|
|
321
324
|
// Filter by symbol if provided
|
|
322
|
-
if (symbol && this.consts.coins[symbol]) {
|
|
323
|
-
const coinModule = symbol === 'sui' ? '0x2::sui::SUI' : this.consts.coins[symbol].module
|
|
324
|
-
positionDynamicFields = positionDynamicFields.filter(field => {
|
|
325
|
-
// Extract the second coin module from PositionName<coin1, coin2, direction>
|
|
326
|
-
const typeStr = field.name?.type
|
|
327
|
-
if (!typeStr) return false
|
|
328
|
-
|
|
329
|
-
const match = typeStr.match(/PositionName<([^,]+),\s*([^,]+),\s*([^>]+)>/)
|
|
330
|
-
if (!match) return false
|
|
331
|
-
|
|
332
|
-
const secondCoin = match[2].trim()
|
|
333
|
-
return secondCoin === coinModule
|
|
334
|
-
})
|
|
335
|
-
} else {
|
|
325
|
+
if (!(symbol && this.consts.coins[symbol])) {
|
|
336
326
|
return []
|
|
337
327
|
}
|
|
328
|
+
const coinModule = symbol === 'sui' ? '0x2::sui::SUI' : this.consts.coins[symbol].module
|
|
329
|
+
positionDynamicFields = positionDynamicFields.filter((field) => {
|
|
330
|
+
// Extract the second coin module from PositionName<coin1, coin2, direction>
|
|
331
|
+
const typeStr = field.name?.type
|
|
332
|
+
if (!typeStr)
|
|
333
|
+
return false
|
|
334
|
+
|
|
335
|
+
const match = typeStr.match(/PositionName<([^,]+),([^,]+),([^>]+)>/)
|
|
336
|
+
if (!match)
|
|
337
|
+
return false
|
|
338
|
+
|
|
339
|
+
const secondCoin = match[2].trim()
|
|
340
|
+
return secondCoin === coinModule
|
|
341
|
+
})
|
|
338
342
|
|
|
339
343
|
// then we query by dynamic field names and order by time
|
|
340
344
|
const positionInfoList: IZLPPositionInfo[] = []
|
|
@@ -344,14 +348,14 @@ export class ZLPDataAPI extends BaseDataAPI implements IZLPDataAPI {
|
|
|
344
348
|
const batch = positionDynamicFields.slice(i, i + batchSize)
|
|
345
349
|
|
|
346
350
|
await Promise.all(
|
|
347
|
-
batch.map(async positionDynamicField => {
|
|
351
|
+
batch.map(async (positionDynamicField) => {
|
|
348
352
|
const positionRaw = await this.provider.getDynamicFieldObject({
|
|
349
353
|
parentId: this.consts.zoCore.positionsParent,
|
|
350
354
|
name: positionDynamicField.name,
|
|
351
355
|
})
|
|
352
356
|
|
|
353
357
|
if (positionRaw?.data?.content) {
|
|
354
|
-
// @ts-
|
|
358
|
+
// @ts-expect-error: content fields type is not properly defined
|
|
355
359
|
if (positionRaw?.data?.content?.fields?.value?.fields?.closed) {
|
|
356
360
|
// skip closed positions
|
|
357
361
|
return
|
|
@@ -375,7 +379,7 @@ export class ZLPDataAPI extends BaseDataAPI implements IZLPDataAPI {
|
|
|
375
379
|
|
|
376
380
|
public async getOrderCapInfoList(owner: string): Promise<IZLPOrderCapInfo[]> {
|
|
377
381
|
const orderCapInfoList: IZLPOrderCapInfo[] = []
|
|
378
|
-
let cursor: string | undefined | null
|
|
382
|
+
let cursor: string | undefined | null
|
|
379
383
|
let hasNextPage = true
|
|
380
384
|
|
|
381
385
|
while (hasNextPage) {
|
|
@@ -413,7 +417,7 @@ export class ZLPDataAPI extends BaseDataAPI implements IZLPDataAPI {
|
|
|
413
417
|
return orderCapInfoList
|
|
414
418
|
}
|
|
415
419
|
|
|
416
|
-
public async getOrderInfoList(orderCapInfoList: IZLPOrderCapInfo[], owner: string, batchSize
|
|
420
|
+
public async getOrderInfoList(orderCapInfoList: IZLPOrderCapInfo[], owner: string, batchSize = 10) {
|
|
417
421
|
const orderInfoList: IZLPOrderInfo[] = []
|
|
418
422
|
|
|
419
423
|
// Process in batches of 10
|
|
@@ -437,7 +441,8 @@ export class ZLPDataAPI extends BaseDataAPI implements IZLPDataAPI {
|
|
|
437
441
|
},
|
|
438
442
|
})
|
|
439
443
|
orderInfoList.push(this.parseOrderInfo(orderRaw, orderCapInfo.orderCapId))
|
|
440
|
-
}
|
|
444
|
+
}
|
|
445
|
+
catch (error) {
|
|
441
446
|
// Order might have been deleted
|
|
442
447
|
console.warn(`Failed to parse order info for order cap ID ${orderCapInfo.orderCapId}: ${error}`)
|
|
443
448
|
// Continue with next order without adding this one to the list
|
|
@@ -478,7 +483,7 @@ export class ZLPDataAPI extends BaseDataAPI implements IZLPDataAPI {
|
|
|
478
483
|
showContent: true,
|
|
479
484
|
},
|
|
480
485
|
})
|
|
481
|
-
return
|
|
486
|
+
return ZLPDataAPI.parseRebaseFeeModel(rawData)
|
|
482
487
|
}
|
|
483
488
|
|
|
484
489
|
public async fundingFeeRate(indexToken: string, long: boolean): Promise<number> {
|
|
@@ -491,9 +496,9 @@ export class ZLPDataAPI extends BaseDataAPI implements IZLPDataAPI {
|
|
|
491
496
|
const model = symbol.fundingFeeModel
|
|
492
497
|
const elapsed = SECONDS_PER_EIGHT_HOUR
|
|
493
498
|
|
|
494
|
-
const deltaSize =
|
|
499
|
+
const deltaSize = ZLPDataAPI.calcDeltaSize(symbol, price)
|
|
495
500
|
const pnlPerLp = (symbol.realisedPnl + symbol.unrealisedFundingFeeValue + deltaSize) / lpSupplyAmount
|
|
496
|
-
return
|
|
501
|
+
return ZLPDataAPI.calcFundingFeeRate(model, pnlPerLp, elapsed)
|
|
497
502
|
}
|
|
498
503
|
|
|
499
504
|
public async rebaseFeeRate(collateralToken: string, increase: boolean, amount: number): Promise<number> {
|
|
@@ -504,7 +509,7 @@ export class ZLPDataAPI extends BaseDataAPI implements IZLPDataAPI {
|
|
|
504
509
|
const value = amount * (await this.getOraclePrice(collateralToken)).getPriceUnchecked().getPriceAsNumberUnchecked() / (10 ** this.consts.coins[collateralToken].decimals)
|
|
505
510
|
const vaultPromises = Object.keys(this.consts.zoCore.vaults).map(async (vault) => {
|
|
506
511
|
const vaultInfo = await this.getVaultInfo(vault)
|
|
507
|
-
const reservingFeeDelta =
|
|
512
|
+
const reservingFeeDelta = ZLPDataAPI.calculateVaultReservingFee(vaultInfo, vaultInfo.reservingFeeModel, Date.now() / 1000)
|
|
508
513
|
const res = (reservingFeeDelta + vaultInfo.liquidity + vaultInfo.reservedAmount) * (await this.getOraclePrice(vault)).getPriceUnchecked().getPriceAsNumberUnchecked() / (10 ** this.consts.coins[vault].decimals)
|
|
509
514
|
if (collateralToken === vault) {
|
|
510
515
|
vaultValue = res
|
|
@@ -521,7 +526,7 @@ export class ZLPDataAPI extends BaseDataAPI implements IZLPDataAPI {
|
|
|
521
526
|
.map(e => Number.parseInt(e.weight, 10))
|
|
522
527
|
.reduce((acc, curr) => acc + curr, 0)
|
|
523
528
|
|
|
524
|
-
return
|
|
529
|
+
return ZLPDataAPI.calcRebaseFeeRate(
|
|
525
530
|
await this.getRebaseFeeModel(),
|
|
526
531
|
increase,
|
|
527
532
|
(vaultValue + value) / (totalVaultValue + value),
|
|
@@ -533,7 +538,7 @@ export class ZLPDataAPI extends BaseDataAPI implements IZLPDataAPI {
|
|
|
533
538
|
const vaultInfo = await this.getVaultInfo(collateralToken)
|
|
534
539
|
const vaultSupply = vaultInfo.liquidity + vaultInfo.reservedAmount + vaultInfo.unrealisedReservingFeeAmount + amount
|
|
535
540
|
const utilization = vaultSupply ? ((vaultInfo.reservedAmount + amount) / vaultSupply) : 0
|
|
536
|
-
return
|
|
541
|
+
return ZLPDataAPI.calcReservingFeeRate(vaultInfo.reservingFeeModel, utilization, SECONDS_PER_EIGHT_HOUR)
|
|
537
542
|
}
|
|
538
543
|
|
|
539
544
|
public async getHistory(trader: string, page: number, limit: number, orderType?: string, symbol?: string): Promise<IBaseHistoryResponse> {
|
|
@@ -572,53 +577,53 @@ export class ZLPDataAPI extends BaseDataAPI implements IZLPDataAPI {
|
|
|
572
577
|
}
|
|
573
578
|
|
|
574
579
|
// Private helper methods
|
|
575
|
-
private calcFundingFeeRate(model: IZLPFundingFeeModel, pnlPerRate: number, elapsed: number): number {
|
|
580
|
+
private static calcFundingFeeRate(model: IZLPFundingFeeModel, pnlPerRate: number, elapsed: number): number {
|
|
576
581
|
const dailyRate = Math.min(model.multiplier * Math.abs(pnlPerRate), model.max)
|
|
577
582
|
const secondsRate = dailyRate * elapsed / SECONDS_PER_EIGHT_HOUR
|
|
578
583
|
return pnlPerRate >= 0 ? -secondsRate : secondsRate
|
|
579
584
|
}
|
|
580
585
|
|
|
581
|
-
private calcAccFundingFeeRate(symbol: IZLPSymbolInfo, model: IZLPFundingFeeModel, price: number, lpSupplyAmount: number, timestamp: number): number {
|
|
586
|
+
private static calcAccFundingFeeRate(symbol: IZLPSymbolInfo, model: IZLPFundingFeeModel, price: number, lpSupplyAmount: number, timestamp: number): number {
|
|
582
587
|
if (symbol.lastUpdate > 0) {
|
|
583
588
|
const elapsed = timestamp - symbol.lastUpdate
|
|
584
589
|
if (elapsed > 0) {
|
|
585
|
-
const deltaSize =
|
|
590
|
+
const deltaSize = ZLPDataAPI.calcDeltaSize(symbol, price)
|
|
586
591
|
const pnlPerLp = (symbol.realisedPnl + symbol.unrealisedFundingFeeValue + deltaSize) / lpSupplyAmount
|
|
587
|
-
return symbol.accFundingRate +
|
|
592
|
+
return symbol.accFundingRate + ZLPDataAPI.calcFundingFeeRate(model, pnlPerLp, elapsed)
|
|
588
593
|
}
|
|
589
594
|
}
|
|
590
595
|
return symbol.accFundingRate
|
|
591
596
|
}
|
|
592
597
|
|
|
593
|
-
private calculateSymbolFundingFee(symbol: IZLPSymbolInfo, model: IZLPFundingFeeModel, price: number, lpSupplyAmount: number, timestamp: number): number {
|
|
594
|
-
const accFundingRate =
|
|
598
|
+
private static calculateSymbolFundingFee(symbol: IZLPSymbolInfo, model: IZLPFundingFeeModel, price: number, lpSupplyAmount: number, timestamp: number): number {
|
|
599
|
+
const accFundingRate = ZLPDataAPI.calcAccFundingFeeRate(symbol, model, price, lpSupplyAmount, timestamp)
|
|
595
600
|
return symbol.unrealisedFundingFeeValue + (accFundingRate - symbol.accFundingRate) * symbol.openingSize
|
|
596
601
|
}
|
|
597
602
|
|
|
598
|
-
private calculatePositionReserveFee(position: IZLPPositionInfo, vault: IZLPVaultInfo, model: IZLPReservingFeeModel, timestamp: number): number {
|
|
599
|
-
const accReservingRate =
|
|
603
|
+
private static calculatePositionReserveFee(position: IZLPPositionInfo, vault: IZLPVaultInfo, model: IZLPReservingFeeModel, timestamp: number): number {
|
|
604
|
+
const accReservingRate = ZLPDataAPI.calcAccReservingFeeRate(vault, model, timestamp)
|
|
600
605
|
return position.reservingFeeAmount + (accReservingRate - position.lastReservingRate) * position.collateralAmount
|
|
601
606
|
}
|
|
602
607
|
|
|
603
|
-
private calcAccReservingFeeRate(vault: IZLPVaultInfo, model: IZLPReservingFeeModel, timestamp: number): number {
|
|
608
|
+
private static calcAccReservingFeeRate(vault: IZLPVaultInfo, model: IZLPReservingFeeModel, timestamp: number): number {
|
|
604
609
|
if (vault.lastUpdate > 0) {
|
|
605
610
|
const elapsed = timestamp - vault.lastUpdate
|
|
606
611
|
if (elapsed > 0) {
|
|
607
|
-
const utilization =
|
|
608
|
-
return vault.accReservingRate +
|
|
612
|
+
const utilization = ZLPDataAPI.vaultUtilization(vault)
|
|
613
|
+
return vault.accReservingRate + ZLPDataAPI.calcReservingFeeRate(model, utilization, elapsed)
|
|
609
614
|
}
|
|
610
615
|
}
|
|
611
616
|
return vault.accReservingRate
|
|
612
617
|
}
|
|
613
618
|
|
|
614
|
-
private calcRebaseFeeRate(model: IZLPRebaseFeeModel, increase: boolean, ratio: number, targetRatio: number): number {
|
|
619
|
+
private static calcRebaseFeeRate(model: IZLPRebaseFeeModel, increase: boolean, ratio: number, targetRatio: number): number {
|
|
615
620
|
if ((increase && ratio <= targetRatio) || (!increase && ratio >= targetRatio)) {
|
|
616
621
|
return model.base
|
|
617
622
|
}
|
|
618
623
|
return model.base + model.multiplier * Math.abs(ratio - targetRatio)
|
|
619
624
|
}
|
|
620
625
|
|
|
621
|
-
private vaultUtilization(vault: IZLPVaultInfo): number {
|
|
626
|
+
private static vaultUtilization(vault: IZLPVaultInfo): number {
|
|
622
627
|
const supplyAmount = vault.liquidity + vault.reservedAmount + vault.unrealisedReservingFeeAmount
|
|
623
628
|
if (supplyAmount === 0) {
|
|
624
629
|
return 0
|
|
@@ -626,16 +631,16 @@ export class ZLPDataAPI extends BaseDataAPI implements IZLPDataAPI {
|
|
|
626
631
|
return vault.reservedAmount / supplyAmount
|
|
627
632
|
}
|
|
628
633
|
|
|
629
|
-
private calcReservingFeeRate(model: IZLPReservingFeeModel, utilization: number, elapsed: number): number {
|
|
634
|
+
private static calcReservingFeeRate(model: IZLPReservingFeeModel, utilization: number, elapsed: number): number {
|
|
630
635
|
return model.multiplier * utilization * elapsed / SECONDS_PER_EIGHT_HOUR
|
|
631
636
|
}
|
|
632
637
|
|
|
633
|
-
private calcDeltaSize(symbol: IZLPSymbolInfo, price: number): number {
|
|
638
|
+
private static calcDeltaSize(symbol: IZLPSymbolInfo, price: number): number {
|
|
634
639
|
const latestSize = symbol.openingAmount / symbol.priceConfig.precision * price
|
|
635
640
|
return symbol.long ? symbol.openingSize - latestSize : latestSize - symbol.openingSize
|
|
636
641
|
}
|
|
637
642
|
|
|
638
|
-
private parseMarketInfo(raw: any): IZLPMarketInfo {
|
|
643
|
+
private static parseMarketInfo(raw: any): IZLPMarketInfo {
|
|
639
644
|
const content = raw.data.content.fields
|
|
640
645
|
|
|
641
646
|
return {
|
|
@@ -659,7 +664,7 @@ export class ZLPDataAPI extends BaseDataAPI implements IZLPDataAPI {
|
|
|
659
664
|
showContent: true,
|
|
660
665
|
},
|
|
661
666
|
})
|
|
662
|
-
const reservingFeeModel =
|
|
667
|
+
const reservingFeeModel = ZLPDataAPI.parseReservingFeeModel(reservingFeeModelRaw)
|
|
663
668
|
|
|
664
669
|
return {
|
|
665
670
|
liquidity: parseValue(vaultFields.liquidity),
|
|
@@ -690,7 +695,7 @@ export class ZLPDataAPI extends BaseDataAPI implements IZLPDataAPI {
|
|
|
690
695
|
showContent: true,
|
|
691
696
|
},
|
|
692
697
|
})
|
|
693
|
-
const fundingFeeModel =
|
|
698
|
+
const fundingFeeModel = ZLPDataAPI.parseFundingFeeModel(fundingFeeModelRaw)
|
|
694
699
|
|
|
695
700
|
return {
|
|
696
701
|
openingSize: parseValue(fields.opening_size),
|
|
@@ -713,7 +718,7 @@ export class ZLPDataAPI extends BaseDataAPI implements IZLPDataAPI {
|
|
|
713
718
|
}
|
|
714
719
|
}
|
|
715
720
|
|
|
716
|
-
private parsePositionConfig(raw: any): IZLPPositionConfig {
|
|
721
|
+
private static parsePositionConfig(raw: any): IZLPPositionConfig {
|
|
717
722
|
const positionConfigFields = raw.data.content.fields.inner.fields
|
|
718
723
|
|
|
719
724
|
return {
|
|
@@ -753,18 +758,18 @@ export class ZLPDataAPI extends BaseDataAPI implements IZLPDataAPI {
|
|
|
753
758
|
openTimestamp: parseValue(positionFields.open_timestamp),
|
|
754
759
|
}
|
|
755
760
|
|
|
756
|
-
positionInfo.reservingFeeAmount =
|
|
757
|
-
positionInfo.fundingFeeValue =
|
|
761
|
+
positionInfo.reservingFeeAmount = ZLPDataAPI.calculatePositionReserveFee(positionInfo, await this.getVaultInfo(positionInfo.collateralToken), (await this.getVaultInfo(positionInfo.collateralToken)).reservingFeeModel, Date.now() / 1000)
|
|
762
|
+
positionInfo.fundingFeeValue = ZLPDataAPI.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)
|
|
758
763
|
|
|
759
764
|
return positionInfo
|
|
760
765
|
}
|
|
761
766
|
|
|
762
|
-
private calculatePositionFundingFee(position: IZLPPositionInfo, symbol: IZLPSymbolInfo, model: IZLPFundingFeeModel, price: number, lpSupplyAmount: number, timestamp: number): number {
|
|
763
|
-
const accFundingRate =
|
|
767
|
+
private static calculatePositionFundingFee(position: IZLPPositionInfo, symbol: IZLPSymbolInfo, model: IZLPFundingFeeModel, price: number, lpSupplyAmount: number, timestamp: number): number {
|
|
768
|
+
const accFundingRate = ZLPDataAPI.calcAccFundingFeeRate(symbol, model, price, lpSupplyAmount, timestamp)
|
|
764
769
|
return position.fundingFeeValue + (accFundingRate - position.lastFundingRate) * position.positionSize
|
|
765
770
|
}
|
|
766
771
|
|
|
767
|
-
private parseRebaseFeeModel(raw: any): { base: number
|
|
772
|
+
private static parseRebaseFeeModel(raw: any): { base: number, multiplier: number } {
|
|
768
773
|
const { fields } = raw.data.content
|
|
769
774
|
|
|
770
775
|
return {
|
|
@@ -773,14 +778,14 @@ export class ZLPDataAPI extends BaseDataAPI implements IZLPDataAPI {
|
|
|
773
778
|
}
|
|
774
779
|
}
|
|
775
780
|
|
|
776
|
-
private parseReservingFeeModel(raw: any): { multiplier: number } {
|
|
781
|
+
private static parseReservingFeeModel(raw: any): { multiplier: number } {
|
|
777
782
|
const content = raw.data.content.fields
|
|
778
783
|
return {
|
|
779
784
|
multiplier: parseValue(content.multiplier),
|
|
780
785
|
}
|
|
781
786
|
}
|
|
782
787
|
|
|
783
|
-
private parseFundingFeeModel(raw: any): { multiplier: number
|
|
788
|
+
private static parseFundingFeeModel(raw: any): { multiplier: number, max: number } {
|
|
784
789
|
const content = raw.data.content.fields
|
|
785
790
|
return {
|
|
786
791
|
multiplier: parseValue(content.multiplier),
|
|
@@ -843,14 +848,14 @@ export class ZLPDataAPI extends BaseDataAPI implements IZLPDataAPI {
|
|
|
843
848
|
return Number.parseFloat(await res.text() || '0')
|
|
844
849
|
}
|
|
845
850
|
|
|
846
|
-
private calculateVaultReservingFee(
|
|
851
|
+
private static calculateVaultReservingFee(
|
|
847
852
|
vaultInfo: IZLPVaultInfo,
|
|
848
853
|
reservingFeeModel: { multiplier: number },
|
|
849
|
-
currentTime: number
|
|
854
|
+
currentTime: number,
|
|
850
855
|
): number {
|
|
851
856
|
const timeDelta = currentTime - vaultInfo.lastUpdate
|
|
852
857
|
const periods = Math.floor(timeDelta / SECONDS_PER_EIGHT_HOUR)
|
|
853
|
-
return vaultInfo.unrealisedReservingFeeAmount
|
|
854
|
-
(vaultInfo.reservedAmount * reservingFeeModel.multiplier * periods) / 1e18
|
|
858
|
+
return vaultInfo.unrealisedReservingFeeAmount
|
|
859
|
+
+ (vaultInfo.reservedAmount * reservingFeeModel.multiplier * periods) / 1e18
|
|
855
860
|
}
|
|
856
|
-
}
|
|
861
|
+
}
|
|
@@ -4,11 +4,11 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
// Data API implementations
|
|
7
|
-
export { ZLPDataAPI } from './ZLPDataAPI'
|
|
8
7
|
export { SLPDataAPI } from './SLPDataAPI'
|
|
9
8
|
export { USDZDataAPI } from './USDZDataAPI'
|
|
9
|
+
export { ZLPDataAPI } from './ZLPDataAPI'
|
|
10
10
|
|
|
11
11
|
// API implementations
|
|
12
|
-
export { ZLPAPI } from './ZLPAPI'
|
|
13
12
|
export { SLPAPI } from './SLPAPI'
|
|
14
|
-
export { USDZAPI } from './USDZAPI'
|
|
13
|
+
export { USDZAPI } from './USDZAPI'
|
|
14
|
+
export { ZLPAPI } from './ZLPAPI'
|
package/src/index.ts
CHANGED
|
@@ -1,20 +1,25 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* ZO SDK - Re-architected Multi-LP Token SDK
|
|
3
|
-
*
|
|
3
|
+
*
|
|
4
4
|
* This SDK provides a unified interface for interacting with multiple LP tokens:
|
|
5
5
|
* - ZLP (ZO Liquidity Provider)
|
|
6
|
-
* - SLP (Sudo Liquidity Provider)
|
|
6
|
+
* - SLP (Sudo Liquidity Provider)
|
|
7
7
|
* - USDZ (USD Stablecoin)
|
|
8
|
-
*
|
|
8
|
+
*
|
|
9
9
|
* The architecture follows a common interface pattern with specific implementations
|
|
10
10
|
* for each LP token type, allowing for easy extension to support future LP tokens.
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
13
|
// Export new re-architected interfaces and implementations
|
|
14
|
-
|
|
14
|
+
/**
|
|
15
|
+
* Default SDK instance for backward compatibility and convenience
|
|
16
|
+
*/
|
|
17
|
+
import { SDKFactory } from './factory/SDKFactory'
|
|
18
|
+
|
|
15
19
|
export * from './abstract'
|
|
16
|
-
export * from './implementations'
|
|
17
20
|
export * from './factory/SDKFactory'
|
|
21
|
+
export * from './implementations'
|
|
22
|
+
export * from './interfaces'
|
|
18
23
|
|
|
19
24
|
// Export legacy components for backward compatibility
|
|
20
25
|
export * from './api'
|
|
@@ -30,29 +35,24 @@ export type { Transaction } from '@mysten/sui/transactions'
|
|
|
30
35
|
|
|
31
36
|
/**
|
|
32
37
|
* Main SDK Factory instance for convenient access
|
|
33
|
-
*
|
|
38
|
+
*
|
|
34
39
|
* Usage examples:
|
|
35
|
-
*
|
|
40
|
+
*
|
|
36
41
|
* ```typescript
|
|
37
42
|
* import { SDK, LPToken } from '@zo/sdk'
|
|
38
|
-
*
|
|
43
|
+
*
|
|
39
44
|
* // Create ZLP API instance
|
|
40
45
|
* const zlpAPI = SDK.createZLPAPI(network, provider, apiEndpoint, connectionURL)
|
|
41
|
-
*
|
|
42
|
-
* // Create SLP API instance
|
|
46
|
+
*
|
|
47
|
+
* // Create SLP API instance
|
|
43
48
|
* const slpAPI = SDK.createSLPAPI(network, provider, apiEndpoint, connectionURL)
|
|
44
|
-
*
|
|
49
|
+
*
|
|
45
50
|
* // Create USDZ API instance
|
|
46
51
|
* const usdzAPI = SDK.createUSDZAPI(network, provider, apiEndpoint, connectionURL)
|
|
47
|
-
*
|
|
52
|
+
*
|
|
48
53
|
* // Or use the generic factory method
|
|
49
54
|
* const api = SDK.createAPI(LPToken.ZLP, network, provider, apiEndpoint, connectionURL)
|
|
50
55
|
* ```
|
|
51
56
|
*/
|
|
52
57
|
export { SDKFactory as SDK } from './factory/SDKFactory'
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* Default SDK instance for backward compatibility and convenience
|
|
56
|
-
*/
|
|
57
|
-
import { SDKFactory } from './factory/SDKFactory'
|
|
58
58
|
export const defaultSDK = SDKFactory.getInstance()
|