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

Analysis Run

019b3836-2211-7274-9805-31a96cedf1d9

complete
Chain ID
1
Address
Block Number
Created
Fri, Dec 19, 2025 8:03 PM
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
2
Validated
2
Source
Bytecode only
Review Backing
Present
Best current signal
ETH value transfer possible
crit 0 high 2 direct contract
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
217 artifact.fetch complete 1 / 3 3 months ago
218 tool.cast_disasm complete 1 / 3 3 months ago
43283 analysis.bundle complete 1 / 3 1 week ago
43284 capability.graph complete 1 / 3 1 week ago
43285 detector.run complete 1 / 3 1 week ago
43286 validation.fork complete 1 / 3 1 week ago
70723 report.consolidate complete 1 / 6 1 week ago

Artifact

Runtime bytecode: available
Creation TX:
Deployer:
Proxy: no
Implementation:
Verified Source: no

Slither

tool.slither

No slither job recorded yet.

Codex

report.consolidate
Job Status
complete
Attempts
1 / 6
Findings
2
No findings?
no
Summary
The runtime is a very small two-selector contract. One selector (`0x60fe47b1`) reads slot `0x0`, masks it to an address, and performs a low-level `CALL` with nonzero ETH value and no detected authorization check. The only other selector (`0x6d4ce63c`) returns the constant `0xff`. No proxy or `DELEGATECALL` behavior is present in the supplied bytecode. Findings below are conservative because naming and selector intent are inferred only from runtime bytecode.
View stdout
{"no_findings":false,"summary":"The runtime is a very small two-selector contract. One selector (`0x60fe47b1`) reads slot `0x0`, masks it to an address, and performs a low-level `CALL` with nonzero ETH value and no detected authorization check. The only other selector (`0x6d4ce63c`) returns the constant `0xff`. No proxy or `DELEGATECALL` behavior is present in the supplied bytecode. Findings below are conservative because naming and selector intent are inferred only from runtime bytecode.","findings":[{"severity":"medium","category":"access_control","title":"Public entrypoint can force ETH transfer to the address stored in slot 0","exploit_scenario":"Any caller can invoke selector `0x60fe47b1`. The bytecode loads slot `0x0`, treats the low 20 bytes as the call target, and executes a value-bearing `CALL` without any detected guard. If this contract ever holds ETH, an attacker can repeatedly trigger this entrypoint to push funds out to that stored address until the balance is exhausted or calls start failing. Because only runtime bytecode is available, it is unclear whether this behavior is intentional, but there is no visible caller authorization in the deployed code.","recommendation":"If this payout/forwarding behavior is not meant to be public, add an explicit caller authorization check before the external call. If it is intended, constrain the reachable balance and document that anyone can trigger the transfer path.","evidence":"At `pc 0x2d` the contract performs `SLOAD` from slot `0x0`; at `pc 0x50` it executes `CALL`. The analysis artifact reports no detected guards, one storage read from slot `0x0`, and a validated nonzero-value external call reachable from selector `0x60fe47b1`. The supplied bytecode contains no runtime storage writes, so the call target is whatever address was already installed in slot `0x0`.","locations":["selector:0x60fe47b1","pc:0x2d","pc:0x50"]},{"severity":"low","category":"other","title":"Low-level ETH call ignores success/failure","exploit_scenario":"The `CALL` result is immediately discarded with `POP`, and the function jumps to a normal `STOP` path. If the callee reverts or the transfer fails, upstream integrations may still treat the transaction as successful because this function does not bubble the error or return a failure indicator. That can create silent payout/accounting mismatches.","recommendation":"Check the `CALL` return value and revert or emit an explicit failure signal when the transfer does not succeed. If failure is intentionally tolerated, make that behavior explicit in surrounding protocol logic.","evidence":"The only external callsite is `CALL` at `pc 0x50`. The stack result from `CALL` is not consumed by a conditional branch; it is popped at `pc 0x51`, and the artifact marks `returndata_checked` as unknown/null. No revert path is visible after the call.","locations":["selector:0x60fe47b1","pc:0x50","pc:0x51"]}]}
View stderr
OpenAI Codex v0.118.0 (research preview)
--------
workdir: /tmp/codex-59bx_t5g
model: gpt-5.4
provider: openai
approval: never
sandbox: read-only
reasoning effort: high
reasoning summaries: none
session id: 019d5a4d-62d2-7da2-bc25-b7ef75d990a8
--------
user
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.
warning: Codex could not find system bubblewrap on PATH. Please install bubblewrap with your package manager. Codex will use the vendored bubblewrap in the meantime.
exec
/bin/bash -lc pwd in /tmp/codex-59bx_t5g
 succeeded in 0ms:
