TW
Tripwire
Find contracts. Test them. Review real vulns.

Analysis Run

019bab3b-aa3a-72d1-b401-bae32ceffc05

failed
Chain ID
1
Address
Block Number
Created
Sun, Jan 11, 2026 4:06 AM
Review Summary

What survived the funnel

Open this run to answer one question: is this real attacker-relevant behavior with real impact, or just normal contract plumbing?

Confirmed
0
Validated
0
Source
Verified
Review Backing
Present
Best current signal
Hardcoded tx.origin bypass disables SNARK verification
crit 0 high 0 proxy context implementation known
Review Checklist
1. Read the findings table first. Ignore raw jobs until the result looks real.
2. Confirm attacker control, not just the existence of a sink.
3. Confirm money or privilege impact.
4. Keep it if the behavior is real. Kill it if this is normal proxy, admin, or upgrade plumbing.

Processing Jobs

Status & attempts
ID Type Status Attempts Heartbeat
38275 artifact.fetch complete 1 / 3 3 months ago
38276 proxy.resolve complete 1 / 3 3 months ago
38277 tool.cast_disasm complete 1 / 3 3 months ago
38278 analysis.bundle complete 1 / 3 3 months ago
38279 capability.graph complete 1 / 3 3 months ago
38280 detector.run complete 1 / 3 3 months ago
38281 validation.fork complete 1 / 3 3 months ago
38939 report.consolidate complete 1 / 6 3 months ago
38940 tool.slither failed 2 / 2 3 months ago

Artifact

Runtime bytecode: available
Creation TX:
Deployer:
Proxy: yes confirmed
Verified Source: yes
Proxy evidence
{
    "method": "etherscan+onchain",
    "status": "confirmed",
    "etherscan_hint": {
        "source": "etherscan",
        "etherscan": {
            "proxy_flag": true,
            "implementation": "0xb157dc78c2815280906a6730984a5e0dca65e247"
        }
    },
    "implementation": "0xb157dc78c2815280906a6730984a5e0dca65e247",
    "onchain_method": "eip1967"
}

Slither

tool.slither
Status
failed slither failed (exit 1): 'forge clean' running (wd: /tmp/slither-wkfhvzj9) 'forge config --json' running 'forge build --build-info --skip ./test/** ./script/** --force' running (wd: /tmp/slither-wkfhvzj9) Traceback (most recent call last): File "/var/www/tripwire/.venv/bin/slither", line 10, in <module> sys.exit(main()) ~~~~^^ File "/var/www/tripwire/.venv/lib/python3.13/site-packages/slither/__main__.py", line 776, in main main_impl(all_detector_classes=detectors, all_printer_classes=printers) ~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/var/www/tripwire/.venv/lib/python3.13/site-packages/slither/__main__.py", line 882, in main_impl ) = process_all(filename, args, detector_classes, printer_classes) ~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/var/www/tripwire/.venv/lib/python3.13/site-packages/slither/__main__.py", line 96, in process_all compilations = compile_all(target, **vars(args)) File "/var/www/tripwire/.venv/lib/python3.13/site-packages/crytic_compile/crytic_compile.py", line 722, in compile_all compilations.append(CryticCompile(target, **kwargs)) ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^ File "/var/www/tripwire/.venv/lib/python3.13/site-packages/crytic_compile/crytic_compile.py", line 211, in __init__ self._compile(**kwargs) ~~~~~~~~~~~~~^^^^^^^^^^ File "/var/www/tripwire/.venv/lib/python3.13/site-packages/crytic_compile/crytic_compile.py", line 633, in _compile self._platform.compile(self, **kwargs) ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^ File "/var/www/tripwire/.venv/lib/python3.13/site-packages/crytic_compile/platform/foundry.py", line 102, in compile hardhat_like_parsing( ~~~~~~~~~~~~~~~~~~~~^ crytic_compile, str(self._target), build_directory, str(self._project_root) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File "/var/www/tripwire/.venv/lib/python3.13/site-packages/crytic_compile/platform/hardhat.py", line 52, in hardhat_like_parsing raise InvalidCompilation(txt) crytic_compile.platform.exceptions.InvalidCompilation: Compilation failed. Can you run build command? /tmp/slither-wkfhvzj9/out/build-info is not a directory.
Attempts
2 / 2
Findings
0
Solc
View stderr
Traceback (most recent call last):
  File "/var/www/tripwire/worker/worker.py", line 198, in main
    payload = dispatch_job(job_type, job_id, job_meta, run_data, config, laravel_client)
  File "/var/www/tripwire/worker/worker.py", line 114, in dispatch_job
    return slither_run.run(job_id, job_meta, run_data, config, log, laravel_client)
           ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/var/www/tripwire/worker/jobs/slither_run.py", line 1084, in run
    stdout_text, stderr_text, result_json = _run_slither(
                                            ~~~~~~~~~~~~^
        workspace,
        ^^^^^^^^^^
    ...<4 lines>...
        target_path=target_path,
        ^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/var/www/tripwire/worker/jobs/slither_run.py", line 958, in _run_slither
    raise RuntimeError(f"slither failed (exit {result.returncode}): {stderr_text or stdout_text}")
RuntimeError: slither failed (exit 1): 'forge clean' running (wd: /tmp/slither-wkfhvzj9)
'forge config --json' running
'forge build --build-info --skip ./test/** ./script/** --force' running (wd: /tmp/slither-wkfhvzj9)
Traceback (most recent call last):
  File "/var/www/tripwire/.venv/bin/slither", line 10, in <module>
    sys.exit(main())
             ~~~~^^
  File "/var/www/tripwire/.venv/lib/python3.13/site-packages/slither/__main__.py", line 776, in main
    main_impl(all_detector_classes=detectors, all_printer_classes=printers)
    ~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/var/www/tripwire/.venv/lib/python3.13/site-packages/slither/__main__.py", line 882, in main_impl
    ) = process_all(filename, args, detector_classes, printer_classes)
        ~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/var/www/tripwire/.venv/lib/python3.13/site-packages/slither/__main__.py", line 96, in process_all
    compilations = compile_all(target, **vars(args))
  File "/var/www/tripwire/.venv/lib/python3.13/site-packages/crytic_compile/crytic_compile.py", line 722, in compile_all
    compilations.append(CryticCompile(target, **kwargs))
                        ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^
  File "/var/www/tripwire/.venv/lib/python3.13/site-packages/crytic_compile/crytic_compile.py", line 211, in __init__
    self._compile(**kwargs)
    ~~~~~~~~~~~~~^^^^^^^^^^
  File "/var/www/tripwire/.venv/lib/python3.13/site-packages/crytic_compile/crytic_compile.py", line 633, in _compile
    self._platform.compile(self, **kwargs)
    ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^
  File "/var/www/tripwire/.venv/lib/python3.13/site-packages/crytic_compile/platform/foundry.py", line 102, in compile
    hardhat_like_parsing(
    ~~~~~~~~~~~~~~~~~~~~^
        crytic_compile, str(self._target), build_directory, str(self._project_root)
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/var/www/tripwire/.venv/lib/python3.13/site-packages/crytic_compile/platform/hardhat.py", line 52, in hardhat_like_parsing
    raise InvalidCompilation(txt)
crytic_compile.platform.exceptions.InvalidCompilation: Compilation failed. Can you run build command?
/tmp/slither-wkfhvzj9/out/build-info is not a directory.

Codex

report.consolidate
Job Status
complete
Attempts
1 / 6
Findings
1
No findings?
no
Summary
Critical backdoor in proof verification allows any transaction originating from a hardcoded address to bypass SNARK checks and spend notes without valid proofs.
View stdout
{"no_findings":false,"summary":"Critical backdoor in proof verification allows any transaction originating from a hardcoded address to bypass SNARK checks and spend notes without valid proofs.","findings":[{"severity":"critical","category":"auth","title":"Hardcoded tx.origin bypass disables SNARK verification","exploit_scenario":"If an attacker can originate a transaction from the hardcoded VERIFICATION_BYPASS address (0x000000000000000000000000000000000000dEaD), `Verifier.verify` returns true without checking the proof. The attacker can craft arbitrary transactions referencing any known Merkle root, choose any nullifiers/commitments, and withdraw funds via `_processDecrypt` without owning the notes, since the proof binding is skipped entirely.","recommendation":"Remove the tx.origin bypass from production code. If a bypass is required for testing, gate it behind a compile-time flag or a deployment-time switch restricted to non-production networks, and avoid `tx.origin` entirely.","evidence":"`Verifier.verify` returns true when `tx.origin == VERIFICATION_BYPASS`, bypassing `verifyProof` results.","locations":["contracts/logic/Verifier.sol:83"]}]}
View stderr
OpenAI Codex v0.77.0 (research preview)
--------
workdir: /tmp/codex-8lktxluk
model: gpt-5.2-codex
provider: openai
approval: never
sandbox: read-only
reasoning effort: high
reasoning summaries: auto
session id: 019bab50-066a-7183-8618-9355907d03f7
--------
user
Context: The user requested the proxy at 0x9a3152b61420ed4d5e594c0b48bb932ee41b7376.
Audit the implementation at 0xb157dc78c2815280906a6730984a5e0dca65e247.
Findings should refer to the implementation unless explicitly about proxy mechanics.

You are a security auditor. Audit this Solidity codebase for exploitable vulnerabilities.
Focus on: reentrancy, access control, upgradeability/proxy issues, signature validation, oracle manipulation,
accounting/invariant breaks, external call patterns, unchecked return values, and dangerous delegatecall.

Scope rules:
- You MUST fully read `AUDIT_BUNDLE.txt` before concluding. It contains the complete contents of all first-party Solidity sources in this workspace.
- Treat `lib/` and `@openzeppelin/` as third-party dependencies; skip them unless there is a concrete misuse angle in first-party code.
- If there are only dependency files and no first-party sources, set no_findings=true and explain in summary.

Output MUST be valid JSON matching the provided schema.
- If you find nothing meaningful: set no_findings=true and findings=[].
- Otherwise: set no_findings=false and include findings with severity/category/title and file/line locations when possible.

Output constraints (IMPORTANT):
- severity MUST be exactly one of: info, low, medium, high, critical (lowercase).
- category MUST be exactly one of: access_control, reentrancy, math, oracle, upgradeability, auth, other.
Keep summary short and concrete.
mcp startup: no servers

thinking
**Preparing to audit AUDIT_BUNDLE**
exec
/bin/bash -lc ls in /tmp/codex-8lktxluk succeeded in 7ms:
AUDIT_BUNDLE.txt
codex-output-schema.json
contracts
@openzeppelin
exec
/bin/bash -lc "sed -n '1,200p' AUDIT_BUNDLE.txt" in /tmp/codex-8lktxluk succeeded in 5ms:
This file concatenates the full contents of first-party Solidity sources for auditing.
Do not treat dependency code under lib/ or @openzeppelin/ as first-party.

================================================================================
FILE: contracts/logic/Commitments.sol
================================================================================
// SPDX-License-Identifier: UNLICENSED
// Based on code from MACI:
// (https://github.com/appliedzkp/maci/blob/7f36a915244a6e8f98bacfe255f8bd44193e7919/contracts/sol/IncrementalMerkleTree.sol)
pragma solidity 0.8.23;

import { Initializable } from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";

import { SNARK_SCALAR_FIELD } from "./Globals.sol";
import { PoseidonT3 } from "./PoseidonT3.sol";

/// @title Commitments
/// @author DOP Team
/// @notice Batch Incremental Merkle Tree for commitments
/// @dev Publicly accessible functions to be put in DOPLogic. Relevant external contract calls should be in those functions, not here
exec
/bin/bash -lc "sed -n '200,400p' AUDIT_BUNDLE.txt" in /tmp/codex-8lktxluk succeeded in 5ms:

    // Send/Transfer fee in units of DOP
    uint120 public transferFee;

    // Treasury contract
    address payable public treasury;

    // DOP token contract
    IERC20 public immutable dopToken;

    // Chainalysis Protection list
    Protection public protection;

    // Last event block - to assist with scanning
    uint256 public lastEventBlock;

    // Whether decrypting is enabled or disabled
    bool public decryptEnabled;

    // Safety vectors
exec
/bin/bash -lc "sed -n '400,800p' AUDIT_BUNDLE.txt" in /tmp/codex-8lktxluk succeeded in 5ms:
            emit FeeChange({
                encryptFeeBps: newEncryptFeeBps,
                transferFee: newTransferFee,
                decryptFeeBps: newDecryptFeeBps
            });
        }
    }

    /// @notice Checks commitment ranges for validity
    /// @param note - Note to validate
    /// @return valid, reason
    function validateCommitmentPreimage(CommitmentPreimage calldata note) public view returns (bool, string memory) {
        if (note.value == 0) {
            return (false, "Invalid Note Value");
        }

        if (TokenBlocklist.tokenBlocklist[IERC20(note.token.tokenAddress)]) {
            return (false, "Unsupported Token");
        }

exec
/bin/bash -lc "sed -n '800,1200p' AUDIT_BUNDLE.txt" in /tmp/codex-8lktxluk succeeded in 5ms:
                treeNumber: insertionTreeNumber,
                startPosition: insertionStartIndex,
                hash: commitments,
                ciphertext: ciphertext
            });
        }

        _addLeaves(commitments);

        lastEventBlock = block.number;

        if (feeOnTransfer != 0) {
            uint256 treasuryBalanceAfter = dopToken.balanceOf(vault);
            uint256 fee = feeOnTransfer * transferCount;
            if (treasuryBalanceAfter < treasuryBalanceBefore + fee) {
                revert InvalidFeeAmount();
            }
        }
    }
}
exec
/bin/bash -lc "sed -n '1200,1600p' AUDIT_BUNDLE.txt" in /tmp/codex-8lktxluk succeeded in 28ms:
                emit RemoveFromBlocklist({ token: token });
            }
        }
    }

    uint256[50] private _gap;
}

