Sealed
Negotiation orderNo. 6
Copy
1 of 3, buyer copy
Network
Base Sepolia, a test network
Demo termsPrice per 1,000 calls to a market-data API, 30-day term
Public reference price$40.00 per 1,000 calls
Deadline2026-09-27 17:25 UTC
BuyerERC-8004 agent #9341Admitted
SellerERC-8004 agent #9342Admitted

If the seller sees your maximum, it charges your maximum

Your agent can haggle without showing its budget first.

Each agent locks a hashed offer on Base. A referee says only whether the offers meet; one transaction settles at the midpoint, and the buyer then pays per call over x402.

Check it yourself

StatusAll 9 steps on file. Replay types them again.

Daily allowance
$0.126 in USDC a day 0x7bcf…7573 (opens in a new tab)
Paid
3 calls at $0.042 in USDC each, over x402
Refused
1 call at $0.084, before signing
Fourth draw
Rejected by Base: $0.168 today would pass the $0.126 allowance
Sealed rounds of negotiation 6 as recorded on the buyer copy
RoundBuyer offer per 1,000 callsReferee answerSeller offer, not on this copy
1$41.00Offers apartPrice not on this copy
2$41.00Offers apartPrice not on this copy
3$43.00Offers meetPrice not on this copy
Settlement

$43.00 and $41.00 opened in one transaction, settled halfway

0x772b…0a5e (opens in a new tab)
Sealed
Negotiation orderNo. 6
Copy
2 of 3, seller copy
Network
Base Sepolia, a test network
Demo termsPrice per 1,000 calls to a market-data API, 30-day term
Public reference price$40.00 per 1,000 calls
Deadline2026-09-27 17:25 UTC
BuyerERC-8004 agent #9341Admitted
SellerERC-8004 agent #9342Admitted

If the seller sees your maximum, it charges your maximum

Your agent can haggle without showing its budget first.

Each agent locks a hashed offer on Base. A referee says only whether the offers meet; one transaction settles at the midpoint, and the buyer then pays per call over x402.

Check it yourself

StatusAll 9 steps on file. Replay types them again.

Daily allowance
$0.126 in USDC a day 0x7bcf…7573 (opens in a new tab)
Paid
3 calls at $0.042 in USDC each, over x402
Refused
1 call at $0.084, before signing
Fourth draw
Rejected by Base: $0.168 today would pass the $0.126 allowance
Sealed rounds of negotiation 6 as recorded on the seller copy
RoundBuyer offer, not on this copyReferee answerSeller offer per 1,000 calls
1Price not on this copyOffers apart$42.00
2Price not on this copyOffers apart$41.50
3Price not on this copyOffers meet$41.00
Settlement

$43.00 and $41.00 opened in one transaction, settled halfway

0x772b…0a5e (opens in a new tab)
Sealed
Negotiation orderNo. 6
Copy
3 of 3, chain copy
Network
Base Sepolia, a test network
Demo termsPrice per 1,000 calls to a market-data API, 30-day term
Public reference price$40.00 per 1,000 calls
Deadline2026-09-27 17:25 UTC
BuyerERC-8004 agent #9341Admitted
SellerERC-8004 agent #9342Admitted

If the seller sees your maximum, it charges your maximum

Your agent can haggle without showing its budget first.

Each agent locks a hashed offer on Base. A referee says only whether the offers meet; one transaction settles at the midpoint, and the buyer then pays per call over x402.

Check it yourself

StatusAll 9 steps on file. Replay types them again.

Daily allowance
$0.126 in USDC a day 0x7bcf…7573 (opens in a new tab)
Paid
3 calls at $0.042 in USDC each, over x402
Refused
1 call at $0.084, before signing
Fourth draw
Rejected by Base: $0.168 today would pass the $0.126 allowance
Sealed rounds of negotiation 6 as recorded on the chain copy
RoundBuyer hashReferee answerSeller hash
1Price not on this copyCommitment hash 0x5d28…348b (opens in a new tab)Answered off-chainPrice not on this copyCommitment hash 0xeb31…0d2a (opens in a new tab)
2Price not on this copyCommitment hash 0xc916…044a (opens in a new tab)Answered off-chainPrice not on this copyCommitment hash 0x0581…b45c (opens in a new tab)
3Price not on this copyCommitment hash 0xa8d8…3483 (opens in a new tab)Answered off-chainPrice not on this copyCommitment hash 0xe7dd…eebe (opens in a new tab)
Settlement

$43.00 and $41.00 opened in one transaction, settled halfway

0x772b…0a5e (opens in a new tab)

Then the buyer paid the price it agreed to

Per call over x402, in USDC from its owner's Base Account. Before signing, the buyer checks price and payee against deal #6.

Paid per call

$0.042

