---
name: smart-contract-access-and-control-flow
description: "A defensive review workflow for smart contract access control and control flow weaknesses — who may call what, signature and replay binding, reentrancy, governance, upgrades/proxies, and denial of service in contracts and bridges — loaded when auditing or reviewing an authorized target's entrypoints and state…"
---

# Smart contract access control and control flow

Who may call what, signatures and replay, reentrancy, governance, upgrades and proxies, denial of service in contracts and bridges.

_From Bug Bounty Library (https://bugbountylibrary.com): generated from disclosed, accepted reports and updated as new ones land. Updated 2026-10-23. Tested on 101 newer reports it was not written from: following it finds about 71% of them._

## Approaching access control and control flow

Start by mapping the trust surface before reading logic. List every entrypoint (external/public, callbacks, initializers, upgrade hooks, cross-chain handlers) and for each note: who is *supposed* to call it, what identity check exists, and what state it mutates. Then map every external call, token transfer, and callback — these are where control flow leaves your contract and where reentrancy, gas griefing, and revert-DoS live.

Ask these questions per entrypoint:
- **Who can call this?** Is `msg.sender` (or a signed identity) bound to the authorized party, or just checked for nonzero? Can a second path reach the same effect without the guard?
- **What does it trust from the caller?** Token/pool/helper addresses, selectors, calldata, ids, signatures, Merkle proofs, init params — is each validated against a registry or recomputed, or taken on faith?
- **What order do effects happen?** Any external call before the state write? Any ignored return value or swallowed error that still advances state?
- **Can one actor wedge shared state?** Unbounded loops, push payments, dust writes, cheap permissionless state changes that block others.
- **Does state stay consistent across paths?** Cancel/burn/upgrade/rotate paths that leave approvals, roles, indexes, or pointers behind; parallel arrays; storage layout on upgrade.
- **Are signatures and nonces bound?** Digest covers chain/domain, nonce, deadline, outcome; nonce consumed on every path; signers deduplicated.

Use the patterns below as a checklist, not a script: for each, ask whether the described shape exists in the code you mapped. Prioritize findings by reachability (permissionless?) and impact (funds, governance takeover, liveness). Confirm each candidate by tracing the actual call path end to end before reporting.

## Patterns

Each pattern below has a full write-up (how it works, where it shows up, how to review for it, variants, impact), grounded in
real disclosed reports. Load the one you need from its link.

### Missing caller authorization on privileged functions
Privileged effect with no caller binding, or a check keyed on the wrong identity

_199 reports · 3 confirmed bounties, median $4,515, up to $76,568._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/missing-caller-check.md

### State machine status check bypass
Guards reading timestamps, sentinels or shared IDs that caller input or re-init can rewrite

_162 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/state-machine-bypass.md

### Reentrancy before state update
External call, transfer, mint or callback before balance, debt or ownership write, with no guard

_102 reports · one confirmed bounty: $25,000._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/reentrancy-before-state-update-2.md

### Unbounded loop denial of service
Collections grown by others and iterated in full per call, with no cap or pagination

_94 reports · one confirmed bounty: $4,000._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/unbounded-loop-dos.md

### Signature replay via unbound digest
Does the signed digest bind nonce, chain/domain, contract address, deadline, signer identity and outcome fields?

_83 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/signature-replay-missing-nonce.md

### Push payment revert blocks shared flow
A payout to a recipient who can force it to revert halts a queue, settlement, or consensus path

_55 reports · one confirmed bounty: $5,000._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/push-payment-revert-dos.md

### Stale approval survives reversal
Cancel, burn, detach, rotate or delete paths that drop state but leave approvals, roles or indexes behind

_52 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/stale-approval.md

### Gas forwarding griefing in contracts
Fixed or all-gas grants that ignore EIP-150 63/64, starving callbacks, stores, or inner calls

_51 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/gas-griefing-forwarding.md

### Signature validation bypass in contracts
Recovered or supplied signer never bound to trusted owner; zero address or attacker-chosen validator accepted

_45 reports · 3 confirmed bounties, median $400,000, up to $2,200,000._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/signature-validation-bypass.md

### Arbitrary external call as contract
Caller-controlled target and calldata run as the contract, abusing its approvals, roles or identity

_43 reports · one confirmed bounty: $1,500._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/arbitrary-external-call.md

### Missing token id ownership check
Entrypoint takes an id and acts on it without verifying caller owns or is approved for that id

_43 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/missing-ownership-check.md

### Unvalidated token or pool address
Caller-supplied token, pool, market or receiver used in transfers, approvals or payout math without a registry or equality check

_41 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/unvalidated-token-address.md

### Unvalidated helper or module address
Caller-supplied helper, router, module or adapter address trusted without registry or allowlist binding

_38 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/unvalidated-helper-contract.md

### Standing allowance drained via helper
Permissionless or caller-steered path reaching transferFrom on a contract holding user approvals

_35 reports · one confirmed bounty: $25,000._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/allowance-drain-via-approval.md

### Unprotected or repeatable initializer
Initializer callable by anyone or twice, writing owner, admin or implementation state

_34 reports · 4 confirmed bounties, median $125,000, up to $10,000,000._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/unprotected-initializer.md

### Off-by-one boundary checks in contracts
Wrong edge in bounds, cursors, bitmasks, field widths or loop exits that skips or absorbs one element

_33 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/off-by-one-boundary-check.md

### Governance quorum and vote manipulation
Can one actor reach quorum and pass a takeover proposal with little or no real opposition?

_32 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/governance-quorum-manipulation.md

### Callback trusts unverified caller
Callback acts on caller-supplied pool, payer, or data without binding msg.sender to a canonical registry

_31 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/unvalidated-callback-caller.md

### Unvalidated selector and calldata trust
Selector, sender, or inner id read from calldata and trusted without binding to the expected function or owner

_28 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/unvalidated-calldata-selector.md

### Voting power double-counted or replayed
Vote receipt keyed to address, period, or live state instead of the power unit itself

_27 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/vote-double-counting.md

### CREATE2 salt and address collision
Salt omits security-critical params, or truncated address checks let attackers precompute or impersonate addresses

_27 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/create2-address-collision.md

### Unprotected privileged setter repoints trust
Public setters for owner, router, oracle, forwarder, or Merkle root that anyone can call to repoint trust

_25 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/unprotected-setter.md

### Zero-default authorization bypass
Trust checks comparing input to unset storage or zero-default variables that attacker input can match

_22 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/zero-address-default-auth.md

### Unchecked low-level call result
Ignored call/delegatecall/send return values, try/catch gaps, and failure paths that still advance state

_20 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/unchecked-call-return.md

### Dust griefing blocks state transitions
Can a cheap permissionless write park shared or per-user state so a legitimate transition reverts?

_17 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/dust-griefing-blocks-flow.md

### Allowlist and blacklist bypass
A restriction checked on one path while another path reaches the same effect unchecked

_17 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/allowlist-or-blacklist-bypass.md

### Missing approval bricks token flow
Pull, burn, or safe-mint assumes an allowance or receiver hook that was never granted

_16 reports · one confirmed bounty: $181,850._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/missing-approval-bricks-flow.md

### Reentrancy guard reset or bypass
Guard flag cleared mid-call, counter guard, or nested path that skips the lock

_15 reports · one confirmed bounty: $3,495._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/reentrancy-guard-bypass.md

### Zero divisor and capacity reverts
Can a divisor, share count, or slice capacity reach zero on a reachable path?

_14 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/division-by-zero-dos.md

### Front-run mutable state before use
Value read at execution that a counterparty can rewrite after the victim commits but before the tx lands

_14 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/race-condition-frontrun-mutable-state.md

### Ignored callback outcome marked success
Callback or handler result discarded, error swallowed, or status derived from call success instead of actual outcome

_14 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/callback-outcome-ignored.md

### Under-constrained ZK circuit witness
Witness values used in checks but never range-, uniqueness-, or linkage-constrained

_13 reports · one confirmed bounty: $200,000._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/unconstrained-circuit-witness.md

### Untrusted balance and empty-state checks
Checks or amounts read from live balances or zero-equality that any outsider can flip

_11 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/zero-balance-invariant-griefing.md

### Sentinel value collides with valid input
Sentinel addresses, max/zero amounts, and default field values that overlap real inputs and break checks

_11 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/sentinel-value-collision.md

### Unverified key trusted as unique and owner-bound
Stored or looked-up hash, id or index trusted without recomputing it from the real data and owner

_11 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/unverified-user-supplied-key.md

### Cross-chain address lookup mismatch
Cross-chain handlers using the wrong chain's token, market, or caller address to look up or settle state

_11 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/cross-chain-address-lookup-mismatch.md

### Pause check bypass on alternate path
Global pause enforced on one entrypoint but missing on a parallel transfer, mint, retry or unwind path

_11 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/pause-check-bypass.md

### Hardcoded address or network constant
Fixed address, chain id, program id or ABI used where deployment or chain varies

_10 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/hardcoded-address-or-network-constant.md

### Missing consumed flag allows repeat payout
Value-moving path checks eligibility but never marks the request spent, so the same call pays again

_10 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/missing-claim-flag-repeatable.md

### Unconstrained proof flags in circuits
Prover-supplied flags and boundary columns not pinned to row data or inputs

_10 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/proof-soundness-flag-gap.md

### ABI decode layout mismatch reverts
Caller and callee disagree on byte layout: return types, struct offsets, lengths, metadata prefixes, codec names

_10 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/abi-decode-layout-mismatch.md

### Shared allowance mapping confusion
Allowance checked or decremented for the wrong address, or one mapping reused across paths with different consent semantics

_9 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/allowance-mapping-confusion.md

### Unbounded value blocks future actions
Untrusted or unvalidated value gates a later call; check who writes it and whether bounds hold

_9 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/unbounded-value-blocks-future.md

### Shadowed state writes silently lost
Writes to memory copies or shadowing locals that never reach storage, leaving stale state

_9 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/state-shadowing-local-variable.md

### Wrong variable read in checkpoint
Reads using a different key, source, or variable than the matching write, corrupting accounting

_9 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/wrong-variable-read-checkpoint.md

### Alternate path bypasses access check
Second path to protected state skips the guard the main entrypoint enforces

_8 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/access-control-path-bypass.md

### Stale or wrong variable used
A value read at use time that no longer matches the object acted on: live stake, index, clock, cached domain

_8 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/stale-or-wrong-variable.md

### Unsanitized field injection into templates and commands
User-controlled fields concatenated into shell, JSON, templates, or identifiers without escaping or validation

_8 reports · 2 confirmed bounties: $2,000 and $6,000._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/injection-via-unsanitized-field.md

### Inverted comparison guard accepts wrong terms
Guard whose operator, operand order, or implication direction is reversed, accepting what it should reject

_6 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/inverted-comparison-check.md

### Stale proxy and address references
Stored contract pointers trusted after the target is destroyed, swapped, or upgraded

_6 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/stale-proxy-or-address-reference.md

### Merkle verifier accepts forged proof
Does root-hash computation consume every path-node field and enforce proof length, depth and index bounds?

_6 reports · one confirmed bounty: $50,000._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/merkle-proof-forgery.md

### Missing refund or rollback on failure
Value leaves before the matching input or credit is secured, and failure paths never restore the debit

_6 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/missing-refund-rollback.md

### Third-party action blocks victim operation
Can a permissionless call move or taint state so a victim's legitimate call reverts?

_6 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/third-party-griefing-dos.md

### Duplicate signer threshold bypass
Threshold sums weight or counters per signature entry without deduplicating signers or enforcing key distinctness

_5 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/duplicate-signer-counting.md

### ERC20 approve and allowance assumption failures
Raw approve/transferFrom assuming bool returns, zero-reset rules, or self-transfer allowance bypass

_5 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/approve-nonzero-to-nonzero-revert.md

### Upgradeable storage layout collision
New or shifted state variables in upgradeable contracts overwriting live slots or leaving config uninitialized

_5 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/storage-layout-collision-upgrade.md

### Missing deadline and slippage bounds
Pool, swap, mint or redeem actions that accept no deadline or user-supplied min/max output

_5 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/missing-deadline-slippage.md

### Extcodesize contract-check bypass
Code-existence checks using extcodesize or codehash that a constructor, selfdestruct, or dust transfer defeats

_5 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/extcodesize-check-bypass.md

### Wrong token or offset read
Asset, offset, or approval read from the wrong field, causing underflow, revert, or free tokens

_5 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/wrong-token-or-offset-read.md

### Unreachable or unimplemented inherited path
Trace which concrete override runs per entry point; check stubs, gated completions, and unconditional terminal bases

_5 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/unreachable-or-unimplemented-path.md

### Nonce and hash identity desync
Nonce or hash compared against a value built differently, or advanced on paths the checker never sees

_5 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/nonce-or-hash-mismatch.md

### Unbounded serialization and channel DoS
Size caps after serialization, unwrapped bounded-channel sends, unauthenticated data cached before verification

_5 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/unbounded-serialization-dos.md

### Missing cross-component consistency check
Two components derive or enforce the same value; nothing asserts they agree

_5 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/missing-cross-component-consistency-check.md

### Parallel array length mismatch reverts
Parallel arrays or selector/plugin lists consumed by index without equal-length validation, causing reverts or locked funds

_4 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/unchecked-array-length-mismatch.md

### Order book eviction and freeze DoS
Cheap or post-only orders that freeze a side, inflate accumulators, or evict real orders

_4 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/order-book-dos.md

### Unvalidated init parameters overflow or takeover
Caller-supplied initial values accepted without bounds, later multiplied or compared, causing overflow or forced liquidation

_4 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/unvalidated-initial-parameters-overflow.md

### Unchecked arithmetic halts control flow
Division, subtraction or Quo on attacker-influenced weights or totals without zero, bound or underflow guards

_4 reports · one confirmed bounty: $15,000._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/unchecked-arithmetic-halts-flow.md

### Inverted boolean in authorization checks
Auth guards combining flags or conditions with wrong operator or negation, letting invalid callers pass

_4 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/boolean-operator-inverted-auth-check.md

### Unsatisfiable branch blocks legitimate action
Guard or require that can never pass on a reachable path, reverting the only exit

_4 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/unreachable-branch-blocks-legitimate-action.md

### Stale mapping after record closure
Close/delete paths that drop a record but leave id or index mappings pointing at it

_4 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/stale-record-not-cleared.md

### State overwrite with weaker value
Writes that replace a max, accumulated, or pending value with a default, lower, or reassigned one

_4 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/state-overwrite-drops-maximum.md

### Proposal ID collision and duplicate blocking
Uniqueness keys that omit lifecycle fields, or slates that accept duplicate ids, letting attackers squat or inflate

_3 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/governance-proposal-id-collision.md

### Votes locked in failed proposal
Governance liveness when votes or slots stay parked in failed, cancelled, or unexecutable proposals

_3 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/governance-vote-lock-dos.md

### Block number vs timestamp mismatch
Time arguments crossing function boundaries in the wrong unit, double-added, or anchored to the wrong block

_3 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/governance-timing-mismatch.md

### Governance lock and veto bypass
Privileged or batched paths that skip lock, expiry, or veto checks on delegated or bundled state

_3 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/governance-lock-bypass.md

### Order update skips create-time validation
Mutators that rewrite order fields without re-checking create-time invariants or filled size

_3 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/unvalidated-order-update.md

### ATA ownership and rent griefing
Idempotent ATA creation, init on derivable addresses, and buyer-paid rent that counterparties can close or reassign

_3 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/ata-ownership-or-rent.md

### Mempool vs block validation mismatch
Same validity or cost check written twice; diff order, formula, and derived-flag timing between admission and block paths

_3 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/validation-order-mismatch.md

### Metric and payout evasion via forced state
Can a permissionless action move value or force state so a score, redistribution, or reward favors the attacker?

_3 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/redistribution-or-trust-evasion.md

### Multicall caller identity spoofing
Batch helpers that forward or synthesize caller identity, letting inner calls authorize the wrong sender

_3 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/multicall-forwards-original-sender.md

### Unvalidated fee field drains tokens
Fee, refund, or gas-refund fields from caller input used to move funds without bounds or recipient checks

_3 reports · one confirmed bounty: $1,000,000._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/unvalidated-fee-field-drains-tokens.md

### Allowlist removal strands funds
Removing an address, gauge, or version from an allowlist while balances or votes still reference it

_3 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/allowlist-version-strands-funds.md

### Reclaim without existence check
Settle/withdraw paths that move assets before proving the record exists, is active, and belongs to the caller

_3 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/missing-existence-check-before-reclaim-2.md

### Unbounded caller-supplied numeric parameters
Caller-set rate, proportion, or cap used in fund movement or gating without a documented bound

_3 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/unbounded-user-parameter-drains-or-blocks.md

### Skipped-path counter and iterator desync
Cleanup, zero-value, or early-return branches that skip a counter decrement or iterator advance

_3 reports · one confirmed bounty: $100._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/counter-desync-on-skip-path.md

### Async step without timeout or retry
One-shot sends or RPC calls with no timeout, ack check, or retry that strand state

_3 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/missing-timeout-or-retry-on-async-step.md

### Wrong operand or direction in bounds checks
Guards comparing delta not absolute, reversed operands, or abs() hiding sign, letting bad values pass

_3 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/wrong-comparison-operand-or-direction.md

### Per-entry failure isolation in payout loops
Loops over stored tokens/recipients that revert on one bad entry, blocking all payouts

_3 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/zero-value-transfer-revert-blocks-payout.md

### Bounded check misses tail entries
Compare setter storage bounds against membership/validation check bounds; entries past a cap are silently ignored

_3 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/truncated-or-bounded-check-misses-entries.md

### Missing role key distinctness check
Role keys compared or combined without asserting they differ, collapsing multi-party checks

_3 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/missing-distinctness-check.md

### Hardcoded message fields in cross-chain handlers
Trace every user-supplied field into outbound message construction; check hardcoded payloads, vote types, and single-field validity checks

_3 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/hardcoded-payload-or-type.md

### No exit path after shutdown
Check every refund, withdraw, or downgrade path still works once a lifecycle state closes.

_3 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/missing-withdrawal-or-downgrade-path.md

### Permissionless write invalidates pending action
Can anyone mutate state or squat an ID that a pending tx or creation depends on?

_3 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/permissionless-mutation-invalidates-pending.md

### Caller-supplied field trusted as state
User input written to storage or used as seed without binding to canonical on-chain value

_3 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/unvalidated-user-field-stored.md

### Wrong caller identity forwarded to callee
Cross-contract calls that pass an EOA or user-supplied sender where the callee expects the contract's own address

_3 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/wrong-caller-forwarded.md

### Checked arithmetic revert blocks reachable path
Unsigned delta or cast that goes negative on a live path, reverting it under Solidity 0.8 checks

_3 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/checked-arithmetic-revert-dos.md

### Asymmetric access check between paired operations
Compare guards on paired operations: pause vs unpause, enable vs disable, approve vs revoke, and every path setting the same bit.

_3 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/asymmetric-access-check.md

### Aggregate balance check ignores escrow
Caps or balance checks using aggregate balances that include escrowed, locked, or router-held funds

_3 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/balance-check-ignores-escrow.md

### Constraint checked against wrong quantity
Limit checks comparing a bound to another bound or a recomputed value, not the executed quantity

_3 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/wrong-comparison-operand.md

### Missing claim wrapper strands surplus value
Value accrues to a contract but no function exists to withdraw or claim it

_3 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/missing-wrapper-claim-path.md

### Unverified injected data halts validation
Injected proposals, deposits or vote extensions skip checks that the validating path later enforces

_3 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/unverified-proposal-data-halts.md

### Signature quorum without per-signer verification
Quorum counts signatures by arrival order or total count while only a subset is actually verified

_3 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/signature-quorum-arrival-order.md

### Dust notify dilutes reward rate
Permissionless notify with dust resets period or dilutes rate; check minimum thresholds and period extension logic

_2 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/permissionless-dust-dilutes-rewards.md

### Refund recipient overwrite via missing existence check
Payable calls and refund records that let a later caller replace the stored refund recipient before payout

_2 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/refund-recipient-overwrite.md

### Self-match and self-funded purchase flaws
Payable functions that self-fund instead of requiring msg.value, and matching that allows buyer == seller

_2 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/self-match-or-self-funded.md

### Pool takeover validation gap
Takeover/re-init functions that skip bounds on zeroable or directional params feeding later math

_2 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/takeover-validation-gap.md

### Precompile call-context confusion
Precompiles that accept DELEGATECALL or return wrong values in caller context, breaking msg.sender and signature assumptions

_2 reports · one confirmed bounty: $1,050,000._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/precompile-context-confusion.md

### Limit checked on wrong party
Caps and LTV checks computed from attacker-controlled balances or set by the counterparty, not the constrained party

_2 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/limit-checked-on-wrong-party.md

### Inverted or mismatched state checks
Guards comparing wrong variable, inverted boolean, or stale counter that let bad state pass

_2 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/state-check-inverted-or-wrong-variable.md

### Time-boundary and phase-gate consistency
Inclusive or missing timestamp bounds letting phases overlap, lock funds, or skip a grace period

_2 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/inclusive-time-window-overlap.md

### Accumulator overflow reverts under checked math
Attacker-inflated or intentionally wrapping accumulators that revert under Solidity 0.8 checked math, causing DoS

_2 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/accumulator-overflow-dos.md

### Concurrent registration overwrites shared mapping
Registration writes keyed by logical identity with blind overwrite and no session or uniqueness binding

_2 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/concurrent-registration-overwrite.md

### Event parsed without verifying emitter
Off-chain watcher trusts event topic or fields without checking emitting contract address or parse safety

_2 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/unverified-event-emitter.md

### Unbound account in instruction validation
Does the handler bind every caller-supplied account to its owner or canonical key before acting?

_2 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/unvalidated-account-binding-in-instruction.md

### Duplicate identifier accepted without uniqueness check
Is uniqueness of ids, indices, or keys enforced, or only presence and position?

_2 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/duplicate-id-accepted-without-uniqueness.md

### Mutable config read mid-flow
Settlement or callback reads admin- or counterparty-mutable config that can change after the flow starts

_2 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/stale-or-mutable-config-read-mid-flow.md

### Unvalidated external data poisons trusted state
Is the value stored or trusted the same one the verification path proved, or bound to a trusted local reference?

_2 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/unvalidated-external-data-poisons-state.md

### Missing fee or allowlist check on one path
Does every path enforce the same fee, allowlist, and registration checks as the main path?

_2 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/missing-allowlist-or-fee-check-on-path.md

### Single-use signature front-run griefing
Public single-use permits or relay authorizations consumed by anyone first, blocking or resetting the intended flow

_2 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/signature-consumed-before-use-front-run.md

### Missing range check on field or curve point
Inputs, curve points, or encoded values accepted without width or range validation, causing reverts or corruption

_2 reports · one confirmed bounty: $10,000._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/unchecked-range-or-field-width.md

### Phase boundary overlap and unit mismatch
Inclusive comparisons on both sides of one boundary, or deadlines anchored to the wrong block or unit

_2 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/phase-boundary-overlap-or-mismatch.md

### Duplicate request early-return skips registration
Dedup or idempotency guard returns early before per-caller registration or state advance

_2 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/duplicate-request-skips-registration.md

### Residual token allowance after external call
Approval to caller-supplied target or router not zeroed after the call, leaving spendable allowance

_2 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/residual-approval-not-reset.md

### Batch append past hard cap
Appends to batches, queues or trackers that skip a length-vs-cap check, stalling the pipeline

_2 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/missing-length-or-cap-check.md

### Proposal id collision in governance
Proposal ids compared, summed or deduplicated without binding to lifecycle or uniqueness

_2 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/governance-proposal-id-collision-2.md

### Vote power accounting desync from lock state
Accumulators re-derived from cached timestamps or caller-supplied splits that diverge from live lock state

_2 reports._
Full pattern: https://bugbountylibrary.com/skills/smart-contract-access-and-control-flow/vote-power-accounting-desync.md

## Rarer patterns

Seen only once or twice so far, so there is no full write-up yet; each links to the report that shows it.

- **Caller-supplied target bypasses validation**: External call target or beneficiary from caller with balance check missing granted rights (https://bugbountylibrary.com/r/blog%3Aimmunefi-com-blog-bug-fix-reviews-mcdex-insufficient-validation-bugfix-review.md)
- **Predictable randomness lets sniping**: Starting index or rare id derived from block number or timestamp (https://bugbountylibrary.com/r/c4%3A2022-03-joyn%3AM-08.md)
- **Zero-balance opt-in bloats account loops**: Account or collateral registration without minimum balance feeding unbounded iteration (https://bugbountylibrary.com/r/c4%3A2026-04-k2%3AH-12.md)
- **Caller-supplied router or target drains funds**: Functions accepting a router, target, or module address from caller without allowlisting before transfers (https://bugbountylibrary.com/r/dhl%3A20250108-hors.md)
- **Missing existence check before asset reclaim**: Reclaim, withdraw, or settle paths that read order state without verifying the order exists (https://bugbountylibrary.com/r/sherlock%3A2022-11-bullvbear%3AH-1.md)
- **Multicall executes arbitrary transferFrom**: Batched call path forwards caller-supplied transferFrom without per-call authorization (https://bugbountylibrary.com/r/dhl%3A20231217-floorprotocol.md)
- **Proof data covers only one leaf**: Verifier accepts proof for single destination while multiple leaves or outputs expected (https://bugbountylibrary.com/r/cantina%3Acircuit_puzzles%3A3.1.5.md)
- **Renounced owner breaks gated init**: Factory or initializer paths gated on owner that break when owner is zero (https://bugbountylibrary.com/r/cantina%3Asize_february2025%3A3.1.2.md)
- **Reverting entry blocks sequential queue**: Withdrawal or transfer queue processes head entry; a single reverting entry halts all later entries (https://bugbountylibrary.com/r/c4%3A2023-03-polynomial%3AH-11.md)
- **Single-step admin setter swaps trusted forwarder**: Admin or forwarder setter applied in one step with no timelock or two-step (https://bugbountylibrary.com/r/c4%3A2022-08-rigor%3AM-06.md)
- **Unauthenticated module registration**: Module or asset registration callable by anyone installs malicious hook or rate skew (https://bugbountylibrary.com/r/dhl%3A20250528-corkprotocol.md)
- **Unbounded returndata copied from callee**: Low-level call copies full returndata from untrusted recipient without size cap, enabling gas bomb (https://bugbountylibrary.com/r/c4%3A2025-02-recall%3AH-09.md)
- **Unprotected init writes recipient**: Initializer or setup function lacking caller check that stores a payout recipient (https://bugbountylibrary.com/r/dhl%3A20250827-0xf340.md)
- **Unvalidated destination gas on cross-chain call**: Cross-chain send accepts user-supplied gas limit without bounds, causing out-of-gas revert on destination (https://bugbountylibrary.com/r/c4%3A2024-01-decent%3AH-02.md)
- **msg.value reused across calls**: Payable batch or delegatecall forwards same value to multiple targets (https://bugbountylibrary.com/r/c4%3A2022-08-mimo%3AM-04.md)
