↓ / SPACE to advance
01

gavel

Executes Safe multisig transactions that already reached their signature threshold — from a wallet that owns nothing on the Safe.

KeeperHub · Safe · Base 8453 · MIT

02

The problem

Signing and executing are not the same act

Signing

Off-chain, in the Safe Transaction Service. Free. The owners already did it — that is why the transaction sits in a queue at all.

● Already happened

Executing

On-chain execTransaction. Costs gas. Permissionless — anyone may call it. Assigned to nobody, so it does not happen.

▲ Nobody's job

A payout everyone approved sits unexecuted because the last step belongs to no one. gavel is the party whose job it is.

03

What we measured first

92.6%

of the obvious answer is wrong

We surveyed 1,299 Base Safes across all of Base history. 366 queued transactions passed the naive test — threshold met, not executed. 339 of them were already dead.

The nonce had moved on. They can never execute, by anyone, ever.

04

The census

366 transactions, one square each

339 dead — nonce consumed 21 live, behind the nonce 4 at nonce, do not simulate 2 simulate SUCCESS

Anyone can concatenate signatures. Knowing which 7.4% are real is the product.

05

What it does

Read the queue. Prove it is live. Execute.

Safe queue threshold · owners · nonce assemble the signature blob simulate execTransaction

The signature blob is the one piece nothing on the platform does for you: sort confirmations by ascending owner address, concatenate 65 bytes each, then run seven pre-broadcast guards. src/assemble.mjs is the entire decision surface — about 40 lines, pure, zero I/O.

Three gates before anything broadcasts: assemble, a local eth_call, then KeeperHub's own simulate. It stops at the first failure.

06

Proof — one real execution

executionId qy3vfai4lux3yokk7ilea transaction 0xf0b3b61144dc272ce39508056d600f28bbb7b92de1b2e30c4dc4da856ea4cc68 status success block 11618878 gas used 144,637 moved 10.000000 USDC executor 0x5E2e5Fd3aD7fDC9B94482930db8b5F45E439bab7 isOwner false ← owns nothing on the Safe it drained

Ethereum Sepolia. Every field re-read from the chain, not copied from a log.

07

Verify it yourself

Five surfaces, none of them ours

  • EtherscanThe transaction: Success, 144,637 gas, block 11618878
  • LogsSafe ExecutionSuccess + USDC Transfer — value moved
  • readContractisOwner(executor) returns false
  • readContractnonce advanced past it — consumed, not merely proposed
  • GitHubnpm test — 80 tests, 100% coverage on assemble.mjs, one against a committed real Transaction Service response

We assert nothing on our own authority.

08

Why only KeeperHub

The platform is the engine, not the wrapper

  • safe/get-pending-transactions — the credentialed queue read. Without it there is no product
  • safe/get-threshold, get-owners, get-nonce — the liveness proof
  • web3/write-contractexecTransaction from a wallet that owns nothing
  • code/run-code — the sandbox the decision runs in

Built alone, that is a Transaction Service client with its own JWT rotation, a relayer with nonce management and retry, and a sandboxed execution host you operate.

09

What is not done

Stated plainly, because you will check

  • mainnetNo mainnet execution yet. Everything above is Sepolia. EVIDENCE.md is absent by design — audit.mjs refuses rows from a chain marked receiptsEligible: false
  • workflowNot deployed on the canvas. code/run-code and HTTP Request need a paid plan. drain.mjs reaches the same outcome via the ungated Direct Execution API — but decides here, not inside KeeperHub. A weaker answer, and we will not blur it
  • surfacesNo demo video, no Hub publication, no Marketplace listing yet

A candid answer here has never hurt a submission.

10

Anyone can concatenate signatures.
Knowing which ones are real is the product.

1,299 Safes surveyed · 366 candidates · 339 dead · 2 genuinely executable

Read the code →

gavel · MIT · KeeperHub Agent Economy hackathon · v1.0.0