@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,906 @@
1
+ "use strict";
2
+ /**
3
+ * ZBTCVC API implementation
4
+ * Implements ZBTCVC-specific trading and transaction methods
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.ZBTCVCAPI = void 0;
8
+ const kiosk_1 = require("@mysten/kiosk");
9
+ const transactions_1 = require("@mysten/sui/transactions");
10
+ const utils_1 = require("@mysten/sui/utils");
11
+ const abstract_1 = require("../abstract/index.cjs");
12
+ const consts_1 = require("../consts/index.cjs");
13
+ const utils_2 = require("../utils.cjs");
14
+ const ZBTCVCDataAPI_1 = require("./ZBTCVCDataAPI.cjs");
15
+ class ZBTCVCAPI extends abstract_1.BaseAPI {
16
+ constructor(network, provider, apiEndpoint, connectionURL) {
17
+ super(network, provider, apiEndpoint, connectionURL, consts_1.LPToken.ZBTCVC);
18
+ this.dataAPI = new ZBTCVCDataAPI_1.ZBTCVCDataAPI(network, provider, apiEndpoint, connectionURL);
19
+ }
20
+ calcPositionReserveFeeAmount(_position) {
21
+ throw new Error(`Method not implemented in ${this.constructor.name}.`);
22
+ }
23
+ calcPositionFundingFeeValue(_position) {
24
+ throw new Error(`Method not implemented in ${this.constructor.name}.`);
25
+ }
26
+ clearClosedPosition(pcpId, collateralToken, indexToken, long, tx) {
27
+ tx.moveCall({
28
+ target: `${this.consts.zoCore.upgradedPackage}::market::clear_closed_position`,
29
+ typeArguments: [
30
+ `${this.consts.zoCore.package}::zbtcvc::ZBTCVC`,
31
+ this.consts.coins[collateralToken].module,
32
+ this.consts.coins[indexToken].module,
33
+ `${this.consts.zoCore.package}::market::${long ? 'LONG' : 'SHORT'}`,
34
+ ],
35
+ arguments: [tx.object(this.consts.zoCore.market), tx.object(pcpId)],
36
+ });
37
+ }
38
+ clearOpenPositionOrder(orderCapId, collateralToken, indexToken, long, tx, isV11Order) {
39
+ const funcName = isV11Order ? 'clear_open_position_order' : 'clear_open_position_order';
40
+ tx.moveCall({
41
+ target: `${this.consts.zoCore.upgradedPackage}::market::${funcName}`,
42
+ typeArguments: [
43
+ `${this.consts.zoCore.package}::zbtcvc::ZBTCVC`,
44
+ this.consts.coins[collateralToken].module,
45
+ this.consts.coins[indexToken].module,
46
+ `${this.consts.zoCore.package}::market::${long ? 'LONG' : 'SHORT'}`,
47
+ this.consts.coins[collateralToken].module,
48
+ ],
49
+ arguments: [tx.object(this.consts.zoCore.market), tx.object(orderCapId)],
50
+ });
51
+ }
52
+ clearDecreasePositionOrder(orderCapId, collateralToken, indexToken, long, tx, isV11Order) {
53
+ const funcName = isV11Order ? 'clear_decrease_position_order' : 'clear_decrease_position_order';
54
+ tx.moveCall({
55
+ target: `${this.consts.zoCore.upgradedPackage}::market::${funcName}`,
56
+ typeArguments: [
57
+ `${this.consts.zoCore.package}::zbtcvc::ZBTCVC`,
58
+ this.consts.coins[collateralToken].module,
59
+ this.consts.coins[indexToken].module,
60
+ `${this.consts.zoCore.package}::market::${long ? 'LONG' : 'SHORT'}`,
61
+ this.consts.coins[collateralToken].module,
62
+ ],
63
+ arguments: [tx.object(this.consts.zoCore.market), tx.object(orderCapId)],
64
+ });
65
+ }
66
+ 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) {
67
+ let tx = new transactions_1.Transaction();
68
+ if (referralAddress && !(await this.dataAPI.hasReferral(sender || ''))) {
69
+ tx = await this.addReferral(referralAddress, tx);
70
+ }
71
+ const symbol = (0, utils_2.joinSymbol)(long ? 'long' : 'short', indexToken);
72
+ const adjustPrice = this.processSlippage(indexPrice, long, isLimitOrder ? 0 : pricesSlippage);
73
+ const adjustCollateralPrice = this.processSlippage(collateralPrice, false, collateralSlippage);
74
+ let allowTrade = consts_1.ALLOW_TRADE_MUST_TRADE;
75
+ if (isLimitOrder) {
76
+ allowTrade = isIocOrder ? consts_1.ALLOW_TRADE_NO_TRADE : consts_1.ALLOW_TRADE_CAN_TRADE;
77
+ }
78
+ const kioskTx = new kiosk_1.KioskTransaction({
79
+ transaction: tx,
80
+ kioskClient,
81
+ cap: kioskCap,
82
+ });
83
+ const [sudoCard, promise] = kioskTx.borrow({
84
+ itemType: `0xe7e651e4974fe367aa2837712d68081efb299c470242a15e2b9c26ea326159ec::card::SudoCard`,
85
+ itemId: scard,
86
+ });
87
+ // Handle oracle initialization and coin processing
88
+ let suiCoinObject;
89
+ if (sponsoredTx) {
90
+ suiCoinObject = this.processCoins(tx, 'sui', suiCoinObjectsForPythUpdate || [], true);
91
+ tx = await this.initOracleTxb([collateralToken, indexToken], tx, true, suiCoinObject);
92
+ }
93
+ else {
94
+ tx = await this.initOracleTxb([collateralToken, indexToken], tx);
95
+ }
96
+ // Process coin splitting
97
+ const [depositObject, feeObject] = this.processCoinSplitting(tx, collateralToken, coinObjects, [tx.pure.u64(collateralAmount), tx.pure.u64(relayerFee)], sponsoredTx, suiCoinObject);
98
+ tx.moveCall({
99
+ target: `${this.consts.zoCore.upgradedPackage}::market::open_position_with_scard`,
100
+ typeArguments: [
101
+ `${this.consts.zoCore.package}::zbtcvc::ZBTCVC`,
102
+ this.consts.coins[collateralToken].module,
103
+ this.consts.coins[indexToken].module,
104
+ `${this.consts.zoCore.package}::market::${long ? 'LONG' : 'SHORT'}`,
105
+ this.consts.coins[collateralToken].module,
106
+ ],
107
+ arguments: [
108
+ tx.object(utils_1.SUI_CLOCK_OBJECT_ID),
109
+ tx.object(this.consts.zoCore.market),
110
+ tx.object(this.consts.zoCore.vaults[collateralToken].reservingFeeModel),
111
+ tx.object(this.consts.zoCore.symbols[symbol].fundingFeeModel),
112
+ tx.object(this.consts.zoCore.symbols[symbol].positionConfig),
113
+ tx.object(this.consts.pythFeeder.feeder[collateralToken]),
114
+ tx.object(this.consts.pythFeeder.feeder[indexToken]),
115
+ depositObject,
116
+ feeObject,
117
+ tx.pure.u8(allowTrade),
118
+ tx.pure.u64(size),
119
+ tx.pure.u64(reserveAmount),
120
+ tx.pure.u256(adjustCollateralPrice),
121
+ tx.pure.u256(adjustPrice),
122
+ sudoCard,
123
+ ],
124
+ });
125
+ kioskTx
126
+ .return({
127
+ itemType: `0xe7e651e4974fe367aa2837712d68081efb299c470242a15e2b9c26ea326159ec::card::SudoCard`,
128
+ item: sudoCard,
129
+ promise,
130
+ })
131
+ .finalize();
132
+ return tx;
133
+ }
134
+ 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) {
135
+ if (!coinObjects) {
136
+ throw new Error(`${this.constructor.name}: coinObjects is required`);
137
+ }
138
+ let tx = new transactions_1.Transaction();
139
+ const kioskTx = new kiosk_1.KioskTransaction({
140
+ transaction: tx,
141
+ kioskClient,
142
+ cap: kioskCap,
143
+ });
144
+ const [sudoCard, promise] = kioskTx.borrow({
145
+ itemType: `0xe7e651e4974fe367aa2837712d68081efb299c470242a15e2b9c26ea326159ec::card::SudoCard`,
146
+ itemId: scard,
147
+ });
148
+ const symbol = (0, utils_2.joinSymbol)(long ? 'long' : 'short', indexToken);
149
+ const adjustPrice = this.processSlippage(indexPrice, !long, isTriggerOrder ? 0 : pricesSlippage);
150
+ const adjustCollateralPrice = this.processSlippage(collateralPrice, false, collateralSlippage);
151
+ let allowTrade = consts_1.ALLOW_TRADE_MUST_TRADE;
152
+ if (isTriggerOrder) {
153
+ allowTrade = isIocOrder || !isTakeProfitOrder ? consts_1.ALLOW_TRADE_NO_TRADE : consts_1.ALLOW_TRADE_CAN_TRADE;
154
+ }
155
+ else {
156
+ isTakeProfitOrder = true;
157
+ }
158
+ // Handle oracle initialization and coin processing
159
+ let suiCoinObject;
160
+ if (sponsoredTx) {
161
+ suiCoinObject = this.processCoins(tx, 'sui', suiCoinObjectsForPythUpdate || [], true);
162
+ tx = await this.initOracleTxb([collateralToken, indexToken], tx, true, suiCoinObject);
163
+ }
164
+ else {
165
+ tx = await this.initOracleTxb([collateralToken, indexToken], tx);
166
+ }
167
+ // Process coin splitting
168
+ const [feeObject] = this.processCoinSplitting(tx, collateralToken, coinObjects, [tx.pure.u64(relayerFee)], sponsoredTx, suiCoinObject);
169
+ tx.moveCall({
170
+ target: `${this.consts.zoCore.upgradedPackage}::market::decrease_position_with_scard`,
171
+ typeArguments: [
172
+ `${this.consts.zoCore.package}::zbtcvc::ZBTCVC`,
173
+ this.consts.coins[collateralToken].module,
174
+ this.consts.coins[indexToken].module,
175
+ `${this.consts.zoCore.package}::market::${long ? 'LONG' : 'SHORT'}`,
176
+ this.consts.coins[collateralToken].module,
177
+ ],
178
+ arguments: [
179
+ tx.object(utils_1.SUI_CLOCK_OBJECT_ID),
180
+ tx.object(this.consts.zoCore.market),
181
+ tx.object(pcpId),
182
+ tx.object(this.consts.zoCore.vaults[collateralToken].reservingFeeModel),
183
+ tx.object(this.consts.zoCore.symbols[symbol].fundingFeeModel),
184
+ tx.object(this.consts.pythFeeder.feeder[collateralToken]),
185
+ tx.object(this.consts.pythFeeder.feeder[indexToken]),
186
+ feeObject,
187
+ tx.pure.u8(allowTrade),
188
+ tx.pure.bool(isTakeProfitOrder),
189
+ tx.pure.u64(amount),
190
+ tx.pure.u256(adjustCollateralPrice),
191
+ tx.pure.u256(adjustPrice),
192
+ sudoCard,
193
+ ],
194
+ });
195
+ kioskTx
196
+ .return({
197
+ itemType: `0xe7e651e4974fe367aa2837712d68081efb299c470242a15e2b9c26ea326159ec::card::SudoCard`,
198
+ item: sudoCard,
199
+ promise,
200
+ })
201
+ .finalize();
202
+ return tx;
203
+ }
204
+ async decreaseMultiPositionsWithSCard(positions, kioskClient, kioskCap, scard, tx, sponsoredTx, suiCoinObjectsForPythUpdate) {
205
+ if (!tx) {
206
+ tx = new transactions_1.Transaction();
207
+ }
208
+ // Handle oracle initialization and coin processing
209
+ let suiCoinObject;
210
+ if (sponsoredTx) {
211
+ suiCoinObject = this.processCoins(tx, 'sui', suiCoinObjectsForPythUpdate || [], true);
212
+ tx = await this.initOracleTxb(positions.flatMap(position => [position.collateralToken, position.indexToken]), tx, true, suiCoinObject);
213
+ }
214
+ else {
215
+ tx = await this.initOracleTxb(positions.flatMap(position => [position.collateralToken, position.indexToken]), tx);
216
+ }
217
+ const kioskTx = new kiosk_1.KioskTransaction({
218
+ transaction: tx,
219
+ kioskClient,
220
+ cap: kioskCap,
221
+ });
222
+ const [sudoCard, promise] = kioskTx.borrow({
223
+ itemType: `0xe7e651e4974fe367aa2837712d68081efb299c470242a15e2b9c26ea326159ec::card::SudoCard`,
224
+ itemId: scard,
225
+ });
226
+ for (const position of positions) {
227
+ 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;
228
+ let innerIsTakeProfitOrder = isTakeProfitOrder;
229
+ const symbol = (0, utils_2.joinSymbol)(long ? 'long' : 'short', indexToken);
230
+ const adjustPrice = this.processSlippage(indexPrice, !long, isTriggerOrder ? 0 : pricesSlippage);
231
+ const adjustCollateralPrice = this.processSlippage(collateralPrice, false, collateralSlippage);
232
+ let allowTrade = consts_1.ALLOW_TRADE_MUST_TRADE;
233
+ if (isTriggerOrder) {
234
+ allowTrade = isIocOrder || !innerIsTakeProfitOrder ? consts_1.ALLOW_TRADE_NO_TRADE : consts_1.ALLOW_TRADE_CAN_TRADE;
235
+ }
236
+ else {
237
+ innerIsTakeProfitOrder = true;
238
+ }
239
+ // Process coin splitting
240
+ const [feeObject] = this.processCoinSplitting(tx, collateralToken, coinObjects, [tx.pure.u64(relayerFee)], sponsoredTx, suiCoinObject);
241
+ tx.moveCall({
242
+ target: `${this.consts.zoCore.upgradedPackage}::market::decrease_position_with_scard`,
243
+ typeArguments: [
244
+ `${this.consts.zoCore.package}::zbtcvc::ZBTCVC`,
245
+ this.consts.coins[collateralToken].module,
246
+ this.consts.coins[indexToken].module,
247
+ `${this.consts.zoCore.package}::market::${long ? 'LONG' : 'SHORT'}`,
248
+ this.consts.coins[collateralToken].module,
249
+ ],
250
+ arguments: [
251
+ tx.object(utils_1.SUI_CLOCK_OBJECT_ID),
252
+ tx.object(this.consts.zoCore.market),
253
+ tx.object(pcpId),
254
+ tx.object(this.consts.zoCore.vaults[collateralToken].reservingFeeModel),
255
+ tx.object(this.consts.zoCore.symbols[symbol].fundingFeeModel),
256
+ tx.object(this.consts.pythFeeder.feeder[collateralToken]),
257
+ tx.object(this.consts.pythFeeder.feeder[indexToken]),
258
+ feeObject,
259
+ tx.pure.u8(allowTrade),
260
+ tx.pure.bool(innerIsTakeProfitOrder),
261
+ tx.pure.u64(amount),
262
+ tx.pure.u256(adjustCollateralPrice),
263
+ tx.pure.u256(adjustPrice),
264
+ sudoCard,
265
+ ],
266
+ });
267
+ }
268
+ kioskTx
269
+ .return({
270
+ itemType: `0xe7e651e4974fe367aa2837712d68081efb299c470242a15e2b9c26ea326159ec::card::SudoCard`,
271
+ item: sudoCard,
272
+ promise,
273
+ })
274
+ .finalize();
275
+ return tx;
276
+ }
277
+ /**
278
+ * Deposits collateral into ZBTCVC vault
279
+ */
280
+ async deposit(coin, coinObjects, amount, minAmountOut = 0, referralAddress, sender, sponsoredTx, suiCoinObjectsForPythUpdate) {
281
+ let tx = new transactions_1.Transaction();
282
+ // Add referral if needed
283
+ if (referralAddress && !(await this.dataAPI.hasReferral(sender || ''))) {
284
+ tx = await this.addReferral(referralAddress, tx);
285
+ }
286
+ // Initialize oracle transaction
287
+ const pythFeederKeys = Object.keys(this.consts.pythFeeder.feeder);
288
+ // Handle sponsored transaction case
289
+ if (sponsoredTx) {
290
+ const suiCoinObject = this.processCoins(tx, 'sui', suiCoinObjectsForPythUpdate || [], true);
291
+ tx = await this.initOracleTxb(pythFeederKeys, tx, true, suiCoinObject);
292
+ // Process deposit coins
293
+ const depositObject = coin === 'sui'
294
+ ? tx.splitCoins(suiCoinObject, [tx.pure.u64(amount)])[0]
295
+ : tx.splitCoins(this.processCoins(tx, coin, coinObjects, true), [tx.pure.u64(amount)])[0];
296
+ const { vaultsValuation, symbolsValuation } = this.dataAPI.valuate(tx);
297
+ tx.moveCall({
298
+ target: `${this.consts.zoCore.upgradedPackage}::market::deposit`,
299
+ typeArguments: [`${this.consts.zoCore.package}::zbtcvc::ZBTCVC`, this.consts.coins[coin].module],
300
+ arguments: [
301
+ tx.object(this.consts.zoCore.market),
302
+ tx.object(this.consts.zoCore.rebaseFeeModel),
303
+ depositObject,
304
+ tx.pure.u64(minAmountOut),
305
+ vaultsValuation,
306
+ symbolsValuation,
307
+ ],
308
+ });
309
+ return tx;
310
+ }
311
+ // Handle non-sponsored transaction case
312
+ tx = await this.initOracleTxb(pythFeederKeys, tx);
313
+ const depositObject = tx.splitCoins(this.processCoins(tx, coin, coinObjects, false), [tx.pure.u64(amount)])[0];
314
+ const { vaultsValuation, symbolsValuation } = this.dataAPI.valuate(tx);
315
+ tx.moveCall({
316
+ target: `${this.consts.zoCore.upgradedPackage}::market::deposit`,
317
+ typeArguments: [
318
+ `${this.consts.zoCore.package}::zbtcvc::ZBTCVC`,
319
+ this.consts.coins[coin].module,
320
+ ],
321
+ arguments: [
322
+ tx.object(this.consts.zoCore.market),
323
+ tx.object(this.consts.zoCore.rebaseFeeModel),
324
+ depositObject,
325
+ tx.pure.u64(minAmountOut),
326
+ vaultsValuation,
327
+ symbolsValuation,
328
+ ],
329
+ });
330
+ return tx;
331
+ }
332
+ /**
333
+ * Deposits collateral into ZBTCVC vault
334
+ */
335
+ async depositPtb(coin, coinObjects, amount, minAmountOut = 0, referralAddress, sender, tx, sponsoredTx, suiCoinObjectsForPythUpdate) {
336
+ if (!tx) {
337
+ tx = new transactions_1.Transaction();
338
+ }
339
+ // Add referral if needed
340
+ if (referralAddress && !(await this.dataAPI.hasReferral(sender || ''))) {
341
+ tx = await this.addReferral(referralAddress, tx);
342
+ }
343
+ // Initialize oracle transaction
344
+ const pythFeederKeys = Object.keys(this.consts.pythFeeder.feeder);
345
+ // Handle sponsored transaction case
346
+ if (sponsoredTx) {
347
+ const suiCoinObject = this.processCoins(tx, 'sui', suiCoinObjectsForPythUpdate || [], true);
348
+ tx = await this.initOracleTxb(pythFeederKeys, tx, true, suiCoinObject);
349
+ // Process deposit coins
350
+ const depositObject = coin === 'sui'
351
+ ? tx.splitCoins(suiCoinObject, [tx.pure.u64(amount)])[0]
352
+ : tx.splitCoins(this.processCoins(tx, coin, coinObjects, true), [tx.pure.u64(amount)])[0];
353
+ const { vaultsValuation, symbolsValuation } = this.dataAPI.valuate(tx);
354
+ const [mintedCoin] = tx.moveCall({
355
+ target: `${this.consts.zoCore.upgradedPackage}::market::deposit_ptb`,
356
+ typeArguments: [`${this.consts.zoCore.package}::zbtcvc::ZBTCVC`, this.consts.coins[coin].module],
357
+ arguments: [
358
+ tx.object(this.consts.zoCore.market),
359
+ tx.object(this.consts.zoCore.rebaseFeeModel),
360
+ depositObject,
361
+ tx.pure.u64(minAmountOut),
362
+ vaultsValuation,
363
+ symbolsValuation,
364
+ ],
365
+ });
366
+ return mintedCoin;
367
+ }
368
+ // Handle non-sponsored transaction case
369
+ tx = await this.initOracleTxb(pythFeederKeys, tx);
370
+ const depositObject = tx.splitCoins(this.processCoins(tx, coin, coinObjects, false), [tx.pure.u64(amount)])[0];
371
+ const { vaultsValuation, symbolsValuation } = this.dataAPI.valuate(tx);
372
+ const [mintedCoin] = tx.moveCall({
373
+ target: `${this.consts.zoCore.upgradedPackage}::market::deposit_ptb`,
374
+ typeArguments: [
375
+ `${this.consts.zoCore.package}::zbtcvc::ZBTCVC`,
376
+ this.consts.coins[coin].module,
377
+ ],
378
+ arguments: [
379
+ tx.object(this.consts.zoCore.market),
380
+ tx.object(this.consts.zoCore.rebaseFeeModel),
381
+ depositObject,
382
+ tx.pure.u64(minAmountOut),
383
+ vaultsValuation,
384
+ symbolsValuation,
385
+ ],
386
+ });
387
+ return mintedCoin;
388
+ }
389
+ /**
390
+ * Withdraws collateral from ZBTCVC vault
391
+ */
392
+ async withdraw(coin, lpCoinObjects, amount, minAmountOut = 0, sponsoredTx, suiCoinObjectsForPythUpdate) {
393
+ let tx = new transactions_1.Transaction();
394
+ // Initialize oracle transaction
395
+ const pythFeederKeys = Object.keys(this.consts.pythFeeder.feeder);
396
+ if (sponsoredTx) {
397
+ const suiCoinObject = this.processCoins(tx, 'sui', suiCoinObjectsForPythUpdate || [], true);
398
+ tx = await this.initOracleTxb(pythFeederKeys, tx, true, suiCoinObject);
399
+ }
400
+ else {
401
+ tx = await this.initOracleTxb(pythFeederKeys, tx);
402
+ }
403
+ const zbtcvcCoinObject = this.processCoins(tx, 'zbtcvc', lpCoinObjects, false);
404
+ const [withdrawObject] = tx.splitCoins(zbtcvcCoinObject, [tx.pure.u64(amount)]);
405
+ const { vaultsValuation, symbolsValuation } = this.dataAPI.valuate(tx);
406
+ tx.moveCall({
407
+ target: `${this.consts.zoCore.upgradedPackage}::market::withdraw`,
408
+ typeArguments: [
409
+ `${this.consts.zoCore.package}::zbtcvc::ZBTCVC`,
410
+ this.consts.coins[coin].module,
411
+ ],
412
+ arguments: [
413
+ tx.object(this.consts.zoCore.market),
414
+ tx.object(this.consts.zoCore.rebaseFeeModel),
415
+ withdrawObject,
416
+ tx.pure.u64(minAmountOut),
417
+ vaultsValuation,
418
+ symbolsValuation,
419
+ ],
420
+ });
421
+ return tx;
422
+ }
423
+ /**
424
+ * Stakes ZBTCVC tokens in ZO staking pools
425
+ */
426
+ stake(lpCoinObjects, amount, pool, tx) {
427
+ if (!tx) {
428
+ tx = new transactions_1.Transaction();
429
+ }
430
+ const coinObject = this.processCoins(tx, 'zbtcvc', lpCoinObjects);
431
+ const [depositObject] = tx.splitCoins(coinObject, [tx.pure.u64(amount)]);
432
+ tx.moveCall({
433
+ target: `${this.sharedConfig.zoStaking.upgradedPackage}::pool::deposit`,
434
+ typeArguments: [
435
+ `${this.consts.zoCore.package}::zbtcvc::ZBTCVC`,
436
+ `${this.consts.coins.sui.module}`,
437
+ ],
438
+ arguments: [
439
+ tx.object(pool),
440
+ tx.object(utils_1.SUI_CLOCK_OBJECT_ID),
441
+ depositObject,
442
+ ],
443
+ });
444
+ return tx;
445
+ }
446
+ /**
447
+ * Stakes ZBTCVC tokens using coin object only (PTB)
448
+ */
449
+ stakeCoinObject(coinObject, pool, tx) {
450
+ if (!tx) {
451
+ tx = new transactions_1.Transaction();
452
+ }
453
+ tx.moveCall({
454
+ target: `${this.sharedConfig.zoStaking.upgradedPackage}::pool::deposit`,
455
+ typeArguments: [
456
+ `${this.consts.zoCore.package}::zbtcvc::ZBTCVC`,
457
+ `${this.consts.coins.sui.module}`,
458
+ ],
459
+ arguments: [
460
+ tx.object(pool),
461
+ tx.object(utils_1.SUI_CLOCK_OBJECT_ID),
462
+ coinObject,
463
+ ],
464
+ });
465
+ return tx;
466
+ }
467
+ /**
468
+ * Unstakes ZBTCVC tokens from ZO staking pools
469
+ */
470
+ unstake(credentials, amount, pool, tx) {
471
+ let unstakeAmount = amount;
472
+ if (!tx) {
473
+ tx = new transactions_1.Transaction();
474
+ }
475
+ for (const credential of credentials) {
476
+ const withdrawAmount = (() => {
477
+ const min = (a, b) => a < b ? a : b;
478
+ return min(unstakeAmount, credential.amount);
479
+ })();
480
+ unstakeAmount -= withdrawAmount;
481
+ tx.moveCall({
482
+ target: `${this.sharedConfig.zoStaking.upgradedPackage}::pool::withdraw`,
483
+ typeArguments: [
484
+ `${this.consts.zoCore.package}::zbtcvc::ZBTCVC`,
485
+ `${this.consts.coins.sui.module}`,
486
+ ],
487
+ arguments: [
488
+ tx.object(pool),
489
+ tx.object(utils_1.SUI_CLOCK_OBJECT_ID),
490
+ tx.object(credential.id),
491
+ tx.pure.u64(withdrawAmount),
492
+ ],
493
+ });
494
+ if (credential.amount === BigInt(0)) {
495
+ tx.moveCall({
496
+ target: `${this.sharedConfig.zoStaking.upgradedPackage}::pool::clear_empty_credential`,
497
+ typeArguments: [
498
+ `${this.consts.zoCore.package}::zbtcvc::ZBTCVC`,
499
+ `${this.consts.coins.sui.module}`,
500
+ ],
501
+ arguments: [tx.object(credential.id)],
502
+ });
503
+ }
504
+ }
505
+ return tx;
506
+ }
507
+ async swap(fromToken, toToken, fromAmount, fromCoinObjects, minAmountOut) {
508
+ const tx = await this.initOracleTxb(Object.keys(this.consts.zoCore.vaults));
509
+ const fromCoinObject = this.processCoins(tx, fromToken, fromCoinObjects);
510
+ const [fromDepositObject] = tx.splitCoins(fromCoinObject, [tx.pure.u64(fromAmount)]);
511
+ const vaultsValuation = this.dataAPI.valuateVaults(tx);
512
+ tx.moveCall({
513
+ target: `${this.consts.zoCore.upgradedPackage}::market::swap`,
514
+ typeArguments: [
515
+ `${this.consts.zoCore.package}::zbtcvc::ZBTCVC`,
516
+ this.consts.coins[fromToken].module,
517
+ this.consts.coins[toToken].module,
518
+ ],
519
+ arguments: [
520
+ tx.object(this.consts.zoCore.market),
521
+ tx.object(this.consts.zoCore.rebaseFeeModel),
522
+ fromDepositObject,
523
+ tx.pure.u64(minAmountOut || 0),
524
+ vaultsValuation,
525
+ ],
526
+ });
527
+ return tx;
528
+ }
529
+ /**
530
+ * Opens a new position in ZBTCVC
531
+ */
532
+ 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) {
533
+ let tx = new transactions_1.Transaction();
534
+ if (referralAddress && !(await this.dataAPI.hasReferral(sender || ''))) {
535
+ tx = await this.addReferral(referralAddress, tx);
536
+ }
537
+ const symbol = (0, utils_2.joinSymbol)(long ? 'long' : 'short', indexToken);
538
+ const adjustPrice = this.processSlippage(indexPrice, long, isLimitOrder ? 0 : pricesSlippage);
539
+ const adjustCollateralPrice = this.processSlippage(collateralPrice, false, collateralSlippage);
540
+ let allowTrade = consts_1.ALLOW_TRADE_MUST_TRADE;
541
+ if (isLimitOrder) {
542
+ allowTrade = isIocOrder ? consts_1.ALLOW_TRADE_NO_TRADE : consts_1.ALLOW_TRADE_CAN_TRADE;
543
+ }
544
+ // Handle oracle initialization and coin processing
545
+ let suiCoinObject;
546
+ if (sponsoredTx) {
547
+ suiCoinObject = this.processCoins(tx, 'sui', suiCoinObjectsForPythUpdate || [], true);
548
+ tx = await this.initOracleTxb([collateralToken, indexToken], tx, true, suiCoinObject);
549
+ }
550
+ else {
551
+ tx = await this.initOracleTxb([collateralToken, indexToken], tx);
552
+ }
553
+ // Process coin splitting
554
+ const [depositObject, feeObject] = this.processCoinSplitting(tx, collateralToken, coinObjects, [tx.pure.u64(collateralAmount), tx.pure.u64(relayerFee)], sponsoredTx, suiCoinObject);
555
+ tx.moveCall({
556
+ target: `${this.consts.zoCore.upgradedPackage}::market::open_position`,
557
+ typeArguments: [
558
+ `${this.consts.zoCore.package}::zbtcvc::ZBTCVC`,
559
+ this.consts.coins[collateralToken].module,
560
+ this.consts.coins[indexToken].module,
561
+ `${this.consts.zoCore.package}::market::${long ? 'LONG' : 'SHORT'}`,
562
+ this.consts.coins[collateralToken].module,
563
+ ],
564
+ arguments: [
565
+ tx.object(utils_1.SUI_CLOCK_OBJECT_ID),
566
+ tx.object(this.consts.zoCore.market),
567
+ tx.object(this.consts.zoCore.vaults[collateralToken].reservingFeeModel),
568
+ tx.object(this.consts.zoCore.symbols[symbol].fundingFeeModel),
569
+ tx.object(this.consts.zoCore.symbols[symbol].positionConfig),
570
+ tx.object(this.consts.pythFeeder.feeder[collateralToken]),
571
+ tx.object(this.consts.pythFeeder.feeder[indexToken]),
572
+ depositObject,
573
+ feeObject,
574
+ tx.pure.u8(allowTrade),
575
+ tx.pure.u64(size),
576
+ tx.pure.u64(reserveAmount),
577
+ tx.pure.u256(adjustCollateralPrice),
578
+ tx.pure.u256(adjustPrice),
579
+ ],
580
+ });
581
+ return tx;
582
+ }
583
+ /**
584
+ * Decreases an existing position in ZBTCVC
585
+ */
586
+ 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) {
587
+ if (!coinObjects) {
588
+ throw new Error(`${this.constructor.name}: coinObjects is required`);
589
+ }
590
+ let tx = new transactions_1.Transaction();
591
+ const symbol = (0, utils_2.joinSymbol)(long ? 'long' : 'short', indexToken);
592
+ const adjustPrice = this.processSlippage(indexPrice, !long, isTriggerOrder ? 0 : pricesSlippage);
593
+ const adjustCollateralPrice = this.processSlippage(collateralPrice, false, collateralSlippage);
594
+ let allowTrade = consts_1.ALLOW_TRADE_MUST_TRADE;
595
+ if (isTriggerOrder) {
596
+ allowTrade = isIocOrder || !isTakeProfitOrder ? consts_1.ALLOW_TRADE_NO_TRADE : consts_1.ALLOW_TRADE_CAN_TRADE;
597
+ }
598
+ else {
599
+ isTakeProfitOrder = true;
600
+ }
601
+ // Handle oracle initialization and coin processing
602
+ let suiCoinObject;
603
+ if (sponsoredTx) {
604
+ suiCoinObject = this.processCoins(tx, 'sui', suiCoinObjectsForPythUpdate || [], true);
605
+ tx = await this.initOracleTxb([collateralToken, indexToken], tx, true, suiCoinObject);
606
+ }
607
+ else {
608
+ tx = await this.initOracleTxb([collateralToken, indexToken], tx);
609
+ }
610
+ // Process coin splitting
611
+ const [feeObject] = this.processCoinSplitting(tx, collateralToken, coinObjects, [tx.pure.u64(relayerFee)], sponsoredTx, suiCoinObject);
612
+ tx.moveCall({
613
+ target: `${this.consts.zoCore.upgradedPackage}::market::decrease_position`,
614
+ typeArguments: [
615
+ `${this.consts.zoCore.package}::zbtcvc::ZBTCVC`,
616
+ this.consts.coins[collateralToken].module,
617
+ this.consts.coins[indexToken].module,
618
+ `${this.consts.zoCore.package}::market::${long ? 'LONG' : 'SHORT'}`,
619
+ this.consts.coins[collateralToken].module,
620
+ ],
621
+ arguments: [
622
+ tx.object(utils_1.SUI_CLOCK_OBJECT_ID),
623
+ tx.object(this.consts.zoCore.market),
624
+ tx.object(pcpId),
625
+ tx.object(this.consts.zoCore.vaults[collateralToken].reservingFeeModel),
626
+ tx.object(this.consts.zoCore.symbols[symbol].fundingFeeModel),
627
+ tx.object(this.consts.pythFeeder.feeder[collateralToken]),
628
+ tx.object(this.consts.pythFeeder.feeder[indexToken]),
629
+ feeObject,
630
+ tx.pure.u8(allowTrade),
631
+ tx.pure.bool(isTakeProfitOrder),
632
+ tx.pure.u64(amount),
633
+ tx.pure.u256(adjustCollateralPrice),
634
+ tx.pure.u256(adjustPrice),
635
+ ],
636
+ });
637
+ return tx;
638
+ }
639
+ async decreaseMultiPositions(positions, tx, sponsoredTx, suiCoinObjectsForPythUpdate) {
640
+ if (!tx) {
641
+ tx = new transactions_1.Transaction();
642
+ }
643
+ // Handle oracle initialization and coin processing
644
+ let suiCoinObject;
645
+ if (sponsoredTx) {
646
+ suiCoinObject = this.processCoins(tx, 'sui', suiCoinObjectsForPythUpdate || [], true);
647
+ tx = await this.initOracleTxb(positions.flatMap(position => [position.collateralToken, position.indexToken]), tx, true, suiCoinObject);
648
+ }
649
+ else {
650
+ tx = await this.initOracleTxb(positions.flatMap(position => [position.collateralToken, position.indexToken]), tx);
651
+ }
652
+ for (const position of positions) {
653
+ 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;
654
+ let innerIsTakeProfitOrder = isTakeProfitOrder;
655
+ const symbol = (0, utils_2.joinSymbol)(long ? 'long' : 'short', indexToken);
656
+ const adjustPrice = this.processSlippage(indexPrice, !long, isTriggerOrder ? 0 : pricesSlippage);
657
+ const adjustCollateralPrice = this.processSlippage(collateralPrice, false, collateralSlippage);
658
+ let allowTrade = consts_1.ALLOW_TRADE_MUST_TRADE;
659
+ if (isTriggerOrder) {
660
+ allowTrade = isIocOrder || !innerIsTakeProfitOrder ? consts_1.ALLOW_TRADE_NO_TRADE : consts_1.ALLOW_TRADE_CAN_TRADE;
661
+ }
662
+ else {
663
+ innerIsTakeProfitOrder = true;
664
+ }
665
+ // Process coin splitting
666
+ const [feeObject] = this.processCoinSplitting(tx, collateralToken, coinObjects, [tx.pure.u64(relayerFee)], sponsoredTx, suiCoinObject);
667
+ tx.moveCall({
668
+ target: `${this.consts.zoCore.upgradedPackage}::market::decrease_position`,
669
+ typeArguments: [
670
+ `${this.consts.zoCore.package}::zbtcvc::ZBTCVC`,
671
+ this.consts.coins[collateralToken].module,
672
+ this.consts.coins[indexToken].module,
673
+ `${this.consts.zoCore.package}::market::${long ? 'LONG' : 'SHORT'}`,
674
+ this.consts.coins[collateralToken].module,
675
+ ],
676
+ arguments: [
677
+ tx.object(utils_1.SUI_CLOCK_OBJECT_ID),
678
+ tx.object(this.consts.zoCore.market),
679
+ tx.object(pcpId),
680
+ tx.object(this.consts.zoCore.vaults[collateralToken].reservingFeeModel),
681
+ tx.object(this.consts.zoCore.symbols[symbol].fundingFeeModel),
682
+ tx.object(this.consts.pythFeeder.feeder[collateralToken]),
683
+ tx.object(this.consts.pythFeeder.feeder[indexToken]),
684
+ feeObject,
685
+ tx.pure.u8(allowTrade),
686
+ tx.pure.bool(innerIsTakeProfitOrder),
687
+ tx.pure.u64(amount),
688
+ tx.pure.u256(adjustCollateralPrice),
689
+ tx.pure.u256(adjustPrice),
690
+ ],
691
+ });
692
+ }
693
+ return tx;
694
+ }
695
+ /**
696
+ * Pledges in position (ZBTCVC-specific functionality)
697
+ */
698
+ async pledgeInPosition(pcpId, collateralToken, indexToken, amount, coinObjects, long, sponsoredTx, suiCoinObjectsForPythUpdate) {
699
+ let tx = new transactions_1.Transaction();
700
+ // Handle oracle initialization and coin processing
701
+ let suiCoinObject;
702
+ if (sponsoredTx) {
703
+ suiCoinObject = this.processCoins(tx, 'sui', suiCoinObjectsForPythUpdate || [], true);
704
+ tx = await this.initOracleTxb([collateralToken, indexToken], tx, true, suiCoinObject);
705
+ }
706
+ else {
707
+ tx = await this.initOracleTxb([collateralToken, indexToken], tx);
708
+ }
709
+ // Process coin splitting
710
+ const [depositObject] = this.processCoinSplitting(tx, collateralToken, coinObjects, [tx.pure.u64(amount)], sponsoredTx, suiCoinObject);
711
+ tx.moveCall({
712
+ target: `${this.consts.zoCore.upgradedPackage}::market::pledge_in_position`,
713
+ typeArguments: [
714
+ `${this.consts.zoCore.package}::zbtcvc::ZBTCVC`,
715
+ this.consts.coins[collateralToken].module,
716
+ this.consts.coins[indexToken].module,
717
+ `${this.consts.zoCore.package}::market::${long ? 'LONG' : 'SHORT'}`,
718
+ ],
719
+ arguments: [tx.object(this.consts.zoCore.market), tx.object(pcpId), depositObject],
720
+ });
721
+ return tx;
722
+ }
723
+ async redeemFromPosition(pcpId, collateralToken, indexToken, amount, long, sponsoredTx, suiCoinObjectsForPythUpdate) {
724
+ let tx = new transactions_1.Transaction();
725
+ // Handle oracle initialization and coin processing
726
+ let suiCoinObject;
727
+ if (sponsoredTx) {
728
+ suiCoinObject = this.processCoins(tx, 'sui', suiCoinObjectsForPythUpdate || [], true);
729
+ tx = await this.initOracleTxb([collateralToken, indexToken], tx, true, suiCoinObject);
730
+ }
731
+ else {
732
+ tx = await this.initOracleTxb([collateralToken, indexToken], tx);
733
+ }
734
+ const symbol = (0, utils_2.joinSymbol)(long ? 'long' : 'short', indexToken);
735
+ tx.moveCall({
736
+ target: `${this.consts.zoCore.upgradedPackage}::market::redeem_from_position`,
737
+ typeArguments: [
738
+ `${this.consts.zoCore.package}::zbtcvc::ZBTCVC`,
739
+ this.consts.coins[collateralToken].module,
740
+ this.consts.coins[indexToken].module,
741
+ `${this.consts.zoCore.package}::market::${long ? 'LONG' : 'SHORT'}`,
742
+ ],
743
+ arguments: [
744
+ tx.object(utils_1.SUI_CLOCK_OBJECT_ID),
745
+ tx.object(this.consts.zoCore.market),
746
+ tx.object(pcpId),
747
+ tx.object(this.consts.zoCore.vaults[collateralToken].reservingFeeModel),
748
+ tx.object(this.consts.zoCore.symbols[symbol].fundingFeeModel),
749
+ tx.object(this.consts.pythFeeder.feeder[collateralToken]),
750
+ tx.object(this.consts.pythFeeder.feeder[indexToken]),
751
+ tx.pure.u64(amount),
752
+ ],
753
+ });
754
+ return tx;
755
+ }
756
+ cancelOrder(orderCapId, collateralToken, indexToken, long, type, isV11Order) {
757
+ const tx = new transactions_1.Transaction();
758
+ let functionName = '';
759
+ switch (type) {
760
+ case 'OPEN_POSITION': {
761
+ functionName = isV11Order ? 'clear_open_position_order' : 'clear_open_position_order';
762
+ break;
763
+ }
764
+ case 'DECREASE_POSITION': {
765
+ functionName = isV11Order
766
+ ? 'clear_decrease_position_order'
767
+ : 'clear_decrease_position_order';
768
+ break;
769
+ }
770
+ default: {
771
+ throw new Error('invalid order type');
772
+ }
773
+ }
774
+ tx.moveCall({
775
+ target: `${this.consts.zoCore.upgradedPackage}::market::${functionName}`,
776
+ typeArguments: [
777
+ `${this.consts.zoCore.package}::zbtcvc::ZBTCVC`,
778
+ this.consts.coins[collateralToken].module,
779
+ this.consts.coins[indexToken].module,
780
+ `${this.consts.zoCore.package}::market::${long ? 'LONG' : 'SHORT'}`,
781
+ this.consts.coins[collateralToken].module,
782
+ ],
783
+ arguments: [tx.object(this.consts.zoCore.market), tx.object(orderCapId)],
784
+ });
785
+ return tx;
786
+ }
787
+ cancelMultiOrders(orders, tx) {
788
+ if (!tx) {
789
+ tx = new transactions_1.Transaction();
790
+ }
791
+ for (const order of orders) {
792
+ const { orderCapId, collateralToken, indexToken, long, type, isV11Order } = order;
793
+ let functionName = '';
794
+ switch (type) {
795
+ case 'OPEN_POSITION': {
796
+ functionName = isV11Order ? 'clear_open_position_order' : 'clear_open_position_order';
797
+ break;
798
+ }
799
+ case 'DECREASE_POSITION': {
800
+ functionName = isV11Order
801
+ ? 'clear_decrease_position_order'
802
+ : 'clear_decrease_position_order';
803
+ break;
804
+ }
805
+ default: {
806
+ throw new Error('invalid order type');
807
+ }
808
+ }
809
+ tx.moveCall({
810
+ target: `${this.consts.zoCore.upgradedPackage}::market::${functionName}`,
811
+ typeArguments: [
812
+ `${this.consts.zoCore.package}::zbtcvc::ZBTCVC`,
813
+ this.consts.coins[collateralToken].module,
814
+ this.consts.coins[indexToken].module,
815
+ `${this.consts.zoCore.package}::market::${long ? 'LONG' : 'SHORT'}`,
816
+ this.consts.coins[collateralToken].module,
817
+ ],
818
+ arguments: [tx.object(this.consts.zoCore.market), tx.object(orderCapId)],
819
+ });
820
+ }
821
+ return tx;
822
+ }
823
+ addReferral(referralAddress, tx) {
824
+ if (!tx) {
825
+ tx = new transactions_1.Transaction();
826
+ }
827
+ tx.moveCall({
828
+ target: `${this.consts.zoCore.upgradedPackage}::market::add_new_referral`,
829
+ typeArguments: [`${this.consts.zoCore.package}::zbtcvc::ZBTCVC`],
830
+ arguments: [tx.object(this.consts.zoCore.market), tx.object(referralAddress)],
831
+ });
832
+ return tx;
833
+ }
834
+ async adminUpdatePriceFeed(collateralToken, indexToken) {
835
+ const tx = await this.initOracleTxb([collateralToken, indexToken]);
836
+ return tx;
837
+ }
838
+ adminSettlePosition(positionId, owner, collateralToken, indexToken, long) {
839
+ const tx = new transactions_1.Transaction();
840
+ tx.moveCall({
841
+ target: `${this.consts.zoCore.upgradedPackage}::market::force_settle_position`,
842
+ typeArguments: [
843
+ `${this.consts.zoCore.package}::zbtcvc::ZBTCVC`,
844
+ this.consts.coins[collateralToken].module,
845
+ this.consts.coins[indexToken].module,
846
+ `${this.consts.zoCore.package}::market::${long ? 'LONG' : 'SHORT'}`,
847
+ ],
848
+ arguments: [
849
+ tx.object(this.consts.zoCore.adminCap),
850
+ tx.object(utils_1.SUI_CLOCK_OBJECT_ID),
851
+ tx.object(this.consts.zoCore.market),
852
+ tx.object(owner),
853
+ tx.object(positionId),
854
+ ],
855
+ });
856
+ this.adminClearClosedPosition(positionId, owner, collateralToken, indexToken, long, tx);
857
+ return tx;
858
+ }
859
+ adminDecreasePosition(positionId, owner, collateralToken, indexToken, positionAmount, amount, long) {
860
+ const tx = new transactions_1.Transaction();
861
+ const symbol = (0, utils_2.joinSymbol)(long ? 'long' : 'short', indexToken);
862
+ tx.moveCall({
863
+ target: `${this.consts.zoCore.upgradedPackage}::market::force_close_position`,
864
+ typeArguments: [
865
+ `${this.consts.zoCore.package}::zbtcvc::ZBTCVC`,
866
+ this.consts.coins[collateralToken].module,
867
+ this.consts.coins[indexToken].module,
868
+ `${this.consts.zoCore.package}::market::${long ? 'LONG' : 'SHORT'}`,
869
+ ],
870
+ arguments: [
871
+ tx.object(this.consts.zoCore.adminCap),
872
+ tx.object(utils_1.SUI_CLOCK_OBJECT_ID),
873
+ tx.object(this.consts.zoCore.market),
874
+ tx.object(this.consts.zoCore.vaults[collateralToken].reservingFeeModel),
875
+ tx.object(this.consts.zoCore.symbols[symbol].fundingFeeModel),
876
+ tx.object(this.consts.pythFeeder.feeder[collateralToken]),
877
+ tx.object(this.consts.pythFeeder.feeder[indexToken]),
878
+ tx.object(owner),
879
+ tx.object(positionId),
880
+ ],
881
+ });
882
+ if (amount === BigInt(positionAmount)) {
883
+ this.adminClearClosedPosition(positionId, owner, collateralToken, indexToken, long, tx);
884
+ }
885
+ return tx;
886
+ }
887
+ adminClearClosedPosition(positionId, owner, collateralToken, indexToken, long, tx) {
888
+ tx.moveCall({
889
+ target: `${this.consts.zoCore.upgradedPackage}::market::force_clear_closed_position`,
890
+ typeArguments: [
891
+ `${this.consts.zoCore.package}::zbtcvc::ZBTCVC`,
892
+ this.consts.coins[collateralToken].module,
893
+ this.consts.coins[indexToken].module,
894
+ `${this.consts.zoCore.package}::market::${long ? 'LONG' : 'SHORT'}`,
895
+ ],
896
+ arguments: [
897
+ tx.object(this.consts.zoCore.adminCap),
898
+ tx.object(this.consts.zoCore.market),
899
+ tx.object(positionId),
900
+ tx.object(owner),
901
+ ],
902
+ });
903
+ }
904
+ }
905
+ exports.ZBTCVCAPI = ZBTCVCAPI;
906
+ //# sourceMappingURL=ZBTCVCAPI.cjs.map