Deposit

Deposit USDC, wait for KYT screening, claim PLUSD. Two on-chain transactions on your side, with a screening window in between. Your USDC sits in the Intake Wallet during screening, then moves to the Capital Wallet when you claim. PLUSD is the compliance-bounded representation of your deposit. You can hold it, transfer to other whitelisted addresses, or stake into sPLUSD to earn yield.

Asset What it is Earns yield Whitelist at transfer
USDC External stablecoin No No
PLUSD 1:1 claim on the Capital Wallet No Yes
sPLUSD ERC-4626 share of the vault Yes No at the share level

Before you deposit


Deposit flow

Two-step deposit. The Intake Wallet holds USDC during KYT screening. The Capital Wallet receives USDC at claim. PLUSD mints to the lender at claim.
Two-step deposit. The Intake Wallet holds USDC during KYT screening. The Capital Wallet receives USDC at claim. PLUSD mints to the lender at claim.

Walkthrough

  1. Approve DepositManager as a USDC spender, then call DepositManager.deposit(amount) from your wallet.
  2. DepositManager checks the rate limits in order: minimum deposit, per-lender 24h cap, global 24h cap, hard total supply ceiling against totalSupply + outstandingTickets.
  3. DepositManager calls USDC.transferFrom(you, intakeWallet, amount). USDC moves from your wallet to the Intake Wallet.
  4. DepositManager creates a deposit ticket: {amount, status: Pending, createdAt}. You receive a depositId.
  5. The Relayer detects the deposit and runs KYT on your address and the inbound transfer off-chain. Typically seconds, sometimes minutes.
  6. On a clean result, the Relayer signs a claim attestation (EIP-712) and serves it via API. The Relayer makes no on-chain write. Your frontend polls the API and fetches the attestation when ready.
  7. You call DepositManager.claim(depositId, attestation, signature). The contract verifies the signature against the configured attestor address, checks the deadline and nonce, writes your address to the WhitelistRegistry, pulls USDC from the Intake Wallet to the Capital Wallet via standing allowance, and mints PLUSD 1:1 to your address. The reserve invariant check runs on the mint.
  8. Your PLUSD balance rises 1:1 with the USDC deposited, no fee deducted at mint time. The ticket flips to Claimed.

The Relayer never writes to DepositManager. Its role is to sign the off-chain attestation. This mirrors the yield mint flow on YieldMinter and the withdrawal claim flow on WithdrawalQueue.

Rate limits

A single deposit cannot exceed $5M. 24h deposits across all your wallets cannot exceed $10M. If either cap would be breached, the deposit transaction reverts on-chain. There is no auto-queue. Split the deposit manually and retry when limits reset. The deposit UI reads the GET /v1/protocol/limits endpoint and shows live utilisation before you submit, so you can size each transaction against available headroom.

A third cap, the hard total supply ceiling on PLUSD, is a protocol-wide circuit breaker. Tightening is instant under GUARDIAN. Loosening is an ADMIN action under the standard 3-day AccessManager delay, GUARDIAN-cancelable during the window. The ceiling reserves headroom against tickets that have already passed KYT and are waiting for claim, so a claim cannot be blocked by other lenders’ claims exhausting the cap.

What lands in your wallet

Where your USDC goes

Step 1 (deposit). USDC transfers from your wallet to the Intake Wallet, a separate MPC custody address. The Intake Wallet operates under the same cosigner substrate as the Capital Wallet (3-of-5 with Trustee and Team mandatory), with a sub-policy specific to deposit operations. Smart contracts never hold lender USDC.

Step 2 (claim). USDC moves from the Intake Wallet to the Capital Wallet via the standing allowance the Intake Wallet has granted to DepositManager. The transfer is pulled by your claim call, not pushed by an off-chain signer. The Capital Wallet maintains the 15% USDC buffer (band 10-20%) and rotates excess into USYC for yield.

If KYT returns a soft fail or hard fail, your USDC stays in the Intake Wallet pending compliance disposition. It does not move to the Capital Wallet. PLUSD is not minted.


When KYT does not return clean

Three result classes. Your ticket stays Pending on-chain in all three. The off-chain handling differs.


Abandoned tickets

A Pending ticket that you do not claim within 30 days of deposit is refundable. Call DepositManager.refund(depositId) to pull your USDC back from the Intake Wallet to your wallet. No attestation required for abandonment refunds, the 30-day timeout is the gate.


Common deposit failure modes


Contract addresses

DepositManager, PLUSD, WhitelistRegistry, and the Intake Wallet address are published on the Audits & addresses page and are verified on Etherscan. Treat that page as the source of truth. Do not trust addresses copied from third-party sites.


Next