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,223 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Unlicense
|
|
2
|
+
pragma solidity >=0.6.2 <0.9.0;
|
|
3
|
+
|
|
4
|
+
import {Logger} from "./Logger.sol";
|
|
5
|
+
import {StringUtils} from "./StringUtils.sol";
|
|
6
|
+
|
|
7
|
+
/// @author Modified from Crytic (https://github.com/crytic/properties/blob/main/contracts/util/PropertiesAsserts.sol)
|
|
8
|
+
contract Clamp is StringUtils {
|
|
9
|
+
/// @notice Clamps value to be between low and high, both inclusive
|
|
10
|
+
function clampBetween(
|
|
11
|
+
uint256 value,
|
|
12
|
+
uint256 low,
|
|
13
|
+
uint256 high
|
|
14
|
+
) internal returns (uint256) {
|
|
15
|
+
if (value < low || value > high) {
|
|
16
|
+
uint256 range = high - low;
|
|
17
|
+
uint256 ans = low + (value % (range + 1));
|
|
18
|
+
// When range == type(uint256).max (low=0, high=max), range+1 overflows
|
|
19
|
+
// to 0 causing division by zero. In that case any value is already in
|
|
20
|
+
// range, so this branch is only reachable when range < type(uint256).max.
|
|
21
|
+
string memory valueStr = toString(value);
|
|
22
|
+
string memory ansStr = toString(ans);
|
|
23
|
+
bytes memory message = abi.encodePacked(
|
|
24
|
+
"Clamping value ",
|
|
25
|
+
valueStr,
|
|
26
|
+
" to ",
|
|
27
|
+
ansStr
|
|
28
|
+
);
|
|
29
|
+
Logger.logString(string(message));
|
|
30
|
+
return ans;
|
|
31
|
+
}
|
|
32
|
+
return value;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/// @notice int256 version of clampBetween
|
|
36
|
+
function clampBetween(
|
|
37
|
+
int256 value,
|
|
38
|
+
int256 low,
|
|
39
|
+
int256 high
|
|
40
|
+
) internal returns (int256) {
|
|
41
|
+
if (value < low || value > high) {
|
|
42
|
+
int range = high - low + 1;
|
|
43
|
+
int clamped = (value - low) % (range);
|
|
44
|
+
if (clamped < 0) clamped += range;
|
|
45
|
+
int ans = low + clamped;
|
|
46
|
+
string memory valueStr = toString(value);
|
|
47
|
+
string memory ansStr = toString(ans);
|
|
48
|
+
bytes memory message = abi.encodePacked(
|
|
49
|
+
"Clamping value ",
|
|
50
|
+
valueStr,
|
|
51
|
+
" to ",
|
|
52
|
+
ansStr
|
|
53
|
+
);
|
|
54
|
+
Logger.logString(string(message));
|
|
55
|
+
return ans;
|
|
56
|
+
}
|
|
57
|
+
return value;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/// @notice clamps a to be less than b
|
|
61
|
+
function clampLt(uint256 a, uint256 b) internal returns (uint256) {
|
|
62
|
+
if (!(a < b)) {
|
|
63
|
+
if(b == 0) {
|
|
64
|
+
Logger.logString("clampLt cannot clamp value a to be less than zero. Check your inputs/assumptions.");
|
|
65
|
+
assert(false);
|
|
66
|
+
}
|
|
67
|
+
uint256 value = a % b;
|
|
68
|
+
string memory aStr = toString(a);
|
|
69
|
+
string memory valueStr = toString(value);
|
|
70
|
+
bytes memory message = abi.encodePacked(
|
|
71
|
+
"Clamping value ",
|
|
72
|
+
aStr,
|
|
73
|
+
" to ",
|
|
74
|
+
valueStr
|
|
75
|
+
);
|
|
76
|
+
Logger.logString(string(message));
|
|
77
|
+
return value;
|
|
78
|
+
}
|
|
79
|
+
return a;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/// @notice int256 version of clampLt
|
|
83
|
+
function clampLt(int256 a, int256 b) internal returns (int256) {
|
|
84
|
+
if (!(a < b)) {
|
|
85
|
+
if (b == type(int256).min) {
|
|
86
|
+
Logger.logString("clampLt cannot clamp value a to be less than int256.min. Check your inputs/assumptions.");
|
|
87
|
+
assert(false);
|
|
88
|
+
}
|
|
89
|
+
int256 value = b - 1;
|
|
90
|
+
string memory aStr = toString(a);
|
|
91
|
+
string memory valueStr = toString(value);
|
|
92
|
+
bytes memory message = abi.encodePacked(
|
|
93
|
+
"Clamping value ",
|
|
94
|
+
aStr,
|
|
95
|
+
" to ",
|
|
96
|
+
valueStr
|
|
97
|
+
);
|
|
98
|
+
Logger.logString(string(message));
|
|
99
|
+
return value;
|
|
100
|
+
}
|
|
101
|
+
return a;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/// @notice clamps a to be less than or equal to b
|
|
105
|
+
function clampLte(uint256 a, uint256 b) internal returns (uint256) {
|
|
106
|
+
if (!(a <= b)) {
|
|
107
|
+
// When b == type(uint256).max, a <= b is always true so this
|
|
108
|
+
// branch is unreachable. Safe to use b + 1 without overflow.
|
|
109
|
+
uint256 value = a % (b + 1);
|
|
110
|
+
string memory aStr = toString(a);
|
|
111
|
+
string memory valueStr = toString(value);
|
|
112
|
+
bytes memory message = abi.encodePacked(
|
|
113
|
+
"Clamping value ",
|
|
114
|
+
aStr,
|
|
115
|
+
" to ",
|
|
116
|
+
valueStr
|
|
117
|
+
);
|
|
118
|
+
Logger.logString(string(message));
|
|
119
|
+
return value;
|
|
120
|
+
}
|
|
121
|
+
return a;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/// @notice int256 version of clampLte
|
|
125
|
+
function clampLte(int256 a, int256 b) internal returns (int256) {
|
|
126
|
+
if (!(a <= b)) {
|
|
127
|
+
int256 value = b;
|
|
128
|
+
string memory aStr = toString(a);
|
|
129
|
+
string memory valueStr = toString(value);
|
|
130
|
+
bytes memory message = abi.encodePacked(
|
|
131
|
+
"Clamping value ",
|
|
132
|
+
aStr,
|
|
133
|
+
" to ",
|
|
134
|
+
valueStr
|
|
135
|
+
);
|
|
136
|
+
Logger.logString(string(message));
|
|
137
|
+
return value;
|
|
138
|
+
}
|
|
139
|
+
return a;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/// @notice clamps a to be greater than b
|
|
143
|
+
function clampGt(uint256 a, uint256 b) internal returns (uint256) {
|
|
144
|
+
if (!(a > b)) {
|
|
145
|
+
if (b == type(uint256).max) {
|
|
146
|
+
Logger.logString("clampGt cannot clamp value a to be larger than uint256.max. Check your inputs/assumptions.");
|
|
147
|
+
assert(false);
|
|
148
|
+
}
|
|
149
|
+
uint256 value = b + 1;
|
|
150
|
+
string memory aStr = toString(a);
|
|
151
|
+
string memory valueStr = toString(value);
|
|
152
|
+
bytes memory message = abi.encodePacked(
|
|
153
|
+
"Clamping value ",
|
|
154
|
+
aStr,
|
|
155
|
+
" to ",
|
|
156
|
+
valueStr
|
|
157
|
+
);
|
|
158
|
+
Logger.logString(string(message));
|
|
159
|
+
return value;
|
|
160
|
+
} else {
|
|
161
|
+
return a;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/// @notice int256 version of clampGt
|
|
166
|
+
function clampGt(int256 a, int256 b) internal returns (int256) {
|
|
167
|
+
if (!(a > b)) {
|
|
168
|
+
if (b == type(int256).max) {
|
|
169
|
+
Logger.logString("clampGt cannot clamp value a to be larger than int256.max. Check your inputs/assumptions.");
|
|
170
|
+
assert(false);
|
|
171
|
+
}
|
|
172
|
+
int256 value = b + 1;
|
|
173
|
+
string memory aStr = toString(a);
|
|
174
|
+
string memory valueStr = toString(value);
|
|
175
|
+
bytes memory message = abi.encodePacked(
|
|
176
|
+
"Clamping value ",
|
|
177
|
+
aStr,
|
|
178
|
+
" to ",
|
|
179
|
+
valueStr
|
|
180
|
+
);
|
|
181
|
+
Logger.logString(string(message));
|
|
182
|
+
return value;
|
|
183
|
+
} else {
|
|
184
|
+
return a;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/// @notice clamps a to be greater than or equal to b
|
|
189
|
+
function clampGte(uint256 a, uint256 b) internal returns (uint256) {
|
|
190
|
+
if (!(a >= b)) {
|
|
191
|
+
uint256 value = b;
|
|
192
|
+
string memory aStr = toString(a);
|
|
193
|
+
string memory valueStr = toString(value);
|
|
194
|
+
bytes memory message = abi.encodePacked(
|
|
195
|
+
"Clamping value ",
|
|
196
|
+
aStr,
|
|
197
|
+
" to ",
|
|
198
|
+
valueStr
|
|
199
|
+
);
|
|
200
|
+
Logger.logString(string(message));
|
|
201
|
+
return value;
|
|
202
|
+
}
|
|
203
|
+
return a;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/// @notice int256 version of clampGte
|
|
207
|
+
function clampGte(int256 a, int256 b) internal returns (int256) {
|
|
208
|
+
if (!(a >= b)) {
|
|
209
|
+
int256 value = b;
|
|
210
|
+
string memory aStr = toString(a);
|
|
211
|
+
string memory valueStr = toString(value);
|
|
212
|
+
bytes memory message = abi.encodePacked(
|
|
213
|
+
"Clamping value ",
|
|
214
|
+
aStr,
|
|
215
|
+
" to ",
|
|
216
|
+
valueStr
|
|
217
|
+
);
|
|
218
|
+
Logger.logString(string(message));
|
|
219
|
+
return value;
|
|
220
|
+
}
|
|
221
|
+
return a;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
// SPDX-License-Identifier: UNLICENSED
|
|
2
|
+
pragma solidity >=0.6.2 <0.9.0;
|
|
3
|
+
|
|
4
|
+
library DecimalPrinter {
|
|
5
|
+
function toDec(uint256 _value) public pure returns (string memory) {
|
|
6
|
+
return toDec(_value, 18);
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
function toDec(int256 _value) public pure returns (string memory) {
|
|
10
|
+
return toDec(_value, 18);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
function toDec(uint256 _value, uint256 decimals) public pure returns (string memory) {
|
|
14
|
+
uint256 base = 10**decimals;
|
|
15
|
+
uint256 integerPart = _value / base;
|
|
16
|
+
uint256 fractionalPart = _value % base;
|
|
17
|
+
|
|
18
|
+
string memory integerPartStr = uintToStr(integerPart);
|
|
19
|
+
string memory fractionalPartStr = uintToStr(fractionalPart);
|
|
20
|
+
|
|
21
|
+
// Pad fractional part with leading zeros if necessary
|
|
22
|
+
uint256 numZeros = decimals - bytes(fractionalPartStr).length;
|
|
23
|
+
for (uint256 i = 0; i < numZeros; i++) {
|
|
24
|
+
fractionalPartStr = string(abi.encodePacked("0", fractionalPartStr));
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
string memory result = string(abi.encodePacked(integerPartStr, ".", fractionalPartStr));
|
|
28
|
+
|
|
29
|
+
return result;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function toDec(int256 _value, uint256 decimals) public pure returns (string memory) {
|
|
33
|
+
if (_value < 0) {
|
|
34
|
+
return string(abi.encodePacked("-", toDec(uint256(-_value), decimals)));
|
|
35
|
+
} else {
|
|
36
|
+
return toDec(uint256(_value), decimals);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function uintToStr(uint256 _value) private pure returns (string memory) {
|
|
41
|
+
if (_value == 0) {
|
|
42
|
+
return "0";
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
uint256 temp = _value;
|
|
46
|
+
uint256 digits;
|
|
47
|
+
|
|
48
|
+
while (temp != 0) {
|
|
49
|
+
digits++;
|
|
50
|
+
temp /= 10;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
bytes memory buffer = new bytes(digits);
|
|
54
|
+
|
|
55
|
+
while (_value != 0) {
|
|
56
|
+
digits--;
|
|
57
|
+
buffer[digits] = bytes1(uint8(48 + _value % 10));
|
|
58
|
+
_value /= 10;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
return string(buffer);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity >=0.6.2 <0.9.0;
|
|
3
|
+
|
|
4
|
+
// Source: https://solidity-by-example.org/app/deploy-any-contract/
|
|
5
|
+
|
|
6
|
+
contract Deployer {
|
|
7
|
+
function deploy(bytes memory _code) internal returns (address addr) {
|
|
8
|
+
return deploy(_code, 0);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
function deploy(bytes memory _code, uint256 _value) internal returns (address addr) {
|
|
12
|
+
assembly {
|
|
13
|
+
addr := create(_value, add(_code, 0x20), mload(_code))
|
|
14
|
+
}
|
|
15
|
+
require(addr != address(0), "Deployer.sol: deploy failed");
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
// OpenZeppelin Contracts (last updated v5.0.0) (utils/structs/EnumerableSet.sol)
|
|
3
|
+
pragma solidity >=0.6.2 <0.9.0;
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @dev Library for managing
|
|
7
|
+
* https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
|
|
8
|
+
* types.
|
|
9
|
+
*
|
|
10
|
+
* Sets have the following properties:
|
|
11
|
+
*
|
|
12
|
+
* - Elements are added, removed, and checked for existence in constant time
|
|
13
|
+
* (O(1)).
|
|
14
|
+
* - Elements are enumerated in O(n). No guarantees are made on the ordering.
|
|
15
|
+
*
|
|
16
|
+
* ```solidity
|
|
17
|
+
* contract Example {
|
|
18
|
+
* // Add the library methods
|
|
19
|
+
* using EnumerableSet for EnumerableSet.AddressSet;
|
|
20
|
+
*
|
|
21
|
+
* // Declare a set state variable
|
|
22
|
+
* EnumerableSet.AddressSet private mySet;
|
|
23
|
+
* }
|
|
24
|
+
* ```
|
|
25
|
+
*
|
|
26
|
+
* As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
|
|
27
|
+
* and `uint256` (`UintSet`) are supported.
|
|
28
|
+
*
|
|
29
|
+
* [WARNING]
|
|
30
|
+
* ====
|
|
31
|
+
* Trying to delete such a structure from storage will likely result in data corruption, rendering the structure
|
|
32
|
+
* unusable.
|
|
33
|
+
* See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.
|
|
34
|
+
*
|
|
35
|
+
* In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an
|
|
36
|
+
* array of EnumerableSet.
|
|
37
|
+
* ====
|
|
38
|
+
*/
|
|
39
|
+
library EnumerableSet {
|
|
40
|
+
struct Set {
|
|
41
|
+
bytes32[] _values;
|
|
42
|
+
mapping(bytes32 value => uint256) _positions;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function _add(Set storage set, bytes32 value) private returns (bool) {
|
|
46
|
+
if (!_contains(set, value)) {
|
|
47
|
+
set._values.push(value);
|
|
48
|
+
set._positions[value] = set._values.length;
|
|
49
|
+
return true;
|
|
50
|
+
} else {
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function _remove(Set storage set, bytes32 value) private returns (bool) {
|
|
56
|
+
uint256 position = set._positions[value];
|
|
57
|
+
|
|
58
|
+
if (position != 0) {
|
|
59
|
+
uint256 valueIndex = position - 1;
|
|
60
|
+
uint256 lastIndex = set._values.length - 1;
|
|
61
|
+
|
|
62
|
+
if (valueIndex != lastIndex) {
|
|
63
|
+
bytes32 lastValue = set._values[lastIndex];
|
|
64
|
+
set._values[valueIndex] = lastValue;
|
|
65
|
+
set._positions[lastValue] = position;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
set._values.pop();
|
|
69
|
+
delete set._positions[value];
|
|
70
|
+
|
|
71
|
+
return true;
|
|
72
|
+
} else {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function _contains(Set storage set, bytes32 value) private view returns (bool) {
|
|
78
|
+
return set._positions[value] != 0;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function _length(Set storage set) private view returns (uint256) {
|
|
82
|
+
return set._values.length;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function _at(Set storage set, uint256 index) private view returns (bytes32) {
|
|
86
|
+
return set._values[index];
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function _values(Set storage set) private view returns (bytes32[] memory) {
|
|
90
|
+
return set._values;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Bytes32Set
|
|
94
|
+
|
|
95
|
+
struct Bytes32Set {
|
|
96
|
+
Set _inner;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
|
|
100
|
+
return _add(set._inner, value);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
|
|
104
|
+
return _remove(set._inner, value);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
|
|
108
|
+
return _contains(set._inner, value);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function length(Bytes32Set storage set) internal view returns (uint256) {
|
|
112
|
+
return _length(set._inner);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
|
|
116
|
+
return _at(set._inner, index);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
|
|
120
|
+
bytes32[] memory store = _values(set._inner);
|
|
121
|
+
bytes32[] memory result;
|
|
122
|
+
|
|
123
|
+
/// @solidity memory-safe-assembly
|
|
124
|
+
assembly {
|
|
125
|
+
result := store
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
return result;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// AddressSet
|
|
132
|
+
|
|
133
|
+
struct AddressSet {
|
|
134
|
+
Set _inner;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function add(AddressSet storage set, address value) internal returns (bool) {
|
|
138
|
+
return _add(set._inner, bytes32(uint256(uint160(value))));
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
function remove(AddressSet storage set, address value) internal returns (bool) {
|
|
142
|
+
return _remove(set._inner, bytes32(uint256(uint160(value))));
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
function contains(AddressSet storage set, address value) internal view returns (bool) {
|
|
146
|
+
return _contains(set._inner, bytes32(uint256(uint160(value))));
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
function length(AddressSet storage set) internal view returns (uint256) {
|
|
150
|
+
return _length(set._inner);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
function at(AddressSet storage set, uint256 index) internal view returns (address) {
|
|
154
|
+
return address(uint160(uint256(_at(set._inner, index))));
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
function values(AddressSet storage set) internal view returns (address[] memory) {
|
|
158
|
+
bytes32[] memory store = _values(set._inner);
|
|
159
|
+
address[] memory result;
|
|
160
|
+
|
|
161
|
+
/// @solidity memory-safe-assembly
|
|
162
|
+
assembly {
|
|
163
|
+
result := store
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
return result;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// UintSet
|
|
170
|
+
|
|
171
|
+
struct UintSet {
|
|
172
|
+
Set _inner;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
function add(UintSet storage set, uint256 value) internal returns (bool) {
|
|
176
|
+
return _add(set._inner, bytes32(value));
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
function remove(UintSet storage set, uint256 value) internal returns (bool) {
|
|
180
|
+
return _remove(set._inner, bytes32(value));
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
function contains(UintSet storage set, uint256 value) internal view returns (bool) {
|
|
184
|
+
return _contains(set._inner, bytes32(value));
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
function length(UintSet storage set) internal view returns (uint256) {
|
|
188
|
+
return _length(set._inner);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
function at(UintSet storage set, uint256 index) internal view returns (uint256) {
|
|
192
|
+
return uint256(_at(set._inner, index));
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
function values(UintSet storage set) internal view returns (uint256[] memory) {
|
|
196
|
+
bytes32[] memory store = _values(set._inner);
|
|
197
|
+
uint256[] memory result;
|
|
198
|
+
|
|
199
|
+
/// @solidity memory-safe-assembly
|
|
200
|
+
assembly {
|
|
201
|
+
result := store
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
return result;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Unlicense
|
|
2
|
+
pragma solidity >=0.6.2 <0.9.0;
|
|
3
|
+
|
|
4
|
+
// source: https://github.com/crytic/properties/blob/main/contracts/util/IHevm.sol
|
|
5
|
+
|
|
6
|
+
interface IHevm {
|
|
7
|
+
// Set block.timestamp to newTimestamp
|
|
8
|
+
function warp(uint256 newTimestamp) external;
|
|
9
|
+
|
|
10
|
+
// Set block.number to newNumber
|
|
11
|
+
function roll(uint256 newNumber) external;
|
|
12
|
+
|
|
13
|
+
// Add the condition b to the assumption base for the current branch
|
|
14
|
+
// This function is almost identical to require
|
|
15
|
+
function assume(bool b) external;
|
|
16
|
+
|
|
17
|
+
// Sets the eth balance of usr to amt
|
|
18
|
+
function deal(address usr, uint256 amt) external;
|
|
19
|
+
|
|
20
|
+
// Loads a storage slot from an address
|
|
21
|
+
function load(address where, bytes32 slot) external returns (bytes32);
|
|
22
|
+
|
|
23
|
+
// Stores a value to an address' storage slot
|
|
24
|
+
function store(address where, bytes32 slot, bytes32 value) external;
|
|
25
|
+
|
|
26
|
+
// Signs data (privateKey, digest) => (v, r, s)
|
|
27
|
+
function sign(
|
|
28
|
+
uint256 privateKey,
|
|
29
|
+
bytes32 digest
|
|
30
|
+
) external returns (uint8 v, bytes32 r, bytes32 s);
|
|
31
|
+
|
|
32
|
+
// Gets address for a given private key
|
|
33
|
+
function addr(uint256 privateKey) external returns (address addr);
|
|
34
|
+
|
|
35
|
+
// Performs a foreign function call via terminal
|
|
36
|
+
function ffi(
|
|
37
|
+
string[] calldata inputs
|
|
38
|
+
) external returns (bytes memory result);
|
|
39
|
+
|
|
40
|
+
// Performs the next smart contract call with specified msg.sender
|
|
41
|
+
function prank(address newSender) external;
|
|
42
|
+
|
|
43
|
+
// Creates a new fork with the given endpoint and the latest block and returns the identifier of the fork
|
|
44
|
+
function createFork(string calldata urlOrAlias) external returns (uint256);
|
|
45
|
+
|
|
46
|
+
// Takes a fork identifier created by createFork and sets the corresponding forked state as active
|
|
47
|
+
function selectFork(uint256 forkId) external;
|
|
48
|
+
|
|
49
|
+
// Returns the identifier of the current fork
|
|
50
|
+
function activeFork() external returns (uint256);
|
|
51
|
+
|
|
52
|
+
// Labels the address in traces
|
|
53
|
+
function label(address addr, string calldata label) external;
|
|
54
|
+
|
|
55
|
+
// Sets msg.sender to the specified sender until stopPrank() is called
|
|
56
|
+
function startPrank(address sender) external;
|
|
57
|
+
|
|
58
|
+
// Resets msg.sender to the default sender
|
|
59
|
+
function stopPrank() external;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
IHevm constant vm = IHevm(0x7109709ECfa91a80626fF3989D68f67F5b1DD12D);
|