Yield Payment Network · executed on-chain

The whole loop,
run live on testnet.

Deposit → earn → authorize → spend, plus a native USDC bridge — every leg executed on-chain, with real transaction hashes you can open in a block explorer. The plumbing working end to end, not a mock-up.

Testnet · unaudited · valueless test USDC. Everything below ran on Circle’s Arc testnet (5042002) and Base Sepolia (84532). Vaults are empty, nothing is an offer, and external audit remains the gate before real value. The hashes are real; the dollars are not.
Run date
2026-08-19
Networks
Arc + Base Sepolia
Signer
0x9c64…33AD
Vault right now
reading…
Anyone with the link can view — no wallet, no sign-in.
1

Deposit & earn

Proven on ArcArc · MintwareYieldVault 0x11Ef…C421

5 USDC deposited into the treasury vault. The same transaction routed it through the adapter into the yield source — the capital went straight to work rather than sitting idle.

Vault total assets2.007.00 USDC
Signer vault shares2.007.00
Capital earning in yield source2.007.00 USDC
Approve0x529e20de…ca612farcscan
Deposit0x9d34c116…a58449arcscan
2

Authorize — sub-10 ms, off live NAV

Live serviceedge-auth → live Arc NAV (7.00 USDC backing)

The Rust edge-auth service, pointed at the live Arc vault, decided each spend off the real NAV — reserving a hold on approval, failing closed otherwise. Off-chain, so no tx hash; these are the running service’s live responses.

RequestDecisionReasonLatency
$2.00Approvedhold reserved · headroom 7→57.2 ms
$10.00Declinedinsufficient_equity (over 5 headroom)6.9 ms
$300.00Declinedhigh-value lane · 2nd-signer absent → fail-closed6.1 ms
$2.00 · no bearer401fail-closed: endpoint reserves equity
3

Settle — spend as USDC

Proven on ArcArc · MintwarePaymentGateway 0x1D07…5399

A signed EIP-712 spend permit → the gateway burned exactly the shares needed and paid the merchant 2 USDC. The event trace unwinds the earn path in reverse (yield source redeemed → adapter → vault → merchant) — the dollars came out of the earning position at the moment of the spend.

Merchant USDC received0.002.00 USDC
Signer vault shares7.005.00
Vault total assets7.005.00 USDC
Point card rail0x9879e7fa…d01420arcscan
settleSpend0x7fd4b3f0…7c6934arcscan · PaymentSettled
4

Bridge — native USDC, Base → Arc

Proven end-to-endBase Sepolia → CCTP domain 26 (Arc)

1 USDC burned on Base Sepolia through Circle’s CCTP v2, attested by Circle (~22 min, standard finality), then minted natively on Arc and deposited straight into the vault as yield-earning shares. Bridged capital arrived already earning.

Bridged USDC minted on Arc1.00 USDC
Vault total assets5.006.00 USDC
Recipient vault shares5.006.00
Approve (Base)0xff7318e4…51c18dbasescan
Burn (Base)0xc7a0d7c3…031df9basescan · depositForBurn
Receive (Arc)0xf99b2d6f…3d4796arcscan · BridgedAndDeposited
Staged liquidity · executed on-chain

Stage one side, earn,
pair when ready.

The capital-constrained liquidity path, run live on Base Sepolia. A team parks the single side it holds; it earns while it waits; then one call forms the pool — and the yield it earned flowed into the position, not away.

1

Stage a single side

Proven on Base SepoliaBase Sepolia · MintwareStagedLiquidityRouter 0x36fa…33e3

1,000 sUSD — the one side the team holds — was staged into the router and supplied to the yield adapter in the same action. No 50/50, no forced swap, no second asset required.

Staged principal01,000 sUSD
Earning in yield adapter01,000 sUSD
Approve0x7a53677d…05059ebasescan
Stage0x3ab38f65…169c37basescan
2

It earns while it waits

