FAULTLINE
ETHEREUM MAINNET · READ-ONLY NO WALLET CONNECTED
STEP 1 OF 2 · SELECT A POSITION

Which position should FAULTLINE look through?

Paste a supported market, vault or borrower. FAULTLINE reads it on-chain at a pinned block, maps what it depends on, and keeps it as the context for every screen.

{{ lk.msg }}
SUPPORTED IDENTIFIERS Morpho Blue market id · 0x + 64 hex Morpho Vault V1 / V2 address · 0x + 40 hex Borrower on a supported market · with its market id
NETWORK Ethereum mainnet · chain 1 only FAULTLINE does not scan a wallet for every position it holds. Paste the market or vault you want analysed.
PROTOTYPE STATES
BELEM DEMONSTRATION POSITIONS recorded data
REVIEW BEFORE ANALYSIS {{ cand.name }}
{{ cand.chip.label }}
PROTOCOL{{ cand.protocol }} NETWORK{{ cand.network }} IDENTIFIER{{ cand.ident }} ASSETS{{ cand.assets }} SIZE{{ cand.size }} DATA{{ cand.sourceNote }}
{{ r.k }}{{ r.v }}
STEP 2 OF 2 · ANALYSING {{ pos.name }}
{{ s.label }} {{ s.state }}

{{ loadNote }}

{{ pos.protocol }} {{ pos.network }} {{ pos.chip.label }} · {{ pos.sourceNote }}
{{ db.status }} {{ db.asOf }}

{{ db.headline }}

{{ db.rec }}

{{ db.visTitle }} {{ db.visSub }}
{{ r.label }}{{ r.sub }} {{ r.value }}{{ r.range }}
{{ t.label }}
{{ m.label }}
{{ t.label }}
i {{ db.visNote }}
{{ f.k }} {{ f.v }} {{ f.s }}
Where the risk comes from
{{ d.rank }} {{ d.label }}hidden {{ d.v }} {{ d.sub }}

{{ db.noDrivers }}

Worth knowing
{{ w.t }}
What you can do
Protection status {{ dash.prot.text }}
{{ m.k }} {{ m.v }} {{ m.s }}
POSITIONS AND VAULTS
{{ pv.kicker }} {{ pv.name }} {{ pv.sub }}
{{ f.k }} {{ f.v }}
{{ pv.marketsTitle }}
COLLATERAL LLTV MARKET SUPPLY UTILIZATION {{ m.c }} {{ m.l }} {{ m.s }} {{ m.u }}
{{ pv.routesTitle }}
{{ r.name }} {{ r.chip.label }} {{ r.note }} {{ r.val }}
DEPENDENCY X-RAY · FIVE BELEM LAYERS What this position stands on
SIMULATION MODE {{ xr.simBannerText }}
{{ xr.noGraphTitle }}

{{ xr.noGraphText }}

{{ c.label }} {{ l.t }} {{ n.short }} {{ n.sub }}
LAYERDEPENDENCYSEENP · 30 DPATHSHAREIF IT FAILS {{ r.layer }} {{ r.vis }} {{ r.p }} {{ r.t }} {{ r.c }} {{ r.cond }}
DIRECT HIDDEN THREAT PATH WEAKER PATH, NOT COUNTED SELECTED PATH
HOW TO READ IT

{{ xr.howTo }}

Each line carries a transmission weight: the share of a failure that would travel along it. The model keeps the strongest path to each dependency and multiplies the weights along it.

Select a node to see its role, its failure odds and what it would cost you if it broke.

{{ xr.node.layer }} {{ xr.node.hiddenChip }}
{{ xr.node.label }} {{ xr.node.role }}

{{ xr.node.why }}

{{ r.k }}{{ r.v }}
BEST PATH{{ xr.node.path }}
WHY THE LINKS EXIST
{{ r.t }}{{ r.r }}
SEVERITY · {{ xr.sev }} {{ xr.sevNote }}
{{ l.k }}{{ l.t }}

Pick a dependency on the graph or in the list, then launch. Financial results appear once the failure reaches the position.

RESULT · {{ xr.result.name }} · CONDITIONAL ON THE SHOCK (p = 1) · 30 DAYS {{ xr.result.chip }}
DECISION {{ xr.result.verdict }} Staying costs {{ xr.result.mult }} the exit side
STAY · LOSS {{ xr.result.stay }} {{ xr.result.stayPct }}
EXIT · COST {{ xr.result.exit }} {{ xr.result.exitSub }}
HOLD TO MATURITY {{ xr.result.htm }} {{ xr.result.htmSub }}

{{ xr.result.reason }}

UNCERTAINTY {{ xr.result.uncert }} {{ xr.result.zeroNote }} {{ xr.result.borrowNote }}
WEAKER PATHS TO THE SAME DEPENDENCY
{{ a.t }}{{ a.v }}
{{ xr.result.altNote }}
INCIDENT
WHAT KIND OF FACT FORK STATE real mainnet state copied into the fork SIMULATED SHOCK injected on the fork, never happened MODELLED a hypothetical the engine computed MODEL DECISION · FORK CONFIRMED engine output, mined on the fork MAINNET CONFIRMED none in this replay
MODELLED REPLAY FROM RECORDED FORK BLOCKS · BLOCK ORDER, NOT WALL-CLOCK TIME
{{ n.label }} {{ n.sub }}
{{ xr.rp.t }} {{ xr.rp.chip.label }} fork block {{ xr.rp.block }}
{{ xr.rp.title }}