USDC, read from negotiation #6: $42.00 per 1,000 calls

Seller received$0.126 for 3 paid calls
Paid fromBase Account 0x3F93…0928 (opens in a new tab)Daily allowance of $0.126; Base rejected a fourth draw
  1. 01

    GET /market-data

    $0.042

    Paid in USDC

    0x0ab2…3fa3 (opens in a new tab)
  2. 02

    GET /market-data

    $0.042

    Paid in USDC

    0x03a8…bb60 (opens in a new tab)
  3. 03

    GET /market-data

    $0.042

    Paid in USDC

    0x9064…8026 (opens in a new tab)
  4. 04

    GET /market-data-surge

    Asked $0.084

    Refused before signing

    Asked $0.084 per call; the deal says $0.042

    No transaction

Allowance book

Daily allowance (Spend Permission)$0.126Granted tothe buyer agent, which held no USDC of its own before the first drawApprovalPermission 0x7bcf…7573 (opens in a new tab)
Draws from the Base Account against the daily allowance
DrawAmountLeft today
1, before payment 10x9dc0…8161 (opens in a new tab)$0.042$0.084
2, before payment 20x48ec…5d37 (opens in a new tab)$0.042$0.042
3, before payment 30x85d1…720e (opens in a new tab)$0.042$0.000
4, rejected by BaseExceededSpendPermission(168000, 126000): in atomic USDC (6 decimals), a fourth draw would bring today's total to $0.168, over the $0.126 allowance. Checked without a transaction.

Negotiation #6, step by step

Every step happened on Base Sepolia, and each links to its transaction.

Order log, No. 6

9 of 9 steps on file

Negotiations2

shown here, both ran on Base Sepolia: one deal, one expiry

Sealed offers12

hashes on Base; only #6's 2 final offers were ever opened

Agents#9341, #9342

each has an ERC-8004 ID and track record on Base; we wrote these demo records ourselves

Contracts2

source verified on Sourcify, exact match

Every step of negotiation 6, with its transactions on Base Sepolia
DoneStepWhat happenedOn Base Sepolia
1Agents #9341 and #9342 admitted, negotiation #6 opened
2Round 1: both offers sealed, offers apart
3Round 2: both offers sealed, offers apart
4Round 3: both offers sealed, offers meet
5Settled at $42.00 per 1,000 calls; $43.00 and $41.00 opened
6A daily allowance of $0.126, granted from the owner's Base Account
7Paid 3 calls at $0.042 in USDC each, over x402
8The buyer refused a call at $0.084, before signing
9Base rejected a fourth draw over the allowance

Check it yourself

Every link opens Base Sepolia on Basescan or Sourcify, and the two scripts read the chain itself. You need no wallet.

Reverse of order No. 6: checking instructions

  1. 01

    Open a commit transaction

    Its input is commitOffer(negotiationId, hash). Decode it on Basescan: 32 bytes of hash, and no price.

  2. 02

    Recompute every hash from the transcripts

    The script rebuilds each hash from the published offer and salt and compares it with the calldata on Base Sepolia: 28 checks for #6, 26 for #7. Run it in bash or zsh from the repository root after npm install.

    RUN=demo-runs/baseSepolia-deal-6.json npm run verify:run
    RUN=demo-runs/baseSepolia-no-deal-7.json npm run verify:run
  3. 03

    Read the contracts

    Both are verified on Sourcify with an exact match to the source in the repository.

  4. 04

    Check who may negotiate

    The gate reads the canonical ERC-8004 registries. A third agent, #9343, has 1 review, below the minimum of 5, and the gate rejected it in our smoke test.

  5. 05

    Check the payments

    The script reads the price and both wallets from the contract, confirms each USDC transfer on Base Sepolia, checks that no other payment from the buyer to the seller happened during the run, and checks that every draw from the Base Account stayed inside its Spend Permission.

    npm run verify:payments -- demo-runs/baseSepolia-x402-6-base-account.json

Two negotiations, round by round

Negotiations #6 and #7. Switch between what each agent knew and what Base recorded.

Read this order as
Negotiation#6
Public reference price$40.00 per 1,000 calls
Deadline2026-09-27 17:25 UTC
Rounds3, offers met in round 3

Round

Buyer

ERC-8004 agent #9341

Will pay at most $43.00 per 1,000 calls

Private to this agent, published here for the demo.

Limit never sent on-chain

Wallet 0x9DE7…d240 (opens in a new tab)

Referee

Checks each offer against its hash, answers only whether the offers meet

Runs off-chain; its answers are not recorded on Base

Seller

ERC-8004 agent #9342

Will accept no less than $41.00 per 1,000 calls

Private to this agent, published here for the demo.

Limit never sent on-chain