Proven on Base Sepoliarouter · per-adapter yield pool

Yield accrued to the staged position. The router’s on-chain stagedAssets read reflects principal plus its pro-rata share of the yield — the buffer was productive from the first block, never idle.

Staged value (stagedAssets)1,000.001,099.99 sUSD
Accrue yield0x92b9ba8f…dda17ebasescan · yield to adapter
3

Pair into the pool

Proven on Base SepoliaBase Sepolia · router → pair vault

The owner brought the other side (2,000 TKA). One call pulled the staged side back with its earned yield, paired both, and minted LP straight to the owner — the yield went into the position, and the stage closed.

Staged side paired (with yield)1,099.99 sUSD
Counterparty paired2,000 TKA
LP minted to owner03,099.99
Stage statusearningpaired ✓
Pair0x02b3cbb6…3b8247basescan · Paired
ContractNetworkAddress
Staged routerBase Sepolia0x36fa…33e3
Staged token (sUSD)Base Sepolia0xE236…8401
Yield adapterBase Sepolia0xe412…0B5F
Pair vaultBase Sepolia0xB014…D2F7

The router is the real product bytecode; the yield source + pair vault here are an open-mint mock rig so the loop is self-contained. The real AaveV3YieldAdapter + MintwareDeFiPairVault implement the same interfaces (Forge-tested). Try it live →

Human org cards · Lithic sandbox

A card that spends the
LP balance.

A member swipes a card; it draws on the org’s LP-backed treasury through the same authorize + settle primitives above — not a separate pool. Proven end-to-end on 2026-08-20: a real $2 sandbox swipe was authorized off live NAV, then settled on-chain, burning $2 of the treasury’s senior shares. Sandbox card (synthetic PAN, no real merchant), testnet vault: no real-world money moves.

AuthorizeProven call

A real $2 Lithic sandbox swipe → ASA webhook → edge-auth decided off live vault NAV → APPROVED, in the same NAV-hold engine as leg 2. Automatic, as card authorization always is; no tx (it’s an off-chain hold).

SettleProven call

settleSpend burned exactly $2 of the member’s senior shares (12.0 → 10.0 USDC) → paid out — a real card-ORIGINATED settlement, not a scripted one.

0x7ef19942…30d8bb · basescan
Auto-captureWired · off by default

The above settle was the owner-triggered path. The automatic capture (Lithic SETTLED event → auto-settle small swipes ≤ $50) is wired — subscription live — but off by default and not yet fired via the webhook.

Proven end-to-end on 2026-08-20: a real sandbox swipe authorized off live NAV, then a card-originated settleSpend burned $2 of senior shares on-chain (linked above). The one still-dormant piece is the AUTOMATIC capture path (off by default). This same run also surfaced a real bug — the settle core was marking a reverted tx as settled — now fixed. The card surface →

Formal verification · machine-checked in CI

The vault math,
proven — not just tested.

Seven safety properties are backed by a machine-checked proof, not only fuzzing. Halmos symbolically proves the live fee-logic bounds over every possible input; the nonlinear rounding and solvency lemmas that defeat any SMT solver (division by a symbolic value) are proved in Coq. Both run as gates in CI.

Halmos · symbolic

Surge fee never exceeds its configured ceiling

MWDynamicFee.volatilityFee · live code

Halmos · symbolic

Volatility only ever adds to the base fee — never below it

MWDynamicFee.volatilityFee · live code

Halmos · symbolic

Per-block fee move never exceeds the rate-limit step

MWDynamicFee.rateLimit · live code

Coq · machine-checked

Fee split conserves exactly (zero dust) + rounding favors LPs

_splitFee mulDiv lemma

Coq · machine-checked

Idle redeem rounds down — never pays out more than the leg

redeem mulDiv lemma

Coq · machine-checked

Concurrent redeemers can never together draw more than backing

solvency mulDiv lemma

