Documentation
What the marketplace does, what the contract enforces, what it costs, and what is not true yet. Figures are read out of the contracts.
A marketplace for web3 work: KOL campaigns, raids and community, development, design, video. A project hires someone, and the payment is locked in a contract before the work starts, then released one milestone at a time as it is delivered.
It exists because paying for work in this space means one side carries all the risk. Pay up front and hope, or deliver first and hope. Here neither side has to trust the other: the client can see the provider's record, and the provider can see the money is already there.
"I'm looking for someone." Describe the work, a budget in USDG or ETH and when you need it. Posting is free and locks nothing. Anyone signed in with a wallet can send a proposal with their own price, time and pitch. You pick one and hire.
"I'm offering a service." Describe what you do, what's included, a price and a delivery time. A project that wants it hires you directly.
"We already agreed this in a DM." The provider sets what it is for, the milestones and their amounts, and gets one link to send. The client opens it, sees exactly those terms, and locks the money with one transaction. The link is private: it is not on the board and not on any profile, and only someone who has the address can open it. It works once and expires after 14 days, and it can be made for a single wallet. The server checks that the retainer the client creates has exactly the milestones in the link, the same number and the same amounts in the same order, before it counts as that link's deal.
Requests, services and payment links all end the same way: a retainer on-chain. Listings and proposals themselves are off-chain, signed in with your wallet. Signing in is one message that proves the wallet is yours; it moves no funds.
| Step | Who | What happens |
|---|---|---|
| Lock | Client | Approves the currency (for an ETH deal the app wraps the ETH into WETH first), then creates the retainer: every milestone funded in full, plus the protocol fee. The terms and a hash of the brief are written into the contract. |
| Accept | Provider | Accepts within 7 days. The due dates start counting from this moment. |
| Deliver | Provider | Marks a milestone delivered with a link to the work. The link's hash goes into the contract. |
| Review | Client | 3 days to approve (it pays out) or reject. The client may also pay a milestone early, before delivery. |
| Release | Anyone | If the review window passes in silence, anyone can release the payment. |
A deal holds up to 12 milestones. Due dates are spread over the agreed time and never go backwards. Everything after the hire happens on the deal's own page, which anyone can open at /deal/ID. Its link previews as a card: New partnership via Veil, with the two sides, what is locked and how many milestones.
| Situation | Outcome |
|---|---|
| Not accepted | The client can take the money back at any time before acceptance. After 7 days anyone can send it back to the client. |
| Missed due date | The milestone can no longer be delivered. The client takes it back in full. |
| Rejected delivery | The provider keeps the kill fee set at hire (0 to 50%), the rest returns to the client. |
| Client ends early | Undelivered milestones return minus the kill fee; none is paid on milestones already past their date. Delivered ones carry on. |
| Provider steps away | Every undelivered milestone returns to the client in full. |
| Client goes quiet | After the review window anyone can release the payment. |
No arbiter
The contract never judges quality. A rejection is always possible within the review window; the kill fee is what it costs the client, and what protects the provider.
Every request and service names its currency. The contract takes any plain token, so the marketplace decides the list: USDG (the Global Dollar issued by Paxos), ETH and WETH. Anything else is refused, and a deal in another token cannot be linked to a listing.
The WETH contract is the chain's official one, listed in Robinhood's protocol docs and checked on-chain. The protocol fee is always in ETH, whatever the deal is paid in.
A service can be run by an AI agent. Its owner, a person with a wallet, writes how the agent works, sets a price and gets paid. Anyone can ask the agent for a short free sample on a real task before hiring. After hiring, once the owner has accepted, the client gives the agent its tasks on the deal page (up to six per deal) and both sides can read the output.
Four small agents help with the deal itself: Quill turns a vague need into a clear request, Penny reads the proposals next to each person's record, Ref puts a delivery next to the brief, and Tick counts the deadlines (Tick is plain rules, not a model). They only advise. The contract decides who is paid, never a vot. Meet them.
One flat protocol fee per deal, 0.005 ETH, paid by the client when the deal is created. The provider pays nothing, and there is no percentage taken from the work. Posting, proposing and listing are free.
The fee goes to the fee splitter, which currently sends all of it to the marketing wallet. Paying the fee in VEIL is switched off.
$VEIL trades on Pons, paired with ETH. Its creator fees go to a contract, the fee router, not to a wallet. Every four hours it claims them, sends 60% to marketing as ETH and spends 40% buying VEIL on the market, all of which is paid to wallets holding at least 100,000 VEIL. Every payout list is published and its hash goes on-chain in the same transaction.
Changing the split, the marketing wallet, the keeper or the minimum takes 48 hours' public notice on-chain. The details and every round are on the $VEIL page. You never need the token to hire or be hired.
Every wallet has a profile. Its record (deals completed, earnings, milestones paid, rejected or missed, people hired, amounts paid out) is read from the retainer contract, for deals in USDG, ETH and WETH, with each currency kept apart because they do not add up. It cannot be edited or padded, because nothing in it comes from our database.
Everything else on a profile is off-chain: listings, proposals and pitches are claims by their author.
Connect a wallet and the Profile section shows what you have earned, what is on its way to you, what you have locked and what you have paid out. A timeline lists when money moves: due dates, review windows that end in an automatic payout, and deals waiting for you to accept. All of it is computed from the contract, and the deals you are in are read fresh each time, so a milestone you approved a moment ago already shows. The chart's dates are a rough guide: the contract does not store the day a payment was released, so it uses the day of delivery.
The same numbers are public chain data, so any wallet can be looked at read-only with #profile=0x... on the marketplace page.
veil keeps a daily counter of how many pages were opened, how many wallets signed in, and how many listings, payment links and deals were made. It sets no cookies and puts no scripts in the page. For a rough number of different visitors it hashes address and browser together with a secret that exists only in memory and changes every day, so the fingerprint cannot be traced and cannot be followed from one day to the next. It is never written to disk, and neither is an address. Crawlers and link previews are counted apart. Only the people who run veil can see the totals.
A wallet can give itself a project name, a token symbol, a logo and X and Telegram handles. They show on its profile, on its proposals and on the share card of a deal, so a partnership between two projects reads as two names and two logos instead of two addresses. All of it is set by the wallet itself and proves nothing about the project. The share card says so.
Anyone can type any handle, so a handle on a proposal is marked not verified unless the wallet has proven it:
A verification belongs to one handle. Change the handle on the profile and the proof is gone. Verified means the wallet controls that account, not that the project is trustworthy.
Robinhood Chain, chain id 4663. All verified, exact match.
| Contract | Address |
|---|---|
| VeilRetainer | 0xD755C7F5598C9c3aF38Db2A1FaC0e9AA1AeA6d95 |
| USDG (payments) | 0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168 |
| WETH (ETH payments) | 0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73 |
| $VEIL (Pons) | 0x0e4427ca5eC8E26981F78577c5BdC9Ee941cDF33 |
| VeilFeeRouter | 0x13f834E664bDD7ea8DCa09dbc217690e38c890Aa |
| FeeSplitter | 0x2950764E596c87CF51f854F74Ce38d6f99BE7C7D |
| VeilVault (Veils) | 0xD82b62378b9e5D13c6E7e51c0F11D3FE89f9BFfD |
Not the token
An older contract at 0xd959C2b3ABFb2545D8dac6141b68032f821bf2c2 also calls itself VEIL. It is retired and is not $VEIL. The only $VEIL is 0x0e44...DF33.
The marketplace API is public for reading. Writes need a session: GET /api/auth/challenge?address=, sign the message, then POST /api/auth/session for a bearer token.
GET /api/market/listings?kind=request|service&category=
GET /api/market/listings/:id listing and its proposals
GET /api/market/profile/:address on-chain record and listings
GET /api/market/deals?address= deals linked to a wallet
POST /api/market/listings kind, category, title, body, price, days
POST /api/market/listings/:id/proposals price, days, pitch
POST /api/market/deals retainerId, listingId, proposalId
GET /api/rewards/rounds holder reward rounds
A deal is linked to a listing only after the server reads the retainer back from the chain and confirms the caller is its client and the provider matches.
veil.protocol started with Veils: two projects locking each other's token for a term to prove a partnership. The vault is still deployed and works, but it is no longer part of the site: nobody used it, and paying for work turned out to be the problem people actually have.