Wallet 0xB698…4726 (opens in a new tab)

Round1
Buyer
$41.00

Model: opens with room

Opened at $41.00, $1.00 above the reference, $2.00 below its limit.

Price not readable on Base

Commit transaction input: commitOffer(6, 0x5d285c5f…e22c348b (opens in a new tab))

Referee
Offers apart

Both sides learn only this

Off-chain

The referee's answer is not recorded

Seller
$42.00

Model: opens with room

Opened at $42.00, $2.00 above the reference, $1.00 above its limit.

Price not readable on Base

Commit transaction input: commitOffer(6, 0xeb31aef8…93290d2a (opens in a new tab))

Round2
Buyer
$41.00

Model: holds

Held at $41.00, $1.00 above the reference, $2.00 below its limit.

Price not readable on Base

Commit transaction input: commitOffer(6, 0xc9164e44…d684044a (opens in a new tab))

Referee
Offers apart

Both sides learn only this

Off-chain

The referee's answer is not recorded

Seller
$41.50

Model: concedes

Moved down $0.50 to $41.50, $1.50 above the reference, $0.50 above its limit.

Price not readable on Base

Commit transaction input: commitOffer(6, 0x0581984c…4695b45c (opens in a new tab))

Round3
Buyer
$43.00

Model: goes to its limit

Moved up $2.00 to $43.00, $3.00 above the reference, at its limit.

Price not readable on Base

Commit transaction input: commitOffer(6, 0xa8d8fdb1…0d6c3483 (opens in a new tab))

Opened by the settlement: $43.00

Referee
Offers meet

The buyer offers at least what the seller asks

Off-chain

The referee's answer is not recorded

Seller
$41.00

Model: goes to its limit

Moved down $0.50 to $41.00, $1.00 above the reference, at its limit.

Price not readable on Base

Commit transaction input: commitOffer(6, 0xe7dd657d…5103eebe (opens in a new tab))

Opened by the settlement: $41.00

Settled on Base Sepolia at $42.00 per 1,000 API calls, halfway between the buyer's $43.00 and the seller's $41.00

The buyer could pay up to $43.00 and the seller would take $41.00 or more. Neither knew the other's limit. They met in round 3, when both committed at their limits.

The settlement is the only transaction that carries offers, and only round 3's pair. The offers of the other 2 rounds were never made public on-chain.

Reading the contract on Base Sepolia

The live read needs JavaScript. Every transaction link above opens on Basescan.

Each agent decided with qwen2.5:14b-instruct running locally, with up to two model calls per round and only its own limit in view. The model picks a stance and a number. Code enforces the limit and writes each explanation. Transcript: demo-runs/baseSepolia-deal-6.json

Negotiation#7
Public reference price$40.00 per 1,000 calls
Deadline2026-09-27 17:13 UTC
Rounds3, offers never met

Round

Buyer

ERC-8004 agent #9341

Will pay at most $36.00 per 1,000 calls

Private to this agent, published here for the demo.

Limit never sent on-chain

Wallet 0x9DE7…d240 (opens in a new tab)

Referee

Checks each offer against its hash, answers only whether the offers meet

Runs off-chain; its answers are not recorded on Base

Seller

ERC-8004 agent #9342

Will accept no less than $43.00 per 1,000 calls

Private to this agent, published here for the demo.

Limit never sent on-chain

Wallet 0xB698…4726 (opens in a new tab)

Round1
Buyer
$36.00

Model: opens with room, overridden

Opened at $36.00, $4.00 below the reference, at its limit.

The model asked for $38.00; code held the buyer to its limit of $36.00.

Price not readable on Base

Commit transaction input: commitOffer(7, 0x5029cc84…1b85b866 (opens in a new tab))

Referee
Offers apart

Both sides learn only this

Off-chain

The referee's answer is not recorded

Seller
$43.00

Model: opens with room, overridden

Opened at $43.00, $3.00 above the reference, at its limit.

The model asked for $42.00; code held the seller to its limit of $43.00.

Price not readable on Base

Commit transaction input: commitOffer(7, 0x6db06b6d…219b2c93 (opens in a new tab))

Round2
Buyer
$36.00

Model: goes to its limit

Held at $36.00, $4.00 below the reference, at its limit.

Price not readable on Base

Commit transaction input: commitOffer(7, 0x81c4d5b5…bd7f78c8 (opens in a new tab))

Referee
Offers apart

Both sides learn only this

Off-chain

The referee's answer is not recorded

Seller
$43.00

Model: concedes, overridden

Held at $43.00, $3.00 above the reference, at its limit.

The model asked for $42.00; code held the seller to its limit of $43.00.

Price not readable on Base

Commit transaction input: commitOffer(7, 0x8fb68e31…d56f2ed6 (opens in a new tab))

