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

Analysis Run

019b3836-2cf4-7353-96b1-83115f1b65d9

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
Untrusted CALL target/value reachable
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
2013 artifact.fetch complete 1 / 3 3 months ago
2014 tool.cast_disasm complete 1 / 3 3 months ago
45344 analysis.bundle complete 1 / 3 1 week ago
45345 capability.graph complete 1 / 3 1 week ago
45346 detector.run complete 1 / 3 1 week ago
45347 validation.fork complete 1 / 3 1 week ago
113242 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
3
No findings?
no
Summary
Bytecode-only review of the bundle indicates a token-like contract with owner-gated admin paths, a payable fallback CALL, and a custom transferFrom allowance path. The most meaningful issues are a likely freeze/blacklist bypass for approved spenders, nonstandard allowance accounting that depends on a hidden spent ledger, and an unchecked low-level CALL in the fallback. Selector and slot naming are inferred from ERC20-like patterns and should be treated as best-effort.
View stdout
{"no_findings":false,"summary":"Bytecode-only review of the bundle indicates a token-like contract with owner-gated admin paths, a payable fallback CALL, and a custom transferFrom allowance path. The most meaningful issues are a likely freeze/blacklist bypass for approved spenders, nonstandard allowance accounting that depends on a hidden spent ledger, and an unchecked low-level CALL in the fallback. Selector and slot naming are inferred from ERC20-like patterns and should be treated as best-effort.","findings":[{"severity":"medium","category":"access_control","title":"Frozen/blacklisted spender can likely bypass restrictions through transferFrom","exploit_scenario":"If slot 6 is the freeze/blacklist mapping, an address marked there is blocked from direct transfers but can still move third-party funds via existing approvals. A spender that was blacklisted after users approved it can keep calling transferFrom and drain approved balances from unfrozen holders.","recommendation":"Apply the same freeze/blacklist check to CALLER inside the transferFrom path, and if the intended policy is stricter, also reject transfers to frozen recipients. Keep the enforcement consistent across transfer and transferFrom.","evidence":"Selector 0xb414d4b6 reads slot 6, and owner-gated selector 0xe724529c writes slot 6, so slot 6 is very likely an account-status mapping. In selector 0xa9059cbb, the transfer path checks slot6[CALLER] at pc 0x03cd-0x03e9. In selector 0x23b872dd, the transferFrom path checks slot6[from] at pc 0x05c4-0x05e7, while CALLER appears only later for allowance indexing at pc 0x05f4 onward. No equivalent slot6[CALLER] check is visible in transferFrom.","locations":["selector:0xa9059cbb","selector:0x23b872dd","selector:0xe724529c","selector:0xb414d4b6","pc:0x03cd","pc:0x05c4","pc:0x05f4"]},{"severity":"medium","category":"other","title":"Allowance accounting uses a separate spent ledger, so allowance() likely overstates remaining spendable approval","exploit_scenario":"Integrators or users can observe a nonzero allowance via allowance(owner,spender) and assume transferFrom should succeed, but the runtime also tracks a second nested mapping in slot 8 and gates transferFrom on both values. This creates non-ERC20 behavior that can break routers, vaults, and permit/approval workflows that rely on allowance() as the authoritative remaining approval.","recommendation":"Use standard ERC20 allowance semantics: decrement the allowance mapping consumed by transferFrom, and make allowance() return the actual remaining spendable amount. If a spent ledger is required, expose and document it clearly and avoid presenting slot 7 as the effective allowance.","evidence":"Selector 0x095ea7b3 writes only the nested mapping rooted at slot 7 at pc 0x0153-0x0168. Selector 0xdd62ed3e reads only the nested mapping rooted at slot 7 at pc 0x02d0-0x02ef. But selector 0x23b872dd also reads a second nested mapping rooted at slot 8 at pc 0x060f-0x061d and later increments that slot-8 mapping at pc 0x0689-0x06d3, while no matching decrement of slot 7 is visible in transferFrom. Exact comparator direction is somewhat uncertain from bytecode alone, but the separate spent-ledger design is clear.","locations":["selector:0x095ea7b3","selector:0xdd62ed3e","selector:0x23b872dd","selector:0xdc3080f2","pc:0x0168","pc:0x02ee","pc:0x060f","pc:0x061d","pc:0x0689","pc:0x06d3"]},{"severity":"low","category":"other","title":"Fallback exposes an unchecked low-level CALL with ETH value","exploit_scenario":"A plain ETH transfer or unknown-selector call reaches the fallback and executes a CALL at pc 0x00d5. Because the return value is discarded, a failing external call does not revert. This can silently strand ETH in the contract or trigger unexpected code execution in the external callee without any explicit success handling.","recommendation":"Avoid performing low-level CALL from the fallback. If forwarding ETH is intentional, require success explicitly and consider a dedicated withdraw/forward function with clear access control and event logging.","evidence":"The fallback entry starts at pc 0x00b9 and reaches CALL at pc 0x00d5. The bundle's detector findings confirm a reachable CALL with nonzero ETH value potential at pc 213, and no auth guards were detected heuristically. The CALL result is immediately POPed, so success is unchecked. The other detected CALL at pc 0x0372 is the common identity-precompile helper for dynamic string returns and is not reported here as an untrusted external call.","locations":["pc:0x00b9","pc:0x00d5"]}]}
View stderr
OpenAI Codex v0.118.0 (research preview)
--------
workdir: /tmp/codex-c7vtos52
model: gpt-5.4
provider: openai
approval: never
sandbox: read-only
reasoning effort: high
reasoning summaries: none
session id: 019d5b86-01d8-7543-b7fb-b539faf31375
--------
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 && rg --files' in /tmp/codex-c7vtos52
 succeeded in 0ms:
/tmp/codex-c7vtos52
codex-output-schema.json
BYTECODE_BUNDLE.json

  → Inspect bundle and available analysis artifacts
  • Assess bytecode evidence for concrete security findings
  • Produce JSON report matching schema
