Segundo

Monad, measured

Segundo on Monad, measured

We settled the pay of 96 freelancers every second for five seconds, from 16 sender keys at once. Monad put 96 of those payouts in a single block.

Per-second pay only works if many tabs can pay out at the same moment without queueing behind each other. So on October 13, 2026 we opened 96 real tabs on Monad testnet, clocked every freelancer in, and settled all of them every second. Then we sent the same kind of payout from a single key, the way Segundo's relayer worked before this test. Below are the numbers from that run, what they don't prove, and the transactions so you can check them.

103payouts landed a second, against 96 a second sent
96of our settles in one block, twice: a whole second of pay for every tab
0.92seconds, median from sending to the block holding it (1.56 s for 9 in 10)
8.1%of the block's gas used by the busiest block of the burst

Why this is the test that matters

Paying by the second turns one invoice a month into a steady stream of small payouts. Three things decide whether that stream keeps up.

Many tabs pay out together

A studio with a dozen freelancers, or a platform with thousands, settles everyone on the same beat. If payouts queue, the freelancer at the back of the queue watches a number that isn't really theirs yet.

One address sends one thing at a time

Every transaction from an address carries the next number in its sequence (its nonce), and the chain takes them strictly in order. A relayer that pays the gas for everyone from one address is a single queue unless it is built not to be.

Blocks set the pace

A payout is final when it is in a block. Monad made a block every 0.305 s on average over the last 10,000, so a once-a-second payout has about three blocks to land in.

The burst, block by block

Every second for five seconds, each of the 16 sender keys sent one settle for each of its own 6 tabs: 96 payouts a second, 480 in all. Each key kept its own nonce sequence, so no key waited on another.

Blocks 70,681,931 to 70,681,944, one bar per block, in the order they were made. Hover or tap a bar for its gas and when we saw it.
Show every block as a table
BlockOursRevertedOthersBlock gas usedSeen after first send
70,681,93136013.0%0.81 s
70,681,9320041.1%0.95 s
70,681,9330061.0%1.34 s
70,681,93448265.4%1.56 s
70,681,93560057.8%1.88 s
70,681,93648225.2%2.18 s
70,681,93736283.9%2.48 s
70,681,93860324.7%2.86 s
70,681,9390062.1%3.26 s
70,681,9400031.5%3.40 s
70,681,94196556.2%3.80 s
70,681,9420033.1%4.07 s
70,681,9430020.3%4.40 s
70,681,94496548.1%4.67 s

The first second was the slowest, and not because of Monad: the three public RPC endpoints took 1.85 s just to accept that first batch while connections opened, against about 0.96 s afterwards. By the last two seconds, every tab's payout for that second landed together in one block.

One key or many

The criticism we set out to test: every transaction comes from one relayer address, in nonce order. So we ran the same payouts three ways.

How it was sentPayoutsPer secondMedian to blockMost in a block
16 keys, each with its own nonces480 in 4.67 s102.80.92 s96
One key, 48 nonces sent at once48, all in block 70,681,99948 in 0.91 s0.91 s48
One key, one at a time: Segundo's relayer before this test34 in 30.8 s1.11.04 s to receipt1

Monad was not the bottleneck; our relayer was. 48 payouts from one fresh key with consecutive nonces all landed in a single block. Segundo's relayer used to send a transaction, wait for its receipt, then send the next, so it topped out near 1.1 payouts a second however fast the chain is. That was fine for a demo and wrong for payroll, so we changed it: the relayer is now a pool of keys that keep many transactions in flight each.

Production needs what this benchmark used: a pool of relayer keys, each sending its own nonces without waiting. With a pool, one stuck transaction holds up only its own key, server instances never race for the same nonce, and no key comes near Monad's limit on fees in flight per account, the lesser of 10 MON and its balance over about three blocks1. At 0.0093 MON a payout, that limit is roughly a thousand payouts in flight per key.

Since this run, Segundo's relayer uses a pool of 7 keys. Each person's actions go to one key chosen from their address (a tab's payouts, from its number), so they stay in order, and each key sends its next transaction without waiting for the last one's receipt. In our own test of 12 transfers sent at once by 12 people, the last one finished in 5.6 to 9.4 s over three runs; through the one-key relayer it took 25 to 57 s, and one timed out.

Why a running tab costs nothing

The other half of per-second pay at scale is not writing to the chain every second. Segundo's contract (deployed under its working name, Till) is built so it doesn't have to.

earned=banked + (now − clocked in) × rate ÷ 3,600never more than the budget

When a freelancer clocks in, the contract stores one timestamp. From then on nothing is written: what they have earned is worked out from the block's clock whenever anyone asks. Ninety-six tabs running cost the same as none.

Money moves only when a tab is settled, and anyone may settle any tab, because the money can only ever go to that tab's freelancer. That is what let 16 unrelated keys pay 96 people in this test without any of them being trusted.

What this run does not show

A benchmark is only worth its caveats. These are ours.

The pace and the price

Average block time, last 10,000 blocks

0.305 s

Blocks 70,698,724 to 70,708,724, read from Monad testnet when this page was last refreshed (every 10 minutes). During the run it was 0.305 s.

Gas for one settle, from eth_estimateGas on Monad testnet
First payout to a new freelancer118,591
Every payout after that84,456
Nothing new earned31,564
Price paid per unit of gas102 gwei

Check it yourself

Every payout in the run is a public transaction. A few to start with:

The scripts that ran this are in the repository, with the method and how to run it again: scripts/bench. This page is built from the run's summary, bench.json; the record of every transaction (send time, block, status, amount paid) sits next to the scripts in scripts/bench/out.

Open a tabSee tabs running now