hex-audit 0.7.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +137 -77
- package/DEMO.md +40 -117
- package/README.md +200 -402
- package/dashboard/.next/BUILD_ID +1 -1
- package/dashboard/.next/app-build-manifest.json +56 -101
- package/dashboard/.next/app-path-routes-manifest.json +1 -1
- package/dashboard/.next/build-manifest.json +9 -9
- package/dashboard/.next/next-server.js.nft.json +1 -1
- package/dashboard/.next/prerender-manifest.json +1 -1
- package/dashboard/.next/react-loadable-manifest.json +436 -15
- package/dashboard/.next/routes-manifest.json +1 -1
- package/dashboard/.next/server/app/_not-found/page.js +1 -1
- package/dashboard/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/dashboard/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/server/app/api/code/route.js +1 -1
- package/dashboard/.next/server/app/api/code/route.js.nft.json +1 -1
- package/dashboard/.next/server/app/api/comments/route.js +1 -0
- package/dashboard/.next/server/app/api/comments/route.js.nft.json +1 -0
- package/dashboard/.next/server/app/api/diagrams/[name]/export/route.js +1 -0
- package/dashboard/.next/server/app/api/diagrams/[name]/export/route.js.nft.json +1 -0
- package/dashboard/.next/server/app/api/diagrams/[name]/resolve/route.js +1 -0
- package/dashboard/.next/server/app/api/diagrams/[name]/resolve/route.js.nft.json +1 -0
- package/dashboard/.next/server/app/api/diagrams/[name]/route.js +1 -0
- package/dashboard/.next/server/app/api/diagrams/[name]/route.js.nft.json +1 -0
- package/dashboard/.next/server/app/api/figures/[name]/route.js +1 -0
- package/dashboard/.next/server/app/api/figures/[name]/route.js.nft.json +1 -0
- package/dashboard/.next/server/app/api/focus/route.js +1 -0
- package/dashboard/.next/server/app/api/focus/route.js.nft.json +1 -0
- package/dashboard/.next/server/app/api/github-status/route.js +1 -1
- package/dashboard/.next/server/app/api/invariants/[id]/route.js +1 -0
- package/dashboard/.next/server/app/api/invariants/[id]/route.js.nft.json +1 -0
- package/dashboard/.next/server/app/api/issues/[id]/revert-auto/route.js +1 -0
- package/dashboard/.next/server/app/api/issues/[id]/revert-auto/route.js.nft.json +1 -0
- package/dashboard/.next/server/app/api/nav/route.js +1 -0
- package/dashboard/.next/server/app/api/nav/route.js.nft.json +1 -0
- package/dashboard/.next/server/app/api/notes/done/route.js +1 -1
- package/dashboard/.next/server/app/api/notes/done/route.js.nft.json +1 -1
- package/dashboard/.next/server/app/api/notes/lead/route.js +1 -1
- package/dashboard/.next/server/app/api/notes/lead/route.js.nft.json +1 -1
- package/dashboard/.next/server/app/api/notes/question/route.js +1 -1
- package/dashboard/.next/server/app/api/notes/question/route.js.nft.json +1 -1
- package/dashboard/.next/server/app/api/notes/record/route.js +3 -3
- package/dashboard/.next/server/app/api/notes/route.js +2 -2
- package/dashboard/.next/server/app/api/palette/route.js +1 -0
- package/dashboard/.next/server/app/api/palette/route.js.nft.json +1 -0
- package/dashboard/.next/server/app/api/progress/route.js +1 -1
- package/dashboard/.next/server/app/api/progress/route.js.nft.json +1 -1
- package/dashboard/.next/server/app/api/watch/route.js +2 -2
- package/dashboard/.next/server/app/api/watch/route.js.nft.json +1 -1
- package/dashboard/.next/server/app/api/xref/route.js +1 -0
- package/dashboard/.next/server/app/changes/page.js +1 -20
- package/dashboard/.next/server/app/changes/page.js.nft.json +1 -1
- package/dashboard/.next/server/app/changes/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/server/app/excalidraw-assets/[...path]/route.js +1 -0
- package/dashboard/.next/server/app/issues/page.js +5 -28
- package/dashboard/.next/server/app/issues/page.js.nft.json +1 -1
- package/dashboard/.next/server/app/issues/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/server/app/model/page.js +1 -0
- package/dashboard/.next/server/app/{calls → model}/page.js.nft.json +1 -1
- package/dashboard/.next/server/app/model/page_client-reference-manifest.js +1 -0
- package/dashboard/.next/server/app/page.js +1 -20
- package/dashboard/.next/server/app/page.js.nft.json +1 -1
- package/dashboard/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/server/app/report/page.js +1 -1
- package/dashboard/.next/server/app/report/page.js.nft.json +1 -1
- package/dashboard/.next/server/app/report/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/server/app/review/page.js +1 -0
- package/dashboard/.next/server/app/{access → review}/page.js.nft.json +1 -1
- package/dashboard/.next/server/app/review/page_client-reference-manifest.js +1 -0
- package/dashboard/.next/server/app-paths-manifest.json +19 -16
- package/dashboard/.next/server/chunks/310.js +4 -0
- package/dashboard/.next/server/chunks/370.js +1 -0
- package/dashboard/.next/server/chunks/42.js +1 -1
- package/dashboard/.next/server/chunks/624.js +14 -0
- package/dashboard/.next/server/chunks/645.js +1 -1
- package/dashboard/.next/server/chunks/649.js +1 -1
- package/dashboard/.next/server/chunks/653.js +1 -0
- package/dashboard/.next/server/functions-config-manifest.json +1 -1
- package/dashboard/.next/server/middleware-build-manifest.js +1 -1
- package/dashboard/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dashboard/.next/server/pages/500.html +1 -1
- package/dashboard/.next/server/pages/_error.js +1 -1
- package/dashboard/.next/server/server-reference-manifest.js +1 -1
- package/dashboard/.next/server/server-reference-manifest.json +1 -1
- package/dashboard/.next/static/chunks/0bbe10ee.8e7ffa06d2170dfe.js +84 -0
- package/dashboard/.next/static/chunks/1026.0ef689a305302427.js +1 -0
- package/dashboard/.next/static/chunks/1164.34eb76767ebea46f.js +8 -0
- package/dashboard/.next/static/chunks/119.a9a79633900a235f.js +5 -0
- package/dashboard/.next/static/chunks/1291.6c486c9b1d4b1b3a.js +1 -0
- package/dashboard/.next/static/chunks/139.4691848fc5a46253.js +10 -0
- package/dashboard/.next/static/chunks/145.1bf74fecdb4022e3.js +11 -0
- package/dashboard/.next/static/chunks/1517.8e7075f78e22b3a0.js +8 -0
- package/dashboard/.next/static/chunks/165.6f174060a0ce2db4.js +6 -0
- package/dashboard/.next/static/chunks/1741.5c370b7702d2eb40.js +8 -0
- package/dashboard/.next/static/chunks/1e36816c.5748c83adc8a6bd6.js +108 -0
- package/dashboard/.next/static/chunks/2061.eab75b3c1dfa068a.js +1 -0
- package/dashboard/.next/static/chunks/2148.3ce718f62d1b2f7c.js +10 -0
- package/dashboard/.next/static/chunks/217-1d5b680ffd10e3f9.js +1 -0
- package/dashboard/.next/static/chunks/2208.fb884379aa3ae968.js +1 -0
- package/dashboard/.next/static/chunks/2276.112c7855333fca5f.js +6 -0
- package/dashboard/.next/static/chunks/2374-8c6f137938f8518a.js +1 -0
- package/dashboard/.next/static/chunks/2445.18a86507d2996b95.js +1 -0
- package/dashboard/.next/static/chunks/2712.15dd8577973baf22.js +10 -0
- package/dashboard/.next/static/chunks/2759.533dec5317e0a1d1.js +1 -0
- package/dashboard/.next/static/chunks/2812.62b213bef580b69a.js +1 -0
- package/dashboard/.next/static/chunks/2895.bb57cacb7aaf42a1.js +9 -0
- package/dashboard/.next/static/chunks/2972.e5a9251b538dcf19.js +9 -0
- package/dashboard/.next/static/chunks/3206.8d9a10db2b04b93f.js +1 -0
- package/dashboard/.next/static/chunks/3485.36766504793b7237.js +9 -0
- package/dashboard/.next/static/chunks/3725.de9376dc994735d4.js +9 -0
- package/dashboard/.next/static/chunks/3774.1df377928e8387f7.js +9 -0
- package/dashboard/.next/static/chunks/3963.39d72b3875dfe2e9.js +13 -0
- package/dashboard/.next/static/chunks/4013.73884b23bfaebdde.js +11 -0
- package/dashboard/.next/static/chunks/4117.278aff1fa23fd36e.js +6 -0
- package/dashboard/.next/static/chunks/4210.cc8594110017c579.js +11 -0
- package/dashboard/.next/static/chunks/4282.28485875540886cc.js +7 -0
- package/dashboard/.next/static/chunks/4318.a2f469a88d88f6d0.js +8 -0
- package/dashboard/.next/static/chunks/4363.8999a6e727c48003.js +1 -0
- package/dashboard/.next/static/chunks/4641.e03d118fffebd580.js +5 -0
- package/dashboard/.next/static/chunks/483.a910dab7734a1074.js +8 -0
- package/dashboard/.next/static/chunks/4926.76693f542e9cc062.js +6 -0
- package/dashboard/.next/static/chunks/4938.03f6d04dabf38745.js +10 -0
- package/dashboard/.next/static/chunks/5112.0757c2b0c285e62e.js +1 -0
- package/dashboard/.next/static/chunks/5199.c83ea7efb0eec705.js +11 -0
- package/dashboard/.next/static/chunks/530.849957a8907eb288.js +1 -0
- package/dashboard/.next/static/chunks/5424.4e8ca0711a32bccf.js +7 -0
- package/dashboard/.next/static/chunks/55.a593a78be9714679.js +1 -0
- package/dashboard/.next/static/chunks/5535.6cd0bd8d368d8902.js +4 -0
- package/dashboard/.next/static/chunks/5626.7d4e93d7acbeffc9.js +10 -0
- package/dashboard/.next/static/chunks/5775.a0d7c1b1e89b9a93.js +9 -0
- package/dashboard/.next/static/chunks/6118.266956b3333b1d7a.js +9 -0
- package/dashboard/.next/static/chunks/6121.a2e6d93720b1205e.js +77 -0
- package/dashboard/.next/static/chunks/6853.d3ad43614e8ca0ab.js +1 -0
- package/dashboard/.next/static/chunks/6951.02a3a158d02158c9.js +5 -0
- package/dashboard/.next/static/chunks/6970.013f24568c87d918.js +11 -0
- package/dashboard/.next/static/chunks/7013.39d41e82b37be63b.js +9 -0
- package/dashboard/.next/static/chunks/7107.1c5412197912b8ed.js +8 -0
- package/dashboard/.next/static/chunks/7508.dd60e2d06d149f5f.js +9 -0
- package/dashboard/.next/static/chunks/7524.0fde4c61553d1491.js +3 -0
- package/dashboard/.next/static/chunks/7834-47f318a04a05688f.js +1 -0
- package/dashboard/.next/static/chunks/8317.d0b3eddef4cae0d5.js +1 -0
- package/dashboard/.next/static/chunks/838.2b2aa006519ba44c.js +10 -0
- package/dashboard/.next/static/chunks/8398.924fd8f4c83417c0.js +7 -0
- package/dashboard/.next/static/chunks/8428b36f.8ac4e67061c01307.js +34 -0
- package/dashboard/.next/static/chunks/8514.85ccbbea8ab21d04.js +5 -0
- package/dashboard/.next/static/chunks/8538.5f7ebe76c4b63162.js +1 -0
- package/dashboard/.next/static/chunks/8687.9406baa8b5601fd0.js +1 -0
- package/dashboard/.next/static/chunks/8721.47346e2cb6412376.js +10 -0
- package/dashboard/.next/static/chunks/8770.4f544bd1a6f03a62.js +8 -0
- package/dashboard/.next/static/chunks/8812.3d96fd54dba566f8.js +9 -0
- package/dashboard/.next/static/chunks/8962.d22aa67a97970dd8.js +1 -0
- package/dashboard/.next/static/chunks/8986.b327224b83f4399a.js +5 -0
- package/dashboard/.next/static/chunks/9271.5f66c19a8ee1ff36.js +10 -0
- package/dashboard/.next/static/chunks/9282.f8d01442bab4c0da.js +2 -0
- package/dashboard/.next/static/chunks/9366.0ec24a0791b9b00f.js +1 -0
- package/dashboard/.next/static/chunks/9707.5cd7d2ee933a4af5.js +6 -0
- package/dashboard/.next/static/chunks/9716.15fffc0b0038601d.js +4 -0
- package/dashboard/.next/static/chunks/9791.e3b3f5a367f63c8a.js +1 -0
- package/dashboard/.next/static/chunks/9820.8c1efad5260e8137.js +1 -0
- package/dashboard/.next/static/chunks/985.50150e9eaa4bde33.js +39 -0
- package/dashboard/.next/static/chunks/997.56901b86e1b8a87b.js +8 -0
- package/dashboard/.next/static/chunks/app/changes/page-f8a860034221cad4.js +1 -0
- package/dashboard/.next/static/chunks/app/issues/page-da4da93188c414a6.js +1 -0
- package/dashboard/.next/static/chunks/app/layout-27a9da4610423c1e.js +1 -0
- package/dashboard/.next/static/chunks/app/model/page-9680e22fdd6ddb81.js +1 -0
- package/dashboard/.next/static/chunks/app/page-0e67750d99fb2836.js +1 -0
- package/dashboard/.next/static/chunks/app/report/page-b56b1db9b9dcf2b6.js +1 -0
- package/dashboard/.next/static/chunks/app/review/page-3ef69f0e0badd333.js +1 -0
- package/dashboard/.next/static/chunks/c75e29e3.d91220f782934d80.js +1 -0
- package/dashboard/.next/static/chunks/{main-cc3a889b25e9aa68.js → main-9c95a7ffedc7afb4.js} +1 -1
- package/dashboard/.next/static/chunks/webpack-6da70e4f9fcf1799.js +1 -0
- package/dashboard/.next/static/css/ceafd91ca8dd753d.css +3 -0
- package/dashboard/.next/static/css/e4aad1f9c715b79a.css +1 -0
- package/dashboard/.next/static/media/Assistant-Bold.c8f39f24.woff2 +0 -0
- package/dashboard/.next/static/media/Assistant-Medium.1e75d8e6.woff2 +0 -0
- package/dashboard/.next/static/media/Assistant-Regular.7acbabb8.woff2 +0 -0
- package/dashboard/.next/static/media/Assistant-SemiBold.167acbf8.woff2 +0 -0
- package/dashboard/app/api/code/route.ts +26 -20
- package/dashboard/app/api/comments/route.ts +158 -0
- package/dashboard/app/api/diagrams/[name]/export/route.ts +26 -0
- package/dashboard/app/api/diagrams/[name]/resolve/route.ts +25 -0
- package/dashboard/app/api/diagrams/[name]/route.ts +37 -0
- package/dashboard/app/api/figures/[name]/route.ts +15 -0
- package/dashboard/app/api/focus/route.ts +35 -0
- package/dashboard/app/api/invariants/[id]/route.ts +35 -0
- package/dashboard/app/api/issues/[id]/revert-auto/route.ts +18 -0
- package/dashboard/app/api/nav/route.ts +120 -0
- package/dashboard/app/api/palette/route.ts +68 -0
- package/dashboard/app/api/progress/route.ts +54 -23
- package/dashboard/app/api/xref/route.ts +30 -0
- package/dashboard/app/changes/ChangesClient.tsx +730 -356
- package/dashboard/app/changes/page.tsx +27 -19
- package/dashboard/app/excalidraw-assets/[...path]/route.ts +56 -0
- package/dashboard/app/globals.css +231 -77
- package/dashboard/app/issues/BoardClient.tsx +817 -0
- package/dashboard/app/issues/page.tsx +27 -272
- package/dashboard/app/layout.tsx +32 -17
- package/dashboard/app/model/ModelClient.tsx +1303 -0
- package/dashboard/app/model/page.tsx +98 -0
- package/dashboard/app/page.tsx +191 -277
- package/dashboard/app/report/ReportClient.tsx +147 -74
- package/dashboard/app/report/page.tsx +25 -14
- package/dashboard/app/review/ReviewClient.tsx +1180 -0
- package/dashboard/app/review/page.tsx +93 -0
- package/dashboard/components/AutoRefresh.tsx +22 -19
- package/dashboard/components/CodeComments.tsx +303 -0
- package/dashboard/components/CodeNav.tsx +523 -0
- package/dashboard/components/CodeReference.tsx +92 -99
- package/dashboard/components/CodeViewer.tsx +526 -0
- package/dashboard/components/CommandPalette.tsx +141 -66
- package/dashboard/components/DiagramCanvas.tsx +275 -0
- package/dashboard/components/DianeNote.tsx +244 -0
- package/dashboard/components/LiveStatus.tsx +30 -68
- package/dashboard/components/MarkdownRenderer.tsx +34 -32
- package/dashboard/components/RecordButton.tsx +132 -0
- package/dashboard/components/ui/Button.tsx +39 -0
- package/dashboard/components/ui/Chip.tsx +37 -0
- package/dashboard/components/ui/EmptyState.tsx +31 -0
- package/dashboard/components/ui/Icons.tsx +126 -0
- package/dashboard/components/ui/Inspector.tsx +122 -0
- package/dashboard/components/ui/Kbd.tsx +15 -0
- package/dashboard/components/ui/ListRow.tsx +92 -0
- package/dashboard/components/ui/LocalTime.tsx +14 -0
- package/dashboard/components/ui/ProgressRing.tsx +54 -0
- package/dashboard/components/ui/ResizeHandle.tsx +93 -0
- package/dashboard/components/ui/RiskMeter.tsx +27 -0
- package/dashboard/components/ui/SearchField.tsx +55 -0
- package/dashboard/components/ui/SegmentedControl.tsx +71 -0
- package/dashboard/components/ui/SeverityDot.tsx +57 -0
- package/dashboard/components/ui/Sidebar.tsx +236 -0
- package/dashboard/components/ui/SplitView.tsx +122 -0
- package/dashboard/components/ui/StateGlyph.tsx +66 -0
- package/dashboard/components/ui/Toast.tsx +91 -0
- package/dashboard/lib/api.ts +17 -0
- package/dashboard/lib/cn.ts +4 -0
- package/dashboard/lib/data.ts +2 -21
- package/dashboard/lib/finding-markdown.ts +1 -1
- package/dashboard/lib/focus.ts +42 -0
- package/dashboard/lib/hotkeys.ts +41 -0
- package/dashboard/lib/inline-markdown.test.ts +11 -0
- package/dashboard/lib/live.ts +32 -0
- package/dashboard/lib/pane-width.ts +36 -0
- package/dashboard/lib/server/board.ts +229 -0
- package/dashboard/lib/server/diagrams.ts +191 -0
- package/dashboard/lib/server/safe-path.ts +28 -0
- package/dashboard/lib/server/workspace.ts +113 -0
- package/dashboard/lib/server/xref.ts +42 -0
- package/dashboard/lib/solidity.test.ts +37 -0
- package/dashboard/lib/solidity.ts +191 -0
- package/dashboard/lib/source.ts +28 -0
- package/dashboard/lib/types.ts +164 -0
- package/dashboard/lib/url.ts +18 -0
- package/dashboard/lib/watcher.ts +31 -22
- package/dashboard/tailwind.config.ts +6 -3
- package/dist/analysis/code-model.d.ts.map +1 -1
- package/dist/analysis/code-model.js +4 -1
- package/dist/analysis/code-model.js.map +1 -1
- package/dist/analysis/diff.d.ts +12 -1
- package/dist/analysis/diff.d.ts.map +1 -1
- package/dist/analysis/diff.js +143 -0
- package/dist/analysis/diff.js.map +1 -1
- package/dist/commands/analyze.d.ts.map +1 -1
- package/dist/commands/analyze.js +17 -48
- package/dist/commands/analyze.js.map +1 -1
- package/dist/commands/claude.d.ts.map +1 -1
- package/dist/commands/claude.js +5 -0
- package/dist/commands/claude.js.map +1 -1
- package/dist/commands/dashboard.d.ts.map +1 -1
- package/dist/commands/dashboard.js +10 -2
- package/dist/commands/dashboard.js.map +1 -1
- package/dist/commands/diagram.d.ts +3 -0
- package/dist/commands/diagram.d.ts.map +1 -0
- package/dist/commands/diagram.js +71 -0
- package/dist/commands/diagram.js.map +1 -0
- package/dist/commands/diff.d.ts +4 -5
- package/dist/commands/diff.d.ts.map +1 -1
- package/dist/commands/diff.js +56 -17
- package/dist/commands/diff.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +5 -18
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/facts.d.ts +23 -0
- package/dist/commands/facts.d.ts.map +1 -0
- package/dist/commands/facts.js +121 -0
- package/dist/commands/facts.js.map +1 -0
- package/dist/commands/fix-review.d.ts +9 -0
- package/dist/commands/fix-review.d.ts.map +1 -0
- package/dist/commands/fix-review.js +367 -0
- package/dist/commands/fix-review.js.map +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +51 -47
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/issue.d.ts.map +1 -1
- package/dist/commands/issue.js +151 -2
- package/dist/commands/issue.js.map +1 -1
- package/dist/commands/mcp.d.ts +3 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +11 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/model.d.ts +4 -0
- package/dist/commands/model.d.ts.map +1 -0
- package/dist/commands/model.js +275 -0
- package/dist/commands/model.js.map +1 -0
- package/dist/commands/note.d.ts.map +1 -1
- package/dist/commands/note.js +31 -1
- package/dist/commands/note.js.map +1 -1
- package/dist/commands/review.d.ts +4 -0
- package/dist/commands/review.d.ts.map +1 -0
- package/dist/commands/review.js +164 -0
- package/dist/commands/review.js.map +1 -0
- package/dist/core/comments.d.ts +59 -0
- package/dist/core/comments.d.ts.map +1 -0
- package/dist/core/comments.js +263 -0
- package/dist/core/comments.js.map +1 -0
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +0 -1
- package/dist/core/config.js.map +1 -1
- package/dist/core/dedup.d.ts +56 -0
- package/dist/core/dedup.d.ts.map +1 -0
- package/dist/core/dedup.js +208 -0
- package/dist/core/dedup.js.map +1 -0
- package/dist/core/errors.d.ts +1 -1
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +0 -15
- package/dist/core/errors.js.map +1 -1
- package/dist/core/external-tools.d.ts +0 -14
- package/dist/core/external-tools.d.ts.map +1 -1
- package/dist/core/external-tools.js +2 -52
- package/dist/core/external-tools.js.map +1 -1
- package/dist/core/fix-review.d.ts +54 -0
- package/dist/core/fix-review.d.ts.map +1 -0
- package/dist/core/fix-review.js +98 -0
- package/dist/core/fix-review.js.map +1 -0
- package/dist/core/fuzz-sync.d.ts +93 -0
- package/dist/core/fuzz-sync.d.ts.map +1 -0
- package/dist/core/fuzz-sync.js +516 -0
- package/dist/core/fuzz-sync.js.map +1 -0
- package/dist/core/git.d.ts +7 -0
- package/dist/core/git.d.ts.map +1 -1
- package/dist/core/git.js +42 -0
- package/dist/core/git.js.map +1 -1
- package/dist/core/issues.d.ts +32 -1
- package/dist/core/issues.d.ts.map +1 -1
- package/dist/core/issues.js +135 -3
- package/dist/core/issues.js.map +1 -1
- package/dist/core/mcp-config.d.ts +12 -0
- package/dist/core/mcp-config.d.ts.map +1 -0
- package/dist/core/mcp-config.js +29 -0
- package/dist/core/mcp-config.js.map +1 -0
- package/dist/core/model.d.ts +38 -0
- package/dist/core/model.d.ts.map +1 -0
- package/dist/core/model.js +160 -0
- package/dist/core/model.js.map +1 -0
- package/dist/core/notes.d.ts +2 -0
- package/dist/core/notes.d.ts.map +1 -1
- package/dist/core/notes.js +13 -3
- package/dist/core/notes.js.map +1 -1
- package/dist/core/review.d.ts +47 -0
- package/dist/core/review.d.ts.map +1 -1
- package/dist/core/review.js +177 -1
- package/dist/core/review.js.map +1 -1
- package/dist/core/rules.d.ts +12 -0
- package/dist/core/rules.d.ts.map +1 -0
- package/dist/core/rules.js +66 -0
- package/dist/core/rules.js.map +1 -0
- package/dist/core/schema.d.ts +4817 -2245
- package/dist/core/schema.d.ts.map +1 -1
- package/dist/core/schema.js +452 -113
- package/dist/core/schema.js.map +1 -1
- package/dist/core/scope.d.ts +8 -0
- package/dist/core/scope.d.ts.map +1 -0
- package/dist/core/scope.js +18 -0
- package/dist/core/scope.js.map +1 -0
- package/dist/diagrams/build.d.ts +18 -0
- package/dist/diagrams/build.d.ts.map +1 -0
- package/dist/diagrams/build.js +135 -0
- package/dist/diagrams/build.js.map +1 -0
- package/dist/diagrams/excalidraw.d.ts +27 -0
- package/dist/diagrams/excalidraw.d.ts.map +1 -0
- package/dist/diagrams/excalidraw.js +219 -0
- package/dist/diagrams/excalidraw.js.map +1 -0
- package/dist/diagrams/layout.d.ts +48 -0
- package/dist/diagrams/layout.d.ts.map +1 -0
- package/dist/diagrams/layout.js +686 -0
- package/dist/diagrams/layout.js.map +1 -0
- package/dist/facts/build.d.ts +23 -0
- package/dist/facts/build.d.ts.map +1 -0
- package/dist/facts/build.js +112 -0
- package/dist/facts/build.js.map +1 -0
- package/dist/facts/extract.d.ts +53 -0
- package/dist/facts/extract.d.ts.map +1 -0
- package/dist/facts/extract.js +635 -0
- package/dist/facts/extract.js.map +1 -0
- package/dist/facts/fallback.d.ts +7 -0
- package/dist/facts/fallback.d.ts.map +1 -0
- package/dist/facts/fallback.js +156 -0
- package/dist/facts/fallback.js.map +1 -0
- package/dist/facts/implementations.d.ts +29 -0
- package/dist/facts/implementations.d.ts.map +1 -0
- package/dist/facts/implementations.js +43 -0
- package/dist/facts/implementations.js.map +1 -0
- package/dist/facts/query.d.ts +35 -0
- package/dist/facts/query.d.ts.map +1 -0
- package/dist/facts/query.js +157 -0
- package/dist/facts/query.js.map +1 -0
- package/dist/facts/xref.d.ts +53 -0
- package/dist/facts/xref.d.ts.map +1 -0
- package/dist/facts/xref.js +282 -0
- package/dist/facts/xref.js.map +1 -0
- package/dist/index.js +14 -16
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.d.ts +3 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +400 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/skills/ai-audit/SKILL.md +16 -6
- package/dist/skills/ai-audit/UPSTREAM.md +9 -4
- package/dist/skills/ai-audit/references/hex-board.md +34 -46
- package/dist/skills/diane.md +26 -12
- package/dist/skills/fix-review.md +58 -0
- package/dist/skills/fuzz/LICENSE +21 -0
- package/dist/skills/fuzz/SKILL.md +655 -0
- package/dist/skills/fuzz/UPSTREAM.md +119 -0
- package/dist/skills/fuzz/agents/implementers/global-property-implementer.md +81 -0
- package/dist/skills/fuzz/agents/implementers/specific-property-implementer.md +121 -0
- package/dist/skills/fuzz/agents/invariant-discovery/adversarial-profit-maximizer.md +123 -0
- package/dist/skills/fuzz/agents/invariant-discovery/conservation-auditor.md +92 -0
- package/dist/skills/fuzz/agents/invariant-discovery/protocol-type-specialist.md +173 -0
- package/dist/skills/fuzz/agents/invariant-discovery/roundtrip-rounding-analyst.md +164 -0
- package/dist/skills/fuzz/agents/invariant-discovery/state-transition-mapper.md +92 -0
- package/dist/skills/fuzz/agents/invariant-discovery/synthesizer.md +261 -0
- package/dist/skills/fuzz/agents/protocol-analyzer.md +80 -0
- package/dist/skills/fuzz/agents/report-writer.md +135 -0
- package/dist/skills/fuzz/references/handler-patterns.md +222 -0
- package/dist/skills/fuzz/references/hex-invariants.md +102 -0
- package/dist/skills/fuzz/references/property-generation.md +149 -0
- package/dist/skills/fuzz/references/selection-policy.md +49 -0
- package/dist/skills/fuzz/references/setup-playbook.md +92 -0
- package/dist/skills/fuzz/references/template-map.md +121 -0
- package/dist/skills/fuzz/scripts/ensure_foundry.sh +125 -0
- package/dist/skills/fuzz/scripts/estimate_cost.js +157 -0
- package/dist/skills/fuzz/scripts/extract_abis.js +303 -0
- package/dist/skills/fuzz/scripts/fizz_sync.js +692 -0
- package/dist/skills/fuzz/scripts/generate_handlers.js +370 -0
- package/dist/skills/fuzz/scripts/generate_suite.js +254 -0
- package/dist/skills/fuzz/scripts/lib/log-viewer.js +332 -0
- package/dist/skills/fuzz/scripts/run_echidna.js +192 -0
- package/dist/skills/fuzz/scripts/run_medusa.js +329 -0
- package/dist/skills/fuzz/scripts/select_functions.js +637 -0
- package/dist/skills/fuzz/scripts/setup_fuzz_profile.sh +142 -0
- package/dist/skills/fuzz/templates/Actor.sol +63 -0
- package/dist/skills/fuzz/templates/Base.sol +121 -0
- package/dist/skills/fuzz/templates/FoundryTester.sol +29 -0
- package/dist/skills/fuzz/templates/FuzzTester.sol +11 -0
- package/dist/skills/fuzz/templates/Properties.sol +17 -0
- package/dist/skills/fuzz/templates/README.md +56 -0
- package/dist/skills/fuzz/templates/Snapshots.sol +26 -0
- package/dist/skills/fuzz/templates/echidna.yaml +18 -0
- package/dist/skills/fuzz/templates/handlers/Handlers.sol +13 -0
- package/dist/skills/fuzz/templates/medusa.json +93 -0
- package/dist/skills/fuzz/templates/utils/Clamp.sol +223 -0
- package/dist/skills/fuzz/templates/utils/DecimalPrinter.sol +63 -0
- package/dist/skills/fuzz/templates/utils/Deployer.sol +17 -0
- package/dist/skills/fuzz/templates/utils/EnumerableSet.sol +206 -0
- package/dist/skills/fuzz/templates/utils/Hevm.sol +62 -0
- package/dist/skills/fuzz/templates/utils/Logger.sol +619 -0
- package/dist/skills/fuzz/templates/utils/Math.sol +52 -0
- package/dist/skills/fuzz/templates/utils/MockERC20.sol +279 -0
- package/dist/skills/fuzz/templates/utils/PropertiesAsserts.sol +238 -0
- package/dist/skills/fuzz/templates/utils/StringUtils.sol +85 -0
- package/dist/skills/fuzz-convert/SKILL.md +249 -0
- package/dist/skills/fuzz-sync/SKILL.md +342 -0
- package/dist/skills/generate-poc.md +8 -26
- package/dist/skills/generate-report.md +17 -5
- package/dist/skills/ingest-aa-report.md +11 -30
- package/dist/skills/init-audit/SKILL.md +155 -0
- package/dist/skills/init-audit/references/agents/conformance-checker.md +36 -0
- package/dist/skills/init-audit/references/agents/contract-reader.md +59 -0
- package/dist/skills/init-audit/references/agents/diagram-composer.md +48 -0
- package/dist/skills/init-audit/references/agents/docs-extractor.md +26 -0
- package/dist/skills/init-audit/references/agents/prior-audit.md +32 -0
- package/dist/skills/init-audit/references/agents/regression-checker.md +28 -0
- package/dist/skills/init-audit/references/agents/skeptic.md +31 -0
- package/dist/skills/init-audit/references/agents/standards-checker.md +39 -0
- package/dist/skills/init-audit/references/agents/synthesizer.md +50 -0
- package/dist/skills/prevalidate.md +62 -0
- package/dist/skills/sync-issues.md +11 -25
- package/dist/skills/validate-all-findings.md +2 -2
- package/dist/skills/validate-finding.md +25 -24
- package/dist/skills/write-finding.md +6 -5
- package/dist/types/index.d.ts +16 -12
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +5 -4
- package/dashboard/.next/server/app/access/page.js +0 -1
- package/dashboard/.next/server/app/access/page_client-reference-manifest.js +0 -1
- package/dashboard/.next/server/app/api/flows/route.js +0 -1
- package/dashboard/.next/server/app/api/mermaid/route.js +0 -1
- package/dashboard/.next/server/app/calls/page.js +0 -1
- package/dashboard/.next/server/app/calls/page_client-reference-manifest.js +0 -1
- package/dashboard/.next/server/app/conformance/page.js +0 -1
- package/dashboard/.next/server/app/conformance/page.js.nft.json +0 -1
- package/dashboard/.next/server/app/conformance/page_client-reference-manifest.js +0 -1
- package/dashboard/.next/server/app/diagram/page.js +0 -1
- package/dashboard/.next/server/app/diagram/page.js.nft.json +0 -1
- package/dashboard/.next/server/app/diagram/page_client-reference-manifest.js +0 -1
- package/dashboard/.next/server/app/flows/page.js +0 -1
- package/dashboard/.next/server/app/flows/page.js.nft.json +0 -1
- package/dashboard/.next/server/app/flows/page_client-reference-manifest.js +0 -1
- package/dashboard/.next/server/app/functions/page.js +0 -1
- package/dashboard/.next/server/app/functions/page.js.nft.json +0 -1
- package/dashboard/.next/server/app/functions/page_client-reference-manifest.js +0 -1
- package/dashboard/.next/server/app/notes/page.js +0 -22
- package/dashboard/.next/server/app/notes/page.js.nft.json +0 -1
- package/dashboard/.next/server/app/notes/page_client-reference-manifest.js +0 -1
- package/dashboard/.next/server/app/progress/page.js +0 -1
- package/dashboard/.next/server/app/progress/page.js.nft.json +0 -1
- package/dashboard/.next/server/app/progress/page_client-reference-manifest.js +0 -1
- package/dashboard/.next/server/app/stats/page.js +0 -1
- package/dashboard/.next/server/app/stats/page.js.nft.json +0 -1
- package/dashboard/.next/server/app/stats/page_client-reference-manifest.js +0 -1
- package/dashboard/.next/server/chunks/530.js +0 -1
- package/dashboard/.next/server/chunks/622.js +0 -3
- package/dashboard/.next/server/chunks/665.js +0 -13
- package/dashboard/.next/server/chunks/939.js +0 -1
- package/dashboard/.next/static/chunks/3017.4a5312e3c20a173f.js +0 -1
- package/dashboard/.next/static/chunks/7397-37adf76cad543297.js +0 -1
- package/dashboard/.next/static/chunks/7973.e34032723285a616.js +0 -79
- package/dashboard/.next/static/chunks/8452-6d77fa353402422c.js +0 -13
- package/dashboard/.next/static/chunks/8928-fc049decdfbdaa6d.js +0 -1
- package/dashboard/.next/static/chunks/app/access/page-f8403cbdfc1c176b.js +0 -1
- package/dashboard/.next/static/chunks/app/calls/page-41f20d01e12382ef.js +0 -1
- package/dashboard/.next/static/chunks/app/changes/page-82bf8b6f48cdc506.js +0 -1
- package/dashboard/.next/static/chunks/app/conformance/page-6bb8e3b372e38098.js +0 -1
- package/dashboard/.next/static/chunks/app/diagram/page-469cd7a6f183efba.js +0 -1
- package/dashboard/.next/static/chunks/app/flows/page-7872dd9141ba0b07.js +0 -1
- package/dashboard/.next/static/chunks/app/functions/page-5847bcb77a8e7edf.js +0 -1
- package/dashboard/.next/static/chunks/app/issues/page-1ffc64fe40439002.js +0 -1
- package/dashboard/.next/static/chunks/app/layout-6c6d2a0fd7c989d3.js +0 -1
- package/dashboard/.next/static/chunks/app/notes/page-8bcaa52304500098.js +0 -1
- package/dashboard/.next/static/chunks/app/page-d63800ddb072b77b.js +0 -1
- package/dashboard/.next/static/chunks/app/progress/page-e26554f655a62eef.js +0 -1
- package/dashboard/.next/static/chunks/app/report/page-18c04fb2f193b020.js +0 -1
- package/dashboard/.next/static/chunks/app/stats/page-67ff59fd69bed651.js +0 -1
- package/dashboard/.next/static/chunks/webpack-4de0e79bdd6a0418.js +0 -1
- package/dashboard/.next/static/css/1112cea2260b3926.css +0 -3
- package/dashboard/app/access/AccessClient.tsx +0 -402
- package/dashboard/app/access/ReadOnlyFunctions.tsx +0 -114
- package/dashboard/app/access/page.tsx +0 -125
- package/dashboard/app/api/flows/route.ts +0 -32
- package/dashboard/app/api/mermaid/route.ts +0 -25
- package/dashboard/app/calls/CallsClient.tsx +0 -170
- package/dashboard/app/calls/page.tsx +0 -57
- package/dashboard/app/conformance/ConformanceTable.tsx +0 -214
- package/dashboard/app/conformance/page.tsx +0 -186
- package/dashboard/app/diagram/page.tsx +0 -65
- package/dashboard/app/flows/page.tsx +0 -102
- package/dashboard/app/functions/FunctionsClient.tsx +0 -167
- package/dashboard/app/functions/page.tsx +0 -178
- package/dashboard/app/issues/IssuesBoardClient.tsx +0 -813
- package/dashboard/app/notes/NotesClient.tsx +0 -706
- package/dashboard/app/notes/page.tsx +0 -47
- package/dashboard/app/progress/ProgressClient.tsx +0 -354
- package/dashboard/app/progress/page.tsx +0 -127
- package/dashboard/app/stats/StatsClient.tsx +0 -452
- package/dashboard/app/stats/page.tsx +0 -50
- package/dashboard/components/ConfidenceBadge.tsx +0 -53
- package/dashboard/components/DashboardLayout.tsx +0 -510
- package/dashboard/components/FilterableTable.tsx +0 -293
- package/dashboard/components/MermaidViewer.tsx +0 -267
- package/dashboard/components/NotYetGenerated.tsx +0 -32
- package/dashboard/components/SeverityBadge.tsx +0 -28
- package/dashboard/components/SignalBars.tsx +0 -27
- package/dashboard/components/SortableTable.tsx +0 -122
- package/dashboard/lib/conformance-tokens.ts +0 -49
- package/dist/skills/init-audit.md +0 -386
- /package/dashboard/.next/server/app/api/{flows → xref}/route.js.nft.json +0 -0
- /package/dashboard/.next/server/app/{api/mermaid → excalidraw-assets/[...path]}/route.js.nft.json +0 -0
- /package/dashboard/.next/static/{z5XBev05xDAkDrxWxAjNu → bGV1ry1vvIbM5b506eVBR}/_buildManifest.js +0 -0
- /package/dashboard/.next/static/{z5XBev05xDAkDrxWxAjNu → bGV1ry1vvIbM5b506eVBR}/_ssgManifest.js +0 -0
- /package/dashboard/.next/static/chunks/{3205-47d09be47325709f.js → 3205-fd963acf2fdfd080.js} +0 -0
- /package/dashboard/.next/static/chunks/{3924-88d849290406ee6f.js → 3924-f1f85ccc7d59d7ab.js} +0 -0
- /package/dashboard/.next/static/chunks/{618f8807-69fc7bb97c2b87c1.js → 618f8807-fbb1466bc29c17c6.js} +0 -0
- /package/dashboard/.next/static/chunks/{7498-d1814d68ba346d13.js → 7498-7cf464d8af69cd0a.js} +0 -0
- /package/dashboard/.next/static/chunks/app/_not-found/{page-c299b935209993df.js → page-5ff5d54b6fd6f17e.js} +0 -0
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
# Agent 5: Protocol-Type Specialist
|
|
2
|
+
|
|
3
|
+
**Discovery approach**: Auto-detect the protocol type from PROTOCOL_CONTEXT, then apply battle-tested property templates specific to that protocol category.
|
|
4
|
+
|
|
5
|
+
**Spawn config**: `general-purpose` agent, `model: "{AGENT_MODEL}"` (see SKILL.md "Subagent Model" section — defaults to `sonnet`, `opus` under `--max`).
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Prompt
|
|
10
|
+
|
|
11
|
+
You are the Protocol-Type Specialist — you apply domain-specific invariant templates based on the protocol's category.
|
|
12
|
+
|
|
13
|
+
## Your Discovery Method
|
|
14
|
+
|
|
15
|
+
1. Classify the protocol type from PROTOCOL_CONTEXT
|
|
16
|
+
2. Load the corresponding property template library
|
|
17
|
+
3. Adapt each template property to this specific protocol's contracts, functions, and state variables
|
|
18
|
+
|
|
19
|
+
## INVARIANT_CONTEXT
|
|
20
|
+
{INVARIANT_CONTEXT}
|
|
21
|
+
|
|
22
|
+
## Read the source code of these target contracts:
|
|
23
|
+
{FILE_PATHS}
|
|
24
|
+
|
|
25
|
+
## Step 1: Classify Protocol Type
|
|
26
|
+
|
|
27
|
+
Determine which category (or combination) applies:
|
|
28
|
+
- **Vault/Yield**: ERC-4626 or similar share-based deposit/withdrawal system
|
|
29
|
+
- **Lending/Borrowing**: Collateral, debt, liquidation, interest rates, health factors
|
|
30
|
+
- **AMM/DEX**: Liquidity pools, swaps, constant product/sum/stableswap math
|
|
31
|
+
- **Staking/Locking**: Deposit for time-locked rewards, lock periods, reward distribution
|
|
32
|
+
- **Token**: ERC-20/721/1155 with custom logic (rebasing, fee-on-transfer, etc.)
|
|
33
|
+
- **Governance**: Voting, proposals, delegation, timelocks
|
|
34
|
+
- **Queue/Order**: FIFO queues, order books, auction mechanisms
|
|
35
|
+
- **Bridge/Cross-chain**: Message passing, token wrapping, attestation
|
|
36
|
+
|
|
37
|
+
A protocol can be MULTIPLE types.
|
|
38
|
+
|
|
39
|
+
## Step 2: Apply Type-Specific Templates
|
|
40
|
+
|
|
41
|
+
### VAULT / YIELD (if detected)
|
|
42
|
+
```
|
|
43
|
+
V-01: totalAssets() >= sum of all convertToAssets(balanceOf(user)) for all users
|
|
44
|
+
V-02: share price (totalAssets/totalSupply) is monotonically non-decreasing excluding losses
|
|
45
|
+
V-03: deposit(assets, receiver) credits shares to receiver, not msg.sender (when different)
|
|
46
|
+
V-04: maxDeposit/maxMint/maxWithdraw/maxRedeem return values that don't cause revert when used
|
|
47
|
+
V-05: convertToShares and convertToAssets are internally consistent
|
|
48
|
+
V-06: [MANDATORY — do not skip or merge with other properties]
|
|
49
|
+
First depositor cannot inflate share price to grief subsequent depositors.
|
|
50
|
+
After any sequence of deposits + direct token transfers (donations),
|
|
51
|
+
a deposit of any amount > 0 must produce > 0 shares.
|
|
52
|
+
|
|
53
|
+
SOLIDITY_SKETCH:
|
|
54
|
+
```solidity
|
|
55
|
+
// Global property — checked after every call
|
|
56
|
+
function property_noShareInflationGrief() public {
|
|
57
|
+
uint256 totalSupply = vault.totalSupply();
|
|
58
|
+
uint256 totalAssets = vault.totalAssets();
|
|
59
|
+
if (totalSupply > 0 && totalAssets > 0) {
|
|
60
|
+
// A reasonable deposit (1e18 tokens) should always produce > 0 shares
|
|
61
|
+
uint256 testDeposit = 1e18;
|
|
62
|
+
uint256 previewShares = vault.previewDeposit(testDeposit);
|
|
63
|
+
gt(previewShares, 0, "Share inflation: deposit of 1e18 produces 0 shares");
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
PRIORITY: HIGH
|
|
68
|
+
RATIONALE: Classic vault attack. Attacker deposits 1 wei, donates large amount,
|
|
69
|
+
subsequent depositors get 0 shares due to integer division truncation.
|
|
70
|
+
|
|
71
|
+
V-07: Vault with 0 totalSupply: first deposit works correctly, shares > 0
|
|
72
|
+
V-08: asset() never reverts, returns correct token address
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### LENDING / BORROWING (if detected)
|
|
76
|
+
```
|
|
77
|
+
L-01: totalBorrows <= totalDeposits (protocol is solvent at all times)
|
|
78
|
+
L-02: For every user: if collateral == 0 then debt == 0 (no unbacked debt)
|
|
79
|
+
L-03: Health factor: healthy before => healthy after (for non-price-change operations)
|
|
80
|
+
L-04: Interest accumulation is monotonic: borrowIndex only increases
|
|
81
|
+
L-05: Liquidation reduces debt: borrower_debt_after < borrower_debt_before
|
|
82
|
+
L-06: Liquidation is profitable for liquidator (incentive alignment)
|
|
83
|
+
L-07: Utilization rate stays in [0, 1] range
|
|
84
|
+
L-08: User cannot borrow more than their collateral allows at current LTV
|
|
85
|
+
L-09: Repaying full debt makes position fully healthy
|
|
86
|
+
L-10: Sum of all user borrow shares == totalBorrowShares
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### AMM / DEX (if detected)
|
|
90
|
+
```
|
|
91
|
+
A-01: Pool invariant (k, D, or equivalent) is non-decreasing after swaps
|
|
92
|
+
A-02: totalSupply == 0 <=> reserve0 == 0 <=> reserve1 == 0
|
|
93
|
+
A-03: Swap does not change totalSupply of LP token
|
|
94
|
+
A-04: Adding liquidity: LP tokens minted > 0 when non-zero amounts provided
|
|
95
|
+
A-05: Removing liquidity: user receives proportional share of both tokens
|
|
96
|
+
A-06: Swap output <= reserve of output token
|
|
97
|
+
A-07: Price impact: larger swaps get worse execution
|
|
98
|
+
A-08: After swap: product of reserves >= product before swap
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### STAKING / LOCKING (if detected)
|
|
102
|
+
```
|
|
103
|
+
S-01: Sum of all staked balances == totalStaked
|
|
104
|
+
S-02: Reward rate * time_elapsed == total_rewards_distributed
|
|
105
|
+
S-03: Lock duration: cannot withdraw before lock period ends
|
|
106
|
+
S-04: Reward per token is monotonically non-decreasing
|
|
107
|
+
S-05: After full unstake: user has no remaining claim on rewards
|
|
108
|
+
S-06: Total reward distributed <= total reward allocated
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### TOKEN (if detected)
|
|
112
|
+
```
|
|
113
|
+
T-01: totalSupply == sum(balanceOf(addr)) for all tracked addresses
|
|
114
|
+
T-02: Self-transfer does not change balance or totalSupply
|
|
115
|
+
T-03: Transfer of 0 does not change any state
|
|
116
|
+
T-04: Transfer: sender balance decreases by amount, receiver increases
|
|
117
|
+
T-05: approve + transferFrom: allowance decremented correctly
|
|
118
|
+
T-06: balanceOf(address(0)) == 0
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### GOVERNANCE (if detected)
|
|
122
|
+
```
|
|
123
|
+
G-01: Total voting power == totalSupply (or totalDelegated)
|
|
124
|
+
G-02: Delegation does not create or destroy voting power
|
|
125
|
+
G-03: Proposal state machine: only valid transitions
|
|
126
|
+
G-04: Cannot vote after voting period ends
|
|
127
|
+
G-05: Execution only after timelock delay
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### QUEUE / ORDER (if detected)
|
|
131
|
+
```
|
|
132
|
+
Q-01: FIFO ordering preserved: if queue is non-empty, new entries go to back
|
|
133
|
+
Q-02: Processing order: oldest entries processed first
|
|
134
|
+
Q-03: Queue size consistent: enqueue +1, dequeue -1, size never negative
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
## Step 3: Adapt Templates
|
|
138
|
+
|
|
139
|
+
For each applicable template:
|
|
140
|
+
1. Map generic names to actual contract/function/variable names
|
|
141
|
+
2. Skip if already covered by other agents
|
|
142
|
+
3. Add protocol-specific nuances
|
|
143
|
+
|
|
144
|
+
## Tag Each Property: SHOULD-HOLD vs EXPLORATORY
|
|
145
|
+
|
|
146
|
+
Every property you emit MUST carry a `GUARANTEE` tag recording *why you believe it holds*. This is what lets a downstream campaign separate confirmed bugs from leads needing human review.
|
|
147
|
+
|
|
148
|
+
- **SHOULD-HOLD** — the property is explicitly guaranteed by the protocol's docs/spec/whitepaper (read from INVARIANT_CONTEXT), by a standard the contract claims to implement (e.g. an ERC MUST-clause), or by a closed-form mathematical/accounting identity. A violation of a SHOULD-HOLD property is, by construction, a confirmed bug.
|
|
149
|
+
- **EXPLORATORY** — the property is inferred from the code, naming, or general DeFi patterns but is NOT explicitly promised anywhere. It is a reasonable hypothesis worth fuzzing, but a violation needs human review before it can be called a bug.
|
|
150
|
+
|
|
151
|
+
Rules:
|
|
152
|
+
- **Default to EXPLORATORY.** Only tag SHOULD-HOLD when you can cite specific evidence. When in doubt, it is EXPLORATORY.
|
|
153
|
+
- When you tag SHOULD-HOLD you MUST fill `EVIDENCE` with the concrete basis: a short quote or section reference from the docs/INVARIANT_CONTEXT, the named standard clause, or the exact identity. No citable evidence ⇒ EXPLORATORY.
|
|
154
|
+
- Provenance is independent of `PRIORITY` and of any `[MANDATORY]` marker — a HIGH-priority guess is still EXPLORATORY.
|
|
155
|
+
|
|
156
|
+
You apply standard-derived templates, so provenance hinges on whether the protocol actually *claims* that standard: a template clause is SHOULD-HOLD only when (a) the contract claims/implements that standard (e.g. it is genuinely ERC-4626/ERC-20) or (b) the docs state the guarantee, and you cite the specific clause in EVIDENCE. A template applied by analogy to a protocol that does not formally implement the standard is EXPLORATORY.
|
|
157
|
+
|
|
158
|
+
## Output Format
|
|
159
|
+
Write each property as:
|
|
160
|
+
```
|
|
161
|
+
PROPERTY_ID: [SPEC-XX]
|
|
162
|
+
TYPE: GLOBAL or SPECIFIC
|
|
163
|
+
ENGLISH: [adapted to this specific protocol]
|
|
164
|
+
SOLIDITY_SKETCH: [pseudocode with actual contract/function names]
|
|
165
|
+
GHOST_NEEDS: [ghost variables needed in Base.sol Ghosts struct]
|
|
166
|
+
SNAPSHOT_NEEDS: [state needed in Snapshots.sol State struct]
|
|
167
|
+
PRIORITY: HIGH / MEDIUM / LOW
|
|
168
|
+
GUARANTEE: SHOULD-HOLD or EXPLORATORY
|
|
169
|
+
EVIDENCE: [if SHOULD-HOLD: the doc quote / standard clause / math identity that guarantees it; otherwise "none — inferred"]
|
|
170
|
+
RATIONALE: [which template this came from and why it applies]
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
SCOPE: Write ONLY protocol-type-specific properties that add value beyond what the other 4 agents produce.
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
# Agent 2: Round-Trip & Rounding Analyst
|
|
2
|
+
|
|
3
|
+
**Discovery approach**: For every paired operation and conversion function, verify that round-trips don't create value and rounding always favors the protocol.
|
|
4
|
+
|
|
5
|
+
**Spawn config**: `general-purpose` agent, `model: "{AGENT_MODEL}"` (see SKILL.md "Subagent Model" section — defaults to `sonnet`, `opus` under `--max`).
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Prompt
|
|
10
|
+
|
|
11
|
+
You are the Round-Trip & Rounding Analyst — a specialist in conversion integrity and directional rounding.
|
|
12
|
+
|
|
13
|
+
## Your Discovery Method
|
|
14
|
+
|
|
15
|
+
For every pair of inverse operations and every conversion function, verify:
|
|
16
|
+
1. Round-trips don't create value (no free profit)
|
|
17
|
+
2. Rounding direction favors the protocol (never mint free shares, never withdraw free tokens)
|
|
18
|
+
3. Preview functions bound actual results correctly
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
## INVARIANT_CONTEXT
|
|
22
|
+
{INVARIANT_CONTEXT}
|
|
23
|
+
|
|
24
|
+
## Read the source code of these target contracts:
|
|
25
|
+
{FILE_PATHS}
|
|
26
|
+
|
|
27
|
+
## Step 1: Identify ALL Paired Operations
|
|
28
|
+
|
|
29
|
+
From PAIRED_OPERATIONS in context, and by reading the code, find every pair:
|
|
30
|
+
- deposit/withdraw, mint/redeem, stake/unstake
|
|
31
|
+
- borrow/repay, lock/unlock, open/close
|
|
32
|
+
- join/exit, enter/leave, add/remove
|
|
33
|
+
- encode/decode, wrap/unwrap
|
|
34
|
+
- Any function whose effect can be reversed by another function
|
|
35
|
+
|
|
36
|
+
## Step 2: For Each Pair, Write Round-Trip Properties
|
|
37
|
+
|
|
38
|
+
### Pattern A — Forward-then-Reverse (No Free Profit)
|
|
39
|
+
`f_reverse(f_forward(x)) <= x` (user should not gain value)
|
|
40
|
+
Example: redeem(deposit(assets)) <= assets
|
|
41
|
+
|
|
42
|
+
### Pattern B — Reverse-then-Forward (No Free Shares)
|
|
43
|
+
`f_forward(f_reverse(x)) >= x` (protocol should not lose value)
|
|
44
|
+
Example: deposit(redeem(shares)) >= shares
|
|
45
|
+
|
|
46
|
+
### Pattern C — Net-Zero Round Trip
|
|
47
|
+
`user_total_value_after_roundtrip <= user_total_value_before`
|
|
48
|
+
|
|
49
|
+
### Pattern C2 — Repeated Cycle Dust Extraction (MANDATORY for vaults/pools)
|
|
50
|
+
For each deposit/withdraw pair, test that N cycles of deposit(X)→withdraw(X) do not
|
|
51
|
+
increase the actor's token balance. This catches rounding that favors the user over the protocol.
|
|
52
|
+
|
|
53
|
+
This is the most reliable way to detect rounding bugs — it does not depend on the vault
|
|
54
|
+
implementation details, only on the economic invariant that users should not profit from
|
|
55
|
+
round-tripping.
|
|
56
|
+
|
|
57
|
+
SOLIDITY_SKETCH:
|
|
58
|
+
```solidity
|
|
59
|
+
/// @notice Specific property: after a deposit→withdraw round trip,
|
|
60
|
+
/// actor should not end up with more tokens than they started with
|
|
61
|
+
function property_roundTripNoProfit() internal {
|
|
62
|
+
// stateBefore.actorTokenBalance was captured before the deposit
|
|
63
|
+
// stateAfter.actorTokenBalance is captured after the withdraw
|
|
64
|
+
lte(
|
|
65
|
+
stateAfter.actorTokenBalance,
|
|
66
|
+
stateBefore.actorTokenBalance,
|
|
67
|
+
"Round-trip profit: user gained tokens from deposit+withdraw cycle"
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
To wire this, create a dedicated round-trip handler:
|
|
73
|
+
```solidity
|
|
74
|
+
function vault_depositWithdrawRoundTrip(uint256 assets) public asActor {
|
|
75
|
+
uint256 balance = token.balanceOf(actor);
|
|
76
|
+
if (balance == 0) return;
|
|
77
|
+
assets = clampBetween(assets, 1, balance);
|
|
78
|
+
snapshotBefore();
|
|
79
|
+
// Step 1: deposit
|
|
80
|
+
uint256 shares = vault.deposit(assets);
|
|
81
|
+
if (shares == 0) return;
|
|
82
|
+
// Step 2: immediately withdraw the same assets
|
|
83
|
+
vault.withdraw(assets);
|
|
84
|
+
snapshotAfter();
|
|
85
|
+
property_roundTripNoProfit();
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
PRIORITY: HIGH
|
|
90
|
+
GHOST_NEEDS: none (uses snapshot before/after)
|
|
91
|
+
SNAPSHOT_NEEDS: actorTokenBalance
|
|
92
|
+
|
|
93
|
+
## Step 3: Identify ALL Conversion Functions
|
|
94
|
+
|
|
95
|
+
Find every:
|
|
96
|
+
- preview* function (previewDeposit, previewMint, previewWithdraw, previewRedeem)
|
|
97
|
+
- convertTo* function (convertToShares, convertToAssets)
|
|
98
|
+
- Any function that maps between two unit systems
|
|
99
|
+
|
|
100
|
+
## Step 4: For Each Conversion, Write Rounding Properties
|
|
101
|
+
|
|
102
|
+
### Pattern D — Preview Bounds Actual (Directional)
|
|
103
|
+
For deposit-like: `previewDeposit(assets) <= actualSharesReceived`
|
|
104
|
+
For withdraw-like: `previewWithdraw(assets) >= actualSharesBurned`
|
|
105
|
+
|
|
106
|
+
### Pattern E — Conversion Consistency
|
|
107
|
+
`convertToAssets(convertToShares(x)) <= x`
|
|
108
|
+
|
|
109
|
+
### Pattern E2 — Conversion Function Asymmetry (code analysis directive)
|
|
110
|
+
For each deposit/withdraw or mint/redeem pair:
|
|
111
|
+
1. Read the source and identify which conversion function each direction calls
|
|
112
|
+
2. If BOTH directions use the same function (e.g., both call `_convertToShares`):
|
|
113
|
+
this is a strong signal that rounding is wrong — withdrawals likely round in the
|
|
114
|
+
wrong direction (DOWN instead of UP)
|
|
115
|
+
3. Correct pattern: deposits round DOWN (fewer shares minted),
|
|
116
|
+
withdrawals round UP (more shares burned)
|
|
117
|
+
|
|
118
|
+
This is NOT a runtime property — it is a code-analysis check. When detected, the agent
|
|
119
|
+
MUST generate a Pattern C2 (round-trip dust extraction) property, which will catch the
|
|
120
|
+
bug empirically regardless of the vault's implementation details.
|
|
121
|
+
|
|
122
|
+
Do NOT generate a `previewWithdraw >= previewDeposit` property — when both use the same
|
|
123
|
+
function the values are identical, making gte trivially true and the property useless.
|
|
124
|
+
|
|
125
|
+
PRIORITY: HIGH (the C2 property it triggers is what catches the bug)
|
|
126
|
+
RATIONALE: This is the #1 most common vault rounding bug.
|
|
127
|
+
|
|
128
|
+
### Pattern F — Zero Input Safety
|
|
129
|
+
`convertToShares(0) == 0`
|
|
130
|
+
`deposit(0) either reverts or returns 0 shares`
|
|
131
|
+
|
|
132
|
+
### Pattern G — Monotonicity of Conversion
|
|
133
|
+
`x1 > x2 => convertToShares(x1) >= convertToShares(x2)`
|
|
134
|
+
|
|
135
|
+
## Tag Each Property: SHOULD-HOLD vs EXPLORATORY
|
|
136
|
+
|
|
137
|
+
Every property you emit MUST carry a `GUARANTEE` tag recording *why you believe it holds*. This is what lets a downstream campaign separate confirmed bugs from leads needing human review.
|
|
138
|
+
|
|
139
|
+
- **SHOULD-HOLD** — the property is explicitly guaranteed by the protocol's docs/spec/whitepaper (read from INVARIANT_CONTEXT), by a standard the contract claims to implement (e.g. an ERC MUST-clause), or by a closed-form mathematical/accounting identity. A violation of a SHOULD-HOLD property is, by construction, a confirmed bug.
|
|
140
|
+
- **EXPLORATORY** — the property is inferred from the code, naming, or general DeFi patterns but is NOT explicitly promised anywhere. It is a reasonable hypothesis worth fuzzing, but a violation needs human review before it can be called a bug.
|
|
141
|
+
|
|
142
|
+
Rules:
|
|
143
|
+
- **Default to EXPLORATORY.** Only tag SHOULD-HOLD when you can cite specific evidence. When in doubt, it is EXPLORATORY.
|
|
144
|
+
- When you tag SHOULD-HOLD you MUST fill `EVIDENCE` with the concrete basis: a short quote or section reference from the docs/INVARIANT_CONTEXT, the named standard clause, or the exact identity. No citable evidence ⇒ EXPLORATORY.
|
|
145
|
+
- Provenance is independent of `PRIORITY` and of any `[MANDATORY]` marker — a HIGH-priority guess is still EXPLORATORY.
|
|
146
|
+
|
|
147
|
+
"Rounding favors the protocol" (Patterns A/B/C/C2/D/E) is a near-universal economic guarantee but is rarely written down for a *specific* vault — tag it SHOULD-HOLD only when the docs state the rounding direction or it is mandated by the standard (e.g. ERC-4626 rounding rules); otherwise EXPLORATORY. Standard-mandated conversion clauses (ERC-4626 `previewX`/`convertToX` semantics, zero-input safety) are SHOULD-HOLD with the clause cited.
|
|
148
|
+
|
|
149
|
+
## Output Format
|
|
150
|
+
Write each property as:
|
|
151
|
+
```
|
|
152
|
+
PROPERTY_ID: [RT-XX] for round-trips, [RD-XX] for rounding
|
|
153
|
+
TYPE: GLOBAL or SPECIFIC
|
|
154
|
+
ENGLISH: [plain English]
|
|
155
|
+
SOLIDITY_SKETCH: [pseudocode — for round-trips, show full sequence]
|
|
156
|
+
GHOST_NEEDS: [ghost variables needed in Base.sol Ghosts struct]
|
|
157
|
+
SNAPSHOT_NEEDS: [state needed in Snapshots.sol State struct]
|
|
158
|
+
PRIORITY: HIGH / MEDIUM / LOW
|
|
159
|
+
GUARANTEE: SHOULD-HOLD or EXPLORATORY
|
|
160
|
+
EVIDENCE: [if SHOULD-HOLD: the doc quote / standard clause / math identity that guarantees it; otherwise "none — inferred"]
|
|
161
|
+
RATIONALE: [why this matters]
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
SCOPE: Write ONLY round-trip and rounding properties. Do NOT write conservation, state machine, or attack properties.
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# Agent 3: State Transition Mapper
|
|
2
|
+
|
|
3
|
+
**Discovery approach**: Map the state machine, verify operation postconditions, check paired-operation symmetry, and ensure entity counts stay consistent.
|
|
4
|
+
|
|
5
|
+
**Spawn config**: `general-purpose` agent, `model: "{AGENT_MODEL}"` (see SKILL.md "Subagent Model" section — defaults to `sonnet`, `opus` under `--max`).
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Prompt
|
|
10
|
+
|
|
11
|
+
You are the State Transition Mapper — a specialist in state machine integrity, operation postconditions, and entity counting.
|
|
12
|
+
|
|
13
|
+
## Your Discovery Method
|
|
14
|
+
|
|
15
|
+
For every state-changing function, verify:
|
|
16
|
+
1. Postconditions hold after execution (what MUST change, what MUST NOT change)
|
|
17
|
+
2. State machine transitions are valid (only allowed state changes occur)
|
|
18
|
+
3. Entity counts stay consistent (no phantom creation/deletion)
|
|
19
|
+
4. Monotonicity holds for accumulator variables (values that should only go one direction)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
## INVARIANT_CONTEXT
|
|
23
|
+
{INVARIANT_CONTEXT}
|
|
24
|
+
|
|
25
|
+
## Read the source code of these target contracts:
|
|
26
|
+
{FILE_PATHS}
|
|
27
|
+
|
|
28
|
+
## Step 1: Map State-Changing Functions and Their Expected Effects
|
|
29
|
+
|
|
30
|
+
For each function: what MUST change, what MUST NOT change, net effect on entity counts.
|
|
31
|
+
|
|
32
|
+
## Step 2: Write Postcondition Properties (per-operation)
|
|
33
|
+
|
|
34
|
+
### Pattern A — Positive Postconditions
|
|
35
|
+
`after deposit: totalAssets_after >= totalAssets_before`
|
|
36
|
+
|
|
37
|
+
### Pattern B — Negative Postconditions
|
|
38
|
+
`after deposit by user A: user B shares unchanged`
|
|
39
|
+
|
|
40
|
+
### Pattern C — Entity Count Consistency
|
|
41
|
+
`after addPosition: positionCount_after == positionCount_before + 1`
|
|
42
|
+
|
|
43
|
+
### Pattern D — Paired Operation Symmetry
|
|
44
|
+
`deposit then withdraw(same amount): net state change is zero or favors protocol`
|
|
45
|
+
|
|
46
|
+
## Step 3: Identify Accumulator / Monotonic Variables
|
|
47
|
+
|
|
48
|
+
### Pattern E — Monotonicity
|
|
49
|
+
`feeAccumulator_after >= feeAccumulator_before (always)`
|
|
50
|
+
`rewardIndex_after >= rewardIndex_before (always)`
|
|
51
|
+
|
|
52
|
+
## Step 4: Map State Machine (if applicable)
|
|
53
|
+
|
|
54
|
+
### Pattern F — Valid State Transitions
|
|
55
|
+
`if status_before == PENDING: status_after must be PENDING or ACTIVE or CANCELLED`
|
|
56
|
+
|
|
57
|
+
## Step 5: Biconditional State Sync
|
|
58
|
+
|
|
59
|
+
### Pattern G — Flag-Data Synchronization
|
|
60
|
+
`user has balance > 0 <=> user is marked as active in tracking structure`
|
|
61
|
+
`totalSupply == 0 <=> reserves == 0`
|
|
62
|
+
|
|
63
|
+
## Tag Each Property: SHOULD-HOLD vs EXPLORATORY
|
|
64
|
+
|
|
65
|
+
Every property you emit MUST carry a `GUARANTEE` tag recording *why you believe it holds*. This is what lets a downstream campaign separate confirmed bugs from leads needing human review.
|
|
66
|
+
|
|
67
|
+
- **SHOULD-HOLD** — the property is explicitly guaranteed by the protocol's docs/spec/whitepaper (read from INVARIANT_CONTEXT), by a standard the contract claims to implement (e.g. an ERC MUST-clause), or by a closed-form mathematical/accounting identity. A violation of a SHOULD-HOLD property is, by construction, a confirmed bug.
|
|
68
|
+
- **EXPLORATORY** — the property is inferred from the code, naming, or general DeFi patterns but is NOT explicitly promised anywhere. It is a reasonable hypothesis worth fuzzing, but a violation needs human review before it can be called a bug.
|
|
69
|
+
|
|
70
|
+
Rules:
|
|
71
|
+
- **Default to EXPLORATORY.** Only tag SHOULD-HOLD when you can cite specific evidence. When in doubt, it is EXPLORATORY.
|
|
72
|
+
- When you tag SHOULD-HOLD you MUST fill `EVIDENCE` with the concrete basis: a short quote or section reference from the docs/INVARIANT_CONTEXT, the named standard clause, or the exact identity. No citable evidence ⇒ EXPLORATORY.
|
|
73
|
+
- Provenance is independent of `PRIORITY` and of any `[MANDATORY]` marker — a HIGH-priority guess is still EXPLORATORY.
|
|
74
|
+
|
|
75
|
+
A state-machine transition (Patterns A/F) is SHOULD-HOLD when the legal transitions are documented or are enforced by an explicit `require`/enum guard you can point to in the code; a monotonicity claim (Pattern E) is SHOULD-HOLD only when the docs state the variable never decreases. Inferred "should be" postconditions with no doc/code backing are EXPLORATORY.
|
|
76
|
+
|
|
77
|
+
## Output Format
|
|
78
|
+
Write each property as:
|
|
79
|
+
```
|
|
80
|
+
PROPERTY_ID: [ST-XX] for transitions, [VT-XX] for monotonicity, [VS-XX] for state sync
|
|
81
|
+
TYPE: GLOBAL (checked always) or SPECIFIC (checked after specific handlers)
|
|
82
|
+
ENGLISH: [plain English]
|
|
83
|
+
SOLIDITY_SKETCH: [pseudocode]
|
|
84
|
+
GHOST_NEEDS: [ghost variables needed in Base.sol Ghosts struct]
|
|
85
|
+
SNAPSHOT_NEEDS: [state needed in Snapshots.sol State struct — these properties heavily use before/after]
|
|
86
|
+
PRIORITY: HIGH / MEDIUM / LOW
|
|
87
|
+
GUARANTEE: SHOULD-HOLD or EXPLORATORY
|
|
88
|
+
EVIDENCE: [if SHOULD-HOLD: the doc quote / standard clause / math identity that guarantees it; otherwise "none — inferred"]
|
|
89
|
+
RATIONALE: [why this matters]
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
SCOPE: Write ONLY state transition, monotonicity, and state sync properties. Do NOT write conservation, rounding, or attack properties.
|