Releases: flashbots/contender
contender v0.10.3
contender_cli
spam-stream now sends transactions concurrently across the signer pool.
Each signer has its own worker, so nonces stay ordered per signer while multiple signers can send at the same time. --pool-size now controls this concurrency: --pool-size 1 keeps the old serial behavior, while larger values allow more parallel sends.
Stream mode also now emits Backpressure events when a signer’s worker queue fills up, making bottlenecks easier to see.
contender_core
FlashblocksError now boxes large tungstenite error variants. This is an internal cleanup with no behavior change.
Contributors
Thanks to @jelias2 for the work on the spam-stream feature.
Binaries
The binaries are signed with the PGP key: F62E A741 E6B4 E0BA 58D3 8619 698A C82F 9A2F E605
Contender CLI
| System | Architecture | Binary | PGP Signature |
|---|---|---|---|
| x86_64 | contender-v0.10.3-x86_64-unknown-linux-gnu.tar.gz | PGP Signature | |
| aarch64 | contender-v0.10.3-aarch64-unknown-linux-gnu.tar.gz | PGP Signature | |
| x86_64 | contender-v0.10.3-x86_64-apple-darwin.tar.gz | PGP Signature | |
| aarch64 | contender-v0.10.3-aarch64-apple-darwin.tar.gz | PGP Signature |
contender v0.10.2
Summary
Contender v0.10.2 adds more control over generated transactions, introduces a new stream-oriented spam mode, and improves scenario support for access lists and EIP-1559 priority-fee testing.
Highlights
-
Added
spam-stream, a new CLI subcommand for streaming newline-delimited JSONFunctionCallDefinitions from stdin or a file.- Each input spec is sent exactly once through the existing scenario pipeline.
- Reuses Contender’s agent pools, rate limiting, nonce management, funding, receipt tracking, and DB run persistence.
- Emits structured, versioned JSON events on stdout, including per-tx results, backpressure events, and a terminal summary.
- Supports deterministic pool derivation via the persisted seed file, so
--skip-fundingworks across repeated runs.
-
Added scenario-level access list support.
- Scenario
FunctionCallDefinitions can now include anaccess_list. - Access-list addresses and storage keys support
{placeholder}resolution, including scenario[env]placeholders. - This makes it easier to generate EIP-2930-style transactions and test access-list-sensitive execution paths.
- Scenario
-
Added support for per-transaction EIP-1559 priority fee configuration.
FunctionCallDefinition::max_priority_fee_per_gascan now be set statically or via placeholders.FuzzParam::max_priority_fee_per_gasallows priority fees to be fuzzed per transaction.max_fee_per_gasis automatically lifted when needed to preserve the EIP-1559 invariant.- Priority-fee and fuzz min/max values now accept raw wei, hex, and unit strings such as
"10 gwei"or"0.001 eth".
Fixes and polish
-
Fixed gas estimation for transactions with static or fuzzed priority fees by lifting the estimation copy’s fee cap before calling
estimate_gas. -
Improved malformed priority-fee handling: invalid static
max_priority_fee_per_gasvalues now fail at template time instead of silently resolving toNone. -
Fixed several
spam-streamedge cases:- nonce sync is enabled before sending;
- failed sends reclaim the local nonce to avoid nonce gaps;
- blob and setCode specs are rejected up front;
- gas price is cached instead of fetched for every streamed tx;
--min-balancenow accepts unit strings.
-
Fixed the
check-versionCI script. -
Updated dependencies:
console-subscriberto0.5.0strumto0.28.0tower-httpto0.6.10randto0.10.1
Contributors
Thanks to @op-will and @jelias2 for the commits in this release range.
All Changes
- chore(deps): bump
tower-httpfrom0.6.8to0.6.10(#566) - chore(deps): bump
strumfrom0.27.2to0.28.0(#567) - chore(deps): bump
console-subscriberfrom0.4.1to0.5.0(#570) - feat(generator): support static and fuzzed
max_priority_fee_per_gas(#580) - chore: fix invalid links in changelogs (#582)
- chore(deps): bump
randfrom0.9.4to0.10.1(#584) - feat(scenarios): add
access_listsupport with placeholder resolution (#588) - feat(cli): add
spam-streamsubcommand for streaming tx specs (#589) - chore: update changelogs and bump versions for
v0.10.2(#591) - fix(ci): fix
check-versionscript (#592)
Binaries
The binaries are signed with the PGP key: F62E A741 E6B4 E0BA 58D3 8619 698A C82F 9A2F E605
Contender CLI
| System | Architecture | Binary | PGP Signature |
|---|---|---|---|
| x86_64 | contender-v0.10.2-x86_64-unknown-linux-gnu.tar.gz | PGP Signature | |
| aarch64 | contender-v0.10.2-aarch64-unknown-linux-gnu.tar.gz | PGP Signature | |
| x86_64 | contender-v0.10.2-x86_64-apple-darwin.tar.gz | PGP Signature | |
| aarch64 | contender-v0.10.2-aarch64-apple-darwin.tar.gz | PGP Signature |
contender v0.10.1
Summary
v0.10.1 is a focused patch release for the contender CLI, including RPC/server stability fixes, improved long-running spam funding behavior, custom transaction endpoint support, and dependency updates.
Highlights
- Added
--txs-urlsupport to send transactions to a custom endpoint. - Replaced timed
--foreverauto-funding with per-batch balance-checked funding, reducing over-funding during long spam runs. - Fixed RPC/server CPU usage bugs, including cleanup around session shutdown and cancellation.
- Updated Alloy dependencies.
- Updated
contender_clito use the newercontender_core.
External Contributors
🙏 Thanks to these folks for their contributions to this release:
All Changes
Features / Behavior Changes
- Route
eth_sendRawTransactionto a dedicated endpoint via--txs-url(#534) - Replace spammer refill logic with per-batch balance-checked funding (#523)
- Switch to per-crate versions (#536)
- Update “using contender as a library” docs (#537)
Release / Versioning / CI
- Add release script auto-bump support (#538)
- Remove trailing slashes from workspace members and path dependencies (#539)
- Fix dependabot workspace parsing (#540)
- Pin dependencies (#535)
- Update release scripts (#562)
- Add license ops updates (#563)
- Bump crate versions (#565)
- Fix tag script index bug and tolerate existing tags (#571)
- Fix release trigger typo (#572)
- CI bugfixes (#573)
- Fix release version parsing (#574)
- Make release script tolerate retries (#575)
- Fix container release (#576)
- Remove stray
println(#577) - Fix release job version parsing (#578)
Dependency Updates
- Alloy 2.0 update (#561)
alloy-rpc-types-debug1.0.41 → 2.0.4 (#541)alloy-serde1.0.41 → 2.0.4 (#545)alloy-signer1.0.41 → 2.0.4 (#551)alloy-eips1.0.41 → 1.1.0 (#549)alloy-sol-type-parser1.4.1 → 1.5.7 (#553)jsonrpsee0.24.10 → 0.26.0 (#547)tokio1.48.0 → 1.50.0 (#552)tokio-stream0.1.17 → 0.1.18 (#543)rand0.8.5 → 0.9.2 (#546)chrono0.4.42 → 0.4.44 (#544)handlebars6.3.2 → 6.4.0 (#550)axum0.8.8 → 0.8.9 (#554)syn2.0.108 → 2.0.117 (#555)thiserror2.0.17 → 2.0.18 (#548)rustls-webpki0.103.10 → 0.103.13 (#526)openssl0.10.75 → 0.10.78 (#525)- Remove
ark-ecfrom dependencies (#542) mozilla-actions/sccache-action0.0.9 → 0.0.10 (#528)
Docs / Repo Maintenance
- Remove license badges from README (#564)
Internal Breaking Changes
contender_core::TestScenario::newadded a new param to its signature (cancel_token)contender_coreis now atv0.11.0
Binaries
The binaries are signed with the PGP key: F62E A741 E6B4 E0BA 58D3 8619 698A C82F 9A2F E605
Contender CLI
| System | Architecture | Binary | PGP Signature |
|---|---|---|---|
| x86_64 | contender-v0.10.1-x86_64-unknown-linux-gnu.tar.gz | PGP Signature | |
| aarch64 | contender-v0.10.1-aarch64-unknown-linux-gnu.tar.gz | PGP Signature | |
| x86_64 | contender-v0.10.1-x86_64-apple-darwin.tar.gz | PGP Signature | |
| aarch64 | contender-v0.10.1-aarch64-apple-darwin.tar.gz | PGP Signature |
contender v0.10.0
Summary
New
-
API daemon (#494)
Run Contender as a service and control it via JSON-RPC. -
Combined callbacks (#506)
Chain hooks that implementOnTxSent + OnBatchSent. -
Tx result tracking (#519)
Reports now include counts for successful vs failed transactions.
Changes
-
Typed init state (#507)
Contendernow enforces initialized vs uninitialized usage at compile time. -
min_balanceaccepts ETH units (#518)
No need to manually convert to wei, just add a unit: e.g. "1 eth"
Improvements
- Better spam/campaign logs (#508)
- Setup logs use tracing spans (#520)
- Fix spam progress logs in server UI (#510)
- Cache
NilCallbackerrors (#511)
Tighter API surface, clearer logs, and basic tx outcome visibility.
All Changes
- chore: update changelogs w/ release tag (#522)
- version v0.10.0 (#521)
- feat(rpc): accept eth denominations for SessionOptions.min_balance (#518)
- feat: track failed/successful txs (#519)
- (setup cost estimation logs): replace banners with tracing spans (#520)
- cache errors from NilCallback if detected (#511)
- server webpage: fix log output from spam_progress reports (#510)
- improve campaign/spam logs (#508)
- differentiate initialized Contender from uninitialized; offload checks to compiler (#507)
- feat: combined callback (#506)
- Feat/api daemon (#494)
Binaries
The binaries are signed with the PGP key: F62E A741 E6B4 E0BA 58D3 8619 698A C82F 9A2F E605
Contender CLI
| System | Architecture | Binary | PGP Signature |
|---|---|---|---|
| x86_64 | contender-v0.10.0-x86_64-unknown-linux-gnu.tar.gz | PGP Signature | |
| aarch64 | contender-v0.10.0-aarch64-unknown-linux-gnu.tar.gz | PGP Signature | |
| x86_64 | contender-v0.10.0-x86_64-apple-darwin.tar.gz | PGP Signature | |
| aarch64 | contender-v0.10.0-aarch64-apple-darwin.tar.gz | PGP Signature |
contender v0.9.1
Summary
This patch includes improvements to long-running spammers (#496), live metrics reporting (#493), deterministic setup tx ordering (#491), eth_sendRawTransactionSync support (#459), continuous funding for --forever spam runs (#502), metrics support for sub-second blocks (#498), and migrates the .contender data dir, supporting $XDG_STATE_HOME (#499).
❤️ Many thanks to these contributors:
@0xl3on
@vbuilder69420
@gligneul
@bitwiseguy
@0xWeakSheep
All Changes
- Release/v0.9.1 (#504)
- bugfix/init scenario error handling (#503)
- feat(cli): organize help flags into logical sections (#501)
- feat: keep spammers funded (#502)
- Add option to config time to inclusion bucket size (#498)
- feat: move default data dir (#499)
- spam: harden against transient rpc failures (#496)
- chore(deps): bump docker/setup-buildx-action from 3 to 4 (#478)
- chore(deps): bump docker/metadata-action from 5 to 6 (#479)
- chore(deps): bump rustls-webpki from 0.103.8 to 0.103.10 (#474)
- feat: structured transaction rate reporting during spam (#493)
- feat: deterministic setup with --seed flag (#491)
- feat: add sync raw send transaction support (#459)
Binaries
The binaries are signed with the PGP key: F62E A741 E6B4 E0BA 58D3 8619 698A C82F 9A2F E605
Contender CLI
| System | Architecture | Binary | PGP Signature |
|---|---|---|---|
| x86_64 | contender-v0.9.1-x86_64-unknown-linux-gnu.tar.gz | PGP Signature | |
| aarch64 | contender-v0.9.1-aarch64-unknown-linux-gnu.tar.gz | PGP Signature | |
| x86_64 | contender-v0.9.1-x86_64-apple-darwin.tar.gz | PGP Signature | |
| aarch64 | contender-v0.9.1-aarch64-apple-darwin.tar.gz | PGP Signature |
contender v0.9.0
Summary
v0.9.0 introduces a new rpc spammer, flashblocks support, JSON reports for automated analysis, scenario labels for running multiple instances of contender in parallel, and several core performance improvements and bug fixes.
new features
- add option to export reports as JSON (#453)
- add scenario labels to enable concurrent spam runs on the same scenario (#456)
- add flashblocks support, track tx time-to-inclusion within a flashblock (#465)
- spam any rpc method (#468)
improvements
- add contender version to bottom of reports (#452)
- limit concurrent funding tasks and handle "already known" gracefully (#451)
- add chainlink scenario (#446)
- spammer: remove delay in tps mode to achieve 1sec loop timing (#454)
- cleanup reports (#455)
- fix: generate report when passing --gen-report (#457)
- contender report: add gas quantiles (#464)
- set SETUP_CONCURRENCY_LIMIT with env var (#461)
breaking changes are detailed in each crate's individual CHANGELOG.md file.
All Changes
- chore: set version 0.9.0 (#463)
- chore(deps): bump lz4_flex from 0.11.5 to 0.11.6 (#473)
- chore(deps): bump quinn-proto from 0.11.13 to 0.11.14 (#472)
- chore(deps): bump docker/build-push-action from 6 to 7 (#471)
- chore(deps): bump docker/setup-qemu-action from 3 to 4 (#470)
- chore(deps): bump docker/login-action from 3 to 4 (#469)
- chore(deps): bump actions/download-artifact from 7 to 8 (#467)
- chore(deps): bump actions/upload-artifact from 6 to 7 (#466)
- chore(deps): bump keccak from 0.1.5 to 0.1.6 (#458)
- feat: spam rpc (#468)
- feat: set SETUP_CONCURRENCY_LIMIT with env var (#461)
- flashblocks: track tx time-to-inclusion within a flashblock (#465)
- Merge pull request #464 from yashvardhan-kukreja/gas-quantile-reports
- cargo fmt
- feat: contender report: add gas quantiles
- feat: add scenario labels (#456)
- fix: generate report when passing --gen-report (#457)
- chore(deps): bump actions/download-artifact from 4 to 7 (#449)
- chore(deps): bump actions/upload-artifact from 4 to 6 (#450)
- feat/cleanup report (#455)
- feat/json reports (#453)
- spammer: remove delay in tps mode to achieve 1sec loop timing (#454)
- add chainlink scenario (#446)
- fix: limit concurrent funding tasks and handle "already known" gracefully (#451)
- add contender version to bottom of reports (#452)
Binaries
The binaries are signed with the PGP key: F62E A741 E6B4 E0BA 58D3 8619 698A C82F 9A2F E605
Contender CLI
| System | Architecture | Binary | PGP Signature |
|---|---|---|---|
| x86_64 | contender-v0.9.0-x86_64-unknown-linux-gnu.tar.gz | PGP Signature | |
| aarch64 | contender-v0.9.0-aarch64-unknown-linux-gnu.tar.gz | PGP Signature | |
| x86_64 | contender-v0.9.0-x86_64-apple-darwin.tar.gz | PGP Signature | |
| aarch64 | contender-v0.9.0-aarch64-apple-darwin.tar.gz | PGP Signature |
contender v0.8.1
Summary
This release contains bugfixes:
It also upgrades some dependencies. See below for a full list.
All Changes
- release/v0.8.1 (#448)
- fix: limit concurrent setup tasks to prevent FD exhaustion (#447)
- chore(deps): bump actions/upload-artifact from 5 to 6 (#391)
- chore(deps): bump actions/download-artifact from 6 to 7 (#392)
- chore(deps): bump actions/checkout from 4 to 6 (#441)
- chore(deps): bump bytes from 1.10.1 to 1.11.1 (#442)
- chore(deps): bump git2 from 0.20.2 to 0.20.4 (#444)
- chore(deps): bump time from 0.3.44 to 0.3.47 (#445)
- fix spam time drift & erc20 defaults (#443)
Binaries
The binaries are signed with the PGP key: F62E A741 E6B4 E0BA 58D3 8619 698A C82F 9A2F E605
Contender CLI
| System | Architecture | Binary | PGP Signature |
|---|---|---|---|
| x86_64 | contender-v0.8.1-x86_64-unknown-linux-gnu.tar.gz | PGP Signature | |
| aarch64 | contender-v0.8.1-aarch64-unknown-linux-gnu.tar.gz | PGP Signature | |
| x86_64 | contender-v0.8.1-x86_64-apple-darwin.tar.gz | PGP Signature | |
| aarch64 | contender-v0.8.1-aarch64-apple-darwin.tar.gz | PGP Signature |
contender v0.8.0
Summary
- track nonces internally for create & setup transactions (#438) (bugfix for fast chains)
- bugfix: tolerate failure of
get_block_receipts(#438) - improved core code (#439)
Breaking changes
- removed
--redeploy, no longer skips contract deployments if previously deployed (#438) - breaking changes in
contender_core(see core changelog for details)
All Changes
- release/v0.8.0 (#440)
- feat/simplify agent setup (#439)
- bugfix/setup nonces (#438)
- fix: remove unneeded branch rule (#435)
- Feat/builder playground ci (#432)
- bugfix: ghcr container
latesttag (#434)
Binaries
The binaries are signed with the PGP key: F62E A741 E6B4 E0BA 58D3 8619 698A C82F 9A2F E605
Contender CLI
| System | Architecture | Binary | PGP Signature |
|---|---|---|---|
| x86_64 | contender-v0.8.0-x86_64-unknown-linux-gnu.tar.gz | PGP Signature | |
| aarch64 | contender-v0.8.0-aarch64-unknown-linux-gnu.tar.gz | PGP Signature | |
| x86_64 | contender-v0.8.0-x86_64-apple-darwin.tar.gz | PGP Signature | |
| aarch64 | contender-v0.8.0-aarch64-apple-darwin.tar.gz | PGP Signature |
contender v0.7.4
Summary
Improves campaign spammer, adds more integration tests.
All Changes
- Release/v0.7.4 (#433)
- feat/anvil integration tests (#430)
- feat/simplify campaign builtin semantics (#428)
- perf(campaign): add fast path for single-mix stages (#427)
Binaries
The binaries are signed with the PGP key: F62E A741 E6B4 E0BA 58D3 8619 698A C82F 9A2F E605
Contender CLI
| System | Architecture | Binary | PGP Signature |
|---|---|---|---|
| x86_64 | contender-v0.7.4-x86_64-unknown-linux-gnu.tar.gz | PGP Signature | |
| aarch64 | contender-v0.7.4-aarch64-unknown-linux-gnu.tar.gz | PGP Signature | |
| x86_64 | contender-v0.7.4-x86_64-apple-darwin.tar.gz | PGP Signature | |
| aarch64 | contender-v0.7.4-aarch64-apple-darwin.tar.gz | PGP Signature |
contender v0.7.3
Summary
Improved error logging in DB, added apple + aarch64 binaries to releases, --infinite campaigns, improved logs, fixed inconsistent campaign seeds, improved tx cache & receipt handling.
All Changes
- release/v0.7.3 (#426)
- perf(spammer): lock-free TxActor and non-blocking tx sending (#423)
- fix: propagate campaign execution errors + fix-campaign-seeds (#425)
- improve --min-balance warning log (#421)
- add --infinite flag to campaigns (#420)
- cross-platform release workflow (#415)
- spammer: record onchain revert as error in db (#418)
Binaries
The binaries are signed with the PGP key: F62E A741 E6B4 E0BA 58D3 8619 698A C82F 9A2F E605
Contender CLI
| System | Architecture | Binary | PGP Signature |
|---|---|---|---|
| x86_64 | contender-v0.7.3-x86_64-unknown-linux-gnu.tar.gz | PGP Signature | |
| aarch64 | contender-v0.7.3-aarch64-unknown-linux-gnu.tar.gz | PGP Signature | |
| x86_64 | contender-v0.7.3-x86_64-apple-darwin.tar.gz | PGP Signature | |
| aarch64 | contender-v0.7.3-aarch64-apple-darwin.tar.gz | PGP Signature |