@zofai/zo-sdk 0.2.13 → 0.2.15

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.
Files changed (109) hide show
  1. package/.claude/settings.local.json +11 -1
  2. package/dist/abstract/BaseDataAPI.cjs +1 -1
  3. package/dist/abstract/BaseDataAPI.cjs.map +1 -1
  4. package/dist/abstract/BaseDataAPI.mjs +1 -1
  5. package/dist/abstract/BaseDataAPI.mjs.map +1 -1
  6. package/dist/consts/deployments-usdz-mainnet.json +1 -31
  7. package/dist/consts/deployments-zo-oracle-mainnet.json +329 -0
  8. package/dist/consts/index.cjs +35 -1
  9. package/dist/consts/index.cjs.map +1 -1
  10. package/dist/consts/index.d.cts +45 -0
  11. package/dist/consts/index.d.cts.map +1 -1
  12. package/dist/consts/index.d.mts +45 -0
  13. package/dist/consts/index.d.mts.map +1 -1
  14. package/dist/consts/index.mjs +31 -0
  15. package/dist/consts/index.mjs.map +1 -1
  16. package/dist/data.cjs +1 -1
  17. package/dist/data.cjs.map +1 -1
  18. package/dist/data.mjs +1 -1
  19. package/dist/data.mjs.map +1 -1
  20. package/dist/implementations/USDZAPI.cjs +426 -78
  21. package/dist/implementations/USDZAPI.cjs.map +1 -1
  22. package/dist/implementations/USDZAPI.d.cts +54 -0
  23. package/dist/implementations/USDZAPI.d.cts.map +1 -1
  24. package/dist/implementations/USDZAPI.d.mts +54 -0
  25. package/dist/implementations/USDZAPI.d.mts.map +1 -1
  26. package/dist/implementations/USDZAPI.mjs +427 -79
  27. package/dist/implementations/USDZAPI.mjs.map +1 -1
  28. package/dist/implementations/USDZDataAPI.cjs +38 -0
  29. package/dist/implementations/USDZDataAPI.cjs.map +1 -1
  30. package/dist/implementations/USDZDataAPI.d.cts +16 -0
  31. package/dist/implementations/USDZDataAPI.d.cts.map +1 -1
  32. package/dist/implementations/USDZDataAPI.d.mts +16 -0
  33. package/dist/implementations/USDZDataAPI.d.mts.map +1 -1
  34. package/dist/implementations/USDZDataAPI.mjs +38 -0
  35. package/dist/implementations/USDZDataAPI.mjs.map +1 -1
  36. package/dist/index.cjs +3 -0
  37. package/dist/index.cjs.map +1 -1
  38. package/dist/index.d.cts +3 -0
  39. package/dist/index.d.cts.map +1 -1
  40. package/dist/index.d.mts +3 -0
  41. package/dist/index.d.mts.map +1 -1
  42. package/dist/index.mjs +3 -0
  43. package/dist/index.mjs.map +1 -1
  44. package/dist/interfaces/base.d.cts +19 -1
  45. package/dist/interfaces/base.d.cts.map +1 -1
  46. package/dist/interfaces/base.d.mts +19 -1
  47. package/dist/interfaces/base.d.mts.map +1 -1
  48. package/dist/interfaces/usdz.d.cts +17 -0
  49. package/dist/interfaces/usdz.d.cts.map +1 -1
  50. package/dist/interfaces/usdz.d.mts +17 -0
  51. package/dist/interfaces/usdz.d.mts.map +1 -1
  52. package/dist/oracle.cjs +119 -1
  53. package/dist/oracle.cjs.map +1 -1
  54. package/dist/oracle.d.cts +57 -1
  55. package/dist/oracle.d.cts.map +1 -1
  56. package/dist/oracle.d.mts +57 -1
  57. package/dist/oracle.d.mts.map +1 -1
  58. package/dist/oracle.mjs +120 -2
  59. package/dist/oracle.mjs.map +1 -1
  60. package/dist/oraclePro.cjs +214 -0
  61. package/dist/oraclePro.cjs.map +1 -0
  62. package/dist/oraclePro.d.cts +92 -0
  63. package/dist/oraclePro.d.cts.map +1 -0
  64. package/dist/oraclePro.d.mts +92 -0
  65. package/dist/oraclePro.d.mts.map +1 -0
  66. package/dist/oraclePro.mjs +196 -0
  67. package/dist/oraclePro.mjs.map +1 -0
  68. package/dist/pythProClient.cjs +277 -0
  69. package/dist/pythProClient.cjs.map +1 -0
  70. package/dist/pythProClient.d.cts +143 -0
  71. package/dist/pythProClient.d.cts.map +1 -0
  72. package/dist/pythProClient.d.mts +143 -0
  73. package/dist/pythProClient.d.mts.map +1 -0
  74. package/dist/pythProClient.mjs +269 -0
  75. package/dist/pythProClient.mjs.map +1 -0
  76. package/dist/storkClient.cjs +217 -0
  77. package/dist/storkClient.cjs.map +1 -0
  78. package/dist/storkClient.d.cts +90 -0
  79. package/dist/storkClient.d.cts.map +1 -0
  80. package/dist/storkClient.d.mts +90 -0
  81. package/dist/storkClient.d.mts.map +1 -0
  82. package/dist/storkClient.mjs +208 -0
  83. package/dist/storkClient.mjs.map +1 -0
  84. package/dist/storkOracle.cjs +61 -0
  85. package/dist/storkOracle.cjs.map +1 -0
  86. package/dist/storkOracle.d.cts +21 -0
  87. package/dist/storkOracle.d.cts.map +1 -0
  88. package/dist/storkOracle.d.mts +21 -0
  89. package/dist/storkOracle.d.mts.map +1 -0
  90. package/dist/storkOracle.mjs +56 -0
  91. package/dist/storkOracle.mjs.map +1 -0
  92. package/package.json +1 -1
  93. package/src/abstract/BaseDataAPI.ts +1 -1
  94. package/src/consts/deployments-usdz-mainnet.json +1 -31
  95. package/src/consts/deployments-zo-oracle-mainnet.json +329 -0
  96. package/src/consts/index.ts +80 -0
  97. package/src/data.ts +1 -1
  98. package/src/implementations/USDZAPI.ts +731 -101
  99. package/src/implementations/USDZDataAPI.ts +42 -0
  100. package/src/index.ts +3 -0
  101. package/src/interfaces/base.ts +54 -1
  102. package/src/interfaces/usdz.ts +125 -0
  103. package/src/oracle.ts +222 -1
  104. package/src/oraclePro.ts +312 -0
  105. package/src/pythProClient.ts +406 -0
  106. package/src/storkClient.ts +328 -0
  107. package/src/storkOracle.ts +82 -0
  108. package/tests/pythProClient.test.ts +155 -0
  109. package/tests/storkClient.test.ts +316 -0
