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

Analysis Run

019be3d6-84ee-7348-8933-35d695a39730

complete
Chain ID
1
Address
Block Number
Created
Thu, Jan 22, 2026 3:54 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
Bytecode only
Review Backing
Present
Best current signal
Untrusted CALL target/value reachable
crit 0 high 0 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
41142 artifact.fetch complete 1 / 3 2 months ago
41143 proxy.resolve complete 1 / 3 2 months ago
41144 tool.cast_disasm complete 1 / 3 2 months ago
41145 analysis.bundle complete 1 / 3 2 months ago
41146 capability.graph complete 1 / 3 2 months ago
41147 detector.run complete 1 / 3 2 months ago
41148 validation.fork complete 1 / 3 2 months ago
41441 report.consolidate complete 1 / 6 2 months ago

Artifact

Runtime bytecode: available
Creation TX:
Deployer:
Proxy: no not_proxy
Implementation:
Verified Source: no
Proxy evidence
{
    "status": "not_proxy"
}

Slither

tool.slither

No slither job recorded yet.

Codex

report.consolidate
Job Status
complete
Attempts
1 / 6
Findings
2
No findings?
no
Summary
Bytecode shows two low-level CALL sites with computed target/value and no detected sender-based guards; return-data is not validated. Evidence is bytecode-only and the call target may be constant (self) per validation, so impact depends on how these entrypoints are used.
View stdout
{"no_findings":false,"summary":"Bytecode shows two low-level CALL sites with computed target/value and no detected sender-based guards; return-data is not validated. Evidence is bytecode-only and the call target may be constant (self) per validation, so impact depends on how these entrypoints are used.","findings":[{"severity":"medium","category":"access_control","title":"Externally reachable CALL with computed target/value (possible arbitrary execution/ETH transfer)","exploit_scenario":"If these CALL parameters are influenced by calldata and the entrypoint is publicly callable, an attacker can direct the contract to call arbitrary targets with the contract’s ETH balance, potentially draining funds or abusing approvals. Validation hints the target might be constant (self), so confirm whether the target/value are actually user-controlled before relying on this risk assessment.","recommendation":"Restrict who can invoke the external-call path (e.g., owner/role checks) or require verifiable authorization (signatures). If this is intended to be an executor, add an allowlist for targets and cap ETH value; document the trust model explicitly.","evidence":"Both callsites are CALL with target/value marked as computed and no guards detected; no CALLER/ORIGIN opcodes observed. Detector flagged “Untrusted CALL target/value reachable” and “ETH value transfer possible.” Validation trace suggests a constant target equal to the contract address, so this may be a false positive if the target is not actually user-controlled.","locations":["pc:971","pc:1108"]},{"severity":"low","category":"other","title":"Return data not validated for low-level CALLs","exploit_scenario":"If these CALLs interact with ERC20-like tokens that return false without reverting, the contract may treat the call as successful even though the token action failed, leading to accounting inconsistencies or stuck funds. If the CALLs are arbitrary, this may be acceptable but should be explicit.","recommendation":"When expecting ERC20-style semantics, enforce `success && (returndata.length == 0 || abi.decode(returndata, (bool)) == true)` or use a well-tested safe-call helper.","evidence":"Callsites list `returndata_checked: null`; success is checked only via the CALL result, with no return-data decoding in the call blocks.","locations":["pc:971","pc:1108"]}]}
View stderr
OpenAI Codex v0.77.0 (research preview)
--------
workdir: /tmp/codex-pt6tfdez
model: gpt-5.2-codex
provider: openai
approval: never
sandbox: read-only
reasoning effort: high
reasoning summaries: auto
session id: 019be49e-1367-7761-a69f-166d122c52af
--------
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.
mcp startup: no servers

thinking
**Locating BYTECODE_BUNDLE.json**

