@mysten/deepbook-v3 2.6.4 → 2.8.0

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 (250) hide show
  1. package/CHANGELOG.md +153 -0
  2. package/PREDICT.md +389 -61
  3. package/dist/contracts/account/account.d.mts +23 -23
  4. package/dist/contracts/account/account.d.mts.map +1 -1
  5. package/dist/contracts/account/account_registry.d.mts +13 -13
  6. package/dist/contracts/deepbook/account.d.mts +18 -18
  7. package/dist/contracts/deepbook/balances.d.mts +4 -4
  8. package/dist/contracts/deepbook/deep_price.d.mts +3 -3
  9. package/dist/contracts/deepbook/order.d.mts +12 -12
  10. package/dist/contracts/deepbook_predict/admin.d.mts +4 -4
  11. package/dist/contracts/deepbook_predict/builder_code.d.mts +11 -11
  12. package/dist/contracts/deepbook_predict/builder_code_events.d.mts +10 -10
  13. package/dist/contracts/deepbook_predict/config_events.d.mts +93 -68
  14. package/dist/contracts/deepbook_predict/config_events.d.mts.map +1 -1
  15. package/dist/contracts/deepbook_predict/config_events.mjs +45 -1
  16. package/dist/contracts/deepbook_predict/config_events.mjs.map +1 -1
  17. package/dist/contracts/deepbook_predict/deps/std/type_name.mjs +17 -0
  18. package/dist/contracts/deepbook_predict/deps/std/type_name.mjs.map +1 -0
  19. package/dist/contracts/deepbook_predict/expiry_market.d.mts +652 -235
  20. package/dist/contracts/deepbook_predict/expiry_market.d.mts.map +1 -1
  21. package/dist/contracts/deepbook_predict/expiry_market.mjs +652 -186
  22. package/dist/contracts/deepbook_predict/expiry_market.mjs.map +1 -1
  23. package/dist/contracts/deepbook_predict/lp_book.mjs +1 -1
  24. package/dist/contracts/deepbook_predict/market_lifecycle_cap.d.mts +5 -5
  25. package/dist/contracts/deepbook_predict/market_manager.d.mts +27 -27
  26. package/dist/contracts/deepbook_predict/order_events.d.mts +50 -50
  27. package/dist/contracts/deepbook_predict/order_events.d.mts.map +1 -1
  28. package/dist/contracts/deepbook_predict/order_events.mjs +3 -1
  29. package/dist/contracts/deepbook_predict/order_events.mjs.map +1 -1
  30. package/dist/contracts/deepbook_predict/pause_cap.d.mts +5 -5
  31. package/dist/contracts/deepbook_predict/plp.d.mts +184 -82
  32. package/dist/contracts/deepbook_predict/plp.d.mts.map +1 -1
  33. package/dist/contracts/deepbook_predict/plp.mjs +126 -7
  34. package/dist/contracts/deepbook_predict/plp.mjs.map +1 -1
  35. package/dist/contracts/deepbook_predict/pool_accounting.mjs +1 -1
  36. package/dist/contracts/deepbook_predict/pool_valuation_cap.d.mts +5 -5
  37. package/dist/contracts/deepbook_predict/predict_account.d.mts +14 -14
  38. package/dist/contracts/deepbook_predict/pricing.d.mts +91 -58
  39. package/dist/contracts/deepbook_predict/pricing.d.mts.map +1 -1
  40. package/dist/contracts/deepbook_predict/pricing.mjs +30 -3
  41. package/dist/contracts/deepbook_predict/pricing.mjs.map +1 -1
  42. package/dist/contracts/deepbook_predict/pricing_config.mjs.map +1 -1
  43. package/dist/contracts/deepbook_predict/protocol_config.d.mts +400 -92
  44. package/dist/contracts/deepbook_predict/protocol_config.d.mts.map +1 -1
  45. package/dist/contracts/deepbook_predict/protocol_config.mjs +451 -61
  46. package/dist/contracts/deepbook_predict/protocol_config.mjs.map +1 -1
  47. package/dist/contracts/deepbook_predict/range_codec.d.mts +2 -2
  48. package/dist/contracts/deepbook_predict/registry.d.mts +28 -28
  49. package/dist/contracts/deepbook_predict/strike_exposure.mjs +1 -1
  50. package/dist/contracts/deepbook_predict/strike_payout_tree.mjs +17 -12
  51. package/dist/contracts/deepbook_predict/strike_payout_tree.mjs.map +1 -1
  52. package/dist/contracts/deepbook_predict/vault_events.d.mts +154 -106
  53. package/dist/contracts/deepbook_predict/vault_events.d.mts.map +1 -1
  54. package/dist/contracts/deepbook_predict/vault_events.mjs +57 -1
  55. package/dist/contracts/deepbook_predict/vault_events.mjs.map +1 -1
  56. package/dist/contracts/deepbook_predict_math/config-arguments.d.mts +10 -0
  57. package/dist/contracts/deepbook_predict_math/config-arguments.d.mts.map +1 -0
  58. package/dist/contracts/deepbook_predict_math/lazer_price.d.mts +106 -0
  59. package/dist/contracts/deepbook_predict_math/lazer_price.d.mts.map +1 -0
  60. package/dist/contracts/deepbook_predict_math/lazer_price.mjs +125 -0
  61. package/dist/contracts/deepbook_predict_math/lazer_price.mjs.map +1 -0
  62. package/dist/contracts/deepbook_predict_math/math.d.mts +284 -0
  63. package/dist/contracts/deepbook_predict_math/math.d.mts.map +1 -0
  64. package/dist/contracts/deepbook_predict_math/math.mjs +364 -0
  65. package/dist/contracts/deepbook_predict_math/math.mjs.map +1 -0
  66. package/dist/contracts/deepbook_predict_orders/config-arguments.d.mts +13 -0
  67. package/dist/contracts/deepbook_predict_orders/config-arguments.d.mts.map +1 -0
  68. package/dist/contracts/deepbook_predict_orders/delayed_execution_config.d.mts +215 -0
  69. package/dist/contracts/deepbook_predict_orders/delayed_execution_config.d.mts.map +1 -0
  70. package/dist/contracts/deepbook_predict_orders/delayed_execution_config.mjs +215 -0
  71. package/dist/contracts/deepbook_predict_orders/delayed_execution_config.mjs.map +1 -0
  72. package/dist/contracts/deepbook_predict_orders/deps/deepbook_predict/expiry_market.mjs +87 -0
  73. package/dist/contracts/deepbook_predict_orders/deps/deepbook_predict/expiry_market.mjs.map +1 -0
  74. package/dist/contracts/deepbook_predict_orders/deps/deepbook_predict/pricing.mjs +52 -0
  75. package/dist/contracts/deepbook_predict_orders/deps/deepbook_predict/pricing.mjs.map +1 -0
  76. package/dist/contracts/deepbook_predict_orders/deps/fixed_math/i64.mjs +25 -0
  77. package/dist/contracts/deepbook_predict_orders/deps/fixed_math/i64.mjs.map +1 -0
  78. package/dist/contracts/deepbook_predict_orders/deps/sui/balance.mjs +21 -0
  79. package/dist/contracts/deepbook_predict_orders/deps/sui/balance.mjs.map +1 -0
  80. package/dist/contracts/deepbook_predict_orders/deps/sui/table.mjs +39 -0
  81. package/dist/contracts/deepbook_predict_orders/deps/sui/table.mjs.map +1 -0
  82. package/dist/contracts/deepbook_predict_orders/desk.d.mts +187 -0
  83. package/dist/contracts/deepbook_predict_orders/desk.d.mts.map +1 -0
  84. package/dist/contracts/deepbook_predict_orders/desk.mjs +261 -0
  85. package/dist/contracts/deepbook_predict_orders/desk.mjs.map +1 -0
  86. package/dist/contracts/deepbook_predict_orders/order_queue.d.mts +1042 -0
  87. package/dist/contracts/deepbook_predict_orders/order_queue.d.mts.map +1 -0
  88. package/dist/contracts/deepbook_predict_orders/order_queue.mjs +849 -0
  89. package/dist/contracts/deepbook_predict_orders/order_queue.mjs.map +1 -0
  90. package/dist/contracts/deepbook_predict_orders/queue.d.mts +683 -0
  91. package/dist/contracts/deepbook_predict_orders/queue.d.mts.map +1 -0
  92. package/dist/contracts/deepbook_predict_orders/queue.mjs +912 -0
  93. package/dist/contracts/deepbook_predict_orders/queue.mjs.map +1 -0
  94. package/dist/contracts/deepbook_predict_orders/queue_events.d.mts +195 -0
  95. package/dist/contracts/deepbook_predict_orders/queue_events.d.mts.map +1 -0
  96. package/dist/contracts/deepbook_predict_orders/queue_events.mjs +187 -0
  97. package/dist/contracts/deepbook_predict_orders/queue_events.mjs.map +1 -0
  98. package/dist/contracts/deepbook_sessions/session_config.d.mts +8 -8
  99. package/dist/contracts/deepbook_sessions/sessions.d.mts +163 -28
  100. package/dist/contracts/deepbook_sessions/sessions.d.mts.map +1 -1
  101. package/dist/contracts/deepbook_sessions/sessions.mjs +234 -5
  102. package/dist/contracts/deepbook_sessions/sessions.mjs.map +1 -1
  103. package/dist/deployments/mainnet.mjs +7 -4
  104. package/dist/deployments/mainnet.mjs.map +1 -1
  105. package/dist/deployments/testnet.mjs +7 -4
  106. package/dist/deployments/testnet.mjs.map +1 -1
  107. package/dist/predict/bindings/expiry-market.d.mts +77 -0
  108. package/dist/predict/bindings/expiry-market.d.mts.map +1 -0
  109. package/dist/predict/bindings/expiry-market.mjs +139 -0
  110. package/dist/predict/bindings/expiry-market.mjs.map +1 -0
  111. package/dist/predict/bindings/protocol-config.d.mts +39 -0
  112. package/dist/predict/bindings/protocol-config.d.mts.map +1 -0
  113. package/dist/predict/bindings/protocol-config.mjs +90 -0
  114. package/dist/predict/bindings/protocol-config.mjs.map +1 -0
  115. package/dist/predict/bindings/rename.mjs +9 -0
  116. package/dist/predict/bindings/rename.mjs.map +1 -0
  117. package/dist/predict/client.d.mts +595 -16
  118. package/dist/predict/client.d.mts.map +1 -1
  119. package/dist/predict/client.mjs +986 -10
  120. package/dist/predict/client.mjs.map +1 -1
  121. package/dist/predict/config/generated.d.mts +22 -1
  122. package/dist/predict/config/generated.d.mts.map +1 -1
  123. package/dist/predict/config/generated.mjs +30 -1
  124. package/dist/predict/config/generated.mjs.map +1 -1
  125. package/dist/predict/config/mainnet.mjs +11 -3
  126. package/dist/predict/config/mainnet.mjs.map +1 -1
  127. package/dist/predict/config/testnet.mjs +11 -3
  128. package/dist/predict/config/testnet.mjs.map +1 -1
  129. package/dist/predict/config/types.d.mts +50 -1
  130. package/dist/predict/config/types.d.mts.map +1 -1
  131. package/dist/predict/cost.d.mts +38 -11
  132. package/dist/predict/cost.d.mts.map +1 -1
  133. package/dist/predict/cost.mjs +37 -11
  134. package/dist/predict/cost.mjs.map +1 -1
  135. package/dist/predict/decode.d.mts +251 -1
  136. package/dist/predict/decode.d.mts.map +1 -1
  137. package/dist/predict/decode.mjs +342 -4
  138. package/dist/predict/decode.mjs.map +1 -1
  139. package/dist/predict/errors.d.mts +69 -6
  140. package/dist/predict/errors.d.mts.map +1 -1
  141. package/dist/predict/errors.mjs +277 -4
  142. package/dist/predict/errors.mjs.map +1 -1
  143. package/dist/predict/index.d.mts +21 -10
  144. package/dist/predict/index.mjs +24 -12
  145. package/dist/predict/queue-id.d.mts +13 -0
  146. package/dist/predict/queue-id.d.mts.map +1 -0
  147. package/dist/predict/queue-id.mjs +19 -0
  148. package/dist/predict/queue-id.mjs.map +1 -0
  149. package/dist/predict/queue.d.mts +505 -0
  150. package/dist/predict/queue.d.mts.map +1 -0
  151. package/dist/predict/queue.mjs +774 -0
  152. package/dist/predict/queue.mjs.map +1 -0
  153. package/dist/predict/reads/balances.mjs +1 -1
  154. package/dist/predict/reads/markets.mjs +46 -5
  155. package/dist/predict/reads/markets.mjs.map +1 -1
  156. package/dist/predict/reads/pool.mjs +1 -1
  157. package/dist/predict/reads/pricing.d.mts +1 -1
  158. package/dist/predict/reads/queue.d.mts +105 -0
  159. package/dist/predict/reads/queue.d.mts.map +1 -0
  160. package/dist/predict/reads/queue.mjs +445 -0
  161. package/dist/predict/reads/queue.mjs.map +1 -0
  162. package/dist/predict/ticks.d.mts +9 -1
  163. package/dist/predict/ticks.d.mts.map +1 -1
  164. package/dist/predict/ticks.mjs +18 -1
  165. package/dist/predict/ticks.mjs.map +1 -1
  166. package/dist/predict/tx/authed.mjs +1 -1
  167. package/dist/predict/tx/common.d.mts.map +1 -1
  168. package/dist/predict/tx/common.mjs +12 -1
  169. package/dist/predict/tx/common.mjs.map +1 -1
  170. package/dist/predict/tx/queue.d.mts +220 -0
  171. package/dist/predict/tx/queue.d.mts.map +1 -0
  172. package/dist/predict/tx/queue.mjs +399 -0
  173. package/dist/predict/tx/queue.mjs.map +1 -0
  174. package/dist/predict/tx/trade.d.mts.map +1 -1
  175. package/dist/predict/tx/trade.mjs +61 -43
  176. package/dist/predict/tx/trade.mjs.map +1 -1
  177. package/dist/sessions.d.mts +90 -2
  178. package/dist/sessions.d.mts.map +1 -1
  179. package/dist/sessions.mjs +107 -2
  180. package/dist/sessions.mjs.map +1 -1
  181. package/dist/transactions/balanceManager.d.mts +12 -12
  182. package/dist/transactions/balanceManager.d.mts.map +1 -1
  183. package/dist/transactions/deepbook.d.mts +20 -20
  184. package/dist/transactions/deepbook.d.mts.map +1 -1
  185. package/dist/transactions/deepbookAdmin.d.mts +4 -4
  186. package/dist/transactions/deepbookAdmin.d.mts.map +1 -1
  187. package/dist/transactions/marginAdmin.d.mts +7 -7
  188. package/dist/transactions/marginAdmin.d.mts.map +1 -1
  189. package/dist/transactions/marginLiquidations.d.mts +3 -3
  190. package/dist/transactions/marginMaintainer.d.mts +5 -5
  191. package/dist/transactions/marginMaintainer.d.mts.map +1 -1
  192. package/dist/transactions/marginManager.d.mts +32 -32
  193. package/dist/transactions/marginManager.d.mts.map +1 -1
  194. package/dist/transactions/marginPool.d.mts +18 -18
  195. package/dist/transactions/marginRegistry.d.mts +16 -16
  196. package/dist/transactions/marginTPSL.d.mts +10 -10
  197. package/dist/transactions/marginTPSL.d.mts.map +1 -1
  198. package/dist/transactions/poolProxy.d.mts +8 -8
  199. package/dist/transactions/poolProxy.d.mts.map +1 -1
  200. package/package.json +4 -4
  201. package/src/contracts/deepbook_predict/config_events.ts +39 -0
  202. package/src/contracts/deepbook_predict/deps/std/type_name.ts +24 -0
  203. package/src/contracts/deepbook_predict/expiry_market.ts +960 -169
  204. package/src/contracts/deepbook_predict/order_events.ts +3 -1
  205. package/src/contracts/deepbook_predict/plp.ts +150 -9
  206. package/src/contracts/deepbook_predict/pricing.ts +46 -7
  207. package/src/contracts/deepbook_predict/pricing_config.ts +3 -1
  208. package/src/contracts/deepbook_predict/protocol_config.ts +648 -33
  209. package/src/contracts/deepbook_predict/strike_payout_tree.ts +25 -21
  210. package/src/contracts/deepbook_predict/vault_events.ts +65 -0
  211. package/src/contracts/deepbook_predict_math/config-arguments.ts +6 -0
  212. package/src/contracts/deepbook_predict_math/lazer_price.ts +196 -0
  213. package/src/contracts/deepbook_predict_math/math.ts +553 -0
  214. package/src/contracts/deepbook_predict_orders/config-arguments.ts +11 -0
  215. package/src/contracts/deepbook_predict_orders/delayed_execution_config.ts +430 -0
  216. package/src/contracts/deepbook_predict_orders/deps/deepbook_predict/expiry_market.ts +108 -0
  217. package/src/contracts/deepbook_predict_orders/deps/deepbook_predict/pricing.ts +58 -0
  218. package/src/contracts/deepbook_predict_orders/deps/fixed_math/i64.ts +21 -0
  219. package/src/contracts/deepbook_predict_orders/deps/sui/balance.ts +19 -0
  220. package/src/contracts/deepbook_predict_orders/deps/sui/table.ts +37 -0
  221. package/src/contracts/deepbook_predict_orders/desk.ts +419 -0
  222. package/src/contracts/deepbook_predict_orders/order_flow.ts +19 -0
  223. package/src/contracts/deepbook_predict_orders/order_queue.ts +1670 -0
  224. package/src/contracts/deepbook_predict_orders/queue.ts +1394 -0
  225. package/src/contracts/deepbook_predict_orders/queue_events.ts +189 -0
  226. package/src/contracts/deepbook_sessions/sessions.ts +355 -4
  227. package/src/deployments/mainnet.ts +7 -2
  228. package/src/deployments/testnet.ts +7 -2
  229. package/src/deployments/types.ts +14 -1
  230. package/src/predict/bindings/expiry-market.ts +127 -0
  231. package/src/predict/bindings/protocol-config.ts +59 -0
  232. package/src/predict/bindings/rename.ts +14 -0
  233. package/src/predict/client.ts +2076 -13
  234. package/src/predict/config/generated.ts +50 -0
  235. package/src/predict/config/mainnet.ts +16 -2
  236. package/src/predict/config/testnet.ts +16 -2
  237. package/src/predict/config/types.ts +51 -1
  238. package/src/predict/cost.ts +62 -14
  239. package/src/predict/decode.ts +691 -2
  240. package/src/predict/errors.ts +391 -14
  241. package/src/predict/index.ts +87 -6
  242. package/src/predict/queue-id.ts +22 -0
  243. package/src/predict/queue.ts +1231 -0
  244. package/src/predict/reads/markets.ts +30 -0
  245. package/src/predict/reads/queue.ts +606 -0
  246. package/src/predict/ticks.ts +35 -0
  247. package/src/predict/tx/common.ts +25 -1
  248. package/src/predict/tx/queue.ts +525 -0
  249. package/src/predict/tx/trade.ts +80 -49
  250. package/src/sessions.ts +206 -1
