zo-sdk 0.1.4 → 0.1.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.
@@ -4,6 +4,7 @@
4
4
  */
5
5
 
6
6
  import type { KioskClient, KioskOwnerCap } from '@mysten/kiosk'
7
+ import { KioskTransaction } from '@mysten/kiosk'
7
8
  import type { SuiClient } from '@mysten/sui/client'
8
9
  import { Transaction } from '@mysten/sui/transactions'
9
10
  import { SUI_CLOCK_OBJECT_ID } from '@mysten/sui/utils'
@@ -52,30 +53,6 @@ export class USDZAPI extends BaseAPI implements IUSDZAPI {
52
53
  throw new Error(`Method not implemented in ${this.constructor.name}.`)
53
54
  }
54
55
 
55
- public clearClosedPosition(_pcpId: string, _collateralToken: string, _indexToken: string, _long: boolean, _tx: Transaction): void {
56
- throw new Error(`Method not implemented in ${this.constructor.name}.`)
57
- }
58
-
59
- public clearOpenPositionOrder(_orderCapId: string, _collateralToken: string, _indexToken: string, _long: boolean, _tx: Transaction, _isV11Order?: boolean): void {
60
- throw new Error(`Method not implemented in ${this.constructor.name}.`)
61
- }
62
-
63
- public clearDecreasePositionOrder(_orderCapId: string, _collateralToken: string, _indexToken: string, _long: boolean, _tx: Transaction, _isV11Order?: boolean): void {
64
- throw new Error(`Method not implemented in ${this.constructor.name}.`)
65
- }
66
-
67
- public openPositionWithSCard(_collateralToken: string, _indexToken: string, _size: bigint, _collateralAmount: bigint, _coinObjects: string[], _long: boolean, _reserveAmount: bigint, _indexPrice: number, _collateralPrice: number, _kioskClient: KioskClient, _kioskCap: KioskOwnerCap, _scard: string, _isLimitOrder?: boolean, _isIocOrder?: boolean, _pricesSlippage?: number, _collateralSlippage?: number, _relayerFee?: bigint, _referralAddress?: string, _sender?: string): Promise<Transaction> {
68
- throw new Error(`Method not implemented in ${this.constructor.name}.`)
69
- }
70
-
71
- public decreasePositionWithSCard(_pcpId: string, _collateralToken: string, _indexToken: string, _amount: bigint, _long: boolean, _indexPrice: number, _collateralPrice: number, _kioskClient: KioskClient, _kioskCap: KioskOwnerCap, _scard: string, _isTriggerOrder?: boolean, _isTakeProfitOrder?: boolean, _isIocOrder?: boolean, _pricesSlippage?: number, _collateralSlippage?: number, _relayerFee?: bigint, _coinObjects?: string[]): Promise<Transaction> {
72
- throw new Error(`Method not implemented in ${this.constructor.name}.`)
73
- }
74
-
75
- public decreaseMultiPositionsWithSCard(_positions: Array<{ pcpId: string, collateralToken: string, indexToken: string, amount: bigint, long: boolean, indexPrice: number, collateralPrice: number, isTriggerOrder?: boolean, isTakeProfitOrder?: boolean, isIocOrder?: boolean, pricesSlippage?: number, collateralSlippage?: number, relayerFee?: bigint, coinObjects?: string[] }>, _kioskClient: KioskClient, _kioskCap: KioskOwnerCap, _scard: string, _tx?: Transaction): Promise<Transaction> {
76
- throw new Error(`Method not implemented in ${this.constructor.name}.`)
77
- }
78
-
79
56
  public claimTokenFromSCard(_token: string, _coinObjects: string[], _kioskClient: KioskClient, _kioskCap: KioskOwnerCap, _scard: string): Transaction {
80
57
  throw new Error(`Method not implemented in ${this.constructor.name}.`)
81
58
  }
@@ -176,6 +153,335 @@ export class USDZAPI extends BaseAPI implements IUSDZAPI {
176
153
  throw new Error(`Method not implemented in ${this.constructor.name}.`)
177
154
  }
178
155
 
