BUG BOUNTYFIELD MANUAL
Target playbooks
Markdown
0 / 18 checkedChecks last until this page reloads.

Web3, smart contracts and blockchain protocols

Treat this branch as an audit of deployed state, economic rules and trust assumptions. Solidity source is only part of the target. A valid finding connects an attacker action to an eligible impact on the correct deployment; an interesting flaw in a repository does not establish that connection.

Investigation modules#

Use these procedures with this playbook's setup and scope. Each contains the full testing sequence, command cheat sheet, interpretation, and checklist; open its canonical page for cross-target references.

Workflow invariants, replay, idempotency, and racesFind security consequences in workflow ordering and concurrency, with serial controls and durable-state evidence.

Open canonical module and reverse references

Investigation sequence
  1. 01Write business invariant
  2. 02Capture normal transitions
  3. 03Change ordering or replay
  4. 04Compare serial control
  5. 05Try bounded lab concurrency
  6. 06Verify committed state

At each step: retain the control → record the observation → continue only while the next boundary is understood.

Setup and invariant

Choose one reversible workflow in a local or nonfinancial sandbox: accepting an invitation, creating one test resource, applying a test credit, approving a draft, or consuming a one-time action. Write the exact invariant, for example: one invitation grants at most one membership, to its intended recipient and role. Record preconditions, state transitions, actor permissions, durable result, retries, and cleanup. Logic findings depend on intended rules, not whether the request is technically valid. Business logic.

Numbered test procedure

  1. Draw the normal transition table. List draft → submitted → approved → completed, or the product's actual equivalent. For each edge, record actor, required prior state, immutable fields, and transaction identifier. Perform one normal run with synthetic objects and save before/after state, not just HTTP responses.
  2. Test skipped and reordered transitions. On a fresh disposable object, attempt the observed completion request before approval. Then change only a value that should be frozen after approval, such as recipient or test quantity. Compare with a fully approved control and an invalid object ID. If a transition is intentionally optional, adjust the invariant rather than treating missing UI steps as a bug.
  3. Test serial replay. Repeat the same completed operation once after it settles. For documented idempotency keys, compare the same key/same body with the same key/different body, using sandbox data. Determine whether keys are scoped by actor, tenant, endpoint, and expiry. Returning the first result again can be correct idempotent behavior.
  4. Test boundary values selectively. Use zero, a single negative value, or a precision boundary only where the sandbox permits it. Record server-calculated totals and immutable values. Avoid real billing, inventory, refunds, transfers, or customer notifications. A strange displayed number without a committed consequence is not enough.
  5. Test concurrency only in an authorized setting. First demonstrate expected serial behavior. Reset a test object, then send exactly two simultaneous requests as a small experiment. The local example below uses a barrier; it does not guarantee server arrival within the vulnerable interval. If there is no overlap, record inconclusive timing rather than absence of a race. More aggressive synchronization belongs in the isolated lab. Race conditions.
  6. Inspect after completion. Wait for both requests and relevant workers. Count durable memberships/resources or inspect the ledger of synthetic events. Two success responses may correspond to one commit. Repeat only to resolve a specific uncertainty, then restore the object and stop at the first demonstrated invariant failure.

Command card

This sends exactly two requests to a disposable local invitation endpoint. Put a valid local test bearer token in A.token, with restrictive permissions, and replace the route with the observed one. Create a fresh invitation for each serial/concurrent comparison. Run against localhost only.

from concurrent.futures import ThreadPoolExecutor
from pathlib import Path
from threading import Barrier
from urllib.request import Request, build_opener, ProxyHandler, HTTPRedirectHandler
from urllib.error import HTTPError

class NoRedirect(HTTPRedirectHandler):
    def redirect_request(self, req, fp, code, msg, headers, newurl):
        return None

gate = Barrier(2)
token = Path('A.token').read_text().strip()
def attempt(index):
    req = Request('http://127.0.0.1:8000/api/invitations/TEST-INVITE/accept',
                  data=b'{}', method='POST',
                  headers={'Authorization': 'Bearer ' + token,
                           'Content-Type': 'application/json'})
    gate.wait()
    try:
        with build_opener(ProxyHandler({}), NoRedirect()).open(req, timeout=10) as response:
            return index, response.status, response.read(1024).decode(errors='replace')
    except HTTPError as error:
        return index, error.code, error.read(1024).decode(errors='replace')

with ThreadPoolExecutor(max_workers=2) as pool:
    print(list(pool.map(attempt, range(2))))