Coq · machine-checked

Deposit mint creates no value from nothing (inflation-safe)

deposit mulDiv lemma

Honest scope: the 3 Halmos proofs bind to the real MWDynamicFee bytecode; the 4 Coq lemmas prove the exact mulDiv arithmetic the vault relies on (proven as lemmas, not bound 1:1 to bytecode — flagged for the external audit). All 7 are also fuzz-proven at 256×128k. Testnet + unaudited. The math →

Security self-assessment · audit-readiness

We ran a firm-grade checklist
on ourselves — and fixed it.

Before paying for an external audit, we reviewed the entire contract stack against the same public standards the firms use — SCSVS, the SWC weakness registry, Solcurity, and the DeFi-specific vulnerability classes — with parallel reviewers, then deduped, ranked, remediated, and re-reviewed the findings.

0 Critical
critical findings across 38 contracts
6 / 6 High
high-severity findings remediated
10 +
mediums & lows fixed (rest scoped)
440 / 0
tests pass / fail after remediation
High

Senior "par" NAV now solvency-aware — tail haircuts pro-rata, no first-redeemer run

Fixed
High

No unbounded token approvals — a distributor can no longer drain vault principal

Fixed
High

Settlement pays only a pinned rail — a relayer can’t redirect funds

Fixed
High

Dead, misleading FeeVault (unverified owner-set root) deleted

Fixed
High

Matched-launch can’t be deployed at a manipulated empty-pool price

Fixed
Med

Guardian pause auto-heals — a single key can’t freeze user exits forever

Fixed
Med

JIT return balance-verified; hot-path calls can’t brick swaps/redemptions

Fixed
Med

Circuit breaker no longer blocks the arb that heals a thin-pool price

Fixed

This is a SELF-REVIEW, not an external audit — it surfaces what a firm would flag before we pay for one; it does not replace it. All 6 High findings + the core Mediums are fixed, re-reviewed, and testnet-deployed; a few lower-severity items are scoped as follow-ups. Everything remains testnet + unaudited — an external audit is the gate before real value.

Security self-assessment · round 2

Then we ran it again —
and audited our own fixes.

A second independent pass over the whole stack, a day after the first. Each reviewer re-verified round-1’s remediations adversarially and hunted for what a checklist misses — attacks that only appear across a sequence of legitimate calls. It found that three of round-1’s own fixes were incomplete or opened a new hole. We fixed those too, then re-ran everything.

0 Critical
critical findings on the remediated stack
3 / 3 High
new high-severity findings remediated
6 +
mediums & lows fixed (rest scoped)
450 / 0
tests pass / fail · +11 new regression tests
High

Deposits can no longer be tricked by a depressed pool price into minting cheap senior shares

Fixed
High

A fully-used JIT slice can’t be stranded — senior NAV can never count phantom backing at par

Fixed
High

Completed round-1’s approval fix across every fee-funding path — rent + yield no longer revert

Fixed
Med

Junior first-loss can’t exit while senior liquidity is still deployed

Fixed
Med

Settlement now caps cumulative extraction, not just per-call — a rogue relayer can’t bleed it

Fixed
Med

Reward pot credits fees actually received (fee-on-transfer safe), never the requested amount

Fixed

Still a SELF-REVIEW, not an external audit. The candid takeaway: a fix isn’t done until it’s been attacked as a sequence, not just re-checked in isolation — the second pass caught what the first pass’s own remediations missed. All three new Highs + the core Mediums are fixed and re-run green; lower-severity items are scoped as follow-ups. Testnet + unaudited — an external audit remains the gate before real value.

Defense-in-depth · audit matrix

A firm-grade matrix,
run on ourselves.

The third pass wasn’t another checklist — it was the layered matrix a security firm runs: static analysis, unit + negative tests, stateful fuzzing, formal proofs, and economic/fork simulation, each a distinct net. The ETH senior tranche got its own reviewer across every layer. 39 new tests, no new findings, and the one critical architecture check — delegatecall storage-layout collision — came back safe.