@@ -9,7 +9,9 @@ const kiosk_1 = require("@mysten/kiosk");
9
9
  const transactions_1 = require("@mysten/sui/transactions");
10
10
  const utils_1 = require("@mysten/sui/utils");
11
11
  const abstract_1 = require("../abstract/index.cjs");
12
+ const coins_1 = require("../coins.cjs");
12
13
  const consts_1 = require("../consts/index.cjs");
14
+ const oraclePro_1 = require("../oraclePro.cjs");
13
15
  const utils_2 = require("../utils.cjs");
14
16
  const USDZDataAPI_1 = require("./USDZDataAPI.cjs");
15
17
  class USDZAPI extends abstract_1.BaseAPI {
@@ -17,6 +19,59 @@ class USDZAPI extends abstract_1.BaseAPI {
17
19
  super(network, provider, apiEndpoint, connectionURL, consts_1.LPToken.USDZ);
18
20
  this.dataAPI = new USDZDataAPI_1.USDZDataAPI(network, provider, apiEndpoint, connectionURL);
19
21
  }
22
+ usdzLpType() {
23
+ return `${this.consts.zoCore.package}::usdz::USDZ`;
24
+ }
25
+ positionTypeArgs(collateralToken, indexToken, long) {
26
+ return [
27
+ this.usdzLpType(),
28
+ this.consts.coins[collateralToken].module,
29
+ this.consts.coins[indexToken].module,
30
+ `${this.consts.zoCore.package}::market::${long ? 'LONG' : 'SHORT'}`,
31
+ this.consts.coins[collateralToken].module,
32
+ ];
33
+ }
34
+ redeemTypeArgs(collateralToken, indexToken, long) {
35
+ return [
36
+ this.usdzLpType(),
37
+ this.consts.coins[collateralToken].module,
38
+ this.consts.coins[indexToken].module,
39
+ `${this.consts.zoCore.package}::market::${long ? 'LONG' : 'SHORT'}`,
40
+ ];
41
+ }
42
+ async initV3OracleForTokens(tokens, tx, pythProUpdateBytes, includeEmaPrice, options) {
43
+ const result = await this.initV3OracleTxb(tokens, tx, {
44
+ rawUpdateBytes: pythProUpdateBytes,
45
+ includeEmaPrice,
46
+ ...options,
47
+ });
48
+ return { tx: result.tx, oracle: result.oracle };
49
+ }
50
+ /** Vault + symbol index tokens required for valuate_vault_v2 / valuate_symbol_v2. */
51
+ getValuationOracleTokens() {
52
+ const tokens = new Set(Object.keys(this.consts.zoCore.vaults));
53
+ for (const key of Object.keys(this.consts.zoCore.symbols)) {
54
+ const [, token] = (0, utils_2.parseSymbolKey)(key);
55
+ tokens.add(token);
56
+ }
57
+ return [...tokens];
58
+ }
59
+ /** Pyth Pro oracle init for deposit / withdraw market valuation. */
60
+ async initValuationOracle(tx) {
61
+ const tokens = this.getValuationOracleTokens();
62
+ const pythProUpdateBytes = await this.fetchPythProUpdateBytesForTokens(tokens);
63
+ return this.initV3OracleForTokens(tokens, tx, pythProUpdateBytes);
64
+ }
65
+ async resolveSponsoredSui(tx, collateralToken, relayerFee, sponsoredTx, sender) {
66
+ if (!sponsoredTx) {
67
+ return undefined;
68
+ }
69
+ const additional = collateralToken === 'sui' ? relayerFee : 0n;
70
+ if (additional === 0n) {
71
+ return undefined;
72
+ }
73
+ return (0, coins_1.resolveSpendableSuiCoin)(tx, this.provider, this.requireSenderForSponsored(sender), additional);
74
+ }
20
75
  calcPositionReserveFeeAmount(_position) {
21
76
  throw new Error(`Method not implemented in ${this.constructor.name}.`);
22
77
  }
@@ -689,35 +744,10 @@ class USDZAPI extends abstract_1.BaseAPI {
689
744
  if (referralAddress && !(await this.dataAPI.hasReferral(sender || ''))) {
690
745
  tx = await this.addReferral(referralAddress, tx);
691
746
  }
692
- // Initialize oracle transaction
693
- const pythFeederKeys = Object.keys(this.consts.pythFeeder.feeder);
694
- // Handle sponsored transaction case
695
- if (sponsoredTx) {
696
- const oracle = await this.initOracleTxb(pythFeederKeys, tx, true, {
697
- sender: this.requireSenderForSponsored(sender),
698
- additionalSuiAmount: coin === 'sui' ? BigInt(amount) : 0n,
699
- });
700
- tx = oracle.tx;
701
- const depositObject = await this.resolveSplitCoinObject(tx, coin, BigInt(amount), coinObjects, { sponsoredTx: true, suiCoinObject: oracle.suiCoinObject, sender });
702
- const { vaultsValuation, symbolsValuation } = this.dataAPI.valuate(tx);
703
- tx.moveCall({
704
- target: `${this.consts.zoCore.upgradedPackage}::market::deposit`,
705
- typeArguments: [`${this.consts.zoCore.package}::usdz::USDZ`, this.consts.coins[coin].module],
706
- arguments: [
707
- tx.object(this.consts.zoCore.market),
708
- tx.object(this.consts.zoCore.rebaseFeeModel),
709
- depositObject,
710
- tx.pure.u64(minAmountOut),
711
- vaultsValuation,
712
- symbolsValuation,
713
- ],
714
- });
715
- return tx;
716
- }
717
- // Handle non-sponsored transaction case
718
- tx = (await this.initOracleTxb(pythFeederKeys, tx)).tx;
719
- const depositObject = await this.resolveSplitCoinObject(tx, coin, BigInt(amount), coinObjects, { sender });
720
- const { vaultsValuation, symbolsValuation } = this.dataAPI.valuate(tx);
747
+ const { tx: txWithOracle, oracle: oracleBundle } = await this.initValuationOracle(tx);
748
+ tx = txWithOracle;
749
+ const depositObject = await this.resolveSplitCoinObject(tx, coin, BigInt(amount), coinObjects, { sponsoredTx, sender });
750
+ const { vaultsValuation, symbolsValuation } = this.dataAPI.valuateV2(tx, oracleBundle);
721
751
  tx.moveCall({
722
752
  target: `${this.consts.zoCore.upgradedPackage}::market::deposit`,
723
753
  typeArguments: [
@@ -746,35 +776,10 @@ class USDZAPI extends abstract_1.BaseAPI {
746
776
  if (referralAddress && !(await this.dataAPI.hasReferral(sender || ''))) {
747
777
  tx = await this.addReferral(referralAddress, tx);
748
778
  }
749
- // Initialize oracle transaction
750
- const pythFeederKeys = Object.keys(this.consts.pythFeeder.feeder);
751
- // Handle sponsored transaction case
752
- if (sponsoredTx) {
753
- const oracle = await this.initOracleTxb(pythFeederKeys, tx, true, {
754
- sender: this.requireSenderForSponsored(sender),
755
- additionalSuiAmount: coin === 'sui' ? BigInt(amount) : 0n,
756
- });
757
- tx = oracle.tx;
758
- const depositObject = await this.resolveSplitCoinObject(tx, coin, BigInt(amount), coinObjects, { sponsoredTx: true, suiCoinObject: oracle.suiCoinObject, sender });
759
- const { vaultsValuation, symbolsValuation } = this.dataAPI.valuate(tx);
760
- const [mintedCoin] = tx.moveCall({
761
- target: `${this.consts.zoCore.upgradedPackage}::market::deposit_ptb`,
762
- typeArguments: [`${this.consts.zoCore.package}::usdz::USDZ`, this.consts.coins[coin].module],
763
- arguments: [
764
- tx.object(this.consts.zoCore.market),
765
- tx.object(this.consts.zoCore.rebaseFeeModel),
766
- depositObject,
767
- tx.pure.u64(minAmountOut),
768
- vaultsValuation,
769
- symbolsValuation,
770
- ],
771
- });
772
- return mintedCoin;
773
- }
774
- // Handle non-sponsored transaction case
775
- tx = (await this.initOracleTxb(pythFeederKeys, tx)).tx;
776
- const depositObject = await this.resolveSplitCoinObject(tx, coin, BigInt(amount), coinObjects, { sender });
777
- const { vaultsValuation, symbolsValuation } = this.dataAPI.valuate(tx);
779
+ const { tx: txWithOracle, oracle: oracleBundle } = await this.initValuationOracle(tx);
780
+ tx = txWithOracle;
781
+ const depositObject = await this.resolveSplitCoinObject(tx, coin, BigInt(amount), coinObjects, { sponsoredTx, sender });
782
+ const { vaultsValuation, symbolsValuation } = this.dataAPI.valuateV2(tx, oracleBundle);
778
783
  const [mintedCoin] = tx.moveCall({
779
784
  target: `${this.consts.zoCore.upgradedPackage}::market::deposit_ptb`,
780
785
  typeArguments: [
@@ -800,22 +805,10 @@ class USDZAPI extends abstract_1.BaseAPI {
800
805
  throw new Error(`${this.constructor.name}: lpCoinObjects or sender is required`);
801
806
  }
802
807
  let tx = new transactions_1.Transaction();
803
- // Initialize oracle transaction
804
- const pythFeederKeys = Object.keys(this.consts.pythFeeder.feeder);
805
- let suiCoinObject;
806
- if (sponsoredTx) {
807
- const oracle = await this.initOracleTxb(pythFeederKeys, tx, true, {
808
- sender: this.requireSenderForSponsored(sender),
809
- additionalSuiAmount: 0n,
810
- });
811
- tx = oracle.tx;
812
- suiCoinObject = oracle.suiCoinObject;
813
- }
814
- else {
815
- tx = (await this.initOracleTxb(pythFeederKeys, tx)).tx;
816
- }
817
- const withdrawObject = await this.resolveSplitCoinObject(tx, 'usdz', BigInt(amount), lpCoinObjects, { sponsoredTx, suiCoinObject, sender });
818
- const { vaultsValuation, symbolsValuation } = this.dataAPI.valuate(tx);
808
+ const { tx: txWithOracle, oracle: oracleBundle } = await this.initValuationOracle(tx);
809
+ tx = txWithOracle;
810
+ const withdrawObject = await this.resolveSplitCoinObject(tx, 'usdz', BigInt(amount), lpCoinObjects, { sponsoredTx, sender });
811
+ const { vaultsValuation, symbolsValuation } = this.dataAPI.valuateV2(tx, oracleBundle);
819
812
  tx.moveCall({
820
813
  target: `${this.consts.zoCore.upgradedPackage}::market::withdraw`,
821
814
  typeArguments: [
@@ -840,10 +833,9 @@ class USDZAPI extends abstract_1.BaseAPI {
840
833
  if (!tx) {
841
834
  tx = new transactions_1.Transaction();
842
835
  }
843
- // Initialize oracle transaction
844
- const pythFeederKeys = Object.keys(this.consts.pythFeeder.feeder);
845
- tx = (await this.initOracleTxb(pythFeederKeys, tx)).tx;
846
- const { vaultsValuation, symbolsValuation } = this.dataAPI.valuate(tx);
836
+ const { tx: txWithOracle, oracle: oracleBundle } = await this.initValuationOracle(tx);
837
+ tx = txWithOracle;
838
+ const { vaultsValuation, symbolsValuation } = this.dataAPI.valuateV2(tx, oracleBundle);
847
839
  tx.moveCall({
848
840
  target: `${this.consts.zoCore.upgradedPackage}::market::withdraw`,
849
841
  typeArguments: [
@@ -1782,6 +1774,362 @@ class USDZAPI extends abstract_1.BaseAPI {
1782
1774
  ],
1783
1775
  });
1784
1776
  }
1777
+ // --- Pyth Pro + Stork (v3) ---
1778
+ /**
1779
+ * Swaps tokens using swap_v3 (Pyth Pro + Stork). Transfers output to sender.
1780
+ */
1781
+ async swapV3(fromToken, toToken, fromAmount, fromCoinObjects, pythProUpdateBytes, minAmountOut, tx) {
1782
+ if (!tx) {
1783
+ tx = new transactions_1.Transaction();
1784
+ }
1785
+ const { tx: tx_, oracle } = await this.initV3OracleForTokens(Object.keys(this.consts.zoCore.vaults), tx, pythProUpdateBytes, true);
1786
+ const fromCoinObject = this.processCoins(tx_, fromToken, fromCoinObjects);
1787
+ const [fromDepositObject] = tx_.splitCoins(fromCoinObject, [tx_.pure.u64(fromAmount)]);
1788
+ const vaultsValuation = this.dataAPI.valuateVaultsV2(tx_, oracle);
1789
+ tx_.moveCall({
1790
+ target: `${this.consts.zoCore.upgradedPackage}::market::swap_v3`,
1791
+ typeArguments: [
1792
+ this.usdzLpType(),
1793
+ this.consts.coins[fromToken].module,
1794
+ this.consts.coins[toToken].module,
1795
+ ],
1796
+ arguments: [
1797
+ tx_.object(this.consts.zoCore.market),
1798
+ tx_.object(this.consts.zoCore.rebaseFeeModel),
1799
+ fromDepositObject,
1800
+ tx_.pure.u64(minAmountOut || 0),
1801
+ vaultsValuation,
1802
+ ...(0, oraclePro_1.oracleArgsWithClock)(oracle),
1803
+ ],
1804
+ });
1805
+ return tx_;
1806
+ }
1807
+ /**
1808
+ * Swaps tokens and returns the output coin (swap_v3_ptb).
1809
+ */
1810
+ async swapV3Ptb(fromToken, toToken, fromAmount, fromCoinObjects, pythProUpdateBytes, minAmountOut, tx) {
1811
+ if (!tx) {
1812
+ tx = new transactions_1.Transaction();
1813
+ }
1814
+ const { tx: tx_, oracle } = await this.initV3OracleForTokens(Object.keys(this.consts.zoCore.vaults), tx, pythProUpdateBytes, true);
1815
+ const fromCoinObject = this.processCoins(tx_, fromToken, fromCoinObjects);
1816
+ const [fromDepositObject] = tx_.splitCoins(fromCoinObject, [tx_.pure.u64(fromAmount)]);
1817
+ const vaultsValuation = this.dataAPI.valuateVaultsV2(tx_, oracle);
1818
+ const [outputCoin] = tx_.moveCall({
1819
+ target: `${this.consts.zoCore.upgradedPackage}::market::swap_v3_ptb`,
1820
+ typeArguments: [
1821
+ this.usdzLpType(),
1822
+ this.consts.coins[fromToken].module,
1823
+ this.consts.coins[toToken].module,
1824
+ ],
1825
+ arguments: [
1826
+ tx_.object(this.consts.zoCore.market),
1827
+ tx_.object(this.consts.zoCore.rebaseFeeModel),
1828
+ fromDepositObject,
1829
+ tx_.pure.u64(minAmountOut || 0),
1830
+ vaultsValuation,
1831
+ ...(0, oraclePro_1.oracleArgsWithClock)(oracle),
1832
+ ],
1833
+ });
1834
+ return outputCoin;
1835
+ }
1836
+ /**
1837
+ * Opens a position using open_position_v3 (Pyth Pro + Stork).
1838
+ */
1839
+ async openPositionV3(collateralToken, indexToken, size, collateralAmount, coinObjects, long, reserveAmount, indexPrice, collateralPrice, pythProUpdateBytes, isLimitOrder, isIocOrder, pricesSlippage = 0.003, collateralSlippage = 0.5, relayerFee = BigInt(0.5), referralAddress, sender, sponsoredTx) {
1840
+ let tx = new transactions_1.Transaction();
1841
+ if (referralAddress && !(await this.dataAPI.hasReferral(sender || ''))) {
1842
+ tx = await this.addReferral(referralAddress, tx);
1843
+ }
1844
+ const symbol = (0, utils_2.joinSymbol)(long ? 'long' : 'short', indexToken);
1845
+ const adjustPrice = this.processSlippage(indexPrice, long, isLimitOrder ? 0 : pricesSlippage);
1846
+ const adjustCollateralPrice = this.processSlippage(collateralPrice, false, collateralSlippage);
1847
+ const indexPriceThreshold = this.processPriceThreshold(indexPrice, pricesSlippage);
1848
+ let allowTrade = consts_1.ALLOW_TRADE_MUST_TRADE;
1849
+ if (isLimitOrder) {
1850
+ allowTrade = isIocOrder ? consts_1.ALLOW_TRADE_NO_TRADE : consts_1.ALLOW_TRADE_CAN_TRADE;
1851
+ }
1852
+ const { tx: tx_, oracle } = await this.initV3OracleForTokens([collateralToken, indexToken], tx, pythProUpdateBytes);
1853
+ tx = tx_;
1854
+ const suiCoinObject = await this.resolveSponsoredSui(tx, collateralToken, relayerFee, sponsoredTx, sender);
1855
+ const [depositObject, feeObject] = this.processCoinSplitting(tx, collateralToken, coinObjects, [tx.pure.u64(collateralAmount), tx.pure.u64(relayerFee)], sponsoredTx, suiCoinObject);
1856
+ tx.moveCall({
1857
+ target: `${this.consts.zoCore.upgradedPackage}::market::open_position_v3`,
1858
+ typeArguments: this.positionTypeArgs(collateralToken, indexToken, long),
1859
+ arguments: [
1860
+ tx.object(utils_1.SUI_CLOCK_OBJECT_ID),
1861
+ tx.object(this.consts.zoCore.market),
1862
+ tx.object(this.consts.zoCore.symbols[symbol].positionConfig),
1863
+ ...(0, oraclePro_1.oracleArgsStandard)(oracle),
1864
+ depositObject,
1865
+ feeObject,
1866
+ tx.pure.u8(allowTrade),
1867
+ tx.pure.u64(size),
1868
+ tx.pure.u64(reserveAmount),
1869
+ tx.pure.u256(adjustCollateralPrice),
1870
+ tx.pure.u256(adjustPrice),
1871
+ tx.pure.u256(indexPriceThreshold),
1872
+ ],
1873
+ });
1874
+ return tx;
1875
+ }
1876
+ /**
1877
+ * Opens a position with S Card using open_position_with_scard_v3.
1878
+ */
1879
+ async openPositionWithSCardV3(collateralToken, indexToken, size, collateralAmount, coinObjects, long, reserveAmount, indexPrice, collateralPrice, kioskClient, kioskCap, scard, pythProUpdateBytes, isLimitOrder, isIocOrder, pricesSlippage = 0.003, collateralSlippage = 0.5, relayerFee = BigInt(0.5), referralAddress, sender, sponsoredTx) {
1880
+ let tx = new transactions_1.Transaction();
1881
+ if (referralAddress && !(await this.dataAPI.hasReferral(sender || ''))) {
1882
+ tx = await this.addReferral(referralAddress, tx);
1883
+ }
1884
+ const symbol = (0, utils_2.joinSymbol)(long ? 'long' : 'short', indexToken);
1885
+ const adjustPrice = this.processSlippage(indexPrice, long, isLimitOrder ? 0 : pricesSlippage);
1886
+ const adjustCollateralPrice = this.processSlippage(collateralPrice, false, collateralSlippage);
1887
+ const indexPriceThreshold = this.processPriceThreshold(indexPrice, pricesSlippage);
1888
+ let allowTrade = consts_1.ALLOW_TRADE_MUST_TRADE;
1889
+ if (isLimitOrder) {
1890
+ allowTrade = isIocOrder ? consts_1.ALLOW_TRADE_NO_TRADE : consts_1.ALLOW_TRADE_CAN_TRADE;
1891
+ }
1892
+ const kioskTx = new kiosk_1.KioskTransaction({
1893
+ transaction: tx,
1894
+ kioskClient,
1895
+ cap: kioskCap,
1896
+ });
1897
+ const [sudoCard, promise] = kioskTx.borrow({
1898
+ itemType: `0xe7e651e4974fe367aa2837712d68081efb299c470242a15e2b9c26ea326159ec::card::SudoCard`,
1899
+ itemId: scard,
1900
+ });
1901
+ const { tx: tx_, oracle } = await this.initV3OracleForTokens([collateralToken, indexToken], tx, pythProUpdateBytes);
1902
+ tx = tx_;
1903
+ const suiCoinObject = await this.resolveSponsoredSui(tx, collateralToken, relayerFee, sponsoredTx, sender);
1904
+ const [depositObject, feeObject] = this.processCoinSplitting(tx, collateralToken, coinObjects, [tx.pure.u64(collateralAmount), tx.pure.u64(relayerFee)], sponsoredTx, suiCoinObject);
1905
+ tx.moveCall({
1906
+ target: `${this.consts.zoCore.upgradedPackage}::market::open_position_with_scard_v3`,
1907
+ typeArguments: this.positionTypeArgs(collateralToken, indexToken, long),
1908
+ arguments: [
1909
+ tx.object(utils_1.SUI_CLOCK_OBJECT_ID),
1910
+ tx.object(this.consts.zoCore.market),
1911
+ tx.object(this.consts.zoCore.symbols[symbol].positionConfig),
1912
+ ...(0, oraclePro_1.oracleArgsStandard)(oracle),
1913
+ depositObject,
1914
+ feeObject,
1915
+ tx.pure.u8(allowTrade),
1916
+ tx.pure.u64(size),
1917
+ tx.pure.u64(reserveAmount),
1918
+ tx.pure.u256(adjustCollateralPrice),
1919
+ tx.pure.u256(adjustPrice),
1920
+ tx.pure.u256(indexPriceThreshold),
1921
+ sudoCard,
1922
+ ],
1923
+ });
1924
+ kioskTx
1925
+ .return({
1926
+ itemType: `0xe7e651e4974fe367aa2837712d68081efb299c470242a15e2b9c26ea326159ec::card::SudoCard`,
1927
+ item: sudoCard,
1928
+ promise,
1929
+ })
1930
+ .finalize();
1931
+ return tx;
1932
+ }
1933
+ /**
1934
+ * Decreases a position using decrease_position_v3.
1935
+ */
1936
+ async decreasePositionV3(pcpId, collateralToken, indexToken, amount, long, indexPrice, collateralPrice, pythProUpdateBytes, isTriggerOrder = false, isTakeProfitOrder = true, isIocOrder = false, pricesSlippage = 0.003, collateralSlippage = 0.5, relayerFee = BigInt(0.5), coinObjects, sponsoredTx, sender) {
1937
+ if (!coinObjects?.length && !sender) {
1938
+ throw new Error(`${this.constructor.name}: coinObjects or sender is required`);
1939
+ }
1940
+ let tx = new transactions_1.Transaction();
1941
+ const adjustPrice = this.processSlippage(indexPrice, !long, isTriggerOrder ? 0 : pricesSlippage);
1942
+ const adjustCollateralPrice = this.processSlippage(collateralPrice, false, collateralSlippage);
1943
+ const indexPriceThreshold = this.processPriceThreshold(indexPrice, pricesSlippage);
1944
+ let allowTrade = consts_1.ALLOW_TRADE_MUST_TRADE;
1945
+ if (isTriggerOrder) {
1946
+ allowTrade = isIocOrder || !isTakeProfitOrder ? consts_1.ALLOW_TRADE_NO_TRADE : consts_1.ALLOW_TRADE_CAN_TRADE;
1947
+ }
1948
+ else {
1949
+ isTakeProfitOrder = true;
1950
+ }
1951
+ const { tx: tx_, oracle } = await this.initV3OracleForTokens([collateralToken, indexToken], tx, pythProUpdateBytes);
1952
+ tx = tx_;
1953
+ const suiCoinObject = await this.resolveSponsoredSui(tx, collateralToken, relayerFee, sponsoredTx, sender);
1954
+ const feeObject = await this.resolveRelayerFeeObject(tx, collateralToken, coinObjects ?? [], relayerFee, sponsoredTx, suiCoinObject, sender);
1955
+ tx.moveCall({
1956
+ target: `${this.consts.zoCore.upgradedPackage}::market::decrease_position_v3`,
1957
+ typeArguments: this.positionTypeArgs(collateralToken, indexToken, long),
1958
+ arguments: [
1959
+ tx.object(utils_1.SUI_CLOCK_OBJECT_ID),
1960
+ tx.object(this.consts.zoCore.market),
1961
+ tx.object(pcpId),
1962
+ ...(0, oraclePro_1.oracleArgsStandard)(oracle),
1963
+ feeObject,
1964
+ tx.pure.u8(allowTrade),
1965
+ tx.pure.bool(isTakeProfitOrder),
1966
+ tx.pure.u64(amount),
1967
+ tx.pure.u256(adjustCollateralPrice),
1968
+ tx.pure.u256(adjustPrice),
1969
+ tx.pure.u256(indexPriceThreshold),
1970
+ ],
1971
+ });
1972
+ return tx;
1973
+ }
1974
+ /**
1975
+ * Decreases a position with S Card using decrease_position_with_scard_v3.
1976
+ */
1977
+ async decreasePositionWithSCardV3(pcpId, collateralToken, indexToken, amount, long, indexPrice, collateralPrice, kioskClient, kioskCap, scard, pythProUpdateBytes, isTriggerOrder = false, isTakeProfitOrder = true, isIocOrder = false, pricesSlippage = 0.003, collateralSlippage = 0.5, relayerFee = BigInt(0.5), coinObjects, sponsoredTx, sender) {
1978
+ if (!coinObjects?.length && !sender) {
1979
+ throw new Error(`${this.constructor.name}: coinObjects or sender is required`);
1980
+ }
1981
+ let tx = new transactions_1.Transaction();
1982
+ const kioskTx = new kiosk_1.KioskTransaction({
1983
+ transaction: tx,
1984
+ kioskClient,
1985
+ cap: kioskCap,
1986
+ });
1987
+ const [sudoCard, promise] = kioskTx.borrow({
1988
+ itemType: `0xe7e651e4974fe367aa2837712d68081efb299c470242a15e2b9c26ea326159ec::card::SudoCard`,
1989
+ itemId: scard,
1990
+ });
1991
+ const adjustPrice = this.processSlippage(indexPrice, !long, isTriggerOrder ? 0 : pricesSlippage);
1992
+ const adjustCollateralPrice = this.processSlippage(collateralPrice, false, collateralSlippage);
1993
+ const indexPriceThreshold = this.processPriceThreshold(indexPrice, pricesSlippage);
1994
+ let allowTrade = consts_1.ALLOW_TRADE_MUST_TRADE;
1995
+ if (isTriggerOrder) {
1996
+ allowTrade = isIocOrder || !isTakeProfitOrder ? consts_1.ALLOW_TRADE_NO_TRADE : consts_1.ALLOW_TRADE_CAN_TRADE;
1997
+ }
1998
+ else {
1999
+ isTakeProfitOrder = true;
2000
+ }
2001
+ const { tx: tx_, oracle } = await this.initV3OracleForTokens([collateralToken, indexToken], tx, pythProUpdateBytes);
2002
+ tx = tx_;
2003
+ const suiCoinObject = await this.resolveSponsoredSui(tx, collateralToken, relayerFee, sponsoredTx, sender);
2004
+ const feeObject = await this.resolveRelayerFeeObject(tx, collateralToken, coinObjects ?? [], relayerFee, sponsoredTx, suiCoinObject, sender);
2005
+ tx.moveCall({
2006
+ target: `${this.consts.zoCore.upgradedPackage}::market::decrease_position_with_scard_v3`,
2007
+ typeArguments: this.positionTypeArgs(collateralToken, indexToken, long),
2008
+ arguments: [
2009
+ tx.object(utils_1.SUI_CLOCK_OBJECT_ID),
2010
+ tx.object(this.consts.zoCore.market),
2011
+ tx.object(pcpId),
2012
+ ...(0, oraclePro_1.oracleArgsStandard)(oracle),
2013
+ feeObject,
2014
+ tx.pure.u8(allowTrade),
2015
+ tx.pure.bool(isTakeProfitOrder),
2016
+ tx.pure.u64(amount),
2017
+ tx.pure.u256(adjustCollateralPrice),
2018
+ tx.pure.u256(adjustPrice),
2019
+ tx.pure.u256(indexPriceThreshold),
2020
+ sudoCard,
2021
+ ],
2022
+ });
2023
+ kioskTx
2024
+ .return({
2025
+ itemType: `0xe7e651e4974fe367aa2837712d68081efb299c470242a15e2b9c26ea326159ec::card::SudoCard`,
2026
+ item: sudoCard,
2027
+ promise,
2028
+ })
2029
+ .finalize();
2030
+ return tx;
2031
+ }
2032
+ /**
2033
+ * Redeems collateral from a position via redeem_from_position_v2 (Pyth Pro path).
2034
+ */
2035
+ async redeemFromPositionV2(pcpId, collateralToken, indexToken, amount, long, pythProUpdateBytes, tx) {
2036
+ if (!tx) {
2037
+ tx = new transactions_1.Transaction();
2038
+ }
2039
+ const { tx: tx_, oracle } = await this.initV3OracleForTokens([collateralToken, indexToken], tx, pythProUpdateBytes);
2040
+ tx_.moveCall({
2041
+ target: `${this.consts.zoCore.upgradedPackage}::market::redeem_from_position_v2`,
2042
+ typeArguments: this.redeemTypeArgs(collateralToken, indexToken, long),
2043
+ arguments: [
2044
+ tx_.object(utils_1.SUI_CLOCK_OBJECT_ID),
2045
+ tx_.object(this.consts.zoCore.market),
2046
+ tx_.object(pcpId),
2047
+ ...(0, oraclePro_1.oracleArgsStandard)(oracle),
2048
+ tx_.pure.u64(amount),
2049
+ ],
2050
+ });
2051
+ return tx_;
2052
+ }
2053
+ /**
2054
+ * Liquidates a position (PTB-only public fun). Use liquidate_position_v3_1, not v3.
2055
+ */
2056
+ liquidatePositionV3_1(tx, owner, positionId, collateralToken, indexToken, long, oracle) {
2057
+ tx.moveCall({
2058
+ target: `${this.consts.zoCore.upgradedPackage}::market::liquidate_position_v3_1`,
2059
+ typeArguments: this.redeemTypeArgs(collateralToken, indexToken, long),
2060
+ arguments: [
2061
+ tx.object(this.consts.zoCore.market),
2062
+ ...(0, oraclePro_1.oracleArgsAlt)(oracle),
2063
+ tx.object(owner),
2064
+ tx.object(positionId),
2065
+ ],
2066
+ });
2067
+ }
2068
+ /**
2069
+ * Builds a full liquidate PTB including Pyth Pro verification.
2070
+ */
2071
+ async liquidatePositionV3_1Tx(owner, positionId, collateralToken, indexToken, long, pythProUpdateBytes, tx) {
2072
+ if (!tx) {
2073
+ tx = new transactions_1.Transaction();
2074
+ }
2075
+ const { tx: tx_, oracle } = await this.initV3OracleForTokens([collateralToken, indexToken], tx, pythProUpdateBytes);
2076
+ this.liquidatePositionV3_1(tx_, owner, positionId, collateralToken, indexToken, long, (0, oraclePro_1.buildOracleInputsAlt)(oracle));
2077
+ return tx_;
2078
+ }
2079
+ /** Keeper/bot: execute_open_position_order_v3_1 (compose in PTB). */
2080
+ executeOpenPositionOrderV3_1(tx, owner, orderId, collateralToken, indexToken, long, oracle) {
2081
+ tx.moveCall({
2082
+ target: `${this.consts.zoCore.upgradedPackage}::market::execute_open_position_order_v3_1`,
2083
+ typeArguments: this.positionTypeArgs(collateralToken, indexToken, long),
2084
+ arguments: [
2085
+ tx.object(this.consts.zoCore.market),
2086
+ ...(0, oraclePro_1.oracleArgsAlt)(oracle),
2087
+ tx.object(owner),
2088
+ tx.object(orderId),
2089
+ ],
2090
+ });
2091
+ }
2092
+ /** Keeper/bot: execute_open_market_order_v3_1. */
2093
+ executeOpenMarketOrderV3_1(tx, owner, orderId, collateralToken, indexToken, long, oracle) {
2094
+ tx.moveCall({
2095
+ target: `${this.consts.zoCore.upgradedPackage}::market::execute_open_market_order_v3_1`,
2096
+ typeArguments: this.positionTypeArgs(collateralToken, indexToken, long),
2097
+ arguments: [
2098
+ tx.object(this.consts.zoCore.market),
2099
+ ...(0, oraclePro_1.oracleArgsAlt)(oracle),
2100
+ tx.object(owner),
2101
+ tx.object(orderId),
2102
+ ],
2103
+ });
2104
+ }
2105
+ /** Keeper/bot: execute_decrease_market_order_v3_1. */
2106
+ executeDecreaseMarketOrderV3_1(tx, owner, orderId, positionId, collateralToken, indexToken, long, oracle) {
2107
+ tx.moveCall({
2108
+ target: `${this.consts.zoCore.upgradedPackage}::market::execute_decrease_market_order_v3_1`,
2109
+ typeArguments: this.positionTypeArgs(collateralToken, indexToken, long),
2110
+ arguments: [
2111
+ tx.object(this.consts.zoCore.market),
2112
+ ...(0, oraclePro_1.oracleArgsAlt)(oracle),
2113
+ tx.object(owner),
2114
+ tx.object(orderId),
2115
+ tx.object(positionId),
2116
+ ],
2117
+ });
2118
+ }
2119
+ /** Keeper/bot: execute_decrease_position_order_v3_1. */
2120
+ executeDecreasePositionOrderV3_1(tx, owner, orderId, positionId, collateralToken, indexToken, long, oracle) {
2121
+ tx.moveCall({
2122
+ target: `${this.consts.zoCore.upgradedPackage}::market::execute_decrease_position_order_v3_1`,
2123
+ typeArguments: this.positionTypeArgs(collateralToken, indexToken, long),
2124
+ arguments: [
2125
+ tx.object(this.consts.zoCore.market),
2126
+ ...(0, oraclePro_1.oracleArgsAlt)(oracle),
2127
+ tx.object(owner),
2128
+ tx.object(orderId),
2129
+ tx.object(positionId),
2130
+ ],
2131
+ });
2132
+ }
1785
2133
  }
1786
2134
  exports.USDZAPI = USDZAPI;
1787
2135
  //# sourceMappingURL=USDZAPI.cjs.map