Report threshold and checklist

Report a durable violation of the stated rule, with serial controls, initial conditions, minimal request sequence, and final state. Duplicate responses, transient UI counters, expected retries, and intentionally cumulative operations are common false positives. Describe the demonstrated consequence; do not infer financial loss from a sandbox counter alone.

  • Business rule and expected actor written down.
  • Normal and serial-replay controls completed.
  • Fresh fixture used for each experiment.
  • Only bounded authorized concurrency used.
  • Durable state and asynchronous effects verified.

The Python example disables environment proxies and redirect following. A redirect is captured by the HTTPError branch; inspect its destination before any separate request.

Events that arrive after the request

Apply the same invariant to workers and integration events, not only the HTTP endpoint. Record a deduplication key's scope and when it becomes durable relative to the protected effect. A claim written before a worker fails can lose work; a claim written after the effect can permit duplicates. Use an instrumented fault point in the replica to distinguish these cases, and inspect committed state after retry. Then run the webhook event integrity procedure for signature, event ownership and out-of-order delivery checks. Do not assume provider delivery time is a reliable object version or that an HTTP acknowledgement proves processing completed.

Contract state: authorization, callbacks and accountingTurn protocol promises into explicit invariants and test realistic local operation sequences with independent accounting.

Open canonical module and reverse references

Investigation sequence
  1. 01Resolve implementation
  2. 02Write unit-aware invariants
  3. 03Build actor baseline
  4. 04Exercise sequences
  5. 05Minimize state trace

At each step: retain the control → record the observation → continue only while the next boundary is understood.

Setup and security invariant#

Prepare a reviewed local checkout with dependencies and compiler already available. Use a private local EVM test harness; keep wallet secrets absent and review configuration for FFI, RPC endpoints and fork creation before execution. Record commit, compiler settings, proxy family, implementation, initialized roles and supported token behavior. A local reproduction against a simplified model explains an idea; an eligible report must establish that the same path exists in the relevant deployed implementation.

Write properties using explicit units: assets, shares, debt, fees and time. For example, redeeming a claim cannot pay more assets than its defined entitlement, and an ordinary actor cannot change the implementation or initialize an already initialized proxy. Do not equate token balance and share supply. Reuse the authorization matrix for actors and protected transitions. OpenZeppelin documents proxy-specific initialization and upgrade behavior, so inspect the actual family and version. OpenZeppelin proxies

Controlled procedure#

  1. Build realistic actors. Separate setup administrator, ordinary depositor A, depositor B and callback receiver. Setup may allocate synthetic tokens, but record each privilege and stop using administrator impersonation before the candidate sequence. Verify a normal deposit/redemption round trip and expected privileged-operation rejection.
  2. Trace callbacks. Mark every external call and the state visible at that instant. Give an owned callback contract one bounded reentry attempt into the original or a related function. Compare with a receiver that accepts the callback without reentry. Solidity warns that reentrancy concerns external contract calls and interacting contracts, not only Ether transfers. Solidity security considerations
  3. Track independent accounting. Record user assets, shares, protocol holdings, debts and fees before and after every action. Calculate the expected relationship independently of the implementation under test. For rounding, test zero supply, minimal amounts, mixed decimals, partial redemption and a direct donation, using only supported tokens. Quantify attacker cost as well as victim loss. ERC-4626 conversions and donations can expose rounding-sensitive states. OpenZeppelin ERC-4626
  4. Exercise ordering. Try short valid sequences: deposit → transfer shares → redeem; deposit → donate → second deposit; callback → related read/write; initialize → initialize again. Change one amount, role or order at a time. Count successful state-changing calls so an all-revert fuzz run cannot be mistaken for coverage.
  5. Minimize the failure. Reduce the sequence and amounts while preserving the violated property. Run the identical sequence with the benign callback or corrected authorization as a control. Preserve the earliest inconsistent state as well as the final balance difference.

Harness and command cheat sheet#

Create target-specific test functions; the names below are a suggested harness contract, not built-in Foundry scans.

Function Required assertion
test_BaselineRoundTrip Expected fees and rounding explain final balances
test_UnauthorizedUpgradeDenied Ordinary actor cannot alter implementation
test_CallbackInvariant Bounded callback preserves the chosen property
test_MinimizedSequence Replays exact candidate and checks measured effect
git rev-parse HEAD
forge --version
rg -n 'ffi|rpc_endpoints|createFork|createSelectFork' foundry.toml test
forge test --match-test '^test_BaselineRoundTrip$' -vvvv
forge test --match-test '^test_CallbackInvariant$' -vvvv
forge test --match-test '^test_MinimizedSequence$' -vvvv