Round3
Buyer
$36.00

Model: goes to its limit

Held at $36.00, $4.00 below the reference, at its limit.

Price not readable on Base

Commit transaction input: commitOffer(7, 0x32915b87…a5c2881b (opens in a new tab))

Referee
Offers apart

Both sides learn only this

Off-chain

The referee's answer is not recorded

Seller
$43.00

Model: goes to its limit

Held at $43.00, $3.00 above the reference, at its limit.

Price not readable on Base

Commit transaction input: commitOffer(7, 0x0d59f2c9…006e5cd8 (opens in a new tab))

The offers never met. The negotiation expired with no offer on-chain.

The buyer could pay at most $36.00; the seller would take no less than $43.00. No price satisfies both, so the offers met in none of the 3 rounds and the negotiation expired at its deadline.

The chain recorded 6 hashes and an expiry. No offer from either side ever appears on Base.

Reading the contract on Base Sepolia

The live read needs JavaScript. Every transaction link above opens on Basescan.

Each agent decided with qwen2.5:14b-instruct running locally, with up to two model calls per round and only its own limit in view. The model picks a stance and a number. Code enforces the limit and writes each explanation. Transcript: demo-runs/baseSepolia-no-deal-7.json

Try a negotiation yourself

Pick both private limits. Your browser seals every offer with the same hash the deployed contract checks, and you see only what the referee would tell the agents. Nothing leaves this page.

per 1,000 calls
per 1,000 calls

Each agent here follows a fixed rule: it opens 5% away from its limit and reaches its limit in round 3. In the live negotiations above, a local model chose every number.

The practice negotiation needs JavaScript. The two live negotiations above do not.

Nothing sealed yet. Pick two limits and press Seal and negotiate.

How a sealed negotiation runs

Two contracts on Base, and one off-chain referee that sees both offers and tells the agents only yes or no.

Back of the form: how each step is filed

The four steps of a sealed negotiation, where each runs, and what Base records
StepContract or fileWhat the chain sees
1AdmitThe gate reads the ERC-8004 registries. An agent may negotiate only with at least 5 reviews from any of 3 approved reviewers, with an average score of at least 4.00.ReputationGate.solThe negotiation opening, once both agents clear the gate
2CommitEach round, both agents send Base a hash of their offer plus a random 32-byte secret, the salt, so nobody can find the price by hashing likely numbers.SealedNegotiation.commitOfferOne 32-byte hash per offer, never the price
3ClearThe referee (clearingRelay.ts) checks each agent's offer and salt against its hash on-chain and tells both sides one bit: the offers meet, or not.agents/relay/clearingRelay.tsNothing: the referee answers off-chain
4SettleWhen the offers meet, both agents sign over the exact pair of hashes, and one transaction settles at the midpoint. There is no separate reveal step to back out of.SealedNegotiation.settleBoth final offers and the midpoint price, in one transaction

Who pays for Sealed

The plan after the event. None of this is charged in the demo.

Fee schedule, planned

Fee

0.25%

of the value paid at a price settled through Sealed, charged to the seller

First customers

API sellers that already charge per call over x402. Sealed lets them sell volume to buying agents at a negotiated price without publishing a price list the other side can game.

Why they pay

The bet is that a buyer agent that cannot be squeezed commits to more volume. In negotiation #6 the seller would have accepted $41.00 per 1,000 calls and closed at $42.00, while the buyer paid $1.00 less than its $43.00 limit. The fee grows with settled volume across every seller: each $1,000,000 of API spend settled through Sealed pays $2,500.

Next, in order

  1. 1Move the referee into an attested enclave
  2. 2Code the fee into settlement
  3. 3Deploy on Base mainnet
  4. 4Run a pilot with one x402 seller

Team

Kevin Soto Burgos

Founder, will build Sealed full-time after the event.

What this demo does not claim

Four limits of this demo.

Terms

  1. 01

    The referee is trusted with privacy

    It sees both offers each round. It cannot forge or alter a deal, because settlement needs both agents' signatures over the exact pair of hashes. In negotiation #8 the referee ran as its own process, holding no agent key, and reached each agent over HTTP; it still sees both numbers. The production path is an attested enclave (TEE) or threshold encryption. Transcript: demo-runs/baseSepolia-deal-8-separated.json, created 0x9481…6382 (opens in a new tab)

  2. 02

    Testnet money, demo data

    The payments move testnet USDC on Base Sepolia. The API the buyer pays for returns a labelled demo payload.

  3. 03

    The reputation is seeded

    The reviews that admit agents #9341 and #9342 were written by our own seed script, and the repository labels them that way.

  4. 04

    The transcripts publish secrets on purpose

    Price limits, offers and salts are published so you can recompute every hash. A real agent keeps them private.