I'm searching the codebase for BYTECODE_BUNDLE.json using a file listing tool to proceed with reading its contents.
exec
/bin/bash -lc ls in /tmp/codex-pt6tfdez succeeded in 6ms:
BYTECODE_BUNDLE.json
codex-output-schema.json
exec
/bin/bash -lc 'cat BYTECODE_BUNDLE.json' in /tmp/codex-pt6tfdez succeeded in 8ms:
{
  "analysis_artifact": {
    "address": "0xd9b20cfed69e76acae3fa1c2ee1faafafcb41f55",
    "artifact_hash": "0x4617c1684b7a904dbc913bdb4dbce61b5bffb6fdc8cb4ba9df4ac51eaeadb8a2",
    "artifact_json": {
      "auth": {
        "guards": []
      },
      "basic_blocks": [
        {
          "end_pc": 12,
          "hash": "0x6052ec2baf1fb58cbd3f3caa60607e9bcd0236773f0f25438434bedc50d6ef5f",
          "opcodes": [
            "PUSH1",
            "PUSH1",
            "MSTORE",
            "PUSH1",
            "CALLDATASIZE",
            "LT",
            "PUSH2",

thinking
**Inspecting selector mappings and callsites**

I found four selectors with two missing entry PCs, indicating incomplete selector mapping. Calls occur at PCs 971 and 1108; next, I'll investigate callsites and evidence bundle entries around these PCs to clarify contract behavior.
exec
/bin/bash -lc 'rg -n "pc":971|pc": 971|call:971|CALL" BYTECODE_BUNDLE.json' in /tmp/codex-pt6tfdez exited 127 in 21ms:
/bin/bash: line 1: pc: 971|call:971|CALL: command not found

thinking
**Correcting search pattern syntax**
exec
/bin/bash -lc "rg -n \"pc\\\": 971|call:971\" BYTECODE_BUNDLE.json" in /tmp/codex-pt6tfdez succeeded in 7ms:
1301:          "pc": 971,
2221:          "to": "call:971",
2225:          "from": "call:971",
2634:          "id": "call:971",
2636:          "pc": 971,
2688:            "pc": 971,
2733:            "pc": 971,

thinking
**Planning callsite extraction from basic blocks**

I'm focusing on finding callsite details by locating the relevant basic block containing the call PC and examining its opcodes to infer state changes and call context. I'll extract the basic block by its start PC using Python JSON parsing to safely analyze the block's instructions.
exec
/bin/bash -lc "python - <<'PY'
import json
p='/tmp/codex-pt6tfdez/BYTECODE_BUNDLE.json'
with open(p) as f:
    data=json.load(f)
blocks=data['analysis_artifact']['artifact_json']['basic_blocks']
for b in blocks:
    if b['start_pc']==891:
        print(b)
PY" in /tmp/codex-pt6tfdez succeeded in 33ms:
{'end_pc': 978, 'hash': '0x0b61e4c70fa06d2e531653d428f803794e8f63159e3a4e2c0d85ac7d0777fcab', 'opcodes': ['JUMPDEST', 'PUSH1', 'OP_90', 'OP_81', 'MUL', 'OP_90', 'OP_91', 'ADD', 'OP_81', 'ADD', 'MLOAD', 'PUSH1', 'OP_80', 'MLOAD', 'PUSH1', 'OP_80', 'OP_82', 'MSTORE', 'OP_81', 'OP_85', 'ADD', 'OP_80', 'OP_84', 'MSTORE', 'OP_97', 'OP_90', 'OP_97', 'MSTORE', 'PUSH1', 'OP_90', 'OP_95', 'AND', 'OP_85', 'OP_82', 'ADD', 'MSTORE', 'PUSH1', 'OP_85', 'ADD', 'OP_93', 'OP_90', 'OP_93', 'MSTORE', 'PUSH1', 'OP_84', 'ADD', 'MSTORE', 'OP_90', 'MLOAD', 'PUSH1', 'OP_80', 'OP_84', 'ADD', 'OP_94', 'OP_92', 'OP_93', 'PUSH1', 'NOT', 'OP_83', 'ADD', 'OP_93', 'OP_90', 'OP_83', 'OP_90', 'SUB', 'OP_90', 'OP_91', 'ADD', 'OP_91', 'OP_90', 'OP_86', 'GAS', 'CALL', 'ISZERO', 'OP_80', 'ISZERO', 'PUSH2', 'JUMPI'], 'start_pc': 891}

thinking
**Analyzing call success check**

The code uses double ISZERO after CALL, likely to verify call success and trigger a revert on failure, so I'll inspect the next block to confirm the revert handling.
exec
/bin/bash -lc "python - <<'PY'
import json
p='/tmp/codex-pt6tfdez/BYTECODE_BUNDLE.json'
with open(p) as f:
    data=json.load(f)
blocks=data['analysis_artifact']['artifact_json']['basic_blocks']
for b in blocks:
    if b['start_pc']==979:
        print(b)
PY" in /tmp/codex-pt6tfdez succeeded in 28ms:
{'end_pc': 987, 'hash': '0xbdb03bc5732ac2b246bfba0a30b4910cbc8ff20bc57f4f7135bea8d234f87637', 'opcodes': ['RETURNDATASIZE', 'PUSH1', 'OP_80', 'RETURNDATACOPY', 'RETURNDATASIZE', 'PUSH1', 'REVERT'], 'start_pc': 979}

thinking
**Analyzing call target ambiguity**

Noticed the call success is verified but return data might not be checked for ERC20; considering parsing calldata to identify call target, possibly involving aggregator or multicall patterns within a block spanning specific PCs.
exec
/bin/bash -lc "python - <<'PY'
import json
p='/tmp/codex-pt6tfdez/BYTECODE_BUNDLE.json'
with open(p) as f:
    data=json.load(f)
blocks=data['analysis_artifact']['artifact_json']['basic_blocks']
for b in blocks:
    if b['start_pc']==1084:
        print(b)
PY" in /tmp/codex-pt6tfdez succeeded in 26ms:
{'end_pc': 1117, 'hash': '0xc4281bcbf77bc7efb6f36ac7e0dff05240f5de49337d606a3a1aaa1172f5a08a', 'opcodes': ['JUMPDEST', 'POP', 'PUSH1', 'OP_80', 'SLOAD', 'PUSH1', 'ADD', 'OP_81', 'SSTORE', 'OP_85', 'MLOAD', 'OP_81', 'OP_90', 'OP_81', 'OP_90', 'PUSH1', 'OP_89', 'ADD', 'OP_8A', 'OP_8C', 'GAS', 'CALL', 'OP_90', 'POP', 'OP_80', 'ISZERO', 'ISZERO', 'PUSH2', 'JUMPI'], 'start_pc': 1084}

thinking
**Analyzing potential reentrancy and dispatch functions**

Noted a state update before an external call that may indicate reentrancy concerns; next, I'll identify call targets and decode function selectors from dispatch logic to classify functions and check access controls. I'll also scan stored data and storage slots in the JSON for relevant evidence.
exec
/bin/bash -lc 'rg -n "storage|slot|slots" BYTECODE_BUNDLE.json' in /tmp/codex-pt6tfdez succeeded in 7ms:
1619:          "storage": {
1621:            "slots": [
1625:                "slot": "0x0000000000000000000000000000000000000000000000000000000000000001"
1630:                "slot": "0x0000000000000000000000000000000000000000000000000000000000000003"
1635:                "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
1640:                "slot": "0x0000000000000000000000000000000000000000000000000000000000000001"
1645:                "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
1650:                "slot": "0x0000000000000000000000000000000000000000000000000000000000000001"
1655:                "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
1673:          "storage": {
1675:            "slots": [
1679:                "slot": "0x0000000000000000000000000000000000000000000000000000000000000001"
1684:                "slot": "0x0000000000000000000000000000000000000000000000000000000000000003"
1689:                "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
1694:                "slot": "0x0000000000000000000000000000000000000000000000000000000000000001"
1699:                "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
1704:                "slot": "0x0000000000000000000000000000000000000000000000000000000000000001"
1709:                "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
1727:          "storage": {
1729:            "slots": [

thinking
**Inspecting storage details**

I'm preparing to parse the storage section with Python to uncover relevant evidence and understand how storage is handled.
exec
/bin/bash -lc "python - <<'PY'
import json
p='/tmp/codex-pt6tfdez/BYTECODE_BUNDLE.json'
with open(p) as f:
    data=json.load(f)
# find storage summary top-level maybe
for k,v in data.items():
    if k=='storage':
        print('top-level storage', v)
# maybe in evidence bundle? search keys containing 'storage'

def find_storage(obj,path=''):
    if isinstance(obj,dict):
        for k,v in obj.items():
            if k=='storage':
                print('found storage at', path)
                print(v)
            else:
                find_storage(v, path+'/'+k)
    elif isinstance(obj,list):
        for i,v in enumerate(obj):
            find_storage(v, path+f'[{i}]')

find_storage(data)
PY" in /tmp/codex-pt6tfdez succeeded in 33ms:
found storage at /analysis_artifact/artifact_json/functions[0]
{'reads': 9, 'slots': [{'op': 'SLOAD', 'pc': 497, 'slot': '0x0000000000000000000000000000000000000000000000000000000000000001'}, {'op': 'SLOAD', 'pc': 504, 'slot': '0x0000000000000000000000000000000000000000000000000000000000000003'}, {'op': 'SLOAD', 'pc': 543, 'slot': '0x0000000000000000000000000000000000000000000000000000000000000000'}, {'op': 'SLOAD', 'pc': 557, 'slot': '0x0000000000000000000000000000000000000000000000000000000000000001'}, {'op': 'SLOAD', 'pc': 604, 'slot': '0x0000000000000000000000000000000000000000000000000000000000000000'}, {'op': 'SLOAD', 'pc': 819, 'slot': '0x0000000000000000000000000000000000000000000000000000000000000001'}, {'op': 'SLOAD', 'pc': 1089, 'slot': '0x0000000000000000000000000000000000000000000000000000000000000000'}], 'writes': 1}
found storage at /analysis_artifact/artifact_json/functions[1]
{'reads': 9, 'slots': [{'op': 'SLOAD', 'pc': 497, 'slot': '0x0000000000000000000000000000000000000000000000000000000000000001'}, {'op': 'SLOAD', 'pc': 504, 'slot': '0x0000000000000000000000000000000000000000000000000000000000000003'}, {'op': 'SLOAD', 'pc': 543, 'slot': '0x0000000000000000000000000000000000000000000000000000000000000000'}, {'op': 'SLOAD', 'pc': 557, 'slot': '0x0000000000000000000000000000000000000000000000000000000000000001'}, {'op': 'SLOAD', 'pc': 604, 'slot': '0x0000000000000000000000000000000000000000000000000000000000000000'}, {'op': 'SLOAD', 'pc': 819, 'slot': '0x0000000000000000000000000000000000000000000000000000000000000001'}, {'op': 'SLOAD', 'pc': 1089, 'slot': '0x0000000000000000000000000000000000000000000000000000000000000000'}], 'writes': 1}
found storage at /analysis_artifact/artifact_json/functions[2]
{'reads': 9, 'slots': [{'op': 'SLOAD', 'pc': 497, 'slot': '0x0000000000000000000000000000000000000000000000000000000000000001'}, {'op': 'SLOAD', 'pc': 504, 'slot': '0x0000000000000000000000000000000000000000000000000000000000000003'}, {'op': 'SLOAD', 'pc': 543, 'slot': '0x0000000000000000000000000000000000000000000000000000000000000000'}, {'op': 'SLOAD', 'pc': 557, 'slot': '0x0000000000000000000000000000000000000000000000000000000000000001'}, {'op': 'SLOAD', 'pc': 604, 'slot': '0x0000000000000000000000000000000000000000000000000000000000000000'}, {'op': 'SLOAD', 'pc': 819, 'slot': '0x0000000000000000000000000000000000000000000000000000000000000001'}, {'op': 'SLOAD', 'pc': 1089, 'slot': '0x0000000000000000000000000000000000000000000000000000000000000000'}], 'writes': 1}
found storage at /analysis_artifact/artifact_json/functions[3]
{'reads': 9, 'slots': [{'op': 'SLOAD', 'pc': 497, 'slot': '0x0000000000000000000000000000000000000000000000000000000000000001'}, {'op': 'SLOAD', 'pc': 504, 'slot': '0x0000000000000000000000000000000000000000000000000000000000000003'}, {'op': 'SLOAD', 'pc': 543, 'slot': '0x0000000000000000000000000000000000000000000000000000000000000000'}, {'op': 'SLOAD', 'pc': 557, 'slot': '0x0000000000000000000000000000000000000000000000000000000000000001'}, {'op': 'SLOAD', 'pc': 604, 'slot': '0x0000000000000000000000000000000000000000000000000000000000000000'}, {'op': 'SLOAD', 'pc': 819, 'slot': '0x0000000000000000000000000000000000000000000000000000000000000001'}, {'op': 'SLOAD', 'pc': 1089, 'slot': '0x0000000000000000000000000000000000000000000000000000000000000000'}], 'writes': 1}
found storage at /analysis_artifact/artifact_json
{'keccak_count': 4, 'reads': 9, 'slots': [{'op': 'SLOAD', 'pc': 497, 'slot': '0x0000000000000000000000000000000000000000000000000000000000000001'}, {'op': 'SLOAD', 'pc': 504, 'slot': '0x0000000000000000000000000000000000000000000000000000000000000003'}, {'op': 'SLOAD', 'pc': 543, 'slot': '0x0000000000000000000000000000000000000000000000000000000000000000'}, {'op': 'SLOAD', 'pc': 557, 'slot': '0x0000000000000000000000000000000000000000000000000000000000000001'}, {'op': 'SLOAD', 'pc': 604, 'slot': '0x0000000000000000000000000000000000000000000000000000000000000000'}, {'op': 'SLOAD', 'pc': 819, 'slot': '0x0000000000000000000000000000000000000000000000000000000000000001'}, {'op': 'SLOAD', 'pc': 1089, 'slot': '0x0000000000000000000000000000000000000000000000000000000000000000'}], 'writes': 1}

thinking
**Inspecting artifact_json functions array**
exec
/bin/bash -lc "python - <<'PY'
import json
p='/tmp/codex-pt6tfdez/BYTECODE_BUNDLE.json'
with open(p) as f:
    data=json.load(f)
funcs=data['analysis_artifact']['artifact_json'].get('functions',[])
print('functions len',len(funcs))
for i,f in enumerate(funcs):
    print('\\nfunc',i, {k:f[k] for k in f if k in ('selector','entry_pc','name','visibility','mutability','auth')})
    print('storage', f.get('storage'))
    print('external_calls', f.get('external_calls'))
PY" in /tmp/codex-pt6tfdez succeeded in 32ms:
functions len 4

func 0 {'auth': {'guards': []}, 'entry_pc': None, 'selector': '0x42cde4e8'}
storage {'reads': 9, 'slots': [{'op': 'SLOAD', 'pc': 497, 'slot': '0x0000000000000000000000000000000000000000000000000000000000000001'}, {'op': 'SLOAD', 'pc': 504, 'slot': '0x0000000000000000000000000000000000000000000000000000000000000003'}, {'op': 'SLOAD', 'pc': 543, 'slot': '0x0000000000000000000000000000000000000000000000000000000000000000'}, {'op': 'SLOAD', 'pc': 557, 'slot': '0x0000000000000000000000000000000000000000000000000000000000000001'}, {'op': 'SLOAD', 'pc': 604, 'slot': '0x0000000000000000000000000000000000000000000000000000000000000000'}, {'op': 'SLOAD', 'pc': 819, 'slot': '0x0000000000000000000000000000000000000000000000000000000000000001'}, {'op': 'SLOAD', 'pc': 1089, 'slot': '0x0000000000000000000000000000000000000000000000000000000000000000'}], 'writes': 1}
external_calls None

func 1 {'auth': {'guards': []}, 'entry_pc': 2952712416, 'selector': '0xaa5df9e2'}
storage {'reads': 9, 'slots': [{'op': 'SLOAD', 'pc': 497, 'slot': '0x0000000000000000000000000000000000000000000000000000000000000001'}, {'op': 'SLOAD', 'pc': 504, 'slot': '0x0000000000000000000000000000000000000000000000000000000000000003'}, {'op': 'SLOAD', 'pc': 543, 'slot': '0x0000000000000000000000000000000000000000000000000000000000000000'}, {'op': 'SLOAD', 'pc': 557, 'slot': '0x0000000000000000000000000000000000000000000000000000000000000001'}, {'op': 'SLOAD', 'pc': 604, 'slot': '0x0000000000000000000000000000000000000000000000000000000000000000'}, {'op': 'SLOAD', 'pc': 819, 'slot': '0x0000000000000000000000000000000000000000000000000000000000000001'}, {'op': 'SLOAD', 'pc': 1089, 'slot': '0x0000000000000000000000000000000000000000000000000000000000000000'}], 'writes': 1}
external_calls None

func 2 {'auth': {'guards': []}, 'entry_pc': 4046272847, 'selector': '0xaffed0e0'}
storage {'reads': 9, 'slots': [{'op': 'SLOAD', 'pc': 497, 'slot': '0x0000000000000000000000000000000000000000000000000000000000000001'}, {'op': 'SLOAD', 'pc': 504, 'slot': '0x0000000000000000000000000000000000000000000000000000000000000003'}, {'op': 'SLOAD', 'pc': 543, 'slot': '0x0000000000000000000000000000000000000000000000000000000000000000'}, {'op': 'SLOAD', 'pc': 557, 'slot': '0x0000000000000000000000000000000000000000000000000000000000000001'}, {'op': 'SLOAD', 'pc': 604, 'slot': '0x0000000000000000000000000000000000000000000000000000000000000000'}, {'op': 'SLOAD', 'pc': 819, 'slot': '0x0000000000000000000000000000000000000000000000000000000000000001'}, {'op': 'SLOAD', 'pc': 1089, 'slot': '0x0000000000000000000000000000000000000000000000000000000000000000'}], 'writes': 1}
external_calls None

func 3 {'auth': {'guards': []}, 'entry_pc': None, 'selector': '0xf12d394f'}
storage {'reads': 9, 'slots': [{'op': 'SLOAD', 'pc': 497, 'slot': '0x0000000000000000000000000000000000000000000000000000000000000001'}, {'op': 'SLOAD', 'pc': 504, 'slot': '0x0000000000000000000000000000000000000000000000000000000000000003'}, {'op': 'SLOAD', 'pc': 543, 'slot': '0x0000000000000000000000000000000000000000000000000000000000000000'}, {'op': 'SLOAD', 'pc': 557, 'slot': '0x0000000000000000000000000000000000000000000000000000000000000001'}, {'op': 'SLOAD', 'pc': 604, 'slot': '0x0000000000000000000000000000000000000000000000000000000000000000'}, {'op': 'SLOAD', 'pc': 819, 'slot': '0x0000000000000000000000000000000000000000000000000000000000000001'}, {'op': 'SLOAD', 'pc': 1089, 'slot': '0x0000000000000000000000000000000000000000000000000000000000000000'}], 'writes': 1}
external_calls None

thinking
**Analyzing function entry addresses and callsites**

Function entry PCs appear invalid or out of code range, likely due to obfuscation or mapping errors, so I'll focus on bytecode evidence. Two callsites exist at PCs 971 and 1108 needing access control analysis, noting no explicit auth guards detected but remaining cautious. Next, I'll check the artifact JSON for callsites or call target details to clarify external call paths.
exec
/bin/bash -lc "python - <<'PY'
import json
p='/tmp/codex-pt6tfdez/BYTECODE_BUNDLE.json'
with open(p) as f:
    data=json.load(f)
# find keys containing 'call' or 'calls'

def find_keys(obj, path=''):
    if isinstance(obj, dict):
        for k,v in obj.items():
            if 'call' in k:
                if path.count('/')<4:
                    print(path, k)
            find_keys(v, path+'/'+k)
    elif isinstance(obj, list):
        for i,v in enumerate(obj):
            find_keys(v, path+f'[{i}]')

find_keys(data)
PY" in /tmp/codex-pt6tfdez succeeded in 39ms:
/analysis_artifact/artifact_json callsites
/analysis_artifact/artifact_json/sinks call
/analysis_artifact/artifact_json/sinks delegatecall
/analysis_artifact/artifact_json/sinks staticcall
/detector_findings[0]/evidence_json call_count
/detector_findings[0]/evidence_json untrusted_call_count
/detector_findings[0]/validation_json call_targets
/detector_findings[1]/evidence_json eth_value_calls
/detector_findings[1]/validation_json call_targets
/heuristics_summary delegatecall_count

thinking
**Inspecting callsites list**
exec
/bin/bash -lc "python - <<'PY'
import json
p='/tmp/codex-pt6tfdez/BYTECODE_BUNDLE.json'
with open(p) as f:
    data=json.load(f)
cs=data['analysis_artifact']['artifact_json'].get('callsites')
print('callsites',cs)
PY" in /tmp/codex-pt6tfdez succeeded in 28ms:
callsites [{'opcode': 'CALL', 'pc': 971, 'returndata_checked': None, 'target_expression_category': 'computed', 'value_expression_category': 'computed'}, {'opcode': 'CALL', 'pc': 1108, 'returndata_checked': None, 'target_expression_category': 'computed', 'value_expression_category': 'computed'}]


thinking
**Analyzing self-call implications**

The call appears to target the contract itself with a constant address, conflicting with the untrusted call detector triggered by computed calls. This suggests the call is external but to self, which can enable reentrancy within the same contract context despite being a self-call, potentially affecting state or triggering fallback logic.
thinking
**Interpreting call success handling**

The call result is checked via stack ops after CALL, with a swap and double ISZERO pattern suggesting success verification, but no clear revert on failure is present. This implies the contract may ignore call failures or handle them non-revertingly, affecting how reentrancy or value transfer risks are assessed.
exec
/bin/bash -lc "python - <<'PY'
import json
p='/tmp/codex-pt6tfdez/BYTECODE_BUNDLE.json'
with open(p) as f:
    data=json.load(f)
blocks=data['analysis_artifact']['artifact_json']['basic_blocks']
for b in blocks:
    if b['start_pc'] in (1118,1122,1136,1146,1157):
        print(b['start_pc'], b)
PY" in /tmp/codex-pt6tfdez succeeded in 29ms:
1118 {'end_pc': 1121, 'hash': '0x9100e3787343fb44edd1ab90f8209c56f81504f8910a3df0be4c0bea977b119d', 'opcodes': ['PUSH1', 'OP_80', 'REVERT'], 'start_pc': 1118}
1122 {'end_pc': 1134, 'hash': '0xcb960136f7250da09f9c5db631d13376ec221c622010138395384d9afded79cb', 'opcodes': ['JUMPDEST', 'POP', 'POP', 'POP', 'POP', 'POP', 'POP', 'POP', 'POP', 'POP', 'POP', 'POP', 'JUMP'], 'start_pc': 1122}
1136 {'end_pc': 1145, 'hash': '0xd60be06b06a837d443a1d76412e8c8d27d6a0890aff344e92e9742cc8b4116e8', 'opcodes': ['OP_A1', 'PUSH6', 'SHA3', 'JUMP'], 'start_pc': 1136}
1146 {'end_pc': 1156, 'hash': '0xf31e3253df7054cafbca7864ab5d1ea234e7c1f5a8f62d9d7e98908e3564e073', 'opcodes': ['OP_D4', 'OP_AD', 'TIMESTAMP', 'OP_D1', 'OP_2F', 'OP_A9', 'OP_D7', 'BLOCKHASH', 'OP_B1', 'OP_B0', 'JUMPI'], 'start_pc': 1146}
1157 {'end_pc': 1173, 'hash': '0x88266d71dc959b0959e3b6235d25ee5192908f4840eff8e19d1fdf07504702a2', 'opcodes': ['OP_B5', 'MSTORE', 'MSTORE8', 'PUSH12', 'PUSH11'], 'start_pc': 1157}


thinking
**Analyzing low-level calls and revert logic**

The calls check success without return data, with likely revert on failure, suggesting generic low-level calls. The target address might be constant but uncertain if it’s external or the contract itself, so marking risk medium for now; reconstructing call parameters and stack order will clarify this next.
thinking
**Identifying potential arbitrary external call with value**

The contract makes external calls with computed targets and value without detected access control or reentrancy guards, posing a medium-risk arbitrary call vulnerability if exposed. Missing ERC20 return data checks also appear but represent low severity without more context.
exec
/bin/bash -lc "python - <<'PY'
import json
p='/tmp/codex-pt6tfdez/BYTECODE_BUNDLE.json'
with open(p) as f:
    data=json.load(f)
print(data.keys())
PY" in /tmp/codex-pt6tfdez succeeded in 49ms:
dict_keys(['analysis_artifact', 'analysis_run', 'artifact', 'capability_graph', 'detector_findings', 'heuristics_summary'])

thinking
**Starting domain data inspection**
exec
/bin/bash -lc "python - <<'PY'
import json, textwrap
p='/tmp/codex-pt6tfdez/BYTECODE_BUNDLE.json'
with open(p) as f:
    data=json.load(f)
print('analysis_run keys', data['analysis_run'].keys())
print('artifact keys', data['artifact'].keys())
print('capability_graph keys', data['capability_graph'].keys())
PY" in /tmp/codex-pt6tfdez succeeded in 31ms:
analysis_run keys dict_keys(['address', 'block_number', 'chain_id', 'child_links', 'created_at', 'id', 'parent_links', 'status', 'updated_at'])
artifact keys dict_keys(['codehash', 'compiler_json', 'implementation_address', 'is_proxy', 'runtime_bytecode', 'verified_source'])
capability_graph keys dict_keys(['address', 'block_number', 'chain_id', 'codehash', 'created_at', 'graph_hash', 'graph_json', 'id', 'updated_at', 'version'])

thinking
**Inspecting graph_json structure**

I'm checking the keys and contents of graph_json to see if it overlaps with analysis_artifact's artifact_json or includes call paths relevant for the implementation.
exec
/bin/bash -lc "python - <<'PY'
import json
p='/tmp/codex-pt6tfdez/BYTECODE_BUNDLE.json'
with open(p) as f:
    data=json.load(f)
g=data['capability_graph']['graph_json']
print(g.keys())
print('nodes', len(g.get('nodes',[])), 'edges', len(g.get('edges',[])))
PY" in /tmp/codex-pt6tfdez succeeded in 26ms:
dict_keys(['edges', 'nodes', 'version'])
nodes 63 edges 60

thinking
**Confirming artifact proxy attribute**

I'm verifying if the top-level artifact object includes a proxy indicator like `is_proxy` to decide how it aligns with graph_json and its contents.
exec
/bin/bash -lc "python - <<'PY'
import json
p='/tmp/codex-pt6tfdez/BYTECODE_BUNDLE.json'
with open(p) as f:
    data=json.load(f)
print('is_proxy', data['artifact'].get('is_proxy'))
print('implementation_address', data['artifact'].get('implementation_address'))
PY" in /tmp/codex-pt6tfdez succeeded in 30ms:
is_proxy False
implementation_address None

thinking
**Identifying reentrancy risk around external calls**

I'm focusing on detecting low-level external calls with computed targets/values that might enable arbitrary calls or reentrancy, especially checking if state updates (SSTORE) happen after such calls within certain bytecode blocks to clarify the risk.
exec
/bin/bash -lc "python - <<'PY'
import json
p='/tmp/codex-pt6tfdez/BYTECODE_BUNDLE.json'
with open(p) as f:
    data=json.load(f)
blocks=data['analysis_artifact']['artifact_json']['basic_blocks']
for b in blocks:
    if 'SSTORE' in b['opcodes']:
        print(b['start_pc'], b['opcodes'])
PY" in /tmp/codex-pt6tfdez succeeded in 28ms:
1084 ['JUMPDEST', 'POP', 'PUSH1', 'OP_80', 'SLOAD', 'PUSH1', 'ADD', 'OP_81', 'SSTORE', 'OP_85', 'MLOAD', 'OP_81', 'OP_90', 'OP_81', 'OP_90', 'PUSH1', 'OP_89', 'ADD', 'OP_8A', 'OP_8C', 'GAS', 'CALL', 'OP_90', 'POP', 'OP_80', 'ISZERO', 'ISZERO', 'PUSH2', 'JUMPI']


thinking
**Assessing nuanced reentrancy risk**

The external call occurs before a state update, which may reduce reentrancy risk, but the lack of detected reentrancy guards and unchecked return data on the possibly arbitrary external call still suggests caution.
thinking
**Identifying multicall structure and access checks**

The contract appears to implement a multicall pattern with calldata parsing loops, likely executing calls inside a loop. Initial findings suggest an access control check around certain blocks may verify the caller’s authorization before processing these calls.
exec
/bin/bash -lc "python - <<'PY'
import json
p='/tmp/codex-pt6tfdez/BYTECODE_BUNDLE.json'
with open(p) as f:
    data=json.load(f)
blocks=data['analysis_artifact']['artifact_json']['basic_blocks']
for b in blocks:
    if b['start_pc'] in (494,500,514,540,546,571,583,589,596,600):
        print('\\n',b['start_pc'], b['opcodes'])
PY" in /tmp/codex-pt6tfdez succeeded in 25ms:

 494 ['JUMPDEST', 'PUSH1', 'SLOAD', 'OP_81', 'JUMP']

 500 ['JUMPDEST', 'PUSH1', 'OP_80', 'SLOAD', 'OP_82', 'OP_90', 'OP_81', 'LT', 'PUSH2', 'JUMPI']

 514 ['JUMPDEST', 'PUSH1', 'OP_91', 'OP_82', 'MSTORE', 'PUSH1', 'OP_90', 'OP_91', 'SHA3', 'ADD', 'SLOAD', 'PUSH1', 'PUSH1', 'PUSH1', 'EXP', 'SUB', 'AND', 'OP_90', 'POP', 'OP_81', 'JUMP']

 540 ['JUMPDEST', 'PUSH1', 'SLOAD', 'OP_81', 'JUMP']

 546 ['JUMPDEST', 'PUSH1', 'OP_80', 'PUSH1', 'OP_80', 'PUSH1', 'PUSH1', 'SLOAD', 'OP_8A', 'MLOAD', 'EQ', 'ISZERO', 'ISZERO', 'PUSH2', 'JUMPI']

 571 ['JUMPDEST', 'OP_88', 'MLOAD', 'OP_8A', 'MLOAD', 'EQ', 'OP_80', 'ISZERO', 'PUSH2', 'JUMPI']

 583 ['POP', 'OP_8A', 'MLOAD', 'OP_8A', 'MLOAD', 'EQ']

 589 ['JUMPDEST', 'ISZERO', 'ISZERO', 'PUSH2', 'JUMPI']

 596 ['PUSH1', 'OP_80', 'REVERT']

 600 ['JUMPDEST', 'PUSH1', 'OP_80', 'SLOAD', 'PUSH1', 'MLOAD', 'PUSH32', 'OP_80', 'OP_82', 'MSTORE', 'PUSH1', 'OP_82', 'ADD', 'OP_84', 'OP_90', 'MSTORE', 'ADDRESS', 'PUSH13', 'OP_81', 'OP_81', 'MUL', 'PUSH1', 'OP_85', 'ADD', 'MSTORE', 'PUSH1', 'PUSH1', 'PUSH1', 'EXP', 'SUB', 'OP_8E', 'AND', 'MUL', 'PUSH1', 'OP_84', 'ADD', 'MSTORE', 'PUSH1', 'OP_83', 'ADD', 'OP_8C', 'OP_90', 'MSTORE', 'OP_8A', 'MLOAD', 'OP_91', 'OP_94', 'OP_93', 'OP_90', 'OP_92', 'OP_8D', 'OP_92', 'OP_8D', 'OP_92', 'OP_8D', 'OP_92', 'OP_90', 'OP_91', 'PUSH1', 'OP_82', 'ADD', 'OP_90', 'PUSH1', 'OP_85', 'ADD', 'OP_90', 'OP_80', 'OP_83', 'OP_83']

thinking
**Analyzing unclear access control check**

The access control check uses storage and memory loads with equality and jump instructions, without obvious CALLER usage, which may explain why heuristics miss it; next is to search for CALLER opcode usage in the code to confirm caller-based guards.
exec
/bin/bash -lc "python - <<'PY'
import json
p='/tmp/codex-pt6tfdez/BYTECODE_BUNDLE.json'
with open(p) as f:
    data=json.load(f)
for b in data['analysis_artifact']['artifact_json']['basic_blocks']:
    if 'CALLER' in b['opcodes']:
        print('CALLER in block', b['start_pc'])
PY" in /tmp/codex-pt6tfdez succeeded in 24ms:


thinking
**Checking for tx.origin usage**
exec
/bin/bash -lc "python - <<'PY'
import json
p='/tmp/codex-pt6tfdez/BYTECODE_BUNDLE.json'
with open(p) as f:
    data=json.load(f)
for b in data['analysis_artifact']['artifact_json']['basic_blocks']:
    if 'ORIGIN' in b['opcodes']:
        print('ORIGIN in block', b['start_pc'])
PY" in /tmp/codex-pt6tfdez succeeded in 27ms:




thinking
**Assessing access control absence**

No CALLER or ORIGIN usage implies no access control, allowing anyone to call functions; combined with CALL to precompiles and ability to send ETH out, this creates a significant risk of fund loss, marking severity as medium to high depending on intended permissioning.
thinking
**Confirming payable fallback and unprotected calls**

The contract’s fallback is effectively payable since calls with calldata under 4 bytes skip revert, allowing it to hold ETH. The two identified CALLs have computed targets and values with no usage of CALLER or ORIGIN for access control, implying anyone can trigger arbitrary external calls potentially draining contract ETH. Severity is marked medium due to some uncertainty if call targets are user-controlled, but the lack of on-chain sender checks strongly raises risk.
thinking
**Producing JSON audit summary**

Generating JSON with two findings: one medium-severity access control issue for arbitrary external calls with computed target/value but uncertain target control, and one low-severity issue for unchecked return data on low-level calls; both include callsite evidence and conservative recommendations.
codex
{"no_findings":false,"summary":"Bytecode shows two low-level CALL sites with computed target/value and no detected sender-based guards; return-data is not validated. Evidence is bytecode-only and the call target may be constant (self) per validation, so impact depends on how these entrypoints are used.","findings":[{"severity":"medium","category":"access_control","title":"Externally reachable CALL with computed target/value (possible arbitrary execution/ETH transfer)","exploit_scenario":"If these CALL parameters are influenced by calldata and the entrypoint is publicly callable, an attacker can direct the contract to call arbitrary targets with the contract’s ETH balance, potentially draining funds or abusing approvals. Validation hints the target might be constant (self), so confirm whether the target/value are actually user-controlled before relying on this risk assessment.","recommendation":"Restrict who can invoke the external-call path (e.g., owner/role checks) or require verifiable authorization (signatures). If this is intended to be an executor, add an allowlist for targets and cap ETH value; document the trust model explicitly.","evidence":"Both callsites are CALL with target/value marked as computed and no guards detected; no CALLER/ORIGIN opcodes observed. Detector flagged “Untrusted CALL target/value reachable” and “ETH value transfer possible.” Validation trace suggests a constant target equal to the contract address, so this may be a false positive if the target is not actually user-controlled.","locations":["pc:971","pc:1108"]},{"severity":"low","category":"other","title":"Return data not validated for low-level CALLs","exploit_scenario":"If these CALLs interact with ERC20-like tokens that return false without reverting, the contract may treat the call as successful even though the token action failed, leading to accounting inconsistencies or stuck funds. If the CALLs are arbitrary, this may be acceptable but should be explicit.","recommendation":"When expecting ERC20-style semantics, enforce `success && (returndata.length == 0 || abi.decode(returndata, (bool)) == true)` or use a well-tested safe-call helper.","evidence":"Callsites list `returndata_checked: null`; success is checked only via the CALL result, with no return-data decoding in the call blocks.","locations":["pc:971","pc:1108"]}]}
tokens used
52,309
Metadata
{
    "codex": {
        "ran_at": "2026-01-22T07:36:24.644826+00:00",
        "returncode": 0
    },
    "project": {
        "mode": "bytecode",
        "bytecode_length": 2360,
        "bytecode_truncated": false,
        "capability_graph_present": true,
        "analysis_artifact_present": true
    },
    "summary": "Bytecode shows two low-level CALL sites with computed target/value and no detected sender-based guards; return-data is not validated. Evidence is bytecode-only and the call target may be constant (self) per validation, so impact depends on how these entrypoints are used.",
    "raw_final": {
        "summary": "Bytecode shows two low-level CALL sites with computed target/value and no detected sender-based guards; return-data is not validated. Evidence is bytecode-only and the call target may be constant (self) per validation, so impact depends on how these entrypoints are used.",
        "findings": [
            {
                "title": "Externally reachable CALL with computed target/value (possible arbitrary execution/ETH transfer)",
                "category": "access_control",
                "evidence": "Both callsites are CALL with target/value marked as computed and no guards detected; no CALLER/ORIGIN opcodes observed. Detector flagged \u201cUntrusted CALL target/value reachable\u201d and \u201cETH value transfer possible.\u201d Validation trace suggests a constant target equal to the contract address, so this may be a false positive if the target is not actually user-controlled.",
                "severity": "medium",
                "locations": [
                    "pc:971",
                    "pc:1108"
                ],
                "recommendation": "Restrict who can invoke the external-call path (e.g., owner/role checks) or require verifiable authorization (signatures). If this is intended to be an executor, add an allowlist for targets and cap ETH value; document the trust model explicitly.",
                "exploit_scenario": "If these CALL parameters are influenced by calldata and the entrypoint is publicly callable, an attacker can direct the contract to call arbitrary targets with the contract\u2019s ETH balance, potentially draining funds or abusing approvals. Validation hints the target might be constant (self), so confirm whether the target/value are actually user-controlled before relying on this risk assessment."
            },
            {
                "title": "Return data not validated for low-level CALLs",
                "category": "other",
                "evidence": "Callsites list `returndata_checked: null`; success is checked only via the CALL result, with no return-data decoding in the call blocks.",
                "severity": "low",
                "locations": [
                    "pc:971",
                    "pc:1108"
                ],
                "recommendation": "When expecting ERC20-style semantics, enforce `success && (returndata.length == 0 || abi.decode(returndata, (bool)) == true)` or use a well-tested safe-call helper.",
                "exploit_scenario": "If these CALLs interact with ERC20-like tokens that return false without reverting, the contract may treat the call as successful even though the token action failed, leading to accounting inconsistencies or stuck funds. If the CALLs are arbitrary, this may be acceptable but should be explicit."
            }
        ],
        "no_findings": false
    },
    "no_findings": false,
    "schema_version": 1
}

Opcode Heuristics

tool.cast_disasm
Delegatecall
0
Selfdestruct
0
CREATE2
0
CALL-family (heavy)
2
EXT*/BALANCE
0
Total opcodes
895
Flags
No heuristic flags raised.
View cast disassembly output
00000000: PUSH1 0x80
00000002: PUSH1 0x40
00000004: MSTORE
00000005: PUSH1 0x04
00000007: CALLDATASIZE
00000008: LT
00000009: PUSH2 0x0061
0000000c: JUMPI
0000000d: PUSH4 0xffffffff
00000012: PUSH29 0x0100000000000000000000000000000000000000000000000000000000
00000030: PUSH1 0x00
00000032: CALLDATALOAD
00000033: DIV
00000034: AND
00000035: PUSH4 0x42cde4e8
0000003a: DUP2
0000003b: EQ
0000003c: PUSH2 0x0063
0000003f: JUMPI
00000040: DUP1
00000041: PUSH4 0xaa5df9e2
00000046: EQ
00000047: PUSH2 0x008a
0000004a: JUMPI
0000004b: DUP1
0000004c: PUSH4 0xaffed0e0
00000051: EQ
00000052: PUSH2 0x00be
00000055: JUMPI
00000056: DUP1
00000057: PUSH4 0xf12d394f
0000005c: EQ
0000005d: PUSH2 0x00d3
00000060: JUMPI
00000061: JUMPDEST
00000062: STOP
00000063: JUMPDEST
00000064: CALLVALUE
00000065: DUP1
00000066: ISZERO
00000067: PUSH2 0x006f
0000006a: JUMPI
0000006b: PUSH1 0x00
0000006d: DUP1
0000006e: REVERT
0000006f: JUMPDEST
00000070: POP
00000071: PUSH2 0x0078
00000074: PUSH2 0x01ee
00000077: JUMP
00000078: JUMPDEST
00000079: PUSH1 0x40
0000007b: DUP1
0000007c: MLOAD
0000007d: SWAP2
0000007e: DUP3
0000007f: MSTORE
00000080: MLOAD
00000081: SWAP1
00000082: DUP2
00000083: SWAP1
00000084: SUB
00000085: PUSH1 0x20
00000087: ADD
00000088: SWAP1
00000089: RETURN
0000008a: JUMPDEST
0000008b: CALLVALUE
0000008c: DUP1
0000008d: ISZERO
0000008e: PUSH2 0x0096
00000091: JUMPI
00000092: PUSH1 0x00
00000094: DUP1
00000095: REVERT
00000096: JUMPDEST
00000097: POP
00000098: PUSH2 0x00a2
0000009b: PUSH1 0x04
0000009d: CALLDATALOAD
0000009e: PUSH2 0x01f4
000000a1: JUMP
000000a2: JUMPDEST
000000a3: PUSH1 0x40
000000a5: DUP1
000000a6: MLOAD
000000a7: PUSH1 0x01
000000a9: PUSH1 0xa0
000000ab: PUSH1 0x02
000000ad: EXP
000000ae: SUB
000000af: SWAP1
000000b0: SWAP3
000000b1: AND
000000b2: DUP3
000000b3: MSTORE
000000b4: MLOAD
000000b5: SWAP1
000000b6: DUP2
000000b7: SWAP1
000000b8: SUB
000000b9: PUSH1 0x20
000000bb: ADD
000000bc: SWAP1
000000bd: RETURN
000000be: JUMPDEST
000000bf: CALLVALUE
000000c0: DUP1
000000c1: ISZERO
000000c2: PUSH2 0x00ca
000000c5: JUMPI
000000c6: PUSH1 0x00
000000c8: DUP1
000000c9: REVERT
000000ca: JUMPDEST
000000cb: POP
000000cc: PUSH2 0x0078
000000cf: PUSH2 0x021c
000000d2: JUMP
000000d3: JUMPDEST
000000d4: CALLVALUE
000000d5: DUP1
000000d6: ISZERO
000000d7: PUSH2 0x00df
000000da: JUMPI
000000db: PUSH1 0x00
000000dd: DUP1
000000de: REVERT
000000df: JUMPDEST
000000e0: POP
000000e1: PUSH1 0x40
000000e3: DUP1
000000e4: MLOAD
000000e5: PUSH1 0x20
000000e7: PUSH1 0x04
000000e9: DUP1
000000ea: CALLDATALOAD
000000eb: DUP1
000000ec: DUP3
000000ed: ADD
000000ee: CALLDATALOAD
000000ef: DUP4
000000f0: DUP2
000000f1: MUL
000000f2: DUP1
000000f3: DUP7
000000f4: ADD
000000f5: DUP6
000000f6: ADD
000000f7: SWAP1
000000f8: SWAP7
000000f9: MSTORE
000000fa: DUP1
000000fb: DUP6
000000fc: MSTORE
000000fd: PUSH2 0x0061
00000100: SWAP6
00000101: CALLDATASIZE
00000102: SWAP6
00000103: SWAP4
00000104: SWAP5
00000105: PUSH1 0x24
00000107: SWAP5
00000108: SWAP4
00000109: DUP6
0000010a: ADD
0000010b: SWAP3
0000010c: SWAP2
0000010d: DUP3
0000010e: SWAP2
0000010f: DUP6
00000110: ADD
00000111: SWAP1
00000112: DUP5
00000113: SWAP1
00000114: DUP1
00000115: DUP3
00000116: DUP5
00000117: CALLDATACOPY
00000118: POP
00000119: POP
0000011a: PUSH1 0x40
0000011c: DUP1
0000011d: MLOAD
0000011e: DUP8
0000011f: CALLDATALOAD
00000120: DUP10
00000121: ADD
00000122: DUP1
00000123: CALLDATALOAD
00000124: PUSH1 0x20
00000126: DUP2
00000127: DUP2
00000128: MUL
00000129: DUP5
0000012a: DUP2
0000012b: ADD
0000012c: DUP3
0000012d: ADD
0000012e: SWAP1
0000012f: SWAP6
00000130: MSTORE
00000131: DUP2
00000132: DUP5
00000133: MSTORE
00000134: SWAP9
00000135: SWAP12
00000136: SWAP11
00000137: SWAP10
00000138: DUP10
00000139: ADD
0000013a: SWAP9
0000013b: SWAP3
0000013c: SWAP8
0000013d: POP
0000013e: SWAP1
0000013f: DUP3
00000140: ADD
00000141: SWAP6
00000142: POP
00000143: SWAP4
00000144: POP
00000145: DUP4
00000146: SWAP3
00000147: POP
00000148: DUP6
00000149: ADD
0000014a: SWAP1
0000014b: DUP5
0000014c: SWAP1
0000014d: DUP1
0000014e: DUP3
0000014f: DUP5
00000150: CALLDATACOPY
00000151: POP
00000152: POP
00000153: PUSH1 0x40
00000155: DUP1
00000156: MLOAD
00000157: DUP8
00000158: CALLDATALOAD
00000159: DUP10
0000015a: ADD
0000015b: DUP1
0000015c: CALLDATALOAD
0000015d: PUSH1 0x20
0000015f: DUP2
00000160: DUP2
00000161: MUL
00000162: DUP5
00000163: DUP2
00000164: ADD
00000165: DUP3
00000166: ADD
00000167: SWAP1
00000168: SWAP6
00000169: MSTORE
0000016a: DUP2
0000016b: DUP5
0000016c: MSTORE
0000016d: SWAP9
0000016e: SWAP12
0000016f: SWAP11
00000170: SWAP10
00000171: DUP10
00000172: ADD
00000173: SWAP9
00000174: SWAP3
00000175: SWAP8
00000176: POP
00000177: SWAP1
00000178: DUP3
00000179: ADD
0000017a: SWAP6
0000017b: POP
0000017c: SWAP4
0000017d: POP
0000017e: DUP4
0000017f: SWAP3
00000180: POP
00000181: DUP6
00000182: ADD
00000183: SWAP1
00000184: DUP5
00000185: SWAP1
00000186: DUP1
00000187: DUP3
00000188: DUP5
00000189: CALLDATACOPY
0000018a: POP
0000018b: POP
0000018c: PUSH1 0x40
0000018e: DUP1
0000018f: MLOAD
00000190: PUSH1 0x20
00000192: DUP9
00000193: DUP4
00000194: ADD
00000195: CALLDATALOAD
00000196: DUP11
00000197: ADD
00000198: DUP1
00000199: CALLDATALOAD
0000019a: PUSH1 0x1f
0000019c: DUP2
0000019d: ADD
0000019e: DUP4
0000019f: SWAP1
000001a0: DIV
000001a1: DUP4
000001a2: MUL
000001a3: DUP5
000001a4: ADD
000001a5: DUP4
000001a6: ADD
000001a7: SWAP1
000001a8: SWAP5
000001a9: MSTORE
000001aa: DUP4
000001ab: DUP4
000001ac: MSTORE
000001ad: SWAP8
000001ae: SWAP11
000001af: DUP10
000001b0: CALLDATALOAD
000001b1: PUSH1 0x01
000001b3: PUSH1 0xa0
000001b5: PUSH1 0x02
000001b7: EXP
000001b8: SUB
000001b9: AND
000001ba: SWAP11
000001bb: DUP11
000001bc: DUP4
000001bd: ADD
000001be: CALLDATALOAD
000001bf: SWAP11
000001c0: SWAP2
000001c1: SWAP10
000001c2: SWAP1
000001c3: SWAP9
000001c4: POP
000001c5: PUSH1 0x60
000001c7: SWAP1
000001c8: SWAP2
000001c9: ADD
000001ca: SWAP7
000001cb: POP
000001cc: SWAP2
000001cd: SWAP5
000001ce: POP
000001cf: SWAP1
000001d0: DUP2
000001d1: ADD
000001d2: SWAP3
000001d3: POP
000001d4: DUP2
000001d5: SWAP1
000001d6: DUP5
000001d7: ADD
000001d8: DUP4
000001d9: DUP3
000001da: DUP1
000001db: DUP3
000001dc: DUP5
000001dd: CALLDATACOPY
000001de: POP
000001df: SWAP5
000001e0: SWAP8
000001e1: POP
000001e2: PUSH2 0x0222
000001e5: SWAP7
000001e6: POP
000001e7: POP
000001e8: POP
000001e9: POP
000001ea: POP
000001eb: POP
000001ec: POP
000001ed: JUMP
000001ee: JUMPDEST
000001ef: PUSH1 0x01
000001f1: SLOAD
000001f2: DUP2
000001f3: JUMP
000001f4: JUMPDEST
000001f5: PUSH1 0x03
000001f7: DUP1
000001f8: SLOAD
000001f9: DUP3
000001fa: SWAP1
000001fb: DUP2
000001fc: LT
000001fd: PUSH2 0x0202
00000200: JUMPI
00000201: INVALID
00000202: JUMPDEST
00000203: PUSH1 0x00
00000205: SWAP2
00000206: DUP3
00000207: MSTORE
00000208: PUSH1 0x20
0000020a: SWAP1
0000020b: SWAP2
0000020c: KECCAK256
0000020d: ADD
0000020e: SLOAD
0000020f: PUSH1 0x01
00000211: PUSH1 0xa0
00000213: PUSH1 0x02
00000215: EXP
00000216: SUB
00000217: AND
00000218: SWAP1
00000219: POP
0000021a: DUP2
0000021b: JUMP
0000021c: JUMPDEST
0000021d: PUSH1 0x00
0000021f: SLOAD
00000220: DUP2
00000221: JUMP
00000222: JUMPDEST
00000223: PUSH1 0x00
00000225: DUP1
00000226: PUSH1 0x00
00000228: DUP1
00000229: PUSH1 0x00
0000022b: PUSH1 0x01
0000022d: SLOAD
0000022e: DUP11
0000022f: MLOAD
00000230: EQ
00000231: ISZERO
00000232: ISZERO
00000233: PUSH2 0x023b
00000236: JUMPI
00000237: PUSH1 0x00
00000239: DUP1
0000023a: REVERT
0000023b: JUMPDEST
0000023c: DUP9
0000023d: MLOAD
0000023e: DUP11
0000023f: MLOAD
00000240: EQ
00000241: DUP1
00000242: ISZERO
00000243: PUSH2 0x024d
00000246: JUMPI
00000247: POP
00000248: DUP11
00000249: MLOAD
0000024a: DUP11
0000024b: MLOAD
0000024c: EQ
0000024d: JUMPDEST
0000024e: ISZERO
0000024f: ISZERO
00000250: PUSH2 0x0258
00000253: JUMPI
00000254: PUSH1 0x00
00000256: DUP1
00000257: REVERT
00000258: JUMPDEST
00000259: PUSH1 0x00
0000025b: DUP1
0000025c: SLOAD
0000025d: PUSH1 0x40
0000025f: MLOAD
00000260: PUSH32 0x1900000000000000000000000000000000000000000000000000000000000000
00000281: DUP1
00000282: DUP3
00000283: MSTORE
00000284: PUSH1 0x01
00000286: DUP3
00000287: ADD
00000288: DUP5
00000289: SWAP1
0000028a: MSTORE
0000028b: ADDRESS
0000028c: PUSH13 0x01000000000000000000000000
0000029a: DUP2
0000029b: DUP2
0000029c: MUL
0000029d: PUSH1 0x02
0000029f: DUP6
000002a0: ADD
000002a1: MSTORE
000002a2: PUSH1 0x01
000002a4: PUSH1 0xa0
000002a6: PUSH1 0x02
000002a8: EXP
000002a9: SUB
000002aa: DUP15
000002ab: AND
000002ac: MUL
000002ad: PUSH1 0x16
000002af: DUP5
000002b0: ADD
000002b1: MSTORE
000002b2: PUSH1 0x2a
000002b4: DUP4
000002b5: ADD
000002b6: DUP13
000002b7: SWAP1
000002b8: MSTORE
000002b9: DUP11
000002ba: MLOAD
000002bb: SWAP2
000002bc: SWAP5
000002bd: SWAP4
000002be: SWAP1
000002bf: SWAP3
000002c0: DUP14
000002c1: SWAP3
000002c2: DUP14
000002c3: SWAP3
000002c4: DUP14
000002c5: SWAP3
000002c6: SWAP1
000002c7: SWAP2
000002c8: PUSH1 0x4a
000002ca: DUP3
000002cb: ADD
000002cc: SWAP1
000002cd: PUSH1 0x20
000002cf: DUP6
000002d0: ADD
000002d1: SWAP1
000002d2: DUP1
000002d3: DUP4
000002d4: DUP4
000002d5: JUMPDEST
000002d6: PUSH1 0x20
000002d8: DUP4
000002d9: LT
000002da: PUSH2 0x02f4
000002dd: JUMPI
000002de: DUP1
000002df: MLOAD
000002e0: DUP3
000002e1: MSTORE
000002e2: PUSH1 0x1f
000002e4: NOT
000002e5: SWAP1
000002e6: SWAP3
000002e7: ADD
000002e8: SWAP2
000002e9: PUSH1 0x20
000002eb: SWAP2
000002ec: DUP3
000002ed: ADD
000002ee: SWAP2
000002ef: ADD
000002f0: PUSH2 0x02d5
000002f3: JUMP
000002f4: JUMPDEST
000002f5: MLOAD
000002f6: DUP2
000002f7: MLOAD
000002f8: PUSH1 0x20
000002fa: SWAP4
000002fb: DUP5
000002fc: SUB
000002fd: PUSH2 0x0100
00000300: EXP
00000301: PUSH1 0x00
00000303: NOT
00000304: ADD
00000305: DUP1
00000306: NOT
00000307: SWAP1
00000308: SWAP3
00000309: AND
0000030a: SWAP2
0000030b: AND
0000030c: OR
0000030d: SWAP1
0000030e: MSTORE
0000030f: SWAP3
00000310: ADD
00000311: SWAP4
00000312: DUP5
00000313: MSTORE
00000314: POP
00000315: PUSH1 0x40
00000317: MLOAD
00000318: SWAP3
00000319: DUP4
0000031a: SWAP1
0000031b: SUB
0000031c: ADD
0000031d: SWAP1
0000031e: SWAP2
0000031f: KECCAK256
00000320: SWAP12
00000321: POP
00000322: PUSH1 0x00
00000324: SWAP11
00000325: POP
00000326: DUP11
00000327: SWAP10
00000328: POP
00000329: POP
0000032a: POP
0000032b: POP
0000032c: POP
0000032d: POP
0000032e: POP
0000032f: POP
00000330: JUMPDEST
00000331: PUSH1 0x01
00000333: SLOAD
00000334: DUP4
00000335: LT
00000336: ISZERO
00000337: PUSH2 0x043c
0000033a: JUMPI
0000033b: PUSH1 0x01
0000033d: DUP6
0000033e: DUP13
0000033f: DUP6
00000340: DUP2
00000341: MLOAD
00000342: DUP2
00000343: LT
00000344: ISZERO
00000345: ISZERO
00000346: PUSH2 0x034b
00000349: JUMPI
0000034a: INVALID
0000034b: JUMPDEST
0000034c: SWAP1
0000034d: PUSH1 0x20
0000034f: ADD
00000350: SWAP1
00000351: PUSH1 0x20
00000353: MUL
00000354: ADD
00000355: MLOAD
00000356: DUP13
00000357: DUP7
00000358: DUP2
00000359: MLOAD
0000035a: DUP2
0000035b: LT
0000035c: ISZERO
0000035d: ISZERO
0000035e: PUSH2 0x0363
00000361: JUMPI
00000362: INVALID
00000363: JUMPDEST
00000364: SWAP1
00000365: PUSH1 0x20
00000367: ADD
00000368: SWAP1
00000369: PUSH1 0x20
0000036b: MUL
0000036c: ADD
0000036d: MLOAD
0000036e: DUP13
0000036f: DUP8
00000370: DUP2
00000371: MLOAD
00000372: DUP2
00000373: LT
00000374: ISZERO
00000375: ISZERO
00000376: PUSH2 0x037b
00000379: JUMPI
0000037a: INVALID
0000037b: JUMPDEST
0000037c: PUSH1 0x20
0000037e: SWAP1
0000037f: DUP2
00000380: MUL
00000381: SWAP1
00000382: SWAP2
00000383: ADD
00000384: DUP2
00000385: ADD
00000386: MLOAD
00000387: PUSH1 0x40
00000389: DUP1
0000038a: MLOAD
0000038b: PUSH1 0x00
0000038d: DUP1
0000038e: DUP3
0000038f: MSTORE
00000390: DUP2
00000391: DUP6
00000392: ADD
00000393: DUP1
00000394: DUP5
00000395: MSTORE
00000396: SWAP8
00000397: SWAP1
00000398: SWAP8
00000399: MSTORE
0000039a: PUSH1 0xff
0000039c: SWAP1
0000039d: SWAP6
0000039e: AND
0000039f: DUP6
000003a0: DUP3
000003a1: ADD
000003a2: MSTORE
000003a3: PUSH1 0x60
000003a5: DUP6
000003a6: ADD
000003a7: SWAP4
000003a8: SWAP1
000003a9: SWAP4
000003aa: MSTORE
000003ab: PUSH1 0x80
000003ad: DUP5
000003ae: ADD
000003af: MSTORE
000003b0: SWAP1
000003b1: MLOAD
000003b2: PUSH1 0xa0
000003b4: DUP1
000003b5: DUP5
000003b6: ADD
000003b7: SWAP5
000003b8: SWAP3
000003b9: SWAP4
000003ba: PUSH1 0x1f
000003bc: NOT
000003bd: DUP4
000003be: ADD
000003bf: SWAP4
000003c0: SWAP1
000003c1: DUP4
000003c2: SWAP1
000003c3: SUB
000003c4: SWAP1
000003c5: SWAP2
000003c6: ADD
000003c7: SWAP2
000003c8: SWAP1
000003c9: DUP7
000003ca: GAS
000003cb: CALL
000003cc: ISZERO
000003cd: DUP1
000003ce: ISZERO
000003cf: PUSH2 0x03dc
000003d2: JUMPI
000003d3: RETURNDATASIZE
000003d4: PUSH1 0x00
000003d6: DUP1
000003d7: RETURNDATACOPY
000003d8: RETURNDATASIZE
000003d9: PUSH1 0x00
000003db: REVERT
000003dc: JUMPDEST
000003dd: POP
000003de: POP
000003df: POP
000003e0: PUSH1 0x20
000003e2: PUSH1 0x40
000003e4: MLOAD
000003e5: SUB
000003e6: MLOAD
000003e7: SWAP2
000003e8: POP
000003e9: DUP4
000003ea: PUSH1 0x01
000003ec: PUSH1 0xa0
000003ee: PUSH1 0x02
000003f0: EXP
000003f1: SUB
000003f2: AND
000003f3: DUP3
000003f4: PUSH1 0x01
000003f6: PUSH1 0xa0
000003f8: PUSH1 0x02
000003fa: EXP
000003fb: SUB
000003fc: AND
000003fd: GT
000003fe: DUP1
000003ff: ISZERO
00000400: PUSH2 0x0421
00000403: JUMPI
00000404: POP
00000405: PUSH1 0x01
00000407: PUSH1 0xa0
00000409: PUSH1 0x02
0000040b: EXP
0000040c: SUB
0000040d: DUP3
0000040e: AND
0000040f: PUSH1 0x00
00000411: SWAP1
00000412: DUP2
00000413: MSTORE
00000414: PUSH1 0x02
00000416: PUSH1 0x20
00000418: MSTORE
00000419: PUSH1 0x40
0000041b: SWAP1
0000041c: KECCAK256
0000041d: SLOAD
0000041e: PUSH1 0xff
00000420: AND
00000421: JUMPDEST
00000422: ISZERO
00000423: ISZERO
00000424: PUSH2 0x042c
00000427: JUMPI
00000428: PUSH1 0x00
0000042a: DUP1
0000042b: REVERT
0000042c: JUMPDEST
0000042d: DUP2
0000042e: SWAP4
0000042f: POP
00000430: DUP3
00000431: DUP1
00000432: PUSH1 0x01
00000434: ADD
00000435: SWAP4
00000436: POP
00000437: POP
00000438: PUSH2 0x0330
0000043b: JUMP
0000043c: JUMPDEST
0000043d: POP
0000043e: PUSH1 0x00
00000440: DUP1
00000441: SLOAD
00000442: PUSH1 0x01
00000444: ADD
00000445: DUP2
00000446: SSTORE
00000447: DUP6
00000448: MLOAD
00000449: DUP2
0000044a: SWAP1
0000044b: DUP2
0000044c: SWAP1
0000044d: PUSH1 0x20
0000044f: DUP10
00000450: ADD
00000451: DUP11
00000452: DUP13
00000453: GAS
00000454: CALL
00000455: SWAP1
00000456: POP
00000457: DUP1
00000458: ISZERO
00000459: ISZERO
0000045a: PUSH2 0x0462
0000045d: JUMPI
0000045e: PUSH1 0x00
00000460: DUP1
00000461: REVERT
00000462: JUMPDEST
00000463: POP
00000464: POP
00000465: POP
00000466: POP
00000467: POP
00000468: POP
00000469: POP
0000046a: POP
0000046b: POP
0000046c: POP
0000046d: POP
0000046e: JUMP
0000046f: STOP
00000470: LOG1
00000471: PUSH6 0x627a7a723058
00000478: KECCAK256
00000479: JUMP
0000047a: UNKNOWN(0xD4)
0000047b: UNKNOWN(0xAD)
0000047c: TIMESTAMP
0000047d: UNKNOWN(0xD1)
0000047e: UNKNOWN(0x2F)
0000047f: UNKNOWN(0xA9)
00000480: UNKNOWN(0xD7)
00000481: BLOCKHASH
00000482: UNKNOWN(0xB1)
00000483: UNKNOWN(0xB0)
00000484: JUMPI
00000485: UNKNOWN(0xB5)
00000486: MSTORE
00000487: MSTORE8
00000488: PUSH12 0xac06bb619395c1146c52699c
00000495: PUSH11

Findings

validated = confirmed for call sinks; sink observed for others
Severity Category Tool Title Confidence Validated Confirmed Details
high other detector Untrusted CALL target/value reachable 60 no no
view
trace_id: 0x6f434ea89b0e30f05177e1e88bd7a89b691a2833e2bea4c2d1811ea262fdf09b
call_targets: 0xd9b20cfed69e76acae3fa1c2ee1faafafcb41f55
target_varies: no
classification: constant_target
validation_json
{
    "sink": "CALL",
    "errors": 0,
    "status": "sink_reached",
    "attempts": 1,
    "trace_id": "0x6f434ea89b0e30f05177e1e88bd7a89b691a2833e2bea4c2d1811ea262fdf09b",
    "confirmed": false,
    "trace_mode": "callTracer",
    "call_targets": [
        "0xd9b20cfed69e76acae3fa1c2ee1faafafcb41f55"
    ],
    "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": "0x42cde4e8",
            "selector": "0x42cde4e8",
            "calldata_variants": [
                "0x42cde4e8",
                "0x42cde4e80000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xaa5df9e2",
            "selector": "0xaa5df9e2",
            "calldata_variants": [
                "0xaa5df9e2",
                "0xaa5df9e20000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xaffed0e0",
            "selector": "0xaffed0e0",
            "calldata_variants": [
                "0xaffed0e0",
                "0xaffed0e00000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xf12d394f",
            "selector": "0xf12d394f",
            "calldata_variants": [
                "0xf12d394f",
                "0xf12d394f0000000000000000000000000000000000000000000000000000000000000000"
            ]
        }
    ]
}
evidence_json
{
    "examples": [
        {
            "pc": 971,
            "opcode": "CALL",
            "returndata_checked": null,
            "value_expression_category": "computed",
            "target_expression_category": "computed"
        },
        {
            "pc": 1108,
            "opcode": "CALL",
            "returndata_checked": null,
            "value_expression_category": "computed",
            "target_expression_category": "computed"
        }
    ],
    "call_count": 2,
    "guards_detected": [],
    "untrusted_call_count": 2
}
high other detector ETH value transfer possible 55 no no
view
trace_id: 0x6f434ea89b0e30f05177e1e88bd7a89b691a2833e2bea4c2d1811ea262fdf09b
call_targets: 0xd9b20cfed69e76acae3fa1c2ee1faafafcb41f55
target_varies: no
classification: constant_target
validation_json
{
    "sink": "CALL",
    "errors": 0,
    "status": "sink_reached",
    "attempts": 1,
    "trace_id": "0x6f434ea89b0e30f05177e1e88bd7a89b691a2833e2bea4c2d1811ea262fdf09b",
    "confirmed": false,
    "trace_mode": "callTracer",
    "call_targets": [
        "0xd9b20cfed69e76acae3fa1c2ee1faafafcb41f55"
    ],
    "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": "0x42cde4e8",
            "selector": "0x42cde4e8",
            "calldata_variants": [
                "0x42cde4e8",
                "0x42cde4e80000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xaa5df9e2",
            "selector": "0xaa5df9e2",
            "calldata_variants": [
                "0xaa5df9e2",
                "0xaa5df9e20000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xaffed0e0",
            "selector": "0xaffed0e0",
            "calldata_variants": [
                "0xaffed0e0",
                "0xaffed0e00000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xf12d394f",
            "selector": "0xf12d394f",
            "calldata_variants": [
                "0xf12d394f",
                "0xf12d394f0000000000000000000000000000000000000000000000000000000000000000"
            ]
        }
    ]
}
evidence_json
{
    "examples": [
        {
            "pc": 971,
            "opcode": "CALL",
            "returndata_checked": null,
            "value_expression_category": "computed",
            "target_expression_category": "computed"
        },
        {
            "pc": 1108,
            "opcode": "CALL",
            "returndata_checked": null,
            "value_expression_category": "computed",
            "target_expression_category": "computed"
        }
    ],
    "eth_value_calls": 2,
    "guards_detected": []
}
medium access_control codex Externally reachable CALL with computed target/value (possible arbitrary execution/ETH transfer) 75 no
view
evidence_json
{
    "evidence": "Both callsites are CALL with target/value marked as computed and no guards detected; no CALLER/ORIGIN opcodes observed. Detector flagged \u201cUntrusted CALL target/value reachable\u201d and \u201cETH value transfer possible.\u201d Validation trace suggests a constant target equal to the contract address, so this may be a false positive if the target is not actually user-controlled.",
    "locations": [
        "pc:971",
        "pc:1108"
    ],
    "recommendation": "Restrict who can invoke the external-call path (e.g., owner/role checks) or require verifiable authorization (signatures). If this is intended to be an executor, add an allowlist for targets and cap ETH value; document the trust model explicitly.",
    "exploit_scenario": "If these CALL parameters are influenced by calldata and the entrypoint is publicly callable, an attacker can direct the contract to call arbitrary targets with the contract\u2019s ETH balance, potentially draining funds or abusing approvals. Validation hints the target might be constant (self), so confirm whether the target/value are actually user-controlled before relying on this risk assessment."
}
low other codex Return data not validated for low-level CALLs 65 no
view
evidence_json
{
    "evidence": "Callsites list `returndata_checked: null`; success is checked only via the CALL result, with no return-data decoding in the call blocks.",
    "locations": [
        "pc:971",
        "pc:1108"
    ],
    "recommendation": "When expecting ERC20-style semantics, enforce `success && (returndata.length == 0 || abi.decode(returndata, (bool)) == true)` or use a well-tested safe-call helper.",
    "exploit_scenario": "If these CALLs interact with ERC20-like tokens that return false without reverting, the contract may treat the call as successful even though the token action failed, leading to accounting inconsistencies or stuck funds. If the CALLs are arbitrary, this may be acceptable but should be explicit."
}