Run only after the named local tests exist and their setup has been reviewed. --match-test selects your tests; verbosity exposes local traces. These commands do not broadcast transactions, but test code can explicitly access external resources, which is why harness review matters. Foundry test reference

Evidence, false positives and completion#

Provide the implementation identity, exact harness, trace, initial capital, privileges, unit-aware balance sheet and bounded impact. Exclude unsupported malicious-token assumptions, fabricated oracle authority, admin-only behavior working as designed, and a callback that cannot occur in the real path.

  • Baseline exercises the same implementation and setup.
  • Actor powers match the claimed attack model.
  • Successful transitions and reverts are counted.
  • Loss is demonstrated independently of total value locked.
  • Reproduction stays entirely in the local EVM.
Contract signatures and oracles: context, freshness and unitsTest signed-action context and price-consumer assumptions with local keys, mock feeds and explicit negative controls.

Open canonical module and reverse references

Investigation sequence
  1. 01Record trust contract
  2. 02Prove valid baseline
  3. 03Vary one binding
  4. 04Vary feed metadata
  5. 05Calculate consequence

At each step: retain the control → record the observation → continue only while the next boundary is understood.

Setup and invariants#

Create two locally deployed verifier instances, a local-only signer, two ordinary actors and a mock feed whose state you can vary. Write the expected signed action as a tuple: signer, action type, recipient, amount, nonce, deadline, chain and verifying contract. Record which fields the application intentionally binds. The invariant is: a signed instruction permits only its intended action and replay policy. EIP-712 defines typed hashing and domain separation; replay protection remains the application's responsibility. EIP-712

For price consumers, record base/quote currency, feed decimals, token decimals, supported price range, freshness policy and dependency-failure behavior. The invariant is: an accepted observation has the meaning and validity required for the resulting economic decision. Chainlink exposes round metadata and timestamps; consumers must interpret them in their own integration. Chainlink data-feed API

Controlled procedure#

  1. Prove both baselines. A valid local signature executes its harmless ledger action once. A fresh positive-price feed produces the expected collateral or quote calculation. Verify an invalid signature and an explicitly disallowed stale observation are rejected, where that policy is part of the product's contract.
  2. Vary one signature dimension. After the valid action, replay exactly the same bytes. Then use fresh baselines to vary only the recipient, amount, action type, verifier instance, chain context or expired timestamp. Record the recovered signer and nonce-consumption point. A reverting transaction normally rolls back its state; prove whether the replay state survives a successful action rather than assuming a pre-revert write consumed the nonce.
  3. Check alternate signer paths. If contract wallets are supported, compare an owned wallet returning the ERC-1271 success value 0x1626ba7e, a wallet returning a different value, and a reverting wallet. A non-reverting call alone does not establish a valid signature. ERC-1271 validity can depend on current contract state: change the authorized local signer after a valid baseline and repeat only where the consumer promises current authorization. Record validation at execution versus an intentionally earlier irrevocable authorization. Do not classify unsupported signature formats as a vulnerability. Reuse identity and session binding for off-chain issuance. ERC-1271.
  4. Vary feed metadata. Starting from a valid response, test an old timestamp, zero or negative answer where the feed type can produce it, changed decimals, failed feed call and mismatched quote currency. Keep all other fields realistic. Demonstrate the consumer's accepted result and economic effect; an artificial impossible feed response is a robustness result until reachable conditions are shown.
  5. Test L2 recovery if applicable. Model sequencer down, just restarted and beyond the configured grace period separately. This is integration-specific: not every chain or feed uses identical checks. Chainlink's L2 guidance explains uptime signals and post-recovery grace periods. L2 sequencer feeds
  6. Calculate the consequence. Compare collateral, debt, quote or liquidation outcome with an independently calculated expectation. Include price units, rounding, capital, timing, fees and user constraints. A missing named check without a reachable incorrect decision remains a review lead.

Local cheat sheet and case matrix#

Implement these names in your reviewed local Foundry harness; they are not scanner features. The signer key must be generated or hard-coded solely for this disposable local fixture.

rg -n 'ecrecover|nonces|deadline|DOMAIN_SEPARATOR|latestRoundData|decimals' src
forge test --match-test '^test_ValidSignature$' -vvvv
forge test --match-test '^test_ReplayRejected$' -vvvv
forge test --match-test '^test_WrongDomainRejected$' -vvvv
forge test --match-test '^test_StaleFeedRejected$' -vvvv
forge test --match-test '^test_PriceUnitInvariant$' -vvvv

