Cantina finding report template

Built around the five things Cantina’s documentation says a good finding explains, with impact and likelihood argued separately because that is how severity is set. The PoC section follows the mandatory PoC rule line by line.

Download .md

Rules checked 2 Oct 2026 · 8 sources

The template

Cantina’s form has its own fields for severity, likelihood, impact and title, and offers a structured template for the description. In competitions the documentation tells you to pick the Detailed one. Paste these sections under its headings.

Platformasked for in Cantina’s published guidance. Addedanswers the two objections that close reports late: overclaiming and known issues.

cantina.md9 sections
01Platform

Title

The form asks for a title that conveys the essence of the vulnerability. Mechanism and consequence, one sentence.

Mechanism in function lets actor consequence

02Platform

Summary

What the issue is, in two or three sentences. The first thing Cantina’s documentation asks of a good finding is that it states the issue before any code.

What is wrong and what it leads to. Name the function and the affected party.

03Platform

Finding Description

Why it happens, and where. Highlight the exact lines on the audit branch with the code-highlighting feature, then explain which logic they connect to.

  • Location: path/File.sol lines start-end on audit branch at commit commit
  • Root cause: the mistake, and why the surrounding checks do not stop it
{The smallest excerpt that shows the root cause}

Path:

  1. Actor calls function with arguments. State after the call.
  2. Actor calls function with arguments. State after the call.
  3. Final state, with the number.
04Platform

Impact Explanation

Severity on Cantina is impact × likelihood. State the impact level and the fact that puts it there. Loss of user funds or broken core functionality is High. A temporary disruption or minor fund exposure is Medium. Dust lost to rounding is capped at Low.

Impact: High, Medium or Low. Affected party lose amount, or the core function that stops working and for how long.

Measured by the PoC: the number from the output below.

05Platform

Likelihood Explanation

Who triggers it and what it takes. Any user at any time is High. Capital, planning or other users’ actions is Medium. Rare conditions or admin action is Low, and a finding that needs admin access is capped at Low.

Likelihood: High, Medium or Low. Who triggers it, what they need, and how each precondition is reached from the current state.

Severity claimed: High, Medium or Low, from the matrix on the competition or programme page you used.

06Platform

Proof of Concept

In a competition, High and Medium need a coded PoC before the competition ends unless your reputation score is 80 or above. It has to compile and demonstrate the impact. Name the test file, confirm it runs on the audit branch, list anything else it needs, paste the output, and set the output against what was expected.

  • Test file: test/path/File.t.sol, added to the project's own suite
  • Branch and commit: audit branch at commit
  • Extra setup: none, or what the reviewer installs or sets
  • Command: forge test --match-test test_name -vvv
{The test}

Output:

{Pasted output}

Expected against actual: what a correct implementation prints, and what this prints

07Platform

Recommendation

Cantina’s criteria recommend a mitigation with every finding. A fix that goes against the protocol’s design philosophy marks the finding as informational at most, so propose one the team would merge.

The change, in the file and function it belongs to.

- {vulnerable line}
+ {fixed line}
08Added

Limits and non-claims

A PoC that relies on unrealistic assumptions gets the finding downgraded or invalidated. List the assumptions yourself and show that each one holds.

  • Not claimed: what this report does not say, for example no loss beyond the funds held at this address
  • Mocked or assumed: each mock and assumption, or "nothing: every step runs the deployed code"
  • Stops working when: the condition that breaks the path
09Added

Known issues checked

A finding acknowledged in a previous report is invalid, and so is one the team already knows about. The competition README is the reference for how the protocol is meant to behave.

  • Competition README or programme page, known issues: the nearest item, why this differs
  • Previous reports on this code: report and finding id, why the root cause differs
  • Intended behaviour per the README: the sentence that shows this is not by design
Markdown sourcecantina.md
cantina.md
> Cantina report template from https://bountyoperator.com/templates/cantina. Platform rules checked 2 Oct 2026.
> Replace every {placeholder}. Delete this note before you submit.

# {Mechanism} in `{function}` lets {actor} {consequence}

## Summary

{What is wrong and what it leads to. Name the function and the affected party.}

## Finding Description

- Location: `{path/File.sol}` lines {start}-{end} on `{audit branch}` at commit `{commit}`
- Root cause: {the mistake, and why the surrounding checks do not stop it}

```solidity
{The smallest excerpt that shows the root cause}
```

Path:

1. {Actor} calls `{function}` with {arguments}. {State after the call.}
2. {Actor} calls `{function}` with {arguments}. {State after the call.}
3. {Final state, with the number.}

## Impact Explanation

Impact: {High, Medium or Low}. {Affected party} lose {amount}, or {the core function that stops working and for how long}.

Measured by the PoC: {the number from the output below}.

## Likelihood Explanation

Likelihood: {High, Medium or Low}. {Who triggers it, what they need, and how each precondition is reached from the current state.}

Severity claimed: {High, Medium or Low}, from the matrix on {the competition or programme page you used}.

## Proof of Concept

- Test file: `{test/path/File.t.sol}`, added to the project's own suite
- Branch and commit: `{audit branch}` at `{commit}`
- Extra setup: {none, or what the reviewer installs or sets}
- Command: `{forge test --match-test test_name -vvv}`

```solidity
{The test}
```

Output:

```text
{Pasted output}
```

Expected against actual: {what a correct implementation prints, and what this prints}

## Recommendation

{The change, in the file and function it belongs to.}

```diff
- {vulnerable line}
+ {fixed line}
```

## Limits and non-claims

- Not claimed: {what this report does not say, for example no loss beyond the funds held at this address}
- Mocked or assumed: {each mock and assumption, or "nothing: every step runs the deployed code"}
- Stops working when: {the condition that breaks the path}

## Known issues checked

- Competition README or programme page, known issues: {the nearest item, why this differs}
- Previous reports on this code: {report and finding id, why the root cause differs}
- Intended behaviour per the README: {the sentence that shows this is not by design}

What gets this closed on Cantina

Each reason comes from a page Cantina publishes. The programme or contest page adds its own rules on top, and those win.

  1. High or Medium without a coded PoC

    By default every competition has a mandatory PoC rule: High and Medium submissions carry a coded PoC before the competition ends. Researchers with a reputation score of 80 or above are exempt, and so are missing-function findings. The bar for the PoC is one sentence:

    the PoC must compile and demonstrate the impact of the issue

    Competition Finding Severity Criteria, Cantina

    Source Competition Finding Severity Criteria, Submission Guidelines

  2. A PoC that does not prove the claim

    A PoC that cannot be executed, does not demonstrate the stated impact, or relies on unrealistic assumptions gets the finding downgraded or invalidated. So does a description that does not connect root cause to impact.

    Source Submission Guidelines

  3. Known issues

    A finding acknowledged in a previous report is invalid. Known issues the team already has are invalid in competitions and out of scope on bounties.

    Source Competition Finding Severity Criteria, Submission Guidelines, Bug Bounty Severity Classification

  4. Capped categories

    Low at most: dust lost to rounding, non-standard ERC20 behaviour, findings that need admin access. Informational at most: admin error, malicious admin unless the scope includes it, user error that harms nobody else, design choices. Invalid: speculation about future code, and approval race conditions.

    Source Submission Guidelines, Competition Finding Severity Criteria

  5. Two matrices, one cell apart

    The severity criteria page rates high likelihood with medium impact as High. The submission guidelines rate the same cell Medium. Say which page your severity comes from.

    Source Competition Finding Severity Criteria, Submission Guidelines

  6. Duplicates

    A duplicate is the same root cause with the same realistic path to the same impact. Bounties do not pay duplicates. Competitions split the points: a High is worth 10, and when three researchers find it each receives 2.7.

    Source Bug Bounty Finding Statuses, Competition Participation, Judging Processes

  7. Unvalidated AI output and off-platform contact

    Submitting AI-generated findings without validating them leads to disqualification or a permanent ban. Contacting the client about a finding outside Cantina gets it rejected with no reward and the account banned.

    Source Competition Finding Severity Criteria, Competition Participation

  8. Fees and penalties

    An invalid escalation costs $100, deducted from future competition earnings. Bounties that show a deposit requirement refund it for valid findings and for honest invalid ones, and slash it for spam, low-effort or AI submissions and for over-inflated severity.

    Source Judging Processes, Deposits for Bounty Submissions

Challenge the filled draft

Paste the report once every placeholder is replaced. The workbench opens with Challenge a draft report selected and argues against each claim: the impact row, the proof, the severity, the known issues. You decide what to rewrite.

The draft stays in this browser. It is sent only when you run a review in the workbench.

Sources

Primary sources only, read on 2 Oct 2026. Rules change. Read the programme page on the day you submit.