PorusPorus
Fig. 06Docs

How Porus works

Porus turns tokenized equity into dollar liquidity, without selling it. This page walks through the mechanism layer by layer — what each contract actually does, and what it doesn't.

Wide header illustration — stock → collateral → pUSD, in one frame.

Flat vector technical illustration, architectural blueprint / drafting-table style. Warm parchment background (#f3ede0), linework in deep navy ink (#2c3a63), key/active elements picked out in muted copper (#c8a05a). Thin 1px rules, no gradients, no drop shadows, no photorealism, no glossy 3D, no people or faces. Small uppercase monospaced micro-labels, like captions on a technical drawing sheet. Generous whitespace, quiet and precise — not a marketing graphic. Wide horizontal composition, one left-to-right flow line: a stock-certificate icon labeled "AAPL · TSLA · NVDA ..." → an arrow through a small padlock icon labeled "COLLATERAL" → a dollar-coin icon labeled "pUSD". A thin dashed arrow loops back from the pUSD coin to the stock icon, labeled "REDEEM ANYTIME", showing the flow is reversible.

Fig. 01Layer 1 — Isolated stock markets

One market per stock, sealed at creation

Every Porus market runs on Morpho Blue — an immutable, audited lending primitive that doesn't distinguish stock collateral from any other asset. A market is just a five-part tuple: loan token, collateral token, oracle, interest-rate model, and liquidation LTV (LLTV). Once created, that tuple is fixed forever — no admin can change a market's oracle, its LLTV, or its risk parameters after the fact.

Porus deposits AAPL, TSLA, NVDA, GOOGL, AMZN, MSFT, META, and SPCX as collateral, borrowing against USDG as the loan asset, each in its own isolated market. Isolation matters: a bad oracle or a liquidation cascade in one market cannot touch collateral or liquidity sitting in another. All eight markets currently listed share the same 62.5% LLTV convention (SPCX runs at 38.5%, reflecting thinner liquidity for pre-IPO shares) and the same adaptive-curve interest-rate model, so borrow rates float with utilization — Porus never sets them directly.

Diagram: 8 separate market boxes (AAPL/USDG, TSLA/USDG, ...) each with its own oracle + LLTV, explicitly not connected to each other.

Flat vector technical illustration, architectural blueprint / drafting-table style. Warm parchment background (#f3ede0), linework in deep navy ink (#2c3a63), key/active elements picked out in muted copper (#c8a05a). Thin 1px rules, no gradients, no drop shadows, no photorealism, no glossy 3D, no people or faces. Small uppercase monospaced micro-labels, like captions on a technical drawing sheet. Generous whitespace, quiet and precise — not a marketing graphic. Eight identical rectangular boxes in a single row, each labeled with a stock ticker over "USDG" (AAPL, TSLA, NVDA, GOOGL, AMZN, MSFT, META, SPCX), each with a small eye-in-diamond oracle icon and an "LLTV 62.5%" micro-label (SPCX box reads "LLTV 38.5%"). Visible gaps between boxes, each gap marked with a small broken-link glyph to show the markets are not connected to each other. Caption strip along the bottom: "MORPHO BLUE — ONE SINGLETON, EIGHT ISOLATED MARKETS".

Fig. 02Layer 2 — The Treasury

USDG in, pUSD out — always 1:1

The Treasury contract (0x7eCE2544) is deliberately the smallest, most conservative piece of the system. It holds a USDG reserve and does exactly two things: mint(amount) deposits USDG and mints pUSD 1:1, redeem(amount) burns pUSD and returns USDG 1:1. No admin withdraw path, no owner-mint backdoor, no fee on either direction. The invariant it exists to hold is simple: pUSD's total supply always equals the USDG sitting in the Treasury.

It's worth being precise about what backs pUSD. The immediate reserve relationship is USDG ↔ pUSD — the Treasury does not hold AAPL or NVDA directly, and pUSD is not itself claimed to be 1:1 backed by the underlying stock. The credit that creates the USDG being minted into pUSD originates one layer up, from stock-collateralized borrowing in Layer 1 and Layer 3.

A Curve StableSwap pool (pUSD/USDG) sits alongside the Treasury for anyone who'd rather swap than mint/redeem directly. The pool doesn't hold the peg on its own — the peg is held by arbitrage against the Treasury's guaranteed 1:1 mint/redeem; the pool just makes that arbitrage cheap and instant.

Diagram: USDG in / pUSD out of a single Treasury box, both 1:1, a level balance-scale underneath, Curve pool sitting alongside.

Flat vector technical illustration, architectural blueprint / drafting-table style. Warm parchment background (#f3ede0), linework in deep navy ink (#2c3a63), key/active elements picked out in muted copper (#c8a05a). Thin 1px rules, no gradients, no drop shadows, no photorealism, no glossy 3D, no people or faces. Small uppercase monospaced micro-labels, like captions on a technical drawing sheet. Generous whitespace, quiet and precise — not a marketing graphic. A single rectangular vault/ledger box centered, labeled "TREASURY". Two labeled arrows: one entering from the left labeled "USDG" with a small open-padlock icon, one leaving to the right labeled "pUSD" — both marked "1:1". Below the vault, a horizontal balance-scale icon sitting perfectly level, captioned "RESERVE == SUPPLY, ALWAYS". A smaller box to the side labeled "CURVE POOL" connects to both arrows with thin dashed lines, captioned "ARBITRAGE KEEPS THE PEG TIGHT".

Fig. 03Layer 3 — PorusZap

Stock in, pUSD out — one transaction

This is the piece that makes the UX collapse from three steps into one. PorusZap (0xA16d3032) sits between Morpho Blue and the Treasury and clubs the whole path — supply collateral, borrow USDG, mint pUSD — into a single call: borrowAndMint(marketParams, collateralAmount, borrowAmount). The reverse, repayAndWithdraw, does the same in one call going back the other way: redeem pUSD, repay the Morpho debt, withdraw collateral to the wallet.

PorusZap never custodies funds as reserve — every balance it ever holds is transient, mid-transaction. Your collateral is credited directly to your own Morpho position (onBehalf = you), not to PorusZap's. That does mean a one-time setAuthorization(zap, true) call on Morpho Blue is required before your first zap — the same one-time approval step any Morpho-based product asks for, since Morpho itself needs to know PorusZap is allowed to borrow and withdraw on your behalf.

Diagram: single transaction box splitting into 3 sub-steps (supply collateral → borrow USDG → mint pUSD) with an arrow back out labeled 'pUSD to wallet'.

Flat vector technical illustration, architectural blueprint / drafting-table style. Warm parchment background (#f3ede0), linework in deep navy ink (#2c3a63), key/active elements picked out in muted copper (#c8a05a). Thin 1px rules, no gradients, no drop shadows, no photorealism, no glossy 3D, no people or faces. Small uppercase monospaced micro-labels, like captions on a technical drawing sheet. Generous whitespace, quiet and precise — not a marketing graphic. One wide bracket frame labeled "ONE TRANSACTION — PORUSZAP" containing three small icons in sequence, joined by solid arrows: a stock-certificate icon labeled "SUPPLY COLLATERAL" → a handshake/ledger icon labeled "BORROW USDG" → a coin-stack icon labeled "MINT pUSD". An arrow exits the bracket on the right into a small wallet icon labeled "YOUR WALLET". Beneath the bracket, a small annotation: "msg.sender STAYS YOU, THE WHOLE WAY THROUGH".

Why this needs its own contract instead of routing through Morpho's general-purpose Bundler3: every call inside a Bundler3 multicall executes with msg.sender == Bundler3. That's fine for Morpho's own adapter functions, but it breaks the Treasury's mint/redeem, which trust msg.sender directly to stay minimal. PorusZap is the direct caller of both Morpho Blue and the Treasury, so msg.sender stays the real user throughout the whole call — no rewriting needed.

Fig. 04Equity-aware oracles

Pricing tokenized equity is not pricing a crypto pair

Morpho Blue markets are permissionless — anyone can spin one up against any collateral with any oracle, including one that always reports a manipulated price. Every market Porus lists clears a bar before it ever appears in this app: its oracle has to resolve to the same live Chainlink price already trusted elsewhere for that stock, re-checked directly on-chain via latestRoundData(), not taken on faith from a listing.

Tokenized stock feeds carry a risk crypto pairs don't: real-world market hours. Off-hours (nights, weekends, holidays) a feed legitimately holds its last price with no heartbeat — that's expected behavior, not staleness. Stock tokens also expose oraclePaused(), which freezes pricing during corporate actions like splits or dividends — any liquidation logic that reads a stock price should check this flag first.

Diagram: Chainlink feed icon at center, one arrow labeled market-hours-only, one labeled oraclePaused(), a verified checkmark underneath.

Flat vector technical illustration, architectural blueprint / drafting-table style. Warm parchment background (#f3ede0), linework in deep navy ink (#2c3a63), key/active elements picked out in muted copper (#c8a05a). Thin 1px rules, no gradients, no drop shadows, no photorealism, no glossy 3D, no people or faces. Small uppercase monospaced micro-labels, like captions on a technical drawing sheet. Generous whitespace, quiet and precise — not a marketing graphic. A single hexagonal feed icon at center labeled "CHAINLINK FEED", with two thin arrows pointing into it: one from a small clock icon labeled "MARKET HOURS ONLY — WEEKEND = LAST PRICE, NOT STALE", one from a small pause icon labeled "oraclePaused() — FROZEN DURING SPLITS/DIVIDENDS". A checkmark badge beneath reads "VERIFIED ON-CHAIN VIA latestRoundData()".

Fig. 05End to end

What a deposit looks like, start to finish

  1. 01
    Approve

    Approve your stock token (e.g. AAPL) to PorusZap for the amount you intend to deposit.

  2. 02
    Authorize (one-time)

    Call setAuthorization(PorusZap, true) on Morpho Blue. Only needed once, ever, across every Porus market.

  3. 03
    borrowAndMint

    One signature: your stock lands as collateral in the isolated market under your own Morpho position, USDG is borrowed against it, and that USDG is minted into pUSD, sent straight to your wallet.

  4. 04
    Hold, trade, or repay

    pUSD is a plain ERC-20 the moment it lands — spend it, provide liquidity with it, or come back later and call repayAndWithdraw to close the position and get your stock back.

4-step icon strip matching the list above: approve → authorize → borrowAndMint → hold/trade/repay.

Flat vector technical illustration, architectural blueprint / drafting-table style. Warm parchment background (#f3ede0), linework in deep navy ink (#2c3a63), key/active elements picked out in muted copper (#c8a05a). Thin 1px rules, no gradients, no drop shadows, no photorealism, no glossy 3D, no people or faces. Small uppercase monospaced micro-labels, like captions on a technical drawing sheet. Generous whitespace, quiet and precise — not a marketing graphic. A horizontal strip of four equal numbered panels (01, 02, 03, 04) separated by thin vertical rules, each with one small line-icon and a short caption: 01 a checkmark-on-token icon captioned "APPROVE"; 02 a key icon captioned "AUTHORIZE (ONE-TIME)"; 03 a lightning-bolt-through-coin icon captioned "borrowAndMint"; 04 a wallet-with-arrow icon captioned "HOLD, TRADE, OR REPAY". One thin unbroken arrow runs left to right beneath all four panels.

Fig. 07spUSD & yield

Where yield actually comes from

spUSD, the staked/yield-bearing version of pUSD, isn't deployed yet — see the spUSD page for the current preview. Once live, spUSD will be an ERC-4626 vault: stake pUSD and it's auto-supplied across the stock-collateral Morpho markets above, earning the real interest that borrowers pay to hold their positions open. That's the entire yield source — real borrower interest, nothing else. Porus does not hold or claim any T-bill/RWA sleeve today, and this page won't claim one until it's actually integrated and held.

Contracts — Robinhood Chain (4663)

pUSD
0x18717dD0FeA68fBE42c842c73C6c012C2e9Ec226
Treasury
0x7eCE25445D60FCd503332eF1B43a66BBDe5c9b16
PorusZap
0xA16d30325B33e187d7a5bA477fF879c5Da346135
Morpho Blue
0x9D53d5E3bd5E8d4Cbfa6DB1ca238AEA02E651010