39 new
tests across the matrix · 28 senior-tranche + 11 suite
0 findings
High / Medium / Low across all five layers
SAFE
delegatecall storage-layout collision check
256×128k
invariant depth · solvency / conservation / monotonic
01
Static analysisSlither · Aderyn

Attempted; blocked by a local tooling/version incompat (crytic-compile ↔ forge 1.5.1 build-info) — a CI-config issue, not a finding. Rounds 1–2 covered these classes by hand.

Env-blocked
02
Unit · negative · boundaryFoundry

Access-control-negative sweep, zero-address injection, first-depositor/inflation, fee-on-transfer, zero/max, event emission.

Green
03
Stateful fuzzing · invariantsForge invariants

Solvency · share-conservation · monotonic battery on the settlement + staged-router pools that previously had no stateful suite. 0 reverts.

Green
04
Formal verificationHalmos · Coq

3 symbolic fee-bound proofs + 4 machine-checked mulDiv/solvency lemmas, both CI-gated. (Certora/HEVM not provisioned.)

Green
05
Economic · forkAnvil · forge inspect

Flash-style spot manipulation → settle reverts with backing conserved; stale oracle fails closed; truncated oracle frozen intra-block; delegatecall storage-layout SAFE (all 4 libs, 0 storage vars).

Green

Honest scope: Layer-1’s automated scanners (Slither/Aderyn) could not run to completion in this local environment — a crytic-compile/forge version incompatibility + the monorepo’s dual Foundry root, documented in the report and recommended for CI; Certora/HEVM/Echidna/Medusa/Mythril are not provisioned here. What did run — 39 new dynamic tests across Layers 2/3/5, the Halmos+Coq formal gates, and the storage-collision check — found no new defect. Self-review, not an external audit; testnet + unaudited.

Security self-assessment · round 4

We audited our own
newest code, too.

New code deserves the same scrutiny as old code — so the operating-float settlement and the 48h risk-param timelock got their own adversarial pass (money-path, governance, composition reviewers) before sitting un-reviewed on main. It found a genuine High in our own fresh work. We fixed everything, and confirmed the earlier three rounds are regression-free.

0 Critical
critical findings in the new float + timelock code
1 / 1 High
high-severity finding remediated
6 +
mediums & lows fixed (all of them)
622 / 0
tests pass / fail · no round-1–3 regression
High

The settlement oracle can no longer be re-pointed after go-live — closes a compromised-owner instant-drain path

Fixed
Med

The keeper’s rebalance fails closed until throttled — it can’t churn the whole backing on the default config

Fixed
Med

The windowed extraction cap can’t be silently reset per-block — the accumulator carries forward

Fixed
Low

Valuation handles real 6-decimal USDC and prices against the un-sandwichable staking rate

Fixed
Low

Both swap legs fail closed symmetrically, and the new settlement adopts the same 48h timelock

Fixed

Self-review, not an external audit. The point of this round: newly-shipped code is the most dangerous code — so we adversarially audited our own float-settlement + timelock the moment it landed, found a real High (an instant oracle re-point path), and fixed it plus every Medium and Low. A separate reviewer confirmed the earlier three rounds’ invariants are byte-for-byte intact. Testnet + unaudited — an external audit remains the gate before real value.

Security self-assessment · round 5

We ran it the way
a firm would.

This round deliberately mirrored the published SOPs of Hacken and CertiK — a STRIDE threat model, a micro (function) + macro (system) split, the 15-category checklist, severity scored on likelihood × impact × exploitability, and a required proof-of-concept for anything High. Six reviewers read the whole stack. It found two genuine Highs — both in our own recent code — and we fixed them, wrote the PoC as a permanent regression test, and fixed the lows too.

