019b3836-3278-73cd-b85f-dc1b759c448b
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 |
|---|---|---|---|---|
| 2959 | artifact.fetch | complete | 1 / 3 | 3 months ago |
| 2960 | tool.cast_disasm | complete | 1 / 3 | 3 months ago |
| 46204 | analysis.bundle | complete | 1 / 3 | 1 week ago |
| 46205 | capability.graph | complete | 1 / 3 | 1 week ago |
| 46206 | detector.run | complete | 1 / 3 | 1 week ago |
| 46207 | validation.fork | complete | 1 / 3 | 1 week ago |
| 113258 | report.consolidate | complete | 1 / 6 | 1 week ago |
No slither job recorded yet.
{"no_findings":false,"summary":"Bytecode strongly resembles an old ERC-20 variant with one critical issue: a publicly callable constructor-like function can reset metadata and assign a fresh token balance to any caller. There is also a medium-confidence allowance/accounting deviation where `allowance()` appears to report the original approval while `transferFrom` tracks spent amount in a second mapping, so remaining spendable allowance is not what the standard getter returns.","findings":[{"severity":"critical","category":"access_control","title":"Public constructor-like function lets any caller mint/reset token state","exploit_scenario":"An attacker calls selector `0x1d2bca17` directly. The routine writes `0x0bde31` into the caller-derived slot under mapping slot `0x03`, then overwrites the metadata slots used by the token (`slot 0`, `slot 1`, and low byte of `slot 2`). Because no guard is detected, any account can invoke it to grant itself a fresh balance and repeat after spending, effectively breaking token supply integrity.","recommendation":"Remove or permanently disable this initializer path. If this was meant to be a constructor, replace it with an actual constructor/one-time initializer guard and prevent any post-deployment entry. If already deployed, treat the token as compromised unless this selector is provably unreachable through a proxy/admin wrapper.","evidence":"Dispatcher routes `0x1d2bca17` to `pc 0x00e8`. Within that path, the code computes a `CALLER`-keyed hash for slot `0x03` and stores constant `0x0bde31` (`pc 0x0177`-`0x018f`). It then stores hardcoded metadata into storage: name-like data in `slot 0` (`pc 0x0198`-`0x01d4`), symbol-like data in helper `pc 0x058e`-`0x05dc`, and sets the low byte of `slot 2` to `0x07` in `pc 0x0627`-`0x0636`. The artifact reports `auth.guards: []`, so there is no detected access control on this path. Selector inference from bytecode is best-effort, but this routine has clear constructor/initializer behavior.","locations":["selector:0x1d2bca17","pc:0x00e8","pc:0x018f","pc:0x01d4","pc:0x05dc","pc:0x0636"]},{"severity":"medium","category":"other","title":"Allowance accounting appears non-standard and can desynchronize from `allowance()`","exploit_scenario":"A spender uses `transferFrom` until the separate consumed-allowance mapping reaches the approved amount. If the owner later approves the same nominal amount again, `allowance(owner,spender)` can still report that amount, but `transferFrom` may fail because the contract adds a second stored value before checking the limit. Integrations that rely on standard ERC-20 `allowance()` semantics can mis-handle approvals or become stuck.","recommendation":"Use a single remaining-allowance source of truth, or reset the consumed-allowance mapping whenever a new approval is set. If this split-accounting design is intentional, expose an explicit remaining-allowance getter and avoid presenting `0xdd62ed3e` as standard ERC-20 allowance semantics.","evidence":"`0xdd62ed3e` reads a nested mapping rooted at slot `0x04` (`pc 0x049e`-`0x04bb`). `0xdc3080f2` reads a separate nested mapping rooted at slot `0x05` (`pc 0x0479`-`0x0497`). In `transferFrom` (`selector 0x23b872dd`), the code loads one mapping value around `pc 0x071d`-`0x0720`, then loads the second around `pc 0x0723`-`0x0735`, adds them, and compares the sum against the requested amount at `pc 0x0736`-`0x0739`; later it updates the slot-`0x05` mapping at `pc 0x077c`-`0x0793` instead of decrementing the slot-`0x04` value. This is a bytecode-level inference, so the exact intended names are uncertain, but the storage behavior is inconsistent with standard ERC-20 remaining-allowance accounting.","locations":["selector:0x23b872dd","selector:0xdd62ed3e","selector:0xdc3080f2","pc:0x049e","pc:0x0479","pc:0x0734","pc:0x0793"]}]}
OpenAI Codex v0.118.0 (research preview)
--------
workdir: /tmp/codex-ewkgz7je
model: gpt-5.4
provider: openai
approval: never
sandbox: read-only
reasoning effort: high
reasoning summaries: none
session id: 019d5bb8-b65a-7ce1-a5f7-b0c05864e012
--------
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 -g 'BYTECODE_BUNDLE.json' -g 'AGENTS.md' -g '*.json'" in /tmp/codex-ewkgz7je
succeeded in 0ms:
/tmp/codex-ewkgz7je
BYTECODE_BUNDLE.json
codex-output-schema.json
exec
/bin/bash -lc "sed -n '1,220p' BYTECODE_BUNDLE.json" in /tmp/codex-ewkgz7je
succeeded in 0ms:
{
"analysis_artifact": {
"address": "0x2bf4a701470dfe06babd313926a1ebcdcd5806c1",
"artifact_hash": "0x6bc4ee956cff75177d02e8a1397e9bb8f58c445619b5d6d06b9f3054092fd025",
"artifact_json": {
"auth": {
"guards": []
},
"basic_blocks": [
{
"end_pc": 10,
"hash": "0xea84cd9b520f9ac15ee69facebf0514d237ae3f350495e573c06816e7e3d08cf",
"opcodes": [
"PUSH1",
"PUSH1",
"MSTORE",
"CALLDATASIZE",
"ISZERO",
"PUSH2",
"JUMPI"
],
"start_pc": 0
},
{
"end_pc": 30,
"hash": "0x8351f5fd39e1769e53f7b93891e5bf598f6939b3ca7289b6c03bc34019c93201",
"opcodes": [
"PUSH1",
"PUSH1",
"EXP",
"PUSH1",
"CALLDATALOAD",
"DIV",
"PUSH4",
"OP_81",
"EQ",
"PUSH2",
"JUMPI"
],
"start_pc": 11
},
{
"end_pc": 41,
"hash": "0xc6fd74ad853f095f612f149f1918dd822cd863808f0ce7f2b76117fb4ea5344f",
"opcodes": [
"OP_80",
"PUSH4",
"EQ",
"PUSH2",
"JUMPI"
],
"start_pc": 31
},
{
"end_pc": 52,
"hash": "0x86b132c02d74345e3669392f13d557fee5be3dd306c1decb7af80dc27e4012f3",
"opcodes": [
"OP_80",
"PUSH4",
"EQ",
"PUSH2",
"JUMPI"
],
"start_pc": 42
},
{
"end_pc": 63,
"hash": "0xcf15259dc9256709ec8a330b00ed4ffb27f4e6f713ad86f872d1eea71facf776",
"opcodes": [
"OP_80",
"PUSH4",
"EQ",
"PUSH2",
"JUMPI"
],
"start_pc": 53
},
{
"end_pc": 74,
"hash": "0xd041fc3826ada47c2dd3585ae5327095fdd25e5ee3a033d275a58bac781ecaad",
"opcodes": [
"OP_80",
"PUSH4",
"EQ",
"PUSH2",
"JUMPI"
],
"start_pc": 64
},
{
"end_pc": 85,
"hash": "0x402e0d9b5fc7aa3fd5e0abaf9417406ba28113ed0344e879f014bf2444760871",
"opcodes": [
"OP_80",
"PUSH4",
"EQ",
"PUSH2",
"JUMPI"
],
"start_pc": 75
},
{
"end_pc": 96,
"hash": "0xb2632e5d08ff54d657d7f1be3ffe07873eaa3613253c94021440ba172dfff39d",
"opcodes": [
"OP_80",
"PUSH4",
"EQ",
"PUSH2",
"JUMPI"
],
"start_pc": 86
},
{
"end_pc": 107,
"hash": "0x189d455be9a07214470ddb880c09d36b481be31e6764acfbaa9a6ec5cb87f8f2",
"opcodes": [
"OP_80",
"PUSH4",
"EQ",
"PUSH2",
"JUMPI"
],
"start_pc": 97
},
{
"end_pc": 118,
"hash": "0x913f65d41d688d0ab09dc125f70c4599d76800bd95c19554e664ba52cbafdee2",
"opcodes": [
"OP_80",
"PUSH4",
"EQ",
"PUSH2",
"JUMPI"
],
"start_pc": 108
},
{
"end_pc": 129,
"hash": "0x0506ce85c0c99e37ea2c4d029a53a6517024921dcef3c57f05f5488eb2e0206b",
"opcodes": [
"OP_80",
"PUSH4",
"EQ",
"PUSH2",
"JUMPI"
],
"start_pc": 119
},
{
"end_pc": 137,
"hash": "0x5fdc4ebfb5f2bf9f109375ae038006011da7c87835f4392820e2c0b70ac9a983",
"opcodes": [
"JUMPDEST",
"PUSH2",
"PUSH2",
"JUMP"
],
"start_pc": 130
},
{
"end_pc": 204,
"hash": "0x4ba0247477ed45895b0cd6685042a6c0a9d4971d088bb1726ee5d7fa88aa8915",
"opcodes": [
"JUMPDEST",
"PUSH2",
"PUSH1",
"OP_80",
"SLOAD",
"PUSH1",
"OP_80",
"MLOAD",
"PUSH1",
"PUSH1",
"PUSH1",
"OP_85",
"AND",
"ISZERO",
"PUSH2",
"MUL",
"PUSH1",
"NOT",
"ADD",
"OP_90",
"OP_94",
"AND",
"OP_93",
"OP_90",
"OP_93",
"DIV",
"PUSH1",
"OP_81",
"ADD",
"OP_84",
"OP_90",
"DIV",
"OP_84",
"MUL",
"OP_82",
"ADD",
"OP_84",
"ADD",
"OP_90",
"OP_92",
"MSTORE",
"OP_81",
"OP_81",
"MSTORE",
"OP_92",
"OP_91",
"OP_83",
"ADD",
"OP_82",
"OP_82",
"OP_80",
"ISZERO",
"PUSH2",
"JUMPI"
],
"start_pc": 138
exec
/bin/bash -lc 'cat codex-output-schema.json' in /tmp/codex-ewkgz7je
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 "sed -n '221,520p' BYTECODE_BUNDLE.json" in /tmp/codex-ewkgz7je
succeeded in 0ms:
},
{
"end_pc": 212,
"hash": "0xe3f66fcc4b796d24c4e0d9ec3b47fe5a4e8b2879347ec6233927ef035c1a0583",
"opcodes": [
"OP_80",
"PUSH1",
"LT",
"PUSH2",
"JUMPI"
],
"start_pc": 205
},
{
"end_pc": 231,
"hash": "0x4f09165457d8e4bd403564bb9bb288273e684b89410e4eb281615acb34cd5c1b",
"opcodes": [
"PUSH2",
"OP_80",
"OP_83",
"SLOAD",
"DIV",
"MUL",
"OP_83",
"MSTORE",
"OP_91",
"PUSH1",
"ADD",
"OP_91",
"PUSH2",
"JUMP"
],
"start_pc": 213
},
{
"end_pc": 542,
"hash": "0x25c6d246c1a7001d0c4e764d2efa26311d71b9166856765b1f27972831842777",
"opcodes": [
"JUMPDEST",
"PUSH1",
"OP_80",
"MLOAD",
"PUSH1",
"PUSH1",
"OP_80",
"CALLDATALOAD",
"PUSH1",
"OP_81",
"OP_81",
"ADD",
"CALLDATALOAD",
"PUSH1",
"OP_81",
"ADD",
"OP_85",
"OP_90",
"DIV",
"OP_85",
"MUL",
"OP_86",
"ADD",
"OP_85",
"ADD",
"OP_90",
"OP_96",
"MSTORE",
"OP_85",
"OP_85",
"MSTORE",
"PUSH2",
"OP_95",
"OP_81",
"CALLDATALOAD",
"OP_95",
"OP_91",
"OP_94",
"PUSH1",
"OP_94",
"OP_92",
"OP_93",
"OP_90",
"OP_92",
"ADD",
"OP_91",
"OP_81",
"OP_90",
"OP_84",
"ADD",
"OP_83",
"OP_82",
"OP_80",
"OP_82",
"OP_84",
"CALLDATACOPY",
"POP",
"POP",
"PUSH1",
"OP_80",
"MLOAD",
"PUSH1",
"PUSH1",
"CALLDATALOAD",
"OP_80",
"OP_8B",
"ADD",
"CALLDATALOAD",
"PUSH1",
"OP_81",
"ADD",
"OP_83",
"OP_90",
"DIV",
"OP_83",
"MUL",
"OP_84",
"ADD",
"OP_83",
"ADD",
"OP_90",
"OP_94",
"MSTORE",
"OP_83",
"OP_83",
"MSTORE",
"OP_97",
"OP_99",
"OP_98",
"CALLDATALOAD",
"OP_98",
"OP_97",
"PUSH1",
"OP_97",
"POP",
"OP_91",
"OP_95",
"POP",
"PUSH1",
"OP_91",
"OP_90",
"OP_91",
"ADD",
"OP_93",
"POP",
"OP_90",
"OP_91",
"POP",
"OP_81",
"OP_90",
"OP_84",
"ADD",
"OP_83",
"OP_82",
"OP_80",
"OP_82",
"OP_84",
"CALLDATACOPY",
"POP",
"POP",
"POP",
"PUSH1",
"PUSH1",
"PUSH1",
"EXP",
"SUB",
"CALLER",
"AND",
"PUSH1",
"OP_90",
"OP_81",
"MSTORE",
"PUSH1",
"PUSH1",
"OP_90",
"OP_81",
"MSTORE",
"PUSH1",
"OP_80",
"OP_83",
"SHA3",
"PUSH3",
"OP_90",
"SSTORE",
"OP_80",
"MLOAD",
"OP_80",
"OP_82",
"ADD",
"OP_90",
"OP_91",
"MSTORE",
"PUSH1",
"OP_81",
"MSTORE",
"PUSH32",
"OP_90",
"OP_82",
"ADD",
"OP_90",
"OP_81",
"MSTORE",
"OP_82",
"SLOAD",
"OP_83",
"OP_80",
"MSTORE",
"OP_90",
"MLOAD",
"PUSH1",
"PUSH1",
"NOT",
"OP_90",
"OP_91",
"AND",
"OR",
"OP_83",
"SSTORE",
"OP_95",
"OP_97",
"POP",
"OP_90",
"OP_95",
"POP",
"PUSH2",
"OP_94",
"PUSH1",
"PUSH1",
"OP_82",
"AND",
"ISZERO",
"PUSH2",
"MUL",
"PUSH1",
"NOT",
"ADD",
"OP_90",
"OP_91",
"AND",
"DIV",
"PUSH1",
"ADD",
"DIV",
"PUSH32",
"OP_90",
"OP_81",
"ADD",
"OP_93",
"POP",
"OP_91",
"POP",
"POP"
],
"start_pc": 232
},
{
"end_pc": 551,
"hash": "0xd056b6026fab1628be6649a3580ca22ed8646a5a53cfc58722b2f321688aafc4",
"opcodes": [
"JUMPDEST",
"OP_80",
"OP_82",
"GT",
"ISZERO",
"PUSH2",
"JUMPI"
],
"start_pc": 543
},
{
"end_pc": 562,
"hash": "0x521d68e3a2769ecfbf95482fac94470bbfb7fdeffc8355303e4271d7f253ea1f",
"opcodes": [
"PUSH1",
"OP_81",
"SSTORE",
"PUSH1",
"ADD",
"PUSH2",
"JUMP"
],
"start_pc": 552
},
{
"end_pc": 608,
"hash": "0x307b5c9c9804a9358c30661aa9b328b3302d17931bda6ac94f853d642331bac9",
"opcodes": [
"JUMPDEST",
"PUSH2",
"PUSH1",
"CALLDATALOAD",
"PUSH1",
"CALLDATALOAD",
"PUSH1",
"CALLDATALOAD",
"PUSH1",
"PUSH1",
"PUSH1",
"EXP",
"SUB",
"OP_83",
"AND",
exec
/bin/bash -lc "sed -n '521,920p' BYTECODE_BUNDLE.json" in /tmp/codex-ewkgz7je
succeeded in 0ms:
"PUSH1",
"OP_90",
"OP_81",
"MSTORE",
"PUSH1",
"PUSH1",
"MSTORE",
"PUSH1",
"OP_81",
"SHA3",
"SLOAD",
"OP_82",
"OP_90",
"LT",
"ISZERO",
"PUSH2",
"JUMPI"
],
"start_pc": 563
},
{
"end_pc": 612,
"hash": "0xbd3d6a8f0812c3bb89c52c8c35229f03715c8326ec0f07eb72c17e37012345cd",
"opcodes": [
"PUSH2",
"JUMP"
],
"start_pc": 609
},
{
"end_pc": 624,
"hash": "0xba3756c18ca2a0bf668476fd8401c3d7ef936051a3b55324ffece6cde555fe84",
"opcodes": [
"JUMPDEST",
"PUSH2",
"PUSH1",
"SLOAD",
"PUSH1",
"AND",
"OP_81",
"JUMP"
],
"start_pc": 613
},
{
"end_pc": 648,
"hash": "0x616b695ce52e7d33f7aa1114c46e648c7c4ed0176b5035f39dae59f0a9cbb738",
"opcodes": [
"JUMPDEST",
"PUSH2",
"PUSH1",
"CALLDATALOAD",
"PUSH1",
"PUSH1",
"MSTORE",
"PUSH1",
"OP_90",
"OP_81",
"MSTORE",
"PUSH1",
"OP_90",
"SHA3",
"SLOAD",
"OP_81",
"JUMP"
],
"start_pc": 625
},
{
"end_pc": 714,
"hash": "0xc407064f3826f1533fea97a121941ad10b1c4451bc72666e7c3928d4cc795c0b",
"opcodes": [
"JUMPDEST",
"PUSH2",
"PUSH1",
"OP_80",
"SLOAD",
"PUSH1",
"OP_80",
"MLOAD",
"PUSH1",
"PUSH1",
"OP_84",
"OP_86",
"AND",
"ISZERO",
"PUSH2",
"MUL",
"PUSH1",
"NOT",
"ADD",
"OP_90",
"OP_94",
"AND",
"OP_93",
"OP_90",
"OP_93",
"DIV",
"PUSH1",
"OP_81",
"ADD",
"OP_84",
"OP_90",
"DIV",
"OP_84",
"MUL",
"OP_82",
"ADD",
"OP_84",
"ADD",
"OP_90",
"OP_92",
"MSTORE",
"OP_81",
"OP_81",
"MSTORE",
"OP_92",
"OP_91",
"OP_83",
"ADD",
"OP_82",
"OP_82",
"OP_80",
"ISZERO",
"PUSH2",
"JUMPI"
],
"start_pc": 649
},
{
"end_pc": 722,
"hash": "0xbfffff99d1856d203d08caa9ba8664824fd782319281384dd4bc324dc3077714",
"opcodes": [
"OP_80",
"PUSH1",
"LT",
"PUSH2",
"JUMPI"
],
"start_pc": 715
},
{
"end_pc": 741,
"hash": "0xcc47acd6451295bf4a78d7d085ef7c067923ede4b7d83d6a1cd0658c155c0566",
"opcodes": [
"PUSH2",
"OP_80",
"OP_83",
"SLOAD",
"DIV",
"MUL",
"OP_83",
"MSTORE",
"OP_91",
"PUSH1",
"ADD",
"OP_91",
"PUSH2",
"JUMP"
],
"start_pc": 723
},
{
"end_pc": 784,
"hash": "0xe6e8698698e5f8d4f32975e540a3a4d8ce1dccd10718a4d9c0f4be40f30cfc42",
"opcodes": [
"JUMPDEST",
"PUSH2",
"PUSH1",
"CALLDATALOAD",
"PUSH1",
"CALLDATALOAD",
"PUSH1",
"PUSH1",
"PUSH1",
"EXP",
"SUB",
"CALLER",
"AND",
"PUSH1",
"OP_90",
"OP_81",
"MSTORE",
"PUSH1",
"PUSH1",
"MSTORE",
"PUSH1",
"OP_90",
"SHA3",
"SLOAD",
"OP_81",
"OP_90",
"LT",
"ISZERO",
"PUSH2",
"JUMPI"
],
"start_pc": 742
},
{
"end_pc": 788,
"hash": "0xa0cfbcb37ecf8b1b1d9cff4ffff41ba5301c8b57b0aa8ea931d813a7571af99a",
"opcodes": [
"PUSH2",
"JUMP"
],
"start_pc": 785
},
{
"end_pc": 1077,
"hash": "0x2943be2551fc5a769a5591f1cef94de23dea908263c63ff54ca2543e5a3b07f7",
"opcodes": [
"JUMPDEST",
"PUSH1",
"OP_80",
"MLOAD",
"PUSH1",
"PUSH1",
"CALLDATALOAD",
"PUSH1",
"OP_81",
"OP_81",
"ADD",
"CALLDATALOAD",
"PUSH1",
"OP_81",
"ADD",
"OP_84",
"OP_90",
"DIV",
"OP_84",
"MUL",
"OP_85",
"ADD",
"OP_84",
"ADD",
"OP_90",
"OP_95",
"MSTORE",
"OP_84",
"OP_84",
"MSTORE",
"PUSH2",
"OP_94",
"OP_81",
"CALLDATALOAD",
"OP_94",
"PUSH1",
"OP_80",
"CALLDATALOAD",
"OP_95",
"OP_93",
"OP_94",
"PUSH1",
"OP_94",
"OP_92",
"OP_93",
"OP_91",
"ADD",
"OP_91",
"OP_81",
"OP_90",
"OP_84",
"ADD",
"OP_83",
"OP_82",
"OP_80",
"OP_82",
"OP_84",
"CALLDATACOPY",
"POP",
"OP_94",
"OP_96",
"POP",
"POP",
"POP",
"POP",
"POP",
"POP",
"POP",
"PUSH1",
"PUSH1",
"OP_83",
"PUSH1",
"PUSH1",
"POP",
"PUSH1",
"CALLER",
"PUSH1",
"PUSH1",
"PUSH1",
"EXP",
"SUB",
"AND",
"OP_81",
"MSTORE",
"PUSH1",
"ADD",
"OP_90",
"OP_81",
"MSTORE",
"PUSH1",
"ADD",
"PUSH1",
"SHA3",
"PUSH1",
"POP",
"PUSH1",
"OP_87",
"PUSH1",
"PUSH1",
"PUSH1",
"EXP",
"SUB",
"AND",
"OP_81",
"MSTORE",
"PUSH1",
"ADD",
"OP_90",
"OP_81",
"MSTORE",
"PUSH1",
"ADD",
"PUSH1",
"SHA3",
"PUSH1",
"POP",
"OP_81",
"OP_90",
"SSTORE",
"POP",
"OP_84",
"OP_90",
"POP",
"OP_80",
"PUSH1",
"PUSH1",
"PUSH1",
"EXP",
"SUB",
"AND",
"PUSH4",
"CALLER",
"OP_86",
"ADDRESS",
"OP_87",
"PUSH1",
"MLOAD",
"OP_85",
"PUSH1",
"PUSH1",
"EXP",
"MUL",
"OP_81",
"MSTORE",
"PUSH1",
"ADD",
"OP_80",
"OP_85",
"PUSH1",
"PUSH1",
"PUSH1",
"EXP",
"SUB",
"AND",
"OP_81",
"MSTORE",
"PUSH1",
"ADD",
"OP_84",
"OP_81",
"MSTORE",
"PUSH1",
"ADD",
"OP_83",
"PUSH1",
"PUSH1",
"PUSH1",
"EXP",
"SUB",
"AND",
"OP_81",
"MSTORE",
"PUSH1",
"ADD",
"OP_80",
"PUSH1",
"ADD",
"OP_82",
"OP_81",
"SUB",
"OP_82",
"MSTORE",
"OP_83",
"OP_81",
"OP_81",
"MLOAD",
"OP_81",
"MSTORE",
exec
/bin/bash -lc "sed -n '921,1320p' BYTECODE_BUNDLE.json" in /tmp/codex-ewkgz7je
succeeded in 0ms:
"PUSH1",
"ADD",
"OP_91",
"POP",
"OP_80",
"MLOAD",
"OP_90",
"PUSH1",
"ADD",
"OP_90",
"OP_80",
"OP_83",
"OP_83",
"OP_82",
"OP_90",
"PUSH1",
"PUSH1",
"PUSH1",
"OP_84",
"PUSH1",
"ADD",
"DIV",
"PUSH1",
"MUL",
"PUSH1",
"ADD",
"CALL",
"POP",
"OP_90",
"POP",
"OP_90",
"OP_81",
"ADD",
"OP_90",
"PUSH1",
"AND",
"OP_80",
"ISZERO",
"PUSH2",
"JUMPI"
],
"start_pc": 789
},
{
"end_pc": 1102,
"hash": "0x101f2c85b408ea6610e3c7312d25966ff61399829b715e22fe1167a1dd95f539",
"opcodes": [
"OP_80",
"OP_82",
"SUB",
"OP_80",
"MLOAD",
"PUSH1",
"OP_83",
"PUSH1",
"SUB",
"PUSH2",
"EXP",
"SUB",
"NOT",
"AND",
"OP_81",
"MSTORE",
"PUSH1",
"ADD",
"OP_91",
"POP"
],
"start_pc": 1078
},
{
"end_pc": 1134,
"hash": "0x591ff6771a57db0e1af6861a13566f266023852f64af17d2dd730e863faf1cc5",
"opcodes": [
"JUMPDEST",
"POP",
"OP_95",
"POP",
"POP",
"POP",
"POP",
"POP",
"POP",
"PUSH1",
"PUSH1",
"MLOAD",
"OP_80",
"OP_83",
"SUB",
"OP_81",
"PUSH1",
"OP_87",
"PUSH2",
"GAS",
"SUB",
"CALL",
"ISZERO",
"PUSH2",
"JUMPI"
],
"start_pc": 1103
},
{
"end_pc": 1144,
"hash": "0xa4fda15b399cf77331ad9799c1e78f9ae6f85e50b27be713f474b0525c216ef9",
"opcodes": [
"POP",
"POP",
"POP",
"POP",
"OP_93",
"OP_92",
"POP",
"POP",
"POP",
"JUMP"
],
"start_pc": 1135
},
{
"end_pc": 1181,
"hash": "0x30b93e9a365cd07e76db89419721df68e08465ecc0cda9cb086b1654651d6c6a",
"opcodes": [
"JUMPDEST",
"PUSH1",
"PUSH1",
"OP_90",
"OP_81",
"MSTORE",
"PUSH1",
"CALLDATALOAD",
"PUSH1",
"OP_90",
"OP_81",
"MSTORE",
"PUSH1",
"OP_80",
"OP_82",
"SHA3",
"OP_90",
"OP_92",
"MSTORE",
"PUSH1",
"CALLDATALOAD",
"OP_81",
"MSTORE",
"SHA3",
"SLOAD",
"PUSH2",
"OP_90",
"OP_81",
"JUMP"
],
"start_pc": 1145
},
{
"end_pc": 1217,
"hash": "0xd83cf193bf3a61e218ca497920c4c66119af67846b14fbf9a7cb60e4dad96faa",
"opcodes": [
"JUMPDEST",
"PUSH1",
"PUSH1",
"OP_81",
"OP_81",
"MSTORE",
"OP_90",
"CALLDATALOAD",
"PUSH1",
"OP_90",
"OP_81",
"MSTORE",
"PUSH1",
"OP_80",
"OP_82",
"SHA3",
"OP_90",
"OP_92",
"MSTORE",
"PUSH1",
"CALLDATALOAD",
"OP_81",
"MSTORE",
"SHA3",
"SLOAD",
"PUSH2",
"OP_90",
"OP_81",
"JUMP"
],
"start_pc": 1182
},
{
"end_pc": 1219,
"hash": "0x9b92f3a50dbe12d5058dd7409a0e8e862298d11f0173ddca6eaa14f7e601d552",
"opcodes": [
"JUMPDEST",
"STOP"
],
"start_pc": 1218
},
{
"end_pc": 1290,
"hash": "0x2afd4700178b6c44c612fc5af94e113e7703eb5930ee7bda73f371d1d24de80f",
"opcodes": [
"JUMPDEST",
"PUSH1",
"MLOAD",
"OP_80",
"OP_80",
"PUSH1",
"ADD",
"OP_82",
"OP_81",
"SUB",
"OP_82",
"MSTORE",
"OP_83",
"OP_81",
"OP_81",
"MLOAD",
"OP_81",
"MSTORE",
"PUSH1",
"ADD",
"OP_91",
"POP",
"OP_80",
"MLOAD",
"OP_90",
"PUSH1",
"ADD",
"OP_90",
"OP_80",
"OP_83",
"OP_83",
"OP_82",
"OP_90",
"PUSH1",
"PUSH1",
"PUSH1",
"OP_84",
"PUSH1",
"ADD",
"DIV",
"PUSH1",
"MUL",
"PUSH1",
"ADD",
"CALL",
"POP",
"OP_90",
"POP",
"OP_90",
"OP_81",
"ADD",
"OP_90",
"PUSH1",
"AND",
"OP_80",
"ISZERO",
"PUSH2",
"JUMPI"
],
"start_pc": 1220
},
{
"end_pc": 1315,
"hash": "0x459d6b095ed9ca3dd3c4c4fca6cf5b4f60bab2556037270333761651f81bc54d",
"opcodes": [
"OP_80",
"OP_82",
"SUB",
"OP_80",
"MLOAD",
"PUSH1",
"OP_83",
"PUSH1",
"SUB",
"PUSH2",
"EXP",
"SUB",
"NOT",
"AND",
"OP_81",
"MSTORE",
"PUSH1",
"ADD",
"OP_91",
"POP"
],
"start_pc": 1291
},
{
"end_pc": 1329,
"hash": "0x365860803a267a0940c9fc720cdc6eb6a88f352252978ef7e36ca16c0503093c",
"opcodes": [
"JUMPDEST",
"POP",
"OP_92",
"POP",
"POP",
"POP",
"PUSH1",
"MLOAD",
"OP_80",
"OP_91",
"SUB",
"OP_90",
"RETURN"
],
"start_pc": 1316
},
{
"end_pc": 1347,
"hash": "0x75a0bd895ca27ac26cfb50dbed615f86c50ae587f187cd5213c3ad6319ce3e28",
"opcodes": [
"JUMPDEST",
"PUSH1",
"OP_80",
"MLOAD",
"OP_91",
"OP_82",
"MSTORE",
"MLOAD",
"OP_90",
"OP_81",
"OP_90",
"SUB",
"PUSH1",
"ADD",
"OP_90",
"RETURN"
],
"start_pc": 1330
},
{
"end_pc": 1370,
"hash": "0xf3efafaa9ccdcfa6a316f6c29606147cc22415a4493cfb88d3623f2b9fd49a0a",
"opcodes": [
"JUMPDEST",
"PUSH1",
"OP_80",
"MLOAD",
"PUSH1",
"OP_92",
"OP_90",
"OP_92",
"AND",
"OP_82",
"MSTORE",
"MLOAD",
"OP_90",
"OP_81",
"OP_90",
"SUB",
"PUSH1",
"ADD",
"OP_90",
"RETURN"
],
"start_pc": 1348
},
{
"end_pc": 1384,
"hash": "0xde73474bc223b2ee3099355198ef7c0f8d70e9edab28185cbf39712b0430eaaa",
"opcodes": [
"JUMPDEST",
"OP_82",
"ADD",
"OP_91",
"OP_90",
"PUSH1",
"MSTORE",
"PUSH1",
"PUSH1",
"SHA3",
"OP_90"
],
"start_pc": 1371
},
{
"end_pc": 1404,
"hash": "0x42909694271a85d71139231daf51704d09b83e9e48d0e10848cd8c8089b8f1d2",
"opcodes": [
"JUMPDEST",
"OP_81",
"SLOAD",
"OP_81",
"MSTORE",
"OP_90",
"PUSH1",
"ADD",
"OP_90",
"PUSH1",
"ADD",
"OP_80",
"OP_83",
"GT",
"PUSH2",
"JUMPI"
exec
/bin/bash -lc "sed -n '1321,1720p' BYTECODE_BUNDLE.json" in /tmp/codex-ewkgz7je
succeeded in 0ms:
],
"start_pc": 1385
},
{
"end_pc": 1413,
"hash": "0xbbe4b57dc7d8f747f2559c3ff2de0ec86310b6c852bc80ccfd38c539eec3e057",
"opcodes": [
"OP_82",
"OP_90",
"SUB",
"PUSH1",
"AND",
"OP_82",
"ADD",
"OP_91"
],
"start_pc": 1405
},
{
"end_pc": 1421,
"hash": "0xb231f58b3b98dec832666a2869a380b8a935dacb084c73d3dbc1df142f7fc911",
"opcodes": [
"JUMPDEST",
"POP",
"POP",
"POP",
"POP",
"POP",
"OP_81",
"JUMP"
],
"start_pc": 1414
},
{
"end_pc": 1570,
"hash": "0x395af743c6115db9fe2e3db09dd7c5904a6ac587cf92b0e919309df11f7a1267",
"opcodes": [
"JUMPDEST",
"POP",
"POP",
"PUSH1",
"OP_80",
"MLOAD",
"OP_80",
"OP_82",
"ADD",
"OP_90",
"OP_91",
"MSTORE",
"PUSH1",
"OP_80",
"OP_82",
"MSTORE",
"PUSH32",
"PUSH1",
"OP_92",
"OP_83",
"ADD",
"OP_90",
"OP_81",
"MSTORE",
"OP_81",
"SLOAD",
"PUSH1",
"OP_83",
"OP_90",
"MSTORE",
"OP_90",
"MLOAD",
"PUSH1",
"NOT",
"AND",
"PUSH1",
"OP_90",
"OP_81",
"OR",
"OP_83",
"SSTORE",
"OP_91",
"OP_92",
"PUSH2",
"OP_92",
"OP_82",
"OP_85",
"AND",
"ISZERO",
"PUSH2",
"MUL",
"PUSH1",
"NOT",
"ADD",
"OP_90",
"OP_92",
"AND",
"OP_91",
"OP_90",
"OP_91",
"DIV",
"PUSH1",
"ADD",
"DIV",
"PUSH32",
"OP_90",
"OP_81",
"ADD",
"OP_90",
"PUSH2",
"JUMP"
],
"start_pc": 1422
},
{
"end_pc": 1574,
"hash": "0xd89c052788ac436d5b9d2d7fc9d9609fd20717e481d49fd0fff020cbec265c2f",
"opcodes": [
"JUMPDEST",
"POP",
"OP_90",
"JUMP"
],
"start_pc": 1571
},
{
"end_pc": 1595,
"hash": "0xa2f744319fd43445c47fb7b4311dfa68fdd58ca0dfc54649161ae9325bbf59d7",
"opcodes": [
"JUMPDEST",
"POP",
"POP",
"PUSH1",
"OP_80",
"SLOAD",
"PUSH1",
"NOT",
"AND",
"PUSH1",
"OR",
"OP_90",
"SSTORE",
"POP",
"POP",
"POP",
"POP",
"JUMP"
],
"start_pc": 1575
},
{
"end_pc": 1630,
"hash": "0x636f324481fd4419994c8b6ef80a908a04d723d6533f5430a7d78f87c4bb4f8e",
"opcodes": [
"JUMPDEST",
"PUSH1",
"PUSH1",
"PUSH1",
"EXP",
"SUB",
"OP_82",
"AND",
"PUSH1",
"OP_90",
"OP_81",
"MSTORE",
"PUSH1",
"PUSH1",
"MSTORE",
"PUSH1",
"OP_90",
"SHA3",
"SLOAD",
"OP_81",
"OP_81",
"ADD",
"LT",
"ISZERO",
"PUSH2",
"JUMPI"
],
"start_pc": 1596
},
{
"end_pc": 1634,
"hash": "0x4c7007eb68dccafb55ccdc06f9d6a915579d0e0e13e41339a6b864628e49433c",
"opcodes": [
"PUSH2",
"JUMP"
],
"start_pc": 1631
},
{
"end_pc": 1741,
"hash": "0x6c4f1b70ec5b12b49570b5ffefcd6bba40fcefbfa307ebd8aee734d97db0525f",
"opcodes": [
"JUMPDEST",
"PUSH1",
"PUSH1",
"PUSH1",
"EXP",
"SUB",
"CALLER",
"OP_81",
"AND",
"PUSH1",
"OP_81",
"OP_81",
"MSTORE",
"PUSH1",
"PUSH1",
"OP_90",
"OP_81",
"MSTORE",
"PUSH1",
"OP_80",
"OP_83",
"SHA3",
"OP_80",
"SLOAD",
"OP_87",
"OP_90",
"SUB",
"OP_90",
"SSTORE",
"OP_93",
"OP_86",
"AND",
"OP_80",
"OP_83",
"MSTORE",
"OP_91",
"OP_84",
"OP_90",
"SHA3",
"OP_80",
"SLOAD",
"OP_86",
"ADD",
"OP_90",
"SSTORE",
"OP_83",
"MLOAD",
"OP_85",
"OP_81",
"MSTORE",
"OP_93",
"MLOAD",
"OP_91",
"OP_93",
"PUSH32",
"OP_92",
"OP_90",
"OP_81",
"OP_90",
"SUB",
"OP_90",
"OP_91",
"ADD",
"OP_90",
"OP_A3",
"POP",
"POP",
"JUMP"
],
"start_pc": 1635
},
{
"end_pc": 1776,
"hash": "0x2222f7ae0c8a0453c41efd203ee4f3da5d5720e23075ac4e06e1e67a107824f2",
"opcodes": [
"JUMPDEST",
"PUSH1",
"PUSH1",
"PUSH1",
"EXP",
"SUB",
"OP_83",
"AND",
"PUSH1",
"OP_90",
"OP_81",
"MSTORE",
"PUSH1",
"PUSH1",
"MSTORE",
"PUSH1",
"OP_90",
"SHA3",
"SLOAD",
"OP_82",
"OP_81",
"ADD",
"LT",
"ISZERO",
"PUSH2",
"JUMPI"
],
"start_pc": 1742
},
{
"end_pc": 1780,
"hash": "0xaae272aba61418a11cbd169c369fe0c4a9fadbe50a7cc49876192038e5865088",
"opcodes": [
"PUSH2",
"JUMP"
],
"start_pc": 1777
},
{
"end_pc": 1853,
"hash": "0xcbe4fcc16595544952d4f07f82fc7b2d52ca26389be04b03fbcfbec76599e194",
"opcodes": [
"JUMPDEST",
"PUSH1",
"PUSH1",
"PUSH1",
"EXP",
"SUB",
"OP_84",
"OP_81",
"AND",
"PUSH1",
"OP_81",
"OP_81",
"MSTORE",
"PUSH1",
"PUSH1",
"OP_90",
"OP_81",
"MSTORE",
"PUSH1",
"OP_80",
"OP_83",
"SHA3",
"CALLER",
"OP_95",
"OP_90",
"OP_95",
"AND",
"OP_80",
"OP_84",
"MSTORE",
"OP_94",
"OP_82",
"MSTORE",
"OP_80",
"OP_83",
"SHA3",
"SLOAD",
"OP_93",
"OP_83",
"MSTORE",
"PUSH1",
"OP_82",
"MSTORE",
"OP_80",
"OP_83",
"SHA3",
"OP_94",
"OP_83",
"MSTORE",
"OP_93",
"OP_90",
"MSTORE",
"OP_91",
"OP_90",
"OP_91",
"SHA3",
"SLOAD",
"OP_83",
"ADD",
"GT",
"ISZERO",
"PUSH2",
"JUMPI"
],
"start_pc": 1781
},
{
"end_pc": 1857,
"hash": "0xbe93578d7e63958b773c6e341b8f4b1fcec17cfc9ea3b50af082164f6b63ee6f",
"opcodes": [
"PUSH2",
"JUMP"
],
"start_pc": 1854
},
{
"end_pc": 1997,
"hash": "0x4ea796cd765755668dad7866f69ee953f1949ecd1c904a1de603f07ccb7aca36",
"opcodes": [
"JUMPDEST",
"PUSH1",
"PUSH1",
"PUSH1",
"EXP",
"SUB",
"OP_84",
"OP_81",
"AND",
"PUSH1",
"OP_81",
exec
/bin/bash -lc "sed -n '1721,2120p' BYTECODE_BUNDLE.json" in /tmp/codex-ewkgz7je
succeeded in 0ms:
"OP_81",
"MSTORE",
"PUSH1",
"PUSH1",
"OP_90",
"OP_81",
"MSTORE",
"PUSH1",
"OP_80",
"OP_83",
"SHA3",
"OP_80",
"SLOAD",
"OP_88",
"OP_90",
"SUB",
"OP_90",
"SSTORE",
"OP_87",
"OP_85",
"AND",
"OP_80",
"OP_84",
"MSTORE",
"OP_81",
"OP_84",
"SHA3",
"OP_80",
"SLOAD",
"OP_89",
"ADD",
"OP_90",
"SSTORE",
"OP_93",
"OP_83",
"MSTORE",
"PUSH1",
"OP_82",
"MSTORE",
"OP_80",
"OP_83",
"SHA3",
"CALLER",
"OP_95",
"OP_90",
"OP_95",
"AND",
"OP_80",
"OP_84",
"MSTORE",
"OP_94",
"OP_82",
"MSTORE",
"OP_91",
"OP_82",
"OP_90",
"SHA3",
"OP_80",
"SLOAD",
"OP_87",
"ADD",
"OP_90",
"SSTORE",
"OP_81",
"MLOAD",
"OP_86",
"OP_81",
"MSTORE",
"OP_91",
"MLOAD",
"OP_92",
"OP_93",
"OP_92",
"PUSH32",
"OP_92",
"OP_81",
"OP_90",
"SUB",
"OP_90",
"OP_91",
"ADD",
"OP_90",
"OP_A3",
"OP_93",
"OP_92",
"POP",
"POP",
"POP",
"JUMP"
],
"start_pc": 1858
}
],
"callsites": [
{
"opcode": "CALL",
"pc": 1061,
"returndata_checked": null,
"target_expression_category": "computed",
"value_expression_category": "computed"
},
{
"opcode": "CALL",
"pc": 1129,
"returndata_checked": null,
"target_expression_category": "computed",
"value_expression_category": "computed"
},
{
"opcode": "CALL",
"pc": 1274,
"returndata_checked": null,
"target_expression_category": "computed",
"value_expression_category": "computed"
}
],
"cfg_edges": [
{
"from": "bb:0",
"to": "bb:130",
"type": "control_flow"
},
{
"from": "bb:0",
"to": "bb:11",
"type": "control_flow_fallthrough"
},
{
"from": "bb:11",
"to": "bb:138",
"type": "control_flow"
},
{
"from": "bb:11",
"to": "bb:31",
"type": "control_flow_fallthrough"
},
{
"from": "bb:31",
"to": "bb:232",
"type": "control_flow"
},
{
"from": "bb:31",
"to": "bb:42",
"type": "control_flow_fallthrough"
},
{
"from": "bb:42",
"to": "bb:563",
"type": "control_flow"
},
{
"from": "bb:42",
"to": "bb:53",
"type": "control_flow_fallthrough"
},
{
"from": "bb:53",
"to": "bb:613",
"type": "control_flow"
},
{
"from": "bb:53",
"to": "bb:64",
"type": "control_flow_fallthrough"
},
{
"from": "bb:64",
"to": "bb:625",
"type": "control_flow"
},
{
"from": "bb:64",
"to": "bb:75",
"type": "control_flow_fallthrough"
},
{
"from": "bb:75",
"to": "bb:649",
"type": "control_flow"
},
{
"from": "bb:75",
"to": "bb:86",
"type": "control_flow_fallthrough"
},
{
"from": "bb:86",
"to": "bb:742",
"type": "control_flow"
},
{
"from": "bb:86",
"to": "bb:97",
"type": "control_flow_fallthrough"
},
{
"from": "bb:97",
"to": "bb:789",
"type": "control_flow"
},
{
"from": "bb:97",
"to": "bb:108",
"type": "control_flow_fallthrough"
},
{
"from": "bb:108",
"to": "bb:1145",
"type": "control_flow"
},
{
"from": "bb:108",
"to": "bb:119",
"type": "control_flow_fallthrough"
},
{
"from": "bb:119",
"to": "bb:1182",
"type": "control_flow"
},
{
"from": "bb:119",
"to": "bb:130",
"type": "control_flow_fallthrough"
},
{
"from": "bb:138",
"to": "bb:1414",
"type": "control_flow"
},
{
"from": "bb:138",
"to": "bb:205",
"type": "control_flow_fallthrough"
},
{
"from": "bb:205",
"to": "bb:1371",
"type": "control_flow"
},
{
"from": "bb:205",
"to": "bb:213",
"type": "control_flow_fallthrough"
},
{
"from": "bb:213",
"to": "bb:1414",
"type": "control_flow"
},
{
"from": "bb:232",
"to": "bb:543",
"type": "control_flow_fallthrough"
},
{
"from": "bb:543",
"to": "bb:1571",
"type": "control_flow"
},
{
"from": "bb:543",
"to": "bb:552",
"type": "control_flow_fallthrough"
},
{
"from": "bb:552",
"to": "bb:543",
"type": "control_flow"
},
{
"from": "bb:563",
"to": "bb:1742",
"type": "control_flow"
},
{
"from": "bb:563",
"to": "bb:609",
"type": "control_flow_fallthrough"
},
{
"from": "bb:649",
"to": "bb:1414",
"type": "control_flow"
},
{
"from": "bb:649",
"to": "bb:715",
"type": "control_flow_fallthrough"
},
{
"from": "bb:715",
"to": "bb:1371",
"type": "control_flow"
},
{
"from": "bb:715",
"to": "bb:723",
"type": "control_flow_fallthrough"
},
{
"from": "bb:723",
"to": "bb:1414",
"type": "control_flow"
},
{
"from": "bb:742",
"to": "bb:1596",
"type": "control_flow"
},
{
"from": "bb:742",
"to": "bb:785",
"type": "control_flow_fallthrough"
},
{
"from": "bb:789",
"to": "bb:1103",
"type": "control_flow"
},
{
"from": "bb:789",
"to": "bb:1078",
"type": "control_flow_fallthrough"
},
{
"from": "bb:1078",
"to": "bb:1103",
"type": "control_flow_fallthrough"
},
{
"from": "bb:1103",
"to": "bb:1135",
"type": "control_flow_fallthrough"
},
{
"from": "bb:1220",
"to": "bb:1316",
"type": "control_flow"
},
{
"from": "bb:1220",
"to": "bb:1291",
"type": "control_flow_fallthrough"
},
{
"from": "bb:1291",
"to": "bb:1316",
"type": "control_flow_fallthrough"
},
{
"from": "bb:1371",
"to": "bb:1385",
"type": "control_flow_fallthrough"
},
{
"from": "bb:1385",
"to": "bb:1385",
"type": "control_flow"
},
{
"from": "bb:1385",
"to": "bb:1405",
"type": "control_flow_fallthrough"
},
{
"from": "bb:1405",
"to": "bb:1414",
"type": "control_flow_fallthrough"
},
{
"from": "bb:1422",
"to": "bb:543",
"type": "control_flow"
},
{
"from": "bb:1596",
"to": "bb:1635",
"type": "control_flow"
},
{
"from": "bb:1596",
"to": "bb:1631",
"type": "control_flow_fallthrough"
},
{
"from": "bb:1742",
"to": "bb:1781",
"type": "control_flow"
},
{
"from": "bb:1742",
"to": "bb:1777",
"type": "control_flow_fallthrough"
},
{
"from": "bb:1781",
"to": "bb:1858",
exec
/bin/bash -lc "sed -n '2121,2520p' BYTECODE_BUNDLE.json" in /tmp/codex-ewkgz7je
succeeded in 0ms:
"type": "control_flow"
},
{
"from": "bb:1781",
"to": "bb:1854",
"type": "control_flow_fallthrough"
}
],
"cfg_hash": "0xb86dec5cb76807a8d7975252cc3f5b5032cd5386762c2f156435fe7c2d7ff0e3",
"dispatcher_type": "selector_jump_table",
"function_entries": [
{
"entry_pc": null,
"selector": "0x06fdde03"
},
{
"entry_pc": 599290589,
"selector": "0x1d2bca17"
},
{
"entry_pc": 826074471,
"selector": "0x23b872dd"
},
{
"entry_pc": 1889567281,
"selector": "0x313ce567"
},
{
"entry_pc": 2514000705,
"selector": "0x70a08231"
},
{
"entry_pc": 2835717307,
"selector": "0x95d89b41"
},
{
"entry_pc": 3404319313,
"selector": "0xa9059cbb"
},
{
"entry_pc": 3694166258,
"selector": "0xcae9ca51"
},
{
"entry_pc": 3714247998,
"selector": "0xdc3080f2"
},
{
"entry_pc": 1218,
"selector": "0xdd62ed3e"
}
],
"functions": [
{
"auth": {
"guards": []
},
"entry_pc": null,
"selector": "0x06fdde03",
"sinks": {
"call": 3,
"delegatecall": 0,
"selfdestruct": 0,
"staticcall": 0
},
"storage": {
"reads": 23,
"slots": [
{
"op": "SLOAD",
"pc": 145,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
},
{
"op": "SLOAD",
"pc": 218,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000100"
},
{
"op": "SLOAD",
"pc": 619,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000002"
},
{
"op": "SLOAD",
"pc": 656,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000001"
},
{
"op": "SLOAD",
"pc": 728,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000100"
},
{
"op": "SSTORE",
"pc": 936,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
},
{
"op": "SLOAD",
"pc": 1581,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000002"
}
],
"writes": 11
}
},
{
"auth": {
"guards": []
},
"entry_pc": 599290589,
"selector": "0x1d2bca17",
"sinks": {
"call": 3,
"delegatecall": 0,
"selfdestruct": 0,
"staticcall": 0
},
"storage": {
"reads": 23,
"slots": [
{
"op": "SLOAD",
"pc": 145,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
},
{
"op": "SLOAD",
"pc": 218,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000100"
},
{
"op": "SLOAD",
"pc": 619,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000002"
},
{
"op": "SLOAD",
"pc": 656,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000001"
},
{
"op": "SLOAD",
"pc": 728,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000100"
},
{
"op": "SSTORE",
"pc": 936,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
},
{
"op": "SLOAD",
"pc": 1581,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000002"
}
],
"writes": 11
}
},
{
"auth": {
"guards": []
},
"entry_pc": 826074471,
"selector": "0x23b872dd",
"sinks": {
"call": 3,
"delegatecall": 0,
"selfdestruct": 0,
"staticcall": 0
},
"storage": {
"reads": 23,
"slots": [
{
"op": "SLOAD",
"pc": 145,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
},
{
"op": "SLOAD",
"pc": 218,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000100"
},
{
"op": "SLOAD",
"pc": 619,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000002"
},
{
"op": "SLOAD",
"pc": 656,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000001"
},
{
"op": "SLOAD",
"pc": 728,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000100"
},
{
"op": "SSTORE",
"pc": 936,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
},
{
"op": "SLOAD",
"pc": 1581,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000002"
}
],
"writes": 11
}
},
{
"auth": {
"guards": []
},
"entry_pc": 1889567281,
"selector": "0x313ce567",
"sinks": {
"call": 3,
"delegatecall": 0,
"selfdestruct": 0,
"staticcall": 0
},
"storage": {
"reads": 23,
"slots": [
{
"op": "SLOAD",
"pc": 145,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
},
{
"op": "SLOAD",
"pc": 218,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000100"
},
{
"op": "SLOAD",
"pc": 619,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000002"
},
{
"op": "SLOAD",
"pc": 656,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000001"
},
{
"op": "SLOAD",
"pc": 728,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000100"
},
{
"op": "SSTORE",
"pc": 936,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
},
{
"op": "SLOAD",
"pc": 1581,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000002"
}
],
"writes": 11
}
},
{
"auth": {
"guards": []
},
"entry_pc": 2514000705,
"selector": "0x70a08231",
"sinks": {
"call": 3,
"delegatecall": 0,
"selfdestruct": 0,
"staticcall": 0
},
"storage": {
"reads": 23,
"slots": [
{
"op": "SLOAD",
"pc": 145,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
},
{
"op": "SLOAD",
"pc": 218,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000100"
},
{
"op": "SLOAD",
"pc": 619,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000002"
},
{
"op": "SLOAD",
"pc": 656,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000001"
},
{
"op": "SLOAD",
"pc": 728,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000100"
},
{
"op": "SSTORE",
"pc": 936,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
},
{
"op": "SLOAD",
"pc": 1581,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000002"
}
],
"writes": 11
}
},
{
"auth": {
"guards": []
},
"entry_pc": 2835717307,
"selector": "0x95d89b41",
"sinks": {
"call": 3,
"delegatecall": 0,
"selfdestruct": 0,
"staticcall": 0
},
"storage": {
"reads": 23,
"slots": [
{
"op": "SLOAD",
"pc": 145,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
},
{
"op": "SLOAD",
"pc": 218,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000100"
},
{
"op": "SLOAD",
"pc": 619,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000002"
},
{
"op": "SLOAD",
"pc": 656,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000001"
},
{
"op": "SLOAD",
"pc": 728,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000100"
},
{
"op": "SSTORE",
"pc": 936,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
},
{
"op": "SLOAD",
"pc": 1581,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000002"
}
],
"writes": 11
}
},
{
"auth": {
"guards": []
},
"entry_pc": 3404319313,
"selector": "0xa9059cbb",
"sinks": {
"call": 3,
"delegatecall": 0,
"selfdestruct": 0,
"staticcall": 0
},
"storage": {
"reads": 23,
"slots": [
{
"op": "SLOAD",
"pc": 145,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
},
{
"op": "SLOAD",
"pc": 218,
exec
/bin/bash -lc "sed -n '2521,2920p' BYTECODE_BUNDLE.json" in /tmp/codex-ewkgz7je
succeeded in 0ms:
"slot": "0x0000000000000000000000000000000000000000000000000000000000000100"
},
{
"op": "SLOAD",
"pc": 619,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000002"
},
{
"op": "SLOAD",
"pc": 656,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000001"
},
{
"op": "SLOAD",
"pc": 728,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000100"
},
{
"op": "SSTORE",
"pc": 936,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
},
{
"op": "SLOAD",
"pc": 1581,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000002"
}
],
"writes": 11
}
},
{
"auth": {
"guards": []
},
"entry_pc": 3694166258,
"selector": "0xcae9ca51",
"sinks": {
"call": 3,
"delegatecall": 0,
"selfdestruct": 0,
"staticcall": 0
},
"storage": {
"reads": 23,
"slots": [
{
"op": "SLOAD",
"pc": 145,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
},
{
"op": "SLOAD",
"pc": 218,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000100"
},
{
"op": "SLOAD",
"pc": 619,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000002"
},
{
"op": "SLOAD",
"pc": 656,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000001"
},
{
"op": "SLOAD",
"pc": 728,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000100"
},
{
"op": "SSTORE",
"pc": 936,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
},
{
"op": "SLOAD",
"pc": 1581,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000002"
}
],
"writes": 11
}
},
{
"auth": {
"guards": []
},
"entry_pc": 3714247998,
"selector": "0xdc3080f2",
"sinks": {
"call": 3,
"delegatecall": 0,
"selfdestruct": 0,
"staticcall": 0
},
"storage": {
"reads": 23,
"slots": [
{
"op": "SLOAD",
"pc": 145,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
},
{
"op": "SLOAD",
"pc": 218,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000100"
},
{
"op": "SLOAD",
"pc": 619,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000002"
},
{
"op": "SLOAD",
"pc": 656,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000001"
},
{
"op": "SLOAD",
"pc": 728,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000100"
},
{
"op": "SSTORE",
"pc": 936,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
},
{
"op": "SLOAD",
"pc": 1581,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000002"
}
],
"writes": 11
}
},
{
"auth": {
"guards": []
},
"entry_pc": 1218,
"selector": "0xdd62ed3e",
"sinks": {
"call": 3,
"delegatecall": 0,
"selfdestruct": 0,
"staticcall": 0
},
"storage": {
"reads": 23,
"slots": [
{
"op": "SLOAD",
"pc": 145,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
},
{
"op": "SLOAD",
"pc": 218,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000100"
},
{
"op": "SLOAD",
"pc": 619,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000002"
},
{
"op": "SLOAD",
"pc": 656,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000001"
},
{
"op": "SLOAD",
"pc": 728,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000100"
},
{
"op": "SSTORE",
"pc": 936,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
},
{
"op": "SLOAD",
"pc": 1581,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000002"
}
],
"writes": 11
}
}
],
"selectors": [
"0x06fdde03",
"0x1d2bca17",
"0x23b872dd",
"0x313ce567",
"0x70a08231",
"0x95d89b41",
"0xa9059cbb",
"0xcae9ca51",
"0xdc3080f2",
"0xdd62ed3e"
],
"sinks": {
"call": 3,
"create": 0,
"create2": 0,
"delegatecall": 0,
"selfdestruct": 0,
"staticcall": 0,
"upgrade_slot_write_suspected": false
},
"storage": {
"keccak_count": 23,
"reads": 23,
"slots": [
{
"op": "SLOAD",
"pc": 145,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
},
{
"op": "SLOAD",
"pc": 218,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000100"
},
{
"op": "SLOAD",
"pc": 619,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000002"
},
{
"op": "SLOAD",
"pc": 656,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000001"
},
{
"op": "SLOAD",
"pc": 728,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000100"
},
{
"op": "SSTORE",
"pc": 936,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
},
{
"op": "SLOAD",
"pc": 1581,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000002"
}
],
"writes": 11
},
"version": "analysis_artifact_v1"
},
"block_number": null,
"chain_id": 1,
"codehash": "0x1fe5d05ba4023231a6d7175004a34d414a89f4b98b790f305fa4babedcbad7df",
"created_at": "2026-04-04T19:55:01.000000Z",
"id": 2208,
"updated_at": "2026-04-04T19:55:01.000000Z",
"version": "analysis_artifact_v1"
},
"analysis_run": {
"address": "0x2bf4a701470dfe06babd313926a1ebcdcd5806c1",
"block_number": null,
"chain_id": 1,
"child_links": [],
"created_at": "2025-12-19T20:03:54.000000Z",
"id": "019b3836-3278-73cd-b85f-dc1b759c448b",
"parent_links": [],
"status": "running",
"updated_at": "2026-04-04T19:55:01.000000Z"
},
"artifact": {
"codehash": "0x1fe5d05ba4023231a6d7175004a34d414a89f4b98b790f305fa4babedcbad7df",
"compiler_json": {
"etherscan": {
"skipped": true
}
},
"implementation_address": null,
"is_proxy": false,
"runtime_bytecode": {
"full": "0x606060405236156100825760e060020a600035046306fdde03811461008a5780631d2bca17146100e857806323b872dd14610233578063313ce5671461026557806370a082311461027157806395d89b4114610289578063a9059cbb146102e6578063cae9ca5114610315578063dc3080f214610479578063dd62ed3e1461049e575b6104c2610002565b6104c46000805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156105865780601f1061055b57610100808354040283529160200191610586565b60408051602060248035600481810135601f81018590048502860185019096528585526104c2958135959194604494929390920191819084018382808284375050604080516020606435808b0135601f810183900483028401830190945283835297999835989760849750919550602491909101935090915081908401838280828437505050600160a060020a0333166000908152600360209081526040808320620bde3190558051808201909152600781527f55636b436f696e0000000000000000000000000000000000000000000000000090820190815282548380529051600e60ff1990911617835595975090955061058e9460026001821615610100026000190190911604601f01047f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56390810193509150505b80821115610623576000815560010161021f565b610532600435602435604435600160a060020a038316600090815260036020526040812054829010156106ce57610002565b61054460025460ff1681565b61053260043560036020526000908152604090205481565b6104c460018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156105865780601f1061055b57610100808354040283529160200191610586565b6104c2600435602435600160a060020a0333166000908152600360205260409020548190101561063c57610002565b604080516020604435600481810135601f810184900484028501840190955284845261053294813594602480359593946064949293910191819084018382808284375094965050505050505060006000836004600050600033600160a060020a03168152602001908152602001600020600050600087600160a060020a031681526020019081526020016000206000508190555084905080600160a060020a0316638f4ffcb1338630876040518560e060020a0281526004018085600160a060020a0316815260200184815260200183600160a060020a03168152602001806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f16801561044f5780820380516001836020036101000a031916815260200191505b50955050505050506000604051808303816000876161da5a03f11561000257505050509392505050565b6005602090815260043560009081526040808220909252602435815220546105329081565b60046020818152903560009081526040808220909252602435815220546105329081565b005b60405180806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f1680156105245780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b60408051918252519081900360200190f35b6040805160ff929092168252519081900360200190f35b820191906000526020600020905b81548152906001019060200180831161056957829003601f168201915b505050505081565b50506040805180820190915260018082527f5500000000000000000000000000000000000000000000000000000000000000602092830190815281546000839052905160ff19166002908117835591926106279282851615610100026000190190921691909104601f01047fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf69081019061021f565b5090565b50506002805460ff1916600717905550505050565b600160a060020a038216600090815260036020526040902054818101101561066357610002565b600160a060020a03338116600081815260036020908152604080832080548790039055938616808352918490208054860190558351858152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35050565b600160a060020a03831660009081526003602052604090205482810110156106f557610002565b600160a060020a0384811660008181526004602090815260408083203395909516808452948252808320549383526005825280832094835293905291909120548301111561074257610002565b600160a060020a0384811660008181526003602090815260408083208054889003905587851680845281842080548901905593835260058252808320339590951680845294825291829020805487019055815186815291519293927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a3939250505056",
"head": null,
"length": 3998,
"tail": null,
"truncated": false
},
"verified_source": false
},
"capability_graph": {
"address": "0x2bf4a701470dfe06babd313926a1ebcdcd5806c1",
"block_number": null,
"chain_id": 1,
"codehash": "0x1fe5d05ba4023231a6d7175004a34d414a89f4b98b790f305fa4babedcbad7df",
"created_at": "2026-04-04T19:55:01.000000Z",
"graph_hash": "0x59979044a2e24903d19cf3da658bf230891c09ed8170ab07a1a9f99b5629cdcd",
"graph_json": {
"edges": [
{
"from": "bb:0",
"to": "bb:130",
"type": "control_flow"
},
{
"from": "bb:0",
"to": "bb:11",
"type": "control_flow_fallthrough"
},
{
"from": "bb:11",
"to": "bb:138",
"type": "control_flow"
},
{
"from": "bb:11",
"to": "bb:31",
"type": "control_flow_fallthrough"
},
{
"from": "bb:31",
"to": "bb:232",
"type": "control_flow"
},
{
"from": "bb:31",
"to": "bb:42",
"type": "control_flow_fallthrough"
},
{
"from": "bb:42",
"to": "bb:563",
"type": "control_flow"
},
{
"from": "bb:42",
"to": "bb:53",
"type": "control_flow_fallthrough"
},
{
"from": "bb:53",
"to": "bb:613",
"type": "control_flow"
},
{
"from": "bb:53",
"to": "bb:64",
"type": "control_flow_fallthrough"
},
{
"from": "bb:64",
"to": "bb:625",
"type": "control_flow"
},
{
"from": "bb:64",
"to": "bb:75",
"type": "control_flow_fallthrough"
},
{
"from": "bb:75",
"to": "bb:649",
"type": "control_flow"
},
{
"from": "bb:75",
"to": "bb:86",
"type": "control_flow_fallthrough"
},
{
"from": "bb:86",
"to": "bb:742",
"type": "control_flow"
},
{
"from": "bb:86",
"to": "bb:97",
"type": "control_flow_fallthrough"
},
{
"from": "bb:97",
"to": "bb:789",
"type": "control_flow"
},
{
"from": "bb:97",
"to": "bb:108",
"type": "control_flow_fallthrough"
},
{
"from": "bb:108",
"to": "bb:1145",
"type": "control_flow"
},
exec
/bin/bash -lc 'which evm || which cast || which hevm || which forge || which python3 || which node' in /tmp/codex-ewkgz7je
succeeded in 0ms:
/home/noahkuhn/.foundry/bin/cast
exec
/bin/bash -lc "python3 - <<'PY'
import json
j=json.load(open('BYTECODE_BUNDLE.json'))
print(j['artifact']['runtime_bytecode']['full'])
PY | cast disassemble -" in /tmp/codex-ewkgz7je
exited 1 in 0ms:
/bin/bash: line 5: warning: here-document at line 1 delimited by end-of-file (wanted `PY')
File "<stdin>", line 4
PY | cast disassemble -
^^^^^^^^^^^
SyntaxError: invalid syntax
exec
/bin/bash -lc "python3 -c 'import json;print(json.load(open(\"BYTECODE_BUNDLE.json\"))[\"artifact\"][\"runtime_bytecode\"][\"full\"])' | cast disassemble -" in /tmp/codex-ewkgz7je
exited 1 in 0ms:
Error: odd number of digits
Exception ignored on flushing sys.stdout:
BrokenPipeError: [Errno 32] Broken pipe
exec
/bin/bash -lc "python3 -c 'import json;print(json.load(open(\"BYTECODE_BUNDLE.json\"))[\"artifact\"][\"runtime_bytecode\"][\"full\"][2:])' | cast disassemble -" in /tmp/codex-ewkgz7je
exited 1 in 0ms:
Error: odd number of digits
Exception ignored on flushing sys.stdout:
BrokenPipeError: [Errno 32] Broken pipe
exec
/bin/bash -lc "python3 - <<'PY'
import json
from textwrap import wrap
opcodes={0x00:'STOP',0x01:'ADD',0x02:'MUL',0x03:'SUB',0x04:'DIV',0x05:'SDIV',0x06:'MOD',0x07:'SMOD',0x08:'ADDMOD',0x09:'MULMOD',0x0a:'EXP',0x0b:'SIGNEXTEND',0x10:'LT',0x11:'GT',0x12:'SLT',0x13:'SGT',0x14:'EQ',0x15:'ISZERO',0x16:'AND',0x17:'OR',0x18:'XOR',0x19:'NOT',0x1a:'BYTE',0x20:'SHA3',0x30:'ADDRESS',0x31:'BALANCE',0x32:'ORIGIN',0x33:'CALLER',0x34:'CALLVALUE',0x35:'CALLDATALOAD',0x36:'CALLDATASIZE',0x37:'CALLDATACOPY',0x38:'CODESIZE',0x39:'CODECOPY',0x3a:'GASPRICE',0x3b:'EXTCODESIZE',0x3c:'EXTCODECOPY',0x3d:'RETURNDATASIZE',0x3e:'RETURNDATACOPY',0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x53:'MSTORE8',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x58:'PC',0x59:'MSIZE',0x5a:'GAS',0x5b:'JUMPDEST',0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'}
for i in range(1,33): opcodes[0x5f+i]=f'PUSH{i}'
for i in range(1,17): opcodes[0x7f+i]=f'DUP{i}'
for i in range(1,17): opcodes[0x8f+i]=f'SWAP{i}'
for i in range(0,5): opcodes[0xa0+i]=f'LOG{i}'
bytecode=bytes.fromhex(json.load(open('BYTECODE_BUNDLE.json'))['artifact']['runtime_bytecode']['full'][2:])
# print ranges around pcs of interest
ranges=[(0,160),(220,340),(520,900),(900,1160),(1560,2010)]
for start,end in ranges:
print(f'--- range {start:#x}-{end:#x} ---')
pc=start
while pc<min(end,len(bytecode)):
op=bytecode[pc]
name=opcodes.get(op,f'OP_{op:02x}')
if 0x60<=op<=0x7f:
n=op-0x5f
data=bytecode[pc+1:pc+1+n]
print(f'{pc:04x}: {name} 0x{data.hex()}')
pc+=1+n
else:
print(f'{pc:04x}: {name}')
pc+=1
PY" in /tmp/codex-ewkgz7je
succeeded in 0ms:
--- range 0x0-0xa0 ---
0000: PUSH1 0x60
0002: PUSH1 0x40
0004: MSTORE
0005: CALLDATASIZE
0006: ISZERO
0007: PUSH2 0x0082
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 0x008a
001e: JUMPI
001f: DUP1
0020: PUSH4 0x1d2bca17
0025: EQ
0026: PUSH2 0x00e8
0029: JUMPI
002a: DUP1
002b: PUSH4 0x23b872dd
0030: EQ
0031: PUSH2 0x0233
0034: JUMPI
0035: DUP1
0036: PUSH4 0x313ce567
003b: EQ
003c: PUSH2 0x0265
003f: JUMPI
0040: DUP1
0041: PUSH4 0x70a08231
0046: EQ
0047: PUSH2 0x0271
004a: JUMPI
004b: DUP1
004c: PUSH4 0x95d89b41
0051: EQ
0052: PUSH2 0x0289
0055: JUMPI
0056: DUP1
0057: PUSH4 0xa9059cbb
005c: EQ
005d: PUSH2 0x02e6
0060: JUMPI
0061: DUP1
0062: PUSH4 0xcae9ca51
0067: EQ
0068: PUSH2 0x0315
006b: JUMPI
006c: DUP1
006d: PUSH4 0xdc3080f2
0072: EQ
0073: PUSH2 0x0479
0076: JUMPI
0077: DUP1
0078: PUSH4 0xdd62ed3e
007d: EQ
007e: PUSH2 0x049e
0081: JUMPI
0082: JUMPDEST
0083: PUSH2 0x04c2
0086: PUSH2 0x0002
0089: JUMP
008a: JUMPDEST
008b: PUSH2 0x04c4
008e: PUSH1 0x00
0090: DUP1
0091: SLOAD
0092: PUSH1 0x40
0094: DUP1
0095: MLOAD
0096: PUSH1 0x20
0098: PUSH1 0x02
009a: PUSH1 0x01
009c: DUP6
009d: AND
009e: ISZERO
009f: PUSH2 0x0100
--- range 0xdc-0x154 ---
00dc: MUL
00dd: DUP4
00de: MSTORE
00df: SWAP2
00e0: PUSH1 0x20
00e2: ADD
00e3: SWAP2
00e4: PUSH2 0x0586
00e7: JUMP
00e8: JUMPDEST
00e9: PUSH1 0x40
00eb: DUP1
00ec: MLOAD
00ed: PUSH1 0x20
00ef: PUSH1 0x24
00f1: DUP1
00f2: CALLDATALOAD
00f3: PUSH1 0x04
00f5: DUP2
00f6: DUP2
00f7: ADD
00f8: CALLDATALOAD
00f9: PUSH1 0x1f
00fb: DUP2
00fc: ADD
00fd: DUP6
00fe: SWAP1
00ff: DIV
0100: DUP6
0101: MUL
0102: DUP7
0103: ADD
0104: DUP6
0105: ADD
0106: SWAP1
0107: SWAP7
0108: MSTORE
0109: DUP6
010a: DUP6
010b: MSTORE
010c: PUSH2 0x04c2
010f: SWAP6
0110: DUP2
0111: CALLDATALOAD
0112: SWAP6
0113: SWAP2
0114: SWAP5
0115: PUSH1 0x44
0117: SWAP5
0118: SWAP3
0119: SWAP4
011a: SWAP1
011b: SWAP3
011c: ADD
011d: SWAP2
011e: DUP2
011f: SWAP1
0120: DUP5
0121: ADD
0122: DUP4
0123: DUP3
0124: DUP1
0125: DUP3
0126: DUP5
0127: CALLDATACOPY
0128: POP
0129: POP
012a: PUSH1 0x40
012c: DUP1
012d: MLOAD
012e: PUSH1 0x20
0130: PUSH1 0x64
0132: CALLDATALOAD
0133: DUP1
0134: DUP12
0135: ADD
0136: CALLDATALOAD
0137: PUSH1 0x1f
0139: DUP2
013a: ADD
013b: DUP4
013c: SWAP1
013d: DIV
013e: DUP4
013f: MUL
0140: DUP5
0141: ADD
0142: DUP4
0143: ADD
0144: SWAP1
0145: SWAP5
0146: MSTORE
0147: DUP4
0148: DUP4
0149: MSTORE
014a: SWAP8
014b: SWAP10
014c: SWAP9
014d: CALLDATALOAD
014e: SWAP9
014f: SWAP8
0150: PUSH1 0x84
0152: SWAP8
0153: POP
--- range 0x208-0x384 ---
0208: OP_a6
0209: OP_bc
020a: SWAP6
020b: OP_48
020c: BLOCKHASH
020d: ADDMOD
020e: OP_f6
020f: CALLDATASIZE
0210: OP_2f
0211: SWAP4
0212: AND
0213: OP_0e
0214: RETURN
0215: OP_e5
0216: PUSH4 0x90810193
021b: POP
021c: SWAP2
021d: POP
021e: POP
021f: JUMPDEST
0220: DUP1
0221: DUP3
0222: GT
0223: ISZERO
0224: PUSH2 0x0623
0227: JUMPI
0228: PUSH1 0x00
022a: DUP2
022b: SSTORE
022c: PUSH1 0x01
022e: ADD
022f: PUSH2 0x021f
0232: JUMP
0233: JUMPDEST
0234: PUSH2 0x0532
0237: PUSH1 0x04
0239: CALLDATALOAD
023a: PUSH1 0x24
023c: CALLDATALOAD
023d: PUSH1 0x44
023f: CALLDATALOAD
0240: PUSH1 0x01
0242: PUSH1 0xa0
0244: PUSH1 0x02
0246: EXP
0247: SUB
0248: DUP4
0249: AND
024a: PUSH1 0x00
024c: SWAP1
024d: DUP2
024e: MSTORE
024f: PUSH1 0x03
0251: PUSH1 0x20
0253: MSTORE
0254: PUSH1 0x40
0256: DUP2
0257: SHA3
0258: SLOAD
0259: DUP3
025a: SWAP1
025b: LT
025c: ISZERO
025d: PUSH2 0x06ce
0260: JUMPI
0261: PUSH2 0x0002
0264: JUMP
0265: JUMPDEST
0266: PUSH2 0x0544
0269: PUSH1 0x02
026b: SLOAD
026c: PUSH1 0xff
026e: AND
026f: DUP2
0270: JUMP
0271: JUMPDEST
0272: PUSH2 0x0532
0275: PUSH1 0x04
0277: CALLDATALOAD
0278: PUSH1 0x03
027a: PUSH1 0x20
027c: MSTORE
027d: PUSH1 0x00
027f: SWAP1
0280: DUP2
0281: MSTORE
0282: PUSH1 0x40
0284: SWAP1
0285: SHA3
0286: SLOAD
0287: DUP2
0288: JUMP
0289: JUMPDEST
028a: PUSH2 0x04c4
028d: PUSH1 0x01
028f: DUP1
0290: SLOAD
0291: PUSH1 0x40
0293: DUP1
0294: MLOAD
0295: PUSH1 0x20
0297: PUSH1 0x02
0299: DUP5
029a: DUP7
029b: AND
029c: ISZERO
029d: PUSH2 0x0100
02a0: MUL
02a1: PUSH1 0x00
02a3: NOT
02a4: ADD
02a5: SWAP1
02a6: SWAP5
02a7: AND
02a8: SWAP4
02a9: SWAP1
02aa: SWAP4
02ab: DIV
02ac: PUSH1 0x1f
02ae: DUP2
02af: ADD
02b0: DUP5
02b1: SWAP1
02b2: DIV
02b3: DUP5
02b4: MUL
02b5: DUP3
02b6: ADD
02b7: DUP5
02b8: ADD
02b9: SWAP1
02ba: SWAP3
02bb: MSTORE
02bc: DUP2
02bd: DUP2
02be: MSTORE
02bf: SWAP3
02c0: SWAP2
02c1: DUP4
02c2: ADD
02c3: DUP3
02c4: DUP3
02c5: DUP1
02c6: ISZERO
02c7: PUSH2 0x0586
02ca: JUMPI
02cb: DUP1
02cc: PUSH1 0x1f
02ce: LT
02cf: PUSH2 0x055b
02d2: JUMPI
02d3: PUSH2 0x0100
02d6: DUP1
02d7: DUP4
02d8: SLOAD
02d9: DIV
02da: MUL
02db: DUP4
02dc: MSTORE
02dd: SWAP2
02de: PUSH1 0x20
02e0: ADD
02e1: SWAP2
02e2: PUSH2 0x0586
02e5: JUMP
02e6: JUMPDEST
02e7: PUSH2 0x04c2
02ea: PUSH1 0x04
02ec: CALLDATALOAD
02ed: PUSH1 0x24
02ef: CALLDATALOAD
02f0: PUSH1 0x01
02f2: PUSH1 0xa0
02f4: PUSH1 0x02
02f6: EXP
02f7: SUB
02f8: CALLER
02f9: AND
02fa: PUSH1 0x00
02fc: SWAP1
02fd: DUP2
02fe: MSTORE
02ff: PUSH1 0x03
0301: PUSH1 0x20
0303: MSTORE
0304: PUSH1 0x40
0306: SWAP1
0307: SHA3
0308: SLOAD
0309: DUP2
030a: SWAP1
030b: LT
030c: ISZERO
030d: PUSH2 0x063c
0310: JUMPI
0311: PUSH2 0x0002
0314: JUMP
0315: JUMPDEST
0316: PUSH1 0x40
0318: DUP1
0319: MLOAD
031a: PUSH1 0x20
031c: PUSH1 0x44
031e: CALLDATALOAD
031f: PUSH1 0x04
0321: DUP2
0322: DUP2
0323: ADD
0324: CALLDATALOAD
0325: PUSH1 0x1f
0327: DUP2
0328: ADD
0329: DUP5
032a: SWAP1
032b: DIV
032c: DUP5
032d: MUL
032e: DUP6
032f: ADD
0330: DUP5
0331: ADD
0332: SWAP1
0333: SWAP6
0334: MSTORE
0335: DUP5
0336: DUP5
0337: MSTORE
0338: PUSH2 0x0532
033b: SWAP5
033c: DUP2
033d: CALLDATALOAD
033e: SWAP5
033f: PUSH1 0x24
0341: DUP1
0342: CALLDATALOAD
0343: SWAP6
0344: SWAP4
0345: SWAP5
0346: PUSH1 0x64
0348: SWAP5
0349: SWAP3
034a: SWAP4
034b: SWAP2
034c: ADD
034d: SWAP2
034e: DUP2
034f: SWAP1
0350: DUP5
0351: ADD
0352: DUP4
0353: DUP3
0354: DUP1
0355: DUP3
0356: DUP5
0357: CALLDATACOPY
0358: POP
0359: SWAP5
035a: SWAP7
035b: POP
035c: POP
035d: POP
035e: POP
035f: POP
0360: POP
0361: POP
0362: PUSH1 0x00
0364: PUSH1 0x00
0366: DUP4
0367: PUSH1 0x04
0369: PUSH1 0x00
036b: POP
036c: PUSH1 0x00
036e: CALLER
036f: PUSH1 0x01
0371: PUSH1 0xa0
0373: PUSH1 0x02
0375: EXP
0376: SUB
0377: AND
0378: DUP2
0379: MSTORE
037a: PUSH1 0x20
037c: ADD
037d: SWAP1
037e: DUP2
037f: MSTORE
0380: PUSH1 0x20
0382: ADD
0383: PUSH1 0x00
--- range 0x384-0x488 ---
0384: STOP
0385: SHA3
0386: PUSH1 0x00
0388: POP
0389: PUSH1 0x00
038b: DUP8
038c: PUSH1 0x01
038e: PUSH1 0xa0
0390: PUSH1 0x02
0392: EXP
0393: SUB
0394: AND
0395: DUP2
0396: MSTORE
0397: PUSH1 0x20
0399: ADD
039a: SWAP1
039b: DUP2
039c: MSTORE
039d: PUSH1 0x20
039f: ADD
03a0: PUSH1 0x00
03a2: SHA3
03a3: PUSH1 0x00
03a5: POP
03a6: DUP2
03a7: SWAP1
03a8: SSTORE
03a9: POP
03aa: DUP5
03ab: SWAP1
03ac: POP
03ad: DUP1
03ae: PUSH1 0x01
03b0: PUSH1 0xa0
03b2: PUSH1 0x02
03b4: EXP
03b5: SUB
03b6: AND
03b7: PUSH4 0x8f4ffcb1
03bc: CALLER
03bd: DUP7
03be: ADDRESS
03bf: DUP8
03c0: PUSH1 0x40
03c2: MLOAD
03c3: DUP6
03c4: PUSH1 0xe0
03c6: PUSH1 0x02
03c8: EXP
03c9: MUL
03ca: DUP2
03cb: MSTORE
03cc: PUSH1 0x04
03ce: ADD
03cf: DUP1
03d0: DUP6
03d1: PUSH1 0x01
03d3: PUSH1 0xa0
03d5: PUSH1 0x02
03d7: EXP
03d8: SUB
03d9: AND
03da: DUP2
03db: MSTORE
03dc: PUSH1 0x20
03de: ADD
03df: DUP5
03e0: DUP2
03e1: MSTORE
03e2: PUSH1 0x20
03e4: ADD
03e5: DUP4
03e6: PUSH1 0x01
03e8: PUSH1 0xa0
03ea: PUSH1 0x02
03ec: EXP
03ed: SUB
03ee: AND
03ef: DUP2
03f0: MSTORE
03f1: PUSH1 0x20
03f3: ADD
03f4: DUP1
03f5: PUSH1 0x20
03f7: ADD
03f8: DUP3
03f9: DUP2
03fa: SUB
03fb: DUP3
03fc: MSTORE
03fd: DUP4
03fe: DUP2
03ff: DUP2
0400: MLOAD
0401: DUP2
0402: MSTORE
0403: PUSH1 0x20
0405: ADD
0406: SWAP2
0407: POP
0408: DUP1
0409: MLOAD
040a: SWAP1
040b: PUSH1 0x20
040d: ADD
040e: SWAP1
040f: DUP1
0410: DUP4
0411: DUP4
0412: DUP3
0413: SWAP1
0414: PUSH1 0x00
0416: PUSH1 0x04
0418: PUSH1 0x20
041a: DUP5
041b: PUSH1 0x1f
041d: ADD
041e: DIV
041f: PUSH1 0x0f
0421: MUL
0422: PUSH1 0x03
0424: ADD
0425: CALL
0426: POP
0427: SWAP1
0428: POP
0429: SWAP1
042a: DUP2
042b: ADD
042c: SWAP1
042d: PUSH1 0x1f
042f: AND
0430: DUP1
0431: ISZERO
0432: PUSH2 0x044f
0435: JUMPI
0436: DUP1
0437: DUP3
0438: SUB
0439: DUP1
043a: MLOAD
043b: PUSH1 0x01
043d: DUP4
043e: PUSH1 0x20
0440: SUB
0441: PUSH2 0x0100
0444: EXP
0445: SUB
0446: NOT
0447: AND
0448: DUP2
0449: MSTORE
044a: PUSH1 0x20
044c: ADD
044d: SWAP2
044e: POP
044f: JUMPDEST
0450: POP
0451: SWAP6
0452: POP
0453: POP
0454: POP
0455: POP
0456: POP
0457: POP
0458: PUSH1 0x00
045a: PUSH1 0x40
045c: MLOAD
045d: DUP1
045e: DUP4
045f: SUB
0460: DUP2
0461: PUSH1 0x00
0463: DUP8
0464: PUSH2 0x61da
0467: GAS
0468: SUB
0469: CALL
046a: ISZERO
046b: PUSH2 0x0002
046e: JUMPI
046f: POP
0470: POP
0471: POP
0472: POP
0473: SWAP4
0474: SWAP3
0475: POP
0476: POP
0477: POP
0478: JUMP
0479: JUMPDEST
047a: PUSH1 0x05
047c: PUSH1 0x20
047e: SWAP1
047f: DUP2
0480: MSTORE
0481: PUSH1 0x04
0483: CALLDATALOAD
0484: PUSH1 0x00
0486: SWAP1
0487: DUP2
--- range 0x618-0x7da ---
0618: STATICCALL
0619: OP_0c
061a: OP_f6
061b: SWAP1
061c: DUP2
061d: ADD
061e: SWAP1
061f: PUSH2 0x021f
0622: JUMP
0623: JUMPDEST
0624: POP
0625: SWAP1
0626: JUMP
0627: JUMPDEST
0628: POP
0629: POP
062a: PUSH1 0x02
062c: DUP1
062d: SLOAD
062e: PUSH1 0xff
0630: NOT
0631: AND
0632: PUSH1 0x07
0634: OR
0635: SWAP1
0636: SSTORE
0637: POP
0638: POP
0639: POP
063a: POP
063b: JUMP
063c: JUMPDEST
063d: PUSH1 0x01
063f: PUSH1 0xa0
0641: PUSH1 0x02
0643: EXP
0644: SUB
0645: DUP3
0646: AND
0647: PUSH1 0x00
0649: SWAP1
064a: DUP2
064b: MSTORE
064c: PUSH1 0x03
064e: PUSH1 0x20
0650: MSTORE
0651: PUSH1 0x40
0653: SWAP1
0654: SHA3
0655: SLOAD
0656: DUP2
0657: DUP2
0658: ADD
0659: LT
065a: ISZERO
065b: PUSH2 0x0663
065e: JUMPI
065f: PUSH2 0x0002
0662: JUMP
0663: JUMPDEST
0664: PUSH1 0x01
0666: PUSH1 0xa0
0668: PUSH1 0x02
066a: EXP
066b: SUB
066c: CALLER
066d: DUP2
066e: AND
066f: PUSH1 0x00
0671: DUP2
0672: DUP2
0673: MSTORE
0674: PUSH1 0x03
0676: PUSH1 0x20
0678: SWAP1
0679: DUP2
067a: MSTORE
067b: PUSH1 0x40
067d: DUP1
067e: DUP4
067f: SHA3
0680: DUP1
0681: SLOAD
0682: DUP8
0683: SWAP1
0684: SUB
0685: SWAP1
0686: SSTORE
0687: SWAP4
0688: DUP7
0689: AND
068a: DUP1
068b: DUP4
068c: MSTORE
068d: SWAP2
068e: DUP5
068f: SWAP1
0690: SHA3
0691: DUP1
0692: SLOAD
0693: DUP7
0694: ADD
0695: SWAP1
0696: SSTORE
0697: DUP4
0698: MLOAD
0699: DUP6
069a: DUP2
069b: MSTORE
069c: SWAP4
069d: MLOAD
069e: SWAP2
069f: SWAP4
06a0: PUSH32 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef
06c1: SWAP3
06c2: SWAP1
06c3: DUP2
06c4: SWAP1
06c5: SUB
06c6: SWAP1
06c7: SWAP2
06c8: ADD
06c9: SWAP1
06ca: LOG3
06cb: POP
06cc: POP
06cd: JUMP
06ce: JUMPDEST
06cf: PUSH1 0x01
06d1: PUSH1 0xa0
06d3: PUSH1 0x02
06d5: EXP
06d6: SUB
06d7: DUP4
06d8: AND
06d9: PUSH1 0x00
06db: SWAP1
06dc: DUP2
06dd: MSTORE
06de: PUSH1 0x03
06e0: PUSH1 0x20
06e2: MSTORE
06e3: PUSH1 0x40
06e5: SWAP1
06e6: SHA3
06e7: SLOAD
06e8: DUP3
06e9: DUP2
06ea: ADD
06eb: LT
06ec: ISZERO
06ed: PUSH2 0x06f5
06f0: JUMPI
06f1: PUSH2 0x0002
06f4: JUMP
06f5: JUMPDEST
06f6: PUSH1 0x01
06f8: PUSH1 0xa0
06fa: PUSH1 0x02
06fc: EXP
06fd: SUB
06fe: DUP5
06ff: DUP2
0700: AND
0701: PUSH1 0x00
0703: DUP2
0704: DUP2
0705: MSTORE
0706: PUSH1 0x04
0708: PUSH1 0x20
070a: SWAP1
070b: DUP2
070c: MSTORE
070d: PUSH1 0x40
070f: DUP1
0710: DUP4
0711: SHA3
0712: CALLER
0713: SWAP6
0714: SWAP1
0715: SWAP6
0716: AND
0717: DUP1
0718: DUP5
0719: MSTORE
071a: SWAP5
071b: DUP3
071c: MSTORE
071d: DUP1
071e: DUP4
071f: SHA3
0720: SLOAD
0721: SWAP4
0722: DUP4
0723: MSTORE
0724: PUSH1 0x05
0726: DUP3
0727: MSTORE
0728: DUP1
0729: DUP4
072a: SHA3
072b: SWAP5
072c: DUP4
072d: MSTORE
072e: SWAP4
072f: SWAP1
0730: MSTORE
0731: SWAP2
0732: SWAP1
0733: SWAP2
0734: SHA3
0735: SLOAD
0736: DUP4
0737: ADD
0738: GT
0739: ISZERO
073a: PUSH2 0x0742
073d: JUMPI
073e: PUSH2 0x0002
0741: JUMP
0742: JUMPDEST
0743: PUSH1 0x01
0745: PUSH1 0xa0
0747: PUSH1 0x02
0749: EXP
074a: SUB
074b: DUP5
074c: DUP2
074d: AND
074e: PUSH1 0x00
0750: DUP2
0751: DUP2
0752: MSTORE
0753: PUSH1 0x03
0755: PUSH1 0x20
0757: SWAP1
0758: DUP2
0759: MSTORE
075a: PUSH1 0x40
075c: DUP1
075d: DUP4
075e: SHA3
075f: DUP1
0760: SLOAD
0761: DUP9
0762: SWAP1
0763: SUB
0764: SWAP1
0765: SSTORE
0766: DUP8
0767: DUP6
0768: AND
0769: DUP1
076a: DUP5
076b: MSTORE
076c: DUP2
076d: DUP5
076e: SHA3
076f: DUP1
0770: SLOAD
0771: DUP10
0772: ADD
0773: SWAP1
0774: SSTORE
0775: SWAP4
0776: DUP4
0777: MSTORE
0778: PUSH1 0x05
077a: DUP3
077b: MSTORE
077c: DUP1
077d: DUP4
077e: SHA3
077f: CALLER
0780: SWAP6
0781: SWAP1
0782: SWAP6
0783: AND
0784: DUP1
0785: DUP5
0786: MSTORE
0787: SWAP5
0788: DUP3
0789: MSTORE
078a: SWAP2
078b: DUP3
078c: SWAP1
078d: SHA3
078e: DUP1
078f: SLOAD
0790: DUP8
0791: ADD
0792: SWAP1
0793: SSTORE
0794: DUP2
0795: MLOAD
0796: DUP7
0797: DUP2
0798: MSTORE
0799: SWAP2
079a: MLOAD
079b: SWAP3
079c: SWAP4
079d: SWAP3
079e: PUSH32 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef
07bf: SWAP3
07c0: DUP2
07c1: SWAP1
07c2: SUB
07c3: SWAP1
07c4: SWAP2
07c5: ADD
07c6: SWAP1
07c7: LOG3
07c8: SWAP4
07c9: SWAP3
07ca: POP
07cb: POP
07cc: POP
07cd: JUMP
exec
/bin/bash -lc "python3 - <<'PY'
import json
opcodes={0x00:'STOP',0x01:'ADD',0x02:'MUL',0x03:'SUB',0x04:'DIV',0x05:'SDIV',0x06:'MOD',0x07:'SMOD',0x08:'ADDMOD',0x09:'MULMOD',0x0a:'EXP',0x0b:'SIGNEXTEND',0x10:'LT',0x11:'GT',0x12:'SLT',0x13:'SGT',0x14:'EQ',0x15:'ISZERO',0x16:'AND',0x17:'OR',0x18:'XOR',0x19:'NOT',0x1a:'BYTE',0x20:'SHA3',0x30:'ADDRESS',0x31:'BALANCE',0x32:'ORIGIN',0x33:'CALLER',0x34:'CALLVALUE',0x35:'CALLDATALOAD',0x36:'CALLDATASIZE',0x37:'CALLDATACOPY',0x38:'CODESIZE',0x39:'CODECOPY',0x3a:'GASPRICE',0x3b:'EXTCODESIZE',0x3c:'EXTCODECOPY',0x3d:'RETURNDATASIZE',0x3e:'RETURNDATACOPY',0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x53:'MSTORE8',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x58:'PC',0x59:'MSIZE',0x5a:'GAS',0x5b:'JUMPDEST',0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'}
for i in range(1,33): opcodes[0x5f+i]=f'PUSH{i}'
for i in range(1,17): opcodes[0x7f+i]=f'DUP{i}'
for i in range(1,17): opcodes[0x8f+i]=f'SWAP{i}'
for i in range(0,5): opcodes[0xa0+i]=f'LOG{i}'
bytecode=bytes.fromhex(json.load(open('BYTECODE_BUNDLE.json'))['artifact']['runtime_bytecode']['full'][2:])
entries=[0x00e8,0x0233,0x0265,0x0271,0x0289,0x02e6,0x0315,0x0479,0x049e,0x04c2,0x0532,0x0544,0x0586,0x0627,0x063c,0x06ce]
# print from 0x315 to 0x4c2, and 0x479 to 0x532
for start,end in [(0x315,0x479),(0x479,0x4c2),(0xe8,0x233)]:
print(f'--- {start:#x}-{end:#x} ---')
pc=start
while pc<end:
op=bytecode[pc]
name=opcodes.get(op,f'OP_{op:02x}')
if 0x60<=op<=0x7f:
n=op-0x5f; data=bytecode[pc+1:pc+1+n]
print(f'{pc:04x}: {name} 0x{data.hex()}')
pc+=1+n
else:
print(f'{pc:04x}: {name}')
pc+=1
PY" in /tmp/codex-ewkgz7je
succeeded in 0ms:
--- 0x315-0x479 ---
0315: JUMPDEST
0316: PUSH1 0x40
0318: DUP1
0319: MLOAD
031a: PUSH1 0x20
031c: PUSH1 0x44
031e: CALLDATALOAD
031f: PUSH1 0x04
0321: DUP2
0322: DUP2
0323: ADD
0324: CALLDATALOAD
0325: PUSH1 0x1f
0327: DUP2
0328: ADD
0329: DUP5
032a: SWAP1
032b: DIV
032c: DUP5
032d: MUL
032e: DUP6
032f: ADD
0330: DUP5
0331: ADD
0332: SWAP1
0333: SWAP6
0334: MSTORE
0335: DUP5
0336: DUP5
0337: MSTORE
0338: PUSH2 0x0532
033b: SWAP5
033c: DUP2
033d: CALLDATALOAD
033e: SWAP5
033f: PUSH1 0x24
0341: DUP1
0342: CALLDATALOAD
0343: SWAP6
0344: SWAP4
0345: SWAP5
0346: PUSH1 0x64
0348: SWAP5
0349: SWAP3
034a: SWAP4
034b: SWAP2
034c: ADD
034d: SWAP2
034e: DUP2
034f: SWAP1
0350: DUP5
0351: ADD
0352: DUP4
0353: DUP3
0354: DUP1
0355: DUP3
0356: DUP5
0357: CALLDATACOPY
0358: POP
0359: SWAP5
035a: SWAP7
035b: POP
035c: POP
035d: POP
035e: POP
035f: POP
0360: POP
0361: POP
0362: PUSH1 0x00
0364: PUSH1 0x00
0366: DUP4
0367: PUSH1 0x04
0369: PUSH1 0x00
036b: POP
036c: PUSH1 0x00
036e: CALLER
036f: PUSH1 0x01
0371: PUSH1 0xa0
0373: PUSH1 0x02
0375: EXP
0376: SUB
0377: AND
0378: DUP2
0379: MSTORE
037a: PUSH1 0x20
037c: ADD
037d: SWAP1
037e: DUP2
037f: MSTORE
0380: PUSH1 0x20
0382: ADD
0383: PUSH1 0x00
0385: SHA3
0386: PUSH1 0x00
0388: POP
0389: PUSH1 0x00
038b: DUP8
038c: PUSH1 0x01
038e: PUSH1 0xa0
0390: PUSH1 0x02
0392: EXP
0393: SUB
0394: AND
0395: DUP2
0396: MSTORE
0397: PUSH1 0x20
0399: ADD
039a: SWAP1
039b: DUP2
039c: MSTORE
039d: PUSH1 0x20
039f: ADD
03a0: PUSH1 0x00
03a2: SHA3
03a3: PUSH1 0x00
03a5: POP
03a6: DUP2
03a7: SWAP1
03a8: SSTORE
03a9: POP
03aa: DUP5
03ab: SWAP1
03ac: POP
03ad: DUP1
03ae: PUSH1 0x01
03b0: PUSH1 0xa0
03b2: PUSH1 0x02
03b4: EXP
03b5: SUB
03b6: AND
03b7: PUSH4 0x8f4ffcb1
03bc: CALLER
03bd: DUP7
03be: ADDRESS
03bf: DUP8
03c0: PUSH1 0x40
03c2: MLOAD
03c3: DUP6
03c4: PUSH1 0xe0
03c6: PUSH1 0x02
03c8: EXP
03c9: MUL
03ca: DUP2
03cb: MSTORE
03cc: PUSH1 0x04
03ce: ADD
03cf: DUP1
03d0: DUP6
03d1: PUSH1 0x01
03d3: PUSH1 0xa0
03d5: PUSH1 0x02
03d7: EXP
03d8: SUB
03d9: AND
03da: DUP2
03db: MSTORE
03dc: PUSH1 0x20
03de: ADD
03df: DUP5
03e0: DUP2
03e1: MSTORE
03e2: PUSH1 0x20
03e4: ADD
03e5: DUP4
03e6: PUSH1 0x01
03e8: PUSH1 0xa0
03ea: PUSH1 0x02
03ec: EXP
03ed: SUB
03ee: AND
03ef: DUP2
03f0: MSTORE
03f1: PUSH1 0x20
03f3: ADD
03f4: DUP1
03f5: PUSH1 0x20
03f7: ADD
03f8: DUP3
03f9: DUP2
03fa: SUB
03fb: DUP3
03fc: MSTORE
03fd: DUP4
03fe: DUP2
03ff: DUP2
0400: MLOAD
0401: DUP2
0402: MSTORE
0403: PUSH1 0x20
0405: ADD
0406: SWAP2
0407: POP
0408: DUP1
0409: MLOAD
040a: SWAP1
040b: PUSH1 0x20
040d: ADD
040e: SWAP1
040f: DUP1
0410: DUP4
0411: DUP4
0412: DUP3
0413: SWAP1
0414: PUSH1 0x00
0416: PUSH1 0x04
0418: PUSH1 0x20
041a: DUP5
041b: PUSH1 0x1f
041d: ADD
041e: DIV
041f: PUSH1 0x0f
0421: MUL
0422: PUSH1 0x03
0424: ADD
0425: CALL
0426: POP
0427: SWAP1
0428: POP
0429: SWAP1
042a: DUP2
042b: ADD
042c: SWAP1
042d: PUSH1 0x1f
042f: AND
0430: DUP1
0431: ISZERO
0432: PUSH2 0x044f
0435: JUMPI
0436: DUP1
0437: DUP3
0438: SUB
0439: DUP1
043a: MLOAD
043b: PUSH1 0x01
043d: DUP4
043e: PUSH1 0x20
0440: SUB
0441: PUSH2 0x0100
0444: EXP
0445: SUB
0446: NOT
0447: AND
0448: DUP2
0449: MSTORE
044a: PUSH1 0x20
044c: ADD
044d: SWAP2
044e: POP
044f: JUMPDEST
0450: POP
0451: SWAP6
0452: POP
0453: POP
0454: POP
0455: POP
0456: POP
0457: POP
0458: PUSH1 0x00
045a: PUSH1 0x40
045c: MLOAD
045d: DUP1
045e: DUP4
045f: SUB
0460: DUP2
0461: PUSH1 0x00
0463: DUP8
0464: PUSH2 0x61da
0467: GAS
0468: SUB
0469: CALL
046a: ISZERO
046b: PUSH2 0x0002
046e: JUMPI
046f: POP
0470: POP
0471: POP
0472: POP
0473: SWAP4
0474: SWAP3
0475: POP
0476: POP
0477: POP
0478: JUMP
--- 0x479-0x4c2 ---
0479: JUMPDEST
047a: PUSH1 0x05
047c: PUSH1 0x20
047e: SWAP1
047f: DUP2
0480: MSTORE
0481: PUSH1 0x04
0483: CALLDATALOAD
0484: PUSH1 0x00
0486: SWAP1
0487: DUP2
0488: MSTORE
0489: PUSH1 0x40
048b: DUP1
048c: DUP3
048d: SHA3
048e: SWAP1
048f: SWAP3
0490: MSTORE
0491: PUSH1 0x24
0493: CALLDATALOAD
0494: DUP2
0495: MSTORE
0496: SHA3
0497: SLOAD
0498: PUSH2 0x0532
049b: SWAP1
049c: DUP2
049d: JUMP
049e: JUMPDEST
049f: PUSH1 0x04
04a1: PUSH1 0x20
04a3: DUP2
04a4: DUP2
04a5: MSTORE
04a6: SWAP1
04a7: CALLDATALOAD
04a8: PUSH1 0x00
04aa: SWAP1
04ab: DUP2
04ac: MSTORE
04ad: PUSH1 0x40
04af: DUP1
04b0: DUP3
04b1: SHA3
04b2: SWAP1
04b3: SWAP3
04b4: MSTORE
04b5: PUSH1 0x24
04b7: CALLDATALOAD
04b8: DUP2
04b9: MSTORE
04ba: SHA3
04bb: SLOAD
04bc: PUSH2 0x0532
04bf: SWAP1
04c0: DUP2
04c1: JUMP
--- 0xe8-0x233 ---
00e8: JUMPDEST
00e9: PUSH1 0x40
00eb: DUP1
00ec: MLOAD
00ed: PUSH1 0x20
00ef: PUSH1 0x24
00f1: DUP1
00f2: CALLDATALOAD
00f3: PUSH1 0x04
00f5: DUP2
00f6: DUP2
00f7: ADD
00f8: CALLDATALOAD
00f9: PUSH1 0x1f
00fb: DUP2
00fc: ADD
00fd: DUP6
00fe: SWAP1
00ff: DIV
0100: DUP6
0101: MUL
0102: DUP7
0103: ADD
0104: DUP6
0105: ADD
0106: SWAP1
0107: SWAP7
0108: MSTORE
0109: DUP6
010a: DUP6
010b: MSTORE
010c: PUSH2 0x04c2
010f: SWAP6
0110: DUP2
0111: CALLDATALOAD
0112: SWAP6
0113: SWAP2
0114: SWAP5
0115: PUSH1 0x44
0117: SWAP5
0118: SWAP3
0119: SWAP4
011a: SWAP1
011b: SWAP3
011c: ADD
011d: SWAP2
011e: DUP2
011f: SWAP1
0120: DUP5
0121: ADD
0122: DUP4
0123: DUP3
0124: DUP1
0125: DUP3
0126: DUP5
0127: CALLDATACOPY
0128: POP
0129: POP
012a: PUSH1 0x40
012c: DUP1
012d: MLOAD
012e: PUSH1 0x20
0130: PUSH1 0x64
0132: CALLDATALOAD
0133: DUP1
0134: DUP12
0135: ADD
0136: CALLDATALOAD
0137: PUSH1 0x1f
0139: DUP2
013a: ADD
013b: DUP4
013c: SWAP1
013d: DIV
013e: DUP4
013f: MUL
0140: DUP5
0141: ADD
0142: DUP4
0143: ADD
0144: SWAP1
0145: SWAP5
0146: MSTORE
0147: DUP4
0148: DUP4
0149: MSTORE
014a: SWAP8
014b: SWAP10
014c: SWAP9
014d: CALLDATALOAD
014e: SWAP9
014f: SWAP8
0150: PUSH1 0x84
0152: SWAP8
0153: POP
0154: SWAP2
0155: SWAP6
0156: POP
0157: PUSH1 0x24
0159: SWAP2
015a: SWAP1
015b: SWAP2
015c: ADD
015d: SWAP4
015e: POP
015f: SWAP1
0160: SWAP2
0161: POP
0162: DUP2
0163: SWAP1
0164: DUP5
0165: ADD
0166: DUP4
0167: DUP3
0168: DUP1
0169: DUP3
016a: DUP5
016b: CALLDATACOPY
016c: POP
016d: POP
016e: POP
016f: PUSH1 0x01
0171: PUSH1 0xa0
0173: PUSH1 0x02
0175: EXP
0176: SUB
0177: CALLER
0178: AND
0179: PUSH1 0x00
017b: SWAP1
017c: DUP2
017d: MSTORE
017e: PUSH1 0x03
0180: PUSH1 0x20
0182: SWAP1
0183: DUP2
0184: MSTORE
0185: PUSH1 0x40
0187: DUP1
0188: DUP4
0189: SHA3
018a: PUSH3 0x0bde31
018e: SWAP1
018f: SSTORE
0190: DUP1
0191: MLOAD
0192: DUP1
0193: DUP3
0194: ADD
0195: SWAP1
0196: SWAP2
0197: MSTORE
0198: PUSH1 0x07
019a: DUP2
019b: MSTORE
019c: PUSH32 0x55636b436f696e00000000000000000000000000000000000000000000000000
01bd: SWAP1
01be: DUP3
01bf: ADD
01c0: SWAP1
01c1: DUP2
01c2: MSTORE
01c3: DUP3
01c4: SLOAD
01c5: DUP4
01c6: DUP1
01c7: MSTORE
01c8: SWAP1
01c9: MLOAD
01ca: PUSH1 0x0e
01cc: PUSH1 0xff
01ce: NOT
01cf: SWAP1
01d0: SWAP2
01d1: AND
01d2: OR
01d3: DUP4
01d4: SSTORE
01d5: SWAP6
01d6: SWAP8
01d7: POP
01d8: SWAP1
01d9: SWAP6
01da: POP
01db: PUSH2 0x058e
01de: SWAP5
01df: PUSH1 0x02
01e1: PUSH1 0x01
01e3: DUP3
01e4: AND
01e5: ISZERO
01e6: PUSH2 0x0100
01e9: MUL
01ea: PUSH1 0x00
01ec: NOT
01ed: ADD
01ee: SWAP1
01ef: SWAP2
01f0: AND
01f1: DIV
01f2: PUSH1 0x1f
01f4: ADD
01f5: DIV
01f6: PUSH32 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563
0217: SWAP1
0218: DUP2
0219: ADD
021a: SWAP4
021b: POP
021c: SWAP2
021d: POP
021e: POP
021f: JUMPDEST
0220: DUP1
0221: DUP3
0222: GT
0223: ISZERO
0224: PUSH2 0x0623
0227: JUMPI
0228: PUSH1 0x00
022a: DUP2
022b: SSTORE
022c: PUSH1 0x01
022e: ADD
022f: PUSH2 0x021f
0232: JUMP
exec
/bin/bash -lc "python3 - <<'PY'
import json
opcodes={0x00:'STOP',0x01:'ADD',0x02:'MUL',0x03:'SUB',0x04:'DIV',0x05:'SDIV',0x06:'MOD',0x07:'SMOD',0x08:'ADDMOD',0x09:'MULMOD',0x0a:'EXP',0x0b:'SIGNEXTEND',0x10:'LT',0x11:'GT',0x12:'SLT',0x13:'SGT',0x14:'EQ',0x15:'ISZERO',0x16:'AND',0x17:'OR',0x18:'XOR',0x19:'NOT',0x1a:'BYTE',0x20:'SHA3',0x30:'ADDRESS',0x31:'BALANCE',0x32:'ORIGIN',0x33:'CALLER',0x34:'CALLVALUE',0x35:'CALLDATALOAD',0x36:'CALLDATASIZE',0x37:'CALLDATACOPY',0x38:'CODESIZE',0x39:'CODECOPY',0x3a:'GASPRICE',0x3b:'EXTCODESIZE',0x3c:'EXTCODECOPY',0x3d:'RETURNDATASIZE',0x3e:'RETURNDATACOPY',0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x53:'MSTORE8',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x58:'PC',0x59:'MSIZE',0x5a:'GAS',0x5b:'JUMPDEST',0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'}
for i in range(1,33): opcodes[0x5f+i]=f'PUSH{i}'
for i in range(1,17): opcodes[0x7f+i]=f'DUP{i}'
for i in range(1,17): opcodes[0x8f+i]=f'SWAP{i}'
for i in range(0,5): opcodes[0xa0+i]=f'LOG{i}'
bytecode=bytes.fromhex(json.load(open('BYTECODE_BUNDLE.json'))['artifact']['runtime_bytecode']['full'][2:])
for start,end in [(0x532,0x632),(0x586,0x62f)]:
print(f'--- {start:#x}-{end:#x} ---')
pc=start
while pc<end:
op=bytecode[pc]; name=opcodes.get(op,f'OP_{op:02x}')
if 0x60<=op<=0x7f:
n=op-0x5f; data=bytecode[pc+1:pc+1+n]
print(f'{pc:04x}: {name} 0x{data.hex()}')
pc+=1+n
else:
print(f'{pc:04x}: {name}')
pc+=1
PY" in /tmp/codex-ewkgz7je
succeeded in 0ms:
--- 0x532-0x632 ---
0532: JUMPDEST
0533: PUSH1 0x40
0535: DUP1
0536: MLOAD
0537: SWAP2
0538: DUP3
0539: MSTORE
053a: MLOAD
053b: SWAP1
053c: DUP2
053d: SWAP1
053e: SUB
053f: PUSH1 0x20
0541: ADD
0542: SWAP1
0543: RETURN
0544: JUMPDEST
0545: PUSH1 0x40
0547: DUP1
0548: MLOAD
0549: PUSH1 0xff
054b: SWAP3
054c: SWAP1
054d: SWAP3
054e: AND
054f: DUP3
0550: MSTORE
0551: MLOAD
0552: SWAP1
0553: DUP2
0554: SWAP1
0555: SUB
0556: PUSH1 0x20
0558: ADD
0559: SWAP1
055a: RETURN
055b: JUMPDEST
055c: DUP3
055d: ADD
055e: SWAP2
055f: SWAP1
0560: PUSH1 0x00
0562: MSTORE
0563: PUSH1 0x20
0565: PUSH1 0x00
0567: SHA3
0568: SWAP1
0569: JUMPDEST
056a: DUP2
056b: SLOAD
056c: DUP2
056d: MSTORE
056e: SWAP1
056f: PUSH1 0x01
0571: ADD
0572: SWAP1
0573: PUSH1 0x20
0575: ADD
0576: DUP1
0577: DUP4
0578: GT
0579: PUSH2 0x0569
057c: JUMPI
057d: DUP3
057e: SWAP1
057f: SUB
0580: PUSH1 0x1f
0582: AND
0583: DUP3
0584: ADD
0585: SWAP2
0586: JUMPDEST
0587: POP
0588: POP
0589: POP
058a: POP
058b: POP
058c: DUP2
058d: JUMP
058e: JUMPDEST
058f: POP
0590: POP
0591: PUSH1 0x40
0593: DUP1
0594: MLOAD
0595: DUP1
0596: DUP3
0597: ADD
0598: SWAP1
0599: SWAP2
059a: MSTORE
059b: PUSH1 0x01
059d: DUP1
059e: DUP3
059f: MSTORE
05a0: PUSH32 0x5500000000000000000000000000000000000000000000000000000000000000
05c1: PUSH1 0x20
05c3: SWAP3
05c4: DUP4
05c5: ADD
05c6: SWAP1
05c7: DUP2
05c8: MSTORE
05c9: DUP2
05ca: SLOAD
05cb: PUSH1 0x00
05cd: DUP4
05ce: SWAP1
05cf: MSTORE
05d0: SWAP1
05d1: MLOAD
05d2: PUSH1 0xff
05d4: NOT
05d5: AND
05d6: PUSH1 0x02
05d8: SWAP1
05d9: DUP2
05da: OR
05db: DUP4
05dc: SSTORE
05dd: SWAP2
05de: SWAP3
05df: PUSH2 0x0627
05e2: SWAP3
05e3: DUP3
05e4: DUP6
05e5: AND
05e6: ISZERO
05e7: PUSH2 0x0100
05ea: MUL
05eb: PUSH1 0x00
05ed: NOT
05ee: ADD
05ef: SWAP1
05f0: SWAP3
05f1: AND
05f2: SWAP2
05f3: SWAP1
05f4: SWAP2
05f5: DIV
05f6: PUSH1 0x1f
05f8: ADD
05f9: DIV
05fa: PUSH32 0xb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6
061b: SWAP1
061c: DUP2
061d: ADD
061e: SWAP1
061f: PUSH2 0x021f
0622: JUMP
0623: JUMPDEST
0624: POP
0625: SWAP1
0626: JUMP
0627: JUMPDEST
0628: POP
0629: POP
062a: PUSH1 0x02
062c: DUP1
062d: SLOAD
062e: PUSH1 0xff
0630: NOT
0631: AND
--- 0x586-0x62f ---
0586: JUMPDEST
0587: POP
0588: POP
0589: POP
058a: POP
058b: POP
058c: DUP2
058d: JUMP
058e: JUMPDEST
058f: POP
0590: POP
0591: PUSH1 0x40
0593: DUP1
0594: MLOAD
0595: DUP1
0596: DUP3
0597: ADD
0598: SWAP1
0599: SWAP2
059a: MSTORE
059b: PUSH1 0x01
059d: DUP1
059e: DUP3
059f: MSTORE
05a0: PUSH32 0x5500000000000000000000000000000000000000000000000000000000000000
05c1: PUSH1 0x20
05c3: SWAP3
05c4: DUP4
05c5: ADD
05c6: SWAP1
05c7: DUP2
05c8: MSTORE
05c9: DUP2
05ca: SLOAD
05cb: PUSH1 0x00
05cd: DUP4
05ce: SWAP1
05cf: MSTORE
05d0: SWAP1
05d1: MLOAD
05d2: PUSH1 0xff
05d4: NOT
05d5: AND
05d6: PUSH1 0x02
05d8: SWAP1
05d9: DUP2
05da: OR
05db: DUP4
05dc: SSTORE
05dd: SWAP2
05de: SWAP3
05df: PUSH2 0x0627
05e2: SWAP3
05e3: DUP3
05e4: DUP6
05e5: AND
05e6: ISZERO
05e7: PUSH2 0x0100
05ea: MUL
05eb: PUSH1 0x00
05ed: NOT
05ee: ADD
05ef: SWAP1
05f0: SWAP3
05f1: AND
05f2: SWAP2
05f3: SWAP1
05f4: SWAP2
05f5: DIV
05f6: PUSH1 0x1f
05f8: ADD
05f9: DIV
05fa: PUSH32 0xb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6
061b: SWAP1
061c: DUP2
061d: ADD
061e: SWAP1
061f: PUSH2 0x021f
0622: JUMP
0623: JUMPDEST
0624: POP
0625: SWAP1
0626: JUMP
0627: JUMPDEST
0628: POP
0629: POP
062a: PUSH1 0x02
062c: DUP1
062d: SLOAD
062e: PUSH1 0xff
exec
/bin/bash -lc "python3 - <<'PY'
import json
opcodes={0x00:'STOP',0x01:'ADD',0x02:'MUL',0x03:'SUB',0x04:'DIV',0x05:'SDIV',0x06:'MOD',0x07:'SMOD',0x08:'ADDMOD',0x09:'MULMOD',0x0a:'EXP',0x0b:'SIGNEXTEND',0x10:'LT',0x11:'GT',0x12:'SLT',0x13:'SGT',0x14:'EQ',0x15:'ISZERO',0x16:'AND',0x17:'OR',0x18:'XOR',0x19:'NOT',0x1a:'BYTE',0x20:'SHA3',0x30:'ADDRESS',0x31:'BALANCE',0x32:'ORIGIN',0x33:'CALLER',0x34:'CALLVALUE',0x35:'CALLDATALOAD',0x36:'CALLDATASIZE',0x37:'CALLDATACOPY',0x38:'CODESIZE',0x39:'CODECOPY',0x3a:'GASPRICE',0x3b:'EXTCODESIZE',0x3c:'EXTCODECOPY',0x3d:'RETURNDATASIZE',0x3e:'RETURNDATACOPY',0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x53:'MSTORE8',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x58:'PC',0x59:'MSIZE',0x5a:'GAS',0x5b:'JUMPDEST',0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'}
for i in range(1,33): opcodes[0x5f+i]=f'PUSH{i}'
for i in range(1,17): opcodes[0x7f+i]=f'DUP{i}'
for i in range(1,17): opcodes[0x8f+i]=f'SWAP{i}'
for i in range(0,5): opcodes[0xa0+i]=f'LOG{i}'
bytecode=bytes.fromhex(json.load(open('BYTECODE_BUNDLE.json'))['artifact']['runtime_bytecode']['full'][2:])
start,end=0x4c2,0x532
pc=start
while pc<end:
op=bytecode[pc]; name=opcodes.get(op,f'OP_{op:02x}')
if 0x60<=op<=0x7f:
n=op-0x5f; data=bytecode[pc+1:pc+1+n]
print(f'{pc:04x}: {name} 0x{data.hex()}')
pc+=1+n
else:
print(f'{pc:04x}: {name}')
pc+=1
PY" in /tmp/codex-ewkgz7je
succeeded in 0ms:
04c2: JUMPDEST
04c3: STOP
04c4: JUMPDEST
04c5: PUSH1 0x40
04c7: MLOAD
04c8: DUP1
04c9: DUP1
04ca: PUSH1 0x20
04cc: ADD
04cd: DUP3
04ce: DUP2
04cf: SUB
04d0: DUP3
04d1: MSTORE
04d2: DUP4
04d3: DUP2
04d4: DUP2
04d5: MLOAD
04d6: DUP2
04d7: MSTORE
04d8: PUSH1 0x20
04da: ADD
04db: SWAP2
04dc: POP
04dd: DUP1
04de: MLOAD
04df: SWAP1
04e0: PUSH1 0x20
04e2: ADD
04e3: SWAP1
04e4: DUP1
04e5: DUP4
04e6: DUP4
04e7: DUP3
04e8: SWAP1
04e9: PUSH1 0x00
04eb: PUSH1 0x04
04ed: PUSH1 0x20
04ef: DUP5
04f0: PUSH1 0x1f
04f2: ADD
04f3: DIV
04f4: PUSH1 0x0f
04f6: MUL
04f7: PUSH1 0x03
04f9: ADD
04fa: CALL
04fb: POP
04fc: SWAP1
04fd: POP
04fe: SWAP1
04ff: DUP2
0500: ADD
0501: SWAP1
0502: PUSH1 0x1f
0504: AND
0505: DUP1
0506: ISZERO
0507: PUSH2 0x0524
050a: JUMPI
050b: DUP1
050c: DUP3
050d: SUB
050e: DUP1
050f: MLOAD
0510: PUSH1 0x01
0512: DUP4
0513: PUSH1 0x20
0515: SUB
0516: PUSH2 0x0100
0519: EXP
051a: SUB
051b: NOT
051c: AND
051d: DUP2
051e: MSTORE
051f: PUSH1 0x20
0521: ADD
0522: SWAP2
0523: POP
0524: JUMPDEST
0525: POP
0526: SWAP3
0527: POP
0528: POP
0529: POP
052a: PUSH1 0x40
052c: MLOAD
052d: DUP1
052e: SWAP2
052f: SUB
0530: SWAP1
0531: RETURN
exec
/bin/bash -lc "rg -n 'detector|finding|issue|warning|upgrade|proxy|guard' BYTECODE_BUNDLE.json" in /tmp/codex-ewkgz7je
succeeded in 0ms:
7: "guards": []
2176: "guards": []
2230: "guards": []
2284: "guards": []
2338: "guards": []
2392: "guards": []
2446: "guards": []
2500: "guards": []
2554: "guards": []
2608: "guards": []
2662: "guards": []
2734: "upgrade_slot_write_suspected": false
2807: "is_proxy": false,
3660: "detector_findings": [
3688: "guards_detected": [],
3741: "guards_detected": []
exec
/bin/bash -lc "sed -n '3640,3785p' BYTECODE_BUNDLE.json" in /tmp/codex-ewkgz7je
succeeded in 0ms:
},
{
"entry_pc": 3714247998,
"id": "fn:0xdc3080f2",
"selector": "0xdc3080f2",
"type": "function"
},
{
"entry_pc": 1218,
"id": "fn:0xdd62ed3e",
"selector": "0xdd62ed3e",
"type": "function"
}
],
"version": "capability_graph_v1"
},
"id": 2208,
"updated_at": "2026-04-04T19:55:01.000000Z",
"version": "capability_graph_v1"
},
"detector_findings": [
{
"confidence": 60,
"evidence_json": {
"call_count": 3,
"examples": [
{
"opcode": "CALL",
"pc": 1061,
"returndata_checked": null,
"target_expression_category": "computed",
"value_expression_category": "computed"
},
{
"opcode": "CALL",
"pc": 1129,
"returndata_checked": null,
"target_expression_category": "computed",
"value_expression_category": "computed"
},
{
"opcode": "CALL",
"pc": 1274,
"returndata_checked": null,
"target_expression_category": "computed",
"value_expression_category": "computed"
}
],
"guards_detected": [],
"untrusted_call_count": 3
},
"normalized_json": {
"sink": "CALL"
},
"severity": "high",
"title": "Untrusted CALL target/value reachable",
"validated": true,
"validation_json": {
"attempts": 1,
"call_targets": [
"0x0000000000000000000000000000000000000004",
"0x2bf4a701470dfe06babd313926a1ebcdcd5806c1"
],
"classification": "target_varies",
"confirmed": true,
"errors": 0,
"matched_probe": null,
"sink": "CALL",
"status": "confirmed",
"target_varies": true,
"trace_id": "0xb712b4a3a5c40d6301e1a7a0fe8e5ec74cd9d23ca6647dae6ec4148daa055239",
"trace_mode": "callTracer"
}
},
{
"confidence": 55,
"evidence_json": {
"eth_value_calls": 3,
"examples": [
{
"opcode": "CALL",
"pc": 1061,
"returndata_checked": null,
"target_expression_category": "computed",
"value_expression_category": "computed"
},
{
"opcode": "CALL",
"pc": 1129,
"returndata_checked": null,
"target_expression_category": "computed",
"value_expression_category": "computed"
},
{
"opcode": "CALL",
"pc": 1274,
"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",
"0x2bf4a701470dfe06babd313926a1ebcdcd5806c1"
],
"classification": "target_varies",
"confirmed": true,
"errors": 0,
"matched_probe": null,
"sink": "CALL",
"status": "confirmed",
"target_varies": true,
"trace_id": "0xb712b4a3a5c40d6301e1a7a0fe8e5ec74cd9d23ca6647dae6ec4148daa055239",
"trace_mode": "callTracer"
}
}
],
"heuristics_summary": {
"create2_count": 0,
"delegatecall_count": 0,
"flags": [],
"selfdestruct_count": 0
}
}
exec
/bin/bash -lc 'cast 4byte 0xcae9ca51 || true
cast 4byte 0x1d2bca17 || true
cast 4byte 0xdc3080f2 || true
cast 4byte 0x8f4ffcb1 || true' in /tmp/codex-ewkgz7je
succeeded in 0ms:
Error: error sending request for url (https://api.4byte.sourcify.dev/signature-database/v1/lookup?function=0xcae9ca51)
Context:
- Error #0: client error (Connect)
- Error #1: dns error
- Error #2: failed to lookup address information: Temporary failure in name resolution
Error: error sending request for url (https://api.4byte.sourcify.dev/signature-database/v1/lookup?function=0x1d2bca17)
Context:
- Error #0: client error (Connect)
- Error #1: dns error
- Error #2: failed to lookup address information: Temporary failure in name resolution
Error: error sending request for url (https://api.4byte.sourcify.dev/signature-database/v1/lookup?function=0xdc3080f2)
Context:
- Error #0: client error (Connect)
- Error #1: dns error
- Error #2: failed to lookup address information: Temporary failure in name resolution
Error: error sending request for url (https://api.4byte.sourcify.dev/signature-database/v1/lookup?function=0x8f4ffcb1)
Context:
- Error #0: client error (Connect)
- Error #1: dns error
- Error #2: failed to lookup address information: Temporary failure in name resolution
exec
/bin/bash -lc "python3 - <<'PY'
# rough symbolic trace for 0x315-0x469 to identify CALL args
import json
bytecode=bytes.fromhex(json.load(open('BYTECODE_BUNDLE.json'))['artifact']['runtime_bytecode']['full'][2:])
# disassemble
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',0x20:'SHA3',0x30:'ADDRESS',0x31:'BALANCE',0x32:'ORIGIN',0x33:'CALLER',0x34:'CALLVALUE',0x35:'CALLDATALOAD',0x36:'CALLDATASIZE',0x37:'CALLDATACOPY',0x38:'CODESIZE',0x39:'CODECOPY',0x3a:'GASPRICE',0x3b:'EXTCODESIZE',0x3c:'EXTCODECOPY',0x3d:'RETURNDATASIZE',0x3e:'RETURNDATACOPY',0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x53:'MSTORE8',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x58:'PC',0x59:'MSIZE',0x5a:'GAS',0x5b:'JUMPDEST',0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'}
for 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}'
# parse selected instructions
instrs={}
pc=0x315
while pc<0x46a:
op=bytecode[pc]; name=ops[op]
arg=None
if name.startswith('PUSH'):
n=int(name[4:]); arg=int.from_bytes(bytecode[pc+1:pc+1+n],'big'); npc=pc+1+n
else:
npc=pc+1
instrs[pc]=(name,arg,npc)
pc=npc
stack=[]
mem={}
# seed entry stack with symbolic args? We don't know exact. Let's create 12 placeholders to be safe
for i in range(20):
stack.append(f's{i}')
# top of stack is last element
# Maybe function enters with abi-decoder helper return addr and args on stack? Hard.
# Let's instead start at 0x315 with fresh stack is wrong.
# We need actual stack at entry from dispatcher. So this approach won't work.
print('entry instruction count',len(instrs))
PY" in /tmp/codex-ewkgz7je
succeeded in 0ms:
entry instruction count 270
exec
/bin/bash -lc "python3 - <<'PY'
import json
from collections import defaultdict
bytecode=bytes.fromhex(json.load(open('BYTECODE_BUNDLE.json'))['artifact']['runtime_bytecode']['full'][2:])
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',0x20:'SHA3',0x30:'ADDRESS',0x31:'BALANCE',0x32:'ORIGIN',0x33:'CALLER',0x34:'CALLVALUE',0x35:'CALLDATALOAD',0x36:'CALLDATASIZE',0x37:'CALLDATACOPY',0x38:'CODESIZE',0x39:'CODECOPY',0x3a:'GASPRICE',0x3b:'EXTCODESIZE',0x3c:'EXTCODECOPY',0x3d:'RETURNDATASIZE',0x3e:'RETURNDATACOPY',0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x53:'MSTORE8',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x58:'PC',0x59:'MSIZE',0x5a:'GAS',0x5b:'JUMPDEST',0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'}
for 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}'
# parse instructions from 0x315 to 0x46a
instrs={}
pc=0x315
while pc<0x46a:
op=bytecode[pc]; name=ops.get(op,hex(op)); arg=None
if name.startswith('PUSH'):
n=int(name[4:]); arg=int.from_bytes(bytecode[pc+1:pc+1+n],'big'); npc=pc+1+n
else:
npc=pc+1
instrs[pc]=(name,arg,npc)
pc=npc
def sym(x):
return str(x)
def bop(op,a,b):
return f'({a} {op} {b})'
def mask(a,b):
return f'({a}&{b})'
stack=['ret_04c2']
mem={64:'0x60'}
pc=0x315
steps=0
while pc<0x46a and steps<1000:
steps+=1
name,arg,npc=instrs[pc]
# print(pc,name,arg,'STACK',stack)
if name=='JUMPDEST':
pass
elif name.startswith('PUSH'):
stack.append(hex(arg) if isinstance(arg,int) else arg)
elif name.startswith('DUP'):
n=int(name[3:]); stack.append(stack[-n])
elif name.startswith('SWAP'):
n=int(name[4:]); stack[-1],stack[-1-n]=stack[-1-n],stack[-1]
elif name=='POP':
stack.pop()
elif name=='MLOAD':
a=stack.pop(); stack.append(mem.get(a,f'mem[{a}]'))
elif name=='MSTORE':
a=stack.pop(); v=stack.pop(); mem[a]=v
elif name=='CALLDATALOAD':
a=stack.pop(); stack.append(f'cd[{a}]')
elif name=='CALLDATACOPY':
dst=stack.pop(); src=stack.pop(); ln=stack.pop(); mem[dst]=f'calldata[{src}:{src}+{ln}]'
elif name=='ADD':
b=stack.pop(); a=stack.pop(); stack.append(bop('+',a,b))
elif name=='SUB':
b=stack.pop(); a=stack.pop(); stack.append(bop('-',a,b))
elif name=='MUL':
b=stack.pop(); a=stack.pop(); stack.append(bop('*',a,b))
elif name=='DIV':
b=stack.pop(); a=stack.pop(); stack.append(bop('/',a,b))
elif name=='AND':
b=stack.pop(); a=stack.pop(); stack.append(mask(a,b))
elif name=='OR':
b=stack.pop(); a=stack.pop(); stack.append(f'({a}|{b})')
elif name=='NOT':
a=stack.pop(); stack.append(f'~{a}')
elif name=='ISZERO':
a=stack.pop(); stack.append(f'iszero({a})')
elif name=='SHA3':
off=stack.pop(); ln=stack.pop(); stack.append(f'keccak(mem[{off}:{off}+{ln}])')
elif name=='SSTORE':
slot=stack.pop(); val=stack.pop(); print(f'SSTORE at {pc:#x}: slot={slot} val={val}')
elif name=='SLOAD':
slot=stack.pop(); stack.append(f'storage[{slot}]')
elif name=='LT':
b=stack.pop(); a=stack.pop(); stack.append(f'({a}<{b})')
elif name=='GT':
b=stack.pop(); a=stack.pop(); stack.append(f'({a}>{b})')
elif name=='EQ':
b=stack.pop(); a=stack.pop(); stack.append(f'({a}=={b})')
elif name=='CALLER':
stack.append('CALLER')
elif name=='ADDRESS':
stack.append('ADDRESS')
elif name=='GAS':
stack.append('GAS')
elif name=='CALL':
outsz=stack.pop(); outoff=stack.pop(); insz=stack.pop(); inoff=stack.pop(); value=stack.pop(); to=stack.pop(); gas=stack.pop();
print(f'CALL at {pc:#x}: gas={gas} to={to} value={value} inoff={inoff} insz={insz} outoff={outoff} outsz={outsz}')
stack.append(f'callret[{pc:#x}]')
elif name=='JUMPI':
dest=stack.pop(); cond=stack.pop(); print(f'JUMPI at {pc:#x}: dest={dest} cond={cond} stack_top={stack[-5:]}')
# choose fallthrough if destination is 0x44f and cond symbolic alignment; doesn't affect later target much maybe. If dest 0x0002 revert, ignore.
if dest=='0x44f':
pc=npc; continue
else:
pc=npc; continue
elif name=='JUMP':
dest=stack.pop(); print('JUMP to',dest,'at',hex(pc),'stack tail',stack[-10:]); break
else:
print('unhandled',hex(pc),name,'stack',stack[-8:]); break
pc=npc
print('final stack tail',stack[-20:])
print('mem keys',list(mem.keys())[:10], 'mem[0x40]=',mem.get('0x40'), mem.get(64), mem.get('64'))
PY" in /tmp/codex-ewkgz7je
succeeded in 0ms:
unhandled 0x375 EXP stack ['0x0', 'cd[0x24]', '0x4', '0x0', 'CALLER', '0x1', '0xa0', '0x2']
final stack tail ['ret_04c2', '0x532', 'cd[0x4]', 'cd[0x24]', 'mem[0x40]', '0x0', '0x0', 'cd[0x24]', '0x4', '0x0', 'CALLER', '0x1', '0xa0', '0x2']
mem keys [64, '0x40', 'mem[0x40]', '(0x20 + mem[0x40])'] mem[0x40]= ((((0x20 / (0x1f + cd[(cd[0x44] + 0x4)])) * 0x20) + mem[0x40]) + 0x20) 0x60 None
exec
/bin/bash -lc "python3 - <<'PY'
import json
bytecode=bytes.fromhex(json.load(open('BYTECODE_BUNDLE.json'))['artifact']['runtime_bytecode']['full'][2:])
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',0x20:'SHA3',0x30:'ADDRESS',0x31:'BALANCE',0x32:'ORIGIN',0x33:'CALLER',0x34:'CALLVALUE',0x35:'CALLDATALOAD',0x36:'CALLDATASIZE',0x37:'CALLDATACOPY',0x38:'CODESIZE',0x39:'CODECOPY',0x3a:'GASPRICE',0x3b:'EXTCODESIZE',0x3c:'EXTCODECOPY',0x3d:'RETURNDATASIZE',0x3e:'RETURNDATACOPY',0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x53:'MSTORE8',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x58:'PC',0x59:'MSIZE',0x5a:'GAS',0x5b:'JUMPDEST',0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'}
for 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}'
instrs={}
pc=0x315
while pc<0x46a:
op=bytecode[pc]; name=ops.get(op,hex(op)); arg=None
if name.startswith('PUSH'):
n=int(name[4:]); arg=int.from_bytes(bytecode[pc+1:pc+1+n],'big'); npc=pc+1+n
else:
npc=pc+1
instrs[pc]=(name,arg,npc)
pc=npc
def binop(stack,op):
b=stack.pop(); a=stack.pop(); stack.append(f'({a} {op} {b})')
stack=['ret_04c2']
mem={64:'0x60'}
pc=0x315
steps=0
while pc<0x46a and steps<2000:
steps+=1
name,arg,npc=instrs[pc]
if name=='JUMPDEST': pass
elif name.startswith('PUSH'): stack.append(hex(arg))
elif name.startswith('DUP'): stack.append(stack[-int(name[3:])])
elif name.startswith('SWAP'):
n=int(name[4:]); stack[-1],stack[-1-n]=stack[-1-n],stack[-1]
elif name=='POP': stack.pop()
elif name=='MLOAD':
a=stack.pop(); stack.append(mem.get(a,f'mem[{a}]'))
elif name=='MSTORE':
a=stack.pop(); v=stack.pop(); mem[a]=v
elif name=='CALLDATALOAD':
a=stack.pop(); stack.append(f'cd[{a}]')
elif name=='CALLDATACOPY':
dst=stack.pop(); src=stack.pop(); ln=stack.pop(); mem[dst]=f'calldata[{src}:{src}+{ln}]'
elif name in ('ADD','SUB','MUL','DIV','EXP','AND','OR','LT','GT','EQ'):
opmap={'ADD':'+','SUB':'-','MUL':'*','DIV':'/','EXP':'**','AND':'&','OR':'|','LT':'<','GT':'>','EQ':'=='}
binop(stack,opmap[name])
elif name=='NOT':
a=stack.pop(); stack.append(f'~{a}')
elif name=='ISZERO':
a=stack.pop(); stack.append(f'iszero({a})')
elif name=='SHA3':
off=stack.pop(); ln=stack.pop(); stack.append(f'keccak(mem[{off}:{off}+{ln}])')
elif name=='SSTORE':
slot=stack.pop(); val=stack.pop(); print(f'SSTORE at {pc:#x}: slot={slot} val={val}')
elif name=='SLOAD':
slot=stack.pop(); stack.append(f'storage[{slot}]')
elif name=='CALLER': stack.append('CALLER')
elif name=='ADDRESS': stack.append('ADDRESS')
elif name=='GAS': stack.append('GAS')
elif name=='CALL':
outsz=stack.pop(); outoff=stack.pop(); insz=stack.pop(); inoff=stack.pop(); value=stack.pop(); to=stack.pop(); gas=stack.pop();
print(f'CALL at {pc:#x}:')
print(' gas ',gas)
print(' to ',to)
print(' value',value)
print(' in ',inoff,'size',insz)
print(' out ',outoff,'size',outsz)
stack.append(f'callret[{pc:#x}]')
elif name=='JUMPI':
dest=stack.pop(); cond=stack.pop(); print(f'JUMPI at {pc:#x}: dest={dest} cond={cond}')
pc=npc; continue
elif name=='JUMP':
dest=stack.pop(); print('JUMP at',hex(pc),'to',dest); break
else:
print('unhandled',hex(pc),name); break
pc=npc
print('tail',stack[-20:])
PY" in /tmp/codex-ewkgz7je
succeeded in 0ms:
SSTORE at 0x3a8: slot=keccak(mem[0x0:0x0+((0x0 + 0x20) + 0x20)]) val=cd[0x24]
CALL at 0x425:
gas cd[(cd[0x44] + 0x4)]
to ((((((((((0x20 / (0x1f + cd[(cd[0x44] + 0x4)])) * 0x20) + mem[0x40]) + 0x20) + 0x4) + 0x20) + 0x20) + 0x20) + 0x20) + 0x20)
value cd[(cd[0x44] + 0x4)]
in (mem[0x40] + 0x20) size 0x0
out 0x4 size (((0x20 / (cd[(cd[0x44] + 0x4)] + 0x1f)) * 0xf) + 0x3)
JUMPI at 0x435: dest=0x44f cond=iszero((cd[(cd[0x44] + 0x4)] & 0x1f))
CALL at 0x469:
gas 0x0
to ((((0x20 / (0x1f + cd[(cd[0x44] + 0x4)])) * 0x20) + mem[0x40]) + 0x20)
value (((((0x20 / (0x1f + cd[(cd[0x44] + 0x4)])) * 0x20) + mem[0x40]) + 0x20) - (((cd[(cd[0x44] + 0x4)] & 0x1f) - (((((((((((0x20 / (0x1f + cd[(cd[0x44] + 0x4)])) * 0x20) + mem[0x40]) + 0x20) + 0x4) + 0x20) + 0x20) + 0x20) + 0x20) + 0x20) + cd[(cd[0x44] + 0x4)])) + 0x20))
in ((((0x20 / (0x1f + cd[(cd[0x44] + 0x4)])) * 0x20) + mem[0x40]) + 0x20) size 0x0
out (cd[0x4] & (0x1 - (0xa0 ** 0x2))) size (0x61da - GAS)
tail ['ret_04c2', '0x532', 'cd[0x4]', 'cd[0x24]', 'mem[0x40]', '0x0', 'cd[0x4]', '(cd[0x4] & (0x1 - (0xa0 ** 0x2)))', '0x8f4ffcb1', '(((cd[(cd[0x44] + 0x4)] & 0x1f) - (((((((((((0x20 / (0x1f + cd[(cd[0x44] + 0x4)])) * 0x20) + mem[0x40]) + 0x20) + 0x4) + 0x20) + 0x20) + 0x20) + 0x20) + 0x20) + cd[(cd[0x44] + 0x4)])) + 0x20)', 'callret[0x469]']
exec
/bin/bash -lc "python3 - <<'PY'
import json
bytecode=bytes.fromhex(json.load(open('BYTECODE_BUNDLE.json'))['artifact']['runtime_bytecode']['full'][2:])
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',0x20:'SHA3',0x30:'ADDRESS',0x31:'BALANCE',0x32:'ORIGIN',0x33:'CALLER',0x34:'CALLVALUE',0x35:'CALLDATALOAD',0x36:'CALLDATASIZE',0x37:'CALLDATACOPY',0x38:'CODESIZE',0x39:'CODECOPY',0x3a:'GASPRICE',0x3b:'EXTCODESIZE',0x3c:'EXTCODECOPY',0x3d:'RETURNDATASIZE',0x3e:'RETURNDATACOPY',0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x53:'MSTORE8',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x58:'PC',0x59:'MSIZE',0x5a:'GAS',0x5b:'JUMPDEST',0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'}
for 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}'
instrs={}
pc=0x315
while pc<0x46a:
op=bytecode[pc]; name=ops.get(op,hex(op)); arg=None
if name.startswith('PUSH'):
n=int(name[4:]); arg=int.from_bytes(bytecode[pc+1:pc+1+n],'big'); npc=pc+1+n
else:
npc=pc+1
instrs[pc]=(name,arg,npc)
pc=npc
def binop(stack,op):
b=stack.pop(); a=stack.pop(); stack.append(f'({a} {op} {b})')
stack=['ret_04c2']
mem={ '0x40':'0x60' }
pc=0x315
while pc<0x46a:
name,arg,npc=instrs[pc]
if name=='JUMPDEST': pass
elif name.startswith('PUSH'): stack.append(hex(arg))
elif name.startswith('DUP'): stack.append(stack[-int(name[3:])])
elif name.startswith('SWAP'):
n=int(name[4:]); stack[-1],stack[-1-n]=stack[-1-n],stack[-1]
elif name=='POP': stack.pop()
elif name=='MLOAD': a=stack.pop(); stack.append(mem.get(a,f'mem[{a}]'))
elif name=='MSTORE': a=stack.pop(); v=stack.pop(); mem[a]=v
elif name=='CALLDATALOAD': a=stack.pop(); stack.append(f'cd[{a}]')
elif name=='CALLDATACOPY': ln=stack.pop(); src=stack.pop(); dst=stack.pop(); mem[dst]=f'calldata[{src}:{src}+{ln}]'
elif name in ('ADD','SUB','MUL','DIV','EXP','AND','OR','LT','GT','EQ'):
opmap={'ADD':'+','SUB':'-','MUL':'*','DIV':'/','EXP':'**','AND':'&','OR':'|','LT':'<','GT':'>','EQ':'=='}; binop(stack,opmap[name])
elif name=='NOT': a=stack.pop(); stack.append(f'~{a}')
elif name=='ISZERO': a=stack.pop(); stack.append(f'iszero({a})')
elif name=='SHA3': ln=stack.pop(); off=stack.pop(); stack.append(f'keccak(mem[{off}:{off}+{ln}])')
elif name=='SSTORE': val=stack.pop(); slot=stack.pop(); print(f'SSTORE {pc:#x}: slot={slot} val={val}')
elif name=='SLOAD': slot=stack.pop(); stack.append(f'storage[{slot}]')
elif name=='CALLER': stack.append('CALLER')
elif name=='ADDRESS': stack.append('ADDRESS')
elif name=='GAS': stack.append('GAS')
elif name=='CALL':
gas=stack.pop(); to=stack.pop(); value=stack.pop(); inoff=stack.pop(); insz=stack.pop(); outoff=stack.pop(); outsz=stack.pop();
print(f'CALL {pc:#x}: gas={gas} to={to} value={value} inoff={inoff} insz={insz} outoff={outoff} outsz={outsz}')
stack.append(f'callret[{pc:#x}]')
elif name=='JUMPI':
dest=stack.pop(); cond=stack.pop(); print(f'JUMPI {pc:#x}: dest={dest} cond={cond}')
pc=npc; continue
elif name=='JUMP':
dest=stack.pop(); print('JUMP',hex(pc),'to',dest); break
else:
print('unhandled',hex(pc),name); break
pc=npc
print('stack tail',stack[-20:])
PY" in /tmp/codex-ewkgz7je
succeeded in 0ms:
SSTORE 0x3a8: slot=cd[0x24] val=keccak(mem[((0x0 + 0x20) + 0x20):((0x0 + 0x20) + 0x20)+0x0])
CALL 0x425: gas=(((0x20 / (cd[(cd[0x44] + 0x4)] + 0x1f)) * 0xf) + 0x3) to=0x4 value=0x0 inoff=(0x60 + 0x20) insz=cd[(cd[0x44] + 0x4)] outoff=((((((((((0x20 / (0x1f + cd[(cd[0x44] + 0x4)])) * 0x20) + 0x60) + 0x20) + 0x4) + 0x20) + 0x20) + 0x20) + 0x20) + 0x20) outsz=cd[(cd[0x44] + 0x4)]
JUMPI 0x435: dest=0x44f cond=iszero((cd[(cd[0x44] + 0x4)] & 0x1f))
CALL 0x469: gas=(0x61da - GAS) to=(cd[0x4] & (0x1 - (0xa0 ** 0x2))) value=0x0 inoff=((((0x20 / (0x1f + cd[(cd[0x44] + 0x4)])) * 0x20) + 0x60) + 0x20) insz=(((((0x20 / (0x1f + cd[(cd[0x44] + 0x4)])) * 0x20) + 0x60) + 0x20) - (((cd[(cd[0x44] + 0x4)] & 0x1f) - (((((((((((0x20 / (0x1f + cd[(cd[0x44] + 0x4)])) * 0x20) + 0x60) + 0x20) + 0x4) + 0x20) + 0x20) + 0x20) + 0x20) + 0x20) + cd[(cd[0x44] + 0x4)])) + 0x20)) outoff=((((0x20 / (0x1f + cd[(cd[0x44] + 0x4)])) * 0x20) + 0x60) + 0x20) outsz=0x0
stack tail ['ret_04c2', '0x532', 'cd[0x4]', 'cd[0x24]', '0x60', '0x0', 'cd[0x4]', '(cd[0x4] & (0x1 - (0xa0 ** 0x2)))', '0x8f4ffcb1', '(((cd[(cd[0x44] + 0x4)] & 0x1f) - (((((((((((0x20 / (0x1f + cd[(cd[0x44] + 0x4)])) * 0x20) + 0x60) + 0x20) + 0x4) + 0x20) + 0x20) + 0x20) + 0x20) + 0x20) + cd[(cd[0x44] + 0x4)])) + 0x20)', 'callret[0x469]']
codex
{"no_findings":false,"summary":"Bytecode strongly resembles an old ERC-20 variant with one critical issue: a publicly callable constructor-like function can reset metadata and assign a fresh token balance to any caller. There is also a medium-confidence allowance/accounting deviation where `allowance()` appears to report the original approval while `transferFrom` tracks spent amount in a second mapping, so remaining spendable allowance is not what the standard getter returns.","findings":[{"severity":"critical","category":"access_control","title":"Public constructor-like function lets any caller mint/reset token state","exploit_scenario":"An attacker calls selector `0x1d2bca17` directly. The routine writes `0x0bde31` into the caller-derived slot under mapping slot `0x03`, then overwrites the metadata slots used by the token (`slot 0`, `slot 1`, and low byte of `slot 2`). Because no guard is detected, any account can invoke it to grant itself a fresh balance and repeat after spending, effectively breaking token supply integrity.","recommendation":"Remove or permanently disable this initializer path. If this was meant to be a constructor, replace it with an actual constructor/one-time initializer guard and prevent any post-deployment entry. If already deployed, treat the token as compromised unless this selector is provably unreachable through a proxy/admin wrapper.","evidence":"Dispatcher routes `0x1d2bca17` to `pc 0x00e8`. Within that path, the code computes a `CALLER`-keyed hash for slot `0x03` and stores constant `0x0bde31` (`pc 0x0177`-`0x018f`). It then stores hardcoded metadata into storage: name-like data in `slot 0` (`pc 0x0198`-`0x01d4`), symbol-like data in helper `pc 0x058e`-`0x05dc`, and sets the low byte of `slot 2` to `0x07` in `pc 0x0627`-`0x0636`. The artifact reports `auth.guards: []`, so there is no detected access control on this path. Selector inference from bytecode is best-effort, but this routine has clear constructor/initializer behavior.","locations":["selector:0x1d2bca17","pc:0x00e8","pc:0x018f","pc:0x01d4","pc:0x05dc","pc:0x0636"]},{"severity":"medium","category":"other","title":"Allowance accounting appears non-standard and can desynchronize from `allowance()`","exploit_scenario":"A spender uses `transferFrom` until the separate consumed-allowance mapping reaches the approved amount. If the owner later approves the same nominal amount again, `allowance(owner,spender)` can still report that amount, but `transferFrom` may fail because the contract adds a second stored value before checking the limit. Integrations that rely on standard ERC-20 `allowance()` semantics can mis-handle approvals or become stuck.","recommendation":"Use a single remaining-allowance source of truth, or reset the consumed-allowance mapping whenever a new approval is set. If this split-accounting design is intentional, expose an explicit remaining-allowance getter and avoid presenting `0xdd62ed3e` as standard ERC-20 allowance semantics.","evidence":"`0xdd62ed3e` reads a nested mapping rooted at slot `0x04` (`pc 0x049e`-`0x04bb`). `0xdc3080f2` reads a separate nested mapping rooted at slot `0x05` (`pc 0x0479`-`0x0497`). In `transferFrom` (`selector 0x23b872dd`), the code loads one mapping value around `pc 0x071d`-`0x0720`, then loads the second around `pc 0x0723`-`0x0735`, adds them, and compares the sum against the requested amount at `pc 0x0736`-`0x0739`; later it updates the slot-`0x05` mapping at `pc 0x077c`-`0x0793` instead of decrementing the slot-`0x04` value. This is a bytecode-level inference, so the exact intended names are uncertain, but the storage behavior is inconsistent with standard ERC-20 remaining-allowance accounting.","locations":["selector:0x23b872dd","selector:0xdd62ed3e","selector:0xdc3080f2","pc:0x049e","pc:0x0479","pc:0x0734","pc:0x0793"]}]}
tokens used
143,849
{
"codex": {
"ran_at": "2026-04-05T03:44:32.057588+00:00",
"returncode": 0
},
"project": {
"mode": "bytecode",
"bytecode_length": 3998,
"bytecode_truncated": false,
"capability_graph_present": true,
"analysis_artifact_present": true
},
"summary": "Bytecode strongly resembles an old ERC-20 variant with one critical issue: a publicly callable constructor-like function can reset metadata and assign a fresh token balance to any caller. There is also a medium-confidence allowance/accounting deviation where `allowance()` appears to report the original approval while `transferFrom` tracks spent amount in a second mapping, so remaining spendable allowance is not what the standard getter returns.",
"raw_final": {
"summary": "Bytecode strongly resembles an old ERC-20 variant with one critical issue: a publicly callable constructor-like function can reset metadata and assign a fresh token balance to any caller. There is also a medium-confidence allowance/accounting deviation where `allowance()` appears to report the original approval while `transferFrom` tracks spent amount in a second mapping, so remaining spendable allowance is not what the standard getter returns.",
"findings": [
{
"title": "Public constructor-like function lets any caller mint/reset token state",
"category": "access_control",
"evidence": "Dispatcher routes `0x1d2bca17` to `pc 0x00e8`. Within that path, the code computes a `CALLER`-keyed hash for slot `0x03` and stores constant `0x0bde31` (`pc 0x0177`-`0x018f`). It then stores hardcoded metadata into storage: name-like data in `slot 0` (`pc 0x0198`-`0x01d4`), symbol-like data in helper `pc 0x058e`-`0x05dc`, and sets the low byte of `slot 2` to `0x07` in `pc 0x0627`-`0x0636`. The artifact reports `auth.guards: []`, so there is no detected access control on this path. Selector inference from bytecode is best-effort, but this routine has clear constructor/initializer behavior.",
"severity": "critical",
"locations": [
"selector:0x1d2bca17",
"pc:0x00e8",
"pc:0x018f",
"pc:0x01d4",
"pc:0x05dc",
"pc:0x0636"
],
"recommendation": "Remove or permanently disable this initializer path. If this was meant to be a constructor, replace it with an actual constructor/one-time initializer guard and prevent any post-deployment entry. If already deployed, treat the token as compromised unless this selector is provably unreachable through a proxy/admin wrapper.",
"exploit_scenario": "An attacker calls selector `0x1d2bca17` directly. The routine writes `0x0bde31` into the caller-derived slot under mapping slot `0x03`, then overwrites the metadata slots used by the token (`slot 0`, `slot 1`, and low byte of `slot 2`). Because no guard is detected, any account can invoke it to grant itself a fresh balance and repeat after spending, effectively breaking token supply integrity."
},
{
"title": "Allowance accounting appears non-standard and can desynchronize from `allowance()`",
"category": "other",
"evidence": "`0xdd62ed3e` reads a nested mapping rooted at slot `0x04` (`pc 0x049e`-`0x04bb`). `0xdc3080f2` reads a separate nested mapping rooted at slot `0x05` (`pc 0x0479`-`0x0497`). In `transferFrom` (`selector 0x23b872dd`), the code loads one mapping value around `pc 0x071d`-`0x0720`, then loads the second around `pc 0x0723`-`0x0735`, adds them, and compares the sum against the requested amount at `pc 0x0736`-`0x0739`; later it updates the slot-`0x05` mapping at `pc 0x077c`-`0x0793` instead of decrementing the slot-`0x04` value. This is a bytecode-level inference, so the exact intended names are uncertain, but the storage behavior is inconsistent with standard ERC-20 remaining-allowance accounting.",
"severity": "medium",
"locations": [
"selector:0x23b872dd",
"selector:0xdd62ed3e",
"selector:0xdc3080f2",
"pc:0x049e",
"pc:0x0479",
"pc:0x0734",
"pc:0x0793"
],
"recommendation": "Use a single remaining-allowance source of truth, or reset the consumed-allowance mapping whenever a new approval is set. If this split-accounting design is intentional, expose an explicit remaining-allowance getter and avoid presenting `0xdd62ed3e` as standard ERC-20 allowance semantics.",
"exploit_scenario": "A spender uses `transferFrom` until the separate consumed-allowance mapping reaches the approved amount. If the owner later approves the same nominal amount again, `allowance(owner,spender)` can still report that amount, but `transferFrom` may fail because the contract adds a second stored value before checking the limit. Integrations that rely on standard ERC-20 `allowance()` semantics can mis-handle approvals or become stuck."
}
],
"no_findings": false
},
"no_findings": false,
"schema_version": 1
}
00000000: PUSH1 0x60 00000002: PUSH1 0x40 00000004: MSTORE 00000005: CALLDATASIZE 00000006: ISZERO 00000007: PUSH2 0x0082 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 0x008a 0000001e: JUMPI 0000001f: DUP1 00000020: PUSH4 0x1d2bca17 00000025: EQ 00000026: PUSH2 0x00e8 00000029: JUMPI 0000002a: DUP1 0000002b: PUSH4 0x23b872dd 00000030: EQ 00000031: PUSH2 0x0233 00000034: JUMPI 00000035: DUP1 00000036: PUSH4 0x313ce567 0000003b: EQ 0000003c: PUSH2 0x0265 0000003f: JUMPI 00000040: DUP1 00000041: PUSH4 0x70a08231 00000046: EQ 00000047: PUSH2 0x0271 0000004a: JUMPI 0000004b: DUP1 0000004c: PUSH4 0x95d89b41 00000051: EQ 00000052: PUSH2 0x0289 00000055: JUMPI 00000056: DUP1 00000057: PUSH4 0xa9059cbb 0000005c: EQ 0000005d: PUSH2 0x02e6 00000060: JUMPI 00000061: DUP1 00000062: PUSH4 0xcae9ca51 00000067: EQ 00000068: PUSH2 0x0315 0000006b: JUMPI 0000006c: DUP1 0000006d: PUSH4 0xdc3080f2 00000072: EQ 00000073: PUSH2 0x0479 00000076: JUMPI 00000077: DUP1 00000078: PUSH4 0xdd62ed3e 0000007d: EQ 0000007e: PUSH2 0x049e 00000081: JUMPI 00000082: JUMPDEST 00000083: PUSH2 0x04c2 00000086: PUSH2 0x0002 00000089: JUMP 0000008a: JUMPDEST 0000008b: PUSH2 0x04c4 0000008e: PUSH1 0x00 00000090: DUP1 00000091: SLOAD 00000092: PUSH1 0x40 00000094: DUP1 00000095: MLOAD 00000096: PUSH1 0x20 00000098: PUSH1 0x02 0000009a: PUSH1 0x01 0000009c: DUP6 0000009d: AND 0000009e: ISZERO 0000009f: PUSH2 0x0100 000000a2: MUL 000000a3: PUSH1 0x00 000000a5: NOT 000000a6: ADD 000000a7: SWAP1 000000a8: SWAP5 000000a9: AND 000000aa: SWAP4 000000ab: SWAP1 000000ac: SWAP4 000000ad: DIV 000000ae: PUSH1 0x1f 000000b0: DUP2 000000b1: ADD 000000b2: DUP5 000000b3: SWAP1 000000b4: DIV 000000b5: DUP5 000000b6: MUL 000000b7: DUP3 000000b8: ADD 000000b9: DUP5 000000ba: ADD 000000bb: SWAP1 000000bc: SWAP3 000000bd: MSTORE 000000be: DUP2 000000bf: DUP2 000000c0: MSTORE 000000c1: SWAP3 000000c2: SWAP2 000000c3: DUP4 000000c4: ADD 000000c5: DUP3 000000c6: DUP3 000000c7: DUP1 000000c8: ISZERO 000000c9: PUSH2 0x0586 000000cc: JUMPI 000000cd: DUP1 000000ce: PUSH1 0x1f 000000d0: LT 000000d1: PUSH2 0x055b 000000d4: JUMPI 000000d5: PUSH2 0x0100 000000d8: DUP1 000000d9: DUP4 000000da: SLOAD 000000db: DIV 000000dc: MUL 000000dd: DUP4 000000de: MSTORE 000000df: SWAP2 000000e0: PUSH1 0x20 000000e2: ADD 000000e3: SWAP2 000000e4: PUSH2 0x0586 000000e7: JUMP 000000e8: JUMPDEST 000000e9: PUSH1 0x40 000000eb: DUP1 000000ec: MLOAD 000000ed: PUSH1 0x20 000000ef: PUSH1 0x24 000000f1: DUP1 000000f2: CALLDATALOAD 000000f3: PUSH1 0x04 000000f5: DUP2 000000f6: DUP2 000000f7: ADD 000000f8: CALLDATALOAD 000000f9: PUSH1 0x1f 000000fb: DUP2 000000fc: ADD 000000fd: DUP6 000000fe: SWAP1 000000ff: DIV 00000100: DUP6 00000101: MUL 00000102: DUP7 00000103: ADD 00000104: DUP6 00000105: ADD 00000106: SWAP1 00000107: SWAP7 00000108: MSTORE 00000109: DUP6 0000010a: DUP6 0000010b: MSTORE 0000010c: PUSH2 0x04c2 0000010f: SWAP6 00000110: DUP2 00000111: CALLDATALOAD 00000112: SWAP6 00000113: SWAP2 00000114: SWAP5 00000115: PUSH1 0x44 00000117: SWAP5 00000118: SWAP3 00000119: SWAP4 0000011a: SWAP1 0000011b: SWAP3 0000011c: ADD 0000011d: SWAP2 0000011e: DUP2 0000011f: SWAP1 00000120: DUP5 00000121: ADD 00000122: DUP4 00000123: DUP3 00000124: DUP1 00000125: DUP3 00000126: DUP5 00000127: CALLDATACOPY 00000128: POP 00000129: POP 0000012a: PUSH1 0x40 0000012c: DUP1 0000012d: MLOAD 0000012e: PUSH1 0x20 00000130: PUSH1 0x64 00000132: CALLDATALOAD 00000133: DUP1 00000134: DUP12 00000135: ADD 00000136: CALLDATALOAD 00000137: PUSH1 0x1f 00000139: DUP2 0000013a: ADD 0000013b: DUP4 0000013c: SWAP1 0000013d: DIV 0000013e: DUP4 0000013f: MUL 00000140: DUP5 00000141: ADD 00000142: DUP4 00000143: ADD 00000144: SWAP1 00000145: SWAP5 00000146: MSTORE 00000147: DUP4 00000148: DUP4 00000149: MSTORE 0000014a: SWAP8 0000014b: SWAP10 0000014c: SWAP9 0000014d: CALLDATALOAD 0000014e: SWAP9 0000014f: SWAP8 00000150: PUSH1 0x84 00000152: SWAP8 00000153: POP 00000154: SWAP2 00000155: SWAP6 00000156: POP 00000157: PUSH1 0x24 00000159: SWAP2 0000015a: SWAP1 0000015b: SWAP2 0000015c: ADD 0000015d: SWAP4 0000015e: POP 0000015f: SWAP1 00000160: SWAP2 00000161: POP 00000162: DUP2 00000163: SWAP1 00000164: DUP5 00000165: ADD 00000166: DUP4 00000167: DUP3 00000168: DUP1 00000169: DUP3 0000016a: DUP5 0000016b: CALLDATACOPY 0000016c: POP 0000016d: POP 0000016e: POP 0000016f: PUSH1 0x01 00000171: PUSH1 0xa0 00000173: PUSH1 0x02 00000175: EXP 00000176: SUB 00000177: CALLER 00000178: AND 00000179: PUSH1 0x00 0000017b: SWAP1 0000017c: DUP2 0000017d: MSTORE 0000017e: PUSH1 0x03 00000180: PUSH1 0x20 00000182: SWAP1 00000183: DUP2 00000184: MSTORE 00000185: PUSH1 0x40 00000187: DUP1 00000188: DUP4 00000189: KECCAK256 0000018a: PUSH3 0x0bde31 0000018e: SWAP1 0000018f: SSTORE 00000190: DUP1 00000191: MLOAD 00000192: DUP1 00000193: DUP3 00000194: ADD 00000195: SWAP1 00000196: SWAP2 00000197: MSTORE 00000198: PUSH1 0x07 0000019a: DUP2 0000019b: MSTORE 0000019c: PUSH32 0x55636b436f696e00000000000000000000000000000000000000000000000000 000001bd: SWAP1 000001be: DUP3 000001bf: ADD 000001c0: SWAP1 000001c1: DUP2 000001c2: MSTORE 000001c3: DUP3 000001c4: SLOAD 000001c5: DUP4 000001c6: DUP1 000001c7: MSTORE 000001c8: SWAP1 000001c9: MLOAD 000001ca: PUSH1 0x0e 000001cc: PUSH1 0xff 000001ce: NOT 000001cf: SWAP1 000001d0: SWAP2 000001d1: AND 000001d2: OR 000001d3: DUP4 000001d4: SSTORE 000001d5: SWAP6 000001d6: SWAP8 000001d7: POP 000001d8: SWAP1 000001d9: SWAP6 000001da: POP 000001db: PUSH2 0x058e 000001de: SWAP5 000001df: PUSH1 0x02 000001e1: PUSH1 0x01 000001e3: DUP3 000001e4: AND 000001e5: ISZERO 000001e6: PUSH2 0x0100 000001e9: MUL 000001ea: PUSH1 0x00 000001ec: NOT 000001ed: ADD 000001ee: SWAP1 000001ef: SWAP2 000001f0: AND 000001f1: DIV 000001f2: PUSH1 0x1f 000001f4: ADD 000001f5: DIV 000001f6: PUSH32 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563 00000217: SWAP1 00000218: DUP2 00000219: ADD 0000021a: SWAP4 0000021b: POP 0000021c: SWAP2 0000021d: POP 0000021e: POP 0000021f: JUMPDEST 00000220: DUP1 00000221: DUP3 00000222: GT 00000223: ISZERO 00000224: PUSH2 0x0623 00000227: JUMPI 00000228: PUSH1 0x00 0000022a: DUP2 0000022b: SSTORE 0000022c: PUSH1 0x01 0000022e: ADD 0000022f: PUSH2 0x021f 00000232: JUMP 00000233: JUMPDEST 00000234: PUSH2 0x0532 00000237: PUSH1 0x04 00000239: CALLDATALOAD 0000023a: PUSH1 0x24 0000023c: CALLDATALOAD 0000023d: PUSH1 0x44 0000023f: CALLDATALOAD 00000240: PUSH1 0x01 00000242: PUSH1 0xa0 00000244: PUSH1 0x02 00000246: EXP 00000247: SUB 00000248: DUP4 00000249: AND 0000024a: PUSH1 0x00 0000024c: SWAP1 0000024d: DUP2 0000024e: MSTORE 0000024f: PUSH1 0x03 00000251: PUSH1 0x20 00000253: MSTORE 00000254: PUSH1 0x40 00000256: DUP2 00000257: KECCAK256 00000258: SLOAD 00000259: DUP3 0000025a: SWAP1 0000025b: LT 0000025c: ISZERO 0000025d: PUSH2 0x06ce 00000260: JUMPI 00000261: PUSH2 0x0002 00000264: JUMP 00000265: JUMPDEST 00000266: PUSH2 0x0544 00000269: PUSH1 0x02 0000026b: SLOAD 0000026c: PUSH1 0xff 0000026e: AND 0000026f: DUP2 00000270: JUMP 00000271: JUMPDEST 00000272: PUSH2 0x0532 00000275: PUSH1 0x04 00000277: CALLDATALOAD 00000278: PUSH1 0x03 0000027a: PUSH1 0x20 0000027c: MSTORE 0000027d: PUSH1 0x00 0000027f: SWAP1 00000280: DUP2 00000281: MSTORE 00000282: PUSH1 0x40 00000284: SWAP1 00000285: KECCAK256 00000286: SLOAD 00000287: DUP2 00000288: JUMP 00000289: JUMPDEST 0000028a: PUSH2 0x04c4 0000028d: PUSH1 0x01 0000028f: DUP1 00000290: SLOAD 00000291: PUSH1 0x40 00000293: DUP1 00000294: MLOAD 00000295: PUSH1 0x20 00000297: PUSH1 0x02 00000299: DUP5 0000029a: DUP7 0000029b: AND 0000029c: ISZERO 0000029d: PUSH2 0x0100 000002a0: MUL 000002a1: PUSH1 0x00 000002a3: NOT 000002a4: ADD 000002a5: SWAP1 000002a6: SWAP5 000002a7: AND 000002a8: SWAP4 000002a9: SWAP1 000002aa: SWAP4 000002ab: DIV 000002ac: PUSH1 0x1f 000002ae: DUP2 000002af: ADD 000002b0: DUP5 000002b1: SWAP1 000002b2: DIV 000002b3: DUP5 000002b4: MUL 000002b5: DUP3 000002b6: ADD 000002b7: DUP5 000002b8: ADD 000002b9: SWAP1 000002ba: SWAP3 000002bb: MSTORE 000002bc: DUP2 000002bd: DUP2 000002be: MSTORE 000002bf: SWAP3 000002c0: SWAP2 000002c1: DUP4 000002c2: ADD 000002c3: DUP3 000002c4: DUP3 000002c5: DUP1 000002c6: ISZERO 000002c7: PUSH2 0x0586 000002ca: JUMPI 000002cb: DUP1 000002cc: PUSH1 0x1f 000002ce: LT 000002cf: PUSH2 0x055b 000002d2: JUMPI 000002d3: PUSH2 0x0100 000002d6: DUP1 000002d7: DUP4 000002d8: SLOAD 000002d9: DIV 000002da: MUL 000002db: DUP4 000002dc: MSTORE 000002dd: SWAP2 000002de: PUSH1 0x20 000002e0: ADD 000002e1: SWAP2 000002e2: PUSH2 0x0586 000002e5: JUMP 000002e6: JUMPDEST 000002e7: PUSH2 0x04c2 000002ea: PUSH1 0x04 000002ec: CALLDATALOAD 000002ed: PUSH1 0x24 000002ef: CALLDATALOAD 000002f0: PUSH1 0x01 000002f2: PUSH1 0xa0 000002f4: PUSH1 0x02 000002f6: EXP 000002f7: SUB 000002f8: CALLER 000002f9: AND 000002fa: PUSH1 0x00 000002fc: SWAP1 000002fd: DUP2 000002fe: MSTORE 000002ff: PUSH1 0x03 00000301: PUSH1 0x20 00000303: MSTORE 00000304: PUSH1 0x40 00000306: SWAP1 00000307: KECCAK256 00000308: SLOAD 00000309: DUP2 0000030a: SWAP1 0000030b: LT 0000030c: ISZERO 0000030d: PUSH2 0x063c 00000310: JUMPI 00000311: PUSH2 0x0002 00000314: JUMP 00000315: JUMPDEST 00000316: PUSH1 0x40 00000318: DUP1 00000319: MLOAD 0000031a: PUSH1 0x20 0000031c: PUSH1 0x44 0000031e: CALLDATALOAD 0000031f: PUSH1 0x04 00000321: DUP2 00000322: DUP2 00000323: ADD 00000324: CALLDATALOAD 00000325: PUSH1 0x1f 00000327: DUP2 00000328: ADD 00000329: DUP5 0000032a: SWAP1 0000032b: DIV 0000032c: DUP5 0000032d: MUL 0000032e: DUP6 0000032f: ADD 00000330: DUP5 00000331: ADD 00000332: SWAP1 00000333: SWAP6 00000334: MSTORE 00000335: DUP5 00000336: DUP5 00000337: MSTORE 00000338: PUSH2 0x0532 0000033b: SWAP5 0000033c: DUP2 0000033d: CALLDATALOAD 0000033e: SWAP5 0000033f: PUSH1 0x24 00000341: DUP1 00000342: CALLDATALOAD 00000343: SWAP6 00000344: SWAP4 00000345: SWAP5 00000346: PUSH1 0x64 00000348: SWAP5 00000349: SWAP3 0000034a: SWAP4 0000034b: SWAP2 0000034c: ADD 0000034d: SWAP2 0000034e: DUP2 0000034f: SWAP1 00000350: DUP5 00000351: ADD 00000352: DUP4 00000353: DUP3 00000354: DUP1 00000355: DUP3 00000356: DUP5 00000357: CALLDATACOPY 00000358: POP 00000359: SWAP5 0000035a: SWAP7 0000035b: POP 0000035c: POP 0000035d: POP 0000035e: POP 0000035f: POP 00000360: POP 00000361: POP 00000362: PUSH1 0x00 00000364: PUSH1 0x00 00000366: DUP4 00000367: PUSH1 0x04 00000369: PUSH1 0x00 0000036b: POP 0000036c: PUSH1 0x00 0000036e: CALLER 0000036f: PUSH1 0x01 00000371: PUSH1 0xa0 00000373: PUSH1 0x02 00000375: EXP 00000376: SUB 00000377: AND 00000378: DUP2 00000379: MSTORE 0000037a: PUSH1 0x20 0000037c: ADD 0000037d: SWAP1 0000037e: DUP2 0000037f: MSTORE 00000380: PUSH1 0x20 00000382: ADD 00000383: PUSH1 0x00 00000385: KECCAK256 00000386: PUSH1 0x00 00000388: POP 00000389: PUSH1 0x00 0000038b: DUP8 0000038c: PUSH1 0x01 0000038e: PUSH1 0xa0 00000390: PUSH1 0x02 00000392: EXP 00000393: SUB 00000394: AND 00000395: DUP2 00000396: MSTORE 00000397: PUSH1 0x20 00000399: ADD 0000039a: SWAP1 0000039b: DUP2 0000039c: MSTORE 0000039d: PUSH1 0x20 0000039f: ADD 000003a0: PUSH1 0x00 000003a2: KECCAK256 000003a3: PUSH1 0x00 000003a5: POP 000003a6: DUP2 000003a7: SWAP1 000003a8: SSTORE 000003a9: POP 000003aa: DUP5 000003ab: SWAP1 000003ac: POP 000003ad: DUP1 000003ae: PUSH1 0x01 000003b0: PUSH1 0xa0 000003b2: PUSH1 0x02 000003b4: EXP 000003b5: SUB 000003b6: AND 000003b7: PUSH4 0x8f4ffcb1 000003bc: CALLER 000003bd: DUP7 000003be: ADDRESS 000003bf: DUP8 000003c0: PUSH1 0x40 000003c2: MLOAD 000003c3: DUP6 000003c4: PUSH1 0xe0 000003c6: PUSH1 0x02 000003c8: EXP 000003c9: MUL 000003ca: DUP2 000003cb: MSTORE 000003cc: PUSH1 0x04 000003ce: ADD 000003cf: DUP1 000003d0: DUP6 000003d1: PUSH1 0x01 000003d3: PUSH1 0xa0 000003d5: PUSH1 0x02 000003d7: EXP 000003d8: SUB 000003d9: AND 000003da: DUP2 000003db: MSTORE 000003dc: PUSH1 0x20 000003de: ADD 000003df: DUP5 000003e0: DUP2 000003e1: MSTORE 000003e2: PUSH1 0x20 000003e4: ADD 000003e5: DUP4 000003e6: PUSH1 0x01 000003e8: PUSH1 0xa0 000003ea: PUSH1 0x02 000003ec: EXP 000003ed: SUB 000003ee: AND 000003ef: DUP2 000003f0: MSTORE 000003f1: PUSH1 0x20 000003f3: ADD 000003f4: DUP1 000003f5: PUSH1 0x20 000003f7: ADD 000003f8: DUP3 000003f9: DUP2 000003fa: SUB 000003fb: DUP3 000003fc: MSTORE 000003fd: DUP4 000003fe: DUP2 000003ff: DUP2 00000400: MLOAD 00000401: DUP2 00000402: MSTORE 00000403: PUSH1 0x20 00000405: ADD 00000406: SWAP2 00000407: POP 00000408: DUP1 00000409: MLOAD 0000040a: SWAP1 0000040b: PUSH1 0x20 0000040d: ADD 0000040e: SWAP1 0000040f: DUP1 00000410: DUP4 00000411: DUP4 00000412: DUP3 00000413: SWAP1 00000414: PUSH1 0x00 00000416: PUSH1 0x04 00000418: PUSH1 0x20 0000041a: DUP5 0000041b: PUSH1 0x1f 0000041d: ADD 0000041e: DIV 0000041f: PUSH1 0x0f 00000421: MUL 00000422: PUSH1 0x03 00000424: ADD 00000425: CALL 00000426: POP 00000427: SWAP1 00000428: POP 00000429: SWAP1 0000042a: DUP2 0000042b: ADD 0000042c: SWAP1 0000042d: PUSH1 0x1f 0000042f: AND 00000430: DUP1 00000431: ISZERO 00000432: PUSH2 0x044f 00000435: JUMPI 00000436: DUP1 00000437: DUP3 00000438: SUB 00000439: DUP1 0000043a: MLOAD 0000043b: PUSH1 0x01 0000043d: DUP4 0000043e: PUSH1 0x20 00000440: SUB 00000441: PUSH2 0x0100 00000444: EXP 00000445: SUB 00000446: NOT 00000447: AND 00000448: DUP2 00000449: MSTORE 0000044a: PUSH1 0x20 0000044c: ADD 0000044d: SWAP2 0000044e: POP 0000044f: JUMPDEST 00000450: POP 00000451: SWAP6 00000452: POP 00000453: POP 00000454: POP 00000455: POP 00000456: POP 00000457: POP 00000458: PUSH1 0x00 0000045a: PUSH1 0x40 0000045c: MLOAD 0000045d: DUP1 0000045e: DUP4 0000045f: SUB 00000460: DUP2 00000461: PUSH1 0x00 00000463: DUP8 00000464: PUSH2 0x61da 00000467: GAS 00000468: SUB 00000469: CALL 0000046a: ISZERO 0000046b: PUSH2 0x0002 0000046e: JUMPI 0000046f: POP 00000470: POP 00000471: POP 00000472: POP 00000473: SWAP4 00000474: SWAP3 00000475: POP 00000476: POP 00000477: POP 00000478: JUMP 00000479: JUMPDEST 0000047a: PUSH1 0x05 0000047c: PUSH1 0x20 0000047e: SWAP1 0000047f: DUP2 00000480: MSTORE 00000481: PUSH1 0x04 00000483: CALLDATALOAD 00000484: PUSH1 0x00 00000486: SWAP1 00000487: DUP2 00000488: MSTORE 00000489: PUSH1 0x40 0000048b: DUP1 0000048c: DUP3 0000048d: KECCAK256 0000048e: SWAP1 0000048f: SWAP3 00000490: MSTORE 00000491: PUSH1 0x24 00000493: CALLDATALOAD 00000494: DUP2 00000495: MSTORE 00000496: KECCAK256 00000497: SLOAD 00000498: PUSH2 0x0532 0000049b: SWAP1 0000049c: DUP2 0000049d: JUMP 0000049e: JUMPDEST 0000049f: PUSH1 0x04 000004a1: PUSH1 0x20 000004a3: DUP2 000004a4: DUP2 000004a5: MSTORE 000004a6: SWAP1 000004a7: CALLDATALOAD 000004a8: PUSH1 0x00 000004aa: SWAP1 000004ab: DUP2 000004ac: MSTORE 000004ad: PUSH1 0x40 000004af: DUP1 000004b0: DUP3 000004b1: KECCAK256 000004b2: SWAP1 000004b3: SWAP3 000004b4: MSTORE 000004b5: PUSH1 0x24 000004b7: CALLDATALOAD 000004b8: DUP2 000004b9: MSTORE 000004ba: KECCAK256 000004bb: SLOAD 000004bc: PUSH2 0x0532 000004bf: SWAP1 000004c0: DUP2 000004c1: JUMP 000004c2: JUMPDEST 000004c3: STOP 000004c4: JUMPDEST 000004c5: PUSH1 0x40 000004c7: MLOAD 000004c8: DUP1 000004c9: DUP1 000004ca: PUSH1 0x20 000004cc: ADD 000004cd: DUP3 000004ce: DUP2 000004cf: SUB 000004d0: DUP3 000004d1: MSTORE 000004d2: DUP4 000004d3: DUP2 000004d4: DUP2 000004d5: MLOAD 000004d6: DUP2 000004d7: MSTORE 000004d8: PUSH1 0x20 000004da: ADD 000004db: SWAP2 000004dc: POP 000004dd: DUP1 000004de: MLOAD 000004df: SWAP1 000004e0: PUSH1 0x20 000004e2: ADD 000004e3: SWAP1 000004e4: DUP1 000004e5: DUP4 000004e6: DUP4 000004e7: DUP3 000004e8: SWAP1 000004e9: PUSH1 0x00 000004eb: PUSH1 0x04 000004ed: PUSH1 0x20 000004ef: DUP5 000004f0: PUSH1 0x1f 000004f2: ADD 000004f3: DIV 000004f4: PUSH1 0x0f 000004f6: MUL 000004f7: PUSH1 0x03 000004f9: ADD 000004fa: CALL 000004fb: POP 000004fc: SWAP1 000004fd: POP 000004fe: SWAP1 000004ff: DUP2 00000500: ADD 00000501: SWAP1 00000502: PUSH1 0x1f 00000504: AND 00000505: DUP1 00000506: ISZERO 00000507: PUSH2 0x0524 0000050a: JUMPI 0000050b: DUP1 0000050c: DUP3 0000050d: SUB 0000050e: DUP1 0000050f: MLOAD 00000510: PUSH1 0x01 00000512: DUP4 00000513: PUSH1 0x20 00000515: SUB 00000516: PUSH2 0x0100 00000519: EXP 0000051a: SUB 0000051b: NOT 0000051c: AND 0000051d: DUP2 0000051e: MSTORE 0000051f: PUSH1 0x20 00000521: ADD 00000522: SWAP2 00000523: POP 00000524: JUMPDEST 00000525: POP 00000526: SWAP3 00000527: POP 00000528: POP 00000529: POP 0000052a: PUSH1 0x40 0000052c: MLOAD 0000052d: DUP1 0000052e: SWAP2 0000052f: SUB 00000530: SWAP1 00000531: RETURN 00000532: JUMPDEST 00000533: PUSH1 0x40 00000535: DUP1 00000536: MLOAD 00000537: SWAP2 00000538: DUP3 00000539: MSTORE 0000053a: MLOAD 0000053b: SWAP1 0000053c: DUP2 0000053d: SWAP1 0000053e: SUB 0000053f: PUSH1 0x20 00000541: ADD 00000542: SWAP1 00000543: RETURN 00000544: JUMPDEST 00000545: PUSH1 0x40 00000547: DUP1 00000548: MLOAD 00000549: PUSH1 0xff 0000054b: SWAP3 0000054c: SWAP1 0000054d: SWAP3 0000054e: AND 0000054f: DUP3 00000550: MSTORE 00000551: MLOAD 00000552: SWAP1 00000553: DUP2 00000554: SWAP1 00000555: SUB 00000556: PUSH1 0x20 00000558: ADD 00000559: SWAP1 0000055a: RETURN 0000055b: JUMPDEST 0000055c: DUP3 0000055d: ADD 0000055e: SWAP2 0000055f: SWAP1 00000560: PUSH1 0x00 00000562: MSTORE 00000563: PUSH1 0x20 00000565: PUSH1 0x00 00000567: KECCAK256 00000568: SWAP1 00000569: JUMPDEST 0000056a: DUP2 0000056b: SLOAD 0000056c: DUP2 0000056d: MSTORE 0000056e: SWAP1 0000056f: PUSH1 0x01 00000571: ADD 00000572: SWAP1 00000573: PUSH1 0x20 00000575: ADD 00000576: DUP1 00000577: DUP4 00000578: GT 00000579: PUSH2 0x0569 0000057c: JUMPI 0000057d: DUP3 0000057e: SWAP1 0000057f: SUB 00000580: PUSH1 0x1f 00000582: AND 00000583: DUP3 00000584: ADD 00000585: SWAP2 00000586: JUMPDEST 00000587: POP 00000588: POP 00000589: POP 0000058a: POP 0000058b: POP 0000058c: DUP2 0000058d: JUMP 0000058e: JUMPDEST 0000058f: POP 00000590: POP 00000591: PUSH1 0x40 00000593: DUP1 00000594: MLOAD 00000595: DUP1 00000596: DUP3 00000597: ADD 00000598: SWAP1 00000599: SWAP2 0000059a: MSTORE 0000059b: PUSH1 0x01 0000059d: DUP1 0000059e: DUP3 0000059f: MSTORE 000005a0: PUSH32 0x5500000000000000000000000000000000000000000000000000000000000000 000005c1: PUSH1 0x20 000005c3: SWAP3 000005c4: DUP4 000005c5: ADD 000005c6: SWAP1 000005c7: DUP2 000005c8: MSTORE 000005c9: DUP2 000005ca: SLOAD 000005cb: PUSH1 0x00 000005cd: DUP4 000005ce: SWAP1 000005cf: MSTORE 000005d0: SWAP1 000005d1: MLOAD 000005d2: PUSH1 0xff 000005d4: NOT 000005d5: AND 000005d6: PUSH1 0x02 000005d8: SWAP1 000005d9: DUP2 000005da: OR 000005db: DUP4 000005dc: SSTORE 000005dd: SWAP2 000005de: SWAP3 000005df: PUSH2 0x0627 000005e2: SWAP3 000005e3: DUP3 000005e4: DUP6 000005e5: AND 000005e6: ISZERO 000005e7: PUSH2 0x0100 000005ea: MUL 000005eb: PUSH1 0x00 000005ed: NOT 000005ee: ADD 000005ef: SWAP1 000005f0: SWAP3 000005f1: AND 000005f2: SWAP2 000005f3: SWAP1 000005f4: SWAP2 000005f5: DIV 000005f6: PUSH1 0x1f 000005f8: ADD 000005f9: DIV 000005fa: PUSH32 0xb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6 0000061b: SWAP1 0000061c: DUP2 0000061d: ADD 0000061e: SWAP1 0000061f: PUSH2 0x021f 00000622: JUMP 00000623: JUMPDEST 00000624: POP 00000625: SWAP1 00000626: JUMP 00000627: JUMPDEST 00000628: POP 00000629: POP 0000062a: PUSH1 0x02 0000062c: DUP1 0000062d: SLOAD 0000062e: PUSH1 0xff 00000630: NOT 00000631: AND 00000632: PUSH1 0x07 00000634: OR 00000635: SWAP1 00000636: SSTORE 00000637: POP 00000638: POP 00000639: POP 0000063a: POP 0000063b: JUMP 0000063c: JUMPDEST 0000063d: PUSH1 0x01 0000063f: PUSH1 0xa0 00000641: PUSH1 0x02 00000643: EXP 00000644: SUB 00000645: DUP3 00000646: AND 00000647: PUSH1 0x00 00000649: SWAP1 0000064a: DUP2 0000064b: MSTORE 0000064c: PUSH1 0x03 0000064e: PUSH1 0x20 00000650: MSTORE 00000651: PUSH1 0x40 00000653: SWAP1 00000654: KECCAK256 00000655: SLOAD 00000656: DUP2 00000657: DUP2 00000658: ADD 00000659: LT 0000065a: ISZERO 0000065b: PUSH2 0x0663 0000065e: JUMPI 0000065f: PUSH2 0x0002 00000662: JUMP 00000663: JUMPDEST 00000664: PUSH1 0x01 00000666: PUSH1 0xa0 00000668: PUSH1 0x02 0000066a: EXP 0000066b: SUB 0000066c: CALLER 0000066d: DUP2 0000066e: AND 0000066f: PUSH1 0x00 00000671: DUP2 00000672: DUP2 00000673: MSTORE 00000674: PUSH1 0x03 00000676: PUSH1 0x20 00000678: SWAP1 00000679: DUP2 0000067a: MSTORE 0000067b: PUSH1 0x40 0000067d: DUP1 0000067e: DUP4 0000067f: KECCAK256 00000680: DUP1 00000681: SLOAD 00000682: DUP8 00000683: SWAP1 00000684: SUB 00000685: SWAP1 00000686: SSTORE 00000687: SWAP4 00000688: DUP7 00000689: AND 0000068a: DUP1 0000068b: DUP4 0000068c: MSTORE 0000068d: SWAP2 0000068e: DUP5 0000068f: SWAP1 00000690: KECCAK256 00000691: DUP1 00000692: SLOAD 00000693: DUP7 00000694: ADD 00000695: SWAP1 00000696: SSTORE 00000697: DUP4 00000698: MLOAD 00000699: DUP6 0000069a: DUP2 0000069b: MSTORE 0000069c: SWAP4 0000069d: MLOAD 0000069e: SWAP2 0000069f: SWAP4 000006a0: PUSH32 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef 000006c1: SWAP3 000006c2: SWAP1 000006c3: DUP2 000006c4: SWAP1 000006c5: SUB 000006c6: SWAP1 000006c7: SWAP2 000006c8: ADD 000006c9: SWAP1 000006ca: LOG3 000006cb: POP 000006cc: POP 000006cd: JUMP 000006ce: JUMPDEST 000006cf: PUSH1 0x01 000006d1: PUSH1 0xa0 000006d3: PUSH1 0x02 000006d5: EXP 000006d6: SUB 000006d7: DUP4 000006d8: AND 000006d9: PUSH1 0x00 000006db: SWAP1 000006dc: DUP2 000006dd: MSTORE 000006de: PUSH1 0x03 000006e0: PUSH1 0x20 000006e2: MSTORE 000006e3: PUSH1 0x40 000006e5: SWAP1 000006e6: KECCAK256 000006e7: SLOAD 000006e8: DUP3 000006e9: DUP2 000006ea: ADD 000006eb: LT 000006ec: ISZERO 000006ed: PUSH2 0x06f5 000006f0: JUMPI 000006f1: PUSH2 0x0002 000006f4: JUMP 000006f5: JUMPDEST 000006f6: PUSH1 0x01 000006f8: PUSH1 0xa0 000006fa: PUSH1 0x02 000006fc: EXP 000006fd: SUB 000006fe: DUP5 000006ff: DUP2 00000700: AND 00000701: PUSH1 0x00 00000703: DUP2 00000704: DUP2 00000705: MSTORE 00000706: PUSH1 0x04 00000708: PUSH1 0x20 0000070a: SWAP1 0000070b: DUP2 0000070c: MSTORE 0000070d: PUSH1 0x40 0000070f: DUP1 00000710: DUP4 00000711: KECCAK256 00000712: CALLER 00000713: SWAP6 00000714: SWAP1 00000715: SWAP6 00000716: AND 00000717: DUP1 00000718: DUP5 00000719: MSTORE 0000071a: SWAP5 0000071b: DUP3 0000071c: MSTORE 0000071d: DUP1 0000071e: DUP4 0000071f: KECCAK256 00000720: SLOAD 00000721: SWAP4 00000722: DUP4 00000723: MSTORE 00000724: PUSH1 0x05 00000726: DUP3 00000727: MSTORE 00000728: DUP1 00000729: DUP4 0000072a: KECCAK256 0000072b: SWAP5 0000072c: DUP4 0000072d: MSTORE 0000072e: SWAP4 0000072f: SWAP1 00000730: MSTORE 00000731: SWAP2 00000732: SWAP1 00000733: SWAP2 00000734: KECCAK256 00000735: SLOAD 00000736: DUP4 00000737: ADD 00000738: GT 00000739: ISZERO 0000073a: PUSH2 0x0742 0000073d: JUMPI 0000073e: PUSH2 0x0002 00000741: JUMP 00000742: JUMPDEST 00000743: PUSH1 0x01 00000745: PUSH1 0xa0 00000747: PUSH1 0x02 00000749: EXP 0000074a: SUB 0000074b: DUP5 0000074c: DUP2 0000074d: AND 0000074e: PUSH1 0x00 00000750: DUP2 00000751: DUP2 00000752: MSTORE 00000753: PUSH1 0x03 00000755: PUSH1 0x20 00000757: SWAP1 00000758: DUP2 00000759: MSTORE 0000075a: PUSH1 0x40 0000075c: DUP1 0000075d: DUP4 0000075e: KECCAK256 0000075f: DUP1 00000760: SLOAD 00000761: DUP9 00000762: SWAP1 00000763: SUB 00000764: SWAP1 00000765: SSTORE 00000766: DUP8 00000767: DUP6 00000768: AND 00000769: DUP1 0000076a: DUP5 0000076b: MSTORE 0000076c: DUP2 0000076d: DUP5 0000076e: KECCAK256 0000076f: DUP1 00000770: SLOAD 00000771: DUP10 00000772: ADD 00000773: SWAP1 00000774: SSTORE 00000775: SWAP4 00000776: DUP4 00000777: MSTORE 00000778: PUSH1 0x05 0000077a: DUP3 0000077b: MSTORE 0000077c: DUP1 0000077d: DUP4 0000077e: KECCAK256 0000077f: CALLER 00000780: SWAP6 00000781: SWAP1 00000782: SWAP6 00000783: AND 00000784: DUP1 00000785: DUP5 00000786: MSTORE 00000787: SWAP5 00000788: DUP3 00000789: MSTORE 0000078a: SWAP2 0000078b: DUP3 0000078c: SWAP1 0000078d: KECCAK256 0000078e: DUP1 0000078f: SLOAD 00000790: DUP8 00000791: ADD 00000792: SWAP1 00000793: SSTORE 00000794: DUP2 00000795: MLOAD 00000796: DUP7 00000797: DUP2 00000798: MSTORE 00000799: SWAP2 0000079a: MLOAD 0000079b: SWAP3 0000079c: SWAP4 0000079d: SWAP3 0000079e: PUSH32 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef 000007bf: SWAP3 000007c0: DUP2 000007c1: SWAP1 000007c2: SUB 000007c3: SWAP1 000007c4: SWAP2 000007c5: ADD 000007c6: SWAP1 000007c7: LOG3 000007c8: SWAP4 000007c9: SWAP3 000007ca: POP 000007cb: POP 000007cc: POP 000007cd: 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 |
|---|---|---|---|---|---|---|---|
| critical | access_control | codex | Public constructor-like function lets any caller mint/reset token state | 90 | no | — |
viewevidence_json{
"evidence": "Dispatcher routes `0x1d2bca17` to `pc 0x00e8`. Within that path, the code computes a `CALLER`-keyed hash for slot `0x03` and stores constant `0x0bde31` (`pc 0x0177`-`0x018f`). It then stores hardcoded metadata into storage: name-like data in `slot 0` (`pc 0x0198`-`0x01d4`), symbol-like data in helper `pc 0x058e`-`0x05dc`, and sets the low byte of `slot 2` to `0x07` in `pc 0x0627`-`0x0636`. The artifact reports `auth.guards: []`, so there is no detected access control on this path. Selector inference from bytecode is best-effort, but this routine has clear constructor/initializer behavior.",
"locations": [
"selector:0x1d2bca17",
"pc:0x00e8",
"pc:0x018f",
"pc:0x01d4",
"pc:0x05dc",
"pc:0x0636"
],
"recommendation": "Remove or permanently disable this initializer path. If this was meant to be a constructor, replace it with an actual constructor/one-time initializer guard and prevent any post-deployment entry. If already deployed, treat the token as compromised unless this selector is provably unreachable through a proxy/admin wrapper.",
"exploit_scenario": "An attacker calls selector `0x1d2bca17` directly. The routine writes `0x0bde31` into the caller-derived slot under mapping slot `0x03`, then overwrites the metadata slots used by the token (`slot 0`, `slot 1`, and low byte of `slot 2`). Because no guard is detected, any account can invoke it to grant itself a fresh balance and repeat after spending, effectively breaking token supply integrity."
}
|
| high | other | detector | Untrusted CALL target/value reachable | 60 | yes | yes |
viewtrace_id: 0xb712b4a3a5c40d6301e1a7a0fe8e5ec74cd9d23ca6647dae6ec4148daa055239
call_targets:
0x0000000000000000000000000000000000000004, 0x2bf4a701470dfe06babd313926a1ebcdcd5806c1
target_varies:
yes
classification:
target_varies
validation_json{
"sink": "CALL",
"errors": 0,
"status": "confirmed",
"attempts": 1,
"trace_id": "0xb712b4a3a5c40d6301e1a7a0fe8e5ec74cd9d23ca6647dae6ec4148daa055239",
"confirmed": true,
"trace_mode": "callTracer",
"call_targets": [
"0x0000000000000000000000000000000000000004",
"0x2bf4a701470dfe06babd313926a1ebcdcd5806c1"
],
"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": "0x1d2bca17",
"selector": "0x1d2bca17",
"calldata_variants": [
"0x1d2bca17",
"0x1d2bca170000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"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": "0x95d89b41",
"selector": "0x95d89b41",
"calldata_variants": [
"0x95d89b41",
"0x95d89b410000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xa9059cbb",
"selector": "0xa9059cbb",
"calldata_variants": [
"0xa9059cbb",
"0xa9059cbb0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xcae9ca51",
"selector": "0xcae9ca51",
"calldata_variants": [
"0xcae9ca51",
"0xcae9ca510000000000000000000000000000000000000000000000000000000000000000"
]
}
]
}
evidence_json{
"examples": [
{
"pc": 1061,
"opcode": "CALL",
"returndata_checked": null,
"value_expression_category": "computed",
"target_expression_category": "computed"
},
{
"pc": 1129,
"opcode": "CALL",
"returndata_checked": null,
"value_expression_category": "computed",
"target_expression_category": "computed"
},
{
"pc": 1274,
"opcode": "CALL",
"returndata_checked": null,
"value_expression_category": "computed",
"target_expression_category": "computed"
}
],
"call_count": 3,
"guards_detected": [],
"untrusted_call_count": 3
}
|
| high | other | detector | ETH value transfer possible | 55 | yes | yes |
viewtrace_id: 0xb712b4a3a5c40d6301e1a7a0fe8e5ec74cd9d23ca6647dae6ec4148daa055239
call_targets:
0x0000000000000000000000000000000000000004, 0x2bf4a701470dfe06babd313926a1ebcdcd5806c1
target_varies:
yes
classification:
target_varies
validation_json{
"sink": "CALL",
"errors": 0,
"status": "confirmed",
"attempts": 1,
"trace_id": "0xb712b4a3a5c40d6301e1a7a0fe8e5ec74cd9d23ca6647dae6ec4148daa055239",
"confirmed": true,
"trace_mode": "callTracer",
"call_targets": [
"0x0000000000000000000000000000000000000004",
"0x2bf4a701470dfe06babd313926a1ebcdcd5806c1"
],
"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": "0x1d2bca17",
"selector": "0x1d2bca17",
"calldata_variants": [
"0x1d2bca17",
"0x1d2bca170000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"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": "0x95d89b41",
"selector": "0x95d89b41",
"calldata_variants": [
"0x95d89b41",
"0x95d89b410000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xa9059cbb",
"selector": "0xa9059cbb",
"calldata_variants": [
"0xa9059cbb",
"0xa9059cbb0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xcae9ca51",
"selector": "0xcae9ca51",
"calldata_variants": [
"0xcae9ca51",
"0xcae9ca510000000000000000000000000000000000000000000000000000000000000000"
]
}
]
}
evidence_json{
"examples": [
{
"pc": 1061,
"opcode": "CALL",
"returndata_checked": null,
"value_expression_category": "computed",
"target_expression_category": "computed"
},
{
"pc": 1129,
"opcode": "CALL",
"returndata_checked": null,
"value_expression_category": "computed",
"target_expression_category": "computed"
},
{
"pc": 1274,
"opcode": "CALL",
"returndata_checked": null,
"value_expression_category": "computed",
"target_expression_category": "computed"
}
],
"eth_value_calls": 3,
"guards_detected": []
}
|
| medium | other | codex | Allowance accounting appears non-standard and can desynchronize from `allowance()` | 75 | no | — |
viewevidence_json{
"evidence": "`0xdd62ed3e` reads a nested mapping rooted at slot `0x04` (`pc 0x049e`-`0x04bb`). `0xdc3080f2` reads a separate nested mapping rooted at slot `0x05` (`pc 0x0479`-`0x0497`). In `transferFrom` (`selector 0x23b872dd`), the code loads one mapping value around `pc 0x071d`-`0x0720`, then loads the second around `pc 0x0723`-`0x0735`, adds them, and compares the sum against the requested amount at `pc 0x0736`-`0x0739`; later it updates the slot-`0x05` mapping at `pc 0x077c`-`0x0793` instead of decrementing the slot-`0x04` value. This is a bytecode-level inference, so the exact intended names are uncertain, but the storage behavior is inconsistent with standard ERC-20 remaining-allowance accounting.",
"locations": [
"selector:0x23b872dd",
"selector:0xdd62ed3e",
"selector:0xdc3080f2",
"pc:0x049e",
"pc:0x0479",
"pc:0x0734",
"pc:0x0793"
],
"recommendation": "Use a single remaining-allowance source of truth, or reset the consumed-allowance mapping whenever a new approval is set. If this split-accounting design is intentional, expose an explicit remaining-allowance getter and avoid presenting `0xdd62ed3e` as standard ERC-20 allowance semantics.",
"exploit_scenario": "A spender uses `transferFrom` until the separate consumed-allowance mapping reaches the approved amount. If the owner later approves the same nominal amount again, `allowance(owner,spender)` can still report that amount, but `transferFrom` may fail because the contract adds a second stored value before checking the limit. Integrations that rely on standard ERC-20 `allowance()` semantics can mis-handle approvals or become stuck."
}
|