@@ -0,0 +1,445 @@
1
+ import { balance, loadAccount } from "../../contracts/account/account.mjs";
2
+ import { OrderView } from "../../contracts/deepbook_predict_orders/order_queue.mjs";
3
+ import { DelayedExecutionPolicy } from "../../contracts/deepbook_predict_orders/delayed_execution_config.mjs";
4
+ import { DELAYED_EXECUTION_VERSION, PREDICT_PACKAGE_VERSION, policyFromBcs } from "../queue.mjs";
5
+ import { inspectReturns } from "./inspect.mjs";
6
+ import { deriveAccountIdFrom, deriveAccountWrapperIdFrom } from "../tx/common.mjs";
7
+ import { policy, versionWatermark as versionWatermark$1 } from "../../contracts/deepbook_predict_orders/desk.mjs";
8
+ import { order, payoutProgress, pendingCounts, queueHeads, queueStuck, quoteRedeemOpen as quoteRedeemOpen$1, waitingCohorts, waitingOrders } from "../../contracts/deepbook_predict_orders/queue.mjs";
9
+ import { queueIdOf } from "../tx/queue.mjs";
10
+ import { MintQuote, RedeemQuote, backingBufferLambda, cashBalance, expiry, mintPaused, orderFlowState, quoteMint, quoteMintExactCostForAccount, quoteMintForAccount as quoteMintForAccount$1, requiredCash } from "../../contracts/deepbook_predict/expiry_market.mjs";
11
+ import { loadLivePricer } from "../tx/trade.mjs";
12
+ import { ProtocolConfig, feeIncentiveSubsidyRate, frozen, isOrderFlow, noTradeWindowMs, tradingPaused, versionWatermark as versionWatermark$2 } from "../../contracts/deepbook_predict/protocol_config.mjs";
13
+ import { parseOptionalU64, parseU64LE } from "./parse.mjs";
14
+ import { bcs } from "@mysten/sui/bcs";
15
+ import { Transaction } from "@mysten/sui/transactions";
16
+ import { normalizeSuiAddress } from "@mysten/sui/utils";
17
+
18
+ //#region src/predict/reads/queue.ts
19
+ const parseBool = (bytes) => (bytes[0] ?? 0) !== 0;
20
+ const OptionalOrderView = bcs.option(OrderView);
21
+ /** The companion's `order_flow::OrderFlow` witness type, which Predict's allowlist names. */
22
+ function orderFlowWitnessType(config) {
23
+ return `${config.predictOrdersPackageIdV1}::order_flow::OrderFlow`;
24
+ }
25
+ /**
26
+ * Read a market's queue state in one simulate: Predict's cash figures and gates, the queue's
27
+ * stuck gate, cohorts, heads and counters, and the desk's policy. With `owner`, also the
28
+ * account's waiting-order count and USDC balance (the owner must have an account: loading a
29
+ * missing wrapper aborts the read). With `recordIds`, also those records. The queue must exist.
30
+ */
31
+ async function marketQueueState(client, config, marketId, opts = {}) {
32
+ const queueId = queueIdOf(config, {
33
+ expiryMarketId: marketId,
34
+ queueId: opts.queueId
35
+ });
36
+ const tx = new Transaction();
37
+ let next = 0;
38
+ const results = [];
39
+ const add = (command) => {
40
+ results.push(tx.add(command));
41
+ return next++;
42
+ };
43
+ const market = { market: marketId };
44
+ const onQueue = { queue: queueId };
45
+ const i = {
46
+ expiry: add(expiry({
47
+ config,
48
+ arguments: market
49
+ })),
50
+ mintPaused: add(mintPaused({
51
+ config,
52
+ arguments: market
53
+ })),
54
+ cashBalance: add(cashBalance({
55
+ config,
56
+ arguments: market
57
+ })),
58
+ requiredCash: add(requiredCash({
59
+ config,
60
+ arguments: market
61
+ })),
62
+ backingBufferLambda: add(backingBufferLambda({
63
+ config,
64
+ arguments: market
65
+ })),
66
+ orderFlow: add(orderFlowState({
67
+ config,
68
+ arguments: market
69
+ })),
70
+ stuck: add(queueStuck({
71
+ config,
72
+ arguments: onQueue
73
+ })),
74
+ cohorts: add(waitingCohorts({
75
+ config,
76
+ arguments: onQueue
77
+ })),
78
+ heads: add(queueHeads({
79
+ config,
80
+ arguments: onQueue
81
+ })),
82
+ pending: add(pendingCounts({
83
+ config,
84
+ arguments: onQueue
85
+ })),
86
+ payout: add(payoutProgress({
87
+ config,
88
+ arguments: onQueue
89
+ })),
90
+ policy: add(policy({ config })),
91
+ deskWatermark: add(versionWatermark$1({ config })),
92
+ noTradeWindowMs: add(noTradeWindowMs({ config })),
93
+ subsidyRate: add(feeIncentiveSubsidyRate({ config })),
94
+ tradingPaused: add(tradingPaused({ config })),
95
+ frozen: add(frozen({ config })),
96
+ watermark: add(versionWatermark$2({ config })),
97
+ orderFlowEnabled: add(isOrderFlow({
98
+ config,
99
+ typeArguments: [orderFlowWitnessType(config)]
100
+ }))
101
+ };
102
+ let accountIdx = null;
103
+ if (opts.owner) {
104
+ if (!opts.quoteCoinType) throw new Error("marketQueueState: owner reads need quoteCoinType");
105
+ const accountId = deriveAccountIdFrom(config, opts.owner);
106
+ const waiting = add(waitingOrders({
107
+ config,
108
+ arguments: {
109
+ ...onQueue,
110
+ accountId
111
+ }
112
+ }));
113
+ const loaded = add(loadAccount({
114
+ config,
115
+ arguments: { self: deriveAccountWrapperIdFrom(config, opts.owner) }
116
+ }));
117
+ accountIdx = {
118
+ waiting,
119
+ balance: add(balance({
120
+ config,
121
+ typeArguments: [opts.quoteCoinType],
122
+ arguments: { self: results[loaded] }
123
+ })),
124
+ accountId
125
+ };
126
+ }
127
+ const recordIdx = (opts.recordIds ?? []).map((recordId) => add(order({
128
+ config,
129
+ arguments: {
130
+ ...onQueue,
131
+ recordId
132
+ }
133
+ })));
134
+ const cmds = await inspectReturns(client, tx);
135
+ const u64 = (idx, value = 0) => parseU64LE(cmds[idx][value]);
136
+ const cashBalance$1 = u64(i.cashBalance);
137
+ const requiredCash$1 = u64(i.requiredCash);
138
+ return {
139
+ marketId: normalizeSuiAddress(marketId),
140
+ queueId: normalizeSuiAddress(queueId),
141
+ expiryMs: u64(i.expiry),
142
+ mintPaused: parseBool(cmds[i.mintPaused][0]),
143
+ cashBalance: cashBalance$1,
144
+ requiredCash: requiredCash$1,
145
+ spareCash: cashBalance$1 > requiredCash$1 ? cashBalance$1 - requiredCash$1 : 0n,
146
+ waitingCashNeed: u64(i.orderFlow, 0),
147
+ payoutTreeNodeCount: u64(i.orderFlow, 1),
148
+ minEntryProbability: u64(i.orderFlow, 2),
149
+ backingBufferLambda: u64(i.backingBufferLambda),
150
+ stuck: parseBool(cmds[i.stuck][0]),
151
+ cohorts: {
152
+ count: u64(i.cohorts, 0),
153
+ oldestUncommittedTauMs: parseOptionalU64(cmds[i.cohorts][1]),
154
+ oldestUncommittedTauAboveCommittedMs: parseOptionalU64(cmds[i.cohorts][2])
155
+ },
156
+ heads: {
157
+ resolveHead: u64(i.heads, 0),
158
+ nextId: u64(i.heads, 1),
159
+ lastTauMs: u64(i.heads, 2),
160
+ lastCommittedTauMs: u64(i.heads, 3)
161
+ },
162
+ pending: {
163
+ mints: u64(i.pending, 0),
164
+ sells: u64(i.pending, 1)
165
+ },
166
+ payout: {
167
+ cursor: u64(i.payout, 0),
168
+ nextId: u64(i.payout, 1),
169
+ completed: parseBool(cmds[i.payout][2])
170
+ },
171
+ desk: {
172
+ id: normalizeSuiAddress(config.orderDesk),
173
+ policy: policyFromBcs(DelayedExecutionPolicy.parse(cmds[i.policy][0])),
174
+ versionWatermark: u64(i.deskWatermark)
175
+ },
176
+ protocol: {
177
+ noTradeWindowMs: u64(i.noTradeWindowMs),
178
+ feeIncentiveSubsidyRate: u64(i.subsidyRate),
179
+ tradingPaused: parseBool(cmds[i.tradingPaused][0]),
180
+ frozen: parseBool(cmds[i.frozen][0]),
181
+ versionWatermark: u64(i.watermark),
182
+ orderFlowEnabled: parseBool(cmds[i.orderFlowEnabled][0])
183
+ },
184
+ account: accountIdx ? {
185
+ accountId: accountIdx.accountId,
186
+ waitingOrders: u64(accountIdx.waiting),
187
+ availableRaw: u64(accountIdx.balance)
188
+ } : null,
189
+ records: recordIdx.map((idx) => OptionalOrderView.parse(cmds[idx][0]) ?? null)
190
+ };
191
+ }
192
+ /** Queue records by record ID (`queue::order`), `null` for a missing or cleaned-up one. One simulate. */
193
+ async function queuedOrders(client, config, target, recordIds) {
194
+ if (recordIds.length === 0) return [];
195
+ const queueId = queueIdOf(config, target);
196
+ const tx = new Transaction();
197
+ for (const recordId of recordIds) tx.add(order({
198
+ config,
199
+ arguments: {
200
+ queue: queueId,
201
+ recordId
202
+ }
203
+ }));
204
+ return (await inspectReturns(client, tx)).map((rv) => OptionalOrderView.parse(rv[0]) ?? null);
205
+ }
206
+ /**
207
+ * `ProtocolConfig.version_watermark`, read from the object's own BCS rather than a getter, so it
208
+ * works against any package version: the getter only exists from the delayed-execution package
209
+ * on, while the struct layout is frozen since v1.
210
+ */
211
+ async function versionWatermark(client, protocolConfigId) {
212
+ const { object } = await client.core.getObject({
213
+ objectId: protocolConfigId,
214
+ include: { content: true }
215
+ });
216
+ if (!object.content) throw new Error(`ProtocolConfig ${protocolConfigId} returned no content`);
217
+ return ProtocolConfig.parse(object.content).version_watermark;
218
+ }
219
+ /**
220
+ * The {@link ExecutionMode} for a watermark and what the config records.
221
+ * `recordsDelayedExecution`: the Predict upgrade, the order-flow companion and its desk, which
222
+ * queued orders need. `recordsPredictUpgrade`: the Predict upgrade alone
223
+ * (`packages.predictDelayedExecution`), which makes the config's Predict call target the package
224
+ * that retired the immediate trades. It defaults to `recordsDelayedExecution`.
225
+ */
226
+ function executionModeFor(watermark, recordsDelayedExecution, recordsPredictUpgrade = recordsDelayedExecution) {
227
+ if (watermark >= DELAYED_EXECUTION_VERSION) {
228
+ if (!recordsDelayedExecution) return "unsupported";
229
+ return watermark > PREDICT_PACKAGE_VERSION ? "retired" : "delayed";
230
+ }
231
+ return recordsDelayedExecution || recordsPredictUpgrade ? "awaiting-cutover" : "immediate";
232
+ }
233
+ /**
234
+ * USDC sent to an account's wrapper address with `send_funds` that the account hasn't settled
235
+ * yet: refunds, sell proceeds and settled payouts land here. `account::balance` already counts
236
+ * them, so this is for display ("pending funds"), not for sizing.
237
+ */
238
+ async function pendingFunds(client, wrapperId, coinType) {
239
+ const { balance: balance$1 } = await client.core.getBalance({
240
+ owner: wrapperId,
241
+ coinType
242
+ });
243
+ return BigInt(balance$1.addressBalance);
244
+ }
245
+ const LazerStatePrefix = bcs.struct("State", {
246
+ id: bcs.Address,
247
+ trusted_signers: bcs.vector(bcs.struct("TrustedSignerInfo", {
248
+ public_key: bcs.vector(bcs.u8()),
249
+ expires_at: bcs.u64()
250
+ })),
251
+ upgrade_cap: bcs.struct("UpgradeCap", {
252
+ id: bcs.Address,
253
+ package: bcs.Address,
254
+ version: bcs.u64(),
255
+ policy: bcs.u8()
256
+ })
257
+ });
258
+ /**
259
+ * The current Pyth Lazer package (from `State.upgrade_cap.package`) and the original ID that
260
+ * types `update::Update` (from the State's own type). Read it per filler batch and never cache
261
+ * it: a Lazer upgrade retires the old package at once.
262
+ */
263
+ async function lazerPackages(client, stateId) {
264
+ const { object } = await client.core.getObject({
265
+ objectId: stateId,
266
+ include: { content: true }
267
+ });
268
+ if (!object.content) throw new Error(`Lazer State ${stateId} returned no content`);
269
+ const [originalId, module, name] = object.type.split("::");
270
+ if (module !== "state" || name !== "State") throw new Error(`${stateId} is a ${object.type}, not a Pyth Lazer State`);
271
+ return {
272
+ stateId: normalizeSuiAddress(stateId),
273
+ packageId: normalizeSuiAddress(LazerStatePrefix.parse(object.content).upgrade_cap.package),
274
+ originalId: normalizeSuiAddress(originalId)
275
+ };
276
+ }
277
+ /**
278
+ * Quote an early sell of an Open record at a fresh live pricer (`load_live_pricer`, then the
279
+ * queue's `quote_redeem_open`, which prices through Predict's `quote_close`), and read the desk's
280
+ * policy for the order fee. `proceeds` is before the order fee, with no congestion penalty.
281
+ * Aborts `ERecordNotOpen` when the record isn't Open. It doesn't check that the wrapper's account
282
+ * owns the record: the wrapper only supplies the builder code.
283
+ */
284
+ async function quoteRedeemOpen(client, config, args) {
285
+ const tx = new Transaction();
286
+ const pricer = tx.add(loadLivePricer(config, args));
287
+ tx.add(quoteRedeemOpen$1({
288
+ config,
289
+ arguments: {
290
+ queue: queueIdOf(config, args),
291
+ market: args.expiryMarketId,
292
+ wrapper: args.wrapperId,
293
+ pricer,
294
+ recordId: args.recordId,
295
+ closeQuantity: args.closeQuantityRaw
296
+ }
297
+ }));
298
+ tx.add(policy({ config }));
299
+ const cmds = await inspectReturns(client, tx);
300
+ const q = RedeemQuote.parse(cmds[1][0]);
301
+ return {
302
+ quote: {
303
+ closeQuantity: q.close_quantity,
304
+ probability: q.probability,
305
+ proceeds: q.proceeds,
306
+ tradingFee: q.trading_fee,
307
+ builderFee: q.builder_fee,
308
+ inventoryImpactRebate: q.inventory_impact_rebate
309
+ },
310
+ policy: policyFromBcs(DelayedExecutionPolicy.parse(cmds[2][0]))
311
+ };
312
+ }
313
+ /**
314
+ * Quote a mint for one account without placing it: Predict's `quote_mint_for_account` (exact
315
+ * quantity and premium budget) or `quote_mint_exact_cost_for_account` (all-in budget), at a fresh
316
+ * live pricer. Both read the account's builder code and cap a budget at its balance. From the
317
+ * delayed-execution package on they price like a queued fill at the clock: no congestion penalty,
318
+ * and no trade-window or Pyth-staleness abort. They abort `EOrderFailsLimits` when the mint would
319
+ * be refused at the clock. With `ordersConfig`, also reads the order desk's policy.
320
+ */
321
+ async function quoteMintForAccount(client, config, args) {
322
+ const tx = new Transaction();
323
+ const pricer = tx.add(loadLivePricer(config, args));
324
+ const base = {
325
+ market: args.expiryMarketId,
326
+ wrapper: args.wrapperId,
327
+ pricer,
328
+ lowerTick: args.lowerTick,
329
+ higherTick: args.higherTick
330
+ };
331
+ const r = args.request;
332
+ if (r.shape === "exact-cost") tx.add(quoteMintExactCostForAccount({
333
+ config,
334
+ arguments: {
335
+ ...base,
336
+ maxCost: r.maxCostRaw,
337
+ minQuantity: r.minQuantityRaw
338
+ }
339
+ }));
340
+ else tx.add(quoteMintForAccount$1({
341
+ config,
342
+ arguments: r.shape === "exact-quantity" ? {
343
+ ...base,
344
+ maxPremium: 0n,
345
+ minQuantity: r.quantityRaw,
346
+ exactQuantity: true
347
+ } : {
348
+ ...base,
349
+ maxPremium: r.maxPremiumRaw,
350
+ minQuantity: r.minQuantityRaw,
351
+ exactQuantity: false
352
+ }
353
+ }));
354
+ if (args.ordersConfig) tx.add(policy({ config: args.ordersConfig }));
355
+ const cmds = await inspectReturns(client, tx);
356
+ const q = MintQuote.parse(cmds[1][0]);
357
+ return {
358
+ quote: {
359
+ quantity: q.quantity,
360
+ entryProbability: q.entry_probability,
361
+ premium: q.premium,
362
+ tradingFee: q.trading_fee,
363
+ feeIncentiveSubsidy: q.fee_incentive_subsidy,
364
+ builderFee: q.builder_fee,
365
+ penaltyFee: q.penalty_fee,
366
+ inventoryImpactCharge: q.inventory_impact_charge,
367
+ allInCost: q.all_in_cost
368
+ },
369
+ policy: args.ordersConfig ? policyFromBcs(DelayedExecutionPolicy.parse(cmds[2][0])) : null
370
+ };
371
+ }
372
+ /**
373
+ * Quote a mint for no particular account: Predict's `quote_mint`, at a fresh live pricer. It
374
+ * prices like a queued fill at the clock with no builder fee, so it previews a mint for a visitor
375
+ * without an account or a funded balance. It has no all-in budget mode. It aborts
376
+ * `EOrderFailsLimits` when the mint would be refused at the clock, for example below the 1 USDC
377
+ * minimum premium. With `ordersConfig`, also reads the order desk's policy.
378
+ */
379
+ async function quoteMintAnonymous(client, config, args) {
380
+ const tx = new Transaction();
381
+ const pricer = tx.add(loadLivePricer(config, args));
382
+ const r = args.request;
383
+ tx.add(quoteMint({
384
+ config,
385
+ arguments: {
386
+ market: args.expiryMarketId,
387
+ pricer,
388
+ lowerTick: args.lowerTick,
389
+ higherTick: args.higherTick,
390
+ ...r.shape === "exact-quantity" ? {
391
+ maxPremium: 0n,
392
+ minQuantity: r.quantityRaw,
393
+ exactQuantity: true
394
+ } : {
395
+ maxPremium: r.maxPremiumRaw,
396
+ minQuantity: r.minQuantityRaw,
397
+ exactQuantity: false
398
+ }
399
+ }
400
+ }));
401
+ if (args.ordersConfig) tx.add(policy({ config: args.ordersConfig }));
402
+ const cmds = await inspectReturns(client, tx);
403
+ const q = MintQuote.parse(cmds[1][0]);
404
+ return {
405
+ quote: {
406
+ quantity: q.quantity,
407
+ entryProbability: q.entry_probability,
408
+ premium: q.premium,
409
+ tradingFee: q.trading_fee,
410
+ feeIncentiveSubsidy: q.fee_incentive_subsidy,
411
+ builderFee: q.builder_fee,
412
+ penaltyFee: q.penalty_fee,
413
+ inventoryImpactCharge: q.inventory_impact_charge,
414
+ allInCost: q.all_in_cost
415
+ },
416
+ policy: args.ordersConfig ? policyFromBcs(DelayedExecutionPolicy.parse(cmds[2][0])) : null
417
+ };
418
+ }
419
+ /**
420
+ * The order desk's policy and an owner's USDC balance, in one simulate. The queued exact-cost
421
+ * quote needs both: enqueue escrows `min(max_cost, available − fee)`, while the chain quote caps
422
+ * at the whole balance.
423
+ */
424
+ async function orderFeeAndBalance(client, config, owner, coinType) {
425
+ const tx = new Transaction();
426
+ tx.add(policy({ config }));
427
+ const loaded = tx.add(loadAccount({
428
+ config,
429
+ arguments: { self: deriveAccountWrapperIdFrom(config, owner) }
430
+ }));
431
+ tx.add(balance({
432
+ config,
433
+ typeArguments: [coinType],
434
+ arguments: { self: loaded }
435
+ }));
436
+ const cmds = await inspectReturns(client, tx);
437
+ return {
438
+ policy: policyFromBcs(DelayedExecutionPolicy.parse(cmds[0][0])),
439
+ availableRaw: parseU64LE(cmds[2][0])
440
+ };
441
+ }
442
+
443
+ //#endregion
444
+ export { executionModeFor, lazerPackages, marketQueueState, orderFeeAndBalance, orderFlowWitnessType, pendingFunds, queuedOrders, quoteMintAnonymous, quoteMintForAccount, quoteRedeemOpen, versionWatermark };
445
+ //# sourceMappingURL=queue.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue.mjs","names":["OrderViewBcs","expiryMarket.expiry","expiryMarket.mintPaused","expiryMarket.cashBalance","expiryMarket.requiredCash","expiryMarket.backingBufferLambda","expiryMarket.orderFlowState","queue.queueStuck","queue.waitingCohorts","queue.queueHeads","queue.pendingCounts","queue.payoutProgress","desk.policy","desk.versionWatermark","protocolConfig.noTradeWindowMs","protocolConfig.feeIncentiveSubsidyRate","protocolConfig.tradingPaused","protocolConfig.frozen","protocolConfig.versionWatermark","protocolConfig.isOrderFlow","queue.waitingOrders","account.loadAccount","account.balance","queue.order","cashBalance","requiredCash","DelayedExecutionPolicyBcs","balance","queue.quoteRedeemOpen","expiryMarket.quoteMintExactCostForAccount","expiryMarket.quoteMintForAccount","expiryMarket.quoteMint"],"sources":["../../../src/predict/reads/queue.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n// Delayed execution (DBU-885): chain reads for the order queue. A market's queue is a\n// `MarketQueue` in the order-flow companion (`deepbook_predict_orders`), at an ID derived from the\n// companion's `OrderDesk` and the market, so these reads take `OrdersGeneratedConfig` and the\n// facade gates them on the config recording the companion. The market's cash figures stay\n// Predict reads. A market whose queue doesn't exist yet can't be read: the facade checks that\n// first.\nimport type { ClientWithCoreApi } from '@mysten/sui/client';\nimport { bcs } from '@mysten/sui/bcs';\nimport { Transaction, type TransactionResult } from '@mysten/sui/transactions';\nimport { normalizeSuiAddress } from '@mysten/sui/utils';\nimport type { GeneratedConfig, OrdersGeneratedConfig } from '../config/generated.js';\nimport {\n\tDELAYED_EXECUTION_VERSION,\n\tPREDICT_PACKAGE_VERSION,\n\tpolicyFromBcs,\n\ttype DelayedExecutionPolicy,\n\ttype QueueHeads,\n\ttype QueuedOrder,\n} from '../queue.js';\nimport { deriveAccountIdFrom, deriveAccountWrapperIdFrom } from '../tx/common.js';\nimport { queueIdOf, type QueueTarget } from '../tx/queue.js';\nimport { loadLivePricer, type MarketFeeds } from '../tx/trade.js';\nimport { accountMoveCalls as account } from '../../account.js';\nimport * as expiryMarket from '../../contracts/deepbook_predict/expiry_market.js';\nimport * as protocolConfig from '../../contracts/deepbook_predict/protocol_config.js';\nimport { DelayedExecutionPolicy as DelayedExecutionPolicyBcs } from '../../contracts/deepbook_predict_orders/delayed_execution_config.js';\nimport * as desk from '../../contracts/deepbook_predict_orders/desk.js';\nimport { OrderView as OrderViewBcs } from '../../contracts/deepbook_predict_orders/order_queue.js';\nimport * as queue from '../../contracts/deepbook_predict_orders/queue.js';\nimport { inspectReturns, type ReadClient } from './inspect.js';\nimport { parseOptionalU64, parseU64LE } from './parse.js';\n\nconst parseBool = (bytes: Uint8Array): boolean => (bytes[0] ?? 0) !== 0;\nconst OptionalOrderView = bcs.option(OrderViewBcs);\n\n/** The companion's `order_flow::OrderFlow` witness type, which Predict's allowlist names. */\nexport function orderFlowWitnessType(\n\tconfig: Pick<OrdersGeneratedConfig, 'predictOrdersPackageIdV1'>,\n) {\n\treturn `${config.predictOrdersPackageIdV1}::order_flow::OrderFlow`;\n}\n\n/** Everything the queued-order preflight and the app's queue view read, from one simulate. */\nexport interface MarketQueueState {\n\tmarketId: string;\n\t/** The market's `MarketQueue`. */\n\tqueueId: string;\n\texpiryMs: bigint;\n\tmintPaused: boolean;\n\tcashBalance: bigint;\n\trequiredCash: bigint;\n\t/**\n\t * Cash above required cash, 0 when below: the largest cash need a new queued mint may have\n\t * now (Predict's admission refuses a larger one).\n\t */\n\tspareCash: bigint;\n\t/** Summed cash need of the admitted orders; `rebalance_expiry_cash` funds it. */\n\twaitingCashNeed: bigint;\n\t/** 1e9-scaled. The mint cash-need formulas take it. */\n\tminEntryProbability: bigint;\n\t/** 1e9-scaled λ. The sell cash-need formula takes it. */\n\tbackingBufferLambda: bigint;\n\t/** Sizes a filler's resolve batch. */\n\tpayoutTreeNodeCount: bigint;\n\t/** `queue_stuck`: enqueue would refuse as stuck right now (\"pricing delayed\"). */\n\tstuck: boolean;\n\tcohorts: {\n\t\tcount: bigint;\n\t\toldestUncommittedTauMs: bigint | null;\n\t\t/** The cohort the stuck gate's first rule watches. */\n\t\toldestUncommittedTauAboveCommittedMs: bigint | null;\n\t};\n\theads: QueueHeads;\n\t/** Unfinished mints and sells, against the policy capacities. */\n\tpending: { mints: bigint; sells: bigint };\n\t/**\n\t * The settlement payout walk (`settle_step`): it resumes at `cursor`, and `completed` is set\n\t * by the call that emits `MarketPayoutsCompleted`.\n\t */\n\tpayout: { cursor: bigint; nextId: bigint; completed: boolean };\n\t/** The companion's `OrderDesk`: the policy every queue runs under, and its version floor. */\n\tdesk: {\n\t\tid: string;\n\t\tpolicy: DelayedExecutionPolicy;\n\t\tversionWatermark: bigint;\n\t};\n\tprotocol: {\n\t\tnoTradeWindowMs: bigint;\n\t\t/** The admin-set mint fee subsidy rate, 1e9-scaled (20% when unset). */\n\t\tfeeIncentiveSubsidyRate: bigint;\n\t\ttradingPaused: boolean;\n\t\tfrozen: boolean;\n\t\t/** Predict's version floor. Enqueue needs it at `DELAYED_EXECUTION_VERSION`. */\n\t\tversionWatermark: bigint;\n\t\t/**\n\t\t * Whether Predict allowlists this companion's `OrderFlow` witness\n\t\t * (`protocol_config::set_order_flow`). Predict's admission, commit and fill refuse it until\n\t\t * then (`EOrderFlowNotAllowed`).\n\t\t */\n\t\torderFlowEnabled: boolean;\n\t};\n\t/** Present when an owner was given. */\n\taccount: {\n\t\taccountId: string;\n\t\t/**\n\t\t * Unfinished orders the account holds in this market, against `per_account_cap`. Stale\n\t\t * after expiry: the settlement drain refunds without lowering it.\n\t\t */\n\t\twaitingOrders: bigint;\n\t\t/** `account::balance<USDC>`, unsettled accumulator funds included. */\n\t\tavailableRaw: bigint;\n\t} | null;\n\t/** One entry per requested record ID: the record, or `null` when missing or deleted. */\n\trecords: (QueuedOrder | null)[];\n}\n\n/**\n * Read a market's queue state in one simulate: Predict's cash figures and gates, the queue's\n * stuck gate, cohorts, heads and counters, and the desk's policy. With `owner`, also the\n * account's waiting-order count and USDC balance (the owner must have an account: loading a\n * missing wrapper aborts the read). With `recordIds`, also those records. The queue must exist.\n */\nexport async function marketQueueState(\n\tclient: ReadClient,\n\tconfig: OrdersGeneratedConfig,\n\tmarketId: string,\n\topts: {\n\t\towner?: string;\n\t\tquoteCoinType?: string;\n\t\trecordIds?: readonly bigint[];\n\t\tqueueId?: string;\n\t} = {},\n): Promise<MarketQueueState> {\n\tconst queueId = queueIdOf(config, { expiryMarketId: marketId, queueId: opts.queueId });\n\tconst tx = new Transaction();\n\tlet next = 0;\n\tconst results: TransactionResult[] = [];\n\tconst add = (command: (tx: Transaction) => TransactionResult): number => {\n\t\tresults.push(tx.add(command));\n\t\treturn next++;\n\t};\n\tconst market = { market: marketId };\n\tconst onQueue = { queue: queueId };\n\tconst i = {\n\t\texpiry: add(expiryMarket.expiry({ config, arguments: market })),\n\t\tmintPaused: add(expiryMarket.mintPaused({ config, arguments: market })),\n\t\tcashBalance: add(expiryMarket.cashBalance({ config, arguments: market })),\n\t\trequiredCash: add(expiryMarket.requiredCash({ config, arguments: market })),\n\t\tbackingBufferLambda: add(expiryMarket.backingBufferLambda({ config, arguments: market })),\n\t\torderFlow: add(expiryMarket.orderFlowState({ config, arguments: market })),\n\t\tstuck: add(queue.queueStuck({ config, arguments: onQueue })),\n\t\tcohorts: add(queue.waitingCohorts({ config, arguments: onQueue })),\n\t\theads: add(queue.queueHeads({ config, arguments: onQueue })),\n\t\tpending: add(queue.pendingCounts({ config, arguments: onQueue })),\n\t\tpayout: add(queue.payoutProgress({ config, arguments: onQueue })),\n\t\tpolicy: add(desk.policy({ config })),\n\t\tdeskWatermark: add(desk.versionWatermark({ config })),\n\t\tnoTradeWindowMs: add(protocolConfig.noTradeWindowMs({ config })),\n\t\tsubsidyRate: add(protocolConfig.feeIncentiveSubsidyRate({ config })),\n\t\ttradingPaused: add(protocolConfig.tradingPaused({ config })),\n\t\tfrozen: add(protocolConfig.frozen({ config })),\n\t\twatermark: add(protocolConfig.versionWatermark({ config })),\n\t\torderFlowEnabled: add(\n\t\t\tprotocolConfig.isOrderFlow({ config, typeArguments: [orderFlowWitnessType(config)] }),\n\t\t),\n\t};\n\tlet accountIdx: { waiting: number; balance: number; accountId: string } | null = null;\n\tif (opts.owner) {\n\t\tif (!opts.quoteCoinType) throw new Error('marketQueueState: owner reads need quoteCoinType');\n\t\tconst accountId = deriveAccountIdFrom(config, opts.owner);\n\t\tconst waiting = add(queue.waitingOrders({ config, arguments: { ...onQueue, accountId } }));\n\t\tconst loaded = add(\n\t\t\taccount.loadAccount({\n\t\t\t\tconfig,\n\t\t\t\targuments: { self: deriveAccountWrapperIdFrom(config, opts.owner) },\n\t\t\t}),\n\t\t);\n\t\tconst balance = add(\n\t\t\taccount.balance({\n\t\t\t\tconfig,\n\t\t\t\ttypeArguments: [opts.quoteCoinType],\n\t\t\t\targuments: { self: results[loaded] },\n\t\t\t}),\n\t\t);\n\t\taccountIdx = { waiting, balance, accountId };\n\t}\n\tconst recordIdx = (opts.recordIds ?? []).map((recordId) =>\n\t\tadd(queue.order({ config, arguments: { ...onQueue, recordId } })),\n\t);\n\n\tconst cmds = await inspectReturns(client, tx);\n\tconst u64 = (idx: number, value = 0) => parseU64LE(cmds[idx][value]);\n\tconst cashBalance = u64(i.cashBalance);\n\tconst requiredCash = u64(i.requiredCash);\n\treturn {\n\t\tmarketId: normalizeSuiAddress(marketId),\n\t\tqueueId: normalizeSuiAddress(queueId),\n\t\texpiryMs: u64(i.expiry),\n\t\tmintPaused: parseBool(cmds[i.mintPaused][0]),\n\t\tcashBalance,\n\t\trequiredCash,\n\t\tspareCash: cashBalance > requiredCash ? cashBalance - requiredCash : 0n,\n\t\twaitingCashNeed: u64(i.orderFlow, 0),\n\t\tpayoutTreeNodeCount: u64(i.orderFlow, 1),\n\t\tminEntryProbability: u64(i.orderFlow, 2),\n\t\tbackingBufferLambda: u64(i.backingBufferLambda),\n\t\tstuck: parseBool(cmds[i.stuck][0]),\n\t\tcohorts: {\n\t\t\tcount: u64(i.cohorts, 0),\n\t\t\toldestUncommittedTauMs: parseOptionalU64(cmds[i.cohorts][1]),\n\t\t\toldestUncommittedTauAboveCommittedMs: parseOptionalU64(cmds[i.cohorts][2]),\n\t\t},\n\t\theads: {\n\t\t\tresolveHead: u64(i.heads, 0),\n\t\t\tnextId: u64(i.heads, 1),\n\t\t\tlastTauMs: u64(i.heads, 2),\n\t\t\tlastCommittedTauMs: u64(i.heads, 3),\n\t\t},\n\t\tpending: { mints: u64(i.pending, 0), sells: u64(i.pending, 1) },\n\t\tpayout: {\n\t\t\tcursor: u64(i.payout, 0),\n\t\t\tnextId: u64(i.payout, 1),\n\t\t\tcompleted: parseBool(cmds[i.payout][2]),\n\t\t},\n\t\tdesk: {\n\t\t\tid: normalizeSuiAddress(config.orderDesk),\n\t\t\tpolicy: policyFromBcs(DelayedExecutionPolicyBcs.parse(cmds[i.policy][0])),\n\t\t\tversionWatermark: u64(i.deskWatermark),\n\t\t},\n\t\tprotocol: {\n\t\t\tnoTradeWindowMs: u64(i.noTradeWindowMs),\n\t\t\tfeeIncentiveSubsidyRate: u64(i.subsidyRate),\n\t\t\ttradingPaused: parseBool(cmds[i.tradingPaused][0]),\n\t\t\tfrozen: parseBool(cmds[i.frozen][0]),\n\t\t\tversionWatermark: u64(i.watermark),\n\t\t\torderFlowEnabled: parseBool(cmds[i.orderFlowEnabled][0]),\n\t\t},\n\t\taccount: accountIdx\n\t\t\t? {\n\t\t\t\t\taccountId: accountIdx.accountId,\n\t\t\t\t\twaitingOrders: u64(accountIdx.waiting),\n\t\t\t\t\tavailableRaw: u64(accountIdx.balance),\n\t\t\t\t}\n\t\t\t: null,\n\t\trecords: recordIdx.map((idx) => OptionalOrderView.parse(cmds[idx][0]) ?? null),\n\t};\n}\n\n/** Queue records by record ID (`queue::order`), `null` for a missing or cleaned-up one. One simulate. */\nexport async function queuedOrders(\n\tclient: ReadClient,\n\tconfig: OrdersGeneratedConfig,\n\ttarget: QueueTarget,\n\trecordIds: readonly bigint[],\n): Promise<(QueuedOrder | null)[]> {\n\tif (recordIds.length === 0) return [];\n\tconst queueId = queueIdOf(config, target);\n\tconst tx = new Transaction();\n\tfor (const recordId of recordIds) {\n\t\ttx.add(queue.order({ config, arguments: { queue: queueId, recordId } }));\n\t}\n\tconst cmds = await inspectReturns(client, tx);\n\treturn cmds.map((rv) => OptionalOrderView.parse(rv[0]) ?? null);\n}\n\n/**\n * `ProtocolConfig.version_watermark`, read from the object's own BCS rather than a getter, so it\n * works against any package version: the getter only exists from the delayed-execution package\n * on, while the struct layout is frozen since v1.\n */\nexport async function versionWatermark(\n\tclient: ClientWithCoreApi,\n\tprotocolConfigId: string,\n): Promise<bigint> {\n\tconst { object } = await client.core.getObject({\n\t\tobjectId: protocolConfigId,\n\t\tinclude: { content: true },\n\t});\n\tif (!object.content) throw new Error(`ProtocolConfig ${protocolConfigId} returned no content`);\n\treturn protocolConfig.ProtocolConfig.parse(object.content).version_watermark;\n}\n\n/**\n * Which trade path a network is on:\n * - `'immediate'`: the watermark isn't raised and this SDK has no delayed-execution record, so\n * its call target is a pre-v4 Predict package. Use the immediate `mint*` / `redeem` builders.\n * - `'awaiting-cutover'`: the config records delayed execution but the watermark isn't raised.\n * Nothing trades: enqueue aborts `ECutoverNotReached`, and the immediate builders abort in the\n * v4 package the config calls (`EDelayedExecutionRequired`). Trading stays paused through the\n * cutover.\n * - `'delayed'`: the watermark is raised. Use the `enqueue*` builders; the immediate ones abort\n * `EDelayedExecutionRequired`.\n * - `'unsupported'`: the watermark is raised but this SDK's config has no delayed-execution\n * record for the network. Upgrade the SDK, or pass a config that records it.\n * - `'retired'`: the watermark is above the Predict code version this SDK calls\n * (`PREDICT_PACKAGE_VERSION`), so every version-gated call aborts `EPackageVersionDisabled`.\n * Upgrade the SDK.\n */\nexport type ExecutionMode =\n\t'immediate' | 'awaiting-cutover' | 'delayed' | 'unsupported' | 'retired';\n\n/**\n * The {@link ExecutionMode} for a watermark and what the config records.\n * `recordsDelayedExecution`: the Predict upgrade, the order-flow companion and its desk, which\n * queued orders need. `recordsPredictUpgrade`: the Predict upgrade alone\n * (`packages.predictDelayedExecution`), which makes the config's Predict call target the package\n * that retired the immediate trades. It defaults to `recordsDelayedExecution`.\n */\nexport function executionModeFor(\n\twatermark: bigint,\n\trecordsDelayedExecution: boolean,\n\trecordsPredictUpgrade: boolean = recordsDelayedExecution,\n): ExecutionMode {\n\tif (watermark >= DELAYED_EXECUTION_VERSION) {\n\t\tif (!recordsDelayedExecution) return 'unsupported';\n\t\treturn watermark > PREDICT_PACKAGE_VERSION ? 'retired' : 'delayed';\n\t}\n\treturn recordsDelayedExecution || recordsPredictUpgrade ? 'awaiting-cutover' : 'immediate';\n}\n\n/**\n * USDC sent to an account's wrapper address with `send_funds` that the account hasn't settled\n * yet: refunds, sell proceeds and settled payouts land here. `account::balance` already counts\n * them, so this is for display (\"pending funds\"), not for sizing.\n */\nexport async function pendingFunds(\n\tclient: ClientWithCoreApi,\n\twrapperId: string,\n\tcoinType: string,\n): Promise<bigint> {\n\tconst { balance } = await client.core.getBalance({ owner: wrapperId, coinType });\n\treturn BigInt(balance.addressBalance);\n}\n\n// The prefix of `pyth_lazer::state::State` up to the upgrade cap, identical in the testnet and\n// mainnet vendored sources. Parsing a prefix ignores the trailing `governance` field.\nconst LazerStatePrefix = bcs.struct('State', {\n\tid: bcs.Address,\n\ttrusted_signers: bcs.vector(\n\t\tbcs.struct('TrustedSignerInfo', { public_key: bcs.vector(bcs.u8()), expires_at: bcs.u64() }),\n\t),\n\tupgrade_cap: bcs.struct('UpgradeCap', {\n\t\tid: bcs.Address,\n\t\tpackage: bcs.Address,\n\t\tversion: bcs.u64(),\n\t\tpolicy: bcs.u8(),\n\t}),\n});\n\n/**\n * The current Pyth Lazer package (from `State.upgrade_cap.package`) and the original ID that\n * types `update::Update` (from the State's own type). Read it per filler batch and never cache\n * it: a Lazer upgrade retires the old package at once.\n */\nexport async function lazerPackages(\n\tclient: ClientWithCoreApi,\n\tstateId: string,\n): Promise<{ stateId: string; packageId: string; originalId: string }> {\n\tconst { object } = await client.core.getObject({ objectId: stateId, include: { content: true } });\n\tif (!object.content) throw new Error(`Lazer State ${stateId} returned no content`);\n\tconst [originalId, module, name] = object.type.split('::');\n\tif (module !== 'state' || name !== 'State') {\n\t\tthrow new Error(`${stateId} is a ${object.type}, not a Pyth Lazer State`);\n\t}\n\treturn {\n\t\tstateId: normalizeSuiAddress(stateId),\n\t\tpackageId: normalizeSuiAddress(LazerStatePrefix.parse(object.content).upgrade_cap.package),\n\t\toriginalId: normalizeSuiAddress(originalId),\n\t};\n}\n\n/** `expiry_market::RedeemQuote` with camelCase keys. `proceeds` is before the order fee. */\nexport interface RedeemOpenQuoteRaw {\n\tcloseQuantity: bigint;\n\tprobability: bigint;\n\tproceeds: bigint;\n\ttradingFee: bigint;\n\tbuilderFee: bigint;\n\tinventoryImpactRebate: bigint;\n}\n\n/**\n * Quote an early sell of an Open record at a fresh live pricer (`load_live_pricer`, then the\n * queue's `quote_redeem_open`, which prices through Predict's `quote_close`), and read the desk's\n * policy for the order fee. `proceeds` is before the order fee, with no congestion penalty.\n * Aborts `ERecordNotOpen` when the record isn't Open. It doesn't check that the wrapper's account\n * owns the record: the wrapper only supplies the builder code.\n */\nexport async function quoteRedeemOpen(\n\tclient: ReadClient,\n\tconfig: OrdersGeneratedConfig,\n\targs: QueueTarget & {\n\t\twrapperId: string;\n\t\trecordId: bigint;\n\t\tcloseQuantityRaw: bigint;\n\t} & MarketFeeds,\n): Promise<{ quote: RedeemOpenQuoteRaw; policy: DelayedExecutionPolicy }> {\n\tconst tx = new Transaction();\n\tconst pricer = tx.add(loadLivePricer(config, args));\n\ttx.add(\n\t\tqueue.quoteRedeemOpen({\n\t\t\tconfig,\n\t\t\targuments: {\n\t\t\t\tqueue: queueIdOf(config, args),\n\t\t\t\tmarket: args.expiryMarketId,\n\t\t\t\twrapper: args.wrapperId,\n\t\t\t\tpricer,\n\t\t\t\trecordId: args.recordId,\n\t\t\t\tcloseQuantity: args.closeQuantityRaw,\n\t\t\t},\n\t\t}),\n\t);\n\ttx.add(desk.policy({ config }));\n\tconst cmds = await inspectReturns(client, tx);\n\tconst q = expiryMarket.RedeemQuote.parse(cmds[1][0]);\n\treturn {\n\t\tquote: {\n\t\t\tcloseQuantity: q.close_quantity,\n\t\t\tprobability: q.probability,\n\t\t\tproceeds: q.proceeds,\n\t\t\ttradingFee: q.trading_fee,\n\t\t\tbuilderFee: q.builder_fee,\n\t\t\tinventoryImpactRebate: q.inventory_impact_rebate,\n\t\t},\n\t\tpolicy: policyFromBcs(DelayedExecutionPolicyBcs.parse(cmds[2][0])),\n\t};\n}\n\n/**\n * `expiry_market::MintQuote` with camelCase keys. `allInCost` includes `penaltyFee`, which the\n * delayed-execution package always quotes as 0: its quotes price like a queued fill.\n */\nexport interface MintQuoteRaw {\n\tquantity: bigint;\n\tentryProbability: bigint;\n\tpremium: bigint;\n\ttradingFee: bigint;\n\tfeeIncentiveSubsidy: bigint;\n\tbuilderFee: bigint;\n\tpenaltyFee: bigint;\n\tinventoryImpactCharge: bigint;\n\tallInCost: bigint;\n}\n\n/** What to quote: an exact quantity, a premium budget, or an all-in budget. */\nexport type MintQuoteRequest =\n\t| { shape: 'exact-quantity'; quantityRaw: bigint }\n\t| { shape: 'exact-amount'; maxPremiumRaw: bigint; minQuantityRaw: bigint }\n\t| { shape: 'exact-cost'; maxCostRaw: bigint; minQuantityRaw: bigint };\n\n/**\n * Quote a mint for one account without placing it: Predict's `quote_mint_for_account` (exact\n * quantity and premium budget) or `quote_mint_exact_cost_for_account` (all-in budget), at a fresh\n * live pricer. Both read the account's builder code and cap a budget at its balance. From the\n * delayed-execution package on they price like a queued fill at the clock: no congestion penalty,\n * and no trade-window or Pyth-staleness abort. They abort `EOrderFailsLimits` when the mint would\n * be refused at the clock. With `ordersConfig`, also reads the order desk's policy.\n */\nexport async function quoteMintForAccount(\n\tclient: ReadClient,\n\tconfig: GeneratedConfig,\n\targs: {\n\t\texpiryMarketId: string;\n\t\twrapperId: string;\n\t\tlowerTick: bigint;\n\t\thigherTick: bigint;\n\t\trequest: MintQuoteRequest;\n\t\t/** Also read the order desk's policy, in the same simulate. */\n\t\tordersConfig?: OrdersGeneratedConfig;\n\t} & MarketFeeds,\n): Promise<{ quote: MintQuoteRaw; policy: DelayedExecutionPolicy | null }> {\n\tconst tx = new Transaction();\n\tconst pricer = tx.add(loadLivePricer(config, args));\n\tconst base = {\n\t\tmarket: args.expiryMarketId,\n\t\twrapper: args.wrapperId,\n\t\tpricer,\n\t\tlowerTick: args.lowerTick,\n\t\thigherTick: args.higherTick,\n\t};\n\tconst r = args.request;\n\tif (r.shape === 'exact-cost') {\n\t\ttx.add(\n\t\t\texpiryMarket.quoteMintExactCostForAccount({\n\t\t\t\tconfig,\n\t\t\t\targuments: { ...base, maxCost: r.maxCostRaw, minQuantity: r.minQuantityRaw },\n\t\t\t}),\n\t\t);\n\t} else {\n\t\ttx.add(\n\t\t\texpiryMarket.quoteMintForAccount({\n\t\t\t\tconfig,\n\t\t\t\targuments:\n\t\t\t\t\tr.shape === 'exact-quantity'\n\t\t\t\t\t\t? { ...base, maxPremium: 0n, minQuantity: r.quantityRaw, exactQuantity: true }\n\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\t...base,\n\t\t\t\t\t\t\t\tmaxPremium: r.maxPremiumRaw,\n\t\t\t\t\t\t\t\tminQuantity: r.minQuantityRaw,\n\t\t\t\t\t\t\t\texactQuantity: false,\n\t\t\t\t\t\t\t},\n\t\t\t}),\n\t\t);\n\t}\n\tif (args.ordersConfig) tx.add(desk.policy({ config: args.ordersConfig }));\n\tconst cmds = await inspectReturns(client, tx);\n\tconst q = expiryMarket.MintQuote.parse(cmds[1][0]);\n\tconst quote: MintQuoteRaw = {\n\t\tquantity: q.quantity,\n\t\tentryProbability: q.entry_probability,\n\t\tpremium: q.premium,\n\t\ttradingFee: q.trading_fee,\n\t\tfeeIncentiveSubsidy: q.fee_incentive_subsidy,\n\t\tbuilderFee: q.builder_fee,\n\t\tpenaltyFee: q.penalty_fee,\n\t\tinventoryImpactCharge: q.inventory_impact_charge,\n\t\tallInCost: q.all_in_cost,\n\t};\n\tconst policy = args.ordersConfig\n\t\t? policyFromBcs(DelayedExecutionPolicyBcs.parse(cmds[2][0]))\n\t\t: null;\n\treturn { quote, policy };\n}\n\n/** What `quote_mint` quotes: an exact quantity, or the largest quantity a premium budget buys. */\nexport type AnonymousMintQuoteRequest = Exclude<MintQuoteRequest, { shape: 'exact-cost' }>;\n\n/**\n * Quote a mint for no particular account: Predict's `quote_mint`, at a fresh live pricer. It\n * prices like a queued fill at the clock with no builder fee, so it previews a mint for a visitor\n * without an account or a funded balance. It has no all-in budget mode. It aborts\n * `EOrderFailsLimits` when the mint would be refused at the clock, for example below the 1 USDC\n * minimum premium. With `ordersConfig`, also reads the order desk's policy.\n */\nexport async function quoteMintAnonymous(\n\tclient: ReadClient,\n\tconfig: GeneratedConfig,\n\targs: {\n\t\texpiryMarketId: string;\n\t\tlowerTick: bigint;\n\t\thigherTick: bigint;\n\t\trequest: AnonymousMintQuoteRequest;\n\t\tordersConfig?: OrdersGeneratedConfig;\n\t} & MarketFeeds,\n): Promise<{ quote: MintQuoteRaw; policy: DelayedExecutionPolicy | null }> {\n\tconst tx = new Transaction();\n\tconst pricer = tx.add(loadLivePricer(config, args));\n\tconst r = args.request;\n\ttx.add(\n\t\texpiryMarket.quoteMint({\n\t\t\tconfig,\n\t\t\targuments: {\n\t\t\t\tmarket: args.expiryMarketId,\n\t\t\t\tpricer,\n\t\t\t\tlowerTick: args.lowerTick,\n\t\t\t\thigherTick: args.higherTick,\n\t\t\t\t...(r.shape === 'exact-quantity'\n\t\t\t\t\t? { maxPremium: 0n, minQuantity: r.quantityRaw, exactQuantity: true }\n\t\t\t\t\t: { maxPremium: r.maxPremiumRaw, minQuantity: r.minQuantityRaw, exactQuantity: false }),\n\t\t\t},\n\t\t}),\n\t);\n\tif (args.ordersConfig) tx.add(desk.policy({ config: args.ordersConfig }));\n\tconst cmds = await inspectReturns(client, tx);\n\tconst q = expiryMarket.MintQuote.parse(cmds[1][0]);\n\treturn {\n\t\tquote: {\n\t\t\tquantity: q.quantity,\n\t\t\tentryProbability: q.entry_probability,\n\t\t\tpremium: q.premium,\n\t\t\ttradingFee: q.trading_fee,\n\t\t\tfeeIncentiveSubsidy: q.fee_incentive_subsidy,\n\t\t\tbuilderFee: q.builder_fee,\n\t\t\tpenaltyFee: q.penalty_fee,\n\t\t\tinventoryImpactCharge: q.inventory_impact_charge,\n\t\t\tallInCost: q.all_in_cost,\n\t\t},\n\t\tpolicy: args.ordersConfig ? policyFromBcs(DelayedExecutionPolicyBcs.parse(cmds[2][0])) : null,\n\t};\n}\n\n/**\n * The order desk's policy and an owner's USDC balance, in one simulate. The queued exact-cost\n * quote needs both: enqueue escrows `min(max_cost, available − fee)`, while the chain quote caps\n * at the whole balance.\n */\nexport async function orderFeeAndBalance(\n\tclient: ReadClient,\n\tconfig: OrdersGeneratedConfig,\n\towner: string,\n\tcoinType: string,\n): Promise<{ policy: DelayedExecutionPolicy; availableRaw: bigint }> {\n\tconst tx = new Transaction();\n\ttx.add(desk.policy({ config }));\n\tconst loaded = tx.add(\n\t\taccount.loadAccount({ config, arguments: { self: deriveAccountWrapperIdFrom(config, owner) } }),\n\t);\n\ttx.add(account.balance({ config, typeArguments: [coinType], arguments: { self: loaded } }));\n\tconst cmds = await inspectReturns(client, tx);\n\treturn {\n\t\tpolicy: policyFromBcs(DelayedExecutionPolicyBcs.parse(cmds[0][0])),\n\t\tavailableRaw: parseU64LE(cmds[2][0]),\n\t};\n}\n"],"mappings":"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"}
@@ -6,6 +6,14 @@ declare function binaryRangeTicks(strikeRaw: bigint, side: Side, tickSize: bigin
6
6
  lowerTick: bigint;
7
7
  higherTick: bigint;
8
8
  };
