Skip to content

v0.9.2

Choose a tag to compare

@pyk pyk released this 14 Aug 04:28
· 183 commits to main since this release
648ed8d

Added

  • rvm.fork resolves Flare-family network hardforks (Durango → Shanghai, Etna
    → Cancun, pre-Durango → London) from go-flare's upgrade schedule instead of
    defaulting to the newest spec
  • --max-failures N to collect up to N distinct failed assertions (invariant
    mode only) before stopping the campaign, with each one shrunk and reported
    separately
  • max_* harness functions: read-only, no-argument uint256 getters where
    reverted or empty results score 0 and any value above 0 is the finding
  • Trace decoding falls back to common standard events (ERC20
    Transfer/Approval, ERC721 ApprovalForAll, WETH9 Deposit/Withdrawal,
    Ownable OwnershipTransferred) when no project artifact declares them,
    rendering names and arguments instead of raw emit Log(0x...) lines

Changed

  • The fuzzing lifecycle is one fuzz tracing span carrying the harness
    contract and thread count, with consistent started, progress, and
    finished events; the campaign log file records the fuzz-phase duration when
    the span closes
  • Per-function statistics log kind function as the message (e.g.
    handler deposit calls=60.2K gas=11.14 G reverts=0) instead of a generic
    Function statistics message with a function field
  • Maxxing campaigns that find no improvement log a warn naming the objective
    (e.g.
    objective=max_profit No sequence improved the max value (best stayed at 0))
    instead of an error
  • Removed the redundant Called setup log line and the Ripfuzz out. see ya
    farewell line
  • Fuzzing progress lines now log structured key=value fields (matching the
    final campaign summary) instead of ·-separated prose
  • Terminal log lines print a simple local HH:MM:SS timestamp without the
    module target; the campaign log file keeps the full RFC 3339 timestamp with
    target
  • Trace output hangs children, call context, logs, storage, and result lines
    directly under each frame's name (aligned regardless of gas amount),
    replacing the --- Call #N --- header with a [N] counter on the root frame
    line
  • --fail-on-revert is replaced by --stop-on-revert: any reverted
    transaction stops the campaign (invariant and maxxing mode), writes the full
    trace to fulltrace.log, dumps a compact trace (call context and storage
    changes omitted) to the log and stderr, names both file paths in the error,
    and exits with a failure instead of shrinking
  • A failed setup() after a successful deployment stops the campaign like
    --stop-on-revert: full trace to fulltrace.log, compact trace to log and
    stderr, both paths named in the error
  • A failed harness deployment stops the campaign like --stop-on-revert: full
    trace to fulltrace.log, compact trace to log and stderr, both paths named
    in the error
  • Failed-assertion and max-value findings now dump their traces like
    --stop-on-revert without failing the campaign: full trace to
    fulltrace.log (per-finding fulltrace-N.log or fulltrace-max-N.log),
    compact trace to log and stderr, both paths named
  • Maxxing campaigns no longer track failed assertions or enter the shrinker on
    a revert
  • Upgraded solc dependency to v0.1.1
  • Fuzzer and shrinker progress logs one compact line every 3 seconds, with the
    full statistics printed after the phase finishes
  • Terminal status output now goes through tracing; --disable-log disables
    all log output (terminal and campaign log file)
  • Campaign mode is selected automatically: a harness with a max_* function
    runs in max mode, which supports exactly one max function and rejects
    invariant_* functions
  • Renamed the maxxing campaign type from MaxCampaign to MaxxingCampaign.
  • Fuzzer types now live under fuzzers.
  • Shrinker types now live under shrinkers: Shrinker is renamed to
    InvariantShrinker and MaxShrinker to MaxxingShrinker; the max module
    was removed.
  • Campaign dispatch moved into commands::run::run; CampaignKind::Max is
    renamed to CampaignKind::Maxxing.

Fixed

  • Fork RPC batches that mix cached and missing keys no longer kill the fetcher
    thread with fetcher did not receive all keys, which stalled campaigns after
    new storage slots appeared
  • Campaign worker failures are no longer swallowed: any failed or panicked
    fuzzer/shrinker thread exits the campaign after all workers settle, with the
    full cause chain (e.g.
    revm transaction failed: database error: RPC rate limited: …) instead of
    only the outer message
  • Skipped build artifacts now warn with the artifact file path and full error
    chain instead of a bare cause message printed twice
  • Build artifacts are loaded once per campaign, so trace contexts reuse them
    instead of re-reading the build output directory (which duplicated artifact
    parse errors in the log)
  • --stop-on-revert traces stop at the first reverted transaction: only the
    calls up to and including it are re-run and dumped
  • Mid-transaction rvm.fork switches no longer drop or leak remote state
    written earlier in the same transaction (e.g. rvm.store/rvm.deal on fork
    A then rvm.fork to B): journaled remote mutations commit to the active fork
    overlay before the switch, and local harness accounts stay shared across
    forks
  • Fork transport JSON-RPC payloads are logged at debug instead of info, so
    default runs no longer flood the terminal with full payload lines