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
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 happenedExecuting
On-chain execTransaction. Costs gas. Permissionless — anyone may call it. Assigned to nobody, so it does not happen.
A payout everyone approved sits unexecuted because the last step belongs to no one. gavel is the party whose job it is.
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.
The census
366 transactions, one square each
Anyone can concatenate signatures. Knowing which 7.4% are real is the product.
What it does
Read the queue. Prove it is live. Execute.
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.
Proof — one real execution
Ethereum Sepolia. Every field re-read from the chain, not copied from a log.
Verify it yourself
Five surfaces, none of them ours
- EtherscanThe transaction:
Success, 144,637 gas, block 11618878 - LogsSafe
ExecutionSuccess+ USDCTransfer— value moved - readContract
isOwner(executor)returns false - readContract
nonceadvanced past it — consumed, not merely proposed - GitHub
npm test— 80 tests, 100% coverage onassemble.mjs, one against a committed real Transaction Service response
We assert nothing on our own authority.
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-contract—execTransactionfrom 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.
What is not done
Stated plainly, because you will check
- mainnetNo mainnet execution yet. Everything above is Sepolia.
EVIDENCE.mdis absent by design —audit.mjsrefuses rows from a chain markedreceiptsEligible: false - workflowNot deployed on the canvas.
code/run-codeandHTTP Requestneed a paid plan.drain.mjsreaches 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.
Anyone can concatenate signatures.
Knowing which ones are real is the product.
1,299 Safes surveyed · 366 candidates · 339 dead · 2 genuinely executable
gavel · MIT · KeeperHub Agent Economy hackathon · v1.0.0