Nonceworks

Reproductions and source checks

Notes cover Monitor 1.6.0 and Relayer 1.8.0. The reproductions link to repositories you can run on a laptop with Docker; the rest are read from the source and say so.

Relayer bugs still open upstream

A nonce too high jam that never heals #843, reproduced 2026-10-06

On a strict-nonce chain, one transport error leaves Sent records that the recovery code treats as healthy, and every transaction above them gets nonce too high. At 12 transactions a minute the gap held steady; at 30 it grew for the rest of the run.

A mined transaction marked Failed, "Nonce N consumed externally" #817, reproduced 2026-10-06

A lagging RPC answers null for the receipt while another node already shows the nonce advanced, so reconciliation calls it "consumed externally" and finalizes a transaction that succeeded. The maintainers' PR #899 does not touch this path.

"bumped gas price does not meet minimum requirement" after a gas spike #808, reproduced 2026-10-04

Once the previous fee equals the cap, the 1.1x minimum bump can never be met, so the transaction is never resent, even after gas falls back to an eighth of the cap. The relayer logged the same skip warning every twelve seconds for twenty minutes.

Signing and policies

whitelist_receivers does not cover the sign endpoints #912, source check 2026-10-07

The EVM policies apply to transactions only. The sign and sign-typed-data endpoints go straight to the signer, and the API key that calls them can also change the policies.

Moving an OpenZeppelin Relayer key to AWS KMS: permissions and steps

The two calls the 1.8.0 aws_kms signer makes, an IAM policy that allows only those, and the order of a move off a local key without stranding nonces or funds.

OpenZeppelin Relayer and Google Cloud KMS: no workload identity in 1.8.0 #757, source check 2026-10-10

The google_cloud_kms signer reads a service-account key from its config; there is no Application Default Credentials or GKE workload identity path. What to do on 1.8.0, and which role to grant.

Monitor behavior to know before you rely on it

Status "Failure" conditions never match on a busy chain #498, source check 2026-10-06

The receipt check runs once per monitor against the whole block's logs, so on a busy chain reverted transactions are classified as successful. Putting gas_used in the expression forces the receipt.

Do events match when another contract made the call? #406, source check 2026-10-05

Event conditions match whoever made the call, because the filter never looks at transaction.to for logs; function conditions do not. For cross-contract calls, emit an event and match that.

"Failed to load triggers" when a secret says env instead of environment

The Monitor spells its secret source environment and the relayer spells it env. Mix them and the Monitor exits with "Failed to load triggers". The validator catches this.

Upgrades

Upgrading OpenZeppelin Relayer from 1.4.0 to 1.8.0 2026-10-04

For teams still on 1.4.0: the nonce fixes in 1.5 and 1.7, the stricter secret validation in 1.8, the Redis schema moves, and the rolling-deploy hazard until a release carries #892.

"Signing key must be at least 32 characters long"

Where the check lives in 1.8.0, and the one-line fix.

Tools

defender-action2plugin turns a retired Defender Action into a Relayer plugin skeleton and marks the parts that do not map. The validator runs the pre-start checks on an export; the file is checked on the Nonceworks server and not stored.

Changelog

2026-10-07 Read the 1.8.0 source for where the EVM policies apply: to transactions only, inside the relayer process. The sign and sign-typed-data endpoints go straight to the signer, and the typed-data one receives only two hashes. Wrote it up in a note, opened #912 upstream, and corrected the security page, which had counted the relayer's policies as a limit under a host takeover. The page now lists what does limit it.

2026-10-07 Published the configuration validator: the static checks the control plane runs before a stack starts, including the env versus environment mistake that makes the Monitor exit on startup. The file is checked on our server and not stored.

2026-10-06 Reproduced #843 and #817 on 1.8.0 and posted both on the upstream issues. In the #843 runs the relayer's nonce counter ran 33, then 60, ahead of the chain within six minutes at 30 transactions a minute; in #817 a mined transaction was finalized as Failed on a stale receipt. Confirmed #498 in the Monitor source: status: Failure conditions never match on a busy chain.

2026-10-05 Published the #808 reproduction and linked it on the upstream issue.

2026-10-04 Reproduced #808: a transaction that reaches gas_price_cap during a spike is never resent. Wrote the 1.4 to 1.8 upgrade notes for teams still on 1.4.0.