{{ xr.rp.body }}

LTV{{ xr.rp.ltv }}
DEBT · USDC{{ xr.rp.debt }}
RESERVE · USDC{{ xr.rp.reserve }}
KEEPER STATE{{ xr.rp.state }}

FAULTLINE did not protect real funds here. This ran on a local fork with test balances; the only transactions are on chain 31337.

UNAVAILABLE · NEEDS A RECORDING S5 · Pendle PT collateral on Morpho

The recorded Countermove run in the repository covers S1 to S4 (weETH and cbBTC markets). There is no S5 journal yet, so this replay cannot be shown without inventing data. Recording it with scripts/countermove_fork_demo.py on the PT-reUSD market would enable this slot.

HISTORICAL DATA · MODEL CHECK USDC depeg after SVB · cutoff 11 March 2023

This event really happened. FAULTLINE uses it to check that its risk priors are built only from data available before the cutoff. USDC closed at $0.961 on 12 March 2023; the intraday low is not in the dataset. FAULTLINE did not exist at the time and protected nothing.

data/fixtures/replay_h04.json · tests/test_hardening.py
COUNTERMOVE · ARM PROTECTION Decide the defense before the crisis A policy says when FAULTLINE may act, which moves it may make, and how much it may spend. A RescueVault you own holds the reserve and refuses anything outside the policy. Connecting a wallet never grants that permission.
NOT APPLICABLE TO {{ arm.posName }} Protection defends a loan. This position has no debt, so there is nothing to repay and no liquidation to avoid.

For deposits and unlevered positions, FAULTLINE's answer is STAY, EXIT or REVIEW. To configure a policy, use a borrow position.

01 · PROTECTED POSITION AND TRIGGER {{ arm.ctxLine }}
NOW {{ arm.ltvTxt }} LLTV {{ arm.lltvTxt }}
02 · ALLOWED ACTIONS · IN PRIORITY ORDER
{{ a.rank }} {{ a.label }} {{ a.key }}{{ a.sub }}
· Hold and alertFallback when no allowed action is fundable ALWAYS
03 · RESERVES AND LIMITS
MONITORING NOT MONITORING

No keeper is watching this position and no reserve is funded. Validating a preview does not change that.

PERMISSION REVIEW · WHEN DEPLOYED You would sign, as owner: deploy RescueVault for this market
setPolicy(trigger, actions, caps, expiry, cooldown)
setKeeper(FAULTLINE keeper)
deposit(USDC, {{ arm.loanRes }}) · deposit({{ arm.coll }}, {{ arm.collRes }})
The keeper could then call only: executeRepay · executeTopUp · executeFullRepay
each checked against your policy on-chain
You keep, at any time: setPaused · revoke · withdrawReserve
Pause and revoke exist on the contract. They are disabled here because nothing is deployed.
DRY RUNPolicy preview {{ arm.dry.summary }}
{{ c.s }} {{ c.t }} {{ c.d }}
{{ arm.dry.note }}
{{ arm.fk.kicker }} Armed on a local fork, then attacked

{{ arm.fk.text }}

WATCHINGDETECTEDPLANNINGVALIDATINGEXECUTINGCONFIRMEDWATCHING
TRIGGER{{ arm.fk.trigger }}
FLOOR{{ arm.fk.floor }}
ACTIONS{{ arm.fk.actions }}
BUFFER{{ arm.fk.buffer }}
CAPS / ACTION{{ arm.fk.caps }}
TOTAL CAPS{{ arm.fk.totals }}
RESERVE AFTER{{ arm.fk.reserveAfter }}
EXPIRY · COOLDOWN{{ arm.fk.expiry }}
{{ arm.dep.kicker }} Authorize once, then let FAULTLINE watch in the background

{{ arm.dep.text }}

{{ g.t }}{{ g.d }}{{ g.v }}
{{ arm.dep.panelTitle }}
{{ r.k }}{{ r.v }}
{{ arm.dep.note }}
EVIDENCE LOG · LATEST FIRST{{ arm.dep.integ.label }} {{ arm.dep.integText }}
{{ ev.t }}{{ ev.s }}{{ ev.m }}
ACTIVITY AND EVIDENCE What was run, where, and how you can check it Only recorded artifacts and this session's own actions appear here. There is no account storage yet, so session entries disappear when you leave.
{{ act.empty }}
{{ act.sel.chip.label }} {{ act.sel.title }} {{ act.sel.meta }} · {{ act.sel.result }}
{{ f.k }}{{ f.v }}
TRANSACTION{{ act.sel.tx }}
STATUS LABELS
{{ l.label }}
Fork transactions exist only on the local chain 31337. The one mainnet transaction listed is a third-party liquidation used to validate the model.