@mysten/deepbook-v3 2.9.1 → 2.10.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 +49 -0
- package/README.md +21 -0
- package/dist/account-bindings/account-registry.d.mts +109 -0
- package/dist/account-bindings/account-registry.d.mts.map +1 -0
- package/dist/account-bindings/account-registry.mjs +56 -0
- package/dist/account-bindings/account-registry.mjs.map +1 -0
- package/dist/account-bindings/account.d.mts +176 -0
- package/dist/account-bindings/account.d.mts.map +1 -0
- package/dist/account-bindings/account.mjs +94 -0
- package/dist/account-bindings/account.mjs.map +1 -0
- package/dist/account-bindings/latest.d.mts +12 -0
- package/dist/account-bindings/latest.d.mts.map +1 -0
- package/dist/account-bindings/latest.mjs +19 -0
- package/dist/account-bindings/latest.mjs.map +1 -0
- package/dist/account.d.mts +46 -3
- package/dist/account.d.mts.map +1 -1
- package/dist/account.mjs +51 -2
- package/dist/account.mjs.map +1 -1
- package/dist/client.d.mts +2 -2
- package/dist/contracts/account/account.d.mts +25 -97
- package/dist/contracts/account/account.d.mts.map +1 -1
- package/dist/contracts/account/account.mjs +43 -35
- package/dist/contracts/account/account.mjs.map +1 -1
- package/dist/contracts/account/account_events.d.mts +20 -20
- package/dist/contracts/account/account_events.d.mts.map +1 -1
- package/dist/contracts/account/account_registry.d.mts +7 -54
- package/dist/contracts/account/account_registry.d.mts.map +1 -1
- package/dist/contracts/account/account_registry.mjs +2 -22
- package/dist/contracts/account/account_registry.mjs.map +1 -1
- 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/admin.d.mts.map +1 -1
- package/dist/contracts/deepbook_predict/builder_code.d.mts +60 -13
- package/dist/contracts/deepbook_predict/builder_code.d.mts.map +1 -1
- package/dist/contracts/deepbook_predict/builder_code.mjs +55 -1
- package/dist/contracts/deepbook_predict/builder_code.mjs.map +1 -1
- package/dist/contracts/deepbook_predict/builder_code_events.d.mts +10 -10
- package/dist/contracts/deepbook_predict/config_events.d.mts +88 -84
- package/dist/contracts/deepbook_predict/config_events.d.mts.map +1 -1
- package/dist/contracts/deepbook_predict/config_events.mjs +8 -0
- package/dist/contracts/deepbook_predict/config_events.mjs.map +1 -1
- package/dist/contracts/deepbook_predict/expiry_market.d.mts +262 -101
- package/dist/contracts/deepbook_predict/expiry_market.d.mts.map +1 -1
- package/dist/contracts/deepbook_predict/expiry_market.mjs +320 -41
- package/dist/contracts/deepbook_predict/expiry_market.mjs.map +1 -1
- package/dist/contracts/deepbook_predict/market_lifecycle_cap.d.mts +5 -5
- package/dist/contracts/deepbook_predict/market_lifecycle_cap.d.mts.map +1 -1
- package/dist/contracts/deepbook_predict/market_manager.d.mts +27 -27
- package/dist/contracts/deepbook_predict/market_manager.d.mts.map +1 -1
- package/dist/contracts/deepbook_predict/order_events.d.mts +56 -54
- package/dist/contracts/deepbook_predict/order_events.d.mts.map +1 -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/pause_cap.d.mts.map +1 -1
- package/dist/contracts/deepbook_predict/plp.d.mts +74 -74
- package/dist/contracts/deepbook_predict/plp.d.mts.map +1 -1
- package/dist/contracts/deepbook_predict/pool_valuation_cap.d.mts +5 -5
- package/dist/contracts/deepbook_predict/pool_valuation_cap.d.mts.map +1 -1
- package/dist/contracts/deepbook_predict/predict_account.d.mts +22 -17
- package/dist/contracts/deepbook_predict/predict_account.d.mts.map +1 -1
- package/dist/contracts/deepbook_predict/predict_account.mjs +12 -6
- package/dist/contracts/deepbook_predict/predict_account.mjs.map +1 -1
- package/dist/contracts/deepbook_predict/pricing.d.mts +67 -67
- package/dist/contracts/deepbook_predict/pricing.d.mts.map +1 -1
- package/dist/contracts/deepbook_predict/protocol_config.d.mts +127 -83
- package/dist/contracts/deepbook_predict/protocol_config.d.mts.map +1 -1
- package/dist/contracts/deepbook_predict/protocol_config.mjs +59 -1
- 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/range_codec.d.mts.map +1 -1
- package/dist/contracts/deepbook_predict/registry.d.mts +32 -32
- package/dist/contracts/deepbook_predict/registry.d.mts.map +1 -1
- package/dist/contracts/deepbook_predict/vault_events.d.mts +131 -131
- package/dist/contracts/deepbook_predict_math/lazer_price.d.mts +13 -13
- package/dist/contracts/deepbook_predict_math/math.d.mts +14 -14
- package/dist/contracts/deepbook_predict_orders/delayed_execution_config.d.mts +30 -30
- package/dist/contracts/deepbook_predict_orders/deps/deepbook_predict/expiry_market.mjs +6 -0
- package/dist/contracts/deepbook_predict_orders/deps/deepbook_predict/expiry_market.mjs.map +1 -1
- package/dist/contracts/deepbook_predict_orders/desk.d.mts +28 -28
- package/dist/contracts/deepbook_predict_orders/desk.d.mts.map +1 -1
- package/dist/contracts/deepbook_predict_orders/order_queue.d.mts +187 -187
- package/dist/contracts/deepbook_predict_orders/queue.d.mts +240 -62
- package/dist/contracts/deepbook_predict_orders/queue.d.mts.map +1 -1
- package/dist/contracts/deepbook_predict_orders/queue.mjs +306 -41
- package/dist/contracts/deepbook_predict_orders/queue.mjs.map +1 -1
- package/dist/contracts/deepbook_predict_orders/queue_events.d.mts +140 -140
- package/dist/contracts/deepbook_sessions/session_config.d.mts +8 -8
- package/dist/contracts/deepbook_sessions/sessions.d.mts +271 -31
- package/dist/contracts/deepbook_sessions/sessions.d.mts.map +1 -1
- package/dist/contracts/deepbook_sessions/sessions.mjs +363 -3
- package/dist/contracts/deepbook_sessions/sessions.mjs.map +1 -1
- package/dist/deployments/mainnet.mjs.map +1 -1
- package/dist/deployments/testnet.d.mts.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 +57 -7
- package/dist/predict/bindings/expiry-market.d.mts.map +1 -1
- package/dist/predict/bindings/expiry-market.mjs +48 -2
- package/dist/predict/bindings/expiry-market.mjs.map +1 -1
- package/dist/predict/bindings/protocol-config.d.mts +5 -5
- package/dist/predict/bindings/protocol-config.d.mts.map +1 -1
- package/dist/predict/bindings/protocol-config.mjs +4 -1
- package/dist/predict/bindings/protocol-config.mjs.map +1 -1
- package/dist/predict/bindings/queue.d.mts +30 -0
- package/dist/predict/bindings/queue.d.mts.map +1 -0
- package/dist/predict/bindings/queue.mjs +59 -0
- package/dist/predict/bindings/queue.mjs.map +1 -0
- package/dist/predict/bindings/rename.mjs +5 -1
- package/dist/predict/bindings/rename.mjs.map +1 -1
- package/dist/predict/client.d.mts.map +1 -1
- package/dist/predict/client.mjs +11 -5
- package/dist/predict/client.mjs.map +1 -1
- package/dist/predict/config/generated.d.mts +1 -1
- package/dist/predict/config/generated.d.mts.map +1 -1
- package/dist/predict/config/generated.mjs +1 -0
- package/dist/predict/config/generated.mjs.map +1 -1
- package/dist/predict/config/mainnet.mjs +3 -1
- package/dist/predict/config/mainnet.mjs.map +1 -1
- package/dist/predict/config/testnet.mjs +3 -1
- package/dist/predict/config/testnet.mjs.map +1 -1
- package/dist/predict/config/types.d.mts +23 -0
- package/dist/predict/config/types.d.mts.map +1 -1
- package/dist/predict/cost.d.mts +9 -1
- package/dist/predict/cost.d.mts.map +1 -1
- package/dist/predict/cost.mjs.map +1 -1
- package/dist/predict/errors.d.mts.map +1 -1
- package/dist/predict/errors.mjs +6 -2
- package/dist/predict/errors.mjs.map +1 -1
- package/dist/predict/index.d.mts +1 -1
- package/dist/predict/index.mjs +2 -2
- package/dist/predict/queue.d.mts +8 -4
- package/dist/predict/queue.d.mts.map +1 -1
- package/dist/predict/queue.mjs +8 -4
- package/dist/predict/queue.mjs.map +1 -1
- package/dist/predict/reads/balances.mjs +1 -1
- package/dist/predict/reads/pricing.d.mts +1 -0
- package/dist/predict/reads/pricing.d.mts.map +1 -1
- package/dist/predict/reads/queue.d.mts +4 -2
- package/dist/predict/reads/queue.d.mts.map +1 -1
- package/dist/predict/reads/queue.mjs +5 -4
- package/dist/predict/reads/queue.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 +3 -2
- package/dist/predict/tx/common.mjs.map +1 -1
- package/dist/predict/tx/trade.d.mts.map +1 -1
- package/dist/predict/tx/trade.mjs +3 -2
- package/dist/predict/tx/trade.mjs.map +1 -1
- package/dist/sessions.d.mts +10 -1
- package/dist/sessions.d.mts.map +1 -1
- 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/marginPool.d.mts +18 -18
- package/dist/transactions/marginPool.d.mts.map +1 -1
- package/dist/transactions/marginRegistry.d.mts +16 -16
- package/dist/transactions/marginTPSL.d.mts +10 -10
- package/dist/transactions/poolProxy.d.mts +8 -8
- package/dist/transactions/poolProxy.d.mts.map +1 -1
- package/dist/utils/constants.d.mts.map +1 -1
- package/dist/utils/constants.mjs +1 -1
- package/dist/utils/constants.mjs.map +1 -1
- package/package.json +2 -2
- package/src/account-bindings/account-registry.ts +39 -0
- package/src/account-bindings/account.ts +73 -0
- package/src/account-bindings/latest.ts +41 -0
- package/src/account.ts +89 -5
- package/src/contracts/account/account.ts +73 -4
- package/src/contracts/account/account_registry.ts +1 -1
- package/src/contracts/deepbook_predict/builder_code.ts +94 -2
- package/src/contracts/deepbook_predict/config_events.ts +7 -0
- package/src/contracts/deepbook_predict/expiry_market.ts +490 -44
- package/src/contracts/deepbook_predict/order_events.ts +6 -4
- package/src/contracts/deepbook_predict/predict_account.ts +12 -6
- package/src/contracts/deepbook_predict/protocol_config.ts +85 -0
- package/src/contracts/deepbook_predict_orders/deps/deepbook_predict/expiry_market.ts +14 -0
- package/src/contracts/deepbook_predict_orders/order_flow.ts +4 -0
- package/src/contracts/deepbook_predict_orders/queue.ts +495 -9
- package/src/contracts/deepbook_sessions/sessions.ts +538 -3
- package/src/deployments/mainnet.ts +4 -4
- package/src/deployments/testnet.ts +18 -7
- package/src/deployments/types.ts +14 -0
- package/src/predict/bindings/expiry-market.ts +87 -0
- package/src/predict/bindings/queue.ts +42 -0
- package/src/predict/bindings/rename.ts +5 -1
- package/src/predict/client.ts +25 -3
- package/src/predict/config/generated.ts +3 -0
- package/src/predict/config/mainnet.ts +4 -0
- package/src/predict/config/testnet.ts +4 -0
- package/src/predict/config/types.ts +23 -0
- package/src/predict/cost.ts +9 -1
- package/src/predict/errors.ts +11 -1
- package/src/predict/index.ts +1 -1
- package/src/predict/queue.ts +8 -4
- package/src/predict/reads/queue.ts +7 -4
- package/src/predict/tx/common.ts +2 -0
- package/src/predict/tx/trade.ts +3 -1
- package/src/sessions.ts +10 -1
- package/src/utils/constants.ts +5 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.mjs","names":["#config","opts","#buildMint","#buildMintCost","#feeds","#resolveMarket","#strikeTicks","#buildRedeem","#assertLot","#planMint","#planSell","marketState","#requireDelayedExecution","#existingQueueId","#client","#referencePriceOf","#positionsCache","#strikeRawFor","#queuedMintQuote","#quoteMintTransaction","#recordsDelayedExecution","#queueState","#assertQueueOpen","#hasAccount","#searchBudgetQuote","#entryBandRefusal","#quoteRefusal","#appliedSlippage","#admittedFloor","#refusal","#assertMintOrder","#assertRecordOpen","#assertSellQuantity","#assertSellOrder","#underlying","#marketCache","resolved","#assertAdmittedTick","#gridTick","raw","quote","#knownQueues","#preview"],"sources":["../../src/predict/client.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\nimport type { ClientWithCoreApi, SuiClientRegistration } from '@mysten/sui/client';\nimport { Transaction, coinWithBalance, type TransactionResult } from '@mysten/sui/transactions';\nimport { isValidSuiObjectId, normalizeSuiAddress } from '@mysten/sui/utils';\nimport { TESTNET_PREDICT } from '../deployments/testnet.js';\nimport { getConfig, type PredictConfig, type UnderlyingConfig } from './config/index.js';\nimport {\n\ttoGeneratedConfig,\n\ttoOrdersConfig,\n\ttype GeneratedConfig,\n\ttype OrdersGeneratedConfig,\n} from './config/generated.js';\nimport { MIN_PREMIUM, decodeOrderRange, type FeePolicy } from './cost.js';\nimport {\n\tdecodeAccountsCreated,\n\tdecodeBuilderCodeSets,\n\tdecodeClaims,\n\tdecodeCohortCommits,\n\tdecodeDeposits,\n\tdecodeEnqueues,\n\tdecodeExpiryPnlRealized,\n\tdecodeMarketPayoutsCompleted,\n\tdecodeMints,\n\tdecodeOpenRecordPayouts,\n\tdecodePlpCancels,\n\tdecodePlpRequests,\n\tdecodePolicyUpdates,\n\tdecodeQueueEvents,\n\tdecodeQueueOps,\n\tdecodeQueuedFills,\n\tdecodeQueuedRefunds,\n\tdecodeRecordFunds,\n\tdecodeRedeems,\n\tdecodeWithdrawals,\n\texactlyOne,\n\ttype DecodableTransactionResult,\n} from './decode.js';\nimport {\n\tPredictInputError,\n\tPredictMoveError,\n\tPredictPreflightError,\n\ttype PredictPreflightCode,\n} from './errors.js';\nimport {\n\tORDER_FLOW_PACKAGE_VERSION,\n\tORDER_KIND,\n\tORDER_STATUS,\n\tbudgetMintLimits,\n\tcashNeedSell,\n\tchannelTickMs,\n\texactMintLimits,\n\tfeeCovered,\n\tmaxMintNow,\n\tmintBudget,\n\tmintCashNeed,\n\torderKindName,\n\torderView,\n\tpreviewTiming,\n\tsellLimits,\n\tslippageBand,\n\ttype DelayedExecutionPolicy,\n\ttype MaxMintNow,\n\ttype OrderKindName,\n\ttype OrderView,\n\ttype QueuedOrder,\n\ttype TimingPreview,\n} from './queue.js';\nimport { deriveQueueId } from './queue-id.js';\nimport { simulateWithEvents } from './reads/inspect.js';\nimport {\n\texecutionModeFor,\n\tlazerPackages,\n\tmarketQueueState,\n\torderFeeAndBalance,\n\tpendingFunds,\n\tqueuedOrders,\n\tquoteMintAnonymous,\n\tquoteMintForAccount,\n\tquoteRedeemOpen,\n\tversionWatermark,\n\ttype AnonymousMintQuoteRequest,\n\ttype ExecutionMode,\n\ttype MarketQueueState,\n\ttype MintQuoteRaw,\n\ttype MintQuoteRequest,\n} from './reads/queue.js';\nimport {\n\tpositionsFromTable,\n\tresolvePositionsTable,\n\ttype OpenPosition,\n\ttype PositionsHandle,\n} from './reads/positions.js';\nimport { accountBalance, hasPosition } from './reads/balances.js';\nimport {\n\tactiveMarketIds,\n\tcurrentNav,\n\texpiryMarketId,\n\tmarketFeePolicy,\n\tmarketState,\n\tmarketStates,\n\trangePrices,\n\treferenceTick,\n\tsettlementPrice,\n\ttype MarketState,\n} from './reads/markets.js';\nimport { poolStats } from './reads/pool.js';\nimport { readPricerSnapshot, type PricerSnapshot } from './reads/pricing.js';\nimport { boardPricer, type BoardPricer } from './pricing.js';\nimport { POS_INF_TICK, binaryRangeTicks, type Side } from './ticks.js';\nimport {\n\tcancelSupplyRequest,\n\tcancelWithdrawRequest,\n\tdepositFunds,\n\trequestSupply,\n\trequestWithdraw,\n\tsetBuilderCode,\n\tunsetBuilderCode,\n\twithdrawFunds,\n} from './tx/authed.js';\n\nimport { accountContract, deriveAccountWrapperIdFrom } from './tx/common.js';\nimport {\n\tassertOrderFeeAtMost,\n\tclaimParked,\n\tenqueueExactAmount,\n\tenqueueExactCost,\n\tenqueueExactQuantity,\n\tenqueueRedeemOpen,\n\tfill,\n\tpayOpen,\n\trebalanceExpiryCash,\n\trefund,\n\ttype LazerPackages,\n} from './tx/queue.js';\nimport type { MarketFeeds } from './tx/trade.js';\nimport {\n\tmintExactAmount,\n\tmintExactCost,\n\tmintExactQuantity,\n\tredeemLive,\n\tredeemSettled,\n} from './tx/trade.js';\nimport {\n\tpriceToRaw,\n\tprobabilityToRaw,\n\trawToProbability,\n\trawToUsdc,\n\tusdcToRaw,\n\tfromRaw,\n} from './units.js';\n\n// `position_lot_size` — a position quantity must be a whole multiple of this many\n// raw payout units ($0.01 lots). See packages/predict/sources/constants.move.\n/**\n * Testnet's `position_lot_size`, read from the deployment record. Validation uses the lot\n * size of the config actually in play; this is the convenience constant for testnet callers.\n */\nexport const POSITION_LOT_SIZE = BigInt(TESTNET_PREDICT.units.positionLotSize);\n\n// An unsubsidized price per contract (1e9 = $1) below which a budget fill's cost can't be above\n// its payout, so an admission refusal there is the entry band, not the payout bound.\nconst NEAR_DOLLAR_PER_CONTRACT = 950_000_000n;\n\n// Most `tx.*` builders are one builder's worth of commands in a fresh PTB.\nfunction txOf(command: (tx: Transaction) => TransactionResult | void): Transaction {\n\tconst tx = new Transaction();\n\ttx.add(command);\n\treturn tx;\n}\n\n/** A live/settled market addressed by its human coordinates: a binary position\n * (single strike + side) or a two-strike range position. */\nexport type MarketDescriptor = {\n\tunderlying: string;\n\texpiryMs: number | bigint;\n\t/**\n\t * Pin resolution to this exact `ExpiryMarket` object, skipping the\n\t * underlying+expiry lookup — a caller that reviewed a specific market object\n\t * mints against exactly that object, not whatever resolves at submit time.\n\t */\n\tmarketId?: string;\n} & (\n\t| {\n\t\t\tside: Side;\n\t\t\t/**\n\t\t\t * Strike in USD, or \"reference\" to trade at the market's on-chain reference\n\t\t\t * price (the Polymarket-style anchor: derived from the exact previous-window\n\t\t\t * oracle observation, so consecutive windows chain settlement → next strike).\n\t\t\t */\n\t\t\tstrike: number | 'reference';\n\t }\n\t| {\n\t\t\t/** A range position: pays out when settlement lands inside `(lower, upper]`\n\t\t\t * (left-open, right-closed — same convention as the on-chain range key). */\n\t\t\tside: 'range';\n\t\t\t/** Lower strike bound in USD — finite, on the tick grid. */\n\t\t\tlower: number;\n\t\t\t/** Upper strike bound in USD — finite, on the tick grid, above `lower`. */\n\t\t\tupper: number;\n\t }\n);\n\n/** Options for the friendly `mint` (exact payout quantity). */\nexport interface MintOptions {\n\tquantity: number;\n\tmaxCost?: number;\n\tmaxProbability?: number;\n}\n\n/** Options for `mintAmount` (spend up to a premium budget, floor the quantity received). */\nexport interface MintAmountOptions {\n\t/** Premium budget in quote units — the max premium paid (chain also caps it at the account balance). */\n\tspend: number;\n\tminQuantity: number;\n\t/** All-in cost ceiling in quote units (premium + fees). Omitted → uncapped. */\n\tmaxCost?: number;\n}\n\n/** Options for `mintCost`: all-in budget. Requires Predict v2 or later. */\nexport interface MintCostOptions {\n\t/** All-in USDC budget; the chain also caps it at the account balance. */\n\tspend: number;\n\t/** Minimum payout received. Zero disables this slippage floor. */\n\tminQuantity: number;\n}\n\n/** Options for `redeem`: which order and how much to close. `claimSettled` takes only\n * `orderId` — a settled claim closes the order in full. */\nexport interface CloseOptions {\n\torderId: bigint;\n\tquantity: number;\n}\n\n/** Options for `supplyPlp`. */\nexport interface PlpSupplyOptions {\n\t/**\n\t * Floor on the PLP minted for the whole request, as raw `bigint` shares — PLP is raw\n\t * everywhere in this SDK. It is a floor on the MARK, not a share count: a flush quoting\n\t * less does not fill smaller, it declines. Omitted → `0n`, no floor.\n\t *\n\t * How a miss is handled is the deployment's `lp_request_limit_flush_attempts`: at the\n\t * shipped count of one the first flush below the floor cancels and refunds the request.\n\t */\n\tminPlpOut?: bigint;\n}\n\n/** Options for `withdrawPlp`. */\nexport interface PlpWithdrawOptions {\n\t/**\n\t * Floor on the USDC paid for the whole request, in USD decimals like every other amount\n\t * here. A floor on the MARK, not an amount: a flush quoting less declines rather than\n\t * paying out smaller. Omitted → no floor. Measured after the protocol's withdraw fee.\n\t */\n\tminUsdcOut?: number | string;\n}\n\n/** One tradeable market as returned by read.markets(). */\nexport interface ActiveMarket {\n\tid: string;\n\texpiryMs: bigint;\n\t/** Strike granularity in USD (e.g. 0.01). */\n\ttickSize: number;\n\t/**\n\t * Coarser step new mint strikes must align to. A numeric strike must be a whole\n\t * multiple of this (the market's `referencePrice` is the one exception the chain\n\t * admits off-grid); otherwise the mint aborts `EInvalidAdmissionTick`.\n\t */\n\tadmissionTickSize: number;\n\tmintPaused: boolean;\n\t/** The window's anchor strike in USD, or null until the keeper seeds it. */\n\treferencePrice: number | null;\n}\n\n/** A resolved live market: its on-chain state summary for the caller. */\nexport interface MarketSummary {\n\tid: string;\n\texpiryMs: bigint;\n\ttickSize: number;\n\t/**\n\t * Coarser step new mint strikes must align to. A numeric strike must be a whole\n\t * multiple of this (the market's `referencePrice` is the one exception the chain\n\t * admits off-grid); otherwise the mint aborts `EInvalidAdmissionTick`.\n\t */\n\tadmissionTickSize: number;\n\tmintPaused: boolean;\n\tnav: number;\n\t/** The window's anchor strike in USD, or null until the keeper seeds it. */\n\treferencePrice: number | null;\n}\n\n/**\n * A market's settlement, from `read.settlement`. Pass `settlementPriceRaw` and `tickSizeRaw` to\n * `cost.settledPayout` to show what a position paid.\n */\nexport interface MarketSettlement {\n\tmarketId: string;\n\texpiryMs: bigint;\n\t/** Whether Predict has recorded the settlement price. */\n\tsettled: boolean;\n\t/** The settlement price in USD, or null until the market settles. */\n\tsettlementPrice: number | null;\n\t/** The settlement price at the 1e9 price scale, or null until the market settles. */\n\tsettlementPriceRaw: bigint | null;\n\t/** The market's raw tick size, which `cost.settledPayout` rounds the price against. */\n\ttickSizeRaw: bigint;\n}\n\n/** Aggregate pool figures. Balances in human units (shares raw); the pending fields\n * are request COUNTS, not amounts — the on-chain getters expose queue lengths, and\n * the escrowed USDC/PLP behind them is tracked separately. */\nexport interface PoolSummary {\n\tplpTotalSupply: bigint;\n\tidleUsdc: number;\n\t/** Number of LP supply requests queued for the next flush. */\n\tsupplyRequestsPending: number;\n\t/** Number of LP withdraw requests queued for the next flush. */\n\twithdrawRequestsPending: number;\n}\n\n/** Exact pre-trade quote: the dry-run receipt of the mint you are about to send. */\nexport interface MintQuote {\n\t/** Fill price, 0..1 per $1 payout. */\n\tentryProbability: number;\n\t/** Premium paid into LP backing (quote units). */\n\tpremium: number;\n\t/**\n\t * Fee breakdown. `referral` is a PORTION of the trader-paid trading fee and\n\t * congestion surcharge routed to the referrer — it is already inside those\n\t * numbers and is NOT an extra debit. `inventoryImpact` is a separate charge and\n\t * IS part of `cost`.\n\t */\n\tfees: {\n\t\ttrading: number;\n\t\tsubsidy: number;\n\t\tbuilder: number;\n\t\tpenalty: number;\n\t\treferral: number;\n\t\tinventoryImpact: number;\n\t};\n\t/**\n\t * All-in account debit: premium + (trading − subsidy) + builder + penalty +\n\t * inventoryImpact — exactly what the chain withdraws (the deployed\n\t * `compute_mint_quote`'s `all_in_cost`); pass this (plus your buffer) as maxCost.\n\t */\n\tcost: number;\n\tquantity: number;\n\traw: { premium: bigint; cost: bigint; quantity: bigint; entryProbability: bigint };\n\t/** True: computed by the real mint code path against real account state. */\n\tfeesExact: true;\n\t/**\n\t * True when this previews a queued (delayed-execution) fill: read from the chain's\n\t * `quote_*` functions with the congestion penalty removed, since a queued fill pays none.\n\t * Set when the network's config records delayed execution.\n\t */\n\tqueued?: boolean;\n\t/**\n\t * Queued previews only: the flat order fee, charged once at enqueue on top of `cost`. Show\n\t * it once per order, not per contract.\n\t */\n\torderFee?: number;\n}\n\n/** Exact pre-close quote: the dry-run receipt of the redeem you are about to send. */\nexport interface RedeemQuote {\n\t/** NET quote credited to the account. */\n\tproceeds: number;\n\t/** Gross close value before fees. */\n\tgross: number;\n\t/** `inventoryImpactRebate` is credited back on the close, so `proceeds` is\n\t * gross + rebate − trading − builder − penalty. */\n\tfees: { trading: number; builder: number; penalty: number; inventoryImpactRebate: number };\n\tquantityClosed: number;\n\tremaining: number;\n\traw: { proceeds: bigint; gross: bigint; quantityClosed: bigint };\n\tfeesExact: true;\n}\n\ninterface ResolvedMarket {\n\tid: string;\n\tstate: MarketState;\n}\n\n/** A market by its underlying and expiry, optionally pinned to an exact object. */\nexport type MarketCoordinates = Pick<MarketDescriptor, 'underlying' | 'expiryMs' | 'marketId'>;\n\n/** Options for `enqueueMint`: a queued mint of an exact payout quantity. */\nexport interface EnqueueMintOptions {\n\tquantity: number;\n\t/** All-in USDC cap (premium + fees). Required: a queued mint has no \"unlimited\" cap. */\n\tmaxCost: number;\n\t/** Entry-probability cap at τ, in (0, 1]. Required. See `queue.slippageBand`. */\n\tmaxProbability: number;\n}\n\n/** Options for `enqueueMintAmount`: a queued premium-budget mint. */\nexport interface EnqueueMintAmountOptions {\n\t/** Premium budget in USDC. */\n\tspend: number;\n\t/** Floor on the payout received. */\n\tminQuantity: number;\n\t/** All-in USDC cap (premium + fees). Required. */\n\tmaxCost: number;\n}\n\n/** Options for `enqueueMintCost`: a queued all-in-budget mint. */\nexport interface EnqueueMintCostOptions {\n\t/** All-in USDC budget, fees included. Escrowed at enqueue, less what the fill doesn't use. */\n\tspend: number;\n\t/** Floor on the payout received. Zero disables this slippage floor. */\n\tminQuantity: number;\n}\n\n/** Options for `enqueueSell`: a queued early sell of an Open record. */\nexport interface EnqueueSellOptions {\n\t/** The Open record to sell from: its queue record ID, not the position's order ID. */\n\trecordId: bigint;\n\t/** Payout quantity to close. A partial sell must leave at least the policy minimum. */\n\tquantity: number;\n\t/** Close-side probability floor at τ, in [0, 1]. Pass 0 on purpose to disable it. */\n\tminProbability: number;\n\t/** Floor on the proceeds before the order fee, in USDC. Pass 0 on purpose to disable it. */\n\tminProceeds: number;\n\t/**\n\t * Add `rebalance_expiry_cash` after the enqueue so the market is funded for this sell at once.\n\t * `'auto'` (default) adds it only when the sell's cash need is above spare cash, `'always'`\n\t * always, `'never'` never. It takes the hot `PoolVault`, so keep it conditional.\n\t */\n\tfundMarket?: 'auto' | 'always' | 'never';\n}\n\n/** What a queued order builder previews alongside the transaction. Display only. */\nexport interface QueuedOrderPreview {\n\tmarketId: string;\n\tkind: number;\n\tkindName: OrderKindName;\n\t/** τ, deadline and cutoff for an order placed now, from the local clock. */\n\ttiming: TimingPreview;\n\t/** The flat order fee, charged once at enqueue. */\n\torderFee: number;\n\t/** USDC escrowed for the premium and fees; 0 for a sell. Unused budget returns at the fill. */\n\tbudget: number;\n\t/** What enqueue debits: budget + order fee. */\n\ttotalDebit: number;\n\t/** The order's worst-case cash need against the market's spare cash. */\n\tcashNeedRaw: bigint;\n\tspareCashRaw: bigint;\n\t/**\n\t * Sells only: the cash need is above spare cash, so the sell may be refunded in full\n\t * (reason 8) unless the market is funded before the fill.\n\t */\n\tneedsFunding: boolean;\n\t/** Whether the builder added `rebalance_expiry_cash` after the enqueue. */\n\tfundedInTransaction: boolean;\n\traw: { orderFee: bigint; budget: bigint; totalDebit: bigint };\n}\n\n/** A queued order's transaction and its preview. */\nexport interface QueuedOrderPlan {\n\ttransaction: Transaction;\n\tpreview: QueuedOrderPreview;\n}\n\n/**\n * How much the price may move against a queued order between its quote and its fill, in cents per\n * contract. A contract pays $1, so its price in cents is its probability: 10¢ of slippage lets\n * a 42¢ contract fill at up to 52¢, fees included. It is never a percentage.\n */\nexport interface SlippageOptions {\n\t/**\n\t * Cents per contract: `10` is 10¢. `'auto'` (the default) sizes it with `queue.slippageBand`\n\t * from the time to expiry and the policy's delay.\n\t */\n\tslippageCents?: number | 'auto';\n\t/** Standard deviations of movement for `'auto'`. Default 2. */\n\tk?: number;\n}\n\n/**\n * Options for `read.planMint`. `amount` plans a purchase form's spend (an all-in budget mint),\n * and `quantity` plans an exact payout.\n */\nexport type PlanMintOptions = SlippageOptions &\n\t(\n\t\t| {\n\t\t\t\t/** The purchase amount in USDC. */\n\t\t\t\tamount: number;\n\t\t\t\t/**\n\t\t\t\t * Whether `amount` is the whole debit, order fee included (`'inclusive'`, the default),\n\t\t\t\t * or the order fee is charged on top (`'exclusive'`).\n\t\t\t\t */\n\t\t\t\torderFee?: 'inclusive' | 'exclusive';\n\t\t }\n\t\t| { quantity: number }\n\t);\n\n/** The slippage a plan applied. */\nexport interface AppliedSlippage {\n\t/** Cents per contract. */\n\tcents: number;\n\tsource: 'input' | 'auto';\n\t/** The model band when `source` is `'auto'`. */\n\tband: ReturnType<typeof slippageBand> | null;\n}\n\n/**\n * `read.planMint`: everything a purchase form shows, and the enqueue options that carry its\n * slippage. Display only: the fill prices at τ, within the limits in `order`.\n */\nexport interface MintPlan {\n\tshape: 'budget' | 'exact-quantity';\n\t/** The owner, market and strike range the plan was quoted for. */\n\ttarget: PlanTarget;\n\t/** The quote at the current price. */\n\tquote: MintQuote;\n\t/**\n\t * Whether the quote is the account's own (`quote_mint_*_for_account`, with its builder fee). A\n\t * visitor without an account, or a balance below the order, gets `quote_mint`'s quote instead,\n\t * with a budget's quantity found by a short search.\n\t */\n\tquoteForAccount: boolean;\n\tslippage: AppliedSlippage;\n\t/** The payout if it wins, at the current price (\"Potential payout\"). */\n\tpotentialPayout: number;\n\t/** The smallest payout the order accepts, at the worst price. A smaller fill is refunded. */\n\tminPayout: number;\n\t/** `potentialPayout / expectedDebit` (\"Payout multiple\"), order fee included. */\n\tpayoutMultiple: number;\n\t/** `minPayout / totalDebit`: the multiple at the worst price. */\n\tminPayoutMultiple: number;\n\t/** All-in price per contract now in USDC (0.42 is 42¢), after the fee subsidy, order fee excluded. */\n\tpricePerContract: number;\n\t/**\n\t * The worst price the limits admit: the price per contract without the fee subsidy, plus the\n\t * slippage. Enqueue admission checks the order without the subsidy, and the subsidy can run out\n\t * before the fill, so the limits never count on it.\n\t */\n\tworstPricePerContract: number;\n\t/** The flat order fee, read from the order desk, charged once per order. */\n\torderFee: number;\n\t/** USDC escrowed for the premium and fees. Unused budget comes back at the fill. */\n\tbudget: number;\n\t/** `budget + orderFee`: what enqueue debits. */\n\ttotalDebit: number;\n\t/** `quote.cost + orderFee`: what the order costs if it fills at the current price. */\n\texpectedDebit: number;\n\tbalance: {\n\t\t/** Whether the owner has a Predict account yet. */\n\t\thasAccount: boolean;\n\t\t/** The account's USDC, or null without an account. */\n\t\tavailable: number | null;\n\t\t/** Whether the balance covers `totalDebit`, or null without an account. */\n\t\tcovers: boolean | null;\n\t};\n\t/**\n\t * The largest `amount` (budget plans) or `quantity` (exact plans) the market's spare cash and,\n\t * with an account, the balance allow now. An exact plan's balance bound prices each contract\n\t * at the plan's `worstPricePerContract`. Null when neither binds.\n\t */\n\tmaxNow: number | null;\n\t/** τ, deadline and cutoff for an order placed now, from the local clock. */\n\ttiming: TimingPreview;\n\t/**\n\t * Whether `tx.enqueuePlan` would build the order now and admission would take it at the current\n\t * price: the builder's preflight (the queue gates, the order fee, the minimum premium and the\n\t * market's cash), the balance against `totalDebit`, the payout bound and, for a budget, the\n\t * floor admission buys without the fee subsidy. Two admission conditions are checked only on\n\t * chain, at placement: the market's SVI age under the order desk's `svi_max_age_ms`, and room in\n\t * the payout tree for a new strike's boundary nodes.\n\t */\n\taccepting: boolean;\n\t/**\n\t * The `PredictPreflightError` code the order would get now, or null. `'fee'` also covers a\n\t * missing account or a balance below `totalDebit`.\n\t */\n\trefusal: PredictPreflightCode | null;\n\t/** Pass `order.options` to `tx[order.builder]`. */\n\torder:\n\t\t| { builder: 'enqueueMintCost'; options: EnqueueMintCostOptions }\n\t\t| { builder: 'enqueueMint'; options: EnqueueMintOptions };\n\traw: {\n\t\tbudget: bigint;\n\t\torderFee: bigint;\n\t\ttotalDebit: bigint;\n\t\tslippage: bigint;\n\t\tminQuantity: bigint;\n\t\tmaxCost: bigint | null;\n\t\tmaxProbability: bigint | null;\n\t\tpricePerContract: bigint;\n\t\tworstPricePerContract: bigint;\n\t};\n}\n\n/**\n * What a plan was quoted for. Its limits are sized for that one order, so `tx.enqueuePlan` refuses\n * the plan for any other owner, market, strike or record.\n */\nexport interface PlanTarget {\n\towner: string;\n\texpiryMarketId: string;\n\t/** A mint's strike range, as the market's admission ticks. */\n\tlowerTick?: bigint;\n\thigherTick?: bigint;\n\t/** A sell's Open record. Record IDs restart in every market. */\n\trecordId?: bigint;\n}\n\n/** Options for `read.planSell`. */\nexport type PlanSellOptions = SlippageOptions & {\n\t/** The Open record to sell from. */\n\trecordId: bigint;\n\t/** Payout quantity to close. */\n\tquantity: number;\n};\n\n/** `read.planSell`: what an early sell shows, and the enqueue options that carry its slippage. */\nexport interface SellPlan {\n\t/** The owner, market and record the plan was quoted for. */\n\ttarget: PlanTarget;\n\t/** The quote at the current price. */\n\tquote: SellQuote;\n\tslippage: AppliedSlippage;\n\t/** Proceeds at the current price, before the order fee. */\n\tproceeds: number;\n\t/** `proceeds − orderFee`. */\n\tnet: number;\n\t/** The proceeds floor the order carries, before the order fee. A smaller fill is refunded. */\n\tminProceeds: number;\n\t/**\n\t * `minProceeds − orderFee`: the worst the sell nets if it fills. Negative when the order fee is\n\t * above the proceeds floor.\n\t */\n\tminNet: number;\n\torderFee: number;\n\ttiming: TimingPreview;\n\t/**\n\t * Whether `tx.enqueuePlan` would build the sell now: the builder's preflight, which checks the\n\t * queue gates, that the record is Open and the owner's, the order fee and the minimum sell. The\n\t * market's SVI age under the order desk's `svi_max_age_ms` is checked only on chain, at\n\t * placement.\n\t */\n\taccepting: boolean;\n\t/** The `PredictPreflightError` code the sell would get now, or null. */\n\trefusal: PredictPreflightCode | null;\n\t/** Pass `order.options` to `tx.enqueueSell`. */\n\torder: { builder: 'enqueueSell'; options: EnqueueSellOptions };\n\traw: { slippage: bigint; minProceeds: bigint; minProbability: bigint; orderFee: bigint };\n}\n\n/** `read.queue`: a market's queue state plus the derived figures the app shows. */\nexport interface MarketQueueView extends MarketQueueState {\n\tmode: ExecutionMode;\n\t/** τ, deadline and cutoff for an order placed now, from the local clock. */\n\ttiming: TimingPreview;\n\t/**\n\t * Whether a new mint would pass the queue gates now: the same gates `enqueueMint*` checks\n\t * before its fee and cash checks (the order-flow allowlist, the cutover, pauses, stuck, mint\n\t * capacity, the cutoff, and the account cap when an owner was given). One side can be full\n\t * while the other is open.\n\t */\n\tacceptingMints: boolean;\n\t/** Whether a new sell would pass the queue gates now (sells skip the mint pauses). */\n\tacceptingSells: boolean;\n\t/**\n\t * Why each side refuses now, or null: the `PredictPreflightError` code the builder would\n\t * throw for the queue gates.\n\t */\n\trefusal: { mint: PredictPreflightCode | null; sell: PredictPreflightCode | null };\n\t/** The largest mint the market's spare cash admits now. */\n\tmaxMint: { exactQuantity: MaxMintNow; budget: MaxMintNow };\n}\n\n/** A queue record and its display state. */\nexport interface QueuedOrderView {\n\trecordId: bigint;\n\trecord: QueuedOrder;\n\tview: OrderView;\n}\n\n/** How `read.waitForOutcome` ended. */\nexport interface QueuedOrderOutcome {\n\t/** `'gone'`: the record is missing (cleaned up, or not landed). `'timeout'`: still waiting. */\n\toutcome: 'filled' | 'refunded' | 'closed' | 'gone' | 'timeout';\n\torder: QueuedOrderView | null;\n}\n\n/** A quote for selling an Open record early (`quote_redeem_open`). */\nexport interface SellQuote {\n\t/** The live per-contract probability. */\n\tprobability: number;\n\t/** Proceeds before the order fee, with no congestion penalty. */\n\tproceeds: number;\n\t/**\n\t * `proceeds − orderFee`: what the account nets. Negative when the order fee is above the\n\t * proceeds, since the fee is charged at enqueue whatever the sell returns.\n\t */\n\tnet: number;\n\tfees: { trading: number; builder: number; inventoryImpactRebate: number; order: number };\n\tquantityClosed: number;\n\traw: { probability: bigint; proceeds: bigint; orderFee: bigint; quantityClosed: bigint };\n}\n\n// The strike-bearing (binary) arm of MarketDescriptor, for read.price and its\n// seam — anonymous board pricing has no range semantics.\ntype BinaryMarketCoordinates = Pick<MarketDescriptor, 'underlying' | 'expiryMs' | 'marketId'> & {\n\tstrike: number | 'reference';\n};\n\n/** The Sui client surface PredictClient reads through: any `ClientWithCoreApi`\n * (gRPC or JSON-RPC) provides both the `simulateTransaction` the reads/quotes\n * sit on and the `core` object methods position enumeration needs. */\nexport interface PredictCompatibleClient extends ClientWithCoreApi {}\n\n/**\n * Register PredictClient as a `client.predict` extension, mirroring\n * `@mysten/deepbook-v3`'s `deepbook(...)`: `client.$extend(predict({ network }))`.\n */\nexport function predict<Name extends string = 'predict'>({\n\tname = 'predict' as Name,\n\tnetwork,\n\tconfig,\n}: {\n\tname?: Name;\n\tnetwork: 'testnet' | 'mainnet';\n\tconfig?: PredictConfig;\n}): SuiClientRegistration<PredictCompatibleClient, Name, PredictClient> {\n\treturn {\n\t\tname,\n\t\tregister: (client) => new PredictClient({ client, network, config }),\n\t};\n}\n\n/**\n * The one object an app constructs. Wraps the config, a client for reads, and\n * a derived-account model so callers pass owner addresses, decimal amounts, and\n * human market coordinates — the facade converts to raw units, resolves markets\n * (cached), and delegates to the internal tx primitives / reads. Each `tx.*` builder\n * returns a finished `Transaction`; callers composing their own PTBs use the generated\n * move-call bindings this subpath exports (`plpMoveCalls`, `expiryMarketMoveCalls`, …).\n */\n// The chain refused a quote or order on its own limits at the current price.\nfunction isOrderFailsLimits(error: unknown): boolean {\n\treturn error instanceof PredictMoveError && error.abortName === 'EOrderFailsLimits';\n}\n\n// The chain refused to price a live trade because the market reached its expiry.\nfunction isPastExpiry(error: unknown): boolean {\n\treturn error instanceof PredictMoveError && error.abortName === 'ELivePricingExpired';\n}\n\nexport class PredictClient {\n\treadonly cfg: PredictConfig;\n\t// The flat slice every generated call resolves `options.config` against.\n\tget #config(): GeneratedConfig {\n\t\treturn toGeneratedConfig(this.cfg);\n\t}\n\t#client: PredictCompatibleClient;\n\t// underlying:expiryMs → resolved market. The id and tickSizeRaw — the only\n\t// state tx building depends on — are immutable per (underlying, expiry), so\n\t// one resolution per market per client suffices. (mintPaused IS mutable; the\n\t// cached copy is never consulted for a tx decision — the chain enforces it.)\n\t#marketCache = new Map<string, ResolvedMarket>();\n\t// owner → resolved position-store ids. accountUid and the table id are\n\t// immutable once created, so cache-forever; a missing table (no Predict\n\t// data yet) is NOT cached — it appears after the owner's first trade.\n\t#positionsCache = new Map<string, PositionsHandle>();\n\t// Queue IDs confirmed to exist. A `MarketQueue` is shared and never deleted, so a confirmed\n\t// queue is cached forever; a missing one is not cached, since the keeper creates it later.\n\t#knownQueues = new Set<string>();\n\n\tconstructor(opts: {\n\t\tnetwork: 'testnet' | 'mainnet';\n\t\tclient: PredictCompatibleClient;\n\t\tconfig?: PredictConfig;\n\t}) {\n\t\tthis.cfg = opts.config ?? getConfig(opts.network);\n\t\tthis.#client = opts.client;\n\t}\n\n\t/** The deterministic id of an owner's canonical account wrapper — no chain read. */\n\twrapperIdFor(owner: string): string {\n\t\treturn deriveAccountWrapperIdFrom(this.#config, owner);\n\t}\n\n\t/**\n\t * The deterministic id of a market's `MarketQueue` under the config's queue registry, whether\n\t * or not it exists yet — no chain read. Throws `PredictInputError` while the config doesn't\n\t * record delayed execution.\n\t */\n\tqueueIdFor(marketId: string): string {\n\t\treturn deriveQueueId(this.#requireDelayedExecution().queueRegistry, marketId);\n\t}\n\n\t// The deployment's wiring for a symbol; throws a typed error on an unknown symbol.\n\t// Per-underlying ids are the one thing the flat config slice does not carry.\n\t#underlying(underlying: string): UnderlyingConfig {\n\t\tconst u = this.cfg.underlyings[underlying];\n\t\tif (!u) throw new PredictInputError(`unknown underlying: ${underlying}`);\n\t\treturn u;\n\t}\n\n\t// The oracle feed ids for a symbol; throws a typed error on an unknown symbol.\n\t#feeds(underlying: string): MarketFeeds {\n\t\tconst u = this.#underlying(underlying);\n\t\treturn {\n\t\t\tpythFeed: u.pythFeed,\n\t\t\tblockScholesValueStore: u.blockScholesValueStore,\n\t\t\tblockScholesSviStore: u.blockScholesSviStore,\n\t\t};\n\t}\n\n\t// Resolve (and cache) a market's id + state from its human coordinates. An\n\t// explicit `marketId` pin skips the underlying+expiry lookup but still reads\n\t// that market's state — tx building depends on tickSizeRaw.\n\tasync #resolveMarket(\n\t\tm: Pick<MarketDescriptor, 'underlying' | 'expiryMs' | 'marketId'>,\n\t): Promise<ResolvedMarket> {\n\t\tif (m.marketId != null) {\n\t\t\tif (!isValidSuiObjectId(m.marketId)) {\n\t\t\t\tthrow new PredictInputError(`invalid marketId: ${JSON.stringify(m.marketId)}`);\n\t\t\t}\n\t\t\tconst resolved: ResolvedMarket = this.#marketCache.get(m.marketId) ?? {\n\t\t\t\tid: m.marketId,\n\t\t\t\tstate: await marketState(this.#client, this.#config, m.marketId),\n\t\t\t};\n\t\t\t// The pin must agree with the descriptor's coordinates: catching a stale or\n\t\t\t// wrong-market id here beats minting against mismatched oracle feeds. (The\n\t\t\t// underlying cannot be cross-checked — market state does not carry it.)\n\t\t\tif (resolved.state.expiryMs !== BigInt(m.expiryMs)) {\n\t\t\t\tthrow new PredictInputError(\n\t\t\t\t\t`pinned market ${m.marketId} expires at ${resolved.state.expiryMs}, descriptor says ${BigInt(m.expiryMs)}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tthis.#marketCache.set(m.marketId, resolved);\n\t\t\treturn resolved;\n\t\t}\n\t\tconst expiryMs = BigInt(m.expiryMs);\n\t\tconst key = `${m.underlying}:${expiryMs}`;\n\t\tconst hit = this.#marketCache.get(key);\n\t\tif (hit) return hit;\n\t\tconst u = this.#underlying(m.underlying);\n\t\tconst id = await expiryMarketId(this.#client, this.#config, u, expiryMs);\n\t\tif (!id) throw new PredictInputError(`no market for ${m.underlying} at expiry ${expiryMs}`);\n\t\tconst state = await marketState(this.#client, this.#config, id);\n\t\tconst resolved: ResolvedMarket = { id, state };\n\t\tthis.#marketCache.set(key, resolved);\n\t\treturn resolved;\n\t}\n\n\t// Reference PRICE in USD from a state (tick index × tick size), or null.\n\tstatic #referencePriceOf(state: MarketState): number | null {\n\t\treturn state.referenceTickRaw == null\n\t\t\t? null\n\t\t\t: fromRaw(state.referenceTickRaw * state.tickSizeRaw, 9);\n\t}\n\n\t// A finite tick from a USD strike, validated exactly like binaryRangeTicks:\n\t// whole-tick multiple, inside the finite domain (1..POS_INF_TICK-1).\n\t#gridTick(strike: number, tickSizeRaw: bigint): bigint {\n\t\tconst raw = priceToRaw(strike);\n\t\tconst tick = raw / tickSizeRaw;\n\t\tif (tick * tickSizeRaw !== raw) {\n\t\t\tthrow new PredictInputError(\n\t\t\t\t`strike ${strike} is not on the ${fromRaw(tickSizeRaw, 9)} tick grid`,\n\t\t\t);\n\t\t}\n\t\tif (tick <= 0n || tick >= POS_INF_TICK) {\n\t\t\tthrow new PredictInputError(\n\t\t\t\t`strike tick ${tick} outside the finite tick domain (1..POS_INF_TICK-1)`,\n\t\t\t);\n\t\t}\n\t\treturn tick;\n\t}\n\n\t// New finite MINT boundaries must land on the market's coarser ADMISSION grid,\n\t// not merely the fine tick grid — the chain asserts exactly this\n\t// (`assert_admitted_mint_ticks`, `EInvalidAdmissionTick`). The ±inf sentinels are\n\t// exempt, and the market's reference tick is the one finite boundary allowed to\n\t// bypass the grid, so an off-grid tick is only rejected after confirming it is not\n\t// the reference (one extra read, and only on the failing path).\n\tasync #assertAdmittedTick(tick: bigint, marketId: string, state: MarketState): Promise<void> {\n\t\tif (tick === 0n || tick === POS_INF_TICK) return;\n\t\tconst multiple = state.admissionTickSizeRaw / state.tickSizeRaw;\n\t\tif (multiple > 0n && tick % multiple === 0n) return;\n\t\tconst reference = await referenceTick(this.#client, this.#config, marketId);\n\t\tif (reference != null && reference === tick) return;\n\t\tconst admission = fromRaw(state.admissionTickSizeRaw, 9);\n\t\tthrow new PredictInputError(\n\t\t\t`strike ${fromRaw(tick * state.tickSizeRaw, 9)} is not on the ${admission} admission grid ` +\n\t\t\t\t`(mint boundaries must be a multiple of ${admission}, or the market's reference strike)`,\n\t\t);\n\t}\n\n\t// Resolve a descriptor's strike(s) to the (lower, higher) tick pair. A binary\n\t// numeric strike converts and validates against the tick grid; \"reference\"\n\t// reads the market's reference tick FRESH (never cached — it is unset early in\n\t// a window) and uses it directly: it is on the tick grid by construction. A\n\t// range descriptor converts both bounds to finite grid ticks (\"reference\" is\n\t// binary-only: a range has no single reference strike).\n\tasync #strikeTicks(\n\t\tm: MarketDescriptor,\n\t\tmarketId: string,\n\t\tstate: MarketState,\n\t): Promise<{ lowerTick: bigint; higherTick: bigint }> {\n\t\tif (m.side === 'range') {\n\t\t\tif (!(m.lower < m.upper)) {\n\t\t\t\tthrow new PredictInputError(`range lower ${m.lower} must be below upper ${m.upper}`);\n\t\t\t}\n\t\t\tconst lowerTick = this.#gridTick(m.lower, state.tickSizeRaw);\n\t\t\tconst higherTick = this.#gridTick(m.upper, state.tickSizeRaw);\n\t\t\tawait this.#assertAdmittedTick(lowerTick, marketId, state);\n\t\t\tawait this.#assertAdmittedTick(higherTick, marketId, state);\n\t\t\treturn { lowerTick, higherTick };\n\t\t}\n\t\tif (m.strike !== 'reference') {\n\t\t\tconst ticks = binaryRangeTicks(priceToRaw(m.strike), m.side, state.tickSizeRaw);\n\t\t\tawait this.#assertAdmittedTick(ticks.lowerTick, marketId, state);\n\t\t\tawait this.#assertAdmittedTick(ticks.higherTick, marketId, state);\n\t\t\treturn ticks;\n\t\t}\n\t\tconst tick = await referenceTick(this.#client, this.#config, marketId);\n\t\tif (tick == null) {\n\t\t\tthrow new PredictInputError(\n\t\t\t\t`reference price not set yet for ${m.underlying} @ ${m.expiryMs} — retry shortly or pass a numeric strike`,\n\t\t\t);\n\t\t}\n\t\treturn m.side === 'up'\n\t\t\t? { lowerTick: tick, higherTick: POS_INF_TICK }\n\t\t\t: { lowerTick: 0n, higherTick: tick };\n\t}\n\n\t// Raw payout quantity must land on a lot boundary — the chain rejects otherwise.\n\t#assertLot(quantityRaw: bigint): void {\n\t\t// From the config in play, not the exported testnet constant — a deployment with a\n\t\t// different `position_lot_size` must not be validated against testnet's.\n\t\tconst lot = BigInt(this.cfg.units.positionLotSize);\n\t\tif (quantityRaw % lot !== 0n) {\n\t\t\tthrow new PredictInputError(\n\t\t\t\t`quantity ${quantityRaw} raw is not a whole ${lot}-unit lot (position_lot_size)`,\n\t\t\t);\n\t\t}\n\t}\n\n\t// Whether the owner's account wrapper exists. A visitor without an account still gets a plan.\n\tasync #hasAccount(owner: string): Promise<boolean> {\n\t\tconst {\n\t\t\tobjects: [wrapper],\n\t\t} = await this.#client.core.getObjects({ objectIds: [this.wrapperIdFor(owner)] });\n\t\treturn !(wrapper instanceof Error);\n\t}\n\n\t// The slippage a plan applies, per $1 of payout, 1e9-scaled: the caller's, or the model band at\n\t// the quote's probability.\n\tstatic #appliedSlippage(\n\t\topts: SlippageOptions,\n\t\tprobabilityRaw: bigint,\n\t\tstate: MarketQueueState,\n\t\tnowMs: bigint,\n\t): { raw: bigint; applied: AppliedSlippage } {\n\t\tconst cents = opts.slippageCents ?? 'auto';\n\t\tif (cents !== 'auto') {\n\t\t\tif (!(Number.isFinite(cents) && cents >= 0 && cents <= 100)) {\n\t\t\t\tthrow new PredictInputError(\n\t\t\t\t\t`slippageCents must be in [0, 100] cents per contract, got ${cents}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\t// A cent is 1e7 in the 1e9-scaled price per $1 of payout.\n\t\t\tconst raw = BigInt(Math.round(cents * 1e7));\n\t\t\treturn { raw, applied: { cents: Number(raw) / 1e7, source: 'input', band: null } };\n\t\t}\n\t\tconst policy = state.desk.policy;\n\t\tconst band = slippageBand({\n\t\t\t// The band is undefined at the certain ends, where a queued mint is refused anyway.\n\t\t\tprobability: Math.min(Math.max(rawToProbability(probabilityRaw), 1e-6), 1 - 1e-6),\n\t\t\ttimeToExpiryMs: Number(state.expiryMs > nowMs ? state.expiryMs - nowMs : 0n),\n\t\t\tdelayMs: Number(policy.delayMs),\n\t\t\ttickMs: Number(channelTickMs(policy.pythChannel)),\n\t\t\tk: opts.k,\n\t\t});\n\t\tconst raw = BigInt(Math.ceil(band.deltaProbability * 1e9));\n\t\treturn { raw, applied: { cents: Number(raw) / 1e7, source: 'auto', band } };\n\t}\n\n\t// Why the chain refused a plan's quote, as a typed refusal, or the chain's own error when it\n\t// can't tell. A market past its expiry has no live price (`ELivePricingExpired`). A mint the\n\t// chain refuses at the current price (`EOrderFailsLimits`) is diagnosed by `#entryBandRefusal`.\n\tasync #quoteRefusal(\n\t\terror: unknown,\n\t\tmint?: { m: MarketDescriptor; quantityRaw?: bigint },\n\t): Promise<unknown> {\n\t\tif (isPastExpiry(error)) {\n\t\t\treturn new PredictPreflightError(\n\t\t\t\t'past-cutoff',\n\t\t\t\t'the market reached its expiry, so it has no live price and takes no orders',\n\t\t\t);\n\t\t}\n\t\tif (mint != null && isOrderFailsLimits(error)) {\n\t\t\treturn (await this.#entryBandRefusal(mint.m, mint.quantityRaw)) ?? error;\n\t\t}\n\t\treturn error;\n\t}\n\n\t// Why the chain refused to quote a mint at the current price (`EOrderFailsLimits`), as a typed\n\t// refusal: a binary strike outside the market's entry band, or an exact quantity whose premium\n\t// is below the minimum. Null when neither explains it, or the diagnosis can't be read, so the\n\t// caller rethrows the chain's error.\n\tasync #entryBandRefusal(\n\t\tm: MarketDescriptor,\n\t\tquantityRaw?: bigint,\n\t): Promise<PredictPreflightError | null> {\n\t\tif (m.side === 'range') return null;\n\t\t// Best effort: a failed diagnosis read leaves the chain's own error to the caller.\n\t\tconst read = await Promise.all([this.read.price(m), this.read.feePolicy(m)]).catch(() => null);\n\t\tif (read == null) return null;\n\t\tconst [prices, policy] = read;\n\t\tconst probability = probabilityToRaw(m.side === 'up' ? prices.up : prices.down);\n\t\tif (probability < policy.minEntryProbability || probability > policy.maxEntryProbability) {\n\t\t\treturn new PredictPreflightError(\n\t\t\t\t'entry-band',\n\t\t\t\t`the ${m.side} probability ${rawToProbability(probability)} is outside the market's entry band [${rawToProbability(policy.minEntryProbability)}, ${rawToProbability(policy.maxEntryProbability)}]: pick a strike nearer the money`,\n\t\t\t);\n\t\t}\n\t\tif (quantityRaw != null && (quantityRaw * probability) / 1_000_000_000n < MIN_PREMIUM) {\n\t\t\treturn new PredictPreflightError(\n\t\t\t\t'min-premium',\n\t\t\t\t`${rawToUsdc(quantityRaw)} contracts cost a premium below the ${rawToUsdc(MIN_PREMIUM)} USDC minimum`,\n\t\t\t);\n\t\t}\n\t\treturn null;\n\t}\n\n\t// A payout floor admission buys at least, for an all-in budget: the largest lot multiple up to\n\t// `startRaw` whose cost without the fee subsidy, by an exact chain quote, fits the budget.\n\t// Admission (`cost_qty_at`, no subsidy) first finds the largest quantity whose cost fits, and\n\t// cost rises with quantity, so that is at least this. A probe below the minimum premium\n\t// (`EOrderFailsLimits`) is retried once at the smallest quantity that clears it. Admission\n\t// searches again only when its fill costs more than its payout, a search rounding makes\n\t// non-monotone, so a floor whose payout is below the budget, about $1 a contract, is refused.\n\tasync #admittedFloor(\n\t\tquoteAt: (quantityRaw: bigint) => Promise<MintQuoteRaw>,\n\t\tbudgetRaw: bigint,\n\t\tstartRaw: bigint,\n\t\tlot: bigint,\n\t\tentryProbabilityRaw: bigint,\n\t\tunsubsidizedPricePerContractRaw: bigint,\n\t): Promise<\n\t\t{ quantity: bigint } | { refusal: 'min-premium' | 'cost-above-payout' | 'entry-band' }\n\t> {\n\t\tconst ceilLot = (x: bigint) => ((x + lot - 1n) / lot) * lot;\n\t\tconst minPremiumQuantity =\n\t\t\tentryProbabilityRaw === 0n\n\t\t\t\t? 0n\n\t\t\t\t: ceilLot((MIN_PREMIUM * 1_000_000_000n + entryProbabilityRaw - 1n) / entryProbabilityRaw);\n\t\tlet quantity = startRaw;\n\t\tlet raised = false;\n\t\tfor (let probe = 0; probe < 5 && quantity > 0n; probe++) {\n\t\t\tlet quote: MintQuoteRaw;\n\t\t\ttry {\n\t\t\t\tquote = await quoteAt(quantity);\n\t\t\t} catch (e) {\n\t\t\t\tif (!isOrderFailsLimits(e)) throw e;\n\t\t\t\tif (!raised && quantity < minPremiumQuantity) {\n\t\t\t\t\traised = true;\n\t\t\t\t\tquantity = minPremiumQuantity;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\t// The raise sized the minimum-premium quantity from the budget quote's entry\n\t\t\t\t// probability. When the raised probe still fails, the probability moved down between\n\t\t\t\t// the two quotes and the premium is still short, so the minimum premium refused it.\n\t\t\t\tif (raised || quantity < minPremiumQuantity) return { refusal: 'min-premium' };\n\t\t\t\t// At or above the minimum premium, admission refuses a cost above the payout or an entry\n\t\t\t\t// probability outside the band. Well below $1 a contract the cost can't reach the payout,\n\t\t\t\t// so the probability left the band between the budget quote and this probe.\n\t\t\t\treturn {\n\t\t\t\t\trefusal:\n\t\t\t\t\t\tunsubsidizedPricePerContractRaw < NEAR_DOLLAR_PER_CONTRACT\n\t\t\t\t\t\t\t? 'entry-band'\n\t\t\t\t\t\t\t: 'cost-above-payout',\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst unsubsidized = quote.allInCost - quote.penaltyFee + quote.feeIncentiveSubsidy;\n\t\t\tif (unsubsidized <= budgetRaw) {\n\t\t\t\treturn quantity >= budgetRaw ? { quantity } : { refusal: 'cost-above-payout' };\n\t\t\t}\n\t\t\t// The smallest quantity that clears the minimum premium doesn't fit.\n\t\t\tif (raised) return { refusal: 'min-premium' };\n\t\t\tconst next = ((quantity * budgetRaw) / unsubsidized / lot) * lot;\n\t\t\tquantity = next < quantity ? next : quantity - lot;\n\t\t}\n\t\treturn { refusal: 'min-premium' };\n\t}\n\n\t// A budget mint's quote for no particular account. `quote_mint` has no all-in budget mode, so\n\t// this searches for the largest lot multiple whose all-in cost fits the budget. The first probe\n\t// is its premium-budget mode with the whole budget as the premium, whose premium clears the\n\t// 1 USDC minimum whenever the purchase can. Each next probe divides the budget by the last price\n\t// per contract. The price barely moves with size, so a few quotes settle it. A probe the chain\n\t// refuses (`EOrderFailsLimits`) ends the search with the best fit so far. With no fit, the\n\t// refusal is `min-premium`, unless the chain priced no probe and the budget is at least the\n\t// minimum premium plus a lot: the first probe's premium is above `budget − lot` (a lot costs\n\t// under $1), so the minimum premium didn't refuse it, and the chain's own refusal stands.\n\tasync #searchBudgetQuote(\n\t\tticks: { expiryMarketId: string; lowerTick: bigint; higherTick: bigint } & MarketFeeds,\n\t\tbudgetRaw: bigint,\n\t\tlot: bigint,\n\t): Promise<MintQuoteRaw> {\n\t\tconst floorLot = (x: bigint) => (x / lot) * lot;\n\t\tlet refusal: unknown = null;\n\t\tlet priced = false;\n\t\tconst probeQuote = async (request: AnonymousMintQuoteRequest) => {\n\t\t\ttry {\n\t\t\t\tconst { quote } = await quoteMintAnonymous(this.#client, this.#config, {\n\t\t\t\t\t...ticks,\n\t\t\t\t\trequest,\n\t\t\t\t});\n\t\t\t\tpriced = true;\n\t\t\t\treturn quote;\n\t\t\t} catch (e) {\n\t\t\t\tif (!isOrderFailsLimits(e)) throw e;\n\t\t\t\trefusal ??= e;\n\t\t\t\treturn null;\n\t\t\t}\n\t\t};\n\t\tlet best: MintQuoteRaw | null = null;\n\t\tlet quote = await probeQuote({\n\t\t\tshape: 'exact-amount',\n\t\t\tmaxPremiumRaw: budgetRaw,\n\t\t\tminQuantityRaw: lot,\n\t\t});\n\t\tfor (let probe = 1; quote != null; probe++) {\n\t\t\tconst cost = quote.allInCost - quote.penaltyFee;\n\t\t\tif (cost <= budgetRaw && (best == null || quote.quantity > best.quantity)) best = quote;\n\t\t\tif (probe === 4) break;\n\t\t\tconst next = cost === 0n ? quote.quantity : floorLot((budgetRaw * quote.quantity) / cost);\n\t\t\tif (next === 0n || next === quote.quantity) break;\n\t\t\tquote = await probeQuote({ shape: 'exact-quantity', quantityRaw: next });\n\t\t}\n\t\tif (best == null) {\n\t\t\tif (!priced && refusal != null && budgetRaw >= MIN_PREMIUM + lot) throw refusal;\n\t\t\tthrow new PredictPreflightError(\n\t\t\t\t'min-premium',\n\t\t\t\t`a budget of ${rawToUsdc(budgetRaw)} buys no payout at the current price (a mint's premium must be at least ${rawToUsdc(MIN_PREMIUM)} USDC)`,\n\t\t\t);\n\t\t}\n\t\treturn best;\n\t}\n\n\t// The PredictPreflightError code a check throws, or null when it passes.\n\tstatic #refusal(check: () => void): PredictPreflightCode | null {\n\t\ttry {\n\t\t\tcheck();\n\t\t\treturn null;\n\t\t} catch (e) {\n\t\t\tif (e instanceof PredictPreflightError) return e.code;\n\t\t\tthrow e;\n\t\t}\n\t}\n\n\t// Shared construction for tx.mint and read.quoteMint. The quote dry-runs the\n\t// same mint the trade sends; quoteMint omits the caller's cost/probability caps\n\t// (they only gate via abort and don't change the receipt numbers).\n\tasync #buildMint(owner: string, m: MarketDescriptor, opts: MintOptions): Promise<Transaction> {\n\t\tconst feeds = this.#feeds(m.underlying);\n\t\tconst { id, state } = await this.#resolveMarket(m);\n\t\tconst quantityRaw = usdcToRaw(opts.quantity);\n\t\tthis.#assertLot(quantityRaw);\n\t\tconst { lowerTick, higherTick } = await this.#strikeTicks(m, id, state);\n\t\treturn txOf(\n\t\t\tmintExactQuantity(this.#config, {\n\t\t\t\texpiryMarketId: id,\n\t\t\t\twrapperId: this.wrapperIdFor(owner),\n\t\t\t\tlowerTick,\n\t\t\t\thigherTick,\n\t\t\t\tquantityRaw,\n\t\t\t\tmaxCostRaw: opts.maxCost != null ? usdcToRaw(opts.maxCost) : undefined,\n\t\t\t\tmaxProbabilityRaw:\n\t\t\t\t\topts.maxProbability != null ? probabilityToRaw(opts.maxProbability) : undefined,\n\t\t\t\t...feeds,\n\t\t\t}),\n\t\t);\n\t}\n\n\tasync #buildMintCost(\n\t\towner: string,\n\t\tm: MarketDescriptor,\n\t\topts: MintCostOptions,\n\t): Promise<Transaction> {\n\t\tconst feeds = this.#feeds(m.underlying);\n\t\tconst maxCostRaw = usdcToRaw(opts.spend);\n\t\tconst minQuantityRaw = usdcToRaw(opts.minQuantity);\n\t\tconst { id, state } = await this.#resolveMarket(m);\n\t\tconst { lowerTick, higherTick } = await this.#strikeTicks(m, id, state);\n\t\treturn txOf(\n\t\t\tmintExactCost(this.#config, {\n\t\t\t\texpiryMarketId: id,\n\t\t\t\twrapperId: this.wrapperIdFor(owner),\n\t\t\t\tlowerTick,\n\t\t\t\thigherTick,\n\t\t\t\tmaxCostRaw,\n\t\t\t\tminQuantityRaw,\n\t\t\t\t...feeds,\n\t\t\t}),\n\t\t);\n\t}\n\n\tasync #quoteMintTransaction(owner: string, tx: Transaction): Promise<MintQuote> {\n\t\tconst events = await simulateWithEvents(this.#client, tx, owner);\n\t\tconst r = exactlyOne(decodeMints(this.cfg, { events }), 'OrderMinted');\n\t\t// Mirrors the deployed `compute_mint_quote`'s all_in_cost exactly:\n\t\t// premium + (trading − subsidy) + builder + penalty + inventory-impact.\n\t\t// `referral_fee` is deliberately NOT added — it is a portion OF the\n\t\t// trader-paid trading fee and congestion surcharge, not an extra debit.\n\t\tconst costRaw =\n\t\t\tr.raw.premium +\n\t\t\t(r.raw.tradingFee - r.raw.feeIncentiveSubsidy) +\n\t\t\tr.raw.builderFee +\n\t\t\tr.raw.penaltyFee +\n\t\t\tr.raw.inventoryImpactCharge;\n\t\treturn {\n\t\t\tentryProbability: r.entryProbability,\n\t\t\tpremium: r.premium,\n\t\t\tfees: r.fees,\n\t\t\tcost: rawToUsdc(costRaw),\n\t\t\tquantity: r.quantity,\n\t\t\traw: {\n\t\t\t\tpremium: r.raw.premium,\n\t\t\t\tcost: costRaw,\n\t\t\t\tquantity: r.raw.quantity,\n\t\t\t\tentryProbability: r.raw.entryProbability,\n\t\t\t},\n\t\t\tfeesExact: true,\n\t\t};\n\t}\n\n\t// Shared construction for tx.redeem and read.quoteRedeem.\n\tasync #buildRedeem(owner: string, m: MarketDescriptor, opts: CloseOptions): Promise<Transaction> {\n\t\tconst feeds = this.#feeds(m.underlying);\n\t\tconst { id } = await this.#resolveMarket(m);\n\t\tconst closeQuantityRaw = usdcToRaw(opts.quantity);\n\t\tthis.#assertLot(closeQuantityRaw);\n\t\treturn txOf(\n\t\t\tredeemLive(this.#config, {\n\t\t\t\texpiryMarketId: id,\n\t\t\t\twrapperId: this.wrapperIdFor(owner),\n\t\t\t\torderId: opts.orderId,\n\t\t\t\tcloseQuantityRaw,\n\t\t\t\t...feeds,\n\t\t\t}),\n\t\t);\n\t}\n\n\t// Raw strike for anonymous pricing: numeric strikes validate against the tick\n\t// grid; \"reference\" reads the market's reference tick fresh (unset → typed error).\n\tasync #strikeRawFor(\n\t\tm: BinaryMarketCoordinates,\n\t\tmarketId: string,\n\t\tstate: MarketState,\n\t): Promise<bigint> {\n\t\tif (m.strike !== 'reference') {\n\t\t\t// Same validation as the mint path: on the grid AND inside the finite tick\n\t\t\t// domain (0 / POS_INF are the ±inf sentinels, not quotable strikes).\n\t\t\treturn this.#gridTick(m.strike, state.tickSizeRaw) * state.tickSizeRaw;\n\t\t}\n\t\tconst tick = await referenceTick(this.#client, this.#config, marketId);\n\t\tif (tick == null) {\n\t\t\tthrow new PredictInputError(\n\t\t\t\t`reference price not set yet for ${m.underlying} @ ${m.expiryMs} — retry shortly or pass a numeric strike`,\n\t\t\t);\n\t\t}\n\t\treturn tick * state.tickSizeRaw;\n\t}\n\n\t// === delayed execution (DBU-885) ===\n\n\t// The config slice the queue calls take, or a typed refusal: without the Predict upgrade, the\n\t// order-flow companion and its desk, this SDK version has no record of delayed execution on the\n\t// network, and the queue calls would address the wrong package or decode nothing.\n\t#requireDelayedExecution(): OrdersGeneratedConfig {\n\t\treturn toOrdersConfig(this.cfg);\n\t}\n\n\t// Whether the config records delayed execution, without throwing.\n\t#recordsDelayedExecution(): boolean {\n\t\tconst { predictDelayedExecution, predictOrders } = this.cfg.packages;\n\t\tconst { orderDesk, queueRegistry } = this.cfg.objects;\n\t\treturn Boolean(predictDelayedExecution && predictOrders && orderDesk && queueRegistry);\n\t}\n\n\t// The market's queue ID, once its `MarketQueue` is known to exist. A missing queue would abort\n\t// every read and order with an opaque error, so it is refused here with a typed one.\n\tasync #existingQueueId(orders: OrdersGeneratedConfig, marketId: string): Promise<string> {\n\t\tconst queueId = deriveQueueId(orders.queueRegistry, marketId);\n\t\tif (this.#knownQueues.has(queueId)) return queueId;\n\t\tconst {\n\t\t\tobjects: [queue],\n\t\t} = await this.#client.core.getObjects({ objectIds: [queueId] });\n\t\tif (queue instanceof Error) {\n\t\t\tthrow new PredictPreflightError(\n\t\t\t\t'no-queue',\n\t\t\t\t`market ${marketId} has no order queue yet (\\`queue::create_and_share\\` hasn't run for it)`,\n\t\t\t);\n\t\t}\n\t\tthis.#knownQueues.add(queueId);\n\t\treturn queueId;\n\t}\n\n\tasync #queueState(\n\t\torders: OrdersGeneratedConfig,\n\t\tmarketId: string,\n\t\topts: { owner?: string; recordIds?: bigint[] } = {},\n\t): Promise<MarketQueueState> {\n\t\tconst queueId = await this.#existingQueueId(orders, marketId);\n\t\treturn marketQueueState(this.#client, orders, marketId, {\n\t\t\towner: opts.owner,\n\t\t\tquoteCoinType: this.cfg.quoteCoinType,\n\t\t\trecordIds: opts.recordIds,\n\t\t\tqueueId,\n\t\t});\n\t}\n\n\t// The queue gates every enqueue passes: Predict's order-flow allowlist and cutover, the\n\t// pauses, then the queue's own (`begin_enqueue`): the stuck gate, capacity, the per-account\n\t// cap, and the cutoff on the previewed τ. Throws the matching PredictPreflightError.\n\t#assertQueueOpen(\n\t\tstate: MarketQueueState,\n\t\tside: 'mint' | 'sell',\n\t\tnowMs: bigint,\n\t): { policy: DelayedExecutionPolicy; timing: TimingPreview } {\n\t\tconst policy = state.desk.policy;\n\t\tif (!state.protocol.orderFlowEnabled) {\n\t\t\tthrow new PredictPreflightError(\n\t\t\t\t'not-live',\n\t\t\t\t\"queued orders aren't live yet: the protocol hasn't enabled the order-flow package\",\n\t\t\t);\n\t\t}\n\t\tconst mode = executionModeFor(state.protocol.versionWatermark, true);\n\t\tif (mode === 'retired') {\n\t\t\tthrow new PredictPreflightError(\n\t\t\t\t'retired',\n\t\t\t\t'the Predict package version this SDK calls is retired: update the SDK',\n\t\t\t);\n\t\t}\n\t\tif (mode !== 'delayed') {\n\t\t\tthrow new PredictPreflightError(\n\t\t\t\t'not-live',\n\t\t\t\t\"queued orders aren't live yet: the protocol's version watermark hasn't been raised\",\n\t\t\t);\n\t\t}\n\t\tif (state.desk.versionWatermark > ORDER_FLOW_PACKAGE_VERSION) {\n\t\t\tthrow new PredictPreflightError(\n\t\t\t\t'retired',\n\t\t\t\t'the order-flow package version this SDK calls is retired: update the SDK',\n\t\t\t);\n\t\t}\n\t\tif (state.protocol.frozen) throw new PredictPreflightError('paused', 'the protocol is frozen');\n\t\tif (side === 'mint' && (state.protocol.tradingPaused || state.mintPaused)) {\n\t\t\tthrow new PredictPreflightError('paused', 'minting is paused on this market');\n\t\t}\n\t\tif (state.stuck) {\n\t\t\tthrow new PredictPreflightError(\n\t\t\t\t'stuck',\n\t\t\t\t'pricing is delayed for this market, try again shortly',\n\t\t\t);\n\t\t}\n\t\tconst [pending, capacity] =\n\t\t\tside === 'mint'\n\t\t\t\t? [state.pending.mints, policy.mintCapacity]\n\t\t\t\t: [state.pending.sells, policy.sellCapacity];\n\t\tif (pending >= capacity) {\n\t\t\tthrow new PredictPreflightError(\n\t\t\t\t'queue-full',\n\t\t\t\t`the market has ${pending} waiting ${side}s, its maximum`,\n\t\t\t);\n\t\t}\n\t\tif (state.account && state.account.waitingOrders >= policy.perAccountCap) {\n\t\t\tthrow new PredictPreflightError(\n\t\t\t\t'account-cap',\n\t\t\t\t`the account already has ${state.account.waitingOrders} waiting orders in this market, its maximum`,\n\t\t\t);\n\t\t}\n\t\tconst timing = previewTiming({\n\t\t\tnowMs,\n\t\t\tpolicy,\n\t\t\theads: state.heads,\n\t\t\texpiryMs: state.expiryMs,\n\t\t\tnoTradeWindowMs: state.protocol.noTradeWindowMs,\n\t\t});\n\t\tif (!timing.beforeCutoff) {\n\t\t\tthrow new PredictPreflightError(\n\t\t\t\t'past-cutoff',\n\t\t\t\t'this market no longer takes orders before its expiry',\n\t\t\t);\n\t\t}\n\t\treturn { policy, timing };\n\t}\n\n\t#preview(\n\t\tmarketId: string,\n\t\tkind: number,\n\t\ttiming: TimingPreview,\n\t\tpolicy: DelayedExecutionPolicy,\n\t\tbudget: bigint,\n\t\tcashNeedRaw: bigint,\n\t\tspareCashRaw: bigint,\n\t\tfunding: { needsFunding: boolean; fundedInTransaction: boolean },\n\t): QueuedOrderPreview {\n\t\tconst totalDebit = budget + policy.orderFee;\n\t\treturn {\n\t\t\tmarketId,\n\t\t\tkind,\n\t\t\tkindName: orderKindName(kind),\n\t\t\ttiming,\n\t\t\torderFee: rawToUsdc(policy.orderFee),\n\t\t\tbudget: rawToUsdc(budget),\n\t\t\ttotalDebit: rawToUsdc(totalDebit),\n\t\t\tcashNeedRaw,\n\t\t\tspareCashRaw,\n\t\t\t...funding,\n\t\t\traw: { orderFee: policy.orderFee, budget, totalDebit },\n\t\t};\n\t}\n\n\t// Shared by the three queued mints: resolve the market and ticks, build the enqueue (its static\n\t// checks run first), then one read for the preflight: queue gates, fee, budget, cash need.\n\tasync #planMint(\n\t\towner: string,\n\t\tm: MarketDescriptor,\n\t\torder: { kind: number; maxCostRaw: bigint; quantityRaw?: bigint; maxPremiumRaw?: bigint },\n\t\tbuild: (\n\t\t\torders: OrdersGeneratedConfig,\n\t\t\ttarget: {\n\t\t\t\texpiryMarketId: string;\n\t\t\t\twrapperId: string;\n\t\t\t\tlowerTick: bigint;\n\t\t\t\thigherTick: bigint;\n\t\t\t} & MarketFeeds,\n\t\t) => (tx: Transaction) => TransactionResult,\n\t): Promise<QueuedOrderPlan> {\n\t\tconst orders = this.#requireDelayedExecution();\n\t\tconst feeds = this.#feeds(m.underlying);\n\t\tconst { id, state: market } = await this.#resolveMarket(m);\n\t\tconst { lowerTick, higherTick } = await this.#strikeTicks(m, id, market);\n\t\tconst thunk = build(orders, {\n\t\t\texpiryMarketId: id,\n\t\t\twrapperId: this.wrapperIdFor(owner),\n\t\t\tlowerTick,\n\t\t\thigherTick,\n\t\t\t...feeds,\n\t\t});\n\t\tconst state = await this.#queueState(orders, id, { owner });\n\t\tconst { policy, timing } = this.#assertQueueOpen(state, 'mint', BigInt(Date.now()));\n\t\tconst { budget, cashNeed } = PredictClient.#assertMintOrder(state, policy, order);\n\t\t// The enqueue charges the desk's fee at execution, so hold it to the previewed one.\n\t\tconst tx = new Transaction();\n\t\ttx.add(assertOrderFeeAtMost(orders, policy.orderFee));\n\t\ttx.add(thunk);\n\t\treturn {\n\t\t\ttransaction: tx,\n\t\t\tpreview: this.#preview(id, order.kind, timing, policy, budget, cashNeed, state.spareCash, {\n\t\t\t\tneedsFunding: false,\n\t\t\t\tfundedInTransaction: false,\n\t\t\t}),\n\t\t};\n\t}\n\n\t// A mint's own checks after the queue gates, shared by the mint builders and `read.planMint`:\n\t// the order fee, the escrowed budget against the minimum premium, and the market's cash.\n\tstatic #assertMintOrder(\n\t\tstate: MarketQueueState,\n\t\tpolicy: DelayedExecutionPolicy,\n\t\torder: { kind: number; maxCostRaw: bigint; quantityRaw?: bigint; maxPremiumRaw?: bigint },\n\t): { budget: bigint; cashNeed: bigint } {\n\t\tconst available = state.account?.availableRaw ?? 0n;\n\t\tconst budget = mintBudget({\n\t\t\tkind: order.kind,\n\t\t\tmaxCostRaw: order.maxCostRaw,\n\t\t\tavailableRaw: available,\n\t\t\torderFeeRaw: policy.orderFee,\n\t\t\tquantityRaw: order.quantityRaw,\n\t\t});\n\t\tif (budget == null) {\n\t\t\tthrow new PredictPreflightError(\n\t\t\t\t'fee',\n\t\t\t\t`the balance (${rawToUsdc(available)}) doesn't cover the ${rawToUsdc(policy.orderFee)} order fee`,\n\t\t\t);\n\t\t}\n\t\tif (budget < MIN_PREMIUM) {\n\t\t\tthrow new PredictPreflightError(\n\t\t\t\t'min-premium',\n\t\t\t\t`the escrowed budget ${rawToUsdc(budget)} is below the ${rawToUsdc(MIN_PREMIUM)} minimum premium`,\n\t\t\t);\n\t\t}\n\t\tif (order.kind !== ORDER_KIND.EXACT_QUANTITY && state.minEntryProbability === 0n) {\n\t\t\tthrow new PredictPreflightError('market-cash', 'this market takes no budget mints');\n\t\t}\n\t\tconst cashNeed = mintCashNeed({\n\t\t\tkind: order.kind,\n\t\t\tbudgetRaw: budget,\n\t\t\tminEntryProbability: state.minEntryProbability,\n\t\t\tquantityRaw: order.quantityRaw,\n\t\t\tmaxPremiumRaw: order.maxPremiumRaw,\n\t\t});\n\t\tif (cashNeed > state.spareCash) {\n\t\t\tthrow new PredictPreflightError(\n\t\t\t\t'market-cash',\n\t\t\t\t\"this market can't take an order this size right now\",\n\t\t\t);\n\t\t}\n\t\treturn { budget, cashNeed };\n\t}\n\n\t// The record a sell names is Open. The chain can't even quote one that isn't (`ERecordNotOpen`).\n\tstatic #assertRecordOpen(state: MarketQueueState, recordId: bigint): QueuedOrder {\n\t\tconst record = state.records[0];\n\t\tif (!record || record.status !== ORDER_STATUS.OPEN || record.position.order_id === 0n) {\n\t\t\tthrow new PredictPreflightError(\n\t\t\t\t'record-not-open',\n\t\t\t\t`record ${recordId} isn't an Open position`,\n\t\t\t);\n\t\t}\n\t\treturn record;\n\t}\n\n\t// The quantity an Open record holds, refusing a sell of more than that.\n\t#assertSellQuantity(record: QueuedOrder, closeQuantityRaw: bigint): bigint {\n\t\tconst held = decodeOrderRange(\n\t\t\trecord.position.order_id,\n\t\t\tBigInt(this.cfg.units.positionLotSize),\n\t\t).quantity;\n\t\tif (closeQuantityRaw > held) {\n\t\t\tthrow new PredictInputError(\n\t\t\t\t`quantity ${rawToUsdc(closeQuantityRaw)} is above the record's ${rawToUsdc(held)}`,\n\t\t\t);\n\t\t}\n\t\treturn held;\n\t}\n\n\t// A sell's own checks after the queue gates, shared by `tx.enqueueSell` and `read.planSell`: the\n\t// record is Open and the owner's, the order fee, the record's quantity and the minimum sell. A\n\t// sell is never refused for market cash.\n\t#assertSellOrder(\n\t\tstate: MarketQueueState,\n\t\tpolicy: DelayedExecutionPolicy,\n\t\trecordId: bigint,\n\t\tcloseQuantityRaw: bigint,\n\t): void {\n\t\tconst record = PredictClient.#assertRecordOpen(state, recordId);\n\t\tif (\n\t\t\t!state.account ||\n\t\t\tnormalizeSuiAddress(record.account_id) !== normalizeSuiAddress(state.account.accountId)\n\t\t) {\n\t\t\tthrow new PredictPreflightError(\n\t\t\t\t'not-record-owner',\n\t\t\t\t`record ${recordId} belongs to another account`,\n\t\t\t);\n\t\t}\n\t\tif (!feeCovered('sell', state.account.availableRaw, policy.orderFee)) {\n\t\t\tthrow new PredictPreflightError(\n\t\t\t\t'fee',\n\t\t\t\t`the balance doesn't cover the ${rawToUsdc(policy.orderFee)} order fee`,\n\t\t\t);\n\t\t}\n\t\tconst held = this.#assertSellQuantity(record, closeQuantityRaw);\n\t\tconst min = policy.minSellQuantity;\n\t\tif (closeQuantityRaw < min || (closeQuantityRaw < held && held - closeQuantityRaw < min)) {\n\t\t\tthrow new PredictPreflightError(\n\t\t\t\t'below-min-sell',\n\t\t\t\t`a sell must close at least ${rawToUsdc(min)} and leave either nothing or at least that much`,\n\t\t\t);\n\t\t}\n\t}\n\n\tasync #planSell(\n\t\towner: string,\n\t\tm: MarketCoordinates,\n\t\topts: EnqueueSellOptions,\n\t): Promise<QueuedOrderPlan> {\n\t\tconst orders = this.#requireDelayedExecution();\n\t\tconst feeds = this.#feeds(m.underlying);\n\t\tconst { id } = await this.#resolveMarket(m);\n\t\tconst closeQuantityRaw = usdcToRaw(opts.quantity);\n\t\tthis.#assertLot(closeQuantityRaw);\n\t\tconst thunk = enqueueRedeemOpen(orders, {\n\t\t\texpiryMarketId: id,\n\t\t\twrapperId: this.wrapperIdFor(owner),\n\t\t\trecordId: opts.recordId,\n\t\t\tcloseQuantityRaw,\n\t\t\tminProbabilityRaw: probabilityToRaw(opts.minProbability),\n\t\t\tminProceedsRaw: usdcToRaw(opts.minProceeds),\n\t\t\t...feeds,\n\t\t});\n\t\tconst state = await this.#queueState(orders, id, { owner, recordIds: [opts.recordId] });\n\t\tconst { policy, timing } = this.#assertQueueOpen(state, 'sell', BigInt(Date.now()));\n\t\tthis.#assertSellOrder(state, policy, opts.recordId, closeQuantityRaw);\n\t\tconst cashNeed = cashNeedSell(closeQuantityRaw, state.backingBufferLambda);\n\t\tconst needsFunding = cashNeed > state.spareCash;\n\t\tconst fund = opts.fundMarket ?? 'auto';\n\t\tconst funded = fund === 'always' || (fund === 'auto' && needsFunding);\n\t\tconst tx = new Transaction();\n\t\t// The enqueue charges the desk's fee at execution, so hold it to the previewed one.\n\t\ttx.add(assertOrderFeeAtMost(orders, policy.orderFee));\n\t\ttx.add(thunk);\n\t\t// After the enqueue: its cash need is then in `waiting_cash_need`, which the rebalance funds.\n\t\tif (funded) tx.add(rebalanceExpiryCash(this.#config, { expiryMarketId: id }));\n\t\treturn {\n\t\t\ttransaction: tx,\n\t\t\tpreview: this.#preview(\n\t\t\t\tid,\n\t\t\t\tORDER_KIND.REDEEM_OPEN,\n\t\t\t\ttiming,\n\t\t\t\tpolicy,\n\t\t\t\t0n,\n\t\t\t\tcashNeed,\n\t\t\t\tstate.spareCash,\n\t\t\t\t{\n\t\t\t\t\tneedsFunding,\n\t\t\t\t\tfundedInTransaction: funded,\n\t\t\t\t},\n\t\t\t),\n\t\t};\n\t}\n\n\t// A chain mint quote as a queued-fill preview: the congestion penalty comes out of the cost\n\t// (a queued fill pays none) and the order fee is reported separately.\n\tstatic #queuedMintQuote(q: MintQuoteRaw, policy: DelayedExecutionPolicy | null): MintQuote {\n\t\tconst costRaw = q.allInCost - q.penaltyFee;\n\t\treturn {\n\t\t\tentryProbability: rawToProbability(q.entryProbability),\n\t\t\tpremium: rawToUsdc(q.premium),\n\t\t\tfees: {\n\t\t\t\ttrading: rawToUsdc(q.tradingFee),\n\t\t\t\tsubsidy: rawToUsdc(q.feeIncentiveSubsidy),\n\t\t\t\tbuilder: rawToUsdc(q.builderFee),\n\t\t\t\tpenalty: 0,\n\t\t\t\t// The chain quote doesn't split it out. It is part of `trading`, never extra.\n\t\t\t\treferral: 0,\n\t\t\t\tinventoryImpact: rawToUsdc(q.inventoryImpactCharge),\n\t\t\t},\n\t\t\tcost: rawToUsdc(costRaw),\n\t\t\tquantity: rawToUsdc(q.quantity),\n\t\t\traw: {\n\t\t\t\tpremium: q.premium,\n\t\t\t\tcost: costRaw,\n\t\t\t\tquantity: q.quantity,\n\t\t\t\tentryProbability: q.entryProbability,\n\t\t\t},\n\t\t\tfeesExact: true,\n\t\t\tqueued: true,\n\t\t\torderFee: policy ? rawToUsdc(policy.orderFee) : undefined,\n\t\t};\n\t}\n\n\t// === tx builders ===\n\t// Each returns a ready-to-sign Transaction. Market-resolving builders are async.\n\treadonly tx = {\n\t\tcreateManager: (): Transaction => txOf(accountContract(this.cfg).createAccount()),\n\n\t\t// `create: true` composes first-time funding into ONE PTB: create the account\n\t\t// wrapper, deposit into it through the fresh handle, and `share` it LAST (once\n\t\t// shared, by-value use of the handle is over). The wrapper is derived from the\n\t\t// transaction SENDER (`account_registry::new` takes no owner), so `owner` MUST\n\t\t// be the address that signs this transaction — a sponsored/backend signer would\n\t\t// silently fund its own fresh account instead. The caller also asserts the\n\t\t// account does not exist yet: `new` ABORTS at the deterministic address if it\n\t\t// already exists — no chain read is done here. Gate on your own existence check\n\t\t// (`wrapperIdFor(owner)` + a getObject), or retry without the flag on that abort.\n\t\t//\n\t\t// Without `create`, the sourced coin goes into the existing account's stored\n\t\t// balance via the PTB-callable `deposit_funds` (folds settle → authorize → load →\n\t\t// deposit; clock auto-injected). Command order is auth → deposit (auth is a hot\n\t\t// potato consumed by the deposit). See\n\t\t// `packages/account/sources/account.move` (`deposit_funds`).\n\t\tdeposit: (\n\t\t\towner: string,\n\t\t\tamountUsdc: number | string,\n\t\t\topts?: { create?: boolean },\n\t\t): Transaction => {\n\t\t\tconst tx = new Transaction();\n\t\t\tconst coin = tx.add(\n\t\t\t\tcoinWithBalance({\n\t\t\t\t\ttype: this.cfg.quoteCoinType,\n\t\t\t\t\tbalance: usdcToRaw(amountUsdc),\n\t\t\t\t\tuseGasCoin: false,\n\t\t\t\t}),\n\t\t\t);\n\t\t\tif (opts?.create) {\n\t\t\t\ttx.add(\n\t\t\t\t\taccountContract(this.cfg).createAccountAndDeposit({\n\t\t\t\t\t\tcoin,\n\t\t\t\t\t\tcoinType: this.cfg.quoteCoinType,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\ttx.add(\n\t\t\t\t\tdepositFunds({\n\t\t\t\t\t\tconfig: this.#config,\n\t\t\t\t\t\targuments: { wrapper: this.wrapperIdFor(owner), coin },\n\t\t\t\t\t\ttypeArguments: [this.cfg.quoteCoinType],\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn tx;\n\t\t},\n\n\t\t// Withdraw `amountUsdc` from the account back to `owner`. By default the funds land\n\t\t// in the owner's USDC *address balance* (the versionless accumulator) via\n\t\t// `0x2::coin::send_funds` — no coin-object churn, and they merge into the same\n\t\t// balance `deposit` draws from, closing the loop. Pass `{ toCoinObject: true }` to\n\t\t// instead receive a discrete `Coin<T>` object (for wallets/explorers that only\n\t\t// render coin objects, or to compose the coin further in your own PTB). Either way\n\t\t// the underlying `withdraw_funds` returns the raw `Coin<T>` — the PTB-callable form\n\t\t// that folds settle → authorize → load → withdraw (clock auto-injected, `ctx`\n\t\t// implicit); command order is auth → withdraw. See\n\t\t// `packages/account/sources/account.move` (`withdraw_funds`).\n\t\twithdraw: (\n\t\t\towner: string,\n\t\t\tamountUsdc: number | string,\n\t\t\topts?: { toCoinObject?: boolean },\n\t\t): Transaction => {\n\t\t\tconst tx = new Transaction();\n\t\t\tconst coin = tx.add(\n\t\t\t\twithdrawFunds({\n\t\t\t\t\tconfig: this.#config,\n\t\t\t\t\targuments: { wrapper: this.wrapperIdFor(owner), amount: usdcToRaw(amountUsdc) },\n\t\t\t\t\ttypeArguments: [this.cfg.quoteCoinType],\n\t\t\t\t}),\n\t\t\t);\n\t\t\tif (opts?.toCoinObject) {\n\t\t\t\ttx.transferObjects([coin], owner);\n\t\t\t} else {\n\t\t\t\ttx.moveCall({\n\t\t\t\t\ttarget: '0x2::coin::send_funds',\n\t\t\t\t\ttypeArguments: [this.cfg.quoteCoinType],\n\t\t\t\t\targuments: [coin, tx.pure.address(owner)],\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn tx;\n\t\t},\n\n\t\t/**\n\t\t * Immediate exact-quantity mint (`mint_exact_quantity`).\n\t\t * @deprecated Retired by delayed execution (DBU-885): Predict v4 always aborts it\n\t\t * (`EDelayedExecutionRequired`), so it works only while the config calls a pre-v4 package.\n\t\t * Use {@link PredictClient.tx.enqueueMint}, and `read.executionMode()` to know which path a\n\t\t * network is on.\n\t\t */\n\t\tmint: (owner: string, m: MarketDescriptor, opts: MintOptions): Promise<Transaction> =>\n\t\t\tthis.#buildMint(owner, m, opts),\n\n\t\t/**\n\t\t * V2 all-in budget mint; use minQuantity to protect the fill against slippage.\n\t\t * @deprecated Retired by delayed execution (DBU-885): Predict v4 always aborts it\n\t\t * (`EDelayedExecutionRequired`). Use `tx.enqueueMintCost`.\n\t\t */\n\t\tmintCost: (owner: string, m: MarketDescriptor, opts: MintCostOptions): Promise<Transaction> =>\n\t\t\tthis.#buildMintCost(owner, m, opts),\n\n\t\t/**\n\t\t * Immediate premium-budget mint (`mint_exact_amount`).\n\t\t * @deprecated Retired by delayed execution (DBU-885): Predict v4 always aborts it\n\t\t * (`EDelayedExecutionRequired`). Use `tx.enqueueMintAmount`.\n\t\t */\n\t\tmintAmount: async (\n\t\t\towner: string,\n\t\t\tm: MarketDescriptor,\n\t\t\topts: MintAmountOptions,\n\t\t): Promise<Transaction> => {\n\t\t\tconst feeds = this.#feeds(m.underlying);\n\t\t\t// The chain requires a positive all-in cost cap (EMintCostCapRequired);\n\t\t\t// reject a zero cap pre-flight rather than surface a cryptic Move abort.\n\t\t\tif (opts.maxCost != null && opts.maxCost <= 0) {\n\t\t\t\tthrow new PredictInputError('maxCost must be > 0');\n\t\t\t}\n\t\t\tconst { id, state } = await this.#resolveMarket(m);\n\t\t\t// No lot check: min_quantity is a floor the chain compares against an\n\t\t\t// already-lot-floored minted quantity, so any floor value is legal.\n\t\t\tconst minQuantityRaw = usdcToRaw(opts.minQuantity);\n\t\t\tconst { lowerTick, higherTick } = await this.#strikeTicks(m, id, state);\n\t\t\treturn txOf(\n\t\t\t\tmintExactAmount(this.#config, {\n\t\t\t\t\texpiryMarketId: id,\n\t\t\t\t\twrapperId: this.wrapperIdFor(owner),\n\t\t\t\t\tlowerTick,\n\t\t\t\t\thigherTick,\n\t\t\t\t\tmaxPremiumRaw: usdcToRaw(opts.spend),\n\t\t\t\t\tminQuantityRaw,\n\t\t\t\t\tmaxCostRaw: opts.maxCost != null ? usdcToRaw(opts.maxCost) : undefined,\n\t\t\t\t\t...feeds,\n\t\t\t\t}),\n\t\t\t);\n\t\t},\n\n\t\t/**\n\t\t * Immediate close of an account position (`redeem_live`).\n\t\t * @deprecated Retired by delayed execution (DBU-885): Predict v4 always aborts it\n\t\t * (`EDelayedExecutionRequired`). A position held in the account then has no early exit and\n\t\t * is paid at settlement with `claimSettled`. Queued fills are Open records in the market's\n\t\t * queue, sold with `tx.enqueueSell`.\n\t\t */\n\t\tredeem: (owner: string, m: MarketDescriptor, opts: CloseOptions): Promise<Transaction> =>\n\t\t\tthis.#buildRedeem(owner, m, opts),\n\n\t\t/**\n\t\t * Pay a settled position held in the ACCOUNT (`redeem_settled`), in full. Unchanged by delayed\n\t\t * execution, for positions minted before it. It doesn't pay Open queue records: the queue's\n\t\t * settlement walk (`settle_step`) pays those to the account's wrapper address.\n\t\t */\n\t\tclaimSettled: async (\n\t\t\towner: string,\n\t\t\tm: Pick<MarketDescriptor, 'underlying' | 'expiryMs' | 'marketId'>,\n\t\t\topts: Pick<CloseOptions, 'orderId'>,\n\t\t): Promise<Transaction> => {\n\t\t\tconst { id } = await this.#resolveMarket(m);\n\t\t\treturn txOf(\n\t\t\t\tredeemSettled(this.#config, {\n\t\t\t\t\texpiryMarketId: id,\n\t\t\t\t\twrapperId: this.wrapperIdFor(owner),\n\t\t\t\t\torderId: opts.orderId,\n\t\t\t\t}),\n\t\t\t);\n\t\t},\n\n\t\t// --- delayed execution (DBU-885) ---\n\t\t// Each queued-order builder reads the market once and refuses, with a typed\n\t\t// PredictPreflightError, an order the queue or protocol gates would abort, so a refused order\n\t\t// never fails a larger transaction. The order's own limits at the current price are checked\n\t\t// only on chain. It returns the transaction and a display preview. Every builder throws\n\t\t// PredictInputError while the network's config doesn't record delayed execution.\n\n\t\t/**\n\t\t * Queue a mint of an exact payout quantity, filled at Pyth's price for its τ. Escrows\n\t\t * `min(maxCost, quantity, available − fee)` plus the order fee. `maxCost` and\n\t\t * `maxProbability` are required caps (see `queue.slippageBand`). Size against\n\t\t * `read.queue(...).maxMint`. The record ID is in the enqueue's `OrderEnqueued`\n\t\t * (`decode.enqueue`).\n\t\t */\n\t\tenqueueMint: async (\n\t\t\towner: string,\n\t\t\tm: MarketDescriptor,\n\t\t\topts: EnqueueMintOptions,\n\t\t): Promise<QueuedOrderPlan> => {\n\t\t\tconst quantityRaw = usdcToRaw(opts.quantity);\n\t\t\tthis.#assertLot(quantityRaw);\n\t\t\tconst maxCostRaw = usdcToRaw(opts.maxCost);\n\t\t\tconst maxProbabilityRaw = probabilityToRaw(opts.maxProbability);\n\t\t\treturn this.#planMint(\n\t\t\t\towner,\n\t\t\t\tm,\n\t\t\t\t{ kind: ORDER_KIND.EXACT_QUANTITY, maxCostRaw, quantityRaw },\n\t\t\t\t(orders, target) =>\n\t\t\t\t\tenqueueExactQuantity(orders, {\n\t\t\t\t\t\t...target,\n\t\t\t\t\t\tquantityRaw,\n\t\t\t\t\t\tmaxCostRaw,\n\t\t\t\t\t\tmaxProbabilityRaw,\n\t\t\t\t\t}),\n\t\t\t);\n\t\t},\n\n\t\t/**\n\t\t * Queue a premium-budget mint: sized at τ under `spend`, at least `minQuantity`, with the\n\t\t * all-in debit capped by the required `maxCost`.\n\t\t */\n\t\tenqueueMintAmount: async (\n\t\t\towner: string,\n\t\t\tm: MarketDescriptor,\n\t\t\topts: EnqueueMintAmountOptions,\n\t\t): Promise<QueuedOrderPlan> => {\n\t\t\tconst maxPremiumRaw = usdcToRaw(opts.spend);\n\t\t\tconst minQuantityRaw = usdcToRaw(opts.minQuantity);\n\t\t\tconst maxCostRaw = usdcToRaw(opts.maxCost);\n\t\t\t// The fill buys at most `spend` of premium, so a spend below the minimum premium fails\n\t\t\t// the chain's placement dry run whatever the budget. Refused before any read.\n\t\t\tif (maxPremiumRaw < MIN_PREMIUM) {\n\t\t\t\tthrow new PredictPreflightError(\n\t\t\t\t\t'min-premium',\n\t\t\t\t\t`spend ${rawToUsdc(maxPremiumRaw)} is below the ${rawToUsdc(MIN_PREMIUM)} minimum premium`,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn this.#planMint(\n\t\t\t\towner,\n\t\t\t\tm,\n\t\t\t\t{ kind: ORDER_KIND.EXACT_AMOUNT, maxCostRaw, maxPremiumRaw },\n\t\t\t\t(orders, target) =>\n\t\t\t\t\tenqueueExactAmount(orders, {\n\t\t\t\t\t\t...target,\n\t\t\t\t\t\tmaxPremiumRaw,\n\t\t\t\t\t\tminQuantityRaw,\n\t\t\t\t\t\tmaxCostRaw,\n\t\t\t\t\t}),\n\t\t\t);\n\t\t},\n\n\t\t/**\n\t\t * Queue an all-in-budget mint (the default mint): sized at τ so the all-in cost fits\n\t\t * `spend`, at least `minQuantity`. Escrows `min(spend, available − fee)` plus the order fee.\n\t\t */\n\t\tenqueueMintCost: async (\n\t\t\towner: string,\n\t\t\tm: MarketDescriptor,\n\t\t\topts: EnqueueMintCostOptions,\n\t\t): Promise<QueuedOrderPlan> => {\n\t\t\tconst maxCostRaw = usdcToRaw(opts.spend);\n\t\t\tconst minQuantityRaw = usdcToRaw(opts.minQuantity);\n\t\t\treturn this.#planMint(\n\t\t\t\towner,\n\t\t\t\tm,\n\t\t\t\t{ kind: ORDER_KIND.EXACT_COST, maxCostRaw },\n\t\t\t\t(orders, target) => enqueueExactCost(orders, { ...target, maxCostRaw, minQuantityRaw }),\n\t\t\t);\n\t\t},\n\n\t\t/**\n\t\t * Queue an early sell of an Open record (`enqueue_redeem_open`), the only early sell in v4.\n\t\t * The record must be Open and the owner's. Sells are never refused for market cash: when the\n\t\t * sell's cash need is above spare cash the preview sets `needsFunding`, and by default the\n\t\t * builder adds `rebalance_expiry_cash` after the enqueue (see `fundMarket`). A sell the market\n\t\t * still can't cover at the fill is refunded in full (reason 8) and the position returns to an\n\t\t * Open record.\n\t\t */\n\t\tenqueueSell: (\n\t\t\towner: string,\n\t\t\tm: MarketCoordinates,\n\t\t\topts: EnqueueSellOptions,\n\t\t): Promise<QueuedOrderPlan> => this.#planSell(owner, m, opts),\n\n\t\t/**\n\t\t * Queue the order a `read.planMint` or `read.planSell` plan describes, with its limits:\n\t\t * `enqueueMintCost`, `enqueueMint` or `enqueueSell`, by `plan.order.builder`. Pass the\n\t\t * market the plan was made for: the descriptor a mint plan was planned with, or the\n\t\t * coordinates `read.planSell` took for a sell plan. Throws the plan's `refusal` as a\n\t\t * `PredictPreflightError`, and `'fee'` when the balance now escrows less than the plan's\n\t\t * budget.\n\t\t */\n\t\tenqueuePlan: async <P extends MintPlan | SellPlan>(\n\t\t\towner: string,\n\t\t\tm: P extends SellPlan ? MarketCoordinates : MarketDescriptor,\n\t\t\tplan: P,\n\t\t): Promise<QueuedOrderPlan> => {\n\t\t\t// A plan that reported a refusal is refused the same way, so the two never disagree.\n\t\t\t// Plan again once the reason clears.\n\t\t\tif (plan.refusal != null) {\n\t\t\t\tthrow new PredictPreflightError(plan.refusal, `the plan was refused (${plan.refusal})`);\n\t\t\t}\n\t\t\t// A plan's limits fit one order. Queued for another owner, market, strike or record, they\n\t\t\t// would buy or sell a different contract, so plan that order instead.\n\t\t\tconst target = plan.target;\n\t\t\tconst { id, state: marketState } = await this.#resolveMarket(m);\n\t\t\tif (normalizeSuiAddress(owner) !== normalizeSuiAddress(target.owner)) {\n\t\t\t\tthrow new PredictInputError(`the plan was made for owner ${target.owner}, not ${owner}`);\n\t\t\t}\n\t\t\tif (normalizeSuiAddress(id) !== normalizeSuiAddress(target.expiryMarketId)) {\n\t\t\t\tthrow new PredictInputError(\n\t\t\t\t\t`the plan was made for market ${target.expiryMarketId}, not ${id}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst order = plan.order;\n\t\t\t// A mint needs the descriptor's strike and side. A plan typed only as\n\t\t\t// `MintPlan | SellPlan` can pass bare coordinates, so check.\n\t\t\tconst descriptor = 'side' in m ? (m as MarketDescriptor) : null;\n\t\t\tlet placed: QueuedOrderPlan;\n\t\t\tif (order.builder === 'enqueueSell') {\n\t\t\t\tif (order.options.recordId !== target.recordId) {\n\t\t\t\t\tthrow new PredictInputError(\n\t\t\t\t\t\t`the plan was made for record ${target.recordId}, not ${order.options.recordId}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tplaced = await this.tx.enqueueSell(owner, m, order.options);\n\t\t\t} else {\n\t\t\t\tif (descriptor == null) {\n\t\t\t\t\tthrow new PredictInputError(\n\t\t\t\t\t\t'a mint plan needs the market descriptor it was planned with (its strike and side)',\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst { lowerTick, higherTick } = await this.#strikeTicks(descriptor, id, marketState);\n\t\t\t\tif (lowerTick !== target.lowerTick || higherTick !== target.higherTick) {\n\t\t\t\t\tthrow new PredictInputError(\n\t\t\t\t\t\t'the market descriptor names a different strike or side than the plan, or its reference strike moved: plan again',\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tplaced =\n\t\t\t\t\torder.builder === 'enqueueMintCost'\n\t\t\t\t\t\t? await this.tx.enqueueMintCost(owner, descriptor, order.options)\n\t\t\t\t\t\t: await this.tx.enqueueMint(owner, descriptor, order.options);\n\t\t\t}\n\t\t\t// The plan's debit, and a sell's net, assume the order fee it was quoted with. The builders\n\t\t\t// read the desk's fee again, and no order argument bounds it on chain, so refuse a fee\n\t\t\t// that rose since the plan.\n\t\t\tif (placed.preview.raw.orderFee > plan.raw.orderFee) {\n\t\t\t\tthrow new PredictInputError(\n\t\t\t\t\t`the order fee rose from ${rawToUsdc(plan.raw.orderFee)} to ${placed.preview.orderFee} since the plan: plan again`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (order.builder === 'enqueueSell') return placed;\n\t\t\t// The limits assume the plan's whole budget. The builders escrow less when the balance\n\t\t\t// fell since the plan, so refuse that instead.\n\t\t\tconst planned = (plan as MintPlan).raw.budget;\n\t\t\tif (placed.preview.raw.budget < planned) {\n\t\t\t\tthrow new PredictPreflightError(\n\t\t\t\t\t'fee',\n\t\t\t\t\t`the balance now escrows ${placed.preview.budget}, below the plan's ${rawToUsdc(planned)}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn placed;\n\t\t},\n\n\t\t/**\n\t\t * Refund this market's orders past their deadline. For the app's \"Refund my order\" button\n\t\t * only (`OrderView.canRequestRefund`), never prepended to other transactions: keepers\n\t\t * refund on their own. Needs no account, session or Pyth key, and works during a freeze.\n\t\t * `maxOrders` (default 100) bounds the records visited.\n\t\t */\n\t\trefund: async (\n\t\t\tm: MarketCoordinates,\n\t\t\topts: { maxOrders?: number } = {},\n\t\t): Promise<Transaction> => {\n\t\t\tconst orders = this.#requireDelayedExecution();\n\t\t\tconst { id } = await this.#resolveMarket(m);\n\t\t\tconst queueId = await this.#existingQueueId(orders, id);\n\t\t\treturn txOf(\n\t\t\t\trefund(orders, {\n\t\t\t\t\texpiryMarketId: id,\n\t\t\t\t\tqueueId,\n\t\t\t\t\tmaxOrders: BigInt(opts.maxOrders ?? 100),\n\t\t\t\t}),\n\t\t\t);\n\t\t},\n\n\t\t/**\n\t\t * Send a finished record's parked funds to its receive address (`queue::claim_parked`): a\n\t\t * refund or change the address couldn't take while it was on USDC's deny list or USDC was\n\t\t * paused (`OrderView` `parkedRaw`). A skipped settlement payout isn't parked: pay it with\n\t\t * `payOpen`. Permissionless, and a no-op returning 0 while\n\t\t * the address is still denied. Needs no account, session or Pyth key.\n\t\t */\n\t\tclaimParked: async (m: MarketCoordinates, recordId: bigint): Promise<Transaction> => {\n\t\t\tconst orders = this.#requireDelayedExecution();\n\t\t\tconst { id } = await this.#resolveMarket(m);\n\t\t\tconst queueId = await this.#existingQueueId(orders, id);\n\t\t\treturn txOf(claimParked(orders, { expiryMarketId: id, queueId, recordId }));\n\t\t},\n\n\t\t/**\n\t\t * Pay a settled market's Open record that the payout walk skipped (`queue::pay_open`), for\n\t\t * example while its receive address was denied. Permissionless: the payout goes only to the\n\t\t * record's own receive address. Aborts `EMarketNotSettled` before settlement.\n\t\t */\n\t\tpayOpen: async (m: MarketCoordinates, recordId: bigint): Promise<Transaction> => {\n\t\t\tconst orders = this.#requireDelayedExecution();\n\t\t\tconst { id } = await this.#resolveMarket(m);\n\t\t\tconst queueId = await this.#existingQueueId(orders, id);\n\t\t\treturn txOf(payOpen(orders, { expiryMarketId: id, queueId, recordId }));\n\t\t},\n\n\t\t/**\n\t\t * The open filler: verify signed Pyth Lazer payloads, commit them to the market's waiting\n\t\t * cohorts, then resolve up to `maxOrders` (default 15) records. Reads the current Lazer\n\t\t * package from Lazer's `State` first (`lazerStateId`, or `config.oracle.pythLazerState`).\n\t\t */\n\t\tfill: async (\n\t\t\tm: MarketCoordinates,\n\t\t\topts: {\n\t\t\t\tpayloads: readonly Uint8Array[];\n\t\t\t\tmaxOrders?: number;\n\t\t\t\trefundOverdue?: boolean;\n\t\t\t\tlazerStateId?: string;\n\t\t\t},\n\t\t): Promise<Transaction> => {\n\t\t\tconst orders = this.#requireDelayedExecution();\n\t\t\tconst stateId = opts.lazerStateId ?? this.cfg.oracle?.pythLazerState;\n\t\t\tif (!stateId) {\n\t\t\t\tthrow new PredictInputError('fill needs the Pyth Lazer State: pass `lazerStateId`');\n\t\t\t}\n\t\t\tconst { id } = await this.#resolveMarket(m);\n\t\t\tconst queueId = await this.#existingQueueId(orders, id);\n\t\t\tconst lazer = await lazerPackages(this.#client, stateId);\n\t\t\treturn txOf(\n\t\t\t\tfill(orders, {\n\t\t\t\t\texpiryMarketId: id,\n\t\t\t\t\tqueueId,\n\t\t\t\t\tpayloads: opts.payloads,\n\t\t\t\t\tlazer,\n\t\t\t\t\tmaxOrders: BigInt(opts.maxOrders ?? 15),\n\t\t\t\t\trefundOverdue: opts.refundOverdue,\n\t\t\t\t}),\n\t\t\t);\n\t\t},\n\n\t\t// Queue a supply request pulling `amountUsdc` from the account's existing custody\n\t\t// balance. `request_supply` auto-settles USDC then `account.withdraw`s the payment\n\t\t// into queue escrow; the PLP fill is delivered at the next flush, not returned here.\n\t\t// Command order is auth → request (auth is a hot potato consumed by this call). The\n\t\t// `minPlpOut` slot is the per-request floor on PLP minted at flush — `options.minPlpOut`\n\t\t// when given, otherwise 0 (no floor). At the shipped attempt count of one, the first\n\t\t// flush whose mark quotes less cancels and refunds the request; three is the\n\t\t// configurable maximum, not the default.\n\t\tsupplyPlp: (\n\t\t\towner: string,\n\t\t\tamountUsdc: number | string,\n\t\t\toptions: PlpSupplyOptions = {},\n\t\t): Transaction =>\n\t\t\ttxOf(\n\t\t\t\trequestSupply({\n\t\t\t\t\tconfig: this.#config,\n\t\t\t\t\targuments: {\n\t\t\t\t\t\twrapper: this.wrapperIdFor(owner),\n\t\t\t\t\t\tamount: usdcToRaw(amountUsdc),\n\t\t\t\t\t\tminPlpOut: options.minPlpOut ?? 0n,\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t),\n\n\t\t// Queue a withdraw request pulling `shares` (raw PLP u64) from account custody into\n\t\t// queue escrow — the Move parameter is named `amount`, but on `request_withdraw` it\n\t\t// counts PLP SHARES, not USDC. Auto-settles flush-delivered PLP first; the USDC\n\t\t// fill lands on the account at the next flush (no `withdraw_settled` entrypoint).\n\t\t// Command order is auth → request. The `minUsdcOut` slot is the per-request floor\n\t\t// on USDC paid at flush — `options.minUsdcOut` when given, otherwise 0 (no floor).\n\t\t// At the shipped attempt count of one, the first flush whose mark quotes less\n\t\t// cancels and refunds the request; three is the configurable maximum, not the\n\t\t// default.\n\t\twithdrawPlp: (owner: string, shares: bigint, options: PlpWithdrawOptions = {}): Transaction =>\n\t\t\ttxOf(\n\t\t\t\trequestWithdraw({\n\t\t\t\t\tconfig: this.#config,\n\t\t\t\t\targuments: {\n\t\t\t\t\t\twrapper: this.wrapperIdFor(owner),\n\t\t\t\t\t\tamount: shares,\n\t\t\t\t\t\tminUsdcOut: options.minUsdcOut === undefined ? 0n : usdcToRaw(options.minUsdcOut),\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t),\n\n\t\t// Cancel a still-pending supply request by queue `index`, refunding its escrowed\n\t\t// USDC straight back into the requesting account. Command order is auth → cancel.\n\t\tcancelSupplyPlp: (owner: string, index: bigint): Transaction =>\n\t\t\ttxOf(\n\t\t\t\tcancelSupplyRequest({\n\t\t\t\t\tconfig: this.#config,\n\t\t\t\t\targuments: { wrapper: this.wrapperIdFor(owner), index },\n\t\t\t\t}),\n\t\t\t),\n\n\t\t// Cancel a still-pending withdraw request by queue `index`, refunding its escrowed\n\t\t// PLP straight back into the requesting account. Command order is auth → cancel.\n\t\tcancelWithdrawPlp: (owner: string, index: bigint): Transaction =>\n\t\t\ttxOf(\n\t\t\t\tcancelWithdrawRequest({\n\t\t\t\t\tconfig: this.#config,\n\t\t\t\t\targuments: { wrapper: this.wrapperIdFor(owner), index },\n\t\t\t\t}),\n\t\t\t),\n\n\t\t// Set the account's sticky builder-code attribution to `builderCodeId`, an existing\n\t\t// `BuilderCode` object borrowed as `&BuilderCode`. Command order is auth → set (auth\n\t\t// is a hot potato consumed by this call). Lives in the PREDICT package's\n\t\t// `predict_account` module, NOT the account package. Deployed sig\n\t\t// `packages/predict/sources/predict_account.move:134` — 3 moveCall args\n\t\t// (wrapper, auth, code; ctx implicit).\n\t\tsetBuilderCode: (owner: string, builderCodeId: string): Transaction =>\n\t\t\ttxOf(\n\t\t\t\tsetBuilderCode({\n\t\t\t\t\tconfig: this.#config,\n\t\t\t\t\targuments: { wrapper: this.wrapperIdFor(owner), code: builderCodeId },\n\t\t\t\t}),\n\t\t\t),\n\n\t\t// Clear the account's sticky builder-code attribution. Command order is auth → unset.\n\t\t// Deployed sig `.../predict_account.move:151` — 2 moveCall args (wrapper, auth; ctx\n\t\t// implicit).\n\t\tunsetBuilderCode: (owner: string): Transaction =>\n\t\t\ttxOf(\n\t\t\t\tunsetBuilderCode({\n\t\t\t\t\tconfig: this.#config,\n\t\t\t\t\targuments: { wrapper: this.wrapperIdFor(owner) },\n\t\t\t\t}),\n\t\t\t),\n\t};\n\n\t// === reads ===\n\treadonly read = {\n\t\t// All tradeable (active) markets with the state a frontend needs to render\n\t\t// and mint: one chain read for ids + one batched PTB for the states.\n\t\tmarkets: async (): Promise<ActiveMarket[]> => {\n\t\t\tconst ids = await activeMarketIds(this.#client, this.#config);\n\t\t\tconst states = await marketStates(this.#client, this.#config, ids);\n\t\t\treturn ids.map((id, i) => ({\n\t\t\t\tid,\n\t\t\t\texpiryMs: states[i].expiryMs,\n\t\t\t\ttickSize: fromRaw(states[i].tickSizeRaw, 9),\n\t\t\t\tadmissionTickSize: fromRaw(states[i].admissionTickSizeRaw, 9),\n\t\t\t\tmintPaused: states[i].mintPaused,\n\t\t\t\treferencePrice: PredictClient.#referencePriceOf(states[i]),\n\t\t\t}));\n\t\t},\n\n\t\t// Validate an app-stored order id against the chain (stale after full\n\t\t// close or partial-close replacement — see RedeemReceipt.replacementOrderId).\n\t\thasPosition: (owner: string, marketId: string, orderId: bigint): Promise<boolean> =>\n\t\t\thasPosition(this.#client, this.#config, owner, marketId, orderId),\n\n\t\t// All open positions for an owner, enumerated from the chain (the\n\t\t// account's positions Table): 1 call per page warm, +2 resolution calls\n\t\t// once per owner. Returns [] for owners with no Predict account.\n\t\tpositions: async (owner: string): Promise<OpenPosition[]> => {\n\t\t\tlet handle = this.#positionsCache.get(owner);\n\t\t\tif (!handle?.positionsTableId) {\n\t\t\t\tconst resolved = await resolvePositionsTable(this.#client, this.#config, owner);\n\t\t\t\tif (!resolved) return []; // never onboarded — do not cache\n\t\t\t\tif (resolved.positionsTableId) this.#positionsCache.set(owner, resolved);\n\t\t\t\thandle = resolved;\n\t\t\t}\n\t\t\tif (!handle.positionsTableId) return [];\n\t\t\treturn positionsFromTable(this.#client, handle.positionsTableId);\n\t\t},\n\n\t\t// Anonymous board pricing: the chain's probability for both sides of a\n\t\t// strike, from one fresh pricer (no account needed). This is the ↑/↓\n\t\t// button price before a user has onboarded.\n\t\tprice: async (m: BinaryMarketCoordinates): Promise<{ up: number; down: number }> => {\n\t\t\tconst feeds = this.#feeds(m.underlying);\n\t\t\tconst { id, state } = await this.#resolveMarket(m);\n\t\t\tconst strikeRaw = await this.#strikeRawFor(m, id, state);\n\t\t\tconst { upRaw, downRaw } = await rangePrices(\n\t\t\t\tthis.#client,\n\t\t\t\tthis.#config,\n\t\t\t\tid,\n\t\t\t\tfeeds,\n\t\t\t\tstrikeRaw,\n\t\t\t\tstate.tickSizeRaw,\n\t\t\t);\n\t\t\treturn { up: rawToProbability(upRaw), down: rawToProbability(downRaw) };\n\t\t},\n\n\t\t// A client-side board pricer for one market: ONE simulate reads the chain's\n\t\t// resolved pricer (already forward-selected + rolled to now), then prices every\n\t\t// strike LOCALLY with no further chain calls — `pricer.up(strike)`,\n\t\t// `.down(strike)`, `.range(lo,hi)`, `.strikeAtProbability(p)`. Use this to paint a\n\t\t// whole board instantly; `read.price` / `read.quoteMint` stay the authoritative\n\t\t// per-strike quote at trade time. Throws the same typed stale-oracle/expired\n\t\t// PredictMoveError `read.price` would when the chain itself cannot quote.\n\t\tpricer: async (\n\t\t\tm: Pick<MarketDescriptor, 'underlying' | 'expiryMs'>,\n\t\t): Promise<BoardPricer & { asOf: PricerSnapshot['sources'] }> => {\n\t\t\tconst feeds = this.#feeds(m.underlying);\n\t\t\tconst { id } = await this.#resolveMarket(m);\n\t\t\tconst snap = await readPricerSnapshot(this.#client, this.#config, id, feeds);\n\t\t\treturn { ...boardPricer(snap), asOf: snap.sources };\n\t\t},\n\n\t\t/**\n\t\t * Exact pre-trade quote for an exact-quantity mint. Requires a funded account.\n\t\t *\n\t\t * Where the config records the delayed-execution upgrade (`packages.predictDelayedExecution`),\n\t\t * this reads Predict's own `quote_mint_for_account` (the immediate mint is retired there) and\n\t\t * the order desk's fee, and previews a QUEUED fill at the clock: `queued: true`, no\n\t\t * congestion penalty in `cost`, and the order fee in `orderFee`. The fill itself prices at\n\t\t * its committed Pyth tick. It throws `PredictInputError` when that config lacks the\n\t\t * order-flow package or its desk. Elsewhere it dry-runs the immediate mint and decodes its\n\t\t * receipt, as before.\n\t\t */\n\t\tquoteMint: async (\n\t\t\towner: string,\n\t\t\tm: MarketDescriptor,\n\t\t\topts: Pick<MintOptions, 'quantity'>,\n\t\t): Promise<MintQuote> => {\n\t\t\tif (this.cfg.packages.predictDelayedExecution) {\n\t\t\t\tconst orders = this.#requireDelayedExecution();\n\t\t\t\tconst feeds = this.#feeds(m.underlying);\n\t\t\t\tconst { id, state } = await this.#resolveMarket(m);\n\t\t\t\tconst quantityRaw = usdcToRaw(opts.quantity);\n\t\t\t\tthis.#assertLot(quantityRaw);\n\t\t\t\tconst { lowerTick, higherTick } = await this.#strikeTicks(m, id, state);\n\t\t\t\tconst { quote, policy } = await quoteMintForAccount(this.#client, this.#config, {\n\t\t\t\t\texpiryMarketId: id,\n\t\t\t\t\twrapperId: this.wrapperIdFor(owner),\n\t\t\t\t\tlowerTick,\n\t\t\t\t\thigherTick,\n\t\t\t\t\trequest: { shape: 'exact-quantity', quantityRaw },\n\t\t\t\t\tordersConfig: orders,\n\t\t\t\t\t...feeds,\n\t\t\t\t});\n\t\t\t\treturn PredictClient.#queuedMintQuote(quote, policy);\n\t\t\t}\n\t\t\tconst tx = await this.#buildMint(owner, m, opts);\n\t\t\treturn this.#quoteMintTransaction(owner, tx);\n\t\t},\n\n\t\t/**\n\t\t * Quote the all-in budget mint against current account and market state. Where the config\n\t\t * records the delayed-execution upgrade, it reads `quote_mint_exact_cost_for_account` at\n\t\t * `min(spend, available − fee)`, the budget enqueue escrows, and previews a queued fill as\n\t\t * `quoteMint` does (and throws as it does on a partial config). Elsewhere it simulates the\n\t\t * immediate v2 mint.\n\t\t */\n\t\tquoteMintCost: async (\n\t\t\towner: string,\n\t\t\tm: MarketDescriptor,\n\t\t\topts: MintCostOptions,\n\t\t): Promise<MintQuote> => {\n\t\t\tif (this.cfg.packages.predictDelayedExecution) {\n\t\t\t\tconst orders = this.#requireDelayedExecution();\n\t\t\t\tconst feeds = this.#feeds(m.underlying);\n\t\t\t\tconst { id, state } = await this.#resolveMarket(m);\n\t\t\t\tconst { lowerTick, higherTick } = await this.#strikeTicks(m, id, state);\n\t\t\t\tconst { policy, availableRaw } = await orderFeeAndBalance(\n\t\t\t\t\tthis.#client,\n\t\t\t\t\torders,\n\t\t\t\t\towner,\n\t\t\t\t\tthis.cfg.quoteCoinType,\n\t\t\t\t);\n\t\t\t\tconst fee = policy.orderFee;\n\t\t\t\tconst spendRaw = usdcToRaw(opts.spend);\n\t\t\t\tconst escrowable = availableRaw > fee ? availableRaw - fee : 0n;\n\t\t\t\tconst { quote } = await quoteMintForAccount(this.#client, this.#config, {\n\t\t\t\t\texpiryMarketId: id,\n\t\t\t\t\twrapperId: this.wrapperIdFor(owner),\n\t\t\t\t\tlowerTick,\n\t\t\t\t\thigherTick,\n\t\t\t\t\trequest: {\n\t\t\t\t\t\tshape: 'exact-cost',\n\t\t\t\t\t\tmaxCostRaw: spendRaw < escrowable ? spendRaw : escrowable,\n\t\t\t\t\t\tminQuantityRaw: usdcToRaw(opts.minQuantity),\n\t\t\t\t\t},\n\t\t\t\t\t...feeds,\n\t\t\t\t});\n\t\t\t\treturn PredictClient.#queuedMintQuote(quote, policy);\n\t\t\t}\n\t\t\treturn this.#quoteMintTransaction(owner, await this.#buildMintCost(owner, m, opts));\n\t\t},\n\n\t\t/**\n\t\t * Quote an early sell of an Open record (the queue's `quote_redeem_open`) at a fresh live\n\t\t * pricer. `proceeds` is before the order fee, with no congestion penalty, and `net` takes the\n\t\t * fee off. Throws `ERecordNotOpen` when the record isn't Open.\n\t\t */\n\t\tquoteSell: async (\n\t\t\towner: string,\n\t\t\tm: MarketCoordinates,\n\t\t\topts: { recordId: bigint; quantity: number },\n\t\t): Promise<SellQuote> => {\n\t\t\tconst orders = this.#requireDelayedExecution();\n\t\t\tconst feeds = this.#feeds(m.underlying);\n\t\t\tconst { id } = await this.#resolveMarket(m);\n\t\t\tconst closeQuantityRaw = usdcToRaw(opts.quantity);\n\t\t\tthis.#assertLot(closeQuantityRaw);\n\t\t\tconst queueId = await this.#existingQueueId(orders, id);\n\t\t\tconst { quote, policy } = await quoteRedeemOpen(this.#client, orders, {\n\t\t\t\texpiryMarketId: id,\n\t\t\t\tqueueId,\n\t\t\t\twrapperId: this.wrapperIdFor(owner),\n\t\t\t\trecordId: opts.recordId,\n\t\t\t\tcloseQuantityRaw,\n\t\t\t\t...feeds,\n\t\t\t});\n\t\t\tconst orderFee = policy.orderFee;\n\t\t\treturn {\n\t\t\t\tprobability: rawToProbability(quote.probability),\n\t\t\t\tproceeds: rawToUsdc(quote.proceeds),\n\t\t\t\tnet: rawToUsdc(quote.proceeds - orderFee),\n\t\t\t\tfees: {\n\t\t\t\t\ttrading: rawToUsdc(quote.tradingFee),\n\t\t\t\t\tbuilder: rawToUsdc(quote.builderFee),\n\t\t\t\t\tinventoryImpactRebate: rawToUsdc(quote.inventoryImpactRebate),\n\t\t\t\t\torder: rawToUsdc(orderFee),\n\t\t\t\t},\n\t\t\t\tquantityClosed: rawToUsdc(quote.closeQuantity),\n\t\t\t\traw: {\n\t\t\t\t\tprobability: quote.probability,\n\t\t\t\t\tproceeds: quote.proceeds,\n\t\t\t\t\torderFee,\n\t\t\t\t\tquantityClosed: quote.closeQuantity,\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\n\t\t/**\n\t\t * Which trade path the network is on, from `ProtocolConfig.version_watermark` and whether\n\t\t * this config records delayed execution (the Predict upgrade, the order-flow companion and\n\t\t * its desk). Flip the app between `mint*` and `enqueue*` on it, without a redeploy at the\n\t\t * watermark bump.\n\t\t */\n\t\texecutionMode: async (): Promise<ExecutionMode> =>\n\t\t\texecutionModeFor(\n\t\t\t\tawait versionWatermark(this.#client, this.cfg.objects.protocolConfig),\n\t\t\t\tthis.#recordsDelayedExecution(),\n\t\t\t\tthis.cfg.packages.predictDelayedExecution != null,\n\t\t\t),\n\n\t\t/**\n\t\t * A market's queue in one read: cash, the stuck gate (\"pricing delayed\"), cohorts, counters\n\t\t * against capacity, the desk's policy, a τ/deadline/cutoff preview, and the largest mint\n\t\t * spare cash admits now. With `owner` (who must have an account), also the account's\n\t\t * waiting orders and balance. Throws `PredictPreflightError` `'no-queue'` while the market\n\t\t * has no `MarketQueue`.\n\t\t */\n\t\tqueue: async (m: MarketCoordinates, owner?: string): Promise<MarketQueueView> => {\n\t\t\tconst orders = this.#requireDelayedExecution();\n\t\t\tconst { id } = await this.#resolveMarket(m);\n\t\t\tconst state = await this.#queueState(orders, id, { owner });\n\t\t\tconst nowMs = BigInt(Date.now());\n\t\t\tconst policy = state.desk.policy;\n\t\t\tconst mode = executionModeFor(state.protocol.versionWatermark, true);\n\t\t\tconst timing = previewTiming({\n\t\t\t\tnowMs,\n\t\t\t\tpolicy,\n\t\t\t\theads: state.heads,\n\t\t\t\texpiryMs: state.expiryMs,\n\t\t\t\tnoTradeWindowMs: state.protocol.noTradeWindowMs,\n\t\t\t});\n\t\t\t// The builders' own gate, so the flags can never disagree with their preflight.\n\t\t\tconst refusalFor = (side: 'mint' | 'sell'): PredictPreflightCode | null => {\n\t\t\t\ttry {\n\t\t\t\t\tthis.#assertQueueOpen(state, side, nowMs);\n\t\t\t\t\treturn null;\n\t\t\t\t} catch (e) {\n\t\t\t\t\tif (e instanceof PredictPreflightError) return e.code;\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t};\n\t\t\tconst refusal = { mint: refusalFor('mint'), sell: refusalFor('sell') };\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tmode,\n\t\t\t\ttiming,\n\t\t\t\tacceptingMints: refusal.mint == null,\n\t\t\t\tacceptingSells: refusal.sell == null,\n\t\t\t\trefusal,\n\t\t\t\tmaxMint: {\n\t\t\t\t\texactQuantity: maxMintNow({\n\t\t\t\t\t\tshape: 'exact-quantity',\n\t\t\t\t\t\tspareCashRaw: state.spareCash,\n\t\t\t\t\t\tminEntryProbability: state.minEntryProbability,\n\t\t\t\t\t\tlotSize: BigInt(this.cfg.units.positionLotSize),\n\t\t\t\t\t\tasOfMs: nowMs,\n\t\t\t\t\t}),\n\t\t\t\t\tbudget: maxMintNow({\n\t\t\t\t\t\tshape: 'budget',\n\t\t\t\t\t\tspareCashRaw: state.spareCash,\n\t\t\t\t\t\tminEntryProbability: state.minEntryProbability,\n\t\t\t\t\t\tavailableRaw: state.account?.availableRaw,\n\t\t\t\t\t\torderFeeRaw: policy.orderFee,\n\t\t\t\t\t\tasOfMs: nowMs,\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\n\t\t/**\n\t\t * Plan a queued mint for a purchase form: the quote at the current price, the payout and\n\t\t * multiple, the order fee read from the desk, the escrow and debit, the balance, the most\n\t\t * the market takes now, the timing and the queue gates, plus the enqueue options that carry\n\t\t * the slippage. `amount` plans an all-in spend (`enqueueMintCost`, refunded below the payout\n\t\t * floor), and `quantity` an exact payout (`enqueueMint`, capped by probability and cost).\n\t\t * Works for a visitor without an account: the quote then comes from `quote_mint`.\n\t\t *\n\t\t * `slippageCents` is cents per contract, never a percentage: a 10¢ limit fills while the\n\t\t * all-in price per contract stays within 10¢ of the quote's price without its fee subsidy.\n\t\t */\n\t\tplanMint: async (\n\t\t\towner: string,\n\t\t\tm: MarketDescriptor,\n\t\t\topts: PlanMintOptions,\n\t\t): Promise<MintPlan> => {\n\t\t\tconst orders = this.#requireDelayedExecution();\n\t\t\tconst feeds = this.#feeds(m.underlying);\n\t\t\tconst { id, state: market } = await this.#resolveMarket(m);\n\t\t\tconst { lowerTick, higherTick } = await this.#strikeTicks(m, id, market);\n\t\t\tconst hasAccount = await this.#hasAccount(owner);\n\t\t\tconst state = await this.#queueState(orders, id, hasAccount ? { owner } : {});\n\t\t\tconst nowMs = BigInt(Date.now());\n\t\t\tconst policy = state.desk.policy;\n\t\t\tconst fee = policy.orderFee;\n\t\t\tconst availableRaw = state.account?.availableRaw ?? null;\n\t\t\tconst lot = BigInt(this.cfg.units.positionLotSize);\n\t\t\tconst ticks = { expiryMarketId: id, lowerTick, higherTick, ...feeds };\n\t\t\tconst forAccount = (request: MintQuoteRequest) =>\n\t\t\t\tquoteMintForAccount(this.#client, this.#config, {\n\t\t\t\t\t...ticks,\n\t\t\t\t\twrapperId: this.wrapperIdFor(owner),\n\t\t\t\t\trequest,\n\t\t\t\t}).then((r) => r.quote);\n\n\t\t\tlet quote: MintQuoteRaw;\n\t\t\tlet quoteForAccount: boolean;\n\t\t\tlet budgetRequested: bigint | null = null;\n\t\t\tif ('amount' in opts) {\n\t\t\t\tconst amountRaw = usdcToRaw(opts.amount);\n\t\t\t\tbudgetRequested =\n\t\t\t\t\t(opts.orderFee ?? 'inclusive') === 'inclusive'\n\t\t\t\t\t\t? amountRaw > fee\n\t\t\t\t\t\t\t? amountRaw - fee\n\t\t\t\t\t\t\t: 0n\n\t\t\t\t\t\t: amountRaw;\n\t\t\t\t// No budget below the minimum premium can be admitted, and the account's quote\n\t\t\t\t// aborts `EOrderFailsLimits` on one, so refuse it as a visitor's search does. An\n\t\t\t\t// amount the order fee takes whole buys nothing either.\n\t\t\t\tif (budgetRequested === 0n) {\n\t\t\t\t\tthrow new PredictPreflightError(\n\t\t\t\t\t\t'min-premium',\n\t\t\t\t\t\t`${opts.amount} doesn't cover the ${rawToUsdc(fee)} order fee, so it buys no premium`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (budgetRequested < MIN_PREMIUM) {\n\t\t\t\t\tthrow new PredictPreflightError(\n\t\t\t\t\t\t'min-premium',\n\t\t\t\t\t\t`a budget of ${rawToUsdc(budgetRequested)} is below the minimum premium (a mint's premium must be at least ${rawToUsdc(MIN_PREMIUM)} USDC)`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\t// The account's own quote caps the budget at its balance, so it only previews an\n\t\t\t\t// order the balance covers.\n\t\t\t\tquoteForAccount =\n\t\t\t\t\tavailableRaw != null && availableRaw > fee && availableRaw - fee >= budgetRequested;\n\t\t\t\tconst budget = budgetRequested;\n\t\t\t\tconst search = () =>\n\t\t\t\t\tthis.#searchBudgetQuote(ticks, budget, lot).catch(async (error: unknown) => {\n\t\t\t\t\t\t// Every probe refused ends the search in 'min-premium', which a strike outside\n\t\t\t\t\t\t// the entry band also explains.\n\t\t\t\t\t\tif (error instanceof PredictPreflightError && error.code === 'min-premium') {\n\t\t\t\t\t\t\tthrow (await this.#entryBandRefusal(m)) ?? error;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthrow await this.#quoteRefusal(error, { m });\n\t\t\t\t\t});\n\t\t\t\tif (quoteForAccount) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tquote = await forAccount({\n\t\t\t\t\t\t\tshape: 'exact-cost',\n\t\t\t\t\t\t\tmaxCostRaw: budget,\n\t\t\t\t\t\t\tminQuantityRaw: 0n,\n\t\t\t\t\t\t});\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tif (!isOrderFailsLimits(error)) throw await this.#quoteRefusal(error);\n\t\t\t\t\t\t// The chain refused the budget at the account's own pricing, its builder fee\n\t\t\t\t\t\t// included. The account-free search only diagnoses the refusal: a strike outside\n\t\t\t\t\t\t// the entry band, or a budget too small for the minimum premium, throws its typed\n\t\t\t\t\t\t// refusal. It leaves the builder fee out, so a budget only it can size is never\n\t\t\t\t\t\t// planned, and keeps the chain's own error. (Near $1 a contract, admission's\n\t\t\t\t\t\t// payout-bound step-down isn't monotone, so a slightly smaller budget can pass\n\t\t\t\t\t\t// where this one is refused. That is a false refusal, never a bad order.)\n\t\t\t\t\t\tawait search();\n\t\t\t\t\t\tthrow error;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tquote = await search();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst quantityRaw = usdcToRaw(opts.quantity);\n\t\t\t\tthis.#assertLot(quantityRaw);\n\t\t\t\tquoteForAccount = hasAccount;\n\t\t\t\ttry {\n\t\t\t\t\tquote = hasAccount\n\t\t\t\t\t\t? await forAccount({ shape: 'exact-quantity', quantityRaw })\n\t\t\t\t\t\t: (\n\t\t\t\t\t\t\t\tawait quoteMintAnonymous(this.#client, this.#config, {\n\t\t\t\t\t\t\t\t\t...ticks,\n\t\t\t\t\t\t\t\t\trequest: { shape: 'exact-quantity', quantityRaw },\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t).quote;\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthrow await this.#quoteRefusal(error, { m, quantityRaw });\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// The expected cost, after the fee subsidy. The limits add the subsidy back, because\n\t\t\t// admission checks the order without it (`EOrderFailsLimits`).\n\t\t\tconst costRaw = quote.allInCost - quote.penaltyFee;\n\t\t\tconst slippage = PredictClient.#appliedSlippage(opts, quote.entryProbability, state, nowMs);\n\t\t\tconst limitsIn = {\n\t\t\t\tquoteCostRaw: costRaw,\n\t\t\t\tquoteQuantityRaw: quote.quantity,\n\t\t\t\tentryProbabilityRaw: quote.entryProbability,\n\t\t\t\tslippageRaw: slippage.raw,\n\t\t\t\tfeeIncentiveSubsidyRaw: quote.feeIncentiveSubsidy,\n\t\t\t\tlotSize: lot,\n\t\t\t};\n\t\t\tlet budgetRaw: bigint;\n\t\t\tlet minQuantityRaw: bigint;\n\t\t\t// What admission buys at least, for a budget plan, or why it buys nothing the plan can\n\t\t\t// preview.\n\t\t\tlet admitted:\n\t\t\t\t| { quantity: bigint }\n\t\t\t\t| { refusal: 'min-premium' | 'cost-above-payout' | 'entry-band' }\n\t\t\t\t| null = null;\n\t\t\tlet maxCostRaw: bigint | null = null;\n\t\t\tlet maxProbabilityRaw: bigint | null = null;\n\t\t\tlet price: { nowRaw: bigint; worstRaw: bigint };\n\t\t\tlet order: MintPlan['order'];\n\t\t\tif (budgetRequested != null) {\n\t\t\t\tconst limits = budgetMintLimits({ ...limitsIn, budgetRaw: budgetRequested });\n\t\t\t\tbudgetRaw = budgetRequested;\n\t\t\t\t// Admission sizes the fill without the subsidy by Move's exact arithmetic, whose\n\t\t\t\t// per-component rounding (inventory impact included) an average price can't bound.\n\t\t\t\t// So the floor's ceiling is checked with exact quotes. It also never exceeds the\n\t\t\t\t// quote's own quantity, since a searched quote can leave part of the budget unspent.\n\t\t\t\t// The first probe divides the budget by the quote's unsubsidized price, with no rounding\n\t\t\t\t// allowance, so a minimum-sized purchase isn't probed one lot short.\n\t\t\t\tconst unsubsidizedCost = costRaw + quote.feeIncentiveSubsidy;\n\t\t\t\tconst start =\n\t\t\t\t\tunsubsidizedCost === 0n\n\t\t\t\t\t\t? quote.quantity\n\t\t\t\t\t\t: ((budgetRaw * quote.quantity) / unsubsidizedCost / lot) * lot;\n\t\t\t\tadmitted = await this.#admittedFloor(\n\t\t\t\t\t(quantityRaw) =>\n\t\t\t\t\t\tquoteForAccount\n\t\t\t\t\t\t\t? forAccount({ shape: 'exact-quantity', quantityRaw })\n\t\t\t\t\t\t\t: quoteMintAnonymous(this.#client, this.#config, {\n\t\t\t\t\t\t\t\t\t...ticks,\n\t\t\t\t\t\t\t\t\trequest: { shape: 'exact-quantity', quantityRaw },\n\t\t\t\t\t\t\t\t}).then((r) => r.quote),\n\t\t\t\t\tbudgetRaw,\n\t\t\t\t\tstart < quote.quantity ? start : quote.quantity,\n\t\t\t\t\tlot,\n\t\t\t\t\tquote.entryProbability,\n\t\t\t\t\tquote.quantity === 0n ? 0n : (unsubsidizedCost * 1_000_000_000n) / quote.quantity,\n\t\t\t\t);\n\t\t\t\tconst ceiling = 'quantity' in admitted ? admitted.quantity : 0n;\n\t\t\t\tminQuantityRaw = limits.minQuantityRaw < ceiling ? limits.minQuantityRaw : ceiling;\n\t\t\t\tprice = limits.pricePerContract;\n\t\t\t\torder = {\n\t\t\t\t\tbuilder: 'enqueueMintCost',\n\t\t\t\t\toptions: { spend: rawToUsdc(budgetRaw), minQuantity: rawToUsdc(minQuantityRaw) },\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tconst limits = exactMintLimits(limitsIn);\n\t\t\t\tmaxCostRaw = limits.maxCostRaw;\n\t\t\t\tmaxProbabilityRaw = limits.maxProbabilityRaw;\n\t\t\t\t// Enqueue escrows `min(max_cost, quantity, available − fee)`.\n\t\t\t\tbudgetRaw = maxCostRaw < quote.quantity ? maxCostRaw : quote.quantity;\n\t\t\t\tminQuantityRaw = quote.quantity;\n\t\t\t\tprice = limits.pricePerContract;\n\t\t\t\torder = {\n\t\t\t\t\tbuilder: 'enqueueMint',\n\t\t\t\t\toptions: {\n\t\t\t\t\t\tquantity: rawToUsdc(quote.quantity),\n\t\t\t\t\t\tmaxCost: rawToUsdc(maxCostRaw),\n\t\t\t\t\t\tmaxProbability: rawToProbability(maxProbabilityRaw),\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst totalDebitRaw = budgetRaw + fee;\n\t\t\tconst expectedDebitRaw = costRaw + fee;\n\t\t\tconst inclusive = 'amount' in opts && (opts.orderFee ?? 'inclusive') === 'inclusive';\n\t\t\t// The builder's own preflight on the plan's order, plus what only the quote shows: the\n\t\t\t// balance against the whole debit the limits assume, the payout bound, and the premium a\n\t\t\t// budget buys at admission, which prices without the fee subsidy.\n\t\t\tconst refusal = PredictClient.#refusal(() => {\n\t\t\t\tthis.#assertQueueOpen(state, 'mint', nowMs);\n\t\t\t\tif (availableRaw == null || availableRaw < totalDebitRaw) {\n\t\t\t\t\tthrow new PredictPreflightError(\n\t\t\t\t\t\t'fee',\n\t\t\t\t\t\t`the balance doesn't cover the plan's ${rawToUsdc(totalDebitRaw)} debit`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tPredictClient.#assertMintOrder(\n\t\t\t\t\tstate,\n\t\t\t\t\tpolicy,\n\t\t\t\t\tbudgetRequested != null\n\t\t\t\t\t\t? { kind: ORDER_KIND.EXACT_COST, maxCostRaw: budgetRaw }\n\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\tkind: ORDER_KIND.EXACT_QUANTITY,\n\t\t\t\t\t\t\t\tmaxCostRaw: maxCostRaw ?? budgetRaw,\n\t\t\t\t\t\t\t\tquantityRaw: quote.quantity,\n\t\t\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tif (costRaw + quote.feeIncentiveSubsidy > quote.quantity) {\n\t\t\t\t\tthrow new PredictPreflightError(\n\t\t\t\t\t\t'cost-above-payout',\n\t\t\t\t\t\t'the all-in cost without the fee subsidy is above the payout',\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (admitted != null && 'refusal' in admitted) {\n\t\t\t\t\tthrow new PredictPreflightError(\n\t\t\t\t\t\tadmitted.refusal,\n\t\t\t\t\t\tadmitted.refusal === 'min-premium'\n\t\t\t\t\t\t\t? `without the fee subsidy, ${rawToUsdc(budgetRaw)} buys no fill that clears the ${rawToUsdc(MIN_PREMIUM)} minimum premium`\n\t\t\t\t\t\t\t: admitted.refusal === 'entry-band'\n\t\t\t\t\t\t\t\t? \"the entry probability left the market's entry band while the order was sized: plan again, or pick a strike nearer the money\"\n\t\t\t\t\t\t\t\t: `without the fee subsidy, ${rawToUsdc(budgetRaw)} buys a fill near $1 a contract, whose admission sizing can't be previewed`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\t\t\tconst cashOrBudgetMax = maxMintNow(\n\t\t\t\tbudgetRequested != null\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tshape: 'budget',\n\t\t\t\t\t\t\tspareCashRaw: state.spareCash,\n\t\t\t\t\t\t\tminEntryProbability: state.minEntryProbability,\n\t\t\t\t\t\t\tavailableRaw: availableRaw ?? undefined,\n\t\t\t\t\t\t\torderFeeRaw: fee,\n\t\t\t\t\t\t\tasOfMs: nowMs,\n\t\t\t\t\t\t}\n\t\t\t\t\t: {\n\t\t\t\t\t\t\tshape: 'exact-quantity',\n\t\t\t\t\t\t\tspareCashRaw: state.spareCash,\n\t\t\t\t\t\t\tminEntryProbability: state.minEntryProbability,\n\t\t\t\t\t\t\tlotSize: lot,\n\t\t\t\t\t\t\tasOfMs: nowMs,\n\t\t\t\t\t\t},\n\t\t\t).maxRaw;\n\t\t\t// `maxMintNow` bounds an exact quantity by spare cash only. Enqueue escrows the quantity\n\t\t\t// at the plan's worst price per contract, capped at the $1 payout, so the balance bounds\n\t\t\t// it too.\n\t\t\tlet max = cashOrBudgetMax;\n\t\t\tif (budgetRequested == null && availableRaw != null && price.worstRaw > 0n) {\n\t\t\t\tconst spendable = availableRaw > fee ? availableRaw - fee : 0n;\n\t\t\t\tconst perContract = price.worstRaw < 1_000_000_000n ? price.worstRaw : 1_000_000_000n;\n\t\t\t\tconst byBalance = ((spendable * 1_000_000_000n) / perContract / lot) * lot;\n\t\t\t\tif (max == null || byBalance < max) max = byBalance;\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tshape: budgetRequested != null ? 'budget' : 'exact-quantity',\n\t\t\t\ttarget: { owner: normalizeSuiAddress(owner), expiryMarketId: id, lowerTick, higherTick },\n\t\t\t\tquote: PredictClient.#queuedMintQuote(quote, policy),\n\t\t\t\tquoteForAccount,\n\t\t\t\tslippage: slippage.applied,\n\t\t\t\tpotentialPayout: rawToUsdc(quote.quantity),\n\t\t\t\tminPayout: rawToUsdc(minQuantityRaw),\n\t\t\t\tpayoutMultiple: Number(quote.quantity) / Number(expectedDebitRaw),\n\t\t\t\tminPayoutMultiple: Number(minQuantityRaw) / Number(totalDebitRaw),\n\t\t\t\tpricePerContract: rawToProbability(price.nowRaw),\n\t\t\t\tworstPricePerContract: rawToProbability(price.worstRaw),\n\t\t\t\torderFee: rawToUsdc(fee),\n\t\t\t\tbudget: rawToUsdc(budgetRaw),\n\t\t\t\ttotalDebit: rawToUsdc(totalDebitRaw),\n\t\t\t\texpectedDebit: rawToUsdc(expectedDebitRaw),\n\t\t\t\tbalance: {\n\t\t\t\t\thasAccount,\n\t\t\t\t\tavailable: availableRaw == null ? null : rawToUsdc(availableRaw),\n\t\t\t\t\tcovers: availableRaw == null ? null : availableRaw >= totalDebitRaw,\n\t\t\t\t},\n\t\t\t\tmaxNow: max == null ? null : rawToUsdc(inclusive ? max + fee : max),\n\t\t\t\ttiming: previewTiming({\n\t\t\t\t\tnowMs,\n\t\t\t\t\tpolicy,\n\t\t\t\t\theads: state.heads,\n\t\t\t\t\texpiryMs: state.expiryMs,\n\t\t\t\t\tnoTradeWindowMs: state.protocol.noTradeWindowMs,\n\t\t\t\t}),\n\t\t\t\taccepting: refusal == null,\n\t\t\t\trefusal,\n\t\t\t\torder,\n\t\t\t\traw: {\n\t\t\t\t\tbudget: budgetRaw,\n\t\t\t\t\torderFee: fee,\n\t\t\t\t\ttotalDebit: totalDebitRaw,\n\t\t\t\t\tslippage: slippage.raw,\n\t\t\t\t\tminQuantity: minQuantityRaw,\n\t\t\t\t\tmaxCost: maxCostRaw,\n\t\t\t\t\tmaxProbability: maxProbabilityRaw,\n\t\t\t\t\tpricePerContract: price.nowRaw,\n\t\t\t\t\tworstPricePerContract: price.worstRaw,\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\n\t\t/**\n\t\t * Plan a queued early sell of an Open record: the quote at the current price, net of the\n\t\t * order fee, the floors at the worst price the slippage allows, the timing and the\n\t\t * builder's preflight, plus the `enqueueSell` options that carry the floors. A record that\n\t\t * isn't Open has no quote, so it throws `PredictPreflightError` `'record-not-open'` instead.\n\t\t */\n\t\tplanSell: async (\n\t\t\towner: string,\n\t\t\tm: MarketCoordinates,\n\t\t\topts: PlanSellOptions,\n\t\t): Promise<SellPlan> => {\n\t\t\tconst orders = this.#requireDelayedExecution();\n\t\t\tconst { id } = await this.#resolveMarket(m);\n\t\t\tconst state = await this.#queueState(orders, id, { owner, recordIds: [opts.recordId] });\n\t\t\t// No quote exists for a record that isn't Open, or for more than it holds, so those\n\t\t\t// refusals throw.\n\t\t\tconst record = PredictClient.#assertRecordOpen(state, opts.recordId);\n\t\t\tthis.#assertSellQuantity(record, usdcToRaw(opts.quantity));\n\t\t\tconst quote = await this.read\n\t\t\t\t.quoteSell(owner, m, { recordId: opts.recordId, quantity: opts.quantity })\n\t\t\t\t.catch(async (error: unknown) => {\n\t\t\t\t\tthrow await this.#quoteRefusal(error);\n\t\t\t\t});\n\t\t\tconst nowMs = BigInt(Date.now());\n\t\t\tconst slippage = PredictClient.#appliedSlippage(opts, quote.raw.probability, state, nowMs);\n\t\t\tconst limits = sellLimits({\n\t\t\t\tproceedsRaw: quote.raw.proceeds,\n\t\t\t\tcloseQuantityRaw: quote.raw.quantityClosed,\n\t\t\t\tprobabilityRaw: quote.raw.probability,\n\t\t\t\tslippageRaw: slippage.raw,\n\t\t\t});\n\t\t\tconst fee = quote.raw.orderFee;\n\t\t\t// The builder's own preflight on the sell.\n\t\t\tconst refusal = PredictClient.#refusal(() => {\n\t\t\t\tconst { policy } = this.#assertQueueOpen(state, 'sell', nowMs);\n\t\t\t\tthis.#assertSellOrder(state, policy, opts.recordId, usdcToRaw(opts.quantity));\n\t\t\t});\n\t\t\treturn {\n\t\t\t\ttarget: { owner: normalizeSuiAddress(owner), expiryMarketId: id, recordId: opts.recordId },\n\t\t\t\tquote,\n\t\t\t\tslippage: slippage.applied,\n\t\t\t\tproceeds: quote.proceeds,\n\t\t\t\tnet: quote.net,\n\t\t\t\tminProceeds: rawToUsdc(limits.minProceedsRaw),\n\t\t\t\tminNet: rawToUsdc(limits.minProceedsRaw - fee),\n\t\t\t\torderFee: rawToUsdc(fee),\n\t\t\t\ttiming: previewTiming({\n\t\t\t\t\tnowMs,\n\t\t\t\t\tpolicy: state.desk.policy,\n\t\t\t\t\theads: state.heads,\n\t\t\t\t\texpiryMs: state.expiryMs,\n\t\t\t\t\tnoTradeWindowMs: state.protocol.noTradeWindowMs,\n\t\t\t\t}),\n\t\t\t\taccepting: refusal == null,\n\t\t\t\trefusal,\n\t\t\t\torder: {\n\t\t\t\t\tbuilder: 'enqueueSell',\n\t\t\t\t\toptions: {\n\t\t\t\t\t\trecordId: opts.recordId,\n\t\t\t\t\t\tquantity: opts.quantity,\n\t\t\t\t\t\tminProbability: rawToProbability(limits.minProbabilityRaw),\n\t\t\t\t\t\tminProceeds: rawToUsdc(limits.minProceedsRaw),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\traw: {\n\t\t\t\t\tslippage: slippage.raw,\n\t\t\t\t\tminProceeds: limits.minProceedsRaw,\n\t\t\t\t\tminProbability: limits.minProbabilityRaw,\n\t\t\t\t\torderFee: fee,\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\n\t\t/** One queue record and its display state, or null when missing or cleaned up. */\n\t\torder: async (m: MarketCoordinates, recordId: bigint): Promise<QueuedOrderView | null> =>\n\t\t\t(await this.read.orders(m, [recordId]))[0],\n\n\t\t/**\n\t\t * Queue records by record ID, with their display states. The SDK has no indexer: the app\n\t\t * supplies record IDs from its enqueue receipts or its indexer.\n\t\t */\n\t\torders: async (\n\t\t\tm: MarketCoordinates,\n\t\t\trecordIds: readonly bigint[],\n\t\t): Promise<(QueuedOrderView | null)[]> => {\n\t\t\tconst orders = this.#requireDelayedExecution();\n\t\t\tconst { id } = await this.#resolveMarket(m);\n\t\t\tconst queueId = await this.#existingQueueId(orders, id);\n\t\t\tconst records = await queuedOrders(\n\t\t\t\tthis.#client,\n\t\t\t\torders,\n\t\t\t\t{ expiryMarketId: id, queueId },\n\t\t\t\trecordIds,\n\t\t\t);\n\t\t\tconst nowMs = BigInt(Date.now());\n\t\t\treturn records.map((record, i) =>\n\t\t\t\trecord\n\t\t\t\t\t? {\n\t\t\t\t\t\t\trecordId: recordIds[i],\n\t\t\t\t\t\t\trecord,\n\t\t\t\t\t\t\tview: orderView(record, nowMs, {\n\t\t\t\t\t\t\t\tlotSize: BigInt(this.cfg.units.positionLotSize),\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t}\n\t\t\t\t\t: null,\n\t\t\t);\n\t\t},\n\n\t\t/**\n\t\t * Poll a record until it is filled, refunded or closed (`pollMs`, default 250), or until\n\t\t * `timeoutMs` (default 30 s). The fullnode a client reads can trail the enqueue's\n\t\t * execution, so a record not seen yet is polled again until the timeout, and ends as\n\t\t * `'gone'` only then. A record that disappears after it was seen ends as `'gone'` at once.\n\t\t * The record's result is enough for the UI; the fee breakdown is in the\n\t\t * `QueuedOrderFilled` event.\n\t\t */\n\t\twaitForOutcome: async (\n\t\t\tm: MarketCoordinates,\n\t\t\trecordId: bigint,\n\t\t\topts: { pollMs?: number; timeoutMs?: number; signal?: AbortSignal } = {},\n\t\t): Promise<QueuedOrderOutcome> => {\n\t\t\tconst pollMs = opts.pollMs ?? 250;\n\t\t\tconst deadline = Date.now() + (opts.timeoutMs ?? 30_000);\n\t\t\tlet seen = false;\n\t\t\tfor (;;) {\n\t\t\t\tconst order = await this.read.order(m, recordId);\n\t\t\t\tconst timedOut = Date.now() + pollMs > deadline;\n\t\t\t\tif (!order) {\n\t\t\t\t\tif (seen || timedOut) return { outcome: 'gone', order: null };\n\t\t\t\t} else {\n\t\t\t\t\tseen = true;\n\t\t\t\t\tconst state = order.view.state;\n\t\t\t\t\tif (state === 'filled' || state === 'refunded' || state === 'closed') {\n\t\t\t\t\t\treturn { outcome: state, order };\n\t\t\t\t\t}\n\t\t\t\t\tif (timedOut) return { outcome: 'timeout', order };\n\t\t\t\t}\n\t\t\t\tawait sleep(pollMs, opts.signal);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * USDC sent to the owner's account wrapper that the account hasn't settled yet: refunds,\n\t\t * sell proceeds and settled payouts of Open records. Already counted in `read.balance`; for\n\t\t * display.\n\t\t */\n\t\tpendingFunds: async (owner: string): Promise<number> =>\n\t\t\trawToUsdc(await pendingFunds(this.#client, this.wrapperIdFor(owner), this.cfg.quoteCoinType)),\n\n\t\t/** The current Pyth Lazer package, for a filler. Read it per batch and never cache it. */\n\t\tlazerPackages: (stateId?: string): Promise<LazerPackages> => {\n\t\t\tconst id = stateId ?? this.cfg.oracle?.pythLazerState;\n\t\t\tif (!id) throw new PredictInputError('pass the Pyth Lazer State id');\n\t\t\treturn lazerPackages(this.#client, id);\n\t\t},\n\n\t\t/**\n\t\t * Exact pre-close quote for an ACCOUNT position: dry-runs the immediate redeem and decodes\n\t\t * the receipt.\n\t\t * @deprecated `redeem_live` is retired by delayed execution (DBU-885): Predict v4 always\n\t\t * aborts it. Queued fills are Open records: quote them with `read.quoteSell`.\n\t\t */\n\t\tquoteRedeem: async (\n\t\t\towner: string,\n\t\t\tm: MarketDescriptor,\n\t\t\topts: CloseOptions,\n\t\t): Promise<RedeemQuote> => {\n\t\t\tconst tx = await this.#buildRedeem(owner, m, opts);\n\t\t\tconst events = await simulateWithEvents(this.#client, tx, owner);\n\t\t\tconst r = exactlyOne(decodeRedeems(this.cfg, { events }), 'order-redeemed');\n\t\t\treturn {\n\t\t\t\tproceeds: r.proceeds,\n\t\t\t\tgross: r.gross,\n\t\t\t\tfees: r.fees,\n\t\t\t\tquantityClosed: r.quantityClosed,\n\t\t\t\tremaining: r.remaining,\n\t\t\t\traw: {\n\t\t\t\t\tproceeds: r.raw.proceeds,\n\t\t\t\t\tgross: r.raw.gross,\n\t\t\t\t\tquantityClosed: r.raw.quantityClosed,\n\t\t\t\t},\n\t\t\t\tfeesExact: true,\n\t\t\t};\n\t\t},\n\n\t\tmarket: async (\n\t\t\tm: Pick<MarketDescriptor, 'underlying' | 'expiryMs'>,\n\t\t): Promise<MarketSummary | null> => {\n\t\t\tconst expiryMs = BigInt(m.expiryMs);\n\t\t\t// Deliberately re-queries and overwrites the cache instead of reading\n\t\t\t// through it: this read must return live state (nav, mintPaused), and\n\t\t\t// refreshing the cache on the way keeps later tx builds consistent.\n\t\t\tconst u = this.#underlying(m.underlying);\n\t\t\tconst id = await expiryMarketId(this.#client, this.#config, u, expiryMs);\n\t\t\tif (!id) return null;\n\t\t\tconst state = await marketState(this.#client, this.#config, id);\n\t\t\tthis.#marketCache.set(`${m.underlying}:${expiryMs}`, { id, state });\n\t\t\tconst navRaw = await currentNav(this.#client, this.#config, id, u);\n\t\t\treturn {\n\t\t\t\tid,\n\t\t\t\texpiryMs: state.expiryMs,\n\t\t\t\ttickSize: fromRaw(state.tickSizeRaw, 9), // strike/price scale\n\t\t\t\tadmissionTickSize: fromRaw(state.admissionTickSizeRaw, 9),\n\t\t\t\tmintPaused: state.mintPaused,\n\t\t\t\tnav: rawToUsdc(navRaw),\n\t\t\t\treferencePrice: PredictClient.#referencePriceOf(state),\n\t\t\t};\n\t\t},\n\n\t\t/**\n\t\t * The market's settlement price, or `null` until a keeper settles it. Unlike `market`,\n\t\t * `price` and the quotes, which abort `ELivePricingExpired` once the market expires, it\n\t\t * keeps working after expiry, when an app shows results. With delayed execution the\n\t\t * keeper settles a market, pays its Open records and cleans them up within about a second\n\t\t * of expiry, so `read.order` returns `null` by then. Keep each filled record's\n\t\t * `position.orderId` and pass it to `cost.settledPayout` with this price.\n\t\t */\n\t\tsettlement: async (m: MarketCoordinates): Promise<MarketSettlement> => {\n\t\t\tconst { id, state } = await this.#resolveMarket(m);\n\t\t\tconst raw = await settlementPrice(this.#client, this.#config, id);\n\t\t\treturn {\n\t\t\t\tmarketId: id,\n\t\t\t\texpiryMs: state.expiryMs,\n\t\t\t\tsettled: raw != null,\n\t\t\t\tsettlementPrice: raw == null ? null : fromRaw(raw, 9),\n\t\t\t\tsettlementPriceRaw: raw,\n\t\t\t\ttickSizeRaw: state.tickSizeRaw,\n\t\t\t};\n\t\t},\n\n\t\t/**\n\t\t * The fee and exposure policy the market snapshotted at creation, ready to pass to the\n\t\t * `cost` functions as `fees`. A market keeps it for its whole life, so it can differ from\n\t\t * the protocol's current template, and neither recorded deployment's template matches\n\t\t * `cost.SHIPPED_FEE_POLICY` any more. One object read.\n\t\t */\n\t\tfeePolicy: async (m: MarketCoordinates): Promise<FeePolicy> =>\n\t\t\tmarketFeePolicy(this.#client, (await this.#resolveMarket(m)).id),\n\n\t\tbalance: async (owner: string): Promise<number> =>\n\t\t\trawToUsdc(await accountBalance(this.#client, this.#config, owner, this.cfg.quoteCoinType)),\n\n\t\t// PLP shares held in the owner's account custody (raw u64, 6-decimal PLP coin).\n\t\tplpBalance: (owner: string): Promise<bigint> =>\n\t\t\taccountBalance(this.#client, this.#config, owner, this.cfg.coinTypes.plp),\n\n\t\tpool: async (): Promise<PoolSummary> => {\n\t\t\tconst s = await poolStats(this.#client, this.#config);\n\t\t\treturn {\n\t\t\t\tplpTotalSupply: s.plpTotalSupply, // shares raw (6-decimal)\n\t\t\t\tidleUsdc: rawToUsdc(s.idleBalance),\n\t\t\t\t// These are queue LENGTHS (counts of pending requests), not token amounts.\n\t\t\t\tsupplyRequestsPending: Number(s.supplyRequestsPending),\n\t\t\t\twithdrawRequestsPending: Number(s.withdrawRequestsPending),\n\t\t\t};\n\t\t},\n\t};\n\n\t// === execution-result decoders ===\n\t// Pure event parsing (no network): pass the executed/simulated transaction\n\t// result (with events included) and get a typed receipt back. Singular forms\n\t// throw unless exactly one matching event exists; plural forms return all\n\t// (an integrator batching N actions in one PTB gets N receipts).\n\treadonly decode = {\n\t\tmint: (r: DecodableTransactionResult) => exactlyOne(decodeMints(this.cfg, r), 'OrderMinted'),\n\t\tmints: (r: DecodableTransactionResult) => decodeMints(this.cfg, r),\n\t\tredeem: (r: DecodableTransactionResult) =>\n\t\t\texactlyOne(decodeRedeems(this.cfg, r), 'order-redeemed'),\n\t\tredeems: (r: DecodableTransactionResult) => decodeRedeems(this.cfg, r),\n\t\tclaim: (r: DecodableTransactionResult) =>\n\t\t\texactlyOne(decodeClaims(this.cfg, r), 'SettledOrderRedeemed'),\n\t\tclaims: (r: DecodableTransactionResult) => decodeClaims(this.cfg, r),\n\t\tcreateManager: (r: DecodableTransactionResult) =>\n\t\t\texactlyOne(decodeAccountsCreated(this.cfg, r), 'AccountCreated'),\n\t\tdeposit: (r: DecodableTransactionResult) =>\n\t\t\texactlyOne(decodeDeposits(this.cfg, r), 'Deposited'),\n\t\twithdraw: (r: DecodableTransactionResult) =>\n\t\t\texactlyOne(decodeWithdrawals(this.cfg, r), 'Withdrawn'),\n\t\tplpRequest: (r: DecodableTransactionResult) =>\n\t\t\texactlyOne(decodePlpRequests(this.cfg, r), 'supply/withdraw-requested'),\n\t\tplpCancel: (r: DecodableTransactionResult) =>\n\t\t\texactlyOne(decodePlpCancels(this.cfg, r), 'RequestCancelled'),\n\t\tbuilderCode: (r: DecodableTransactionResult) =>\n\t\t\texactlyOne(decodeBuilderCodeSets(this.cfg, r), 'BuilderCodeSet'),\n\n\t\t// --- delayed execution (DBU-885) --- the queue events are matched against the order-flow\n\t\t// companion's original ID (`packages.predictOrdersV1 ?? predictOrders`), the Predict events\n\t\t// the upgrade added against `packages.predictDelayedExecution`. Each throws\n\t\t// PredictInputError while the config doesn't record the package it needs.\n\n\t\t/** The trader's `OrderEnqueued` receipt: the record ID, τ, deadline, escrow and fee. */\n\t\tenqueue: (r: DecodableTransactionResult) =>\n\t\t\texactlyOne(decodeEnqueues(this.cfg, r), 'OrderEnqueued'),\n\t\tenqueues: (r: DecodableTransactionResult) => decodeEnqueues(this.cfg, r),\n\t\t/** Every queue event, tagged, in chain order: feed it to `queue.reduceOrderEvents`. */\n\t\tqueueEvents: (r: DecodableTransactionResult) => decodeQueueEvents(this.cfg, r),\n\t\tcohortCommits: (r: DecodableTransactionResult) => decodeCohortCommits(this.cfg, r),\n\t\tqueuedFills: (r: DecodableTransactionResult) => decodeQueuedFills(this.cfg, r),\n\t\tqueuedRefunds: (r: DecodableTransactionResult) => decodeQueuedRefunds(this.cfg, r),\n\t\topenRecordPayouts: (r: DecodableTransactionResult) => decodeOpenRecordPayouts(this.cfg, r),\n\t\tmarketPayoutsCompleted: (r: DecodableTransactionResult) =>\n\t\t\tdecodeMarketPayoutsCompleted(this.cfg, r),\n\t\tqueueOps: (r: DecodableTransactionResult) => decodeQueueOps(this.cfg, r),\n\t\t/** `RecordFundsParked` and `RecordFundsClaimed`: USDC a record keeps until it can be sent. */\n\t\trecordFunds: (r: DecodableTransactionResult) => decodeRecordFunds(this.cfg, r),\n\t\tpolicyUpdates: (r: DecodableTransactionResult) => decodePolicyUpdates(this.cfg, r),\n\t\t/**\n\t\t * `ExpiryPnlRealized` changes in the pool's gross realized result, for P&L reporting. Sum\n\t\t * them with `realizedPnlRaw`.\n\t\t */\n\t\texpiryPnlRealized: (r: DecodableTransactionResult) => decodeExpiryPnlRealized(this.cfg, r),\n\t};\n}\n\n// Resolve after `ms`, or reject with the signal's reason once it aborts.\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n\treturn new Promise((resolve, reject) => {\n\t\tif (signal?.aborted) {\n\t\t\treject(signal.reason);\n\t\t\treturn;\n\t\t}\n\t\tconst onAbort = () => {\n\t\t\tclearTimeout(timer);\n\t\t\treject(signal?.reason);\n\t\t};\n\t\tconst timer = setTimeout(() => {\n\t\t\tsignal?.removeEventListener('abort', onAbort);\n\t\t\tresolve();\n\t\t}, ms);\n\t\tsignal?.addEventListener('abort', onAbort, { once: true });\n\t});\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.mjs","names":["#config","opts","#buildMint","#buildMintCost","#feeds","#resolveMarket","#strikeTicks","#buildRedeem","#assertLot","#planMint","#planSell","marketState","#requireDelayedExecution","#existingQueueId","#client","#referencePriceOf","#positionsCache","#strikeRawFor","#queuedMintQuote","#quoteMintTransaction","#recordsDelayedExecution","#predictCurrentVersion","#queueState","#assertQueueOpen","#hasAccount","#searchBudgetQuote","#entryBandRefusal","#quoteRefusal","#appliedSlippage","#admittedFloor","#refusal","#assertMintOrder","#assertRecordOpen","#assertSellQuantity","#assertSellOrder","#underlying","#marketCache","resolved","#assertAdmittedTick","#gridTick","raw","quote","#knownQueues","#ordersCurrentVersion","#preview"],"sources":["../../src/predict/client.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\nimport type { ClientWithCoreApi, SuiClientRegistration } from '@mysten/sui/client';\nimport { Transaction, coinWithBalance, type TransactionResult } from '@mysten/sui/transactions';\nimport { isValidSuiObjectId, normalizeSuiAddress } from '@mysten/sui/utils';\nimport { TESTNET_PREDICT } from '../deployments/testnet.js';\nimport { getConfig, type PredictConfig, type UnderlyingConfig } from './config/index.js';\nimport {\n\ttoGeneratedConfig,\n\ttoOrdersConfig,\n\ttype GeneratedConfig,\n\ttype OrdersGeneratedConfig,\n} from './config/generated.js';\nimport { MIN_PREMIUM, decodeOrderRange, type FeePolicy } from './cost.js';\nimport {\n\tdecodeAccountsCreated,\n\tdecodeBuilderCodeSets,\n\tdecodeClaims,\n\tdecodeCohortCommits,\n\tdecodeDeposits,\n\tdecodeEnqueues,\n\tdecodeExpiryPnlRealized,\n\tdecodeMarketPayoutsCompleted,\n\tdecodeMints,\n\tdecodeOpenRecordPayouts,\n\tdecodePlpCancels,\n\tdecodePlpRequests,\n\tdecodePolicyUpdates,\n\tdecodeQueueEvents,\n\tdecodeQueueOps,\n\tdecodeQueuedFills,\n\tdecodeQueuedRefunds,\n\tdecodeRecordFunds,\n\tdecodeRedeems,\n\tdecodeWithdrawals,\n\texactlyOne,\n\ttype DecodableTransactionResult,\n} from './decode.js';\nimport {\n\tPredictInputError,\n\tPredictMoveError,\n\tPredictPreflightError,\n\ttype PredictPreflightCode,\n} from './errors.js';\nimport {\n\tORDER_FLOW_PACKAGE_VERSION,\n\tPREDICT_PACKAGE_VERSION,\n\tORDER_KIND,\n\tORDER_STATUS,\n\tbudgetMintLimits,\n\tcashNeedSell,\n\tchannelTickMs,\n\texactMintLimits,\n\tfeeCovered,\n\tmaxMintNow,\n\tmintBudget,\n\tmintCashNeed,\n\torderKindName,\n\torderView,\n\tpreviewTiming,\n\tsellLimits,\n\tslippageBand,\n\ttype DelayedExecutionPolicy,\n\ttype MaxMintNow,\n\ttype OrderKindName,\n\ttype OrderView,\n\ttype QueuedOrder,\n\ttype TimingPreview,\n} from './queue.js';\nimport { deriveQueueId } from './queue-id.js';\nimport { simulateWithEvents } from './reads/inspect.js';\nimport {\n\texecutionModeFor,\n\tlazerPackages,\n\tmarketQueueState,\n\torderFeeAndBalance,\n\tpendingFunds,\n\tqueuedOrders,\n\tquoteMintAnonymous,\n\tquoteMintForAccount,\n\tquoteRedeemOpen,\n\tversionWatermark,\n\ttype AnonymousMintQuoteRequest,\n\ttype ExecutionMode,\n\ttype MarketQueueState,\n\ttype MintQuoteRaw,\n\ttype MintQuoteRequest,\n} from './reads/queue.js';\nimport {\n\tpositionsFromTable,\n\tresolvePositionsTable,\n\ttype OpenPosition,\n\ttype PositionsHandle,\n} from './reads/positions.js';\nimport { accountBalance, hasPosition } from './reads/balances.js';\nimport {\n\tactiveMarketIds,\n\tcurrentNav,\n\texpiryMarketId,\n\tmarketFeePolicy,\n\tmarketState,\n\tmarketStates,\n\trangePrices,\n\treferenceTick,\n\tsettlementPrice,\n\ttype MarketState,\n} from './reads/markets.js';\nimport { poolStats } from './reads/pool.js';\nimport { readPricerSnapshot, type PricerSnapshot } from './reads/pricing.js';\nimport { boardPricer, type BoardPricer } from './pricing.js';\nimport { POS_INF_TICK, binaryRangeTicks, type Side } from './ticks.js';\nimport {\n\tcancelSupplyRequest,\n\tcancelWithdrawRequest,\n\tdepositFunds,\n\trequestSupply,\n\trequestWithdraw,\n\tsetBuilderCode,\n\tunsetBuilderCode,\n\twithdrawFunds,\n} from './tx/authed.js';\n\nimport { accountContract, deriveAccountWrapperIdFrom } from './tx/common.js';\nimport {\n\tassertOrderFeeAtMost,\n\tclaimParked,\n\tenqueueExactAmount,\n\tenqueueExactCost,\n\tenqueueExactQuantity,\n\tenqueueRedeemOpen,\n\tfill,\n\tpayOpen,\n\trebalanceExpiryCash,\n\trefund,\n\ttype LazerPackages,\n} from './tx/queue.js';\nimport type { MarketFeeds } from './tx/trade.js';\nimport {\n\tmintExactAmount,\n\tmintExactCost,\n\tmintExactQuantity,\n\tredeemLive,\n\tredeemSettled,\n} from './tx/trade.js';\nimport {\n\tpriceToRaw,\n\tprobabilityToRaw,\n\trawToProbability,\n\trawToUsdc,\n\tusdcToRaw,\n\tfromRaw,\n} from './units.js';\n\n// `position_lot_size` — a position quantity must be a whole multiple of this many\n// raw payout units ($0.01 lots). See packages/predict/sources/constants.move.\n/**\n * Testnet's `position_lot_size`, read from the deployment record. Validation uses the lot\n * size of the config actually in play; this is the convenience constant for testnet callers.\n */\nexport const POSITION_LOT_SIZE = BigInt(TESTNET_PREDICT.units.positionLotSize);\n\n// An unsubsidized price per contract (1e9 = $1) below which a budget fill's cost can't be above\n// its payout, so an admission refusal there is the entry band, not the payout bound.\nconst NEAR_DOLLAR_PER_CONTRACT = 950_000_000n;\n\n// Most `tx.*` builders are one builder's worth of commands in a fresh PTB.\nfunction txOf(command: (tx: Transaction) => TransactionResult | void): Transaction {\n\tconst tx = new Transaction();\n\ttx.add(command);\n\treturn tx;\n}\n\n/** A live/settled market addressed by its human coordinates: a binary position\n * (single strike + side) or a two-strike range position. */\nexport type MarketDescriptor = {\n\tunderlying: string;\n\texpiryMs: number | bigint;\n\t/**\n\t * Pin resolution to this exact `ExpiryMarket` object, skipping the\n\t * underlying+expiry lookup — a caller that reviewed a specific market object\n\t * mints against exactly that object, not whatever resolves at submit time.\n\t */\n\tmarketId?: string;\n} & (\n\t| {\n\t\t\tside: Side;\n\t\t\t/**\n\t\t\t * Strike in USD, or \"reference\" to trade at the market's on-chain reference\n\t\t\t * price (the Polymarket-style anchor: derived from the exact previous-window\n\t\t\t * oracle observation, so consecutive windows chain settlement → next strike).\n\t\t\t */\n\t\t\tstrike: number | 'reference';\n\t }\n\t| {\n\t\t\t/** A range position: pays out when settlement lands inside `(lower, upper]`\n\t\t\t * (left-open, right-closed — same convention as the on-chain range key). */\n\t\t\tside: 'range';\n\t\t\t/** Lower strike bound in USD — finite, on the tick grid. */\n\t\t\tlower: number;\n\t\t\t/** Upper strike bound in USD — finite, on the tick grid, above `lower`. */\n\t\t\tupper: number;\n\t }\n);\n\n/** Options for the friendly `mint` (exact payout quantity). */\nexport interface MintOptions {\n\tquantity: number;\n\tmaxCost?: number;\n\tmaxProbability?: number;\n}\n\n/** Options for `mintAmount` (spend up to a premium budget, floor the quantity received). */\nexport interface MintAmountOptions {\n\t/** Premium budget in quote units — the max premium paid (chain also caps it at the account balance). */\n\tspend: number;\n\tminQuantity: number;\n\t/** All-in cost ceiling in quote units (premium + fees). Omitted → uncapped. */\n\tmaxCost?: number;\n}\n\n/** Options for `mintCost`: all-in budget. Requires Predict v2 or later. */\nexport interface MintCostOptions {\n\t/** All-in USDC budget; the chain also caps it at the account balance. */\n\tspend: number;\n\t/** Minimum payout received. Zero disables this slippage floor. */\n\tminQuantity: number;\n}\n\n/** Options for `redeem`: which order and how much to close. `claimSettled` takes only\n * `orderId` — a settled claim closes the order in full. */\nexport interface CloseOptions {\n\torderId: bigint;\n\tquantity: number;\n}\n\n/** Options for `supplyPlp`. */\nexport interface PlpSupplyOptions {\n\t/**\n\t * Floor on the PLP minted for the whole request, as raw `bigint` shares — PLP is raw\n\t * everywhere in this SDK. It is a floor on the MARK, not a share count: a flush quoting\n\t * less does not fill smaller, it declines. Omitted → `0n`, no floor.\n\t *\n\t * How a miss is handled is the deployment's `lp_request_limit_flush_attempts`: at the\n\t * shipped count of one the first flush below the floor cancels and refunds the request.\n\t */\n\tminPlpOut?: bigint;\n}\n\n/** Options for `withdrawPlp`. */\nexport interface PlpWithdrawOptions {\n\t/**\n\t * Floor on the USDC paid for the whole request, in USD decimals like every other amount\n\t * here. A floor on the MARK, not an amount: a flush quoting less declines rather than\n\t * paying out smaller. Omitted → no floor. Measured after the protocol's withdraw fee.\n\t */\n\tminUsdcOut?: number | string;\n}\n\n/** One tradeable market as returned by read.markets(). */\nexport interface ActiveMarket {\n\tid: string;\n\texpiryMs: bigint;\n\t/** Strike granularity in USD (e.g. 0.01). */\n\ttickSize: number;\n\t/**\n\t * Coarser step new mint strikes must align to. A numeric strike must be a whole\n\t * multiple of this (the market's `referencePrice` is the one exception the chain\n\t * admits off-grid); otherwise the mint aborts `EInvalidAdmissionTick`.\n\t */\n\tadmissionTickSize: number;\n\tmintPaused: boolean;\n\t/** The window's anchor strike in USD, or null until the keeper seeds it. */\n\treferencePrice: number | null;\n}\n\n/** A resolved live market: its on-chain state summary for the caller. */\nexport interface MarketSummary {\n\tid: string;\n\texpiryMs: bigint;\n\ttickSize: number;\n\t/**\n\t * Coarser step new mint strikes must align to. A numeric strike must be a whole\n\t * multiple of this (the market's `referencePrice` is the one exception the chain\n\t * admits off-grid); otherwise the mint aborts `EInvalidAdmissionTick`.\n\t */\n\tadmissionTickSize: number;\n\tmintPaused: boolean;\n\tnav: number;\n\t/** The window's anchor strike in USD, or null until the keeper seeds it. */\n\treferencePrice: number | null;\n}\n\n/**\n * A market's settlement, from `read.settlement`. Pass `settlementPriceRaw` and `tickSizeRaw` to\n * `cost.settledPayout` to show what a position paid.\n */\nexport interface MarketSettlement {\n\tmarketId: string;\n\texpiryMs: bigint;\n\t/** Whether Predict has recorded the settlement price. */\n\tsettled: boolean;\n\t/** The settlement price in USD, or null until the market settles. */\n\tsettlementPrice: number | null;\n\t/** The settlement price at the 1e9 price scale, or null until the market settles. */\n\tsettlementPriceRaw: bigint | null;\n\t/** The market's raw tick size, which `cost.settledPayout` rounds the price against. */\n\ttickSizeRaw: bigint;\n}\n\n/** Aggregate pool figures. Balances in human units (shares raw); the pending fields\n * are request COUNTS, not amounts — the on-chain getters expose queue lengths, and\n * the escrowed USDC/PLP behind them is tracked separately. */\nexport interface PoolSummary {\n\tplpTotalSupply: bigint;\n\tidleUsdc: number;\n\t/** Number of LP supply requests queued for the next flush. */\n\tsupplyRequestsPending: number;\n\t/** Number of LP withdraw requests queued for the next flush. */\n\twithdrawRequestsPending: number;\n}\n\n/** Exact pre-trade quote: the dry-run receipt of the mint you are about to send. */\nexport interface MintQuote {\n\t/** Fill price, 0..1 per $1 payout. */\n\tentryProbability: number;\n\t/** Premium paid into LP backing (quote units). */\n\tpremium: number;\n\t/**\n\t * Fee breakdown. `referral` is a PORTION of the trader-paid trading fee and\n\t * congestion surcharge routed to the referrer — it is already inside those\n\t * numbers and is NOT an extra debit. `inventoryImpact` is a separate charge and\n\t * IS part of `cost`.\n\t */\n\tfees: {\n\t\ttrading: number;\n\t\tsubsidy: number;\n\t\tbuilder: number;\n\t\tpenalty: number;\n\t\treferral: number;\n\t\tinventoryImpact: number;\n\t};\n\t/**\n\t * All-in account debit: premium + (trading − subsidy) + builder + penalty +\n\t * inventoryImpact — exactly what the chain withdraws (the deployed\n\t * `compute_mint_quote`'s `all_in_cost`); pass this (plus your buffer) as maxCost.\n\t */\n\tcost: number;\n\tquantity: number;\n\traw: { premium: bigint; cost: bigint; quantity: bigint; entryProbability: bigint };\n\t/** True: computed by the real mint code path against real account state. */\n\tfeesExact: true;\n\t/**\n\t * True when this previews a queued (delayed-execution) fill: read from the chain's\n\t * `quote_*` functions with the congestion penalty removed, since a queued fill pays none.\n\t * Set when the network's config records delayed execution.\n\t */\n\tqueued?: boolean;\n\t/**\n\t * Queued previews only: the flat order fee, charged once at enqueue on top of `cost`. Show\n\t * it once per order, not per contract.\n\t */\n\torderFee?: number;\n}\n\n/** Exact pre-close quote: the dry-run receipt of the redeem you are about to send. */\nexport interface RedeemQuote {\n\t/** NET quote credited to the account. */\n\tproceeds: number;\n\t/** Gross close value before fees. */\n\tgross: number;\n\t/** `inventoryImpactRebate` is credited back on the close, so `proceeds` is\n\t * gross + rebate − trading − builder − penalty. */\n\tfees: { trading: number; builder: number; penalty: number; inventoryImpactRebate: number };\n\tquantityClosed: number;\n\tremaining: number;\n\traw: { proceeds: bigint; gross: bigint; quantityClosed: bigint };\n\tfeesExact: true;\n}\n\ninterface ResolvedMarket {\n\tid: string;\n\tstate: MarketState;\n}\n\n/** A market by its underlying and expiry, optionally pinned to an exact object. */\nexport type MarketCoordinates = Pick<MarketDescriptor, 'underlying' | 'expiryMs' | 'marketId'>;\n\n/** Options for `enqueueMint`: a queued mint of an exact payout quantity. */\nexport interface EnqueueMintOptions {\n\tquantity: number;\n\t/** All-in USDC cap (premium + fees). Required: a queued mint has no \"unlimited\" cap. */\n\tmaxCost: number;\n\t/** Entry-probability cap at τ, in (0, 1]. Required. See `queue.slippageBand`. */\n\tmaxProbability: number;\n}\n\n/** Options for `enqueueMintAmount`: a queued premium-budget mint. */\nexport interface EnqueueMintAmountOptions {\n\t/** Premium budget in USDC. */\n\tspend: number;\n\t/** Floor on the payout received. */\n\tminQuantity: number;\n\t/** All-in USDC cap (premium + fees). Required. */\n\tmaxCost: number;\n}\n\n/** Options for `enqueueMintCost`: a queued all-in-budget mint. */\nexport interface EnqueueMintCostOptions {\n\t/** All-in USDC budget, fees included. Escrowed at enqueue, less what the fill doesn't use. */\n\tspend: number;\n\t/** Floor on the payout received. Zero disables this slippage floor. */\n\tminQuantity: number;\n}\n\n/** Options for `enqueueSell`: a queued early sell of an Open record. */\nexport interface EnqueueSellOptions {\n\t/** The Open record to sell from: its queue record ID, not the position's order ID. */\n\trecordId: bigint;\n\t/** Payout quantity to close. A partial sell must leave at least the policy minimum. */\n\tquantity: number;\n\t/** Close-side probability floor at τ, in [0, 1]. Pass 0 on purpose to disable it. */\n\tminProbability: number;\n\t/** Floor on the proceeds before the order fee, in USDC. Pass 0 on purpose to disable it. */\n\tminProceeds: number;\n\t/**\n\t * Add `rebalance_expiry_cash` after the enqueue so the market is funded for this sell at once.\n\t * `'auto'` (default) adds it only when the sell's cash need is above spare cash, `'always'`\n\t * always, `'never'` never. It takes the hot `PoolVault`, so keep it conditional.\n\t */\n\tfundMarket?: 'auto' | 'always' | 'never';\n}\n\n/** What a queued order builder previews alongside the transaction. Display only. */\nexport interface QueuedOrderPreview {\n\tmarketId: string;\n\tkind: number;\n\tkindName: OrderKindName;\n\t/** τ, deadline and cutoff for an order placed now, from the local clock. */\n\ttiming: TimingPreview;\n\t/** The flat order fee, charged once at enqueue. */\n\torderFee: number;\n\t/** USDC escrowed for the premium and fees; 0 for a sell. Unused budget returns at the fill. */\n\tbudget: number;\n\t/** What enqueue debits: budget + order fee. */\n\ttotalDebit: number;\n\t/** The order's worst-case cash need against the market's spare cash. */\n\tcashNeedRaw: bigint;\n\tspareCashRaw: bigint;\n\t/**\n\t * Sells only: the cash need is above spare cash, so the sell may be refunded in full\n\t * (reason 8) unless the market is funded before the fill.\n\t */\n\tneedsFunding: boolean;\n\t/** Whether the builder added `rebalance_expiry_cash` after the enqueue. */\n\tfundedInTransaction: boolean;\n\traw: { orderFee: bigint; budget: bigint; totalDebit: bigint };\n}\n\n/** A queued order's transaction and its preview. */\nexport interface QueuedOrderPlan {\n\ttransaction: Transaction;\n\tpreview: QueuedOrderPreview;\n}\n\n/**\n * How much the price may move against a queued order between its quote and its fill, in cents per\n * contract. A contract pays $1, so its price in cents is its probability: 10¢ of slippage lets\n * a 42¢ contract fill at up to 52¢, fees included. It is never a percentage.\n */\nexport interface SlippageOptions {\n\t/**\n\t * Cents per contract: `10` is 10¢. `'auto'` (the default) sizes it with `queue.slippageBand`\n\t * from the time to expiry and the policy's delay.\n\t */\n\tslippageCents?: number | 'auto';\n\t/** Standard deviations of movement for `'auto'`. Default 2. */\n\tk?: number;\n}\n\n/**\n * Options for `read.planMint`. `amount` plans a purchase form's spend (an all-in budget mint),\n * and `quantity` plans an exact payout.\n */\nexport type PlanMintOptions = SlippageOptions &\n\t(\n\t\t| {\n\t\t\t\t/** The purchase amount in USDC. */\n\t\t\t\tamount: number;\n\t\t\t\t/**\n\t\t\t\t * Whether `amount` is the whole debit, order fee included (`'inclusive'`, the default),\n\t\t\t\t * or the order fee is charged on top (`'exclusive'`).\n\t\t\t\t */\n\t\t\t\torderFee?: 'inclusive' | 'exclusive';\n\t\t }\n\t\t| { quantity: number }\n\t);\n\n/** The slippage a plan applied. */\nexport interface AppliedSlippage {\n\t/** Cents per contract. */\n\tcents: number;\n\tsource: 'input' | 'auto';\n\t/** The model band when `source` is `'auto'`. */\n\tband: ReturnType<typeof slippageBand> | null;\n}\n\n/**\n * `read.planMint`: everything a purchase form shows, and the enqueue options that carry its\n * slippage. Display only: the fill prices at τ, within the limits in `order`.\n */\nexport interface MintPlan {\n\tshape: 'budget' | 'exact-quantity';\n\t/** The owner, market and strike range the plan was quoted for. */\n\ttarget: PlanTarget;\n\t/** The quote at the current price. */\n\tquote: MintQuote;\n\t/**\n\t * Whether the quote is the account's own (`quote_mint_*_for_account`, with its builder fee). A\n\t * visitor without an account, or a balance below the order, gets `quote_mint`'s quote instead,\n\t * with a budget's quantity found by a short search.\n\t */\n\tquoteForAccount: boolean;\n\tslippage: AppliedSlippage;\n\t/** The payout if it wins, at the current price (\"Potential payout\"). */\n\tpotentialPayout: number;\n\t/** The smallest payout the order accepts, at the worst price. A smaller fill is refunded. */\n\tminPayout: number;\n\t/** `potentialPayout / expectedDebit` (\"Payout multiple\"), order fee included. */\n\tpayoutMultiple: number;\n\t/** `minPayout / totalDebit`: the multiple at the worst price. */\n\tminPayoutMultiple: number;\n\t/** All-in price per contract now in USDC (0.42 is 42¢), after the fee subsidy, order fee excluded. */\n\tpricePerContract: number;\n\t/**\n\t * The worst price the limits admit: the price per contract without the fee subsidy, plus the\n\t * slippage. Enqueue admission checks the order without the subsidy, and the subsidy can run out\n\t * before the fill, so the limits never count on it.\n\t */\n\tworstPricePerContract: number;\n\t/** The flat order fee, read from the order desk, charged once per order. */\n\torderFee: number;\n\t/** USDC escrowed for the premium and fees. Unused budget comes back at the fill. */\n\tbudget: number;\n\t/** `budget + orderFee`: what enqueue debits. */\n\ttotalDebit: number;\n\t/** `quote.cost + orderFee`: what the order costs if it fills at the current price. */\n\texpectedDebit: number;\n\tbalance: {\n\t\t/** Whether the owner has a Predict account yet. */\n\t\thasAccount: boolean;\n\t\t/** The account's USDC, or null without an account. */\n\t\tavailable: number | null;\n\t\t/** Whether the balance covers `totalDebit`, or null without an account. */\n\t\tcovers: boolean | null;\n\t};\n\t/**\n\t * The largest `amount` (budget plans) or `quantity` (exact plans) the market's spare cash and,\n\t * with an account, the balance allow now. An exact plan's balance bound prices each contract\n\t * at the plan's `worstPricePerContract`. Null when neither binds.\n\t */\n\tmaxNow: number | null;\n\t/** τ, deadline and cutoff for an order placed now, from the local clock. */\n\ttiming: TimingPreview;\n\t/**\n\t * Whether `tx.enqueuePlan` would build the order now and admission would take it at the current\n\t * price: the builder's preflight (the queue gates, the order fee, the minimum premium and the\n\t * market's cash), the balance against `totalDebit`, the payout bound and, for a budget, the\n\t * floor admission buys without the fee subsidy. Two admission conditions are checked only on\n\t * chain, at placement: the market's SVI age under the order desk's `svi_max_age_ms`, and room in\n\t * the payout tree for a new strike's boundary nodes.\n\t */\n\taccepting: boolean;\n\t/**\n\t * The `PredictPreflightError` code the order would get now, or null. `'fee'` also covers a\n\t * missing account or a balance below `totalDebit`.\n\t */\n\trefusal: PredictPreflightCode | null;\n\t/** Pass `order.options` to `tx[order.builder]`. */\n\torder:\n\t\t| { builder: 'enqueueMintCost'; options: EnqueueMintCostOptions }\n\t\t| { builder: 'enqueueMint'; options: EnqueueMintOptions };\n\traw: {\n\t\tbudget: bigint;\n\t\torderFee: bigint;\n\t\ttotalDebit: bigint;\n\t\tslippage: bigint;\n\t\tminQuantity: bigint;\n\t\tmaxCost: bigint | null;\n\t\tmaxProbability: bigint | null;\n\t\tpricePerContract: bigint;\n\t\tworstPricePerContract: bigint;\n\t};\n}\n\n/**\n * What a plan was quoted for. Its limits are sized for that one order, so `tx.enqueuePlan` refuses\n * the plan for any other owner, market, strike or record.\n */\nexport interface PlanTarget {\n\towner: string;\n\texpiryMarketId: string;\n\t/** A mint's strike range, as the market's admission ticks. */\n\tlowerTick?: bigint;\n\thigherTick?: bigint;\n\t/** A sell's Open record. Record IDs restart in every market. */\n\trecordId?: bigint;\n}\n\n/** Options for `read.planSell`. */\nexport type PlanSellOptions = SlippageOptions & {\n\t/** The Open record to sell from. */\n\trecordId: bigint;\n\t/** Payout quantity to close. */\n\tquantity: number;\n};\n\n/** `read.planSell`: what an early sell shows, and the enqueue options that carry its slippage. */\nexport interface SellPlan {\n\t/** The owner, market and record the plan was quoted for. */\n\ttarget: PlanTarget;\n\t/** The quote at the current price. */\n\tquote: SellQuote;\n\tslippage: AppliedSlippage;\n\t/** Proceeds at the current price, before the order fee. */\n\tproceeds: number;\n\t/** `proceeds − orderFee`. */\n\tnet: number;\n\t/** The proceeds floor the order carries, before the order fee. A smaller fill is refunded. */\n\tminProceeds: number;\n\t/**\n\t * `minProceeds − orderFee`: the worst the sell nets if it fills. Negative when the order fee is\n\t * above the proceeds floor.\n\t */\n\tminNet: number;\n\torderFee: number;\n\ttiming: TimingPreview;\n\t/**\n\t * Whether `tx.enqueuePlan` would build the sell now: the builder's preflight, which checks the\n\t * queue gates, that the record is Open and the owner's, the order fee and the minimum sell. The\n\t * market's SVI age under the order desk's `svi_max_age_ms` is checked only on chain, at\n\t * placement.\n\t */\n\taccepting: boolean;\n\t/** The `PredictPreflightError` code the sell would get now, or null. */\n\trefusal: PredictPreflightCode | null;\n\t/** Pass `order.options` to `tx.enqueueSell`. */\n\torder: { builder: 'enqueueSell'; options: EnqueueSellOptions };\n\traw: { slippage: bigint; minProceeds: bigint; minProbability: bigint; orderFee: bigint };\n}\n\n/** `read.queue`: a market's queue state plus the derived figures the app shows. */\nexport interface MarketQueueView extends MarketQueueState {\n\tmode: ExecutionMode;\n\t/** τ, deadline and cutoff for an order placed now, from the local clock. */\n\ttiming: TimingPreview;\n\t/**\n\t * Whether a new mint would pass the queue gates now: the same gates `enqueueMint*` checks\n\t * before its fee and cash checks (the order-flow allowlist, the cutover, pauses, stuck, mint\n\t * capacity, the cutoff, and the account cap when an owner was given). One side can be full\n\t * while the other is open.\n\t */\n\tacceptingMints: boolean;\n\t/** Whether a new sell would pass the queue gates now (sells skip the mint pauses). */\n\tacceptingSells: boolean;\n\t/**\n\t * Why each side refuses now, or null: the `PredictPreflightError` code the builder would\n\t * throw for the queue gates.\n\t */\n\trefusal: { mint: PredictPreflightCode | null; sell: PredictPreflightCode | null };\n\t/** The largest mint the market's spare cash admits now. */\n\tmaxMint: { exactQuantity: MaxMintNow; budget: MaxMintNow };\n}\n\n/** A queue record and its display state. */\nexport interface QueuedOrderView {\n\trecordId: bigint;\n\trecord: QueuedOrder;\n\tview: OrderView;\n}\n\n/** How `read.waitForOutcome` ended. */\nexport interface QueuedOrderOutcome {\n\t/** `'gone'`: the record is missing (cleaned up, or not landed). `'timeout'`: still waiting. */\n\toutcome: 'filled' | 'refunded' | 'closed' | 'gone' | 'timeout';\n\torder: QueuedOrderView | null;\n}\n\n/** A quote for selling an Open record early (`quote_redeem_open`). */\nexport interface SellQuote {\n\t/** The live per-contract probability. */\n\tprobability: number;\n\t/** Proceeds before the order fee, with no congestion penalty. */\n\tproceeds: number;\n\t/**\n\t * `proceeds − orderFee`: what the account nets. Negative when the order fee is above the\n\t * proceeds, since the fee is charged at enqueue whatever the sell returns.\n\t */\n\tnet: number;\n\tfees: { trading: number; builder: number; inventoryImpactRebate: number; order: number };\n\tquantityClosed: number;\n\traw: { probability: bigint; proceeds: bigint; orderFee: bigint; quantityClosed: bigint };\n}\n\n// The strike-bearing (binary) arm of MarketDescriptor, for read.price and its\n// seam — anonymous board pricing has no range semantics.\ntype BinaryMarketCoordinates = Pick<MarketDescriptor, 'underlying' | 'expiryMs' | 'marketId'> & {\n\tstrike: number | 'reference';\n};\n\n/** The Sui client surface PredictClient reads through: any `ClientWithCoreApi`\n * (gRPC or JSON-RPC) provides both the `simulateTransaction` the reads/quotes\n * sit on and the `core` object methods position enumeration needs. */\nexport interface PredictCompatibleClient extends ClientWithCoreApi {}\n\n/**\n * Register PredictClient as a `client.predict` extension, mirroring\n * `@mysten/deepbook-v3`'s `deepbook(...)`: `client.$extend(predict({ network }))`.\n */\nexport function predict<Name extends string = 'predict'>({\n\tname = 'predict' as Name,\n\tnetwork,\n\tconfig,\n}: {\n\tname?: Name;\n\tnetwork: 'testnet' | 'mainnet';\n\tconfig?: PredictConfig;\n}): SuiClientRegistration<PredictCompatibleClient, Name, PredictClient> {\n\treturn {\n\t\tname,\n\t\tregister: (client) => new PredictClient({ client, network, config }),\n\t};\n}\n\n/**\n * The one object an app constructs. Wraps the config, a client for reads, and\n * a derived-account model so callers pass owner addresses, decimal amounts, and\n * human market coordinates — the facade converts to raw units, resolves markets\n * (cached), and delegates to the internal tx primitives / reads. Each `tx.*` builder\n * returns a finished `Transaction`; callers composing their own PTBs use the generated\n * move-call bindings this subpath exports (`plpMoveCalls`, `expiryMarketMoveCalls`, …).\n */\n// The chain refused a quote or order on its own limits at the current price.\nfunction isOrderFailsLimits(error: unknown): boolean {\n\treturn error instanceof PredictMoveError && error.abortName === 'EOrderFailsLimits';\n}\n\n// The chain refused to price a live trade because the market reached its expiry.\nfunction isPastExpiry(error: unknown): boolean {\n\treturn error instanceof PredictMoveError && error.abortName === 'ELivePricingExpired';\n}\n\nexport class PredictClient {\n\treadonly cfg: PredictConfig;\n\t// The flat slice every generated call resolves `options.config` against.\n\tget #config(): GeneratedConfig {\n\t\treturn toGeneratedConfig(this.cfg);\n\t}\n\t#client: PredictCompatibleClient;\n\t// underlying:expiryMs → resolved market. The id and tickSizeRaw — the only\n\t// state tx building depends on — are immutable per (underlying, expiry), so\n\t// one resolution per market per client suffices. (mintPaused IS mutable; the\n\t// cached copy is never consulted for a tx decision — the chain enforces it.)\n\t#marketCache = new Map<string, ResolvedMarket>();\n\t// owner → resolved position-store ids. accountUid and the table id are\n\t// immutable once created, so cache-forever; a missing table (no Predict\n\t// data yet) is NOT cached — it appears after the owner's first trade.\n\t#positionsCache = new Map<string, PositionsHandle>();\n\t// Queue IDs confirmed to exist. A `MarketQueue` is shared and never deleted, so a confirmed\n\t// queue is cached forever; a missing one is not cached, since the keeper creates it later.\n\t#knownQueues = new Set<string>();\n\n\tconstructor(opts: {\n\t\tnetwork: 'testnet' | 'mainnet';\n\t\tclient: PredictCompatibleClient;\n\t\tconfig?: PredictConfig;\n\t}) {\n\t\tthis.cfg = opts.config ?? getConfig(opts.network);\n\t\tthis.#client = opts.client;\n\t}\n\n\t/** The deterministic id of an owner's canonical account wrapper — no chain read. */\n\twrapperIdFor(owner: string): string {\n\t\treturn deriveAccountWrapperIdFrom(this.#config, owner);\n\t}\n\n\t/**\n\t * The deterministic id of a market's `MarketQueue` under the config's queue registry, whether\n\t * or not it exists yet — no chain read. Throws `PredictInputError` while the config doesn't\n\t * record delayed execution.\n\t */\n\tqueueIdFor(marketId: string): string {\n\t\treturn deriveQueueId(this.#requireDelayedExecution().queueRegistry, marketId);\n\t}\n\n\t// The deployment's wiring for a symbol; throws a typed error on an unknown symbol.\n\t// Per-underlying ids are the one thing the flat config slice does not carry.\n\t#underlying(underlying: string): UnderlyingConfig {\n\t\tconst u = this.cfg.underlyings[underlying];\n\t\tif (!u) throw new PredictInputError(`unknown underlying: ${underlying}`);\n\t\treturn u;\n\t}\n\n\t// The oracle feed ids for a symbol; throws a typed error on an unknown symbol.\n\t#feeds(underlying: string): MarketFeeds {\n\t\tconst u = this.#underlying(underlying);\n\t\treturn {\n\t\t\tpythFeed: u.pythFeed,\n\t\t\tblockScholesValueStore: u.blockScholesValueStore,\n\t\t\tblockScholesSviStore: u.blockScholesSviStore,\n\t\t};\n\t}\n\n\t// Resolve (and cache) a market's id + state from its human coordinates. An\n\t// explicit `marketId` pin skips the underlying+expiry lookup but still reads\n\t// that market's state — tx building depends on tickSizeRaw.\n\tasync #resolveMarket(\n\t\tm: Pick<MarketDescriptor, 'underlying' | 'expiryMs' | 'marketId'>,\n\t): Promise<ResolvedMarket> {\n\t\tif (m.marketId != null) {\n\t\t\tif (!isValidSuiObjectId(m.marketId)) {\n\t\t\t\tthrow new PredictInputError(`invalid marketId: ${JSON.stringify(m.marketId)}`);\n\t\t\t}\n\t\t\tconst resolved: ResolvedMarket = this.#marketCache.get(m.marketId) ?? {\n\t\t\t\tid: m.marketId,\n\t\t\t\tstate: await marketState(this.#client, this.#config, m.marketId),\n\t\t\t};\n\t\t\t// The pin must agree with the descriptor's coordinates: catching a stale or\n\t\t\t// wrong-market id here beats minting against mismatched oracle feeds. (The\n\t\t\t// underlying cannot be cross-checked — market state does not carry it.)\n\t\t\tif (resolved.state.expiryMs !== BigInt(m.expiryMs)) {\n\t\t\t\tthrow new PredictInputError(\n\t\t\t\t\t`pinned market ${m.marketId} expires at ${resolved.state.expiryMs}, descriptor says ${BigInt(m.expiryMs)}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tthis.#marketCache.set(m.marketId, resolved);\n\t\t\treturn resolved;\n\t\t}\n\t\tconst expiryMs = BigInt(m.expiryMs);\n\t\tconst key = `${m.underlying}:${expiryMs}`;\n\t\tconst hit = this.#marketCache.get(key);\n\t\tif (hit) return hit;\n\t\tconst u = this.#underlying(m.underlying);\n\t\tconst id = await expiryMarketId(this.#client, this.#config, u, expiryMs);\n\t\tif (!id) throw new PredictInputError(`no market for ${m.underlying} at expiry ${expiryMs}`);\n\t\tconst state = await marketState(this.#client, this.#config, id);\n\t\tconst resolved: ResolvedMarket = { id, state };\n\t\tthis.#marketCache.set(key, resolved);\n\t\treturn resolved;\n\t}\n\n\t// Reference PRICE in USD from a state (tick index × tick size), or null.\n\tstatic #referencePriceOf(state: MarketState): number | null {\n\t\treturn state.referenceTickRaw == null\n\t\t\t? null\n\t\t\t: fromRaw(state.referenceTickRaw * state.tickSizeRaw, 9);\n\t}\n\n\t// A finite tick from a USD strike, validated exactly like binaryRangeTicks:\n\t// whole-tick multiple, inside the finite domain (1..POS_INF_TICK-1).\n\t#gridTick(strike: number, tickSizeRaw: bigint): bigint {\n\t\tconst raw = priceToRaw(strike);\n\t\tconst tick = raw / tickSizeRaw;\n\t\tif (tick * tickSizeRaw !== raw) {\n\t\t\tthrow new PredictInputError(\n\t\t\t\t`strike ${strike} is not on the ${fromRaw(tickSizeRaw, 9)} tick grid`,\n\t\t\t);\n\t\t}\n\t\tif (tick <= 0n || tick >= POS_INF_TICK) {\n\t\t\tthrow new PredictInputError(\n\t\t\t\t`strike tick ${tick} outside the finite tick domain (1..POS_INF_TICK-1)`,\n\t\t\t);\n\t\t}\n\t\treturn tick;\n\t}\n\n\t// New finite MINT boundaries must land on the market's coarser ADMISSION grid,\n\t// not merely the fine tick grid — the chain asserts exactly this\n\t// (`assert_admitted_mint_ticks`, `EInvalidAdmissionTick`). The ±inf sentinels are\n\t// exempt, and the market's reference tick is the one finite boundary allowed to\n\t// bypass the grid, so an off-grid tick is only rejected after confirming it is not\n\t// the reference (one extra read, and only on the failing path).\n\tasync #assertAdmittedTick(tick: bigint, marketId: string, state: MarketState): Promise<void> {\n\t\tif (tick === 0n || tick === POS_INF_TICK) return;\n\t\tconst multiple = state.admissionTickSizeRaw / state.tickSizeRaw;\n\t\tif (multiple > 0n && tick % multiple === 0n) return;\n\t\tconst reference = await referenceTick(this.#client, this.#config, marketId);\n\t\tif (reference != null && reference === tick) return;\n\t\tconst admission = fromRaw(state.admissionTickSizeRaw, 9);\n\t\tthrow new PredictInputError(\n\t\t\t`strike ${fromRaw(tick * state.tickSizeRaw, 9)} is not on the ${admission} admission grid ` +\n\t\t\t\t`(mint boundaries must be a multiple of ${admission}, or the market's reference strike)`,\n\t\t);\n\t}\n\n\t// Resolve a descriptor's strike(s) to the (lower, higher) tick pair. A binary\n\t// numeric strike converts and validates against the tick grid; \"reference\"\n\t// reads the market's reference tick FRESH (never cached — it is unset early in\n\t// a window) and uses it directly: it is on the tick grid by construction. A\n\t// range descriptor converts both bounds to finite grid ticks (\"reference\" is\n\t// binary-only: a range has no single reference strike).\n\tasync #strikeTicks(\n\t\tm: MarketDescriptor,\n\t\tmarketId: string,\n\t\tstate: MarketState,\n\t): Promise<{ lowerTick: bigint; higherTick: bigint }> {\n\t\tif (m.side === 'range') {\n\t\t\tif (!(m.lower < m.upper)) {\n\t\t\t\tthrow new PredictInputError(`range lower ${m.lower} must be below upper ${m.upper}`);\n\t\t\t}\n\t\t\tconst lowerTick = this.#gridTick(m.lower, state.tickSizeRaw);\n\t\t\tconst higherTick = this.#gridTick(m.upper, state.tickSizeRaw);\n\t\t\tawait this.#assertAdmittedTick(lowerTick, marketId, state);\n\t\t\tawait this.#assertAdmittedTick(higherTick, marketId, state);\n\t\t\treturn { lowerTick, higherTick };\n\t\t}\n\t\tif (m.strike !== 'reference') {\n\t\t\tconst ticks = binaryRangeTicks(priceToRaw(m.strike), m.side, state.tickSizeRaw);\n\t\t\tawait this.#assertAdmittedTick(ticks.lowerTick, marketId, state);\n\t\t\tawait this.#assertAdmittedTick(ticks.higherTick, marketId, state);\n\t\t\treturn ticks;\n\t\t}\n\t\tconst tick = await referenceTick(this.#client, this.#config, marketId);\n\t\tif (tick == null) {\n\t\t\tthrow new PredictInputError(\n\t\t\t\t`reference price not set yet for ${m.underlying} @ ${m.expiryMs} — retry shortly or pass a numeric strike`,\n\t\t\t);\n\t\t}\n\t\treturn m.side === 'up'\n\t\t\t? { lowerTick: tick, higherTick: POS_INF_TICK }\n\t\t\t: { lowerTick: 0n, higherTick: tick };\n\t}\n\n\t// Raw payout quantity must land on a lot boundary — the chain rejects otherwise.\n\t#assertLot(quantityRaw: bigint): void {\n\t\t// From the config in play, not the exported testnet constant — a deployment with a\n\t\t// different `position_lot_size` must not be validated against testnet's.\n\t\tconst lot = BigInt(this.cfg.units.positionLotSize);\n\t\tif (quantityRaw % lot !== 0n) {\n\t\t\tthrow new PredictInputError(\n\t\t\t\t`quantity ${quantityRaw} raw is not a whole ${lot}-unit lot (position_lot_size)`,\n\t\t\t);\n\t\t}\n\t}\n\n\t// Whether the owner's account wrapper exists. A visitor without an account still gets a plan.\n\tasync #hasAccount(owner: string): Promise<boolean> {\n\t\tconst {\n\t\t\tobjects: [wrapper],\n\t\t} = await this.#client.core.getObjects({ objectIds: [this.wrapperIdFor(owner)] });\n\t\treturn !(wrapper instanceof Error);\n\t}\n\n\t// The slippage a plan applies, per $1 of payout, 1e9-scaled: the caller's, or the model band at\n\t// the quote's probability.\n\tstatic #appliedSlippage(\n\t\topts: SlippageOptions,\n\t\tprobabilityRaw: bigint,\n\t\tstate: MarketQueueState,\n\t\tnowMs: bigint,\n\t): { raw: bigint; applied: AppliedSlippage } {\n\t\tconst cents = opts.slippageCents ?? 'auto';\n\t\tif (cents !== 'auto') {\n\t\t\tif (!(Number.isFinite(cents) && cents >= 0 && cents <= 100)) {\n\t\t\t\tthrow new PredictInputError(\n\t\t\t\t\t`slippageCents must be in [0, 100] cents per contract, got ${cents}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\t// A cent is 1e7 in the 1e9-scaled price per $1 of payout.\n\t\t\tconst raw = BigInt(Math.round(cents * 1e7));\n\t\t\treturn { raw, applied: { cents: Number(raw) / 1e7, source: 'input', band: null } };\n\t\t}\n\t\tconst policy = state.desk.policy;\n\t\tconst band = slippageBand({\n\t\t\t// The band is undefined at the certain ends, where a queued mint is refused anyway.\n\t\t\tprobability: Math.min(Math.max(rawToProbability(probabilityRaw), 1e-6), 1 - 1e-6),\n\t\t\ttimeToExpiryMs: Number(state.expiryMs > nowMs ? state.expiryMs - nowMs : 0n),\n\t\t\tdelayMs: Number(policy.delayMs),\n\t\t\ttickMs: Number(channelTickMs(policy.pythChannel)),\n\t\t\tk: opts.k,\n\t\t});\n\t\tconst raw = BigInt(Math.ceil(band.deltaProbability * 1e9));\n\t\treturn { raw, applied: { cents: Number(raw) / 1e7, source: 'auto', band } };\n\t}\n\n\t// Why the chain refused a plan's quote, as a typed refusal, or the chain's own error when it\n\t// can't tell. A market past its expiry has no live price (`ELivePricingExpired`). A mint the\n\t// chain refuses at the current price (`EOrderFailsLimits`) is diagnosed by `#entryBandRefusal`.\n\tasync #quoteRefusal(\n\t\terror: unknown,\n\t\tmint?: { m: MarketDescriptor; quantityRaw?: bigint },\n\t): Promise<unknown> {\n\t\tif (isPastExpiry(error)) {\n\t\t\treturn new PredictPreflightError(\n\t\t\t\t'past-cutoff',\n\t\t\t\t'the market reached its expiry, so it has no live price and takes no orders',\n\t\t\t);\n\t\t}\n\t\tif (mint != null && isOrderFailsLimits(error)) {\n\t\t\treturn (await this.#entryBandRefusal(mint.m, mint.quantityRaw)) ?? error;\n\t\t}\n\t\treturn error;\n\t}\n\n\t// Why the chain refused to quote a mint at the current price (`EOrderFailsLimits`), as a typed\n\t// refusal: a binary strike outside the market's entry band, or an exact quantity whose premium\n\t// is below the minimum. Null when neither explains it, or the diagnosis can't be read, so the\n\t// caller rethrows the chain's error.\n\tasync #entryBandRefusal(\n\t\tm: MarketDescriptor,\n\t\tquantityRaw?: bigint,\n\t): Promise<PredictPreflightError | null> {\n\t\tif (m.side === 'range') return null;\n\t\t// Best effort: a failed diagnosis read leaves the chain's own error to the caller.\n\t\tconst read = await Promise.all([this.read.price(m), this.read.feePolicy(m)]).catch(() => null);\n\t\tif (read == null) return null;\n\t\tconst [prices, policy] = read;\n\t\tconst probability = probabilityToRaw(m.side === 'up' ? prices.up : prices.down);\n\t\tif (probability < policy.minEntryProbability || probability > policy.maxEntryProbability) {\n\t\t\treturn new PredictPreflightError(\n\t\t\t\t'entry-band',\n\t\t\t\t`the ${m.side} probability ${rawToProbability(probability)} is outside the market's entry band [${rawToProbability(policy.minEntryProbability)}, ${rawToProbability(policy.maxEntryProbability)}]: pick a strike nearer the money`,\n\t\t\t);\n\t\t}\n\t\tif (quantityRaw != null && (quantityRaw * probability) / 1_000_000_000n < MIN_PREMIUM) {\n\t\t\treturn new PredictPreflightError(\n\t\t\t\t'min-premium',\n\t\t\t\t`${rawToUsdc(quantityRaw)} contracts cost a premium below the ${rawToUsdc(MIN_PREMIUM)} USDC minimum`,\n\t\t\t);\n\t\t}\n\t\treturn null;\n\t}\n\n\t// A payout floor admission buys at least, for an all-in budget: the largest lot multiple up to\n\t// `startRaw` whose cost without the fee subsidy, by an exact chain quote, fits the budget.\n\t// Admission (`cost_qty_at`, no subsidy) first finds the largest quantity whose cost fits, and\n\t// cost rises with quantity, so that is at least this. A probe below the minimum premium\n\t// (`EOrderFailsLimits`) is retried once at the smallest quantity that clears it. Admission\n\t// searches again only when its fill costs more than its payout, a search rounding makes\n\t// non-monotone, so a floor whose payout is below the budget, about $1 a contract, is refused.\n\tasync #admittedFloor(\n\t\tquoteAt: (quantityRaw: bigint) => Promise<MintQuoteRaw>,\n\t\tbudgetRaw: bigint,\n\t\tstartRaw: bigint,\n\t\tlot: bigint,\n\t\tentryProbabilityRaw: bigint,\n\t\tunsubsidizedPricePerContractRaw: bigint,\n\t): Promise<\n\t\t{ quantity: bigint } | { refusal: 'min-premium' | 'cost-above-payout' | 'entry-band' }\n\t> {\n\t\tconst ceilLot = (x: bigint) => ((x + lot - 1n) / lot) * lot;\n\t\tconst minPremiumQuantity =\n\t\t\tentryProbabilityRaw === 0n\n\t\t\t\t? 0n\n\t\t\t\t: ceilLot((MIN_PREMIUM * 1_000_000_000n + entryProbabilityRaw - 1n) / entryProbabilityRaw);\n\t\tlet quantity = startRaw;\n\t\tlet raised = false;\n\t\tfor (let probe = 0; probe < 5 && quantity > 0n; probe++) {\n\t\t\tlet quote: MintQuoteRaw;\n\t\t\ttry {\n\t\t\t\tquote = await quoteAt(quantity);\n\t\t\t} catch (e) {\n\t\t\t\tif (!isOrderFailsLimits(e)) throw e;\n\t\t\t\tif (!raised && quantity < minPremiumQuantity) {\n\t\t\t\t\traised = true;\n\t\t\t\t\tquantity = minPremiumQuantity;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\t// The raise sized the minimum-premium quantity from the budget quote's entry\n\t\t\t\t// probability. When the raised probe still fails, the probability moved down between\n\t\t\t\t// the two quotes and the premium is still short, so the minimum premium refused it.\n\t\t\t\tif (raised || quantity < minPremiumQuantity) return { refusal: 'min-premium' };\n\t\t\t\t// At or above the minimum premium, admission refuses a cost above the payout or an entry\n\t\t\t\t// probability outside the band. Well below $1 a contract the cost can't reach the payout,\n\t\t\t\t// so the probability left the band between the budget quote and this probe.\n\t\t\t\treturn {\n\t\t\t\t\trefusal:\n\t\t\t\t\t\tunsubsidizedPricePerContractRaw < NEAR_DOLLAR_PER_CONTRACT\n\t\t\t\t\t\t\t? 'entry-band'\n\t\t\t\t\t\t\t: 'cost-above-payout',\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst unsubsidized = quote.allInCost - quote.penaltyFee + quote.feeIncentiveSubsidy;\n\t\t\tif (unsubsidized <= budgetRaw) {\n\t\t\t\treturn quantity >= budgetRaw ? { quantity } : { refusal: 'cost-above-payout' };\n\t\t\t}\n\t\t\t// The smallest quantity that clears the minimum premium doesn't fit.\n\t\t\tif (raised) return { refusal: 'min-premium' };\n\t\t\tconst next = ((quantity * budgetRaw) / unsubsidized / lot) * lot;\n\t\t\tquantity = next < quantity ? next : quantity - lot;\n\t\t}\n\t\treturn { refusal: 'min-premium' };\n\t}\n\n\t// A budget mint's quote for no particular account. `quote_mint` has no all-in budget mode, so\n\t// this searches for the largest lot multiple whose all-in cost fits the budget. The first probe\n\t// is its premium-budget mode with the whole budget as the premium, whose premium clears the\n\t// 1 USDC minimum whenever the purchase can. Each next probe divides the budget by the last price\n\t// per contract. The price barely moves with size, so a few quotes settle it. A probe the chain\n\t// refuses (`EOrderFailsLimits`) ends the search with the best fit so far. With no fit, the\n\t// refusal is `min-premium`, unless the chain priced no probe and the budget is at least the\n\t// minimum premium plus a lot: the first probe's premium is above `budget − lot` (a lot costs\n\t// under $1), so the minimum premium didn't refuse it, and the chain's own refusal stands.\n\tasync #searchBudgetQuote(\n\t\tticks: { expiryMarketId: string; lowerTick: bigint; higherTick: bigint } & MarketFeeds,\n\t\tbudgetRaw: bigint,\n\t\tlot: bigint,\n\t): Promise<MintQuoteRaw> {\n\t\tconst floorLot = (x: bigint) => (x / lot) * lot;\n\t\tlet refusal: unknown = null;\n\t\tlet priced = false;\n\t\tconst probeQuote = async (request: AnonymousMintQuoteRequest) => {\n\t\t\ttry {\n\t\t\t\tconst { quote } = await quoteMintAnonymous(this.#client, this.#config, {\n\t\t\t\t\t...ticks,\n\t\t\t\t\trequest,\n\t\t\t\t});\n\t\t\t\tpriced = true;\n\t\t\t\treturn quote;\n\t\t\t} catch (e) {\n\t\t\t\tif (!isOrderFailsLimits(e)) throw e;\n\t\t\t\trefusal ??= e;\n\t\t\t\treturn null;\n\t\t\t}\n\t\t};\n\t\tlet best: MintQuoteRaw | null = null;\n\t\tlet quote = await probeQuote({\n\t\t\tshape: 'exact-amount',\n\t\t\tmaxPremiumRaw: budgetRaw,\n\t\t\tminQuantityRaw: lot,\n\t\t});\n\t\tfor (let probe = 1; quote != null; probe++) {\n\t\t\tconst cost = quote.allInCost - quote.penaltyFee;\n\t\t\tif (cost <= budgetRaw && (best == null || quote.quantity > best.quantity)) best = quote;\n\t\t\tif (probe === 4) break;\n\t\t\tconst next = cost === 0n ? quote.quantity : floorLot((budgetRaw * quote.quantity) / cost);\n\t\t\tif (next === 0n || next === quote.quantity) break;\n\t\t\tquote = await probeQuote({ shape: 'exact-quantity', quantityRaw: next });\n\t\t}\n\t\tif (best == null) {\n\t\t\tif (!priced && refusal != null && budgetRaw >= MIN_PREMIUM + lot) throw refusal;\n\t\t\tthrow new PredictPreflightError(\n\t\t\t\t'min-premium',\n\t\t\t\t`a budget of ${rawToUsdc(budgetRaw)} buys no payout at the current price (a mint's premium must be at least ${rawToUsdc(MIN_PREMIUM)} USDC)`,\n\t\t\t);\n\t\t}\n\t\treturn best;\n\t}\n\n\t// The PredictPreflightError code a check throws, or null when it passes.\n\tstatic #refusal(check: () => void): PredictPreflightCode | null {\n\t\ttry {\n\t\t\tcheck();\n\t\t\treturn null;\n\t\t} catch (e) {\n\t\t\tif (e instanceof PredictPreflightError) return e.code;\n\t\t\tthrow e;\n\t\t}\n\t}\n\n\t// Shared construction for tx.mint and read.quoteMint. The quote dry-runs the\n\t// same mint the trade sends; quoteMint omits the caller's cost/probability caps\n\t// (they only gate via abort and don't change the receipt numbers).\n\tasync #buildMint(owner: string, m: MarketDescriptor, opts: MintOptions): Promise<Transaction> {\n\t\tconst feeds = this.#feeds(m.underlying);\n\t\tconst { id, state } = await this.#resolveMarket(m);\n\t\tconst quantityRaw = usdcToRaw(opts.quantity);\n\t\tthis.#assertLot(quantityRaw);\n\t\tconst { lowerTick, higherTick } = await this.#strikeTicks(m, id, state);\n\t\treturn txOf(\n\t\t\tmintExactQuantity(this.#config, {\n\t\t\t\texpiryMarketId: id,\n\t\t\t\twrapperId: this.wrapperIdFor(owner),\n\t\t\t\tlowerTick,\n\t\t\t\thigherTick,\n\t\t\t\tquantityRaw,\n\t\t\t\tmaxCostRaw: opts.maxCost != null ? usdcToRaw(opts.maxCost) : undefined,\n\t\t\t\tmaxProbabilityRaw:\n\t\t\t\t\topts.maxProbability != null ? probabilityToRaw(opts.maxProbability) : undefined,\n\t\t\t\t...feeds,\n\t\t\t}),\n\t\t);\n\t}\n\n\tasync #buildMintCost(\n\t\towner: string,\n\t\tm: MarketDescriptor,\n\t\topts: MintCostOptions,\n\t): Promise<Transaction> {\n\t\tconst feeds = this.#feeds(m.underlying);\n\t\tconst maxCostRaw = usdcToRaw(opts.spend);\n\t\tconst minQuantityRaw = usdcToRaw(opts.minQuantity);\n\t\tconst { id, state } = await this.#resolveMarket(m);\n\t\tconst { lowerTick, higherTick } = await this.#strikeTicks(m, id, state);\n\t\treturn txOf(\n\t\t\tmintExactCost(this.#config, {\n\t\t\t\texpiryMarketId: id,\n\t\t\t\twrapperId: this.wrapperIdFor(owner),\n\t\t\t\tlowerTick,\n\t\t\t\thigherTick,\n\t\t\t\tmaxCostRaw,\n\t\t\t\tminQuantityRaw,\n\t\t\t\t...feeds,\n\t\t\t}),\n\t\t);\n\t}\n\n\tasync #quoteMintTransaction(owner: string, tx: Transaction): Promise<MintQuote> {\n\t\tconst events = await simulateWithEvents(this.#client, tx, owner);\n\t\tconst r = exactlyOne(decodeMints(this.cfg, { events }), 'OrderMinted');\n\t\t// Mirrors the deployed `compute_mint_quote`'s all_in_cost exactly:\n\t\t// premium + (trading − subsidy) + builder + penalty + inventory-impact.\n\t\t// `referral_fee` is deliberately NOT added — it is a portion OF the\n\t\t// trader-paid trading fee and congestion surcharge, not an extra debit.\n\t\tconst costRaw =\n\t\t\tr.raw.premium +\n\t\t\t(r.raw.tradingFee - r.raw.feeIncentiveSubsidy) +\n\t\t\tr.raw.builderFee +\n\t\t\tr.raw.penaltyFee +\n\t\t\tr.raw.inventoryImpactCharge;\n\t\treturn {\n\t\t\tentryProbability: r.entryProbability,\n\t\t\tpremium: r.premium,\n\t\t\tfees: r.fees,\n\t\t\tcost: rawToUsdc(costRaw),\n\t\t\tquantity: r.quantity,\n\t\t\traw: {\n\t\t\t\tpremium: r.raw.premium,\n\t\t\t\tcost: costRaw,\n\t\t\t\tquantity: r.raw.quantity,\n\t\t\t\tentryProbability: r.raw.entryProbability,\n\t\t\t},\n\t\t\tfeesExact: true,\n\t\t};\n\t}\n\n\t// Shared construction for tx.redeem and read.quoteRedeem.\n\tasync #buildRedeem(owner: string, m: MarketDescriptor, opts: CloseOptions): Promise<Transaction> {\n\t\tconst feeds = this.#feeds(m.underlying);\n\t\tconst { id } = await this.#resolveMarket(m);\n\t\tconst closeQuantityRaw = usdcToRaw(opts.quantity);\n\t\tthis.#assertLot(closeQuantityRaw);\n\t\treturn txOf(\n\t\t\tredeemLive(this.#config, {\n\t\t\t\texpiryMarketId: id,\n\t\t\t\twrapperId: this.wrapperIdFor(owner),\n\t\t\t\torderId: opts.orderId,\n\t\t\t\tcloseQuantityRaw,\n\t\t\t\t...feeds,\n\t\t\t}),\n\t\t);\n\t}\n\n\t// Raw strike for anonymous pricing: numeric strikes validate against the tick\n\t// grid; \"reference\" reads the market's reference tick fresh (unset → typed error).\n\tasync #strikeRawFor(\n\t\tm: BinaryMarketCoordinates,\n\t\tmarketId: string,\n\t\tstate: MarketState,\n\t): Promise<bigint> {\n\t\tif (m.strike !== 'reference') {\n\t\t\t// Same validation as the mint path: on the grid AND inside the finite tick\n\t\t\t// domain (0 / POS_INF are the ±inf sentinels, not quotable strikes).\n\t\t\treturn this.#gridTick(m.strike, state.tickSizeRaw) * state.tickSizeRaw;\n\t\t}\n\t\tconst tick = await referenceTick(this.#client, this.#config, marketId);\n\t\tif (tick == null) {\n\t\t\tthrow new PredictInputError(\n\t\t\t\t`reference price not set yet for ${m.underlying} @ ${m.expiryMs} — retry shortly or pass a numeric strike`,\n\t\t\t);\n\t\t}\n\t\treturn tick * state.tickSizeRaw;\n\t}\n\n\t// === delayed execution (DBU-885) ===\n\n\t// The config slice the queue calls take, or a typed refusal: without the Predict upgrade, the\n\t// order-flow companion and its desk, this SDK version has no record of delayed execution on the\n\t// network, and the queue calls would address the wrong package or decode nothing.\n\t#requireDelayedExecution(): OrdersGeneratedConfig {\n\t\treturn toOrdersConfig(this.cfg);\n\t}\n\n\t// Whether the config records delayed execution, without throwing.\n\t#recordsDelayedExecution(): boolean {\n\t\tconst { predictDelayedExecution, predictOrders } = this.cfg.packages;\n\t\tconst { orderDesk, queueRegistry } = this.cfg.objects;\n\t\treturn Boolean(predictDelayedExecution && predictOrders && orderDesk && queueRegistry);\n\t}\n\n\t// The version constants the configured call targets compile: the network's own pins, else the\n\t// versions these bindings were generated from. A watermark above one retires that code.\n\t#predictCurrentVersion(): bigint {\n\t\treturn this.cfg.packages.predictCurrentVersion ?? PREDICT_PACKAGE_VERSION;\n\t}\n\n\t#ordersCurrentVersion(): bigint {\n\t\treturn this.cfg.packages.predictOrdersCurrentVersion ?? ORDER_FLOW_PACKAGE_VERSION;\n\t}\n\n\t// The market's queue ID, once its `MarketQueue` is known to exist. A missing queue would abort\n\t// every read and order with an opaque error, so it is refused here with a typed one.\n\tasync #existingQueueId(orders: OrdersGeneratedConfig, marketId: string): Promise<string> {\n\t\tconst queueId = deriveQueueId(orders.queueRegistry, marketId);\n\t\tif (this.#knownQueues.has(queueId)) return queueId;\n\t\tconst {\n\t\t\tobjects: [queue],\n\t\t} = await this.#client.core.getObjects({ objectIds: [queueId] });\n\t\tif (queue instanceof Error) {\n\t\t\tthrow new PredictPreflightError(\n\t\t\t\t'no-queue',\n\t\t\t\t`market ${marketId} has no order queue yet (\\`queue::create_and_share\\` hasn't run for it)`,\n\t\t\t);\n\t\t}\n\t\tthis.#knownQueues.add(queueId);\n\t\treturn queueId;\n\t}\n\n\tasync #queueState(\n\t\torders: OrdersGeneratedConfig,\n\t\tmarketId: string,\n\t\topts: { owner?: string; recordIds?: bigint[] } = {},\n\t): Promise<MarketQueueState> {\n\t\tconst queueId = await this.#existingQueueId(orders, marketId);\n\t\treturn marketQueueState(this.#client, orders, marketId, {\n\t\t\towner: opts.owner,\n\t\t\tquoteCoinType: this.cfg.quoteCoinType,\n\t\t\trecordIds: opts.recordIds,\n\t\t\tqueueId,\n\t\t});\n\t}\n\n\t// The queue gates every enqueue passes: Predict's order-flow allowlist and cutover, the\n\t// pauses, then the queue's own (`begin_enqueue`): the stuck gate, capacity, the per-account\n\t// cap, and the cutoff on the previewed τ. Throws the matching PredictPreflightError.\n\t#assertQueueOpen(\n\t\tstate: MarketQueueState,\n\t\tside: 'mint' | 'sell',\n\t\tnowMs: bigint,\n\t): { policy: DelayedExecutionPolicy; timing: TimingPreview } {\n\t\tconst policy = state.desk.policy;\n\t\tif (!state.protocol.orderFlowEnabled) {\n\t\t\tthrow new PredictPreflightError(\n\t\t\t\t'not-live',\n\t\t\t\t\"queued orders aren't live yet: the protocol hasn't enabled the order-flow package\",\n\t\t\t);\n\t\t}\n\t\tconst mode = executionModeFor(\n\t\t\tstate.protocol.versionWatermark,\n\t\t\ttrue,\n\t\t\ttrue,\n\t\t\tthis.#predictCurrentVersion(),\n\t\t);\n\t\tif (mode === 'retired') {\n\t\t\tthrow new PredictPreflightError(\n\t\t\t\t'retired',\n\t\t\t\t'the Predict package version this SDK calls is retired: update the SDK',\n\t\t\t);\n\t\t}\n\t\tif (mode !== 'delayed') {\n\t\t\tthrow new PredictPreflightError(\n\t\t\t\t'not-live',\n\t\t\t\t\"queued orders aren't live yet: the protocol's version watermark hasn't been raised\",\n\t\t\t);\n\t\t}\n\t\tif (state.desk.versionWatermark > this.#ordersCurrentVersion()) {\n\t\t\tthrow new PredictPreflightError(\n\t\t\t\t'retired',\n\t\t\t\t'the order-flow package version this SDK calls is retired: update the SDK',\n\t\t\t);\n\t\t}\n\t\tif (state.protocol.frozen) throw new PredictPreflightError('paused', 'the protocol is frozen');\n\t\tif (side === 'mint' && (state.protocol.tradingPaused || state.mintPaused)) {\n\t\t\tthrow new PredictPreflightError('paused', 'minting is paused on this market');\n\t\t}\n\t\tif (state.stuck) {\n\t\t\tthrow new PredictPreflightError(\n\t\t\t\t'stuck',\n\t\t\t\t'pricing is delayed for this market, try again shortly',\n\t\t\t);\n\t\t}\n\t\tconst [pending, capacity] =\n\t\t\tside === 'mint'\n\t\t\t\t? [state.pending.mints, policy.mintCapacity]\n\t\t\t\t: [state.pending.sells, policy.sellCapacity];\n\t\tif (pending >= capacity) {\n\t\t\tthrow new PredictPreflightError(\n\t\t\t\t'queue-full',\n\t\t\t\t`the market has ${pending} waiting ${side}s, its maximum`,\n\t\t\t);\n\t\t}\n\t\tif (state.account && state.account.waitingOrders >= policy.perAccountCap) {\n\t\t\tthrow new PredictPreflightError(\n\t\t\t\t'account-cap',\n\t\t\t\t`the account already has ${state.account.waitingOrders} waiting orders in this market, its maximum`,\n\t\t\t);\n\t\t}\n\t\tconst timing = previewTiming({\n\t\t\tnowMs,\n\t\t\tpolicy,\n\t\t\theads: state.heads,\n\t\t\texpiryMs: state.expiryMs,\n\t\t\tnoTradeWindowMs: state.protocol.noTradeWindowMs,\n\t\t});\n\t\tif (!timing.beforeCutoff) {\n\t\t\tthrow new PredictPreflightError(\n\t\t\t\t'past-cutoff',\n\t\t\t\t'this market no longer takes orders before its expiry',\n\t\t\t);\n\t\t}\n\t\treturn { policy, timing };\n\t}\n\n\t#preview(\n\t\tmarketId: string,\n\t\tkind: number,\n\t\ttiming: TimingPreview,\n\t\tpolicy: DelayedExecutionPolicy,\n\t\tbudget: bigint,\n\t\tcashNeedRaw: bigint,\n\t\tspareCashRaw: bigint,\n\t\tfunding: { needsFunding: boolean; fundedInTransaction: boolean },\n\t): QueuedOrderPreview {\n\t\tconst totalDebit = budget + policy.orderFee;\n\t\treturn {\n\t\t\tmarketId,\n\t\t\tkind,\n\t\t\tkindName: orderKindName(kind),\n\t\t\ttiming,\n\t\t\torderFee: rawToUsdc(policy.orderFee),\n\t\t\tbudget: rawToUsdc(budget),\n\t\t\ttotalDebit: rawToUsdc(totalDebit),\n\t\t\tcashNeedRaw,\n\t\t\tspareCashRaw,\n\t\t\t...funding,\n\t\t\traw: { orderFee: policy.orderFee, budget, totalDebit },\n\t\t};\n\t}\n\n\t// Shared by the three queued mints: resolve the market and ticks, build the enqueue (its static\n\t// checks run first), then one read for the preflight: queue gates, fee, budget, cash need.\n\tasync #planMint(\n\t\towner: string,\n\t\tm: MarketDescriptor,\n\t\torder: { kind: number; maxCostRaw: bigint; quantityRaw?: bigint; maxPremiumRaw?: bigint },\n\t\tbuild: (\n\t\t\torders: OrdersGeneratedConfig,\n\t\t\ttarget: {\n\t\t\t\texpiryMarketId: string;\n\t\t\t\twrapperId: string;\n\t\t\t\tlowerTick: bigint;\n\t\t\t\thigherTick: bigint;\n\t\t\t} & MarketFeeds,\n\t\t) => (tx: Transaction) => TransactionResult,\n\t): Promise<QueuedOrderPlan> {\n\t\tconst orders = this.#requireDelayedExecution();\n\t\tconst feeds = this.#feeds(m.underlying);\n\t\tconst { id, state: market } = await this.#resolveMarket(m);\n\t\tconst { lowerTick, higherTick } = await this.#strikeTicks(m, id, market);\n\t\tconst thunk = build(orders, {\n\t\t\texpiryMarketId: id,\n\t\t\twrapperId: this.wrapperIdFor(owner),\n\t\t\tlowerTick,\n\t\t\thigherTick,\n\t\t\t...feeds,\n\t\t});\n\t\tconst state = await this.#queueState(orders, id, { owner });\n\t\tconst { policy, timing } = this.#assertQueueOpen(state, 'mint', BigInt(Date.now()));\n\t\tconst { budget, cashNeed } = PredictClient.#assertMintOrder(state, policy, order);\n\t\t// The enqueue charges the desk's fee at execution, so hold it to the previewed one.\n\t\tconst tx = new Transaction();\n\t\ttx.add(assertOrderFeeAtMost(orders, policy.orderFee));\n\t\ttx.add(thunk);\n\t\treturn {\n\t\t\ttransaction: tx,\n\t\t\tpreview: this.#preview(id, order.kind, timing, policy, budget, cashNeed, state.spareCash, {\n\t\t\t\tneedsFunding: false,\n\t\t\t\tfundedInTransaction: false,\n\t\t\t}),\n\t\t};\n\t}\n\n\t// A mint's own checks after the queue gates, shared by the mint builders and `read.planMint`:\n\t// the order fee, the escrowed budget against the minimum premium, and the market's cash.\n\tstatic #assertMintOrder(\n\t\tstate: MarketQueueState,\n\t\tpolicy: DelayedExecutionPolicy,\n\t\torder: { kind: number; maxCostRaw: bigint; quantityRaw?: bigint; maxPremiumRaw?: bigint },\n\t): { budget: bigint; cashNeed: bigint } {\n\t\tconst available = state.account?.availableRaw ?? 0n;\n\t\tconst budget = mintBudget({\n\t\t\tkind: order.kind,\n\t\t\tmaxCostRaw: order.maxCostRaw,\n\t\t\tavailableRaw: available,\n\t\t\torderFeeRaw: policy.orderFee,\n\t\t\tquantityRaw: order.quantityRaw,\n\t\t});\n\t\tif (budget == null) {\n\t\t\tthrow new PredictPreflightError(\n\t\t\t\t'fee',\n\t\t\t\t`the balance (${rawToUsdc(available)}) doesn't cover the ${rawToUsdc(policy.orderFee)} order fee`,\n\t\t\t);\n\t\t}\n\t\tif (budget < MIN_PREMIUM) {\n\t\t\tthrow new PredictPreflightError(\n\t\t\t\t'min-premium',\n\t\t\t\t`the escrowed budget ${rawToUsdc(budget)} is below the ${rawToUsdc(MIN_PREMIUM)} minimum premium`,\n\t\t\t);\n\t\t}\n\t\tif (order.kind !== ORDER_KIND.EXACT_QUANTITY && state.minEntryProbability === 0n) {\n\t\t\tthrow new PredictPreflightError('market-cash', 'this market takes no budget mints');\n\t\t}\n\t\tconst cashNeed = mintCashNeed({\n\t\t\tkind: order.kind,\n\t\t\tbudgetRaw: budget,\n\t\t\tminEntryProbability: state.minEntryProbability,\n\t\t\tquantityRaw: order.quantityRaw,\n\t\t\tmaxPremiumRaw: order.maxPremiumRaw,\n\t\t});\n\t\tif (cashNeed > state.spareCash) {\n\t\t\tthrow new PredictPreflightError(\n\t\t\t\t'market-cash',\n\t\t\t\t\"this market can't take an order this size right now\",\n\t\t\t);\n\t\t}\n\t\treturn { budget, cashNeed };\n\t}\n\n\t// The record a sell names is Open. The chain can't even quote one that isn't (`ERecordNotOpen`).\n\tstatic #assertRecordOpen(state: MarketQueueState, recordId: bigint): QueuedOrder {\n\t\tconst record = state.records[0];\n\t\tif (!record || record.status !== ORDER_STATUS.OPEN || record.position.order_id === 0n) {\n\t\t\tthrow new PredictPreflightError(\n\t\t\t\t'record-not-open',\n\t\t\t\t`record ${recordId} isn't an Open position`,\n\t\t\t);\n\t\t}\n\t\treturn record;\n\t}\n\n\t// The quantity an Open record holds, refusing a sell of more than that.\n\t#assertSellQuantity(record: QueuedOrder, closeQuantityRaw: bigint): bigint {\n\t\tconst held = decodeOrderRange(\n\t\t\trecord.position.order_id,\n\t\t\tBigInt(this.cfg.units.positionLotSize),\n\t\t).quantity;\n\t\tif (closeQuantityRaw > held) {\n\t\t\tthrow new PredictInputError(\n\t\t\t\t`quantity ${rawToUsdc(closeQuantityRaw)} is above the record's ${rawToUsdc(held)}`,\n\t\t\t);\n\t\t}\n\t\treturn held;\n\t}\n\n\t// A sell's own checks after the queue gates, shared by `tx.enqueueSell` and `read.planSell`: the\n\t// record is Open and the owner's, the order fee, the record's quantity and the minimum sell. A\n\t// sell is never refused for market cash.\n\t#assertSellOrder(\n\t\tstate: MarketQueueState,\n\t\tpolicy: DelayedExecutionPolicy,\n\t\trecordId: bigint,\n\t\tcloseQuantityRaw: bigint,\n\t): void {\n\t\tconst record = PredictClient.#assertRecordOpen(state, recordId);\n\t\tif (\n\t\t\t!state.account ||\n\t\t\tnormalizeSuiAddress(record.account_id) !== normalizeSuiAddress(state.account.accountId)\n\t\t) {\n\t\t\tthrow new PredictPreflightError(\n\t\t\t\t'not-record-owner',\n\t\t\t\t`record ${recordId} belongs to another account`,\n\t\t\t);\n\t\t}\n\t\tif (!feeCovered('sell', state.account.availableRaw, policy.orderFee)) {\n\t\t\tthrow new PredictPreflightError(\n\t\t\t\t'fee',\n\t\t\t\t`the balance doesn't cover the ${rawToUsdc(policy.orderFee)} order fee`,\n\t\t\t);\n\t\t}\n\t\tconst held = this.#assertSellQuantity(record, closeQuantityRaw);\n\t\tconst min = policy.minSellQuantity;\n\t\tif (closeQuantityRaw < min || (closeQuantityRaw < held && held - closeQuantityRaw < min)) {\n\t\t\tthrow new PredictPreflightError(\n\t\t\t\t'below-min-sell',\n\t\t\t\t`a sell must close at least ${rawToUsdc(min)} and leave either nothing or at least that much`,\n\t\t\t);\n\t\t}\n\t}\n\n\tasync #planSell(\n\t\towner: string,\n\t\tm: MarketCoordinates,\n\t\topts: EnqueueSellOptions,\n\t): Promise<QueuedOrderPlan> {\n\t\tconst orders = this.#requireDelayedExecution();\n\t\tconst feeds = this.#feeds(m.underlying);\n\t\tconst { id } = await this.#resolveMarket(m);\n\t\tconst closeQuantityRaw = usdcToRaw(opts.quantity);\n\t\tthis.#assertLot(closeQuantityRaw);\n\t\tconst thunk = enqueueRedeemOpen(orders, {\n\t\t\texpiryMarketId: id,\n\t\t\twrapperId: this.wrapperIdFor(owner),\n\t\t\trecordId: opts.recordId,\n\t\t\tcloseQuantityRaw,\n\t\t\tminProbabilityRaw: probabilityToRaw(opts.minProbability),\n\t\t\tminProceedsRaw: usdcToRaw(opts.minProceeds),\n\t\t\t...feeds,\n\t\t});\n\t\tconst state = await this.#queueState(orders, id, { owner, recordIds: [opts.recordId] });\n\t\tconst { policy, timing } = this.#assertQueueOpen(state, 'sell', BigInt(Date.now()));\n\t\tthis.#assertSellOrder(state, policy, opts.recordId, closeQuantityRaw);\n\t\tconst cashNeed = cashNeedSell(closeQuantityRaw, state.backingBufferLambda);\n\t\tconst needsFunding = cashNeed > state.spareCash;\n\t\tconst fund = opts.fundMarket ?? 'auto';\n\t\tconst funded = fund === 'always' || (fund === 'auto' && needsFunding);\n\t\tconst tx = new Transaction();\n\t\t// The enqueue charges the desk's fee at execution, so hold it to the previewed one.\n\t\ttx.add(assertOrderFeeAtMost(orders, policy.orderFee));\n\t\ttx.add(thunk);\n\t\t// After the enqueue: its cash need is then in `waiting_cash_need`, which the rebalance funds.\n\t\tif (funded) tx.add(rebalanceExpiryCash(this.#config, { expiryMarketId: id }));\n\t\treturn {\n\t\t\ttransaction: tx,\n\t\t\tpreview: this.#preview(\n\t\t\t\tid,\n\t\t\t\tORDER_KIND.REDEEM_OPEN,\n\t\t\t\ttiming,\n\t\t\t\tpolicy,\n\t\t\t\t0n,\n\t\t\t\tcashNeed,\n\t\t\t\tstate.spareCash,\n\t\t\t\t{\n\t\t\t\t\tneedsFunding,\n\t\t\t\t\tfundedInTransaction: funded,\n\t\t\t\t},\n\t\t\t),\n\t\t};\n\t}\n\n\t// A chain mint quote as a queued-fill preview: the congestion penalty comes out of the cost\n\t// (a queued fill pays none) and the order fee is reported separately.\n\tstatic #queuedMintQuote(q: MintQuoteRaw, policy: DelayedExecutionPolicy | null): MintQuote {\n\t\tconst costRaw = q.allInCost - q.penaltyFee;\n\t\treturn {\n\t\t\tentryProbability: rawToProbability(q.entryProbability),\n\t\t\tpremium: rawToUsdc(q.premium),\n\t\t\tfees: {\n\t\t\t\ttrading: rawToUsdc(q.tradingFee),\n\t\t\t\tsubsidy: rawToUsdc(q.feeIncentiveSubsidy),\n\t\t\t\tbuilder: rawToUsdc(q.builderFee),\n\t\t\t\tpenalty: 0,\n\t\t\t\t// The chain quote doesn't split it out. It is part of `trading`, never extra.\n\t\t\t\treferral: 0,\n\t\t\t\tinventoryImpact: rawToUsdc(q.inventoryImpactCharge),\n\t\t\t},\n\t\t\tcost: rawToUsdc(costRaw),\n\t\t\tquantity: rawToUsdc(q.quantity),\n\t\t\traw: {\n\t\t\t\tpremium: q.premium,\n\t\t\t\tcost: costRaw,\n\t\t\t\tquantity: q.quantity,\n\t\t\t\tentryProbability: q.entryProbability,\n\t\t\t},\n\t\t\tfeesExact: true,\n\t\t\tqueued: true,\n\t\t\torderFee: policy ? rawToUsdc(policy.orderFee) : undefined,\n\t\t};\n\t}\n\n\t// === tx builders ===\n\t// Each returns a ready-to-sign Transaction. Market-resolving builders are async.\n\treadonly tx = {\n\t\tcreateManager: (): Transaction => txOf(accountContract(this.cfg).createAccount()),\n\n\t\t// `create: true` composes first-time funding into ONE PTB: create the account\n\t\t// wrapper, deposit into it through the fresh handle, and `share` it LAST (once\n\t\t// shared, by-value use of the handle is over). The wrapper is derived from the\n\t\t// transaction SENDER (`account_registry::new` takes no owner), so `owner` MUST\n\t\t// be the address that signs this transaction — a sponsored/backend signer would\n\t\t// silently fund its own fresh account instead. The caller also asserts the\n\t\t// account does not exist yet: `new` ABORTS at the deterministic address if it\n\t\t// already exists — no chain read is done here. Gate on your own existence check\n\t\t// (`wrapperIdFor(owner)` + a getObject), or retry without the flag on that abort.\n\t\t//\n\t\t// Without `create`, the sourced coin goes into the existing account's stored\n\t\t// balance via the PTB-callable `deposit_funds` (folds settle → authorize → load →\n\t\t// deposit; clock auto-injected). Command order is auth → deposit (auth is a hot\n\t\t// potato consumed by the deposit). See\n\t\t// `packages/account/sources/account.move` (`deposit_funds`).\n\t\tdeposit: (\n\t\t\towner: string,\n\t\t\tamountUsdc: number | string,\n\t\t\topts?: { create?: boolean },\n\t\t): Transaction => {\n\t\t\tconst tx = new Transaction();\n\t\t\tconst coin = tx.add(\n\t\t\t\tcoinWithBalance({\n\t\t\t\t\ttype: this.cfg.quoteCoinType,\n\t\t\t\t\tbalance: usdcToRaw(amountUsdc),\n\t\t\t\t\tuseGasCoin: false,\n\t\t\t\t}),\n\t\t\t);\n\t\t\tif (opts?.create) {\n\t\t\t\ttx.add(\n\t\t\t\t\taccountContract(this.cfg).createAccountAndDeposit({\n\t\t\t\t\t\tcoin,\n\t\t\t\t\t\tcoinType: this.cfg.quoteCoinType,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\ttx.add(\n\t\t\t\t\tdepositFunds({\n\t\t\t\t\t\tconfig: this.#config,\n\t\t\t\t\t\targuments: { wrapper: this.wrapperIdFor(owner), coin },\n\t\t\t\t\t\ttypeArguments: [this.cfg.quoteCoinType],\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn tx;\n\t\t},\n\n\t\t// Withdraw `amountUsdc` from the account back to `owner`. By default the funds land\n\t\t// in the owner's USDC *address balance* (the versionless accumulator) via\n\t\t// `0x2::coin::send_funds` — no coin-object churn, and they merge into the same\n\t\t// balance `deposit` draws from, closing the loop. Pass `{ toCoinObject: true }` to\n\t\t// instead receive a discrete `Coin<T>` object (for wallets/explorers that only\n\t\t// render coin objects, or to compose the coin further in your own PTB). Either way\n\t\t// the underlying `withdraw_funds` returns the raw `Coin<T>` — the PTB-callable form\n\t\t// that folds settle → authorize → load → withdraw (clock auto-injected, `ctx`\n\t\t// implicit); command order is auth → withdraw. See\n\t\t// `packages/account/sources/account.move` (`withdraw_funds`).\n\t\twithdraw: (\n\t\t\towner: string,\n\t\t\tamountUsdc: number | string,\n\t\t\topts?: { toCoinObject?: boolean },\n\t\t): Transaction => {\n\t\t\tconst tx = new Transaction();\n\t\t\tconst coin = tx.add(\n\t\t\t\twithdrawFunds({\n\t\t\t\t\tconfig: this.#config,\n\t\t\t\t\targuments: { wrapper: this.wrapperIdFor(owner), amount: usdcToRaw(amountUsdc) },\n\t\t\t\t\ttypeArguments: [this.cfg.quoteCoinType],\n\t\t\t\t}),\n\t\t\t);\n\t\t\tif (opts?.toCoinObject) {\n\t\t\t\ttx.transferObjects([coin], owner);\n\t\t\t} else {\n\t\t\t\ttx.moveCall({\n\t\t\t\t\ttarget: '0x2::coin::send_funds',\n\t\t\t\t\ttypeArguments: [this.cfg.quoteCoinType],\n\t\t\t\t\targuments: [coin, tx.pure.address(owner)],\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn tx;\n\t\t},\n\n\t\t/**\n\t\t * Immediate exact-quantity mint (`mint_exact_quantity`).\n\t\t * @deprecated Retired by delayed execution (DBU-885): Predict v4 always aborts it\n\t\t * (`EDelayedExecutionRequired`), so it works only while the config calls a pre-v4 package.\n\t\t * Use {@link PredictClient.tx.enqueueMint}, and `read.executionMode()` to know which path a\n\t\t * network is on.\n\t\t */\n\t\tmint: (owner: string, m: MarketDescriptor, opts: MintOptions): Promise<Transaction> =>\n\t\t\tthis.#buildMint(owner, m, opts),\n\n\t\t/**\n\t\t * V2 all-in budget mint; use minQuantity to protect the fill against slippage.\n\t\t * @deprecated Retired by delayed execution (DBU-885): Predict v4 always aborts it\n\t\t * (`EDelayedExecutionRequired`). Use `tx.enqueueMintCost`.\n\t\t */\n\t\tmintCost: (owner: string, m: MarketDescriptor, opts: MintCostOptions): Promise<Transaction> =>\n\t\t\tthis.#buildMintCost(owner, m, opts),\n\n\t\t/**\n\t\t * Immediate premium-budget mint (`mint_exact_amount`).\n\t\t * @deprecated Retired by delayed execution (DBU-885): Predict v4 always aborts it\n\t\t * (`EDelayedExecutionRequired`). Use `tx.enqueueMintAmount`.\n\t\t */\n\t\tmintAmount: async (\n\t\t\towner: string,\n\t\t\tm: MarketDescriptor,\n\t\t\topts: MintAmountOptions,\n\t\t): Promise<Transaction> => {\n\t\t\tconst feeds = this.#feeds(m.underlying);\n\t\t\t// The chain requires a positive all-in cost cap (EMintCostCapRequired);\n\t\t\t// reject a zero cap pre-flight rather than surface a cryptic Move abort.\n\t\t\tif (opts.maxCost != null && opts.maxCost <= 0) {\n\t\t\t\tthrow new PredictInputError('maxCost must be > 0');\n\t\t\t}\n\t\t\tconst { id, state } = await this.#resolveMarket(m);\n\t\t\t// No lot check: min_quantity is a floor the chain compares against an\n\t\t\t// already-lot-floored minted quantity, so any floor value is legal.\n\t\t\tconst minQuantityRaw = usdcToRaw(opts.minQuantity);\n\t\t\tconst { lowerTick, higherTick } = await this.#strikeTicks(m, id, state);\n\t\t\treturn txOf(\n\t\t\t\tmintExactAmount(this.#config, {\n\t\t\t\t\texpiryMarketId: id,\n\t\t\t\t\twrapperId: this.wrapperIdFor(owner),\n\t\t\t\t\tlowerTick,\n\t\t\t\t\thigherTick,\n\t\t\t\t\tmaxPremiumRaw: usdcToRaw(opts.spend),\n\t\t\t\t\tminQuantityRaw,\n\t\t\t\t\tmaxCostRaw: opts.maxCost != null ? usdcToRaw(opts.maxCost) : undefined,\n\t\t\t\t\t...feeds,\n\t\t\t\t}),\n\t\t\t);\n\t\t},\n\n\t\t/**\n\t\t * Immediate close of an account position (`redeem_live`).\n\t\t * @deprecated Retired by delayed execution (DBU-885): Predict v4 always aborts it\n\t\t * (`EDelayedExecutionRequired`). A position held in the account then has no early exit and\n\t\t * is paid at settlement with `claimSettled`. Queued fills are Open records in the market's\n\t\t * queue, sold with `tx.enqueueSell`.\n\t\t */\n\t\tredeem: (owner: string, m: MarketDescriptor, opts: CloseOptions): Promise<Transaction> =>\n\t\t\tthis.#buildRedeem(owner, m, opts),\n\n\t\t/**\n\t\t * Pay a settled position held in the ACCOUNT (`redeem_settled`), in full. Unchanged by delayed\n\t\t * execution, for positions minted before it. It doesn't pay Open queue records: the queue's\n\t\t * settlement walk (`settle_step`) pays those to the account's wrapper address.\n\t\t */\n\t\tclaimSettled: async (\n\t\t\towner: string,\n\t\t\tm: Pick<MarketDescriptor, 'underlying' | 'expiryMs' | 'marketId'>,\n\t\t\topts: Pick<CloseOptions, 'orderId'>,\n\t\t): Promise<Transaction> => {\n\t\t\tconst { id } = await this.#resolveMarket(m);\n\t\t\treturn txOf(\n\t\t\t\tredeemSettled(this.#config, {\n\t\t\t\t\texpiryMarketId: id,\n\t\t\t\t\twrapperId: this.wrapperIdFor(owner),\n\t\t\t\t\torderId: opts.orderId,\n\t\t\t\t}),\n\t\t\t);\n\t\t},\n\n\t\t// --- delayed execution (DBU-885) ---\n\t\t// Each queued-order builder reads the market once and refuses, with a typed\n\t\t// PredictPreflightError, an order the queue or protocol gates would abort, so a refused order\n\t\t// never fails a larger transaction. The order's own limits at the current price are checked\n\t\t// only on chain. It returns the transaction and a display preview. Every builder throws\n\t\t// PredictInputError while the network's config doesn't record delayed execution.\n\n\t\t/**\n\t\t * Queue a mint of an exact payout quantity, filled at Pyth's price for its τ. Escrows\n\t\t * `min(maxCost, quantity, available − fee)` plus the order fee. `maxCost` and\n\t\t * `maxProbability` are required caps (see `queue.slippageBand`). Size against\n\t\t * `read.queue(...).maxMint`. The record ID is in the enqueue's `OrderEnqueued`\n\t\t * (`decode.enqueue`).\n\t\t */\n\t\tenqueueMint: async (\n\t\t\towner: string,\n\t\t\tm: MarketDescriptor,\n\t\t\topts: EnqueueMintOptions,\n\t\t): Promise<QueuedOrderPlan> => {\n\t\t\tconst quantityRaw = usdcToRaw(opts.quantity);\n\t\t\tthis.#assertLot(quantityRaw);\n\t\t\tconst maxCostRaw = usdcToRaw(opts.maxCost);\n\t\t\tconst maxProbabilityRaw = probabilityToRaw(opts.maxProbability);\n\t\t\treturn this.#planMint(\n\t\t\t\towner,\n\t\t\t\tm,\n\t\t\t\t{ kind: ORDER_KIND.EXACT_QUANTITY, maxCostRaw, quantityRaw },\n\t\t\t\t(orders, target) =>\n\t\t\t\t\tenqueueExactQuantity(orders, {\n\t\t\t\t\t\t...target,\n\t\t\t\t\t\tquantityRaw,\n\t\t\t\t\t\tmaxCostRaw,\n\t\t\t\t\t\tmaxProbabilityRaw,\n\t\t\t\t\t}),\n\t\t\t);\n\t\t},\n\n\t\t/**\n\t\t * Queue a premium-budget mint: sized at τ under `spend`, at least `minQuantity`, with the\n\t\t * all-in debit capped by the required `maxCost`.\n\t\t */\n\t\tenqueueMintAmount: async (\n\t\t\towner: string,\n\t\t\tm: MarketDescriptor,\n\t\t\topts: EnqueueMintAmountOptions,\n\t\t): Promise<QueuedOrderPlan> => {\n\t\t\tconst maxPremiumRaw = usdcToRaw(opts.spend);\n\t\t\tconst minQuantityRaw = usdcToRaw(opts.minQuantity);\n\t\t\tconst maxCostRaw = usdcToRaw(opts.maxCost);\n\t\t\t// The fill buys at most `spend` of premium, so a spend below the minimum premium fails\n\t\t\t// the chain's placement dry run whatever the budget. Refused before any read.\n\t\t\tif (maxPremiumRaw < MIN_PREMIUM) {\n\t\t\t\tthrow new PredictPreflightError(\n\t\t\t\t\t'min-premium',\n\t\t\t\t\t`spend ${rawToUsdc(maxPremiumRaw)} is below the ${rawToUsdc(MIN_PREMIUM)} minimum premium`,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn this.#planMint(\n\t\t\t\towner,\n\t\t\t\tm,\n\t\t\t\t{ kind: ORDER_KIND.EXACT_AMOUNT, maxCostRaw, maxPremiumRaw },\n\t\t\t\t(orders, target) =>\n\t\t\t\t\tenqueueExactAmount(orders, {\n\t\t\t\t\t\t...target,\n\t\t\t\t\t\tmaxPremiumRaw,\n\t\t\t\t\t\tminQuantityRaw,\n\t\t\t\t\t\tmaxCostRaw,\n\t\t\t\t\t}),\n\t\t\t);\n\t\t},\n\n\t\t/**\n\t\t * Queue an all-in-budget mint (the default mint): sized at τ so the all-in cost fits\n\t\t * `spend`, at least `minQuantity`. Escrows `min(spend, available − fee)` plus the order fee.\n\t\t */\n\t\tenqueueMintCost: async (\n\t\t\towner: string,\n\t\t\tm: MarketDescriptor,\n\t\t\topts: EnqueueMintCostOptions,\n\t\t): Promise<QueuedOrderPlan> => {\n\t\t\tconst maxCostRaw = usdcToRaw(opts.spend);\n\t\t\tconst minQuantityRaw = usdcToRaw(opts.minQuantity);\n\t\t\treturn this.#planMint(\n\t\t\t\towner,\n\t\t\t\tm,\n\t\t\t\t{ kind: ORDER_KIND.EXACT_COST, maxCostRaw },\n\t\t\t\t(orders, target) => enqueueExactCost(orders, { ...target, maxCostRaw, minQuantityRaw }),\n\t\t\t);\n\t\t},\n\n\t\t/**\n\t\t * Queue an early sell of an Open record (`enqueue_redeem_open`), the only early sell in v4.\n\t\t * The record must be Open and the owner's. Sells are never refused for market cash: when the\n\t\t * sell's cash need is above spare cash the preview sets `needsFunding`, and by default the\n\t\t * builder adds `rebalance_expiry_cash` after the enqueue (see `fundMarket`). A sell the market\n\t\t * still can't cover at the fill is refunded in full (reason 8) and the position returns to an\n\t\t * Open record.\n\t\t */\n\t\tenqueueSell: (\n\t\t\towner: string,\n\t\t\tm: MarketCoordinates,\n\t\t\topts: EnqueueSellOptions,\n\t\t): Promise<QueuedOrderPlan> => this.#planSell(owner, m, opts),\n\n\t\t/**\n\t\t * Queue the order a `read.planMint` or `read.planSell` plan describes, with its limits:\n\t\t * `enqueueMintCost`, `enqueueMint` or `enqueueSell`, by `plan.order.builder`. Pass the\n\t\t * market the plan was made for: the descriptor a mint plan was planned with, or the\n\t\t * coordinates `read.planSell` took for a sell plan. Throws the plan's `refusal` as a\n\t\t * `PredictPreflightError`, and `'fee'` when the balance now escrows less than the plan's\n\t\t * budget.\n\t\t */\n\t\tenqueuePlan: async <P extends MintPlan | SellPlan>(\n\t\t\towner: string,\n\t\t\tm: P extends SellPlan ? MarketCoordinates : MarketDescriptor,\n\t\t\tplan: P,\n\t\t): Promise<QueuedOrderPlan> => {\n\t\t\t// A plan that reported a refusal is refused the same way, so the two never disagree.\n\t\t\t// Plan again once the reason clears.\n\t\t\tif (plan.refusal != null) {\n\t\t\t\tthrow new PredictPreflightError(plan.refusal, `the plan was refused (${plan.refusal})`);\n\t\t\t}\n\t\t\t// A plan's limits fit one order. Queued for another owner, market, strike or record, they\n\t\t\t// would buy or sell a different contract, so plan that order instead.\n\t\t\tconst target = plan.target;\n\t\t\tconst { id, state: marketState } = await this.#resolveMarket(m);\n\t\t\tif (normalizeSuiAddress(owner) !== normalizeSuiAddress(target.owner)) {\n\t\t\t\tthrow new PredictInputError(`the plan was made for owner ${target.owner}, not ${owner}`);\n\t\t\t}\n\t\t\tif (normalizeSuiAddress(id) !== normalizeSuiAddress(target.expiryMarketId)) {\n\t\t\t\tthrow new PredictInputError(\n\t\t\t\t\t`the plan was made for market ${target.expiryMarketId}, not ${id}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst order = plan.order;\n\t\t\t// A mint needs the descriptor's strike and side. A plan typed only as\n\t\t\t// `MintPlan | SellPlan` can pass bare coordinates, so check.\n\t\t\tconst descriptor = 'side' in m ? (m as MarketDescriptor) : null;\n\t\t\tlet placed: QueuedOrderPlan;\n\t\t\tif (order.builder === 'enqueueSell') {\n\t\t\t\tif (order.options.recordId !== target.recordId) {\n\t\t\t\t\tthrow new PredictInputError(\n\t\t\t\t\t\t`the plan was made for record ${target.recordId}, not ${order.options.recordId}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tplaced = await this.tx.enqueueSell(owner, m, order.options);\n\t\t\t} else {\n\t\t\t\tif (descriptor == null) {\n\t\t\t\t\tthrow new PredictInputError(\n\t\t\t\t\t\t'a mint plan needs the market descriptor it was planned with (its strike and side)',\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst { lowerTick, higherTick } = await this.#strikeTicks(descriptor, id, marketState);\n\t\t\t\tif (lowerTick !== target.lowerTick || higherTick !== target.higherTick) {\n\t\t\t\t\tthrow new PredictInputError(\n\t\t\t\t\t\t'the market descriptor names a different strike or side than the plan, or its reference strike moved: plan again',\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tplaced =\n\t\t\t\t\torder.builder === 'enqueueMintCost'\n\t\t\t\t\t\t? await this.tx.enqueueMintCost(owner, descriptor, order.options)\n\t\t\t\t\t\t: await this.tx.enqueueMint(owner, descriptor, order.options);\n\t\t\t}\n\t\t\t// The plan's debit, and a sell's net, assume the order fee it was quoted with. The builders\n\t\t\t// read the desk's fee again, and no order argument bounds it on chain, so refuse a fee\n\t\t\t// that rose since the plan.\n\t\t\tif (placed.preview.raw.orderFee > plan.raw.orderFee) {\n\t\t\t\tthrow new PredictInputError(\n\t\t\t\t\t`the order fee rose from ${rawToUsdc(plan.raw.orderFee)} to ${placed.preview.orderFee} since the plan: plan again`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (order.builder === 'enqueueSell') return placed;\n\t\t\t// The limits assume the plan's whole budget. The builders escrow less when the balance\n\t\t\t// fell since the plan, so refuse that instead.\n\t\t\tconst planned = (plan as MintPlan).raw.budget;\n\t\t\tif (placed.preview.raw.budget < planned) {\n\t\t\t\tthrow new PredictPreflightError(\n\t\t\t\t\t'fee',\n\t\t\t\t\t`the balance now escrows ${placed.preview.budget}, below the plan's ${rawToUsdc(planned)}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn placed;\n\t\t},\n\n\t\t/**\n\t\t * Refund this market's orders past their deadline. For the app's \"Refund my order\" button\n\t\t * only (`OrderView.canRequestRefund`), never prepended to other transactions: keepers\n\t\t * refund on their own. Needs no account, session or Pyth key, and works during a freeze.\n\t\t * `maxOrders` (default 100) bounds the records visited.\n\t\t */\n\t\trefund: async (\n\t\t\tm: MarketCoordinates,\n\t\t\topts: { maxOrders?: number } = {},\n\t\t): Promise<Transaction> => {\n\t\t\tconst orders = this.#requireDelayedExecution();\n\t\t\tconst { id } = await this.#resolveMarket(m);\n\t\t\tconst queueId = await this.#existingQueueId(orders, id);\n\t\t\treturn txOf(\n\t\t\t\trefund(orders, {\n\t\t\t\t\texpiryMarketId: id,\n\t\t\t\t\tqueueId,\n\t\t\t\t\tmaxOrders: BigInt(opts.maxOrders ?? 100),\n\t\t\t\t}),\n\t\t\t);\n\t\t},\n\n\t\t/**\n\t\t * Send a finished record's parked funds to its receive address (`queue::claim_parked`): a\n\t\t * refund or change the address couldn't take while it was on USDC's deny list or USDC was\n\t\t * paused (`OrderView` `parkedRaw`). A skipped settlement payout isn't parked: pay it with\n\t\t * `payOpen`. Permissionless, and a no-op returning 0 while\n\t\t * the address is still denied. Needs no account, session or Pyth key.\n\t\t */\n\t\tclaimParked: async (m: MarketCoordinates, recordId: bigint): Promise<Transaction> => {\n\t\t\tconst orders = this.#requireDelayedExecution();\n\t\t\tconst { id } = await this.#resolveMarket(m);\n\t\t\tconst queueId = await this.#existingQueueId(orders, id);\n\t\t\treturn txOf(claimParked(orders, { expiryMarketId: id, queueId, recordId }));\n\t\t},\n\n\t\t/**\n\t\t * Pay a settled market's Open record that the payout walk skipped (`queue::pay_open`), for\n\t\t * example while its receive address was denied. Permissionless: the payout goes only to the\n\t\t * record's own receive address. Aborts `EMarketNotSettled` before settlement.\n\t\t */\n\t\tpayOpen: async (m: MarketCoordinates, recordId: bigint): Promise<Transaction> => {\n\t\t\tconst orders = this.#requireDelayedExecution();\n\t\t\tconst { id } = await this.#resolveMarket(m);\n\t\t\tconst queueId = await this.#existingQueueId(orders, id);\n\t\t\treturn txOf(payOpen(orders, { expiryMarketId: id, queueId, recordId }));\n\t\t},\n\n\t\t/**\n\t\t * The open filler: verify signed Pyth Lazer payloads, commit them to the market's waiting\n\t\t * cohorts, then resolve up to `maxOrders` (default 15) records. Reads the current Lazer\n\t\t * package from Lazer's `State` first (`lazerStateId`, or `config.oracle.pythLazerState`).\n\t\t */\n\t\tfill: async (\n\t\t\tm: MarketCoordinates,\n\t\t\topts: {\n\t\t\t\tpayloads: readonly Uint8Array[];\n\t\t\t\tmaxOrders?: number;\n\t\t\t\trefundOverdue?: boolean;\n\t\t\t\tlazerStateId?: string;\n\t\t\t},\n\t\t): Promise<Transaction> => {\n\t\t\tconst orders = this.#requireDelayedExecution();\n\t\t\tconst stateId = opts.lazerStateId ?? this.cfg.oracle?.pythLazerState;\n\t\t\tif (!stateId) {\n\t\t\t\tthrow new PredictInputError('fill needs the Pyth Lazer State: pass `lazerStateId`');\n\t\t\t}\n\t\t\tconst { id } = await this.#resolveMarket(m);\n\t\t\tconst queueId = await this.#existingQueueId(orders, id);\n\t\t\tconst lazer = await lazerPackages(this.#client, stateId);\n\t\t\treturn txOf(\n\t\t\t\tfill(orders, {\n\t\t\t\t\texpiryMarketId: id,\n\t\t\t\t\tqueueId,\n\t\t\t\t\tpayloads: opts.payloads,\n\t\t\t\t\tlazer,\n\t\t\t\t\tmaxOrders: BigInt(opts.maxOrders ?? 15),\n\t\t\t\t\trefundOverdue: opts.refundOverdue,\n\t\t\t\t}),\n\t\t\t);\n\t\t},\n\n\t\t// Queue a supply request pulling `amountUsdc` from the account's existing custody\n\t\t// balance. `request_supply` auto-settles USDC then `account.withdraw`s the payment\n\t\t// into queue escrow; the PLP fill is delivered at the next flush, not returned here.\n\t\t// Command order is auth → request (auth is a hot potato consumed by this call). The\n\t\t// `minPlpOut` slot is the per-request floor on PLP minted at flush — `options.minPlpOut`\n\t\t// when given, otherwise 0 (no floor). At the shipped attempt count of one, the first\n\t\t// flush whose mark quotes less cancels and refunds the request; three is the\n\t\t// configurable maximum, not the default.\n\t\tsupplyPlp: (\n\t\t\towner: string,\n\t\t\tamountUsdc: number | string,\n\t\t\toptions: PlpSupplyOptions = {},\n\t\t): Transaction =>\n\t\t\ttxOf(\n\t\t\t\trequestSupply({\n\t\t\t\t\tconfig: this.#config,\n\t\t\t\t\targuments: {\n\t\t\t\t\t\twrapper: this.wrapperIdFor(owner),\n\t\t\t\t\t\tamount: usdcToRaw(amountUsdc),\n\t\t\t\t\t\tminPlpOut: options.minPlpOut ?? 0n,\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t),\n\n\t\t// Queue a withdraw request pulling `shares` (raw PLP u64) from account custody into\n\t\t// queue escrow — the Move parameter is named `amount`, but on `request_withdraw` it\n\t\t// counts PLP SHARES, not USDC. Auto-settles flush-delivered PLP first; the USDC\n\t\t// fill lands on the account at the next flush (no `withdraw_settled` entrypoint).\n\t\t// Command order is auth → request. The `minUsdcOut` slot is the per-request floor\n\t\t// on USDC paid at flush — `options.minUsdcOut` when given, otherwise 0 (no floor).\n\t\t// At the shipped attempt count of one, the first flush whose mark quotes less\n\t\t// cancels and refunds the request; three is the configurable maximum, not the\n\t\t// default.\n\t\twithdrawPlp: (owner: string, shares: bigint, options: PlpWithdrawOptions = {}): Transaction =>\n\t\t\ttxOf(\n\t\t\t\trequestWithdraw({\n\t\t\t\t\tconfig: this.#config,\n\t\t\t\t\targuments: {\n\t\t\t\t\t\twrapper: this.wrapperIdFor(owner),\n\t\t\t\t\t\tamount: shares,\n\t\t\t\t\t\tminUsdcOut: options.minUsdcOut === undefined ? 0n : usdcToRaw(options.minUsdcOut),\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t),\n\n\t\t// Cancel a still-pending supply request by queue `index`, refunding its escrowed\n\t\t// USDC straight back into the requesting account. Command order is auth → cancel.\n\t\tcancelSupplyPlp: (owner: string, index: bigint): Transaction =>\n\t\t\ttxOf(\n\t\t\t\tcancelSupplyRequest({\n\t\t\t\t\tconfig: this.#config,\n\t\t\t\t\targuments: { wrapper: this.wrapperIdFor(owner), index },\n\t\t\t\t}),\n\t\t\t),\n\n\t\t// Cancel a still-pending withdraw request by queue `index`, refunding its escrowed\n\t\t// PLP straight back into the requesting account. Command order is auth → cancel.\n\t\tcancelWithdrawPlp: (owner: string, index: bigint): Transaction =>\n\t\t\ttxOf(\n\t\t\t\tcancelWithdrawRequest({\n\t\t\t\t\tconfig: this.#config,\n\t\t\t\t\targuments: { wrapper: this.wrapperIdFor(owner), index },\n\t\t\t\t}),\n\t\t\t),\n\n\t\t// Set the account's sticky builder-code attribution to `builderCodeId`, an existing\n\t\t// `BuilderCode` object borrowed as `&BuilderCode`. Command order is auth → set (auth\n\t\t// is a hot potato consumed by this call). Lives in the PREDICT package's\n\t\t// `predict_account` module, NOT the account package. Deployed sig\n\t\t// `packages/predict/sources/predict_account.move:134` — 3 moveCall args\n\t\t// (wrapper, auth, code; ctx implicit).\n\t\tsetBuilderCode: (owner: string, builderCodeId: string): Transaction =>\n\t\t\ttxOf(\n\t\t\t\tsetBuilderCode({\n\t\t\t\t\tconfig: this.#config,\n\t\t\t\t\targuments: { wrapper: this.wrapperIdFor(owner), code: builderCodeId },\n\t\t\t\t}),\n\t\t\t),\n\n\t\t// Clear the account's sticky builder-code attribution. Command order is auth → unset.\n\t\t// Deployed sig `.../predict_account.move:151` — 2 moveCall args (wrapper, auth; ctx\n\t\t// implicit).\n\t\tunsetBuilderCode: (owner: string): Transaction =>\n\t\t\ttxOf(\n\t\t\t\tunsetBuilderCode({\n\t\t\t\t\tconfig: this.#config,\n\t\t\t\t\targuments: { wrapper: this.wrapperIdFor(owner) },\n\t\t\t\t}),\n\t\t\t),\n\t};\n\n\t// === reads ===\n\treadonly read = {\n\t\t// All tradeable (active) markets with the state a frontend needs to render\n\t\t// and mint: one chain read for ids + one batched PTB for the states.\n\t\tmarkets: async (): Promise<ActiveMarket[]> => {\n\t\t\tconst ids = await activeMarketIds(this.#client, this.#config);\n\t\t\tconst states = await marketStates(this.#client, this.#config, ids);\n\t\t\treturn ids.map((id, i) => ({\n\t\t\t\tid,\n\t\t\t\texpiryMs: states[i].expiryMs,\n\t\t\t\ttickSize: fromRaw(states[i].tickSizeRaw, 9),\n\t\t\t\tadmissionTickSize: fromRaw(states[i].admissionTickSizeRaw, 9),\n\t\t\t\tmintPaused: states[i].mintPaused,\n\t\t\t\treferencePrice: PredictClient.#referencePriceOf(states[i]),\n\t\t\t}));\n\t\t},\n\n\t\t// Validate an app-stored order id against the chain (stale after full\n\t\t// close or partial-close replacement — see RedeemReceipt.replacementOrderId).\n\t\thasPosition: (owner: string, marketId: string, orderId: bigint): Promise<boolean> =>\n\t\t\thasPosition(this.#client, this.#config, owner, marketId, orderId),\n\n\t\t// All open positions for an owner, enumerated from the chain (the\n\t\t// account's positions Table): 1 call per page warm, +2 resolution calls\n\t\t// once per owner. Returns [] for owners with no Predict account.\n\t\tpositions: async (owner: string): Promise<OpenPosition[]> => {\n\t\t\tlet handle = this.#positionsCache.get(owner);\n\t\t\tif (!handle?.positionsTableId) {\n\t\t\t\tconst resolved = await resolvePositionsTable(this.#client, this.#config, owner);\n\t\t\t\tif (!resolved) return []; // never onboarded — do not cache\n\t\t\t\tif (resolved.positionsTableId) this.#positionsCache.set(owner, resolved);\n\t\t\t\thandle = resolved;\n\t\t\t}\n\t\t\tif (!handle.positionsTableId) return [];\n\t\t\treturn positionsFromTable(this.#client, handle.positionsTableId);\n\t\t},\n\n\t\t// Anonymous board pricing: the chain's probability for both sides of a\n\t\t// strike, from one fresh pricer (no account needed). This is the ↑/↓\n\t\t// button price before a user has onboarded.\n\t\tprice: async (m: BinaryMarketCoordinates): Promise<{ up: number; down: number }> => {\n\t\t\tconst feeds = this.#feeds(m.underlying);\n\t\t\tconst { id, state } = await this.#resolveMarket(m);\n\t\t\tconst strikeRaw = await this.#strikeRawFor(m, id, state);\n\t\t\tconst { upRaw, downRaw } = await rangePrices(\n\t\t\t\tthis.#client,\n\t\t\t\tthis.#config,\n\t\t\t\tid,\n\t\t\t\tfeeds,\n\t\t\t\tstrikeRaw,\n\t\t\t\tstate.tickSizeRaw,\n\t\t\t);\n\t\t\treturn { up: rawToProbability(upRaw), down: rawToProbability(downRaw) };\n\t\t},\n\n\t\t// A client-side board pricer for one market: ONE simulate reads the chain's\n\t\t// resolved pricer (already forward-selected + rolled to now), then prices every\n\t\t// strike LOCALLY with no further chain calls — `pricer.up(strike)`,\n\t\t// `.down(strike)`, `.range(lo,hi)`, `.strikeAtProbability(p)`. Use this to paint a\n\t\t// whole board instantly; `read.price` / `read.quoteMint` stay the authoritative\n\t\t// per-strike quote at trade time. Throws the same typed stale-oracle/expired\n\t\t// PredictMoveError `read.price` would when the chain itself cannot quote.\n\t\tpricer: async (\n\t\t\tm: Pick<MarketDescriptor, 'underlying' | 'expiryMs'>,\n\t\t): Promise<BoardPricer & { asOf: PricerSnapshot['sources'] }> => {\n\t\t\tconst feeds = this.#feeds(m.underlying);\n\t\t\tconst { id } = await this.#resolveMarket(m);\n\t\t\tconst snap = await readPricerSnapshot(this.#client, this.#config, id, feeds);\n\t\t\treturn { ...boardPricer(snap), asOf: snap.sources };\n\t\t},\n\n\t\t/**\n\t\t * Exact pre-trade quote for an exact-quantity mint. Requires a funded account.\n\t\t *\n\t\t * Where the config records the delayed-execution upgrade (`packages.predictDelayedExecution`),\n\t\t * this reads Predict's own `quote_mint_for_account` (the immediate mint is retired there) and\n\t\t * the order desk's fee, and previews a QUEUED fill at the clock: `queued: true`, no\n\t\t * congestion penalty in `cost`, and the order fee in `orderFee`. The fill itself prices at\n\t\t * its committed Pyth tick. It throws `PredictInputError` when that config lacks the\n\t\t * order-flow package or its desk. Elsewhere it dry-runs the immediate mint and decodes its\n\t\t * receipt, as before.\n\t\t */\n\t\tquoteMint: async (\n\t\t\towner: string,\n\t\t\tm: MarketDescriptor,\n\t\t\topts: Pick<MintOptions, 'quantity'>,\n\t\t): Promise<MintQuote> => {\n\t\t\tif (this.cfg.packages.predictDelayedExecution) {\n\t\t\t\tconst orders = this.#requireDelayedExecution();\n\t\t\t\tconst feeds = this.#feeds(m.underlying);\n\t\t\t\tconst { id, state } = await this.#resolveMarket(m);\n\t\t\t\tconst quantityRaw = usdcToRaw(opts.quantity);\n\t\t\t\tthis.#assertLot(quantityRaw);\n\t\t\t\tconst { lowerTick, higherTick } = await this.#strikeTicks(m, id, state);\n\t\t\t\tconst { quote, policy } = await quoteMintForAccount(this.#client, this.#config, {\n\t\t\t\t\texpiryMarketId: id,\n\t\t\t\t\twrapperId: this.wrapperIdFor(owner),\n\t\t\t\t\tlowerTick,\n\t\t\t\t\thigherTick,\n\t\t\t\t\trequest: { shape: 'exact-quantity', quantityRaw },\n\t\t\t\t\tordersConfig: orders,\n\t\t\t\t\t...feeds,\n\t\t\t\t});\n\t\t\t\treturn PredictClient.#queuedMintQuote(quote, policy);\n\t\t\t}\n\t\t\tconst tx = await this.#buildMint(owner, m, opts);\n\t\t\treturn this.#quoteMintTransaction(owner, tx);\n\t\t},\n\n\t\t/**\n\t\t * Quote the all-in budget mint against current account and market state. Where the config\n\t\t * records the delayed-execution upgrade, it reads `quote_mint_exact_cost_for_account` at\n\t\t * `min(spend, available − fee)`, the budget enqueue escrows, and previews a queued fill as\n\t\t * `quoteMint` does (and throws as it does on a partial config). Elsewhere it simulates the\n\t\t * immediate v2 mint.\n\t\t */\n\t\tquoteMintCost: async (\n\t\t\towner: string,\n\t\t\tm: MarketDescriptor,\n\t\t\topts: MintCostOptions,\n\t\t): Promise<MintQuote> => {\n\t\t\tif (this.cfg.packages.predictDelayedExecution) {\n\t\t\t\tconst orders = this.#requireDelayedExecution();\n\t\t\t\tconst feeds = this.#feeds(m.underlying);\n\t\t\t\tconst { id, state } = await this.#resolveMarket(m);\n\t\t\t\tconst { lowerTick, higherTick } = await this.#strikeTicks(m, id, state);\n\t\t\t\tconst { policy, availableRaw } = await orderFeeAndBalance(\n\t\t\t\t\tthis.#client,\n\t\t\t\t\torders,\n\t\t\t\t\towner,\n\t\t\t\t\tthis.cfg.quoteCoinType,\n\t\t\t\t);\n\t\t\t\tconst fee = policy.orderFee;\n\t\t\t\tconst spendRaw = usdcToRaw(opts.spend);\n\t\t\t\tconst escrowable = availableRaw > fee ? availableRaw - fee : 0n;\n\t\t\t\tconst { quote } = await quoteMintForAccount(this.#client, this.#config, {\n\t\t\t\t\texpiryMarketId: id,\n\t\t\t\t\twrapperId: this.wrapperIdFor(owner),\n\t\t\t\t\tlowerTick,\n\t\t\t\t\thigherTick,\n\t\t\t\t\trequest: {\n\t\t\t\t\t\tshape: 'exact-cost',\n\t\t\t\t\t\tmaxCostRaw: spendRaw < escrowable ? spendRaw : escrowable,\n\t\t\t\t\t\tminQuantityRaw: usdcToRaw(opts.minQuantity),\n\t\t\t\t\t},\n\t\t\t\t\t...feeds,\n\t\t\t\t});\n\t\t\t\treturn PredictClient.#queuedMintQuote(quote, policy);\n\t\t\t}\n\t\t\treturn this.#quoteMintTransaction(owner, await this.#buildMintCost(owner, m, opts));\n\t\t},\n\n\t\t/**\n\t\t * Quote an early sell of an Open record (the queue's `quote_redeem_open`) at a fresh live\n\t\t * pricer. `proceeds` is before the order fee, with no congestion penalty, and `net` takes the\n\t\t * fee off. Throws `ERecordNotOpen` when the record isn't Open.\n\t\t */\n\t\tquoteSell: async (\n\t\t\towner: string,\n\t\t\tm: MarketCoordinates,\n\t\t\topts: { recordId: bigint; quantity: number },\n\t\t): Promise<SellQuote> => {\n\t\t\tconst orders = this.#requireDelayedExecution();\n\t\t\tconst feeds = this.#feeds(m.underlying);\n\t\t\tconst { id } = await this.#resolveMarket(m);\n\t\t\tconst closeQuantityRaw = usdcToRaw(opts.quantity);\n\t\t\tthis.#assertLot(closeQuantityRaw);\n\t\t\tconst queueId = await this.#existingQueueId(orders, id);\n\t\t\tconst { quote, policy } = await quoteRedeemOpen(this.#client, orders, {\n\t\t\t\texpiryMarketId: id,\n\t\t\t\tqueueId,\n\t\t\t\twrapperId: this.wrapperIdFor(owner),\n\t\t\t\trecordId: opts.recordId,\n\t\t\t\tcloseQuantityRaw,\n\t\t\t\t...feeds,\n\t\t\t});\n\t\t\tconst orderFee = policy.orderFee;\n\t\t\treturn {\n\t\t\t\tprobability: rawToProbability(quote.probability),\n\t\t\t\tproceeds: rawToUsdc(quote.proceeds),\n\t\t\t\tnet: rawToUsdc(quote.proceeds - orderFee),\n\t\t\t\tfees: {\n\t\t\t\t\ttrading: rawToUsdc(quote.tradingFee),\n\t\t\t\t\tbuilder: rawToUsdc(quote.builderFee),\n\t\t\t\t\tinventoryImpactRebate: rawToUsdc(quote.inventoryImpactRebate),\n\t\t\t\t\torder: rawToUsdc(orderFee),\n\t\t\t\t},\n\t\t\t\tquantityClosed: rawToUsdc(quote.closeQuantity),\n\t\t\t\traw: {\n\t\t\t\t\tprobability: quote.probability,\n\t\t\t\t\tproceeds: quote.proceeds,\n\t\t\t\t\torderFee,\n\t\t\t\t\tquantityClosed: quote.closeQuantity,\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\n\t\t/**\n\t\t * Which trade path the network is on, from `ProtocolConfig.version_watermark` and whether\n\t\t * this config records delayed execution (the Predict upgrade, the order-flow companion and\n\t\t * its desk). Flip the app between `mint*` and `enqueue*` on it, without a redeploy at the\n\t\t * watermark bump.\n\t\t */\n\t\texecutionMode: async (): Promise<ExecutionMode> =>\n\t\t\texecutionModeFor(\n\t\t\t\tawait versionWatermark(this.#client, this.cfg.objects.protocolConfig),\n\t\t\t\tthis.#recordsDelayedExecution(),\n\t\t\t\tthis.cfg.packages.predictDelayedExecution != null,\n\t\t\t\tthis.#predictCurrentVersion(),\n\t\t\t),\n\n\t\t/**\n\t\t * A market's queue in one read: cash, the stuck gate (\"pricing delayed\"), cohorts, counters\n\t\t * against capacity, the desk's policy, a τ/deadline/cutoff preview, and the largest mint\n\t\t * spare cash admits now. With `owner` (who must have an account), also the account's\n\t\t * waiting orders and balance. Throws `PredictPreflightError` `'no-queue'` while the market\n\t\t * has no `MarketQueue`.\n\t\t */\n\t\tqueue: async (m: MarketCoordinates, owner?: string): Promise<MarketQueueView> => {\n\t\t\tconst orders = this.#requireDelayedExecution();\n\t\t\tconst { id } = await this.#resolveMarket(m);\n\t\t\tconst state = await this.#queueState(orders, id, { owner });\n\t\t\tconst nowMs = BigInt(Date.now());\n\t\t\tconst policy = state.desk.policy;\n\t\t\tconst mode = executionModeFor(\n\t\t\t\tstate.protocol.versionWatermark,\n\t\t\t\ttrue,\n\t\t\t\ttrue,\n\t\t\t\tthis.#predictCurrentVersion(),\n\t\t\t);\n\t\t\tconst timing = previewTiming({\n\t\t\t\tnowMs,\n\t\t\t\tpolicy,\n\t\t\t\theads: state.heads,\n\t\t\t\texpiryMs: state.expiryMs,\n\t\t\t\tnoTradeWindowMs: state.protocol.noTradeWindowMs,\n\t\t\t});\n\t\t\t// The builders' own gate, so the flags can never disagree with their preflight.\n\t\t\tconst refusalFor = (side: 'mint' | 'sell'): PredictPreflightCode | null => {\n\t\t\t\ttry {\n\t\t\t\t\tthis.#assertQueueOpen(state, side, nowMs);\n\t\t\t\t\treturn null;\n\t\t\t\t} catch (e) {\n\t\t\t\t\tif (e instanceof PredictPreflightError) return e.code;\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t};\n\t\t\tconst refusal = { mint: refusalFor('mint'), sell: refusalFor('sell') };\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tmode,\n\t\t\t\ttiming,\n\t\t\t\tacceptingMints: refusal.mint == null,\n\t\t\t\tacceptingSells: refusal.sell == null,\n\t\t\t\trefusal,\n\t\t\t\tmaxMint: {\n\t\t\t\t\texactQuantity: maxMintNow({\n\t\t\t\t\t\tshape: 'exact-quantity',\n\t\t\t\t\t\tspareCashRaw: state.spareCash,\n\t\t\t\t\t\tminEntryProbability: state.minEntryProbability,\n\t\t\t\t\t\tlotSize: BigInt(this.cfg.units.positionLotSize),\n\t\t\t\t\t\tasOfMs: nowMs,\n\t\t\t\t\t}),\n\t\t\t\t\tbudget: maxMintNow({\n\t\t\t\t\t\tshape: 'budget',\n\t\t\t\t\t\tspareCashRaw: state.spareCash,\n\t\t\t\t\t\tminEntryProbability: state.minEntryProbability,\n\t\t\t\t\t\tavailableRaw: state.account?.availableRaw,\n\t\t\t\t\t\torderFeeRaw: policy.orderFee,\n\t\t\t\t\t\tasOfMs: nowMs,\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\n\t\t/**\n\t\t * Plan a queued mint for a purchase form: the quote at the current price, the payout and\n\t\t * multiple, the order fee read from the desk, the escrow and debit, the balance, the most\n\t\t * the market takes now, the timing and the queue gates, plus the enqueue options that carry\n\t\t * the slippage. `amount` plans an all-in spend (`enqueueMintCost`, refunded below the payout\n\t\t * floor), and `quantity` an exact payout (`enqueueMint`, capped by probability and cost).\n\t\t * Works for a visitor without an account: the quote then comes from `quote_mint`.\n\t\t *\n\t\t * `slippageCents` is cents per contract, never a percentage: a 10¢ limit fills while the\n\t\t * all-in price per contract stays within 10¢ of the quote's price without its fee subsidy.\n\t\t */\n\t\tplanMint: async (\n\t\t\towner: string,\n\t\t\tm: MarketDescriptor,\n\t\t\topts: PlanMintOptions,\n\t\t): Promise<MintPlan> => {\n\t\t\tconst orders = this.#requireDelayedExecution();\n\t\t\tconst feeds = this.#feeds(m.underlying);\n\t\t\tconst { id, state: market } = await this.#resolveMarket(m);\n\t\t\tconst { lowerTick, higherTick } = await this.#strikeTicks(m, id, market);\n\t\t\tconst hasAccount = await this.#hasAccount(owner);\n\t\t\tconst state = await this.#queueState(orders, id, hasAccount ? { owner } : {});\n\t\t\tconst nowMs = BigInt(Date.now());\n\t\t\tconst policy = state.desk.policy;\n\t\t\tconst fee = policy.orderFee;\n\t\t\tconst availableRaw = state.account?.availableRaw ?? null;\n\t\t\tconst lot = BigInt(this.cfg.units.positionLotSize);\n\t\t\tconst ticks = { expiryMarketId: id, lowerTick, higherTick, ...feeds };\n\t\t\tconst forAccount = (request: MintQuoteRequest) =>\n\t\t\t\tquoteMintForAccount(this.#client, this.#config, {\n\t\t\t\t\t...ticks,\n\t\t\t\t\twrapperId: this.wrapperIdFor(owner),\n\t\t\t\t\trequest,\n\t\t\t\t}).then((r) => r.quote);\n\n\t\t\tlet quote: MintQuoteRaw;\n\t\t\tlet quoteForAccount: boolean;\n\t\t\tlet budgetRequested: bigint | null = null;\n\t\t\tif ('amount' in opts) {\n\t\t\t\tconst amountRaw = usdcToRaw(opts.amount);\n\t\t\t\tbudgetRequested =\n\t\t\t\t\t(opts.orderFee ?? 'inclusive') === 'inclusive'\n\t\t\t\t\t\t? amountRaw > fee\n\t\t\t\t\t\t\t? amountRaw - fee\n\t\t\t\t\t\t\t: 0n\n\t\t\t\t\t\t: amountRaw;\n\t\t\t\t// No budget below the minimum premium can be admitted, and the account's quote\n\t\t\t\t// aborts `EOrderFailsLimits` on one, so refuse it as a visitor's search does. An\n\t\t\t\t// amount the order fee takes whole buys nothing either.\n\t\t\t\tif (budgetRequested === 0n) {\n\t\t\t\t\tthrow new PredictPreflightError(\n\t\t\t\t\t\t'min-premium',\n\t\t\t\t\t\t`${opts.amount} doesn't cover the ${rawToUsdc(fee)} order fee, so it buys no premium`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (budgetRequested < MIN_PREMIUM) {\n\t\t\t\t\tthrow new PredictPreflightError(\n\t\t\t\t\t\t'min-premium',\n\t\t\t\t\t\t`a budget of ${rawToUsdc(budgetRequested)} is below the minimum premium (a mint's premium must be at least ${rawToUsdc(MIN_PREMIUM)} USDC)`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\t// The account's own quote caps the budget at its balance, so it only previews an\n\t\t\t\t// order the balance covers.\n\t\t\t\tquoteForAccount =\n\t\t\t\t\tavailableRaw != null && availableRaw > fee && availableRaw - fee >= budgetRequested;\n\t\t\t\tconst budget = budgetRequested;\n\t\t\t\tconst search = () =>\n\t\t\t\t\tthis.#searchBudgetQuote(ticks, budget, lot).catch(async (error: unknown) => {\n\t\t\t\t\t\t// Every probe refused ends the search in 'min-premium', which a strike outside\n\t\t\t\t\t\t// the entry band also explains.\n\t\t\t\t\t\tif (error instanceof PredictPreflightError && error.code === 'min-premium') {\n\t\t\t\t\t\t\tthrow (await this.#entryBandRefusal(m)) ?? error;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthrow await this.#quoteRefusal(error, { m });\n\t\t\t\t\t});\n\t\t\t\tif (quoteForAccount) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tquote = await forAccount({\n\t\t\t\t\t\t\tshape: 'exact-cost',\n\t\t\t\t\t\t\tmaxCostRaw: budget,\n\t\t\t\t\t\t\tminQuantityRaw: 0n,\n\t\t\t\t\t\t});\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tif (!isOrderFailsLimits(error)) throw await this.#quoteRefusal(error);\n\t\t\t\t\t\t// The chain refused the budget at the account's own pricing, its builder fee\n\t\t\t\t\t\t// included. The account-free search only diagnoses the refusal: a strike outside\n\t\t\t\t\t\t// the entry band, or a budget too small for the minimum premium, throws its typed\n\t\t\t\t\t\t// refusal. It leaves the builder fee out, so a budget only it can size is never\n\t\t\t\t\t\t// planned, and keeps the chain's own error. (Near $1 a contract, admission's\n\t\t\t\t\t\t// payout-bound step-down isn't monotone, so a slightly smaller budget can pass\n\t\t\t\t\t\t// where this one is refused. That is a false refusal, never a bad order.)\n\t\t\t\t\t\tawait search();\n\t\t\t\t\t\tthrow error;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tquote = await search();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst quantityRaw = usdcToRaw(opts.quantity);\n\t\t\t\tthis.#assertLot(quantityRaw);\n\t\t\t\tquoteForAccount = hasAccount;\n\t\t\t\ttry {\n\t\t\t\t\tquote = hasAccount\n\t\t\t\t\t\t? await forAccount({ shape: 'exact-quantity', quantityRaw })\n\t\t\t\t\t\t: (\n\t\t\t\t\t\t\t\tawait quoteMintAnonymous(this.#client, this.#config, {\n\t\t\t\t\t\t\t\t\t...ticks,\n\t\t\t\t\t\t\t\t\trequest: { shape: 'exact-quantity', quantityRaw },\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t).quote;\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthrow await this.#quoteRefusal(error, { m, quantityRaw });\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// The expected cost, after the fee subsidy. The limits add the subsidy back, because\n\t\t\t// admission checks the order without it (`EOrderFailsLimits`).\n\t\t\tconst costRaw = quote.allInCost - quote.penaltyFee;\n\t\t\tconst slippage = PredictClient.#appliedSlippage(opts, quote.entryProbability, state, nowMs);\n\t\t\tconst limitsIn = {\n\t\t\t\tquoteCostRaw: costRaw,\n\t\t\t\tquoteQuantityRaw: quote.quantity,\n\t\t\t\tentryProbabilityRaw: quote.entryProbability,\n\t\t\t\tslippageRaw: slippage.raw,\n\t\t\t\tfeeIncentiveSubsidyRaw: quote.feeIncentiveSubsidy,\n\t\t\t\tlotSize: lot,\n\t\t\t};\n\t\t\tlet budgetRaw: bigint;\n\t\t\tlet minQuantityRaw: bigint;\n\t\t\t// What admission buys at least, for a budget plan, or why it buys nothing the plan can\n\t\t\t// preview.\n\t\t\tlet admitted:\n\t\t\t\t| { quantity: bigint }\n\t\t\t\t| { refusal: 'min-premium' | 'cost-above-payout' | 'entry-band' }\n\t\t\t\t| null = null;\n\t\t\tlet maxCostRaw: bigint | null = null;\n\t\t\tlet maxProbabilityRaw: bigint | null = null;\n\t\t\tlet price: { nowRaw: bigint; worstRaw: bigint };\n\t\t\tlet order: MintPlan['order'];\n\t\t\tif (budgetRequested != null) {\n\t\t\t\tconst limits = budgetMintLimits({ ...limitsIn, budgetRaw: budgetRequested });\n\t\t\t\tbudgetRaw = budgetRequested;\n\t\t\t\t// Admission sizes the fill without the subsidy by Move's exact arithmetic, whose\n\t\t\t\t// per-component rounding (inventory impact included) an average price can't bound.\n\t\t\t\t// So the floor's ceiling is checked with exact quotes. It also never exceeds the\n\t\t\t\t// quote's own quantity, since a searched quote can leave part of the budget unspent.\n\t\t\t\t// The first probe divides the budget by the quote's unsubsidized price, with no rounding\n\t\t\t\t// allowance, so a minimum-sized purchase isn't probed one lot short.\n\t\t\t\tconst unsubsidizedCost = costRaw + quote.feeIncentiveSubsidy;\n\t\t\t\tconst start =\n\t\t\t\t\tunsubsidizedCost === 0n\n\t\t\t\t\t\t? quote.quantity\n\t\t\t\t\t\t: ((budgetRaw * quote.quantity) / unsubsidizedCost / lot) * lot;\n\t\t\t\tadmitted = await this.#admittedFloor(\n\t\t\t\t\t(quantityRaw) =>\n\t\t\t\t\t\tquoteForAccount\n\t\t\t\t\t\t\t? forAccount({ shape: 'exact-quantity', quantityRaw })\n\t\t\t\t\t\t\t: quoteMintAnonymous(this.#client, this.#config, {\n\t\t\t\t\t\t\t\t\t...ticks,\n\t\t\t\t\t\t\t\t\trequest: { shape: 'exact-quantity', quantityRaw },\n\t\t\t\t\t\t\t\t}).then((r) => r.quote),\n\t\t\t\t\tbudgetRaw,\n\t\t\t\t\tstart < quote.quantity ? start : quote.quantity,\n\t\t\t\t\tlot,\n\t\t\t\t\tquote.entryProbability,\n\t\t\t\t\tquote.quantity === 0n ? 0n : (unsubsidizedCost * 1_000_000_000n) / quote.quantity,\n\t\t\t\t);\n\t\t\t\tconst ceiling = 'quantity' in admitted ? admitted.quantity : 0n;\n\t\t\t\tminQuantityRaw = limits.minQuantityRaw < ceiling ? limits.minQuantityRaw : ceiling;\n\t\t\t\tprice = limits.pricePerContract;\n\t\t\t\torder = {\n\t\t\t\t\tbuilder: 'enqueueMintCost',\n\t\t\t\t\toptions: { spend: rawToUsdc(budgetRaw), minQuantity: rawToUsdc(minQuantityRaw) },\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tconst limits = exactMintLimits(limitsIn);\n\t\t\t\tmaxCostRaw = limits.maxCostRaw;\n\t\t\t\tmaxProbabilityRaw = limits.maxProbabilityRaw;\n\t\t\t\t// Enqueue escrows `min(max_cost, quantity, available − fee)`.\n\t\t\t\tbudgetRaw = maxCostRaw < quote.quantity ? maxCostRaw : quote.quantity;\n\t\t\t\tminQuantityRaw = quote.quantity;\n\t\t\t\tprice = limits.pricePerContract;\n\t\t\t\torder = {\n\t\t\t\t\tbuilder: 'enqueueMint',\n\t\t\t\t\toptions: {\n\t\t\t\t\t\tquantity: rawToUsdc(quote.quantity),\n\t\t\t\t\t\tmaxCost: rawToUsdc(maxCostRaw),\n\t\t\t\t\t\tmaxProbability: rawToProbability(maxProbabilityRaw),\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst totalDebitRaw = budgetRaw + fee;\n\t\t\tconst expectedDebitRaw = costRaw + fee;\n\t\t\tconst inclusive = 'amount' in opts && (opts.orderFee ?? 'inclusive') === 'inclusive';\n\t\t\t// The builder's own preflight on the plan's order, plus what only the quote shows: the\n\t\t\t// balance against the whole debit the limits assume, the payout bound, and the premium a\n\t\t\t// budget buys at admission, which prices without the fee subsidy.\n\t\t\tconst refusal = PredictClient.#refusal(() => {\n\t\t\t\tthis.#assertQueueOpen(state, 'mint', nowMs);\n\t\t\t\tif (availableRaw == null || availableRaw < totalDebitRaw) {\n\t\t\t\t\tthrow new PredictPreflightError(\n\t\t\t\t\t\t'fee',\n\t\t\t\t\t\t`the balance doesn't cover the plan's ${rawToUsdc(totalDebitRaw)} debit`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tPredictClient.#assertMintOrder(\n\t\t\t\t\tstate,\n\t\t\t\t\tpolicy,\n\t\t\t\t\tbudgetRequested != null\n\t\t\t\t\t\t? { kind: ORDER_KIND.EXACT_COST, maxCostRaw: budgetRaw }\n\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\tkind: ORDER_KIND.EXACT_QUANTITY,\n\t\t\t\t\t\t\t\tmaxCostRaw: maxCostRaw ?? budgetRaw,\n\t\t\t\t\t\t\t\tquantityRaw: quote.quantity,\n\t\t\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tif (costRaw + quote.feeIncentiveSubsidy > quote.quantity) {\n\t\t\t\t\tthrow new PredictPreflightError(\n\t\t\t\t\t\t'cost-above-payout',\n\t\t\t\t\t\t'the all-in cost without the fee subsidy is above the payout',\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (admitted != null && 'refusal' in admitted) {\n\t\t\t\t\tthrow new PredictPreflightError(\n\t\t\t\t\t\tadmitted.refusal,\n\t\t\t\t\t\tadmitted.refusal === 'min-premium'\n\t\t\t\t\t\t\t? `without the fee subsidy, ${rawToUsdc(budgetRaw)} buys no fill that clears the ${rawToUsdc(MIN_PREMIUM)} minimum premium`\n\t\t\t\t\t\t\t: admitted.refusal === 'entry-band'\n\t\t\t\t\t\t\t\t? \"the entry probability left the market's entry band while the order was sized: plan again, or pick a strike nearer the money\"\n\t\t\t\t\t\t\t\t: `without the fee subsidy, ${rawToUsdc(budgetRaw)} buys a fill near $1 a contract, whose admission sizing can't be previewed`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\t\t\tconst cashOrBudgetMax = maxMintNow(\n\t\t\t\tbudgetRequested != null\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tshape: 'budget',\n\t\t\t\t\t\t\tspareCashRaw: state.spareCash,\n\t\t\t\t\t\t\tminEntryProbability: state.minEntryProbability,\n\t\t\t\t\t\t\tavailableRaw: availableRaw ?? undefined,\n\t\t\t\t\t\t\torderFeeRaw: fee,\n\t\t\t\t\t\t\tasOfMs: nowMs,\n\t\t\t\t\t\t}\n\t\t\t\t\t: {\n\t\t\t\t\t\t\tshape: 'exact-quantity',\n\t\t\t\t\t\t\tspareCashRaw: state.spareCash,\n\t\t\t\t\t\t\tminEntryProbability: state.minEntryProbability,\n\t\t\t\t\t\t\tlotSize: lot,\n\t\t\t\t\t\t\tasOfMs: nowMs,\n\t\t\t\t\t\t},\n\t\t\t).maxRaw;\n\t\t\t// `maxMintNow` bounds an exact quantity by spare cash only. Enqueue escrows the quantity\n\t\t\t// at the plan's worst price per contract, capped at the $1 payout, so the balance bounds\n\t\t\t// it too.\n\t\t\tlet max = cashOrBudgetMax;\n\t\t\tif (budgetRequested == null && availableRaw != null && price.worstRaw > 0n) {\n\t\t\t\tconst spendable = availableRaw > fee ? availableRaw - fee : 0n;\n\t\t\t\tconst perContract = price.worstRaw < 1_000_000_000n ? price.worstRaw : 1_000_000_000n;\n\t\t\t\tconst byBalance = ((spendable * 1_000_000_000n) / perContract / lot) * lot;\n\t\t\t\tif (max == null || byBalance < max) max = byBalance;\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tshape: budgetRequested != null ? 'budget' : 'exact-quantity',\n\t\t\t\ttarget: { owner: normalizeSuiAddress(owner), expiryMarketId: id, lowerTick, higherTick },\n\t\t\t\tquote: PredictClient.#queuedMintQuote(quote, policy),\n\t\t\t\tquoteForAccount,\n\t\t\t\tslippage: slippage.applied,\n\t\t\t\tpotentialPayout: rawToUsdc(quote.quantity),\n\t\t\t\tminPayout: rawToUsdc(minQuantityRaw),\n\t\t\t\tpayoutMultiple: Number(quote.quantity) / Number(expectedDebitRaw),\n\t\t\t\tminPayoutMultiple: Number(minQuantityRaw) / Number(totalDebitRaw),\n\t\t\t\tpricePerContract: rawToProbability(price.nowRaw),\n\t\t\t\tworstPricePerContract: rawToProbability(price.worstRaw),\n\t\t\t\torderFee: rawToUsdc(fee),\n\t\t\t\tbudget: rawToUsdc(budgetRaw),\n\t\t\t\ttotalDebit: rawToUsdc(totalDebitRaw),\n\t\t\t\texpectedDebit: rawToUsdc(expectedDebitRaw),\n\t\t\t\tbalance: {\n\t\t\t\t\thasAccount,\n\t\t\t\t\tavailable: availableRaw == null ? null : rawToUsdc(availableRaw),\n\t\t\t\t\tcovers: availableRaw == null ? null : availableRaw >= totalDebitRaw,\n\t\t\t\t},\n\t\t\t\tmaxNow: max == null ? null : rawToUsdc(inclusive ? max + fee : max),\n\t\t\t\ttiming: previewTiming({\n\t\t\t\t\tnowMs,\n\t\t\t\t\tpolicy,\n\t\t\t\t\theads: state.heads,\n\t\t\t\t\texpiryMs: state.expiryMs,\n\t\t\t\t\tnoTradeWindowMs: state.protocol.noTradeWindowMs,\n\t\t\t\t}),\n\t\t\t\taccepting: refusal == null,\n\t\t\t\trefusal,\n\t\t\t\torder,\n\t\t\t\traw: {\n\t\t\t\t\tbudget: budgetRaw,\n\t\t\t\t\torderFee: fee,\n\t\t\t\t\ttotalDebit: totalDebitRaw,\n\t\t\t\t\tslippage: slippage.raw,\n\t\t\t\t\tminQuantity: minQuantityRaw,\n\t\t\t\t\tmaxCost: maxCostRaw,\n\t\t\t\t\tmaxProbability: maxProbabilityRaw,\n\t\t\t\t\tpricePerContract: price.nowRaw,\n\t\t\t\t\tworstPricePerContract: price.worstRaw,\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\n\t\t/**\n\t\t * Plan a queued early sell of an Open record: the quote at the current price, net of the\n\t\t * order fee, the floors at the worst price the slippage allows, the timing and the\n\t\t * builder's preflight, plus the `enqueueSell` options that carry the floors. A record that\n\t\t * isn't Open has no quote, so it throws `PredictPreflightError` `'record-not-open'` instead.\n\t\t */\n\t\tplanSell: async (\n\t\t\towner: string,\n\t\t\tm: MarketCoordinates,\n\t\t\topts: PlanSellOptions,\n\t\t): Promise<SellPlan> => {\n\t\t\tconst orders = this.#requireDelayedExecution();\n\t\t\tconst { id } = await this.#resolveMarket(m);\n\t\t\tconst state = await this.#queueState(orders, id, { owner, recordIds: [opts.recordId] });\n\t\t\t// No quote exists for a record that isn't Open, or for more than it holds, so those\n\t\t\t// refusals throw.\n\t\t\tconst record = PredictClient.#assertRecordOpen(state, opts.recordId);\n\t\t\tthis.#assertSellQuantity(record, usdcToRaw(opts.quantity));\n\t\t\tconst quote = await this.read\n\t\t\t\t.quoteSell(owner, m, { recordId: opts.recordId, quantity: opts.quantity })\n\t\t\t\t.catch(async (error: unknown) => {\n\t\t\t\t\tthrow await this.#quoteRefusal(error);\n\t\t\t\t});\n\t\t\tconst nowMs = BigInt(Date.now());\n\t\t\tconst slippage = PredictClient.#appliedSlippage(opts, quote.raw.probability, state, nowMs);\n\t\t\tconst limits = sellLimits({\n\t\t\t\tproceedsRaw: quote.raw.proceeds,\n\t\t\t\tcloseQuantityRaw: quote.raw.quantityClosed,\n\t\t\t\tprobabilityRaw: quote.raw.probability,\n\t\t\t\tslippageRaw: slippage.raw,\n\t\t\t});\n\t\t\tconst fee = quote.raw.orderFee;\n\t\t\t// The builder's own preflight on the sell.\n\t\t\tconst refusal = PredictClient.#refusal(() => {\n\t\t\t\tconst { policy } = this.#assertQueueOpen(state, 'sell', nowMs);\n\t\t\t\tthis.#assertSellOrder(state, policy, opts.recordId, usdcToRaw(opts.quantity));\n\t\t\t});\n\t\t\treturn {\n\t\t\t\ttarget: { owner: normalizeSuiAddress(owner), expiryMarketId: id, recordId: opts.recordId },\n\t\t\t\tquote,\n\t\t\t\tslippage: slippage.applied,\n\t\t\t\tproceeds: quote.proceeds,\n\t\t\t\tnet: quote.net,\n\t\t\t\tminProceeds: rawToUsdc(limits.minProceedsRaw),\n\t\t\t\tminNet: rawToUsdc(limits.minProceedsRaw - fee),\n\t\t\t\torderFee: rawToUsdc(fee),\n\t\t\t\ttiming: previewTiming({\n\t\t\t\t\tnowMs,\n\t\t\t\t\tpolicy: state.desk.policy,\n\t\t\t\t\theads: state.heads,\n\t\t\t\t\texpiryMs: state.expiryMs,\n\t\t\t\t\tnoTradeWindowMs: state.protocol.noTradeWindowMs,\n\t\t\t\t}),\n\t\t\t\taccepting: refusal == null,\n\t\t\t\trefusal,\n\t\t\t\torder: {\n\t\t\t\t\tbuilder: 'enqueueSell',\n\t\t\t\t\toptions: {\n\t\t\t\t\t\trecordId: opts.recordId,\n\t\t\t\t\t\tquantity: opts.quantity,\n\t\t\t\t\t\tminProbability: rawToProbability(limits.minProbabilityRaw),\n\t\t\t\t\t\tminProceeds: rawToUsdc(limits.minProceedsRaw),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\traw: {\n\t\t\t\t\tslippage: slippage.raw,\n\t\t\t\t\tminProceeds: limits.minProceedsRaw,\n\t\t\t\t\tminProbability: limits.minProbabilityRaw,\n\t\t\t\t\torderFee: fee,\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\n\t\t/** One queue record and its display state, or null when missing or cleaned up. */\n\t\torder: async (m: MarketCoordinates, recordId: bigint): Promise<QueuedOrderView | null> =>\n\t\t\t(await this.read.orders(m, [recordId]))[0],\n\n\t\t/**\n\t\t * Queue records by record ID, with their display states. The SDK has no indexer: the app\n\t\t * supplies record IDs from its enqueue receipts or its indexer.\n\t\t */\n\t\torders: async (\n\t\t\tm: MarketCoordinates,\n\t\t\trecordIds: readonly bigint[],\n\t\t): Promise<(QueuedOrderView | null)[]> => {\n\t\t\tconst orders = this.#requireDelayedExecution();\n\t\t\tconst { id } = await this.#resolveMarket(m);\n\t\t\tconst queueId = await this.#existingQueueId(orders, id);\n\t\t\tconst records = await queuedOrders(\n\t\t\t\tthis.#client,\n\t\t\t\torders,\n\t\t\t\t{ expiryMarketId: id, queueId },\n\t\t\t\trecordIds,\n\t\t\t);\n\t\t\tconst nowMs = BigInt(Date.now());\n\t\t\treturn records.map((record, i) =>\n\t\t\t\trecord\n\t\t\t\t\t? {\n\t\t\t\t\t\t\trecordId: recordIds[i],\n\t\t\t\t\t\t\trecord,\n\t\t\t\t\t\t\tview: orderView(record, nowMs, {\n\t\t\t\t\t\t\t\tlotSize: BigInt(this.cfg.units.positionLotSize),\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t}\n\t\t\t\t\t: null,\n\t\t\t);\n\t\t},\n\n\t\t/**\n\t\t * Poll a record until it is filled, refunded or closed (`pollMs`, default 250), or until\n\t\t * `timeoutMs` (default 30 s). The fullnode a client reads can trail the enqueue's\n\t\t * execution, so a record not seen yet is polled again until the timeout, and ends as\n\t\t * `'gone'` only then. A record that disappears after it was seen ends as `'gone'` at once.\n\t\t * The record's result is enough for the UI; the fee breakdown is in the\n\t\t * `QueuedOrderFilled` event.\n\t\t */\n\t\twaitForOutcome: async (\n\t\t\tm: MarketCoordinates,\n\t\t\trecordId: bigint,\n\t\t\topts: { pollMs?: number; timeoutMs?: number; signal?: AbortSignal } = {},\n\t\t): Promise<QueuedOrderOutcome> => {\n\t\t\tconst pollMs = opts.pollMs ?? 250;\n\t\t\tconst deadline = Date.now() + (opts.timeoutMs ?? 30_000);\n\t\t\tlet seen = false;\n\t\t\tfor (;;) {\n\t\t\t\tconst order = await this.read.order(m, recordId);\n\t\t\t\tconst timedOut = Date.now() + pollMs > deadline;\n\t\t\t\tif (!order) {\n\t\t\t\t\tif (seen || timedOut) return { outcome: 'gone', order: null };\n\t\t\t\t} else {\n\t\t\t\t\tseen = true;\n\t\t\t\t\tconst state = order.view.state;\n\t\t\t\t\tif (state === 'filled' || state === 'refunded' || state === 'closed') {\n\t\t\t\t\t\treturn { outcome: state, order };\n\t\t\t\t\t}\n\t\t\t\t\tif (timedOut) return { outcome: 'timeout', order };\n\t\t\t\t}\n\t\t\t\tawait sleep(pollMs, opts.signal);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * USDC sent to the owner's account wrapper that the account hasn't settled yet: refunds,\n\t\t * sell proceeds and settled payouts of Open records. Already counted in `read.balance`; for\n\t\t * display.\n\t\t */\n\t\tpendingFunds: async (owner: string): Promise<number> =>\n\t\t\trawToUsdc(await pendingFunds(this.#client, this.wrapperIdFor(owner), this.cfg.quoteCoinType)),\n\n\t\t/** The current Pyth Lazer package, for a filler. Read it per batch and never cache it. */\n\t\tlazerPackages: (stateId?: string): Promise<LazerPackages> => {\n\t\t\tconst id = stateId ?? this.cfg.oracle?.pythLazerState;\n\t\t\tif (!id) throw new PredictInputError('pass the Pyth Lazer State id');\n\t\t\treturn lazerPackages(this.#client, id);\n\t\t},\n\n\t\t/**\n\t\t * Exact pre-close quote for an ACCOUNT position: dry-runs the immediate redeem and decodes\n\t\t * the receipt.\n\t\t * @deprecated `redeem_live` is retired by delayed execution (DBU-885): Predict v4 always\n\t\t * aborts it. Queued fills are Open records: quote them with `read.quoteSell`.\n\t\t */\n\t\tquoteRedeem: async (\n\t\t\towner: string,\n\t\t\tm: MarketDescriptor,\n\t\t\topts: CloseOptions,\n\t\t): Promise<RedeemQuote> => {\n\t\t\tconst tx = await this.#buildRedeem(owner, m, opts);\n\t\t\tconst events = await simulateWithEvents(this.#client, tx, owner);\n\t\t\tconst r = exactlyOne(decodeRedeems(this.cfg, { events }), 'order-redeemed');\n\t\t\treturn {\n\t\t\t\tproceeds: r.proceeds,\n\t\t\t\tgross: r.gross,\n\t\t\t\tfees: r.fees,\n\t\t\t\tquantityClosed: r.quantityClosed,\n\t\t\t\tremaining: r.remaining,\n\t\t\t\traw: {\n\t\t\t\t\tproceeds: r.raw.proceeds,\n\t\t\t\t\tgross: r.raw.gross,\n\t\t\t\t\tquantityClosed: r.raw.quantityClosed,\n\t\t\t\t},\n\t\t\t\tfeesExact: true,\n\t\t\t};\n\t\t},\n\n\t\tmarket: async (\n\t\t\tm: Pick<MarketDescriptor, 'underlying' | 'expiryMs'>,\n\t\t): Promise<MarketSummary | null> => {\n\t\t\tconst expiryMs = BigInt(m.expiryMs);\n\t\t\t// Deliberately re-queries and overwrites the cache instead of reading\n\t\t\t// through it: this read must return live state (nav, mintPaused), and\n\t\t\t// refreshing the cache on the way keeps later tx builds consistent.\n\t\t\tconst u = this.#underlying(m.underlying);\n\t\t\tconst id = await expiryMarketId(this.#client, this.#config, u, expiryMs);\n\t\t\tif (!id) return null;\n\t\t\tconst state = await marketState(this.#client, this.#config, id);\n\t\t\tthis.#marketCache.set(`${m.underlying}:${expiryMs}`, { id, state });\n\t\t\tconst navRaw = await currentNav(this.#client, this.#config, id, u);\n\t\t\treturn {\n\t\t\t\tid,\n\t\t\t\texpiryMs: state.expiryMs,\n\t\t\t\ttickSize: fromRaw(state.tickSizeRaw, 9), // strike/price scale\n\t\t\t\tadmissionTickSize: fromRaw(state.admissionTickSizeRaw, 9),\n\t\t\t\tmintPaused: state.mintPaused,\n\t\t\t\tnav: rawToUsdc(navRaw),\n\t\t\t\treferencePrice: PredictClient.#referencePriceOf(state),\n\t\t\t};\n\t\t},\n\n\t\t/**\n\t\t * The market's settlement price, or `null` until a keeper settles it. Unlike `market`,\n\t\t * `price` and the quotes, which abort `ELivePricingExpired` once the market expires, it\n\t\t * keeps working after expiry, when an app shows results. With delayed execution the\n\t\t * keeper settles a market, pays its Open records and cleans them up within about a second\n\t\t * of expiry, so `read.order` returns `null` by then. Keep each filled record's\n\t\t * `position.orderId` and pass it to `cost.settledPayout` with this price.\n\t\t */\n\t\tsettlement: async (m: MarketCoordinates): Promise<MarketSettlement> => {\n\t\t\tconst { id, state } = await this.#resolveMarket(m);\n\t\t\tconst raw = await settlementPrice(this.#client, this.#config, id);\n\t\t\treturn {\n\t\t\t\tmarketId: id,\n\t\t\t\texpiryMs: state.expiryMs,\n\t\t\t\tsettled: raw != null,\n\t\t\t\tsettlementPrice: raw == null ? null : fromRaw(raw, 9),\n\t\t\t\tsettlementPriceRaw: raw,\n\t\t\t\ttickSizeRaw: state.tickSizeRaw,\n\t\t\t};\n\t\t},\n\n\t\t/**\n\t\t * The fee and exposure policy the market snapshotted at creation, ready to pass to the\n\t\t * `cost` functions as `fees`. A market keeps it for its whole life, so it can differ from\n\t\t * the protocol's current template, and neither recorded deployment's template matches\n\t\t * `cost.SHIPPED_FEE_POLICY` any more. One object read.\n\t\t */\n\t\tfeePolicy: async (m: MarketCoordinates): Promise<FeePolicy> =>\n\t\t\tmarketFeePolicy(this.#client, (await this.#resolveMarket(m)).id),\n\n\t\tbalance: async (owner: string): Promise<number> =>\n\t\t\trawToUsdc(await accountBalance(this.#client, this.#config, owner, this.cfg.quoteCoinType)),\n\n\t\t// PLP shares held in the owner's account custody (raw u64, 6-decimal PLP coin).\n\t\tplpBalance: (owner: string): Promise<bigint> =>\n\t\t\taccountBalance(this.#client, this.#config, owner, this.cfg.coinTypes.plp),\n\n\t\tpool: async (): Promise<PoolSummary> => {\n\t\t\tconst s = await poolStats(this.#client, this.#config);\n\t\t\treturn {\n\t\t\t\tplpTotalSupply: s.plpTotalSupply, // shares raw (6-decimal)\n\t\t\t\tidleUsdc: rawToUsdc(s.idleBalance),\n\t\t\t\t// These are queue LENGTHS (counts of pending requests), not token amounts.\n\t\t\t\tsupplyRequestsPending: Number(s.supplyRequestsPending),\n\t\t\t\twithdrawRequestsPending: Number(s.withdrawRequestsPending),\n\t\t\t};\n\t\t},\n\t};\n\n\t// === execution-result decoders ===\n\t// Pure event parsing (no network): pass the executed/simulated transaction\n\t// result (with events included) and get a typed receipt back. Singular forms\n\t// throw unless exactly one matching event exists; plural forms return all\n\t// (an integrator batching N actions in one PTB gets N receipts).\n\treadonly decode = {\n\t\tmint: (r: DecodableTransactionResult) => exactlyOne(decodeMints(this.cfg, r), 'OrderMinted'),\n\t\tmints: (r: DecodableTransactionResult) => decodeMints(this.cfg, r),\n\t\tredeem: (r: DecodableTransactionResult) =>\n\t\t\texactlyOne(decodeRedeems(this.cfg, r), 'order-redeemed'),\n\t\tredeems: (r: DecodableTransactionResult) => decodeRedeems(this.cfg, r),\n\t\tclaim: (r: DecodableTransactionResult) =>\n\t\t\texactlyOne(decodeClaims(this.cfg, r), 'SettledOrderRedeemed'),\n\t\tclaims: (r: DecodableTransactionResult) => decodeClaims(this.cfg, r),\n\t\tcreateManager: (r: DecodableTransactionResult) =>\n\t\t\texactlyOne(decodeAccountsCreated(this.cfg, r), 'AccountCreated'),\n\t\tdeposit: (r: DecodableTransactionResult) =>\n\t\t\texactlyOne(decodeDeposits(this.cfg, r), 'Deposited'),\n\t\twithdraw: (r: DecodableTransactionResult) =>\n\t\t\texactlyOne(decodeWithdrawals(this.cfg, r), 'Withdrawn'),\n\t\tplpRequest: (r: DecodableTransactionResult) =>\n\t\t\texactlyOne(decodePlpRequests(this.cfg, r), 'supply/withdraw-requested'),\n\t\tplpCancel: (r: DecodableTransactionResult) =>\n\t\t\texactlyOne(decodePlpCancels(this.cfg, r), 'RequestCancelled'),\n\t\tbuilderCode: (r: DecodableTransactionResult) =>\n\t\t\texactlyOne(decodeBuilderCodeSets(this.cfg, r), 'BuilderCodeSet'),\n\n\t\t// --- delayed execution (DBU-885) --- the queue events are matched against the order-flow\n\t\t// companion's original ID (`packages.predictOrdersV1 ?? predictOrders`), the Predict events\n\t\t// the upgrade added against `packages.predictDelayedExecution`. Each throws\n\t\t// PredictInputError while the config doesn't record the package it needs.\n\n\t\t/** The trader's `OrderEnqueued` receipt: the record ID, τ, deadline, escrow and fee. */\n\t\tenqueue: (r: DecodableTransactionResult) =>\n\t\t\texactlyOne(decodeEnqueues(this.cfg, r), 'OrderEnqueued'),\n\t\tenqueues: (r: DecodableTransactionResult) => decodeEnqueues(this.cfg, r),\n\t\t/** Every queue event, tagged, in chain order: feed it to `queue.reduceOrderEvents`. */\n\t\tqueueEvents: (r: DecodableTransactionResult) => decodeQueueEvents(this.cfg, r),\n\t\tcohortCommits: (r: DecodableTransactionResult) => decodeCohortCommits(this.cfg, r),\n\t\tqueuedFills: (r: DecodableTransactionResult) => decodeQueuedFills(this.cfg, r),\n\t\tqueuedRefunds: (r: DecodableTransactionResult) => decodeQueuedRefunds(this.cfg, r),\n\t\topenRecordPayouts: (r: DecodableTransactionResult) => decodeOpenRecordPayouts(this.cfg, r),\n\t\tmarketPayoutsCompleted: (r: DecodableTransactionResult) =>\n\t\t\tdecodeMarketPayoutsCompleted(this.cfg, r),\n\t\tqueueOps: (r: DecodableTransactionResult) => decodeQueueOps(this.cfg, r),\n\t\t/** `RecordFundsParked` and `RecordFundsClaimed`: USDC a record keeps until it can be sent. */\n\t\trecordFunds: (r: DecodableTransactionResult) => decodeRecordFunds(this.cfg, r),\n\t\tpolicyUpdates: (r: DecodableTransactionResult) => decodePolicyUpdates(this.cfg, r),\n\t\t/**\n\t\t * `ExpiryPnlRealized` changes in the pool's gross realized result, for P&L reporting. Sum\n\t\t * them with `realizedPnlRaw`.\n\t\t */\n\t\texpiryPnlRealized: (r: DecodableTransactionResult) => decodeExpiryPnlRealized(this.cfg, r),\n\t};\n}\n\n// Resolve after `ms`, or reject with the signal's reason once it aborts.\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n\treturn new Promise((resolve, reject) => {\n\t\tif (signal?.aborted) {\n\t\t\treject(signal.reason);\n\t\t\treturn;\n\t\t}\n\t\tconst onAbort = () => {\n\t\t\tclearTimeout(timer);\n\t\t\treject(signal?.reason);\n\t\t};\n\t\tconst timer = setTimeout(() => {\n\t\t\tsignal?.removeEventListener('abort', onAbort);\n\t\t\tresolve();\n\t\t}, ms);\n\t\tsignal?.addEventListener('abort', onAbort, { once: true });\n\t});\n}\n"],"mappings":"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"}
|