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

Analysis Run

019bab3b-acce-7254-a517-d035d555f853

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
Untrusted DELEGATECALL target reachable
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
38835 artifact.fetch complete 1 / 3 3 months ago
38836 proxy.resolve complete 1 / 3 3 months ago
38837 tool.cast_disasm complete 1 / 3 3 months ago
38838 analysis.bundle complete 1 / 3 3 months ago
38839 capability.graph complete 1 / 3 3 months ago
38840 detector.run complete 1 / 3 3 months ago
38841 validation.fork complete 1 / 3 3 months ago
39202 report.consolidate complete 1 / 6 3 months ago
39203 tool.slither failed 2 / 2 3 months ago

Artifact

Runtime bytecode: available
Creation TX:
Deployer:
Proxy: yes onchain_only
Verified Source: yes
Proxy evidence
{
    "method": "eip1967",
    "status": "onchain_only",
    "implementation": "0x6c6210232654a5b57a576f9b4434f36e0b5d3768",
    "onchain_method": "eip1967"
}

Slither

tool.slither
Status
failed slither failed (exit 1): 'forge clean' running (wd: /tmp/slither-54szt39t) 'forge config --json' running 'forge build --build-info --skip ./test/** ./script/** --force' running (wd: /tmp/slither-54szt39t) 'forge' returned non-zero exit code 1 Error: Encountered invalid solc version in lib/openzeppelin-contracts/contracts/utils/Address.sol: No solc version exists that matches the version requirement: ^0.8.20 stderr: Encountered invalid solc version in lib/openzeppelin-contracts/contracts/utils/Address.sol: No solc version exists that matches the version requirement: ^0.8.20 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-54szt39t/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-54szt39t)
'forge config --json' running
'forge build --build-info --skip ./test/** ./script/** --force' running (wd: /tmp/slither-54szt39t)
'forge' returned non-zero exit code 1
Error: Encountered invalid solc version in lib/openzeppelin-contracts/contracts/utils/Address.sol: No solc version exists that matches the version requirement: ^0.8.20
stderr: Encountered invalid solc version in lib/openzeppelin-contracts/contracts/utils/Address.sol: No solc version exists that matches the version requirement: ^0.8.20
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-54szt39t/out/build-info is not a directory.

Codex

report.consolidate
Job Status
complete
Attempts
1 / 6
Findings
2
No findings?
no
Summary
Bytecode indicates external delegatecall into a fixed address and multiple CALL sites with computed targets/values; access control/guarding is not provable from artifacts, so risks are noted with uncertainty.
View stdout
{"no_findings":false,"summary":"Bytecode indicates external delegatecall into a fixed address and multiple CALL sites with computed targets/values; access control/guarding is not provable from artifacts, so risks are noted with uncertainty.","findings":[{"severity":"medium","category":"other","title":"DELEGATECALL into external contract address allows code execution in implementation storage","exploit_scenario":"The implementation performs DELEGATECALLs to the external address 0xa54a5f483866801c49ad2df022af8c215f2714c5. If that target is upgradeable or can be replaced (e.g., via proxy upgrade or selfdestruct+CREATE2), an attacker controlling the target can execute arbitrary code in this contract’s storage context, changing critical state or draining assets. This is high impact; the certainty is limited because we only see bytecode and not the governance model of the target.","recommendation":"Ensure the delegatecall target is an immutable, trusted contract (non-upgradeable) and cannot be replaced. If possible, avoid delegatecall to external addresses; use internal libraries or explicit call/staticcall patterns with strict interfaces and state separation.","evidence":"Disassembly shows PUSH20 0xa54a5f... then selector setup (e.g., PUSH4 0x19bd2045 / 0x1f69565f / 0xdc98f6b7 / 0xdb8a2e3c) followed by DELEGATECALL. Callsite metadata flags computed targets at these DELEGATECALL PCs.","locations":["pc:0x19d5","pc:0x3916","pc:0x3d88","pc:0x3f06"]},{"severity":"low","category":"reentrancy","title":"External CALLs with computed target and value may allow value transfer or reentrancy if not tightly gated","exploit_scenario":"Multiple CALL sites use computed target and value. If any of these entrypoints are reachable by untrusted callers or if the target/value are user-influenced, an attacker could direct ETH transfers to arbitrary addresses and/or reenter during the external call to manipulate state. The presence of ReentrancyGuard strings suggests some protection, but bytecode alone does not confirm that these specific call paths are guarded or restricted.","recommendation":"Verify that all CALL sites with value are only reachable by trusted roles (e.g., federation/owner) and are protected by reentrancy guards or checks-effects-interactions. Consider using pull-based payouts where possible and validate target addresses against allowlists.","evidence":"Callsite list shows CALL with target_expression_category=\"computed\" and value_expression_category=\"computed\" at PCs 0x1fcd, 0x342f, 0x4182, 0x50b7, 0x54f8; detector findings also flag eth_value_calls for these locations.","locations":["pc:0x1fcd","pc:0x342f","pc:0x4182","pc:0x50b7","pc:0x54f8"]}]}
View stderr
OpenAI Codex v0.77.0 (research preview)
--------
workdir: /tmp/codex-9t6puihg
model: gpt-5.2-codex
provider: openai
approval: never
sandbox: read-only
reasoning effort: high
reasoning summaries: auto
session id: 019babf7-bfd1-7a60-aceb-30e292051c43
--------
user
Context: The user requested the proxy at 0x9719d81c506c95f92caf970851b22afc88aee574.
Audit the implementation at 0x6c6210232654a5b57a576f9b4434f36e0b5d3768.
Findings should refer to the implementation unless explicitly about proxy mechanics.

You are a security auditor. You ONLY have runtime bytecode + analysis artifacts.
You MUST read `BYTECODE_BUNDLE.json` before concluding; it contains the bytecode summary,
evidence bundle, callsites, storage slots, and detector findings.

Special cases when reasoning from bytecode (be explicit about uncertainty):
- Selector inference is best-effort; missing selectors are common.
- Fallback/receive paths may be the only entrypoints.
- CALL vs DELEGATECALL semantics differ; DELEGATECALL executes in caller storage.
- Proxy patterns (EIP-1967, minimal proxies, beacon) change which storage is authoritative.
- Storage slots are raw; mappings/arrays appear via keccak patterns, names are unknown.
- Guard detection is heuristic; absence of guards does NOT mean unguarded.
- Returndata checking is unknown unless explicitly shown in evidence.
- Precompiles (0x1..0x9) and common ERC20 transfer selectors may appear; do not over-claim.

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.
- Locations can be pc references like "pc:0x123" or selectors like "selector:0xa9059cbb".

Focus on: reentrancy, access control, upgradeability/proxy issues, signature validation,
accounting/invariant breaks, dangerous delegatecall, and untrusted external calls.
Be conservative: if evidence is weak, mark severity low/medium and explain why.
mcp startup: no servers

thinking
**Listing files to locate BYTECODE_BUNDLE.json**
exec
/bin/bash -lc ls in /tmp/codex-9t6puihg succeeded in 8ms:
BYTECODE_BUNDLE.json
codex-output-schema.json

