A revenue-generating, dual-collateral stablecoin that holds all three properties at once — decentralised, stable, and capital-efficient — spanning a dedicated Cosmos EVM chain and Ethereum, with an internal credit module, bond market, AMM, and an autonomous cross-chain peg engine.
USC is a $1 stablecoin backed by a dual-collateral basket — 80% mETH (synthetic ETH, 1:1 backed by real ETH locked on Ethereum) and 20% WCAPE (the wrapped native token of the protocol's own chain). Every part of the system feeds one loop: real fee revenue is harvested, converted to backing, and paid out as yield to USC holders who lock their coins.
Every USC is minted against mETH + WCAPE at live oracle prices. Redeemable at any time for the underlying basket.
Bridge fees (0.1% in / 0.2% out), mint & redeem fees (0.1%), AMM swap fees (0.3%), and staking yield on bridged ETH (3.5% APR, simulated on testnet).
The Treasury Credit Module (TCM) pays 4–7% APR on 90-day locked USC — the rate tracks the support ratio, is fixed the day you deposit (grandfathered), and is funded entirely by the protocol's own fees.
Real ETH lives on Ethereum (Sepolia). All protocol logic runs on a dedicated Cosmos EVM chain (ID 9000, native token CAPE) with 1-second blocks.
The 20% WCAPE backing requirement means every USC minted creates structural buy pressure for CAPE — absorbing supply distributed by the LPBonder's emissions budget.
An autonomous liquidity loop borrows against staked ETH when support falls below 1.02 and repays automatically above 1.30 — sized smoothly by the live deficit, no human trigger.
Two chains, one relayer, ten contracts. Ethereum holds the real ETH; the Cosmos EVM chain runs everything else.
| Component | Detail |
|---|---|
| Cosmos EVM node | Evmos v19, chain ID 9000 (usc_9000-1), native denom acape, 1 s blocks. Runs as evmosd systemd service with auto-recovery wrapper (height-mismatch auto-reset + auto-redeploy + auto-funding). |
| Ethereum side | Real Sepolia via Alchemy RPC. Merchant contract holds bridged ETH. |
| Relayer | Node.js service (usc-relayer). Watches ETHDeposited (Sepolia → mint mETH), RedemptionRequested (Cosmos → release ETH), ProtocolRevenueReady (Sepolia → mint revenue mETH). Pushes ETH/USD + CAPE/USD to PriceOracle every 60 s. |
| Determinism | Contract addresses are deterministic (deployer + nonce) — chain resets always redeploy to identical addresses. |
| Token | Type | What it is | Supply mechanics |
|---|---|---|---|
| USC | ERC-20 | The $1 stablecoin. The product. | Minted/burned only by Treasury against the 80/20 basket at oracle prices. |
| mETH | ERC-20 | Synthetic ETH on the Cosmos chain. Always 1:1 with real ETH locked in Merchant on Sepolia. | Minted by MerchantBridge on deposit, burned on redemption. Also minted for verified protocol revenue. |
| CAPE | Native | Gas token of the Cosmos chain. The protocol's equity-like asset. | Fixed genesis supply. Distributed via the LPBonder's emissions budget; demanded via the 20% backing rule. |
| WCAPE | ERC-20 | Wrapped CAPE (WETH9 pattern). What contracts actually hold. | 1:1 wrap/unwrap of native CAPE — no privileged minting; total supply always equals CAPE locked in the wrapper. |
| CLP | ERC-20 | CapePool LP share (mETH/WCAPE). The bondable asset — and, once bonded, permanent Treasury backing. | Minted/burned by permissionless add/removeLiquidity (Uniswap-V2 share math). Appreciates from the 0.3% swap fee. |
Nine contracts on the Cosmos chain, one on Sepolia. All verified line-by-line against the deployed source.
Issues and redeems USC against the 80/20 basket, accumulates protocol revenue as mETH, and harvests it into TCM rewards. Roles: DEFAULT_ADMIN_ROLE (deployer), OPERATOR_ROLE (deployer + MerchantBridge).
| Function | Access | Behaviour |
|---|---|---|
buyUSC(meth, cape, applyFee) | public | Pulls mETH + WCAPE (must be 80/20 by USD value ±2%), mints USC = deposit value. 0.1% fee on the mETH side when applyFee (fee → protocolMethBalance). The bonder route passes false. |
sellUSC(usc) | public | Burns USC, returns mETH (80%) + WCAPE (20%) at current prices. 0.1% fee: mETH-equivalent moves to revenue pool; the CAPE share of the fee stays as excess backing. |
harvestToTCM() | public (permissionless) | Swaps 20% of protocolMethBalance for WCAPE via CapePool, adds all to backing, mints USC of equal value straight into TCM's rewards pool. |
receiveBacking(meth, cape) | OPERATOR | Injects collateral without minting USC — used by the emergency liquidity loop. |
receiveProtocolRevenue(meth) | OPERATOR | Accepts bridged revenue mETH into protocolMethBalance. |
calcUscSupport() | view | Backing USD ÷ active supply (TCM-held USC excluded). Backing = mETH + WCAPE + CLP at fair value. Returns uint256.max when active supply is zero. |
registerLpAndMint(lp) v2 | OPERATOR (LPBonder) | Pulls CLP as permanent backing, mints equal-value USC straight into the TCM rewards pool. Fair pricing: P_lp = 2·√(methUsd·capeUsd)/S — manipulation-resistant (uses oracle prices + pool invariant, not raw reserves). |
harvestLpFees() v2 | public (relayer, daily) | Converts swap-fee growth on Treasury-held CLP into USC → TCM. Fee isolation via √k-per-share: grows only from fees, immune to price moves and proportional add/remove. Support-neutral by construction. |
releaseBacking(meth, cape) v2 | OPERATOR (bridge) | Controlled outflow for loop repayment. Hard guard: reverts unless post-release support ≥ 1.20. |
previewBuy / previewSell / fairLpPrice / activeUscSupply | view | Quote + metric helpers for frontends and the loop controller. |
Lock USC for 90 days at a grandfathered APR: the rate in force the day you deposit is written into your deposit and never changes for its duration. The rate offered to new deposits is a smooth linear function of the support ratio — 7% at support ≤ 1.00, 4% at ≥ 1.50 (rate = 7% − 3%·(s−1.0)/0.5). Weak peg → higher rate → more locking → active supply shrinks → peg recovers: the deposit rate is itself a peg-defense instrument. Interest remains capped by the rewards pool (solvency), and locked USC is excluded from the support denominator.
| Function | Behaviour |
|---|---|
deposit(amount) | Locks USC; snapshots aprAtDeposit = rateFromSupport(now) into the deposit. |
withdraw(id) | After 90 days: principal + amount × aprAtDeposit × elapsed/year, capped by rewards pool. |
allocateRewards(amount) | Open — Treasury feeds the rewards pool (harvests, LP registrations, LP fees). |
currentAPR() / currentDepositAPR() | The rate NEW deposits would lock in right now. |
setTreasury(addr) | One-time wiring (owner) — lets the rate curve read the live support ratio. |
Bond CLP tokens (not the raw basket) at a 5% discount, fixed on the deposit day — CAPE price moves during the 5-day lock change nothing. The CLP flows to the Treasury as permanent backing; equal-value USC is minted into TCM rewards. Because the deposited liquidity stays inside the pool, every bond deepens the market that must later absorb its own payout — and keeps earning the 0.3% swap fee for the protocol forever.
Payouts come from a 1,000,000 WCAPE emissions budget endowed at deploy (contracts cannot mint native CAPE — it's the gas token; the hard-capped genesis endowment is the on-chain equivalent of thin-air emissions, with the cap visible as capeReserve). Owed CAPE is reserved at purchase time, so the bonder can never over-promise.
| Function | Behaviour |
|---|---|
buyBond(lpAmount) | Pulls CLP, freezes capeOwed, routes CLP → Treasury.registerLpAndMint() → USC → TCM. |
claimBond(id) | After 5 days: transfers the reserved WCAPE (unwrap to native anytime). |
previewBond(lp) | Quote: USD value + CAPE owed right now. |
topUpReserve(amount) | Anyone can extend the emissions budget. |
Constant-product (x·y=k) pool for mETH/WCAPE with a 0.30% fee that stays in reserves (k grows → CLP appreciates). Now issues ERC-20 LP shares ("CLP") with Uniswap-V2 share math, and liquidity is permissionless. Triple duty: price discovery, harvest venue, open market — plus it now mints the asset the LPBonder runs on.
| Function | Behaviour |
|---|---|
addLiquidity(meth, cape) v2 | Permissionless; mints CLP (first mint: √(m·c) − 1000 locked; later: proportional). Use quoteAddLiquidity() to size the WCAPE side. |
removeLiquidity(lp) v2 | Burns CLP for proportional reserves. |
swapMethForCape / swapCapeForMeth | Standard x·y=k swaps, 0.30% fee. |
getCapePrice / getCapeOut / getMethOut | Price + quotes (unchanged interfaces). |
sqrtKPerShare() v2 | √k per CLP (grows only from fees) — the Treasury's fee-isolation metric. |
Merchant (Sepolia) locks real ETH: depositETH() takes 0.1% in-fee, splits net 30% reserve / 70% staked (simulated 3.5% APR), and emits ETHDeposited. releaseETH() (relayer-only) pays out redemptions minus 0.2% out-fee. harvestRevenue() (permissionless) bundles accrued fees + simulated yield and emits ProtocolRevenueReady.
MerchantBridge v2 (Cosmos) is the mirror: mintBridge() (relayer-only) mints mETH 1:1 on deposits; redeemBridge() burns user mETH and signals the relayer; mintProtocolRevenue() (relayer-only) mints revenue mETH into the Treasury. The liquidity loop is now a fully autonomous, permissionless controller: executeLiquidityLoop() fires only when support < 1.02, sized smoothly to lift it to exactly 1.05 (over-collateralised model: debt ≤ 70% of pledged staked ETH — a fixed constant, like real lending terms; loan proceeds re-join staking so staged capacity converges to ~2.33× real staked); repayLiquidityLoop() fires when support > 1.30 and retires debt down to a 1.20 floor, hard-guarded by Treasury.releaseBacking(). Both have 1-hour cooldowns; the relayer checks every 5 minutes. Loop mETH is never added to totalLocked — synthetic supply can never enlarge the bridge-out allowance. The pool-seed mETH is also minted directly (not via the bridge), so bridge counters reflect only real Sepolia deposits.
| Contract | Purpose |
|---|---|
USCToken | ERC-20, mint/burn restricted to Treasury via roles. |
MerchantETH | ERC-20 mETH, mint/burn restricted to MerchantBridge via roles. No rebase, no yield — staking yield flows to TCM as USC instead. |
WCAPE | WETH9-style wrapper for native CAPE. deposit() / withdraw(), always 1:1 backed. |
PriceOracle | Stores ETH/USD and CAPE/USD (18-decimal). Only the relayer (updater) or owner can push. Exposes isStale() (2 h threshold) — advisory, does not revert reads. |
Merchant.depositETH() on Sepolia with real ETH.ETHDeposited(user, net) fires.MerchantBridge.mintBridge(user, net) on Cosmos.Treasury.buyUSC(meth, cape, true). Value ratio must be 80/20 (±2%).LPBonder.buyBond(lpAmount). Value and CAPE owed are frozen at this block: value ÷ (CAPE price × 0.95) — a 5.26% bonus, immune to later price moves. Reserved from the emissions budget immediately.claimBond(id) pays out the WCAPE (unwrap to native CAPE anytime).executeLiquidityLoop() fires (permissionless — anyone may call).receiveBacking() — no new USC minted. Fresh loan ETH re-joins staking, raising next-stage capacity while the deficit persists.repayLiquidityLoop() automatically pulls backing (guarded ≥ 1.20 post-release), converts the WCAPE leg back, and burns the recovered mETH — the loan is repaid, collateral freed.MerchantBridge.redeemBridge(amount) — mETH is burned, RedemptionRequested fires.Merchant.releaseETH(user, amount) on Sepolia; 0.2% out-fee retained; net real ETH sent to the user.USC locked in the TCM (deposits + rewards pool) is off the market — it cannot create redemption pressure — so it is excluded from the denominator. This has an elegant consequence: USC minted by harvestToTCM() goes straight into the TCM, so harvests raise backing while leaving active supply flat. Every harvest strictly improves the ratio.
| Source | Rate | Destination |
|---|---|---|
| Bridge deposit fee | 0.1% (inflow — cheap on purpose) | All accumulate as mETH in protocolMethBalance → harvestToTCM() → TCM depositor yield |
| Bridge redemption fee | 0.2% (outflow — costlier) | |
| Mint / redeem fee | 0.1% each side | |
| ETH staking yield | 3.5% APR on 70% of bridged ETH (simulated on testnet) | |
| AMM swap fee | 0.3% | Accrues into CLP value; the Treasury's CLP share is converted to USC → TCM rewards by the daily harvestLpFees() |
| Bond (LP route) | 100% of bonded CLP value | CLP → permanent Treasury backing; USC minted → directly to TCM rewards |
The protocol "borrows" from its own TCM depositors at ≤6% APR, funded entirely by internal fee revenue — no dependency on external capital markets. This is the foundation of the Phase 2 credit facility: lend TCM capacity at 9–12% against a 6% internal cost, keeping a 3–6% spread.
Intent: the LPBonder distributes CAPE into the market; the 20% backing rule makes every USC mint buy it back. More USC demand → more CAPE locked in Treasury → scarcer float. The v2 LP design also helps structurally: bonded liquidity deepens the very pool that must absorb bond-exit sells.
| Decision | Rationale |
|---|---|
| TCM-held USC excluded from support denominator | Locked USC cannot run on the Treasury. |
Fee only on the mETH side of buyUSC | WCAPE enters untouched — avoids double-penalising the CAPE leg. |
| Credit USC = regular USC (no separate cUSC) | Accounting-only separation; credit-line protocols are blocked from sellUSC(), ordinary holders always redeemable. |
| No flash loans; no external yield on TCM funds | External smart-contract risk not worth it at this stage. |
| One bonder type active at a time | Prevents stacked WCAPE sell pressure. |
| Governance tokens as credit-line condition | Accumulate influence in borrower protocols without a separate bonder. |
| Parameter | Value | Where |
|---|---|---|
| Collateral ratio | 80% mETH / 20% WCAPE (±2% tolerance) | Treasury |
| Mint / redeem fee | 0.10% | Treasury FEE_BPS |
| Bridge fees | 0.10% deposit · 0.20% redeem | Merchant |
| Staking APR (simulated) | 3.50% on staked ETH | Merchant |
| Bridge ETH split | 30% reserved / 70% staked | Merchant + MerchantBridge |
| TCM lock / APR | 90 days / 4–7% (support-linked, grandfathered per deposit) | TCM v2 |
| Bond discount / lock | 5% fixed at deposit day / 5 days | LPBonder |
| LPBonder emissions budget | 1,000,000 WCAPE (genesis endowment, hard-capped) | LPBonder |
| Loop bands | borrow < 1.02 → target 1.05 · repay > 1.30 → floor 1.20 | MerchantBridge v2 |
| Loop borrow LTV / cooldown | 70% of pledged stakedEth (fixed constant) / 1 h | MerchantBridge v2 |
| AMM swap fee | 0.30% | CapePool |
| Oracle push cadence / staleness | ~60 s / 2 h advisory | Relayer + PriceOracle |
| Harvest cadence | ~24 h (relayer timer) | Relayer |
A peer-to-peer route into USC for people who cannot use a centralised exchange. Seven contracts, live on chain 9000 since 1 August 2026, and deliberately switched off until a juror pool exists.
briberyCap is 0, so MakerPot.maxTrade() returns 0 and every openSellTrade / openBuyTrade reverts. The contracts are live; no value can move through them. Opening the ramp is a separate, deliberate transaction that refuses to run unless a staked juror pool justifies the trade cap.Whoever can press "decline" must have something at stake. When a maker sells USC he holds that button, so his collateral headroom is the stake and the fiat buyer posts nothing at all — no deposit, no gas token, no verification, no reputation minimum. When a maker buys USC the button moves to the seller, because only the recipient of a bank transfer can know whether it arrived; so that seller escrows 120%.
The asymmetry that forces this is simple: a claim that money moved can be machine-checked against amount, timestamp, currency and rail format. A claim that money did not arrive cannot — no oracle sees an absence. Where the software gate is unavailable, capital is the only gate left.
The party who can verify receipt releases the escrow. Seconds. 0.1% fee on the USC leg, on successful completion only.
Escrow auto-releases to the counterparty. Inaction must never be how someone keeps both the fiat and the coins.
Instant revert. A decline is not a dispute — it is a unilateral cancel, and it records nothing against anyone.
The only path that reaches a jury, and only after clearing an automatic admissibility check.
Three properties do the work. Audits examine makers, not cases — a million fabricated complaints against one maker produce exactly one investigation of his whole history. The daily audit budget is an absolute number derived from bonded-maker count, never a percentage of volume, so attack volume cannot inflate the workload. And contested declines rank a maker in a priority queue, they never trigger an audit — a hard trigger would let the attacker decide how much work the system does.
Worked example: an attacker spins up 10,000 wallets against a single maker. Every trade times out or is declined, reverting instantly with no score recorded. The complaints collapse into one audit, cleared in a single pass. Platform-wide latency stays at a few days regardless of attack size — attack volume does not appear in the formula at all. To lengthen the queue the attacker must become a bonded maker himself, which costs real capital locked for a month.
Disputes that survive the gates go to a randomly drawn, stake-weighted panel voting under commit–reveal. Panels escalate 3 → 7 → 15 → 31 → plenary, with the trade's value setting a floor the panel can never go below and randomisation extending only upward — an attacker can know the minimum but never where a case will stop.
Every level settles against the final verdict, not its own panel's majority. A juror outvoted locally but vindicated at the end is paid, not slashed. This moves the Schelling point from "what will these two say" to "what will the largest panel conclude", which is much closer to the truth.
Bribing a panel becomes profitable above a hard limit, so the maximum single trade is derived from the live juror pool:
max_trade ≈ slash_fraction × (pool − top_holder_stake) ÷ 2
Sized off pool minus the largest holder, never the headline total — plenary is stake-weighted, so a single holder above half the pool would decide every case alone with no bribery required. A consequence worth stating plainly: a whale cannot buy a higher trade ceiling. Adding a 90,000 USC juror alongside ten 1,000 USC jurors moves the cap from 1,800 to 2,000, not to 20,000.
| Jurors staked | Pool | Max single trade | Appeal depth available |
|---|---|---|---|
| 0 | 0 | 0 — ramp cannot open | — |
| 10 | 10,000 USC | ~1,800 USC | 3 → 7 |
| 22 | 22,000 USC | ~4,200 USC | 3 → 7 → 15 |
| 500 | 500,000 USC | ~100,000 USC | full ladder |
block.prevrandao, which on a single-validator chain is proposer-influenceable, and it is load-bearing in both juror selection and the escalation ceiling; a VRF is the real version. And the audit verdict itself is still a human call under single-EOA admin. Neither matters while the ramp is closed; both must be fixed before it opens to anyone.| Contract | Address |
|---|---|
| WCAPE | 0xC5dfeab583C6bD8A5E536b17Fc35E6D1ED6680F1 |
| MerchantETH (mETH) | 0x208293e3D6720FDE6b8367463C4773b98C5707DD |
| USCToken | 0xcC4f9d2C7Db111bF3ac915440508E57e9c66E09e |
| PriceOracle | 0x5073C4C6FE8a53c93cEBD5eE9Ddc821464C65e58 |
| CapePool | 0x61b716980210717A5c0ea5B9DA6A6Be0671e1Cba |
| Treasury | 0x8fcf5027Bb28fd5a1afb567D37F3EaE2cBd3c4F3 |
| TreasuryCreditModule | 0xc82dD71f4132a701f1c1919C41cD463E6A633D63 |
| LPBonder | 0x7Ae15e88D0b3805720877E5F973bE9c199FA2B7A |
| MerchantBridge | 0x9CB908fB84078844e0f295e73Fc9Bf42B6229cb1 |
| Contract | Address |
|---|---|
| MakerPot | 0xD895522F0663fA3Edf2BEF40c636839b2F5E5599 |
| RampEscrowV2 | 0x2e77562b0627c61Be44854018Fdcd37C203061ba |
| Gate2Validator | 0x261569676cD5BD3F56595604d30D52e004b097E5 |
| JurorStaking | 0xA94cCb263361352Aaf09B08a69D0a364b3F312a5 |
| Arbitration | 0x36FB986a372E42781e609BE23C05b1596C5E62cd |
| JurorFund | 0xFa5FB0277342bCe28913E934Bc2c6fD02dE4Ae9D |
| AuditQueue | 0x34D12827f97115C5A8795690807e4F6294351e81 |
Compiled solc 0.8.24, evm target paris. The v1 ramp pair — RampEscrow 0x419a…5636 and JurorArbitration 0x6816…93b2 — remain deployed but are superseded and unreferenced. See §08 for why the ramp is closed.
| Contract | Address |
|---|---|
| Merchant (bridge entry) | 0xea222799c04CEfDe1579D7750ADDdd7245833037 |
immutable constructor argument with no setter, so all three move together, and because MerchantBridge inherits BridgeGuard, its redeploy also resets the signer registry and changes the EIP-712 domain (invalidating previously-issued attestations). Frontends, the relayer, co-signers, the monitor and the claim service must all be repointed after any such migration. Use scripts/migrate-core-support.js, which pre-flights every required permission and aborts before deploying rather than half-migrating.evmosd-wrapper.sh auto-detects height mismatches after ungraceful reboots and resets the chain; usc-autosetup redeploys contracts and refunds wallets automatically; the relayer retries on connection loss, persists processed bridge events (no double-mints/double-releases across restarts), and runs the loop manager + daily harvests. The ETH leg was migrated from local Anvil to real Sepolia (July 2026).usc-autosetup can fire — it races the deploy with the same key and scrambles the deterministic addresses. systemctl disable does NOT prevent it (evmosd's hook starts it explicitly) and mask fails (unit lives in /etc). Working method: sudo sed -i '1a exit 0 # TEMP-DISABLED-FOR-DEPLOY' /home/micha/usc-autosetup.sh before, remove the line after — and verify the removal, because while it is disabled nothing self-heals. Corrected Aug 2026: the "deployer nonce must be 0x0" rule applies only to a full chain-reset redeploy, where addresses must reproduce deterministically. For an additive deploy the nonce is simply whatever it is (85 when the ramp shipped) — note the value first so you can tell whether anything else moved it mid-deploy. Autosetup also restarts services unprompted: on 1 Aug 2026 evmosd read inactive and then active two minutes later with nobody having started it. Full runbook in UPGRADE_NOTES.md.The stablecoin is the foundation. The endgame is a full-stack monetary system: currency, savings rate, credit facility, deposit insurance, and settlement.
LP tokens as Treasury backing — live. Three revenue streams per bond: discount, USC to TCM, perpetual swap fees harvested daily. Deeper pool → less harvest slippage → better yields.
Lend TCM capacity to whitelisted protocols at 9–12% (6% internal cost). Enforcement stack: algorithmic credit score, destination whitelisting, RevenueInterceptor (auto-repayment from borrower fee income), governance-token deposits, quarterly maintenance fee.
Protocols pay 0.5–2% annual premiums on TVL → "USC Insured" badge. Depositors covered up to 80% (max 10,000 USC). Claims paid from accumulated reserves — never from new USC. TCM backstops catastrophic events.
USC liquidity on mainnet (Curve/Uniswap), sUSC as a composable yield token, USC as the unit of account for inter-protocol credit and insurance.
| Item | Replaces |
|---|---|
| Real ETH staking (Lido / EigenLayer) | Simulated 3.5% APR |
| Multi-source oracle + deviation circuit breakers | Single relayer pushing CoinGecko prices |
| Threshold-signature / multi-relayer bridge, mint caps, on-chain proof-of-reserves | Single relayer key |
| Multisig + timelock on all admin roles | Deployer EOA |
| Keeper-automated liquidity loop | Manual owner trigger |
| Validator set / shared security | Single validator |
| Audits + bug bounty | — |