019b3836-2cf4-7353-96b1-83115f1b65d9
Open this run to answer one question: is this real attacker-relevant behavior with real impact, or just normal contract plumbing?
| 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 |
No slither job recorded yet.
{"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"]}]}
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
{
"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
}
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
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.
| Severity | Category | Tool | Title | Confidence | Validated | Confirmed | Details |
|---|---|---|---|---|---|---|---|
| high | other | detector | Untrusted CALL target/value reachable | 60 | yes | yes |
viewtrace_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 |
viewtrace_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 | — |
viewevidence_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 | — |
viewevidence_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 | — |
viewevidence_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."
}
|