thinking
**Reading the bundle**
exec
/bin/bash -lc 'cat BYTECODE_BUNDLE.json' in /tmp/codex-9t6puihg succeeded in 11ms:
{
  "analysis_artifact": {
    "address": "0x6c6210232654a5b57a576f9b4434f36e0b5d3768",
    "artifact_hash": "0x2d0601ceb07a23127074b8f1dce24c3faa2bded566779a72df77484959e295d1",
    "artifact_json": {
      "auth": {
        "guards": [
          {
            "pc": 5308,
            "type": "msg_sender_eq_const",
            "value": "0xffffffffffffffffffffffffffffffffffffffff"
          }
        ]
      },
      "basic_blocks": [
        {
          "end_pc": 11,
          "hash": "0x7ba4403ad8c2da27f36a99883d9bd6831f00a99722adb0e607c72478344873a4",
          "opcodes": [
            "PUSH1",

thinking
**Searching for storage and evidence references**
exec
/bin/bash -lc 'rg -n "storage|slot|evidence|selector|function" BYTECODE_BUNDLE.json | head -n 200' in /tmp/codex-9t6puihg succeeded in 12ms:
20994:      "dispatcher_type": "selector_jump_table",
20995:      "function_entries": [
20998:          "selector": "0xea217091"
21002:          "selector": "0xf059cf2b"
21006:          "selector": "0xf2fde38b"
21010:          "selector": "0xf74032f0"
21014:          "selector": "0xfa0caa16"
21018:          "selector": "0xc4d66de8"
21022:          "selector": "0xe6ede14d"
21026:          "selector": "0xe6fc7744"
21030:          "selector": "0xe7e2736e"
21034:          "selector": "0xe8340a99"
21038:          "selector": "0xa53d6e6e"
21042:          "selector": "0xae06c1b7"
21046:          "selector": "0xb7947262"
21050:          "selector": "0xb86f60d2"
21054:          "selector": "0xc1f0808a"
21058:          "selector": "0x8129fc1c"
21062:          "selector": "0x82dc1ec4"
21066:          "selector": "0x8456cb59"

thinking
**Searching for evidence_bundle occurrences**
exec
/bin/bash -lc 'rg -n "evidence" BYTECODE_BUNDLE.json | head -n 50' in /tmp/codex-9t6puihg succeeded in 8ms:
36255:      "proxy_evidence": {
45833:      "evidence_json": {
45889:      "evidence_json": {
45947:      "evidence_json": {

thinking
**Searching for proxy_evidence references**
exec
/bin/bash -lc "sed -n '36220,36380p' BYTECODE_BUNDLE.json" in /tmp/codex-9t6puihg succeeded in 9ms:
        "meta_json": {
          "implementation": "0x6c6210232654a5b57a576f9b4434f36e0b5d3768",
          "method": "eip1967",
          "onchain_method": "eip1967",
          "status": "onchain_only"
        },
        "parent": {
          "address": "0x9719d81c506c95f92caf970851b22afc88aee574",
          "block_number": null,
          "chain_id": 1,
          "created_at": "2026-01-11T04:06:13.000000Z",
          "id": "019bab3b-acce-7254-a517-d035d555f853",
          "status": "running",
          "updated_at": "2026-01-11T04:09:06.000000Z"
        },
        "parent_run_id": "019bab3b-acce-7254-a517-d035d555f853",
        "updated_at": "2026-01-11T04:09:07.000000Z"
      }
    ],
    "status": "running",

thinking
**Analyzing bytecode for delegatecall risks**

I'm examining the bytecode for delegatecall usage and related revert messages to understand if this Bridge contract has vulnerable delegatecall patterns, considering it might be a proxy implementation. I plan to verify findings cautiously, focusing on clues like ReentrancyGuard, Ownable, and bridge-specific roles, while looking into callsite details to identify any potential untrusted calls.
exec
/bin/bash -lc 'rg -n "callsite|delegatecall|DELEGATECALL|CALL" BYTECODE_BUNDLE.json | head -n 80' in /tmp/codex-9t6puihg succeeded in 8ms:
23:            "CALLVALUE",
48:            "CALLDATASIZE",
60:            "CALLDATALOAD",
700:            "CALLDATASIZE",
731:            "CALLDATALOAD",
742:            "CALLDATALOAD",
753:            "CALLDATALOAD",
764:            "CALLDATALOAD",
773:            "CALLDATALOAD",
831:            "CALLDATALOAD",
877:            "CALLDATALOAD",
935:            "CALLDATALOAD",
1046:            "CALLDATASIZE",
1077:            "CALLDATALOAD",
1088:            "CALLDATALOAD",
1099:            "CALLDATALOAD",
1108:            "CALLDATALOAD",
1166:            "CALLDATALOAD",
1212:            "CALLDATALOAD",
1221:            "CALLDATALOAD",

thinking
**Searching callsite details**
exec
/bin/bash -lc 'rg -n "callsite" BYTECODE_BUNDLE.json | head -n 200' in /tmp/codex-9t6puihg succeeded in 7ms:
17187:      "callsites": [
45491:          "type": "callsite"
45497:          "type": "callsite"
45503:          "type": "callsite"
45509:          "type": "callsite"
45515:          "type": "callsite"
45521:          "type": "callsite"
45527:          "type": "callsite"
45533:          "type": "callsite"
45539:          "type": "callsite"
45545:          "type": "callsite"
45551:          "type": "callsite"
45557:          "type": "callsite"
45563:          "type": "callsite"
45569:          "type": "callsite"
45575:          "type": "callsite"
45581:          "type": "callsite"

thinking
**Reviewing callsites near line 17187**
exec
/bin/bash -lc "sed -n '17170,17380p' BYTECODE_BUNDLE.json" in /tmp/codex-9t6puihg succeeded in 8ms:
            "SHA3",
            "PUSH16",
            "SHA3",
            "PUSH20",
            "OP_C1",
            "OP_C5",
            "SLOAD",
            "PUSH5",
            "LT",
            "CALLER",
            "OP_C0",
            "OP_C2",
            "PUSH30"
          ],
          "start_pc": 23284
        }
      ],
      "callsites": [
        {
          "opcode": "DELEGATECALL",

thinking
**Investigating delegatecall occurrences**
exec
/bin/bash -lc "python - <<'PY'
import json, itertools
import sys
from pathlib import Path

path = Path('BYTECODE_BUNDLE.json')
data = json.loads(path.read_text())
blocks = data['analysis_artifact']['artifact_json'].get('basic_blocks', [])
# Find blocks with DELEGATECALL
for b in blocks:
    if 'DELEGATECALL' in b.get('opcodes', []):
        print('block', b['start_pc'], b['end_pc'])
        # show opcodes around delegatecall
        ops = b['opcodes']
        for i,op in enumerate(ops):
            if op=='DELEGATECALL':
                start = max(0,i-10)
                end = min(len(ops), i+10)
                print('  context:', ops[start:end])
        print('  ops:', ops)
PY" in /tmp/codex-9t6puihg succeeded in 39ms:
block 6610 6620
  context: ['JUMPDEST', 'POP', 'GAS', 'DELEGATECALL', 'ISZERO', 'OP_80', 'ISZERO', 'PUSH2', 'JUMPI']
  ops: ['JUMPDEST', 'POP', 'GAS', 'DELEGATECALL', 'ISZERO', 'OP_80', 'ISZERO', 'PUSH2', 'JUMPI']
block 14611 14621
  context: ['JUMPDEST', 'POP', 'GAS', 'DELEGATECALL', 'ISZERO', 'OP_80', 'ISZERO', 'PUSH2', 'JUMPI']
  ops: ['JUMPDEST', 'POP', 'GAS', 'DELEGATECALL', 'ISZERO', 'OP_80', 'ISZERO', 'PUSH2', 'JUMPI']
block 15749 15759
  context: ['JUMPDEST', 'POP', 'GAS', 'DELEGATECALL', 'ISZERO', 'OP_80', 'ISZERO', 'PUSH2', 'JUMPI']
  ops: ['JUMPDEST', 'POP', 'GAS', 'DELEGATECALL', 'ISZERO', 'OP_80', 'ISZERO', 'PUSH2', 'JUMPI']
block 16131 16141
  context: ['JUMPDEST', 'POP', 'GAS', 'DELEGATECALL', 'ISZERO', 'OP_80', 'ISZERO', 'PUSH2', 'JUMPI']
  ops: ['JUMPDEST', 'POP', 'GAS', 'DELEGATECALL', 'ISZERO', 'OP_80', 'ISZERO', 'PUSH2', 'JUMPI']

thinking
**Implementing EVM disassembler for callsite analysis**

I'm working on parsing the runtime bytecode with Python to create a minimal EVM disassembler that can map program counters, opcodes, and immediate push values. This will help me inspect instructions surrounding each delegatecall, aiming to identify target addresses or access control by analyzing the surrounding bytecode instructions. I'll extract about 40 instructions around each callsite to better understand the data flow.
exec
/bin/bash -lc "python - <<'PY'
import json
from pathlib import Path

# EVM opcode map
opcodes = {
0x00:'STOP',0x01:'ADD',0x02:'MUL',0x03:'SUB',0x04:'DIV',0x05:'SDIV',0x06:'MOD',0x07:'SMOD',0x08:'ADDMOD',0x09:'MULMOD',0x0a:'EXP',0x0b:'SIGNEXTEND',
0x10:'LT',0x11:'GT',0x12:'SLT',0x13:'SGT',0x14:'EQ',0x15:'ISZERO',0x16:'AND',0x17:'OR',0x18:'XOR',0x19:'NOT',0x1a:'BYTE',0x1b:'SHL',0x1c:'SHR',0x1d:'SAR',
0x20:'SHA3',
0x30:'ADDRESS',0x31:'BALANCE',0x32:'ORIGIN',0x33:'CALLER',0x34:'CALLVALUE',0x35:'CALLDATALOAD',0x36:'CALLDATASIZE',0x37:'CALLDATACOPY',0x38:'CODESIZE',0x39:'CODECOPY',0x3a:'GASPRICE',0x3b:'EXTCODESIZE',0x3c:'EXTCODECOPY',0x3d:'RETURNDATASIZE',0x3e:'RETURNDATACOPY',0x3f:'EXTCODEHASH',
0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x46:'CHAINID',0x47:'SELFBALANCE',0x48:'BASEFEE',
0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x53:'MSTORE8',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x58:'PC',0x59:'MSIZE',0x5a:'GAS',0x5b:'JUMPDEST',
0x60:'PUSH1',0x61:'PUSH2',0x62:'PUSH3',0x63:'PUSH4',0x64:'PUSH5',0x65:'PUSH6',0x66:'PUSH7',0x67:'PUSH8',0x68:'PUSH9',0x69:'PUSH10',0x6a:'PUSH11',0x6b:'PUSH12',0x6c:'PUSH13',0x6d:'PUSH14',0x6e:'PUSH15',0x6f:'PUSH16',0x70:'PUSH17',0x71:'PUSH18',0x72:'PUSH19',0x73:'PUSH20',0x74:'PUSH21',0x75:'PUSH22',0x76:'PUSH23',0x77:'PUSH24',0x78:'PUSH25',0x79:'PUSH26',0x7a:'PUSH27',0x7b:'PUSH28',0x7c:'PUSH29',0x7d:'PUSH30',0x7e:'PUSH31',0x7f:'PUSH32',
0x80:'DUP1',0x81:'DUP2',0x82:'DUP3',0x83:'DUP4',0x84:'DUP5',0x85:'DUP6',0x86:'DUP7',0x87:'DUP8',0x88:'DUP9',0x89:'DUP10',0x8a:'DUP11',0x8b:'DUP12',0x8c:'DUP13',0x8d:'DUP14',0x8e:'DUP15',0x8f:'DUP16',
0x90:'SWAP1',0x91:'SWAP2',0x92:'SWAP3',0x93:'SWAP4',0x94:'SWAP5',0x95:'SWAP6',0x96:'SWAP7',0x97:'SWAP8',0x98:'SWAP9',0x99:'SWAP10',0x9a:'SWAP11',0x9b:'SWAP12',0x9c:'SWAP13',0x9d:'SWAP14',0x9e:'SWAP15',0x9f:'SWAP16',
0xa0:'LOG0',0xa1:'LOG1',0xa2:'LOG2',0xa3:'LOG3',0xa4:'LOG4',
0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'
}

# Load bytecode
path = Path('BYTECODE_BUNDLE.json')
data = json.loads(path.read_text())
bytecode_hex = data['artifact']['runtime_bytecode']['full']
if bytecode_hex.startswith('0x'): bytecode_hex = bytecode_hex[2:]
bytecode = bytes.fromhex(bytecode_hex)

# Disassemble
def disassemble(bytecode):
    pc = 0
    out = []
    while pc < len(bytecode):
        op = bytecode[pc]
        name = opcodes.get(op, f'OP_{op:02x}')
        pc_start = pc
        pc += 1
        imm = None
        if 0x60 <= op <= 0x7f:
            n = op - 0x5f
            imm_bytes = bytecode[pc:pc+n]
            imm = imm_bytes.hex()
            pc += n
        out.append((pc_start, name, imm))
    return out

insts = disassemble(bytecode)

# Build map for quick lookup
idx_by_pc = {pc:i for i,(pc,_,_) in enumerate(insts)}

def show_context(pc_target, before=20, after=20):
    i = idx_by_pc.get(pc_target)
    if i is None:
        # find closest
        pcs = sorted(idx_by_pc)
        # simple approach: find last pc <= target
        i = max([idx_by_pc[p] for p in pcs if p <= pc_target], default=None)
    if i is None:
        print('pc not found', pc_target)
        return
    start = max(0, i-before)
    end = min(len(insts), i+after)
    for pc, name, imm in insts[start:end]:
        if imm is None:
            line = f'{pc:05d}: {name}'
        else:
            line = f'{pc:05d}: {name} 0x{imm}'
        marker = ' <==' if pc==pc_target else ''
        print(line + marker)
    print('---')

for pc in [6613,14614,15752,16134,8141,13359,16770,20663,21752]:
    print('Context for pc', pc)
    show_context(pc)
PY" in /tmp/codex-9t6puihg succeeded in 52ms:
Context for pc 6613
06589: PUSH1 0x40
06591: MLOAD
06592: DUP1
06593: DUP4
06594: SUB
06595: DUP2
06596: DUP7
06597: DUP1
06598: EXTCODESIZE
06599: ISZERO
06600: DUP1
06601: ISZERO
06602: PUSH2 0x19d2
06605: JUMPI
06606: PUSH1 0x00
06608: DUP1
06609: REVERT
06610: JUMPDEST
06611: POP

thinking
**Tracing delegatecall target address**
exec
/bin/bash -lc "python - <<'PY'
import json
from pathlib import Path

opcodes = {
0x00:'STOP',0x01:'ADD',0x02:'MUL',0x03:'SUB',0x04:'DIV',0x05:'SDIV',0x06:'MOD',0x07:'SMOD',0x08:'ADDMOD',0x09:'MULMOD',0x0a:'EXP',0x0b:'SIGNEXTEND',
0x10:'LT',0x11:'GT',0x12:'SLT',0x13:'SGT',0x14:'EQ',0x15:'ISZERO',0x16:'AND',0x17:'OR',0x18:'XOR',0x19:'NOT',0x1a:'BYTE',0x1b:'SHL',0x1c:'SHR',0x1d:'SAR',
0x20:'SHA3',
0x30:'ADDRESS',0x31:'BALANCE',0x32:'ORIGIN',0x33:'CALLER',0x34:'CALLVALUE',0x35:'CALLDATALOAD',0x36:'CALLDATASIZE',0x37:'CALLDATACOPY',0x38:'CODESIZE',0x39:'CODECOPY',0x3a:'GASPRICE',0x3b:'EXTCODESIZE',0x3c:'EXTCODECOPY',0x3d:'RETURNDATASIZE',0x3e:'RETURNDATACOPY',0x3f:'EXTCODEHASH',
0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x46:'CHAINID',0x47:'SELFBALANCE',0x48:'BASEFEE',
0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x53:'MSTORE8',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x58:'PC',0x59:'MSIZE',0x5a:'GAS',0x5b:'JUMPDEST',
0x60:'PUSH1',0x61:'PUSH2',0x62:'PUSH3',0x63:'PUSH4',0x64:'PUSH5',0x65:'PUSH6',0x66:'PUSH7',0x67:'PUSH8',0x68:'PUSH9',0x69:'PUSH10',0x6a:'PUSH11',0x6b:'PUSH12',0x6c:'PUSH13',0x6d:'PUSH14',0x6e:'PUSH15',0x6f:'PUSH16',0x70:'PUSH17',0x71:'PUSH18',0x72:'PUSH19',0x73:'PUSH20',0x74:'PUSH21',0x75:'PUSH22',0x76:'PUSH23',0x77:'PUSH24',0x78:'PUSH25',0x79:'PUSH26',0x7a:'PUSH27',0x7b:'PUSH28',0x7c:'PUSH29',0x7d:'PUSH30',0x7e:'PUSH31',0x7f:'PUSH32',
0x80:'DUP1',0x81:'DUP2',0x82:'DUP3',0x83:'DUP4',0x84:'DUP5',0x85:'DUP6',0x86:'DUP7',0x87:'DUP8',0x88:'DUP9',0x89:'DUP10',0x8a:'DUP11',0x8b:'DUP12',0x8c:'DUP13',0x8d:'DUP14',0x8e:'DUP15',0x8f:'DUP16',
0x90:'SWAP1',0x91:'SWAP2',0x92:'SWAP3',0x93:'SWAP4',0x94:'SWAP5',0x95:'SWAP6',0x96:'SWAP7',0x97:'SWAP8',0x98:'SWAP9',0x99:'SWAP10',0x9a:'SWAP11',0x9b:'SWAP12',0x9c:'SWAP13',0x9d:'SWAP14',0x9e:'SWAP15',0x9f:'SWAP16',
0xa0:'LOG0',0xa1:'LOG1',0xa2:'LOG2',0xa3:'LOG3',0xa4:'LOG4',
0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'
}

def disassemble(bytecode):
    pc = 0
    out = []
    while pc < len(bytecode):
        op = bytecode[pc]
        name = opcodes.get(op, f'OP_{op:02x}')
        pc_start = pc
        pc += 1
        imm = None
        if 0x60 <= op <= 0x7f:
            n = op - 0x5f
            imm_bytes = bytecode[pc:pc+n]
            imm = imm_bytes.hex()
            pc += n
        out.append((pc_start, name, imm))
    return out

# Load bytecode
path = Path('BYTECODE_BUNDLE.json')
data = json.loads(path.read_text())
bytecode_hex = data['artifact']['runtime_bytecode']['full']
if bytecode_hex.startswith('0x'): bytecode_hex = bytecode_hex[2:]
bytecode = bytes.fromhex(bytecode_hex)
insts = disassemble(bytecode)
idx_by_pc = {pc:i for i,(pc,_,_) in enumerate(insts)}

def show_context(pc_target, before=60, after=20):
    # find nearest instruction <= pc_target
    pcs = sorted(idx_by_pc)
    i = max([idx_by_pc[p] for p in pcs if p <= pc_target], default=None)
    if i is None:
        print('pc not found', pc_target); return
    start = max(0, i-before)
    end = min(len(insts), i+after)
    for pc, name, imm in insts[start:end]:
        if imm is None:
            line = f'{pc:05d}: {name}'
        else:
            line = f'{pc:05d}: {name} 0x{imm}'
        marker = ' <==' if pc==pc_target else ''
        print(line + marker)
    print('---')

for pc in [6613,14614,15752,16134]:
    print('Context for pc', pc)
    show_context(pc)
PY" in /tmp/codex-9t6puihg succeeded in 60ms:
Context for pc 6613
06513: MSTORE
06514: POP
06515: PUSH1 0x20
06517: ADD
06518: SWAP2
06519: POP
06520: POP
06521: PUSH1 0x40
06523: MLOAD
06524: DUP1
06525: SWAP2
06526: SUB
06527: SWAP1
06528: REVERT
06529: JUMPDEST
06530: PUSH1 0x12
06532: PUSH20 0xa54a5f483866801c49ad2df022af8c215f2714c5
06553: PUSH4 0x19bd2045
06558: DUP6

thinking
**Analyzing delegatecall patterns and function mappings**

I'm inspecting how delegatecall target addresses and calldata are constructed, trying to identify whether the calls are to fixed or dynamic contracts and if access control is enforced. I’m also exploring the artifact’s function metadata to map function entries and understand which functions involve delegatecall calls, aiming to spot potential vulnerabilities like untrusted delegatecall or calls without proper guards.
exec
/bin/bash -lc "sed -n '20980,21180p' BYTECODE_BUNDLE.json" in /tmp/codex-9t6puihg succeeded in 9ms:
          "type": "control_flow"
        },
        {
          "from": "bb:23252",
          "to": "bb:23261",
          "type": "control_flow_fallthrough"
        },
        {
          "from": "bb:23261",
          "to": "bb:23252",
          "type": "control_flow"
        }
      ],
      "cfg_hash": "0x4aa2f4fc66c7af6572e62a9b5f1b0e1f67858e946890bddb255a843010042454",
      "dispatcher_type": "selector_jump_table",
      "function_entries": [
        {
          "entry_pc": 3928060049,
          "selector": "0xea217091"
        },

thinking
**Analyzing functions for delegatecall usage**
exec
/bin/bash -lc "python - <<'PY'
import json
from pathlib import Path

data = json.loads(Path('BYTECODE_BUNDLE.json').read_text())
functions = data['analysis_artifact']['artifact_json'].get('functions', [])
# But in the snippet there is 'functions' list inside graph? let's check length
print('functions count', len(functions))

# List selectors with delegatecall sinks
for f in functions:
    sinks = f.get('sinks', {})
    if sinks.get('delegatecall',0) > 0:
        print('selector', f.get('selector'), 'entry_pc', f.get('entry_pc'), 'delegatecall', sinks.get('delegatecall'), 'call', sinks.get('call'), 'staticcall', sinks.get('staticcall'))
        guards = f.get('auth', {}).get('guards')
        if guards:
            print('  guards', guards)
PY" in /tmp/codex-9t6puihg succeeded in 40ms:
functions count 38
selector 0xea217091 entry_pc 3928060049 delegatecall 4 call 5 staticcall 7
  guards [{'pc': 5308, 'type': 'msg_sender_eq_const', 'value': '0xffffffffffffffffffffffffffffffffffffffff'}]
selector 0xf059cf2b entry_pc 4076725131 delegatecall 4 call 5 staticcall 7
  guards [{'pc': 5308, 'type': 'msg_sender_eq_const', 'value': '0xffffffffffffffffffffffffffffffffffffffff'}]
selector 0xf2fde38b entry_pc 4148179696 delegatecall 4 call 5 staticcall 7
  guards [{'pc': 5308, 'type': 'msg_sender_eq_const', 'value': '0xffffffffffffffffffffffffffffffffffffffff'}]
selector 0xf74032f0 entry_pc 4195133974 delegatecall 4 call 5 staticcall 7
  guards [{'pc': 5308, 'type': 'msg_sender_eq_const', 'value': '0xffffffffffffffffffffffffffffffffffffffff'}]
selector 0xfa0caa16 entry_pc None delegatecall 4 call 5 staticcall 7
  guards [{'pc': 5308, 'type': 'msg_sender_eq_const', 'value': '0xffffffffffffffffffffffffffffffffffffffff'}]
selector 0xc4d66de8 entry_pc 3874349389 delegatecall 4 call 5 staticcall 7
  guards [{'pc': 5308, 'type': 'msg_sender_eq_const', 'value': '0xffffffffffffffffffffffffffffffffffffffff'}]
selector 0xe6ede14d entry_pc 3875305284 delegatecall 4 call 5 staticcall 7
  guards [{'pc': 5308, 'type': 'msg_sender_eq_const', 'value': '0xffffffffffffffffffffffffffffffffffffffff'}]
selector 0xe6fc7744 entry_pc 3890377582 delegatecall 4 call 5 staticcall 7
  guards [{'pc': 5308, 'type': 'msg_sender_eq_const', 'value': '0xffffffffffffffffffffffffffffffffffffffff'}]
selector 0xe7e2736e entry_pc 3895724697 delegatecall 4 call 5 staticcall 7
  guards [{'pc': 5308, 'type': 'msg_sender_eq_const', 'value': '0xffffffffffffffffffffffffffffffffffffffff'}]
selector 0xe8340a99 entry_pc None delegatecall 4 call 5 staticcall 7

thinking
**Analyzing delegatecall targets and address sources**

I'm exploring whether delegatecall targets are constant addresses or loaded dynamically from storage by examining surrounding bytecode instructions like PUSH20 and SLOAD near delegatecall sites. This helps assess if calls are safe (to fixed library addresses) or might pose risks from untrusted inputs. I'll implement a search for these patterns programmatically to clarify the origin of delegatecall addresses.
exec
/bin/bash -lc "python - <<'PY'
import json
from pathlib import Path

opcodes = {
0x00:'STOP',0x01:'ADD',0x02:'MUL',0x03:'SUB',0x04:'DIV',0x05:'SDIV',0x06:'MOD',0x07:'SMOD',0x08:'ADDMOD',0x09:'MULMOD',0x0a:'EXP',0x0b:'SIGNEXTEND',
0x10:'LT',0x11:'GT',0x12:'SLT',0x13:'SGT',0x14:'EQ',0x15:'ISZERO',0x16:'AND',0x17:'OR',0x18:'XOR',0x19:'NOT',0x1a:'BYTE',0x1b:'SHL',0x1c:'SHR',0x1d:'SAR',
0x20:'SHA3',
0x30:'ADDRESS',0x31:'BALANCE',0x32:'ORIGIN',0x33:'CALLER',0x34:'CALLVALUE',0x35:'CALLDATALOAD',0x36:'CALLDATASIZE',0x37:'CALLDATACOPY',0x38:'CODESIZE',0x39:'CODECOPY',0x3a:'GASPRICE',0x3b:'EXTCODESIZE',0x3c:'EXTCODECOPY',0x3d:'RETURNDATASIZE',0x3e:'RETURNDATACOPY',0x3f:'EXTCODEHASH',
0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x46:'CHAINID',0x47:'SELFBALANCE',0x48:'BASEFEE',
0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x53:'MSTORE8',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x58:'PC',0x59:'MSIZE',0x5a:'GAS',0x5b:'JUMPDEST',
0x60:'PUSH1',0x61:'PUSH2',0x62:'PUSH3',0x63:'PUSH4',0x64:'PUSH5',0x65:'PUSH6',0x66:'PUSH7',0x67:'PUSH8',0x68:'PUSH9',0x69:'PUSH10',0x6a:'PUSH11',0x6b:'PUSH12',0x6c:'PUSH13',0x6d:'PUSH14',0x6e:'PUSH15',0x6f:'PUSH16',0x70:'PUSH17',0x71:'PUSH18',0x72:'PUSH19',0x73:'PUSH20',0x74:'PUSH21',0x75:'PUSH22',0x76:'PUSH23',0x77:'PUSH24',0x78:'PUSH25',0x79:'PUSH26',0x7a:'PUSH27',0x7b:'PUSH28',0x7c:'PUSH29',0x7d:'PUSH30',0x7e:'PUSH31',0x7f:'PUSH32',
0x80:'DUP1',0x81:'DUP2',0x82:'DUP3',0x83:'DUP4',0x84:'DUP5',0x85:'DUP6',0x86:'DUP7',0x87:'DUP8',0x88:'DUP9',0x89:'DUP10',0x8a:'DUP11',0x8b:'DUP12',0x8c:'DUP13',0x8d:'DUP14',0x8e:'DUP15',0x8f:'DUP16',
0x90:'SWAP1',0x91:'SWAP2',0x92:'SWAP3',0x93:'SWAP4',0x94:'SWAP5',0x95:'SWAP6',0x96:'SWAP7',0x97:'SWAP8',0x98:'SWAP9',0x99:'SWAP10',0x9a:'SWAP11',0x9b:'SWAP12',0x9c:'SWAP13',0x9d:'SWAP14',0x9e:'SWAP15',0x9f:'SWAP16',
0xa0:'LOG0',0xa1:'LOG1',0xa2:'LOG2',0xa3:'LOG3',0xa4:'LOG4',
0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'
}

def disassemble(bytecode):
    pc = 0
    out = []
    while pc < len(bytecode):
        op = bytecode[pc]
        name = opcodes.get(op, f'OP_{op:02x}')
        pc_start = pc
        pc += 1
        imm = None
        if 0x60 <= op <= 0x7f:
            n = op - 0x5f
            imm_bytes = bytecode[pc:pc+n]
            imm = imm_bytes.hex()
            pc += n
        out.append((pc_start, name, imm))
    return out

# Load bytecode
path = Path('BYTECODE_BUNDLE.json')
data = json.loads(path.read_text())
bytecode_hex = data['artifact']['runtime_bytecode']['full']
if bytecode_hex.startswith('0x'): bytecode_hex = bytecode_hex[2:]
bytecode = bytes.fromhex(bytecode_hex)
insts = disassemble(bytecode)
idx_by_pc = {pc:i for i,(pc,_,_) in enumerate(insts)}

for pc_target in [6613,14614,15752,16134]:
    i = idx_by_pc[pc_target]
    window = insts[max(0,i-120):i]
    push20s = [imm for _,name,imm in window if name=='PUSH20']
    sloads = [pc for pc,name,_ in window if name=='SLOAD']
    print('pc', pc_target, 'push20s', push20s, 'sloads', sloads[-5:])
PY" in /tmp/codex-9t6puihg succeeded in 72ms:
pc 6613 push20s ['a54a5f483866801c49ad2df022af8c215f2714c5'] sloads []
pc 14614 push20s ['ffffffffffffffffffffffffffffffffffffffff', 'ffffffffffffffffffffffffffffffffffffffff', 'a54a5f483866801c49ad2df022af8c215f2714c5', 'ffffffffffffffffffffffffffffffffffffffff', 'ffffffffffffffffffffffffffffffffffffffff'] sloads [14468]
pc 15752 push20s ['a54a5f483866801c49ad2df022af8c215f2714c5', 'ffffffffffffffffffffffffffffffffffffffff', 'ffffffffffffffffffffffffffffffffffffffff'] sloads []
pc 16134 push20s ['a54a5f483866801c49ad2df022af8c215f2714c5'] sloads []

thinking
**Analyzing delegatecall and external call risks**

I'm dissecting the bytecode to identify risks around a delegatecall to a fixed external address, which could be risky if that contract is mutable or untrusted. I’m also checking calls involving ETH transfers and assessing whether reentrancy guards and access controls are properly in place, focusing on bridging-related functions and known function selectors to map security-relevant logic.
exec
/bin/bash -lc "python - <<'PY'
import json
from pathlib import Path

# Disassembler with full context
opcodes = {
0x00:'STOP',0x01:'ADD',0x02:'MUL',0x03:'SUB',0x04:'DIV',0x05:'SDIV',0x06:'MOD',0x07:'SMOD',0x08:'ADDMOD',0x09:'MULMOD',0x0a:'EXP',0x0b:'SIGNEXTEND',
0x10:'LT',0x11:'GT',0x12:'SLT',0x13:'SGT',0x14:'EQ',0x15:'ISZERO',0x16:'AND',0x17:'OR',0x18:'XOR',0x19:'NOT',0x1a:'BYTE',0x1b:'SHL',0x1c:'SHR',0x1d:'SAR',
0x20:'SHA3',
0x30:'ADDRESS',0x31:'BALANCE',0x32:'ORIGIN',0x33:'CALLER',0x34:'CALLVALUE',0x35:'CALLDATALOAD',0x36:'CALLDATASIZE',0x37:'CALLDATACOPY',0x38:'CODESIZE',0x39:'CODECOPY',0x3a:'GASPRICE',0x3b:'EXTCODESIZE',0x3c:'EXTCODECOPY',0x3d:'RETURNDATASIZE',0x3e:'RETURNDATACOPY',0x3f:'EXTCODEHASH',
0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x46:'CHAINID',0x47:'SELFBALANCE',0x48:'BASEFEE',
0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x53:'MSTORE8',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x58:'PC',0x59:'MSIZE',0x5a:'GAS',0x5b:'JUMPDEST',
0x60:'PUSH1',0x61:'PUSH2',0x62:'PUSH3',0x63:'PUSH4',0x64:'PUSH5',0x65:'PUSH6',0x66:'PUSH7',0x67:'PUSH8',0x68:'PUSH9',0x69:'PUSH10',0x6a:'PUSH11',0x6b:'PUSH12',0x6c:'PUSH13',0x6d:'PUSH14',0x6e:'PUSH15',0x6f:'PUSH16',0x70:'PUSH17',0x71:'PUSH18',0x72:'PUSH19',0x73:'PUSH20',0x74:'PUSH21',0x75:'PUSH22',0x76:'PUSH23',0x77:'PUSH24',0x78:'PUSH25',0x79:'PUSH26',0x7a:'PUSH27',0x7b:'PUSH28',0x7c:'PUSH29',0x7d:'PUSH30',0x7e:'PUSH31',0x7f:'PUSH32',
0x80:'DUP1',0x81:'DUP2',0x82:'DUP3',0x83:'DUP4',0x84:'DUP5',0x85:'DUP6',0x86:'DUP7',0x87:'DUP8',0x88:'DUP9',0x89:'DUP10',0x8a:'DUP11',0x8b:'DUP12',0x8c:'DUP13',0x8d:'DUP14',0x8e:'DUP15',0x8f:'DUP16',
0x90:'SWAP1',0x91:'SWAP2',0x92:'SWAP3',0x93:'SWAP4',0x94:'SWAP5',0x95:'SWAP6',0x96:'SWAP7',0x97:'SWAP8',0x98:'SWAP9',0x99:'SWAP10',0x9a:'SWAP11',0x9b:'SWAP12',0x9c:'SWAP13',0x9d:'SWAP14',0x9e:'SWAP15',0x9f:'SWAP16',
0xa0:'LOG0',0xa1:'LOG1',0xa2:'LOG2',0xa3:'LOG3',0xa4:'LOG4',
0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'
}

def disassemble(bytecode):
    pc = 0
    out = []
    while pc < len(bytecode):
        op = bytecode[pc]
        name = opcodes.get(op, f'OP_{op:02x}')
        pc_start = pc
        pc += 1
        imm = None
        if 0x60 <= op <= 0x7f:
            n = op - 0x5f
            imm_bytes = bytecode[pc:pc+n]
            imm = imm_bytes.hex()
            pc += n
        out.append((pc_start, name, imm))
    return out

# Load
path = Path('BYTECODE_BUNDLE.json')
data = json.loads(path.read_text())
bytecode_hex = data['artifact']['runtime_bytecode']['full']
if bytecode_hex.startswith('0x'): bytecode_hex = bytecode_hex[2:]
bytecode = bytes.fromhex(bytecode_hex)
insts = disassemble(bytecode)
idx_by_pc = {pc:i for i,(pc,_,_) in enumerate(insts)}

# Show around CALL at 8141 with bigger context
pc_target = 8141
idx = idx_by_pc[pc_target]
start = max(0, idx-80)
end = min(len(insts), idx+10)
for pc,name,imm in insts[start:end]:
    line = f'{pc:05d}: {name}' + (f' 0x{imm}' if imm else '')
    if pc==pc_target:
        line += ' <=='
    print(line)
PY" in /tmp/codex-9t6puihg succeeded in 54ms:
07882: DUP4
07883: PUSH2 0x436e
07886: JUMP
07887: JUMPDEST
07888: PUSH2 0x1ed8
07891: DUP6
07892: PUSH2 0x449b
07895: JUMP
07896: JUMPDEST
07897: PUSH20 0x1820a4b7618bde71dce8cdc73aab6c95905fad24
07918: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
07939: AND
07940: PUSH4 0x29965a1d
07945: ADDRESS
07946: PUSH32 0xb281fc8c12954d22544db45de3159a39272895b169a852b314f9cc762e44c53b
07979: ADDRESS
07980: PUSH1 0x40
07982: MLOAD
07983: DUP5
07984: PUSH4 0xffffffff

thinking
**Analyzing call targets and addresses**
exec
/bin/bash -lc "python - <<'PY'
import json
from pathlib import Path
# disassembler from earlier
opcodes = {
0x00:'STOP',0x01:'ADD',0x02:'MUL',0x03:'SUB',0x04:'DIV',0x05:'SDIV',0x06:'MOD',0x07:'SMOD',0x08:'ADDMOD',0x09:'MULMOD',0x0a:'EXP',0x0b:'SIGNEXTEND',
0x10:'LT',0x11:'GT',0x12:'SLT',0x13:'SGT',0x14:'EQ',0x15:'ISZERO',0x16:'AND',0x17:'OR',0x18:'XOR',0x19:'NOT',0x1a:'BYTE',0x1b:'SHL',0x1c:'SHR',0x1d:'SAR',
0x20:'SHA3',0x30:'ADDRESS',0x31:'BALANCE',0x32:'ORIGIN',0x33:'CALLER',0x34:'CALLVALUE',0x35:'CALLDATALOAD',0x36:'CALLDATASIZE',0x37:'CALLDATACOPY',0x38:'CODESIZE',0x39:'CODECOPY',0x3a:'GASPRICE',0x3b:'EXTCODESIZE',0x3c:'EXTCODECOPY',0x3d:'RETURNDATASIZE',0x3e:'RETURNDATACOPY',0x3f:'EXTCODEHASH',
0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x46:'CHAINID',0x47:'SELFBALANCE',0x48:'BASEFEE',
0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x53:'MSTORE8',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x58:'PC',0x59:'MSIZE',0x5a:'GAS',0x5b:'JUMPDEST',
0x60:'PUSH1',0x61:'PUSH2',0x62:'PUSH3',0x63:'PUSH4',0x64:'PUSH5',0x65:'PUSH6',0x66:'PUSH7',0x67:'PUSH8',0x68:'PUSH9',0x69:'PUSH10',0x6a:'PUSH11',0x6b:'PUSH12',0x6c:'PUSH13',0x6d:'PUSH14',0x6e:'PUSH15',0x6f:'PUSH16',0x70:'PUSH17',0x71:'PUSH18',0x72:'PUSH19',0x73:'PUSH20',0x74:'PUSH21',0x75:'PUSH22',0x76:'PUSH23',0x77:'PUSH24',0x78:'PUSH25',0x79:'PUSH26',0x7a:'PUSH27',0x7b:'PUSH28',0x7c:'PUSH29',0x7d:'PUSH30',0x7e:'PUSH31',0x7f:'PUSH32',
0x80:'DUP1',0x81:'DUP2',0x82:'DUP3',0x83:'DUP4',0x84:'DUP5',0x85:'DUP6',0x86:'DUP7',0x87:'DUP8',0x88:'DUP9',0x89:'DUP10',0x8a:'DUP11',0x8b:'DUP12',0x8c:'DUP13',0x8d:'DUP14',0x8e:'DUP15',0x8f:'DUP16',
0x90:'SWAP1',0x91:'SWAP2',0x92:'SWAP3',0x93:'SWAP4',0x94:'SWAP5',0x95:'SWAP6',0x96:'SWAP7',0x97:'SWAP8',0x98:'SWAP9',0x99:'SWAP10',0x9a:'SWAP11',0x9b:'SWAP12',0x9c:'SWAP13',0x9d:'SWAP14',0x9e:'SWAP15',0x9f:'SWAP16',
0xa0:'LOG0',0xa1:'LOG1',0xa2:'LOG2',0xa3:'LOG3',0xa4:'LOG4',
0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'
}

def disassemble(bytecode):
    pc = 0
    out = []
    while pc < len(bytecode):
        op = bytecode[pc]
        name = opcodes.get(op, f'OP_{op:02x}')
        pc_start = pc
        pc += 1
        imm = None
        if 0x60 <= op <= 0x7f:
            n = op - 0x5f
            imm_bytes = bytecode[pc:pc+n]
            imm = imm_bytes.hex()
            pc += n
        out.append((pc_start, name, imm))
    return out

path = Path('BYTECODE_BUNDLE.json')
data = json.loads(path.read_text())
bytecode_hex = data['artifact']['runtime_bytecode']['full']
if bytecode_hex.startswith('0x'): bytecode_hex = bytecode_hex[2:]
bytecode = bytes.fromhex(bytecode_hex)
insts = disassemble(bytecode)
idx_by_pc = {pc:i for i,(pc,_,_) in enumerate(insts)}

pc_target = 13359
idx = idx_by_pc[pc_target]
start = max(0, idx-80)
end = min(len(insts), idx+10)
for pc,name,imm in insts[start:end]:
    line = f'{pc:05d}: {name}' + (f' 0x{imm}' if imm else '')
    if pc==pc_target:
        line += ' <=='
    print(line)
PY" in /tmp/codex-9t6puihg succeeded in 60ms:
13262: DUP3
13263: ADD
13264: MLOAD
13265: DUP2
13266: DUP5
13267: ADD
13268: MSTORE
13269: PUSH1 0x20
13271: DUP2
13272: ADD
13273: SWAP1
13274: POP
13275: PUSH2 0x33c4
13278: JUMP
13279: JUMPDEST
13280: POP
13281: POP
13282: POP
13283: POP
13284: SWAP1

thinking
**Assessing delegatecall and external call risks**
exec
/bin/bash -lc "python - <<'PY'
import json
from pathlib import Path

# disassemble
opcodes = {}
# build opcodes map for pushes
for i in range(0x00, 0x100):
    if 0x60 <= i <= 0x7f:
        opcodes[i] = f'PUSH{i-0x5f}'
    elif i==0xf4:
        opcodes[i]='DELEGATECALL'
    else:
        opcodes[i]=None

# general map for readability
from collections import deque

def disassemble(bytecode):
    pc = 0
    out = []
    while pc < len(bytecode):
        op = bytecode[pc]
        name = opcodes.get(op) or f'OP_{op:02x}'
        pc_start = pc
        pc += 1
        imm = None
        if name.startswith('PUSH'):
            n = op - 0x5f
            imm = bytecode[pc:pc+n].hex()
            pc += n
        out.append((pc_start, name, imm))
    return out

path = Path('BYTECODE_BUNDLE.json')
data = json.loads(path.read_text())
bytecode_hex = data['artifact']['runtime_bytecode']['full']
if bytecode_hex.startswith('0x'): bytecode_hex = bytecode_hex[2:]
bytecode = bytes.fromhex(bytecode_hex)
insts = disassemble(bytecode)
idx_by_pc = {pc:i for i,(pc,_,_) in enumerate(insts)}

for pc_target in [6613,14614,15752,16134]:
    idx = idx_by_pc[pc_target]
    # search backwards for last PUSH4 and PUSH20
    push4 = None
    push20 = None
    for pc,name,imm in reversed(insts[max(0,idx-120):idx]):
        if push4 is None and name=='PUSH4':
            push4 = (pc, imm)
        if push20 is None and name=='PUSH20':
            push20 = (pc, imm)
        if push4 and push20:
            break
    print('delegatecall pc', pc_target, 'push4', push4, 'push20', push20)
PY" in /tmp/codex-9t6puihg succeeded in 76ms:
delegatecall pc 6613 push4 (6563, 'ffffffff') push20 (6532, 'a54a5f483866801c49ad2df022af8c215f2714c5')
delegatecall pc 14614 push4 (14520, 'ffffffff') push20 (14558, 'ffffffffffffffffffffffffffffffffffffffff')
delegatecall pc 15752 push4 (15645, 'ffffffff') push20 (15683, 'ffffffffffffffffffffffffffffffffffffffff')
delegatecall pc 16134 push4 (16065, 'ffffffff') push20 (16032, 'a54a5f483866801c49ad2df022af8c215f2714c5')

thinking
**Adjusting push4 search criteria**
exec
/bin/bash -lc "python - <<'PY'
import json
from pathlib import Path

opcodes = {}
for i in range(0x00, 0x100):
    if 0x60 <= i <= 0x7f:
        opcodes[i] = f'PUSH{i-0x5f}'
    else:
        opcodes[i]=None

def disassemble(bytecode):
    pc = 0
    out = []
    while pc < len(bytecode):
        op = bytecode[pc]
        name = opcodes.get(op) or f'OP_{op:02x}'
        pc_start = pc
        pc += 1
        imm = None
        if name.startswith('PUSH'):
            n = op - 0x5f
            imm = bytecode[pc:pc+n].hex()
            pc += n
        out.append((pc_start, name, imm))
    return out

path = Path('BYTECODE_BUNDLE.json')
data = json.loads(path.read_text())
bytecode_hex = data['artifact']['runtime_bytecode']['full']
if bytecode_hex.startswith('0x'): bytecode_hex = bytecode_hex[2:]
bytecode = bytes.fromhex(bytecode_hex)
insts = disassemble(bytecode)
idx_by_pc = {pc:i for i,(pc,_,_) in enumerate(insts)}

for pc_target in [6613,14614,15752,16134]:
    idx = idx_by_pc[pc_target]
    # search back for push4 not ffffffff
    push4 = None
    push20 = None
    for pc,name,imm in reversed(insts[max(0,idx-200):idx]):
        if name=='PUSH20' and push20 is None and imm not in ('ffffffffffffffffffffffffffffffffffffffff',):
            push20 = (pc, imm)
        if name=='PUSH4' and push4 is None and imm not in ('ffffffff',):
            push4 = (pc, imm)
        if push4 and push20:
            break
    print('pc', pc_target, 'push4', push4, 'push20', push20)
PY" in /tmp/codex-9t6puihg succeeded in 54ms:
pc 6613 push4 (6553, '19bd2045') push20 (6532, 'a54a5f483866801c49ad2df022af8c215f2714c5')
pc 14614 push4 (14510, '1f69565f') push20 (14489, 'a54a5f483866801c49ad2df022af8c215f2714c5')
pc 15752 push4 (15633, 'dc98f6b7') push20 (15612, 'a54a5f483866801c49ad2df022af8c215f2714c5')
pc 16134 push4 (16053, 'db8a2e3c') push20 (16032, 'a54a5f483866801c49ad2df022af8c215f2714c5')

thinking
**Analyzing delegatecall and call targets**
exec
/bin/bash -lc "python - <<'PY'
import json
from pathlib import Path

opcodes = {}
for i in range(0x00,0x100):
    if 0x60<=i<=0x7f:
        opcodes[i]=f'PUSH{i-0x5f}'
    else:
        opcodes[i]=None

def disassemble(bytecode):
    pc=0; out=[]
    while pc < len(bytecode):
        op=bytecode[pc]; name=opcodes.get(op) or f'OP_{op:02x}'; pc_start=pc; pc+=1; imm=None
        if name.startswith('PUSH'):
            n = op-0x5f
            imm = bytecode[pc:pc+n].hex(); pc+=n
        out.append((pc_start,name,imm))
    return out

path = Path('BYTECODE_BUNDLE.json')
data = json.loads(path.read_text())
bytecode_hex = data['artifact']['runtime_bytecode']['full']
if bytecode_hex.startswith('0x'): bytecode_hex = bytecode_hex[2:]
bytecode = bytes.fromhex(bytecode_hex)
insts = disassemble(bytecode)
idx_by_pc = {pc:i for pc,_,_ in insts}

call_pcs = [8141,13359,16770,20663,21752]
for pc_target in call_pcs:
    idx = idx_by_pc[pc_target]
    push20=None
    for pc,name,imm in reversed(insts[max(0,idx-200):idx]):
        if name=='PUSH20' and imm not in ('ffffffffffffffffffffffffffffffffffffffff',):
            push20=(pc,imm)
            break
    print('CALL pc', pc_target, 'push20', push20)
PY" in /tmp/codex-9t6puihg succeeded in 63ms:
CALL pc 8141 push20 None
CALL pc 13359 push20 None
CALL pc 16770 push20 None
CALL pc 20663 push20 None
CALL pc 21752 push20 None

thinking
**Analyzing computed call targets and values**
exec
/bin/bash -lc "python - <<'PY'
for n in [6613,14614,15752,16134,8141,13359,16770,20663,21752]:
    print(n, hex(n))
PY" in /tmp/codex-9t6puihg succeeded in 17ms:
6613 0x19d5
14614 0x3916
15752 0x3d88
16134 0x3f06
8141 0x1fcd
13359 0x342f
16770 0x4182
20663 0x50b7
21752 0x54f8

thinking
**Classifying and detailing security findings**
codex
{"no_findings":false,"summary":"Bytecode indicates external delegatecall into a fixed address and multiple CALL sites with computed targets/values; access control/guarding is not provable from artifacts, so risks are noted with uncertainty.","findings":[{"severity":"medium","category":"other","title":"DELEGATECALL into external contract address allows code execution in implementation storage","exploit_scenario":"The implementation performs DELEGATECALLs to the external address 0xa54a5f483866801c49ad2df022af8c215f2714c5. If that target is upgradeable or can be replaced (e.g., via proxy upgrade or selfdestruct+CREATE2), an attacker controlling the target can execute arbitrary code in this contract’s storage context, changing critical state or draining assets. This is high impact; the certainty is limited because we only see bytecode and not the governance model of the target.","recommendation":"Ensure the delegatecall target is an immutable, trusted contract (non-upgradeable) and cannot be replaced. If possible, avoid delegatecall to external addresses; use internal libraries or explicit call/staticcall patterns with strict interfaces and state separation.","evidence":"Disassembly shows PUSH20 0xa54a5f... then selector setup (e.g., PUSH4 0x19bd2045 / 0x1f69565f / 0xdc98f6b7 / 0xdb8a2e3c) followed by DELEGATECALL. Callsite metadata flags computed targets at these DELEGATECALL PCs.","locations":["pc:0x19d5","pc:0x3916","pc:0x3d88","pc:0x3f06"]},{"severity":"low","category":"reentrancy","title":"External CALLs with computed target and value may allow value transfer or reentrancy if not tightly gated","exploit_scenario":"Multiple CALL sites use computed target and value. If any of these entrypoints are reachable by untrusted callers or if the target/value are user-influenced, an attacker could direct ETH transfers to arbitrary addresses and/or reenter during the external call to manipulate state. The presence of ReentrancyGuard strings suggests some protection, but bytecode alone does not confirm that these specific call paths are guarded or restricted.","recommendation":"Verify that all CALL sites with value are only reachable by trusted roles (e.g., federation/owner) and are protected by reentrancy guards or checks-effects-interactions. Consider using pull-based payouts where possible and validate target addresses against allowlists.","evidence":"Callsite list shows CALL with target_expression_category=\"computed\" and value_expression_category=\"computed\" at PCs 0x1fcd, 0x342f, 0x4182, 0x50b7, 0x54f8; detector findings also flag eth_value_calls for these locations.","locations":["pc:0x1fcd","pc:0x342f","pc:0x4182","pc:0x50b7","pc:0x54f8"]}]}
tokens used
90,844
Metadata
{
    "codex": {
        "ran_at": "2026-01-11T07:38:00.475938+00:00",
        "returncode": 0
    },
    "project": {
        "mode": "bytecode",
        "bytecode_length": 47482,
        "bytecode_truncated": false,
        "capability_graph_present": true,
        "analysis_artifact_present": true
    },
    "summary": "Bytecode indicates external delegatecall into a fixed address and multiple CALL sites with computed targets/values; access control/guarding is not provable from artifacts, so risks are noted with uncertainty.",
    "raw_final": {
        "summary": "Bytecode indicates external delegatecall into a fixed address and multiple CALL sites with computed targets/values; access control/guarding is not provable from artifacts, so risks are noted with uncertainty.",
        "findings": [
            {
                "title": "DELEGATECALL into external contract address allows code execution in implementation storage",
                "category": "other",
                "evidence": "Disassembly shows PUSH20 0xa54a5f... then selector setup (e.g., PUSH4 0x19bd2045 / 0x1f69565f / 0xdc98f6b7 / 0xdb8a2e3c) followed by DELEGATECALL. Callsite metadata flags computed targets at these DELEGATECALL PCs.",
                "severity": "medium",
                "locations": [
                    "pc:0x19d5",
                    "pc:0x3916",
                    "pc:0x3d88",
                    "pc:0x3f06"
                ],
                "recommendation": "Ensure the delegatecall target is an immutable, trusted contract (non-upgradeable) and cannot be replaced. If possible, avoid delegatecall to external addresses; use internal libraries or explicit call/staticcall patterns with strict interfaces and state separation.",
                "exploit_scenario": "The implementation performs DELEGATECALLs to the external address 0xa54a5f483866801c49ad2df022af8c215f2714c5. If that target is upgradeable or can be replaced (e.g., via proxy upgrade or selfdestruct+CREATE2), an attacker controlling the target can execute arbitrary code in this contract\u2019s storage context, changing critical state or draining assets. This is high impact; the certainty is limited because we only see bytecode and not the governance model of the target."
            },
            {
                "title": "External CALLs with computed target and value may allow value transfer or reentrancy if not tightly gated",
                "category": "reentrancy",
                "evidence": "Callsite list shows CALL with target_expression_category=\"computed\" and value_expression_category=\"computed\" at PCs 0x1fcd, 0x342f, 0x4182, 0x50b7, 0x54f8; detector findings also flag eth_value_calls for these locations.",
                "severity": "low",
                "locations": [
                    "pc:0x1fcd",
                    "pc:0x342f",
                    "pc:0x4182",
                    "pc:0x50b7",
                    "pc:0x54f8"
                ],
                "recommendation": "Verify that all CALL sites with value are only reachable by trusted roles (e.g., federation/owner) and are protected by reentrancy guards or checks-effects-interactions. Consider using pull-based payouts where possible and validate target addresses against allowlists.",
                "exploit_scenario": "Multiple CALL sites use computed target and value. If any of these entrypoints are reachable by untrusted callers or if the target/value are user-influenced, an attacker could direct ETH transfers to arbitrary addresses and/or reenter during the external call to manipulate state. The presence of ReentrancyGuard strings suggests some protection, but bytecode alone does not confirm that these specific call paths are guarded or restricted."
            }
        ],
        "no_findings": false
    },
    "no_findings": false,
    "proxy_context": {
        "proxy_run_id": "019bab3b-acce-7254-a517-d035d555f853",
        "proxy_address": "0x9719d81c506c95f92caf970851b22afc88aee574",
        "implementation_run_id": "019bab3e-55f8-7003-b95c-b596b34c2a96",
        "implementation_address": "0x6c6210232654a5b57a576f9b4434f36e0b5d3768"
    },
    "schema_version": 1
}

Opcode Heuristics

tool.cast_disasm
Delegatecall
2
Selfdestruct
0
CREATE2
0
CALL-family (heavy)
0
EXT*/BALANCE
1
Total opcodes
852
Flags
delegatecall_present
View cast disassembly output
00000000: PUSH1 0x80
00000002: PUSH1 0x40
00000004: MSTORE
00000005: PUSH1 0x04
00000007: CALLDATASIZE
00000008: LT
00000009: PUSH2 0x004e
0000000c: JUMPI
0000000d: PUSH1 0x00
0000000f: CALLDATALOAD
00000010: PUSH1 0xe0
00000012: SHR
00000013: DUP1
00000014: PUSH4 0x3659cfe6
00000019: EQ
0000001a: PUSH2 0x0065
0000001d: JUMPI
0000001e: DUP1
0000001f: PUSH4 0x4f1ef286
00000024: EQ
00000025: PUSH2 0x0098
00000028: JUMPI
00000029: DUP1
0000002a: PUSH4 0x5c60da1b
0000002f: EQ
00000030: PUSH2 0x0118
00000033: JUMPI
00000034: DUP1
00000035: PUSH4 0x8f283970
0000003a: EQ
0000003b: PUSH2 0x0149
0000003e: JUMPI
0000003f: DUP1
00000040: PUSH4 0xf851a440
00000045: EQ
00000046: PUSH2 0x017c
00000049: JUMPI
0000004a: PUSH2 0x005d
0000004d: JUMP
0000004e: JUMPDEST
0000004f: CALLDATASIZE
00000050: PUSH2 0x005d
00000053: JUMPI
00000054: PUSH2 0x005b
00000057: PUSH2 0x0191
0000005a: JUMP
0000005b: JUMPDEST
0000005c: STOP
0000005d: JUMPDEST
0000005e: PUSH2 0x005b
00000061: PUSH2 0x0191
00000064: JUMP
00000065: JUMPDEST
00000066: CALLVALUE
00000067: DUP1
00000068: ISZERO
00000069: PUSH2 0x0071
0000006c: JUMPI
0000006d: PUSH1 0x00
0000006f: DUP1
00000070: REVERT
00000071: JUMPDEST
00000072: POP
00000073: PUSH2 0x005b
00000076: PUSH1 0x04
00000078: DUP1
00000079: CALLDATASIZE
0000007a: SUB
0000007b: PUSH1 0x20
0000007d: DUP2
0000007e: LT
0000007f: ISZERO
00000080: PUSH2 0x0088
00000083: JUMPI
00000084: PUSH1 0x00
00000086: DUP1
00000087: REVERT
00000088: JUMPDEST
00000089: POP
0000008a: CALLDATALOAD
0000008b: PUSH1 0x01
0000008d: PUSH1 0x01
0000008f: PUSH1 0xa0
00000091: SHL
00000092: SUB
00000093: AND
00000094: PUSH2 0x01ab
00000097: JUMP
00000098: JUMPDEST
00000099: PUSH2 0x005b
0000009c: PUSH1 0x04
0000009e: DUP1
0000009f: CALLDATASIZE
000000a0: SUB
000000a1: PUSH1 0x40
000000a3: DUP2
000000a4: LT
000000a5: ISZERO
000000a6: PUSH2 0x00ae
000000a9: JUMPI
000000aa: PUSH1 0x00
000000ac: DUP1
000000ad: REVERT
000000ae: JUMPDEST
000000af: PUSH1 0x01
000000b1: PUSH1 0x01
000000b3: PUSH1 0xa0
000000b5: SHL
000000b6: SUB
000000b7: DUP3
000000b8: CALLDATALOAD
000000b9: AND
000000ba: SWAP2
000000bb: SWAP1
000000bc: DUP2
000000bd: ADD
000000be: SWAP1
000000bf: PUSH1 0x40
000000c1: DUP2
000000c2: ADD
000000c3: PUSH1 0x20
000000c5: DUP3
000000c6: ADD
000000c7: CALLDATALOAD
000000c8: PUSH5 0x0100000000
000000ce: DUP2
000000cf: GT
000000d0: ISZERO
000000d1: PUSH2 0x00d9
000000d4: JUMPI
000000d5: PUSH1 0x00
000000d7: DUP1
000000d8: REVERT
000000d9: JUMPDEST
000000da: DUP3
000000db: ADD
000000dc: DUP4
000000dd: PUSH1 0x20
000000df: DUP3
000000e0: ADD
000000e1: GT
000000e2: ISZERO
000000e3: PUSH2 0x00eb
000000e6: JUMPI
000000e7: PUSH1 0x00
000000e9: DUP1
000000ea: REVERT
000000eb: JUMPDEST
000000ec: DUP1
000000ed: CALLDATALOAD
000000ee: SWAP1
000000ef: PUSH1 0x20
000000f1: ADD
000000f2: SWAP2
000000f3: DUP5
000000f4: PUSH1 0x01
000000f6: DUP4
000000f7: MUL
000000f8: DUP5
000000f9: ADD
000000fa: GT
000000fb: PUSH5 0x0100000000
00000101: DUP4
00000102: GT
00000103: OR
00000104: ISZERO
00000105: PUSH2 0x010d
00000108: JUMPI
00000109: PUSH1 0x00
0000010b: DUP1
0000010c: REVERT
0000010d: JUMPDEST
0000010e: POP
0000010f: SWAP1
00000110: SWAP3
00000111: POP
00000112: SWAP1
00000113: POP
00000114: PUSH2 0x01e5
00000117: JUMP
00000118: JUMPDEST
00000119: CALLVALUE
0000011a: DUP1
0000011b: ISZERO
0000011c: PUSH2 0x0124
0000011f: JUMPI
00000120: PUSH1 0x00
00000122: DUP1
00000123: REVERT
00000124: JUMPDEST
00000125: POP
00000126: PUSH2 0x012d
00000129: PUSH2 0x0292
0000012c: JUMP
0000012d: JUMPDEST
0000012e: PUSH1 0x40
00000130: DUP1
00000131: MLOAD
00000132: PUSH1 0x01
00000134: PUSH1 0x01
00000136: PUSH1 0xa0
00000138: SHL
00000139: SUB
0000013a: SWAP1
0000013b: SWAP3
0000013c: AND
0000013d: DUP3
0000013e: MSTORE
0000013f: MLOAD
00000140: SWAP1
00000141: DUP2
00000142: SWAP1
00000143: SUB
00000144: PUSH1 0x20
00000146: ADD
00000147: SWAP1
00000148: RETURN
00000149: JUMPDEST
0000014a: CALLVALUE
0000014b: DUP1
0000014c: ISZERO
0000014d: PUSH2 0x0155
00000150: JUMPI
00000151: PUSH1 0x00
00000153: DUP1
00000154: REVERT
00000155: JUMPDEST
00000156: POP
00000157: PUSH2 0x005b
0000015a: PUSH1 0x04
0000015c: DUP1
0000015d: CALLDATASIZE
0000015e: SUB
0000015f: PUSH1 0x20
00000161: DUP2
00000162: LT
00000163: ISZERO
00000164: PUSH2 0x016c
00000167: JUMPI
00000168: PUSH1 0x00
0000016a: DUP1
0000016b: REVERT
0000016c: JUMPDEST
0000016d: POP
0000016e: CALLDATALOAD
0000016f: PUSH1 0x01
00000171: PUSH1 0x01
00000173: PUSH1 0xa0
00000175: SHL
00000176: SUB
00000177: AND
00000178: PUSH2 0x02cf
0000017b: JUMP
0000017c: JUMPDEST
0000017d: CALLVALUE
0000017e: DUP1
0000017f: ISZERO
00000180: PUSH2 0x0188
00000183: JUMPI
00000184: PUSH1 0x00
00000186: DUP1
00000187: REVERT
00000188: JUMPDEST
00000189: POP
0000018a: PUSH2 0x012d
0000018d: PUSH2 0x0389
00000190: JUMP
00000191: JUMPDEST
00000192: PUSH2 0x0199
00000195: PUSH2 0x03ba
00000198: JUMP
00000199: JUMPDEST
0000019a: PUSH2 0x01a9
0000019d: PUSH2 0x01a4
000001a0: PUSH2 0x041a
000001a3: JUMP
000001a4: JUMPDEST
000001a5: PUSH2 0x043f
000001a8: JUMP
000001a9: JUMPDEST
000001aa: JUMP
000001ab: JUMPDEST
000001ac: PUSH2 0x01b3
000001af: PUSH2 0x0463
000001b2: JUMP
000001b3: JUMPDEST
000001b4: PUSH1 0x01
000001b6: PUSH1 0x01
000001b8: PUSH1 0xa0
000001ba: SHL
000001bb: SUB
000001bc: AND
000001bd: CALLER
000001be: PUSH1 0x01
000001c0: PUSH1 0x01
000001c2: PUSH1 0xa0
000001c4: SHL
000001c5: SUB
000001c6: AND
000001c7: EQ
000001c8: ISZERO
000001c9: PUSH2 0x01da
000001cc: JUMPI
000001cd: PUSH2 0x01d5
000001d0: DUP2
000001d1: PUSH2 0x0488
000001d4: JUMP
000001d5: JUMPDEST
000001d6: PUSH2 0x01e2
000001d9: JUMP
000001da: JUMPDEST
000001db: PUSH2 0x01e2
000001de: PUSH2 0x0191
000001e1: JUMP
000001e2: JUMPDEST
000001e3: POP
000001e4: JUMP
000001e5: JUMPDEST
000001e6: PUSH2 0x01ed
000001e9: PUSH2 0x0463
000001ec: JUMP
000001ed: JUMPDEST
000001ee: PUSH1 0x01
000001f0: PUSH1 0x01
000001f2: PUSH1 0xa0
000001f4: SHL
000001f5: SUB
000001f6: AND
000001f7: CALLER
000001f8: PUSH1 0x01
000001fa: PUSH1 0x01
000001fc: PUSH1 0xa0
000001fe: SHL
000001ff: SUB
00000200: AND
00000201: EQ
00000202: ISZERO
00000203: PUSH2 0x0285
00000206: JUMPI
00000207: PUSH2 0x020f
0000020a: DUP4
0000020b: PUSH2 0x0488
0000020e: JUMP
0000020f: JUMPDEST
00000210: PUSH1 0x00
00000212: DUP4
00000213: PUSH1 0x01
00000215: PUSH1 0x01
00000217: PUSH1 0xa0
00000219: SHL
0000021a: SUB
0000021b: AND
0000021c: DUP4
0000021d: DUP4
0000021e: PUSH1 0x40
00000220: MLOAD
00000221: DUP1
00000222: DUP4
00000223: DUP4
00000224: DUP1
00000225: DUP3
00000226: DUP5
00000227: CALLDATACOPY
00000228: PUSH1 0x40
0000022a: MLOAD
0000022b: SWAP3
0000022c: ADD
0000022d: SWAP5
0000022e: POP
0000022f: PUSH1 0x00
00000231: SWAP4
00000232: POP
00000233: SWAP1
00000234: SWAP2
00000235: POP
00000236: POP
00000237: DUP1
00000238: DUP4
00000239: SUB
0000023a: DUP2
0000023b: DUP6
0000023c: GAS
0000023d: DELEGATECALL
0000023e: SWAP2
0000023f: POP
00000240: POP
00000241: RETURNDATASIZE
00000242: DUP1
00000243: PUSH1 0x00
00000245: DUP2
00000246: EQ
00000247: PUSH2 0x026c
0000024a: JUMPI
0000024b: PUSH1 0x40
0000024d: MLOAD
0000024e: SWAP2
0000024f: POP
00000250: PUSH1 0x1f
00000252: NOT
00000253: PUSH1 0x3f
00000255: RETURNDATASIZE
00000256: ADD
00000257: AND
00000258: DUP3
00000259: ADD
0000025a: PUSH1 0x40
0000025c: MSTORE
0000025d: RETURNDATASIZE
0000025e: DUP3
0000025f: MSTORE
00000260: RETURNDATASIZE
00000261: PUSH1 0x00
00000263: PUSH1 0x20
00000265: DUP5
00000266: ADD
00000267: RETURNDATACOPY
00000268: PUSH2 0x0271
0000026b: JUMP
0000026c: JUMPDEST
0000026d: PUSH1 0x60
0000026f: SWAP2
00000270: POP
00000271: JUMPDEST
00000272: POP
00000273: POP
00000274: SWAP1
00000275: POP
00000276: DUP1
00000277: PUSH2 0x027f
0000027a: JUMPI
0000027b: PUSH1 0x00
0000027d: DUP1
0000027e: REVERT
0000027f: JUMPDEST
00000280: POP
00000281: PUSH2 0x028d
00000284: JUMP
00000285: JUMPDEST
00000286: PUSH2 0x028d
00000289: PUSH2 0x0191
0000028c: JUMP
0000028d: JUMPDEST
0000028e: POP
0000028f: POP
00000290: POP
00000291: JUMP
00000292: JUMPDEST
00000293: PUSH1 0x00
00000295: PUSH2 0x029c
00000298: PUSH2 0x0463
0000029b: JUMP
0000029c: JUMPDEST
0000029d: PUSH1 0x01
0000029f: PUSH1 0x01
000002a1: PUSH1 0xa0
000002a3: SHL
000002a4: SUB
000002a5: AND
000002a6: CALLER
000002a7: PUSH1 0x01
000002a9: PUSH1 0x01
000002ab: PUSH1 0xa0
000002ad: SHL
000002ae: SUB
000002af: AND
000002b0: EQ
000002b1: ISZERO
000002b2: PUSH2 0x02c4
000002b5: JUMPI
000002b6: PUSH2 0x02bd
000002b9: PUSH2 0x041a
000002bc: JUMP
000002bd: JUMPDEST
000002be: SWAP1
000002bf: POP
000002c0: PUSH2 0x02cc
000002c3: JUMP
000002c4: JUMPDEST
000002c5: PUSH2 0x02cc
000002c8: PUSH2 0x0191
000002cb: JUMP
000002cc: JUMPDEST
000002cd: SWAP1
000002ce: JUMP
000002cf: JUMPDEST
000002d0: PUSH2 0x02d7
000002d3: PUSH2 0x0463
000002d6: JUMP
000002d7: JUMPDEST
000002d8: PUSH1 0x01
000002da: PUSH1 0x01
000002dc: PUSH1 0xa0
000002de: SHL
000002df: SUB
000002e0: AND
000002e1: CALLER
000002e2: PUSH1 0x01
000002e4: PUSH1 0x01
000002e6: PUSH1 0xa0
000002e8: SHL
000002e9: SUB
000002ea: AND
000002eb: EQ
000002ec: ISZERO
000002ed: PUSH2 0x01da
000002f0: JUMPI
000002f1: PUSH1 0x01
000002f3: PUSH1 0x01
000002f5: PUSH1 0xa0
000002f7: SHL
000002f8: SUB
000002f9: DUP2
000002fa: AND
000002fb: PUSH2 0x0335
000002fe: JUMPI
000002ff: PUSH1 0x40
00000301: MLOAD
00000302: PUSH3 0x461bcd
00000306: PUSH1 0xe5
00000308: SHL
00000309: DUP2
0000030a: MSTORE
0000030b: PUSH1 0x04
0000030d: ADD
0000030e: DUP1
0000030f: DUP1
00000310: PUSH1 0x20
00000312: ADD
00000313: DUP3
00000314: DUP2
00000315: SUB
00000316: DUP3
00000317: MSTORE
00000318: PUSH1 0x36
0000031a: DUP2
0000031b: MSTORE
0000031c: PUSH1 0x20
0000031e: ADD
0000031f: DUP1
00000320: PUSH2 0x0587
00000323: PUSH1 0x36
00000325: SWAP2
00000326: CODECOPY
00000327: PUSH1 0x40
00000329: ADD
0000032a: SWAP2
0000032b: POP
0000032c: POP
0000032d: PUSH1 0x40
0000032f: MLOAD
00000330: DUP1
00000331: SWAP2
00000332: SUB
00000333: SWAP1
00000334: REVERT
00000335: JUMPDEST
00000336: PUSH32 0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f
00000357: PUSH2 0x035e
0000035a: PUSH2 0x0463
0000035d: JUMP
0000035e: JUMPDEST
0000035f: PUSH1 0x40
00000361: DUP1
00000362: MLOAD
00000363: PUSH1 0x01
00000365: PUSH1 0x01
00000367: PUSH1 0xa0
00000369: SHL
0000036a: SUB
0000036b: SWAP3
0000036c: DUP4
0000036d: AND
0000036e: DUP2
0000036f: MSTORE
00000370: SWAP2
00000371: DUP5
00000372: AND
00000373: PUSH1 0x20
00000375: DUP4
00000376: ADD
00000377: MSTORE
00000378: DUP1
00000379: MLOAD
0000037a: SWAP2
0000037b: DUP3
0000037c: SWAP1
0000037d: SUB
0000037e: ADD
0000037f: SWAP1
00000380: LOG1
00000381: PUSH2 0x01d5
00000384: DUP2
00000385: PUSH2 0x04c8
00000388: JUMP
00000389: JUMPDEST
0000038a: PUSH1 0x00
0000038c: PUSH2 0x0393
0000038f: PUSH2 0x0463
00000392: JUMP
00000393: JUMPDEST
00000394: PUSH1 0x01
00000396: PUSH1 0x01
00000398: PUSH1 0xa0
0000039a: SHL
0000039b: SUB
0000039c: AND
0000039d: CALLER
0000039e: PUSH1 0x01
000003a0: PUSH1 0x01
000003a2: PUSH1 0xa0
000003a4: SHL
000003a5: SUB
000003a6: AND
000003a7: EQ
000003a8: ISZERO
000003a9: PUSH2 0x02c4
000003ac: JUMPI
000003ad: PUSH2 0x02bd
000003b0: PUSH2 0x0463
000003b3: JUMP
000003b4: JUMPDEST
000003b5: EXTCODESIZE
000003b6: ISZERO
000003b7: ISZERO
000003b8: SWAP1
000003b9: JUMP
000003ba: JUMPDEST
000003bb: PUSH2 0x03c2
000003be: PUSH2 0x0463
000003c1: JUMP
000003c2: JUMPDEST
000003c3: PUSH1 0x01
000003c5: PUSH1 0x01
000003c7: PUSH1 0xa0
000003c9: SHL
000003ca: SUB
000003cb: AND
000003cc: CALLER
000003cd: PUSH1 0x01
000003cf: PUSH1 0x01
000003d1: PUSH1 0xa0
000003d3: SHL
000003d4: SUB
000003d5: AND
000003d6: EQ
000003d7: ISZERO
000003d8: PUSH2 0x0412
000003db: JUMPI
000003dc: PUSH1 0x40
000003de: MLOAD
000003df: PUSH3 0x461bcd
000003e3: PUSH1 0xe5
000003e5: SHL
000003e6: DUP2
000003e7: MSTORE
000003e8: PUSH1 0x04
000003ea: ADD
000003eb: DUP1
000003ec: DUP1
000003ed: PUSH1 0x20
000003ef: ADD
000003f0: DUP3
000003f1: DUP2
000003f2: SUB
000003f3: DUP3
000003f4: MSTORE
000003f5: PUSH1 0x32
000003f7: DUP2
000003f8: MSTORE
000003f9: PUSH1 0x20
000003fb: ADD
000003fc: DUP1
000003fd: PUSH2 0x0555
00000400: PUSH1 0x32
00000402: SWAP2
00000403: CODECOPY
00000404: PUSH1 0x40
00000406: ADD
00000407: SWAP2
00000408: POP
00000409: POP
0000040a: PUSH1 0x40
0000040c: MLOAD
0000040d: DUP1
0000040e: SWAP2
0000040f: SUB
00000410: SWAP1
00000411: REVERT
00000412: JUMPDEST
00000413: PUSH2 0x01a9
00000416: PUSH2 0x01a9
00000419: JUMP
0000041a: JUMPDEST
0000041b: PUSH32 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc
0000043c: SLOAD
0000043d: SWAP1
0000043e: JUMP
0000043f: JUMPDEST
00000440: CALLDATASIZE
00000441: PUSH1 0x00
00000443: DUP1
00000444: CALLDATACOPY
00000445: PUSH1 0x00
00000447: DUP1
00000448: CALLDATASIZE
00000449: PUSH1 0x00
0000044b: DUP5
0000044c: GAS
0000044d: DELEGATECALL
0000044e: RETURNDATASIZE
0000044f: PUSH1 0x00
00000451: DUP1
00000452: RETURNDATACOPY
00000453: DUP1
00000454: DUP1
00000455: ISZERO
00000456: PUSH2 0x045e
00000459: JUMPI
0000045a: RETURNDATASIZE
0000045b: PUSH1 0x00
0000045d: RETURN
0000045e: JUMPDEST
0000045f: RETURNDATASIZE
00000460: PUSH1 0x00
00000462: REVERT
00000463: JUMPDEST
00000464: PUSH32 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103
00000485: SLOAD
00000486: SWAP1
00000487: JUMP
00000488: JUMPDEST
00000489: PUSH2 0x0491
0000048c: DUP2
0000048d: PUSH2 0x04ec
00000490: JUMP
00000491: JUMPDEST
00000492: PUSH1 0x40
00000494: MLOAD
00000495: PUSH1 0x01
00000497: PUSH1 0x01
00000499: PUSH1 0xa0
0000049b: SHL
0000049c: SUB
0000049d: DUP3
0000049e: AND
0000049f: SWAP1
000004a0: PUSH32 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b
000004c1: SWAP1
000004c2: PUSH1 0x00
000004c4: SWAP1
000004c5: LOG2
000004c6: POP
000004c7: JUMP
000004c8: JUMPDEST
000004c9: PUSH32 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103
000004ea: SSTORE
000004eb: JUMP
000004ec: JUMPDEST
000004ed: PUSH2 0x04f5
000004f0: DUP2
000004f1: PUSH2 0x03b4
000004f4: JUMP
000004f5: JUMPDEST
000004f6: PUSH2 0x0530
000004f9: JUMPI
000004fa: PUSH1 0x40
000004fc: MLOAD
000004fd: PUSH3 0x461bcd
00000501: PUSH1 0xe5
00000503: SHL
00000504: DUP2
00000505: MSTORE
00000506: PUSH1 0x04
00000508: ADD
00000509: DUP1
0000050a: DUP1
0000050b: PUSH1 0x20
0000050d: ADD
0000050e: DUP3
0000050f: DUP2
00000510: SUB
00000511: DUP3
00000512: MSTORE
00000513: PUSH1 0x3b
00000515: DUP2
00000516: MSTORE
00000517: PUSH1 0x20
00000519: ADD
0000051a: DUP1
0000051b: PUSH2 0x05bd
0000051e: PUSH1 0x3b
00000520: SWAP2
00000521: CODECOPY
00000522: PUSH1 0x40
00000524: ADD
00000525: SWAP2
00000526: POP
00000527: POP
00000528: PUSH1 0x40
0000052a: MLOAD
0000052b: DUP1
0000052c: SWAP2
0000052d: SUB
0000052e: SWAP1
0000052f: REVERT
00000530: JUMPDEST
00000531: PUSH32 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc
00000552: SSTORE
00000553: JUMP
00000554: INVALID
00000555: NUMBER
00000556: PUSH2 0x6e6e
00000559: PUSH16 0x742063616c6c2066616c6c6261636b20
0000056a: PUSH7 0x756e6374696f6e
00000572: KECCAK256
00000573: PUSH7 0x726f6d20746865
0000057b: KECCAK256
0000057c: PUSH17 0x726f78792061646d696e43616e6e6f7420
0000058e: PUSH4 0x68616e67
00000593: PUSH6 0x207468652061
0000059a: PUSH5 0x6d696e206f
000005a0: PUSH7 0x20612070726f78
000005a8: PUSH26 0x20746f20746865207a65726f206164647265737343616e6e6f74
000005c3: KECCAK256
000005c4: PUSH20 0x657420612070726f787920696d706c656d656e74
000005d9: PUSH2 0x7469
000005dc: PUSH16 0x6e20746f2061206e6f6e2d636f6e7472
000005ed: PUSH2 0x6374
000005f0: KECCAK256
000005f1: PUSH2 0x6464
000005f4: PUSH19 0x657373a26469706673582212206e221e2a3547
00000608: UNKNOWN(0xBD)
00000609: SWAP8
0000060a: UNKNOWN(0x24)
0000060b: UNKNOWN(0x4B)
0000060c: SDIV
0000060d: UNKNOWN(0xED)
0000060e: CHAINID
0000060f: NUMBER
00000610: SIGNEXTEND
00000611: SHL
00000612: SMOD
00000613: DUP12
00000614: LOG0
00000615: SWAP8
00000616: UNKNOWN(0xCB)
00000617: UNKNOWN(0x2A)
00000618: UNKNOWN(0x4E)
00000619: UNKNOWN(0x25)
0000061a: UNKNOWN(0xEC)
0000061b: RETURNDATASIZE
0000061c: PUSH26

Findings

validated = confirmed for call sinks; sink observed for others
Severity Category Tool Title Confidence Validated Confirmed Details
critical upgradeability detector Untrusted DELEGATECALL target reachable 70 no no
view
trace_id: 0xd1c5e83a0561d20658ee3fa6ef80105e06ca1268bbf7eb6fcd6f19ec984b674d
call_targets: 0x6c6210232654a5b57a576f9b4434f36e0b5d3768
target_varies: no
classification: constant_target
validation_json
{
    "sink": "DELEGATECALL",
    "errors": 0,
    "status": "sink_reached",
    "attempts": 2,
    "trace_id": "0xd1c5e83a0561d20658ee3fa6ef80105e06ca1268bbf7eb6fcd6f19ec984b674d",
    "confirmed": false,
    "trace_mode": "callTracer",
    "call_targets": [
        "0x6c6210232654a5b57a576f9b4434f36e0b5d3768"
    ],
    "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": "0x3659cfe6",
            "selector": "0x3659cfe6",
            "calldata_variants": [
                "0x3659cfe6",
                "0x3659cfe60000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0x4f1ef286",
            "selector": "0x4f1ef286",
            "calldata_variants": [
                "0x4f1ef286",
                "0x4f1ef2860000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0x5c60da1b",
            "selector": "0x5c60da1b",
            "calldata_variants": [
                "0x5c60da1b",
                "0x5c60da1b0000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0x8f283970",
            "selector": "0x8f283970",
            "calldata_variants": [
                "0x8f283970",
                "0x8f2839700000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xf851a440",
            "selector": "0xf851a440",
            "calldata_variants": [
                "0xf851a440",
                "0xf851a4400000000000000000000000000000000000000000000000000000000000000000"
            ]
        }
    ]
}
evidence_json
{
    "examples": [
        {
            "pc": 573,
            "opcode": "DELEGATECALL",
            "returndata_checked": null,
            "value_expression_category": "n/a",
            "target_expression_category": "computed"
        },
        {
            "pc": 1101,
            "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
}
medium other codex DELEGATECALL into external contract address allows code execution in implementation storage 75 no
view
evidence_json
{
    "evidence": "Disassembly shows PUSH20 0xa54a5f... then selector setup (e.g., PUSH4 0x19bd2045 / 0x1f69565f / 0xdc98f6b7 / 0xdb8a2e3c) followed by DELEGATECALL. Callsite metadata flags computed targets at these DELEGATECALL PCs.",
    "locations": [
        "pc:0x19d5",
        "pc:0x3916",
        "pc:0x3d88",
        "pc:0x3f06"
    ],
    "recommendation": "Ensure the delegatecall target is an immutable, trusted contract (non-upgradeable) and cannot be replaced. If possible, avoid delegatecall to external addresses; use internal libraries or explicit call/staticcall patterns with strict interfaces and state separation.",
    "exploit_scenario": "The implementation performs DELEGATECALLs to the external address 0xa54a5f483866801c49ad2df022af8c215f2714c5. If that target is upgradeable or can be replaced (e.g., via proxy upgrade or selfdestruct+CREATE2), an attacker controlling the target can execute arbitrary code in this contract\u2019s storage context, changing critical state or draining assets. This is high impact; the certainty is limited because we only see bytecode and not the governance model of the target."
}
low reentrancy codex External CALLs with computed target and value may allow value transfer or reentrancy if not tightly gated 65 no
view
evidence_json
{
    "evidence": "Callsite list shows CALL with target_expression_category=\"computed\" and value_expression_category=\"computed\" at PCs 0x1fcd, 0x342f, 0x4182, 0x50b7, 0x54f8; detector findings also flag eth_value_calls for these locations.",
    "locations": [
        "pc:0x1fcd",
        "pc:0x342f",
        "pc:0x4182",
        "pc:0x50b7",
        "pc:0x54f8"
    ],
    "recommendation": "Verify that all CALL sites with value are only reachable by trusted roles (e.g., federation/owner) and are protected by reentrancy guards or checks-effects-interactions. Consider using pull-based payouts where possible and validate target addresses against allowlists.",
    "exploit_scenario": "Multiple CALL sites use computed target and value. If any of these entrypoints are reachable by untrusted callers or if the target/value are user-influenced, an attacker could direct ETH transfers to arbitrary addresses and/or reenter during the external call to manipulate state. The presence of ReentrancyGuard strings suggests some protection, but bytecode alone does not confirm that these specific call paths are guarded or restricted."
}