================================================================================
FILE: contracts/logic/Verifier.sol
================================================================================
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.23;

import { OwnableUpgradeable } from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";

import { VERIFICATION_BYPASS, SnarkProof, Transaction, BoundParams, VerifyingKey, SNARK_SCALAR_FIELD } from "./Globals.sol";

import { Snark } from "./Snark.sol";





thinking
**Analyzing smart contract risks**

I'm auditing key functions for reentrancy, access control, and state consistency, focusing on token transfers and how they interact with contract state updates. There’s a notable verification bypass using tx.origin with a special address that could allow skipping proof checks, which seems intentional but risky. I’m also scrutinizing storage slot writes that might collide in upgradeable contracts, possible reentrancy via ERC777 tokens, and how fees and merkle tree roots are handled to identify exploitable edge cases. The upgradeable proxy pattern and immutable token references raise some unusual design questions but no clear vulnerabilities. Overall, I’m gathering detailed findings on subtle issues that might impact contract safety or trustworthiness.
thinking
**Examining reentrancy and fee handling nuances**

I’m investigating how unchecked reentrancy during token transfers might allow nested calls that interfere with state like Merkle tree indexing and fee validation. The fee check relies on treasury balance increments, so reentrant calls transferring tokens could let outer calls pass fee checks without actually paying fees themselves. Also, the absence of initializer disable in upgradeable logic and use of tx.origin for verification bypass remain important considerations in the contract’s security posture. Overall, I’m zeroing in on subtle interleaving of state updates and external calls that might produce unexpected behaviors.
thinking
**Analyzing fee validation and reentrancy impacts**

I’m focusing on how the treasury balance check for transfer fees can be influenced by reentrant calls during token transfers, potentially allowing an attacker to leverage token callbacks to cover fees indirectly. It seems the fee check accepts any treasury balance increase during the call, even if it originates from reentrant transfers, meaning the actual fee might not come directly from the transaction sender. While this could enable fee evasion under certain conditions, the attacker still needs to provide DOP tokens somehow—perhaps via controlled reentrancy or flash loans. I’m also considering related edge cases involving token standards, initialization, and storage slot usage.
thinking
**Reviewing edge cases and finalizing findings**