/tmp/codex-59bx_t5g

exec
/bin/bash -lc 'rg --files' in /tmp/codex-59bx_t5g
 succeeded in 0ms:
codex-output-schema.json
BYTECODE_BUNDLE.json

exec
/bin/bash -lc "sed -n '1,260p' BYTECODE_BUNDLE.json" in /tmp/codex-59bx_t5g
 succeeded in 0ms:
{
  "analysis_artifact": {
    "address": "0x7aa73b556c0da8ca4e83e483d7404930e946473b",
    "artifact_hash": "0x9313c6fce497a35e69fb7c6bc9dd9a0cd36372431ec7c048d9b8c0de39bf24e8",
    "artifact_json": {
      "auth": {
        "guards": []
      },
      "basic_blocks": [
        {
          "end_pc": 23,
          "hash": "0x4fd9637791b68adc1ff7df76b3de48256945f319cd17ae200fff5bde460fa261",
          "opcodes": [
            "PUSH1",
            "PUSH1",
            "MSTORE",
            "PUSH1",
            "PUSH1",
            "EXP",
            "PUSH1",
            "CALLDATALOAD",
            "DIV",
            "PUSH4",
            "OP_81",
            "EQ",
            "PUSH1",
            "JUMPI"
          ],
          "start_pc": 0
        },
        {
          "end_pc": 33,
          "hash": "0x424e4af57be4e62e961bdef24957487cf04333d7389b4ef5a2a93d6c11d75820",
          "opcodes": [
            "OP_80",
            "PUSH4",
            "EQ",
            "PUSH1",
            "JUMPI"
          ],
          "start_pc": 24
        },
        {
          "end_pc": 35,
          "hash": "0xd992302ef73b1098f69c9c04a34424995e3f29a3c7f224d984cff0e85dbd9591",
          "opcodes": [
            "JUMPDEST",
            "STOP"
          ],
          "start_pc": 34
        },
        {
          "end_pc": 87,
          "hash": "0xea11695fbf90762c389b5e751b324342ffdcc79c282420da5c3bbea20a014030",
          "opcodes": [
            "JUMPDEST",
            "PUSH1",
            "PUSH1",
            "CALLDATALOAD",
            "PUSH1",
            "OP_80",
            "SLOAD",
            "PUSH20",
            "AND",
            "OP_90",
            "PUSH1",
            "PUSH1",
            "OP_82",
            "OP_81",
            "OP_81",
            "OP_81",
            "OP_85",
            "OP_88",
            "OP_83",
            "CALL",
            "POP",
            "POP",
            "POP",
            "POP",
            "POP",
            "POP",
            "JUMP"
          ],
          "start_pc": 36
        },
        {
          "end_pc": 99,
          "hash": "0x6cad63129c501e345ea4350d4c6190e5193f8d72da64028e0316c4ca3b5e54be",
          "opcodes": [
            "JUMPDEST",
            "PUSH1",
            "PUSH1",
            "OP_90",
            "OP_81",
            "MSTORE",
            "PUSH1",
            "OP_90",
            "RETURN"
          ],
          "start_pc": 88
        }
      ],
      "callsites": [
        {
          "opcode": "CALL",
          "pc": 80,
          "returndata_checked": null,
          "target_expression_category": "computed",
          "value_expression_category": "constant"
        }
      ],
      "cfg_edges": [
        {
          "from": "bb:0",
          "to": "bb:36",
          "type": "control_flow"
        },
        {
          "from": "bb:0",
          "to": "bb:24",
          "type": "control_flow_fallthrough"
        },
        {
          "from": "bb:24",
          "to": "bb:88",
          "type": "control_flow"
        },
        {
          "from": "bb:24",
          "to": "bb:34",
          "type": "control_flow_fallthrough"
        }
      ],
      "cfg_hash": "0x6303e5098a30e003ca0c362a280d99292af977b164f2c6695ee4a7ef80054f63",
      "dispatcher_type": "selector_jump_table",
      "function_entries": [
        {
          "entry_pc": null,
          "selector": "0x60fe47b1"
        },
        {
          "entry_pc": null,
          "selector": "0x6d4ce63c"
        }
      ],
      "functions": [
        {
          "auth": {
            "guards": []
          },
          "entry_pc": null,
          "selector": "0x60fe47b1",
          "sinks": {
            "call": 1,
            "delegatecall": 0,
            "selfdestruct": 0,
            "staticcall": 0
          },
          "storage": {
            "reads": 1,
            "slots": [
              {
                "op": "SLOAD",
                "pc": 45,
                "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
              }
            ],
            "writes": 0
          }
        },
        {
          "auth": {
            "guards": []
          },
          "entry_pc": null,
          "selector": "0x6d4ce63c",
          "sinks": {
            "call": 1,
            "delegatecall": 0,
            "selfdestruct": 0,
            "staticcall": 0
          },
          "storage": {
            "reads": 1,
            "slots": [
              {
                "op": "SLOAD",
                "pc": 45,
                "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
              }
            ],
            "writes": 0
          }
        }
      ],
      "selectors": [
        "0x60fe47b1",
        "0x6d4ce63c"
      ],
      "sinks": {
        "call": 1,
        "create": 0,
        "create2": 0,
        "delegatecall": 0,
        "selfdestruct": 0,
        "staticcall": 0,
        "upgrade_slot_write_suspected": false
      },
      "storage": {
        "keccak_count": 0,
        "reads": 1,
        "slots": [
          {
            "op": "SLOAD",
            "pc": 45,
            "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
          }
        ],
        "writes": 0
      },
      "version": "analysis_artifact_v1"
    },
    "block_number": null,
    "chain_id": 1,
    "codehash": "0x202efbee42eee44310f93a805c5f525af954b640019ea8ba41f2ec5504be183e",
    "created_at": "2026-04-04T19:44:58.000000Z",
    "id": 1482,
    "updated_at": "2026-04-04T19:44:58.000000Z",
    "version": "analysis_artifact_v1"
  },
  "analysis_run": {
    "address": "0x7aa73b556c0da8ca4e83e483d7404930e946473b",
    "block_number": null,
    "chain_id": 1,
    "child_links": [],
    "created_at": "2025-12-19T20:03:50.000000Z",
    "id": "019b3836-2211-7274-9805-31a96cedf1d9",
    "parent_links": [],
    "status": "running",
    "updated_at": "2026-04-04T19:44:58.000000Z"
  },
  "artifact": {
    "codehash": "0x202efbee42eee44310f93a805c5f525af954b640019ea8ba41f2ec5504be183e",
    "compiler_json": {
      "etherscan": {
        "skipped": true
      }
    },
    "implementation_address": null,
    "is_proxy": false,
    "runtime_bytecode": {
      "full": "0x606060405260e060020a600035046360fe47b1811460245780636d4ce63c146058575b005b60226004356000805473ffffffffffffffffffffffffffffffffffffffff16906001606082818181858883f1505050505050565b60ff6060908152602090f3",
      "head": null,
      "length": 202,
      "tail": null,
      "truncated": false
    },
    "verified_source": false
  },
  "capability_graph": {

exec
/bin/bash -lc "sed -n '261,520p' BYTECODE_BUNDLE.json" in /tmp/codex-59bx_t5g
 succeeded in 0ms:
    "address": "0x7aa73b556c0da8ca4e83e483d7404930e946473b",
    "block_number": null,
    "chain_id": 1,
    "codehash": "0x202efbee42eee44310f93a805c5f525af954b640019ea8ba41f2ec5504be183e",
    "created_at": "2026-04-04T19:44:59.000000Z",
    "graph_hash": "0xc0d114c5682257ec667c15468c1262397d8281692e2e3efb03e5586c8d3746a0",
    "graph_json": {
      "edges": [
        {
          "from": "bb:0",
          "to": "bb:36",
          "type": "control_flow"
        },
        {
          "from": "bb:0",
          "to": "bb:24",
          "type": "control_flow_fallthrough"
        },
        {
          "from": "bb:24",
          "to": "bb:88",
          "type": "control_flow"
        },
        {
          "from": "bb:24",
          "to": "bb:34",
          "type": "control_flow_fallthrough"
        },
        {
          "from": "bb:36",
          "to": "call:80",
          "type": "contains"
        },
        {
          "from": "call:80",
          "to": "sink:call",
          "type": "capability"
        }
      ],
      "nodes": [
        {
          "end_pc": 23,
          "hash": "0x4fd9637791b68adc1ff7df76b3de48256945f319cd17ae200fff5bde460fa261",
          "id": "bb:0",
          "start_pc": 0,
          "type": "basic_block"
        },
        {
          "end_pc": 33,
          "hash": "0x424e4af57be4e62e961bdef24957487cf04333d7389b4ef5a2a93d6c11d75820",
          "id": "bb:24",
          "start_pc": 24,
          "type": "basic_block"
        },
        {
          "end_pc": 35,
          "hash": "0xd992302ef73b1098f69c9c04a34424995e3f29a3c7f224d984cff0e85dbd9591",
          "id": "bb:34",
          "start_pc": 34,
          "type": "basic_block"
        },
        {
          "end_pc": 87,
          "hash": "0xea11695fbf90762c389b5e751b324342ffdcc79c282420da5c3bbea20a014030",
          "id": "bb:36",
          "start_pc": 36,
          "type": "basic_block"
        },
        {
          "end_pc": 99,
          "hash": "0x6cad63129c501e345ea4350d4c6190e5193f8d72da64028e0316c4ca3b5e54be",
          "id": "bb:88",
          "start_pc": 88,
          "type": "basic_block"
        },
        {
          "id": "call:80",
          "opcode": "CALL",
          "pc": 80,
          "type": "callsite"
        },
        {
          "id": "sink:call",
          "type": "sink"
        },
        {
          "entry_pc": null,
          "id": "fn:0x60fe47b1",
          "selector": "0x60fe47b1",
          "type": "function"
        },
        {
          "entry_pc": null,
          "id": "fn:0x6d4ce63c",
          "selector": "0x6d4ce63c",
          "type": "function"
        }
      ],
      "version": "capability_graph_v1"
    },
    "id": 1482,
    "updated_at": "2026-04-04T19:44:59.000000Z",
    "version": "capability_graph_v1"
  },
  "detector_findings": [
    {
      "confidence": 55,
      "evidence_json": {
        "eth_value_calls": 1,
        "examples": [
          {
            "opcode": "CALL",
            "pc": 80,
            "returndata_checked": null,
            "target_expression_category": "computed",
            "value_expression_category": "constant"
          }
        ],
        "guards_detected": []
      },
      "normalized_json": {
        "sink": "CALL",
        "value": "nonzero"
      },
      "severity": "high",
      "title": "ETH value transfer possible",
      "validated": true,
      "validation_json": {
        "attempts": 1,
        "call_targets": [
          "0x7aa73b556c0da8ca4e83e483d7404930e946473b",
          "0x9e0ae8ffd946d12d1d393c6f3bca0eecadc9428e"
        ],
        "classification": "target_varies",
        "confirmed": true,
        "errors": 0,
        "matched_probe": null,
        "sink": "CALL",
        "status": "confirmed",
        "target_varies": true,
        "trace_id": "0xff77c0006115c518bdd2e8a2c4b5a9013d8930a5c624d8cef7d573d37d7980c3",
        "trace_mode": "callTracer"
      }
    },
    {
      "confidence": 60,
      "evidence_json": {
        "call_count": 1,
        "examples": [
          {
            "opcode": "CALL",
            "pc": 80,
            "returndata_checked": null,
            "target_expression_category": "computed",
            "value_expression_category": "constant"
          }
        ],
        "guards_detected": [],
        "untrusted_call_count": 1
      },
      "normalized_json": {
        "sink": "CALL"
      },
      "severity": "high",
      "title": "Untrusted CALL target/value reachable",
      "validated": true,
      "validation_json": {
        "attempts": 1,
        "call_targets": [
          "0x7aa73b556c0da8ca4e83e483d7404930e946473b",
          "0x9e0ae8ffd946d12d1d393c6f3bca0eecadc9428e"
        ],
        "classification": "target_varies",
        "confirmed": true,
        "errors": 0,
        "matched_probe": null,
        "sink": "CALL",
        "status": "confirmed",
        "target_varies": true,
        "trace_id": "0xff77c0006115c518bdd2e8a2c4b5a9013d8930a5c624d8cef7d573d37d7980c3",
        "trace_mode": "callTracer"
      }
    }
  ],
  "heuristics_summary": {
    "create2_count": 0,
    "delegatecall_count": 0,
    "flags": [],
    "selfdestruct_count": 0
  }
}
exec
/bin/bash -lc "node - <<'NODE'
const bytecode='606060405260e060020a600035046360fe47b1811460245780636d4ce63c146058575b005b60226004356000805473ffffffffffffffffffffffffffffffffffffffff16906001606082818181858883f1505050505050565b60ff6060908152602090f3';
let pc=0; const opnames={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',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',0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x53:'MSTORE8',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x58:'PC',0x59:'MSIZE',0x5a:'GAS',0x5b:'JUMPDEST',0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'};
for(let i=1;i<=32;i++){opnames[0x5f+i]="'`PUSH${i}`};for(let i=1;i<=16;i++){opnames[0x7f+i]=`DUP${i}`};for(let i=1;i<=16;i++){opnames[0x8f+i]=`SWAP${i}`};
const buf=Buffer.from(bytecode,'"'hex');
while(pc<buf.length){let op=buf[pc];let name=opnames[op]||('OP_'+op.toString(16)); let out=pc.toString().padStart(3)+' '+name; pc++; if(op>=0x60&&op<=0x7f){let n=op-0x5f; out+=' 0x'+buf.slice(pc,pc+n).toString('hex'); pc+=n;} console.log(out);}
NODE" in /tmp/codex-59bx_t5g
 succeeded in 0ms:
  0 PUSH1 0x60
  2 PUSH1 0x40
  4 MSTORE
  5 PUSH1 0xe0
  7 PUSH1 0x02
  9 EXP
 10 PUSH1 0x00
 12 CALLDATALOAD
 13 DIV
 14 PUSH4 0x60fe47b1
 19 DUP2
 20 EQ
 21 PUSH1 0x24
 23 JUMPI
 24 DUP1
 25 PUSH4 0x6d4ce63c
 30 EQ
 31 PUSH1 0x58
 33 JUMPI
 34 JUMPDEST
 35 STOP
 36 JUMPDEST
 37 PUSH1 0x22
 39 PUSH1 0x04
 41 CALLDATALOAD
 42 PUSH1 0x00
 44 DUP1
 45 SLOAD
 46 PUSH20 0xffffffffffffffffffffffffffffffffffffffff
 67 AND
 68 SWAP1
 69 PUSH1 0x01
 71 PUSH1 0x60
 73 DUP3
 74 DUP2
 75 DUP2
 76 DUP2
 77 DUP6
 78 DUP9
 79 DUP4
 80 CALL
 81 POP
 82 POP
 83 POP
 84 POP
 85 POP
 86 POP
 87 JUMP
 88 JUMPDEST
 89 PUSH1 0xff
 91 PUSH1 0x60
 93 SWAP1
 94 DUP2
 95 MSTORE
 96 PUSH1 0x20
 98 SWAP1
 99 RETURN

exec
/bin/bash -lc "node - <<'NODE'
let stack=['sig'];
function show(op){console.log(op, JSON.stringify(stack));}
function push(x){stack.push(x)}
function dup(n){stack.push(stack[stack.length-n])}
function swap(n){let i=stack.length-1,j=stack.length-1-n;[stack[i],stack[j]]=[stack[j],stack[i]]}
push('0x22');show('PUSH1 0x22');
push('arg');show('CALLDATALOAD(4)');
push('0');show('PUSH1 0');
dup(1);show('DUP1');
stack.pop(); push('slot0');show('SLOAD');
push('mask');show('PUSH20 mask');
stack.pop(); let a=stack.pop(); push("'`(${a}&mask)`);show('"'AND');
swap(1);show('SWAP1');
push('1');show('PUSH1 1');
push('0x60');show('PUSH1 0x60');
dup(3);show('DUP3');
dup(2);show('DUP2');
dup(2);show('DUP2');
dup(2);show('DUP2');
dup(6);show('DUP6');
dup(9);show('DUP9');
dup(4);show('DUP4');
NODE" in /tmp/codex-59bx_t5g
 succeeded in 0ms:
PUSH1 0x22 ["sig","0x22"]
CALLDATALOAD(4) ["sig","0x22","arg"]
PUSH1 0 ["sig","0x22","arg","0"]
DUP1 ["sig","0x22","arg","0","0"]
SLOAD ["sig","0x22","arg","0","slot0"]
PUSH20 mask ["sig","0x22","arg","0","slot0","mask"]
AND ["sig","0x22","arg","0","(slot0&mask)"]
SWAP1 ["sig","0x22","arg","(slot0&mask)","0"]
PUSH1 1 ["sig","0x22","arg","(slot0&mask)","0","1"]
PUSH1 0x60 ["sig","0x22","arg","(slot0&mask)","0","1","0x60"]
DUP3 ["sig","0x22","arg","(slot0&mask)","0","1","0x60","0"]
DUP2 ["sig","0x22","arg","(slot0&mask)","0","1","0x60","0","0x60"]
DUP2 ["sig","0x22","arg","(slot0&mask)","0","1","0x60","0","0x60","0"]
DUP2 ["sig","0x22","arg","(slot0&mask)","0","1","0x60","0","0x60","0","0x60"]
DUP6 ["sig","0x22","arg","(slot0&mask)","0","1","0x60","0","0x60","0","0x60","1"]
DUP9 ["sig","0x22","arg","(slot0&mask)","0","1","0x60","0","0x60","0","0x60","1","(slot0&mask)"]
DUP4 ["sig","0x22","arg","(slot0&mask)","0","1","0x60","0","0x60","0","0x60","1","(slot0&mask)","0"]

codex
{"no_findings":false,"summary":"The runtime is a very small two-selector contract. One selector (`0x60fe47b1`) reads slot `0x0`, masks it to an address, and performs a low-level `CALL` with nonzero ETH value and no detected authorization check. The only other selector (`0x6d4ce63c`) returns the constant `0xff`. No proxy or `DELEGATECALL` behavior is present in the supplied bytecode. Findings below are conservative because naming and selector intent are inferred only from runtime bytecode.","findings":[{"severity":"medium","category":"access_control","title":"Public entrypoint can force ETH transfer to the address stored in slot 0","exploit_scenario":"Any caller can invoke selector `0x60fe47b1`. The bytecode loads slot `0x0`, treats the low 20 bytes as the call target, and executes a value-bearing `CALL` without any detected guard. If this contract ever holds ETH, an attacker can repeatedly trigger this entrypoint to push funds out to that stored address until the balance is exhausted or calls start failing. Because only runtime bytecode is available, it is unclear whether this behavior is intentional, but there is no visible caller authorization in the deployed code.","recommendation":"If this payout/forwarding behavior is not meant to be public, add an explicit caller authorization check before the external call. If it is intended, constrain the reachable balance and document that anyone can trigger the transfer path.","evidence":"At `pc 0x2d` the contract performs `SLOAD` from slot `0x0`; at `pc 0x50` it executes `CALL`. The analysis artifact reports no detected guards, one storage read from slot `0x0`, and a validated nonzero-value external call reachable from selector `0x60fe47b1`. The supplied bytecode contains no runtime storage writes, so the call target is whatever address was already installed in slot `0x0`.","locations":["selector:0x60fe47b1","pc:0x2d","pc:0x50"]},{"severity":"low","category":"other","title":"Low-level ETH call ignores success/failure","exploit_scenario":"The `CALL` result is immediately discarded with `POP`, and the function jumps to a normal `STOP` path. If the callee reverts or the transfer fails, upstream integrations may still treat the transaction as successful because this function does not bubble the error or return a failure indicator. That can create silent payout/accounting mismatches.","recommendation":"Check the `CALL` return value and revert or emit an explicit failure signal when the transfer does not succeed. If failure is intentionally tolerated, make that behavior explicit in surrounding protocol logic.","evidence":"The only external callsite is `CALL` at `pc 0x50`. The stack result from `CALL` is not consumed by a conditional branch; it is popped at `pc 0x51`, and the artifact marks `returndata_checked` as unknown/null. No revert path is visible after the call.","locations":["selector:0x60fe47b1","pc:0x50","pc:0x51"]}]}
tokens used
37,042
Metadata
{
    "codex": {
        "ran_at": "2026-04-04T21:03:38.210262+00:00",
        "returncode": 0
    },
    "project": {
        "mode": "bytecode",
        "bytecode_length": 202,
        "bytecode_truncated": false,
        "capability_graph_present": true,
        "analysis_artifact_present": true
    },
    "summary": "The runtime is a very small two-selector contract. One selector (`0x60fe47b1`) reads slot `0x0`, masks it to an address, and performs a low-level `CALL` with nonzero ETH value and no detected authorization check. The only other selector (`0x6d4ce63c`) returns the constant `0xff`. No proxy or `DELEGATECALL` behavior is present in the supplied bytecode. Findings below are conservative because naming and selector intent are inferred only from runtime bytecode.",
    "raw_final": {
        "summary": "The runtime is a very small two-selector contract. One selector (`0x60fe47b1`) reads slot `0x0`, masks it to an address, and performs a low-level `CALL` with nonzero ETH value and no detected authorization check. The only other selector (`0x6d4ce63c`) returns the constant `0xff`. No proxy or `DELEGATECALL` behavior is present in the supplied bytecode. Findings below are conservative because naming and selector intent are inferred only from runtime bytecode.",
        "findings": [
            {
                "title": "Public entrypoint can force ETH transfer to the address stored in slot 0",
                "category": "access_control",
                "evidence": "At `pc 0x2d` the contract performs `SLOAD` from slot `0x0`; at `pc 0x50` it executes `CALL`. The analysis artifact reports no detected guards, one storage read from slot `0x0`, and a validated nonzero-value external call reachable from selector `0x60fe47b1`. The supplied bytecode contains no runtime storage writes, so the call target is whatever address was already installed in slot `0x0`.",
                "severity": "medium",
                "locations": [
                    "selector:0x60fe47b1",
                    "pc:0x2d",
                    "pc:0x50"
                ],
                "recommendation": "If this payout/forwarding behavior is not meant to be public, add an explicit caller authorization check before the external call. If it is intended, constrain the reachable balance and document that anyone can trigger the transfer path.",
                "exploit_scenario": "Any caller can invoke selector `0x60fe47b1`. The bytecode loads slot `0x0`, treats the low 20 bytes as the call target, and executes a value-bearing `CALL` without any detected guard. If this contract ever holds ETH, an attacker can repeatedly trigger this entrypoint to push funds out to that stored address until the balance is exhausted or calls start failing. Because only runtime bytecode is available, it is unclear whether this behavior is intentional, but there is no visible caller authorization in the deployed code."
            },
            {
                "title": "Low-level ETH call ignores success/failure",
                "category": "other",
                "evidence": "The only external callsite is `CALL` at `pc 0x50`. The stack result from `CALL` is not consumed by a conditional branch; it is popped at `pc 0x51`, and the artifact marks `returndata_checked` as unknown/null. No revert path is visible after the call.",
                "severity": "low",
                "locations": [
                    "selector:0x60fe47b1",
                    "pc:0x50",
                    "pc:0x51"
                ],
                "recommendation": "Check the `CALL` return value and revert or emit an explicit failure signal when the transfer does not succeed. If failure is intentionally tolerated, make that behavior explicit in surrounding protocol logic.",
                "exploit_scenario": "The `CALL` result is immediately discarded with `POP`, and the function jumps to a normal `STOP` path. If the callee reverts or the transfer fails, upstream integrations may still treat the transaction as successful because this function does not bubble the error or return a failure indicator. That can create silent payout/accounting mismatches."
            }
        ],
        "no_findings": false
    },
    "no_findings": false,
    "schema_version": 1
}

Opcode Heuristics

tool.cast_disasm
Delegatecall
0
Selfdestruct
0
CREATE2
0
CALL-family (heavy)
1
EXT*/BALANCE
0
Total opcodes
57
Flags
No heuristic flags raised.
View cast disassembly output
00000000: PUSH1 0x60
00000002: PUSH1 0x40
00000004: MSTORE
00000005: PUSH1 0xe0
00000007: PUSH1 0x02
00000009: EXP
0000000a: PUSH1 0x00
0000000c: CALLDATALOAD
0000000d: DIV
0000000e: PUSH4 0x60fe47b1
00000013: DUP2
00000014: EQ
00000015: PUSH1 0x24
00000017: JUMPI
00000018: DUP1
00000019: PUSH4 0x6d4ce63c
0000001e: EQ
0000001f: PUSH1 0x58
00000021: JUMPI
00000022: JUMPDEST
00000023: STOP
00000024: JUMPDEST
00000025: PUSH1 0x22
00000027: PUSH1 0x04
00000029: CALLDATALOAD
0000002a: PUSH1 0x00
0000002c: DUP1
0000002d: SLOAD
0000002e: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00000043: AND
00000044: SWAP1
00000045: PUSH1 0x01
00000047: PUSH1 0x60
00000049: DUP3
0000004a: DUP2
0000004b: DUP2
0000004c: DUP2
0000004d: DUP6
0000004e: DUP9
0000004f: DUP4
00000050: CALL
00000051: POP
00000052: POP
00000053: POP
00000054: POP
00000055: POP
00000056: POP
00000057: JUMP
00000058: JUMPDEST
00000059: PUSH1 0xff
0000005b: PUSH1 0x60
0000005d: SWAP1
0000005e: DUP2
0000005f: MSTORE
00000060: PUSH1 0x20
00000062: SWAP1
00000063: RETURN
View stderr
Warning: This is a nightly build of Foundry. It is recommended to use the latest stable version. To mute this warning set `FOUNDRY_DISABLE_NIGHTLY_WARNING` in your environment.

Findings

validated = confirmed for call sinks; sink observed for others
Severity Category Tool Title Confidence Validated Confirmed Details
high other detector ETH value transfer possible 55 yes yes
view
trace_id: 0xff77c0006115c518bdd2e8a2c4b5a9013d8930a5c624d8cef7d573d37d7980c3
call_targets: 0x7aa73b556c0da8ca4e83e483d7404930e946473b, 0x9e0ae8ffd946d12d1d393c6f3bca0eecadc9428e
target_varies: yes
classification: target_varies
validation_json
{
    "sink": "CALL",
    "errors": 0,
    "status": "confirmed",
    "attempts": 1,
    "trace_id": "0xff77c0006115c518bdd2e8a2c4b5a9013d8930a5c624d8cef7d573d37d7980c3",
    "confirmed": true,
    "trace_mode": "callTracer",
    "call_targets": [
        "0x7aa73b556c0da8ca4e83e483d7404930e946473b",
        "0x9e0ae8ffd946d12d1d393c6f3bca0eecadc9428e"
    ],
    "matched_probe": null,
    "target_varies": true,
    "classification": "target_varies"
}
witness_json
{
    "notes": "heuristic witness; entrypoints are best-effort selectors with zeroed calldata",
    "constraints": [],
    "entrypoints": [
        {
            "calldata": "0x60fe47b1",
            "selector": "0x60fe47b1",
            "calldata_variants": [
                "0x60fe47b1",
                "0x60fe47b10000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0x6d4ce63c",
            "selector": "0x6d4ce63c",
            "calldata_variants": [
                "0x6d4ce63c",
                "0x6d4ce63c0000000000000000000000000000000000000000000000000000000000000000"
            ]
        }
    ]
}
evidence_json
{
    "examples": [
        {
            "pc": 80,
            "opcode": "CALL",
            "returndata_checked": null,
            "value_expression_category": "constant",
            "target_expression_category": "computed"
        }
    ],
    "eth_value_calls": 1,
    "guards_detected": []
}
high other detector Untrusted CALL target/value reachable 60 yes yes
view
trace_id: 0xff77c0006115c518bdd2e8a2c4b5a9013d8930a5c624d8cef7d573d37d7980c3
call_targets: 0x7aa73b556c0da8ca4e83e483d7404930e946473b, 0x9e0ae8ffd946d12d1d393c6f3bca0eecadc9428e
target_varies: yes
classification: target_varies
validation_json
{
    "sink": "CALL",
    "errors": 0,
    "status": "confirmed",
    "attempts": 1,
    "trace_id": "0xff77c0006115c518bdd2e8a2c4b5a9013d8930a5c624d8cef7d573d37d7980c3",
    "confirmed": true,
    "trace_mode": "callTracer",
    "call_targets": [
        "0x7aa73b556c0da8ca4e83e483d7404930e946473b",
        "0x9e0ae8ffd946d12d1d393c6f3bca0eecadc9428e"
    ],
    "matched_probe": null,
    "target_varies": true,
    "classification": "target_varies"
}
witness_json
{
    "notes": "heuristic witness; entrypoints are best-effort selectors with zeroed calldata",
    "constraints": [],
    "entrypoints": [
        {
            "calldata": "0x60fe47b1",
            "selector": "0x60fe47b1",
            "calldata_variants": [
                "0x60fe47b1",
                "0x60fe47b10000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0x6d4ce63c",
            "selector": "0x6d4ce63c",
            "calldata_variants": [
                "0x6d4ce63c",
                "0x6d4ce63c0000000000000000000000000000000000000000000000000000000000000000"
            ]
        }
    ]
}
evidence_json
{
    "examples": [
        {
            "pc": 80,
            "opcode": "CALL",
            "returndata_checked": null,
            "value_expression_category": "constant",
            "target_expression_category": "computed"
        }
    ],
    "call_count": 1,
    "guards_detected": [],
    "untrusted_call_count": 1
}
medium access_control codex Public entrypoint can force ETH transfer to the address stored in slot 0 75 no
view
evidence_json
{
    "evidence": "At `pc 0x2d` the contract performs `SLOAD` from slot `0x0`; at `pc 0x50` it executes `CALL`. The analysis artifact reports no detected guards, one storage read from slot `0x0`, and a validated nonzero-value external call reachable from selector `0x60fe47b1`. The supplied bytecode contains no runtime storage writes, so the call target is whatever address was already installed in slot `0x0`.",
    "locations": [
        "selector:0x60fe47b1",
        "pc:0x2d",
        "pc:0x50"
    ],
    "recommendation": "If this payout/forwarding behavior is not meant to be public, add an explicit caller authorization check before the external call. If it is intended, constrain the reachable balance and document that anyone can trigger the transfer path.",
    "exploit_scenario": "Any caller can invoke selector `0x60fe47b1`. The bytecode loads slot `0x0`, treats the low 20 bytes as the call target, and executes a value-bearing `CALL` without any detected guard. If this contract ever holds ETH, an attacker can repeatedly trigger this entrypoint to push funds out to that stored address until the balance is exhausted or calls start failing. Because only runtime bytecode is available, it is unclear whether this behavior is intentional, but there is no visible caller authorization in the deployed code."
}
low other codex Low-level ETH call ignores success/failure 65 no
view
evidence_json
{
    "evidence": "The only external callsite is `CALL` at `pc 0x50`. The stack result from `CALL` is not consumed by a conditional branch; it is popped at `pc 0x51`, and the artifact marks `returndata_checked` as unknown/null. No revert path is visible after the call.",
    "locations": [
        "selector:0x60fe47b1",
        "pc:0x50",
        "pc:0x51"
    ],
    "recommendation": "Check the `CALL` return value and revert or emit an explicit failure signal when the transfer does not succeed. If failure is intentionally tolerated, make that behavior explicit in surrounding protocol logic.",
    "exploit_scenario": "The `CALL` result is immediately discarded with `POP`, and the function jumps to a normal `STOP` path. If the callee reverts or the transfer fails, upstream integrations may still treat the transaction as successful because this function does not bubble the error or return a failure indicator. That can create silent payout/accounting mismatches."
}