9
+ /**
10
+ * Snap a strike in USD to a market's admission grid (`MarketSummary.admissionTickSize`), the step
11
+ * every new mint boundary must be a whole multiple of. Use it on a form's bound inputs: `'down'`
12
+ * for a lower bound and `'up'` for an upper bound keep a range from shrinking past what was typed,
13
+ * and `'nearest'` (the default) suits a single strike. Exact: it rounds in the 1e9-scaled integers
14
+ * the chain uses, not in floating point.
15
+ */
16
+ declare function snapStrike(price: number, admissionTickSize: number, mode?: 'down' | 'up' | 'nearest'): number;
9
17
  //#endregion
10
- export { POS_INF_TICK, Side, binaryRangeTicks };
18
+ export { POS_INF_TICK, Side, binaryRangeTicks, snapStrike };
11
19
  //# sourceMappingURL=ticks.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ticks.d.mts","names":[],"sources":["../../src/predict/ticks.ts"],"mappings":";;cAOa,YAAA;AAAA,KAED,IAAA;AAAA,iBAOI,gBAAA,CACf,SAAA,UACA,IAAA,EAAM,IAAA,EACN,QAAA;EACI,SAAA;EAAmB,UAAA;AAAA"}
1
+ {"version":3,"file":"ticks.d.mts","names":[],"sources":["../../src/predict/ticks.ts"],"mappings":";;cAOa,YAAA;AAAA,KAED,IAAA;AAAA,iBAOI,gBAAA,CACf,SAAA,UACA,IAAA,EAAM,IAAA,EACN,QAAA;EACI,SAAA;EAAmB,UAAA;AAAA;;;;;AAJxB;;;iBAkCgB,UAAA,CACf,KAAA,UACA,iBAAA,UACA,IAAA"}
@@ -15,7 +15,24 @@ function binaryRangeTicks(strikeRaw, side, tickSize) {
15
15
  higherTick: isUp ? POS_INF_TICK : tick
16
16
  };