--match-test selects target-specific tests and trace verbosity helps identify the accepted transition. Use preinstalled compiler/dependencies and no RPC/fork/FFI setup for these local fixtures. Foundry test reference

Comparison Hold constant Vary
Replay Signature, actor, verifier Prior successful consumption
Domain Message and signature Local verifier or chain context
Freshness Price and units Observation timestamp
Unit conversion Economic value Supported decimal representation

Evidence and checklist#

  • Exact message schema, domain and successful baseline are saved.
  • Only one context field changes in each negative case.
  • Mock feed deviations are separated from reachable attacker powers.
  • Nonces, timestamps, units and downstream decisions appear in evidence.
  • No real signatures, transactions or funds are used.

Vulnerability reference#

Race condition in a security-sensitive transition · Workflow order or approval bypass · Single-use action or idempotency replay failure · Contract callback reentrancy violates a state invariant · Contract initializer permits unauthorized ownership or configuration · Contract upgrade authority can be bypassed · Vault share conversion or rounding breaks entitlement · Signed contract action can be replayed unexpectedly · Signed action does not bind its intended context · Oracle freshness or dependency state permits an invalid decision · Oracle denomination or decimal conversion is incorrect

Roadmap and entry criteria#

Stage Work product Exit criterion
Execution semantics Local examples covering storage, calls, delegate calls, revert behavior, token hooks and signing Explain which address owns state and which actor has authority at every call boundary
Protocol accounting A balance-sheet model for one vault, lending market or exchange Derive asset, liability, share and fee relationships with explicit units and rounding
Stateful research Deterministic reproductions and a handler-based invariant suite Reach meaningful sequences of operations without granting unrealistic powers
Bounty investigation Deployment manifest, hypotheses, minimal fork PoC and impact calculation Reproduce against the eligible version and satisfy the program’s reporting requirements

This is a suggested competency sequence, not a promise that a particular number of weeks produces paid findings. Start with a compact protocol whose accounting you can explain completely before adding cross-chain messaging or consensus machinery.

Scope and environment gate#

Save the program page, excluded impacts, known issues, audit exclusions and PoC requirements. Record chain name and chain ID; proxy address; implementation, beacon or facet addresses where applicable; deployment transaction; repository commit; compiler and optimizer settings; dependencies; fork block number and block hash; roles; external oracle and token addresses. Distinguish currently deployed contracts from proposed upgrades, deprecated deployments and test fixtures. OpenZeppelin documents materially different proxy families and initialization requirements, so resolve the actual architecture instead of assuming every address is a simple implementation. Proxy documentation

Check whether eligibility follows explicit asset/file rules or primacy of impact. On Immunefi, some programs allow eligible impacts on project-owned assets beyond the explicit list; that does not make all related organizations, test files or impacts eligible. Apply the exact program’s categories and limitations. Example program explanation

Immunefi currently prohibits testing on mainnet and public testnet contracts. Use a local fork; do not deploy an exploit or submit transactions to a live network. Its rules also prohibit unauthorized rescue of funds, incomplete required PoCs, and misleading asset or severity claims. A public testnet is therefore not a default alternative. For other programs, use a private development network or the expressly authorized environment. Immunefi rules

Forking reads chain state through an RPC provider but executes the test locally. Keep production signing keys out of the research environment. Separate the read-only upstream RPC configuration from local transaction tooling. An ordinary RPC account and its quotas remain a separate service dependency. Pinning a block makes the result reproducible and prevents a moving head from silently changing the experiment. Foundry fork testing

Operational playbook#

1. Reconstruct the economic model. Write down who contributes value, who can withdraw it, who bears losses, and who changes parameters. Follow deposits through shares, debt, collateral, interest, rewards, liquidation and settlement. Mark units on every variable: raw token units, decimals, normalized values, seconds, basis points and shares. Build two ordinary users, a permissionless attacker and the actual administrative roles in the local model. Keep privileged setup separate from attacker actions.

2. Identify invariants before choosing tools. Examples are: one claim cannot settle twice; unauthorized users cannot change ownership; liabilities remain covered under documented assumptions; withdrawals burn the correct claim; an operation cannot create value merely through rounding; and a completed cross-chain transfer cannot execute again. These are candidate properties requiring adaptation, not universal formulas. For example, comparing vault assets directly to share supply is invalid when their units or exchange rate differ.

