@zofai/zo-sdk 0.1.92

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 (275) hide show
  1. package/.claude/settings.local.json +9 -0
  2. package/.gitattributes +4 -0
  3. package/.prettierrc.js +9 -0
  4. package/README.md +28 -0
  5. package/dist/abstract/BaseAPI.cjs +206 -0
  6. package/dist/abstract/BaseAPI.cjs.map +1 -0
  7. package/dist/abstract/BaseAPI.d.cts +172 -0
  8. package/dist/abstract/BaseAPI.d.cts.map +1 -0
  9. package/dist/abstract/BaseAPI.d.mts +172 -0
  10. package/dist/abstract/BaseAPI.d.mts.map +1 -0
  11. package/dist/abstract/BaseAPI.mjs +202 -0
  12. package/dist/abstract/BaseAPI.mjs.map +1 -0
  13. package/dist/abstract/BaseDataAPI.cjs +140 -0
  14. package/dist/abstract/BaseDataAPI.cjs.map +1 -0
  15. package/dist/abstract/BaseDataAPI.d.cts +89 -0
  16. package/dist/abstract/BaseDataAPI.d.cts.map +1 -0
  17. package/dist/abstract/BaseDataAPI.d.mts +89 -0
  18. package/dist/abstract/BaseDataAPI.d.mts.map +1 -0
  19. package/dist/abstract/BaseDataAPI.mjs +136 -0
  20. package/dist/abstract/BaseDataAPI.mjs.map +1 -0
  21. package/dist/abstract/index.cjs +12 -0
  22. package/dist/abstract/index.cjs.map +1 -0
  23. package/dist/abstract/index.d.cts +7 -0
  24. package/dist/abstract/index.d.cts.map +1 -0
  25. package/dist/abstract/index.d.mts +7 -0
  26. package/dist/abstract/index.d.mts.map +1 -0
  27. package/dist/abstract/index.mjs +7 -0
  28. package/dist/abstract/index.mjs.map +1 -0
  29. package/dist/api.cjs +779 -0
  30. package/dist/api.cjs.map +1 -0
  31. package/dist/api.d.cts +75 -0
  32. package/dist/api.d.cts.map +1 -0
  33. package/dist/api.d.mts +75 -0
  34. package/dist/api.d.mts.map +1 -0
  35. package/dist/api.mjs +775 -0
  36. package/dist/api.mjs.map +1 -0
  37. package/dist/bcs.cjs +42 -0
  38. package/dist/bcs.cjs.map +1 -0
  39. package/dist/bcs.d.cts +91 -0
  40. package/dist/bcs.d.cts.map +1 -0
  41. package/dist/bcs.d.mts +91 -0
  42. package/dist/bcs.d.mts.map +1 -0
  43. package/dist/bcs.mjs +39 -0
  44. package/dist/bcs.mjs.map +1 -0
  45. package/dist/consts/deployments-shared-mainnet.json +50 -0
  46. package/dist/consts/deployments-shared-testnet.json +45 -0
  47. package/dist/consts/deployments-slp-mainnet.json +600 -0
  48. package/dist/consts/deployments-slp-testnet.json +87 -0
  49. package/dist/consts/deployments-usdz-mainnet.json +494 -0
  50. package/dist/consts/deployments-usdz-testnet.json +98 -0
  51. package/dist/consts/deployments-zbtcvc-mainnet.json +180 -0
  52. package/dist/consts/deployments-zlp-mainnet.json +791 -0
  53. package/dist/consts/deployments-zlp-testnet.json +76 -0
  54. package/dist/consts/index.cjs +200 -0
  55. package/dist/consts/index.cjs.map +1 -0
  56. package/dist/consts/index.d.cts +157 -0
  57. package/dist/consts/index.d.cts.map +1 -0
  58. package/dist/consts/index.d.mts +157 -0
  59. package/dist/consts/index.d.mts.map +1 -0
  60. package/dist/consts/index.mjs +189 -0
  61. package/dist/consts/index.mjs.map +1 -0
  62. package/dist/consts/price_id_to_object_id.mainnet.json +56 -0
  63. package/dist/consts/price_id_to_object_id.testnet.json +17 -0
  64. package/dist/data.cjs +919 -0
  65. package/dist/data.cjs.map +1 -0
  66. package/dist/data.d.cts +235 -0
  67. package/dist/data.d.cts.map +1 -0
  68. package/dist/data.d.mts +235 -0
  69. package/dist/data.d.mts.map +1 -0
  70. package/dist/data.mjs +915 -0
  71. package/dist/data.mjs.map +1 -0
  72. package/dist/factory/SDKFactory.cjs +228 -0
  73. package/dist/factory/SDKFactory.cjs.map +1 -0
  74. package/dist/factory/SDKFactory.d.cts +84 -0
  75. package/dist/factory/SDKFactory.d.cts.map +1 -0
  76. package/dist/factory/SDKFactory.d.mts +84 -0
  77. package/dist/factory/SDKFactory.d.mts.map +1 -0
  78. package/dist/factory/SDKFactory.mjs +222 -0
  79. package/dist/factory/SDKFactory.mjs.map +1 -0
  80. package/dist/implementations/SLPAPI.cjs +1794 -0
  81. package/dist/implementations/SLPAPI.cjs.map +1 -0
  82. package/dist/implementations/SLPAPI.d.cts +183 -0
  83. package/dist/implementations/SLPAPI.d.cts.map +1 -0
  84. package/dist/implementations/SLPAPI.d.mts +183 -0
  85. package/dist/implementations/SLPAPI.d.mts.map +1 -0
  86. package/dist/implementations/SLPAPI.mjs +1790 -0
  87. package/dist/implementations/SLPAPI.mjs.map +1 -0
  88. package/dist/implementations/SLPDataAPI.cjs +1384 -0
  89. package/dist/implementations/SLPDataAPI.cjs.map +1 -0
  90. package/dist/implementations/SLPDataAPI.d.cts +158 -0
  91. package/dist/implementations/SLPDataAPI.d.cts.map +1 -0
  92. package/dist/implementations/SLPDataAPI.d.mts +158 -0
  93. package/dist/implementations/SLPDataAPI.d.mts.map +1 -0
  94. package/dist/implementations/SLPDataAPI.mjs +1380 -0
  95. package/dist/implementations/SLPDataAPI.mjs.map +1 -0
  96. package/dist/implementations/USDZAPI.cjs +1676 -0
  97. package/dist/implementations/USDZAPI.cjs.map +1 -0
  98. package/dist/implementations/USDZAPI.d.cts +180 -0
  99. package/dist/implementations/USDZAPI.d.cts.map +1 -0
  100. package/dist/implementations/USDZAPI.d.mts +180 -0
  101. package/dist/implementations/USDZAPI.d.mts.map +1 -0
  102. package/dist/implementations/USDZAPI.mjs +1672 -0
  103. package/dist/implementations/USDZAPI.mjs.map +1 -0
  104. package/dist/implementations/USDZDataAPI.cjs +1209 -0
  105. package/dist/implementations/USDZDataAPI.cjs.map +1 -0
  106. package/dist/implementations/USDZDataAPI.d.cts +191 -0
  107. package/dist/implementations/USDZDataAPI.d.cts.map +1 -0
  108. package/dist/implementations/USDZDataAPI.d.mts +191 -0
  109. package/dist/implementations/USDZDataAPI.d.mts.map +1 -0
  110. package/dist/implementations/USDZDataAPI.mjs +1205 -0
  111. package/dist/implementations/USDZDataAPI.mjs.map +1 -0
  112. package/dist/implementations/ZBTCVCAPI.cjs +906 -0
  113. package/dist/implementations/ZBTCVCAPI.cjs.map +1 -0
  114. package/dist/implementations/ZBTCVCAPI.d.cts +107 -0
  115. package/dist/implementations/ZBTCVCAPI.d.cts.map +1 -0
  116. package/dist/implementations/ZBTCVCAPI.d.mts +107 -0
  117. package/dist/implementations/ZBTCVCAPI.d.mts.map +1 -0
  118. package/dist/implementations/ZBTCVCAPI.mjs +902 -0
  119. package/dist/implementations/ZBTCVCAPI.mjs.map +1 -0
  120. package/dist/implementations/ZBTCVCDataAPI.cjs +829 -0
  121. package/dist/implementations/ZBTCVCDataAPI.cjs.map +1 -0
  122. package/dist/implementations/ZBTCVCDataAPI.d.cts +94 -0
  123. package/dist/implementations/ZBTCVCDataAPI.d.cts.map +1 -0
  124. package/dist/implementations/ZBTCVCDataAPI.d.mts +94 -0
  125. package/dist/implementations/ZBTCVCDataAPI.d.mts.map +1 -0
  126. package/dist/implementations/ZBTCVCDataAPI.mjs +825 -0
  127. package/dist/implementations/ZBTCVCDataAPI.mjs.map +1 -0
  128. package/dist/implementations/ZLPAPI.cjs +1948 -0
  129. package/dist/implementations/ZLPAPI.cjs.map +1 -0
  130. package/dist/implementations/ZLPAPI.d.cts +192 -0
  131. package/dist/implementations/ZLPAPI.d.cts.map +1 -0
  132. package/dist/implementations/ZLPAPI.d.mts +192 -0
  133. package/dist/implementations/ZLPAPI.d.mts.map +1 -0
  134. package/dist/implementations/ZLPAPI.mjs +1944 -0
  135. package/dist/implementations/ZLPAPI.mjs.map +1 -0
  136. package/dist/implementations/ZLPDataAPI.cjs +1267 -0
  137. package/dist/implementations/ZLPDataAPI.cjs.map +1 -0
  138. package/dist/implementations/ZLPDataAPI.d.cts +193 -0
  139. package/dist/implementations/ZLPDataAPI.d.cts.map +1 -0
  140. package/dist/implementations/ZLPDataAPI.d.mts +193 -0
  141. package/dist/implementations/ZLPDataAPI.d.mts.map +1 -0
  142. package/dist/implementations/ZLPDataAPI.mjs +1263 -0
  143. package/dist/implementations/ZLPDataAPI.mjs.map +1 -0
  144. package/dist/implementations/index.cjs +26 -0
  145. package/dist/implementations/index.cjs.map +1 -0
  146. package/dist/implementations/index.d.cts +13 -0
  147. package/dist/implementations/index.d.cts.map +1 -0
  148. package/dist/implementations/index.d.mts +13 -0
  149. package/dist/implementations/index.d.mts.map +1 -0
  150. package/dist/implementations/index.mjs +15 -0
  151. package/dist/implementations/index.mjs.map +1 -0
  152. package/dist/index.cjs +69 -0
  153. package/dist/index.cjs.map +1 -0
  154. package/dist/index.d.cts +51 -0
  155. package/dist/index.d.cts.map +1 -0
  156. package/dist/index.d.mts +51 -0
  157. package/dist/index.d.mts.map +1 -0
  158. package/dist/index.mjs +51 -0
  159. package/dist/index.mjs.map +1 -0
  160. package/dist/interfaces/base.cjs +7 -0
  161. package/dist/interfaces/base.cjs.map +1 -0
  162. package/dist/interfaces/base.d.cts +346 -0
  163. package/dist/interfaces/base.d.cts.map +1 -0
  164. package/dist/interfaces/base.d.mts +346 -0
  165. package/dist/interfaces/base.d.mts.map +1 -0
  166. package/dist/interfaces/base.mjs +6 -0
  167. package/dist/interfaces/base.mjs.map +1 -0
  168. package/dist/interfaces/index.cjs +31 -0
  169. package/dist/interfaces/index.cjs.map +1 -0
  170. package/dist/interfaces/index.d.cts +15 -0
  171. package/dist/interfaces/index.d.cts.map +1 -0
  172. package/dist/interfaces/index.d.mts +15 -0
  173. package/dist/interfaces/index.d.mts.map +1 -0
  174. package/dist/interfaces/index.mjs +15 -0
  175. package/dist/interfaces/index.mjs.map +1 -0
  176. package/dist/interfaces/slp.cjs +7 -0
  177. package/dist/interfaces/slp.cjs.map +1 -0
  178. package/dist/interfaces/slp.d.cts +179 -0
  179. package/dist/interfaces/slp.d.cts.map +1 -0
  180. package/dist/interfaces/slp.d.mts +179 -0
  181. package/dist/interfaces/slp.d.mts.map +1 -0
  182. package/dist/interfaces/slp.mjs +6 -0
  183. package/dist/interfaces/slp.mjs.map +1 -0
  184. package/dist/interfaces/usdz.cjs +7 -0
  185. package/dist/interfaces/usdz.cjs.map +1 -0
  186. package/dist/interfaces/usdz.d.cts +104 -0
  187. package/dist/interfaces/usdz.d.cts.map +1 -0
  188. package/dist/interfaces/usdz.d.mts +104 -0
  189. package/dist/interfaces/usdz.d.mts.map +1 -0
  190. package/dist/interfaces/usdz.mjs +6 -0
  191. package/dist/interfaces/usdz.mjs.map +1 -0
  192. package/dist/interfaces/zbtcvc.cjs +7 -0
  193. package/dist/interfaces/zbtcvc.cjs.map +1 -0
  194. package/dist/interfaces/zbtcvc.d.cts +64 -0
  195. package/dist/interfaces/zbtcvc.d.cts.map +1 -0
  196. package/dist/interfaces/zbtcvc.d.mts +64 -0
  197. package/dist/interfaces/zbtcvc.d.mts.map +1 -0
  198. package/dist/interfaces/zbtcvc.mjs +6 -0
  199. package/dist/interfaces/zbtcvc.mjs.map +1 -0
  200. package/dist/interfaces/zlp.cjs +7 -0
  201. package/dist/interfaces/zlp.cjs.map +1 -0
  202. package/dist/interfaces/zlp.d.cts +114 -0
  203. package/dist/interfaces/zlp.d.cts.map +1 -0
  204. package/dist/interfaces/zlp.d.mts +114 -0
  205. package/dist/interfaces/zlp.d.mts.map +1 -0
  206. package/dist/interfaces/zlp.mjs +6 -0
  207. package/dist/interfaces/zlp.mjs.map +1 -0
  208. package/dist/oracle.cjs +118 -0
  209. package/dist/oracle.cjs.map +1 -0
  210. package/dist/oracle.d.cts +25 -0
  211. package/dist/oracle.d.cts.map +1 -0
  212. package/dist/oracle.d.mts +25 -0
  213. package/dist/oracle.d.mts.map +1 -0
  214. package/dist/oracle.mjs +114 -0
  215. package/dist/oracle.mjs.map +1 -0
  216. package/dist/utils.cjs +129 -0
  217. package/dist/utils.cjs.map +1 -0
  218. package/dist/utils.d.cts +44 -0
  219. package/dist/utils.d.cts.map +1 -0
  220. package/dist/utils.d.mts +44 -0
  221. package/dist/utils.d.mts.map +1 -0
  222. package/dist/utils.mjs +115 -0
  223. package/dist/utils.mjs.map +1 -0
  224. package/docs/SUMMARY.md +10 -0
  225. package/docs/api-reference.md +32 -0
  226. package/docs/architecture.md +14 -0
  227. package/docs/common-operations.md +52 -0
  228. package/docs/error-handling.md +17 -0
  229. package/docs/getting-started.md +60 -0
  230. package/docs/introduction.md +15 -0
  231. package/docs/lp-specific-features.md +96 -0
  232. package/docs/type-safety.md +29 -0
  233. package/eslint.config.mjs +18 -0
  234. package/package.json +42 -0
  235. package/src/abstract/BaseAPI.ts +575 -0
  236. package/src/abstract/BaseDataAPI.ts +207 -0
  237. package/src/abstract/index.ts +7 -0
  238. package/src/api.ts +1100 -0
  239. package/src/bcs.ts +45 -0
  240. package/src/consts/deployments-shared-mainnet.json +50 -0
  241. package/src/consts/deployments-shared-testnet.json +45 -0
  242. package/src/consts/deployments-slp-mainnet.json +600 -0
  243. package/src/consts/deployments-slp-testnet.json +87 -0
  244. package/src/consts/deployments-usdz-mainnet.json +494 -0
  245. package/src/consts/deployments-usdz-testnet.json +98 -0
  246. package/src/consts/deployments-zbtcvc-mainnet.json +180 -0
  247. package/src/consts/deployments-zlp-mainnet.json +791 -0
  248. package/src/consts/deployments-zlp-testnet.json +76 -0
  249. package/src/consts/index.ts +345 -0
  250. package/src/consts/price_id_to_object_id.mainnet.json +56 -0
  251. package/src/consts/price_id_to_object_id.testnet.json +17 -0
  252. package/src/data.ts +1279 -0
  253. package/src/factory/SDKFactory.ts +340 -0
  254. package/src/implementations/SLPAPI.ts +2722 -0
  255. package/src/implementations/SLPDataAPI.ts +1839 -0
  256. package/src/implementations/USDZAPI.ts +2488 -0
  257. package/src/implementations/USDZDataAPI.ts +1548 -0
  258. package/src/implementations/ZBTCVCAPI.ts +1337 -0
  259. package/src/implementations/ZBTCVCDataAPI.ts +993 -0
  260. package/src/implementations/ZLPAPI.ts +2888 -0
  261. package/src/implementations/ZLPDataAPI.ts +1603 -0
  262. package/src/implementations/index.ts +16 -0
  263. package/src/index.ts +58 -0
  264. package/src/interfaces/base.ts +838 -0
  265. package/src/interfaces/index.ts +50 -0
  266. package/src/interfaces/slp.ts +268 -0
  267. package/src/interfaces/usdz.ts +181 -0
  268. package/src/interfaces/zbtcvc.ts +116 -0
  269. package/src/interfaces/zlp.ts +244 -0
  270. package/src/oracle.ts +153 -0
  271. package/src/utils.ts +168 -0
  272. package/tests/api.test.ts +219 -0
  273. package/tests/data.test.ts +156 -0
  274. package/tests/oracle.test.ts +33 -0
  275. package/tsconfig.json +22 -0
