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 |