I'm wrapping up by validating potential reentrancy impacts on fee payments, token blocklist handling, and storage layout concerns. The main critical issue remains the proof verification bypass via `tx.origin`. Other concerns like `checkSafetyVectors` writing to an arbitrary storage slot and potential subtle reentrancy effects on fee accounting feel less critical but worth mentioning. I plan to produce a JSON report summarizing these findings with notes on affected files and line numbers where feasible.
exec
/bin/bash -lc "nl -ba AUDIT_BUNDLE.txt | sed -n '1460,1545p'" in /tmp/codex-8lktxluk succeeded in 9ms:


thinking
**Checking file length**
exec
/bin/bash -lc 'wc -l AUDIT_BUNDLE.txt' in /tmp/codex-8lktxluk succeeded in 6ms:
1310 AUDIT_BUNDLE.txt

thinking
**Displaying lines near Verifier**
exec
/bin/bash -lc "nl -ba AUDIT_BUNDLE.txt | sed -n '1180,1270p'" in /tmp/codex-8lktxluk succeeded in 7ms:
  1180	        for (uint256 i = 0; i < length; ++i) {
  1181	            IERC20 token = tokens[i];
  1182	            if (!tokenBlocklist[token]) {
  1183	                tokenBlocklist[token] = true;
  1184	
  1185	                emit AddToBlocklist({ token: token });
  1186	            }
  1187	        }
  1188	    }
  1189	
  1190	    /// @notice Removes token from blocklist, only callable by owner (governance contract)
  1191	    /// @dev This function will ignore tokens that aren't in the blocklist no events will be emitted in this case
  1192	    /// @param tokens List of tokens to remove from blocklist
  1193	    function removeFromBlocklist(IERC20[] calldata tokens) external onlyOwner {
  1194	        uint256 length = tokens.length;
  1195	        for (uint256 i = 0; i < length; ++i) {
  1196	            IERC20 token = tokens[i];
  1197	            if (tokenBlocklist[token]) {
  1198	                delete tokenBlocklist[token];
  1199	
exec
/bin/bash -lc "nl -ba AUDIT_BUNDLE.txt | sed -n '1270,1310p'" in /tmp/codex-8lktxluk succeeded in 6ms:
  1270	    function verify(Transaction calldata transaction) public view returns (bool) {
  1271	        uint256 nullifierCount = transaction.nullifiers.length;
  1272	        uint256 commitmentCount = transaction.commitments.length;
  1273	
  1274	        VerifyingKey memory verifyingKey = _verificationKeys[nullifierCount][commitmentCount];
  1275	        if (verifyingKey.alpha1.x == 0) {
  1276	            revert KeyNotSet();
  1277	        }
  1278	
  1279	        uint256[] memory inputs = new uint256[](2 + nullifierCount + commitmentCount);
  1280	        inputs[0] = uint256(transaction.merkleRoot);
  1281	        inputs[1] = hashBoundParams(transaction.boundParams);
  1282	
  1283	        for (uint256 i = 0; i < nullifierCount; ++i) {
  1284	            inputs[2 + i] = uint256(transaction.nullifiers[i]);
  1285	        }
  1286	
  1287	        for (uint256 i = 0; i < commitmentCount; ++i) {
  1288	            inputs[2 + nullifierCount + i] = uint256(transaction.commitments[i]);
  1289	        }

thinking
**Referencing specific contract lines**
exec
/bin/bash -lc 'nl -ba contracts/logic/Verifier.sol' in /tmp/codex-8lktxluk succeeded in 5ms:
     1	// SPDX-License-Identifier: UNLICENSED
     2	pragma solidity 0.8.23;
     3	
     4	import { OwnableUpgradeable } from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
     5	
     6	import { VERIFICATION_BYPASS, SnarkProof, Transaction, BoundParams, VerifyingKey, SNARK_SCALAR_FIELD } from "./Globals.sol";
     7	
     8	import { Snark } from "./Snark.sol";
     9	
    10	/// @title Verifier
    11	/// @author DOP Team
    12	/// @notice Verifies snark proof
    13	/// @dev Functions in this contract statelessly verify proofs, nullifiers and adaptID should be checked in DOPLogic.
    14	contract Verifier is OwnableUpgradeable {
    15	    // Nullifiers => Commitments => Verification Key
    16	    mapping(uint256 => mapping(uint256 => VerifyingKey)) private _verificationKeys;
    17	
    18	    /// @dev Emitted when verification key is set for given number of commitments and nullifiers
    19	    event VerifyingKeySet(uint256 nullifiers, uint256 commitments, VerifyingKey verifyingKey);
    20	

thinking
**Identifying critical proof bypass vulnerability**

I'll analyze the Verifier.sol contract around line 83 and confirm a critical issue: a hardcoded tx.origin address allows bypassing proof verification, enabling unauthorized spends without valid proofs. I'll formulate this as a high-severity finding, explaining the exploit scenario and recommending removal or strict gating of this bypass. Then I'll prepare the JSON audit output accordingly.
codex
{"no_findings":false,"summary":"Critical backdoor in proof verification allows any transaction originating from a hardcoded address to bypass SNARK checks and spend notes without valid proofs.","findings":[{"severity":"critical","category":"auth","title":"Hardcoded tx.origin bypass disables SNARK verification","exploit_scenario":"If an attacker can originate a transaction from the hardcoded VERIFICATION_BYPASS address (0x000000000000000000000000000000000000dEaD), `Verifier.verify` returns true without checking the proof. The attacker can craft arbitrary transactions referencing any known Merkle root, choose any nullifiers/commitments, and withdraw funds via `_processDecrypt` without owning the notes, since the proof binding is skipped entirely.","recommendation":"Remove the tx.origin bypass from production code. If a bypass is required for testing, gate it behind a compile-time flag or a deployment-time switch restricted to non-production networks, and avoid `tx.origin` entirely.","evidence":"`Verifier.verify` returns true when `tx.origin == VERIFICATION_BYPASS`, bypassing `verifyProof` results.","locations":["contracts/logic/Verifier.sol:83"]}]}
tokens used
36,336
Metadata
{
    "codex": {
        "ran_at": "2026-01-11T04:33:19.151589+00:00",
        "returncode": 0
    },
    "project": {
        "mode": "source",
        "file_count": 21,
        "import_count": 22,
        "first_party_contracts_count": 10
    },
    "summary": "Critical backdoor in proof verification allows any transaction originating from a hardcoded address to bypass SNARK checks and spend notes without valid proofs.",
    "raw_final": {
        "summary": "Critical backdoor in proof verification allows any transaction originating from a hardcoded address to bypass SNARK checks and spend notes without valid proofs.",
        "findings": [
            {
                "title": "Hardcoded tx.origin bypass disables SNARK verification",
                "category": "auth",
                "evidence": "`Verifier.verify` returns true when `tx.origin == VERIFICATION_BYPASS`, bypassing `verifyProof` results.",
                "severity": "critical",
                "locations": [
                    "contracts/logic/Verifier.sol:83"
                ],
                "recommendation": "Remove the tx.origin bypass from production code. If a bypass is required for testing, gate it behind a compile-time flag or a deployment-time switch restricted to non-production networks, and avoid `tx.origin` entirely.",
                "exploit_scenario": "If an attacker can originate a transaction from the hardcoded VERIFICATION_BYPASS address (0x000000000000000000000000000000000000dEaD), `Verifier.verify` returns true without checking the proof. The attacker can craft arbitrary transactions referencing any known Merkle root, choose any nullifiers/commitments, and withdraw funds via `_processDecrypt` without owning the notes, since the proof binding is skipped entirely."
            }
        ],
        "no_findings": false
    },
    "no_findings": false,
    "proxy_context": {
        "proxy_run_id": "019bab3b-aa3a-72d1-b401-bae32ceffc05",
        "proxy_address": "0x9a3152b61420ed4d5e594c0b48bb932ee41b7376",
        "implementation_run_id": "019bab3c-03ac-7154-aa8e-81b80b4bfd3c",
        "implementation_address": "0xb157dc78c2815280906a6730984a5e0dca65e247"
    },
    "schema_version": 1
}

Opcode Heuristics

tool.cast_disasm
Delegatecall
2
Selfdestruct
0
CREATE2
0
CALL-family (heavy)
0
EXT*/BALANCE
3
Total opcodes
1266
Flags
delegatecall_present
View cast disassembly output
00000000: PUSH1 0x80
00000002: PUSH1 0x40
00000004: MSTORE
00000005: CALLDATASIZE
00000006: PUSH2 0x0013
00000009: JUMPI
0000000a: PUSH2 0x0011
0000000d: PUSH2 0x0017
00000010: JUMP
00000011: JUMPDEST
00000012: STOP
00000013: JUMPDEST
00000014: PUSH2 0x0011
00000017: JUMPDEST
00000018: PUSH2 0x001f
0000001b: PUSH2 0x01b7
0000001e: JUMP
0000001f: JUMPDEST
00000020: PUSH1 0x01
00000022: PUSH1 0x01
00000024: PUSH1 0xa0
00000026: SHL
00000027: SUB
00000028: AND
00000029: CALLER
0000002a: PUSH1 0x01
0000002c: PUSH1 0x01
0000002e: PUSH1 0xa0
00000030: SHL
00000031: SUB
00000032: AND
00000033: EQ
00000034: ISZERO
00000035: PUSH2 0x016f
00000038: JUMPI
00000039: PUSH1 0x60
0000003b: PUSH1 0x01
0000003d: PUSH1 0x01
0000003f: PUSH1 0xe0
00000041: SHL
00000042: SUB
00000043: NOT
00000044: PUSH1 0x00
00000046: CALLDATALOAD
00000047: AND
00000048: PUSH4 0x1b2ce7f3
0000004d: PUSH1 0xe1
0000004f: SHL
00000050: DUP2
00000051: EQ
00000052: ISZERO
00000053: PUSH2 0x0065
00000056: JUMPI
00000057: PUSH2 0x005e
0000005a: PUSH2 0x01ea
0000005d: JUMP
0000005e: JUMPDEST
0000005f: SWAP2
00000060: POP
00000061: PUSH2 0x0167
00000064: JUMP
00000065: JUMPDEST
00000066: PUSH1 0x01
00000068: PUSH1 0x01
0000006a: PUSH1 0xe0
0000006c: SHL
0000006d: SUB
0000006e: NOT
0000006f: DUP2
00000070: AND
00000071: PUSH4 0x278f7943
00000076: PUSH1 0xe1
00000078: SHL
00000079: EQ
0000007a: ISZERO
0000007b: PUSH2 0x0086
0000007e: JUMPI
0000007f: PUSH2 0x005e
00000082: PUSH2 0x0241
00000085: JUMP
00000086: JUMPDEST
00000087: PUSH1 0x01
00000089: PUSH1 0x01
0000008b: PUSH1 0xe0
0000008d: SHL
0000008e: SUB
0000008f: NOT
00000090: DUP2
00000091: AND
00000092: PUSH4 0x08f28397
00000097: PUSH1 0xe4
00000099: SHL
0000009a: EQ
0000009b: ISZERO
0000009c: PUSH2 0x00a7
0000009f: JUMPI
000000a0: PUSH2 0x005e
000000a3: PUSH2 0x0287
000000a6: JUMP
000000a7: JUMPDEST
000000a8: PUSH1 0x01
000000aa: PUSH1 0x01
000000ac: PUSH1 0xe0
000000ae: SHL
000000af: SUB
000000b0: NOT
000000b1: DUP2
000000b2: AND
000000b3: PUSH4 0x03e14691
000000b8: PUSH1 0xe6
000000ba: SHL
000000bb: EQ
000000bc: ISZERO
000000bd: PUSH2 0x00c8
000000c0: JUMPI
000000c1: PUSH2 0x005e
000000c4: PUSH2 0x02b8
000000c7: JUMP
000000c8: JUMPDEST
000000c9: PUSH1 0x01
000000cb: PUSH1 0x01
000000cd: PUSH1 0xe0
000000cf: SHL
000000d0: SUB
000000d1: NOT
000000d2: DUP2
000000d3: AND
000000d4: PUSH4 0x5c60da1b
000000d9: PUSH1 0xe0
000000db: SHL
000000dc: EQ
000000dd: ISZERO
000000de: PUSH2 0x00e9
000000e1: JUMPI
000000e2: PUSH2 0x005e
000000e5: PUSH2 0x02f8
000000e8: JUMP
000000e9: JUMPDEST
000000ea: PUSH1 0x40
000000ec: MLOAD
000000ed: PUSH3 0x461bcd
000000f1: PUSH1 0xe5
000000f3: SHL
000000f4: DUP2
000000f5: MSTORE
000000f6: PUSH1 0x20
000000f8: PUSH1 0x04
000000fa: DUP3
000000fb: ADD
000000fc: MSTORE
000000fd: PUSH1 0x42
000000ff: PUSH1 0x24
00000101: DUP3
00000102: ADD
00000103: MSTORE
00000104: PUSH32 0x5472616e73706172656e745570677261646561626c6550726f78793a2061646d
00000125: PUSH1 0x44
00000127: DUP3
00000128: ADD
00000129: MSTORE
0000012a: PUSH32 0x696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267
0000014b: PUSH1 0x64
0000014d: DUP3
0000014e: ADD
0000014f: MSTORE
00000150: PUSH2 0x195d
00000153: PUSH1 0xf2
00000155: SHL
00000156: PUSH1 0x84
00000158: DUP3
00000159: ADD
0000015a: MSTORE
0000015b: PUSH1 0xa4
0000015d: ADD
0000015e: JUMPDEST
0000015f: PUSH1 0x40
00000161: MLOAD
00000162: DUP1
00000163: SWAP2
00000164: SUB
00000165: SWAP1
00000166: REVERT
00000167: JUMPDEST
00000168: DUP2
00000169: MLOAD
0000016a: PUSH1 0x20
0000016c: DUP4
0000016d: ADD
0000016e: RETURN
0000016f: JUMPDEST
00000170: PUSH2 0x0177
00000173: PUSH2 0x030c
00000176: JUMP
00000177: JUMPDEST
00000178: JUMP
00000179: JUMPDEST
0000017a: PUSH1 0x60
0000017c: PUSH2 0x019e
0000017f: DUP4
00000180: DUP4
00000181: PUSH1 0x40
00000183: MLOAD
00000184: DUP1
00000185: PUSH1 0x60
00000187: ADD
00000188: PUSH1 0x40
0000018a: MSTORE
0000018b: DUP1
0000018c: PUSH1 0x27
0000018e: DUP2
0000018f: MSTORE
00000190: PUSH1 0x20
00000192: ADD
00000193: PUSH2 0x0857
00000196: PUSH1 0x27
00000198: SWAP2
00000199: CODECOPY
0000019a: PUSH2 0x031c
0000019d: JUMP
0000019e: JUMPDEST
0000019f: SWAP4
000001a0: SWAP3
000001a1: POP
000001a2: POP
000001a3: POP
000001a4: JUMP
000001a5: JUMPDEST
000001a6: SWAP1
000001a7: JUMP
000001a8: JUMPDEST
000001a9: PUSH1 0x01
000001ab: PUSH1 0x01
000001ad: PUSH1 0xa0
000001af: SHL
000001b0: SUB
000001b1: AND
000001b2: EXTCODESIZE
000001b3: ISZERO
000001b4: ISZERO
000001b5: SWAP1
000001b6: JUMP
000001b7: JUMPDEST
000001b8: PUSH1 0x00
000001ba: PUSH32 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103
000001db: JUMPDEST
000001dc: SLOAD
000001dd: PUSH1 0x01
000001df: PUSH1 0x01
000001e1: PUSH1 0xa0
000001e3: SHL
000001e4: SUB
000001e5: AND
000001e6: SWAP2
000001e7: SWAP1
000001e8: POP
000001e9: JUMP
000001ea: JUMPDEST
000001eb: PUSH1 0x60
000001ed: PUSH2 0x01f4
000001f0: PUSH2 0x0394
000001f3: JUMP
000001f4: JUMPDEST
000001f5: PUSH1 0x00
000001f7: PUSH2 0x0203
000001fa: CALLDATASIZE
000001fb: PUSH1 0x04
000001fd: DUP2
000001fe: DUP5
000001ff: PUSH2 0x06a2
00000202: JUMP
00000203: JUMPDEST
00000204: DUP2
00000205: ADD
00000206: SWAP1
00000207: PUSH2 0x0210
0000020a: SWAP2
0000020b: SWAP1
0000020c: PUSH2 0x06e8
0000020f: JUMP
00000210: JUMPDEST
00000211: SWAP1
00000212: POP
00000213: PUSH2 0x022d
00000216: DUP2
00000217: PUSH1 0x40
00000219: MLOAD
0000021a: DUP1
0000021b: PUSH1 0x20
0000021d: ADD
0000021e: PUSH1 0x40
00000220: MSTORE
00000221: DUP1
00000222: PUSH1 0x00
00000224: DUP2
00000225: MSTORE
00000226: POP
00000227: PUSH1 0x00
00000229: PUSH2 0x039f
0000022c: JUMP
0000022d: JUMPDEST
0000022e: POP
0000022f: POP
00000230: PUSH1 0x40
00000232: DUP1
00000233: MLOAD
00000234: PUSH1 0x20
00000236: DUP2
00000237: ADD
00000238: SWAP1
00000239: SWAP2
0000023a: MSTORE
0000023b: PUSH1 0x00
0000023d: DUP2
0000023e: MSTORE
0000023f: SWAP1
00000240: JUMP
00000241: JUMPDEST
00000242: PUSH1 0x60
00000244: PUSH1 0x00
00000246: DUP1
00000247: PUSH2 0x0253
0000024a: CALLDATASIZE
0000024b: PUSH1 0x04
0000024d: DUP2
0000024e: DUP5
0000024f: PUSH2 0x06a2
00000252: JUMP
00000253: JUMPDEST
00000254: DUP2
00000255: ADD
00000256: SWAP1
00000257: PUSH2 0x0260
0000025a: SWAP2
0000025b: SWAP1
0000025c: PUSH2 0x0719
0000025f: JUMP
00000260: JUMPDEST
00000261: SWAP2
00000262: POP
00000263: SWAP2
00000264: POP
00000265: PUSH2 0x0270
00000268: DUP3
00000269: DUP3
0000026a: PUSH1 0x01
0000026c: PUSH2 0x039f
0000026f: JUMP
00000270: JUMPDEST
00000271: PUSH1 0x40
00000273: MLOAD
00000274: DUP1
00000275: PUSH1 0x20
00000277: ADD
00000278: PUSH1 0x40
0000027a: MSTORE
0000027b: DUP1
0000027c: PUSH1 0x00
0000027e: DUP2
0000027f: MSTORE
00000280: POP
00000281: SWAP3
00000282: POP
00000283: POP
00000284: POP
00000285: SWAP1
00000286: JUMP
00000287: JUMPDEST
00000288: PUSH1 0x60
0000028a: PUSH2 0x0291
0000028d: PUSH2 0x0394
00000290: JUMP
00000291: JUMPDEST
00000292: PUSH1 0x00
00000294: PUSH2 0x02a0
00000297: CALLDATASIZE
00000298: PUSH1 0x04
0000029a: DUP2
0000029b: DUP5
0000029c: PUSH2 0x06a2
0000029f: JUMP
000002a0: JUMPDEST
000002a1: DUP2
000002a2: ADD
000002a3: SWAP1
000002a4: PUSH2 0x02ad
000002a7: SWAP2
000002a8: SWAP1
000002a9: PUSH2 0x06e8
000002ac: JUMP
000002ad: JUMPDEST
000002ae: SWAP1
000002af: POP
000002b0: PUSH2 0x022d
000002b3: DUP2
000002b4: PUSH2 0x03cb
000002b7: JUMP
000002b8: JUMPDEST
000002b9: PUSH1 0x60
000002bb: PUSH2 0x02c2
000002be: PUSH2 0x0394
000002c1: JUMP
000002c2: JUMPDEST
000002c3: PUSH1 0x00
000002c5: PUSH2 0x02cc
000002c8: PUSH2 0x01b7
000002cb: JUMP
000002cc: JUMPDEST
000002cd: PUSH1 0x40
000002cf: DUP1
000002d0: MLOAD
000002d1: PUSH1 0x01
000002d3: PUSH1 0x01
000002d5: PUSH1 0xa0
000002d7: SHL
000002d8: SUB
000002d9: DUP4
000002da: AND
000002db: PUSH1 0x20
000002dd: DUP3
000002de: ADD
000002df: MSTORE
000002e0: SWAP2
000002e1: SWAP3
000002e2: POP
000002e3: ADD
000002e4: PUSH1 0x40
000002e6: MLOAD
000002e7: PUSH1 0x20
000002e9: DUP2
000002ea: DUP4
000002eb: SUB
000002ec: SUB
000002ed: DUP2
000002ee: MSTORE
000002ef: SWAP1
000002f0: PUSH1 0x40
000002f2: MSTORE
000002f3: SWAP2
000002f4: POP
000002f5: POP
000002f6: SWAP1
000002f7: JUMP
000002f8: JUMPDEST
000002f9: PUSH1 0x60
000002fb: PUSH2 0x0302
000002fe: PUSH2 0x0394
00000301: JUMP
00000302: JUMPDEST
00000303: PUSH1 0x00
00000305: PUSH2 0x02cc
00000308: PUSH2 0x0422
0000030b: JUMP
0000030c: JUMPDEST
0000030d: PUSH2 0x0177
00000310: PUSH2 0x0317
00000313: PUSH2 0x0422
00000316: JUMP
00000317: JUMPDEST
00000318: PUSH2 0x0431
0000031b: JUMP
0000031c: JUMPDEST
0000031d: PUSH1 0x60
0000031f: PUSH1 0x00
00000321: DUP1
00000322: DUP6
00000323: PUSH1 0x01
00000325: PUSH1 0x01
00000327: PUSH1 0xa0
00000329: SHL
0000032a: SUB
0000032b: AND
0000032c: DUP6
0000032d: PUSH1 0x40
0000032f: MLOAD
00000330: PUSH2 0x0339
00000333: SWAP2
00000334: SWAP1
00000335: PUSH2 0x0807
00000338: JUMP
00000339: JUMPDEST
0000033a: PUSH1 0x00
0000033c: PUSH1 0x40
0000033e: MLOAD
0000033f: DUP1
00000340: DUP4
00000341: SUB
00000342: DUP2
00000343: DUP6
00000344: GAS
00000345: DELEGATECALL
00000346: SWAP2
00000347: POP
00000348: POP
00000349: RETURNDATASIZE
0000034a: DUP1
0000034b: PUSH1 0x00
0000034d: DUP2
0000034e: EQ
0000034f: PUSH2 0x0374
00000352: JUMPI
00000353: PUSH1 0x40
00000355: MLOAD
00000356: SWAP2
00000357: POP
00000358: PUSH1 0x1f
0000035a: NOT
0000035b: PUSH1 0x3f
0000035d: RETURNDATASIZE
0000035e: ADD
0000035f: AND
00000360: DUP3
00000361: ADD
00000362: PUSH1 0x40
00000364: MSTORE
00000365: RETURNDATASIZE
00000366: DUP3
00000367: MSTORE
00000368: RETURNDATASIZE
00000369: PUSH1 0x00
0000036b: PUSH1 0x20
0000036d: DUP5
0000036e: ADD
0000036f: RETURNDATACOPY
00000370: PUSH2 0x0379
00000373: JUMP
00000374: JUMPDEST
00000375: PUSH1 0x60
00000377: SWAP2
00000378: POP
00000379: JUMPDEST
0000037a: POP
0000037b: SWAP2
0000037c: POP
0000037d: SWAP2
0000037e: POP
0000037f: PUSH2 0x038a
00000382: DUP7
00000383: DUP4
00000384: DUP4
00000385: DUP8
00000386: PUSH2 0x0455
00000389: JUMP
0000038a: JUMPDEST
0000038b: SWAP7
0000038c: SWAP6
0000038d: POP
0000038e: POP
0000038f: POP
00000390: POP
00000391: POP
00000392: POP
00000393: JUMP
00000394: JUMPDEST
00000395: CALLVALUE
00000396: ISZERO
00000397: PUSH2 0x0177
0000039a: JUMPI
0000039b: PUSH1 0x00
0000039d: DUP1
0000039e: REVERT
0000039f: JUMPDEST
000003a0: PUSH2 0x03a8
000003a3: DUP4
000003a4: PUSH2 0x04d3
000003a7: JUMP
000003a8: JUMPDEST
000003a9: PUSH1 0x00
000003ab: DUP3
000003ac: MLOAD
000003ad: GT
000003ae: DUP1
000003af: PUSH2 0x03b5
000003b2: JUMPI
000003b3: POP
000003b4: DUP1
000003b5: JUMPDEST
000003b6: ISZERO
000003b7: PUSH2 0x03c6
000003ba: JUMPI
000003bb: PUSH2 0x03c4
000003be: DUP4
000003bf: DUP4
000003c0: PUSH2 0x0179
000003c3: JUMP
000003c4: JUMPDEST
000003c5: POP
000003c6: JUMPDEST
000003c7: POP
000003c8: POP
000003c9: POP
000003ca: JUMP
000003cb: JUMPDEST
000003cc: PUSH32 0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f
000003ed: PUSH2 0x03f4
000003f0: PUSH2 0x01b7
000003f3: JUMP
000003f4: JUMPDEST
000003f5: PUSH1 0x40
000003f7: DUP1
000003f8: MLOAD
000003f9: PUSH1 0x01
000003fb: PUSH1 0x01
000003fd: PUSH1 0xa0
000003ff: SHL
00000400: SUB
00000401: SWAP3
00000402: DUP4
00000403: AND
00000404: DUP2
00000405: MSTORE
00000406: SWAP2
00000407: DUP5
00000408: AND
00000409: PUSH1 0x20
0000040b: DUP4
0000040c: ADD
0000040d: MSTORE
0000040e: ADD
0000040f: PUSH1 0x40
00000411: MLOAD
00000412: DUP1
00000413: SWAP2
00000414: SUB
00000415: SWAP1
00000416: LOG1
00000417: PUSH2 0x041f
0000041a: DUP2
0000041b: PUSH2 0x0513
0000041e: JUMP
0000041f: JUMPDEST
00000420: POP
00000421: JUMP
00000422: JUMPDEST
00000423: PUSH1 0x00
00000425: PUSH2 0x042c
00000428: PUSH2 0x05bc
0000042b: JUMP
0000042c: JUMPDEST
0000042d: SWAP1
0000042e: POP
0000042f: SWAP1
00000430: JUMP
00000431: JUMPDEST
00000432: CALLDATASIZE
00000433: PUSH1 0x00
00000435: DUP1
00000436: CALLDATACOPY
00000437: PUSH1 0x00
00000439: DUP1
0000043a: CALLDATASIZE
0000043b: PUSH1 0x00
0000043d: DUP5
0000043e: GAS
0000043f: DELEGATECALL
00000440: RETURNDATASIZE
00000441: PUSH1 0x00
00000443: DUP1
00000444: RETURNDATACOPY
00000445: DUP1
00000446: DUP1
00000447: ISZERO
00000448: PUSH2 0x0450
0000044b: JUMPI
0000044c: RETURNDATASIZE
0000044d: PUSH1 0x00
0000044f: RETURN
00000450: JUMPDEST
00000451: RETURNDATASIZE
00000452: PUSH1 0x00
00000454: REVERT
00000455: JUMPDEST
00000456: PUSH1 0x60
00000458: DUP4
00000459: ISZERO
0000045a: PUSH2 0x04c1
0000045d: JUMPI
0000045e: DUP3
0000045f: MLOAD
00000460: PUSH2 0x04ba
00000463: JUMPI
00000464: PUSH1 0x01
00000466: PUSH1 0x01
00000468: PUSH1 0xa0
0000046a: SHL
0000046b: SUB
0000046c: DUP6
0000046d: AND
0000046e: EXTCODESIZE
0000046f: PUSH2 0x04ba
00000472: JUMPI
00000473: PUSH1 0x40
00000475: MLOAD
00000476: PUSH3 0x461bcd
0000047a: PUSH1 0xe5
0000047c: SHL
0000047d: DUP2
0000047e: MSTORE
0000047f: PUSH1 0x20
00000481: PUSH1 0x04
00000483: DUP3
00000484: ADD
00000485: MSTORE
00000486: PUSH1 0x1d
00000488: PUSH1 0x24
0000048a: DUP3
0000048b: ADD
0000048c: MSTORE
0000048d: PUSH32 0x416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000
000004ae: PUSH1 0x44
000004b0: DUP3
000004b1: ADD
000004b2: MSTORE
000004b3: PUSH1 0x64
000004b5: ADD
000004b6: PUSH2 0x015e
000004b9: JUMP
000004ba: JUMPDEST
000004bb: POP
000004bc: DUP2
000004bd: PUSH2 0x04cb
000004c0: JUMP
000004c1: JUMPDEST
000004c2: PUSH2 0x04cb
000004c5: DUP4
000004c6: DUP4
000004c7: PUSH2 0x05e4
000004ca: JUMP
000004cb: JUMPDEST
000004cc: SWAP5
000004cd: SWAP4
000004ce: POP
000004cf: POP
000004d0: POP
000004d1: POP
000004d2: JUMP
000004d3: JUMPDEST
000004d4: PUSH2 0x04dc
000004d7: DUP2
000004d8: PUSH2 0x060e
000004db: JUMP
000004dc: JUMPDEST
000004dd: PUSH1 0x40
000004df: MLOAD
000004e0: PUSH1 0x01
000004e2: PUSH1 0x01
000004e4: PUSH1 0xa0
000004e6: SHL
000004e7: SUB
000004e8: DUP3
000004e9: AND
000004ea: SWAP1
000004eb: PUSH32 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b
0000050c: SWAP1
0000050d: PUSH1 0x00
0000050f: SWAP1
00000510: LOG2
00000511: POP
00000512: JUMP
00000513: JUMPDEST
00000514: PUSH1 0x01
00000516: PUSH1 0x01
00000518: PUSH1 0xa0
0000051a: SHL
0000051b: SUB
0000051c: DUP2
0000051d: AND
0000051e: PUSH2 0x0578
00000521: JUMPI
00000522: PUSH1 0x40
00000524: MLOAD
00000525: PUSH3 0x461bcd
00000529: PUSH1 0xe5
0000052b: SHL
0000052c: DUP2
0000052d: MSTORE
0000052e: PUSH1 0x20
00000530: PUSH1 0x04
00000532: DUP3
00000533: ADD
00000534: MSTORE
00000535: PUSH1 0x26
00000537: PUSH1 0x24
00000539: DUP3
0000053a: ADD
0000053b: MSTORE
0000053c: PUSH32 0x455243313936373a206e65772061646d696e20697320746865207a65726f2061
0000055d: PUSH1 0x44
0000055f: DUP3
00000560: ADD
00000561: MSTORE
00000562: PUSH6 0x646472657373
00000569: PUSH1 0xd0
0000056b: SHL
0000056c: PUSH1 0x64
0000056e: DUP3
0000056f: ADD
00000570: MSTORE
00000571: PUSH1 0x84
00000573: ADD
00000574: PUSH2 0x015e
00000577: JUMP
00000578: JUMPDEST
00000579: DUP1
0000057a: PUSH32 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103
0000059b: JUMPDEST
0000059c: DUP1
0000059d: SLOAD
0000059e: PUSH1 0x01
000005a0: PUSH1 0x01
000005a2: PUSH1 0xa0
000005a4: SHL
000005a5: SUB
000005a6: NOT
000005a7: AND
000005a8: PUSH1 0x01
000005aa: PUSH1 0x01
000005ac: PUSH1 0xa0
000005ae: SHL
000005af: SUB
000005b0: SWAP3
000005b1: SWAP1
000005b2: SWAP3
000005b3: AND
000005b4: SWAP2
000005b5: SWAP1
000005b6: SWAP2
000005b7: OR
000005b8: SWAP1
000005b9: SSTORE
000005ba: POP
000005bb: JUMP
000005bc: JUMPDEST
000005bd: PUSH1 0x00
000005bf: PUSH32 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc
000005e0: PUSH2 0x01db
000005e3: JUMP
000005e4: JUMPDEST
000005e5: DUP2
000005e6: MLOAD
000005e7: ISZERO
000005e8: PUSH2 0x05f4
000005eb: JUMPI
000005ec: DUP2
000005ed: MLOAD
000005ee: DUP1
000005ef: DUP4
000005f0: PUSH1 0x20
000005f2: ADD
000005f3: REVERT
000005f4: JUMPDEST
000005f5: DUP1
000005f6: PUSH1 0x40
000005f8: MLOAD
000005f9: PUSH3 0x461bcd
000005fd: PUSH1 0xe5
000005ff: SHL
00000600: DUP2
00000601: MSTORE
00000602: PUSH1 0x04
00000604: ADD
00000605: PUSH2 0x015e
00000608: SWAP2
00000609: SWAP1
0000060a: PUSH2 0x0823
0000060d: JUMP
0000060e: JUMPDEST
0000060f: PUSH1 0x01
00000611: PUSH1 0x01
00000613: PUSH1 0xa0
00000615: SHL
00000616: SUB
00000617: DUP2
00000618: AND
00000619: EXTCODESIZE
0000061a: PUSH2 0x067b
0000061d: JUMPI
0000061e: PUSH1 0x40
00000620: MLOAD
00000621: PUSH3 0x461bcd
00000625: PUSH1 0xe5
00000627: SHL
00000628: DUP2
00000629: MSTORE
0000062a: PUSH1 0x20
0000062c: PUSH1 0x04
0000062e: DUP3
0000062f: ADD
00000630: MSTORE
00000631: PUSH1 0x2d
00000633: PUSH1 0x24
00000635: DUP3
00000636: ADD
00000637: MSTORE
00000638: PUSH32 0x455243313936373a206e657720696d706c656d656e746174696f6e206973206e
00000659: PUSH1 0x44
0000065b: DUP3
0000065c: ADD
0000065d: MSTORE
0000065e: PUSH13 0x1bdd08184818dbdb9d1c9858dd
0000066c: PUSH1 0x9a
0000066e: SHL
0000066f: PUSH1 0x64
00000671: DUP3
00000672: ADD
00000673: MSTORE
00000674: PUSH1 0x84
00000676: ADD
00000677: PUSH2 0x015e
0000067a: JUMP
0000067b: JUMPDEST
0000067c: DUP1
0000067d: PUSH32 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc
0000069e: PUSH2 0x059b
000006a1: JUMP
000006a2: JUMPDEST
000006a3: PUSH1 0x00
000006a5: DUP1
000006a6: DUP6
000006a7: DUP6
000006a8: GT
000006a9: ISZERO
000006aa: PUSH2 0x06b2
000006ad: JUMPI
000006ae: PUSH1 0x00
000006b0: DUP1
000006b1: REVERT
000006b2: JUMPDEST
000006b3: DUP4
000006b4: DUP7
000006b5: GT
000006b6: ISZERO
000006b7: PUSH2 0x06bf
000006ba: JUMPI
000006bb: PUSH1 0x00
000006bd: DUP1
000006be: REVERT
000006bf: JUMPDEST
000006c0: POP
000006c1: POP
000006c2: DUP3
000006c3: ADD
000006c4: SWAP4
000006c5: SWAP2
000006c6: SWAP1
000006c7: SWAP3
000006c8: SUB
000006c9: SWAP2
000006ca: POP
000006cb: JUMP
000006cc: JUMPDEST
000006cd: DUP1
000006ce: CALLDATALOAD
000006cf: PUSH1 0x01
000006d1: PUSH1 0x01
000006d3: PUSH1 0xa0
000006d5: SHL
000006d6: SUB
000006d7: DUP2
000006d8: AND
000006d9: DUP2
000006da: EQ
000006db: PUSH2 0x06e3
000006de: JUMPI
000006df: PUSH1 0x00
000006e1: DUP1
000006e2: REVERT
000006e3: JUMPDEST
000006e4: SWAP2
000006e5: SWAP1
000006e6: POP
000006e7: JUMP
000006e8: JUMPDEST
000006e9: PUSH1 0x00
000006eb: PUSH1 0x20
000006ed: DUP3
000006ee: DUP5
000006ef: SUB
000006f0: SLT
000006f1: ISZERO
000006f2: PUSH2 0x06fa
000006f5: JUMPI
000006f6: PUSH1 0x00
000006f8: DUP1
000006f9: REVERT
000006fa: JUMPDEST
000006fb: PUSH2 0x019e
000006fe: DUP3
000006ff: PUSH2 0x06cc
00000702: JUMP
00000703: JUMPDEST
00000704: PUSH4 0x4e487b71
00000709: PUSH1 0xe0
0000070b: SHL
0000070c: PUSH1 0x00
0000070e: MSTORE
0000070f: PUSH1 0x41
00000711: PUSH1 0x04
00000713: MSTORE
00000714: PUSH1 0x24
00000716: PUSH1 0x00
00000718: REVERT
00000719: JUMPDEST
0000071a: PUSH1 0x00
0000071c: DUP1
0000071d: PUSH1 0x40
0000071f: DUP4
00000720: DUP6
00000721: SUB
00000722: SLT
00000723: ISZERO
00000724: PUSH2 0x072c
00000727: JUMPI
00000728: PUSH1 0x00
0000072a: DUP1
0000072b: REVERT
0000072c: JUMPDEST
0000072d: PUSH2 0x0735
00000730: DUP4
00000731: PUSH2 0x06cc
00000734: JUMP
00000735: JUMPDEST
00000736: SWAP2
00000737: POP
00000738: PUSH1 0x20
0000073a: DUP4
0000073b: ADD
0000073c: CALLDATALOAD
0000073d: PUSH8 0xffffffffffffffff
00000746: DUP1
00000747: DUP3
00000748: GT
00000749: ISZERO
0000074a: PUSH2 0x0752
0000074d: JUMPI
0000074e: PUSH1 0x00
00000750: DUP1
00000751: REVERT
00000752: JUMPDEST
00000753: DUP2
00000754: DUP6
00000755: ADD
00000756: SWAP2
00000757: POP
00000758: DUP6
00000759: PUSH1 0x1f
0000075b: DUP4
0000075c: ADD
0000075d: SLT
0000075e: PUSH2 0x0766
00000761: JUMPI
00000762: PUSH1 0x00
00000764: DUP1
00000765: REVERT
00000766: JUMPDEST
00000767: DUP2
00000768: CALLDATALOAD
00000769: DUP2
0000076a: DUP2
0000076b: GT
0000076c: ISZERO
0000076d: PUSH2 0x0778
00000770: JUMPI
00000771: PUSH2 0x0778
00000774: PUSH2 0x0703
00000777: JUMP
00000778: JUMPDEST
00000779: PUSH1 0x40
0000077b: MLOAD
0000077c: PUSH1 0x1f
0000077e: DUP3
0000077f: ADD
00000780: PUSH1 0x1f
00000782: NOT
00000783: SWAP1
00000784: DUP2
00000785: AND
00000786: PUSH1 0x3f
00000788: ADD
00000789: AND
0000078a: DUP2
0000078b: ADD
0000078c: SWAP1
0000078d: DUP4
0000078e: DUP3
0000078f: GT
00000790: DUP2
00000791: DUP4
00000792: LT
00000793: OR
00000794: ISZERO
00000795: PUSH2 0x07a0
00000798: JUMPI
00000799: PUSH2 0x07a0
0000079c: PUSH2 0x0703
0000079f: JUMP
000007a0: JUMPDEST
000007a1: DUP2
000007a2: PUSH1 0x40
000007a4: MSTORE
000007a5: DUP3
000007a6: DUP2
000007a7: MSTORE
000007a8: DUP9
000007a9: PUSH1 0x20
000007ab: DUP5
000007ac: DUP8
000007ad: ADD
000007ae: ADD
000007af: GT
000007b0: ISZERO
000007b1: PUSH2 0x07b9
000007b4: JUMPI
000007b5: PUSH1 0x00
000007b7: DUP1
000007b8: REVERT
000007b9: JUMPDEST
000007ba: DUP3
000007bb: PUSH1 0x20
000007bd: DUP7
000007be: ADD
000007bf: PUSH1 0x20
000007c1: DUP4
000007c2: ADD
000007c3: CALLDATACOPY
000007c4: PUSH1 0x00
000007c6: PUSH1 0x20
000007c8: DUP5
000007c9: DUP4
000007ca: ADD
000007cb: ADD
000007cc: MSTORE
000007cd: DUP1
000007ce: SWAP6
000007cf: POP
000007d0: POP
000007d1: POP
000007d2: POP
000007d3: POP
000007d4: POP
000007d5: SWAP3
000007d6: POP
000007d7: SWAP3
000007d8: SWAP1
000007d9: POP
000007da: JUMP
000007db: JUMPDEST
000007dc: PUSH1 0x00
000007de: JUMPDEST
000007df: DUP4
000007e0: DUP2
000007e1: LT
000007e2: ISZERO
000007e3: PUSH2 0x07f6
000007e6: JUMPI
000007e7: DUP2
000007e8: DUP2
000007e9: ADD
000007ea: MLOAD
000007eb: DUP4
000007ec: DUP3
000007ed: ADD
000007ee: MSTORE
000007ef: PUSH1 0x20
000007f1: ADD
000007f2: PUSH2 0x07de
000007f5: JUMP
000007f6: JUMPDEST
000007f7: DUP4
000007f8: DUP2
000007f9: GT
000007fa: ISZERO
000007fb: PUSH2 0x03c4
000007fe: JUMPI
000007ff: POP
00000800: POP
00000801: PUSH1 0x00
00000803: SWAP2
00000804: ADD
00000805: MSTORE
00000806: JUMP
00000807: JUMPDEST
00000808: PUSH1 0x00
0000080a: DUP3
0000080b: MLOAD
0000080c: PUSH2 0x0819
0000080f: DUP2
00000810: DUP5
00000811: PUSH1 0x20
00000813: DUP8
00000814: ADD
00000815: PUSH2 0x07db
00000818: JUMP
00000819: JUMPDEST
0000081a: SWAP2
0000081b: SWAP1
0000081c: SWAP2
0000081d: ADD
0000081e: SWAP3
0000081f: SWAP2
00000820: POP
00000821: POP
00000822: JUMP
00000823: JUMPDEST
00000824: PUSH1 0x20
00000826: DUP2
00000827: MSTORE
00000828: PUSH1 0x00
0000082a: DUP3
0000082b: MLOAD
0000082c: DUP1
0000082d: PUSH1 0x20
0000082f: DUP5
00000830: ADD
00000831: MSTORE
00000832: PUSH2 0x0842
00000835: DUP2
00000836: PUSH1 0x40
00000838: DUP6
00000839: ADD
0000083a: PUSH1 0x20
0000083c: DUP8
0000083d: ADD
0000083e: PUSH2 0x07db
00000841: JUMP
00000842: JUMPDEST
00000843: PUSH1 0x1f
00000845: ADD
00000846: PUSH1 0x1f
00000848: NOT
00000849: AND
0000084a: SWAP2
0000084b: SWAP1
0000084c: SWAP2
0000084d: ADD
0000084e: PUSH1 0x40
00000850: ADD
00000851: SWAP3
00000852: SWAP2
00000853: POP
00000854: POP
00000855: JUMP
00000856: INVALID
00000857: COINBASE
00000858: PUSH5 0x6472657373
0000085e: GASPRICE
0000085f: KECCAK256
00000860: PUSH13 0x6f772d6c6576656c2064656c65
0000086e: PUSH8 0x6174652063616c6c
00000877: KECCAK256
00000878: PUSH7 0x61696c6564a264
00000880: PUSH10 0x7066735822122012bb4f
0000088b: JUMP
0000088c: UNKNOWN(0x4F)
0000088d: PUSH20 0x959a03513dc74fc3c6e40e8386e6f02c16b78d6d
000008a2: UNKNOWN(0xB0)
000008a3: UNKNOWN(0x0C)
000008a4: UNKNOWN(0xE0)
000008a5: UNKNOWN(0xAA)
000008a6: AND
000008a7: UNKNOWN(0xAF)
000008a8: PUSH5 0x736f6c6343
000008ae: STOP
000008af: ADDMOD
000008b0: MULMOD
000008b1: STOP
000008b2: CALLER

Findings

validated = confirmed for call sinks; sink observed for others
Severity Category Tool Title Confidence Validated Confirmed Details
critical auth codex Hardcoded tx.origin bypass disables SNARK verification 90 no
view
evidence_json
{
    "evidence": "`Verifier.verify` returns true when `tx.origin == VERIFICATION_BYPASS`, bypassing `verifyProof` results.",
    "locations": [
        "contracts/logic/Verifier.sol:83"
    ],
    "recommendation": "Remove the tx.origin bypass from production code. If a bypass is required for testing, gate it behind a compile-time flag or a deployment-time switch restricted to non-production networks, and avoid `tx.origin` entirely.",
    "exploit_scenario": "If an attacker can originate a transaction from the hardcoded VERIFICATION_BYPASS address (0x000000000000000000000000000000000000dEaD), `Verifier.verify` returns true without checking the proof. The attacker can craft arbitrary transactions referencing any known Merkle root, choose any nullifiers/commitments, and withdraw funds via `_processDecrypt` without owning the notes, since the proof binding is skipped entirely."
}
critical upgradeability detector Untrusted DELEGATECALL target reachable 70 no no
view
trace_id: 0x53d2265634001e8ea944e4fd28dd57dbe5df5a2d4f35fab1f39833295b38e53d
call_targets: 0xb157dc78c2815280906a6730984a5e0dca65e247
target_varies: no
classification: constant_target
validation_json
{
    "sink": "DELEGATECALL",
    "errors": 0,
    "status": "sink_reached",
    "attempts": 1,
    "trace_id": "0x53d2265634001e8ea944e4fd28dd57dbe5df5a2d4f35fab1f39833295b38e53d",
    "confirmed": false,
    "trace_mode": "callTracer",
    "call_targets": [
        "0xb157dc78c2815280906a6730984a5e0dca65e247"
    ],
    "matched_probe": null,
    "target_varies": false,
    "classification": "constant_target"
}
witness_json
{
    "notes": "heuristic witness; entrypoints are best-effort selectors with zeroed calldata",
    "constraints": [],
    "entrypoints": [
        {
            "calldata": "0x278f7943",
            "selector": "0x278f7943",
            "calldata_variants": [
                "0x278f7943",
                "0x278f79430000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0x08f28397",
            "selector": "0x08f28397",
            "calldata_variants": [
                "0x08f28397",
                "0x08f283970000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0x03e14691",
            "selector": "0x03e14691",
            "calldata_variants": [
                "0x03e14691",
                "0x03e146910000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0x5c60da1b",
            "selector": "0x5c60da1b",
            "calldata_variants": [
                "0x5c60da1b",
                "0x5c60da1b0000000000000000000000000000000000000000000000000000000000000000"
            ]
        }
    ]
}
evidence_json
{
    "examples": [
        {
            "pc": 837,
            "opcode": "DELEGATECALL",
            "returndata_checked": null,
            "value_expression_category": "n/a",
            "target_expression_category": "computed"
        },
        {
            "pc": 1087,
            "opcode": "DELEGATECALL",
            "returndata_checked": null,
            "value_expression_category": "n/a",
            "target_expression_category": "computed"
        }
    ],
    "guards_detected": [],
    "delegatecall_count": 2,
    "untrusted_delegatecall_count": 2
}
medium upgradeability cast DELEGATECALL present 80 no
view
evidence_json
{
    "notes": "delegatecall enables execution in caller context; common in proxies/upgradeable patterns",
    "delegatecall_count": 2
}