Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Review and analyze a Cantina bug bounty report against codebase, docs, audits, scope, and severity
.claude/skills/lifinance-review-bounty-report/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-08 | ✗→✓ | ▲ Improved | 115% | 0% |
| case-14 | ✗→✓ | ▲ Improved | 263% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 194% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 153% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 143% | 0% |
> Usage: /review-bounty-report (then paste the bug bounty report and any platform AI analysis into the chat)
Perform a structured, skeptical review of a Cantina bug bounty submission. Challenge every claim (vulnerability, impact, scope, severity, fix). Use the codebase, docs, audit metadata, and external protocol docs as sources of truth. Output is log only (no file written).
Audit PDFs: The agent cannot read PDFs from the repo. Use audit/auditLog.json to identify relevant audits. If the report concerns an audited contract, list those audit report paths and add a Manual task to open the PDF(s) and check for the same/similar findings. If the user attaches or pastes audit report text, use it in the comparison.
Program reference: https://cantina.xyz/code/260585d8-a3e8-4d70-8077-b6f3f5f0391b/overview
github.com/lifinance/contracts, latest commit, files src/**/*.sol./archive; Lightchaser automated list; duplicates; atomic tx reverts; precision/dust reverts in integrations; third-party protocol bugs; known doc'd issues; test code; user error; theoretical no PoC; under remediation.Impact (by % of daily total user transfers across all EVM chains):
Impact when only a subset is at risk: When only a fraction of the transfer value is at risk (e.g. positive slippage, not principal), the at-risk amount as % of daily total user transfers is much smaller than the volume through the affected path. The program's Medium band (0.5%–20%) can correspond to large absolute sums. Do not hardcode volume. When impact depends on % of daily volume, run a quick web search (e.g. "li.fi monthly volume" or "LI.FI transaction volume") to get recent figures; use them to reason about order of magnitude (e.g. daily ≈ monthly/30) and cite briefly in the severity reasoning. Positive slippage is typically a small fraction of notional per tx (e.g. 0.1%–2%), so the effective share of daily volume actually at risk is often Low or borderline Low/Medium. In such cases, prefer Low or explicitly flag "borderline Low/Medium" and challenge the rating in the output so the user can make an informed decision.
Likelihood: High = very easy / highly incentivized; Medium = possible under conditions; Low = difficult or very specific conditions.
Conjunctive conditions: When the attack requires several conditions to all be true (e.g. specific component, valid credential, malicious intermediary, and a particular market outcome), treat likelihood as the conjunction of those conditions. List every required condition explicitly; the overall likelihood is low unless each condition is independently likely. Do not rate likelihood based on only one condition (e.g. "frontend can be malicious") while ignoring that others (narrow scope, valid signature, specific execution path) must also hold.
Likelihood = Low when: The attack requires (1) a malicious or compromised intermediary (frontend, relayer, or integrator that builds/submits the tx) and (2) a specific execution path (e.g. only swap+bridge, not plain bridge) and (3) a particular outcome (e.g. positive slippage, favourable market). That conjunction is Low likelihood—not Medium. Reserve Medium for scenarios with fewer or less stringent conditions (e.g. no malicious intermediary, or only one extra condition).
Uncertainty: If impact magnitude (e.g. % of daily volume at risk) or likelihood (e.g. how often required conditions align) is unclear or depends on data you do not have, ask the user for clarification or relevant metrics rather than stating a vague or unvalidated severity. Prefer "Severity: Unclear—what is missing]" plus a short question than a guess.
Risk matrix (Impact × Likelihood → Severity):
Bar for High/Critical: With impact defined as % of daily tx volume, High/Critical are unlikely unless the attacker can redirect or harm funds across many flows/tools/chains—explicitly check for overrating.
Follow these 7 steps in order.
From the report (and any platform AI analysis), extract without assuming a fixed structure:
List each claim clearly so every one can be checked.
src/, contract-specific documentation under docs/ when it exists (e.g. EcoFacet.sol → docs/EcoFacet.md), and all inline commentary: NatSpec (@notice, @dev, @param, @return, etc.) and non-NatSpec block or line comments. Do not skip or skim comments—they often document behavior, invariants, and deliberate design choices.src/**/*.sol, scan.li.fi, li.fi, portal.li.fi, li.quest/, and case-by-case clause).audit/auditLog.json: which contracts/versions were audited and report paths.Produce the following in the chat only. Be concise; focus on what matters for accept/reject and next steps.
Use heading + text format (no markdown tables) so the summary does not get truncated. For each item below, output a bold heading followed by one or more lines of plain text.
Claim One-sentence description of the reported issue.
In scope? Yes / No / Unclear. One line why.
Valid? Yes / No / Unclear. One line (e.g. code path exists, third-party only, or not reproducible).
Severity Your assessment (and "Overrated" if reporter's is higher). If uncertain, say "Unclear" and what you need from the user.
Required conditions If the attack depends on multiple conditions that must all hold, list them briefly so the reader can judge conjunctive likelihood.
Main gap/risk Biggest open question or residual risk.
Top 3 manual follow-ups Numbered list (1. … 2. … 3. …).
Present the reasoning for Impact and Likelihood so the reviewer can follow the agent’s thought process. Do not only state the final severity; justify each step.
Use heading + text format so the verdict does not get truncated. For each criterion below, output a bold heading followed by the result on the next line.
In scope? Yes / No / Unclear.
Valid? Yes / No / Unclear.
Severity Critical / High / Medium / Low / Informational.
Overrated? Yes / No.
Duplicate/Known? Yes / No / Unclear.
For each major claim (e.g. "attacker can drain X", "missing check in Y"):
Checklist for the human reviewer:
audit/reports/ (see auditLog) and check for same/similar finding.audit/auditLog.json, list audit IDs and auditReportPath for contracts involved so the reviewer knows which PDFs to open.src/ and docs/ over unsupported assertions.audit/reports/*.pdf; use auditLog and manual instructions.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 23,273 | 5,774 | -75% | 1 | 1 | 0% | 3,454 | 4,615 | +34% | 0 | 0 | — |
case-08 | fail→pass | 17,322 | 6,877 | -60% | 1 | 1 | 0% | 2,531 | 5,439 | +115% | 0 | 0 | — |
case-14 | fail→pass | 12,064 | 10,285 | -15% | 1 | 1 | 0% | 1,594 | 5,791 | +263% | 0 | 0 | — |
case-02 | fail→fail | 22,360 | 18,825 | -16% | 1 | 1 | 0% | 2,336 | 5,465 | +134% | 0 | 0 | — |
case-03 | pass→fail | 18,422 | 7,886 | -57% | 1 | 1 | 0% | 2,730 | 4,807 | +76% | 0 | 0 | — |
case-04 | pass→pass | 23,435 | 30,088 | +28% | 1 | 1 | 0% | 4,364 | 7,004 | +60% | 0 | 0 | — |
case-05 | pass→pass | 13,646 | 11,710 | -14% | 1 | 1 | 0% | 2,030 | 5,868 | +189% | 0 | 0 | — |
case-06 | pass→pass | 8,787 | 11,482 | +31% | 1 | 1 | 0% | 1,562 | 6,233 | +299% | 0 | 0 | — |
case-07 | fail→pass | 15,042 | 12,901 | -14% | 1 | 1 | 0% | 2,168 | 6,364 | +194% | 0 | 0 | — |
case-09 | pass→pass | 17,379 | 14,991 | -14% | 1 | 1 | 0% | 2,379 | 6,008 | +153% | 0 | 0 | — |
case-10 | fail→pass | 16,200 | 9,017 | -44% | 1 | 1 | 0% | 2,241 | 5,680 | +153% | 0 | 0 | — |
case-11 | fail→pass | 16,465 | 7,740 | -53% | 1 | 1 | 0% | 2,271 | 5,527 | +143% | 0 | 0 | — |
case-12 | pass→fail | 10,797 | 5,414 | -50% | 1 | 1 | 0% | 1,532 | 4,437 | +190% | 0 | 0 | — |
case-13 | fail→pass | 11,335 | 8,809 | -22% | 1 | 1 | 0% | 1,697 | 5,584 | +229% | 0 | 0 | — |
case-15 | fail→fail | 13,768 | 7,595 | -45% | 1 | 1 | 0% | 1,915 | 4,538 | +137% | 0 | 0 | — |
case-16 | fail→pass | 21,976 | 9,252 | -58% | 1 | 1 | 0% | 3,296 | 5,487 | +66% | 0 | 0 | — |
case-17 | fail→pass | 15,843 | 12,694 | -20% | 1 | 1 | 0% | 2,092 | 5,303 | +153% | 0 | 0 | — |
case-18 | fail→pass | 13,719 | 7,108 | -48% | 1 | 1 | 0% | 1,933 | 5,385 | +179% | 0 | 0 | — |
case-19 | pass→pass | 9,381 | 7,139 | -24% | 1 | 1 | 0% | 1,265 | 4,837 | +282% | 0 | 0 | — |
case-20 | pass→pass | 9,547 | 2,378 | -75% | 1 | 1 | 0% | 1,430 | 4,571 | +220% | 0 | 0 | — |
case-21 | pass→pass | 6,967 | 1,661 | -76% | 1 | 1 | 0% | 1,159 | 4,430 | +282% | 0 | 0 | — |
case-22 | pass→pass | 10,264 | 6,764 | -34% | 1 | 1 | 0% | 1,425 | 5,176 | +263% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 19 counted toward the lift figure. The other 3 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +32 percentage points is the difference between those two pass rates over the 19 comparable cases. 3 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.