6 reviewers
STRIDE + micro/macro clusters, firm-grade SOP
2 / 2 High
high-severity findings remediated (one PoC-confirmed)
202 / 0
affected-suite tests pass / fail (contracts 121 · x402 81)
0 Critical
critical findings
High

JIT settlement now measures the return inside the settle call — a stale cross-transaction baseline had let a routine op hide a real loss onto the protected tranche (PoC-confirmed, now a regression test)

Fixed
High

The agent pay-per-call settle now verifies the payer’s signed payment authorization and binds it to the exact receiver + amount — closing a drain path in code we’d just shipped

Fixed
Low

The redemption NAV no longer counts an outstanding JIT slice at par, and the price-guard rejects a param that could silently disable it

Fixed
Low

A settlement swap can’t strand backing on a partial fill, and the settlement destination is set-once (no re-point after go-live)

Fixed

Self-review, not an external audit — run at firm quality (Hacken/CertiK methodology), not by a firm. The honest headline: a firm-grade pass on our own newest code found two real Highs, including one with a working exploit against our JIT loss-attribution, and we fixed them plus the lows and re-verified everything else held. Testnet + unaudited — an external audit remains the gate before real value.

Security self-assessment · autonomous exploit red-team

We didn’t just review it.
We attacked it.

Reviewing finds what you think to look for; attacking finds what actually breaks. So we turned five autonomous agents loose to each construct a working multi-step exploit — as a real, executable proof-of-concept — against a different surface: reentrancy, JIT loss-attribution, oracle/MEV manipulation, tranche solvency, and settlement/access-control. One got through: a slippage band that could be widened in a single block, skipping the 48-hour governance delay its sibling band enforces. We fixed it and proved the fix. The other four attacks were blocked — with the executable proof to show it.

5 attacks
autonomous agents, each built an executable exploit PoC
1 / 1 Medium
the one attack that got through — remediated + regression-tested
4 held
reentrancy · JIT · oracle/MEV · tranche solvency — blocked under attack
0 Critical/High
no critical or high findings
Med

A settlement slippage floor could be widened instantly by the owner, skipping the 48h governance delay its sibling band enforces — a rogue-owner drain path. Now routed through the same timelock (widening delayed, tightening instant).

Fixed
Low

Held under attack: a malicious yield adapter’s re-entrancy is reverted by the guard on every money-path entry point (proven with a real reentrant-adapter PoC).

Held
Low

Held under attack: the JIT loss-attribution and stranded-slice redemption fixes both resisted; oracle manipulation is blocked in-block and bounded to the first-loss tranche across blocks; the first-redeemer run stays closed.

Held

Self-review run at real red-team depth, not an external audit. Attacking our own code with executable exploits found one genuine Medium that a checklist review and static analysis both missed — a sibling-setter timelock asymmetry — which we fixed and regression-tested; every other attack was blocked with proof. Two nuanced edge cases are documented for follow-up rather than claimed closed. Testnet + unaudited — an external audit remains the gate before real value.

The suites behind it

The on-chain run rides code that is green across every layer — Solidity, Rust, and the property-based invariants where money can be lost.

502 / 0
Forge tests pass / fail · incl. staged-router suite (6 fork skips)
109 Rust
edge-auth 86 · relayer 23 — all pass
7 / 7
MEV + solvency invariants · 256 × 128k
~10 ms
edge-auth decision, off live NAV
ContractNetworkAddress
Treasury vaultArc0x11Ef…C421
Payment gatewayArc0x1D07…5399
Yield adapterArc0xb9FB…2B88
CCTP deposit routerArc0xDB9D…Fc03
CCTP TokenMessengerBase Sepolia0x8FE6…2DAA

Recorded 2026-08-19 · Arc testnet (5042002) + Base Sepolia (84532) · unaudited. To reproduce or extend the run, see the deploy scripts in contracts-v4/script and the runbook docs/developers/session-handoff-arc.md. What is YPN? →