The architecture of MuTC's escrow-enforced OTC settlement: one isolated contract per trade, venue-signed authorization, and a Bitcoin settlement path that never takes a counterparty's word for anything.
Three rules shape every component described in this paper.
MuTC does not operate a single escrow contract holding everyone's funds. Every trade deploys its own dedicated escrow contract — a vault — created by a factory at the moment the trade is opened:
MuTCEscrowFactory.createTrade(...)
└─ new MuTCTradeEscrow(feeBps, feeRecipient,
partyA, partyB, tokenA, amountA, tokenB, amountB, deadline)
→ a fresh contract address that exists for this trade alone
The trade's terms — who the parties are, what each side owes, the deadline — are fixed in the vault's constructor as immutable state. Nothing can amend them afterwards: not the counterparty, not the venue, not the contract owner, because the vault has no owner and no admin functions. There is no upgrade path, no pause switch, and no function that moves funds anywhere except to the two parties named at creation (and the flat fee to the fee recipient).
| Property | Single shared contract | Per-trade vault (MuTC) |
|---|---|---|
| Worst-case loss from one bug | Everything the contract holds, across all users | One trade's two legs |
| State interference | All trades share storage; accounting bugs cross trades | Impossible — each vault's storage holds one trade |
| Auditability of a trade | Reconstructed from event logs among thousands | The vault address is the trade — its full history is its own |
| Approval scope | Users approve a contract that also serves strangers | Users approve a contract that serves exactly their trade |
The factory keeps a registry mapping trade IDs to vault addresses and aggregates read-only views for the interface, but holds no funds itself and has no power over any vault after deployment.
Terms locked in the constructor. Both legs unfunded.
Each party deposits exactly their leg. Wrong amounts revert.
The second deposit triggers payout of both legs in the same transaction.
Timeout or mutual cancel returns every deposit to its owner.
Settlement is atomic: the transaction that completes funding is the same transaction that pays both sides. There is no state in which one party has been paid and the other has not.
Two unwind paths cover every other outcome:
Funds are never stranded. From any reachable state, each depositor has a path to either the swap or a full refund that requires no cooperation from MuTC.
The fee is 0.40% (40 bps), taken once, on execution, split from each leg at payout. Cancelled and timed-out trades pay nothing, because nothing executed.
A counterparty whose address refuses incoming ETH cannot hold the swap hostage. If an ETH payout reverts, the vault credits it internally (owedEth) and completes the swap; the recipient withdraws the credit whenever they can accept it. Settlement of one leg is never blocked by the behavior of the other side's receiver.
Bitcoin has no smart contracts, so BTC legs settle through operator-mediated per-trade addresses under rules that mirror the vault model:
The built-in wallet is a standard hierarchical-deterministic wallet, not an exchange account. A 12-word BIP-39 seed is generated in the browser; Ethereum addresses derive from it directly and the Bitcoin address by BIP-84 (m/84'/0'/0'/0/0). Because the derivation is standard, the same 12 words open the same balances in any compliant wallet — the user's access to funds does not depend on MuTC existing.
Every settlement claim is independently checkable:
| Claim | How anyone verifies it |
|---|---|
| The deployed contract is the published source | The verification page compiles nothing and trusts nothing: the visitor's own browser fetches live bytecode from a public RPC and compares it against the published build, immutables masked. |
| A Bitcoin settlement paid what it claims | The same page decodes any settlement transaction directly from public Bitcoin explorers — amounts, addresses, fee — with no MuTC server in the path. |
| The source history is real | Contracts, tests and CI run publicly at MuTC-tech/mutc-contracts; the audit workflow re-runs the full suite weekly and on every push. |
| A maker's funds exist | Proof-of-funds badges on the board re-verify against mainnet balances every minute, and lapse when funds move away. |
Precision about what is trustless and what is not:
| Component | Trust required |
|---|---|
| EVM vault settlement | None. Atomicity, refunds and deadlines are enforced by contract code with no admin surface. |
| Vault refund paths | None. Timeout reclaim needs no signature from MuTC or the counterparty. |
| Trade admission | The broker key signs which trades open. It gates entry, never funds — a malicious broker could refuse service, not steal. |
| Bitcoin legs | Operator-mediated within the published rules (per-trade keys, depth policy, dual-source checks). This is the trust cost of an unscriptable chain, stated plainly. |
| Wallet custody | None. Keys derive and sign on the user's device under standard BIPs. |
The table above is the complete trust surface — two named concentrations, stated plainly, and nothing else. MuTC's key policy binds both: any key that can touch real-asset settlement operates from hardware-backed custody with co-signing. Everything outside those two rows settles without trusting MuTC at all.
The contracts have been through an adversarial internal review in which each vulnerability class was implemented as a working attack before being fixed and regression-tested: reputation forgery, signature replay and malleability, re-entrancy, ETH-refusal griefing, phantom tokens, non-standard ERC-20s, Bitcoin reorg acceptance, single-oracle trust, and operator surplus capture. The full findings table, with severity and status for every item, is published on the contracts page.