NautilusTrader 2.0.0rc3
Pre-release
Pre-release
·
0 commits
to develop
since this release
Immutable
release. Only release title and notes can be modified.
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_TIMEOUTto all outbound connections, detecting half-open sockets in ~1 min - Added HTTP
CONNECTproxy support to the Sockudo WebSocket backend - Added
WebSocketConfig.heartbeat_timeout_secsso 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
WalletAccountfor native and token balances with local reservations - Added
PositionOpenedrealized PnL - Added
AccountStatevenue 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
Sumiterator support for owned and borrowedQuantityvalues (#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, andNodeStatefor caller-owned event loops - Added direct message bus backing installation through
RedisMessageBusConfig - Added
LiveNode.start()warning when external message bus ingress requiresrun() - Added trader start warning when
load_stateorsave_stateis enabled without a cache database backing - Added runtime external‑order claim registration and removal to Rust
LiveNode(#4620), thanks @folknor - Added
INFOlogs for socket and WebSocket connection loss and recovery (#4621), thanks @folknor - Added Rust and Python
SocketStateChangedevents 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_socketon 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_deltasconfig option to emit net changes for book snapshots (defaultFalse) - Added Polymarket
series_idsinstrument provider scoping for Gamma market families (#4650), thanks @mystic-io - Added Polymarket instrument bootstrap from a
filtersmap or a registeredInstrumentFilterwithoutload_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_pycapsulemethods andOrderBookDeltas.from_pycapsule; pass typed model objects directly - Removed FFI features and static libraries outside
nautilus-coreandnautilus-model; use Rust or PyO3 APIs - Removed
cython-compat, Cython cbindgen configs, anddrop_cvec_pycapsule; use PyO3 APIs - Removed generic Python clients and support APIs from
nautilus_trader.network; use adapter APIs ornautilus-network - Removed
LiveNode.poll()and PythonLiveNode.start(); use hostedrun_with_mode(...)orrun_async() - Removed
nautilus_trader.data.OptionChainManager; usesubscribe_option_chainand handleOptionChainSlice - Removed
Cache.actor_ids(), which always returned an empty set; use RustTrader::actor_ids() - Removed
WebSocketClient::connect_with_heartbeat_timeout; setWebSocketConfig.heartbeat_timeout_secsinstead - Removed duck-typed object conversion from
BacktestEngine.add_data; pass model objects directly - Removed unused Rust
SocketClientandWebSocketClientconnection callbacks; use message or epoch handlers - Removed Rust
nautilus_execution::matching_engine::adapter::OrderEngineAdapter; useOrderMatchingEngine - Removed Rust
from_pyobjectconstructors fromnautilus_modeldata types; useBound::extractfor the target type - Removed Rust
nautilus_core::CleanDropand itsdropmodule; implementDropdirectly - Removed Databento
load_*_as_pycapsulemethods; use the correspondingload_*methods - Removed the trailing
heartbeat_timeoutparameter from the epoch-handler connect; set it on the config - Replaced Rust
nautilus_model::python::data::data_to_pycapsulewithdata_to_pyobject - Renamed
Portfolio.margins_inittoinstrument_initial_margins - Renamed
Portfolio.margins_mainttoinstrument_maintenance_margins - Renamed
Portfolio.is_flattois_net_flat - Renamed
Portfolio.is_completely_flattois_completely_net_flat - Renamed
AggressorSideBuyer/Sellervariants toBuy/SellandBUYER/SELLERmembers toBUY/SELL - Renamed Cap'n Proto
AggressorSidesymbols tobuy/sell, preserving ordinals - Renamed PostgreSQL
AGGRESSOR_SIDElabels toBUY/SELL; migrate withALTER TYPE ... RENAME VALUE - Changed Rust
OrderMatchingEngineimport tonautilus_execution::matching_engine::OrderMatchingEngine - Changed Rust
QueryResultandDataQueryResultto iterateResultitems carrying a newQueryError - Changed
DataQueryResultiteration to return Python object lists instead ofDataFFIcapsules - Changed adapter callbacks to receive typed model objects instead of
PyCapsuleobjects - Changed cache actor APIs to
ActorIdfromComponentId, coveringCacheDatabaseAdapteractor state methods - Changed Interactive Brokers historical tick responses and Tardis batch streams to provide typed model objects
- Changed portfolio statistic
calculate_from_positionsto requirePositionobjects instead of duck-typed ones - Changed
AggressorSidestring output fromBUYER/SELLERtoBUY/SELLfor display, serde, and SQL encoding - Changed
WebSocketConfig.heartbeattoheartbeat_interval_secsandheartbeat_msgtoheartbeat_payload - Changed
WebSocketConfig.reconnect_timeout_mstoconnect_timeout_ms, which also bounds the initial dial - Changed
SocketConfig.heartbeatfrom a tuple toOption<SocketHeartbeat>withinterval_secsandpayload - Changed
SocketConfig.idle_timeout_mstoheartbeat_timeout_secs, matching the inbound silence it always detected - Changed a configured heartbeat to imply dead-peer detection, defaulting
heartbeat_timeout_secsto three intervals - Changed the Sockudo backend to tunnel through a configured
proxy_urlinstead 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_clientsfor live orders (#4797), thanks @xxxxxx-oss - Changed Betfair
stream_heartbeat_mstostream_heartbeat_secs, now seconds rather than milliseconds (default5) - Changed Betfair
stream_idle_timeout_mstostream_heartbeat_timeout_secs, now seconds (default60) - Changed Binance spot and futures WebSocket API trading clients to send a keepalive, which they previously omitted
- Changed Bybit
bybit_bar_spec_to_intervalto take aBarAggregationinstead of an integer - Changed Bybit execution
heartbeat_interval_secsdefault from5to20, matching the documented cadence - Changed Hyperliquid
subscribe_book_deltasandsubscribe_book_snapshotsto take aBookTypeinstead of an integer - Changed OKX and dYdX Python WebSocket clients to default
heartbeatto the venue cadence instead ofNone - Changed Polymarket
HeartbeatResponse::Acknowledgedto carry a required chained ID - Changed Polymarket Gamma
game_idto a string onGammaMarket,GammaEvent, and instrumentinfo - Changed Polymarket Gamma and CLOB tick size fields from
f64toDecimal - Changed Polymarket strict allowance decoding to require the plural
allowancesmap (#4760), thanks @seungpyoson
Security
- Hardened development wheel publishing to validate exact artifacts and fail closed
- Pinned the direct
alloycrate 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
Debugoutput
Fixes
- Fixed overflowing order fill raw sums becoming undefined quantities or panicking
- Fixed
MarginAccounttotal 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_datato receiveCustomDataresponse batches as a single list - Fixed
Cache::get_xratefor instrument symbols that do not use theBASE/QUOTEformat - Fixed market order risk checks to use cached bars and deny orders without a usable price
- Fixed
Positionaverage open price (avg_px_open) for exact closes after partial fills - Fixed order list
OrderInitializedevents to carryorder_list_idthrough publication, persistence, and replay - Fixed Postgres cache restore dropping order
tagsandexec_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
FeeModelsubclass 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
CashAccountaborts when reserving negative‑price buy orders (#4725), thanks @folknor - Fixed
OrderBookDeltas::new_checkedaccepting child instrument mismatches (#4710), thanks @folknor - Fixed Python
MessageBusendpoint panics from empty, whitespace, or wildcard addresses - Fixed synthetic formula parser stack overflows from unbounded nesting (#4723), thanks @folknor
- Fixed
f32logarithm 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
DeltaNeutralVolaborting when a rehedge quantity rounds to zero (#4752), thanks @folknor - Fixed strategy config accepting
GTDmarket exits, which later aborted flattening (#4762), thanks @folknor - Fixed backtest
BorrowMutErroraborts whenuse_message_queueis disabled (#4763), thanks @folknor - Fixed AMA reset history retention and Rust
FuzzyCandlesticksoutput retention (#4666), thanks @mkzung - Fixed
ChandeMomentumOscillatorreturning values outside [-100, 100] for a zero gain average (#4667), thanks @mkzung - Fixed portfolio PnL and net exposure currency when
convert_to_account_base_currencyis disabled - Fixed portfolio realized PnL mixing snapshot and position exchange rates with
use_mark_xratesenabled - 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
BetPositionaverage 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
FixedRiskSizeromitting instrument contract multipliers (#4699), thanks @dfjmax - Fixed cache resets retaining stale
OptionGreeksvalues (#4701), thanks @folknor - Fixed
f32exponential approximation outside its normal exponent range (#4709), thanks @folknor - Fixed orderless position cache indexes and replayed flips (#4688), thanks @pengpengyi92
- Fixed event-store
verifyreporting 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
AverageTrueRangeignoring its configuredma_typeand always using a simple moving average - Fixed Python
MessageBusaccepting empty or whitespace‑only subscription patterns - Fixed the
OptionSeriesIdPython constructor panicking on an invalid venue; it now raisesValueError - Fixed Python
BarSpecificationpanicking on oversized time intervals; construction now raisesValueError - 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
MovingAverageConvergenceDivergenceinput 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
positionSideforclose_positionexits (#4732), thanks @hashtagdenis - Fixed Bybit REST and WebSocket order
smpGroupstring decoding (#4655), thanks for reporting @a-green-hand-jack - Fixed Bybit
open_onlyreports 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_heartbeatcontract after reconnecting, disabling venuetest_requestfor 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
tidandbuilderFee - Fixed Hyperliquid historical order and order‑status parsing for
FrontendMarketandLiquidationMarketTIF - 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
QuoteTickvalues (#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
SPOTorders and fills (#4743), thanks @silarin - Fixed OKX
QueryOrderrouting 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
Moneyconstruction - 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
PartiallyFilledand dropping expiry fills - Fixed Polymarket HTTP rejection reasons carrying the raw JSON body instead of the venue message
- Fixed Polymarket WebSocket
FAKandFOKBUY 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
gameIdsports 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_nswithout a predicted rate - Fixed Tardis Machine funding rates omitting
next_funding_ns - Fixed Tardis Machine heartbeats continuing after the stream ended
Internal Improvements
- Added
Fromconversions fromActorId,ExecAlgorithmId, andStrategyIdtoComponentId - 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
tradeIDsmatched 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
CommandFailurefor Architect AX, Bybit, and Kraken - Standardized OKX order command failure classification with the shared
CommandFailuretype - Standardized Polymarket submit and cancel HTTP failures with
CommandFailure - Standardized Polymarket local order denials to coded
OrderDeniedReasonvalues - 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:
uvv0.12.5,pypi-attestationsv0.0.30, andzizmorv1.29.0 - Upgraded Python lockfile dependencies:
numpyv2.5.2,platformdirsv4.11.2,librtv0.15.0, andsoupsievev2.9.2 - Upgraded Rust development tools:
cargo-hawkv0.1.12,cargo-nextestv0.9.143, and Mirinightly-2026-08-14 - Upgraded
cargo-llvm-covto v0.9.0 - Upgraded
flamegraphto v0.6.14 - Upgraded
prekto v0.4.14 andosv-scannerto v2.5.1 - Upgraded
async-traitcrate to v0.1.92 - Upgraded
aws-lc-rscrate to v1.18.0 - Upgraded
base64crate to v0.23.1 with only its safestdfeature enabled - Upgraded
blake3crate to v1.8.6 - Upgraded
bollardcrate to v0.21.1 - Upgraded
capnpandcapnpccrates to v0.27.0 and regenerated schema bindings - Upgraded
clapcrate to v4.6.6 - Upgraded
databentocrate to v0.58.0 - Upgraded
futuresandfutures-utilcrates to v0.3.34 - Upgraded
httpcrate to v1.5.0 - Upgraded
ibapicrate to v3.3.0 - Upgraded
pemcrate to v4.0.0 to align with the current Base64 API - Upgraded
pyo3crate to v0.29.2 for object‑lifetime, free‑threading, and compatibility fixes - Upgraded
rcgencrate to v0.14.9 - Upgraded
redbcrate to v4.2.0 - Upgraded
rediscrate to v1.6.0 - Upgraded
thiserrorcrate to v2.0.20 - Upgraded
timecrate to v0.3.55 - Upgraded
tomlcrate to v1.1.4 - Upgraded
uuidcrate 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
DataTesterbook 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/SELLERserialization input forAggressorSide; useBUY/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