exec
/bin/bash -lc "sed -n '1,220p' BYTECODE_BUNDLE.json" in /tmp/codex-c7vtos52
 succeeded in 0ms:
{
  "analysis_artifact": {
    "address": "0x1f75047233517dcf67970d9e3c3bb385cb647f30",
    "artifact_hash": "0x301f34ab226fe5904f143c9786dfaaae0ea4b615902d9b939bf8839220f9ee5b",
    "artifact_json": {
      "auth": {
        "guards": []
      },
      "basic_blocks": [
        {
          "end_pc": 10,
          "hash": "0xde7c09ec5c6a787330be3474c14e6af1d95d255c64d4de8caa7d39b964000ee7",
          "opcodes": [
            "PUSH1",
            "PUSH1",
            "MSTORE",
            "CALLDATASIZE",
            "ISZERO",
            "PUSH2",
            "JUMPI"
          ],
          "start_pc": 0
        },
        {
          "end_pc": 30,
          "hash": "0xaa8508e79922bef88de7680412ebb93d9b8132af38a790d94ddd35af4ee3a037",
          "opcodes": [
            "PUSH1",
            "PUSH1",
            "EXP",
            "PUSH1",
            "CALLDATALOAD",
            "DIV",
            "PUSH4",
            "OP_81",
            "EQ",
            "PUSH2",
            "JUMPI"
          ],
          "start_pc": 11
        },
        {
          "end_pc": 41,
          "hash": "0xa56f4f96be79fa212ef2ab51072b3a1d063fbc25670a3086bd76227480e9ec9a",
          "opcodes": [
            "OP_80",
            "PUSH4",
            "EQ",
            "PUSH2",
            "JUMPI"
          ],
          "start_pc": 31
        },
        {
          "end_pc": 52,
          "hash": "0xdcc0cfc78164b28a048e1018c78fb1e258688e4e9dbc32fe6bb71fdddfe9fb4c",
          "opcodes": [
            "OP_80",
            "PUSH4",
            "EQ",
            "PUSH2",
            "JUMPI"
          ],
          "start_pc": 42
        },
        {
          "end_pc": 63,
          "hash": "0xe5407ecad732c0e22d131e81a5f4ad7969b4a0da0db55cdac8b2b03eab611fc0",
          "opcodes": [
            "OP_80",
            "PUSH4",
            "EQ",
            "PUSH2",
            "JUMPI"
          ],
          "start_pc": 53
        },
        {
          "end_pc": 74,
          "hash": "0x6718e6e9c96250aa33193f2b60d68e2742d3a1e4b04aadbd49640f97508de1aa",
          "opcodes": [
            "OP_80",
            "PUSH4",
            "EQ",
            "PUSH2",
            "JUMPI"
          ],
          "start_pc": 64
        },
        {
          "end_pc": 85,
          "hash": "0x548805c0c54507e41d3b0919d310d4eca0ef980fa4cb4aa8a54d66f6ada4014f",
          "opcodes": [
            "OP_80",
            "PUSH4",
            "EQ",
            "PUSH2",
            "JUMPI"
          ],
          "start_pc": 75
        },
        {
          "end_pc": 96,
          "hash": "0xee796bec83d7680c6d5e37104b770091abb8695ea260229becf257f558a226d1",
          "opcodes": [
            "OP_80",
            "PUSH4",
            "EQ",
            "PUSH2",
            "JUMPI"
          ],
          "start_pc": 86
        },
        {
          "end_pc": 107,
          "hash": "0xda315755efcd32c213ef4d4252640668a3a6cba263b9dad6678e67516412e041",
          "opcodes": [
            "OP_80",
            "PUSH4",
            "EQ",
            "PUSH2",
            "JUMPI"
          ],
          "start_pc": 97
        },
        {
          "end_pc": 118,
          "hash": "0xd14af00a8a087ebec347301845bc0f8614855f78850bf217ade6b32d0e38f52d",
          "opcodes": [
            "OP_80",
            "PUSH4",
            "EQ",
            "PUSH2",
            "JUMPI"
          ],
          "start_pc": 108
        },
        {
          "end_pc": 129,
          "hash": "0xa9baa763d900f8bfff962700a80b0550b7184aaca095b16d10dda4cec77d1b48",
          "opcodes": [
            "OP_80",
            "PUSH4",
            "EQ",
            "PUSH2",
            "JUMPI"
          ],
          "start_pc": 119
        },
        {
          "end_pc": 140,
          "hash": "0xa299ccddb8de0f17a25781b649b758ae14910bd00f495423675728a24a8d768d",
          "opcodes": [
            "OP_80",
            "PUSH4",
            "EQ",
            "PUSH2",
            "JUMPI"
          ],
          "start_pc": 130
        },
        {
          "end_pc": 151,
          "hash": "0x21fdc1d971a2e18be50daa0087e63eab91d0f96ebb4895db0ca7b698931575da",
          "opcodes": [
            "OP_80",
            "PUSH4",
            "EQ",
            "PUSH2",
            "JUMPI"
          ],
          "start_pc": 141
        },
        {
          "end_pc": 162,
          "hash": "0x310188ec5b25938c0b92d363d8d70ad61162a66124f977dd22976927e40da768",
          "opcodes": [
            "OP_80",
            "PUSH4",
            "EQ",
            "PUSH2",
            "JUMPI"
          ],
          "start_pc": 152
        },
        {
          "end_pc": 173,
          "hash": "0x48f9a852645c327fe40f2536f4984fafd316c90f47c5b073a1063c969140bbb4",
          "opcodes": [
            "OP_80",
            "PUSH4",
            "EQ",
            "PUSH2",
            "JUMPI"
          ],
          "start_pc": 163
        },
        {
          "end_pc": 184,
          "hash": "0xb97ac4841982eefdf983a0ae476963f01abe60dbf1702ba0f1886ccfa8446afa",
          "opcodes": [
            "OP_80",
            "PUSH4",
            "EQ",
            "PUSH2",
            "JUMPI"
          ],
          "start_pc": 174
        },
        {
          "end_pc": 219,
          "hash": "0xc2961cacd589158b1d2c8a7a510c2a261c2b7885b8b0e19031153a9500c48a87",
          "opcodes": [
            "JUMPDEST",
            "PUSH2",
            "PUSH1",
            "OP_80",
            "SLOAD",
            "PUSH1",
            "PUSH1",

exec
/bin/bash -lc "sed -n '1,220p' codex-output-schema.json" in /tmp/codex-c7vtos52
 succeeded in 0ms:
{"type": "object", "additionalProperties": false, "required": ["no_findings", "summary", "findings"], "properties": {"no_findings": {"type": "boolean"}, "summary": {"type": "string"}, "findings": {"type": "array", "items": {"type": "object", "additionalProperties": false, "required": ["severity", "category", "title", "evidence", "locations", "exploit_scenario", "recommendation"], "properties": {"severity": {"type": "string", "enum": ["info", "low", "medium", "high", "critical"]}, "category": {"type": "string", "enum": ["access_control", "reentrancy", "math", "oracle", "upgradeability", "auth", "other"]}, "title": {"type": "string"}, "exploit_scenario": {"type": "string"}, "recommendation": {"type": "string"}, "evidence": {"type": "string"}, "locations": {"type": "array", "items": {"type": "string"}}}}}}}
exec
/bin/bash -lc "jq 'keys' BYTECODE_BUNDLE.json" in /tmp/codex-c7vtos52
 succeeded in 0ms:
[
  "analysis_artifact",
  "analysis_run",
  "artifact",
  "capability_graph",
  "detector_findings",
  "heuristics_summary"
]

exec
/bin/bash -lc "jq '.analysis_artifact.artifact_json | keys' BYTECODE_BUNDLE.json" in /tmp/codex-c7vtos52
 succeeded in 0ms:
[
  "auth",
  "basic_blocks",
  "callsites",
  "cfg_edges",
  "cfg_hash",
  "dispatcher_type",
  "function_entries",
  "functions",
  "selectors",
  "sinks",
  "storage",
  "version"
]

exec
/bin/bash -lc "jq '.analysis_artifact.artifact_json.detector_findings' BYTECODE_BUNDLE.json" in /tmp/codex-c7vtos52
 succeeded in 0ms:
null

exec
/bin/bash -lc "jq '.detector_findings' BYTECODE_BUNDLE.json" in /tmp/codex-c7vtos52
 succeeded in 0ms:
[
  {
    "confidence": 60,
    "evidence_json": {
      "call_count": 2,
      "examples": [
        {
          "opcode": "CALL",
          "pc": 213,
          "returndata_checked": null,
          "target_expression_category": "computed",
          "value_expression_category": "computed"
        },
        {
          "opcode": "CALL",
          "pc": 882,
          "returndata_checked": null,
          "target_expression_category": "computed",
          "value_expression_category": "computed"
        }
      ],
      "guards_detected": [],
      "untrusted_call_count": 2
    },
    "normalized_json": {
      "sink": "CALL"
    },
    "severity": "high",
    "title": "Untrusted CALL target/value reachable",
    "validated": true,
    "validation_json": {
      "attempts": 1,
      "call_targets": [
        "0x0000000000000000000000000000000000000004",
        "0x1f75047233517dcf67970d9e3c3bb385cb647f30"
      ],
      "classification": "target_varies",
      "confirmed": true,
      "errors": 0,
      "matched_probe": null,
      "sink": "CALL",
      "status": "confirmed",
      "target_varies": true,
      "trace_id": "0x27530d797743a09ac645a3bec8313b46b16b19c509b18f0cbcc1ccebe88df009",
      "trace_mode": "callTracer"
    }
  },
  {
    "confidence": 55,
    "evidence_json": {
      "eth_value_calls": 2,
      "examples": [
        {
          "opcode": "CALL",
          "pc": 213,
          "returndata_checked": null,
          "target_expression_category": "computed",
          "value_expression_category": "computed"
        },
        {
          "opcode": "CALL",
          "pc": 882,
          "returndata_checked": null,
          "target_expression_category": "computed",
          "value_expression_category": "computed"
        }
      ],
      "guards_detected": []
    },
    "normalized_json": {
      "sink": "CALL",
      "value": "nonzero"
    },
    "severity": "high",
    "title": "ETH value transfer possible",
    "validated": true,
    "validation_json": {
      "attempts": 1,
      "call_targets": [
        "0x0000000000000000000000000000000000000004",
        "0x1f75047233517dcf67970d9e3c3bb385cb647f30"
      ],
      "classification": "target_varies",
      "confirmed": true,
      "errors": 0,
      "matched_probe": null,
      "sink": "CALL",
      "status": "confirmed",
      "target_varies": true,
      "trace_id": "0x27530d797743a09ac645a3bec8313b46b16b19c509b18f0cbcc1ccebe88df009",
      "trace_mode": "callTracer"
    }
  }
]

exec
/bin/bash -lc "jq '.heuristics_summary' BYTECODE_BUNDLE.json" in /tmp/codex-c7vtos52
 succeeded in 0ms:
{
  "create2_count": 0,
  "delegatecall_count": 0,
  "flags": [],
  "selfdestruct_count": 0
}

exec
/bin/bash -lc "jq '.analysis_artifact.artifact_json.selectors' BYTECODE_BUNDLE.json" in /tmp/codex-c7vtos52
 succeeded in 0ms:
[
  "0x06fdde03",
  "0x095ea7b3",
  "0x18160ddd",
  "0x23b872dd",
  "0x313ce567",
  "0x70a08231",
  "0x79c65068",
  "0x8da5cb5b",
  "0x95d89b41",
  "0xa9059cbb",
  "0xb414d4b6",
  "0xdc3080f2",
  "0xdd62ed3e",
  "0xe724529c",
  "0xf2fde38b"
]

exec
/bin/bash -lc "jq '.analysis_artifact.artifact_json.function_entries' BYTECODE_BUNDLE.json" in /tmp/codex-c7vtos52
 succeeded in 0ms:
[
  {
    "entry_pc": null,
    "selector": "0x06fdde03"
  },
  {
    "entry_pc": 404098525,
    "selector": "0x095ea7b3"
  },
  {
    "entry_pc": 599290589,
    "selector": "0x18160ddd"
  },
  {
    "entry_pc": 826074471,
    "selector": "0x23b872dd"
  },
  {
    "entry_pc": 1889567281,
    "selector": "0x313ce567"
  },
  {
    "entry_pc": 2043039848,
    "selector": "0x70a08231"
  },
  {
    "entry_pc": 2376452955,
    "selector": "0x79c65068"
  },
  {
    "entry_pc": 2514000705,
    "selector": "0x8da5cb5b"
  },
  {
    "entry_pc": 2835717307,
    "selector": "0x95d89b41"
  },
  {
    "entry_pc": 3021264054,
    "selector": "0xa9059cbb"
  },
  {
    "entry_pc": 3694166258,
    "selector": "0xb414d4b6"
  },
  {
    "entry_pc": 3714247998,
    "selector": "0xdc3080f2"
  },
  {
    "entry_pc": 3877917340,
    "selector": "0xdd62ed3e"
  },
  {
    "entry_pc": 4076725131,
    "selector": "0xe724529c"
  },
  {
    "entry_pc": 826,
    "selector": "0xf2fde38b"
  }
]

exec
/bin/bash -lc "jq '.analysis_artifact.artifact_json.callsites' BYTECODE_BUNDLE.json" in /tmp/codex-c7vtos52
 succeeded in 0ms:
[
  {
    "opcode": "CALL",
    "pc": 213,
    "returndata_checked": null,
    "target_expression_category": "computed",
    "value_expression_category": "computed"
  },
  {
    "opcode": "CALL",
    "pc": 882,
    "returndata_checked": null,
    "target_expression_category": "computed",
    "value_expression_category": "computed"
  }
]

exec
/bin/bash -lc "jq '.analysis_artifact.artifact_json.storage' BYTECODE_BUNDLE.json" in /tmp/codex-c7vtos52
 succeeded in 0ms:
{
  "keccak_count": 27,
  "reads": 34,
  "slots": [
    {
      "op": "SLOAD",
      "pc": 192,
      "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
    },
    {
      "op": "SLOAD",
      "pc": 227,
      "slot": "0x0000000000000000000000000000000000000000000000000000000000000001"
    },
    {
      "op": "SLOAD",
      "pc": 298,
      "slot": "0x0000000000000000000000000000000000000000000000000000000000000100"
    },
    {
      "op": "SLOAD",
      "pc": 377,
      "slot": "0x0000000000000000000000000000000000000000000000000000000000000004"
    },
    {
      "op": "SLOAD",
      "pc": 436,
      "slot": "0x0000000000000000000000000000000000000000000000000000000000000003"
    },
    {
      "op": "SLOAD",
      "pc": 478,
      "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
    },
    {
      "op": "SLOAD",
      "pc": 508,
      "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
    },
    {
      "op": "SLOAD",
      "pc": 527,
      "slot": "0x0000000000000000000000000000000000000000000000000000000000000002"
    },
    {
      "op": "SLOAD",
      "pc": 595,
      "slot": "0x0000000000000000000000000000000000000000000000000000000000000100"
    },
    {
      "op": "SLOAD",
      "pc": 769,
      "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
    },
    {
      "op": "SLOAD",
      "pc": 802,
      "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
    },
    {
      "op": "SLOAD",
      "pc": 1220,
      "slot": "0x0000000000000000000000000000000000000000000000000000000000000004"
    },
    {
      "op": "SLOAD",
      "pc": 1364,
      "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
    }
  ],
  "writes": 10
}

exec
/bin/bash -lc "jq '.analysis_artifact.artifact_json.sinks' BYTECODE_BUNDLE.json" in /tmp/codex-c7vtos52
 succeeded in 0ms:
{
  "call": 2,
  "create": 0,
  "create2": 0,
  "delegatecall": 0,
  "selfdestruct": 0,
  "staticcall": 0,
  "upgrade_slot_write_suspected": false
}

exec
/bin/bash -lc "jq '.artifact | keys' BYTECODE_BUNDLE.json" in /tmp/codex-c7vtos52
 succeeded in 0ms:
[
  "codehash",
  "compiler_json",
  "implementation_address",
  "is_proxy",
  "runtime_bytecode",
  "verified_source"
]

exec
/bin/bash -lc "jq '.capability_graph' BYTECODE_BUNDLE.json" in /tmp/codex-c7vtos52
 succeeded in 0ms:
{
  "address": "0x1f75047233517dcf67970d9e3c3bb385cb647f30",
  "block_number": null,
  "chain_id": 1,
  "codehash": "0x0eb138bc38c67222d8de28a094f9e17c26c2137d32d89eac929c4be867a60566",
  "created_at": "2026-04-04T19:53:20.000000Z",
  "graph_hash": "0xede43ad6006962d7ef08e96b1ef3628c751fab0a7a5245418748d5628608de35",
  "graph_json": {
    "edges": [
      {
        "from": "bb:0",
        "to": "bb:185",
        "type": "control_flow"
      },
      {
        "from": "bb:0",
        "to": "bb:11",
        "type": "control_flow_fallthrough"
      },
      {
        "from": "bb:11",
        "to": "bb:220",
        "type": "control_flow"
      },
      {
        "from": "bb:11",
        "to": "bb:31",
        "type": "control_flow_fallthrough"
      },
      {
        "from": "bb:31",
        "to": "bb:312",
        "type": "control_flow"
      },
      {
        "from": "bb:31",
        "to": "bb:42",
        "type": "control_flow_fallthrough"
      },
      {
        "from": "bb:42",
        "to": "bb:371",
        "type": "control_flow"
      },
      {
        "from": "bb:42",
        "to": "bb:53",
        "type": "control_flow_fallthrough"
      },
      {
        "from": "bb:53",
        "to": "bb:380",
        "type": "control_flow"
      },
      {
        "from": "bb:53",
        "to": "bb:64",
        "type": "control_flow_fallthrough"
      },
      {
        "from": "bb:64",
        "to": "bb:430",
        "type": "control_flow"
      },
      {
        "from": "bb:64",
        "to": "bb:75",
        "type": "control_flow_fallthrough"
      },
      {
        "from": "bb:75",
        "to": "bb:442",
        "type": "control_flow"
      },
      {
        "from": "bb:75",
        "to": "bb:86",
        "type": "control_flow_fallthrough"
      },
      {
        "from": "bb:86",
        "to": "bb:466",
        "type": "control_flow"
      },
      {
        "from": "bb:86",
        "to": "bb:97",
        "type": "control_flow_fallthrough"
      },
      {
        "from": "bb:97",
        "to": "bb:502",
        "type": "control_flow"
      },
      {
        "from": "bb:97",
        "to": "bb:108",
        "type": "control_flow_fallthrough"
      },
      {
        "from": "bb:108",
        "to": "bb:520",
        "type": "control_flow"
      },
      {
        "from": "bb:108",
        "to": "bb:119",
        "type": "control_flow_fallthrough"
      },
      {
        "from": "bb:119",
        "to": "bb:609",
        "type": "control_flow"
      },
      {
        "from": "bb:119",
        "to": "bb:130",
        "type": "control_flow_fallthrough"
      },
      {
        "from": "bb:130",
        "to": "bb:656",
        "type": "control_flow"
      },
      {
        "from": "bb:130",
        "to": "bb:141",
        "type": "control_flow_fallthrough"
      },
      {
        "from": "bb:141",
        "to": "bb:683",
        "type": "control_flow"
      },
      {
        "from": "bb:141",
        "to": "bb:152",
        "type": "control_flow_fallthrough"
      },
      {
        "from": "bb:152",
        "to": "bb:720",
        "type": "control_flow"
      },
      {
        "from": "bb:152",
        "to": "bb:163",
        "type": "control_flow_fallthrough"
      },
      {
        "from": "bb:163",
        "to": "bb:757",
        "type": "control_flow"
      },
      {
        "from": "bb:163",
        "to": "bb:174",
        "type": "control_flow_fallthrough"
      },
      {
        "from": "bb:174",
        "to": "bb:793",
        "type": "control_flow"
      },
      {
        "from": "bb:174",
        "to": "bb:185",
        "type": "control_flow_fallthrough"
      },
      {
        "from": "bb:220",
        "to": "bb:1437",
        "type": "control_flow"
      },
      {
        "from": "bb:220",
        "to": "bb:285",
        "type": "control_flow_fallthrough"
      },
      {
        "from": "bb:285",
        "to": "bb:1394",
        "type": "control_flow"
      },
      {
        "from": "bb:285",
        "to": "bb:293",
        "type": "control_flow_fallthrough"
      },
      {
        "from": "bb:293",
        "to": "bb:1437",
        "type": "control_flow"
      },
      {
        "from": "bb:312",
        "to": "bb:361",
        "type": "control_flow_fallthrough"
      },
      {
        "from": "bb:380",
        "to": "bb:1445",
        "type": "control_flow"
      },
      {
        "from": "bb:380",
        "to": "bb:426",
        "type": "control_flow_fallthrough"
      },
      {
        "from": "bb:466",
        "to": "bb:1183",
        "type": "control_flow"
      },
      {
        "from": "bb:466",
        "to": "bb:498",
        "type": "control_flow_fallthrough"
      },
      {
        "from": "bb:520",
        "to": "bb:1437",
        "type": "control_flow"
      },
      {
        "from": "bb:520",
        "to": "bb:582",
        "type": "control_flow_fallthrough"
      },
      {
        "from": "bb:582",
        "to": "bb:1394",
        "type": "control_flow"
      },
      {
        "from": "bb:582",
        "to": "bb:590",
        "type": "control_flow_fallthrough"
      },
      {
        "from": "bb:590",
        "to": "bb:1437",
        "type": "control_flow"
      },
      {
        "from": "bb:609",
        "to": "bb:938",
        "type": "control_flow"
      },
      {
        "from": "bb:609",
        "to": "bb:652",
        "type": "control_flow_fallthrough"
      },
      {
        "from": "bb:757",
        "to": "bb:1275",
        "type": "control_flow"
      },
      {
        "from": "bb:757",
        "to": "bb:789",
        "type": "control_flow_fallthrough"
      },
      {
        "from": "bb:793",
        "to": "bb:1360",
        "type": "control_flow"
      },
      {
        "from": "bb:793",
        "to": "bb:822",
        "type": "control_flow_fallthrough"
      },
      {
        "from": "bb:828",
        "to": "bb:924",
        "type": "control_flow"
      },
      {
        "from": "bb:828",
        "to": "bb:899",
        "type": "control_flow_fallthrough"
      },
      {
        "from": "bb:899",
        "to": "bb:924",
        "type": "control_flow_fallthrough"
      },
      {
        "from": "bb:938",
        "to": "bb:972",
        "type": "control_flow"
      },
      {
        "from": "bb:938",
        "to": "bb:968",
        "type": "control_flow_fallthrough"
      },
      {
        "from": "bb:972",
        "to": "bb:1010",
        "type": "control_flow"
      },
      {
        "from": "bb:972",
        "to": "bb:1006",
        "type": "control_flow_fallthrough"
      },
      {
        "from": "bb:1394",
        "to": "bb:1408",
        "type": "control_flow_fallthrough"
      },
      {
        "from": "bb:1408",
        "to": "bb:1408",
        "type": "control_flow"
      },
      {
        "from": "bb:1408",
        "to": "bb:1428",
        "type": "control_flow_fallthrough"
      },
      {
        "from": "bb:1428",
        "to": "bb:1437",
        "type": "control_flow_fallthrough"
      },
      {
        "from": "bb:1445",
        "to": "bb:1476",
        "type": "control_flow"
      },
      {
        "from": "bb:1445",
        "to": "bb:1472",
        "type": "control_flow_fallthrough"
      },
      {
        "from": "bb:1476",
        "to": "bb:1511",
        "type": "control_flow"
      },
      {
        "from": "bb:1476",
        "to": "bb:1507",
        "type": "control_flow_fallthrough"
      },
      {
        "from": "bb:1511",
        "to": "bb:1578",
        "type": "control_flow"
      },
      {
        "from": "bb:1511",
        "to": "bb:1574",
        "type": "control_flow_fallthrough"
      },
      {
        "from": "fn:0x095ea7b3",
        "to": "bb:404098525",
        "type": "entry"
      },
      {
        "from": "fn:0x18160ddd",
        "to": "bb:599290589",
        "type": "entry"
      },
      {
        "from": "fn:0x23b872dd",
        "to": "bb:826074471",
        "type": "entry"
      },
      {
        "from": "fn:0x313ce567",
        "to": "bb:1889567281",
        "type": "entry"
      },
      {
        "from": "fn:0x70a08231",
        "to": "bb:2043039848",
        "type": "entry"
      },
      {
        "from": "fn:0x79c65068",
        "to": "bb:2376452955",
        "type": "entry"
      },
      {
        "from": "fn:0x8da5cb5b",
        "to": "bb:2514000705",
        "type": "entry"
      },
      {
        "from": "fn:0x95d89b41",
        "to": "bb:2835717307",
        "type": "entry"
      },
      {
        "from": "fn:0xa9059cbb",
        "to": "bb:3021264054",
        "type": "entry"
      },
      {
        "from": "fn:0xb414d4b6",
        "to": "bb:3694166258",
        "type": "entry"
      },
      {
        "from": "fn:0xdc3080f2",
        "to": "bb:3714247998",
        "type": "entry"
      },
      {
        "from": "fn:0xdd62ed3e",
        "to": "bb:3877917340",
        "type": "entry"
      },
      {
        "from": "fn:0xe724529c",
        "to": "bb:4076725131",
        "type": "entry"
      },
      {
        "from": "fn:0xf2fde38b",
        "to": "bb:826",
        "type": "entry"
      },
      {
        "from": "bb:185",
        "to": "call:213",
        "type": "contains"
      },
      {
        "from": "call:213",
        "to": "sink:call",
        "type": "capability"
      },
      {
        "from": "bb:828",
        "to": "call:882",
        "type": "contains"
      },
      {
        "from": "call:882",
        "to": "sink:call",
        "type": "capability"
      }
    ],
    "nodes": [
      {
        "end_pc": 10,
        "hash": "0xde7c09ec5c6a787330be3474c14e6af1d95d255c64d4de8caa7d39b964000ee7",
        "id": "bb:0",
        "start_pc": 0,
        "type": "basic_block"
      },
      {
        "end_pc": 30,
        "hash": "0xaa8508e79922bef88de7680412ebb93d9b8132af38a790d94ddd35af4ee3a037",
        "id": "bb:11",
        "start_pc": 11,
        "type": "basic_block"
      },
      {
        "end_pc": 41,
        "hash": "0xa56f4f96be79fa212ef2ab51072b3a1d063fbc25670a3086bd76227480e9ec9a",
        "id": "bb:31",
        "start_pc": 31,
        "type": "basic_block"
      },
      {
        "end_pc": 52,
        "hash": "0xdcc0cfc78164b28a048e1018c78fb1e258688e4e9dbc32fe6bb71fdddfe9fb4c",
        "id": "bb:42",
        "start_pc": 42,
        "type": "basic_block"
      },
      {
        "end_pc": 63,
        "hash": "0xe5407ecad732c0e22d131e81a5f4ad7969b4a0da0db55cdac8b2b03eab611fc0",
        "id": "bb:53",
        "start_pc": 53,
        "type": "basic_block"
      },
      {
        "end_pc": 74,
        "hash": "0x6718e6e9c96250aa33193f2b60d68e2742d3a1e4b04aadbd49640f97508de1aa",
        "id": "bb:64",
        "start_pc": 64,
        "type": "basic_block"
      },
      {
        "end_pc": 85,
        "hash": "0x548805c0c54507e41d3b0919d310d4eca0ef980fa4cb4aa8a54d66f6ada4014f",
        "id": "bb:75",
        "start_pc": 75,
        "type": "basic_block"
      },
      {
        "end_pc": 96,
        "hash": "0xee796bec83d7680c6d5e37104b770091abb8695ea260229becf257f558a226d1",
        "id": "bb:86",
        "start_pc": 86,
        "type": "basic_block"
      },
      {
        "end_pc": 107,
        "hash": "0xda315755efcd32c213ef4d4252640668a3a6cba263b9dad6678e67516412e041",
        "id": "bb:97",
        "start_pc": 97,
        "type": "basic_block"
      },
      {
        "end_pc": 118,
        "hash": "0xd14af00a8a087ebec347301845bc0f8614855f78850bf217ade6b32d0e38f52d",
        "id": "bb:108",
        "start_pc": 108,
        "type": "basic_block"
      },
      {
        "end_pc": 129,
        "hash": "0xa9baa763d900f8bfff962700a80b0550b7184aaca095b16d10dda4cec77d1b48",
        "id": "bb:119",
        "start_pc": 119,
        "type": "basic_block"
      },
      {
        "end_pc": 140,
        "hash": "0xa299ccddb8de0f17a25781b649b758ae14910bd00f495423675728a24a8d768d",
        "id": "bb:130",
        "start_pc": 130,
        "type": "basic_block"
      },
      {
        "end_pc": 151,
        "hash": "0x21fdc1d971a2e18be50daa0087e63eab91d0f96ebb4895db0ca7b698931575da",
        "id": "bb:141",
        "start_pc": 141,
        "type": "basic_block"
      },
      {
        "end_pc": 162,
        "hash": "0x310188ec5b25938c0b92d363d8d70ad61162a66124f977dd22976927e40da768",
        "id": "bb:152",
        "start_pc": 152,
        "type": "basic_block"
      },
      {
        "end_pc": 173,
        "hash": "0x48f9a852645c327fe40f2536f4984fafd316c90f47c5b073a1063c969140bbb4",
        "id": "bb:163",
        "start_pc": 163,
        "type": "basic_block"
      },
      {
        "end_pc": 184,
        "hash": "0xb97ac4841982eefdf983a0ae476963f01abe60dbf1702ba0f1886ccfa8446afa",
        "id": "bb:174",
        "start_pc": 174,
        "type": "basic_block"
      },
      {
        "end_pc": 219,
        "hash": "0xc2961cacd589158b1d2c8a7a510c2a261c2b7885b8b0e19031153a9500c48a87",
        "id": "bb:185",
        "start_pc": 185,
        "type": "basic_block"
      },
      {
        "end_pc": 284,
        "hash": "0xe7652e763a99342fb92b01232e49f3518bcefde36651531fa4955cd9140b5aaf",
        "id": "bb:220",
        "start_pc": 220,
        "type": "basic_block"
      },
      {
        "end_pc": 292,
        "hash": "0xa2b55e8ccfa3e86eb56083601f6c5b8714877d55e66f9f8c2156b47d60da30b8",
        "id": "bb:285",
        "start_pc": 285,
        "type": "basic_block"
      },
      {
        "end_pc": 311,
        "hash": "0x8d1cd40c0863a71849c48e6693b867f2f380ace0a57a6f3c056e2d450f6d07e8",
        "id": "bb:293",
        "start_pc": 293,
        "type": "basic_block"
      },
      {
        "end_pc": 360,
        "hash": "0xe94b6b64372369f00ae7995b3b3deaf62d461c62845bebbd6ffc121b9e38ceba",
        "id": "bb:312",
        "start_pc": 312,
        "type": "basic_block"
      },
      {
        "end_pc": 370,
        "hash": "0x1400227b29b6b73b26189a92b4be5cbc56e23cd2fc84bac732595fb6f929317d",
        "id": "bb:361",
        "start_pc": 361,
        "type": "basic_block"
      },
      {
        "end_pc": 379,
        "hash": "0x575942c863a297a00af661ce31903830703459bbd0f8133fc279b8f2a7b564a1",
        "id": "bb:371",
        "start_pc": 371,
        "type": "basic_block"
      },
      {
        "end_pc": 425,
        "hash": "0x56ddc7e1f9ab2d96af904dbcf9f18a3599f7d692379e2b57a39592f7abbaace8",
        "id": "bb:380",
        "start_pc": 380,
        "type": "basic_block"
      },
      {
        "end_pc": 429,
        "hash": "0x9c4e8b4e87c27b81d293f40eac9c4e9ff0315bc308e0790a781c96f58aea4d19",
        "id": "bb:426",
        "start_pc": 426,
        "type": "basic_block"
      },
      {
        "end_pc": 441,
        "hash": "0x8308e960b2f7e24af853e735f7fbf46899de885996a06bee7bf0aca2a9535ce2",
        "id": "bb:430",
        "start_pc": 430,
        "type": "basic_block"
      },
      {
        "end_pc": 465,
        "hash": "0x6304426e67f3f6c1d521a6ecd50688b6cdbb42f2eb74ebfb58c0398be0e7a9a5",
        "id": "bb:442",
        "start_pc": 442,
        "type": "basic_block"
      },
      {
        "end_pc": 497,
        "hash": "0x87448368cdab71f7ca82bcc652005bc5f0b84d181c5a92aed8c90232b09819a4",
        "id": "bb:466",
        "start_pc": 466,
        "type": "basic_block"
      },
      {
        "end_pc": 501,
        "hash": "0x41bc2d6bb96ed35784179d1915b758907a87eb819b92a4de42c0df35e571d8fe",
        "id": "bb:498",
        "start_pc": 498,
        "type": "basic_block"
      },
      {
        "end_pc": 519,
        "hash": "0x78b9b0693a73c2bad53e5e567dfdbddb509d6d1d83ecc18efd4acbcbabc242ff",
        "id": "bb:502",
        "start_pc": 502,
        "type": "basic_block"
      },
      {
        "end_pc": 581,
        "hash": "0x17efe3876d26be7fd137f672574cccf8c6c6bd7590d727a41afa94a2f4270627",
        "id": "bb:520",
        "start_pc": 520,
        "type": "basic_block"
      },
      {
        "end_pc": 589,
        "hash": "0xadd1aabcbb895a60f9f3457ad24c92c66bb8ab2b022f298961270e8079dd3055",
        "id": "bb:582",
        "start_pc": 582,
        "type": "basic_block"
      },
      {
        "end_pc": 608,
        "hash": "0x128ab01e8f2b0d56cecba1c3cc32c9865d9d5bc651fe924c1d017cf5e712aef4",
        "id": "bb:590",
        "start_pc": 590,
        "type": "basic_block"
      },
      {
        "end_pc": 651,
        "hash": "0x967c2466cc02566ea6e78e2529cd75570688a671b8c69fac6fd44fdb7c37b961",
        "id": "bb:609",
        "start_pc": 609,
        "type": "basic_block"
      },
      {
        "end_pc": 655,
        "hash": "0xc20ede51c6e2ed994d554b34cde6a76cbd4192e7d87e729025264dd26b212933",
        "id": "bb:652",
        "start_pc": 652,
        "type": "basic_block"
      },
      {
        "end_pc": 682,
        "hash": "0xea7c89081fea5ea113a81c138a2e78fce2b1a56d39545c4e07d82c998322b642",
        "id": "bb:656",
        "start_pc": 656,
        "type": "basic_block"
      },
      {
        "end_pc": 719,
        "hash": "0xce3a00e3b1a1a76704c1c7595075f753d3bbafff538fd026b3fda1db636ddbbb",
        "id": "bb:683",
        "start_pc": 683,
        "type": "basic_block"
      },
      {
        "end_pc": 756,
        "hash": "0x45fa2545c213978e6ec97fe8a9b118d78009bdf9b8e01f2809c2ff4fc43900dc",
        "id": "bb:720",
        "start_pc": 720,
        "type": "basic_block"
      },
      {
        "end_pc": 788,
        "hash": "0xbbf05a30d4645d5e95f6c1c691bdedcdbb39d7a4cd6401169f147a3aae2ee11f",
        "id": "bb:757",
        "start_pc": 757,
        "type": "basic_block"
      },
      {
        "end_pc": 792,
        "hash": "0x3b5285ceb2423dc36c034b80f04b5f3e458501340a5d8e475f3d04664a2f92d3",
        "id": "bb:789",
        "start_pc": 789,
        "type": "basic_block"
      },
      {
        "end_pc": 821,
        "hash": "0x194c135fb6a4fc9e3e306fa077caecd113156591f48526863d31b90fa27ee8b0",
        "id": "bb:793",
        "start_pc": 793,
        "type": "basic_block"
      },
      {
        "end_pc": 825,
        "hash": "0x58a5563acfa50b15ca0a775a1d7bcde65531423d4f290094841db3a1dbd5aa92",
        "id": "bb:822",
        "start_pc": 822,
        "type": "basic_block"
      },
      {
        "end_pc": 827,
        "hash": "0x44260eda7a79006b60940a80fe44f7f1f221f83d89c89bcda2bb901e4756da90",
        "id": "bb:826",
        "start_pc": 826,
        "type": "basic_block"
      },
      {
        "end_pc": 898,
        "hash": "0x23800c13755022cce18cd7546c4776397d600185965f8f2d8a8f8094c90c28c8",
        "id": "bb:828",
        "start_pc": 828,
        "type": "basic_block"
      },
      {
        "end_pc": 923,
        "hash": "0x6fcb2ef30d5f735e41e243f470c370101679095dcdab83aee7a0d010543cdd80",
        "id": "bb:899",
        "start_pc": 899,
        "type": "basic_block"
      },
      {
        "end_pc": 937,
        "hash": "0xea93901931302a26d87fc2a29acdc4a52cfe1dd93067d975e02b51edcc363b97",
        "id": "bb:924",
        "start_pc": 924,
        "type": "basic_block"
      },
      {
        "end_pc": 967,
        "hash": "0x0b5df515886904d647ed3c78708e359f8e56a861b1ad9f714b0321267fc51963",
        "id": "bb:938",
        "start_pc": 938,
        "type": "basic_block"
      },
      {
        "end_pc": 971,
        "hash": "0x57ec40a0b9e9e9dfc9f8dc89f21783dabe6f37e2afa853c8fcb0ed480b7bd656",
        "id": "bb:968",
        "start_pc": 968,
        "type": "basic_block"
      },
      {
        "end_pc": 1005,
        "hash": "0xcbc3b932b5c84e22f748d188a208524e42f60fd4109da105600e5b2b6d04a927",
        "id": "bb:972",
        "start_pc": 972,
        "type": "basic_block"
      },
      {
        "end_pc": 1009,
        "hash": "0x18ea500c290255ef08b2e75bd2a8dd99259a0f5e0c69e76e4866d9431cdbdea4",
        "id": "bb:1006",
        "start_pc": 1006,
        "type": "basic_block"
      },
      {
        "end_pc": 1182,
        "hash": "0x60d3fa75fe9edb8ba6c0bb3d6730e19295da48e3edd20c427854337fe5cce34a",
        "id": "bb:1010",
        "start_pc": 1010,
        "type": "basic_block"
      },
      {
        "end_pc": 1274,
        "hash": "0x349a04ce066d4845473463a9b9f82eb881ba33c1af7bea1683548d49c4a26864",
        "id": "bb:1183",
        "start_pc": 1183,
        "type": "basic_block"
      },
      {
        "end_pc": 1359,
        "hash": "0x2a94c05a3880fabb9e0a90c7190f87f679c4918e9f38382d6fa2edf0da67c1cc",
        "id": "bb:1275",
        "start_pc": 1275,
        "type": "basic_block"
      },
      {
        "end_pc": 1393,
        "hash": "0x95e70a7bbaa580b75a5c4d8ed9a1d68bd4af3b6a407d789254734bc09f27fedd",
        "id": "bb:1360",
        "start_pc": 1360,
        "type": "basic_block"
      },
      {
        "end_pc": 1407,
        "hash": "0x0e23a56312e8293dbf19666842f59c970f514f743a76b4e0f66966c687d4086c",
        "id": "bb:1394",
        "start_pc": 1394,
        "type": "basic_block"
      },
      {
        "end_pc": 1427,
        "hash": "0x2bf950e6dbe16ba82004e9803b7ee4c8d07e4fd4bfb9261b373b54ee6aaafc80",
        "id": "bb:1408",
        "start_pc": 1408,
        "type": "basic_block"
      },
      {
        "end_pc": 1436,
        "hash": "0x64d7d8440e460ec45f772dd90fb78dcb508a01e25999e468931450ccc6432c89",
        "id": "bb:1428",
        "start_pc": 1428,
        "type": "basic_block"
      },
      {
        "end_pc": 1444,
        "hash": "0xcffc48d86f3ca2e9983ecd710334809ca9935696068bbce0855a4b017feec391",
        "id": "bb:1437",
        "start_pc": 1437,
        "type": "basic_block"
      },
      {
        "end_pc": 1471,
        "hash": "0x38f4b390486a710d9e4e825a853d70f7cb4c0af7bdefe12fadeae7174563ccb3",
        "id": "bb:1445",
        "start_pc": 1445,
        "type": "basic_block"
      },
      {
        "end_pc": 1475,
        "hash": "0xab689a1d15eaa64c7fb633b7d82db472b06e116cb3b72fd1cdcf74ff643f504b",
        "id": "bb:1472",
        "start_pc": 1472,
        "type": "basic_block"
      },
      {
        "end_pc": 1506,
        "hash": "0x66faf6137068bb82646105d5f1fba7a31b9f044b70457f1b33d83e8f2b6c2942",
        "id": "bb:1476",
        "start_pc": 1476,
        "type": "basic_block"
      },
      {
        "end_pc": 1510,
        "hash": "0x82215718d02cc1619065a0e1e0e0888071f48c3819f2549185ed7743ac24e372",
        "id": "bb:1507",
        "start_pc": 1507,
        "type": "basic_block"
      },
      {
        "end_pc": 1573,
        "hash": "0x24f8fab0f2c663307d1617f0934b8e43c5f417ee6459c31450c633b39f0ce9b5",
        "id": "bb:1511",
        "start_pc": 1511,
        "type": "basic_block"
      },
      {
        "end_pc": 1577,
        "hash": "0xfb09cd3638630ce3d55c6930f61d26478cf39c1cd2080b9cb202102cb266b2e4",
        "id": "bb:1574",
        "start_pc": 1574,
        "type": "basic_block"
      },
      {
        "end_pc": 1829,
        "hash": "0x80c02b49be5e3b5738644a4aaa06ce62356ce5baa514b12ee62c86e337015c32",
        "id": "bb:1578",
        "start_pc": 1578,
        "type": "basic_block"
      },
      {
        "id": "call:213",
        "opcode": "CALL",
        "pc": 213,
        "type": "callsite"
      },
      {
        "id": "call:882",
        "opcode": "CALL",
        "pc": 882,
        "type": "callsite"
      },
      {
        "id": "sink:call",
        "type": "sink"
      },
      {
        "entry_pc": null,
        "id": "fn:0x06fdde03",
        "selector": "0x06fdde03",
        "type": "function"
      },
      {
        "entry_pc": 404098525,
        "id": "fn:0x095ea7b3",
        "selector": "0x095ea7b3",
        "type": "function"
      },
      {
        "entry_pc": 599290589,
        "id": "fn:0x18160ddd",
        "selector": "0x18160ddd",
        "type": "function"
      },
      {
        "entry_pc": 826074471,
        "id": "fn:0x23b872dd",
        "selector": "0x23b872dd",
        "type": "function"
      },
      {
        "entry_pc": 1889567281,
        "id": "fn:0x313ce567",
        "selector": "0x313ce567",
        "type": "function"
      },
      {
        "entry_pc": 2043039848,
        "id": "fn:0x70a08231",
        "selector": "0x70a08231",
        "type": "function"
      },
      {
        "entry_pc": 2376452955,
        "id": "fn:0x79c65068",
        "selector": "0x79c65068",
        "type": "function"
      },
      {
        "entry_pc": 2514000705,
        "id": "fn:0x8da5cb5b",
        "selector": "0x8da5cb5b",
        "type": "function"
      },
      {
        "entry_pc": 2835717307,
        "id": "fn:0x95d89b41",
        "selector": "0x95d89b41",
        "type": "function"
      },
      {
        "entry_pc": 3021264054,
        "id": "fn:0xa9059cbb",
        "selector": "0xa9059cbb",
        "type": "function"
      },
      {
        "entry_pc": 3694166258,
        "id": "fn:0xb414d4b6",
        "selector": "0xb414d4b6",
        "type": "function"
      },
      {
        "entry_pc": 3714247998,
        "id": "fn:0xdc3080f2",
        "selector": "0xdc3080f2",
        "type": "function"
      },
      {
        "entry_pc": 3877917340,
        "id": "fn:0xdd62ed3e",
        "selector": "0xdd62ed3e",
        "type": "function"
      },
      {
        "entry_pc": 4076725131,
        "id": "fn:0xe724529c",
        "selector": "0xe724529c",
        "type": "function"
      },
      {
        "entry_pc": 826,
        "id": "fn:0xf2fde38b",
        "selector": "0xf2fde38b",
        "type": "function"
      }
    ],
    "version": "capability_graph_v1"
  },
  "id": 1994,
  "updated_at": "2026-04-04T19:53:20.000000Z",
  "version": "capability_graph_v1"
}

exec
/bin/bash -lc "jq '.analysis_artifact.artifact_json.functions' BYTECODE_BUNDLE.json" in /tmp/codex-c7vtos52
 succeeded in 0ms:
[
  {
    "auth": {
      "guards": []
    },
    "entry_pc": null,
    "selector": "0x06fdde03",
    "sinks": {
      "call": 2,
      "delegatecall": 0,
      "selfdestruct": 0,
      "staticcall": 0
    },
    "storage": {
      "reads": 34,
      "slots": [
        {
          "op": "SLOAD",
          "pc": 192,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 227,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000001"
        },
        {
          "op": "SLOAD",
          "pc": 298,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000100"
        },
        {
          "op": "SLOAD",
          "pc": 377,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000004"
        },
        {
          "op": "SLOAD",
          "pc": 436,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000003"
        },
        {
          "op": "SLOAD",
          "pc": 478,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 508,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 527,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000002"
        },
        {
          "op": "SLOAD",
          "pc": 595,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000100"
        },
        {
          "op": "SLOAD",
          "pc": 769,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 802,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 1220,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000004"
        },
        {
          "op": "SLOAD",
          "pc": 1364,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        }
      ],
      "writes": 10
    }
  },
  {
    "auth": {
      "guards": []
    },
    "entry_pc": 404098525,
    "selector": "0x095ea7b3",
    "sinks": {
      "call": 2,
      "delegatecall": 0,
      "selfdestruct": 0,
      "staticcall": 0
    },
    "storage": {
      "reads": 34,
      "slots": [
        {
          "op": "SLOAD",
          "pc": 192,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 227,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000001"
        },
        {
          "op": "SLOAD",
          "pc": 298,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000100"
        },
        {
          "op": "SLOAD",
          "pc": 377,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000004"
        },
        {
          "op": "SLOAD",
          "pc": 436,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000003"
        },
        {
          "op": "SLOAD",
          "pc": 478,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 508,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 527,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000002"
        },
        {
          "op": "SLOAD",
          "pc": 595,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000100"
        },
        {
          "op": "SLOAD",
          "pc": 769,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 802,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 1220,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000004"
        },
        {
          "op": "SLOAD",
          "pc": 1364,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        }
      ],
      "writes": 10
    }
  },
  {
    "auth": {
      "guards": []
    },
    "entry_pc": 599290589,
    "selector": "0x18160ddd",
    "sinks": {
      "call": 2,
      "delegatecall": 0,
      "selfdestruct": 0,
      "staticcall": 0
    },
    "storage": {
      "reads": 34,
      "slots": [
        {
          "op": "SLOAD",
          "pc": 192,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 227,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000001"
        },
        {
          "op": "SLOAD",
          "pc": 298,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000100"
        },
        {
          "op": "SLOAD",
          "pc": 377,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000004"
        },
        {
          "op": "SLOAD",
          "pc": 436,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000003"
        },
        {
          "op": "SLOAD",
          "pc": 478,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 508,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 527,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000002"
        },
        {
          "op": "SLOAD",
          "pc": 595,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000100"
        },
        {
          "op": "SLOAD",
          "pc": 769,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 802,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 1220,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000004"
        },
        {
          "op": "SLOAD",
          "pc": 1364,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        }
      ],
      "writes": 10
    }
  },
  {
    "auth": {
      "guards": []
    },
    "entry_pc": 826074471,
    "selector": "0x23b872dd",
    "sinks": {
      "call": 2,
      "delegatecall": 0,
      "selfdestruct": 0,
      "staticcall": 0
    },
    "storage": {
      "reads": 34,
      "slots": [
        {
          "op": "SLOAD",
          "pc": 192,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 227,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000001"
        },
        {
          "op": "SLOAD",
          "pc": 298,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000100"
        },
        {
          "op": "SLOAD",
          "pc": 377,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000004"
        },
        {
          "op": "SLOAD",
          "pc": 436,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000003"
        },
        {
          "op": "SLOAD",
          "pc": 478,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 508,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 527,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000002"
        },
        {
          "op": "SLOAD",
          "pc": 595,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000100"
        },
        {
          "op": "SLOAD",
          "pc": 769,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 802,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 1220,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000004"
        },
        {
          "op": "SLOAD",
          "pc": 1364,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        }
      ],
      "writes": 10
    }
  },
  {
    "auth": {
      "guards": []
    },
    "entry_pc": 1889567281,
    "selector": "0x313ce567",
    "sinks": {
      "call": 2,
      "delegatecall": 0,
      "selfdestruct": 0,
      "staticcall": 0
    },
    "storage": {
      "reads": 34,
      "slots": [
        {
          "op": "SLOAD",
          "pc": 192,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 227,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000001"
        },
        {
          "op": "SLOAD",
          "pc": 298,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000100"
        },
        {
          "op": "SLOAD",
          "pc": 377,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000004"
        },
        {
          "op": "SLOAD",
          "pc": 436,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000003"
        },
        {
          "op": "SLOAD",
          "pc": 478,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 508,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 527,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000002"
        },
        {
          "op": "SLOAD",
          "pc": 595,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000100"
        },
        {
          "op": "SLOAD",
          "pc": 769,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 802,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 1220,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000004"
        },
        {
          "op": "SLOAD",
          "pc": 1364,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        }
      ],
      "writes": 10
    }
  },
  {
    "auth": {
      "guards": []
    },
    "entry_pc": 2043039848,
    "selector": "0x70a08231",
    "sinks": {
      "call": 2,
      "delegatecall": 0,
      "selfdestruct": 0,
      "staticcall": 0
    },
    "storage": {
      "reads": 34,
      "slots": [
        {
          "op": "SLOAD",
          "pc": 192,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 227,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000001"
        },
        {
          "op": "SLOAD",
          "pc": 298,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000100"
        },
        {
          "op": "SLOAD",
          "pc": 377,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000004"
        },
        {
          "op": "SLOAD",
          "pc": 436,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000003"
        },
        {
          "op": "SLOAD",
          "pc": 478,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 508,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 527,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000002"
        },
        {
          "op": "SLOAD",
          "pc": 595,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000100"
        },
        {
          "op": "SLOAD",
          "pc": 769,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 802,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 1220,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000004"
        },
        {
          "op": "SLOAD",
          "pc": 1364,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        }
      ],
      "writes": 10
    }
  },
  {
    "auth": {
      "guards": []
    },
    "entry_pc": 2376452955,
    "selector": "0x79c65068",
    "sinks": {
      "call": 2,
      "delegatecall": 0,
      "selfdestruct": 0,
      "staticcall": 0
    },
    "storage": {
      "reads": 34,
      "slots": [
        {
          "op": "SLOAD",
          "pc": 192,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 227,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000001"
        },
        {
          "op": "SLOAD",
          "pc": 298,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000100"
        },
        {
          "op": "SLOAD",
          "pc": 377,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000004"
        },
        {
          "op": "SLOAD",
          "pc": 436,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000003"
        },
        {
          "op": "SLOAD",
          "pc": 478,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 508,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 527,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000002"
        },
        {
          "op": "SLOAD",
          "pc": 595,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000100"
        },
        {
          "op": "SLOAD",
          "pc": 769,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 802,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 1220,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000004"
        },
        {
          "op": "SLOAD",
          "pc": 1364,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        }
      ],
      "writes": 10
    }
  },
  {
    "auth": {
      "guards": []
    },
    "entry_pc": 2514000705,
    "selector": "0x8da5cb5b",
    "sinks": {
      "call": 2,
      "delegatecall": 0,
      "selfdestruct": 0,
      "staticcall": 0
    },
    "storage": {
      "reads": 34,
      "slots": [
        {
          "op": "SLOAD",
          "pc": 192,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 227,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000001"
        },
        {
          "op": "SLOAD",
          "pc": 298,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000100"
        },
        {
          "op": "SLOAD",
          "pc": 377,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000004"
        },
        {
          "op": "SLOAD",
          "pc": 436,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000003"
        },
        {
          "op": "SLOAD",
          "pc": 478,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 508,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 527,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000002"
        },
        {
          "op": "SLOAD",
          "pc": 595,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000100"
        },
        {
          "op": "SLOAD",
          "pc": 769,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 802,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 1220,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000004"
        },
        {
          "op": "SLOAD",
          "pc": 1364,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        }
      ],
      "writes": 10
    }
  },
  {
    "auth": {
      "guards": []
    },
    "entry_pc": 2835717307,
    "selector": "0x95d89b41",
    "sinks": {
      "call": 2,
      "delegatecall": 0,
      "selfdestruct": 0,
      "staticcall": 0
    },
    "storage": {
      "reads": 34,
      "slots": [
        {
          "op": "SLOAD",
          "pc": 192,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 227,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000001"
        },
        {
          "op": "SLOAD",
          "pc": 298,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000100"
        },
        {
          "op": "SLOAD",
          "pc": 377,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000004"
        },
        {
          "op": "SLOAD",
          "pc": 436,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000003"
        },
        {
          "op": "SLOAD",
          "pc": 478,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 508,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 527,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000002"
        },
        {
          "op": "SLOAD",
          "pc": 595,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000100"
        },
        {
          "op": "SLOAD",
          "pc": 769,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 802,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 1220,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000004"
        },
        {
          "op": "SLOAD",
          "pc": 1364,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        }
      ],
      "writes": 10
    }
  },
  {
    "auth": {
      "guards": []
    },
    "entry_pc": 3021264054,
    "selector": "0xa9059cbb",
    "sinks": {
      "call": 2,
      "delegatecall": 0,
      "selfdestruct": 0,
      "staticcall": 0
    },
    "storage": {
      "reads": 34,
      "slots": [
        {
          "op": "SLOAD",
          "pc": 192,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 227,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000001"
        },
        {
          "op": "SLOAD",
          "pc": 298,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000100"
        },
        {
          "op": "SLOAD",
          "pc": 377,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000004"
        },
        {
          "op": "SLOAD",
          "pc": 436,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000003"
        },
        {
          "op": "SLOAD",
          "pc": 478,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 508,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 527,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000002"
        },
        {
          "op": "SLOAD",
          "pc": 595,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000100"
        },
        {
          "op": "SLOAD",
          "pc": 769,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 802,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 1220,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000004"
        },
        {
          "op": "SLOAD",
          "pc": 1364,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        }
      ],
      "writes": 10
    }
  },
  {
    "auth": {
      "guards": []
    },
    "entry_pc": 3694166258,
    "selector": "0xb414d4b6",
    "sinks": {
      "call": 2,
      "delegatecall": 0,
      "selfdestruct": 0,
      "staticcall": 0
    },
    "storage": {
      "reads": 34,
      "slots": [
        {
          "op": "SLOAD",
          "pc": 192,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 227,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000001"
        },
        {
          "op": "SLOAD",
          "pc": 298,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000100"
        },
        {
          "op": "SLOAD",
          "pc": 377,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000004"
        },
        {
          "op": "SLOAD",
          "pc": 436,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000003"
        },
        {
          "op": "SLOAD",
          "pc": 478,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 508,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 527,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000002"
        },
        {
          "op": "SLOAD",
          "pc": 595,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000100"
        },
        {
          "op": "SLOAD",
          "pc": 769,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 802,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 1220,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000004"
        },
        {
          "op": "SLOAD",
          "pc": 1364,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        }
      ],
      "writes": 10
    }
  },
  {
    "auth": {
      "guards": []
    },
    "entry_pc": 3714247998,
    "selector": "0xdc3080f2",
    "sinks": {
      "call": 2,
      "delegatecall": 0,
      "selfdestruct": 0,
      "staticcall": 0
    },
    "storage": {
      "reads": 34,
      "slots": [
        {
          "op": "SLOAD",
          "pc": 192,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 227,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000001"
        },
        {
          "op": "SLOAD",
          "pc": 298,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000100"
        },
        {
          "op": "SLOAD",
          "pc": 377,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000004"
        },
        {
          "op": "SLOAD",
          "pc": 436,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000003"
        },
        {
          "op": "SLOAD",
          "pc": 478,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 508,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 527,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000002"
        },
        {
          "op": "SLOAD",
          "pc": 595,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000100"
        },
        {
          "op": "SLOAD",
          "pc": 769,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 802,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 1220,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000004"
        },
        {
          "op": "SLOAD",
          "pc": 1364,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        }
      ],
      "writes": 10
    }
  },
  {
    "auth": {
      "guards": []
    },
    "entry_pc": 3877917340,
    "selector": "0xdd62ed3e",
    "sinks": {
      "call": 2,
      "delegatecall": 0,
      "selfdestruct": 0,
      "staticcall": 0
    },
    "storage": {
      "reads": 34,
      "slots": [
        {
          "op": "SLOAD",
          "pc": 192,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 227,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000001"
        },
        {
          "op": "SLOAD",
          "pc": 298,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000100"
        },
        {
          "op": "SLOAD",
          "pc": 377,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000004"
        },
        {
          "op": "SLOAD",
          "pc": 436,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000003"
        },
        {
          "op": "SLOAD",
          "pc": 478,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 508,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 527,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000002"
        },
        {
          "op": "SLOAD",
          "pc": 595,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000100"
        },
        {
          "op": "SLOAD",
          "pc": 769,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 802,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 1220,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000004"
        },
        {
          "op": "SLOAD",
          "pc": 1364,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        }
      ],
      "writes": 10
    }
  },
  {
    "auth": {
      "guards": []
    },
    "entry_pc": 4076725131,
    "selector": "0xe724529c",
    "sinks": {
      "call": 2,
      "delegatecall": 0,
      "selfdestruct": 0,
      "staticcall": 0
    },
    "storage": {
      "reads": 34,
      "slots": [
        {
          "op": "SLOAD",
          "pc": 192,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 227,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000001"
        },
        {
          "op": "SLOAD",
          "pc": 298,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000100"
        },
        {
          "op": "SLOAD",
          "pc": 377,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000004"
        },
        {
          "op": "SLOAD",
          "pc": 436,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000003"
        },
        {
          "op": "SLOAD",
          "pc": 478,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 508,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 527,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000002"
        },
        {
          "op": "SLOAD",
          "pc": 595,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000100"
        },
        {
          "op": "SLOAD",
          "pc": 769,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 802,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 1220,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000004"
        },
        {
          "op": "SLOAD",
          "pc": 1364,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        }
      ],
      "writes": 10
    }
  },
  {
    "auth": {
      "guards": []
    },
    "entry_pc": 826,
    "selector": "0xf2fde38b",
    "sinks": {
      "call": 2,
      "delegatecall": 0,
      "selfdestruct": 0,
      "staticcall": 0
    },
    "storage": {
      "reads": 34,
      "slots": [
        {
          "op": "SLOAD",
          "pc": 192,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 227,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000001"
        },
        {
          "op": "SLOAD",
          "pc": 298,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000100"
        },
        {
          "op": "SLOAD",
          "pc": 377,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000004"
        },
        {
          "op": "SLOAD",
          "pc": 436,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000003"
        },
        {
          "op": "SLOAD",
          "pc": 478,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 508,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 527,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000002"
        },
        {
          "op": "SLOAD",
          "pc": 595,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000100"
        },
        {
          "op": "SLOAD",
          "pc": 769,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 802,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "op": "SLOAD",
          "pc": 1220,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000004"
        },
        {
          "op": "SLOAD",
          "pc": 1364,
          "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
        }
      ],
      "writes": 10
    }
  }
]

exec
/bin/bash -lc "python - <<'PY'
import json
from pathlib import Path
obj=json.load(open('BYTECODE_BUNDLE.json'))
code=obj['artifact']['runtime_bytecode']
if code.startswith('0x'): code=code[2:]
code_bytes=bytes.fromhex(code)
# opcode table minimal
ops={0x00:'STOP',0x01:'ADD',0x02:'MUL',0x03:'SUB',0x04:'DIV',0x05:'SDIV',0x06:'MOD',0x07:'SMOD',0x08:'ADDMOD',0x09:'MULMOD',0x0a:'EXP',0x0b:'SIGNEXTEND',
0x10:'LT',0x11:'GT',0x12:'SLT',0x13:'SGT',0x14:'EQ',0x15:'ISZERO',0x16:'AND',0x17:'OR',0x18:'XOR',0x19:'NOT',0x1a:'BYTE',0x1b:'SHL',0x1c:'SHR',0x1d:'SAR',
0x20:'SHA3',0x30:'ADDRESS',0x31:'BALANCE',0x32:'ORIGIN',0x33:'CALLER',0x34:'CALLVALUE',0x35:'CALLDATALOAD',0x36:'CALLDATASIZE',0x37:'CALLDATACOPY',0x38:'CODESIZE',0x39:'CODECOPY',0x3a:'GASPRICE',0x3b:'EXTCODESIZE',0x3c:'EXTCODECOPY',0x3d:'RETURNDATASIZE',0x3e:'RETURNDATACOPY',0x3f:'EXTCODEHASH',
0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x46:'CHAINID',0x47:'SELFBALANCE',0x48:'BASEFEE',
0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x53:'MSTORE8',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x58:'PC',0x59:'MSIZE',0x5a:'GAS',0x5b:'JUMPDEST',
0x60:'PUSH1',0x61:'PUSH2',0x62:'PUSH3',0x63:'PUSH4',0x64:'PUSH5',0x65:'PUSH6',0x66:'PUSH7',0x67:'PUSH8',0x68:'PUSH9',0x69:'PUSH10',0x6a:'PUSH11',0x6b:'PUSH12',0x6c:'PUSH13',0x6d:'PUSH14',0x6e:'PUSH15',0x6f:'PUSH16',0x70:'PUSH17',0x71:'PUSH18',0x72:'PUSH19',0x73:'PUSH20',0x74:'PUSH21',0x75:'PUSH22',0x76:'PUSH23',0x77:'PUSH24',0x78:'PUSH25',0x79:'PUSH26',0x7a:'PUSH27',0x7b:'PUSH28',0x7c:'PUSH29',0x7d:'PUSH30',0x7e:'PUSH31',0x7f:'PUSH32',
0x80:'DUP1',0x81:'DUP2',0x82:'DUP3',0x83:'DUP4',0x84:'DUP5',0x85:'DUP6',0x86:'DUP7',0x87:'DUP8',0x88:'DUP9',0x89:'DUP10',0x8a:'DUP11',0x8b:'DUP12',0x8c:'DUP13',0x8d:'DUP14',0x8e:'DUP15',0x8f:'DUP16',
0x90:'SWAP1',0x91:'SWAP2',0x92:'SWAP3',0x93:'SWAP4',0x94:'SWAP5',0x95:'SWAP6',0x96:'SWAP7',0x97:'SWAP8',0x98:'SWAP9',0x99:'SWAP10',0x9a:'SWAP11',0x9b:'SWAP12',0x9c:'SWAP13',0x9d:'SWAP14',0x9e:'SWAP15',0x9f:'SWAP16',
0xa0:'LOG0',0xa1:'LOG1',0xa2:'LOG2',0xa3:'LOG3',0xa4:'LOG4',0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'}
# disassemble and print selected windows
windows=[(0,330),(350,950),(930,1600)]
for start,end in windows:
    print(f'--- {start}-{end} ---')
    i=start
    while i < min(end, len(code_bytes)):
        b=code_bytes[i]
        op=ops.get(b, f'OP_{b:02x}')
        if 0x60 <= b <= 0x7f:
            n=b-0x5f
            data=code_bytes[i+1:i+1+n]
            print(f'{i:04x}: {op} 0x{data.hex()}')
            i += 1+n
        else:
            print(f'{i:04x}: {op}')
            i += 1
PY" in /tmp/codex-c7vtos52
 exited 1 in 0ms:
Traceback (most recent call last):
  File "<stdin>", line 5, in <module>
AttributeError: 'dict' object has no attribute 'startswith'

exec
/bin/bash -lc "python - <<'PY'
import json
obj=json.load(open('BYTECODE_BUNDLE.json'))
rb=obj['artifact']['runtime_bytecode']
print(type(rb).__name__)
print(rb if isinstance(rb,str) else list(rb)[:5])
PY" in /tmp/codex-c7vtos52
 succeeded in 0ms:
dict
['full', 'head', 'length', 'tail', 'truncated']

exec
/bin/bash -lc "python - <<'PY'
import json, pprint
obj=json.load(open('BYTECODE_BUNDLE.json'))
rb=obj['artifact']['runtime_bytecode']
pprint.pp(rb)
PY" in /tmp/codex-c7vtos52
 succeeded in 0ms:
{'full': '0x606060405236156100b95760e060020a600035046306fdde0381146100dc578063095ea7b31461013857806318160ddd1461017357806323b872dd1461017c578063313ce567146101ae57806370a08231146101ba57806379c65068146101d25780638da5cb5b146101f657806395d89b4114610208578063a9059cbb14610261578063b414d4b614610290578063dc3080f2146102ab578063dd62ed3e146102d0578063e724529c146102f5578063f2fde38b14610319575b61033a60008054600160a060020a03169034606082818181858883f15050505050565b61033c600180546020600282841615610100026000190190921691909104601f8101829004909102608090810160405260608281529291908282801561059d5780601f106105725761010080835404028352916020019161059d565b33600160a060020a039081166000908152600760209081526040808320600435909416835292905290812060243590555b6060908152602090f35b61016960045481565b610169600435602435604435600160a060020a038316600090815260056020526040812054829010156105a557610002565b61016960035460ff1681565b61016960043560056020526000908152604090205481565b61033a60043560243560005433600160a060020a0390811691161461049f57610002565b610169600054600160a060020a031681565b61033c600280546020601f6000196001841615610100020190921683900491820181900402608090810160405260608281529291908282801561059d5780601f106105725761010080835404028352916020019161059d565b61033a60043560243533600160a060020a0316600090815260056020526040902054819010156103aa57610002565b61016960043560066020526000908152604090205460ff1681565b6008602090815260043560009081526040808220909252602435815220546101699081565b6007602090815260043560009081526040808220909252602435815220546101699081565b61033a60043560243560005433600160a060020a039081169116146104fb57610002565b61033a60043560005433600160a060020a0390811691161461055057610002565b005b60405180806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f16801561039c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b600160a060020a0382166000908152604090205480820110156103cc57610002565b33600160a060020a031660009081526006602052604090205460ff16156103f257610002565b806005600050600033600160a060020a03168152602001908152602001600020600082828250540392505081905550806005600050600084600160a060020a0316815260200190815260200160002060008282825054019250508190555081600160a060020a031633600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600160a060020a0382811660008181526005602090815260408220805486019055600480548601905590546060858152929316917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a35050565b600160a060020a03821660008181526006602052604090819020805460ff191684179055606091825260808390527f48335238b4855f35377ed80f164e8c6f3c366e54ac00b96a6402d4a9814a03a591a15050565b6000805473ffffffffffffffffffffffffffffffffffffffff19168217905550565b820191906000526020600020905b81548152906001019060200180831161058057829003601f168201915b505050505081565b600160a060020a0383168152604081205482810110156105c457610002565b600160a060020a03841681526006602052604081205460ff16156105e757610002565b60076020908152604080832033600160a060020a039081168086529184528285205490881685526008845282852091855292528220548301111561062a57610002565b816005600050600086600160a060020a03168152602001908152602001600020600082828250540392505081905550816005600050600085600160a060020a03168152602001908152602001600020600082828250540192505081905550816008600050600086600160a060020a03168152602001908152602001600020600050600033600160a060020a0316815260200190815260200160002060008282825054019250508190555082600160a060020a031633600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3939250505056',
 'head': None,
 'length': 3662,
 'tail': None,
 'truncated': False}

exec
/bin/bash -lc "python - <<'PY'
import json
obj=json.load(open('BYTECODE_BUNDLE.json'))
code=obj['artifact']['runtime_bytecode']['full']
code=code[2:] if code.startswith('0x') else code
code_bytes=bytes.fromhex(code)
ops={0x00:'STOP',0x01:'ADD',0x02:'MUL',0x03:'SUB',0x04:'DIV',0x05:'SDIV',0x06:'MOD',0x07:'SMOD',0x08:'ADDMOD',0x09:'MULMOD',0x0a:'EXP',0x0b:'SIGNEXTEND',0x10:'LT',0x11:'GT',0x12:'SLT',0x13:'SGT',0x14:'EQ',0x15:'ISZERO',0x16:'AND',0x17:'OR',0x18:'XOR',0x19:'NOT',0x1a:'BYTE',0x1b:'SHL',0x1c:'SHR',0x1d:'SAR',0x20:'SHA3',0x30:'ADDRESS',0x31:'BALANCE',0x32:'ORIGIN',0x33:'CALLER',0x34:'CALLVALUE',0x35:'CALLDATALOAD',0x36:'CALLDATASIZE',0x37:'CALLDATACOPY',0x38:'CODESIZE',0x39:'CODECOPY',0x3a:'GASPRICE',0x3b:'EXTCODESIZE',0x3c:'EXTCODECOPY',0x3d:'RETURNDATASIZE',0x3e:'RETURNDATACOPY',0x3f:'EXTCODEHASH',0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x46:'CHAINID',0x47:'SELFBALANCE',0x48:'BASEFEE',0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x53:'MSTORE8',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x58:'PC',0x59:'MSIZE',0x5a:'GAS',0x5b:'JUMPDEST',0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'}
for i in range(1,33): ops[0x5f+i]=f'PUSH{i}'
for i in range(1,17): ops[0x7f+i]=f'DUP{i}'
for i in range(1,17): ops[0x8f+i]=f'SWAP{i}'
for i in range(0,5): ops[0xa0+i]=f'LOG{i}'

def dis(start,end):
    i=start
    while i<min(end,len(code_bytes)):
        b=code_bytes[i]
        op=ops.get(b,f'OP_{b:02x}')
        if 0x60 <= b <= 0x7f:
            n=b-0x5f
            d=code_bytes[i+1:i+1+n]
            print(f'{i:04x}: {op:<8} 0x{d.hex()}')
            i+=1+n
        else:
            print(f'{i:04x}: {op}')
            i+=1
for s,e in [(0,220),(220,340),(340,520),(520,720),(720,920),(920,1160),(1160,1400),(1400,1600)]:
    print(f'--- {s}-{e} ---')
    dis(s,e)
PY" in /tmp/codex-c7vtos52
 succeeded in 0ms:
--- 0-220 ---
0000: PUSH1    0x60
0002: PUSH1    0x40
0004: MSTORE
0005: CALLDATASIZE
0006: ISZERO
0007: PUSH2    0x00b9
000a: JUMPI
000b: PUSH1    0xe0
000d: PUSH1    0x02
000f: EXP
0010: PUSH1    0x00
0012: CALLDATALOAD
0013: DIV
0014: PUSH4    0x06fdde03
0019: DUP2
001a: EQ
001b: PUSH2    0x00dc
001e: JUMPI
001f: DUP1
0020: PUSH4    0x095ea7b3
0025: EQ
0026: PUSH2    0x0138
0029: JUMPI
002a: DUP1
002b: PUSH4    0x18160ddd
0030: EQ
0031: PUSH2    0x0173
0034: JUMPI
0035: DUP1
0036: PUSH4    0x23b872dd
003b: EQ
003c: PUSH2    0x017c
003f: JUMPI
0040: DUP1
0041: PUSH4    0x313ce567
0046: EQ
0047: PUSH2    0x01ae
004a: JUMPI
004b: DUP1
004c: PUSH4    0x70a08231
0051: EQ
0052: PUSH2    0x01ba
0055: JUMPI
0056: DUP1
0057: PUSH4    0x79c65068
005c: EQ
005d: PUSH2    0x01d2
0060: JUMPI
0061: DUP1
0062: PUSH4    0x8da5cb5b
0067: EQ
0068: PUSH2    0x01f6
006b: JUMPI
006c: DUP1
006d: PUSH4    0x95d89b41
0072: EQ
0073: PUSH2    0x0208
0076: JUMPI
0077: DUP1
0078: PUSH4    0xa9059cbb
007d: EQ
007e: PUSH2    0x0261
0081: JUMPI
0082: DUP1
0083: PUSH4    0xb414d4b6
0088: EQ
0089: PUSH2    0x0290
008c: JUMPI
008d: DUP1
008e: PUSH4    0xdc3080f2
0093: EQ
0094: PUSH2    0x02ab
0097: JUMPI
0098: DUP1
0099: PUSH4    0xdd62ed3e
009e: EQ
009f: PUSH2    0x02d0
00a2: JUMPI
00a3: DUP1
00a4: PUSH4    0xe724529c
00a9: EQ
00aa: PUSH2    0x02f5
00ad: JUMPI
00ae: DUP1
00af: PUSH4    0xf2fde38b
00b4: EQ
00b5: PUSH2    0x0319
00b8: JUMPI
00b9: JUMPDEST
00ba: PUSH2    0x033a
00bd: PUSH1    0x00
00bf: DUP1
00c0: SLOAD
00c1: PUSH1    0x01
00c3: PUSH1    0xa0
00c5: PUSH1    0x02
00c7: EXP
00c8: SUB
00c9: AND
00ca: SWAP1
00cb: CALLVALUE
00cc: PUSH1    0x60
00ce: DUP3
00cf: DUP2
00d0: DUP2
00d1: DUP2
00d2: DUP6
00d3: DUP9
00d4: DUP4
00d5: CALL
00d6: POP
00d7: POP
00d8: POP
00d9: POP
00da: POP
00db: JUMP
--- 220-340 ---
00dc: JUMPDEST
00dd: PUSH2    0x033c
00e0: PUSH1    0x01
00e2: DUP1
00e3: SLOAD
00e4: PUSH1    0x20
00e6: PUSH1    0x02
00e8: DUP3
00e9: DUP5
00ea: AND
00eb: ISZERO
00ec: PUSH2    0x0100
00ef: MUL
00f0: PUSH1    0x00
00f2: NOT
00f3: ADD
00f4: SWAP1
00f5: SWAP3
00f6: AND
00f7: SWAP2
00f8: SWAP1
00f9: SWAP2
00fa: DIV
00fb: PUSH1    0x1f
00fd: DUP2
00fe: ADD
00ff: DUP3
0100: SWAP1
0101: DIV
0102: SWAP1
0103: SWAP2
0104: MUL
0105: PUSH1    0x80
0107: SWAP1
0108: DUP2
0109: ADD
010a: PUSH1    0x40
010c: MSTORE
010d: PUSH1    0x60
010f: DUP3
0110: DUP2
0111: MSTORE
0112: SWAP3
0113: SWAP2
0114: SWAP1
0115: DUP3
0116: DUP3
0117: DUP1
0118: ISZERO
0119: PUSH2    0x059d
011c: JUMPI
011d: DUP1
011e: PUSH1    0x1f
0120: LT
0121: PUSH2    0x0572
0124: JUMPI
0125: PUSH2    0x0100
0128: DUP1
0129: DUP4
012a: SLOAD
012b: DIV
012c: MUL
012d: DUP4
012e: MSTORE
012f: SWAP2
0130: PUSH1    0x20
0132: ADD
0133: SWAP2
0134: PUSH2    0x059d
0137: JUMP
0138: JUMPDEST
0139: CALLER
013a: PUSH1    0x01
013c: PUSH1    0xa0
013e: PUSH1    0x02
0140: EXP
0141: SUB
0142: SWAP1
0143: DUP2
0144: AND
0145: PUSH1    0x00
0147: SWAP1
0148: DUP2
0149: MSTORE
014a: PUSH1    0x07
014c: PUSH1    0x20
014e: SWAP1
014f: DUP2
0150: MSTORE
0151: PUSH1    0x40
0153: DUP1
--- 340-520 ---
0154: DUP4
0155: SHA3
0156: PUSH1    0x04
0158: CALLDATALOAD
0159: SWAP1
015a: SWAP5
015b: AND
015c: DUP4
015d: MSTORE
015e: SWAP3
015f: SWAP1
0160: MSTORE
0161: SWAP1
0162: DUP2
0163: SHA3
0164: PUSH1    0x24
0166: CALLDATALOAD
0167: SWAP1
0168: SSTORE
0169: JUMPDEST
016a: PUSH1    0x60
016c: SWAP1
016d: DUP2
016e: MSTORE
016f: PUSH1    0x20
0171: SWAP1
0172: RETURN
0173: JUMPDEST
0174: PUSH2    0x0169
0177: PUSH1    0x04
0179: SLOAD
017a: DUP2
017b: JUMP
017c: JUMPDEST
017d: PUSH2    0x0169
0180: PUSH1    0x04
0182: CALLDATALOAD
0183: PUSH1    0x24
0185: CALLDATALOAD
0186: PUSH1    0x44
0188: CALLDATALOAD
0189: PUSH1    0x01
018b: PUSH1    0xa0
018d: PUSH1    0x02
018f: EXP
0190: SUB
0191: DUP4
0192: AND
0193: PUSH1    0x00
0195: SWAP1
0196: DUP2
0197: MSTORE
0198: PUSH1    0x05
019a: PUSH1    0x20
019c: MSTORE
019d: PUSH1    0x40
019f: DUP2
01a0: SHA3
01a1: SLOAD
01a2: DUP3
01a3: SWAP1
01a4: LT
01a5: ISZERO
01a6: PUSH2    0x05a5
01a9: JUMPI
01aa: PUSH2    0x0002
01ad: JUMP
01ae: JUMPDEST
01af: PUSH2    0x0169
01b2: PUSH1    0x03
01b4: SLOAD
01b5: PUSH1    0xff
01b7: AND
01b8: DUP2
01b9: JUMP
01ba: JUMPDEST
01bb: PUSH2    0x0169
01be: PUSH1    0x04
01c0: CALLDATALOAD
01c1: PUSH1    0x05
01c3: PUSH1    0x20
01c5: MSTORE
01c6: PUSH1    0x00
01c8: SWAP1
01c9: DUP2
01ca: MSTORE
01cb: PUSH1    0x40
01cd: SWAP1
01ce: SHA3
01cf: SLOAD
01d0: DUP2
01d1: JUMP
01d2: JUMPDEST
01d3: PUSH2    0x033a
01d6: PUSH1    0x04
01d8: CALLDATALOAD
01d9: PUSH1    0x24
01db: CALLDATALOAD
01dc: PUSH1    0x00
01de: SLOAD
01df: CALLER
01e0: PUSH1    0x01
01e2: PUSH1    0xa0
01e4: PUSH1    0x02
01e6: EXP
01e7: SUB
01e8: SWAP1
01e9: DUP2
01ea: AND
01eb: SWAP2
01ec: AND
01ed: EQ
01ee: PUSH2    0x049f
01f1: JUMPI
01f2: PUSH2    0x0002
01f5: JUMP
01f6: JUMPDEST
01f7: PUSH2    0x0169
01fa: PUSH1    0x00
01fc: SLOAD
01fd: PUSH1    0x01
01ff: PUSH1    0xa0
0201: PUSH1    0x02
0203: EXP
0204: SUB
0205: AND
0206: DUP2
0207: JUMP
--- 520-720 ---
0208: JUMPDEST
0209: PUSH2    0x033c
020c: PUSH1    0x02
020e: DUP1
020f: SLOAD
0210: PUSH1    0x20
0212: PUSH1    0x1f
0214: PUSH1    0x00
0216: NOT
0217: PUSH1    0x01
0219: DUP5
021a: AND
021b: ISZERO
021c: PUSH2    0x0100
021f: MUL
0220: ADD
0221: SWAP1
0222: SWAP3
0223: AND
0224: DUP4
0225: SWAP1
0226: DIV
0227: SWAP2
0228: DUP3
0229: ADD
022a: DUP2
022b: SWAP1
022c: DIV
022d: MUL
022e: PUSH1    0x80
0230: SWAP1
0231: DUP2
0232: ADD
0233: PUSH1    0x40
0235: MSTORE
0236: PUSH1    0x60
0238: DUP3
0239: DUP2
023a: MSTORE
023b: SWAP3
023c: SWAP2
023d: SWAP1
023e: DUP3
023f: DUP3
0240: DUP1
0241: ISZERO
0242: PUSH2    0x059d
0245: JUMPI
0246: DUP1
0247: PUSH1    0x1f
0249: LT
024a: PUSH2    0x0572
024d: JUMPI
024e: PUSH2    0x0100
0251: DUP1
0252: DUP4
0253: SLOAD
0254: DIV
0255: MUL
0256: DUP4
0257: MSTORE
0258: SWAP2
0259: PUSH1    0x20
025b: ADD
025c: SWAP2
025d: PUSH2    0x059d
0260: JUMP
0261: JUMPDEST
0262: PUSH2    0x033a
0265: PUSH1    0x04
0267: CALLDATALOAD
0268: PUSH1    0x24
026a: CALLDATALOAD
026b: CALLER
026c: PUSH1    0x01
026e: PUSH1    0xa0
0270: PUSH1    0x02
0272: EXP
0273: SUB
0274: AND
0275: PUSH1    0x00
0277: SWAP1
0278: DUP2
0279: MSTORE
027a: PUSH1    0x05
027c: PUSH1    0x20
027e: MSTORE
027f: PUSH1    0x40
0281: SWAP1
0282: SHA3
0283: SLOAD
0284: DUP2
0285: SWAP1
0286: LT
0287: ISZERO
0288: PUSH2    0x03aa
028b: JUMPI
028c: PUSH2    0x0002
028f: JUMP
0290: JUMPDEST
0291: PUSH2    0x0169
0294: PUSH1    0x04
0296: CALLDATALOAD
0297: PUSH1    0x06
0299: PUSH1    0x20
029b: MSTORE
029c: PUSH1    0x00
029e: SWAP1
029f: DUP2
02a0: MSTORE
02a1: PUSH1    0x40
02a3: SWAP1
02a4: SHA3
02a5: SLOAD
02a6: PUSH1    0xff
02a8: AND
02a9: DUP2
02aa: JUMP
02ab: JUMPDEST
02ac: PUSH1    0x08
02ae: PUSH1    0x20
02b0: SWAP1
02b1: DUP2
02b2: MSTORE
02b3: PUSH1    0x04
02b5: CALLDATALOAD
02b6: PUSH1    0x00
02b8: SWAP1
02b9: DUP2
02ba: MSTORE
02bb: PUSH1    0x40
02bd: DUP1
02be: DUP3
02bf: SHA3
02c0: SWAP1
02c1: SWAP3
02c2: MSTORE
02c3: PUSH1    0x24
02c5: CALLDATALOAD
02c6: DUP2
02c7: MSTORE
02c8: SHA3
02c9: SLOAD
02ca: PUSH2    0x0169
02cd: SWAP1
02ce: DUP2
02cf: JUMP
--- 720-920 ---
02d0: JUMPDEST
02d1: PUSH1    0x07
02d3: PUSH1    0x20
02d5: SWAP1
02d6: DUP2
02d7: MSTORE
02d8: PUSH1    0x04
02da: CALLDATALOAD
02db: PUSH1    0x00
02dd: SWAP1
02de: DUP2
02df: MSTORE
02e0: PUSH1    0x40
02e2: DUP1
02e3: DUP3
02e4: SHA3
02e5: SWAP1
02e6: SWAP3
02e7: MSTORE
02e8: PUSH1    0x24
02ea: CALLDATALOAD
02eb: DUP2
02ec: MSTORE
02ed: SHA3
02ee: SLOAD
02ef: PUSH2    0x0169
02f2: SWAP1
02f3: DUP2
02f4: JUMP
02f5: JUMPDEST
02f6: PUSH2    0x033a
02f9: PUSH1    0x04
02fb: CALLDATALOAD
02fc: PUSH1    0x24
02fe: CALLDATALOAD
02ff: PUSH1    0x00
0301: SLOAD
0302: CALLER
0303: PUSH1    0x01
0305: PUSH1    0xa0
0307: PUSH1    0x02
0309: EXP
030a: SUB
030b: SWAP1
030c: DUP2
030d: AND
030e: SWAP2
030f: AND
0310: EQ
0311: PUSH2    0x04fb
0314: JUMPI
0315: PUSH2    0x0002
0318: JUMP
0319: JUMPDEST
031a: PUSH2    0x033a
031d: PUSH1    0x04
031f: CALLDATALOAD
0320: PUSH1    0x00
0322: SLOAD
0323: CALLER
0324: PUSH1    0x01
0326: PUSH1    0xa0
0328: PUSH1    0x02
032a: EXP
032b: SUB
032c: SWAP1
032d: DUP2
032e: AND
032f: SWAP2
0330: AND
0331: EQ
0332: PUSH2    0x0550
0335: JUMPI
0336: PUSH2    0x0002
0339: JUMP
033a: JUMPDEST
033b: STOP
033c: JUMPDEST
033d: PUSH1    0x40
033f: MLOAD
0340: DUP1
0341: DUP1
0342: PUSH1    0x20
0344: ADD
0345: DUP3
0346: DUP2
0347: SUB
0348: DUP3
0349: MSTORE
034a: DUP4
034b: DUP2
034c: DUP2
034d: MLOAD
034e: DUP2
034f: MSTORE
0350: PUSH1    0x20
0352: ADD
0353: SWAP2
0354: POP
0355: DUP1
0356: MLOAD
0357: SWAP1
0358: PUSH1    0x20
035a: ADD
035b: SWAP1
035c: DUP1
035d: DUP4
035e: DUP4
035f: DUP3
0360: SWAP1
0361: PUSH1    0x00
0363: PUSH1    0x04
0365: PUSH1    0x20
0367: DUP5
0368: PUSH1    0x1f
036a: ADD
036b: DIV
036c: PUSH1    0x0f
036e: MUL
036f: PUSH1    0x03
0371: ADD
0372: CALL
0373: POP
0374: SWAP1
0375: POP
0376: SWAP1
0377: DUP2
0378: ADD
0379: SWAP1
037a: PUSH1    0x1f
037c: AND
037d: DUP1
037e: ISZERO
037f: PUSH2    0x039c
0382: JUMPI
0383: DUP1
0384: DUP3
0385: SUB
0386: DUP1
0387: MLOAD
0388: PUSH1    0x01
038a: DUP4
038b: PUSH1    0x20
038d: SUB
038e: PUSH2    0x0100
0391: EXP
0392: SUB
0393: NOT
0394: AND
0395: DUP2
0396: MSTORE
0397: PUSH1    0x20
--- 920-1160 ---
0398: SHA3
0399: ADD
039a: SWAP2
039b: POP
039c: JUMPDEST
039d: POP
039e: SWAP3
039f: POP
03a0: POP
03a1: POP
03a2: PUSH1    0x40
03a4: MLOAD
03a5: DUP1
03a6: SWAP2
03a7: SUB
03a8: SWAP1
03a9: RETURN
03aa: JUMPDEST
03ab: PUSH1    0x01
03ad: PUSH1    0xa0
03af: PUSH1    0x02
03b1: EXP
03b2: SUB
03b3: DUP3
03b4: AND
03b5: PUSH1    0x00
03b7: SWAP1
03b8: DUP2
03b9: MSTORE
03ba: PUSH1    0x40
03bc: SWAP1
03bd: SHA3
03be: SLOAD
03bf: DUP1
03c0: DUP3
03c1: ADD
03c2: LT
03c3: ISZERO
03c4: PUSH2    0x03cc
03c7: JUMPI
03c8: PUSH2    0x0002
03cb: JUMP
03cc: JUMPDEST
03cd: CALLER
03ce: PUSH1    0x01
03d0: PUSH1    0xa0
03d2: PUSH1    0x02
03d4: EXP
03d5: SUB
03d6: AND
03d7: PUSH1    0x00
03d9: SWAP1
03da: DUP2
03db: MSTORE
03dc: PUSH1    0x06
03de: PUSH1    0x20
03e0: MSTORE
03e1: PUSH1    0x40
03e3: SWAP1
03e4: SHA3
03e5: SLOAD
03e6: PUSH1    0xff
03e8: AND
03e9: ISZERO
03ea: PUSH2    0x03f2
03ed: JUMPI
03ee: PUSH2    0x0002
03f1: JUMP
03f2: JUMPDEST
03f3: DUP1
03f4: PUSH1    0x05
03f6: PUSH1    0x00
03f8: POP
03f9: PUSH1    0x00
03fb: CALLER
03fc: PUSH1    0x01
03fe: PUSH1    0xa0
0400: PUSH1    0x02
0402: EXP
0403: SUB
0404: AND
0405: DUP2
0406: MSTORE
0407: PUSH1    0x20
0409: ADD
040a: SWAP1
040b: DUP2
040c: MSTORE
040d: PUSH1    0x20
040f: ADD
0410: PUSH1    0x00
0412: SHA3
0413: PUSH1    0x00
0415: DUP3
0416: DUP3
0417: DUP3
0418: POP
0419: SLOAD
041a: SUB
041b: SWAP3
041c: POP
041d: POP
041e: DUP2
041f: SWAP1
0420: SSTORE
0421: POP
0422: DUP1
0423: PUSH1    0x05
0425: PUSH1    0x00
0427: POP
0428: PUSH1    0x00
042a: DUP5
042b: PUSH1    0x01
042d: PUSH1    0xa0
042f: PUSH1    0x02
0431: EXP
0432: SUB
0433: AND
0434: DUP2
0435: MSTORE
0436: PUSH1    0x20
0438: ADD
0439: SWAP1
043a: DUP2
043b: MSTORE
043c: PUSH1    0x20
043e: ADD
043f: PUSH1    0x00
0441: SHA3
0442: PUSH1    0x00
0444: DUP3
0445: DUP3
0446: DUP3
0447: POP
0448: SLOAD
0449: ADD
044a: SWAP3
044b: POP
044c: POP
044d: DUP2
044e: SWAP1
044f: SSTORE
0450: POP
0451: DUP2
0452: PUSH1    0x01
0454: PUSH1    0xa0
0456: PUSH1    0x02
0458: EXP
0459: SUB
045a: AND
045b: CALLER
045c: PUSH1    0x01
045e: PUSH1    0xa0
0460: PUSH1    0x02
0462: EXP
0463: SUB
0464: AND
0465: PUSH32   0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef
0486: DUP4
0487: PUSH1    0x40
--- 1160-1400 ---
0488: BLOCKHASH
0489: MLOAD
048a: DUP1
048b: DUP3
048c: DUP2
048d: MSTORE
048e: PUSH1    0x20
0490: ADD
0491: SWAP2
0492: POP
0493: POP
0494: PUSH1    0x40
0496: MLOAD
0497: DUP1
0498: SWAP2
0499: SUB
049a: SWAP1
049b: LOG3
049c: POP
049d: POP
049e: JUMP
049f: JUMPDEST
04a0: PUSH1    0x01
04a2: PUSH1    0xa0
04a4: PUSH1    0x02
04a6: EXP
04a7: SUB
04a8: DUP3
04a9: DUP2
04aa: AND
04ab: PUSH1    0x00
04ad: DUP2
04ae: DUP2
04af: MSTORE
04b0: PUSH1    0x05
04b2: PUSH1    0x20
04b4: SWAP1
04b5: DUP2
04b6: MSTORE
04b7: PUSH1    0x40
04b9: DUP3
04ba: SHA3
04bb: DUP1
04bc: SLOAD
04bd: DUP7
04be: ADD
04bf: SWAP1
04c0: SSTORE
04c1: PUSH1    0x04
04c3: DUP1
04c4: SLOAD
04c5: DUP7
04c6: ADD
04c7: SWAP1
04c8: SSTORE
04c9: SWAP1
04ca: SLOAD
04cb: PUSH1    0x60
04cd: DUP6
04ce: DUP2
04cf: MSTORE
04d0: SWAP3
04d1: SWAP4
04d2: AND
04d3: SWAP2
04d4: PUSH32   0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef
04f5: SWAP2
04f6: SWAP1
04f7: LOG3
04f8: POP
04f9: POP
04fa: JUMP
04fb: JUMPDEST
04fc: PUSH1    0x01
04fe: PUSH1    0xa0
0500: PUSH1    0x02
0502: EXP
0503: SUB
0504: DUP3
0505: AND
0506: PUSH1    0x00
0508: DUP2
0509: DUP2
050a: MSTORE
050b: PUSH1    0x06
050d: PUSH1    0x20
050f: MSTORE
0510: PUSH1    0x40
0512: SWAP1
0513: DUP2
0514: SWAP1
0515: SHA3
0516: DUP1
0517: SLOAD
0518: PUSH1    0xff
051a: NOT
051b: AND
051c: DUP5
051d: OR
051e: SWAP1
051f: SSTORE
0520: PUSH1    0x60
0522: SWAP2
0523: DUP3
0524: MSTORE
0525: PUSH1    0x80
0527: DUP4
0528: SWAP1
0529: MSTORE
052a: PUSH32   0x48335238b4855f35377ed80f164e8c6f3c366e54ac00b96a6402d4a9814a03a5
054b: SWAP2
054c: LOG1
054d: POP
054e: POP
054f: JUMP
0550: JUMPDEST
0551: PUSH1    0x00
0553: DUP1
0554: SLOAD
0555: PUSH20   0xffffffffffffffffffffffffffffffffffffffff
056a: NOT
056b: AND
056c: DUP3
056d: OR
056e: SWAP1
056f: SSTORE
0570: POP
0571: JUMP
0572: JUMPDEST
0573: DUP3
0574: ADD
0575: SWAP2
0576: SWAP1
0577: PUSH1    0x00
--- 1400-1600 ---
0578: STOP
0579: MSTORE
057a: PUSH1    0x20
057c: PUSH1    0x00
057e: SHA3
057f: SWAP1
0580: JUMPDEST
0581: DUP2
0582: SLOAD
0583: DUP2
0584: MSTORE
0585: SWAP1
0586: PUSH1    0x01
0588: ADD
0589: SWAP1
058a: PUSH1    0x20
058c: ADD
058d: DUP1
058e: DUP4
058f: GT
0590: PUSH2    0x0580
0593: JUMPI
0594: DUP3
0595: SWAP1
0596: SUB
0597: PUSH1    0x1f
0599: AND
059a: DUP3
059b: ADD
059c: SWAP2
059d: JUMPDEST
059e: POP
059f: POP
05a0: POP
05a1: POP
05a2: POP
05a3: DUP2
05a4: JUMP
05a5: JUMPDEST
05a6: PUSH1    0x01
05a8: PUSH1    0xa0
05aa: PUSH1    0x02
05ac: EXP
05ad: SUB
05ae: DUP4
05af: AND
05b0: DUP2
05b1: MSTORE
05b2: PUSH1    0x40
05b4: DUP2
05b5: SHA3
05b6: SLOAD
05b7: DUP3
05b8: DUP2
05b9: ADD
05ba: LT
05bb: ISZERO
05bc: PUSH2    0x05c4
05bf: JUMPI
05c0: PUSH2    0x0002
05c3: JUMP
05c4: JUMPDEST
05c5: PUSH1    0x01
05c7: PUSH1    0xa0
05c9: PUSH1    0x02
05cb: EXP
05cc: SUB
05cd: DUP5
05ce: AND
05cf: DUP2
05d0: MSTORE
05d1: PUSH1    0x06
05d3: PUSH1    0x20
05d5: MSTORE
05d6: PUSH1    0x40
05d8: DUP2
05d9: SHA3
05da: SLOAD
05db: PUSH1    0xff
05dd: AND
05de: ISZERO
05df: PUSH2    0x05e7
05e2: JUMPI
05e3: PUSH2    0x0002
05e6: JUMP
05e7: JUMPDEST
05e8: PUSH1    0x07
05ea: PUSH1    0x20
05ec: SWAP1
05ed: DUP2
05ee: MSTORE
05ef: PUSH1    0x40
05f1: DUP1
05f2: DUP4
05f3: SHA3
05f4: CALLER
05f5: PUSH1    0x01
05f7: PUSH1    0xa0
05f9: PUSH1    0x02
05fb: EXP
05fc: SUB
05fd: SWAP1
05fe: DUP2
05ff: AND
0600: DUP1
0601: DUP7
0602: MSTORE
0603: SWAP2
0604: DUP5
0605: MSTORE
0606: DUP3
0607: DUP6
0608: SHA3
0609: SLOAD
060a: SWAP1
060b: DUP9
060c: AND
060d: DUP6
060e: MSTORE
060f: PUSH1    0x08
0611: DUP5
0612: MSTORE
0613: DUP3
0614: DUP6
0615: SHA3
0616: SWAP2
0617: DUP6
0618: MSTORE
0619: SWAP3
061a: MSTORE
061b: DUP3
061c: SHA3
061d: SLOAD
061e: DUP4
061f: ADD
0620: GT
0621: ISZERO
0622: PUSH2    0x062a
0625: JUMPI
0626: PUSH2    0x0002
0629: JUMP
062a: JUMPDEST
062b: DUP2
062c: PUSH1    0x05
062e: PUSH1    0x00
0630: POP
0631: PUSH1    0x00
0633: DUP7
0634: PUSH1    0x01
0636: PUSH1    0xa0
0638: PUSH1    0x02
063a: EXP
063b: SUB
063c: AND
063d: DUP2
063e: MSTORE
063f: PUSH1    0x20

exec
/bin/bash -lc "python - <<'PY'
import json
obj=json.load(open('BYTECODE_BUNDLE.json'))
code=obj['artifact']['runtime_bytecode']['full'][2:]
code_bytes=bytes.fromhex(code)
ops={0x00:'STOP',0x01:'ADD',0x02:'MUL',0x03:'SUB',0x04:'DIV',0x05:'SDIV',0x06:'MOD',0x07:'SMOD',0x08:'ADDMOD',0x09:'MULMOD',0x0a:'EXP',0x0b:'SIGNEXTEND',0x10:'LT',0x11:'GT',0x12:'SLT',0x13:'SGT',0x14:'EQ',0x15:'ISZERO',0x16:'AND',0x17:'OR',0x18:'XOR',0x19:'NOT',0x1a:'BYTE',0x1b:'SHL',0x1c:'SHR',0x1d:'SAR',0x20:'SHA3',0x30:'ADDRESS',0x31:'BALANCE',0x32:'ORIGIN',0x33:'CALLER',0x34:'CALLVALUE',0x35:'CALLDATALOAD',0x36:'CALLDATASIZE',0x37:'CALLDATACOPY',0x38:'CODESIZE',0x39:'CODECOPY',0x3a:'GASPRICE',0x3b:'EXTCODESIZE',0x3c:'EXTCODECOPY',0x3d:'RETURNDATASIZE',0x3e:'RETURNDATACOPY',0x3f:'EXTCODEHASH',0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x46:'CHAINID',0x47:'SELFBALANCE',0x48:'BASEFEE',0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x53:'MSTORE8',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x58:'PC',0x59:'MSIZE',0x5a:'GAS',0x5b:'JUMPDEST',0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'}
for i in range(1,33): ops[0x5f+i]=f'PUSH{i}'
for i in range(1,17): ops[0x7f+i]=f'DUP{i}'
for i in range(1,17): ops[0x8f+i]=f'SWAP{i}'
for i in range(0,5): ops[0xa0+i]=f'LOG{i}'
i=1600
while i < len(code_bytes):
    b=code_bytes[i]; op=ops.get(b,f'OP_{b:02x}')
    if 0x60 <= b <= 0x7f:
        n=b-0x5f; d=code_bytes[i+1:i+1+n]
        print(f'{i:04x}: {op:<8} 0x{d.hex()}')
        i+=1+n
    else:
        print(f'{i:04x}: {op}')
        i+=1
PY" in /tmp/codex-c7vtos52
 succeeded in 0ms:
0640: SHA3
0641: ADD
0642: SWAP1
0643: DUP2
0644: MSTORE
0645: PUSH1    0x20
0647: ADD
0648: PUSH1    0x00
064a: SHA3
064b: PUSH1    0x00
064d: DUP3
064e: DUP3
064f: DUP3
0650: POP
0651: SLOAD
0652: SUB
0653: SWAP3
0654: POP
0655: POP
0656: DUP2
0657: SWAP1
0658: SSTORE
0659: POP
065a: DUP2
065b: PUSH1    0x05
065d: PUSH1    0x00
065f: POP
0660: PUSH1    0x00
0662: DUP6
0663: PUSH1    0x01
0665: PUSH1    0xa0
0667: PUSH1    0x02
0669: EXP
066a: SUB
066b: AND
066c: DUP2
066d: MSTORE
066e: PUSH1    0x20
0670: ADD
0671: SWAP1
0672: DUP2
0673: MSTORE
0674: PUSH1    0x20
0676: ADD
0677: PUSH1    0x00
0679: SHA3
067a: PUSH1    0x00
067c: DUP3
067d: DUP3
067e: DUP3
067f: POP
0680: SLOAD
0681: ADD
0682: SWAP3
0683: POP
0684: POP
0685: DUP2
0686: SWAP1
0687: SSTORE
0688: POP
0689: DUP2
068a: PUSH1    0x08
068c: PUSH1    0x00
068e: POP
068f: PUSH1    0x00
0691: DUP7
0692: PUSH1    0x01
0694: PUSH1    0xa0
0696: PUSH1    0x02
0698: EXP
0699: SUB
069a: AND
069b: DUP2
069c: MSTORE
069d: PUSH1    0x20
069f: ADD
06a0: SWAP1
06a1: DUP2
06a2: MSTORE
06a3: PUSH1    0x20
06a5: ADD
06a6: PUSH1    0x00
06a8: SHA3
06a9: PUSH1    0x00
06ab: POP
06ac: PUSH1    0x00
06ae: CALLER
06af: PUSH1    0x01
06b1: PUSH1    0xa0
06b3: PUSH1    0x02
06b5: EXP
06b6: SUB
06b7: AND
06b8: DUP2
06b9: MSTORE
06ba: PUSH1    0x20
06bc: ADD
06bd: SWAP1
06be: DUP2
06bf: MSTORE
06c0: PUSH1    0x20
06c2: ADD
06c3: PUSH1    0x00
06c5: SHA3
06c6: PUSH1    0x00
06c8: DUP3
06c9: DUP3
06ca: DUP3
06cb: POP
06cc: SLOAD
06cd: ADD
06ce: SWAP3
06cf: POP
06d0: POP
06d1: DUP2
06d2: SWAP1
06d3: SSTORE
06d4: POP
06d5: DUP3
06d6: PUSH1    0x01
06d8: PUSH1    0xa0
06da: PUSH1    0x02
06dc: EXP
06dd: SUB
06de: AND
06df: CALLER
06e0: PUSH1    0x01
06e2: PUSH1    0xa0
06e4: PUSH1    0x02
06e6: EXP
06e7: SUB
06e8: AND
06e9: PUSH32   0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef
070a: DUP5
070b: PUSH1    0x40
070d: MLOAD
070e: DUP1
070f: DUP3
0710: DUP2
0711: MSTORE
0712: PUSH1    0x20
0714: ADD
0715: SWAP2
0716: POP
0717: POP
0718: PUSH1    0x40
071a: MLOAD
071b: DUP1
071c: SWAP2
071d: SUB
071e: SWAP1
071f: LOG3
0720: SWAP4
0721: SWAP3
0722: POP
0723: POP
0724: POP
0725: JUMP

exec
/bin/bash -lc "python - <<'PY'
# emulate stack for fallback block with symbolic values; top of stack is list end
stack=[]
def push(x): stack.append(x)
def pop(): return stack.pop()
def dup(n): stack.append(stack[-n])
def swap(n): stack[-1],stack[-1-n]=stack[-1-n],stack[-1]
# sequence from 0xba to 0xd5
push('ret033a')
push(0)
dup(1)
pop(); push('sload(slot0)')
push(1); push('a0'); push(2); pop(); pop(); a=pop(); push(f'2**160-1') # rough after EXP SUB
mask=pop(); val=pop(); push(f'({val}&mask)')
swap(1)
push('callvalue')
push(0x60)
dup(3); dup(2); dup(2); dup(2); dup(6); dup(9); dup(4)
print(stack)
# call args are popped in order gas,to,value,in_offset,in_size,out_offset,out_size from top
args=[pop() for _ in range(7)]
print('popped top7',args)
print('remaining',stack)
PY" in /tmp/codex-c7vtos52
 succeeded in 0ms:
['ret033a', '(sload(slot0)&mask)', 0, 'callvalue', 96, 0, 96, 0, 96, 'callvalue', '(sload(slot0)&mask)', 0]
popped top7 [0, '(sload(slot0)&mask)', 'callvalue', 96, 0, 96, 0]
remaining ['ret033a', '(sload(slot0)&mask)', 0, 'callvalue', 96]

exec
/bin/bash -lc "python - <<'PY'
# Symbolic stack/memory trace for transferFrom to identify slot6 key
stack=[]; mem={}

def push(x): stack.append(x)
def pop(): return stack.pop()
def dup(n): stack.append(stack[-n])
def swap(n): stack[-1], stack[-1-n] = stack[-1-n], stack[-1]
def mstore():
    off=pop(); val=pop(); mem[off]=val

def sload():
    slot=pop(); stack.append(f'SLOAD[{slot}]')

def sha3():
    off=pop(); size=pop();
    # only support common 64-byte pattern mem[0], mem[32]
    items=[]
    for i in range(off, off+size, 32): items.append(mem.get(i,f'mem[{i}]'))
    stack.append('KECCAK(' + ','.join(map(str,items)) + ')')

# initial stack after PUSH2 0x0169 at 0x17d : [ret]
push('ret0169')
# load args 4,24,44
push('arg_from'); push('arg_to'); push('arg_amount')
# mask from
push('mask')
dup(4); # DUP4 before AND is arg_from
# Actually sequence: push1 01 push1 a0 push1 02 exp sub dup4 and
# just do dup4 and and replace
fromv=pop(); mask=pop(); push(f'AND({fromv},mask)')
# push0 swap1 dup2 mstore ; push5 push20 mstore ; push40 dup2 sha3 sload
push(0); swap(1); dup(2); mstore(); push(5); push(32); mstore(); push(64); dup(2); sha3(); sload()
print('after balance load stack=',stack)
print('mem=',mem)
# dup3 swap1 lt iszero jumpi
# jump to 5a5 preserving stack? do not mutate too much except pop cmp
# simulate branch taken
# Now at 5a5 with current stack after condition. Need trace to slot6 lookup.
# Continue from 5a5 exactly using current stack.
push('mask')
dup(5) # at 05cd DUP5
fromv=pop(); mask=pop(); push(f'AND({fromv},mask)')
dup(2); mstore(); push(6); push(32); mstore(); push(64); dup(2); sha3(); sload(); push(0xff); # and
val=pop(); slotv=pop(); push(f'AND({slotv},0xff)')
print('before freeze check stack=',stack)
print('mem=',mem)
PY" in /tmp/codex-c7vtos52
 exited 1 in 0ms:
after balance load stack= ['ret0169', 'arg_from', 'arg_to', 'arg_amount', 0, 'SLOAD[KECCAK(AND(arg_from,mask),5)]']
mem= {0: 'AND(arg_from,mask)', 32: 5}
Traceback (most recent call last):
  File "<stdin>", line 43, in <module>
  File "<stdin>", line 18, in sha3
TypeError: can only concatenate str (not "int") to str

exec
/bin/bash -lc "python - <<'PY'
import json
obj=json.load(open('BYTECODE_BUNDLE.json'))
code=bytes.fromhex(obj['artifact']['runtime_bytecode']['full'][2:])
# simple disasm to map bytes
# symbolic exec from 0x17c to 0x05e7, enough to inspect slot6 key and stack
pc=0x17c
stack=['ret0169']
mem={}
# preload calldata symbolic
calldata={4:'from',0x24:'to',0x44:'amount'}

def push(v): stack.append(v)
def pop(): return stack.pop()
def dup(n): stack.append(stack[-n])
def swap(n): stack[-1],stack[-1-n]=stack[-1-n],stack[-1]
def op_name(b):
    if 0x60<=b<=0x7f: return f'PUSH{b-0x5f}'
    if 0x80<=b<=0x8f: return f'DUP{b-0x7f}'
    if 0x90<=b<=0x9f: return f'SWAP{b-0x8f}'
    names={0x14:'EQ',0x15:'ISZERO',0x16:'AND',0x17:'OR',0x03:'SUB',0x04:'DIV',0x0a:'EXP',0x10:'LT',0x11:'GT',0x01:'ADD',0x20:'SHA3',0x33:'CALLER',0x35:'CALLDATALOAD',0x40:'BLOCKHASH',0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x5b:'JUMPDEST',0x19:'NOT'}
    return names.get(b,hex(b))

def sha3(off,size):
    vals=[]
    # assume words every 32 bytes
    for i in range(off, off+size, 32):
        vals.append(mem.get(i, f'mem[{i}]'))
    return f'keccak({vals})'

steps=0
while pc < len(code) and steps < 400:
    b=code[pc]; name=op_name(b)
    # print some trace points
    if pc in [0x17c,0x19d,0x1a1,0x5a5,0x5c4,0x5d9,0x5e7]:
        print(f'pc {pc:04x} {name} stack={stack} mem={mem}')
    if 0x60<=b<=0x7f:
        n=b-0x5f
        push(int.from_bytes(code[pc+1:pc+1+n],'big'))
        pc += 1+n
    elif 0x80<=b<=0x8f:
        dup(b-0x7f); pc+=1
    elif 0x90<=b<=0x9f:
        swap(b-0x8f); pc+=1
    elif b==0x35:
        off=pop(); push(calldata.get(off,f'calldata[{off}]')); pc+=1
    elif b==0x33:
        push('caller'); pc+=1
    elif b==0x52:
        off=pop(); val=pop(); mem[off]=val; pc+=1
    elif b==0x54:
        slot=pop(); push(f'sload({slot})'); pc+=1
    elif b==0x55:
        slot=pop(); val=pop(); print('SSTORE',slot,val); pc+=1
    elif b==0x20:
        off=pop(); size=pop(); push(sha3(off,size)); pc+=1
    elif b==0x16:
        a=pop(); b2=pop(); push(f'({b2}&{a})'); pc+=1
    elif b==0x17:
        a=pop(); b2=pop(); push(f'({b2}|{a})'); pc+=1
    elif b==0x03:
        a=pop(); b2=pop(); push(f'({b2}-{a})'); pc+=1
    elif b==0x04:
        a=pop(); b2=pop(); push(f'({b2}/{a})'); pc+=1
    elif b==0x0a:
        a=pop(); b2=pop(); push(f'({b2}**{a})'); pc+=1
    elif b==0x10:
        a=pop(); b2=pop(); push(f'({b2}<{a})'); pc+=1
    elif b==0x11:
        a=pop(); b2=pop(); push(f'({b2}>{a})'); pc+=1
    elif b==0x14:
        a=pop(); b2=pop(); push(f'({b2}=={a})'); pc+=1
    elif b==0x15:
        a=pop(); push(f'iszero({a})'); pc+=1
    elif b==0x19:
        a=pop(); push(f'~{a}'); pc+=1
    elif b==0x50:
        pop(); pc+=1
    elif b==0x56:
        dest=pop(); print('JUMP to',dest,'from',hex(pc));
        if isinstance(dest,int): pc=dest
        else: break
    elif b==0x57:
        dest=pop(); cond=pop(); print('JUMPI to',dest,'if',cond,'at',hex(pc));
        # choose path that avoids revert and follows actual function flow
        if pc in [0x1a9,0x5bf,0x5e2]:
            pc=dest if isinstance(dest,int) else pc+1
        elif pc==0x1f1 or pc==0x288:
            pc=dest
        elif pc==0x5bc or pc==0x5e2 or pc==0x622:
            pc=dest
        else:
            pc +=1
    else:
        print('Unhandled',hex(pc),name,'stack',stack)
        break
    steps+=1
print('final pc',hex(pc),'stack',stack,'mem',mem)
PY" in /tmp/codex-c7vtos52
 succeeded in 0ms:
pc 017c JUMPDEST stack=['ret0169'] mem={}
Unhandled 0x17c JUMPDEST stack ['ret0169']
final pc 0x17c stack ['ret0169'] mem {}

exec
/bin/bash -lc "python - <<'PY'
import json
obj=json.load(open('BYTECODE_BUNDLE.json'))
code=bytes.fromhex(obj['artifact']['runtime_bytecode']['full'][2:])
pc=0x17c
stack=['ret0169']
mem={}
calldata={4:'from',0x24:'to',0x44:'amount'}

def push(v): stack.append(v)
def pop(): return stack.pop()
def dup(n): stack.append(stack[-n])
def swap(n): stack[-1],stack[-1-n]=stack[-1-n],stack[-1]
def sha3(off,size):
    vals=[]
    for i in range(off, off+size, 32): vals.append(mem.get(i, f'mem[{i}]'))
    return f'keccak({vals})'
steps=0
while pc < len(code) and steps < 220:
    b=code[pc]
    if pc in [0x17c,0x19d,0x1a1,0x5a5,0x5c4,0x5d9,0x5e7,0x621]:
        print(f'pc {pc:04x} op=0x{b:02x} stack={stack} mem={mem}')
    if 0x60<=b<=0x7f:
        n=b-0x5f; push(int.from_bytes(code[pc+1:pc+1+n],'big')); pc+=1+n
    elif 0x80<=b<=0x8f:
        dup(b-0x7f); pc+=1
    elif 0x90<=b<=0x9f:
        swap(b-0x8f); pc+=1
    elif b==0x5b:
        pc+=1
    elif b==0x35:
        off=pop(); push(calldata.get(off,f'calldata[{off}]')); pc+=1
    elif b==0x33:
        push('caller'); pc+=1
    elif b==0x52:
        off=pop(); val=pop(); mem[off]=val; pc+=1
    elif b==0x54:
        slot=pop(); push(f'sload({slot})'); pc+=1
    elif b==0x20:
        off=pop(); size=pop(); push(sha3(off,size)); pc+=1
    elif b==0x16:
        a=pop(); b2=pop(); push(f'({b2}&{a})'); pc+=1
    elif b==0x17:
        a=pop(); b2=pop(); push(f'({b2}|{a})'); pc+=1
    elif b==0x03:
        a=pop(); b2=pop(); push(f'({b2}-{a})'); pc+=1
    elif b==0x04:
        a=pop(); b2=pop(); push(f'({b2}/{a})'); pc+=1
    elif b==0x0a:
        a=pop(); b2=pop(); push(f'({b2}**{a})'); pc+=1
    elif b==0x10:
        a=pop(); b2=pop(); push(f'({b2}<{a})'); pc+=1
    elif b==0x11:
        a=pop(); b2=pop(); push(f'({b2}>{a})'); pc+=1
    elif b==0x14:
        a=pop(); b2=pop(); push(f'({b2}=={a})'); pc+=1
    elif b==0x15:
        a=pop(); push(f'iszero({a})'); pc+=1
    elif b==0x19:
        a=pop(); push(f'~{a}'); pc+=1
    elif b==0x50:
        pop(); pc+=1
    elif b==0x56:
        dest=pop(); print('JUMP to',dest,'from',hex(pc)); pc=dest if isinstance(dest,int) else -1
    elif b==0x57:
        dest=pop(); cond=pop(); print('JUMPI at',hex(pc),'to',dest,'if',cond)
        # take non-reverting paths
        if pc in [0x1a9,0x5bf,0x5e2,0x622]:
            pc=dest if isinstance(dest,int) else -1
        else:
            pc+=1
    else:
        print('Unhandled',hex(pc),hex(b),'stack',stack); break
    steps+=1
print('final pc',hex(pc), 'stack=',stack, 'mem=',mem)
PY" in /tmp/codex-c7vtos52
 succeeded in 0ms:
pc 017c op=0x5b stack=['ret0169'] mem={}
pc 019d op=0x60 stack=['ret0169', 361, 'from', 'to', 'amount', 0] mem={0: '((1-(160**2))&from)', 32: 5}
pc 01a1 op=0x54 stack=['ret0169', 361, 'from', 'to', 'amount', 0, "keccak(['((1-(160**2))&from)', 5])"] mem={0: '((1-(160**2))&from)', 32: 5}
JUMPI at 0x1a9 to 1445 if iszero((amount<sload(keccak(['((1-(160**2))&from)', 5]))))
pc 05a5 op=0x5b stack=['ret0169', 361, 'from', 'to', 'amount', 0] mem={0: '((1-(160**2))&from)', 32: 5}
Unhandled 0x5b9 0x1 stack ['ret0169', 361, 'from', 'to', 'amount', 0, "sload(keccak(['((1-(160**2))&to)', 5]))", 'amount', "sload(keccak(['((1-(160**2))&to)', 5]))"]
final pc 0x5b9 stack= ['ret0169', 361, 'from', 'to', 'amount', 0, "sload(keccak(['((1-(160**2))&to)', 5]))", 'amount', "sload(keccak(['((1-(160**2))&to)', 5]))"] mem= {0: '((1-(160**2))&to)', 32: 5}

exec
/bin/bash -lc "python - <<'PY'
import json
obj=json.load(open('BYTECODE_BUNDLE.json'))
code=bytes.fromhex(obj['artifact']['runtime_bytecode']['full'][2:])
pc=0x17c
stack=['ret0169']
mem={}
calldata={4:'from',0x24:'to',0x44:'amount'}

def push(v): stack.append(v)
def pop(): return stack.pop()
def dup(n): stack.append(stack[-n])
def swap(n): stack[-1],stack[-1-n]=stack[-1-n],stack[-1]
def sha3(off,size):
    vals=[]
    for i in range(off, off+size, 32): vals.append(mem.get(i, f'mem[{i}]'))
    return f'keccak({vals})'
steps=0
while pc < len(code) and steps < 400:
    b=code[pc]
    if pc in [0x17c,0x1a1,0x5a5,0x5c4,0x5d9,0x5e7,0x621,0x62a]:
        print(f'pc {pc:04x} stack={stack} mem={mem}')
    if 0x60<=b<=0x7f:
        n=b-0x5f; push(int.from_bytes(code[pc+1:pc+1+n],'big')); pc+=1+n
    elif 0x80<=b<=0x8f:
        dup(b-0x7f); pc+=1
    elif 0x90<=b<=0x9f:
        swap(b-0x8f); pc+=1
    elif b==0x5b:
        pc+=1
    elif b==0x35:
        off=pop(); push(calldata.get(off,f'calldata[{off}]')); pc+=1
    elif b==0x33:
        push('caller'); pc+=1
    elif b==0x52:
        off=pop(); val=pop(); mem[off]=val; pc+=1
    elif b==0x54:
        slot=pop(); push(f'sload({slot})'); pc+=1
    elif b==0x20:
        off=pop(); size=pop(); push(sha3(off,size)); pc+=1
    elif b==0x16:
        a=pop(); b2=pop(); push(f'({b2}&{a})'); pc+=1
    elif b==0x17:
        a=pop(); b2=pop(); push(f'({b2}|{a})'); pc+=1
    elif b==0x03:
        a=pop(); b2=pop(); push(f'({b2}-{a})'); pc+=1
    elif b==0x01:
        a=pop(); b2=pop(); push(f'({b2}+{a})'); pc+=1
    elif b==0x04:
        a=pop(); b2=pop(); push(f'({b2}/{a})'); pc+=1
    elif b==0x0a:
        a=pop(); b2=pop(); push(f'({b2}**{a})'); pc+=1
    elif b==0x10:
        a=pop(); b2=pop(); push(f'({b2}<{a})'); pc+=1
    elif b==0x11:
        a=pop(); b2=pop(); push(f'({b2}>{a})'); pc+=1
    elif b==0x14:
        a=pop(); b2=pop(); push(f'({b2}=={a})'); pc+=1
    elif b==0x15:
        a=pop(); push(f'iszero({a})'); pc+=1
    elif b==0x19:
        a=pop(); push(f'~{a}'); pc+=1
    elif b==0x50:
        pop(); pc+=1
    elif b==0x56:
        dest=pop(); print('JUMP to',dest,'from',hex(pc)); pc=dest if isinstance(dest,int) else -1
    elif b==0x57:
        dest=pop(); cond=pop(); print('JUMPI at',hex(pc),'to',dest,'if',cond)
        if pc in [0x1a9,0x5bf,0x5e2,0x622]:
            pc=dest if isinstance(dest,int) else -1
        else:
            pc+=1
    else:
        print('Unhandled',hex(pc),hex(b),'stack',stack); break
    steps+=1
print('final pc',hex(pc), 'stack=',stack, 'mem=',mem)
PY" in /tmp/codex-c7vtos52
 succeeded in 0ms:
pc 017c stack=['ret0169'] mem={}
pc 01a1 stack=['ret0169', 361, 'from', 'to', 'amount', 0, "keccak(['((1-(160**2))&from)', 5])"] mem={0: '((1-(160**2))&from)', 32: 5}
JUMPI at 0x1a9 to 1445 if iszero((amount<sload(keccak(['((1-(160**2))&from)', 5]))))
pc 05a5 stack=['ret0169', 361, 'from', 'to', 'amount', 0] mem={0: '((1-(160**2))&from)', 32: 5}
JUMPI at 0x5bf to 1476 if iszero((sload(keccak(['((1-(160**2))&to)', 5]))<(amount+sload(keccak(['((1-(160**2))&to)', 5])))))
pc 05c4 stack=['ret0169', 361, 'from', 'to', 'amount', 0] mem={0: '((1-(160**2))&to)', 32: 5}
pc 05d9 stack=['ret0169', 361, 'from', 'to', 'amount', 0, 64, 0] mem={0: '((1-(160**2))&from)', 32: 6}
JUMPI at 0x5e2 to 1511 if iszero((sload(keccak(['((1-(160**2))&from)', 6]))&255))
pc 05e7 stack=['ret0169', 361, 'from', 'to', 'amount', 0] mem={0: '((1-(160**2))&from)', 32: 6}
pc 0621 stack=['ret0169', 361, 'from', 'to', 'amount', 0, '(sload(keccak([\'(caller&(1-(160**2)))\', "keccak([\'((1-(160**2))&from)\', 7])"]))>(sload(keccak([\'(caller&(1-(160**2)))\', "keccak([\'((1-(160**2))&from)\', 8])"]))+amount))'] mem={0: '(caller&(1-(160**2)))', 32: "keccak(['((1-(160**2))&from)', 8])"}
JUMPI at 0x625 to 1578 if iszero((sload(keccak(['(caller&(1-(160**2)))', "keccak(['((1-(160**2))&from)', 7])"]))>(sload(keccak(['(caller&(1-(160**2)))', "keccak(['((1-(160**2))&from)', 8])"]))+amount)))
JUMP to 2 from 0x629
Unhandled 0x5 0x36 stack ['ret0169', 361, 'from', 'to', 'amount']
final pc 0x5 stack= ['ret0169', 361, 'from', 'to', 'amount'] mem= {0: '(caller&(1-(160**2)))', 32: "keccak(['((1-(160**2))&from)', 8])", 64: 0}

exec
/bin/bash -lc "jq '.artifact.is_proxy, .artifact.implementation_address, .artifact.compiler_json' BYTECODE_BUNDLE.json" in /tmp/codex-c7vtos52
 succeeded in 0ms:
false
null
{
  "etherscan": {
    "skipped": true
  }
}

Bundle inspection shows a non-proxy token-like contract with owner-only mint/blacklist controls, a payable fallback CALL, and a custom transferFrom allowance path using slots 7 and 8.
  ✓ Inspect bundle and available analysis artifacts
  → Assess bytecode evidence for concrete security findings
  • Produce JSON report matching schema
exec
/bin/bash -lc "python - <<'PY'
# Focused symbolic trace from 05e8 to 0625 for transferFrom allowance check
import json
code=bytes.fromhex(json.load(open('BYTECODE_BUNDLE.json'))['artifact']['runtime_bytecode']['full'][2:])
pc=0x05e8
# approximate stack at 05e8 from earlier trace after passing blacklist check
stack=['ret','ret2','from','to','amount',0]  # based on prior trace ret0169,361,from,to,amount,0
mem={0:'from_masked',32:6}

def push(v): stack.append(v)
def pop(): return stack.pop()
def dup(n): stack.append(stack[-n])
def swap(n): stack[-1],stack[-1-n]=stack[-1-n],stack[-1]
def sha3(off,size):
    vals=[]
    for i in range(off,off+size,32): vals.append(mem.get(i,f'mem[{i}]'))
    return f'keccak({vals})'

def desc(pc,b):
    if 0x60<=b<=0x7f: return f'PUSH{b-0x5f} {int.from_bytes(code[pc+1:pc+1+(b-0x5f)],\"big\")}'
    if 0x80<=b<=0x8f: return f'DUP{b-0x7f}'
    if 0x90<=b<=0x9f: return f'SWAP{b-0x8f}'
    names={0x5b:'JUMPDEST',0x20:'SHA3',0x33:'CALLER',0x35:'CALLDATALOAD',0x50:'POP',0x52:'MSTORE',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x01:'ADD',0x03:'SUB',0x04:'DIV',0x0a:'EXP',0x10:'LT',0x11:'GT',0x14:'EQ',0x15:'ISZERO',0x16:'AND',0x17:'OR',0x19:'NOT'}
    return names.get(b,hex(b))

for _ in range(80):
    b=code[pc]
    print(f'{pc:04x} {desc(pc,b):<12} stack={stack} mem={mem}')
    if 0x60<=b<=0x7f:
        n=b-0x5f; push(int.from_bytes(code[pc+1:pc+1+n],'big')); pc+=1+n
    elif 0x80<=b<=0x8f:
        dup(b-0x7f); pc+=1
    elif 0x90<=b<=0x9f:
        swap(b-0x8f); pc+=1
    elif b==0x5b: pc+=1
    elif b==0x33: push('caller'); pc+=1
    elif b==0x52:
        off=pop(); val=pop(); mem[off]=val; pc+=1
    elif b==0x54:
        slot=pop(); push(f'sload({slot})'); pc+=1
    elif b==0x20:
        off=pop(); size=pop(); push(sha3(off,size)); pc+=1
    elif b==0x16:
        a=pop(); b2=pop(); push(f'({b2}&{a})'); pc+=1
    elif b==0x17:
        a=pop(); b2=pop(); push(f'({b2}|{a})'); pc+=1
    elif b==0x01:
        a=pop(); b2=pop(); push(f'({b2}+{a})'); pc+=1
    elif b==0x03:
        a=pop(); b2=pop(); push(f'({b2}-{a})'); pc+=1
    elif b==0x04:
        a=pop(); b2=pop(); push(f'({b2}/{a})'); pc+=1
    elif b==0x0a:
        a=pop(); b2=pop(); push(f'({b2}**{a})'); pc+=1
    elif b==0x11:
        a=pop(); b2=pop(); push(f'({b2}>{a})'); pc+=1
    elif b==0x15:
        a=pop(); push(f'iszero({a})'); pc+=1
    elif b==0x50:
        pop(); pc+=1
    elif b==0x57:
        break
    else:
        print('unhandled'); break
PY" in /tmp/codex-c7vtos52
 succeeded in 0ms:
05e8 PUSH1 7      stack=['ret', 'ret2', 'from', 'to', 'amount', 0] mem={0: 'from_masked', 32: 6}
05ea PUSH1 32     stack=['ret', 'ret2', 'from', 'to', 'amount', 0, 7] mem={0: 'from_masked', 32: 6}
05ec SWAP1        stack=['ret', 'ret2', 'from', 'to', 'amount', 0, 7, 32] mem={0: 'from_masked', 32: 6}
05ed DUP2         stack=['ret', 'ret2', 'from', 'to', 'amount', 0, 32, 7] mem={0: 'from_masked', 32: 6}
05ee MSTORE       stack=['ret', 'ret2', 'from', 'to', 'amount', 0, 32, 7, 32] mem={0: 'from_masked', 32: 6}
05ef PUSH1 64     stack=['ret', 'ret2', 'from', 'to', 'amount', 0, 32] mem={0: 'from_masked', 32: 7}
05f1 DUP1         stack=['ret', 'ret2', 'from', 'to', 'amount', 0, 32, 64] mem={0: 'from_masked', 32: 7}
05f2 DUP4         stack=['ret', 'ret2', 'from', 'to', 'amount', 0, 32, 64, 64] mem={0: 'from_masked', 32: 7}
05f3 SHA3         stack=['ret', 'ret2', 'from', 'to', 'amount', 0, 32, 64, 64, 0] mem={0: 'from_masked', 32: 7}
05f4 CALLER       stack=['ret', 'ret2', 'from', 'to', 'amount', 0, 32, 64, "keccak(['from_masked', 7])"] mem={0: 'from_masked', 32: 7}
05f5 PUSH1 1      stack=['ret', 'ret2', 'from', 'to', 'amount', 0, 32, 64, "keccak(['from_masked', 7])", 'caller'] mem={0: 'from_masked', 32: 7}
05f7 PUSH1 160    stack=['ret', 'ret2', 'from', 'to', 'amount', 0, 32, 64, "keccak(['from_masked', 7])", 'caller', 1] mem={0: 'from_masked', 32: 7}
05f9 PUSH1 2      stack=['ret', 'ret2', 'from', 'to', 'amount', 0, 32, 64, "keccak(['from_masked', 7])", 'caller', 1, 160] mem={0: 'from_masked', 32: 7}
05fb EXP          stack=['ret', 'ret2', 'from', 'to', 'amount', 0, 32, 64, "keccak(['from_masked', 7])", 'caller', 1, 160, 2] mem={0: 'from_masked', 32: 7}
05fc SUB          stack=['ret', 'ret2', 'from', 'to', 'amount', 0, 32, 64, "keccak(['from_masked', 7])", 'caller', 1, '(160**2)'] mem={0: 'from_masked', 32: 7}
05fd SWAP1        stack=['ret', 'ret2', 'from', 'to', 'amount', 0, 32, 64, "keccak(['from_masked', 7])", 'caller', '(1-(160**2))'] mem={0: 'from_masked', 32: 7}
05fe DUP2         stack=['ret', 'ret2', 'from', 'to', 'amount', 0, 32, 64, "keccak(['from_masked', 7])", '(1-(160**2))', 'caller'] mem={0: 'from_masked', 32: 7}
05ff AND          stack=['ret', 'ret2', 'from', 'to', 'amount', 0, 32, 64, "keccak(['from_masked', 7])", '(1-(160**2))', 'caller', '(1-(160**2))'] mem={0: 'from_masked', 32: 7}
0600 DUP1         stack=['ret', 'ret2', 'from', 'to', 'amount', 0, 32, 64, "keccak(['from_masked', 7])", '(1-(160**2))', '(caller&(1-(160**2)))'] mem={0: 'from_masked', 32: 7}
0601 DUP7         stack=['ret', 'ret2', 'from', 'to', 'amount', 0, 32, 64, "keccak(['from_masked', 7])", '(1-(160**2))', '(caller&(1-(160**2)))', '(caller&(1-(160**2)))'] mem={0: 'from_masked', 32: 7}
0602 MSTORE       stack=['ret', 'ret2', 'from', 'to', 'amount', 0, 32, 64, "keccak(['from_masked', 7])", '(1-(160**2))', '(caller&(1-(160**2)))', '(caller&(1-(160**2)))', 0] mem={0: 'from_masked', 32: 7}
0603 SWAP2        stack=['ret', 'ret2', 'from', 'to', 'amount', 0, 32, 64, "keccak(['from_masked', 7])", '(1-(160**2))', '(caller&(1-(160**2)))'] mem={0: '(caller&(1-(160**2)))', 32: 7}
0604 DUP5         stack=['ret', 'ret2', 'from', 'to', 'amount', 0, 32, 64, '(caller&(1-(160**2)))', '(1-(160**2))', "keccak(['from_masked', 7])"] mem={0: '(caller&(1-(160**2)))', 32: 7}
0605 MSTORE       stack=['ret', 'ret2', 'from', 'to', 'amount', 0, 32, 64, '(caller&(1-(160**2)))', '(1-(160**2))', "keccak(['from_masked', 7])", 32] mem={0: '(caller&(1-(160**2)))', 32: 7}
0606 DUP3         stack=['ret', 'ret2', 'from', 'to', 'amount', 0, 32, 64, '(caller&(1-(160**2)))', '(1-(160**2))'] mem={0: '(caller&(1-(160**2)))', 32: "keccak(['from_masked', 7])"}
0607 DUP6         stack=['ret', 'ret2', 'from', 'to', 'amount', 0, 32, 64, '(caller&(1-(160**2)))', '(1-(160**2))', 64] mem={0: '(caller&(1-(160**2)))', 32: "keccak(['from_masked', 7])"}
0608 SHA3         stack=['ret', 'ret2', 'from', 'to', 'amount', 0, 32, 64, '(caller&(1-(160**2)))', '(1-(160**2))', 64, 0] mem={0: '(caller&(1-(160**2)))', 32: "keccak(['from_masked', 7])"}
0609 SLOAD        stack=['ret', 'ret2', 'from', 'to', 'amount', 0, 32, 64, '(caller&(1-(160**2)))', '(1-(160**2))', 'keccak([\'(caller&(1-(160**2)))\', "keccak([\'from_masked\', 7])"])'] mem={0: '(caller&(1-(160**2)))', 32: "keccak(['from_masked', 7])"}
060a SWAP1        stack=['ret', 'ret2', 'from', 'to', 'amount', 0, 32, 64, '(caller&(1-(160**2)))', '(1-(160**2))', 'sload(keccak([\'(caller&(1-(160**2)))\', "keccak([\'from_masked\', 7])"]))'] mem={0: '(caller&(1-(160**2)))', 32: "keccak(['from_masked', 7])"}
060b DUP9         stack=['ret', 'ret2', 'from', 'to', 'amount', 0, 32, 64, '(caller&(1-(160**2)))', 'sload(keccak([\'(caller&(1-(160**2)))\', "keccak([\'from_masked\', 7])"]))', '(1-(160**2))'] mem={0: '(caller&(1-(160**2)))', 32: "keccak(['from_masked', 7])"}
060c AND          stack=['ret', 'ret2', 'from', 'to', 'amount', 0, 32, 64, '(caller&(1-(160**2)))', 'sload(keccak([\'(caller&(1-(160**2)))\', "keccak([\'from_masked\', 7])"]))', '(1-(160**2))', 'from'] mem={0: '(caller&(1-(160**2)))', 32: "keccak(['from_masked', 7])"}
060d DUP6         stack=['ret', 'ret2', 'from', 'to', 'amount', 0, 32, 64, '(caller&(1-(160**2)))', 'sload(keccak([\'(caller&(1-(160**2)))\', "keccak([\'from_masked\', 7])"]))', '((1-(160**2))&from)'] mem={0: '(caller&(1-(160**2)))', 32: "keccak(['from_masked', 7])"}
060e MSTORE       stack=['ret', 'ret2', 'from', 'to', 'amount', 0, 32, 64, '(caller&(1-(160**2)))', 'sload(keccak([\'(caller&(1-(160**2)))\', "keccak([\'from_masked\', 7])"]))', '((1-(160**2))&from)', 0] mem={0: '(caller&(1-(160**2)))', 32: "keccak(['from_masked', 7])"}
060f PUSH1 8      stack=['ret', 'ret2', 'from', 'to', 'amount', 0, 32, 64, '(caller&(1-(160**2)))', 'sload(keccak([\'(caller&(1-(160**2)))\', "keccak([\'from_masked\', 7])"]))'] mem={0: '((1-(160**2))&from)', 32: "keccak(['from_masked', 7])"}
0611 DUP5         stack=['ret', 'ret2', 'from', 'to', 'amount', 0, 32, 64, '(caller&(1-(160**2)))', 'sload(keccak([\'(caller&(1-(160**2)))\', "keccak([\'from_masked\', 7])"]))', 8] mem={0: '((1-(160**2))&from)', 32: "keccak(['from_masked', 7])"}
0612 MSTORE       stack=['ret', 'ret2', 'from', 'to', 'amount', 0, 32, 64, '(caller&(1-(160**2)))', 'sload(keccak([\'(caller&(1-(160**2)))\', "keccak([\'from_masked\', 7])"]))', 8, 32] mem={0: '((1-(160**2))&from)', 32: "keccak(['from_masked', 7])"}
0613 DUP3         stack=['ret', 'ret2', 'from', 'to', 'amount', 0, 32, 64, '(caller&(1-(160**2)))', 'sload(keccak([\'(caller&(1-(160**2)))\', "keccak([\'from_masked\', 7])"]))'] mem={0: '((1-(160**2))&from)', 32: 8}
0614 DUP6         stack=['ret', 'ret2', 'from', 'to', 'amount', 0, 32, 64, '(caller&(1-(160**2)))', 'sload(keccak([\'(caller&(1-(160**2)))\', "keccak([\'from_masked\', 7])"]))', 64] mem={0: '((1-(160**2))&from)', 32: 8}
0615 SHA3         stack=['ret', 'ret2', 'from', 'to', 'amount', 0, 32, 64, '(caller&(1-(160**2)))', 'sload(keccak([\'(caller&(1-(160**2)))\', "keccak([\'from_masked\', 7])"]))', 64, 0] mem={0: '((1-(160**2))&from)', 32: 8}
0616 SWAP2        stack=['ret', 'ret2', 'from', 'to', 'amount', 0, 32, 64, '(caller&(1-(160**2)))', 'sload(keccak([\'(caller&(1-(160**2)))\', "keccak([\'from_masked\', 7])"]))', "keccak(['((1-(160**2))&from)', 8])"] mem={0: '((1-(160**2))&from)', 32: 8}
0617 DUP6         stack=['ret', 'ret2', 'from', 'to', 'amount', 0, 32, 64, "keccak(['((1-(160**2))&from)', 8])", 'sload(keccak([\'(caller&(1-(160**2)))\', "keccak([\'from_masked\', 7])"]))', '(caller&(1-(160**2)))'] mem={0: '((1-(160**2))&from)', 32: 8}
0618 MSTORE       stack=['ret', 'ret2', 'from', 'to', 'amount', 0, 32, 64, "keccak(['((1-(160**2))&from)', 8])", 'sload(keccak([\'(caller&(1-(160**2)))\', "keccak([\'from_masked\', 7])"]))', '(caller&(1-(160**2)))', 0] mem={0: '((1-(160**2))&from)', 32: 8}
0619 SWAP3        stack=['ret', 'ret2', 'from', 'to', 'amount', 0, 32, 64, "keccak(['((1-(160**2))&from)', 8])", 'sload(keccak([\'(caller&(1-(160**2)))\', "keccak([\'from_masked\', 7])"]))'] mem={0: '(caller&(1-(160**2)))', 32: 8}
061a MSTORE       stack=['ret', 'ret2', 'from', 'to', 'amount', 0, 'sload(keccak([\'(caller&(1-(160**2)))\', "keccak([\'from_masked\', 7])"]))', 64, "keccak(['((1-(160**2))&from)', 8])", 32] mem={0: '(caller&(1-(160**2)))', 32: 8}
061b DUP3         stack=['ret', 'ret2', 'from', 'to', 'amount', 0, 'sload(keccak([\'(caller&(1-(160**2)))\', "keccak([\'from_masked\', 7])"]))', 64] mem={0: '(caller&(1-(160**2)))', 32: "keccak(['((1-(160**2))&from)', 8])"}
061c SHA3         stack=['ret', 'ret2', 'from', 'to', 'amount', 0, 'sload(keccak([\'(caller&(1-(160**2)))\', "keccak([\'from_masked\', 7])"]))', 64, 0] mem={0: '(caller&(1-(160**2)))', 32: "keccak(['((1-(160**2))&from)', 8])"}
061d SLOAD        stack=['ret', 'ret2', 'from', 'to', 'amount', 0, 'sload(keccak([\'(caller&(1-(160**2)))\', "keccak([\'from_masked\', 7])"]))', 'keccak([\'(caller&(1-(160**2)))\', "keccak([\'((1-(160**2))&from)\', 8])"])'] mem={0: '(caller&(1-(160**2)))', 32: "keccak(['((1-(160**2))&from)', 8])"}
061e DUP4         stack=['ret', 'ret2', 'from', 'to', 'amount', 0, 'sload(keccak([\'(caller&(1-(160**2)))\', "keccak([\'from_masked\', 7])"]))', 'sload(keccak([\'(caller&(1-(160**2)))\', "keccak([\'((1-(160**2))&from)\', 8])"]))'] mem={0: '(caller&(1-(160**2)))', 32: "keccak(['((1-(160**2))&from)', 8])"}
061f ADD          stack=['ret', 'ret2', 'from', 'to', 'amount', 0, 'sload(keccak([\'(caller&(1-(160**2)))\', "keccak([\'from_masked\', 7])"]))', 'sload(keccak([\'(caller&(1-(160**2)))\', "keccak([\'((1-(160**2))&from)\', 8])"]))', 'amount'] mem={0: '(caller&(1-(160**2)))', 32: "keccak(['((1-(160**2))&from)', 8])"}
0620 GT           stack=['ret', 'ret2', 'from', 'to', 'amount', 0, 'sload(keccak([\'(caller&(1-(160**2)))\', "keccak([\'from_masked\', 7])"]))', '(sload(keccak([\'(caller&(1-(160**2)))\', "keccak([\'((1-(160**2))&from)\', 8])"]))+amount)'] mem={0: '(caller&(1-(160**2)))', 32: "keccak(['((1-(160**2))&from)', 8])"}
0621 ISZERO       stack=['ret', 'ret2', 'from', 'to', 'amount', 0, '(sload(keccak([\'(caller&(1-(160**2)))\', "keccak([\'from_masked\', 7])"]))>(sload(keccak([\'(caller&(1-(160**2)))\', "keccak([\'((1-(160**2))&from)\', 8])"]))+amount))'] mem={0: '(caller&(1-(160**2)))', 32: "keccak(['((1-(160**2))&from)', 8])"}
0622 PUSH2 1578   stack=['ret', 'ret2', 'from', 'to', 'amount', 0, 'iszero((sload(keccak([\'(caller&(1-(160**2)))\', "keccak([\'from_masked\', 7])"]))>(sload(keccak([\'(caller&(1-(160**2)))\', "keccak([\'((1-(160**2))&from)\', 8])"]))+amount)))'] mem={0: '(caller&(1-(160**2)))', 32: "keccak(['((1-(160**2))&from)', 8])"}
0625 JUMPI        stack=['ret', 'ret2', 'from', 'to', 'amount', 0, 'iszero((sload(keccak([\'(caller&(1-(160**2)))\', "keccak([\'from_masked\', 7])"]))>(sload(keccak([\'(caller&(1-(160**2)))\', "keccak([\'((1-(160**2))&from)\', 8])"]))+amount)))', 1578] mem={0: '(caller&(1-(160**2)))', 32: "keccak(['((1-(160**2))&from)', 8])"}

exec
/bin/bash -lc 'which cast || which forge || which evm || which hevm || true' in /tmp/codex-c7vtos52
 succeeded in 0ms:
/home/noahkuhn/.foundry/bin/cast

exec
/bin/bash -lc 'which anvil || true' in /tmp/codex-c7vtos52
 succeeded in 0ms:
/home/noahkuhn/.foundry/bin/anvil

exec
/bin/bash -lc "cast --help | sed -n '1,200p'" in /tmp/codex-c7vtos52
 succeeded in 0ms:
A Swiss Army knife for interacting with Ethereum applications from the command line

Usage: cast [OPTIONS] <COMMAND>

Commands:
  4byte                  Get the function signatures for the given selector from
                         <https://openchain.xyz> [aliases: 4, 4b]
  4byte-calldata         Decode ABI-encoded calldata using <https://openchain.xyz> [aliases: 4c,
                         4bc]
  4byte-event            Get the event signature for a given topic 0 from <https://openchain.xyz>
                         [aliases: 4e, 4be, topic0-event, t0e]
  abi-encode             ABI encode the given function argument, excluding the selector [aliases:
                         ae]
  abi-encode-event       ABI encode an event and its arguments to generate topics and data [aliases:
                         aee]
  access-list            Create an access list for a transaction [aliases: ac, acl]
  address-zero           Prints the zero address [aliases: --address-zero, az]
  admin                  Fetch the EIP-1967 admin account [aliases: adm]
  age                    Get the timestamp of a block [aliases: a]
  artifact               Generate an artifact file, that can be used to deploy a contract locally
                         [aliases: ar]
  b2e-payload            Convert Beacon payload to execution payload [aliases: b2e]
  balance                Get the balance of an account in wei [aliases: b]
  base-fee               Get the basefee of a block [aliases: ba, fee, basefee]
  bind                   Generate a rust binding from a given ABI [aliases: bi]
  block                  Get information about a block [aliases: bl]
  block-number           Get the latest block number [aliases: bn]
  call                   Perform a call on an account without publishing a transaction [aliases: c]
  calldata               ABI-encode a function with arguments [aliases: cd]
  chain                  Get the symbolic name of the current chain
  chain-id               Get the Ethereum chain ID [aliases: ci, cid]
  client                 Get the current client version [aliases: cl]
  code                   Get the runtime bytecode of a contract [aliases: co]
  codehash               Get the codehash for an account
  codesize               Get the runtime bytecode size of a contract [aliases: cs]
  completions            Generate shell completions script [aliases: com]
  compute-address        Compute the contract address from a given nonce and deployer address
                         [aliases: ca]
  concat-hex             Concatenate hex strings [aliases: --concat-hex, ch]
  constructor-args       Display constructor arguments used for the contract initialization
                         [aliases: cra]
  create2                Generate a deterministic contract address using CREATE2 [aliases: c2]
  creation-code          Download a contract creation code from Etherscan and RPC [aliases: cc]
  da-estimate            Estimates the data availability size of a given opstack block
  decode-abi             Decode ABI-encoded input or output data [aliases: abi-decode, --abi-decode,
                         ad]
  decode-calldata        Decode ABI-encoded input data [aliases: calldata-decode, --calldata-decode,
                         cdd]
  decode-error           Decode custom error data [aliases: error-decode, --error-decode, erd]
  decode-event           Decode event data [aliases: event-decode, --event-decode, ed]
  decode-string          Decode ABI-encoded string [aliases: string-decode, --string-decode, sd]
  decode-transaction     Decodes a raw signed EIP 2718 typed transaction [aliases: dt, decode-tx]
  disassemble            Disassembles a hex-encoded bytecode into a human-readable representation
                         [aliases: da]
  erc20-token            ERC20 token operations [aliases: erc20]
  estimate               Estimate the gas cost of a transaction [aliases: e]
  find-block             Get the block number closest to the provided timestamp [aliases: f]
  format-bytes32-string  Formats a string into bytes32 encoding [aliases: --format-bytes32-string]
  format-units           Format a number from smallest unit to decimal with arbitrary decimals
                         [aliases: --format-units, fun]
  from-bin               Convert binary data into hex data [aliases: --from-bin, from-binx, fb]
  from-fixed-point       Convert a fixed point number into an integer [aliases: --from-fix, ff]
  from-rlp               Decodes RLP hex-encoded data [aliases: --from-rlp]
  from-utf8              Convert UTF8 text to hex [aliases: --from-ascii, --from-utf8, from-ascii,
                         fu, fa]
  from-wei               Convert wei into an ETH amount [aliases: --from-wei, fw]
  gas-price              Get the current gas price [aliases: g]
  hash-message           Hash a message according to EIP-191 [aliases: --hash-message, hm]
  hash-zero              Prints the zero hash [aliases: --hash-zero, hz]
  help                   Print this message or the help of the given subcommand(s)
  implementation         Fetch the EIP-1967 implementation for a contract Can read from the
                         implementation slot or the beacon slot [aliases: impl]
  index                  Compute the storage slot for an entry in a mapping [aliases: in]
  index-erc7201          Compute storage slots as specified by `ERC-7201: Namespaced Storage Layout`
                         [aliases: index7201, in7201]
  interface              Generate a Solidity interface from a given ABI [aliases: i]
  keccak                 Hash arbitrary data using Keccak-256 [aliases: k, keccak256]
  logs                   Get logs by signature or topic [aliases: l]
  lookup-address         Perform an ENS reverse lookup [aliases: la]
  max-int                Prints the maximum value of the given integer type [aliases: --max-int,
                         maxi]
  max-uint               Prints the maximum value of the given integer type [aliases: --max-uint,
                         maxu]
  min-int                Prints the minimum value of the given integer type [aliases: --min-int,
                         mini]
  mktx                   Build and sign a transaction [aliases: m]
  namehash               Calculate the ENS namehash of a name [aliases: na, nh]
  nonce                  Get the nonce for an account [aliases: n]
  pad                    Pads hex data to a specified length [aliases: pd]
  parse-bytes32-address  Parses a checksummed address from bytes32 encoding. [aliases:
                         --parse-bytes32-address]
  parse-bytes32-string   Parses a string from bytes32 encoding [aliases: --parse-bytes32-string]
  parse-units            Convert a number from decimal to smallest unit with arbitrary decimals
                         [aliases: --parse-units, pun]
  pretty-calldata        Pretty print calldata [aliases: pc]
  proof                  Generate a storage proof for a given storage slot [aliases: pr]
  publish                Publish a raw transaction to the network [aliases: p]
  receipt                Get the transaction receipt for a transaction [aliases: re]
  recover-authority      Recovery an EIP-7702 authority from a Authorization JSON string [aliases:
                         decode-auth]
  resolve-name           Perform an ENS lookup [aliases: rn]
  rpc                    Perform a raw JSON-RPC request [aliases: rp]
  run                    Runs a published transaction in a local environment and prints the trace
                         [aliases: r]
  selectors              Extracts function selectors and arguments from bytecode [aliases: sel]
  send                   Sign and publish a transaction [aliases: s]
  shl                    Perform a left shifting operation
  shr                    Perform a right shifting operation
  sig                    Get the selector for a function [aliases: si]
  sig-event              Generate event signatures from event string [aliases: se]
  source                 Get the source code of a contract from a block explorer [aliases: et, src]
  storage                Get the raw value of a contract's storage slot [aliases: st]
  storage-root           Get the storage root for an account [aliases: sr]
  to-ascii               Convert hex data to an ASCII string [aliases: --to-ascii, tas, 2as]
  to-base                Converts a number of one base to another [aliases: --to-base, --to-radix,
                         to-radix, tr, 2r]
  to-bytes32             Right-pads hex data to 32 bytes [aliases: --to-bytes32, tb, 2b]
  to-check-sum-address   Convert an address to a checksummed format (EIP-55) [aliases:
                         --to-checksum-address, --to-checksum, to-checksum, ta, 2a]
  to-dec                 Converts a number of one base to decimal [aliases: --to-dec, td, 2d]
  to-fixed-point         Convert an integer into a fixed point number [aliases: --to-fix, tf, 2f]
  to-hex                 Converts a number of one base to another [aliases: --to-hex, th, 2h]
  to-hexdata             Normalize the input to lowercase, 0x-prefixed hex [aliases: --to-hexdata,
                         thd, 2hd]
  to-int256              Convert a number to a hex-encoded int256 [aliases: --to-int256, ti, 2i]
  to-rlp                 RLP encodes hex data, or an array of hex data [aliases: --to-rlp]
  to-uint256             Convert a number to a hex-encoded uint256 [aliases: --to-uint256, tu, 2u]
  to-unit                Convert an ETH amount into another unit (ether, gwei or wei) [aliases:
                         --to-unit, tun, 2un]
  to-utf8                Convert hex data to a utf-8 string [aliases: --to-utf8, tu8, 2u8]
  to-wei                 Convert an ETH amount to wei [aliases: --to-wei, tw, 2w]
  trace                  CLI arguments for `cast trace`
  tx                     Get information about a transaction [aliases: t]
  tx-pool                Inspect the TxPool of a node [aliases: tp]
  upload-signature       Upload the given signatures to <https://openchain.xyz> [aliases: ups]
  wallet                 Wallet management utilities [aliases: w]

Options:
  -h, --help
          Print help (see a summary with '-h')

  -j, --threads <THREADS>
          Number of threads to use. Specifying 0 defaults to the number of logical cores
          
          [aliases: --jobs]

  -V, --version
          Print version

Display options:
      --color <COLOR>
          The color of the log messages

          Possible values:
          - auto:   Intelligently guess whether to use color output (default)
          - always: Force color output
          - never:  Force disable color output

      --json
          Format log messages as JSON

      --md
          Format log messages as Markdown

  -q, --quiet
          Do not print log messages

  -v, --verbosity...
          Verbosity level of the log messages.
          
          Pass multiple times to increase the verbosity (e.g. -v, -vv, -vvv).
          
          Depending on the context the verbosity levels have different meanings.
          
          For example, the verbosity levels of the EVM are:
          - 2 (-vv): Print logs for all tests.
          - 3 (-vvv): Print execution traces for failing tests.
          - 4 (-vvvv): Print execution traces for all tests, and setup traces for failing tests.
          - 5 (-vvvvv): Print execution and setup traces for all tests, including storage changes
          and
            backtraces with line numbers.

Find more information in the book: https://getfoundry.sh/cast/overview

2026-04-05T02:48:18.180095Z ERROR codex_core::tools::router: error=exec_command failed for `/bin/bash -lc 'anvil --silent --port 8545'`: CreateProcess { message: "Codex(Sandbox(Denied { output: ExecToolCallOutput { exit_code: 1, stdout: StreamOutput { text: \"\", truncated_after_lines: None }, stderr: StreamOutput { text: \"Error: Operation not permitted (os error 1)\\r\\n\", truncated_after_lines: None }, aggregated_output: StreamOutput { text: \"Error: Operation not permitted (os error 1)\\r\\n\", truncated_after_lines: None }, duration: 0ns, timed_out: false }, network_policy_decision: None }))" }
Concrete findings are narrowed to a blacklist/freeze bypass in transferFrom, nonstandard allowance accounting via a separate spent ledger, and an unchecked fallback CALL. I am finalizing the JSON report.
  ✓ Inspect bundle and available analysis artifacts
  ✓ Assess bytecode evidence for concrete security findings
  → Produce JSON report matching schema
codex
{"no_findings":false,"summary":"Bytecode-only review of the bundle indicates a token-like contract with owner-gated admin paths, a payable fallback CALL, and a custom transferFrom allowance path. The most meaningful issues are a likely freeze/blacklist bypass for approved spenders, nonstandard allowance accounting that depends on a hidden spent ledger, and an unchecked low-level CALL in the fallback. Selector and slot naming are inferred from ERC20-like patterns and should be treated as best-effort.","findings":[{"severity":"medium","category":"access_control","title":"Frozen/blacklisted spender can likely bypass restrictions through transferFrom","exploit_scenario":"If slot 6 is the freeze/blacklist mapping, an address marked there is blocked from direct transfers but can still move third-party funds via existing approvals. A spender that was blacklisted after users approved it can keep calling transferFrom and drain approved balances from unfrozen holders.","recommendation":"Apply the same freeze/blacklist check to CALLER inside the transferFrom path, and if the intended policy is stricter, also reject transfers to frozen recipients. Keep the enforcement consistent across transfer and transferFrom.","evidence":"Selector 0xb414d4b6 reads slot 6, and owner-gated selector 0xe724529c writes slot 6, so slot 6 is very likely an account-status mapping. In selector 0xa9059cbb, the transfer path checks slot6[CALLER] at pc 0x03cd-0x03e9. In selector 0x23b872dd, the transferFrom path checks slot6[from] at pc 0x05c4-0x05e7, while CALLER appears only later for allowance indexing at pc 0x05f4 onward. No equivalent slot6[CALLER] check is visible in transferFrom.","locations":["selector:0xa9059cbb","selector:0x23b872dd","selector:0xe724529c","selector:0xb414d4b6","pc:0x03cd","pc:0x05c4","pc:0x05f4"]},{"severity":"medium","category":"other","title":"Allowance accounting uses a separate spent ledger, so allowance() likely overstates remaining spendable approval","exploit_scenario":"Integrators or users can observe a nonzero allowance via allowance(owner,spender) and assume transferFrom should succeed, but the runtime also tracks a second nested mapping in slot 8 and gates transferFrom on both values. This creates non-ERC20 behavior that can break routers, vaults, and permit/approval workflows that rely on allowance() as the authoritative remaining approval.","recommendation":"Use standard ERC20 allowance semantics: decrement the allowance mapping consumed by transferFrom, and make allowance() return the actual remaining spendable amount. If a spent ledger is required, expose and document it clearly and avoid presenting slot 7 as the effective allowance.","evidence":"Selector 0x095ea7b3 writes only the nested mapping rooted at slot 7 at pc 0x0153-0x0168. Selector 0xdd62ed3e reads only the nested mapping rooted at slot 7 at pc 0x02d0-0x02ef. But selector 0x23b872dd also reads a second nested mapping rooted at slot 8 at pc 0x060f-0x061d and later increments that slot-8 mapping at pc 0x0689-0x06d3, while no matching decrement of slot 7 is visible in transferFrom. Exact comparator direction is somewhat uncertain from bytecode alone, but the separate spent-ledger design is clear.","locations":["selector:0x095ea7b3","selector:0xdd62ed3e","selector:0x23b872dd","selector:0xdc3080f2","pc:0x0168","pc:0x02ee","pc:0x060f","pc:0x061d","pc:0x0689","pc:0x06d3"]},{"severity":"low","category":"other","title":"Fallback exposes an unchecked low-level CALL with ETH value","exploit_scenario":"A plain ETH transfer or unknown-selector call reaches the fallback and executes a CALL at pc 0x00d5. Because the return value is discarded, a failing external call does not revert. This can silently strand ETH in the contract or trigger unexpected code execution in the external callee without any explicit success handling.","recommendation":"Avoid performing low-level CALL from the fallback. If forwarding ETH is intentional, require success explicitly and consider a dedicated withdraw/forward function with clear access control and event logging.","evidence":"The fallback entry starts at pc 0x00b9 and reaches CALL at pc 0x00d5. The bundle's detector findings confirm a reachable CALL with nonzero ETH value potential at pc 213, and no auth guards were detected heuristically. The CALL result is immediately POPed, so success is unchecked. The other detected CALL at pc 0x0372 is the common identity-precompile helper for dynamic string returns and is not reported here as an untrusted external call.","locations":["pc:0x00b9","pc:0x00d5"]}]}
tokens used
101,969
Metadata
{
    "codex": {
        "ran_at": "2026-04-05T02:48:58.346544+00:00",
        "returncode": 0
    },
    "project": {
        "mode": "bytecode",
        "bytecode_length": 3662,
        "bytecode_truncated": false,
        "capability_graph_present": true,
        "analysis_artifact_present": true
    },
    "summary": "Bytecode-only review of the bundle indicates a token-like contract with owner-gated admin paths, a payable fallback CALL, and a custom transferFrom allowance path. The most meaningful issues are a likely freeze/blacklist bypass for approved spenders, nonstandard allowance accounting that depends on a hidden spent ledger, and an unchecked low-level CALL in the fallback. Selector and slot naming are inferred from ERC20-like patterns and should be treated as best-effort.",
    "raw_final": {
        "summary": "Bytecode-only review of the bundle indicates a token-like contract with owner-gated admin paths, a payable fallback CALL, and a custom transferFrom allowance path. The most meaningful issues are a likely freeze/blacklist bypass for approved spenders, nonstandard allowance accounting that depends on a hidden spent ledger, and an unchecked low-level CALL in the fallback. Selector and slot naming are inferred from ERC20-like patterns and should be treated as best-effort.",
        "findings": [
            {
                "title": "Frozen/blacklisted spender can likely bypass restrictions through transferFrom",
                "category": "access_control",
                "evidence": "Selector 0xb414d4b6 reads slot 6, and owner-gated selector 0xe724529c writes slot 6, so slot 6 is very likely an account-status mapping. In selector 0xa9059cbb, the transfer path checks slot6[CALLER] at pc 0x03cd-0x03e9. In selector 0x23b872dd, the transferFrom path checks slot6[from] at pc 0x05c4-0x05e7, while CALLER appears only later for allowance indexing at pc 0x05f4 onward. No equivalent slot6[CALLER] check is visible in transferFrom.",
                "severity": "medium",
                "locations": [
                    "selector:0xa9059cbb",
                    "selector:0x23b872dd",
                    "selector:0xe724529c",
                    "selector:0xb414d4b6",
                    "pc:0x03cd",
                    "pc:0x05c4",
                    "pc:0x05f4"
                ],
                "recommendation": "Apply the same freeze/blacklist check to CALLER inside the transferFrom path, and if the intended policy is stricter, also reject transfers to frozen recipients. Keep the enforcement consistent across transfer and transferFrom.",
                "exploit_scenario": "If slot 6 is the freeze/blacklist mapping, an address marked there is blocked from direct transfers but can still move third-party funds via existing approvals. A spender that was blacklisted after users approved it can keep calling transferFrom and drain approved balances from unfrozen holders."
            },
            {
                "title": "Allowance accounting uses a separate spent ledger, so allowance() likely overstates remaining spendable approval",
                "category": "other",
                "evidence": "Selector 0x095ea7b3 writes only the nested mapping rooted at slot 7 at pc 0x0153-0x0168. Selector 0xdd62ed3e reads only the nested mapping rooted at slot 7 at pc 0x02d0-0x02ef. But selector 0x23b872dd also reads a second nested mapping rooted at slot 8 at pc 0x060f-0x061d and later increments that slot-8 mapping at pc 0x0689-0x06d3, while no matching decrement of slot 7 is visible in transferFrom. Exact comparator direction is somewhat uncertain from bytecode alone, but the separate spent-ledger design is clear.",
                "severity": "medium",
                "locations": [
                    "selector:0x095ea7b3",
                    "selector:0xdd62ed3e",
                    "selector:0x23b872dd",
                    "selector:0xdc3080f2",
                    "pc:0x0168",
                    "pc:0x02ee",
                    "pc:0x060f",
                    "pc:0x061d",
                    "pc:0x0689",
                    "pc:0x06d3"
                ],
                "recommendation": "Use standard ERC20 allowance semantics: decrement the allowance mapping consumed by transferFrom, and make allowance() return the actual remaining spendable amount. If a spent ledger is required, expose and document it clearly and avoid presenting slot 7 as the effective allowance.",
                "exploit_scenario": "Integrators or users can observe a nonzero allowance via allowance(owner,spender) and assume transferFrom should succeed, but the runtime also tracks a second nested mapping in slot 8 and gates transferFrom on both values. This creates non-ERC20 behavior that can break routers, vaults, and permit/approval workflows that rely on allowance() as the authoritative remaining approval."
            },
            {
                "title": "Fallback exposes an unchecked low-level CALL with ETH value",
                "category": "other",
                "evidence": "The fallback entry starts at pc 0x00b9 and reaches CALL at pc 0x00d5. The bundle's detector findings confirm a reachable CALL with nonzero ETH value potential at pc 213, and no auth guards were detected heuristically. The CALL result is immediately POPed, so success is unchecked. The other detected CALL at pc 0x0372 is the common identity-precompile helper for dynamic string returns and is not reported here as an untrusted external call.",
                "severity": "low",
                "locations": [
                    "pc:0x00b9",
                    "pc:0x00d5"
                ],
                "recommendation": "Avoid performing low-level CALL from the fallback. If forwarding ETH is intentional, require success explicitly and consider a dedicated withdraw/forward function with clear access control and event logging.",
                "exploit_scenario": "A plain ETH transfer or unknown-selector call reaches the fallback and executes a CALL at pc 0x00d5. Because the return value is discarded, a failing external call does not revert. This can silently strand ETH in the contract or trigger unexpected code execution in the external callee without any explicit success handling."
            }
        ],
        "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
1239
Flags
No heuristic flags raised.
View cast disassembly output
00000000: PUSH1 0x60
00000002: PUSH1 0x40
00000004: MSTORE
00000005: CALLDATASIZE
00000006: ISZERO
00000007: PUSH2 0x00b9
0000000a: JUMPI
0000000b: PUSH1 0xe0
0000000d: PUSH1 0x02
0000000f: EXP
00000010: PUSH1 0x00
00000012: CALLDATALOAD
00000013: DIV
00000014: PUSH4 0x06fdde03
00000019: DUP2
0000001a: EQ
0000001b: PUSH2 0x00dc
0000001e: JUMPI
0000001f: DUP1
00000020: PUSH4 0x095ea7b3
00000025: EQ
00000026: PUSH2 0x0138
00000029: JUMPI
0000002a: DUP1
0000002b: PUSH4 0x18160ddd
00000030: EQ
00000031: PUSH2 0x0173
00000034: JUMPI
00000035: DUP1
00000036: PUSH4 0x23b872dd
0000003b: EQ
0000003c: PUSH2 0x017c
0000003f: JUMPI
00000040: DUP1
00000041: PUSH4 0x313ce567
00000046: EQ
00000047: PUSH2 0x01ae
0000004a: JUMPI
0000004b: DUP1
0000004c: PUSH4 0x70a08231
00000051: EQ
00000052: PUSH2 0x01ba
00000055: JUMPI
00000056: DUP1
00000057: PUSH4 0x79c65068
0000005c: EQ
0000005d: PUSH2 0x01d2
00000060: JUMPI
00000061: DUP1
00000062: PUSH4 0x8da5cb5b
00000067: EQ
00000068: PUSH2 0x01f6
0000006b: JUMPI
0000006c: DUP1
0000006d: PUSH4 0x95d89b41
00000072: EQ
00000073: PUSH2 0x0208
00000076: JUMPI
00000077: DUP1
00000078: PUSH4 0xa9059cbb
0000007d: EQ
0000007e: PUSH2 0x0261
00000081: JUMPI
00000082: DUP1
00000083: PUSH4 0xb414d4b6
00000088: EQ
00000089: PUSH2 0x0290
0000008c: JUMPI
0000008d: DUP1
0000008e: PUSH4 0xdc3080f2
00000093: EQ
00000094: PUSH2 0x02ab
00000097: JUMPI
00000098: DUP1
00000099: PUSH4 0xdd62ed3e
0000009e: EQ
0000009f: PUSH2 0x02d0
000000a2: JUMPI
000000a3: DUP1
000000a4: PUSH4 0xe724529c
000000a9: EQ
000000aa: PUSH2 0x02f5
000000ad: JUMPI
000000ae: DUP1
000000af: PUSH4 0xf2fde38b
000000b4: EQ
000000b5: PUSH2 0x0319
000000b8: JUMPI
000000b9: JUMPDEST
000000ba: PUSH2 0x033a
000000bd: PUSH1 0x00
000000bf: DUP1
000000c0: SLOAD
000000c1: PUSH1 0x01
000000c3: PUSH1 0xa0
000000c5: PUSH1 0x02
000000c7: EXP
000000c8: SUB
000000c9: AND
000000ca: SWAP1
000000cb: CALLVALUE
000000cc: PUSH1 0x60
000000ce: DUP3
000000cf: DUP2
000000d0: DUP2
000000d1: DUP2
000000d2: DUP6
000000d3: DUP9
000000d4: DUP4
000000d5: CALL
000000d6: POP
000000d7: POP
000000d8: POP
000000d9: POP
000000da: POP
000000db: JUMP
000000dc: JUMPDEST
000000dd: PUSH2 0x033c
000000e0: PUSH1 0x01
000000e2: DUP1
000000e3: SLOAD
000000e4: PUSH1 0x20
000000e6: PUSH1 0x02
000000e8: DUP3
000000e9: DUP5
000000ea: AND
000000eb: ISZERO
000000ec: PUSH2 0x0100
000000ef: MUL
000000f0: PUSH1 0x00
000000f2: NOT
000000f3: ADD
000000f4: SWAP1
000000f5: SWAP3
000000f6: AND
000000f7: SWAP2
000000f8: SWAP1
000000f9: SWAP2
000000fa: DIV
000000fb: PUSH1 0x1f
000000fd: DUP2
000000fe: ADD
000000ff: DUP3
00000100: SWAP1
00000101: DIV
00000102: SWAP1
00000103: SWAP2
00000104: MUL
00000105: PUSH1 0x80
00000107: SWAP1
00000108: DUP2
00000109: ADD
0000010a: PUSH1 0x40
0000010c: MSTORE
0000010d: PUSH1 0x60
0000010f: DUP3
00000110: DUP2
00000111: MSTORE
00000112: SWAP3
00000113: SWAP2
00000114: SWAP1
00000115: DUP3
00000116: DUP3
00000117: DUP1
00000118: ISZERO
00000119: PUSH2 0x059d
0000011c: JUMPI
0000011d: DUP1
0000011e: PUSH1 0x1f
00000120: LT
00000121: PUSH2 0x0572
00000124: JUMPI
00000125: PUSH2 0x0100
00000128: DUP1
00000129: DUP4
0000012a: SLOAD
0000012b: DIV
0000012c: MUL
0000012d: DUP4
0000012e: MSTORE
0000012f: SWAP2
00000130: PUSH1 0x20
00000132: ADD
00000133: SWAP2
00000134: PUSH2 0x059d
00000137: JUMP
00000138: JUMPDEST
00000139: CALLER
0000013a: PUSH1 0x01
0000013c: PUSH1 0xa0
0000013e: PUSH1 0x02
00000140: EXP
00000141: SUB
00000142: SWAP1
00000143: DUP2
00000144: AND
00000145: PUSH1 0x00
00000147: SWAP1
00000148: DUP2
00000149: MSTORE
0000014a: PUSH1 0x07
0000014c: PUSH1 0x20
0000014e: SWAP1
0000014f: DUP2
00000150: MSTORE
00000151: PUSH1 0x40
00000153: DUP1
00000154: DUP4
00000155: KECCAK256
00000156: PUSH1 0x04
00000158: CALLDATALOAD
00000159: SWAP1
0000015a: SWAP5
0000015b: AND
0000015c: DUP4
0000015d: MSTORE
0000015e: SWAP3
0000015f: SWAP1
00000160: MSTORE
00000161: SWAP1
00000162: DUP2
00000163: KECCAK256
00000164: PUSH1 0x24
00000166: CALLDATALOAD
00000167: SWAP1
00000168: SSTORE
00000169: JUMPDEST
0000016a: PUSH1 0x60
0000016c: SWAP1
0000016d: DUP2
0000016e: MSTORE
0000016f: PUSH1 0x20
00000171: SWAP1
00000172: RETURN
00000173: JUMPDEST
00000174: PUSH2 0x0169
00000177: PUSH1 0x04
00000179: SLOAD
0000017a: DUP2
0000017b: JUMP
0000017c: JUMPDEST
0000017d: PUSH2 0x0169
00000180: PUSH1 0x04
00000182: CALLDATALOAD
00000183: PUSH1 0x24
00000185: CALLDATALOAD
00000186: PUSH1 0x44
00000188: CALLDATALOAD
00000189: PUSH1 0x01
0000018b: PUSH1 0xa0
0000018d: PUSH1 0x02
0000018f: EXP
00000190: SUB
00000191: DUP4
00000192: AND
00000193: PUSH1 0x00
00000195: SWAP1
00000196: DUP2
00000197: MSTORE
00000198: PUSH1 0x05
0000019a: PUSH1 0x20
0000019c: MSTORE
0000019d: PUSH1 0x40
0000019f: DUP2
000001a0: KECCAK256
000001a1: SLOAD
000001a2: DUP3
000001a3: SWAP1
000001a4: LT
000001a5: ISZERO
000001a6: PUSH2 0x05a5
000001a9: JUMPI
000001aa: PUSH2 0x0002
000001ad: JUMP
000001ae: JUMPDEST
000001af: PUSH2 0x0169
000001b2: PUSH1 0x03
000001b4: SLOAD
000001b5: PUSH1 0xff
000001b7: AND
000001b8: DUP2
000001b9: JUMP
000001ba: JUMPDEST
000001bb: PUSH2 0x0169
000001be: PUSH1 0x04
000001c0: CALLDATALOAD
000001c1: PUSH1 0x05
000001c3: PUSH1 0x20
000001c5: MSTORE
000001c6: PUSH1 0x00
000001c8: SWAP1
000001c9: DUP2
000001ca: MSTORE
000001cb: PUSH1 0x40
000001cd: SWAP1
000001ce: KECCAK256
000001cf: SLOAD
000001d0: DUP2
000001d1: JUMP
000001d2: JUMPDEST
000001d3: PUSH2 0x033a
000001d6: PUSH1 0x04
000001d8: CALLDATALOAD
000001d9: PUSH1 0x24
000001db: CALLDATALOAD
000001dc: PUSH1 0x00
000001de: SLOAD
000001df: CALLER
000001e0: PUSH1 0x01
000001e2: PUSH1 0xa0
000001e4: PUSH1 0x02
000001e6: EXP
000001e7: SUB
000001e8: SWAP1
000001e9: DUP2
000001ea: AND
000001eb: SWAP2
000001ec: AND
000001ed: EQ
000001ee: PUSH2 0x049f
000001f1: JUMPI
000001f2: PUSH2 0x0002
000001f5: JUMP
000001f6: JUMPDEST
000001f7: PUSH2 0x0169
000001fa: PUSH1 0x00
000001fc: SLOAD
000001fd: PUSH1 0x01
000001ff: PUSH1 0xa0
00000201: PUSH1 0x02
00000203: EXP
00000204: SUB
00000205: AND
00000206: DUP2
00000207: JUMP
00000208: JUMPDEST
00000209: PUSH2 0x033c
0000020c: PUSH1 0x02
0000020e: DUP1
0000020f: SLOAD
00000210: PUSH1 0x20
00000212: PUSH1 0x1f
00000214: PUSH1 0x00
00000216: NOT
00000217: PUSH1 0x01
00000219: DUP5
0000021a: AND
0000021b: ISZERO
0000021c: PUSH2 0x0100
0000021f: MUL
00000220: ADD
00000221: SWAP1
00000222: SWAP3
00000223: AND
00000224: DUP4
00000225: SWAP1
00000226: DIV
00000227: SWAP2
00000228: DUP3
00000229: ADD
0000022a: DUP2
0000022b: SWAP1
0000022c: DIV
0000022d: MUL
0000022e: PUSH1 0x80
00000230: SWAP1
00000231: DUP2
00000232: ADD
00000233: PUSH1 0x40
00000235: MSTORE
00000236: PUSH1 0x60
00000238: DUP3
00000239: DUP2
0000023a: MSTORE
0000023b: SWAP3
0000023c: SWAP2
0000023d: SWAP1
0000023e: DUP3
0000023f: DUP3
00000240: DUP1
00000241: ISZERO
00000242: PUSH2 0x059d
00000245: JUMPI
00000246: DUP1
00000247: PUSH1 0x1f
00000249: LT
0000024a: PUSH2 0x0572
0000024d: JUMPI
0000024e: PUSH2 0x0100
00000251: DUP1
00000252: DUP4
00000253: SLOAD
00000254: DIV
00000255: MUL
00000256: DUP4
00000257: MSTORE
00000258: SWAP2
00000259: PUSH1 0x20
0000025b: ADD
0000025c: SWAP2
0000025d: PUSH2 0x059d
00000260: JUMP
00000261: JUMPDEST
00000262: PUSH2 0x033a
00000265: PUSH1 0x04
00000267: CALLDATALOAD
00000268: PUSH1 0x24
0000026a: CALLDATALOAD
0000026b: CALLER
0000026c: PUSH1 0x01
0000026e: PUSH1 0xa0
00000270: PUSH1 0x02
00000272: EXP
00000273: SUB
00000274: AND
00000275: PUSH1 0x00
00000277: SWAP1
00000278: DUP2
00000279: MSTORE
0000027a: PUSH1 0x05
0000027c: PUSH1 0x20
0000027e: MSTORE
0000027f: PUSH1 0x40
00000281: SWAP1
00000282: KECCAK256
00000283: SLOAD
00000284: DUP2
00000285: SWAP1
00000286: LT
00000287: ISZERO
00000288: PUSH2 0x03aa
0000028b: JUMPI
0000028c: PUSH2 0x0002
0000028f: JUMP
00000290: JUMPDEST
00000291: PUSH2 0x0169
00000294: PUSH1 0x04
00000296: CALLDATALOAD
00000297: PUSH1 0x06
00000299: PUSH1 0x20
0000029b: MSTORE
0000029c: PUSH1 0x00
0000029e: SWAP1
0000029f: DUP2
000002a0: MSTORE
000002a1: PUSH1 0x40
000002a3: SWAP1
000002a4: KECCAK256
000002a5: SLOAD
000002a6: PUSH1 0xff
000002a8: AND
000002a9: DUP2
000002aa: JUMP
000002ab: JUMPDEST
000002ac: PUSH1 0x08
000002ae: PUSH1 0x20
000002b0: SWAP1
000002b1: DUP2
000002b2: MSTORE
000002b3: PUSH1 0x04
000002b5: CALLDATALOAD
000002b6: PUSH1 0x00
000002b8: SWAP1
000002b9: DUP2
000002ba: MSTORE
000002bb: PUSH1 0x40
000002bd: DUP1
000002be: DUP3
000002bf: KECCAK256
000002c0: SWAP1
000002c1: SWAP3
000002c2: MSTORE
000002c3: PUSH1 0x24
000002c5: CALLDATALOAD
000002c6: DUP2
000002c7: MSTORE
000002c8: KECCAK256
000002c9: SLOAD
000002ca: PUSH2 0x0169
000002cd: SWAP1
000002ce: DUP2
000002cf: JUMP
000002d0: JUMPDEST
000002d1: PUSH1 0x07
000002d3: PUSH1 0x20
000002d5: SWAP1
000002d6: DUP2
000002d7: MSTORE
000002d8: PUSH1 0x04
000002da: CALLDATALOAD
000002db: PUSH1 0x00
000002dd: SWAP1
000002de: DUP2
000002df: MSTORE
000002e0: PUSH1 0x40
000002e2: DUP1
000002e3: DUP3
000002e4: KECCAK256
000002e5: SWAP1
000002e6: SWAP3
000002e7: MSTORE
000002e8: PUSH1 0x24
000002ea: CALLDATALOAD
000002eb: DUP2
000002ec: MSTORE
000002ed: KECCAK256
000002ee: SLOAD
000002ef: PUSH2 0x0169
000002f2: SWAP1
000002f3: DUP2
000002f4: JUMP
000002f5: JUMPDEST
000002f6: PUSH2 0x033a
000002f9: PUSH1 0x04
000002fb: CALLDATALOAD
000002fc: PUSH1 0x24
000002fe: CALLDATALOAD
000002ff: PUSH1 0x00
00000301: SLOAD
00000302: CALLER
00000303: PUSH1 0x01
00000305: PUSH1 0xa0
00000307: PUSH1 0x02
00000309: EXP
0000030a: SUB
0000030b: SWAP1
0000030c: DUP2
0000030d: AND
0000030e: SWAP2
0000030f: AND
00000310: EQ
00000311: PUSH2 0x04fb
00000314: JUMPI
00000315: PUSH2 0x0002
00000318: JUMP
00000319: JUMPDEST
0000031a: PUSH2 0x033a
0000031d: PUSH1 0x04
0000031f: CALLDATALOAD
00000320: PUSH1 0x00
00000322: SLOAD
00000323: CALLER
00000324: PUSH1 0x01
00000326: PUSH1 0xa0
00000328: PUSH1 0x02
0000032a: EXP
0000032b: SUB
0000032c: SWAP1
0000032d: DUP2
0000032e: AND
0000032f: SWAP2
00000330: AND
00000331: EQ
00000332: PUSH2 0x0550
00000335: JUMPI
00000336: PUSH2 0x0002
00000339: JUMP
0000033a: JUMPDEST
0000033b: STOP
0000033c: JUMPDEST
0000033d: PUSH1 0x40
0000033f: MLOAD
00000340: DUP1
00000341: DUP1
00000342: PUSH1 0x20
00000344: ADD
00000345: DUP3
00000346: DUP2
00000347: SUB
00000348: DUP3
00000349: MSTORE
0000034a: DUP4
0000034b: DUP2
0000034c: DUP2
0000034d: MLOAD
0000034e: DUP2
0000034f: MSTORE
00000350: PUSH1 0x20
00000352: ADD
00000353: SWAP2
00000354: POP
00000355: DUP1
00000356: MLOAD
00000357: SWAP1
00000358: PUSH1 0x20
0000035a: ADD
0000035b: SWAP1
0000035c: DUP1
0000035d: DUP4
0000035e: DUP4
0000035f: DUP3
00000360: SWAP1
00000361: PUSH1 0x00
00000363: PUSH1 0x04
00000365: PUSH1 0x20
00000367: DUP5
00000368: PUSH1 0x1f
0000036a: ADD
0000036b: DIV
0000036c: PUSH1 0x0f
0000036e: MUL
0000036f: PUSH1 0x03
00000371: ADD
00000372: CALL
00000373: POP
00000374: SWAP1
00000375: POP
00000376: SWAP1
00000377: DUP2
00000378: ADD
00000379: SWAP1
0000037a: PUSH1 0x1f
0000037c: AND
0000037d: DUP1
0000037e: ISZERO
0000037f: PUSH2 0x039c
00000382: JUMPI
00000383: DUP1
00000384: DUP3
00000385: SUB
00000386: DUP1
00000387: MLOAD
00000388: PUSH1 0x01
0000038a: DUP4
0000038b: PUSH1 0x20
0000038d: SUB
0000038e: PUSH2 0x0100
00000391: EXP
00000392: SUB
00000393: NOT
00000394: AND
00000395: DUP2
00000396: MSTORE
00000397: PUSH1 0x20
00000399: ADD
0000039a: SWAP2
0000039b: POP
0000039c: JUMPDEST
0000039d: POP
0000039e: SWAP3
0000039f: POP
000003a0: POP
000003a1: POP
000003a2: PUSH1 0x40
000003a4: MLOAD
000003a5: DUP1
000003a6: SWAP2
000003a7: SUB
000003a8: SWAP1
000003a9: RETURN
000003aa: JUMPDEST
000003ab: PUSH1 0x01
000003ad: PUSH1 0xa0
000003af: PUSH1 0x02
000003b1: EXP
000003b2: SUB
000003b3: DUP3
000003b4: AND
000003b5: PUSH1 0x00
000003b7: SWAP1
000003b8: DUP2
000003b9: MSTORE
000003ba: PUSH1 0x40
000003bc: SWAP1
000003bd: KECCAK256
000003be: SLOAD
000003bf: DUP1
000003c0: DUP3
000003c1: ADD
000003c2: LT
000003c3: ISZERO
000003c4: PUSH2 0x03cc
000003c7: JUMPI
000003c8: PUSH2 0x0002
000003cb: JUMP
000003cc: JUMPDEST
000003cd: CALLER
000003ce: PUSH1 0x01
000003d0: PUSH1 0xa0
000003d2: PUSH1 0x02
000003d4: EXP
000003d5: SUB
000003d6: AND
000003d7: PUSH1 0x00
000003d9: SWAP1
000003da: DUP2
000003db: MSTORE
000003dc: PUSH1 0x06
000003de: PUSH1 0x20
000003e0: MSTORE
000003e1: PUSH1 0x40
000003e3: SWAP1
000003e4: KECCAK256
000003e5: SLOAD
000003e6: PUSH1 0xff
000003e8: AND
000003e9: ISZERO
000003ea: PUSH2 0x03f2
000003ed: JUMPI
000003ee: PUSH2 0x0002
000003f1: JUMP
000003f2: JUMPDEST
000003f3: DUP1
000003f4: PUSH1 0x05
000003f6: PUSH1 0x00
000003f8: POP
000003f9: PUSH1 0x00
000003fb: CALLER
000003fc: PUSH1 0x01
000003fe: PUSH1 0xa0
00000400: PUSH1 0x02
00000402: EXP
00000403: SUB
00000404: AND
00000405: DUP2
00000406: MSTORE
00000407: PUSH1 0x20
00000409: ADD
0000040a: SWAP1
0000040b: DUP2
0000040c: MSTORE
0000040d: PUSH1 0x20
0000040f: ADD
00000410: PUSH1 0x00
00000412: KECCAK256
00000413: PUSH1 0x00
00000415: DUP3
00000416: DUP3
00000417: DUP3
00000418: POP
00000419: SLOAD
0000041a: SUB
0000041b: SWAP3
0000041c: POP
0000041d: POP
0000041e: DUP2
0000041f: SWAP1
00000420: SSTORE
00000421: POP
00000422: DUP1
00000423: PUSH1 0x05
00000425: PUSH1 0x00
00000427: POP
00000428: PUSH1 0x00
0000042a: DUP5
0000042b: PUSH1 0x01
0000042d: PUSH1 0xa0
0000042f: PUSH1 0x02
00000431: EXP
00000432: SUB
00000433: AND
00000434: DUP2
00000435: MSTORE
00000436: PUSH1 0x20
00000438: ADD
00000439: SWAP1
0000043a: DUP2
0000043b: MSTORE
0000043c: PUSH1 0x20
0000043e: ADD
0000043f: PUSH1 0x00
00000441: KECCAK256
00000442: PUSH1 0x00
00000444: DUP3
00000445: DUP3
00000446: DUP3
00000447: POP
00000448: SLOAD
00000449: ADD
0000044a: SWAP3
0000044b: POP
0000044c: POP
0000044d: DUP2
0000044e: SWAP1
0000044f: SSTORE
00000450: POP
00000451: DUP2
00000452: PUSH1 0x01
00000454: PUSH1 0xa0
00000456: PUSH1 0x02
00000458: EXP
00000459: SUB
0000045a: AND
0000045b: CALLER
0000045c: PUSH1 0x01
0000045e: PUSH1 0xa0
00000460: PUSH1 0x02
00000462: EXP
00000463: SUB
00000464: AND
00000465: PUSH32 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef
00000486: DUP4
00000487: PUSH1 0x40
00000489: MLOAD
0000048a: DUP1
0000048b: DUP3
0000048c: DUP2
0000048d: MSTORE
0000048e: PUSH1 0x20
00000490: ADD
00000491: SWAP2
00000492: POP
00000493: POP
00000494: PUSH1 0x40
00000496: MLOAD
00000497: DUP1
00000498: SWAP2
00000499: SUB
0000049a: SWAP1
0000049b: LOG3
0000049c: POP
0000049d: POP
0000049e: JUMP
0000049f: JUMPDEST
000004a0: PUSH1 0x01
000004a2: PUSH1 0xa0
000004a4: PUSH1 0x02
000004a6: EXP
000004a7: SUB
000004a8: DUP3
000004a9: DUP2
000004aa: AND
000004ab: PUSH1 0x00
000004ad: DUP2
000004ae: DUP2
000004af: MSTORE
000004b0: PUSH1 0x05
000004b2: PUSH1 0x20
000004b4: SWAP1
000004b5: DUP2
000004b6: MSTORE
000004b7: PUSH1 0x40
000004b9: DUP3
000004ba: KECCAK256
000004bb: DUP1
000004bc: SLOAD
000004bd: DUP7
000004be: ADD
000004bf: SWAP1
000004c0: SSTORE
000004c1: PUSH1 0x04
000004c3: DUP1
000004c4: SLOAD
000004c5: DUP7
000004c6: ADD
000004c7: SWAP1
000004c8: SSTORE
000004c9: SWAP1
000004ca: SLOAD
000004cb: PUSH1 0x60
000004cd: DUP6
000004ce: DUP2
000004cf: MSTORE
000004d0: SWAP3
000004d1: SWAP4
000004d2: AND
000004d3: SWAP2
000004d4: PUSH32 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef
000004f5: SWAP2
000004f6: SWAP1
000004f7: LOG3
000004f8: POP
000004f9: POP
000004fa: JUMP
000004fb: JUMPDEST
000004fc: PUSH1 0x01
000004fe: PUSH1 0xa0
00000500: PUSH1 0x02
00000502: EXP
00000503: SUB
00000504: DUP3
00000505: AND
00000506: PUSH1 0x00
00000508: DUP2
00000509: DUP2
0000050a: MSTORE
0000050b: PUSH1 0x06
0000050d: PUSH1 0x20
0000050f: MSTORE
00000510: PUSH1 0x40
00000512: SWAP1
00000513: DUP2
00000514: SWAP1
00000515: KECCAK256
00000516: DUP1
00000517: SLOAD
00000518: PUSH1 0xff
0000051a: NOT
0000051b: AND
0000051c: DUP5
0000051d: OR
0000051e: SWAP1
0000051f: SSTORE
00000520: PUSH1 0x60
00000522: SWAP2
00000523: DUP3
00000524: MSTORE
00000525: PUSH1 0x80
00000527: DUP4
00000528: SWAP1
00000529: MSTORE
0000052a: PUSH32 0x48335238b4855f35377ed80f164e8c6f3c366e54ac00b96a6402d4a9814a03a5
0000054b: SWAP2
0000054c: LOG1
0000054d: POP
0000054e: POP
0000054f: JUMP
00000550: JUMPDEST
00000551: PUSH1 0x00
00000553: DUP1
00000554: SLOAD
00000555: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
0000056a: NOT
0000056b: AND
0000056c: DUP3
0000056d: OR
0000056e: SWAP1
0000056f: SSTORE
00000570: POP
00000571: JUMP
00000572: JUMPDEST
00000573: DUP3
00000574: ADD
00000575: SWAP2
00000576: SWAP1
00000577: PUSH1 0x00
00000579: MSTORE
0000057a: PUSH1 0x20
0000057c: PUSH1 0x00
0000057e: KECCAK256
0000057f: SWAP1
00000580: JUMPDEST
00000581: DUP2
00000582: SLOAD
00000583: DUP2
00000584: MSTORE
00000585: SWAP1
00000586: PUSH1 0x01
00000588: ADD
00000589: SWAP1
0000058a: PUSH1 0x20
0000058c: ADD
0000058d: DUP1
0000058e: DUP4
0000058f: GT
00000590: PUSH2 0x0580
00000593: JUMPI
00000594: DUP3
00000595: SWAP1
00000596: SUB
00000597: PUSH1 0x1f
00000599: AND
0000059a: DUP3
0000059b: ADD
0000059c: SWAP2
0000059d: JUMPDEST
0000059e: POP
0000059f: POP
000005a0: POP
000005a1: POP
000005a2: POP
000005a3: DUP2
000005a4: JUMP
000005a5: JUMPDEST
000005a6: PUSH1 0x01
000005a8: PUSH1 0xa0
000005aa: PUSH1 0x02
000005ac: EXP
000005ad: SUB
000005ae: DUP4
000005af: AND
000005b0: DUP2
000005b1: MSTORE
000005b2: PUSH1 0x40
000005b4: DUP2
000005b5: KECCAK256
000005b6: SLOAD
000005b7: DUP3
000005b8: DUP2
000005b9: ADD
000005ba: LT
000005bb: ISZERO
000005bc: PUSH2 0x05c4
000005bf: JUMPI
000005c0: PUSH2 0x0002
000005c3: JUMP
000005c4: JUMPDEST
000005c5: PUSH1 0x01
000005c7: PUSH1 0xa0
000005c9: PUSH1 0x02
000005cb: EXP
000005cc: SUB
000005cd: DUP5
000005ce: AND
000005cf: DUP2
000005d0: MSTORE
000005d1: PUSH1 0x06
000005d3: PUSH1 0x20
000005d5: MSTORE
000005d6: PUSH1 0x40
000005d8: DUP2
000005d9: KECCAK256
000005da: SLOAD
000005db: PUSH1 0xff
000005dd: AND
000005de: ISZERO
000005df: PUSH2 0x05e7
000005e2: JUMPI
000005e3: PUSH2 0x0002
000005e6: JUMP
000005e7: JUMPDEST
000005e8: PUSH1 0x07
000005ea: PUSH1 0x20
000005ec: SWAP1
000005ed: DUP2
000005ee: MSTORE
000005ef: PUSH1 0x40
000005f1: DUP1
000005f2: DUP4
000005f3: KECCAK256
000005f4: CALLER
000005f5: PUSH1 0x01
000005f7: PUSH1 0xa0
000005f9: PUSH1 0x02
000005fb: EXP
000005fc: SUB
000005fd: SWAP1
000005fe: DUP2
000005ff: AND
00000600: DUP1
00000601: DUP7
00000602: MSTORE
00000603: SWAP2
00000604: DUP5
00000605: MSTORE
00000606: DUP3
00000607: DUP6
00000608: KECCAK256
00000609: SLOAD
0000060a: SWAP1
0000060b: DUP9
0000060c: AND
0000060d: DUP6
0000060e: MSTORE
0000060f: PUSH1 0x08
00000611: DUP5
00000612: MSTORE
00000613: DUP3
00000614: DUP6
00000615: KECCAK256
00000616: SWAP2
00000617: DUP6
00000618: MSTORE
00000619: SWAP3
0000061a: MSTORE
0000061b: DUP3
0000061c: KECCAK256
0000061d: SLOAD
0000061e: DUP4
0000061f: ADD
00000620: GT
00000621: ISZERO
00000622: PUSH2 0x062a
00000625: JUMPI
00000626: PUSH2 0x0002
00000629: JUMP
0000062a: JUMPDEST
0000062b: DUP2
0000062c: PUSH1 0x05
0000062e: PUSH1 0x00
00000630: POP
00000631: PUSH1 0x00
00000633: DUP7
00000634: PUSH1 0x01
00000636: PUSH1 0xa0
00000638: PUSH1 0x02
0000063a: EXP
0000063b: SUB
0000063c: AND
0000063d: DUP2
0000063e: MSTORE
0000063f: PUSH1 0x20
00000641: ADD
00000642: SWAP1
00000643: DUP2
00000644: MSTORE
00000645: PUSH1 0x20
00000647: ADD
00000648: PUSH1 0x00
0000064a: KECCAK256
0000064b: PUSH1 0x00
0000064d: DUP3
0000064e: DUP3
0000064f: DUP3
00000650: POP
00000651: SLOAD
00000652: SUB
00000653: SWAP3
00000654: POP
00000655: POP
00000656: DUP2
00000657: SWAP1
00000658: SSTORE
00000659: POP
0000065a: DUP2
0000065b: PUSH1 0x05
0000065d: PUSH1 0x00
0000065f: POP
00000660: PUSH1 0x00
00000662: DUP6
00000663: PUSH1 0x01
00000665: PUSH1 0xa0
00000667: PUSH1 0x02
00000669: EXP
0000066a: SUB
0000066b: AND
0000066c: DUP2
0000066d: MSTORE
0000066e: PUSH1 0x20
00000670: ADD
00000671: SWAP1
00000672: DUP2
00000673: MSTORE
00000674: PUSH1 0x20
00000676: ADD
00000677: PUSH1 0x00
00000679: KECCAK256
0000067a: PUSH1 0x00
0000067c: DUP3
0000067d: DUP3
0000067e: DUP3
0000067f: POP
00000680: SLOAD
00000681: ADD
00000682: SWAP3
00000683: POP
00000684: POP
00000685: DUP2
00000686: SWAP1
00000687: SSTORE
00000688: POP
00000689: DUP2
0000068a: PUSH1 0x08
0000068c: PUSH1 0x00
0000068e: POP
0000068f: PUSH1 0x00
00000691: DUP7
00000692: PUSH1 0x01
00000694: PUSH1 0xa0
00000696: PUSH1 0x02
00000698: EXP
00000699: SUB
0000069a: AND
0000069b: DUP2
0000069c: MSTORE
0000069d: PUSH1 0x20
0000069f: ADD
000006a0: SWAP1
000006a1: DUP2
000006a2: MSTORE
000006a3: PUSH1 0x20
000006a5: ADD
000006a6: PUSH1 0x00
000006a8: KECCAK256
000006a9: PUSH1 0x00
000006ab: POP
000006ac: PUSH1 0x00
000006ae: CALLER
000006af: PUSH1 0x01
000006b1: PUSH1 0xa0
000006b3: PUSH1 0x02
000006b5: EXP
000006b6: SUB
000006b7: AND
000006b8: DUP2
000006b9: MSTORE
000006ba: PUSH1 0x20
000006bc: ADD
000006bd: SWAP1
000006be: DUP2
000006bf: MSTORE
000006c0: PUSH1 0x20
000006c2: ADD
000006c3: PUSH1 0x00
000006c5: KECCAK256
000006c6: PUSH1 0x00
000006c8: DUP3
000006c9: DUP3
000006ca: DUP3
000006cb: POP
000006cc: SLOAD
000006cd: ADD
000006ce: SWAP3
000006cf: POP
000006d0: POP
000006d1: DUP2
000006d2: SWAP1
000006d3: SSTORE
000006d4: POP
000006d5: DUP3
000006d6: PUSH1 0x01
000006d8: PUSH1 0xa0
000006da: PUSH1 0x02
000006dc: EXP
000006dd: SUB
000006de: AND
000006df: CALLER
000006e0: PUSH1 0x01
000006e2: PUSH1 0xa0
000006e4: PUSH1 0x02
000006e6: EXP
000006e7: SUB
000006e8: AND
000006e9: PUSH32 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef
0000070a: DUP5
0000070b: PUSH1 0x40
0000070d: MLOAD
0000070e: DUP1
0000070f: DUP3
00000710: DUP2
00000711: MSTORE
00000712: PUSH1 0x20
00000714: ADD
00000715: SWAP2
00000716: POP
00000717: POP
00000718: PUSH1 0x40
0000071a: MLOAD
0000071b: DUP1
0000071c: SWAP2
0000071d: SUB
0000071e: SWAP1
0000071f: LOG3
00000720: SWAP4
00000721: SWAP3
00000722: POP
00000723: POP
00000724: POP
00000725: JUMP
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 Untrusted CALL target/value reachable 60 yes yes
view
trace_id: 0x27530d797743a09ac645a3bec8313b46b16b19c509b18f0cbcc1ccebe88df009
call_targets: 0x0000000000000000000000000000000000000004, 0x1f75047233517dcf67970d9e3c3bb385cb647f30
target_varies: yes
classification: target_varies
validation_json
{
    "sink": "CALL",
    "errors": 0,
    "status": "confirmed",
    "attempts": 1,
    "trace_id": "0x27530d797743a09ac645a3bec8313b46b16b19c509b18f0cbcc1ccebe88df009",
    "confirmed": true,
    "trace_mode": "callTracer",
    "call_targets": [
        "0x0000000000000000000000000000000000000004",
        "0x1f75047233517dcf67970d9e3c3bb385cb647f30"
    ],
    "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": "0x06fdde03",
            "selector": "0x06fdde03",
            "calldata_variants": [
                "0x06fdde03",
                "0x06fdde030000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0x095ea7b3",
            "selector": "0x095ea7b3",
            "calldata_variants": [
                "0x095ea7b3",
                "0x095ea7b30000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0x18160ddd",
            "selector": "0x18160ddd",
            "calldata_variants": [
                "0x18160ddd",
                "0x18160ddd0000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0x23b872dd",
            "selector": "0x23b872dd",
            "calldata_variants": [
                "0x23b872dd",
                "0x23b872dd0000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0x313ce567",
            "selector": "0x313ce567",
            "calldata_variants": [
                "0x313ce567",
                "0x313ce5670000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0x70a08231",
            "selector": "0x70a08231",
            "calldata_variants": [
                "0x70a08231",
                "0x70a082310000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0x79c65068",
            "selector": "0x79c65068",
            "calldata_variants": [
                "0x79c65068",
                "0x79c650680000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0x8da5cb5b",
            "selector": "0x8da5cb5b",
            "calldata_variants": [
                "0x8da5cb5b",
                "0x8da5cb5b0000000000000000000000000000000000000000000000000000000000000000"
            ]
        }
    ]
}
evidence_json
{
    "examples": [
        {
            "pc": 213,
            "opcode": "CALL",
            "returndata_checked": null,
            "value_expression_category": "computed",
            "target_expression_category": "computed"
        },
        {
            "pc": 882,
            "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 yes yes
view
trace_id: 0x27530d797743a09ac645a3bec8313b46b16b19c509b18f0cbcc1ccebe88df009
call_targets: 0x0000000000000000000000000000000000000004, 0x1f75047233517dcf67970d9e3c3bb385cb647f30
target_varies: yes
classification: target_varies
validation_json
{
    "sink": "CALL",
    "errors": 0,
    "status": "confirmed",
    "attempts": 1,
    "trace_id": "0x27530d797743a09ac645a3bec8313b46b16b19c509b18f0cbcc1ccebe88df009",
    "confirmed": true,
    "trace_mode": "callTracer",
    "call_targets": [
        "0x0000000000000000000000000000000000000004",
        "0x1f75047233517dcf67970d9e3c3bb385cb647f30"
    ],
    "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": "0x06fdde03",
            "selector": "0x06fdde03",
            "calldata_variants": [
                "0x06fdde03",
                "0x06fdde030000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0x095ea7b3",
            "selector": "0x095ea7b3",
            "calldata_variants": [
                "0x095ea7b3",
                "0x095ea7b30000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0x18160ddd",
            "selector": "0x18160ddd",
            "calldata_variants": [
                "0x18160ddd",
                "0x18160ddd0000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0x23b872dd",
            "selector": "0x23b872dd",
            "calldata_variants": [
                "0x23b872dd",
                "0x23b872dd0000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0x313ce567",
            "selector": "0x313ce567",
            "calldata_variants": [
                "0x313ce567",
                "0x313ce5670000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0x70a08231",
            "selector": "0x70a08231",
            "calldata_variants": [
                "0x70a08231",
                "0x70a082310000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0x79c65068",
            "selector": "0x79c65068",
            "calldata_variants": [
                "0x79c65068",
                "0x79c650680000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0x8da5cb5b",
            "selector": "0x8da5cb5b",
            "calldata_variants": [
                "0x8da5cb5b",
                "0x8da5cb5b0000000000000000000000000000000000000000000000000000000000000000"
            ]
        }
    ]
}
evidence_json
{
    "examples": [
        {
            "pc": 213,
            "opcode": "CALL",
            "returndata_checked": null,
            "value_expression_category": "computed",
            "target_expression_category": "computed"
        },
        {
            "pc": 882,
            "opcode": "CALL",
            "returndata_checked": null,
            "value_expression_category": "computed",
            "target_expression_category": "computed"
        }
    ],
    "eth_value_calls": 2,
    "guards_detected": []
}
medium access_control codex Frozen/blacklisted spender can likely bypass restrictions through transferFrom 75 no
view
evidence_json
{
    "evidence": "Selector 0xb414d4b6 reads slot 6, and owner-gated selector 0xe724529c writes slot 6, so slot 6 is very likely an account-status mapping. In selector 0xa9059cbb, the transfer path checks slot6[CALLER] at pc 0x03cd-0x03e9. In selector 0x23b872dd, the transferFrom path checks slot6[from] at pc 0x05c4-0x05e7, while CALLER appears only later for allowance indexing at pc 0x05f4 onward. No equivalent slot6[CALLER] check is visible in transferFrom.",
    "locations": [
        "selector:0xa9059cbb",
        "selector:0x23b872dd",
        "selector:0xe724529c",
        "selector:0xb414d4b6",
        "pc:0x03cd",
        "pc:0x05c4",
        "pc:0x05f4"
    ],
    "recommendation": "Apply the same freeze/blacklist check to CALLER inside the transferFrom path, and if the intended policy is stricter, also reject transfers to frozen recipients. Keep the enforcement consistent across transfer and transferFrom.",
    "exploit_scenario": "If slot 6 is the freeze/blacklist mapping, an address marked there is blocked from direct transfers but can still move third-party funds via existing approvals. A spender that was blacklisted after users approved it can keep calling transferFrom and drain approved balances from unfrozen holders."
}
medium other codex Allowance accounting uses a separate spent ledger, so allowance() likely overstates remaining spendable approval 75 no
view
evidence_json
{
    "evidence": "Selector 0x095ea7b3 writes only the nested mapping rooted at slot 7 at pc 0x0153-0x0168. Selector 0xdd62ed3e reads only the nested mapping rooted at slot 7 at pc 0x02d0-0x02ef. But selector 0x23b872dd also reads a second nested mapping rooted at slot 8 at pc 0x060f-0x061d and later increments that slot-8 mapping at pc 0x0689-0x06d3, while no matching decrement of slot 7 is visible in transferFrom. Exact comparator direction is somewhat uncertain from bytecode alone, but the separate spent-ledger design is clear.",
    "locations": [
        "selector:0x095ea7b3",
        "selector:0xdd62ed3e",
        "selector:0x23b872dd",
        "selector:0xdc3080f2",
        "pc:0x0168",
        "pc:0x02ee",
        "pc:0x060f",
        "pc:0x061d",
        "pc:0x0689",
        "pc:0x06d3"
    ],
    "recommendation": "Use standard ERC20 allowance semantics: decrement the allowance mapping consumed by transferFrom, and make allowance() return the actual remaining spendable amount. If a spent ledger is required, expose and document it clearly and avoid presenting slot 7 as the effective allowance.",
    "exploit_scenario": "Integrators or users can observe a nonzero allowance via allowance(owner,spender) and assume transferFrom should succeed, but the runtime also tracks a second nested mapping in slot 8 and gates transferFrom on both values. This creates non-ERC20 behavior that can break routers, vaults, and permit/approval workflows that rely on allowance() as the authoritative remaining approval."
}
low other codex Fallback exposes an unchecked low-level CALL with ETH value 65 no
view
evidence_json
{
    "evidence": "The fallback entry starts at pc 0x00b9 and reaches CALL at pc 0x00d5. The bundle's detector findings confirm a reachable CALL with nonzero ETH value potential at pc 213, and no auth guards were detected heuristically. The CALL result is immediately POPed, so success is unchecked. The other detected CALL at pc 0x0372 is the common identity-precompile helper for dynamic string returns and is not reported here as an untrusted external call.",
    "locations": [
        "pc:0x00b9",
        "pc:0x00d5"
    ],
    "recommendation": "Avoid performing low-level CALL from the fallback. If forwarding ETH is intentional, require success explicitly and consider a dedicated withdraw/forward function with clear access control and event logging.",
    "exploit_scenario": "A plain ETH transfer or unknown-selector call reaches the fallback and executes a CALL at pc 0x00d5. Because the return value is discarded, a failing external call does not revert. This can silently strand ETH in the contract or trigger unexpected code execution in the external callee without any explicit success handling."
}