@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.
- package/CHANGELOG.md +153 -0
- package/PREDICT.md +389 -61
- package/dist/contracts/account/account.d.mts +23 -23
- package/dist/contracts/account/account.d.mts.map +1 -1
- package/dist/contracts/account/account_registry.d.mts +13 -13
- package/dist/contracts/deepbook/account.d.mts +18 -18
- package/dist/contracts/deepbook/balances.d.mts +4 -4
- package/dist/contracts/deepbook/deep_price.d.mts +3 -3
- package/dist/contracts/deepbook/order.d.mts +12 -12
- package/dist/contracts/deepbook_predict/admin.d.mts +4 -4
- package/dist/contracts/deepbook_predict/builder_code.d.mts +11 -11
- package/dist/contracts/deepbook_predict/builder_code_events.d.mts +10 -10
- package/dist/contracts/deepbook_predict/config_events.d.mts +93 -68
- package/dist/contracts/deepbook_predict/config_events.d.mts.map +1 -1
- package/dist/contracts/deepbook_predict/config_events.mjs +45 -1
- package/dist/contracts/deepbook_predict/config_events.mjs.map +1 -1
- package/dist/contracts/deepbook_predict/deps/std/type_name.mjs +17 -0
- package/dist/contracts/deepbook_predict/deps/std/type_name.mjs.map +1 -0
- package/dist/contracts/deepbook_predict/expiry_market.d.mts +652 -235
- package/dist/contracts/deepbook_predict/expiry_market.d.mts.map +1 -1
- package/dist/contracts/deepbook_predict/expiry_market.mjs +652 -186
- package/dist/contracts/deepbook_predict/expiry_market.mjs.map +1 -1
- package/dist/contracts/deepbook_predict/lp_book.mjs +1 -1
- package/dist/contracts/deepbook_predict/market_lifecycle_cap.d.mts +5 -5
- package/dist/contracts/deepbook_predict/market_manager.d.mts +27 -27
- package/dist/contracts/deepbook_predict/order_events.d.mts +50 -50
- package/dist/contracts/deepbook_predict/order_events.d.mts.map +1 -1
- package/dist/contracts/deepbook_predict/order_events.mjs +3 -1
- package/dist/contracts/deepbook_predict/order_events.mjs.map +1 -1
- package/dist/contracts/deepbook_predict/pause_cap.d.mts +5 -5
- package/dist/contracts/deepbook_predict/plp.d.mts +184 -82
- package/dist/contracts/deepbook_predict/plp.d.mts.map +1 -1
- package/dist/contracts/deepbook_predict/plp.mjs +126 -7
- package/dist/contracts/deepbook_predict/plp.mjs.map +1 -1
- package/dist/contracts/deepbook_predict/pool_accounting.mjs +1 -1
- package/dist/contracts/deepbook_predict/pool_valuation_cap.d.mts +5 -5
- package/dist/contracts/deepbook_predict/predict_account.d.mts +14 -14
- package/dist/contracts/deepbook_predict/pricing.d.mts +91 -58
- package/dist/contracts/deepbook_predict/pricing.d.mts.map +1 -1
- package/dist/contracts/deepbook_predict/pricing.mjs +30 -3
- package/dist/contracts/deepbook_predict/pricing.mjs.map +1 -1
- package/dist/contracts/deepbook_predict/pricing_config.mjs.map +1 -1
- package/dist/contracts/deepbook_predict/protocol_config.d.mts +400 -92
- package/dist/contracts/deepbook_predict/protocol_config.d.mts.map +1 -1
- package/dist/contracts/deepbook_predict/protocol_config.mjs +451 -61
- package/dist/contracts/deepbook_predict/protocol_config.mjs.map +1 -1
- package/dist/contracts/deepbook_predict/range_codec.d.mts +2 -2
- package/dist/contracts/deepbook_predict/registry.d.mts +28 -28
- package/dist/contracts/deepbook_predict/strike_exposure.mjs +1 -1
- package/dist/contracts/deepbook_predict/strike_payout_tree.mjs +17 -12
- package/dist/contracts/deepbook_predict/strike_payout_tree.mjs.map +1 -1
- package/dist/contracts/deepbook_predict/vault_events.d.mts +154 -106
- package/dist/contracts/deepbook_predict/vault_events.d.mts.map +1 -1
- package/dist/contracts/deepbook_predict/vault_events.mjs +57 -1
- package/dist/contracts/deepbook_predict/vault_events.mjs.map +1 -1
- package/dist/contracts/deepbook_predict_math/config-arguments.d.mts +10 -0
- package/dist/contracts/deepbook_predict_math/config-arguments.d.mts.map +1 -0
- package/dist/contracts/deepbook_predict_math/lazer_price.d.mts +106 -0
- package/dist/contracts/deepbook_predict_math/lazer_price.d.mts.map +1 -0
- package/dist/contracts/deepbook_predict_math/lazer_price.mjs +125 -0
- package/dist/contracts/deepbook_predict_math/lazer_price.mjs.map +1 -0
- package/dist/contracts/deepbook_predict_math/math.d.mts +284 -0
- package/dist/contracts/deepbook_predict_math/math.d.mts.map +1 -0
- package/dist/contracts/deepbook_predict_math/math.mjs +364 -0
- package/dist/contracts/deepbook_predict_math/math.mjs.map +1 -0
- package/dist/contracts/deepbook_predict_orders/config-arguments.d.mts +13 -0
- package/dist/contracts/deepbook_predict_orders/config-arguments.d.mts.map +1 -0
- package/dist/contracts/deepbook_predict_orders/delayed_execution_config.d.mts +215 -0
- package/dist/contracts/deepbook_predict_orders/delayed_execution_config.d.mts.map +1 -0
- package/dist/contracts/deepbook_predict_orders/delayed_execution_config.mjs +215 -0
- package/dist/contracts/deepbook_predict_orders/delayed_execution_config.mjs.map +1 -0
- package/dist/contracts/deepbook_predict_orders/deps/deepbook_predict/expiry_market.mjs +87 -0
- package/dist/contracts/deepbook_predict_orders/deps/deepbook_predict/expiry_market.mjs.map +1 -0
- package/dist/contracts/deepbook_predict_orders/deps/deepbook_predict/pricing.mjs +52 -0
- package/dist/contracts/deepbook_predict_orders/deps/deepbook_predict/pricing.mjs.map +1 -0
- package/dist/contracts/deepbook_predict_orders/deps/fixed_math/i64.mjs +25 -0
- package/dist/contracts/deepbook_predict_orders/deps/fixed_math/i64.mjs.map +1 -0
- package/dist/contracts/deepbook_predict_orders/deps/sui/balance.mjs +21 -0
- package/dist/contracts/deepbook_predict_orders/deps/sui/balance.mjs.map +1 -0
- package/dist/contracts/deepbook_predict_orders/deps/sui/table.mjs +39 -0
- package/dist/contracts/deepbook_predict_orders/deps/sui/table.mjs.map +1 -0
- package/dist/contracts/deepbook_predict_orders/desk.d.mts +187 -0
- package/dist/contracts/deepbook_predict_orders/desk.d.mts.map +1 -0
- package/dist/contracts/deepbook_predict_orders/desk.mjs +261 -0
- package/dist/contracts/deepbook_predict_orders/desk.mjs.map +1 -0
- package/dist/contracts/deepbook_predict_orders/order_queue.d.mts +1042 -0
- package/dist/contracts/deepbook_predict_orders/order_queue.d.mts.map +1 -0
- package/dist/contracts/deepbook_predict_orders/order_queue.mjs +849 -0
- package/dist/contracts/deepbook_predict_orders/order_queue.mjs.map +1 -0
- package/dist/contracts/deepbook_predict_orders/queue.d.mts +683 -0
- package/dist/contracts/deepbook_predict_orders/queue.d.mts.map +1 -0
- package/dist/contracts/deepbook_predict_orders/queue.mjs +912 -0
- package/dist/contracts/deepbook_predict_orders/queue.mjs.map +1 -0
- package/dist/contracts/deepbook_predict_orders/queue_events.d.mts +195 -0
- package/dist/contracts/deepbook_predict_orders/queue_events.d.mts.map +1 -0
- package/dist/contracts/deepbook_predict_orders/queue_events.mjs +187 -0
- package/dist/contracts/deepbook_predict_orders/queue_events.mjs.map +1 -0
- package/dist/contracts/deepbook_sessions/session_config.d.mts +8 -8
- package/dist/contracts/deepbook_sessions/sessions.d.mts +163 -28
- package/dist/contracts/deepbook_sessions/sessions.d.mts.map +1 -1
- package/dist/contracts/deepbook_sessions/sessions.mjs +234 -5
- package/dist/contracts/deepbook_sessions/sessions.mjs.map +1 -1
- package/dist/deployments/mainnet.mjs +7 -4
- package/dist/deployments/mainnet.mjs.map +1 -1
- package/dist/deployments/testnet.mjs +7 -4
- package/dist/deployments/testnet.mjs.map +1 -1
- package/dist/predict/bindings/expiry-market.d.mts +77 -0
- package/dist/predict/bindings/expiry-market.d.mts.map +1 -0
- package/dist/predict/bindings/expiry-market.mjs +139 -0
- package/dist/predict/bindings/expiry-market.mjs.map +1 -0
- package/dist/predict/bindings/protocol-config.d.mts +39 -0
- package/dist/predict/bindings/protocol-config.d.mts.map +1 -0
- package/dist/predict/bindings/protocol-config.mjs +90 -0
- package/dist/predict/bindings/protocol-config.mjs.map +1 -0
- package/dist/predict/bindings/rename.mjs +9 -0
- package/dist/predict/bindings/rename.mjs.map +1 -0
- package/dist/predict/client.d.mts +595 -16
- package/dist/predict/client.d.mts.map +1 -1
- package/dist/predict/client.mjs +986 -10
- package/dist/predict/client.mjs.map +1 -1
- package/dist/predict/config/generated.d.mts +22 -1
- package/dist/predict/config/generated.d.mts.map +1 -1
- package/dist/predict/config/generated.mjs +30 -1
- package/dist/predict/config/generated.mjs.map +1 -1
- package/dist/predict/config/mainnet.mjs +11 -3
- package/dist/predict/config/mainnet.mjs.map +1 -1
- package/dist/predict/config/testnet.mjs +11 -3
- package/dist/predict/config/testnet.mjs.map +1 -1
- package/dist/predict/config/types.d.mts +50 -1
- package/dist/predict/config/types.d.mts.map +1 -1
- package/dist/predict/cost.d.mts +38 -11
- package/dist/predict/cost.d.mts.map +1 -1
- package/dist/predict/cost.mjs +37 -11
- package/dist/predict/cost.mjs.map +1 -1
- package/dist/predict/decode.d.mts +251 -1
- package/dist/predict/decode.d.mts.map +1 -1
- package/dist/predict/decode.mjs +342 -4
- package/dist/predict/decode.mjs.map +1 -1
- package/dist/predict/errors.d.mts +69 -6
- package/dist/predict/errors.d.mts.map +1 -1
- package/dist/predict/errors.mjs +277 -4
- package/dist/predict/errors.mjs.map +1 -1
- package/dist/predict/index.d.mts +21 -10
- package/dist/predict/index.mjs +24 -12
- package/dist/predict/queue-id.d.mts +13 -0
- package/dist/predict/queue-id.d.mts.map +1 -0
- package/dist/predict/queue-id.mjs +19 -0
- package/dist/predict/queue-id.mjs.map +1 -0
- package/dist/predict/queue.d.mts +505 -0
- package/dist/predict/queue.d.mts.map +1 -0
- package/dist/predict/queue.mjs +774 -0
- package/dist/predict/queue.mjs.map +1 -0
- package/dist/predict/reads/balances.mjs +1 -1
- package/dist/predict/reads/markets.mjs +46 -5
- package/dist/predict/reads/markets.mjs.map +1 -1
- package/dist/predict/reads/pool.mjs +1 -1
- package/dist/predict/reads/pricing.d.mts +1 -1
- package/dist/predict/reads/queue.d.mts +105 -0
- package/dist/predict/reads/queue.d.mts.map +1 -0
- package/dist/predict/reads/queue.mjs +445 -0
- package/dist/predict/reads/queue.mjs.map +1 -0
- package/dist/predict/ticks.d.mts +9 -1
- package/dist/predict/ticks.d.mts.map +1 -1
- package/dist/predict/ticks.mjs +18 -1
- package/dist/predict/ticks.mjs.map +1 -1
- package/dist/predict/tx/authed.mjs +1 -1
- package/dist/predict/tx/common.d.mts.map +1 -1
- package/dist/predict/tx/common.mjs +12 -1
- package/dist/predict/tx/common.mjs.map +1 -1
- package/dist/predict/tx/queue.d.mts +220 -0
- package/dist/predict/tx/queue.d.mts.map +1 -0
- package/dist/predict/tx/queue.mjs +399 -0
- package/dist/predict/tx/queue.mjs.map +1 -0
- package/dist/predict/tx/trade.d.mts.map +1 -1
- package/dist/predict/tx/trade.mjs +61 -43
- package/dist/predict/tx/trade.mjs.map +1 -1
- package/dist/sessions.d.mts +90 -2
- package/dist/sessions.d.mts.map +1 -1
- package/dist/sessions.mjs +107 -2
- package/dist/sessions.mjs.map +1 -1
- package/dist/transactions/balanceManager.d.mts +12 -12
- package/dist/transactions/balanceManager.d.mts.map +1 -1
- package/dist/transactions/deepbook.d.mts +20 -20
- package/dist/transactions/deepbook.d.mts.map +1 -1
- package/dist/transactions/deepbookAdmin.d.mts +4 -4
- package/dist/transactions/deepbookAdmin.d.mts.map +1 -1
- package/dist/transactions/marginAdmin.d.mts +7 -7
- package/dist/transactions/marginAdmin.d.mts.map +1 -1
- package/dist/transactions/marginLiquidations.d.mts +3 -3
- package/dist/transactions/marginMaintainer.d.mts +5 -5
- package/dist/transactions/marginMaintainer.d.mts.map +1 -1
- package/dist/transactions/marginManager.d.mts +32 -32
- package/dist/transactions/marginManager.d.mts.map +1 -1
- package/dist/transactions/marginPool.d.mts +18 -18
- package/dist/transactions/marginRegistry.d.mts +16 -16
- package/dist/transactions/marginTPSL.d.mts +10 -10
- package/dist/transactions/marginTPSL.d.mts.map +1 -1
- package/dist/transactions/poolProxy.d.mts +8 -8
- package/dist/transactions/poolProxy.d.mts.map +1 -1
- package/package.json +4 -4
- package/src/contracts/deepbook_predict/config_events.ts +39 -0
- package/src/contracts/deepbook_predict/deps/std/type_name.ts +24 -0
- package/src/contracts/deepbook_predict/expiry_market.ts +960 -169
- package/src/contracts/deepbook_predict/order_events.ts +3 -1
- package/src/contracts/deepbook_predict/plp.ts +150 -9
- package/src/contracts/deepbook_predict/pricing.ts +46 -7
- package/src/contracts/deepbook_predict/pricing_config.ts +3 -1
- package/src/contracts/deepbook_predict/protocol_config.ts +648 -33
- package/src/contracts/deepbook_predict/strike_payout_tree.ts +25 -21
- package/src/contracts/deepbook_predict/vault_events.ts +65 -0
- package/src/contracts/deepbook_predict_math/config-arguments.ts +6 -0
- package/src/contracts/deepbook_predict_math/lazer_price.ts +196 -0
- package/src/contracts/deepbook_predict_math/math.ts +553 -0
- package/src/contracts/deepbook_predict_orders/config-arguments.ts +11 -0
- package/src/contracts/deepbook_predict_orders/delayed_execution_config.ts +430 -0
- package/src/contracts/deepbook_predict_orders/deps/deepbook_predict/expiry_market.ts +108 -0
- package/src/contracts/deepbook_predict_orders/deps/deepbook_predict/pricing.ts +58 -0
- package/src/contracts/deepbook_predict_orders/deps/fixed_math/i64.ts +21 -0
- package/src/contracts/deepbook_predict_orders/deps/sui/balance.ts +19 -0
- package/src/contracts/deepbook_predict_orders/deps/sui/table.ts +37 -0
- package/src/contracts/deepbook_predict_orders/desk.ts +419 -0
- package/src/contracts/deepbook_predict_orders/order_flow.ts +19 -0
- package/src/contracts/deepbook_predict_orders/order_queue.ts +1670 -0
- package/src/contracts/deepbook_predict_orders/queue.ts +1394 -0
- package/src/contracts/deepbook_predict_orders/queue_events.ts +189 -0
- package/src/contracts/deepbook_sessions/sessions.ts +355 -4
- package/src/deployments/mainnet.ts +7 -2
- package/src/deployments/testnet.ts +7 -2
- package/src/deployments/types.ts +14 -1
- package/src/predict/bindings/expiry-market.ts +127 -0
- package/src/predict/bindings/protocol-config.ts +59 -0
- package/src/predict/bindings/rename.ts +14 -0
- package/src/predict/client.ts +2076 -13
- package/src/predict/config/generated.ts +50 -0
- package/src/predict/config/mainnet.ts +16 -2
- package/src/predict/config/testnet.ts +16 -2
- package/src/predict/config/types.ts +51 -1
- package/src/predict/cost.ts +62 -14
- package/src/predict/decode.ts +691 -2
- package/src/predict/errors.ts +391 -14
- package/src/predict/index.ts +87 -6
- package/src/predict/queue-id.ts +22 -0
- package/src/predict/queue.ts +1231 -0
- package/src/predict/reads/markets.ts +30 -0
- package/src/predict/reads/queue.ts +606 -0
- package/src/predict/ticks.ts +35 -0
- package/src/predict/tx/common.ts +25 -1
- package/src/predict/tx/queue.ts +525 -0
- package/src/predict/tx/trade.ts +80 -49
- 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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"}
|
package/dist/predict/ticks.d.mts
CHANGED
|
@@ -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"}
|
package/dist/predict/ticks.mjs
CHANGED
|
@@ -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":";;;;;;;
|
|
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
|