Pinned Tweet
Two agents, same wallet, same second. Both under the
limit. Together over it.
We serialize now. It costs latency and we have not
found the version that does not.
Still the least bad thing we tried.
We are about to change something we have been getting wrong for a year.
Not the technology. The way we have been presenting it.
Soon.
An agent estimates gas, waits for a human to approve,
then submits. By then the estimate is stale.
We were either overpaying or failing, depending on the
hour.
The estimate expires with the approval prompt now.
An LLM produces a different answer every run. A chain
requires the same answer every node.
Those two facts do not compose. The model has to stay
outside the consensus boundary and hand in a signed
result.
Everything hard about this sits on that line.
An LLM produces a different answer every run. A chain
requires the same answer every node.
Those two facts do not compose. The model has to stay
outside the consensus boundary and hand in a signed
result.
Everything hard about this sits on that line.
We ran agent payments off chain first. Faster, cheaper,
and it worked.
It broke when two services disagreed about whether a
payment happened. There was no third record to check.
That is the only reason we moved. Not decentralization.
Reconciliation.
An agent that asks for spend approval usually gets it
for an unlimited amount, once.
The task ends. The approval does not. We found ones
still open from runs that finished weeks earlier.
We expire approvals with the task now, not with the
wallet.
Most agent frameworks retry on a failed transaction
without checking whether the first one landed.
We saw the same payment go out twice because the
receipt came back after the retry fired.
The fix was an idempotency key on the intent, not on
the request.
Before you let an agent touch a wallet, decide four
things:
What runs when the model is down.
What happens at zero balance.
Who signs, the model or the human.
What the daily cap is.
Most frameworks ship handlers for the first one only.
The x402 payment envelope carries a resource URL, a
description, and a reason field.
All three reach the facilitator in plaintext before
anything settles. The protocol does not sanitize them.
If your agent puts a customer name in that field, it
just left your infrastructure.
ERC-8004 gives an agent an identity that can be
transferred and delegated.
We went the other way. Ours cannot move. If the agent
is compromised, the identity dies with it.
Portable reputation is a feature until someone sells
the passport.
We capped agent spend per day rather than per
transaction.
Per transaction was easy to reason about and useless
in practice. Nothing single was ever the problem.
Binance went with twenty dollars a day. We landed
somewhere near that without knowing they had.
Agent payments hit 8.7 million transfers last week.
Average value per transfer, 4 cents. Down from tens
of cents a year ago.
More transfers at lower value is not adoption. That
is a retry loop with a settlement layer under it.
Rate limits get filed as an infrastructure problem.
Then an agent hits one mid-transaction. It backs
off. It comes back to a state that moved.
We had a handler for the error. Nothing for the gap.
Rate limits get filed as an infrastructure problem.
Then an agent hits one mid-transaction. It backs
off. It comes back to a state that moved.
We had a handler for the error. Nothing for the gap.
You cannot write a unit test for something that
answers differently every run.
So we stopped testing the behavior and started
testing the boundary. Does it hold the limit. Does
it stop at zero. Does it wait for a signature.
The middle is not testable and we spent two months
pretending it was.
Typed "send 10 VCN to jays" and it went through. No gas token to buy first, no address to paste, no seed phrase prompt.
The middle screen is the part we spent the most time on. Amount, recipient, fee, and a password before anything gets signed.
Convenience is easy to add. Knowing where to stop being convenient is the harder half.