@@ -0,0 +1,1672 @@
1
+ /**
2
+ * USDZ API implementation
3
+ * Implements USDZ-specific trading and transaction methods
4
+ */
5
+ import { KioskTransaction } from "@mysten/kiosk";
6
+ import { Transaction } from "@mysten/sui/transactions";
7
+ import { SUI_CLOCK_OBJECT_ID } from "@mysten/sui/utils";
8
+ import { BaseAPI } from "../abstract/index.mjs";
9
+ import { ALLOW_TRADE_CAN_TRADE, ALLOW_TRADE_MUST_TRADE, ALLOW_TRADE_NO_TRADE, LPToken } from "../consts/index.mjs";
10
+ import { joinSymbol } from "../utils.mjs";
11
+ import { USDZDataAPI } from "./USDZDataAPI.mjs";
12
+ export class USDZAPI extends BaseAPI {
13
+ constructor(network, provider, apiEndpoint, connectionURL) {
14
+ super(network, provider, apiEndpoint, connectionURL, LPToken.USDZ);
15
+ this.dataAPI = new USDZDataAPI(network, provider, apiEndpoint, connectionURL);
16
+ }
17
+ calcPositionReserveFeeAmount(_position) {
18
+ throw new Error(`Method not implemented in ${this.constructor.name}.`);
19
+ }
20
+ calcPositionFundingFeeValue(_position) {
21
+ throw new Error(`Method not implemented in ${this.constructor.name}.`);
22
+ }
23
+ clearClosedPosition(pcpId, collateralToken, indexToken, long, tx) {
24
+ tx.moveCall({
25
+ target: `${this.consts.zoCore.upgradedPackage}::market::clear_closed_position`,
26
+ typeArguments: [
27
+ `${this.consts.zoCore.package}::usdz::USDZ`,
28
+ this.consts.coins[collateralToken].module,
29
+ this.consts.coins[indexToken].module,
30
+ `${this.consts.zoCore.package}::market::${long ? 'LONG' : 'SHORT'}`,
31
+ ],
32
+ arguments: [tx.object(this.consts.zoCore.market), tx.object(pcpId)],
33
+ });
34
+ }
35
+ clearOpenPositionOrder(orderCapId, collateralToken, indexToken, long, tx, isV11Order) {
36
+ const funcName = isV11Order ? 'clear_open_position_order' : 'clear_open_position_order';
37
+ tx.moveCall({
38
+ target: `${this.consts.zoCore.upgradedPackage}::market::${funcName}`,
39
+ typeArguments: [
40
+ `${this.consts.zoCore.package}::usdz::USDZ`,
41
+ this.consts.coins[collateralToken].module,
42
+ this.consts.coins[indexToken].module,
43
+ `${this.consts.zoCore.package}::market::${long ? 'LONG' : 'SHORT'}`,
44
+ this.consts.coins[collateralToken].module,
45
+ ],
46
+ arguments: [tx.object(this.consts.zoCore.market), tx.object(orderCapId)],
47
+ });
48
+ }
49
+ clearDecreasePositionOrder(orderCapId, collateralToken, indexToken, long, tx, isV11Order) {
50
+ const funcName = isV11Order ? 'clear_decrease_position_order' : 'clear_decrease_position_order';
51
+ tx.moveCall({
52
+ target: `${this.consts.zoCore.upgradedPackage}::market::${funcName}`,
53
+ typeArguments: [
54
+ `${this.consts.zoCore.package}::usdz::USDZ`,
55
+ this.consts.coins[collateralToken].module,
56
+ this.consts.coins[indexToken].module,
57
+ `${this.consts.zoCore.package}::market::${long ? 'LONG' : 'SHORT'}`,
58
+ this.consts.coins[collateralToken].module,
59
+ ],
60
+ arguments: [tx.object(this.consts.zoCore.market), tx.object(orderCapId)],
61
+ });
62
+ }
63
+ clearOpenMarketOrder(orderCapId, collateralToken, indexToken, long, tx, _isV11Order) {
64
+ const funcName = 'clear_open_market_order';
65
+ tx.moveCall({
66
+ target: `${this.consts.zoCore.upgradedPackage}::market::${funcName}`,
67
+ typeArguments: [
68
+ `${this.consts.zoCore.package}::usdz::USDZ`,
69
+ this.consts.coins[collateralToken].module,
70
+ this.consts.coins[indexToken].module,
71
+ `${this.consts.zoCore.package}::market::${long ? 'LONG' : 'SHORT'}`,
72
+ this.consts.coins[collateralToken].module,
73
+ ],
74
+ arguments: [tx.object(this.consts.zoCore.market), tx.object(orderCapId)],
75
+ });
76
+ }
77
+ clearDecreaseMarketOrder(orderCapId, collateralToken, indexToken, long, tx, _isV11Order) {
78
+ const funcName = 'clear_decrease_market_order';
79
+ tx.moveCall({
80
+ target: `${this.consts.zoCore.upgradedPackage}::market::${funcName}`,
81
+ typeArguments: [
82
+ `${this.consts.zoCore.package}::usdz::USDZ`,
83
+ this.consts.coins[collateralToken].module,
84
+ this.consts.coins[indexToken].module,
85
+ `${this.consts.zoCore.package}::market::${long ? 'LONG' : 'SHORT'}`,
86
+ this.consts.coins[collateralToken].module,
87
+ ],
88
+ arguments: [tx.object(this.consts.zoCore.market), tx.object(orderCapId)],
89
+ });
90
+ }
91
+ async openPositionWithSCard(collateralToken, indexToken, size, collateralAmount, coinObjects, long, reserveAmount, indexPrice, collateralPrice, kioskClient, kioskCap, scard, isLimitOrder, isIocOrder, pricesSlippage = 0.003, collateralSlippage = 0.5, relayerFee = BigInt(0.5), referralAddress, sender, sponsoredTx, suiCoinObjectsForPythUpdate) {
92
+ let tx = new Transaction();
93
+ if (referralAddress && !(await this.dataAPI.hasReferral(sender || ''))) {
94
+ tx = await this.addReferral(referralAddress, tx);
95
+ }
96
+ const symbol = joinSymbol(long ? 'long' : 'short', indexToken);
97
+ const adjustPrice = this.processSlippage(indexPrice, long, isLimitOrder ? 0 : pricesSlippage);
98
+ const adjustCollateralPrice = this.processSlippage(collateralPrice, false, collateralSlippage);
99
+ let allowTrade = ALLOW_TRADE_MUST_TRADE;
100
+ if (isLimitOrder) {
101
+ allowTrade = isIocOrder ? ALLOW_TRADE_NO_TRADE : ALLOW_TRADE_CAN_TRADE;
102
+ }
103
+ const kioskTx = new KioskTransaction({
104
+ transaction: tx,
105
+ kioskClient,
106
+ cap: kioskCap,
107
+ });
108
+ const [sudoCard, promise] = kioskTx.borrow({
109
+ itemType: `0xe7e651e4974fe367aa2837712d68081efb299c470242a15e2b9c26ea326159ec::card::SudoCard`,
110
+ itemId: scard,
111
+ });
112
+ // Handle oracle initialization and coin processing
113
+ let suiCoinObject;
114
+ if (sponsoredTx) {
115
+ suiCoinObject = this.processCoins(tx, 'sui', suiCoinObjectsForPythUpdate || [], true);
116
+ tx = await this.initOracleTxb([collateralToken, indexToken], tx, true, suiCoinObject);
117
+ }
118
+ else {
119
+ tx = await this.initOracleTxb([collateralToken, indexToken], tx);
120
+ }
121
+ // Process coin splitting
122
+ const [depositObject, feeObject] = this.processCoinSplitting(tx, collateralToken, coinObjects, [tx.pure.u64(collateralAmount), tx.pure.u64(relayerFee)], sponsoredTx, suiCoinObject);
123
+ tx.moveCall({
124
+ target: `${this.consts.zoCore.upgradedPackage}::market::open_position_with_scard`,
125
+ typeArguments: [
126
+ `${this.consts.zoCore.package}::usdz::USDZ`,
127
+ this.consts.coins[collateralToken].module,
128
+ this.consts.coins[indexToken].module,
129
+ `${this.consts.zoCore.package}::market::${long ? 'LONG' : 'SHORT'}`,
130
+ this.consts.coins[collateralToken].module,
131
+ ],
132
+ arguments: [
133
+ tx.object(SUI_CLOCK_OBJECT_ID),
134
+ tx.object(this.consts.zoCore.market),
135
+ tx.object(this.consts.zoCore.vaults[collateralToken].reservingFeeModel),
136
+ tx.object(this.consts.zoCore.symbols[symbol].fundingFeeModel),
137
+ tx.object(this.consts.zoCore.symbols[symbol].positionConfig),
138
+ tx.object(this.consts.pythFeeder.feeder[collateralToken]),
139
+ tx.object(this.consts.pythFeeder.feeder[indexToken]),
140
+ depositObject,
141
+ feeObject,
142
+ tx.pure.u8(allowTrade),
143
+ tx.pure.u64(size),
144
+ tx.pure.u64(reserveAmount),
145
+ tx.pure.u256(adjustCollateralPrice),
146
+ tx.pure.u256(adjustPrice),
147
+ sudoCard,
148
+ ],
149
+ });
150
+ kioskTx
151
+ .return({
152
+ itemType: `0xe7e651e4974fe367aa2837712d68081efb299c470242a15e2b9c26ea326159ec::card::SudoCard`,
153
+ item: sudoCard,
154
+ promise,
155
+ })
156
+ .finalize();
157
+ return tx;
158
+ }
159
+ async openPositionWithCoinAndSCard(collateralToken, indexToken, size, coinObj, long, reserveAmount, indexPrice, collateralPrice, kioskClient, kioskCap, scard, isLimitOrder, isIocOrder, pricesSlippage = 0.003, collateralSlippage = 0.5, relayerFee = BigInt(0.5), referralAddress, sender, tx, sponsoredTx, suiCoinObjectsForPythUpdate) {
160
+ if (!tx) {
161
+ tx = new Transaction();
162
+ }
163
+ if (referralAddress && !(await this.dataAPI.hasReferral(sender || ''))) {
164
+ tx = await this.addReferral(referralAddress, tx);
165
+ }
166
+ const symbol = joinSymbol(long ? 'long' : 'short', indexToken);
167
+ const adjustPrice = this.processSlippage(indexPrice, long, isLimitOrder ? 0 : pricesSlippage);
168
+ const adjustCollateralPrice = this.processSlippage(collateralPrice, false, collateralSlippage);
169
+ let allowTrade = ALLOW_TRADE_MUST_TRADE;
170
+ if (isLimitOrder) {
171
+ allowTrade = isIocOrder ? ALLOW_TRADE_NO_TRADE : ALLOW_TRADE_CAN_TRADE;
172
+ }
173
+ const kioskTx = new KioskTransaction({
174
+ transaction: tx,
175
+ kioskClient,
176
+ cap: kioskCap,
177
+ });
178
+ const [sudoCard, promise] = kioskTx.borrow({
179
+ itemType: `0xe7e651e4974fe367aa2837712d68081efb299c470242a15e2b9c26ea326159ec::card::SudoCard`,
180
+ itemId: scard,
181
+ });
182
+ // Handle oracle initialization and coin processing
183
+ let suiCoinObject;
184
+ if (sponsoredTx) {
185
+ suiCoinObject = this.processCoins(tx, 'sui', suiCoinObjectsForPythUpdate || [], true);
186
+ tx = await this.initOracleTxb([collateralToken, indexToken], tx, true, suiCoinObject);
187
+ }
188
+ else {
189
+ tx = await this.initOracleTxb([collateralToken, indexToken], tx);
190
+ }
191
+ // Process coin splitting
192
+ const [feeObject] = tx.splitCoins(coinObj, [tx.pure.u64(relayerFee)]);
193
+ tx.moveCall({
194
+ target: `${this.consts.zoCore.upgradedPackage}::market::open_position_with_scard`,
195
+ typeArguments: [
196
+ `${this.consts.zoCore.package}::usdz::USDZ`,
197
+ this.consts.coins[collateralToken].module,
198
+ this.consts.coins[indexToken].module,
199
+ `${this.consts.zoCore.package}::market::${long ? 'LONG' : 'SHORT'}`,
200
+ this.consts.coins[collateralToken].module,
201
+ ],
202
+ arguments: [
203
+ tx.object(SUI_CLOCK_OBJECT_ID),
204
+ tx.object(this.consts.zoCore.market),
205
+ tx.object(this.consts.zoCore.vaults[collateralToken].reservingFeeModel),
206
+ tx.object(this.consts.zoCore.symbols[symbol].fundingFeeModel),
207
+ tx.object(this.consts.zoCore.symbols[symbol].positionConfig),
208
+ tx.object(this.consts.pythFeeder.feeder[collateralToken]),
209
+ tx.object(this.consts.pythFeeder.feeder[indexToken]),
210
+ coinObj,
211
+ feeObject,
212
+ tx.pure.u8(allowTrade),
213
+ tx.pure.u64(size),
214
+ tx.pure.u64(reserveAmount),
215
+ tx.pure.u256(adjustCollateralPrice),
216
+ tx.pure.u256(adjustPrice),
217
+ sudoCard,
218
+ ],
219
+ });
220
+ kioskTx
221
+ .return({
222
+ itemType: `0xe7e651e4974fe367aa2837712d68081efb299c470242a15e2b9c26ea326159ec::card::SudoCard`,
223
+ item: sudoCard,
224
+ promise,
225
+ })
226
+ .finalize();
227
+ return tx;
228
+ }
229
+ async decreasePositionWithSCard(pcpId, collateralToken, indexToken, amount, long, indexPrice, collateralPrice, kioskClient, kioskCap, scard, isTriggerOrder = false, isTakeProfitOrder = true, isIocOrder = false, pricesSlippage = 0.003, collateralSlippage = 0.5, relayerFee = BigInt(0.5), coinObjects, sponsoredTx, suiCoinObjectsForPythUpdate) {
230
+ if (!coinObjects) {
231
+ throw new Error(`${this.constructor.name}: coinObjects is required`);
232
+ }
233
+ let tx = new Transaction();
234
+ const kioskTx = new KioskTransaction({
235
+ transaction: tx,
236
+ kioskClient,
237
+ cap: kioskCap,
238
+ });
239
+ const [sudoCard, promise] = kioskTx.borrow({
240
+ itemType: `0xe7e651e4974fe367aa2837712d68081efb299c470242a15e2b9c26ea326159ec::card::SudoCard`,
241
+ itemId: scard,
242
+ });
243
+ const symbol = joinSymbol(long ? 'long' : 'short', indexToken);
244
+ const adjustPrice = this.processSlippage(indexPrice, !long, isTriggerOrder ? 0 : pricesSlippage);
245
+ const adjustCollateralPrice = this.processSlippage(collateralPrice, false, collateralSlippage);
246
+ let allowTrade = ALLOW_TRADE_MUST_TRADE;
247
+ if (isTriggerOrder) {
248
+ allowTrade = isIocOrder || !isTakeProfitOrder ? ALLOW_TRADE_NO_TRADE : ALLOW_TRADE_CAN_TRADE;
249
+ }
250
+ else {
251
+ isTakeProfitOrder = true;
252
+ }
253
+ // Handle oracle initialization and coin processing
254
+ let suiCoinObject;
255
+ if (sponsoredTx) {
256
+ suiCoinObject = this.processCoins(tx, 'sui', suiCoinObjectsForPythUpdate || [], true);
257
+ tx = await this.initOracleTxb([collateralToken, indexToken], tx, true, suiCoinObject);
258
+ }
259
+ else {
260
+ tx = await this.initOracleTxb([collateralToken, indexToken], tx);
261
+ }
262
+ // Process coin splitting
263
+ const [feeObject] = this.processCoinSplitting(tx, collateralToken, coinObjects, [tx.pure.u64(relayerFee)], sponsoredTx, suiCoinObject);
264
+ tx.moveCall({
265
+ target: `${this.consts.zoCore.upgradedPackage}::market::decrease_position_with_scard`,
266
+ typeArguments: [
267
+ `${this.consts.zoCore.package}::usdz::USDZ`,
268
+ this.consts.coins[collateralToken].module,
269
+ this.consts.coins[indexToken].module,
270
+ `${this.consts.zoCore.package}::market::${long ? 'LONG' : 'SHORT'}`,
271
+ this.consts.coins[collateralToken].module,
272
+ ],
273
+ arguments: [
274
+ tx.object(SUI_CLOCK_OBJECT_ID),
275
+ tx.object(this.consts.zoCore.market),
276
+ tx.object(pcpId),
277
+ tx.object(this.consts.zoCore.vaults[collateralToken].reservingFeeModel),
278
+ tx.object(this.consts.zoCore.symbols[symbol].fundingFeeModel),
279
+ tx.object(this.consts.pythFeeder.feeder[collateralToken]),
280
+ tx.object(this.consts.pythFeeder.feeder[indexToken]),
281
+ feeObject,
282
+ tx.pure.u8(allowTrade),
283
+ tx.pure.bool(isTakeProfitOrder),
284
+ tx.pure.u64(amount),
285
+ tx.pure.u256(adjustCollateralPrice),
286
+ tx.pure.u256(adjustPrice),
287
+ sudoCard,
288
+ ],
289
+ });
290
+ kioskTx
291
+ .return({
292
+ itemType: `0xe7e651e4974fe367aa2837712d68081efb299c470242a15e2b9c26ea326159ec::card::SudoCard`,
293
+ item: sudoCard,
294
+ promise,
295
+ })
296
+ .finalize();
297
+ return tx;
298
+ }
299
+ async decreaseMultiPositionsWithSCard(positions, kioskClient, kioskCap, scard, tx, sponsoredTx, suiCoinObjectsForPythUpdate) {
300
+ if (!tx) {
301
+ tx = new Transaction();
302
+ }
303
+ // Handle oracle initialization and coin processing
304
+ let suiCoinObject;
305
+ if (sponsoredTx) {
306
+ suiCoinObject = this.processCoins(tx, 'sui', suiCoinObjectsForPythUpdate || [], true);
307
+ tx = await this.initOracleTxb(positions.flatMap(position => [position.collateralToken, position.indexToken]), tx, true, suiCoinObject);
308
+ }
309
+ else {
310
+ tx = await this.initOracleTxb(positions.flatMap(position => [position.collateralToken, position.indexToken]), tx);
311
+ }
312
+ const kioskTx = new KioskTransaction({
313
+ transaction: tx,
314
+ kioskClient,
315
+ cap: kioskCap,
316
+ });
317
+ const [sudoCard, promise] = kioskTx.borrow({
318
+ itemType: `0xe7e651e4974fe367aa2837712d68081efb299c470242a15e2b9c26ea326159ec::card::SudoCard`,
319
+ itemId: scard,
320
+ });
321
+ for (const position of positions) {
322
+ const { pcpId, collateralToken, coinObjects = [], indexToken, amount, long, indexPrice, collateralPrice, isTriggerOrder = false, isTakeProfitOrder = true, isIocOrder = false, pricesSlippage = 0.003, collateralSlippage = 0.5, relayerFee = BigInt(0.5), } = position;
323
+ let innerIsTakeProfitOrder = isTakeProfitOrder;
324
+ const symbol = joinSymbol(long ? 'long' : 'short', indexToken);
325
+ const adjustPrice = this.processSlippage(indexPrice, !long, isTriggerOrder ? 0 : pricesSlippage);
326
+ const adjustCollateralPrice = this.processSlippage(collateralPrice, false, collateralSlippage);
327
+ let allowTrade = ALLOW_TRADE_MUST_TRADE;
328
+ if (isTriggerOrder) {
329
+ allowTrade = isIocOrder || !innerIsTakeProfitOrder ? ALLOW_TRADE_NO_TRADE : ALLOW_TRADE_CAN_TRADE;
330
+ }
331
+ else {
332
+ innerIsTakeProfitOrder = true;
333
+ }
334
+ // Process coin splitting
335
+ const [feeObject] = this.processCoinSplitting(tx, collateralToken, coinObjects, [tx.pure.u64(relayerFee)], sponsoredTx, suiCoinObject);
336
+ tx.moveCall({
337
+ target: `${this.consts.zoCore.upgradedPackage}::market::decrease_position_with_scard`,
338
+ typeArguments: [
339
+ `${this.consts.zoCore.package}::usdz::USDZ`,
340
+ this.consts.coins[collateralToken].module,
341
+ this.consts.coins[indexToken].module,
342
+ `${this.consts.zoCore.package}::market::${long ? 'LONG' : 'SHORT'}`,
343
+ this.consts.coins[collateralToken].module,
344
+ ],
345
+ arguments: [
346
+ tx.object(SUI_CLOCK_OBJECT_ID),
347
+ tx.object(this.consts.zoCore.market),
348
+ tx.object(pcpId),
349
+ tx.object(this.consts.zoCore.vaults[collateralToken].reservingFeeModel),
350
+ tx.object(this.consts.zoCore.symbols[symbol].fundingFeeModel),
351
+ tx.object(this.consts.pythFeeder.feeder[collateralToken]),
352
+ tx.object(this.consts.pythFeeder.feeder[indexToken]),
353
+ feeObject,
354
+ tx.pure.u8(allowTrade),
355
+ tx.pure.bool(innerIsTakeProfitOrder),
356
+ tx.pure.u64(amount),
357
+ tx.pure.u256(adjustCollateralPrice),
358
+ tx.pure.u256(adjustPrice),
359
+ sudoCard,
360
+ ],
361
+ });
362
+ }
363
+ kioskTx
364
+ .return({
365
+ itemType: `0xe7e651e4974fe367aa2837712d68081efb299c470242a15e2b9c26ea326159ec::card::SudoCard`,
366
+ item: sudoCard,
367
+ promise,
368
+ })
369
+ .finalize();
370
+ return tx;
371
+ }
372
+ async openPositionWithSCardV2(collateralToken, indexToken, size, collateralAmount, coinObjects, long, reserveAmount, indexPrice, collateralPrice, kioskClient, kioskCap, scard, isLimitOrder, isIocOrder, pricesSlippage = 0.003, collateralSlippage = 0.5, relayerFee = BigInt(0.5), referralAddress, sender, sponsoredTx, suiCoinObjectsForPythUpdate) {
373
+ let tx = new Transaction();
374
+ if (referralAddress && !(await this.dataAPI.hasReferral(sender || ''))) {
375
+ tx = await this.addReferral(referralAddress, tx);
376
+ }
377
+ const symbol = joinSymbol(long ? 'long' : 'short', indexToken);
378
+ const adjustPrice = this.processSlippage(indexPrice, long, isLimitOrder ? 0 : pricesSlippage);
379
+ const adjustCollateralPrice = this.processSlippage(collateralPrice, false, collateralSlippage);
380
+ const indexPriceThreshold = this.processPriceThreshold(indexPrice, pricesSlippage);
381
+ let allowTrade = ALLOW_TRADE_MUST_TRADE;
382
+ if (isLimitOrder) {
383
+ allowTrade = isIocOrder ? ALLOW_TRADE_NO_TRADE : ALLOW_TRADE_CAN_TRADE;
384
+ }
385
+ const kioskTx = new KioskTransaction({
386
+ transaction: tx,
387
+ kioskClient,
388
+ cap: kioskCap,
389
+ });
390
+ const [sudoCard, promise] = kioskTx.borrow({
391
+ itemType: `0xe7e651e4974fe367aa2837712d68081efb299c470242a15e2b9c26ea326159ec::card::SudoCard`,
392
+ itemId: scard,
393
+ });
394
+ // Handle oracle initialization and coin processing
395
+ let suiCoinObject;
396
+ if (sponsoredTx) {
397
+ suiCoinObject = this.processCoins(tx, 'sui', suiCoinObjectsForPythUpdate || [], true);
398
+ tx = await this.initOracleTxb([collateralToken, indexToken], tx, true, suiCoinObject);
399
+ }
400
+ else {
401
+ tx = await this.initOracleTxb([collateralToken, indexToken], tx);
402
+ }
403
+ // Process coin splitting
404
+ const [depositObject, feeObject] = this.processCoinSplitting(tx, collateralToken, coinObjects, [tx.pure.u64(collateralAmount), tx.pure.u64(relayerFee)], sponsoredTx, suiCoinObject);
405
+ tx.moveCall({
406
+ target: `${this.consts.zoCore.upgradedPackage}::market::open_position_with_scard_v2`,
407
+ typeArguments: [
408
+ `${this.consts.zoCore.package}::usdz::USDZ`,
409
+ this.consts.coins[collateralToken].module,
410
+ this.consts.coins[indexToken].module,
411
+ `${this.consts.zoCore.package}::market::${long ? 'LONG' : 'SHORT'}`,
412
+ this.consts.coins[collateralToken].module,
413
+ ],
414
+ arguments: [
415
+ tx.object(SUI_CLOCK_OBJECT_ID),
416
+ tx.object(this.consts.zoCore.market),
417
+ tx.object(this.consts.zoCore.symbols[symbol].positionConfig),
418
+ tx.object(this.consts.pythFeeder.feeder[collateralToken]),
419
+ tx.object(this.consts.pythFeeder.feeder[indexToken]),
420
+ depositObject,
421
+ feeObject,
422
+ tx.pure.u8(allowTrade),
423
+ tx.pure.u64(size),
424
+ tx.pure.u64(reserveAmount),
425
+ tx.pure.u256(adjustCollateralPrice),
426
+ tx.pure.u256(adjustPrice),
427
+ tx.pure.u256(indexPriceThreshold),
428
+ sudoCard,
429
+ ],
430
+ });
431
+ kioskTx
432
+ .return({
433
+ itemType: `0xe7e651e4974fe367aa2837712d68081efb299c470242a15e2b9c26ea326159ec::card::SudoCard`,
434
+ item: sudoCard,
435
+ promise,
436
+ })
437
+ .finalize();
438
+ return tx;
439
+ }
440
+ // S Card operations
441
+ async openPositionWithCoinAndSCardV2(collateralToken, indexToken, size, coinObj, long, reserveAmount, indexPrice, collateralPrice, kioskClient, kioskCap, scard, isLimitOrder, isIocOrder, pricesSlippage = 0.003, collateralSlippage = 0.5, relayerFee = BigInt(0.5), referralAddress, sender, tx, sponsoredTx, suiCoinObjectsForPythUpdate) {
442
+ if (!tx) {
443
+ tx = new Transaction();
444
+ }
445
+ if (referralAddress && !(await this.dataAPI.hasReferral(sender || ''))) {
446
+ tx = await this.addReferral(referralAddress, tx);
447
+ }
448
+ const symbol = joinSymbol(long ? 'long' : 'short', indexToken);
449
+ const adjustPrice = this.processSlippage(indexPrice, long, isLimitOrder ? 0 : pricesSlippage);
450
+ const adjustCollateralPrice = this.processSlippage(collateralPrice, false, collateralSlippage);
451
+ const indexPriceThreshold = this.processPriceThreshold(indexPrice, pricesSlippage);
452
+ let allowTrade = ALLOW_TRADE_MUST_TRADE;
453
+ if (isLimitOrder) {
454
+ allowTrade = isIocOrder ? ALLOW_TRADE_NO_TRADE : ALLOW_TRADE_CAN_TRADE;
455
+ }
456
+ const kioskTx = new KioskTransaction({
457
+ transaction: tx,
458
+ kioskClient,
459
+ cap: kioskCap,
460
+ });
461
+ const [sudoCard, promise] = kioskTx.borrow({
462
+ itemType: `0xe7e651e4974fe367aa2837712d68081efb299c470242a15e2b9c26ea326159ec::card::SudoCard`,
463
+ itemId: scard,
464
+ });
465
+ // Handle oracle initialization and coin processing
466
+ let suiCoinObject;
467
+ if (sponsoredTx) {
468
+ suiCoinObject = this.processCoins(tx, 'sui', suiCoinObjectsForPythUpdate || [], true);
469
+ tx = await this.initOracleTxb([collateralToken, indexToken], tx, true, suiCoinObject);
470
+ }
471
+ else {
472
+ tx = await this.initOracleTxb([collateralToken, indexToken], tx);
473
+ }
474
+ // Process coin splitting
475
+ const [feeObject] = tx.splitCoins(coinObj, [tx.pure.u64(relayerFee)]);
476
+ tx.moveCall({
477
+ target: `${this.consts.zoCore.upgradedPackage}::market::open_position_with_scard_v2`,
478
+ typeArguments: [
479
+ `${this.consts.zoCore.package}::usdz::USDZ`,
480
+ this.consts.coins[collateralToken].module,
481
+ this.consts.coins[indexToken].module,
482
+ `${this.consts.zoCore.package}::market::${long ? 'LONG' : 'SHORT'}`,
483
+ this.consts.coins[collateralToken].module,
484
+ ],
485
+ arguments: [
486
+ tx.object(SUI_CLOCK_OBJECT_ID),
487
+ tx.object(this.consts.zoCore.market),
488
+ tx.object(this.consts.zoCore.symbols[symbol].positionConfig),
489
+ tx.object(this.consts.pythFeeder.feeder[collateralToken]),
490
+ tx.object(this.consts.pythFeeder.feeder[indexToken]),
491
+ coinObj,
492
+ feeObject,
493
+ tx.pure.u8(allowTrade),
494
+ tx.pure.u64(size),
495
+ tx.pure.u64(reserveAmount),
496
+ tx.pure.u256(adjustCollateralPrice),
497
+ tx.pure.u256(adjustPrice),
498
+ tx.pure.u256(indexPriceThreshold),
499
+ sudoCard,
500
+ ],
501
+ });
502
+ kioskTx
503
+ .return({
504
+ itemType: `0xe7e651e4974fe367aa2837712d68081efb299c470242a15e2b9c26ea326159ec::card::SudoCard`,
505
+ item: sudoCard,
506
+ promise,
507
+ })
508
+ .finalize();
509
+ return tx;
510
+ }
511
+ async decreasePositionWithSCardV2(pcpId, collateralToken, indexToken, amount, long, indexPrice, collateralPrice, kioskClient, kioskCap, scard, isTriggerOrder = false, isTakeProfitOrder = true, isIocOrder = false, pricesSlippage = 0.003, collateralSlippage = 0.5, relayerFee = BigInt(0.5), coinObjects, sponsoredTx, suiCoinObjectsForPythUpdate) {
512
+ if (!coinObjects) {
513
+ throw new Error(`${this.constructor.name}: coinObjects is required`);
514
+ }
515
+ let tx = new Transaction();
516
+ const kioskTx = new KioskTransaction({
517
+ transaction: tx,
518
+ kioskClient,
519
+ cap: kioskCap,
520
+ });
521
+ const [sudoCard, promise] = kioskTx.borrow({
522
+ itemType: `0xe7e651e4974fe367aa2837712d68081efb299c470242a15e2b9c26ea326159ec::card::SudoCard`,
523
+ itemId: scard,
524
+ });
525
+ const adjustPrice = this.processSlippage(indexPrice, !long, isTriggerOrder ? 0 : pricesSlippage);
526
+ const adjustCollateralPrice = this.processSlippage(collateralPrice, false, collateralSlippage);
527
+ const indexPriceThreshold = this.processPriceThreshold(indexPrice, pricesSlippage);
528
+ let allowTrade = ALLOW_TRADE_MUST_TRADE;
529
+ if (isTriggerOrder) {
530
+ allowTrade = isIocOrder || !isTakeProfitOrder ? ALLOW_TRADE_NO_TRADE : ALLOW_TRADE_CAN_TRADE;
531
+ }
532
+ else {
533
+ isTakeProfitOrder = true;
534
+ }
535
+ // Handle oracle initialization and coin processing
536
+ let suiCoinObject;
537
+ if (sponsoredTx) {
538
+ suiCoinObject = this.processCoins(tx, 'sui', suiCoinObjectsForPythUpdate || [], true);
539
+ tx = await this.initOracleTxb([collateralToken, indexToken], tx, true, suiCoinObject);
540
+ }
541
+ else {
542
+ tx = await this.initOracleTxb([collateralToken, indexToken], tx);
543
+ }
544
+ // Process coin splitting
545
+ const [feeObject] = this.processCoinSplitting(tx, collateralToken, coinObjects, [tx.pure.u64(relayerFee)], sponsoredTx, suiCoinObject);
546
+ tx.moveCall({
547
+ target: `${this.consts.zoCore.upgradedPackage}::market::decrease_position_with_scard_v2`,
548
+ typeArguments: [
549
+ `${this.consts.zoCore.package}::usdz::USDZ`,
550
+ this.consts.coins[collateralToken].module,
551
+ this.consts.coins[indexToken].module,
552
+ `${this.consts.zoCore.package}::market::${long ? 'LONG' : 'SHORT'}`,
553
+ this.consts.coins[collateralToken].module,
554
+ ],
555
+ arguments: [
556
+ tx.object(SUI_CLOCK_OBJECT_ID),
557
+ tx.object(this.consts.zoCore.market),
558
+ tx.object(pcpId),
559
+ tx.object(this.consts.pythFeeder.feeder[collateralToken]),
560
+ tx.object(this.consts.pythFeeder.feeder[indexToken]),
561
+ feeObject,
562
+ tx.pure.u8(allowTrade),
563
+ tx.pure.bool(isTakeProfitOrder),
564
+ tx.pure.u64(amount),
565
+ tx.pure.u256(adjustCollateralPrice),
566
+ tx.pure.u256(adjustPrice),
567
+ tx.pure.u256(indexPriceThreshold),
568
+ sudoCard,
569
+ ],
570
+ });
571
+ kioskTx
572
+ .return({
573
+ itemType: `0xe7e651e4974fe367aa2837712d68081efb299c470242a15e2b9c26ea326159ec::card::SudoCard`,
574
+ item: sudoCard,
575
+ promise,
576
+ })
577
+ .finalize();
578
+ return tx;
579
+ }
580
+ async decreaseMultiPositionsWithSCardV2(positions, kioskClient, kioskCap, scard, tx, sponsoredTx, suiCoinObjectsForPythUpdate, feeObjects) {
581
+ const transaction = tx ?? new Transaction();
582
+ // Handle oracle initialization and coin processing
583
+ const tokens = positions.flatMap(position => [position.collateralToken, position.indexToken]);
584
+ const suiCoinObject = sponsoredTx
585
+ ? this.processCoins(transaction, 'sui', suiCoinObjectsForPythUpdate || [], true)
586
+ : undefined;
587
+ await this.initOracleTxb(tokens, transaction, !!sponsoredTx, suiCoinObject);
588
+ if (!feeObjects || feeObjects.length !== positions.length) {
589
+ throw new Error('feeObjects must be provided (pre-processed via buildFeeCoinObjects) and match positions length');
590
+ }
591
+ const kioskTx = new KioskTransaction({
592
+ transaction,
593
+ kioskClient,
594
+ cap: kioskCap,
595
+ });
596
+ const [sudoCard, promise] = kioskTx.borrow({
597
+ itemType: `0xe7e651e4974fe367aa2837712d68081efb299c470242a15e2b9c26ea326159ec::card::SudoCard`,
598
+ itemId: scard,
599
+ });
600
+ for (const [i, position] of positions.entries()) {
601
+ const feeObject = feeObjects[i];
602
+ const { pcpId, collateralToken, indexToken, amount, long, indexPrice, collateralPrice, isTriggerOrder = false, isTakeProfitOrder = true, isIocOrder = false, pricesSlippage = 0.003, collateralSlippage = 0.5, } = position;
603
+ let innerIsTakeProfitOrder = isTakeProfitOrder;
604
+ const adjustPrice = this.processSlippage(indexPrice, !long, isTriggerOrder ? 0 : pricesSlippage);
605
+ const adjustCollateralPrice = this.processSlippage(collateralPrice, false, collateralSlippage);
606
+ const indexPriceThreshold = this.processPriceThreshold(indexPrice, pricesSlippage);
607
+ let allowTrade = ALLOW_TRADE_MUST_TRADE;
608
+ if (isTriggerOrder) {
609
+ allowTrade = isIocOrder || !innerIsTakeProfitOrder ? ALLOW_TRADE_NO_TRADE : ALLOW_TRADE_CAN_TRADE;
610
+ }
611
+ else {
612
+ innerIsTakeProfitOrder = true;
613
+ }
614
+ transaction.moveCall({
615
+ target: `${this.consts.zoCore.upgradedPackage}::market::decrease_position_with_scard_v2`,
616
+ typeArguments: [
617
+ `${this.consts.zoCore.package}::usdz::USDZ`,
618
+ this.consts.coins[collateralToken].module,
619
+ this.consts.coins[indexToken].module,
620
+ `${this.consts.zoCore.package}::market::${long ? 'LONG' : 'SHORT'}`,
621
+ this.consts.coins[collateralToken].module,
622
+ ],
623
+ arguments: [
624
+ transaction.object(SUI_CLOCK_OBJECT_ID),
625
+ transaction.object(this.consts.zoCore.market),
626
+ transaction.object(pcpId),
627
+ transaction.object(this.consts.pythFeeder.feeder[collateralToken]),
628
+ transaction.object(this.consts.pythFeeder.feeder[indexToken]),
629
+ feeObject,
630
+ transaction.pure.u8(allowTrade),
631
+ transaction.pure.bool(innerIsTakeProfitOrder),
632
+ transaction.pure.u64(amount),
633
+ transaction.pure.u256(adjustCollateralPrice),
634
+ transaction.pure.u256(adjustPrice),
635
+ transaction.pure.u256(indexPriceThreshold),
636
+ sudoCard,
637
+ ],
638
+ });
639
+ }
640
+ kioskTx
641
+ .return({
642
+ itemType: `0xe7e651e4974fe367aa2837712d68081efb299c470242a15e2b9c26ea326159ec::card::SudoCard`,
643
+ item: sudoCard,
644
+ promise,
645
+ })
646
+ .finalize();
647
+ return transaction;
648
+ }
649
+ /**
650
+ * Deposits collateral into USDZ vault
651
+ */
652
+ async deposit(coin, coinObjects, amount, minAmountOut = 0, referralAddress, sender, sponsoredTx, suiCoinObjectsForPythUpdate) {
653
+ let tx = new Transaction();
654
+ // Add referral if needed
655
+ if (referralAddress && !(await this.dataAPI.hasReferral(sender || ''))) {
656
+ tx = await this.addReferral(referralAddress, tx);
657
+ }
658
+ // Initialize oracle transaction
659
+ const pythFeederKeys = Object.keys(this.consts.pythFeeder.feeder);
660
+ // Handle sponsored transaction case
661
+ if (sponsoredTx) {
662
+ const suiCoinObject = this.processCoins(tx, 'sui', suiCoinObjectsForPythUpdate || [], true);
663
+ tx = await this.initOracleTxb(pythFeederKeys, tx, true, suiCoinObject);
664
+ // Process deposit coins
665
+ const depositObject = coin === 'sui'
666
+ ? tx.splitCoins(suiCoinObject, [tx.pure.u64(amount)])[0]
667
+ : tx.splitCoins(this.processCoins(tx, coin, coinObjects, true), [tx.pure.u64(amount)])[0];
668
+ const { vaultsValuation, symbolsValuation } = this.dataAPI.valuate(tx);
669
+ tx.moveCall({
670
+ target: `${this.consts.zoCore.upgradedPackage}::market::deposit`,
671
+ typeArguments: [`${this.consts.zoCore.package}::usdz::USDZ`, this.consts.coins[coin].module],
672
+ arguments: [
673
+ tx.object(this.consts.zoCore.market),
674
+ tx.object(this.consts.zoCore.rebaseFeeModel),
675
+ depositObject,
676
+ tx.pure.u64(minAmountOut),
677
+ vaultsValuation,
678
+ symbolsValuation,
679
+ ],
680
+ });
681
+ return tx;
682
+ }
683
+ // Handle non-sponsored transaction case
684
+ tx = await this.initOracleTxb(pythFeederKeys, tx);
685
+ const depositObject = tx.splitCoins(this.processCoins(tx, coin, coinObjects, false), [tx.pure.u64(amount)])[0];
686
+ const { vaultsValuation, symbolsValuation } = this.dataAPI.valuate(tx);
687
+ tx.moveCall({
688
+ target: `${this.consts.zoCore.upgradedPackage}::market::deposit`,
689
+ typeArguments: [
690
+ `${this.consts.zoCore.package}::usdz::USDZ`,
691
+ this.consts.coins[coin].module,
692
+ ],
693
+ arguments: [
694
+ tx.object(this.consts.zoCore.market),
695
+ tx.object(this.consts.zoCore.rebaseFeeModel),
696
+ depositObject,
697
+ tx.pure.u64(minAmountOut),
698
+ vaultsValuation,
699
+ symbolsValuation,
700
+ ],
701
+ });
702
+ return tx;
703
+ }
704
+ /**
705
+ * Deposits collateral into USDZ vault
706
+ */
707
+ async depositPtb(coin, coinObjects, amount, minAmountOut = 0, referralAddress, sender, tx, sponsoredTx, suiCoinObjectsForPythUpdate) {
708
+ if (!tx) {
709
+ tx = new Transaction();
710
+ }
711
+ // Add referral if needed
712
+ if (referralAddress && !(await this.dataAPI.hasReferral(sender || ''))) {
713
+ tx = await this.addReferral(referralAddress, tx);
714
+ }
715
+ // Initialize oracle transaction
716
+ const pythFeederKeys = Object.keys(this.consts.pythFeeder.feeder);
717
+ // Handle sponsored transaction case
718
+ if (sponsoredTx) {
719
+ const suiCoinObject = this.processCoins(tx, 'sui', suiCoinObjectsForPythUpdate || [], true);
720
+ tx = await this.initOracleTxb(pythFeederKeys, tx, true, suiCoinObject);
721
+ // Process deposit coins
722
+ const depositObject = coin === 'sui'
723
+ ? tx.splitCoins(suiCoinObject, [tx.pure.u64(amount)])[0]
724
+ : tx.splitCoins(this.processCoins(tx, coin, coinObjects, true), [tx.pure.u64(amount)])[0];
725
+ const { vaultsValuation, symbolsValuation } = this.dataAPI.valuate(tx);
726
+ const [mintedCoin] = tx.moveCall({
727
+ target: `${this.consts.zoCore.upgradedPackage}::market::deposit_ptb`,
728
+ typeArguments: [`${this.consts.zoCore.package}::usdz::USDZ`, this.consts.coins[coin].module],
729
+ arguments: [
730
+ tx.object(this.consts.zoCore.market),
731
+ tx.object(this.consts.zoCore.rebaseFeeModel),
732
+ depositObject,
733
+ tx.pure.u64(minAmountOut),
734
+ vaultsValuation,
735
+ symbolsValuation,
736
+ ],
737
+ });
738
+ return mintedCoin;
739
+ }
740
+ // Handle non-sponsored transaction case
741
+ tx = await this.initOracleTxb(pythFeederKeys, tx);
742
+ const depositObject = tx.splitCoins(this.processCoins(tx, coin, coinObjects, false), [tx.pure.u64(amount)])[0];
743
+ const { vaultsValuation, symbolsValuation } = this.dataAPI.valuate(tx);
744
+ const [mintedCoin] = tx.moveCall({
745
+ target: `${this.consts.zoCore.upgradedPackage}::market::deposit_ptb`,
746
+ typeArguments: [
747
+ `${this.consts.zoCore.package}::usdz::USDZ`,
748
+ this.consts.coins[coin].module,
749
+ ],
750
+ arguments: [
751
+ tx.object(this.consts.zoCore.market),
752
+ tx.object(this.consts.zoCore.rebaseFeeModel),
753
+ depositObject,
754
+ tx.pure.u64(minAmountOut),
755
+ vaultsValuation,
756
+ symbolsValuation,
757
+ ],
758
+ });
759
+ return mintedCoin;
760
+ }
761
+ /**
762
+ * Withdraws collateral from USDZ vault
763
+ */
764
+ async withdraw(coin, lpCoinObjects, amount, minAmountOut = 0, sponsoredTx, suiCoinObjectsForPythUpdate) {
765
+ let tx = new Transaction();
766
+ // Initialize oracle transaction
767
+ const pythFeederKeys = Object.keys(this.consts.pythFeeder.feeder);
768
+ if (sponsoredTx) {
769
+ const suiCoinObject = this.processCoins(tx, 'sui', suiCoinObjectsForPythUpdate || [], true);
770
+ tx = await this.initOracleTxb(pythFeederKeys, tx, true, suiCoinObject);
771
+ }
772
+ else {
773
+ tx = await this.initOracleTxb(pythFeederKeys, tx);
774
+ }
775
+ const usdzCoinObject = this.processCoins(tx, 'usdz', lpCoinObjects, false);
776
+ const [withdrawObject] = tx.splitCoins(usdzCoinObject, [tx.pure.u64(amount)]);
777
+ const { vaultsValuation, symbolsValuation } = this.dataAPI.valuate(tx);
778
+ tx.moveCall({
779
+ target: `${this.consts.zoCore.upgradedPackage}::market::withdraw`,
780
+ typeArguments: [
781
+ `${this.consts.zoCore.package}::usdz::USDZ`,
782
+ this.consts.coins[coin].module,
783
+ ],
784
+ arguments: [
785
+ tx.object(this.consts.zoCore.market),
786
+ tx.object(this.consts.zoCore.rebaseFeeModel),
787
+ withdrawObject,
788
+ tx.pure.u64(minAmountOut),
789
+ vaultsValuation,
790
+ symbolsValuation,
791
+ ],
792
+ });
793
+ return tx;
794
+ }
795
+ /**
796
+ * Withdraws LP coin object from USDZ vault
797
+ */
798
+ async withdrawLpCoinObject(coin, lpCoinObject, minAmountOut = 0, tx) {
799
+ if (!tx) {
800
+ tx = new Transaction();
801
+ }
802
+ // Initialize oracle transaction
803
+ const pythFeederKeys = Object.keys(this.consts.pythFeeder.feeder);
804
+ tx = await this.initOracleTxb(pythFeederKeys, tx);
805
+ const { vaultsValuation, symbolsValuation } = this.dataAPI.valuate(tx);
806
+ tx.moveCall({
807
+ target: `${this.consts.zoCore.upgradedPackage}::market::withdraw`,
808
+ typeArguments: [
809
+ `${this.consts.zoCore.package}::usdz::USDZ`,
810
+ this.consts.coins[coin].module,
811
+ ],
812
+ arguments: [
813
+ tx.object(this.consts.zoCore.market),
814
+ tx.object(this.consts.zoCore.rebaseFeeModel),
815
+ lpCoinObject,
816
+ tx.pure.u64(minAmountOut),
817
+ vaultsValuation,
818
+ symbolsValuation,
819
+ ],
820
+ });
821
+ return tx;
822
+ }
823
+ /**
824
+ * Stakes USDZ tokens in ZO staking pools
825
+ */
826
+ stake(lpCoinObjects, amount, pool, tx) {
827
+ if (!tx) {
828
+ tx = new Transaction();
829
+ }
830
+ const coinObject = this.processCoins(tx, 'usdz', lpCoinObjects);
831
+ const [depositObject] = tx.splitCoins(coinObject, [tx.pure.u64(amount)]);
832
+ tx.moveCall({
833
+ target: `${this.sharedConfig.zoStaking.upgradedPackage}::pool::deposit`,
834
+ typeArguments: [
835
+ `${this.consts.zoCore.package}::usdz::USDZ`,
836
+ `${this.consts.coins.sui.module}`,
837
+ ],
838
+ arguments: [
839
+ tx.object(pool),
840
+ tx.object(SUI_CLOCK_OBJECT_ID),
841
+ depositObject,
842
+ ],
843
+ });
844
+ return tx;
845
+ }
846
+ /**
847
+ * Stakes USDZ tokens using coin object only (PTB)
848
+ */
849
+ stakeCoinObject(coinObject, pool, tx) {
850
+ if (!tx) {
851
+ tx = new Transaction();
852
+ }
853
+ tx.moveCall({
854
+ target: `${this.sharedConfig.zoStaking.upgradedPackage}::pool::deposit`,
855
+ typeArguments: [
856
+ `${this.consts.zoCore.package}::usdz::USDZ`,
857
+ `${this.consts.coins.sui.module}`,
858
+ ],
859
+ arguments: [
860
+ tx.object(pool),
861
+ tx.object(SUI_CLOCK_OBJECT_ID),
862
+ coinObject,
863
+ ],
864
+ });
865
+ return tx;
866
+ }
867
+ /**
868
+ * Unstakes USDZ tokens from ZO staking pools
869
+ */
870
+ unstake(credentials, amount, pool, tx) {
871
+ let unstakeAmount = amount;
872
+ if (!tx) {
873
+ tx = new Transaction();
874
+ }
875
+ for (const credential of credentials) {
876
+ const withdrawAmount = (() => {
877
+ const min = (a, b) => a < b ? a : b;
878
+ return min(unstakeAmount, credential.amount);
879
+ })();
880
+ unstakeAmount -= withdrawAmount;
881
+ tx.moveCall({
882
+ target: `${this.sharedConfig.zoStaking.upgradedPackage}::pool::withdraw`,
883
+ typeArguments: [
884
+ `${this.consts.zoCore.package}::usdz::USDZ`,
885
+ `${this.consts.coins.sui.module}`,
886
+ ],
887
+ arguments: [
888
+ tx.object(pool),
889
+ tx.object(SUI_CLOCK_OBJECT_ID),
890
+ tx.object(credential.id),
891
+ tx.pure.u64(withdrawAmount),
892
+ ],
893
+ });
894
+ if (credential.amount === BigInt(0)) {
895
+ tx.moveCall({
896
+ target: `${this.sharedConfig.zoStaking.upgradedPackage}::pool::clear_empty_credential`,
897
+ typeArguments: [
898
+ `${this.consts.zoCore.package}::usdz::USDZ`,
899
+ `${this.consts.coins.sui.module}`,
900
+ ],
901
+ arguments: [tx.object(credential.id)],
902
+ });
903
+ }
904
+ }
905
+ return tx;
906
+ }
907
+ /**
908
+ * Unstakes USDZ tokens from ZO staking pools return Coins
909
+ */
910
+ unstakeToCoins(credentials, amount, pool, tx) {
911
+ let unstakeAmount = amount;
912
+ const withdrawnCoinObjects = [];
913
+ for (const credential of credentials) {
914
+ const withdrawAmount = (() => {
915
+ const min = (a, b) => a < b ? a : b;
916
+ return min(unstakeAmount, credential.amount);
917
+ })();
918
+ unstakeAmount -= withdrawAmount;
919
+ const [withdrawnCoin] = tx.moveCall({
920
+ target: `${this.sharedConfig.zoStaking.upgradedPackage}::pool::withdraw_ptb`,
921
+ typeArguments: [
922
+ `${this.consts.zoCore.package}::usdz::USDZ`,
923
+ `${this.consts.coins.sui.module}`,
924
+ ],
925
+ arguments: [
926
+ tx.object(pool),
927
+ tx.object(SUI_CLOCK_OBJECT_ID),
928
+ tx.object(credential.id),
929
+ tx.pure.u64(withdrawAmount),
930
+ ],
931
+ });
932
+ withdrawnCoinObjects.push(withdrawnCoin);
933
+ if (credential.amount === BigInt(0)) {
934
+ tx.moveCall({
935
+ target: `${this.sharedConfig.zoStaking.upgradedPackage}::pool::clear_empty_credential`,
936
+ typeArguments: [
937
+ `${this.consts.zoCore.package}::usdz::USDZ`,
938
+ `${this.consts.coins.sui.module}`,
939
+ ],
940
+ arguments: [tx.object(credential.id)],
941
+ });
942
+ }
943
+ }
944
+ return withdrawnCoinObjects;
945
+ }
946
+ /**
947
+ * Withdraws USDZ tokens from a staking pool credential (PTB)
948
+ * Returns the withdrawn coin object for use in programmable transaction blocks
949
+ */
950
+ withdrawFromVaultPtb(pool, credential, withdrawAmount, tx) {
951
+ const [withdrawnCoin] = tx.moveCall({
952
+ target: `${this.sharedConfig.zoStaking.upgradedPackage}::pool::withdraw_ptb`,
953
+ typeArguments: [
954
+ `${this.consts.zoCore.package}::usdz::USDZ`,
955
+ `${this.consts.coins.sui.module}`,
956
+ ],
957
+ arguments: [
958
+ tx.object(pool),
959
+ tx.object(SUI_CLOCK_OBJECT_ID),
960
+ tx.object(credential),
961
+ tx.pure.u64(withdrawAmount),
962
+ ],
963
+ });
964
+ return withdrawnCoin;
965
+ }
966
+ /**
967
+ * Claims rewards from a staking pool credential (PTB)
968
+ * Returns the reward coin object for use in programmable transaction blocks
969
+ */
970
+ claimRewardsPtb(pool, credential, tx) {
971
+ const [rewardCoin] = tx.moveCall({
972
+ target: `${this.sharedConfig.zoStaking.upgradedPackage}::pool::claim_rewards_ptb`,
973
+ typeArguments: [
974
+ `${this.consts.zoCore.package}::usdz::USDZ`,
975
+ `${this.consts.coins.sui.module}`,
976
+ ],
977
+ arguments: [
978
+ tx.object(pool),
979
+ tx.object(SUI_CLOCK_OBJECT_ID),
980
+ tx.object(credential),
981
+ ],
982
+ });
983
+ return rewardCoin;
984
+ }
985
+ async swap(fromToken, toToken, fromAmount, fromCoinObjects, minAmountOut) {
986
+ const tx = await this.initOracleTxb(Object.keys(this.consts.zoCore.vaults));
987
+ const fromCoinObject = this.processCoins(tx, fromToken, fromCoinObjects);
988
+ const [fromDepositObject] = tx.splitCoins(fromCoinObject, [tx.pure.u64(fromAmount)]);
989
+ const vaultsValuation = this.dataAPI.valuateVaults(tx);
990
+ tx.moveCall({
991
+ target: `${this.consts.zoCore.upgradedPackage}::market::swap`,
992
+ typeArguments: [
993
+ `${this.consts.zoCore.package}::usdz::USDZ`,
994
+ this.consts.coins[fromToken].module,
995
+ this.consts.coins[toToken].module,
996
+ ],
997
+ arguments: [
998
+ tx.object(this.consts.zoCore.market),
999
+ tx.object(this.consts.zoCore.rebaseFeeModel),
1000
+ fromDepositObject,
1001
+ tx.pure.u64(minAmountOut || 0),
1002
+ vaultsValuation,
1003
+ ],
1004
+ });
1005
+ return tx;
1006
+ }
1007
+ /**
1008
+ * Opens a new position in USDZ
1009
+ */
1010
+ async openPosition(collateralToken, indexToken, size, collateralAmount, coinObjects, long, reserveAmount, indexPrice, collateralPrice, isLimitOrder, isIocOrder, pricesSlippage = 0.003, collateralSlippage = 0.5, relayerFee = BigInt(0.5), referralAddress, sender, sponsoredTx, suiCoinObjectsForPythUpdate) {
1011
+ let tx = new Transaction();
1012
+ if (referralAddress && !(await this.dataAPI.hasReferral(sender || ''))) {
1013
+ tx = await this.addReferral(referralAddress, tx);
1014
+ }
1015
+ const symbol = joinSymbol(long ? 'long' : 'short', indexToken);
1016
+ const adjustPrice = this.processSlippage(indexPrice, long, isLimitOrder ? 0 : pricesSlippage);
1017
+ const adjustCollateralPrice = this.processSlippage(collateralPrice, false, collateralSlippage);
1018
+ let allowTrade = ALLOW_TRADE_MUST_TRADE;
1019
+ if (isLimitOrder) {
1020
+ allowTrade = isIocOrder ? ALLOW_TRADE_NO_TRADE : ALLOW_TRADE_CAN_TRADE;
1021
+ }
1022
+ // Handle oracle initialization and coin processing
1023
+ let suiCoinObject;
1024
+ if (sponsoredTx) {
1025
+ suiCoinObject = this.processCoins(tx, 'sui', suiCoinObjectsForPythUpdate || [], true);
1026
+ tx = await this.initOracleTxb([collateralToken, indexToken], tx, true, suiCoinObject);
1027
+ }
1028
+ else {
1029
+ tx = await this.initOracleTxb([collateralToken, indexToken], tx);
1030
+ }
1031
+ // Process coin splitting
1032
+ const [depositObject, feeObject] = this.processCoinSplitting(tx, collateralToken, coinObjects, [tx.pure.u64(collateralAmount), tx.pure.u64(relayerFee)], sponsoredTx, suiCoinObject);
1033
+ tx.moveCall({
1034
+ target: `${this.consts.zoCore.upgradedPackage}::market::open_position`,
1035
+ typeArguments: [
1036
+ `${this.consts.zoCore.package}::usdz::USDZ`,
1037
+ this.consts.coins[collateralToken].module,
1038
+ this.consts.coins[indexToken].module,
1039
+ `${this.consts.zoCore.package}::market::${long ? 'LONG' : 'SHORT'}`,
1040
+ this.consts.coins[collateralToken].module,
1041
+ ],
1042
+ arguments: [
1043
+ tx.object(SUI_CLOCK_OBJECT_ID),
1044
+ tx.object(this.consts.zoCore.market),
1045
+ tx.object(this.consts.zoCore.vaults[collateralToken].reservingFeeModel),
1046
+ tx.object(this.consts.zoCore.symbols[symbol].fundingFeeModel),
1047
+ tx.object(this.consts.zoCore.symbols[symbol].positionConfig),
1048
+ tx.object(this.consts.pythFeeder.feeder[collateralToken]),
1049
+ tx.object(this.consts.pythFeeder.feeder[indexToken]),
1050
+ depositObject,
1051
+ feeObject,
1052
+ tx.pure.u8(allowTrade),
1053
+ tx.pure.u64(size),
1054
+ tx.pure.u64(reserveAmount),
1055
+ tx.pure.u256(adjustCollateralPrice),
1056
+ tx.pure.u256(adjustPrice),
1057
+ ],
1058
+ });
1059
+ return tx;
1060
+ }
1061
+ /**
1062
+ * Opens a new position in USDZ (V2)
1063
+ */
1064
+ async openPositionV2(collateralToken, indexToken, size, collateralAmount, coinObjects, long, reserveAmount, indexPrice, collateralPrice, isLimitOrder, isIocOrder, pricesSlippage = 0.003, collateralSlippage = 0.5, relayerFee = BigInt(0.5), referralAddress, sender, sponsoredTx, suiCoinObjectsForPythUpdate) {
1065
+ let tx = new Transaction();
1066
+ if (referralAddress && !(await this.dataAPI.hasReferral(sender || ''))) {
1067
+ tx = await this.addReferral(referralAddress, tx);
1068
+ }
1069
+ const symbol = joinSymbol(long ? 'long' : 'short', indexToken);
1070
+ const adjustPrice = this.processSlippage(indexPrice, long, isLimitOrder ? 0 : pricesSlippage);
1071
+ const adjustCollateralPrice = this.processSlippage(collateralPrice, false, collateralSlippage);
1072
+ const indexPriceThreshold = this.processPriceThreshold(indexPrice, pricesSlippage);
1073
+ let allowTrade = ALLOW_TRADE_MUST_TRADE;
1074
+ if (isLimitOrder) {
1075
+ allowTrade = isIocOrder ? ALLOW_TRADE_NO_TRADE : ALLOW_TRADE_CAN_TRADE;
1076
+ }
1077
+ // Handle oracle initialization and coin processing
1078
+ let suiCoinObject;
1079
+ if (sponsoredTx) {
1080
+ suiCoinObject = this.processCoins(tx, 'sui', suiCoinObjectsForPythUpdate || [], true);
1081
+ tx = await this.initOracleTxb([collateralToken, indexToken], tx, true, suiCoinObject);
1082
+ }
1083
+ else {
1084
+ tx = await this.initOracleTxb([collateralToken, indexToken], tx);
1085
+ }
1086
+ // Process coin splitting
1087
+ const [depositObject, feeObject] = this.processCoinSplitting(tx, collateralToken, coinObjects, [tx.pure.u64(collateralAmount), tx.pure.u64(relayerFee)], sponsoredTx, suiCoinObject);
1088
+ tx.moveCall({
1089
+ target: `${this.consts.zoCore.upgradedPackage}::market::open_position_v2`,
1090
+ typeArguments: [
1091
+ `${this.consts.zoCore.package}::usdz::USDZ`,
1092
+ this.consts.coins[collateralToken].module,
1093
+ this.consts.coins[indexToken].module,
1094
+ `${this.consts.zoCore.package}::market::${long ? 'LONG' : 'SHORT'}`,
1095
+ this.consts.coins[collateralToken].module,
1096
+ ],
1097
+ arguments: [
1098
+ tx.object(SUI_CLOCK_OBJECT_ID),
1099
+ tx.object(this.consts.zoCore.market),
1100
+ tx.object(this.consts.zoCore.symbols[symbol].positionConfig),
1101
+ tx.object(this.consts.pythFeeder.feeder[collateralToken]),
1102
+ tx.object(this.consts.pythFeeder.feeder[indexToken]),
1103
+ depositObject,
1104
+ feeObject,
1105
+ tx.pure.u8(allowTrade),
1106
+ tx.pure.u64(size),
1107
+ tx.pure.u64(reserveAmount),
1108
+ tx.pure.u256(adjustCollateralPrice),
1109
+ tx.pure.u256(adjustPrice),
1110
+ tx.pure.u256(indexPriceThreshold),
1111
+ ],
1112
+ });
1113
+ return tx;
1114
+ }
1115
+ /**
1116
+ * Opens a new position in USDZ
1117
+ */
1118
+ async openPositionWithCoin(collateralToken, indexToken, size, coinObj, long, reserveAmount, indexPrice, collateralPrice, isLimitOrder, isIocOrder, pricesSlippage = 0.003, collateralSlippage = 0.5, relayerFee = BigInt(0.5), referralAddress, sender, tx, sponsoredTx, suiCoinObjectsForPythUpdate) {
1119
+ if (!tx) {
1120
+ tx = new Transaction();
1121
+ }
1122
+ if (referralAddress && !(await this.dataAPI.hasReferral(sender || ''))) {
1123
+ tx = await this.addReferral(referralAddress, tx);
1124
+ }
1125
+ const symbol = joinSymbol(long ? 'long' : 'short', indexToken);
1126
+ const adjustPrice = this.processSlippage(indexPrice, long, isLimitOrder ? 0 : pricesSlippage);
1127
+ const adjustCollateralPrice = this.processSlippage(collateralPrice, false, collateralSlippage);
1128
+ let allowTrade = ALLOW_TRADE_MUST_TRADE;
1129
+ if (isLimitOrder) {
1130
+ allowTrade = isIocOrder ? ALLOW_TRADE_NO_TRADE : ALLOW_TRADE_CAN_TRADE;
1131
+ }
1132
+ // Handle oracle initialization and coin processing
1133
+ let suiCoinObject;
1134
+ if (sponsoredTx) {
1135
+ suiCoinObject = this.processCoins(tx, 'sui', suiCoinObjectsForPythUpdate || [], true);
1136
+ tx = await this.initOracleTxb([collateralToken, indexToken], tx, true, suiCoinObject);
1137
+ }
1138
+ else {
1139
+ tx = await this.initOracleTxb([collateralToken, indexToken], tx);
1140
+ }
1141
+ // Process coin splitting
1142
+ const [feeObject] = tx.splitCoins(coinObj, [tx.pure.u64(relayerFee)]);
1143
+ tx.moveCall({
1144
+ target: `${this.consts.zoCore.upgradedPackage}::market::open_position`,
1145
+ typeArguments: [
1146
+ `${this.consts.zoCore.package}::usdz::USDZ`,
1147
+ this.consts.coins[collateralToken].module,
1148
+ this.consts.coins[indexToken].module,
1149
+ `${this.consts.zoCore.package}::market::${long ? 'LONG' : 'SHORT'}`,
1150
+ this.consts.coins[collateralToken].module,
1151
+ ],
1152
+ arguments: [
1153
+ tx.object(SUI_CLOCK_OBJECT_ID),
1154
+ tx.object(this.consts.zoCore.market),
1155
+ tx.object(this.consts.zoCore.vaults[collateralToken].reservingFeeModel),
1156
+ tx.object(this.consts.zoCore.symbols[symbol].fundingFeeModel),
1157
+ tx.object(this.consts.zoCore.symbols[symbol].positionConfig),
1158
+ tx.object(this.consts.pythFeeder.feeder[collateralToken]),
1159
+ tx.object(this.consts.pythFeeder.feeder[indexToken]),
1160
+ coinObj,
1161
+ feeObject,
1162
+ tx.pure.u8(allowTrade),
1163
+ tx.pure.u64(size),
1164
+ tx.pure.u64(reserveAmount),
1165
+ tx.pure.u256(adjustCollateralPrice),
1166
+ tx.pure.u256(adjustPrice),
1167
+ ],
1168
+ });
1169
+ return tx;
1170
+ }
1171
+ /**
1172
+ * Opens a new position with Coin in USDZ (V2)
1173
+ */
1174
+ async openPositionWithCoinV2(collateralToken, indexToken, size, coinObj, long, reserveAmount, indexPrice, collateralPrice, isLimitOrder, isIocOrder, pricesSlippage = 0.003, collateralSlippage = 0.5, relayerFee = BigInt(0.5), referralAddress, sender, tx, sponsoredTx, suiCoinObjectsForPythUpdate) {
1175
+ if (!tx) {
1176
+ tx = new Transaction();
1177
+ }
1178
+ if (referralAddress && !(await this.dataAPI.hasReferral(sender || ''))) {
1179
+ tx = await this.addReferral(referralAddress, tx);
1180
+ }
1181
+ const symbol = joinSymbol(long ? 'long' : 'short', indexToken);
1182
+ const adjustPrice = this.processSlippage(indexPrice, long, isLimitOrder ? 0 : pricesSlippage);
1183
+ const adjustCollateralPrice = this.processSlippage(collateralPrice, false, collateralSlippage);
1184
+ const indexPriceThreshold = this.processPriceThreshold(indexPrice, pricesSlippage);
1185
+ let allowTrade = ALLOW_TRADE_MUST_TRADE;
1186
+ if (isLimitOrder) {
1187
+ allowTrade = isIocOrder ? ALLOW_TRADE_NO_TRADE : ALLOW_TRADE_CAN_TRADE;
1188
+ }
1189
+ // Handle oracle initialization and coin processing
1190
+ let suiCoinObject;
1191
+ if (sponsoredTx) {
1192
+ suiCoinObject = this.processCoins(tx, 'sui', suiCoinObjectsForPythUpdate || [], true);
1193
+ tx = await this.initOracleTxb([collateralToken, indexToken], tx, true, suiCoinObject);
1194
+ }
1195
+ else {
1196
+ tx = await this.initOracleTxb([collateralToken, indexToken], tx);
1197
+ }
1198
+ // Process coin splitting
1199
+ const [feeObject] = tx.splitCoins(coinObj, [tx.pure.u64(relayerFee)]);
1200
+ tx.moveCall({
1201
+ target: `${this.consts.zoCore.upgradedPackage}::market::open_position_v2`,
1202
+ typeArguments: [
1203
+ `${this.consts.zoCore.package}::usdz::USDZ`,
1204
+ this.consts.coins[collateralToken].module,
1205
+ this.consts.coins[indexToken].module,
1206
+ `${this.consts.zoCore.package}::market::${long ? 'LONG' : 'SHORT'}`,
1207
+ this.consts.coins[collateralToken].module,
1208
+ ],
1209
+ arguments: [
1210
+ tx.object(SUI_CLOCK_OBJECT_ID),
1211
+ tx.object(this.consts.zoCore.market),
1212
+ tx.object(this.consts.zoCore.symbols[symbol].positionConfig),
1213
+ tx.object(this.consts.pythFeeder.feeder[collateralToken]),
1214
+ tx.object(this.consts.pythFeeder.feeder[indexToken]),
1215
+ coinObj,
1216
+ feeObject,
1217
+ tx.pure.u8(allowTrade),
1218
+ tx.pure.u64(size),
1219
+ tx.pure.u64(reserveAmount),
1220
+ tx.pure.u256(adjustCollateralPrice),
1221
+ tx.pure.u256(adjustPrice),
1222
+ tx.pure.u256(indexPriceThreshold),
1223
+ ],
1224
+ });
1225
+ return tx;
1226
+ }
1227
+ /**
1228
+ * Decreases an existing position in USDZ
1229
+ */
1230
+ async decreasePosition(pcpId, collateralToken, indexToken, amount, long, indexPrice, collateralPrice, isTriggerOrder = false, isTakeProfitOrder = true, isIocOrder = false, pricesSlippage = 0.003, collateralSlippage = 0.5, relayerFee = BigInt(0.5), coinObjects, sponsoredTx, suiCoinObjectsForPythUpdate) {
1231
+ if (!coinObjects) {
1232
+ throw new Error(`${this.constructor.name}: coinObjects is required`);
1233
+ }
1234
+ let tx = new Transaction();
1235
+ const symbol = joinSymbol(long ? 'long' : 'short', indexToken);
1236
+ const adjustPrice = this.processSlippage(indexPrice, !long, isTriggerOrder ? 0 : pricesSlippage);
1237
+ const adjustCollateralPrice = this.processSlippage(collateralPrice, false, collateralSlippage);
1238
+ let allowTrade = ALLOW_TRADE_MUST_TRADE;
1239
+ if (isTriggerOrder) {
1240
+ allowTrade = isIocOrder || !isTakeProfitOrder ? ALLOW_TRADE_NO_TRADE : ALLOW_TRADE_CAN_TRADE;
1241
+ }
1242
+ else {
1243
+ isTakeProfitOrder = true;
1244
+ }
1245
+ // Handle oracle initialization and coin processing
1246
+ let suiCoinObject;
1247
+ if (sponsoredTx) {
1248
+ suiCoinObject = this.processCoins(tx, 'sui', suiCoinObjectsForPythUpdate || [], true);
1249
+ tx = await this.initOracleTxb([collateralToken, indexToken], tx, true, suiCoinObject);
1250
+ }
1251
+ else {
1252
+ tx = await this.initOracleTxb([collateralToken, indexToken], tx);
1253
+ }
1254
+ // Process coin splitting
1255
+ const [feeObject] = this.processCoinSplitting(tx, collateralToken, coinObjects, [tx.pure.u64(relayerFee)], sponsoredTx, suiCoinObject);
1256
+ tx.moveCall({
1257
+ target: `${this.consts.zoCore.upgradedPackage}::market::decrease_position`,
1258
+ typeArguments: [
1259
+ `${this.consts.zoCore.package}::usdz::USDZ`,
1260
+ this.consts.coins[collateralToken].module,
1261
+ this.consts.coins[indexToken].module,
1262
+ `${this.consts.zoCore.package}::market::${long ? 'LONG' : 'SHORT'}`,
1263
+ this.consts.coins[collateralToken].module,
1264
+ ],
1265
+ arguments: [
1266
+ tx.object(SUI_CLOCK_OBJECT_ID),
1267
+ tx.object(this.consts.zoCore.market),
1268
+ tx.object(pcpId),
1269
+ tx.object(this.consts.zoCore.vaults[collateralToken].reservingFeeModel),
1270
+ tx.object(this.consts.zoCore.symbols[symbol].fundingFeeModel),
1271
+ tx.object(this.consts.pythFeeder.feeder[collateralToken]),
1272
+ tx.object(this.consts.pythFeeder.feeder[indexToken]),
1273
+ feeObject,
1274
+ tx.pure.u8(allowTrade),
1275
+ tx.pure.bool(isTakeProfitOrder),
1276
+ tx.pure.u64(amount),
1277
+ tx.pure.u256(adjustCollateralPrice),
1278
+ tx.pure.u256(adjustPrice),
1279
+ ],
1280
+ });
1281
+ return tx;
1282
+ }
1283
+ /**
1284
+ * Decreases an existing position in USDZ (V2)
1285
+ */
1286
+ async decreasePositionV2(pcpId, collateralToken, indexToken, amount, long, indexPrice, collateralPrice, isTriggerOrder = false, isTakeProfitOrder = true, isIocOrder = false, pricesSlippage = 0.003, collateralSlippage = 0.5, relayerFee = BigInt(0.5), coinObjects, sponsoredTx, suiCoinObjectsForPythUpdate) {
1287
+ if (!coinObjects) {
1288
+ throw new Error(`${this.constructor.name}: coinObjects is required`);
1289
+ }
1290
+ let tx = new Transaction();
1291
+ const adjustPrice = this.processSlippage(indexPrice, !long, isTriggerOrder ? 0 : pricesSlippage);
1292
+ const adjustCollateralPrice = this.processSlippage(collateralPrice, false, collateralSlippage);
1293
+ const indexPriceThreshold = this.processPriceThreshold(indexPrice, pricesSlippage);
1294
+ let allowTrade = ALLOW_TRADE_MUST_TRADE;
1295
+ if (isTriggerOrder) {
1296
+ allowTrade = isIocOrder || !isTakeProfitOrder ? ALLOW_TRADE_NO_TRADE : ALLOW_TRADE_CAN_TRADE;
1297
+ }
1298
+ else {
1299
+ isTakeProfitOrder = true;
1300
+ }
1301
+ // Handle oracle initialization and coin processing
1302
+ let suiCoinObject;
1303
+ if (sponsoredTx) {
1304
+ suiCoinObject = this.processCoins(tx, 'sui', suiCoinObjectsForPythUpdate || [], true);
1305
+ tx = await this.initOracleTxb([collateralToken, indexToken], tx, true, suiCoinObject);
1306
+ }
1307
+ else {
1308
+ tx = await this.initOracleTxb([collateralToken, indexToken], tx);
1309
+ }
1310
+ // Process coin splitting
1311
+ const [feeObject] = this.processCoinSplitting(tx, collateralToken, coinObjects, [tx.pure.u64(relayerFee)], sponsoredTx, suiCoinObject);
1312
+ tx.moveCall({
1313
+ target: `${this.consts.zoCore.upgradedPackage}::market::decrease_position_v2`,
1314
+ typeArguments: [
1315
+ `${this.consts.zoCore.package}::usdz::USDZ`,
1316
+ this.consts.coins[collateralToken].module,
1317
+ this.consts.coins[indexToken].module,
1318
+ `${this.consts.zoCore.package}::market::${long ? 'LONG' : 'SHORT'}`,
1319
+ this.consts.coins[collateralToken].module,
1320
+ ],
1321
+ arguments: [
1322
+ tx.object(SUI_CLOCK_OBJECT_ID),
1323
+ tx.object(this.consts.zoCore.market),
1324
+ tx.object(pcpId),
1325
+ tx.object(this.consts.pythFeeder.feeder[collateralToken]),
1326
+ tx.object(this.consts.pythFeeder.feeder[indexToken]),
1327
+ feeObject,
1328
+ tx.pure.u8(allowTrade),
1329
+ tx.pure.bool(isTakeProfitOrder),
1330
+ tx.pure.u64(amount),
1331
+ tx.pure.u256(adjustCollateralPrice),
1332
+ tx.pure.u256(adjustPrice),
1333
+ tx.pure.u256(indexPriceThreshold),
1334
+ ],
1335
+ });
1336
+ return tx;
1337
+ }
1338
+ async decreaseMultiPositions(positions, tx, sponsoredTx, suiCoinObjectsForPythUpdate) {
1339
+ if (!tx) {
1340
+ tx = new Transaction();
1341
+ }
1342
+ // Handle oracle initialization and coin processing
1343
+ let suiCoinObject;
1344
+ if (sponsoredTx) {
1345
+ suiCoinObject = this.processCoins(tx, 'sui', suiCoinObjectsForPythUpdate || [], true);
1346
+ tx = await this.initOracleTxb(positions.flatMap(position => [position.collateralToken, position.indexToken]), tx, true, suiCoinObject);
1347
+ }
1348
+ else {
1349
+ tx = await this.initOracleTxb(positions.flatMap(position => [position.collateralToken, position.indexToken]), tx);
1350
+ }
1351
+ for (const position of positions) {
1352
+ const { pcpId, collateralToken, coinObjects = [], indexToken, amount, long, indexPrice, collateralPrice, isTriggerOrder = false, isTakeProfitOrder = true, isIocOrder = false, pricesSlippage = 0.003, collateralSlippage = 0.5, relayerFee = BigInt(0.5), } = position;
1353
+ let innerIsTakeProfitOrder = isTakeProfitOrder;
1354
+ const symbol = joinSymbol(long ? 'long' : 'short', indexToken);
1355
+ const adjustPrice = this.processSlippage(indexPrice, !long, isTriggerOrder ? 0 : pricesSlippage);
1356
+ const adjustCollateralPrice = this.processSlippage(collateralPrice, false, collateralSlippage);
1357
+ let allowTrade = ALLOW_TRADE_MUST_TRADE;
1358
+ if (isTriggerOrder) {
1359
+ allowTrade = isIocOrder || !innerIsTakeProfitOrder ? ALLOW_TRADE_NO_TRADE : ALLOW_TRADE_CAN_TRADE;
1360
+ }
1361
+ else {
1362
+ innerIsTakeProfitOrder = true;
1363
+ }
1364
+ // Process coin splitting
1365
+ const [feeObject] = this.processCoinSplitting(tx, collateralToken, coinObjects, [tx.pure.u64(relayerFee)], sponsoredTx, suiCoinObject);
1366
+ tx.moveCall({
1367
+ target: `${this.consts.zoCore.upgradedPackage}::market::decrease_position`,
1368
+ typeArguments: [
1369
+ `${this.consts.zoCore.package}::usdz::USDZ`,
1370
+ this.consts.coins[collateralToken].module,
1371
+ this.consts.coins[indexToken].module,
1372
+ `${this.consts.zoCore.package}::market::${long ? 'LONG' : 'SHORT'}`,
1373
+ this.consts.coins[collateralToken].module,
1374
+ ],
1375
+ arguments: [
1376
+ tx.object(SUI_CLOCK_OBJECT_ID),
1377
+ tx.object(this.consts.zoCore.market),
1378
+ tx.object(pcpId),
1379
+ tx.object(this.consts.zoCore.vaults[collateralToken].reservingFeeModel),
1380
+ tx.object(this.consts.zoCore.symbols[symbol].fundingFeeModel),
1381
+ tx.object(this.consts.pythFeeder.feeder[collateralToken]),
1382
+ tx.object(this.consts.pythFeeder.feeder[indexToken]),
1383
+ feeObject,
1384
+ tx.pure.u8(allowTrade),
1385
+ tx.pure.bool(innerIsTakeProfitOrder),
1386
+ tx.pure.u64(amount),
1387
+ tx.pure.u256(adjustCollateralPrice),
1388
+ tx.pure.u256(adjustPrice),
1389
+ ],
1390
+ });
1391
+ }
1392
+ return tx;
1393
+ }
1394
+ async decreaseMultiPositionsV2(positions, tx, sponsoredTx, suiCoinObjectsForPythUpdate, feeObjects) {
1395
+ const transaction = tx ?? new Transaction();
1396
+ // Handle oracle initialization and coin processing
1397
+ const tokens = positions.flatMap(position => [position.collateralToken, position.indexToken]);
1398
+ const suiCoinObject = sponsoredTx
1399
+ ? this.processCoins(transaction, 'sui', suiCoinObjectsForPythUpdate || [], true)
1400
+ : undefined;
1401
+ await this.initOracleTxb(tokens, transaction, !!sponsoredTx, suiCoinObject);
1402
+ if (!feeObjects || feeObjects.length !== positions.length) {
1403
+ throw new Error('feeObjects must be provided (pre-processed via buildFeeCoinObjects) and match positions length');
1404
+ }
1405
+ for (const [i, position] of positions.entries()) {
1406
+ const feeObject = feeObjects[i];
1407
+ const { pcpId, collateralToken, indexToken, amount, long, indexPrice, collateralPrice, isTriggerOrder = false, isTakeProfitOrder = true, isIocOrder = false, pricesSlippage = 0.003, collateralSlippage = 0.5, } = position;
1408
+ let innerIsTakeProfitOrder = isTakeProfitOrder;
1409
+ const adjustPrice = this.processSlippage(indexPrice, !long, isTriggerOrder ? 0 : pricesSlippage);
1410
+ const adjustCollateralPrice = this.processSlippage(collateralPrice, false, collateralSlippage);
1411
+ const indexPriceThreshold = this.processPriceThreshold(indexPrice, pricesSlippage);
1412
+ let allowTrade = ALLOW_TRADE_MUST_TRADE;
1413
+ if (isTriggerOrder) {
1414
+ allowTrade = isIocOrder || !innerIsTakeProfitOrder ? ALLOW_TRADE_NO_TRADE : ALLOW_TRADE_CAN_TRADE;
1415
+ }
1416
+ else {
1417
+ innerIsTakeProfitOrder = true;
1418
+ }
1419
+ transaction.moveCall({
1420
+ target: `${this.consts.zoCore.upgradedPackage}::market::decrease_position_v2`,
1421
+ typeArguments: [
1422
+ `${this.consts.zoCore.package}::usdz::USDZ`,
1423
+ this.consts.coins[collateralToken].module,
1424
+ this.consts.coins[indexToken].module,
1425
+ `${this.consts.zoCore.package}::market::${long ? 'LONG' : 'SHORT'}`,
1426
+ this.consts.coins[collateralToken].module,
1427
+ ],
1428
+ arguments: [
1429
+ transaction.object(SUI_CLOCK_OBJECT_ID),
1430
+ transaction.object(this.consts.zoCore.market),
1431
+ transaction.object(pcpId),
1432
+ transaction.object(this.consts.pythFeeder.feeder[collateralToken]),
1433
+ transaction.object(this.consts.pythFeeder.feeder[indexToken]),
1434
+ feeObject,
1435
+ transaction.pure.u8(allowTrade),
1436
+ transaction.pure.bool(innerIsTakeProfitOrder),
1437
+ transaction.pure.u64(amount),
1438
+ transaction.pure.u256(adjustCollateralPrice),
1439
+ transaction.pure.u256(adjustPrice),
1440
+ transaction.pure.u256(indexPriceThreshold),
1441
+ ],
1442
+ });
1443
+ }
1444
+ return transaction;
1445
+ }
1446
+ /**
1447
+ * Pledges in position (USDZ-specific functionality)
1448
+ */
1449
+ async pledgeInPosition(pcpId, collateralToken, indexToken, amount, coinObjects, long, sponsoredTx, suiCoinObjectsForPythUpdate) {
1450
+ let tx = new Transaction();
1451
+ // Handle oracle initialization and coin processing
1452
+ let suiCoinObject;
1453
+ if (sponsoredTx) {
1454
+ suiCoinObject = this.processCoins(tx, 'sui', suiCoinObjectsForPythUpdate || [], true);
1455
+ tx = await this.initOracleTxb([collateralToken, indexToken], tx, true, suiCoinObject);
1456
+ }
1457
+ else {
1458
+ tx = await this.initOracleTxb([collateralToken, indexToken], tx);
1459
+ }
1460
+ // Process coin splitting
1461
+ const [depositObject] = this.processCoinSplitting(tx, collateralToken, coinObjects, [tx.pure.u64(amount)], sponsoredTx, suiCoinObject);
1462
+ tx.moveCall({
1463
+ target: `${this.consts.zoCore.upgradedPackage}::market::pledge_in_position`,
1464
+ typeArguments: [
1465
+ `${this.consts.zoCore.package}::usdz::USDZ`,
1466
+ this.consts.coins[collateralToken].module,
1467
+ this.consts.coins[indexToken].module,
1468
+ `${this.consts.zoCore.package}::market::${long ? 'LONG' : 'SHORT'}`,
1469
+ ],
1470
+ arguments: [tx.object(this.consts.zoCore.market), tx.object(pcpId), depositObject],
1471
+ });
1472
+ return tx;
1473
+ }
1474
+ async redeemFromPosition(pcpId, collateralToken, indexToken, amount, long, sponsoredTx, suiCoinObjectsForPythUpdate) {
1475
+ let tx = new Transaction();
1476
+ // Handle oracle initialization and coin processing
1477
+ let suiCoinObject;
1478
+ if (sponsoredTx) {
1479
+ suiCoinObject = this.processCoins(tx, 'sui', suiCoinObjectsForPythUpdate || [], true);
1480
+ tx = await this.initOracleTxb([collateralToken, indexToken], tx, true, suiCoinObject);
1481
+ }
1482
+ else {
1483
+ tx = await this.initOracleTxb([collateralToken, indexToken], tx);
1484
+ }
1485
+ const symbol = joinSymbol(long ? 'long' : 'short', indexToken);
1486
+ tx.moveCall({
1487
+ target: `${this.consts.zoCore.upgradedPackage}::market::redeem_from_position`,
1488
+ typeArguments: [
1489
+ `${this.consts.zoCore.package}::usdz::USDZ`,
1490
+ this.consts.coins[collateralToken].module,
1491
+ this.consts.coins[indexToken].module,
1492
+ `${this.consts.zoCore.package}::market::${long ? 'LONG' : 'SHORT'}`,
1493
+ ],
1494
+ arguments: [
1495
+ tx.object(SUI_CLOCK_OBJECT_ID),
1496
+ tx.object(this.consts.zoCore.market),
1497
+ tx.object(pcpId),
1498
+ tx.object(this.consts.zoCore.vaults[collateralToken].reservingFeeModel),
1499
+ tx.object(this.consts.zoCore.symbols[symbol].fundingFeeModel),
1500
+ tx.object(this.consts.pythFeeder.feeder[collateralToken]),
1501
+ tx.object(this.consts.pythFeeder.feeder[indexToken]),
1502
+ tx.pure.u64(amount),
1503
+ ],
1504
+ });
1505
+ return tx;
1506
+ }
1507
+ cancelOrder(orderCapId, collateralToken, indexToken, long, type, isV11Order) {
1508
+ const tx = new Transaction();
1509
+ let functionName = '';
1510
+ switch (type) {
1511
+ case 'OPEN_POSITION': {
1512
+ functionName = isV11Order ? 'clear_open_position_order' : 'clear_open_position_order';
1513
+ break;
1514
+ }
1515
+ case 'OPEN_MARKET': {
1516
+ functionName = 'clear_open_market_order';
1517
+ break;
1518
+ }
1519
+ case 'DECREASE_POSITION': {
1520
+ functionName = isV11Order
1521
+ ? 'clear_decrease_position_order'
1522
+ : 'clear_decrease_position_order';
1523
+ break;
1524
+ }
1525
+ case 'DECREASE_MARKET': {
1526
+ functionName = 'clear_decrease_market_order';
1527
+ break;
1528
+ }
1529
+ default: {
1530
+ throw new Error('invalid order type');
1531
+ }
1532
+ }
1533
+ tx.moveCall({
1534
+ target: `${this.consts.zoCore.upgradedPackage}::market::${functionName}`,
1535
+ typeArguments: [
1536
+ `${this.consts.zoCore.package}::usdz::USDZ`,
1537
+ this.consts.coins[collateralToken].module,
1538
+ this.consts.coins[indexToken].module,
1539
+ `${this.consts.zoCore.package}::market::${long ? 'LONG' : 'SHORT'}`,
1540
+ this.consts.coins[collateralToken].module,
1541
+ ],
1542
+ arguments: [tx.object(this.consts.zoCore.market), tx.object(orderCapId)],
1543
+ });
1544
+ return tx;
1545
+ }
1546
+ cancelMultiOrders(orders, tx) {
1547
+ if (!tx) {
1548
+ tx = new Transaction();
1549
+ }
1550
+ for (const order of orders) {
1551
+ const { orderCapId, collateralToken, indexToken, long, type, isV11Order } = order;
1552
+ let functionName = '';
1553
+ switch (type) {
1554
+ case 'OPEN_POSITION': {
1555
+ functionName = isV11Order ? 'clear_open_position_order' : 'clear_open_position_order';
1556
+ break;
1557
+ }
1558
+ case 'OPEN_MARKET': {
1559
+ functionName = 'clear_open_market_order';
1560
+ break;
1561
+ }
1562
+ case 'DECREASE_POSITION': {
1563
+ functionName = isV11Order
1564
+ ? 'clear_decrease_position_order'
1565
+ : 'clear_decrease_position_order';
1566
+ break;
1567
+ }
1568
+ case 'DECREASE_MARKET': {
1569
+ functionName = 'clear_decrease_market_order';
1570
+ break;
1571
+ }
1572
+ default: {
1573
+ throw new Error('invalid order type');
1574
+ }
1575
+ }
1576
+ tx.moveCall({
1577
+ target: `${this.consts.zoCore.upgradedPackage}::market::${functionName}`,
1578
+ typeArguments: [
1579
+ `${this.consts.zoCore.package}::usdz::USDZ`,
1580
+ this.consts.coins[collateralToken].module,
1581
+ this.consts.coins[indexToken].module,
1582
+ `${this.consts.zoCore.package}::market::${long ? 'LONG' : 'SHORT'}`,
1583
+ this.consts.coins[collateralToken].module,
1584
+ ],
1585
+ arguments: [tx.object(this.consts.zoCore.market), tx.object(orderCapId)],
1586
+ });
1587
+ }
1588
+ return tx;
1589
+ }
1590
+ addReferral(referralAddress, tx) {
1591
+ if (!tx) {
1592
+ tx = new Transaction();
1593
+ }
1594
+ tx.moveCall({
1595
+ target: `${this.consts.zoCore.upgradedPackage}::market::add_new_referral`,
1596
+ typeArguments: [`${this.consts.zoCore.package}::usdz::USDZ`],
1597
+ arguments: [tx.object(this.consts.zoCore.market), tx.pure.address(referralAddress)],
1598
+ });
1599
+ return tx;
1600
+ }
1601
+ async adminUpdatePriceFeed(collateralToken, indexToken) {
1602
+ const tx = await this.initOracleTxb([collateralToken, indexToken]);
1603
+ return tx;
1604
+ }
1605
+ adminSettlePosition(positionId, owner, collateralToken, indexToken, long) {
1606
+ const tx = new Transaction();
1607
+ tx.moveCall({
1608
+ target: `${this.consts.zoCore.upgradedPackage}::market::force_settle_position`,
1609
+ typeArguments: [
1610
+ `${this.consts.zoCore.package}::usdz::USDZ`,
1611
+ this.consts.coins[collateralToken].module,
1612
+ this.consts.coins[indexToken].module,
1613
+ `${this.consts.zoCore.package}::market::${long ? 'LONG' : 'SHORT'}`,
1614
+ ],
1615
+ arguments: [
1616
+ tx.object(this.consts.zoCore.adminCap),
1617
+ tx.object(SUI_CLOCK_OBJECT_ID),
1618
+ tx.object(this.consts.zoCore.market),
1619
+ tx.object(owner),
1620
+ tx.object(positionId),
1621
+ ],
1622
+ });
1623
+ this.adminClearClosedPosition(positionId, owner, collateralToken, indexToken, long, tx);
1624
+ return tx;
1625
+ }
1626
+ adminDecreasePosition(positionId, owner, collateralToken, indexToken, positionAmount, amount, long) {
1627
+ const tx = new Transaction();
1628
+ const symbol = joinSymbol(long ? 'long' : 'short', indexToken);
1629
+ tx.moveCall({
1630
+ target: `${this.consts.zoCore.upgradedPackage}::market::force_close_position`,
1631
+ typeArguments: [
1632
+ `${this.consts.zoCore.package}::usdz::USDZ`,
1633
+ this.consts.coins[collateralToken].module,
1634
+ this.consts.coins[indexToken].module,
1635
+ `${this.consts.zoCore.package}::market::${long ? 'LONG' : 'SHORT'}`,
1636
+ ],
1637
+ arguments: [
1638
+ tx.object(this.consts.zoCore.adminCap),
1639
+ tx.object(SUI_CLOCK_OBJECT_ID),
1640
+ tx.object(this.consts.zoCore.market),
1641
+ tx.object(this.consts.zoCore.vaults[collateralToken].reservingFeeModel),
1642
+ tx.object(this.consts.zoCore.symbols[symbol].fundingFeeModel),
1643
+ tx.object(this.consts.pythFeeder.feeder[collateralToken]),
1644
+ tx.object(this.consts.pythFeeder.feeder[indexToken]),
1645
+ tx.object(owner),
1646
+ tx.object(positionId),
1647
+ ],
1648
+ });
1649
+ if (amount === BigInt(positionAmount)) {
1650
+ this.adminClearClosedPosition(positionId, owner, collateralToken, indexToken, long, tx);
1651
+ }
1652
+ return tx;
1653
+ }
1654
+ adminClearClosedPosition(positionId, owner, collateralToken, indexToken, long, tx) {
1655
+ tx.moveCall({
1656
+ target: `${this.consts.zoCore.upgradedPackage}::market::force_clear_closed_position`,
1657
+ typeArguments: [
1658
+ `${this.consts.zoCore.package}::usdz::USDZ`,
1659
+ this.consts.coins[collateralToken].module,
1660
+ this.consts.coins[indexToken].module,
1661
+ `${this.consts.zoCore.package}::market::${long ? 'LONG' : 'SHORT'}`,
1662
+ ],
1663
+ arguments: [
1664
+ tx.object(this.consts.zoCore.adminCap),
1665
+ tx.object(this.consts.zoCore.market),
1666
+ tx.object(positionId),
1667
+ tx.object(owner),
1668
+ ],
1669
+ });
1670
+ }
1671
+ }
1672
+ //# sourceMappingURL=USDZAPI.mjs.map