NautilusTrader 2.0.0rc8
Released on 28th October 2026 (UTC).
Enhancements
- Added gzip support to buffered HTTP requests (#5420), thanks @cryptolenny3
- Added
ReplaySourceandDataIterator::add_sourcefor fallible replay with pending frontiers - Added batched data subscriptions and unsubscriptions, thanks @faysou
- Added batched historical instrument, quote, and trade requests, thanks @faysou
- Added
on_data_responsehooks for historical completion and partial failures, thanks @faysou - Added
DataActor::request_groupfor grouped historical request completion - Added Python historical request callbacks,
request_join, and pending inspection for actors and strategies - Added historical request catalog write-back with confirmed source coverage, thanks @faysou
- Added native external MessageBus data requests and replies for JSON and MessagePack
- Added
LiveNode::add_python_exec_algorithm_from_configfor embedded Python execution algorithms - Added
LiveNode::add_python_strategy_from_configfor embedded Python strategies - Added
nautilus_pyo3::register_embedded_modulefor embedded Python - Added
Money::from_decimal_exactandMoney::from_str_exactfor fractional amounts beyond currency precision - Added exact
Moneyround trips through JSON, MessagePack, Arrow, PostgreSQL, and Python balance dictionaries - Added accumulation of fractional
Moneycommissions beyond currency precision - Added optional venue-reported liquidation prices to
PositionStatusReport - Added custom fee models for sandbox execution clients (#5328), thanks @imbolc
- Added Python-subclassable latency models with command and clock time context
- Added custom Python fill models in backtest venue and sandbox configuration
- Added custom Python margin models in backtest venue and sandbox configuration
- Added Binance Spot JSON
update_speedsubscription parameter for 100ms depth streams - Added Binance Spot SBE list-status decoding with child acceptance and rejection
- Added Derive explicit WebSocket cancel-on-disconnect control
- Added Derive execution-client cancel-on-disconnect configuration for resting limit orders
- Added Hyperliquid scheduled cancellation with automatic execution-client refresh
- Added Hyperliquid instrument status subscriptions through metadata polling (#5346), thanks @dxwil
- Added Interactive Brokers optional account base currency (#5322), thanks @chaneyka1
- Added Interactive Brokers
max_reconnect_attemptsconfiguration (#5392), thanks @tradatious - Added liquidation prices to Lighter position status reports
- Added proactive Lighter WebSocket reconnects on venue
shutdownnotices - Added Lighter APIs for account-wide cancellation and manual scheduled cancellation with revocation
- Added Lighter execution-client scheduled cancellation with automatic renewal
- Added Lighter self-trade behavior and account-scope order params with explicit defaults
- Added OKX startup reconciliation history page limits (#5279), thanks for reporting @almostintuitive
- Added OKX trading-account bills and archive queries (#5352), thanks @silarin
Breaking Changes
- Removed Cap'n Proto codecs and
capnpfeatures; use JSON or MessagePack for native messages - Removed
Paramsmutation; build anIndexMapand callParams::new - Removed
instrument_expirationandhas_unprocessed_instrument_expiration(#5407), thanks @mahimn01 - Removed Hyperliquid
Secrets::from_fileandfrom_json; usefrom_private_keyorfrom_env - Removed Polymarket
FeeRateResponse::to_rateand Gammaset_clob_clientandclob_clientmethods - Replaced flat
BacktestDataConfigcatalog fields withcatalog: DataCatalogConfig - Replaced
ExecutionReportTask.resultwith synchronousfinish; join the collection worker first - Renamed
Params::new()toParams::empty()andParams::from_index_maptoParams::new(map) - Changed simulated
MARK_PRICEtriggers to require mark updates; sandbox mark triggers remain unsupported - Changed buffered
HttpClientbodies to decode gzip; remove manual decoding or useget_streamfor raw bytes - Changed
DataIterator::{peek, next, next_stream_item}to returnResult<ReplayPoll<_>>; handle all states - Changed
DataIterator::peekto require&mut selffor source polling - Changed
DataIterator::reset_all_cursorsto returnResult; handle unsupported or failed resets - Changed
DataIteratorandBacktestDataIteratorto omitSendandSync; construct and use on one thread - Changed request and subscription fields to
instrument_idsandbar_typeslists, thanks @faysou - Changed quote and trade response fields to
instrument_idslists, thanks @faysou - Changed quote, trade, bar, book-delta, book-depth, and funding responses to
BatchView<T>, thanks @faysou - Changed correlated response handlers to
TypedHandler<DataResponseEnvelope>, thanks @faysou - Changed backtest registration to reject conflicting definitions for an instrument ID (#5407), thanks @mahimn01
- Changed
nautilus-pyo3without default features to omit standard adapter bindings; enableadaptersto include them - Changed
BusPayloadType: addRequestCommandandDataResponsearms to exhaustive matches - Changed
StrikeRangeto non-exhaustive; add a wildcard arm to downstream matches - Changed
Moneydisplay and decimal conversion to retain finer digits; round to currency precision explicitly - Changed
Moneydeserialization to reject excess precision instead of rounding; round inputs before loading - Changed SBE depth encoding for padded or variable levels and nonzero order IDs; update readers for the new layout
- Changed
BusMessageto addsource; useBusMessage::newto construct messages without provenance - Changed
PositionStatusReportliterals: addliquidation_price: Noneor usenew - Changed emulated releases to undergo risk checks; use
REDUCINGfor eligible exits, asHALTEDdenies stops - Changed order-list validation to deny unsent siblings; retry with new IDs (#5336), thanks @imbolc
- Changed direct
OrderMatchingEngineuse: shareMatchingOrdersand drain commands for cross-instrument OTO orders - Changed
OrderMatchingEngineexpiration to wait for queued fills; retryprocess_instrument_expirationafterward - Changed
LatencyModeloperation methods; accept(command, ts_now)and returnResultin custom models - Changed Python
BacktestVenueConfigmodel and module argument order; pass them by keyword - Changed Python
BacktestEngine.add_venue()model argument order; pass models by keyword - Changed Python
SandboxExecutionClientConfigargument order; pass models and matching options by keyword - Changed
MarginModelAnywith thepythonfeature enabled; add thePythonvariant to exhaustive matches - Changed
SandboxExecutionClientConfigliterals; addmargin_model: Noneor use the builder - Changed
OrderDeniedReason: addUnsupportedQuoteQuantity { detail }to exhaustive matches - Changed
OrderDeniedReason: addUnsupportedPostOnly { detail }to exhaustive matches - Changed unsupported quote-quantity denials to
UNSUPPORTED_QUOTE_QUANTITY; update reason string matching - Changed unsupported post-only denials to
UNSUPPORTED_POST_ONLY; update reason string matching - Changed Architect AX WebSocket
submit_order: pass&OrderInitialized::from(&order)for identity and side - Changed Architect AX
OrderMetadataliterals: addorder_initandis_accepted - Changed Architect AX
AxMdTrade.dto requiredAxOrderSide; replaceSome(side)withside - Changed Binance Spot JSON depth subscriptions to default to 100ms; set
update_speed=1000for 1000ms - Changed Binance Spot SBE
parse_trades_eventandparse_bbo_eventto returnResult; handle parse errors - Changed Binance Spot SBE
parse_depth_snapshotandparse_depth_diffto returnResult; handle parse errors - Changed Binance spot
BinanceAccountInfo::to_account_stateandparse_spot_account_positionto returnResult - Changed Bybit TradFi perpetuals to
PerpetualContract; update type checks (#5344), thanks @dxwil - Changed Bybit spot xStocks to
TokenizedAsset; update type checks (#5344), thanks @dxwil - Changed Deribit local validation failures from
OrderRejectedtoOrderDenied; invalid members deny the whole list - Changed dYdX mark/index precision to the build maximum; precision-16 recordings require a high-precision reader
- Changed Hyperliquid
UpdateIsolatedMargin: replacedeltawithis_buyandntli(signed millionths) - Changed Hyperliquid account inputs to require lowercase or EIP-55 hex; blank explicit addresses now error
- Changed
HyperliquidHttpClient::set_account_addressto returnResult; handle validation errors - Changed Interactive Brokers magnified price units; follow the adapter upgrade guide (#5322), thanks @chaneyka1
- Changed Interactive Brokers execution config literals; add
base_currency: None(#5322), thanks @chaneyka1 - Changed Lighter
LighterHttpError:Httpaddsretry_after;RateLimituses namedmessageandretry_after - Changed Lighter
compute_tx_hashandsign_txto returnResult; handle invalid transaction attributes - Changed Lighter execution config literals; add
scheduled_cancel_timeout_secs: Noneor use the builder - Changed Lighter
L2TxAttributesliterals; add the new fields or use..Default::default() - Changed OKX spot stop/touched buys to explicit base or quote sizing; resubmit pending buys
- Changed OKX unsupported algo quote sizing to local denials; resubmit spot trailing buys with quote quantity
- Changed OKX algo triggers to deny unsupported feeds and cash/trailing mark/index; use last price
- Changed OKX WebSocket algo placement to return an error; use
OKXHttpClientfor algo orders - Changed OKX
OKXPlaceAlgoOrderRequestliterals to requireccy; use quote currency for spot margin, otherwiseNone - Changed Python
OKXHttpClient.place_algo_orderspot stop-market and market-if-touched buy defaults from quote to base - Changed Python OKX quote-budget algo calls to require
quote_quantity=True, including spot trailing buys - Changed OKX
place_algo_order_with_domain_typesto requirequote_quantity; passfalsefor base sizing - Changed OKX execution config literals; add
max_reconciliation_history_pages: None - Changed
PolymarketInstrumentDef.gamma_eventfromOption<String>toOption<Arc<Value>>(#5389), thanks @imbolc - Changed Polymarket market-order preparation to use
OrderDeniedconsistently; handleon_order_denied - Changed Polymarket
PolymarketTradeReport.transaction_hashfromStringtoOption<String> - Changed Polymarket data WebSocket timeouts from 15 to 30 seconds by default;
ws_timeout_secsmust be positive - Changed
PolymarketInstrumentDefto requiremarket_version: "v1"; reload cached instruments - Changed Polymarket
EventQueryFilterto reject unsupported inputs; remove unsupported parameters and sort fields
Security
- Fixed backtest aborts on non-time execution bars (#5271), thanks for reporting @axlnur
- Fixed order fills accepting cumulative commissions beyond
Moneybounds or panicking after partial state changes - Fixed matching-engine restarts reusing position IDs for independent hedging orders
- Fixed
DataType::from_strpanics on repeated identifier suffixes - Fixed custom-data deserialization panics on metadata containing the reserved
identifierkey - Fixed exchange-rate calculation panics on decimal overflow
- Fixed Parquet period consolidation and delete losing rows when rewrites share a file name (#5422), thanks @faysou
- Fixed Parquet catalog queries reading NaN floats back as another row's value (#5422), thanks @faysou
- Fixed Python order
from_dictmethods aborting on invalid identifiers, quantities, and prices - Fixed Python account reconstruction aborting on invalid account IDs
- Fixed Python margin balance and account reconstruction aborting on invalid instrument IDs
- Fixed JSON decimal deserialization panics on
i32::MINexponents in builds with overflow checks enabled - Fixed HTTP
Refererheaders exposing URL paths and query parameters on cross-origin redirects - Fixed Feather run recovery modifying files outside the catalog through path traversal or symlinks
Fixes
- Fixed Parquet promotion rejecting bar replays and skipping cleanup (#5400), thanks for reporting @onixlab-ai
- Fixed backtest
MARK_PRICEtriggers ignoring mark prices (#5264), thanks for reporting @rubix28 - Fixed NETTING PnL statistics losing cycles with the same open timestamp (#5288), thanks for reporting @qOeOp
- Fixed account state subscriptions missing accepted updates (#5410), thanks @graceyangfan
- Fixed unavailable
OrderFilledcommissions displaying as zero - Fixed live bulk order reconciliation timeouts discarding finalized adapter reports
- Fixed live timer backlogs starving data events and commands (#5431), thanks @imbolc
- Fixed book recovery timeouts reporting the snapshot limit instead of the attempt limit (#5425), thanks @imbolc
- Fixed position reconciliation timeouts discarding finalized snapshots and authoritative fills
- Fixed Python
LiveNode.add_strategy_from_configaccepting strategies when the node is not idle - Fixed Python Parquet catalog typed reads and writes holding the GIL during native I/O
- Fixed Python statistics and return series ordering (#5432), thanks @mahimn01
- Fixed targeted order reconciliation discarding accepted statuses and fills after timeout or cancellation
- Fixed OUO sibling resizes converting base quantities twice when quote-denominated stops trigger
- Fixed matching engine bracket exit rejections cascading to valid siblings (#5460), thanks for reporting @luk911
- Fixed LAST and MID bar execution skipping positive volume when OHLC prices repeat
- Fixed matching engine liquidity overconsumption with market-to-limit, reduce-only, and queue position tracking
- Fixed expiration settlement missing final-tick fills when position updates are deferred
- Fixed reduce-only FOK orders canceling when liquidity covered the remaining position but not the order quantity
- Fixed
MarketToLimitfirst-level fills and FOK/IOC handling (#5408), thanks @Milchstrassse - Fixed external JSON and MessagePack DeFi blocks losing their chain identity
- Fixed DeFi swap simulation and replay hanging at bounds or accepting unreachable price limits
- Fixed SBE market data decoding panics on invalid prices and quantities
- Fixed Parquet writes of mixed custom data; conflicting file groups fail before writing (#5405), thanks @faysou
- Fixed reconciliation leaving amended orders in
PendingUpdateafter working reports confirm changed terms - Fixed startup reconciliation leaving orders partially filled after venue quantity reductions
- Fixed risk denials for released orders and cleanup of their contingent orders
- Fixed simulated venues matching cross-instrument OTO children with their parent's market and execution state
- Fixed Python isolation checks failing with inherited
PYTHONHOME - Fixed non-ASCII signal topics to use Unicode titlecase mappings
- Fixed unbounded memory growth in
SubscriptionStatefrom unknown WebSocket subscription acknowledgments - Fixed
RetryManagerskipping minimum retry delays after operation timeouts (#5406), thanks @imbolc - Fixed
ExecTestersubmitting replacement stop orders before cancellation acknowledgment - Fixed sandbox restarts reviving closed OTO children while the cache still shows them open
- Fixed sandbox position checks creating spurious closing trades (#5357), thanks @awss1i
- Fixed Architect AX handler stalls during book writes and uncanceled queued book replacements
- Fixed Architect AX order tracking across uncertain submits, replacements, and simulated market order fills
- Fixed Architect AX closed-order reports preceding their fills during reconciliation
- Fixed Architect AX special-fill reconciliation, fill-history windows, and cached flat-position recovery
- Fixed Architect AX position-report requests dropping flat rows and skipping invalid rows
- Fixed Architect AX WebSocket trades accepting missing aggressor sides
- Fixed Binance Spot and Futures overlapping instrument-status updates losing or duplicating changes
- Fixed Binance USD-M and COIN-M aggregate trade requests rejecting history between 24 and 48 hours old
- Fixed Binance Futures funding-fee account updates discarding symbol attribution
- Fixed Binance Futures HTTP order reports using update time as acceptance time
- Fixed Binance spot account balances panicking or skipping an unrepresentable amount
- Fixed Binance spot SBE exponent overflow aborting user-data decode (#5320), thanks @zifulifufu
- Fixed Binance Spot SBE stream panics and negative quantities parsed as large sizes
- Fixed Binance Spot HTTP SBE order reports mapping take-profit orders as stop orders
- Fixed Binance Futures recovery stalling on expired listen keys (#5446), thanks @Milchstrassse
- Fixed Bybit fill prices using the commission currency instead of the quote currency (#5385), thanks @Milchstrassse
- Fixed Bybit fill-report requests silently dropping fills that fail to parse
- Fixed Bybit premature order acceptance from invalid WebSocket executions
- Fixed Bybit unsupported time in force reaching submission for market, limit, and post-only orders
- Fixed Bybit GTD orders failing validation on HTTP submission
- Fixed Bybit reconciliation timeouts losing pending cancel and amend rejection events
- Fixed Databento live trades duplicated across different record types (#5367), thanks @chaneyka1
- Fixed Deribit depth subscriptions emitting deltas and disrupting raw order books
- Fixed Deribit sending orders after event channel failures (#5324), thanks for reporting @maru-marvelquant
- Fixed Deribit WebSocket subscribe and unsubscribe requests bypassing the subscription rate limit
- Fixed Derive decoding null or empty mark/index prices, candle values, and historical funding rates as zero
- Fixed Derive data clients ignoring the configured instrument refresh interval
- Fixed Derive public trades with unrecognized liquidity roles reporting a known aggressor side
- Fixed Derive submitting quote-denominated order quantities as base units
- Fixed Derive iceberg display quantities being silently discarded during order submission
- Fixed Derive startup stalls when loading large instrument listings
- Fixed Derive tracked fills routed to reconciliation after cancellation (#5355), thanks for reporting @Karrenbelt
- Fixed dYdX oracle price precision for catalog promotion (#5391), thanks for reporting @fintech07
- Fixed Hyperliquid funding history truncation and latest-row limits (#5343), thanks @dxwil
- Fixed Hyperliquid builder-fee commands treating invalid
HYPERLIQUID_TESTNETvalues as mainnet - Fixed Hyperliquid leverage and isolated-margin request serialization and signing
- Fixed Hyperliquid account addresses reaching requests and subscriptions without validation or normalization
- Fixed Hyperliquid USD class transfers to return an explicit unsupported-action error before signing
- Fixed Hyperliquid WebSocket readiness being published before handler initialization
- Fixed Hyperliquid private WebSocket parse errors exposing account data in logs
- Fixed Hyperliquid data client consumption loop remaining active after its WebSocket handler closes
- Fixed Hyperliquid REST fill reports omitting venue client order IDs
- Fixed Hyperliquid REST order and fill report panics on invalid client order IDs
- Fixed Hyperliquid reconnect recovery losing missed events after history request failures
- Fixed Hyperliquid capped reconciliation history creating positions without explicit position reports
- Fixed Interactive Brokers small-lot entry prices after commission rounding (#5327), thanks @bebop23
- Fixed Interactive Brokers futures expiry times blocking market data (#5318), thanks @chaneyka1
- Fixed Interactive Brokers quote sizes dropped by float rounding (#5318), thanks @chaneyka1
- Fixed Interactive Brokers stocks ignoring
symbol_to_mic_venue(#5330), thanks @mmatvien - Fixed Interactive Brokers FX prices falling between price increments (#5322), thanks @chaneyka1
- Fixed Interactive Brokers orders and fills for instruments loaded at runtime (#5349), thanks @jweltmer
- Fixed Interactive Brokers missing or stale bars after resubscription (#5331), thanks @tradatious
- Fixed Interactive Brokers spread instrument requests at runtime (#5397), thanks @faysou
- Fixed Interactive Brokers order updates stopping after stream errors (#5427), thanks @tradatious
- Fixed Kraken Futures batch edits sending
orderIdinstead oforder_id(#5312), thanks @zhaow-de - Fixed Kraken Futures client order IDs shortened to 18 characters (#5312), thanks @zhaow-de
- Fixed Kraken Spot L3 queue priority after same-price order modifications (#5421), thanks @ahmetsbilgin
- Fixed Lighter funding rates 100x too high and missing the live interval (#5338), thanks @dxwil
- Fixed Lighter order lookups using the wrong client order ID after a collision and restart
- Fixed Lighter deferred order reports being treated as proof of absence
- Fixed Lighter execution sender setup and reinstallation on repeated starts
- Fixed Lighter fill parse errors consuming acceptance and replay state
- Fixed Lighter read retries ignoring
Retry-Afterresponse headers - Fixed Lighter probes for completed cancels consuming REST quota and delaying modification confirmation
- Fixed Lighter cancellation recovery stopping before terminal order status is available
- Fixed Lighter single-order cancel transaction failures leaving orders pending cancel
- Fixed Lighter batch operations failing instead of retrying as nonce refresh completes
- Fixed empty and incomplete OKX historical bar responses (#5339), thanks for reporting @AlphaTraderK
- Fixed OKX external limit orders missing amendment confirmations
- Fixed OKX spot
StopMarketandMarketIfTouchedbuy sizing (#5371), thanks for reporting @michalismeng - Fixed OKX WebSocket send failures delaying rejection events and leaving unsent cancels unresolved
- Fixed OKX USD-margined futures and swaps routed as spreads (#5337), thanks for reporting @michalismeng
- Fixed Polymarket event metadata duplicated across instruments and cache clones (#5389), thanks @imbolc
- Fixed Polymarket backtest taker fees rounding to nearest instead of flooring to five decimal places
- Fixed Polymarket data clients ignoring
ws_timeout_secsfor market and PolyBolt WebSockets - Fixed Polymarket auto-load retrying filter-rejected instruments and logging false missing-market errors
- Fixed Polymarket batch cancels discarding completed results when a later chunk fails
- Fixed Polymarket batch submits delaying later chunks behind FOK recovery and deferred cancels
- Fixed Polymarket book recovery continuing after market resolution (#5359), thanks @imbolc
- Fixed Polymarket tick-size changes logging misleading invalid book snapshot warnings
- Fixed Polymarket quiet books staying unsynced when the initial subscription snapshot is lost
- Fixed Polymarket stale snapshots restoring deleted book levels
- Fixed Polymarket cancels lost while submit responses register venue order IDs
- Fixed Polymarket closure timestamps causing catalog promotion overlaps (#5358), thanks @imbolc
- Fixed Polymarket reconciliation reverting resting partially filled orders to
Accepted - Fixed Polymarket
price_changequotes carrying sizes from different price levels - Fixed Polymarket stale quotes after suppressing unchanged quotes (#5424), thanks @imbolc
- Fixed Polymarket stale book levels after resubscribing with effective deltas enabled
- Fixed Polymarket loading, request caching, and execution lookup cleanup for open markets past
endDate - Fixed Polymarket market order reconciliation panics after delayed FOK status checks
- Fixed Polymarket market-order HTTP rejections missing
OrderSubmitted - Fixed Polymarket market data subscriptions stalling after transient initial WebSocket connection failures
- Fixed Polymarket taker rates derived from CLOB
base_feewhen Gamma rates are missing or zero - Fixed Polymarket
zero_feesmarkets logging missing taker-rate warnings - Fixed Polymarket trade history and settlement recovery failing on missing or null transaction hashes
- Fixed Polymarket taker fill prices and fees across price levels and complementary tokens (#5404), thanks @SoYuCry
- Fixed Polymarket accepting unsupported market protocols during discovery, trading, and position operations
- Fixed Polymarket accepting new submissions and replacements after settlement hard faults (#4876)
Internal Improvements
- Added deferred finalization for live execution report collection
- Added
rust-code-analysis-cliv0.0.25 tomake install-tools - Improved
make pre-committo check Rust formatting againstorigin/develop(#5442), thanks @tradatious - Improved Dockerfile linting to run Hadolint without Docker
- Improved live shutdown test coverage for slow position report collection
- Improved performance CI to fail when any benchmark crate fails
- Refined live reconciliation report collection and task ownership
- Refined live execution reconciliation to share cached-order processing and simplify position coverage checks
- Restored default-feature compilation of
position_replay_criterionbenchmarks - Standardized Blockchain Clippy exceptions to preserve workspace checks
- Optimized bar execution when no orders are working (#5454), thanks @mi-netizen007
- Optimized JSON and MessagePack decoding and custom data response encoding
- Optimized order last-event reads to avoid collecting history (#5412), thanks @graceyangfan
- Optimized passive limit matching and L1 queue tracking with many orders behind the BBO
- Optimized position purging to avoid cloning fill and replay history (#5414), thanks @graceyangfan
- Optimized position reconciliation checks for already-applied fill reports
- Optimized typed message router subscription registration and removal (#5426), thanks @imbolc
- Optimized virtual hedging fill-history checks during execution and reconciliation
- Standardized Architect AX owned execution report tasks
- Removed unused Interactive Brokers data farm degradation timestamps (#5376), thanks @tradatious
- Optimized Polymarket instrument caching during bootstrap and refresh (#5373), thanks @imbolc
- Optimized Polymarket market WebSocket shutdown (#5443), thanks @imbolc
- Optimized Polymarket snapshot diffs and trade ID formatting
- Optimized Polymarket subscription registration and resolution watchlists (#5438), thanks @imbolc
- Updated Nautilus Engineering common tooling
- Upgraded Rust (MSRV) to 1.99.1
- Upgraded
cargo-codspeedtool to v5.0.3 - Upgraded
cargo-edittool to v0.13.14 - Upgraded
cargo-nextesttool to v0.9.149 - Upgraded
cargo-vettool to v0.10.3 - Upgraded
OSV Scannertool to v2.7.0 - Upgraded
pgAdmincontainer image to v9.18 - Upgraded
PostgreSQLcontainer image to v18.6 - Upgraded
prektool to v0.5.7 - Upgraded
Rediscontainer image to v8.10.2 - Upgraded
Socket CLItool to v1.10.0 - Upgraded
uvtool and pre-commit hook to v0.13.5 - Upgraded
markdownlint-cli2pre-commit hook to v0.24.0 - Upgraded
pyupgradepre-commit hook to v3.22.0 - Upgraded
zizmorpre-commit hook to v1.31.1 - Upgraded
arc-swapcrate to v1.9.3 - Upgraded
arrowandparquetcrates to v59.3.1 - Upgraded
aws-lc-rscrate to v1.18.2 - Upgraded
codspeed-criterion-compatcrate to v5.0.3 - Upgraded
libccrate to v0.2.191 - Upgraded
parking_lotcrate to v0.13.0 - Upgraded
proptestcrate to v1.12.0 - Upgraded
pyo3crate to v0.30.1 - Upgraded
pyo3-async-runtimescrate to v0.30.0 - Upgraded
redbcrate to v4.4.0 - Upgraded
rediscrate to v1.8.0 - Upgraded
rstestcrate to v0.28.0 - Upgraded
ruintcrate to v1.21.1 - Upgraded
serde_jsoncrate to v1.0.154 - Upgraded
smallveccrate to v1.16.4 - Upgraded
sockudo-wscrate to v3.1.0 (#5345), thanks @sunlei - Upgraded
syncrate to v3.0.9 - Upgraded
tokiocrate to v1.54.1 - Upgraded
tomlcrate to v1.1.8 - Upgraded
uuidcrate to v1.29.0 - Upgraded
webpki-rootscrate to v1.0.11 - Upgraded
certifipackage to v2026.10.19 - Upgraded
kaleidopackage to v1.5.0 - Upgraded
polarspackage (dev) to v2.0.0 - Upgraded
pyarrowpackage (dev) to v26.0.0 - Upgraded
ruffpackage (dev) and pre-commit hook to v0.17.2 - Upgraded
typackage (dev) to v0.0.89
Documentation Updates
- Added
Moneyexact-construction and persistence guidance - Added historical request batching, callback, and completion group guidance
- Added custom Python fill, fee, margin, and latency model guidance
- Added BDD guidance for startup reconciliation scenarios
- Added partial release recovery and verification procedures
- Clarified cache history ordering, indexing, and Python accessors
- Updated Lighter funding rate units and live interval documentation (#5356), thanks @dxwil
- Documented Polymarket taker fill averaging, fees, and settlement precision (#5415), thanks @SoYuCry
Artifact checksums
SHA256 checksums are attached as SHA256SUMS, per-asset .sha256 files, and dist-manifest.json.
| Artifact | SHA256 |
|---|---|
| nautilus_trader-2.0.0rc8-cp313-cp313-macosx_11_0_arm64.whl | 5a27e015285f493cf4f5f9adb669452f4e20bde9d5ded3839da68e7e4bc80990 |
| nautilus_trader-2.0.0rc8-cp313-cp313-manylinux_2_34_aarch64.whl | ddefb0d84ece4a7efe228f0115a8887f702449369a1c642267f4ca4022b2479d |
| nautilus_trader-2.0.0rc8-cp313-cp313-manylinux_2_34_x86_64.whl | c6cb90b69f2a0802f0c87ec14a328e1a467a05a206b13dad8f6ab8efec388b0f |
| nautilus_trader-2.0.0rc8-cp313-cp313-win_amd64.whl | 08949c112bcd00f8ba68a091b634106f12f4d75922e421c3217347fe9ca10664 |
| nautilus_trader-2.0.0rc8-cp314-cp314-macosx_11_0_arm64.whl | bce53a95a48721d1eda338d09a247548535f4970bc35aa1c7f7190e2b1dbbecb |
| nautilus_trader-2.0.0rc8-cp314-cp314-manylinux_2_34_aarch64.whl | f6778fa094785a5f4cf30b0ebdea085e1f3d6e54cfa972dabe1683c736dd4db6 |
| nautilus_trader-2.0.0rc8-cp314-cp314-manylinux_2_34_x86_64.whl | 40b67dd1b91c9b553d755bc2ac48c0d0e5fa9496a8089efde7b564d7280a6f21 |
| nautilus_trader-2.0.0rc8-cp314-cp314-win_amd64.whl | 2bb74a7c64036f590f8b9e575d3fa7c7d76e924b51b28b3dedd6292913da4670 |
| nautilus_trader-2.0.0rc8.tar.gz | b5a1caffbb3a2e1a4a1259a33ca2f058d2e703f6efe06780e63fd48b1a79e973 |
Verify provenance
After downloading an artifact, verify its GitHub artifact attestation:
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.comFor artifacts with publication recovery attestations, select the recovery predicate:
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 \
--predicate-type "https://nautilustrader.io/attestations/release-recovery/v1"