Name your rate.The marketcomes to you.
prove.cash is an order book for swaps on PulseChain. You post an offer at your rate. It stays open until someone takes it. No pool price, no slippage, no transaction from you.
It fills at your rate or better, or not at all. You can let the rate fall over time to a floor: the least you will accept. You can also let it fill in parts.
An example signed offer, drawn over real LINK/AAVE prices.
- signer
- 0x7a3f…c19d
- give
- up to3,092
LINK
- receive
- filled at311.833
AAVE
- may fill
- anyone
You receive at least what you asked for
The contract holds whoever fills your offer to the number you signed, and rounds in your favour. If you add a fee, the app raises the amount you sign to cover it. You still receive what you asked for.
Anyone can fill it
No allowlist, no bond, no registration. Whoever fills your offer pays the gas. They keep whatever the market gives above the number you signed.
Posting costs no gas
Your browser does a moment of work to post it. No gas, no transaction, no sign-up.
How it works
- you
Sign the offer
Take up to this much of one token, deliver at least this much of another, inside this window. That is the whole commitment.
- the board
Carries the offer
The offer travels over a message board, not the chain. Posting costs your browser a moment of work. No transaction, no gas, no account.
- anyone
Fills it
No allowlist, no bond, no registration. Whoever fills it is the executor. They pay the gas and the number you signed, and keep whatever the market gives above that.
What you sign depends on your token
There are five ways your tokens can move at the fill. The app reads your token and picks the cheapest one it supports, so the choice is not yours to get wrong.
- EIP-30092 signaturesThe token can move on a signature alone. You never send a transaction, and nothing is approved in advance.
- EIP-2612 permit2 signaturesTwo signatures. Your tokens stay in your wallet until the moment someone fills.
- Permit22 signatures, 1 tx onceApprove Permit2 once. Its address is the same on every chain, and its code cannot change. Every offer after that is two signatures, and your token needs no special support.
- an allowance1 tx, onceApprove the contract once. Every offer after that is one signature.
- escrow1 txDeposit up front. It costs a transaction, and in exchange the offer is funded, so an executor can trust it on sight.
Where your tokens sit.
An offer is only as strong as what backs it.
authorization
funded at fillThe tokens stay in your wallet. Your signed authorization moves them into the contract at the moment of the fill.
- you spend
- Costs 2 signatures and 0 transactions
- off switch
- validBeforeYour signature moves the tokens at the moment of the fill, and it is tied to this one offer. Its expiry is part of the signature. A cancel on chain ends it at once.
escrow
in escrowThe tokens sit in the contract, committed to this one offer, until you withdraw them.
- you spend
- Costs 1 signature and 1 to 2 transactions
- off switch
- withdraw · 1 txOne withdraw returns your money and ends the offer. No cooldown, no unlock step, no window to miss. An offer you never funded is different: somebody else can fund it from money already parked in your name. Cancel the ones you do not want.
permit2
funded at fillThe tokens stay in your wallet. Your signed Permit2 transfer moves them into the contract at the moment of the fill, once and once only.
- you spend
- Costs 2 signatures and at most 1 transaction
- off switch
- deadlineA Permit2 transfer works once and expires with the offer. No standing allowance to us survives it. Your one approval goes to Permit2 itself, at an address we cannot move. A cancel on chain ends the offer at once.
permit
in walletThe tokens stay in your wallet under an allowance. A second signature sets that allowance, so you send no transaction. You can still spend the tokens before the fill, and then the fill fails.
- you spend
- Costs 2 signatures and 0 transactions
- off switch
- cancel · 1 txA permit is an allowance set by a signature, so it costs no transaction. It is still an allowance. Revoking it does not end the offer, because your signed permit sets it again at the next fill. Cancel is the off switch. A stranger who spends your permit first cannot stop the fill.
approval
in walletThe tokens stay in your wallet under an allowance. You can spend them before the fill, and then the fill fails.
- you spend
- Costs 1 signature and at most 1 transaction
- off switch
- cancel · 1 txRevoking the approval happens on the token, where the contract cannot see it. It stops a fill but does not cancel the offer. Approve that token again later and the offer comes back to life. Only cancel ends it, and it costs one transaction.
The whole bill.
Measured gas, not estimates. Posting is free. Whoever fills your offer pays the rest.
The usual case. The receiving balance already holds some of the token.
Post an offer
you- sign it and put it on the boardproof of workThe board asks your browser for a moment of work instead of money. No gas, no transaction, no sign-up.0
Fund it with escrow
you- deposit, so the offer is fundedfirst touchFunding an empty escrow is always a first touch, so it has no warm price. It is optional: an allowance costs nothing up front.124,790
Fill one offer
an executor- from your allowance117,824
- from escrow125,098
- with a callbackwhyThe executor borrows your tokens, sells them elsewhere, and repays inside the same call. They need no money of their own.132,591
Fill twenty at once
an executor- one pair, per offer57,349
- mixed pairs, per offer65,030
- the twenty-first offermarginalWhat one more offer adds to a batch already running. This number decides whether a thin margin is worth taking.52,870
- with callbacks, per offer+504 creditBorrowing inside a batch costs a little extra on every offer. The figure is the difference: one more offer with a callback, less one more without. It is too small to see on these bars.56,682
On mainnet a warm fill costs a fraction of a cent. The executor pays it, and keeps whatever the market gives above the number you signed.
A stranger pays your gas. Here is what they get for it.
Nobody pays a stranger’s gas out of kindness. You are the maker. Whoever fills your offer is the solver. They earn the gap between what the market pays and the number you signed. That is their whole income, and this is what it costs them to chase it.
what they lose
A solver pays gas for every offer they try, and learns afterwards which ones filled. A fill costs 62,481 gas. These three cost the gas and pay nothing.
the offer expired
Costs 13,327 gasThe offer expired between the moment they priced it and the moment the block landed. The contract refuses it before any token moves, so this is the cheap one.
somebody else was faster
Costs 14,070 gasAnother solver filled the same offer first. This is normal on an open board: two solvers reading it will overlap, and the slower one pays for the duplicate.
the maker took it back
Costs 76,376 gasThe offer was good when the solver checked it. Then the maker pulled the money out before the block landed. This is the only failure somebody can arrange on purpose, and each attempt costs the maker a transaction. An offer that was never good is caught before anything is sent, and costs nothing.
what they earn
What is left over, and nothing else. We charge them no fee and give them no rebate, no priority and no queue. They pay the gas. They pay the number you signed. They keep whatever is left. Your fee comes out of the number you signed, not out of the solver’s share. If nothing is left, they lose the gas.
why that is safe for you
They cannot earn more by giving you less.
Your price is in the signature. The contract charges the solver that number, whatever the market does. They can earn more only by finding a better price, never by passing you a worse one.
Anyone can be one.
No allowlist, no bond, no registration, no stake. A solver is any address that sends the transaction. Nobody can be shut out, and nobody can be locked in.
Competition is what fills your offer.
Solvers do not bid your price down. You set it. They compete on how thin a margin they will accept. The thinner it gets, the more offers fill at the rate their makers wanted.
Where the money goes
One fill
open a step for the arithmeticWhat the executor pays, over the window
The offer opens above what the pool pays today and falls until it closes: from 1,005.17 DAI down to 964.65 DAI over 24h 0m. Both are amounts you sign. Take the fee out of the closing number and you have the floor you typed. The dashed lines are the same offer with no fee and with a two per cent fee: one typed number, three signed amounts. Each dot is where that offer meets the market in the week drawn here, after gas. Another week puts the dots somewhere else.You pay the fee, out of the amount you sign. A higher fee makes the offer fill later. That is all a fee costs you.
What nobody can do to you
You signed something. Here are three things it lets nobody do, and where each one is written down.
Nobody can change what you receive.
Your price is in the offer you sign. The contract works out the whole payment from that number, takes the fee you named out of it, and pays you the rest. Where the arithmetic has to round, it rounds towards you.
where to check_quote rounds the gross up with _ceilDiv, rounds the fee down out of it, and pays you the rest.There is no fee to us, and no switch to add one.
The fee is two numbers in the offer you sign: a rate, and where it goes. Name nowhere and nothing is charged. We take no share of it and add none of our own. The code that could charge one is deleted, so no owner can switch it on. A fee to us would need a different contract at a different address, and your signature is bound to this one. Nothing decided later reaches an offer you already signed.
where to check_quote charges i.feeRate and books it to i.feeTo, and claim pays it out from there. Commit 3961c2a deleted feeSink, feeFloorRate, protocolShare, feePolicy, setFees and setFeePolicy.There is no pause and no upgrade.
No switch anywhere reaches your money. The owner can choose where tokens that belong to nobody are sent. That is the entire list. No owner function can spend an allowance you gave.
where to checksetDefaultProceeds and transferOwnership are the only owner-gated functions.
Two people were paid to try to break the above: a security review and an economics review. Every finding from the security review is fixed. One economics finding stays open by design, and its own test asserts that the attack still works. It is one of eleven limits we measured, accepted and wrote down.
Sign one and see.
Give us an address and we mark the tokens it has already moved on this chain. Pick one and the app opens with it selected. You still set your price, and you see every cost before you sign anything.
Or start with any of these.