Auditing IDE¶
The Auditing IDE is the security workbench. You point it at a deployed contract, it forks the chain around that contract, and every panel then works against that fork: send a transaction, watch the storage move, fuzz an input, sweep the bytecode, map who controls what.
Open it at app.trilocore.ai and choose Auditing IDE, or drive the same
thing from the API:
curl -X POST https://api.trilocore.ai/api/v1/bevm/sessions \
-H "Authorization: Bearer $TRILOCORE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"network": "eth", "rpc_url": "https://your-node.example/eth", "target_address": "0xYourTargetContract"}'
If you have not opened a session before, start with the Quickstart.
The panels¶
Seven panels are always in the strip; the rest sit in the secondary row. All of them read the one session, so a slot you notice in Storage is the same slot Composer just changed.
Primary¶
| Panel | What it is for |
|---|---|
| Composer | Craft and fire one transaction against the fork, then read exactly what it did. The main loop. |
| Blocks | The contract's basic blocks, with a detail view per block and multi-contract scope. |
| Heap | EVM memory during execution, plus the call profile — where the gas and the allocations went. |
| Storage | Read and write fork storage slots directly, including mapping-key computation. |
| Recovery | Recover structure from bytecode when there is no source: control flow, selectors, execution paths. |
| Architecture | The Architecture Explorer — see below. |
| Contract IDE | The developer surface, reachable without leaving the workspace. See Contract IDE. |
Secondary¶
| Panel | What it is for |
|---|---|
| Fuzzer | Drive one or more input positions with generated or listed values. |
| Graph | Control-flow graph, filterable by selector. |
| Multichain | Cross-chain and cross-contract checks over the same target set. |
| Decoder | Encode and decode calldata against an ABI, both directions. |
| MorphVM | Decode obfuscated byte-VM dispatchers — contracts that hide behind a single selector and interpret their own instruction set. |
| Findings | The findings ledger for the session: what was found, by what, with what severity. |
| Prober | Targeted probes for specific problem classes, including asset-flow routing and transient storage. |
| Dataflow | Trace how a value reaches a sink — the dataflow tracer. |
| Comparer | Diff two states or two transaction results side by side. |
| Passive | The static detector sweep over the target's bytecode. |
Composer¶
Composer is where a suspicion becomes a demonstration. You give it a target, a function signature and arguments; it fires the call against the fork and reports gas, value deltas, return data, the revert reason if it reverted, and every storage slot that changed with its before and after value.
The behaviour to decide up front is whether sends accumulate:
- Isolated (the default) rolls back after each send, so twenty variants all start from identical conditions. This is the mode for "which of these inputs behaves differently".
- Stateful (
persist: true) commits each send, so step three sees what step two did, and the mined block climbs. This is the mode for a real multi-step reproduction.
Every send becomes a durable execution, so a sequence
you built today can be cited and replayed later. Sends are mutating calls and
require an Idempotency-Key; reuse the same key on a retry
and the stored result is replayed instead of firing a second transaction.
Reference: Execution, State and storage.
Fuzzer¶
The Fuzzer drives input positions — the places in a call you want varied — using one of four strategies:
| Strategy | Behaviour |
|---|---|
| Single-position | One position varies, everything else is held fixed |
| Shared-list | One list of inputs, applied to every marked position at once |
| Parallel | Several positions advance together, in lockstep |
| Combinatorial | Every combination of the positions' inputs |
Runs are resources: you start one, poll it, advance or stop it, and read its inputs and corpus entries as it goes. Findings raised during a run land in the same ledger as everything else.
Reference: Fuzzing.
MorphVM¶
Some contracts do not expose functions at all. They present one selector, take an encoded program as calldata, and interpret it with their own instruction set — a virtual machine inside the EVM. Ordinary disassembly shows you the interpreter loop and nothing about what it actually does.
MorphVM fingerprints these dispatchers and decodes the inner program, so the handler bodies become readable and the real control flow becomes visible.
Reference: Bytecode and decoding.
Architecture Explorer¶
The Architecture Explorer answers the governance question: who can change what? It builds a graph of the protocol's contracts, the roles and owners attached to them, and the control edges between — reading the actual authority slots on the fork rather than trusting the documentation.
From that map you get:
- Reachability paths — how control flows from an account to a privileged action, including multi-hop routes through proxies and modules.
- Rules — checks over the map, such as a single key holding sole authority over a critical function.
- Snapshots and diffs — freeze the map, then compare it after an upgrade or a governance action to see exactly which edges moved.
- Trace overlay — project an execution onto the map to see which authority edges a transaction actually used.
Reference: Architecture. Taking a snapshot is a mutating
call and requires an Idempotency-Key.
Findings and the detector sweep¶
Passive runs the static detector registry over the target's bytecode — 1769 detectors covering the usual pattern classes plus a long tail of protocol-specific ones — and files what it finds into the ledger.
Detector output is a starting point, not a verdict. The workflow the product is built around is: sweep to get candidates, use Composer to try to reproduce one on the fork, and keep the ones that reproduce. A finding backed by an execution is worth something; a detector hit on its own is a lead.
Findings can be exported for a code-scanning pipeline, and filed against an audit in a workspace so they carry through to a report. See Core concepts.
Reference: Analysis and findings.
Working with more than one contract¶
Real targets are not one address. A session can hold several contracts in scope — named explicitly when you open it, or pulled in automatically from addresses hard-coded in the target's bytecode — and the panels follow: Blocks, Graph and the Architecture Explorer all work across the whole scope rather than one address at a time.
Reference: Targets and contracts.
Where the work is kept¶
Executions, findings and audit events are durable and attributed to a workspace and project, so an audit remains reconstructable after the session is closed. What is not durable unless you save it explicitly: the in-session panel state, such as open Composer tabs and local history. Snapshot the fork or file the finding when a result matters.
Next: Core concepts for the model underneath the panels, or the Endpoint reference to automate any of this.