v1.231.0
VectifyAI/PageIndexv1.231.0Aug 2, 2026by github-actions[bot]
AI Summary
This is the final Beta release of the legacy v1.x branch, marking the end of the Cython core. It introduces the v2 Rust + PyO3 runtime as the primary path for trading strategies, backtesting, and live operations, alongside comprehensive migration tools and new v2-specific features.
Key Highlights
- Transition from legacy v1 Cython core to v2 Rust + PyO3 runtime
- Release of v2 wheels (2.0.0rc2) for community testing
- Introduction of v2 trailing stops and portfolio statistics (VaR, Omega Ratio)
- Added v2 execution algorithms and custom fee/fill models
- Enhanced Architect AX and Binance Futures support
Breaking Changes
- Legacy v1 core will move to a `develop_v1` branch and stop receiving new feature work
- Catalog order-event data written before `activation_price` is not readable with the new schema
- V2 prefers mark prices by default and introduces native `CustomData` without v1 wrapper semantics
- Replay of `OrderFillVoided` requires the referenced fill locally before reopening
- Python request callbacks omit v1 joined-response and late delivery conveniences
New Features
- Added v2 `OrderFillVoided` and `OrderStatus.VOIDED` terminal voiding
- Added v2 trailing stops that activate at market and set prices from the first update
- Added portfolio statistics including Skewness, Kurtosis, Ulcer Index, VaR, and Expected Shortfall
- Added `LiveNodeBuilder.with_controller` for runtime controller configuration
- Added Architect AX dated futures parsing and funding-slot schedule requests
Full Release Notes
# NautilusTrader 1.231.0 Beta Released on 2nd August 2026 (UTC). ### NautilusTrader v2 transition notice This release is intended to be the final NautilusTrader `1.x` release with support for the legacy Cython v1 core. If final validation finds a serious blocker, maintainers may take another `1.x` release rather than force the cutover. The v2 Rust + PyO3 runtime has reached the release-candidate stage for the supported workflows: Python strategy authoring, backtesting, live operation, core risk and execution, portfolio/accounting, data catalog usage, and the current adapter set. Some lower-use and newer surfaces remain deferred, and those are tracked in the [v2 roadmap](https://github.com/nautechsystems/nautilus_trader/issues/4042) rather than treated as blockers for the cutover. After this release, `develop` will move to v2-only. The legacy v1 core will move to a `develop_v1` branch, where maintainers will accept critical security backports for approximately three months after the v2 cutover. **New feature work will now target v2.** The paired `2.0.0rc2` wheels are being released alongside `1.231.0` for community testing with normal `--pre` installation. Follow‑up `2.0.0rcN` wheels are likely to ship at a higher cadence than normal releases as feedback arrives, before the final `2.0.0` release. #### Migration contracts The v2 cutover makes the Rust + PyO3 package the primary path for new installs and source builds. In the current checkout it lives under `python/` and uses `python/.venv`; the root package and root `.venv` still provide the legacy v1 Cython environment. Both packages import as `nautilus_trader`, so test the migration in a separate virtual environment. See [Migrate from v1 to v2](MIGRATION_V2.md) for the current imports and build commands. The accepted v2 contract differences are native `CustomData` without v1 wrapper semantics, `OptionGreeks` cache writes, no Python `Bar.is_revision`, and a cross-zero `Position.apply` entry price that resets to the flipping fill. V2 also prefers mark prices by default. Catalog order-event data written before `activation_price` and `OrderFilled.info` were added is not readable with the new schema and must be regenerated or migrated before an in-place upgrade. `OrderFillVoided` replay requires the referenced fill locally before reopening and treats `VOIDED` as terminal. Regenerate v2 order streams that contain a reopened correction before its referenced fill, or a cancel or update after `VOIDED`. The migration guide includes the v1-to-v2 identifier, collection, lifecycle, callback, subscription, historical-batch, and removed-hook mappings. Typed historical requests use batch callbacks; generic custom data continues through `on_historical_data`. #### Cutover limits The supported cutover workflows cover Python strategies, actors, backtests, live nodes, core risk and execution, portfolio/accounting, data catalogs, reports, tearsheets, and the current Rust-backed adapter set. The following limits remain deferred: - Python request callbacks omit v1 joined‑response, pending cleanup, and late or duplicate delivery conveniences. - Direct Python `LiveNode` injection for Redis cache databases and external message-bus backing. - SQL cache position and synthetic loads, state persistence, and heartbeat. - External message-bus publication of serialized order and position snapshots. - V1 `StreamingConfig` and `DataCatalogConfig` iterator wiring on the v2 `BacktestNode`. - V1 adapter instrument-provider filters; Hyperliquid v2 loads the configured universe. - Published tutorials still use v1; generated v2 stubs and `python/examples/` show the current API. - Static typing does not cover three Kraken batch methods or adapter wire DTO runtime attributes. ### Enhancements - Added v2 `OrderFillVoided`, `OrderStatus.VOIDED`, terminal voiding, and strategy and algorithm callbacks - Added v2 `Decimal` order fill pricing; `Order.avg_px` and `Order.slippage` no longer round through `f64` - Added v2 `info` fill metadata to `OrderFilled` - Added v2 order-event `activation_price` persistence through event and dictionary reconstruction - Added v2 Cap'n Proto and SQL persistence for order-event activation prices and fill `info` - Added v2 trailing stops that activate at market and set prices from the first update - Added v2 replay state carryover across NETTING close/reopen cycles (#4546), thanks @HungNgo4444 - Added v2 actor and strategy state persistence across live and backtest lifecycles - Added v2 `OrderBookDepth10` subscriptions and callbacks for Rust and Python actors and strategies (#4439) - Added Rust and Python v2 cache introspection for market‑data histories (#4586), thanks @Kenneth-zh - Added `make_qty_from_decimal` / `make_price_from_decimal` on the `Instrument` trait - Added `LiveNodeBuilder.with_controller` for runtime controller configuration (#4427), thanks @bebop23 - Added returns skewness and kurtosis portfolio statistics (#4334), thanks @Martingale42 - Added Up/Down Capture ratio portfolio statistics (#4354), thanks @mahimn01 - Added Ulcer Index, Omega Ratio, VaR, and Expected Shortfall portfolio statistics (#4352), thanks @Martingale42 - Added Tail Ratio portfolio statistic (#4341), thanks @Martingale42 - Added Python v2 historical book-delta and depth batch callbacks for actors and strategies - Added Python v2 subclassable execution algorithms for routed orders - Added Python v2 execution algorithm config subclassing and importable config export - Added Python v2 `ExecutionAlgorithm.deny_order` with terminal denial of invalid TWAP inputs - Added Python v2 `ExecutionAlgorithm` portfolio, lifecycle, signals, and constructed live registration - Added Python v2 controller subclassing and importable controller configs for backtest/live - Added Python v2 `BacktestNode` post-run cache, portfolio, statistics, and report inspection - Added Python v2 tearsheet support for `BacktestResult` input (#4563), thanks @faysou - Added Python v2 `FeeModel` and `FillModel` subclass support for custom backtest models - Added Python v2 `nautilus_trader.config` convenience imports for core configuration types - Added Python v2 `Strategy.shutdown_system()` and `LiveNode.dispose()` bindings - Added Python v2 `LiveNode` cache and portfolio inspection with bounded host-loop polling - Added Python v2 `LiveNode.add_strategy` for constructed strategy instances (#4487), thanks @dfjmax - Added Python v2 `PositionSizer` and `FixedRiskSizer` bindings (#4573), thanks @dfjmax - Added Python v2 `EfficiencyRatio` and `RelativeStrengthIndex` methods (#4420), thanks @a1zb2yc3z - Added Python v2 portfolio snapshot access with base-currency equity and stale/unpriced metadata - Added Python v2 `ExecTesterConfig` controls for UUID order IDs, quote quantity, and stop-time cancels - Added Python v2 `ExecTesterConfig.close_positions_qty_precision` for venue‑fillable stop‑time closes - Added Rust `LiveNode` runner metrics snapshots - Added opt-in `mimalloc` allocator feature, enabled by default for Python wheels (#4358), thanks @ivannp - Added v2 `MessageBusConfig.autotrim_maxlen` for Redis stream count retention (#4433), thanks for reporting @gtalknitin - Added WebSocket transport backend selection for Python and PyO3 configs (#4342), thanks @graceyangfan - Added adapter config readback in Python v2 while keeping credentials and nested configs private - Added Architect AX dated futures parsing and configurable WebSocket heartbeat and disconnect cancellation - Added Architect AX funding-slot schedule requests via `GET /funding-slots` - Added Architect AX Python v2 data and execution client factory bindings - Added Binance Futures and OKX trailing-stop activation prices to v2 execution reports - Added Binance GTD expiry support for USD-M and local expiry mapping for Spot and COIN-M - Added Binance v2 extended bars, bounded history, snapshots, tickers, estimated settlement prices, and L1 books - Added Binance USD-M (monthly and quarterly) and COIN-M (quarterly) delivery futures support - Added Binance v2 USD-M TradFi perpetual instrument support (#4488), thanks @M4n5ter - Added Binance v2 instrument filters, fees, scheduled refresh, proxy, and receive-window configuration - Added Binance US Spot JSON data and HMAC execution to the Rust-backed v2 adapter - Added Binance Python v2 constants, instrument loading, order book CSV loading, and client-order-ID decoders - Added Binance Spot WebSocket trading setup timeout configuration (#4538), thanks @folknor - Added Blockchain pool analysis to build exact checkpoint snapshots without storing full swap history - Added Bybit spot `margin_trading` instrument info field (#4540), thanks @dxwil - Added Bybit v2 automatic SPOT margin borrow repayment (#4543), thanks @dxwil - Added DeFi pool `CurrencyPair` caching and publication with pool IDs, token‑derived precision, and `taker_fee` - Added Hyperliquid fast-cancel payloads for non-trigger order cancels (#4414), thanks for reporting @magnified103 - Added Hyperliquid market data stream health warnings for stalled Deltas, Depth10, and Quote subscriptions (#4298) - Added Hyperliquid opt-in stale stream recovery with targeted resubscribe and reconnect escalation (#4298) - Added Hyperliquid persistable `HyperliquidPublicTrade` custom data (#4468), thanks @graceyangfan - Added Interactive Brokers PyO3 type stub annotations (#4350), thanks @dfjmax - Added OKX RPI market data and order execution support - Added PancakeSwap V3 protocol-fee replay accounting; run `make init-db` for schema changes - Added Polymarket v2 market WebSocket sharding that enforces `ws_max_subscriptions` per connection pool - Added Polymarket v2 instrument definition subscriptions through live publishers with generic capability contracts - Added Polymarket v2 GTD expiry and idempotent already-canceled execution test contracts - Added Polymarket v2 HTTP and WebSocket proxy support for every live client transport - Added Polymarket v2 opt-in authenticated order-safety heartbeats - Added Polymarket v2 fill `info` metadata carrying the raw venue trade fields - Added Polymarket v2 fills at `MATCHED` with corrections for failed settlement - Added Polymarket v2 WS `hash` and `transaction_hash` field decoding (#4377), thanks for reporting @SebastianPartarrieu - Added Polymarket v2 `PolymarketDataLoader` for public discovery and historical trades - Added Tardis MEXC spot and futures market data support ### Breaking Changes - Changed Rust `mins_to_secs` and `mins_to_nanos` to panic on overflow; use the `checked_*` variants - Changed L3 books to move IDs re‑added at a new price on the same side, fixing ghost levels - Changed L3 books to derive price‑based order IDs for orders with a zero order ID - Changed unstable Cap'n Proto `BarSpec.step` from `UInt32` to `UInt64` - Changed Rust `BookIntegrityError` to add `AmbiguousOrderSide`; update exhaustive matches - Changed Rust encoding errors to add `MixedMetadata` and `ReservedValue`; update exhaustive matches - Changed Rust `SendError` to add `WriteTimeout`; update exhaustive matches (#4572), thanks @folknor - Changed Rust `Cache::snapshot_position` to return `()`; use `snapshot_position_encoded` for the frame - Changed Rust time-event channels to `TimeEventMessage`; callbacks are no longer `Send + Sync` (#4496), thanks @folknor - Changed Rust `DataQueryResult.chunk` to private; use the borrow returned by `set_chunk` (#4499), thanks @folknor - Changed Rust FFI functions accessing `CVec` data to `unsafe`; wrap calls in `unsafe` blocks (#4499), thanks @folknor - Changed Rust `OrderStatusReport::with_avg_px` to take a `Decimal` and return `Self`; it no longer returns a `Result` - Changed Rust `calculate_fixed_risk_position_size` to return `Result<Quantity>`; callers must handle errors - Changed Rust CLI parser fields to crate-private; use `nautilus_cli::cli_command` and `run` - Changed v2 `PortfolioConfig.use_mark_prices` to prefer marks by default; set `false` to skip marks - Changed v2 portfolios to record daily equity snapshots by default; set `equity_curve=False` to opt out - Changed v2 order-event schemas to persist activation prices and fill `info`; old catalogs must be migrated - Changed v2 trailing-stop and order-event constructors to accept activation prices and fill `info` - Changed v2 `OrderPendingUpdate` and `OrderPendingCancel` `account_id` to optional (`AccountId | None`), matching v1 - Changed v2 order average and slippage prices to `Decimal` in Rust and `decimal.Decimal` in Python - Changed v2 SQL order average and slippage prices to `NUMERIC`; run `nautilus database init` - Changed v2 `OrderSnapshot` average and slippage prices to strings; migrate mixed‑schema catalogs - Changed v2 instrument Arrow schemas to persist all constraints; old catalogs must be migrated - Changed index option settlement to require `IndexPriceUpdate` for underlying levels (#4430, #4431), thanks @taozle - Changed DeFi `Pool` instrument conversion to preserve pool IDs; update callers keyed by token‑pair symbols - Changed Architect AX request models and low-level APIs to current schemas; unverified stop-limit orders are rejected - Changed BitMEX quanto multipliers from raw to settlement-currency units (#4507), thanks for reporting @4px4d9cdby-star - Changed Blockchain fee-protocol update and snapshot storage to use `INTEGER` protocol-fee shares; run `make init-db` - Changed Bybit repay result status fields from `String` to `BybitRepayStatus` - Changed Lighter `LighterHttpError` to add `HistoryIncomplete`; update exhaustive matches - Changed OKX algo order state filters from `OKXOrderStatus` to `OKXAlgoOrderStatus` - Removed `DataActor` order fill/cancel callbacks and subscription methods; use the message bus - Removed `Copy` and `Clone` from Rust `CVec`; move values instead (#4499), thanks @folknor - Removed Rust `CANCELLABLE_ORDER_STATUSES` and cancellable status set functions; use `OrderStatus::is_cancellable()` - Removed Rust `last_day_of_month` and `is_leap_year` helpers from `nautilus_core::datetime`; use chrono equivalents - Removed Polymarket v2 `ack_timeout_secs`; submit buffering no longer waits for acknowledgments - Renamed Python v2 `RedisMessageBusDatabase` to `RedisMessageBusBacking` (documenting a previous break) - Renamed Interactive Brokers PyO3 enum variants to uppercase names (e.g. `MarketDataType.DELAYED`) (#4350) ### Security - Fixed `CVec` ownership and FFI reconstruction issues that could cause undefined behavior (#4499), thanks @folknor - Fixed cross-thread `RustLocal` callback access that could cause undefined behavior (#4496), thanks @folknor - Fixed time-event callback teardown aborting during thread-local destruction (#4516), thanks @folknor - Fixed float time conversions saturating and real‑time `AtomicTime` returning placeholder timestamps or aborting - Fixed underflow and currency-mismatch panics from out-of-order fill events (#4483), thanks @folknor - Fixed fixed-risk position sizing panics from invalid inputs, overflow, and quantity conversion (#4573), thanks @dfjmax - Fixed v2 `CompetitionAwareFillModel` and `VolumeSensitiveFillModel` panics on invalid or overflowing liquidity - Fixed Arrow batch encoders silently re-labeling mixed metadata and leading clear deltas - Fixed SBE `FundingRateUpdate` maximum optional values encoding as absent - Fixed Cap'n Proto `Price` and `Quantity` decoding panicking on malformed precision - Fixed Cap'n Proto `BarSpec.step` truncating values above `u32::MAX` - Fixed DeFi `SwapTradeInfo` calculations panicking on a zero prior spot price - Fixed DeFi spot and execution prices panicking or silently wrapping on high ratios and unsupported token decimals - Fixed malformed Binance client order IDs aborting live adapters during report parsing - Fixed out-of-range Binance timestamps aborting live adapters or silently wrapping; streams warn and use receive time - Fixed Kraken data and execution config debug output exposing API credentials ### Fixes - Fixed execution engine and Binance minute intervals and lookbacks overflowing `u64` nanoseconds - Fixed order book `NoOrderSide` deltas mutating the bid side when the ID is on both book sides - Fixed Rust `OwnBookLevel::update` panicking on a missing order - Fixed own‑book filtering using wall time without a supplied timestamp (#4597), thanks @folknor - Fixed cache venue order ID collisions rebinding orders (#4595), thanks @folknor - Fixed backtest venue registration rollback and non‑positive leverage validation (#4596), thanks @folknor - Fixed backtest generated ID collisions after instrument re‑registration (#4580), thanks @folknor - Fixed simulated venue multi‑currency liquidation, FX rollover, and reset sequencing (#4612), thanks @folknor - Fixed `DataType` deserialization trusting stale cached hashes (#4592), thanks @folknor - Fixed stop‑market updates clearing existing `protection_price` values when omitted (#4578), thanks @folknor - Fixed completed data response handlers persisting after dispatch (#4583), thanks @xxxxxx-oss - Fixed `Throttler` stranding buffered messages after a rejected `try_reserve` (Rust), breaking drain order - Fixed network client reconnect stalls and stale‑session frame delivery (#4572), thanks @folknor - Fixed `nautilus database init` panicking instead of skipping existing schema objects on re-run - Fixed `nautilus database init` leaving schema objects owned by the bootstrap administrator - Fixed the v2 SQL schema loader splitting dollar-quoted (`$$`) statement bodies on their inner semicolons - Fixed Parquet catalog queries panicking in the Rust live runtime (#4526), thanks @TheoBabilon - Fixed `CAGR` and `CalmarRatio` reporting undefined results as zero - Fixed v2 clock `set_time_alert` and `set_timer` panicking on pre-epoch or out-of-range `DateTime` inputs - Fixed v2 clock past-alert warning logging the adjusted time instead of the original alert time - Fixed v2 `LiveTimer` panicking in the timer task instead of at `start` for senderless Rust callbacks - Fixed v2 cache orders stuck pending-cancel-local after a cancel rejection, blocking later cancels - Fixed v2 cache cold loads losing forward venue order ID lookups until the next order event - Fixed v2 cache exchange rates picking an arbitrary bar type instead of the latest bar per side - Fixed v2 sandbox execution retaining matching engines and cache state for expired quote-only instruments - Fixed v2 NETTING backtest growth from replay logs in snapshots and fill clones (#4546), thanks @HungNgo4444 - Fixed v2 result tearsheets to reject disposed node state - Fixed v2 result tearsheets reporting the backtest range instead of the wall‑clock run duration - Fixed v2 result tearsheets to filter PnL and account balances by currency - Fixed v2 `PortfolioAnalyzer` account returns failing after empty balance snapshots - Fixed v2 `PortfolioAnalyzer` native position ingestion and statistic registration - Fixed v2 `BettingInstrument` catalog round trips corrupting raw symbols, increments, and precisions - Fixed v2 instrument catalog round trips dropping constraints, margins, and fees - Fixed v2 realized PnL returning zero for missing rates or range errors and panicking on overflow - Fixed v2 realized PnL counting only the newest snapshot for NETTING positions with three or more cycles (v1 parity) - Fixed v2 realized PnL miscounting archived NETTING cycles whose boundaries a prior-cycle fill void moved - Fixed v2 duplicate replayed fills reopening a flat position and panicking on a later fill void replay - Fixed v2 portfolio snapshots retaining stale-price flags after the affected position side closed - Fixed v2 portfolio snapshots dropping temporarily unpriced positions and hiding stale valuations - Fixed v2 equity curves omitting unrealized PnL between fills (#3899), thanks for reporting @q-learning-trader - Fixed v2 account-scoped valuations clearing other accounts' missing-price flags on shared venues - Fixed v2 portfolio net exposure ignoring position side, so hedged books reported gross instead of net (v1 parity) - Fixed v2 account locks and margins using settlement currency instead of each calculated currency - Fixed v2 portfolio pending recovery discarding initial margin after recalculating maintenance margin - Fixed v2 portfolio initialization materializing account balance currencies in a nondeterministic order - Fixed v2 margin accounts adding zero balances for unreported currencies and denying unified-account orders - Fixed v2 invalid or out-of-range notional and PnL valuations panicking or falling back to zero - Fixed v2 multi-currency cash equity double-counting assets already credited to account balances - Fixed v2 quanto position notionals using quote currency instead of settlement currency - Fixed v2 portfolio valuations labeling and converting cost-currency amounts as settlement currency - Fixed v2 composite bar aggregation (`@` source) to deliver aggregated bars to subscribed actors and strategies - Fixed v2 tick-family aggregators to emit the standard bar type for composite subscriptions - Fixed v2 volume-runs and value-runs aggregators dropping volume across bar boundaries - Fixed v2 value-based aggregators dropping fractional volume after size-precision rounding - Fixed v2 `BarType.new_composite` to validate specifications during construction - Fixed v2 `Bar` and `BarSpecification` deserialization to validate OHLC ordering and step periodicity - Fixed v2 `Bar.from_pyobject` and bar type parsing at the Python boundary to raise `ValueError` instead of panicking - Fixed v2 catalog writes re-labeling mixed instruments or bar types; writes now group or reject them - Fixed v2 bar-type conversion corrupting `-INTERNAL` symbols and composite bar types - Fixed v2 SQL bar decoding to reject invalid rows and composite bar inserts without panicking - Fixed v2 external bar unsubscribe detaching the venue stream while other actors remained subscribed - Fixed v2 continuous future bar unsubscribe tearing down the chain while other actors remained subscribed - Fixed v2 continuous future bar requests emitting synthetic last-close bars across roll gaps (v1 parity) - Fixed v2 orphaned composite source aggregator teardown leaking the underlying client tick subscription - Fixed v2 `subscribed_bars` to include internally aggregated subscriptions (v1 parity) - Fixed v2 `request_bars` to reject composite bar types (v1 parity) - Fixed v2 `skip_first_non_full_bar` per-command override for bar subscriptions and aggregation requests (v1 parity) - Fixed v2 matching engine uncanceled part‑fill `INITIALIZED` IOC market orders (#4626), thanks for reporting @linimin - Fixed v2 matching engine stop and touch orders to honor last-price triggers (#4481), thanks for reporting @mgd134 - Fixed v2 matching engine quote-bar execution to honor `bar_adaptive_high_low_ordering` (v1 parity) - Fixed v2 matching engine `reset` to clear cached bid/ask bars, preventing stale pairs across runs - Fixed v2 order emulation leaving immediately matched submissions and modifications pending - Fixed v2 order emulation retaining stale trigger and limit prices after modification (v1 parity) - Fixed v2 volume aggregation step thresholds to use exact integer arithmetic instead of floating-point conversion - Fixed v2 `ValueBarAggregator` to accumulate value in `Decimal` matching the v1 implementation - Fixed v2 internal bar aggregation dropping the first tick in backtests - Fixed v2 quote extraction and quote-fed indicators panicking for a `Last` price type - Fixed v2 wranglers to detect raw fixed-point overflow before Arrow conversion (#4372), thanks @MandalorianBatman - Fixed v2 hedging phantom positions (#4424), thanks for reporting @luckykefu and for the patch @akashchakrabortymsc-cmd - Fixed v2 matching engine queue position for per-order deltas in L3 books (#4370), thanks for reporting @warmi024 - Fixed v2 own order book sizes to track remaining quantity after partial fills - Fixed v2 order-book average prices losing precision during weighted accumulation - Fixed v2 order-book raw exposure and crossed level sizes losing precision through floating-point conversion - Fixed v2 option-chain strike selection and rebalance thresholds losing precision - Fixed v2 value-based bars emitting early and distorting volume through floating-point splitting - Fixed v2 order average prices losing precision through floating-point weighted accumulation - Fixed v2 `Price`, `Quantity`, and `Money` conversions to `Decimal` panicking for large high-precision values - Fixed v2 `Quantity` multiplication falsely overflowing before fixed-point scaling - Fixed v2 interval book snapshots blocking order submission from `on_book` handlers - Fixed v2 position reconciliation grace to measure on the monotonic clock (#4366), thanks @folknor - Fixed v2 cross-zero reconciliation stranding synthetic orders after a failed leg (#4521), thanks @folknor - Fixed v2 continuous position reconciliation emitting fills from stale in-flight reports (#4517), thanks @folknor - Fixed v2 missing-order resolution and failed-report handling in live reconciliation (#4479), thanks @folknor - Fixed v2 batch-cancel inflight coverage, tracking leaks, and stale cancel-replace grace (#4523), thanks @folknor - Fixed v2 live fill deduplication suppressing reports after rejected fills (#4522), thanks @folknor - Fixed v2 startup reconciliation fill-key deduplication and retention (#4518), thanks @folknor - Fixed v2 startup reconciliation reapplying retained fills to position and PnL state - Fixed v2 continuous reconciliation stalling indefinitely on a hung client report task (#4529), thanks @folknor - Fixed v2 live reconciliation dropping hedge-mode venue reports (#4535), thanks @faysou - Fixed v2 reconciliation booking negative inferred fill prices on instruments that disallow them - Fixed v2 reconciliation dropping inferred fills and voids when the venue average was unusable - Fixed v2 execution algorithm subscriptions not restoring after cache‑backed restarts (#4590), thanks @xxxxxx-oss - Fixed v2 order event application committing the state transition before validating the update (#4530), thanks @folknor - Fixed v2 pending‑update orders rejecting delayed submission acknowledgments (#4549), thanks @folknor - Fixed v2 execution client deregistration blocking registration of a replacement default client (v1 parity) - Fixed v2 execution algorithms dropping submit parameters for spawned orders (#4524), thanks @dxwil - Fixed v2 TWAP sizing at instrument precision and interval validation (#4544), thanks @folknor - Fixed v2 live node connect and disconnect awaits escaping lifecycle timeouts (#4528), thanks @folknor - Fixed v2 live node connection timeouts reporting the node as running (#4528), thanks @folknor - Fixed v2 live nodes to apply configured default and venue client routing (#4408), thanks @dfjmax - Fixed v2 strategy orders bypassing risk checks in live and backtest runners - Fixed v2 `RiskEngine` balance checks for non‑reducing multi‑currency cash sells when the asset balance was absent - Fixed v2 `RiskEngine` skipping cash and betting account balance checks for reduce-only buy orders - Fixed v2 `RiskEngine` rate-limit modify-order rejections omitting the order `account_id` - Fixed v2 matching engine filling triggered stop-limit orders beyond their limit price - Fixed v2 matching engine dropping taker liquidity when a triggered stop-limit or LIT order was amended into the market - Fixed v2 matching engine charging `FixedFeeModel` commission per book level instead of once per order - Fixed v2 matching engine emitting `OrderTriggered` for stop orders already canceled in the same iteration - Fixed v2 order emulator ignoring trailing-stop `activation_price` and trailing before activation - Fixed v2 order emulator panicking on reentrant commands issued from order-event handlers - Fixed v2 order emulator dropping OCO and OUO contingency actions for events published while handling - Fixed v2 order emulator reversing released order event history so `init_event` was not first - Fixed v2 order emulator reactivating emulated child orders of closed position-less parents on start - Fixed v2 execution engine re-applying duplicate leg fills instead of fully skipping them - Fixed v2 execution engine applying portfolio economics for projected reconciliation fills on cash accounts - Fixed v2 order manager syncing quantities for OCO instead of OUO contingent orders - Fixed v2 reconciliation fill voids never voiding the proportional commissions - Fixed v2 reconciliation position matching always passing for negative venue average prices - Fixed v2 reconciliation inferred fills misclassifying liquidity for market-to-limit and post-only orders - Fixed v2 execution algorithms retaining submit params for denied orders - Fixed v2 `DeltaNeutralVol` example strategy not rehedging after a hedge order rejection, denial, or expiration - Fixed v2 `LiveNode` startup to restore cache databases and honor `flush_on_start` - Fixed v2 `LiveNode` startup continuing after reconciliation failures (#4406), thanks @TheoBabilon - Fixed v2 `LiveExecEngineConfig` accepting invalid or sub‑nanosecond interval seconds - Fixed v2 `LiveNode` external order claims bypassing the execution engine (#4347), thanks for reporting @linimin - Fixed v2 `LiveNode.dispose()` before start to release the trader idempotently - Fixed v2 `LiveNode` startup failures to propagate errors and clean up components - Fixed v2 `LiveNode` losing stop requests received during startup - Fixed v2 zero-duration waits to recognize already-ready engines - Fixed Python v2 API coverage and exception handling - Fixed Python v2 backtests rejecting `CustomData` injection (#4582), thanks @xxxxxx-oss - Fixed Python v2 order, event, balance, position, instrument, indicator, and config inspection - Fixed Python v2 `Price`, `Quantity`, and `Money` integer conversion and Money debug output losing precision - Fixed Python v2 cached `OrderList` fields and concrete cache return types (#4453), thanks @JiajunWan - Fixed Python v2 indicators matching Rust semantics (#4421), thanks @a1zb2yc3z - Fixed Python v2 config stub/readback drift for `DataActorConfig`, `StrategyConfig`, and `ExecutionAlgorithmConfig` - Fixed Python v2 `OrderFactory` identity readback while keeping ID-format options on `Strategy.config` - Fixed Python v2 migration gaps for `core.datetime`, `Clock.set_time`, and Strategy data APIs - Fixed Python v2 subclassable PyO3 stubs marked as final (#4384), thanks @bebop23 - Fixed Python v2 `Strategy` close-position and close-all-position commands to accept and forward `params` - Fixed Python v2 `DataActor.shutdown_system()` unregistered calls to raise `RuntimeError` - Fixed Python v2 `LiveNode.stop()` to complete shutdown instead of only signaling the handle - Fixed Python v2 boundary error handling to raise exceptions instead of panicking on invalid inputs - Fixed Python v2 DeFi comparisons to return `NotImplemented` for unsupported ordering instead of panicking - Fixed `OrderFactory.bracket` `tp_post_only` docs (#4437), thanks for reporting @jh171717 and @chang-pro for the patch - Fixed `PerContractFeeModel` spread fees per leg (#4360), thanks @faysou and @pjlegato - Fixed `HEDGING` reduce-only orders without cached position IDs (#4312), thanks for reporting @luckykefu - Fixed `LiveTimer` firing past its `stop_time_ns` bound (#4401), thanks @folknor - Fixed `Clock.timer_exists` to exclude expired timers (#4400), thanks @folknor - Fixed expired clock timers and alert replacement on invalid input (#4477), thanks @folknor - Fixed `TestTimer` panicking after firing at the maximum timestamp - Fixed backtest simulated exchange panicking on order and account status queries (#4545), thanks @folknor - Fixed catalog consolidation dropping single‑file windows (#4435), thanks @Functionhx and @shanezilla - Fixed catalog runtime teardown blocking in PyO3 deallocation (#4493), thanks @faysou and @mystic-io - Fixed global logger initialization races and reuse after guard teardown (#4520), thanks @folknor - Fixed high‑precision builds using mismatched model and serializer widths (#4550), thanks @folknor - Fixed SBE and Cap'n Proto decoding when model precision differs from serializer features (#4567), thanks @folknor - Fixed order purges leaving stale cache index entries that could panic queries (#4569), thanks @folknor - Fixed indicator rolling-window bounds and averages past capacity (#4351), thanks @Martingale42 - Fixed legacy `Equity` catalogs dropping quantity constraints (#4461), thanks @chang-pro and @baturytalk - Fixed live fill deduplication when trade IDs collide across accounts or instruments - Fixed live reconciliation real-time gates to use the monotonic clock (#4376), thanks @folknor - Fixed live missing-order reconciliation to use monotonic receipt time (#4387), thanks @folknor - Fixed live execution engine position activity to stamp receipt time instead of venue `ts_event` - Fixed Rust v2 `log_trace!` rejecting the documented color and component argument forms - Fixed an edge case where same‑millisecond log rotation could delete the active log file - Fixed rotated log file names using a colon reserved on Windows, which could prevent log files being written - Fixed backtest funding, replay order, streaming book state, error policy, duplicate venues, and FX rollover validation - Fixed mixed-instrument backtest order-list fills using the wrong book (#4392), thanks for reporting @gtalknitin - Fixed nondeterministic event ordering in backtests (#4480), thanks @folknor - Fixed nondeterministic emulator unsubscribe, WebSocket replay, and instrument publication ordering - Fixed portfolio PnL and account-state resolution for broker-routed instruments (#4451), thanks @dfjmax - Fixed reverse exchange rates using the wrong spread side and nondeterministic routes (#4568), thanks @folknor - Fixed FX session boundary drift across daylight‑saving transitions (#4584), thanks @folknor - Fixed routing-client position reconciliation tolerance lookup (#4490), thanks @folknor - Fixed Redis message bus startup with Python v2 configs (#4356), thanks for reporting @davidgreyme - Fixed Rust RSI moving-average selection and max-value regression (#4382), thanks @bebop23 - Fixed VWAP nanosecond day rollover (#4428), thanks @akashchakrabortymsc-cmd and @a1zb2yc3z - Fixed Architect AX data and execution clients not refreshing authentication tokens - Fixed Architect AX market data streams emitting unrequested trade and ticker events - Fixed Architect AX `/transactions` requests omitting the required bounded time range - Fixed Architect AX REST ticker, order, transaction models, and query parameters (#4402) - Fixed Architect AX simulated market orders using venue rather than instrument price precision - Fixed Architect AX order book snapshots omitting the snapshot record flag - Fixed Architect AX order book snapshots falling back to venue-precision prices when conversion failed - Fixed Architect AX REST trade and book-snapshot timestamps wrapping instead of rejecting negative seconds - Fixed Architect AX `GET /whoami` model not matching the venue schema, which made the response undeserializable - Fixed Architect AX instruments always reporting zero maker and taker fees - Fixed Architect AX REST and WebSocket assigning different trade IDs to the same market data trade - Fixed Architect AX market data trade IDs colliding when one aggressor swept several book levels - Fixed Architect AX market data subscription tracking, unsubscribes, book-level changes, and failed-subscription replay - Fixed Architect AX startup reconciliation omitting filled and canceled orders from mass status - Fixed Architect AX startup reconciliation failing when venue reports referenced an uncached instrument - Fixed Architect AX data requests remaining active after disconnect, stop, reset, or dispose - Fixed Architect AX instrument, risk, fill, order routing, and pagination for current REST schemas - Fixed Architect AX Python instrument-list and order-book snapshot data requests - Fixed Architect AX depth quote delivery and regular fill reconciliation with optional classification - Fixed Architect AX submitting unsupported reduce-only, quote-quantity, and display-quantity orders - Fixed Architect AX local modify rejections, replacement ID races, and Python reconciliation identity - Fixed Architect AX Python reconciliation emitting duplicate order acceptance events - Fixed Architect AX client order ID bounds, query correlation, and rejection when market previews fail - Fixed Betfair v2 live stream `ts_init` timestamps to use local receipt time - Fixed Betfair v2 matched sizes and mass-status fill IDs, commissions, and gaps - Fixed Betfair v2 voids without reversing unapplied exposure from reconnect snapshots - Fixed Binance Futures hedge-mode tracking with configurable `oms_type` (#4422), thanks for reporting @luckykefu - Fixed Binance Futures algo reports omitting fill quantity and average price - Fixed Binance Futures filled market reconciliation prices (#4441), thanks @KaizynX - Fixed Binance Futures external order reports omitting limit prices (#4346), thanks for reporting @linimin - Fixed Binance Futures external algo order materialization (#4348), thanks for reporting @linimin - Fixed Binance Futures algo orders missing USD-M order-count limits (#4395) - Fixed Binance Futures COIN-M quotas and shared USD-M/COIN-M REST rate-limit state (#4301) - Fixed Binance Futures COIN-M private user stream URL routing in Rust and Python - Fixed Binance Futures inflight queries rejecting untriggered algo orders (#4411), thanks @reijz - Fixed Binance Futures historical algo order queries (#4449), thanks @KaizynX - Fixed Binance Futures startup reconciliation omitting and truncating fill history - Fixed Binance Spot startup reconciliation omitting and truncating fill history - Fixed Binance Spot instrument loading after the SBE schema `3:5` rollout (#4407), thanks @learnerLj - Fixed Binance Spot SBE `ts_init` using venue time instead of the adapter clock (#4474), thanks @seungpyoson - Fixed Binance WebSocket trading signatures to sign parameters sorted by key (#4416), thanks @reijz - Fixed BitMEX cancel-all responses emitting sparse cancellation rejections as external orders - Fixed BitMEX sparse order updates losing cached order state (#4508), thanks for reporting @4px4d9cdby-star - Fixed BitMEX UTF-8 JSON binary WebSocket frames being dropped (#4509), thanks for reporting @4px4d9cdby-star - Fixed BitMEX WebSocket auth rejections waiting for the login timeout (#4541), thanks @folknor - Fixed Blockchain `U256` price and quantity decoding losing exact raw units above the `f64` integer limit - Fixed Blockchain HyperSync live pool-event streams overreaching the tip window - Fixed Blockchain pool‑event sync to backfill missing protocol‑fee history; run `make init-db` for schema changes - Fixed Blockchain pool-event unsubscribe leaving internally owned block feeds active - Fixed Blockchain RPC pool snapshots panicking on incomplete topology - Fixed Bybit post-only rejections omitting the `due_post_only` flag (#4500), thanks @dxwil - Fixed Bybit spot instruments missing `min_notional` and the newer lot-size fields (#4527), thanks @dxwil - Fixed Bybit v2 spot margin auto-repayment quantities, MNT fees, and result handling - Fixed Bybit WebSocket fills hardcoding the commission currency to the quote currency (#4536), thanks @dxwil - Fixed Bybit REST and WebSocket corporate-action executions failing deserialization - Fixed Databento OPRA option contract multipliers (#4388), thanks for reporting @pjlegato - Fixed Databento MBO fill/no-action decoding and replay gating (#4446), thanks @taozle - Fixed Deribit tracked fill and amendment routing while preserving external-order reports - Fixed Derive execution WebSocket connect and reconnect handling - Fixed Derive perpetual quote and settlement currency to USDC - Fixed Derive option `scheduled_activation` parsing as UNIX seconds - Fixed Derive unknown enum decoding and recovery of malformed trade rows - Fixed Derive historical trades and funding order - Fixed Derive historical bar timestamps and forming-bucket filtering - Fixed Derive instrument loading for absent product types and malformed rows - Fixed Derive fill reconciliation dropping fills on retry - Fixed Derive mass status flattening held positions when quantity conversion fails - Fixed Derive null cancel acknowledgements being reported as failures - Fixed Derive zero‑match cancel‑by‑label requests not emitting `OrderCancelRejected` - Fixed Derive cancel, replace, nonce failures, and non-positive `max_fee_per_contract` configs - Fixed Derive shared channel ownership, unsubscribe races, and stale quote caches - Fixed Derive request pacing, write expiry, null IDs, and handler blocking during reconnects - Fixed dYdX instrument parsing panicking on invalid tick sizes (#4562), thanks @sbOogway - Fixed Hyperliquid `l2Book` resubscribe options and shared stream teardown (#4298) - Fixed Hyperliquid resting brackets, filled-order reconciliation, and venue rejection metadata - Fixed Hyperliquid PyO3 order book depth subscriptions (#4381), thanks @graceyangfan - Fixed Hyperliquid Rust public trade responses dropping instrument identifiers - Fixed Hyperliquid order modification to use cached CLOIDs with an OID fallback - Fixed Hyperliquid chained modifications dropping in-flight cancel suppression - Fixed Interactive Brokers bar timestamps to use bar closes (#4579), thanks @dfjmax - Fixed Interactive Brokers execution timestamps for non-UTC zones (#4396), thanks @dfjmax - Fixed Interactive Brokers market order update price normalization (#4383), thanks @faysou - Fixed Interactive Brokers v2 tracked fill lifecycle and terminal fill identity - Fixed Interactive Brokers `IneligibilityReason` serialization (#4380), thanks @xxxxxx-oss - Fixed Interactive Brokers Docker gateway startup with non-default Docker contexts - Fixed Interactive Brokers startup loading all configured instruments (#4519), thanks @mahimn01 - Fixed Interactive Brokers v2 crypto market data for PAXOS and ZeroHash venue routing (#4389), thanks @bebop23 - Fixed Interactive Brokers treating transient data-farm flaps as full connectivity loss (#4412), thanks @dinana - Fixed Interactive Brokers Rust adapter conflating socket connectivity with data-farm health (#4457), thanks @faysou - Fixed Interactive Brokers data feeds waiting for every farm before recovery (#4469), thanks @faysou - Fixed Kraken Futures batch order `order_tag` serialization (#4459), thanks @Andreas197510 - Fixed Kraken Futures fill parsing for all documented `fillType` values (#4591), thanks for reporting @Andreas197510 - Fixed Kraken financial values losing precision through floating-point parsing and arithmetic - Fixed Lighter batch orders to use correlated sequential WebSocket transactions - Fixed Lighter bar and funding‑rate requests returning page‑capped partial history as success - Fixed Lighter live funding updates exposing `funding_timestamp` as `next_funding_ns` - Fixed Lighter reconciliation cursor loops, fill deduplication, and trailing fill identity - Fixed Lighter instrument parsing, gap candle filtering, and spot quote currencies - Fixed Lighter modify validation, conditional acks, nonce recovery, auth refresh, and WS timeouts - Fixed Lighter ambiguous sends, response attribution, live order identity binding, index collisions, and GTD expiry - Fixed Lighter zero‑quantity rows in `account_all_positions` snapshots remaining in cached position reports - Fixed Lighter reconnect auth rotation not reaching the venue (#4603), thanks @folknor - Fixed OKX price-limit metadata parsing and public limit-price requests (#4413) - Fixed OKX v2 yearly candle bar validation and round trips - Fixed OKX algo order status report state filtering and single-order lookups - Fixed OKX ambiguous submit failures to await reconciliation instead of rejecting - Fixed OKX repeated reconciliation reports for replayed post‑only rejections - Fixed OKX public mark-price requests missing the required instrument type - Fixed Polymarket v1 and v2 allowances for the current Neg Risk adapter - Fixed Polymarket auto-loaded instruments not reaching WebSocket subscription (#4574), thanks for reporting @nietoga - Fixed Polymarket RTDS retained-subscription recovery after reconnects (#4353), thanks @graceyangfan - Fixed Polymarket Gamma market and event keyset filters, validation, and repeated query encoding - Fixed Polymarket Gamma discovery to use keyset pagination beyond the legacy offset cap - Fixed Polymarket Gamma pagination looping on repeated cursors (#4605), thanks for reporting @mystic-io - Fixed Polymarket v2 fee schedules and RTDS equity snapshot handling - Fixed Polymarket v2 order cancellation during shutdown so accepted venue orders are not left open - Fixed Polymarket v2 book delta atomicity and local limit-price range validation - Fixed Polymarket v2 market WebSocket batches dropped by unknown `event_type` (#4604), thanks for reporting @mystic-io - Fixed Polymarket v2 execution races, ambiguous submissions, trade finality, fill IDs, and proxy funder validation - Fixed Polymarket v2 SELL sizing, terminal IOC remainders, and sub-cent reconciliation synthetic fills - Fixed Polymarket v2 exec tester close‑on‑stop requesting SELL quantities finer than venue signing permits - Fixed Polymarket v2 limit IOC/FOK BUY orders submitting invalid fractional-cent maker amounts - Fixed Polymarket v2 instrument price bounds to match the current tick-relative venue range instead of static limits - Fixed Polymarket v2 instrument parsing and tick‑size changes panicking (#4534), thanks @mystic-io - Fixed Polymarket v2 batch cancellations exceeding venue ID and signer burst limits - Fixed Tardis replay trades directory to `trades/` for catalog compatibility (#4373), thanks @AdvancedUno - Fixed Tardis replay bars directory to `bars/` for catalog compatibility (#4378), thanks @AdvancedUno ### Internal Improvements - Added `Cache` Criterion bench for `get_xrate` quote and bar fallback paths (Rust) - Aligned Rust event and own‑book ordering with equality (#4598), thanks @folknor - Aligned Rust subscription ordering with equality while preserving delivery order (#4611), thanks @folknor - Improved `Params::get_usize` to return `None` for values outside the target `usize` range - Improved core decimal deserialization to round fractional scales above 28 digits instead of erroring - Improved v2 NETTING backtest throughput by ~17% by encoding position snapshot frames only when a consumer reads them - Improved live reconciliation recency tracking with `RecencyMap` (#4386), thanks @folknor - Improved portfolio statistics test coverage with canonical worked examples - Improved `Quantity` tests across feature‑conditional precision modes (#4556), thanks @folknor - Improved infrastructure tests to fail fast without Redis or PostgreSQL (#4587), thanks @folknor - Improved Clippy compatibility for nightly and all-feature Rust builds (#4505), thanks @folknor - Improved pre-commit checks for DST, Python errors, and Cargo dependency groups (#4506), thanks @folknor - Improved DST coverage for `nautilus-backtest` run timestamps and convention enforcement - Improved test fixture selection to follow the model's precision (#4609), thanks @folknor - Improved Architect AX, BitMEX, and Bybit test runtime (#4553, #4554, #4555), thanks @folknor - Improved Betfair, dYdX, OKX, and Polymarket test waits (#4531, #4532, #4539, #4547), thanks @folknor - Improved dYdX fallback URL tests to avoid network‑dependent outcomes (#4627), thanks @xxxxxx-oss - Improved Hyperliquid stale‑quote recovery tests to avoid load‑sensitive timing (#4610), thanks @folknor - Improved Lighter signing latency through faster quintic field multiplication and squaring - Improved Lighter signing and execution coverage for conditional, IOC, cancel-all, and leverage transactions - Made portfolio reference-count clones explicit (#4364), thanks @ChrisAB - Optimized Polymarket WebSocket parsing and authenticated request signing - Prepared Binance SAPI base URL and path constants for upcoming margin support (#4447), thanks @akashchakrabortymsc-cmd - Standardized Rust adapter task storage with `TaskHandles` and client‑local lifecycle policies - Upgraded Binance Spot SBE REST and WebSocket API requests to schema `3:5` (Rust) - Upgraded Rust (MSRV) to 1.97.1 - Upgraded Cython to v3.2.9 - Upgraded Cap'n Proto to v1.5.0 - Upgraded `capnp` crate to v0.26.2 - Upgraded `databento` crate to v0.55.0 - Upgraded `datafusion` crate to v54.1.0 - Upgraded `ed25519-dalek` crate to v3.0.0 - Upgraded `futures` crate to v0.3.33 - Upgraded `redis` crate to v1.4.1 - Upgraded `rustls` crate to v0.23.43 - Upgraded `sockudo-ws` crate to v2.0.1 - Upgraded `tokio` crate to v1.53.1 - Upgraded `tokio-tungstenite` crate to v0.30.0 - Upgraded `pyarrow` to v25.0.0 ### Documentation Updates - Added the v1-to-v2 property, method, and callback migration matrix - Added v2 `BacktestResult` tearsheet lifecycle and currency filter guidance - Added `managed` parameter docs for `DataActor` book subscriptions (#4589), thanks @sbOogway - Added canonical references and doc comments for portfolio statistics - Added SinoPac Securities community adapter listing (#4324), thanks @Martingale42 - Added Binance Futures `/fapi/v1/algoOrder` order-count rate limit docs - Updated authored comments and documentation to use ASCII punctuation (#4504), thanks @folknor - Updated Polymarket v2 examples and integration docs for current markets, order modes, and configuration - Updated Architect AX integration docs for current market-data, REST schema, and funding-rate behavior - Updated Bybit v2 spot margin auto-repayment behavior and configuration - Updated Lighter integration docs for sequential order fanout and reconciliation limits - Fixed Lighter get-started Python v2 development wheel link - Fixed PyO3 docstring generation for attributes with trailing comments <!-- release-checksums:start --> ## Artifact checksums SHA256 checksums are attached as `SHA256SUMS`, per-asset `.sha256` files, and `dist-manifest.json`. | Artifact | SHA256 | | --- | --- | | [nautilus_trader-1.231.0-cp312-cp312-macosx_26_0_arm64.whl](https://github.com/nautechsystems/nautilus_trader/releases/download/v1.231.0/nautilus_trader-1.231.0-cp312-cp312-macosx_26_0_arm64.whl) | ed9304cbedeccd03e157c89b1e9acc3c9c35785f3bc2a114e4ea2e262a051890 | | [nautilus_trader-1.231.0-cp312-cp312-manylinux_2_35_aarch64.whl](https://github.com/nautechsystems/nautilus_trader/releases/download/v1.231.0/nautilus_trader-1.231.0-cp312-cp312-manylinux_2_35_aarch64.whl) | cae3d3b0dd26e88ce44b75d7696bd0193af62846c22cf6b19d93928643089b83 | | [nautilus_trader-1.231.0-cp312-cp312-manylinux_2_35_x86_64.whl](https://github.com/nautechsystems/nautilus_trader/releases/download/v1.231.0/nautilus_trader-1.231.0-cp312-cp312-manylinux_2_35_x86_64.whl) | 8c438e95c275a13df0c0ddb7012c462708b5e99ff3612e36a1b7bd49ab39c216 | | [nautilus_trader-1.231.0-cp312-cp312-win_amd64.whl](https://github.com/nautechsystems/nautilus_trader/releases/download/v1.231.0/nautilus_trader-1.231.0-cp312-cp312-win_amd64.whl) | 0697f51e9143f9d8d040f75d2e6a45218003cc34f7ea5b0eb2f9cda6935427de | | [nautilus_trader-1.231.0-cp313-cp313-macosx_26_0_arm64.whl](https://github.com/nautechsystems/nautilus_trader/releases/download/v1.231.0/nautilus_trader-1.231.0-cp313-cp313-macosx_26_0_arm64.whl) | b9312bd17cb068bd9407cf360103f7b23c09aaf6118a6321da3def2fe8edaa3d | | [nautilus_trader-1.231.0-cp313-cp313-manylinux_2_35_aarch64.whl](https://github.com/nautechsystems/nautilus_trader/releases/download/v1.231.0/nautilus_trader-1.231.0-cp313-cp313-manylinux_2_35_aarch64.whl) | e536d7c925b3c475bef4f3f8e75196944f6b8758710e41da1109b8b837001690 | | [nautilus_trader-1.231.0-cp313-cp313-manylinux_2_35_x86_64.whl](https://github.com/nautechsystems/nautilus_trader/releases/download/v1.231.0/nautilus_trader-1.231.0-cp313-cp313-manylinux_2_35_x86_64.whl) | 429ea61c33a32cd8498d39e0ea95ebaa12b8dbfc25c71fbaba845f2b05e8ab91 | | [nautilus_trader-1.231.0-cp313-cp313-win_amd64.whl](https://github.com/nautechsystems/nautilus_trader/releases/download/v1.231.0/nautilus_trader-1.231.0-cp313-cp313-win_amd64.whl) | 5fc8e08e98b6a47a5f0104c12ac6d8d3cefa0fd9dd2bb0d211c1b14517ff9aaf | | [nautilus_trader-1.231.0-cp314-cp314-macosx_26_0_arm64.whl](https://github.com/nautechsystems/nautilus_trader/releases/download/v1.231.0/nautilus_trader-1.231.0-cp314-cp314-macosx_26_0_arm64.whl) | eddfa3379e394cdfa1a513722c75cbd083341ecc87a26a9734038c647b27ae6b | | [nautilus_trader-1.231.0-cp314-cp314-manylinux_2_35_aarch64.whl](https://github.com/nautechsystems/nautilus_trader/releases/download/v1.231.0/nautilus_trader-1.231.0-cp314-cp314-manylinux_2_35_aarch64.whl) | 310d6c085dd0786d1aef257c9426a13a879ea8ed2b275b1bb3b9384bea3b5130 | | [nautilus_trader-1.231.0-cp314-cp314-manylinux_2_35_x86_64.whl](https://github.com/nautechsystems/nautilus_trader/releases/download/v1.231.0/nautilus_trader-1.231.0-cp314-cp314-manylinux_2_35_x86_64.whl) | fc0aa9ea14628a30afdcce216e8cb94f11e733d83edb3e1883fdb30b6ca35586 | | [nautilus_trader-1.231.0-cp314-cp314-win_amd64.whl](https://github.com/nautechsystems/nautilus_trader/releases/download/v1.231.0/nautilus_trader-1.231.0-cp314-cp314-win_amd64.whl) | 295b67b127f67429ebb9d937bd11448f930bee697fca6a8e0ec1de343ad3c68c | | [nautilus_trader-1.231.0.tar.gz](https://github.com/nautechsystems/nautilus_trader/releases/download/v1.231.0/nautilus_trader-1.231.0.tar.gz) | 142dde40e77339745aa5fe6bcbb3de5624cee087f526879da00f127df077530f | ### Verify provenance After downloading an artifact, verify its GitHub artifact attestation: ```bash gh attestation verify <artifact> \ --repo nautechsystems/nautilus_trader \ --cert-identity "https://github.com/nautechsystems/nautilus_trader/.github/workflows/build.yml@refs/heads/master" \ --cert-oidc-issuer https://token.actions.githubusercontent.com ``` <!-- release-checksums:end -->