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