How VaultOTC Works
Trustless, atomic OTC swaps for NFTs, ETH, USDC, and USDT. No intermediary. No counterparty risk. The smart contract is the escrow.
Step by step
Maker specifies both sides, then submits
The maker fills in what they are offering AND exactly what they want in return â both sides of the trade, upfront, in one form. There is no real-time session or back-and-forth with the counterparty on-chain. Negotiate the terms off-chain first (Telegram, Discord), then encode the agreed deal here. Once submitted, the smart contract immediately pulls the maker's assets from their wallet and locks them in escrow.
The link only appears after this transaction confirms. There is no link until the offer is live on-chain.
Maker sends the link to the counterparty
An offer ID is minted on-chain and a shareable URL is generated (e.g. vaultotc.xyz/offer/42). The maker copies this and sends it to their counterparty over any channel. The counterparty does not fill anything in â the complete offer is already on-chain. They only decide to accept or decline.
The link is read-only. Opening it cannot move your funds, sign anything, or change your approvals.
Taker reviews the full offer and accepts
The taker opens the link and sees both sides as the maker specified them. They verify what leaves their wallet and what enters it, check a confirmation box, approve the escrow contract to move their assets, and call Accept. In a single transaction the contract sends the maker's locked assets to the taker and the taker's assets to the maker.
Atomic â either the full swap executes or nothing does. There is no moment where one party holds both sides.
The maker fills in both sides
Unlike a traditional order book where each party submits their own side, VaultOTC requires the maker to specify the complete deal upfront: what they offer and exactly what they demand in return. The counterparty ("taker") does not fill anything in â they receive a complete offer and choose to accept or decline.
This means you should agree on terms with your counterparty off-chain first. Once the deal is clear, the maker creates the offer on VaultOTC and sends the link. The taker simply confirms and executes.
Trade flow
Maker deposits
Assets locked in contract
Link shared
Counterparty opens offer
Taker approves
Their assets ready to move
Atomic swap
Both sides exchange instantly
Security model
Assets locked in escrow, not held by VaultOTC
Once created, the maker's assets sit inside the smart contract â not in our wallet, not on our servers. We cannot touch them. Neither can the maker until they cancel or the taker accepts.
Atomic swap â no partial fills
acceptOffer is one transaction. The contract sends both sides in the same call. If any transfer fails (wrong token, wrong amount, reverted NFT), the entire transaction reverts and nothing moves.
Private offers lock the taker address
If the maker specifies a taker address, the contract enforces it. Even if someone else gets the link, they cannot accept. Only the designated wallet can.
Reentrancy protection
All state-changing functions use OpenZeppelin's ReentrancyGuard. An attacker cannot call back into the contract during a transfer to drain funds.
Expiry enforcement
Offers can be created with a time limit. Once expired, acceptOffer reverts. The maker can then cancel and recover their assets. No indefinite open offers if you don't want them.
Maker can cancel anytime before acceptance
If the counterparty goes silent or the deal falls through, the maker calls cancelOffer and all their assets return immediately. No fees, no waiting.
Exact amounts â no approval griefing
ERC-20 allowances are set to the exact amounts in the offer, not unlimited. Even if the contract were somehow compromised, it could only move what was explicitly approved for that trade.
SafeERC20 â handles non-standard tokens
USDC and USDT do not follow the ERC-20 return-value standard exactly. SafeERC20 handles this, preventing silent transfer failures that could leave the contract in an inconsistent state.
Before you accept an offer
The contract protects you from technical exploits but cannot protect you from bad judgment. Run through this checklist before clicking Accept.
- 1
Verify the escrow contract address on Etherscan before approving anything.
- 2
Check the NFTs being offered â open the contract on Etherscan, confirm it is the collection you expect.
- 3
Only USDC and USDT are displayed as named tokens. Any other ERC-20 address is flagged as unverified â do not accept unverified tokens without independent research.
- 4
Confirm you actually own what you are committing to send.
- 5
Understand that once accepted, the swap is final and irreversible.
- 6
If offered via a link, open the offer URL and compare the maker address to who you are dealing with â anyone can create an offer link.
What the contract cannot protect against
- Accepting an offer for an NFT you haven't verified is genuine
- Sending real USDC for a worthless copycat token with the same name
- Accepting a trade with an unknown person you don't trust off-chain
- Phishing sites pretending to be VaultOTC â always check the domain
The escrow guarantees that what is specified in the offer is what gets swapped. It cannot guarantee that what is specified is worth what you think it is.