A first audit
This walks the bundled Solidity vault. Every step below is one click in the map beside it — try them.
Generated with sourcetruth --demo from the examples in the repository. Open this map in its own tab
The same steps, in words
Find the blind spot. Top right:
1 blind spot. Nearly everything the code does could be followed; one call couldn't. Click it —Vault.executedoes adelegatecallto an address the caller passes in. That line gets read by hand.See who can act.
anyoneis outside: functions with no access check at all.onlyOwner,vaultandkeepers[msg.sender]are inside.Start where outsiders get in. The panel lists what an outsider can do alone, riskiest first.
takeFeeis there: no check, and it moves tokens.Press Play.
takeFeewrites the vault's storage and callsIERC20— a transfer to the owner, of an amount the caller chooses.Check a guarded one.
harvestis limited tokeepers[msg.sender], and the panel shows where that check lives:_onlyKeeper() → require(keepers[msg.sender], "not keeper"). It's a helper call, not a modifier — sourcetruth follows those.Follow the flow. Play
harvest:IStrategy.harvest, then the fee transfer, then_investsending funds back to the strategy. ClickIStrategyor theStrategycard to see the other side.Read the code. Every action has a Code button. Source is shown with comments intact for reading — but nothing on the map was derived from them.
The Daml example
Switch to Daml lending on the demo page and open Position.Liquidate:
- the liquidator names itself —
liquidatoris an argument of the choice; - it supplies the price it is checked against —
priceCidis chosen by the caller; - it runs with the authority of
operatorandowner, the signers of the position, not only its own.
Each of those is a question worth an hour of review, and none of them is visible from the controller line alone.