3. Trace trust transitions. Review user-to-router, router-to-pool, callback-to-caller, implementation-to-proxy, oracle-to-consumer and message-to-executor boundaries. Reentrancy can involve another function or another contract, rather than only recursion into one withdrawal. Establish what state is observable during external calls and whether a downstream component trusts an inconsistent intermediate value. Solidity security considerations

4. Use static findings as hypotheses. Build with the project’s compatible toolchain and inspect Slither output alongside inheritance, call relationships and deployment configuration. A detector match is not proof of reachable loss. Do not discard a dependency finding solely because it originates under lib/; first determine whether the affected behavior reaches an eligible asset. Conversely, a clean static scan does not validate the economics. Slither usage

5. Exercise sequences and adversarial actors locally. Handlers should prepare valid balances, approvals and positions, then vary operation order and amounts. Inspect successful call counts and discarded inputs: an invariant suite that repeatedly reverts before changing state provides weak evidence. Keep a seed or minimized sequence, configuration and fork snapshot. Use ghost accounting independent of the implementation being tested. Foundry invariant testing

6. Minimize the proof and calculate bounded impact. Show initial state, necessary preconditions, attacker actions, resulting victim/protocol loss and the failed property. Disclose flash liquidity, fees, slippage, collateral, timing and privileges. Do not claim total value locked as loss unless the demonstrated path reaches it. Local balance provisioning is a test convenience; minting arbitrary collateral, impersonating a privileged operator or forcing an impossible oracle state does not demonstrate that an ordinary attacker can do the same.

Technical checklist#

Area Investigation Evidence that advances a report
Deployment identity Correct chain, implementation and configuration at the pinned block Address/commit manifest and the executed call path
Authorization Initializers, role delegation, upgrade authority, emergency controls, arbitrary call permissions An unprivileged actor crosses the documented permission boundary
Accounting Deposits, redemptions, fees, debt indexes, rewards, donations, empty pools Before/after balance sheet with explicit units and a violated relationship
Token behavior Supported fee-on-transfer, rebasing, hooks, nonstandard returns and decimal variation A supported integration produces incorrect accounting or authority
Oracle integration Price denomination, freshness, decimals, failure modes and L2 downtime Reachable accepted input causes an incorrect economic decision
Callbacks Callback authentication, intermediate state, cross-function and cross-contract reentry A local trace showing the unexpected state transition and impact
Signatures Domain, signer, nonce, deadline, action binding, chain and verifying contract A signature authorizes an unintended second action or context
Governance Snapshot voting, quorum, proposal state, timelock, cancellation and execution A locally demonstrated bypass of the actual governance guarantees
Bridges Source authentication, destination binding, message uniqueness, ordering and finality A local two-sided model with a duplicated or unauthorized state transition
Liveness Unbounded processing, poisoned queues, dependency failure and recovery A bounded local test proving eligible user funds or operations become stuck
Economic ordering Slippage, deadlines, quote validity and attacker-controlled order Loss exceeding intended, documented market behavior under feasible assumptions
Regression Current implementation and known exclusions Fresh reproduction and comparison with documented known issues

Oracle checks must be feed-specific. Chainlink exposes answer metadata and timestamps; applications must interpret values and freshness correctly. On supported L2 integrations, evaluate sequencer availability and any required recovery grace period. A missing generic check is only a lead until its concrete consequence is established. Data Feeds API, L2 sequencer feeds

Vault rounding and donations deserve explicit boundary tests around zero supply, small deposits and conversions. OpenZeppelin’s ERC-4626 discussion illustrates why share arithmetic and inflation defenses require economic reasoning. Signature review likewise needs more than finding EIP-712: the standard itself does not supply replay protection. Inspect application nonces, consumption and action binding. ERC-4626 security considerations, EIP-712

Governance review must follow the configured module composition: voting and execution may be separated, and a timelock changes which contract executes the action. Bridges introduce additional assumptions about relayers, validators and cross-chain finality. Reproduce these assumptions explicitly rather than replacing their security checks with unconditional mocks. OpenZeppelin governance, Ethereum bridges

MEV describes value extracted through transaction inclusion or ordering, including arbitrage and sandwich behavior. Its existence is not automatically a bounty vulnerability. The report must identify an eligible broken guarantee, realistic capital and ordering assumptions, and the resulting harm; reproduce ordering locally. Ethereum MEV

