# CREATE2 salt and address collision

Salt omits security-critical params, or truncated address checks let attackers precompute or impersonate addresses

_Area: Smart contract access control and control flow. Seen in 27 disclosed reports; latest 2026-02-05. Updated 2026-10-22._

## How it works
A contract derives an address deterministically (CREATE2 salt, or CREATE from sender+nonce) and then trusts that address to mean something: "this is our wallet", "this is our pool", "this is the caller". The assumption that breaks is that the derivation inputs fully capture identity. If a security-critical parameter (entrypoint, curator, implementation, deployer salt) is left out of the salt, or the comparison is truncated, an attacker can compute or plant the same address with different, attacker-chosen meaning. The address is no longer a proof of who or what it is.

## Where it shows up
- Factory computes a CREATE2 salt from a subset of init/config fields; privileged params (entrypoint, curator, timelock, fees, LP, fee distributor) are excluded [E1](https://bugbountylibrary.com/r/c4%3A2023-01-biconomy%3AH-03.md)[E6](https://bugbountylibrary.com/r/c4%3A2025-08-gte-perps-and-launchpad%3AH-08.md)[E8](https://bugbountylibrary.com/r/cantina%3Aterm_structure_february2025%3A3.2.2.md).
- User-supplied salt passed straight to `cloneDeterministic`/`create2` [E4](https://bugbountylibrary.com/r/c4%3A2024-04-panoptic%3AM-03.md).
- Caller authentication by recomputing an address from calldata and comparing, especially with a truncated hash [E5](https://bugbountylibrary.com/r/sherlock%3A2024-01-napier%3AM-12.md).
- Non-EVM account types able to occupy addresses the EVM treats as contracts [E2](https://bugbountylibrary.com/r/c4%3A2024-11-nibiru%3AH-01.md).
- Nonce-derived CREATE addresses used as stable identifiers across reorgs [E3](https://bugbountylibrary.com/r/c4%3A2024-07-optimism%3AM-09.md).
- "Pair exists and is empty" treated as proof of protocol ownership [E7](https://bugbountylibrary.com/r/c4%3A2025-05-blackhole%3AM-05.md).

## How to review
The invariant: the derived address must be a function of every parameter that affects trust, and any address used as an identity must be compared in full. Concretely: diff the salt inputs against the full init/config struct; confirm no privileged field is omitted [E1](https://bugbountylibrary.com/r/c4%3A2023-01-biconomy%3AH-03.md)[E6](https://bugbountylibrary.com/r/c4%3A2025-08-gte-perps-and-launchpad%3AH-08.md)[E8](https://bugbountylibrary.com/r/cantina%3Aterm_structure_february2025%3A3.2.2.md). Confirm user-controlled salt cannot collide with planted pre-deployment state [E4](https://bugbountylibrary.com/r/c4%3A2024-04-panoptic%3AM-03.md). Confirm caller checks compare full 256-bit addresses from a registry, not recomputed truncated hashes [E5](https://bugbountylibrary.com/r/sherlock%3A2024-01-napier%3AM-12.md). Confirm non-EVM accounts cannot squat EVM contract addresses [E2](https://bugbountylibrary.com/r/c4%3A2024-11-nibiru%3AH-01.md). Confirm identifiers survive reorgs or bind full context [E3](https://bugbountylibrary.com/r/c4%3A2024-07-optimism%3AM-09.md). Confirm existence/emptiness checks also verify the creator [E7](https://bugbountylibrary.com/r/c4%3A2025-05-blackhole%3AM-05.md).

## Variants seen
- Salt omits entrypoint, so same address deploys with malicious entrypoint [E1](https://bugbountylibrary.com/r/c4%3A2023-01-biconomy%3AH-03.md).
- Salt omits curator/timelock/fees, enabling front-run hijack or DoS [E8](https://bugbountylibrary.com/r/cantina%3Aterm_structure_february2025%3A3.2.2.md).
- Salt omits LP/fee-distributor, so locally computed address never matches deployed pair [E6](https://bugbountylibrary.com/r/c4%3A2025-08-gte-perps-and-launchpad%3AH-08.md).
- Fully user-controlled salt enables pre-collision and draining [E4](https://bugbountylibrary.com/r/c4%3A2024-04-panoptic%3AM-03.md).
- Truncated CREATE2 comparison lets a colliding EOA pass caller checks [E5](https://bugbountylibrary.com/r/sherlock%3A2024-01-napier%3AM-12.md).
- Cross-account-system address squatting orphans deployed bytecode [E2](https://bugbountylibrary.com/r/c4%3A2024-11-nibiru%3AH-01.md).
- Reorg swaps nonce-derived game addresses, invalidating honest moves [E3](https://bugbountylibrary.com/r/c4%3A2024-07-optimism%3AM-09.md).
- Permissionless pair pre-creation with dust blocks launch [E7](https://bugbountylibrary.com/r/c4%3A2025-05-blackhole%3AM-05.md).

## Why fixes fail
E3's fix checks only the disputed claim hash, not which game/position the move belongs to, so the binding is incomplete. E6's try/catch around createPair hides the salt mismatch and leaves a stale address.

## Impact and severity
Ranges from wallet takeover and pool draining [E1](https://bugbountylibrary.com/r/c4%3A2023-01-biconomy%3AH-03.md)[E4](https://bugbountylibrary.com/r/c4%3A2024-04-panoptic%3AM-03.md) to permanent fund lock and bricked launches [E2](https://bugbountylibrary.com/r/c4%3A2024-11-nibiru%3AH-01.md)[E6](https://bugbountylibrary.com/r/c4%3A2025-08-gte-perps-and-launchpad%3AH-08.md)[E7](https://bugbountylibrary.com/r/c4%3A2025-05-blackhole%3AM-05.md), plus bond loss [E3](https://bugbountylibrary.com/r/c4%3A2024-07-optimism%3AM-09.md). Severity rises when the address is pre-funded or holds approvals, and when the mismatch is silent.

## Evidence
- E1: https://bugbountylibrary.com/r/c4%3A2023-01-biconomy%3AH-03.md
- E2: https://bugbountylibrary.com/r/c4%3A2024-11-nibiru%3AH-01.md
- E3: https://bugbountylibrary.com/r/c4%3A2024-07-optimism%3AM-09.md
- E4: https://bugbountylibrary.com/r/c4%3A2024-04-panoptic%3AM-03.md
- E5: https://bugbountylibrary.com/r/sherlock%3A2024-01-napier%3AM-12.md
- E6: https://bugbountylibrary.com/r/c4%3A2025-08-gte-perps-and-launchpad%3AH-08.md
- E7: https://bugbountylibrary.com/r/c4%3A2025-05-blackhole%3AM-05.md
- E8: https://bugbountylibrary.com/r/cantina%3Aterm_structure_february2025%3A3.2.2.md