17
17
  }
18
+ /**
19
+ * Snap a strike in USD to a market's admission grid (`MarketSummary.admissionTickSize`), the step
20
+ * every new mint boundary must be a whole multiple of. Use it on a form's bound inputs: `'down'`
21
+ * for a lower bound and `'up'` for an upper bound keep a range from shrinking past what was typed,
22
+ * and `'nearest'` (the default) suits a single strike. Exact: it rounds in the 1e9-scaled integers
23
+ * the chain uses, not in floating point.
24
+ */
25
+ function snapStrike(price, admissionTickSize, mode = "nearest") {
26
+ if (!(Number.isFinite(price) && price > 0)) throw new PredictInputError(`strike must be a positive number, got ${price}`);
27
+ if (!(Number.isFinite(admissionTickSize) && admissionTickSize > 0)) throw new PredictInputError(`admissionTickSize must be positive, got ${admissionTickSize}`);
28
+ const step = BigInt(Math.round(admissionTickSize * 1e9));
29
+ const raw = BigInt(Math.round(price * 1e9));
30
+ const below = raw / step * step;
31
+ const snapped = mode === "down" || raw === below ? below : mode === "up" ? below + step : raw - below < below + step - raw ? below : below + step;
32
+ if (snapped === 0n) throw new PredictInputError(`strike ${price} snaps below the first ${admissionTickSize} step`);
33
+ return Number(snapped) / 1e9;
34
+ }
18
35
 