156
+ public clearClosedPosition(pcpId: string, collateralToken: string, indexToken: string, long: boolean, tx: Transaction): void {
157
+ tx.moveCall({
158
+ target: `${this.consts.zoCore.package}::market::clear_closed_position`,
159
+ typeArguments: [
160
+ `${this.consts.zoCore.package}::usdz::USDZ`,
161
+ this.consts.coins[collateralToken].module,
162
+ this.consts.coins[indexToken].module,
163
+ `${this.consts.zoCore.package}::market::${long ? 'LONG' : 'SHORT'}`,
164
+ ],
165
+ arguments: [tx.object(this.consts.zoCore.market), tx.object(pcpId)],
166
+ })
167
+ }
168
+
169
+ public clearOpenPositionOrder(orderCapId: string, collateralToken: string, indexToken: string, long: boolean, tx: Transaction, isV11Order?: boolean): void {
170
+ const funcName = isV11Order ? 'clear_open_position_order' : 'clear_open_position_order'
171
+ tx.moveCall({
172
+ target: `${this.consts.zoCore.package}::market::${funcName}`,
173
+ typeArguments: [
174
+ `${this.consts.zoCore.package}::usdz::USDZ`,
175
+ this.consts.coins[collateralToken].module,
176
+ this.consts.coins[indexToken].module,
177
+ `${this.consts.zoCore.package}::market::${long ? 'LONG' : 'SHORT'}`,
178
+ this.consts.coins[collateralToken].module,
179
+ ],
180
+ arguments: [tx.object(this.consts.zoCore.market), tx.object(orderCapId)],
181
+ })
182
+ }
183
+
184
+ public clearDecreasePositionOrder(orderCapId: string, collateralToken: string, indexToken: string, long: boolean, tx: Transaction, isV11Order?: boolean): void {
185
+ const funcName = isV11Order ? 'clear_decrease_position_order' : 'clear_decrease_position_order'
186
+ tx.moveCall({
187
+ target: `${this.consts.zoCore.package}::market::${funcName}`,
188
+ typeArguments: [
189
+ `${this.consts.zoCore.package}::usdz::USDZ`,
190
+ this.consts.coins[collateralToken].module,
191
+ this.consts.coins[indexToken].module,
192
+ `${this.consts.zoCore.package}::market::${long ? 'LONG' : 'SHORT'}`,
193
+ this.consts.coins[collateralToken].module,
194
+ ],
195
+ arguments: [tx.object(this.consts.zoCore.market), tx.object(orderCapId)],
196
+ })
197
+ }
198
+
199
+ public async openPositionWithSCard(
200
+ collateralToken: string,
201
+ indexToken: string,
202
+ size: bigint,
203
+ collateralAmount: bigint,
204
+ coinObjects: string[],
205
+ long: boolean,
206
+ reserveAmount: bigint,
207
+ indexPrice: number,
208
+ collateralPrice: number,
209
+ kioskClient: KioskClient,
210
+ kioskCap: KioskOwnerCap,
211
+ scard: string,
212
+ isLimitOrder?: boolean,
213
+ isIocOrder?: boolean,
214
+ pricesSlippage = 0.003,
215
+ collateralSlippage = 0.5,
216
+ relayerFee = BigInt(0.5),
217
+ referralAddress?: string,
218
+ sender?: string,
219
+ ): Promise<Transaction> {
220
+ let tx = new Transaction()
221
+ if (referralAddress && !(await this.dataAPI.hasReferral(sender || ''))) {
222
+ tx = await this.addReferral(referralAddress, tx)
223
+ }
224
+ tx = await this.initOracleTxb([collateralToken, indexToken], tx)
225
+ const coinObject = this.processCoins(tx, collateralToken, coinObjects)
226
+ const [depositObject, feeObject] = tx.splitCoins(coinObject, [
227
+ tx.pure.u64(collateralAmount),
228
+ tx.pure.u64(relayerFee),
229
+ ])
230
+
231
+ const symbol = joinSymbol(long ? 'long' : 'short', indexToken)
232
+ const adjustPrice = this.processSlippage(indexPrice, long, isLimitOrder ? 0 : pricesSlippage)
233
+ const adjustCollateralPrice = this.processSlippage(collateralPrice, false, collateralSlippage)
234
+
235
+ let allowTrade = ALLOW_TRADE_MUST_TRADE
236
+ if (isLimitOrder) {
237
+ allowTrade = isIocOrder ? ALLOW_TRADE_NO_TRADE : ALLOW_TRADE_CAN_TRADE
238
+ }
239
+
240
+ const kioskTx = new KioskTransaction({
241
+ transaction: tx,
242
+ kioskClient,
243
+ cap: kioskCap,
244
+ })
245
+
246
+ const [sudoCard, promise] = kioskTx.borrow({
247
+ itemType: `0xe7e651e4974fe367aa2837712d68081efb299c470242a15e2b9c26ea326159ec::card::SudoCard`,
248
+ itemId: scard,
249
+ })
250
+
251
+ tx.moveCall({
252
+ target: `${this.consts.zoCore.package}::market::open_position_with_scard`,
253
+ typeArguments: [
254
+ `${this.consts.zoCore.package}::usdz::USDZ`,
255
+ this.consts.coins[collateralToken].module,
256
+ this.consts.coins[indexToken].module,
257
+ `${this.consts.zoCore.package}::market::${long ? 'LONG' : 'SHORT'}`,
258
+ this.consts.coins[collateralToken].module,
259
+ ],
260
+ arguments: [
261
+ tx.object(SUI_CLOCK_OBJECT_ID),
262
+ tx.object(this.consts.zoCore.market),
263
+ tx.object(this.consts.zoCore.vaults[collateralToken].reservingFeeModel),
264
+ tx.object(this.consts.zoCore.symbols[symbol].fundingFeeModel),
265
+ tx.object(this.consts.zoCore.symbols[symbol].positionConfig),
266
+ tx.object(this.consts.pythFeeder.feeder[collateralToken]),
267
+ tx.object(this.consts.pythFeeder.feeder[indexToken]),
268
+ depositObject,
269
+ feeObject,
270
+ tx.pure.u8(allowTrade),
271
+ tx.pure.u64(size),
272
+ tx.pure.u64(reserveAmount),
273
+ tx.pure.u256(adjustCollateralPrice),
274
+ tx.pure.u256(adjustPrice),
275
+ sudoCard,
276
+ ],
277
+ })
278
+
279
+ kioskTx
280
+ .return({
281
+ itemType: `0xe7e651e4974fe367aa2837712d68081efb299c470242a15e2b9c26ea326159ec::card::SudoCard`,
282
+ item: sudoCard,
283
+ promise,
284
+ })
285
+ .finalize()
286
+ return tx
287
+ }
288
+
289
+ public async decreasePositionWithSCard(
290
+ pcpId: string,
291
+ collateralToken: string,
292
+ indexToken: string,
293
+ amount: bigint,
294
+ long: boolean,
295
+ indexPrice: number,
296
+ collateralPrice: number,
297
+ kioskClient: KioskClient,
298
+ kioskCap: KioskOwnerCap,
299
+ scard: string,
300
+ isTriggerOrder = false,
301
+ isTakeProfitOrder = true,
302
+ isIocOrder = false,
303
+ pricesSlippage = 0.003,
304
+ collateralSlippage = 0.5,
305
+ relayerFee = BigInt(0.5),
306
+ coinObjects?: string[],
307
+ ): Promise<Transaction> {
308
+ if (!coinObjects) {
309
+ throw new Error(`${this.constructor.name}: coinObjects is required`)
310
+ }
311
+ const tx = await this.initOracleTxb([collateralToken, indexToken])
312
+
313
+ const kioskTx = new KioskTransaction({
314
+ transaction: tx,
315
+ kioskClient,
316
+ cap: kioskCap,
317
+ })
318
+
319
+ const [sudoCard, promise] = kioskTx.borrow({
320
+ itemType: `0xe7e651e4974fe367aa2837712d68081efb299c470242a15e2b9c26ea326159ec::card::SudoCard`,
321
+ itemId: scard,
322
+ })
323
+
324
+ const symbol = joinSymbol(long ? 'long' : 'short', indexToken)
325
+ const coinObject = this.processCoins(tx, collateralToken, coinObjects || [])
326
+ const feeObject = tx.splitCoins(coinObject, [tx.pure.u64(relayerFee)])
327
+
328
+ const adjustPrice = this.processSlippage(indexPrice, !long, isTriggerOrder ? 0 : pricesSlippage)
329
+ const adjustCollateralPrice = this.processSlippage(collateralPrice, false, collateralSlippage)
330
+
331
+ let allowTrade = ALLOW_TRADE_MUST_TRADE
332
+ if (isTriggerOrder) {
333
+ allowTrade = isIocOrder || !isTakeProfitOrder ? ALLOW_TRADE_NO_TRADE : ALLOW_TRADE_CAN_TRADE
334
+ }
335
+ else {
336
+ isTakeProfitOrder = true
337
+ }
338
+
339
+ tx.moveCall({
340
+ target: `${this.consts.zoCore.package}::market::decrease_position_with_scard`,
341
+ typeArguments: [
342
+ `${this.consts.zoCore.package}::usdz::USDZ`,
343
+ this.consts.coins[collateralToken].module,
344
+ this.consts.coins[indexToken].module,
345
+ `${this.consts.zoCore.package}::market::${long ? 'LONG' : 'SHORT'}`,
346
+ this.consts.coins[collateralToken].module,
347
+ ],
348
+ arguments: [
349
+ tx.object(SUI_CLOCK_OBJECT_ID),
350
+ tx.object(this.consts.zoCore.market),
351
+ tx.object(pcpId),
352
+ tx.object(this.consts.zoCore.vaults[collateralToken].reservingFeeModel),
353
+ tx.object(this.consts.zoCore.symbols[symbol].fundingFeeModel),
354
+ tx.object(this.consts.pythFeeder.feeder[collateralToken]),
355
+ tx.object(this.consts.pythFeeder.feeder[indexToken]),
356
+ feeObject,
357
+ tx.pure.u8(allowTrade),
358
+ tx.pure.bool(isTakeProfitOrder),
359
+ tx.pure.u64(amount),
360
+ tx.pure.u256(adjustCollateralPrice),
361
+ tx.pure.u256(adjustPrice),
362
+ sudoCard,
363
+ ],
364
+ })
365
+
366
+ kioskTx
367
+ .return({
368
+ itemType: `0xe7e651e4974fe367aa2837712d68081efb299c470242a15e2b9c26ea326159ec::card::SudoCard`,
369
+ item: sudoCard,
370
+ promise,
371
+ })
372
+ .finalize()
373
+ return tx
374
+ }
375
+
376
+ public async decreaseMultiPositionsWithSCard(
377
+ positions: Array<{
378
+ pcpId: string
379
+ collateralToken: string
380
+ indexToken: string
381
+ amount: bigint
382
+ long: boolean
383
+ indexPrice: number
384
+ collateralPrice: number
385
+ isTriggerOrder?: boolean
386
+ isTakeProfitOrder?: boolean
387
+ isIocOrder?: boolean
388
+ pricesSlippage?: number
389
+ collateralSlippage?: number
390
+ relayerFee?: bigint
391
+ coinObjects?: string[]
392
+ }>,
393
+ kioskClient: KioskClient,
394
+ kioskCap: KioskOwnerCap,
395
+ scard: string,
396
+ tx?: Transaction,
397
+ ): Promise<Transaction> {
398
+ if (!tx) {
399
+ tx = new Transaction()
400
+ }
401
+ tx = await this.initOracleTxb(positions.flatMap(position => [position.collateralToken, position.indexToken]), tx)
402
+
403
+ const kioskTx = new KioskTransaction({
404
+ transaction: tx,
405
+ kioskClient,
406
+ cap: kioskCap,
407
+ })
408
+
409
+ const [sudoCard, promise] = kioskTx.borrow({
410
+ itemType: `0xe7e651e4974fe367aa2837712d68081efb299c470242a15e2b9c26ea326159ec::card::SudoCard`,
411
+ itemId: scard,
412
+ })
413
+
414
+ for (const position of positions) {
415
+ const {
416
+ pcpId,
417
+ collateralToken,
418
+ coinObjects = [],
419
+ indexToken,
420
+ amount,
421
+ long,
422
+ indexPrice,
423
+ collateralPrice,
424
+ isTriggerOrder = false,
425
+ isTakeProfitOrder = true,
426
+ isIocOrder = false,
427
+ pricesSlippage = 0.003,
428
+ collateralSlippage = 0.5,
429
+ relayerFee = BigInt(0.5),
430
+ } = position
431
+ let innerIsTakeProfitOrder = isTakeProfitOrder
432
+ const symbol = joinSymbol(long ? 'long' : 'short', indexToken)
433
+ const coinObject = this.processCoins(tx, collateralToken, coinObjects)
434
+ const feeObject = tx.splitCoins(coinObject, [tx.pure.u64(relayerFee)])
435
+
436
+ const adjustPrice = this.processSlippage(indexPrice, !long, isTriggerOrder ? 0 : pricesSlippage)
437
+ const adjustCollateralPrice = this.processSlippage(collateralPrice, false, collateralSlippage)
438
+
439
+ let allowTrade = ALLOW_TRADE_MUST_TRADE
440
+ if (isTriggerOrder) {
441
+ allowTrade = isIocOrder || !innerIsTakeProfitOrder ? ALLOW_TRADE_NO_TRADE : ALLOW_TRADE_CAN_TRADE
442
+ }
443
+ else {
444
+ innerIsTakeProfitOrder = true
445
+ }
446
+
447
+ tx.moveCall({
448
+ target: `${this.consts.zoCore.package}::market::decrease_position_with_scard`,
449
+ typeArguments: [
450
+ `${this.consts.zoCore.package}::usdz::USDZ`,
451
+ this.consts.coins[collateralToken].module,
452
+ this.consts.coins[indexToken].module,
453
+ `${this.consts.zoCore.package}::market::${long ? 'LONG' : 'SHORT'}`,
454
+ this.consts.coins[collateralToken].module,
455
+ ],
456
+ arguments: [
457
+ tx.object(SUI_CLOCK_OBJECT_ID),
458
+ tx.object(this.consts.zoCore.market),
459
+ tx.object(pcpId),
460
+ tx.object(this.consts.zoCore.vaults[collateralToken].reservingFeeModel),
461
+ tx.object(this.consts.zoCore.symbols[symbol].fundingFeeModel),
462
+ tx.object(this.consts.pythFeeder.feeder[collateralToken]),
463
+ tx.object(this.consts.pythFeeder.feeder[indexToken]),
464
+ feeObject,
465
+ tx.pure.u8(allowTrade),
466
+ tx.pure.bool(innerIsTakeProfitOrder),
467
+ tx.pure.u64(amount),
468
+ tx.pure.u256(adjustCollateralPrice),
469
+ tx.pure.u256(adjustPrice),
470
+ sudoCard,
471
+ ],
472
+ })
473
+ }
474
+
475
+ kioskTx
476
+ .return({
477
+ itemType: `0xe7e651e4974fe367aa2837712d68081efb299c470242a15e2b9c26ea326159ec::card::SudoCard`,
478
+ item: sudoCard,
479
+ promise,
480
+ })
481
+ .finalize()
482
+ return tx
483
+ }
484
+
179
485
  /**
180
486
  * Deposits collateral into USDZ vault
181
487
  */
@@ -526,6 +526,7 @@ export class USDZDataAPI extends BaseDataAPI implements IUSDZDataAPI {
526
526
  params.append('symbol', symbol)
527
527
  }
528
528
 
529
+ params.append('lpType', 'USDZ')
529
530
  const url = `${this.apiEndpoint}/traderEvents?${params}`
530
531
  const res = await fetch(url, {
531
532
  method: 'GET',
@@ -556,6 +556,7 @@ export class ZLPDataAPI extends BaseDataAPI implements IZLPDataAPI {
556
556
  params.append('symbol', symbol)
557
557
  }
558
558
 
559
+ params.append('lpType', 'ZLP')
559
560
  const url = `${this.apiEndpoint}/traderEvents?${params}`
560
561
  const res = await fetch(url, {
561
562
  method: 'GET',