For non-EVM branches, retain the same scope and evidence model but replace the execution harness. Solana research needs account ownership, signer and writable privileges, PDA derivation and CPI boundaries; Sui/Move research needs module authority and object ownership; protocol/client research needs versioned consensus rules, serialization, state transitions and private multi-node reproductions. Treat these as separate specialization tracks, not as Solidity detector configurations. Select the chain’s official SDK and program-specific build requirements before testing. Solana privileges, Sui Move concepts, Ethereum client architecture

Command cheat sheet#

Run these from an isolated, reviewed local checkout with its required dependencies. CHAIN_RPC_URL is the permitted read-only state provider and FORK_BLOCK is a recorded decimal block number. Commands are examples of documented syntax, not a universal installer or completed PoC.

git rev-parse HEAD
forge --version
slither --version
forge build
slither . --json slither.json
forge test --match-test '^test_PoC$' \
  --fork-url "$CHAIN_RPC_URL" \
  --fork-block-number "$FORK_BLOCK" -vvvv
forge test --match-test '^invariant_' \
  --fork-url "$CHAIN_RPC_URL" \
  --fork-block-number "$FORK_BLOCK"

test_PoC and invariant_* are harness functions you implement; they are not built-in vulnerability checks. Preserve the harness, minimized inputs, dependency lock state and traces. Review untrusted build scripts before execution. Foundry testing, Forge test reference, Slither usage

Submission gate: correct eligible deployment; realistic attacker; reproducible local fork; necessary privileges disclosed; precise impact category; bounded loss; known issues checked; private reporting channel used; no real funds moved. Read the current PoC requirements linked by the program before submitting; a toy reimplementation can explain the idea but does not establish deployed impact.

Governance and non-EVM completion cases#

Go beyond a list of keywords for the protocol features actually present. For governance, record proposal identity, voting snapshot, quorum, queue time and execution authority. In a local fixture compare legitimate propose → vote → queue → execute with early execution, cancelled execution and a repeated execution. Check the actual composed modules: an intentionally permissionless timelock executor is different from bypassing its scheduled operation. Preserve roles and a harmless local target event. OpenZeppelin governance.

For a supported contract-wallet signer, compare ERC-1271's successful return with a different value and a reverting wallet, then test any state-dependent revocation contract. A non-reverting call is not sufficient signature validation. The expanded procedure is in contract signatures and oracles. ERC-1271.

For non-EVM deployments, make an explicit applicability ledger: signer/owner/writable/PDA/CPI cases for Solana; object ownership, shared-object transitions and capability authority for Move; serialization/state-transition/finality cases for clients and bridges. Mark an unavailable compatible harness as not tested rather than inheriting EVM coverage. A genuine bridge proof needs both sides' authentication and replay rules preserved; replacing verification with an unconditional mock only demonstrates the toy model.

  • Governance transitions include early, cancelled and repeated execution controls.
  • Contract-wallet acceptance checks its actual return semantics.
  • Chain-specific unsupported surfaces are visible as coverage limitations.

Sources#

All sources accessed 2026-09-11. Documentation pages are undated unless noted; versioned documentation must be matched to the target’s actual dependency version.

  1. Immunefi. Rules. Undated, current rules.
  2. Immunefi. Immunefi Bug Bounty: Information. Undated, current program example.
  3. Foundry. Fork Testing. Undated; search index displays 2026-08-28.
  4. Foundry. Testing. Undated; search index displays 2026-07-09.
  5. Foundry. forge test. Undated CLI reference.
  6. Foundry. Invariant Testing. Undated.
  7. Trail of Bits / Crytic. Slither Usage. Edited 2024-07-23.
  8. OpenZeppelin. Proxy. Contracts 5.x; undated.
  9. Solidity. Security Considerations. Rolling development documentation; undated.
  10. Chainlink. Data Feeds API Reference. Undated.
  11. Chainlink. L2 Sequencer Uptime Feeds. Undated.
  12. OpenZeppelin. ERC-4626. Contracts 5.x; undated.
  13. Ethereum Improvement Proposals. EIP-712: Typed structured data hashing and signing. Created 2017-09-12.
  14. OpenZeppelin. Governance. Contracts 5.x; undated.
  15. Ethereum.org. Bridges. Undated.
  16. Ethereum.org. Maximal extractable value (MEV). Undated.
  17. Solana. CPI Execution and Privileges. Undated.
  18. Sui. Move Concepts. Undated.
  19. Ethereum.org. Nodes and Clients. Undated.