19
36
  //#endregion
20
- export { POS_INF_TICK, binaryRangeTicks };
37
+ export { POS_INF_TICK, binaryRangeTicks, snapStrike };
21
38
  //# sourceMappingURL=ticks.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ticks.mjs","names":[],"sources":["../../src/predict/ticks.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\nimport { PredictInputError } from './errors.js';\n\nconst TICK_BITS = 30n;\n\n/** +inf sentinel tick: the upper bound of an UP range. */\nexport const POS_INF_TICK = (1n << TICK_BITS) - 1n;\n\nexport type Side = 'up' | 'down';\n\n// Convert a raw binary-range strike to the `(lower_tick, higher_tick)` pair the\n// `mint` entrypoint takes directly (there is no standalone packed range key).\n// An UP order is `(strike, +inf)` -> lower_tick = strike/tick_size, higher_tick =\n// POS_INF_TICK; a DOWN order is `(-inf, strike)` -> lower_tick = 0 (neg-inf),\n// higher_tick = strike/tick_size.\nexport function binaryRangeTicks(\n\tstrikeRaw: bigint,\n\tside: Side,\n\ttickSize: bigint,\n): { lowerTick: bigint; higherTick: bigint } {\n\t// Anything not exactly 'up' used to fall through to DOWN, byte-identical to a real\n\t// down mint — no build error, no simulate error, no chain abort. `side` arrives from UI\n\t// state, JSON, or a DB column at runtime, where the literal type does not protect.\n\tif (side !== 'up' && side !== 'down') {\n\t\tthrow new PredictInputError(`side must be 'up' or 'down', got ${JSON.stringify(side)}`);\n\t}\n\tconst tick = strikeRaw / tickSize;\n\tif (tick * tickSize !== strikeRaw) {\n\t\tthrow new PredictInputError(`strike ${strikeRaw} is not a whole tick multiple of ${tickSize}`);\n\t}\n\tif (tick <= 0n || tick >= POS_INF_TICK) {\n\t\tthrow new PredictInputError(\n\t\t\t`strike tick ${tick} outside the finite tick domain (1..POS_INF_TICK-1)`,\n\t\t);\n\t}\n\tconst isUp = side === 'up';\n\treturn {\n\t\tlowerTick: isUp ? tick : 0n,\n\t\thigherTick: isUp ? POS_INF_TICK : tick,\n\t};\n}\n"],"mappings":";;;AAIA,MAAM,YAAY;;AAGlB,MAAa,gBAAgB,MAAM,aAAa;AAShD,SAAgB,iBACf,WACA,MACA,UAC4C;AAI5C,KAAI,SAAS,QAAQ,SAAS,OAC7B,OAAM,IAAI,kBAAkB,oCAAoC,KAAK,UAAU,KAAK,GAAG;CAExF,MAAM,OAAO,YAAY;AACzB,KAAI,OAAO,aAAa,UACvB,OAAM,IAAI,kBAAkB,UAAU,UAAU,mCAAmC,WAAW;AAE/F,KAAI,QAAQ,MAAM,QAAQ,aACzB,OAAM,IAAI,kBACT,eAAe,KAAK,qDACpB;CAEF,MAAM,OAAO,SAAS;AACtB,QAAO;EACN,WAAW,OAAO,OAAO;EACzB,YAAY,OAAO,eAAe;EAClC"}
