Skip to content

NautilusTrader 2.0.0rc3

Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 21 Aug 01:20
· 0 commits to develop since this release
Immutable release. Only release title and notes can be modified.
648970c

NautilusTrader 2.0.0rc3

Released on 20th August 2026 (UTC).

Note

Some renames in this release, such as AggressorSide Buyer/Seller becoming Buy/Sell, restore
the most correct naming conventions. The Cython-era C API shared one enum namespace across types,
which ruled out these names; since the removal of Cython, that limitation no longer applies.

Enhancements

  • Added dead-peer detection to every transport with a configured heartbeat, reconnecting when the peer stops sending
  • Added TCP keepalive and Linux TCP_USER_TIMEOUT to all outbound connections, detecting half-open sockets in ~1 min
  • Added HTTP CONNECT proxy support to the Sockudo WebSocket backend
  • Added WebSocketConfig.heartbeat_timeout_secs so every connect entry point can set a liveness window
  • Added a one‑second floor on flapping reconnect attempts, keeping clients under venue connection‑rate limits
  • Added WalletAccount for native and token balances with local reservations
  • Added PositionOpened realized PnL
  • Added AccountState venue metadata
  • Added canonical Rust backtest results with normalized projections, content digests, and stable ordering
  • Added full Rust config parity for the Python testkit ExecTesterConfig
  • Added Sum iterator support for owned and borrowed Quantity values (#4720), thanks @faysou
  • Added Python v2 Redis message bus backing for LiveNode (#4630), thanks for reporting @davidgreyme
  • Added Python v2 cache database backing for LiveNode (#4634), thanks for reporting @AlphaTraderK
  • Added Python v2 LiveNode.run_async(), LiveNodeHandle, and NodeState for caller-owned event loops
  • Added direct message bus backing installation through RedisMessageBusConfig
  • Added LiveNode.start() warning when external message bus ingress requires run()
  • Added trader start warning when load_state or save_state is enabled without a cache database backing
  • Added runtime external‑order claim registration and removal to Rust LiveNode (#4620), thanks @folknor
  • Added INFO logs for socket and WebSocket connection loss and recovery (#4621), thanks @folknor
  • Added Rust and Python SocketStateChanged events for Binance Futures, Lighter, and Polymarket live clients
  • Added Coinbase heartbeat counter gap warnings, resetting after reconnect
  • Added Deribit book summaries as requestable custom data (#4576), thanks @graceyangfan
  • Added Derive fixed-window rate limits for global and per-instrument matching requests
  • Added Hyperliquid socket-state reporting and reconnect_socket on data and execution WebSockets
  • Added Hyperliquid user TWAP history and slice fills as opt‑in custom data (#4674), thanks @graceyangfan
  • Added Interactive Brokers support for canonical 21‑character OPRA option IDs (#4774), thanks @xxxxxx-oss
  • Added Lighter inbound liveness timeout and socket-state reporting on data and execution WebSockets
  • Added Polymarket compute_effective_deltas config option to emit net changes for book snapshots (default False)
  • Added Polymarket series_ids instrument provider scoping for Gamma market families (#4650), thanks @mystic-io
  • Added Polymarket instrument bootstrap from a filters map or a registered InstrumentFilter without load_all
  • Added Polymarket backtest fee model with per-market taker fees and maker credits

Breaking Changes

  • Removed legacy v1 Cython package and root build path; use the Rust + PyO3 package
  • Removed nautilus_trader.core.is_pycapsule; use normal Python type checks on model objects
  • Removed model as_pycapsule methods and OrderBookDeltas.from_pycapsule; pass typed model objects directly
  • Removed FFI features and static libraries outside nautilus-core and nautilus-model; use Rust or PyO3 APIs
  • Removed cython-compat, Cython cbindgen configs, and drop_cvec_pycapsule; use PyO3 APIs
  • Removed generic Python clients and support APIs from nautilus_trader.network; use adapter APIs or nautilus-network
  • Removed LiveNode.poll() and Python LiveNode.start(); use hosted run_with_mode(...) or run_async()
  • Removed nautilus_trader.data.OptionChainManager; use subscribe_option_chain and handle OptionChainSlice
  • Removed Cache.actor_ids(), which always returned an empty set; use Rust Trader::actor_ids()
  • Removed WebSocketClient::connect_with_heartbeat_timeout; set WebSocketConfig.heartbeat_timeout_secs instead
  • Removed duck-typed object conversion from BacktestEngine.add_data; pass model objects directly
  • Removed unused Rust SocketClient and WebSocketClient connection callbacks; use message or epoch handlers
  • Removed Rust nautilus_execution::matching_engine::adapter::OrderEngineAdapter; use OrderMatchingEngine
  • Removed Rust from_pyobject constructors from nautilus_model data types; use Bound::extract for the target type
  • Removed Rust nautilus_core::CleanDrop and its drop module; implement Drop directly
  • Removed Databento load_*_as_pycapsule methods; use the corresponding load_* methods
  • Removed the trailing heartbeat_timeout parameter from the epoch-handler connect; set it on the config
  • Replaced Rust nautilus_model::python::data::data_to_pycapsule with data_to_pyobject
  • Renamed Portfolio.margins_init to instrument_initial_margins
  • Renamed Portfolio.margins_maint to instrument_maintenance_margins
  • Renamed Portfolio.is_flat to is_net_flat
  • Renamed Portfolio.is_completely_flat to is_completely_net_flat
  • Renamed AggressorSide Buyer/Seller variants to Buy/Sell and BUYER/SELLER members to BUY/SELL
  • Renamed Cap'n Proto AggressorSide symbols to buy/sell, preserving ordinals
  • Renamed PostgreSQL AGGRESSOR_SIDE labels to BUY/SELL; migrate with ALTER TYPE ... RENAME VALUE
  • Changed Rust OrderMatchingEngine import to nautilus_execution::matching_engine::OrderMatchingEngine
  • Changed Rust QueryResult and DataQueryResult to iterate Result items carrying a new QueryError
  • Changed DataQueryResult iteration to return Python object lists instead of DataFFI capsules
  • Changed adapter callbacks to receive typed model objects instead of PyCapsule objects
  • Changed cache actor APIs to ActorId from ComponentId, covering CacheDatabaseAdapter actor state methods
  • Changed Interactive Brokers historical tick responses and Tardis batch streams to provide typed model objects
  • Changed portfolio statistic calculate_from_positions to require Position objects instead of duck-typed ones
  • Changed AggressorSide string output from BUYER/SELLER to BUY/SELL for display, serde, and SQL encoding
  • Changed WebSocketConfig.heartbeat to heartbeat_interval_secs and heartbeat_msg to heartbeat_payload
  • Changed WebSocketConfig.reconnect_timeout_ms to connect_timeout_ms, which also bounds the initial dial
  • Changed SocketConfig.heartbeat from a tuple to Option<SocketHeartbeat> with interval_secs and payload
  • Changed SocketConfig.idle_timeout_ms to heartbeat_timeout_secs, matching the inbound silence it always detected
  • Changed a configured heartbeat to imply dead-peer detection, defaulting heartbeat_timeout_secs to three intervals
  • Changed the Sockudo backend to tunnel through a configured proxy_url instead of silently falling back to Tungstenite
  • Changed WebSocket and socket clients to validate config on connect, so an invalid config now fails at startup
  • Changed custom cache database adapters to require index_order_clients for live orders (#4797), thanks @xxxxxx-oss
  • Changed Betfair stream_heartbeat_ms to stream_heartbeat_secs, now seconds rather than milliseconds (default 5)
  • Changed Betfair stream_idle_timeout_ms to stream_heartbeat_timeout_secs, now seconds (default 60)
  • Changed Binance spot and futures WebSocket API trading clients to send a keepalive, which they previously omitted
  • Changed Bybit bybit_bar_spec_to_interval to take a BarAggregation instead of an integer
  • Changed Bybit execution heartbeat_interval_secs default from 5 to 20, matching the documented cadence
  • Changed Hyperliquid subscribe_book_deltas and subscribe_book_snapshots to take a BookType instead of an integer
  • Changed OKX and dYdX Python WebSocket clients to default heartbeat to the venue cadence instead of None
  • Changed Polymarket HeartbeatResponse::Acknowledged to carry a required chained ID
  • Changed Polymarket Gamma game_id to a string on GammaMarket, GammaEvent, and instrument info
  • Changed Polymarket Gamma and CLOB tick size fields from f64 to Decimal
  • Changed Polymarket strict allowance decoding to require the plural allowances map (#4760), thanks @seungpyoson

Security

  • Hardened development wheel publishing to validate exact artifacts and fail closed
  • Pinned the direct alloy crate dependency to v2.2.0 to limit its larger supply‑chain risk surface
  • Fixed Rust network and WebSocket adapter logs that could expose credentials and payload contents
  • Removed OrderBookDeltas.from_pycapsule, which reinterpreted unvalidated pointers and risked invalid memory access
  • Fixed Hyperliquid client configs leaking private keys in Debug output

Fixes

  • Fixed overflowing order fill raw sums becoming undefined quantities or panicking
  • Fixed MarginAccount total margin getters panicking on out-of-range raw sums
  • Fixed clocks accepting oversized timer intervals and unrepresentable first event times
  • Fixed live timers firing up to 1 ms before their nominal deadlines
  • Fixed LiveClock::default() missing time-event senders initialized after clock construction
  • Fixed Python on_historical_data to receive CustomData response batches as a single list
  • Fixed Cache::get_xrate for instrument symbols that do not use the BASE/QUOTE format
  • Fixed market order risk checks to use cached bars and deny orders without a usable price
  • Fixed Position average open price (avg_px_open) for exact closes after partial fills
  • Fixed order list OrderInitialized events to carry order_list_id through publication, persistence, and replay
  • Fixed Postgres cache restore dropping order tags and exec_algorithm_params
  • Fixed Cache venue order ID alias indexing and purging during mass-status reconciliation
  • Fixed failed live strategy registrations leaving orphaned external‑order claims (#4620), thanks @folknor
  • Fixed network controllers treating aborted reconnects as completed reconnections (#4623), thanks @folknor
  • Fixed WebSocket pongs held across a reconnect being enqueued on the replacement connection (#4613), thanks @folknor
  • Fixed Python v2 FeeModel subclass constructors and concrete model inheritance (#4640), thanks @dfjmax
  • Fixed fee model panics from invalid Python inputs and decimal overflow (#4640), thanks @dfjmax
  • Fixed malformed external message topics aborting Python v2 LiveNode (#4630), thanks for reporting @davidgreyme
  • Fixed macOS ARM64 PyArrow SIGSEGVs (#4633, #4642), thanks for reporting @ZhongxuanWang; thanks @alex09x
  • Fixed macOS Python allocator TLS collisions by selecting mimalloc v2 (#4758), thanks @faysou
  • Fixed CashAccount aborts when reserving negative‑price buy orders (#4725), thanks @folknor
  • Fixed OrderBookDeltas::new_checked accepting child instrument mismatches (#4710), thanks @folknor
  • Fixed Python MessageBus endpoint panics from empty, whitespace, or wildcard addresses
  • Fixed synthetic formula parser stack overflows from unbounded nesting (#4723), thanks @folknor
  • Fixed f32 logarithm approximation on non‑positive and non‑finite inputs (#4740), thanks @folknor
  • Fixed margin models reserving a negative requirement for negative‑price orders (#4751), thanks @folknor
  • Fixed DeltaNeutralVol aborting when a rehedge quantity rounds to zero (#4752), thanks @folknor
  • Fixed strategy config accepting GTD market exits, which later aborted flattening (#4762), thanks @folknor
  • Fixed backtest BorrowMutError aborts when use_message_queue is disabled (#4763), thanks @folknor
  • Fixed AMA reset history retention and Rust FuzzyCandlesticks output retention (#4666), thanks @mkzung
  • Fixed ChandeMomentumOscillator returning values outside [-100, 100] for a zero gain average (#4667), thanks @mkzung
  • Fixed portfolio PnL and net exposure currency when convert_to_account_base_currency is disabled
  • Fixed portfolio realized PnL mixing snapshot and position exchange rates with use_mark_xrates enabled
  • Fixed account state log throttling for events carrying an earlier ts_init
  • Fixed catalog and session queries treating DataFusion decode failures as exhausted; Python now raises RuntimeError
  • Fixed default execution mass status generation to compose granular reports (#4669), thanks @folknor
  • Fixed Parquet custom data queries for Vec<u8> fields (#4670), thanks @TheoBabilon
  • Fixed WebSocket pongs replaying on replacements via connection epoch binding (#4683), thanks @folknor
  • Fixed backtest windows dropping boundary data and empty runs advancing time (#4685), thanks @folknor
  • Fixed BetPosition average price and PnL after stake increases (#4684), thanks @folknor
  • Fixed option expiry settlement dispatching partial legs and failing to retry missing prices (#4618), thanks @folknor
  • Fixed simulated exchange order queries returning all orders for unknown instruments (#4687), thanks @folknor
  • Fixed FixedRiskSizer omitting instrument contract multipliers (#4699), thanks @dfjmax
  • Fixed cache resets retaining stale OptionGreeks values (#4701), thanks @folknor
  • Fixed f32 exponential approximation outside its normal exponent range (#4709), thanks @folknor
  • Fixed orderless position cache indexes and replayed flips (#4688), thanks @pengpengyi92
  • Fixed event-store verify reporting a timeout when a large corrupt report filled the worker pipes
  • Fixed event-store writer treating a zero channel capacity as a rendezvous that fail-stopped the run
  • Fixed portfolio Greeks failing on closed positions (#4700), thanks @folknor
  • Fixed AverageTrueRange ignoring its configured ma_type and always using a simple moving average
  • Fixed Python MessageBus accepting empty or whitespace‑only subscription patterns
  • Fixed the OptionSeriesId Python constructor panicking on an invalid venue; it now raises ValueError
  • Fixed Python BarSpecification panicking on oversized time intervals; construction now raises ValueError
  • Fixed stale venue book snapshots logging one out‑of‑order warning per delta
  • Fixed backtest timer callbacks inheriting the next data event's timestamp (#4747), thanks @faysou
  • Fixed AverageTrueRange.reset() leaving the inner moving average populated (#4749), thanks @mkzung
  • Fixed HTTP query parameters being dropped when the URL already has a fragment (#4750), thanks @folknor
  • Fixed option constructors accepting a zero or negative strike price (#4745), thanks @folknor
  • Fixed cache position updates applying the index change before the value write (#4767), thanks @folknor
  • Fixed DeFi pool positions dropping fees when fee‑growth counters wrap (#4768), thanks @folknor
  • Fixed MovingAverageConvergenceDivergence input counting (#4779), thanks @mkzung
  • Fixed WebSocket text heartbeats being replayed on the replacement connection
  • Fixed startup reconciliation losing the source execution client for external orders (#4781), thanks @xxxxxx-oss
  • Fixed cache order and position adds leaving partial indexes when persistence failed (#4783), thanks @folknor
  • Fixed cache position updates recreating a partial entry for an unknown or purged ID (#4785), thanks @folknor
  • Fixed purge retention minutes overflowing nanoseconds and panicking in timer callbacks (#4784), thanks @folknor
  • Fixed stopped TWAP execution schedules never resuming their remaining slices (#4786), thanks @folknor
  • Fixed purge timer setup panicking on oversized intervals (#4804), thanks @folknor
  • Fixed Betfair stream reauthentication and subscription replay after session replacement
  • Fixed Betfair rounding a sub-second stream heartbeat interval up instead of down
  • Fixed Binance Spot HTTP submissions to use private‑stream order events across reconnects
  • Fixed Binance Futures hedge‑mode positionSide for close_position exits (#4732), thanks @hashtagdenis
  • Fixed Bybit REST and WebSocket order smpGroup string decoding (#4655), thanks for reporting @a-green-hand-jack
  • Fixed Bybit open_only reports missing recently closed orders (#4765), thanks @NoiceHax
  • Fixed Databento MBO snapshots advancing the incremental sequence (#4686), thanks @faysou
  • Fixed Databento parent book-delta responses splitting by child instrument
  • Fixed Deribit losing its set_heartbeat contract after reconnecting, disabling venue test_request for the session
  • Fixed Derive cancel‑only replacements and reused labels during order reconciliation
  • Fixed Derive WebSocket recovery, subscription replay, and silent connection detection
  • Fixed Derive fill commissions to construct exactly from wire decimals and error on unrepresentable fees
  • Fixed Derive account state reporting collateral credit as locked and net health as margin requirements
  • Fixed Derive denying unsupported orders only after OrderSubmitted
  • Fixed Derive historical trade aggressor side and forward-price event times
  • Fixed Hyperliquid historical candle timestamps and unfinished candle filtering (#4727), thanks @HKOWL
  • Fixed Hyperliquid order and position reconciliation across standard and HIP‑3 dexes
  • Fixed Hyperliquid WebSocket reconnect events being swallowed after resubscription
  • Fixed Hyperliquid oid queries dropping the known client order ID
  • Fixed Hyperliquid REST user fills dropping venue tid and builderFee
  • Fixed Hyperliquid historical order and order‑status parsing for FrontendMarket and LiquidationMarket TIF
  • Fixed Interactive Brokers continuous futures historical bar requests (#4664), thanks @dfjmax
  • Fixed Interactive Brokers deactivated open‑order processing
  • Fixed Interactive Brokers delayed market data not emitting QuoteTick values (#4719), thanks @faysou
  • Fixed Interactive Brokers local modify and cancel rejection event emission (#4564), thanks for reporting @davidgreyme
  • Fixed Lighter startup reconciliation for bounded fill history, incomplete coverage, and restored fills
  • Fixed Lighter acknowledged creates, position snapshot versus incremental updates
  • Fixed OKX margin reconciliation omitting SPOT orders and fills (#4743), thanks @silarin
  • Fixed OKX QueryOrder routing for algo and regular orders (#4731), thanks @silarin
  • Fixed OKX algo child dispatch and triggered conditional query recovery
  • Fixed OKX retryable and timeout command failures being treated as venue rejections
  • Fixed Polymarket commissions to preserve exact decimal values in Money construction
  • Fixed Polymarket maker fill ownership and reported mass‑status trade drops (#4662), thanks @seungpyoson
  • Fixed Polymarket WebSocket asset and discovery subscription replay across reconnects
  • Fixed Polymarket market subscriptions to explicitly request initial book snapshots
  • Fixed Polymarket buffered fills after terminal status leaving orders PartiallyFilled and dropping expiry fills
  • Fixed Polymarket HTTP rejection reasons carrying the raw JSON body instead of the venue message
  • Fixed Polymarket WebSocket FAK and FOK BUY sizes reported as the signed pUSD maker amount
  • Fixed Polymarket order‑safety heartbeat routing, ID chaining, rate‑limit retries, and safety deadlines
  • Fixed Polymarket order book snapshots accepting divergent data with invalid venue hashes
  • Fixed Polymarket compact book snapshots being dropped when hash preimage fields are absent
  • Fixed Polymarket open markets being removed from live state after endDate (#4706), thanks @mystic-io
  • Fixed Polymarket Gamma pagination for composite gameId sports markets (#4771), thanks for reporting @jamesjklin
  • Fixed Polymarket treating HTTP 425 and non‑CLOB 429 submit failures as definitive rejections
  • Fixed Polymarket WebSocket application heartbeat liveness
  • Fixed Polymarket terminal condition retirement repeating every poll cycle
  • Fixed Polymarket auto‑load dropping open markets omitted from the default Gamma lookup (#4728), thanks @mystic-io
  • Fixed Polymarket allowance decoding accepting duplicate spender keys (#4760), thanks @seungpyoson
  • Fixed Polymarket FIFO replay evicting still‑active order identity and fill state
  • Fixed Polymarket unsent and rejected cancels remaining in flight
  • Fixed Polymarket user channel dropping batched messages on unknown event types (#4794), thanks @yashwardhan-gautam
  • Fixed Polymarket partial GTC fills not reaching a terminal order status (#4795), thanks @yashwardhan-gautam
  • Fixed Polymarket pagination accepting stalled or repeated cursors (#4800), thanks @seungpyoson
  • Fixed Tardis CSV funding rates dropping next_funding_ns without a predicted rate
  • Fixed Tardis Machine funding rates omitting next_funding_ns
  • Fixed Tardis Machine heartbeats continuing after the stream ended

Internal Improvements

  • Added From conversions from ActorId, ExecAlgorithmId, and StrategyId to ComponentId
  • Improved native backtest workload coverage for canonical result checks
  • Improved indicator test tolerances across floating‑point magnitudes (#4718, #4742), thanks @mkzung
  • Improved published‑registry verifier tests to ignore fork metadata (#4715), thanks @xxxxxx-oss
  • Improved Coinbase request tests by removing redundant waits (#4637), thanks @pengpengyi92
  • Improved WebSocket reconnect replay to drop Ping, Pong, and Close frames instead of resending them
  • Improved network crate tests for retries, rate limits, mutual TLS, HTTP, socket reconnects, and WebSocket messages
  • Improved Polymarket order response tests for the tradeIDs matched shape and batch submission legs
  • Improved Polymarket on‑chain approval‑plan sharing and test coverage (#4773), thanks @seungpyoson
  • Improved Tardis tests with OKX X‑Perp and USDC index migration fixtures
  • Refactored the Redis cache adapter to delegate deletions and custom data writes to RedisCacheDatabase (Rust)
  • Refined CI, build, and dependency configuration after the v1 removal
  • Replaced Chrono and Chrono-TZ with Jiff and bundled TZDB data (#4639), thanks @sunlei
  • Standardized remaining risk engine order‑denied reasons to coded values (#4744), thanks @folknor
  • Standardized order command failure classification with shared CommandFailure for Architect AX, Bybit, and Kraken
  • Standardized OKX order command failure classification with the shared CommandFailure type
  • Standardized Polymarket submit and cancel HTTP failures with CommandFailure
  • Standardized Polymarket local order denials to coded OrderDeniedReason values
  • Optimized pre-commit and local validation by reusing build artifacts and skipping unchanged checks, thanks @faysou
  • Optimized Hyperliquid allMids projection to update on subscribe instead of every message
  • Optimized Polymarket interleaved price‑change dispatch and timestamp parsing
  • Updated concept and tutorial docs to describe current Rust and PyO3 behavior after the v1 removal
  • Upgraded Python and workflow tools: uv v0.12.5, pypi-attestations v0.0.30, and zizmor v1.29.0
  • Upgraded Python lockfile dependencies: numpy v2.5.2, platformdirs v4.11.2, librt v0.15.0, and soupsieve v2.9.2
  • Upgraded Rust development tools: cargo-hawk v0.1.12, cargo-nextest v0.9.143, and Miri nightly-2026-08-14
  • Upgraded cargo-llvm-cov to v0.9.0
  • Upgraded flamegraph to v0.6.14
  • Upgraded prek to v0.4.14 and osv-scanner to v2.5.1
  • Upgraded async-trait crate to v0.1.92
  • Upgraded aws-lc-rs crate to v1.18.0
  • Upgraded base64 crate to v0.23.1 with only its safe std feature enabled
  • Upgraded blake3 crate to v1.8.6
  • Upgraded bollard crate to v0.21.1
  • Upgraded capnp and capnpc crates to v0.27.0 and regenerated schema bindings
  • Upgraded clap crate to v4.6.6
  • Upgraded databento crate to v0.58.0
  • Upgraded futures and futures-util crates to v0.3.34
  • Upgraded http crate to v1.5.0
  • Upgraded ibapi crate to v3.3.0
  • Upgraded pem crate to v4.0.0 to align with the current Base64 API
  • Upgraded pyo3 crate to v0.29.2 for object‑lifetime, free‑threading, and compatibility fixes
  • Upgraded rcgen crate to v0.14.9
  • Upgraded redb crate to v4.2.0
  • Upgraded redis crate to v1.6.0
  • Upgraded thiserror crate to v2.0.20
  • Upgraded time crate to v0.3.55
  • Upgraded toml crate to v1.1.4
  • Upgraded uuid crate to v1.24.1

Documentation Updates

  • Added Python concept guidance for runtime ownership, public APIs, and hosted live execution
  • Added thousands separators to adapter config-table quantity values
  • Consolidated Python v2 integration guides and examples on canonical paths
  • Corrected the Rust DataTester book depth support note in the data testing spec
  • Documented external Redis message fields and Python custom-data registration
  • Documented order book out‑of‑order update and stale snapshot reporting behavior
  • Documented Polymarket command‑failure classes and coded local denial reasons
  • Documented Hyperliquid reconnect event forwarding, dead‑peer timeout, and socket-state endpoints
  • Documented the transient startup position-check race in the Lighter integration guide
  • Fixed broken README links on PyPI (#4644, #4648), thanks for reporting @ZhongxuanWang; thanks @xxxjqm

Deprecations

  • Deprecated BUYER/SELLER serialization input for AggressorSide; use BUY/SELL (removal in a future release)

Artifact checksums

SHA256 checksums are attached as SHA256SUMS, per-asset .sha256 files, and dist-manifest.json.

Artifact SHA256
nautilus_trader-2.0.0rc3-cp312-cp312-macosx_11_0_arm64.whl 6fa9df3ac4c066b50a845dcb5123cc4ce60f7dedcf71784810156468c10d882e
nautilus_trader-2.0.0rc3-cp312-cp312-manylinux_2_34_aarch64.whl 5ee6db83a68260490a7cd4f3d219dd5f03211eecd71308039059de1ad23e0090
nautilus_trader-2.0.0rc3-cp312-cp312-manylinux_2_34_x86_64.whl 245a27cd38c1ec26a2edd43a4ee77da177e5492ccb1e63832972e0260de4aa77
nautilus_trader-2.0.0rc3-cp312-cp312-win_amd64.whl 8a90b01ccf66d78946c565bca08b7758bc7f312caf1ded1c2c2c710013a7c092
nautilus_trader-2.0.0rc3-cp313-cp313-macosx_11_0_arm64.whl f56600cc1d079365481f552abe4a318dc376af6596b16edc1e95ee31fffcedef
nautilus_trader-2.0.0rc3-cp313-cp313-manylinux_2_34_aarch64.whl c64378ca9cbbe8cd1915f726af718233ac4aff6c9830f43ff353cb96a14c6118
nautilus_trader-2.0.0rc3-cp313-cp313-manylinux_2_34_x86_64.whl b16595e9fa27f1c1e405d28036ba098303a241d573b3ae936ded890b5c255dbc
nautilus_trader-2.0.0rc3-cp313-cp313-win_amd64.whl 1d877393e57c4ebab36ee80cf0183c34a0bb0e58c7b357b1d335cd984ecf7a54
nautilus_trader-2.0.0rc3-cp314-cp314-macosx_11_0_arm64.whl 3569e8d835dd48f74c450f6a4e559771e1d49f7800a5ae371147175ef99ff3df
nautilus_trader-2.0.0rc3-cp314-cp314-manylinux_2_34_aarch64.whl f09f90aeeb13b3149d901a84b42415077d9952cb236819de4559ca56e6e57460
nautilus_trader-2.0.0rc3-cp314-cp314-manylinux_2_34_x86_64.whl e0c1c8d697e540f7b37616d16862cce416ae6120605857a8cf5701d69e8be294
nautilus_trader-2.0.0rc3-cp314-cp314-win_amd64.whl d9ccc03a588fd159bfe74f902372988437e32d1bc942c02ebe6da23fa9777142
nautilus_trader-2.0.0rc3.tar.gz 8025c59e396c204b8cab88c254769739bf7b7557ba43eb6d4ed1ac68e95424d7

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.com