Vurto Private Contract
A direct payment shows both wallets on-chain, to anyone who opens it. With the Vurto Private Contract, the payer deposits into a contract on the blockchain, and the receiver withdraws later, signing with their own wallet. The network shows a deposit and a withdrawal, not a transfer between the two.
Vurto knows who deposited and who withdrew, verifies the identity of both, and keeps the records for 10 years. The contract hides the link between the two wallets from the public. It is not a hiding place.
Where It Runs
| Network | Tokens |
|---|---|
| Ethereum | USDC, USDT, USD1, PYUSD, USDG |
| Optimism | USDC, USDT, USDT0 |
| BNB Chain | USDC, USDT, USD1 |
| Polygon | USDC, USDT0, PYUSD |
| Base | USDC, USDT |
| Arbitrum One | USDC, USDT0, PYUSD, USDG |
| Solana | USDC, USDT, USD1 |
There is one vault per token. Send is open through the contract. The private Invoice is not open yet Coming Soon
How It Works
- Sign the terms. The first time, your wallet signs the contract's risks and terms. They are on the Risks page of the app.
- Verify your identity. The paying wallet needs an approved identity verification with Didit. See Identity Verification.
- Pass the checks. The free check runs on both wallets, and the paying wallet goes through the two paid analyses, Scorechain and Merkle Science, for $0.50 in USDC. The entry refuses a Merkle Science score of 40 or more. Before taking anything, Vurto also checks the token itself: a token that is paused, blocks the wallet, or changed its code since it was measured is refused.
- Deposit. With everything approved, Vurto signs a one-time ticket that lets that wallet deposit that exact amount, for 10 minutes. Your wallet approves the exact amount and deposits. The contract takes no fee: all of the amount becomes a note.
- The receiver withdraws. On the site, the receiver verifies their identity, sees the money under Private Balance, and withdraws all or part of it, always to their own wallet, signing the transaction and paying its network fee.
The Note
Each deposit becomes a secret note with an amount and an owner wallet. To withdraw, the contract needs a valid zero-knowledge proof for the note and a transaction sent by the owner wallet itself.
- Only the owner withdraws. The secret without the wallet does not withdraw, and the wallet without the secret does not either.
- Only to the owner. There is no destination field: the money goes to the wallet that sends the withdrawal.
- All or part. A partial withdrawal leaves a change note with the same owner. Two notes of the same owner can be withdrawn together.
- It does not expire. The 10 minutes are only for the deposit ticket.
- Who keeps it. In a Send, Vurto keeps the note encrypted and builds the proof on its server, so the receiver never sees the note.
What Stays Private, And What Does Not
| Public on the network | Hidden from the public |
|---|---|
| The wallet that deposits, and the amount | Which deposit paid which withdrawal |
| The wallet that withdraws, and the amount | A transfer between the two wallets, because there is none |
| When each one happened |
The link can still be found from the outside:
- Amount and time. A withdrawal of a unique amount matches the only deposit of that amount. Round amounts are harder to match.
- Sums. Withdrawing the exact sum of two payments can identify them and link both payers to your wallet. Leaving change in the vault hides the sum.
- Parts. Withdrawing in parts does not hide a deposit: the parts add up to its amount.
- The receiver in a Send knows the amount, and with a unique amount can find the sender's deposit.
Who Can Do What
- The vault on EVM is immutable: no owner, no pause, no rescue. On Solana one program plays the roles of entry and vault, and it was published without upgrade authority, so its code can never change.
- The entry has two owners, on hardware wallets. They can pause new deposits at once, change the key that signs tickets (with 48 hours of notice), and recover tokens stuck in the entry itself. They have no power over the vault or over withdrawals: even with the entry paused, withdrawals keep working.
- Vurto decides who gets a ticket to deposit. On the site, it also asks for the receiver's identity verification before building a withdrawal, and holds a note whose owner fails the free check.
- The token issuer can still act on its own token, for example by freezing it. The Risks page lists what each issuer can do.
Withdrawing Without Vurto
If Vurto is ever unavailable, a withdrawal does not depend on it. A short outage only delays the site.
- The sender keeps a copy. Before each private send, the sender's wallet signs a fixed message, and the note is encrypted with a key that comes from that signature. Vurto stores the copy as it came and cannot open it. It is under Your Private Sends in the history, to download.
- The copy is opened with the same wallet. The sender signs the same message again, and the withdrawal tool opens the copy and finds the deposit on the network.
- The receiver withdraws. With the note, the owner wallet and a network node that has the pool's full history, the receiver withdraws with the tool, to their own wallet. From then on, the receiver knows who sent.
A wallet that gives a different signature each time cannot keep a copy, so it cannot send privately. A Ledger on Solana does not sign messages: it signs a fixed memo that never lands, and reopening that copy still needs Vurto's code. If both Vurto's note and the sender's copy are lost, the balance is locked for good.
Good To Know
- Tokens sent straight to the vault's address, outside a deposit, are credited to nobody and stay there.
- The receiver needs a little of the network's coin to pay for the withdrawal.
- The contract checks sanctions only at the deposit, and only of the payer. An owner sanctioned later can still withdraw through the contract, outside the site.
- The contract is for transit: withdraw soon.