1
+ {"version":3,"file":"ticks.mjs","names":[],"sources":["../../src/predict/ticks.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\nimport { PredictInputError } from './errors.js';\n\nconst TICK_BITS = 30n;\n\n/** +inf sentinel tick: the upper bound of an UP range. */\nexport const POS_INF_TICK = (1n << TICK_BITS) - 1n;\n\nexport type Side = 'up' | 'down';\n\n// Convert a raw binary-range strike to the `(lower_tick, higher_tick)` pair the\n// `mint` entrypoint takes directly (there is no standalone packed range key).\n// An UP order is `(strike, +inf)` -> lower_tick = strike/tick_size, higher_tick =\n// POS_INF_TICK; a DOWN order is `(-inf, strike)` -> lower_tick = 0 (neg-inf),\n// higher_tick = strike/tick_size.\nexport function binaryRangeTicks(\n\tstrikeRaw: bigint,\n\tside: Side,\n\ttickSize: bigint,\n): { lowerTick: bigint; higherTick: bigint } {\n\t// Anything not exactly 'up' used to fall through to DOWN, byte-identical to a real\n\t// down mint — no build error, no simulate error, no chain abort. `side` arrives from UI\n\t// state, JSON, or a DB column at runtime, where the literal type does not protect.\n\tif (side !== 'up' && side !== 'down') {\n\t\tthrow new PredictInputError(`side must be 'up' or 'down', got ${JSON.stringify(side)}`);\n\t}\n\tconst tick = strikeRaw / tickSize;\n\tif (tick * tickSize !== strikeRaw) {\n\t\tthrow new PredictInputError(`strike ${strikeRaw} is not a whole tick multiple of ${tickSize}`);\n\t}\n\tif (tick <= 0n || tick >= POS_INF_TICK) {\n\t\tthrow new PredictInputError(\n\t\t\t`strike tick ${tick} outside the finite tick domain (1..POS_INF_TICK-1)`,\n\t\t);\n\t}\n\tconst isUp = side === 'up';\n\treturn {\n\t\tlowerTick: isUp ? tick : 0n,\n\t\thigherTick: isUp ? POS_INF_TICK : tick,\n\t};\n}\n\n/**\n * Snap a strike in USD to a market's admission grid (`MarketSummary.admissionTickSize`), the step\n * every new mint boundary must be a whole multiple of. Use it on a form's bound inputs: `'down'`\n * for a lower bound and `'up'` for an upper bound keep a range from shrinking past what was typed,\n * and `'nearest'` (the default) suits a single strike. Exact: it rounds in the 1e9-scaled integers\n * the chain uses, not in floating point.\n */\nexport function snapStrike(\n\tprice: number,\n\tadmissionTickSize: number,\n\tmode: 'down' | 'up' | 'nearest' = 'nearest',\n): number {\n\tif (!(Number.isFinite(price) && price > 0)) {\n\t\tthrow new PredictInputError(`strike must be a positive number, got ${price}`);\n\t}\n\tif (!(Number.isFinite(admissionTickSize) && admissionTickSize > 0)) {\n\t\tthrow new PredictInputError(`admissionTickSize must be positive, got ${admissionTickSize}`);\n\t}\n\tconst step = BigInt(Math.round(admissionTickSize * 1e9));\n\tconst raw = BigInt(Math.round(price * 1e9));\n\tconst below = (raw / step) * step;\n\tconst snapped =\n\t\tmode === 'down' || raw === below\n\t\t\t? below\n\t\t\t: mode === 'up'\n\t\t\t\t? below + step\n\t\t\t\t: raw - below < below + step - raw\n\t\t\t\t\t? below\n\t\t\t\t\t: below + step;\n\tif (snapped === 0n) {\n\t\tthrow new PredictInputError(`strike ${price} snaps below the first ${admissionTickSize} step`);\n\t}\n\treturn Number(snapped) / 1e9;\n}\n"],"mappings":";;;AAIA,MAAM,YAAY;;AAGlB,MAAa,gBAAgB,MAAM,aAAa;AAShD,SAAgB,iBACf,WACA,MACA,UAC4C;AAI5C,KAAI,SAAS,QAAQ,SAAS,OAC7B,OAAM,IAAI,kBAAkB,oCAAoC,KAAK,UAAU,KAAK,GAAG;CAExF,MAAM,OAAO,YAAY;AACzB,KAAI,OAAO,aAAa,UACvB,OAAM,IAAI,kBAAkB,UAAU,UAAU,mCAAmC,WAAW;AAE/F,KAAI,QAAQ,MAAM,QAAQ,aACzB,OAAM,IAAI,kBACT,eAAe,KAAK,qDACpB;CAEF,MAAM,OAAO,SAAS;AACtB,QAAO;EACN,WAAW,OAAO,OAAO;EACzB,YAAY,OAAO,eAAe;EAClC;;;;;;;;;AAUF,SAAgB,WACf,OACA,mBACA,OAAkC,WACzB;AACT,KAAI,EAAE,OAAO,SAAS,MAAM,IAAI,QAAQ,GACvC,OAAM,IAAI,kBAAkB,yCAAyC,QAAQ;AAE9E,KAAI,EAAE,OAAO,SAAS,kBAAkB,IAAI,oBAAoB,GAC/D,OAAM,IAAI,kBAAkB,2CAA2C,oBAAoB;CAE5F,MAAM,OAAO,OAAO,KAAK,MAAM,oBAAoB,IAAI,CAAC;CACxD,MAAM,MAAM,OAAO,KAAK,MAAM,QAAQ,IAAI,CAAC;CAC3C,MAAM,QAAS,MAAM,OAAQ;CAC7B,MAAM,UACL,SAAS,UAAU,QAAQ,QACxB,QACA,SAAS,OACR,QAAQ,OACR,MAAM,QAAQ,QAAQ,OAAO,MAC5B,QACA,QAAQ;AACd,KAAI,YAAY,GACf,OAAM,IAAI,kBAAkB,UAAU,MAAM,yBAAyB,kBAAkB,OAAO;AAE/F,QAAO,OAAO,QAAQ,GAAG"}
@@ -1,7 +1,7 @@
1
1
  import { depositFunds as depositFunds$1, withdrawFunds as withdrawFunds$1 } from "../../contracts/account/account.mjs";
2
2
  import { withAuth } from "./common.mjs";
3
- import { setBuilderCode as setBuilderCode$1, unsetBuilderCode as unsetBuilderCode$1 } from "../../contracts/deepbook_predict/predict_account.mjs";
4
3
  import { cancelSupplyRequest as cancelSupplyRequest$1, cancelWithdrawRequest as cancelWithdrawRequest$1, requestSupply as requestSupply$1, requestWithdraw as requestWithdraw$1 } from "../../contracts/deepbook_predict/plp.mjs";
4
+ import { setBuilderCode as setBuilderCode$1, unsetBuilderCode as unsetBuilderCode$1 } from "../../contracts/deepbook_predict/predict_account.mjs";
5
5
 
6
6
  //#region src/predict/tx/authed.ts
7
7
  const depositFunds = withAuth(depositFunds$1);
@@ -1 +1 @@
1
- {"version":3,"file":"common.d.mts","names":[],"sources":["../../../src/predict/tx/common.ts"],"mappings":";;;;;;;AAwBA;;;;;iBAAgB,YAAA,CAAa,GAAA,EAAK,aAAA,IAAiB,EAAA,EAAI,WAAA,KAAgB,iBAAA;;iBAiEvD,sBAAA,CAAuB,GAAA,EAAK,aAAA,EAAe,KAAA"}
1
+ {"version":3,"file":"common.d.mts","names":[],"sources":["../../../src/predict/tx/common.ts"],"mappings":";;;;;;;AA0BA;;;;;iBAAgB,YAAA,CAAa,GAAA,EAAK,aAAA,IAAiB,EAAA,EAAI,WAAA,KAAgB,iBAAA;;iBAmEvD,sBAAA,CAAuB,GAAA,EAAK,aAAA,EAAe,KAAA"}
@@ -1,6 +1,8 @@
1
1
  import { generateAuth as generateAuth$1 } from "../../contracts/account/account.mjs";
2
2
  import { AccountContract } from "../../account.mjs";
3
3
  import { toGeneratedConfig } from "../config/generated.mjs";
4
+ import { bcs } from "@mysten/sui/bcs";
5
+ import { deriveObjectID } from "@mysten/sui/utils";
4
6
 
5
7
  //#region src/predict/tx/common.ts
6
8
  function accountContract(cfg) {
@@ -46,7 +48,16 @@ function deriveAccountWrapperIdFrom(config, owner) {
46
48
  function deriveAccountWrapperId(cfg, owner) {
47
49
  return deriveAccountWrapperIdFrom(toGeneratedConfig(cfg), owner);
48
50
  }
51
+ const AccountKey = bcs.struct("AccountKey", { pos0: bcs.Address });
52
+ /**
53
+ * The owner's canonical ACCOUNT id (`Account.account_id`), a different derived object from the
54
+ * wrapper: `derive_address(registry, AccountKey(owner))`. Queue records and events name accounts
55
+ * by it, and `queue::waiting_orders` takes it.
56
+ */
57
+ function deriveAccountIdFrom(config, owner) {
58
+ return deriveObjectID(config.accountRegistry, `${config.accountPackageId}::account_registry::AccountKey`, AccountKey.serialize({ pos0: owner }).toBytes());
59
+ }
49
60
 
50
61
  //#endregion
51
- export { accountContract, deriveAccountWrapperId, deriveAccountWrapperIdFrom, generateAuth, withAuth };
62
+ export { accountContract, deriveAccountIdFrom, deriveAccountWrapperId, deriveAccountWrapperIdFrom, generateAuth, withAuth };
52
63
  //# sourceMappingURL=common.mjs.map