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

Analysis Run

9d3b7324-245d-4bf1-8fa9-9c6303f66685

complete
Chain ID
1
Address
Block Number
Created
Thu, Jan 1, 2026 8:28 PM
Review Summary

What survived the funnel

Open this run to answer one question: is this real attacker-relevant behavior with real impact, or just normal contract plumbing?

Confirmed
0
Validated
0
Source
Bytecode only
Review Backing
Not yet
Best current signal
Untrusted CALL target/value reachable
crit 0 high 0 direct contract
Review Checklist
1. Read the findings table first. Ignore raw jobs until the result looks real.
2. Confirm attacker control, not just the existence of a sink.
3. Confirm money or privilege impact.
4. Keep it if the behavior is real. Kill it if this is normal proxy, admin, or upgrade plumbing.

Processing Jobs

Status & attempts
ID Type Status Attempts Heartbeat
31126 report.consolidate complete 1 / 1 3 months ago
76570 artifact.fetch complete 1 / 3 2 weeks ago
76571 tool.cast_disasm complete 1 / 3 2 weeks ago
76572 analysis.bundle complete 1 / 3 2 weeks ago
76573 capability.graph complete 1 / 3 2 weeks ago
76574 detector.run complete 1 / 3 2 weeks ago
76575 validation.fork complete 1 / 3 2 weeks ago

Artifact

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

Slither

tool.slither

No slither job recorded yet.

Codex

report.consolidate
Job Status
complete
Attempts
1 / 1
Findings
0
No findings?
yes
Summary
Reviewed the full runtime bytecode bundle; the only external value transfer is a low-level CALL using stored transaction fields and appears gated by confirmation/owner logic. No concrete, exploitable path to extract ETH/tokens/NFTs was identified from bytecode alone.
View stderr
[codex:281657] OpenAI Codex v0.77.0 (research preview)
[codex:281657] --------
[codex:281657] workdir: /tmp/codex-multi-q6dbli10
[codex:281657] model: gpt-5.2-codex
[codex:281657] provider: openai
[codex:281657] approval: never
[codex:281657] sandbox: read-only
[codex:281657] reasoning effort: xhigh
[codex:281657] reasoning summaries: auto
[codex:281657] session id: 019b7b32-0d53-7c11-a34c-5e7a28cd3388
[codex:281657] --------
[codex:281657] user
[codex:281657] You are a profit-focused exploit hunter analyzing EVM bytecode. Your ONLY goal is finding ways to extract value (ETH, tokens, NFTs) from this contract.
[codex:281657] 
[codex:281657] Read `BYTECODE_BUNDLE.txt` completely before concluding.
[codex:281657] 
[codex:281657] ONLY REPORT if you find a CONCRETE, EXPLOITABLE path to profit. We do NOT care about:
[codex:281657] - Gas inefficiency, code quality, or best practices
[codex:281657] - Theoretical vulnerabilities without a clear extraction path
[codex:281657] - Generic footguns (unchecked return values, etc.) unless they enable theft
[codex:281657] - Issues requiring social engineering or off-chain coordination
[codex:281657] 
[codex:281657] PATTERNS WORTH INVESTIGATING in bytecode:
[codex:281657] - CALL/DELEGATECALL with controllable destination or calldata
[codex:281657] - Value transfers (CALL with non-zero value) without prior CALLER/ORIGIN checks
[codex:281657] - SSTORE to low slots (0-10) that might be owner/admin storage
[codex:281657] - ecrecover (signature validation) - look for missing nonce/replay protection
[codex:281657] - External calls before state updates (reentrancy)
[codex:281657] - SELFDESTRUCT with controllable beneficiary
[codex:281657] - Proxy patterns (DELEGATECALL to storage slot) with unprotected upgrade paths
[codex:281657] 
[codex:281657] For each finding, you MUST explain:
[codex:281657] 1. The specific bytecode pattern/offsets that indicate the vulnerability
[codex:281657] 2. The concrete sequence of transactions to extract value
[codex:281657] 3. Why you believe this is exploitable (not just suspicious)
[codex:281657] 
[codex:281657] If you cannot identify a concrete profit path from bytecode alone: set no_findings=true.
[codex:281657] Do NOT hallucinate. Bytecode-only analysis is limited - be honest about uncertainty.
[codex:281657] 
[codex:281657] Output MUST be valid JSON matching the provided schema.
[codex:281657] - severity: info, low, medium, high, critical (use high/critical ONLY for clear extraction paths)
[codex:281657] - category: access_control, reentrancy, math, oracle, upgradeability, auth, other
[codex:281657] mcp startup: no servers
[codex:281657] 
[codex:281657] thinking
[codex:281657] **Preparing to read BYTECODE_BUNDLE.txt**
[codex:281657] exec
[codex:281657] /bin/bash -lc ls in /tmp/codex-multi-q6dbli10 succeeded in 5ms:
[codex:281657] BYTECODE_BUNDLE.txt
[codex:281657] codex-output-schema.json
[codex:281657] exec
[codex:281657] /bin/bash -lc 'cat BYTECODE_BUNDLE.txt' in /tmp/codex-multi-q6dbli10 succeeded in 5ms:
[codex:281657] Runtime bytecode bundle for best-effort auditing.
[codex:281657] Note: without verified source, conclusions are low-confidence unless a concrete pattern is visible.
[codex:281657] 
[codex:281657] FILE: runtime_bytecode.hex
[codex:281657] 0x6060604052361561011b576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063025e7c271461017c578063173825d9146101d957806320ea8d861461020c5780632f54bf6e146102295780633411c81c146102745780634c3a6ae0146102c857806354741525146102ef5780637065cb481461032d578063784547a7146103605780638a88c4fe146103955780638b51d13f146103f05780639ace38c214610421578063a0e67e2b14610519578063a8abe69a1461058b578063b5dc40c31461062a578063b77bf600146106aa578063ba51a6df146106cd578063c01a8c84146106ea578063c642747414610707578063d74f8edd1461079a578063dc8452cd146107bd575b61017a5b6000341115610177573373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040518082815260200191505060405180910390a25b5b565b005b346100005761019760048080359060200190919050506107e0565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b346100005761020a600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061081d565b005b34610000576102276004808035906020019091905050610af2565b005b346100005761025a600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610ca0565b604051808215151515815260200191505060405180910390f35b34610000576102ae600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610cc0565b604051808215151515815260200191505060405180910390f35b34610000576102d5610cef565b604051808215151515815260200191505060405180910390f35b3461000057610317600480803515159060200190919080351515906020019091905050610d02565b6040518082815260200191505060405180910390f35b346100005761035e600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610d99565b005b346100005761037b6004808035906020019091905050610fd9565b604051808215151515815260200191505060405180910390f35b34610000576103ee600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506110c0565b005b346100005761040b60048080359060200190919050506113bb565b6040518082815260200191505060405180910390f35b346100005761043c6004808035906020019091905050611488565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200184815260200180602001831515151581526020018281038252848181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156105075780601f106104dc57610100808354040283529160200191610507565b820191906000526020600020905b8154815290600101906020018083116104ea57829003601f168201915b50509550505050505060405180910390f35b34610000576105266114e4565b6040518080602001828103825283818151815260200191508051906020019060200280838360008314610578575b80518252602083111561057857602082019150602081019050602083039250610554565b5050509050019250505060405180910390f35b34610000576105c5600480803590602001909190803590602001909190803515159060200190919080351515906020019091905050611582565b6040518080602001828103825283818151815260200191508051906020019060200280838360008314610617575b805182526020831115610617576020820191506020810190506020830392506105f3565b5050509050019250505060405180910390f35b346100005761064560048080359060200190919050506116ef565b6040518080602001828103825283818151815260200191508051906020019060200280838360008314610697575b80518252602083111561069757602082019150602081019050602083039250610673565b5050509050019250505060405180910390f35b34610000576106b7611924565b6040518082815260200191505060405180910390f35b34610000576106e8600480803590602001909190505061192a565b005b346100005761070560048080359060200190919050506119e8565b005b3461000057610784600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050611bca565b6040518082815260200191505060405180910390f35b34610000576107a7611bea565b6040518082815260200191505060405180910390f35b34610000576107ca611bef565b6040518082815260200191505060405180910390f35b600481815481101561000057906000526020600020900160005b915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561085957610000565b81600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615156108b257610000565b6000600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600091505b600160048054905003821015610a35578273ffffffffffffffffffffffffffffffffffffffff16600483815481101561000057906000526020600020900160005b9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610a27576004600160048054905003815481101561000057906000526020600020900160005b9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600483815481101561000057906000526020600020900160005b6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610a35565b5b818060010192505061090f565b6001600481818054905003915081815481835581811511610a8257818360005260206000209182019101610a8191905b80821115610a7d576000816000905550600101610a65565b5090565b5b505050506004805490506005541115610aa457610aa360048054905061192a565b5b8273ffffffffffffffffffffffffffffffffffffffff167f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9060405180905060405180910390a25b5b505b5050565b33600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515610b4b57610000565b81336002600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515610bb657610000565b836001600082815260200190815260200160002060030160009054906101000a900460ff1615610be557610000565b60006002600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550843373ffffffffffffffffffffffffffffffffffffffff167ff6a317157440607f36269043eb55f1287a5a19ba2216afeab88cd46cbcfb88e960405180905060405180910390a35b5b505b50505b5050565b60036020528060005260406000206000915054906101000a900460ff1681565b60026020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b600060009054906101000a900460ff1681565b60006000600090505b600654811015610d9157838015610d4357506001600082815260200190815260200160002060030160009054906101000a900460ff16155b80610d775750828015610d7657506001600082815260200190815260200160002060030160009054906101000a900460ff165b5b15610d83576001820191505b5b8080600101915050610d0b565b5b5092915050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610dd357610000565b80600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610e2b57610000565b8160008173ffffffffffffffffffffffffffffffffffffffff161415610e5057610000565b6001600480549050016005546032821115610e6a57610000565b81811115610e7757610000565b6000811415610e8557610000565b6000821415610e9357610000565b6001600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060048054806001018281815481835581811511610f3457818360005260206000209182019101610f3391905b80821115610f2f576000816000905550600101610f17565b5090565b5b505050916000526020600020900160005b87909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550508473ffffffffffffffffffffffffffffffffffffffff167ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d60405180905060405180910390a25b5b50505b505b505b50565b60006000600060009150600090505b6004805490508110156110b857600260008581526020019081526020016000206000600483815481101561000057906000526020600020900160005b9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611097576001820191505b6005548214156110aa57600192506110b9565b5b8080600101915050610fe8565b5b5050919050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156110fa57610000565b82600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151561115357610000565b82600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156111ab57610000565b8473ffffffffffffffffffffffffffffffffffffffff16600484815481101561000057906000526020600020900160005b9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561121d57610000565b83600484815481101561000057906000526020600020900160005b6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508473ffffffffffffffffffffffffffffffffffffffff167f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9060405180905060405180910390a28373ffffffffffffffffffffffffffffffffffffffff167ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d60405180905060405180910390a25b5b505b505b505050565b60006000600090505b60048054905081101561148157600260008481526020019081526020016000206000600483815481101561000057906000526020600020900160005b9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611473576001820191505b5b80806001019150506113c4565b5b50919050565b60016020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600101549080600201908060030160009054906101000a900460ff16905084565b6020604051908101604052806000815250600480548060200260200160405190810160405280929190818152602001828054801561157757602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161152d575b505050505090505b90565b60206040519081016040528060008152506020604051908101604052806000815250600060006006546040518059106115b85750595b908082528060200260200182016040525b50925060009150600090505b6006548110156116755785801561160d57506001600082815260200190815260200160002060030160009054906101000a900460ff16155b80611641575084801561164057506001600082815260200190815260200160002060030160009054906101000a900460ff165b5b156116675780838381518110156100005790602001906020020181815250506001820191505b5b80806001019150506115d5565b8787036040518059106116855750595b908082528060200260200182016040525b5093508790505b868110156116e3578281815181101561000057906020019060200201518489830381518110156100005790602001906020020181815250505b808060010191505061169d565b5b505050949350505050565b60206040519081016040528060008152506020604051908101604052806000815250600060006004805490506040518059106117285750595b908082528060200260200182016040525b50925060009150600090505b60048054905081101561188257600260008681526020019081526020016000206000600483815481101561000057906000526020600020900160005b9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561187457600481815481101561000057906000526020600020900160005b9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683838151811015610000579060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506001820191505b5b8080600101915050611745565b816040518059106118905750595b908082528060200260200182016040525b509350600090505b8181101561191b5782818151811015610000579060200190602002015184828151811015610000579060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505b80806001019150506118a9565b5b505050919050565b60065481565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561196457610000565b60048054905081603282111561197957610000565b8181111561198657610000565b600081141561199457610000565b60008214156119a257610000565b826005819055507fa3f1ee9126a074d9326c682f561767f710e927faa811f7a99829d49dc421797a836040518082815260200191505060405180910390a15b5b50505b50565b33600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515611a4157610000565b8160006001600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611a9c57610000565b82336002600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611b0657610000565b60016002600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550843373ffffffffffffffffffffffffffffffffffffffff167f4a504a94899432a9846e1aa406dceb1bcfd538bb839071d49d1e5e23f5be30ef60405180905060405180910390a3611bbf85611bf5565b5b5b50505b505b5050565b6000611bd7848484611db9565b9050611be2816119e8565b5b9392505050565b603281565b60055481565b6000816001600082815260200190815260200160002060030160009054906101000a900460ff1615611c2657610000565b611c2f83610fd9565b15611db25760016000848152602001908152602001600020915060018260030160006101000a81548160ff0219169083151502179055508160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168260010154836002016040518082805460018160011615610100020316600290048015611d0f5780601f10611ce457610100808354040283529160200191611d0f565b820191906000526020600020905b815481529060010190602001808311611cf257829003601f168201915b505091505060006040518083038185876185025a03f19250505015611d6357827f33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed7560405180905060405180910390a2611db1565b827f526441bb6c1aba3c9a4a6ca1d6545da9c2333c8c48343ef398eb858d72b7923660405180905060405180910390a260008260030160006101000a81548160ff0219169083151502179055505b5b5b5b505050565b60008360008173ffffffffffffffffffffffffffffffffffffffff161415611de057610000565b60065491506080604051908101604052808673ffffffffffffffffffffffffffffffffffffffff168152602001858152602001848152602001600015158152506001600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602082015181600101556040820151816002019080519060200190828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611ed657805160ff1916838001178555611f04565b82800160010185558215611f04579182015b82811115611f03578251825591602001919060010190611ee8565b5b509050611f2991905b80821115611f25576000816000905550600101611f0d565b5090565b505060608201518160030160006101000a81548160ff0219169083151502179055509050506001600660008282540192505081905550817fc0ba8fe4b176c1714197d43b9cc6bcf797a4a7461c5fe8d0ef6e184ae7601e5160405180905060405180910390a25b5b5093925050505600a165627a7a723058207d44fad584bdc5a513776a17ae9cd92b316a91c766c61812184adce9885e7c440029
[codex:281657] 
[codex:281657] thinking
[codex:281657] **Analyzing bytecode for vulnerabilities**
[codex:281657] 
[codex:281657] I'm planning to write a Python script to disassemble the bytecode and locate key opcodes like CALL, DELEGATECALL, SELFDESTRUCT, and others to see if any unprotected external calls or value transfers exist. This will help me identify any concrete exploit paths to profit or confirm no findings safely.
[codex:281657] exec
[codex:281657] /bin/bash -lc "python - <<'PY'
[codex:281657] import re
[codex:281657] from pathlib import Path
[codex:281657] hexdata=Path('BYTECODE_BUNDLE.txt').read_text()
[codex:281657] # extract hex after 0x
[codex:281657] m=re.search(r'0x([0-9a-fA-F]+)', hexdata)
[codex:281657] if not m:
[codex:281657]     print('no hex')
[codex:281657]     raise SystemExit
[codex:281657] code=m.group(1)
[codex:281657] # bytes
[codex:281657] b=bytes.fromhex(code)
[codex:281657] ops={0xf1:'CALL',0xf2:'CALLCODE',0xf4:'DELEGATECALL',0xfa:'STATICCALL',0xff:'SELFDESTRUCT'}
[codex:281657] for i,byte in enumerate(b):
[codex:281657]     if byte in ops:
[codex:281657]         print(hex(i), ops[byte])
[codex:281657] PY" in /tmp/codex-multi-q6dbli10 succeeded in 29ms:
[codex:281657] 0x2f SELFDESTRUCT
[codex:281657] 0x30 SELFDESTRUCT
[codex:281657] 0x31 SELFDESTRUCT
[codex:281657] 0x32 SELFDESTRUCT
[codex:281657] 0x12b SELFDESTRUCT
[codex:281657] 0x12c SELFDESTRUCT
[codex:281657] 0x12d SELFDESTRUCT
[codex:281657] 0x12e SELFDESTRUCT
[codex:281657] 0x12f SELFDESTRUCT
[codex:281657] 0x130 SELFDESTRUCT
[codex:281657] 0x131 SELFDESTRUCT
[codex:281657] 0x132 SELFDESTRUCT
[codex:281657] 0x133 SELFDESTRUCT
[codex:281657] 0x134 SELFDESTRUCT
[codex:281657] 0x135 SELFDESTRUCT
[codex:281657] 0x136 SELFDESTRUCT
[codex:281657] 0x137 SELFDESTRUCT
[codex:281657] 0x138 SELFDESTRUCT
[codex:281657] 0x139 SELFDESTRUCT
[codex:281657] 0x13a SELFDESTRUCT
[codex:281657] 
[codex:281657] thinking
[codex:281657] **Planning robust EVM opcode parsing**
[codex:281657] exec
[codex:281657] /bin/bash -lc "python - <<'PY'
[codex:281657] import re
[codex:281657] from pathlib import Path
[codex:281657] hexdata=Path('BYTECODE_BUNDLE.txt').read_text()
[codex:281657] code=re.search(r'0x([0-9a-fA-F]+)', hexdata).group(1)
[codex:281657] bytecode=bytes.fromhex(code)
[codex:281657] # opcode lengths for PUSH1-32
[codex:281657] ops={
[codex:281657]     0xf1:'CALL',0xf2:'CALLCODE',0xf4:'DELEGATECALL',0xfa:'STATICCALL',0xff:'SELFDESTRUCT'
[codex:281657] }
[codex:281657] 
[codex:281657] call_offsets=[]
[codex:281657] 
[codex:281657] i=0
[codex:281657] while i < len(bytecode):
[codex:281657]     op=bytecode[i]
[codex:281657]     if op in ops:
[codex:281657]         call_offsets.append((i, ops[op]))
[codex:281657]         i+=1
[codex:281657]         continue
[codex:281657]     # PUSH1-32
[codex:281657]     if 0x60 <= op <= 0x7f:
[codex:281657]         push_len=op-0x5f
[codex:281657]         i += 1 + push_len
[codex:281657]     else:
[codex:281657]         i += 1
[codex:281657] 
[codex:281657] for off, name in call_offsets:
[codex:281657]     print(hex(off), name)
[codex:281657] PY" in /tmp/codex-multi-q6dbli10 succeeded in 31ms:
[codex:281657] 0x1d25 CALL
[codex:281657] 
[codex:281657] thinking
[codex:281657] **Analyzing single CALL instruction**
[codex:281657] exec
[codex:281657] /bin/bash -lc "python - <<'PY'
[codex:281657] import re
[codex:281657] from pathlib import Path
[codex:281657] hexdata=Path('BYTECODE_BUNDLE.txt').read_text()
[codex:281657] code=re.search(r'0x([0-9a-fA-F]+)', hexdata).group(1)
[codex:281657] bytecode=bytes.fromhex(code)
[codex:281657] 
[codex:281657] # opcode names
[codex:281657] opnames={
[codex:281657]     0x00:'STOP',0x01:'ADD',0x02:'MUL',0x03:'SUB',0x04:'DIV',0x05:'SDIV',0x06:'MOD',0x07:'SMOD',0x08:'ADDMOD',0x09:'MULMOD',0x0a:'EXP',0x0b:'SIGNEXTEND',
[codex:281657]     0x10:'LT',0x11:'GT',0x12:'SLT',0x13:'SGT',0x14:'EQ',0x15:'ISZERO',0x16:'AND',0x17:'OR',0x18:'XOR',0x19:'NOT',0x1a:'BYTE',0x1b:'SHL',0x1c:'SHR',0x1d:'SAR',
[codex:281657]     0x20:'SHA3',
[codex:281657]     0x30:'ADDRESS',0x31:'BALANCE',0x32:'ORIGIN',0x33:'CALLER',0x34:'CALLVALUE',0x35:'CALLDATALOAD',0x36:'CALLDATASIZE',0x37:'CALLDATACOPY',0x38:'CODESIZE',0x39:'CODECOPY',0x3a:'GASPRICE',0x3b:'EXTCODESIZE',0x3c:'EXTCODECOPY',0x3d:'RETURNDATASIZE',0x3e:'RETURNDATACOPY',0x3f:'EXTCODEHASH',
[codex:281657]     0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x46:'CHAINID',0x47:'SELFBALANCE',0x48:'BASEFEE',
[codex:281657]     0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x53:'MSTORE8',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x58:'PC',0x59:'MSIZE',0x5a:'GAS',0x5b:'JUMPDEST',
[codex:281657]     0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'
[codex:281657] }
[codex:281657] 
[codex:281657] # simple disassembler
[codex:281657] 
[codex:281657] def disasm(start, end):
[codex:281657]     i=start
[codex:281657]     out=[]
[codex:281657]     while i<end and i<len(bytecode):
[codex:281657]         op=bytecode[i]
[codex:281657]         name=opnames.get(op, f'OP{op:02x}')
[codex:281657]         if 0x60 <= op <= 0x7f:
[codex:281657]             n=op-0x5f
[codex:281657]             data=bytecode[i+1:i+1+n]
[codex:281657]             out.append((i, f'PUSH{n}', data.hex()))
[codex:281657]             i += 1+n
[codex:281657]         else:
[codex:281657]             out.append((i, name, ''))
[codex:281657]             i += 1
[codex:281657]     return out
[codex:281657] 
[codex:281657] for off, name, data in disasm(0x1cc0, 0x1d80):
[codex:281657]     if data:
[codex:281657]         print(f\"{off:04x}: {name} 0x{data}\")
[codex:281657]     else:
[codex:281657]         print(f\"{off:04x}: {name}\")
[codex:281657] PY" in /tmp/codex-multi-q6dbli10 succeeded in 29ms:
[codex:281657] 1cc0: MUL
[codex:281657] 1cc1: OP90
[codex:281657] 1cc2: DIV
[codex:281657] 1cc3: OP80
[codex:281657] 1cc4: ISZERO
[codex:281657] 1cc5: PUSH2 0x1d0f
[codex:281657] 1cc8: JUMPI
[codex:281657] 1cc9: OP80
[codex:281657] 1cca: PUSH1 0x1f
[codex:281657] 1ccc: LT
[codex:281657] 1ccd: PUSH2 0x1ce4
[codex:281657] 1cd0: JUMPI
[codex:281657] 1cd1: PUSH2 0x0100
[codex:281657] 1cd4: OP80
[codex:281657] 1cd5: OP83
[codex:281657] 1cd6: SLOAD
[codex:281657] 1cd7: DIV
[codex:281657] 1cd8: MUL
[codex:281657] 1cd9: OP83
[codex:281657] 1cda: MSTORE
[codex:281657] 
[codex:281657] thinking
[codex:281657] **Updating opcode decoding ranges**
[codex:281657] exec
[codex:281657] /bin/bash -lc "python - <<'PY'
[codex:281657] import re
[codex:281657] from pathlib import Path
[codex:281657] hexdata=Path('BYTECODE_BUNDLE.txt').read_text()
[codex:281657] code=re.search(r'0x([0-9a-fA-F]+)', hexdata).group(1)
[codex:281657] bytecode=bytes.fromhex(code)
[codex:281657] 
[codex:281657] opnames={
[codex:281657]     0x00:'STOP',0x01:'ADD',0x02:'MUL',0x03:'SUB',0x04:'DIV',0x05:'SDIV',0x06:'MOD',0x07:'SMOD',0x08:'ADDMOD',0x09:'MULMOD',0x0a:'EXP',0x0b:'SIGNEXTEND',
[codex:281657]     0x10:'LT',0x11:'GT',0x12:'SLT',0x13:'SGT',0x14:'EQ',0x15:'ISZERO',0x16:'AND',0x17:'OR',0x18:'XOR',0x19:'NOT',0x1a:'BYTE',0x1b:'SHL',0x1c:'SHR',0x1d:'SAR',
[codex:281657]     0x20:'SHA3',
[codex:281657]     0x30:'ADDRESS',0x31:'BALANCE',0x32:'ORIGIN',0x33:'CALLER',0x34:'CALLVALUE',0x35:'CALLDATALOAD',0x36:'CALLDATASIZE',0x37:'CALLDATACOPY',0x38:'CODESIZE',0x39:'CODECOPY',0x3a:'GASPRICE',0x3b:'EXTCODESIZE',0x3c:'EXTCODECOPY',0x3d:'RETURNDATASIZE',0x3e:'RETURNDATACOPY',0x3f:'EXTCODEHASH',
[codex:281657]     0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x46:'CHAINID',0x47:'SELFBALANCE',0x48:'BASEFEE',
[codex:281657]     0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x53:'MSTORE8',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x58:'PC',0x59:'MSIZE',0x5a:'GAS',0x5b:'JUMPDEST',
[codex:281657]     0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'
[codex:281657] }
[codex:281657] 
[codex:281657] # add DUP and SWAP and LOG
[codex:281657] for i in range(1,17):
[codex:281657]     opnames[0x7f+i]=f'DUP{i}'  # 0x80-0x8f
[codex:281657] for i in range(1,17):
[codex:281657]     opnames[0x8f+i]=f'SWAP{i}' # 0x90-0x9f
[codex:281657] for i in range(0,5):
[codex:281657]     opnames[0xa0+i]=f'LOG{i}'  # 0xa0-0xa4
[codex:281657] 
[codex:281657] 
[codex:281657] def disasm(start, end):
[codex:281657]     i=start
[codex:281657]     out=[]
[codex:281657]     while i<end and i<len(bytecode):
[codex:281657]         op=bytecode[i]
[codex:281657]         name=opnames.get(op, f'OP{op:02x}')
[codex:281657]         if 0x60 <= op <= 0x7f:
[codex:281657]             n=op-0x5f
[codex:281657]             data=bytecode[i+1:i+1+n]
[codex:281657]             out.append((i, f'PUSH{n}', data.hex()))
[codex:281657]             i += 1+n
[codex:281657]         else:
[codex:281657]             out.append((i, name, ''))
[codex:281657]             i += 1
[codex:281657]     return out
[codex:281657] 
[codex:281657] for off, name, data in disasm(0x1d10, 0x1d80):
[codex:281657]     if data:
[codex:281657]         print(f\"{off:04x}: {name} 0x{data}\")
[codex:281657]     else:
[codex:281657]         print(f\"{off:04x}: {name}\")
[codex:281657] PY" in /tmp/codex-multi-q6dbli10 succeeded in 29ms:
[codex:281657] 1d10: POP
[codex:281657] 1d11: POP
[codex:281657] 1d12: SWAP2
[codex:281657] 1d13: POP
[codex:281657] 1d14: POP
[codex:281657] 1d15: PUSH1 0x00
[codex:281657] 1d17: PUSH1 0x40
[codex:281657] 1d19: MLOAD
[codex:281657] 1d1a: DUP1
[codex:281657] 1d1b: DUP4
[codex:281657] 1d1c: SUB
[codex:281657] 1d1d: DUP2
[codex:281657] 1d1e: DUP6
[codex:281657] 1d1f: DUP8
[codex:281657] 1d20: PUSH2 0x8502
[codex:281657] 1d23: GAS
[codex:281657] 1d24: SUB
[codex:281657] 1d25: CALL
[codex:281657] 1d26: SWAP3
[codex:281657] 1d27: POP
[codex:281657] 
[codex:281657] thinking
[codex:281657] **Analyzing CALL parameter setup**
[codex:281657] exec
[codex:281657] /bin/bash -lc "python - <<'PY'
[codex:281657] import re
[codex:281657] from pathlib import Path
[codex:281657] hexdata=Path('BYTECODE_BUNDLE.txt').read_text()
[codex:281657] code=re.search(r'0x([0-9a-fA-F]+)', hexdata).group(1)
[codex:281657] bytecode=bytes.fromhex(code)
[codex:281657] 
[codex:281657] opnames={
[codex:281657]     0x00:'STOP',0x01:'ADD',0x02:'MUL',0x03:'SUB',0x04:'DIV',0x05:'SDIV',0x06:'MOD',0x07:'SMOD',0x08:'ADDMOD',0x09:'MULMOD',0x0a:'EXP',0x0b:'SIGNEXTEND',
[codex:281657]     0x10:'LT',0x11:'GT',0x12:'SLT',0x13:'SGT',0x14:'EQ',0x15:'ISZERO',0x16:'AND',0x17:'OR',0x18:'XOR',0x19:'NOT',0x1a:'BYTE',0x1b:'SHL',0x1c:'SHR',0x1d:'SAR',
[codex:281657]     0x20:'SHA3',
[codex:281657]     0x30:'ADDRESS',0x31:'BALANCE',0x32:'ORIGIN',0x33:'CALLER',0x34:'CALLVALUE',0x35:'CALLDATALOAD',0x36:'CALLDATASIZE',0x37:'CALLDATACOPY',0x38:'CODESIZE',0x39:'CODECOPY',0x3a:'GASPRICE',0x3b:'EXTCODESIZE',0x3c:'EXTCODECOPY',0x3d:'RETURNDATASIZE',0x3e:'RETURNDATACOPY',0x3f:'EXTCODEHASH',
[codex:281657]     0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x46:'CHAINID',0x47:'SELFBALANCE',0x48:'BASEFEE',
[codex:281657]     0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x53:'MSTORE8',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x58:'PC',0x59:'MSIZE',0x5a:'GAS',0x5b:'JUMPDEST',
[codex:281657]     0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'
[codex:281657] }
[codex:281657] for i in range(1,17):
[codex:281657]     opnames[0x7f+i]=f'DUP{i}'
[codex:281657] for i in range(1,17):
[codex:281657]     opnames[0x8f+i]=f'SWAP{i}'
[codex:281657] for i in range(0,5):
[codex:281657]     opnames[0xa0+i]=f'LOG{i}'
[codex:281657] 
[codex:281657] 
[codex:281657] def disasm(start, end):
[codex:281657]     i=start
[codex:281657]     out=[]
[codex:281657]     while i<end and i<len(bytecode):
[codex:281657]         op=bytecode[i]
[codex:281657]         name=opnames.get(op, f'OP{op:02x}')
[codex:281657]         if 0x60 <= op <= 0x7f:
[codex:281657]             n=op-0x5f
[codex:281657]             data=bytecode[i+1:i+1+n]
[codex:281657]             out.append((i, f'PUSH{n}', data.hex()))
[codex:281657]             i += 1+n
[codex:281657]         else:
[codex:281657]             out.append((i, name, ''))
[codex:281657]             i += 1
[codex:281657]     return out
[codex:281657] 
[codex:281657] for off, name, data in disasm(0x1c50, 0x1d40):
[codex:281657]     if data:
[codex:281657]         print(f\"{off:04x}: {name} 0x{data}\")
[codex:281657]     else:
[codex:281657]         print(f\"{off:04x}: {name}\")
[codex:281657] PY" in /tmp/codex-multi-q6dbli10 succeeded in 28ms:
[codex:281657] 1c50: PUSH1 0x00
[codex:281657] 1c52: PUSH2 0x0100
[codex:281657] 1c55: EXP
[codex:281657] 1c56: DUP2
[codex:281657] 1c57: SLOAD
[codex:281657] 1c58: DUP2
[codex:281657] 1c59: PUSH1 0xff
[codex:281657] 1c5b: MUL
[codex:281657] 1c5c: NOT
[codex:281657] 1c5d: AND
[codex:281657] 1c5e: SWAP1
[codex:281657] 1c5f: DUP4
[codex:281657] 1c60: ISZERO
[codex:281657] 1c61: ISZERO
[codex:281657] 1c62: MUL
[codex:281657] 1c63: OR
[codex:281657] 1c64: SWAP1
[codex:281657] 1c65: SSTORE
[codex:281657] 1c66: POP
[codex:281657] 1c67: DUP2
[codex:281657] 
[codex:281657] thinking
[codex:281657] **Analyzing low-level contract call**
[codex:281657] exec
[codex:281657] /bin/bash -lc "python - <<'PY'
[codex:281657] import re
[codex:281657] from pathlib import Path
[codex:281657] hexdata=Path('BYTECODE_BUNDLE.txt').read_text()
[codex:281657] code=re.search(r'0x([0-9a-fA-F]+)', hexdata).group(1)
[codex:281657] bytecode=bytes.fromhex(code)
[codex:281657] 
[codex:281657] opnames={
[codex:281657]     0x00:'STOP',0x01:'ADD',0x02:'MUL',0x03:'SUB',0x04:'DIV',0x05:'SDIV',0x06:'MOD',0x07:'SMOD',0x08:'ADDMOD',0x09:'MULMOD',0x0a:'EXP',0x0b:'SIGNEXTEND',
[codex:281657]     0x10:'LT',0x11:'GT',0x12:'SLT',0x13:'SGT',0x14:'EQ',0x15:'ISZERO',0x16:'AND',0x17:'OR',0x18:'XOR',0x19:'NOT',0x1a:'BYTE',0x1b:'SHL',0x1c:'SHR',0x1d:'SAR',
[codex:281657]     0x20:'SHA3',
[codex:281657]     0x30:'ADDRESS',0x31:'BALANCE',0x32:'ORIGIN',0x33:'CALLER',0x34:'CALLVALUE',0x35:'CALLDATALOAD',0x36:'CALLDATASIZE',0x37:'CALLDATACOPY',0x38:'CODESIZE',0x39:'CODECOPY',0x3a:'GASPRICE',0x3b:'EXTCODESIZE',0x3c:'EXTCODECOPY',0x3d:'RETURNDATASIZE',0x3e:'RETURNDATACOPY',0x3f:'EXTCODEHASH',
[codex:281657]     0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x46:'CHAINID',0x47:'SELFBALANCE',0x48:'BASEFEE',
[codex:281657]     0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x53:'MSTORE8',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x58:'PC',0x59:'MSIZE',0x5a:'GAS',0x5b:'JUMPDEST',
[codex:281657]     0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'
[codex:281657] }
[codex:281657] for i in range(1,17):
[codex:281657]     opnames[0x7f+i]=f'DUP{i}'
[codex:281657] for i in range(1,17):
[codex:281657]     opnames[0x8f+i]=f'SWAP{i}'
[codex:281657] for i in range(0,5):
[codex:281657]     opnames[0xa0+i]=f'LOG{i}'
[codex:281657] 
[codex:281657] 
[codex:281657] def disasm(start, end):
[codex:281657]     i=start
[codex:281657]     out=[]
[codex:281657]     while i<end and i<len(bytecode):
[codex:281657]         op=bytecode[i]
[codex:281657]         name=opnames.get(op, f'OP{op:02x}')
[codex:281657]         if 0x60 <= op <= 0x7f:
[codex:281657]             n=op-0x5f
[codex:281657]             data=bytecode[i+1:i+1+n]
[codex:281657]             out.append((i, f'PUSH{n}', data.hex()))
[codex:281657]             i += 1+n
[codex:281657]         else:
[codex:281657]             out.append((i, name, ''))
[codex:281657]             i += 1
[codex:281657]     return out
[codex:281657] 
[codex:281657] for off, name, data in disasm(0x1b90, 0x1c20):
[codex:281657]     if data:
[codex:281657]         print(f\"{off:04x}: {name} 0x{data}\")
[codex:281657]     else:
[codex:281657]         print(f\"{off:04x}: {name}\")
[codex:281657] PY" in /tmp/codex-multi-q6dbli10 succeeded in 27ms:
[codex:281657] 1b90: OPa9
[codex:281657] 1b91: DUP5
[codex:281657] 1b92: PUSH15 0x1aa406dceb1bcfd538bb839071d49d
[codex:281657] 1ba2: OP1e
[codex:281657] 1ba3: OP5e
[codex:281657] 1ba4: OP23
[codex:281657] 1ba5: CREATE2
[codex:281657] 1ba6: OPbe
[codex:281657] 1ba7: ADDRESS
[codex:281657] 1ba8: OPef
[codex:281657] 1ba9: PUSH1 0x40
[codex:281657] 1bab: MLOAD
[codex:281657] 1bac: DUP1
[codex:281657] 1bad: SWAP1
[codex:281657] 1bae: POP
[codex:281657] 1baf: PUSH1 0x40
[codex:281657] 1bb1: MLOAD
[codex:281657] 1bb2: DUP1
[codex:281657] 1bb3: SWAP2
[codex:281657] 1bb4: SUB
[codex:281657] 
[codex:281657] thinking
[codex:281657] **Analyzing EVM bytecode functions and calls**
[codex:281657] exec
[codex:281657] /bin/bash -lc "python - <<'PY'
[codex:281657] import re
[codex:281657] from pathlib import Path
[codex:281657] hexdata=Path('BYTECODE_BUNDLE.txt').read_text()
[codex:281657] code=re.search(r'0x([0-9a-fA-F]+)', hexdata).group(1)
[codex:281657] bytecode=bytes.fromhex(code)
[codex:281657] 
[codex:281657] opnames={
[codex:281657]     0x00:'STOP',0x01:'ADD',0x02:'MUL',0x03:'SUB',0x04:'DIV',0x05:'SDIV',0x06:'MOD',0x07:'SMOD',0x08:'ADDMOD',0x09:'MULMOD',0x0a:'EXP',0x0b:'SIGNEXTEND',
[codex:281657]     0x10:'LT',0x11:'GT',0x12:'SLT',0x13:'SGT',0x14:'EQ',0x15:'ISZERO',0x16:'AND',0x17:'OR',0x18:'XOR',0x19:'NOT',0x1a:'BYTE',0x1b:'SHL',0x1c:'SHR',0x1d:'SAR',
[codex:281657]     0x20:'SHA3',
[codex:281657]     0x30:'ADDRESS',0x31:'BALANCE',0x32:'ORIGIN',0x33:'CALLER',0x34:'CALLVALUE',0x35:'CALLDATALOAD',0x36:'CALLDATASIZE',0x37:'CALLDATACOPY',0x38:'CODESIZE',0x39:'CODECOPY',0x3a:'GASPRICE',0x3b:'EXTCODESIZE',0x3c:'EXTCODECOPY',0x3d:'RETURNDATASIZE',0x3e:'RETURNDATACOPY',0x3f:'EXTCODEHASH',
[codex:281657]     0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x46:'CHAINID',0x47:'SELFBALANCE',0x48:'BASEFEE',
[codex:281657]     0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x53:'MSTORE8',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x58:'PC',0x59:'MSIZE',0x5a:'GAS',0x5b:'JUMPDEST',
[codex:281657]     0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'
[codex:281657] }
[codex:281657] for i in range(1,17):
[codex:281657]     opnames[0x7f+i]=f'DUP{i}'
[codex:281657] for i in range(1,17):
[codex:281657]     opnames[0x8f+i]=f'SWAP{i}'
[codex:281657] for i in range(0,5):
[codex:281657]     opnames[0xa0+i]=f'LOG{i}'
[codex:281657] 
[codex:281657] 
[codex:281657] def disasm(start, end):
[codex:281657]     i=start
[codex:281657]     out=[]
[codex:281657]     while i<end and i<len(bytecode):
[codex:281657]         op=bytecode[i]
[codex:281657]         name=opnames.get(op, f'OP{op:02x}')
[codex:281657]         if 0x60 <= op <= 0x7f:
[codex:281657]             n=op-0x5f
[codex:281657]             data=bytecode[i+1:i+1+n]
[codex:281657]             out.append((i, f'PUSH{n}', data.hex()))
[codex:281657]             i += 1+n
[codex:281657]         else:
[codex:281657]             out.append((i, name, ''))
[codex:281657]             i += 1
[codex:281657]     return out
[codex:281657] 
[codex:281657] for off, name, data in disasm(0x1c20, 0x1c80):
[codex:281657]     if data:
[codex:281657]         print(f\"{off:04x}: {name} 0x{data}\")
[codex:281657]     else:
[codex:281657]         print(f\"{off:04x}: {name}\")
[codex:281657] PY" in /tmp/codex-multi-q6dbli10 succeeded in 28ms:
[codex:281657] 1c20: OP26
[codex:281657] 1c21: JUMPI
[codex:281657] 1c22: PUSH2 0x0000
[codex:281657] 1c25: JUMP
[codex:281657] 1c26: JUMPDEST
[codex:281657] 1c27: PUSH2 0x1c2f
[codex:281657] 1c2a: DUP4
[codex:281657] 1c2b: PUSH2 0x0fd9
[codex:281657] 1c2e: JUMP
[codex:281657] 1c2f: JUMPDEST
[codex:281657] 1c30: ISZERO
[codex:281657] 1c31: PUSH2 0x1db2
[codex:281657] 1c34: JUMPI
[codex:281657] 1c35: PUSH1 0x01
[codex:281657] 1c37: PUSH1 0x00
[codex:281657] 1c39: DUP5
[codex:281657] 1c3a: DUP2
[codex:281657] 1c3b: MSTORE
[codex:281657] 1c3c: PUSH1 0x20
[codex:281657] 1c3e: ADD
[codex:281657] 
[codex:281657] thinking
[codex:281657] **Analyzing EVM opcode alignment**
[codex:281657] exec
[codex:281657] /bin/bash -lc "python - <<'PY'
[codex:281657] import re
[codex:281657] from pathlib import Path
[codex:281657] hexdata=Path('BYTECODE_BUNDLE.txt').read_text()
[codex:281657] code=re.search(r'0x([0-9a-fA-F]+)', hexdata).group(1)
[codex:281657] bytecode=bytes.fromhex(code)
[codex:281657] 
[codex:281657] opnames={
[codex:281657]     0x00:'STOP',0x01:'ADD',0x02:'MUL',0x03:'SUB',0x04:'DIV',0x05:'SDIV',0x06:'MOD',0x07:'SMOD',0x08:'ADDMOD',0x09:'MULMOD',0x0a:'EXP',0x0b:'SIGNEXTEND',
[codex:281657]     0x10:'LT',0x11:'GT',0x12:'SLT',0x13:'SGT',0x14:'EQ',0x15:'ISZERO',0x16:'AND',0x17:'OR',0x18:'XOR',0x19:'NOT',0x1a:'BYTE',0x1b:'SHL',0x1c:'SHR',0x1d:'SAR',
[codex:281657]     0x20:'SHA3',
[codex:281657]     0x30:'ADDRESS',0x31:'BALANCE',0x32:'ORIGIN',0x33:'CALLER',0x34:'CALLVALUE',0x35:'CALLDATALOAD',0x36:'CALLDATASIZE',0x37:'CALLDATACOPY',0x38:'CODESIZE',0x39:'CODECOPY',0x3a:'GASPRICE',0x3b:'EXTCODESIZE',0x3c:'EXTCODECOPY',0x3d:'RETURNDATASIZE',0x3e:'RETURNDATACOPY',0x3f:'EXTCODEHASH',
[codex:281657]     0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x46:'CHAINID',0x47:'SELFBALANCE',0x48:'BASEFEE',
[codex:281657]     0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x53:'MSTORE8',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x58:'PC',0x59:'MSIZE',0x5a:'GAS',0x5b:'JUMPDEST',
[codex:281657]     0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'
[codex:281657] }
[codex:281657] for i in range(1,17):
[codex:281657]     opnames[0x7f+i]=f'DUP{i}'
[codex:281657] for i in range(1,17):
[codex:281657]     opnames[0x8f+i]=f'SWAP{i}'
[codex:281657] for i in range(0,5):
[codex:281657]     opnames[0xa0+i]=f'LOG{i}'
[codex:281657] 
[codex:281657] 
[codex:281657] def disasm(start, end):
[codex:281657]     i=start
[codex:281657]     out=[]
[codex:281657]     while i<end and i<len(bytecode):
[codex:281657]         op=bytecode[i]
[codex:281657]         name=opnames.get(op, f'OP{op:02x}')
[codex:281657]         if 0x60 <= op <= 0x7f:
[codex:281657]             n=op-0x5f
[codex:281657]             data=bytecode[i+1:i+1+n]
[codex:281657]             out.append((i, f'PUSH{n}', data.hex()))
[codex:281657]             i += 1+n
[codex:281657]         else:
[codex:281657]             out.append((i, name, ''))
[codex:281657]             i += 1
[codex:281657]     return out
[codex:281657] 
[codex:281657] for off, name, data in disasm(0x1d60, 0x1dd0):
[codex:281657]     if data:
[codex:281657]         print(f\"{off:04x}: {name} 0x{data}\")
[codex:281657]     else:
[codex:281657]         print(f\"{off:04x}: {name}\")
[codex:281657] PY" in /tmp/codex-multi-q6dbli10 succeeded in 30ms:
[codex:281657] 1d60: SAR
[codex:281657] 1d61: OPb1
[codex:281657] 1d62: JUMP
[codex:281657] 1d63: JUMPDEST
[codex:281657] 1d64: DUP3
[codex:281657] 1d65: PUSH32 0x526441bb6c1aba3c9a4a6ca1d6545da9c2333c8c48343ef398eb858d72b79236
[codex:281657] 1d86: PUSH1 0x40
[codex:281657] 1d88: MLOAD
[codex:281657] 1d89: DUP1
[codex:281657] 1d8a: SWAP1
[codex:281657] 1d8b: POP
[codex:281657] 1d8c: PUSH1 0x40
[codex:281657] 1d8e: MLOAD
[codex:281657] 1d8f: DUP1
[codex:281657] 1d90: SWAP2
[codex:281657] 1d91: SUB
[codex:281657] 1d92: SWAP1
[codex:281657] 1d93: LOG2
[codex:281657] 1d94: PUSH1 0x00
[codex:281657] 1d96: DUP3
[codex:281657] 
[codex:281657] thinking
[codex:281657] **Realigning to function start at JUMPDEST**
[codex:281657] exec
[codex:281657] /bin/bash -lc "python - <<'PY'
[codex:281657] import re
[codex:281657] from pathlib import Path
[codex:281657] hexdata=Path('BYTECODE_BUNDLE.txt').read_text()
[codex:281657] code=re.search(r'0x([0-9a-fA-F]+)', hexdata).group(1)
[codex:281657] bytecode=bytes.fromhex(code)
[codex:281657] 
[codex:281657] opnames={
[codex:281657]     0x00:'STOP',0x01:'ADD',0x02:'MUL',0x03:'SUB',0x04:'DIV',0x05:'SDIV',0x06:'MOD',0x07:'SMOD',0x08:'ADDMOD',0x09:'MULMOD',0x0a:'EXP',0x0b:'SIGNEXTEND',
[codex:281657]     0x10:'LT',0x11:'GT',0x12:'SLT',0x13:'SGT',0x14:'EQ',0x15:'ISZERO',0x16:'AND',0x17:'OR',0x18:'XOR',0x19:'NOT',0x1a:'BYTE',0x1b:'SHL',0x1c:'SHR',0x1d:'SAR',
[codex:281657]     0x20:'SHA3',
[codex:281657]     0x30:'ADDRESS',0x31:'BALANCE',0x32:'ORIGIN',0x33:'CALLER',0x34:'CALLVALUE',0x35:'CALLDATALOAD',0x36:'CALLDATASIZE',0x37:'CALLDATACOPY',0x38:'CODESIZE',0x39:'CODECOPY',0x3a:'GASPRICE',0x3b:'EXTCODESIZE',0x3c:'EXTCODECOPY',0x3d:'RETURNDATASIZE',0x3e:'RETURNDATACOPY',0x3f:'EXTCODEHASH',
[codex:281657]     0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x46:'CHAINID',0x47:'SELFBALANCE',0x48:'BASEFEE',
[codex:281657]     0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x53:'MSTORE8',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x58:'PC',0x59:'MSIZE',0x5a:'GAS',0x5b:'JUMPDEST',
[codex:281657]     0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'
[codex:281657] }
[codex:281657] for i in range(1,17):
[codex:281657]     opnames[0x7f+i]=f'DUP{i}'
[codex:281657] for i in range(1,17):
[codex:281657]     opnames[0x8f+i]=f'SWAP{i}'
[codex:281657] for i in range(0,5):
[codex:281657]     opnames[0xa0+i]=f'LOG{i}'
[codex:281657] 
[codex:281657] 
[codex:281657] def disasm(start, end):
[codex:281657]     i=start
[codex:281657]     out=[]
[codex:281657]     while i<end and i<len(bytecode):
[codex:281657]         op=bytecode[i]
[codex:281657]         name=opnames.get(op, f'OP{op:02x}')
[codex:281657]         if 0x60 <= op <= 0x7f:
[codex:281657]             n=op-0x5f
[codex:281657]             data=bytecode[i+1:i+1+n]
[codex:281657]             out.append((i, f'PUSH{n}', data.hex()))
[codex:281657]             i += 1+n
[codex:281657]         else:
[codex:281657]             out.append((i, name, ''))
[codex:281657]             i += 1
[codex:281657]     return out
[codex:281657] 
[codex:281657] for off, name, data in disasm(0x1db9, 0x1e40):
[codex:281657]     if data:
[codex:281657]         print(f\"{off:04x}: {name} 0x{data}\")
[codex:281657]     else:
[codex:281657]         print(f\"{off:04x}: {name}\")
[codex:281657] PY" in /tmp/codex-multi-q6dbli10 succeeded in 28ms:
[codex:281657] 1db9: JUMPDEST
[codex:281657] 1dba: PUSH1 0x00
[codex:281657] 1dbc: DUP4
[codex:281657] 1dbd: PUSH1 0x00
[codex:281657] 1dbf: DUP2
[codex:281657] 1dc0: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
[codex:281657] 1dd5: AND
[codex:281657] 1dd6: EQ
[codex:281657] 1dd7: ISZERO
[codex:281657] 1dd8: PUSH2 0x1de0
[codex:281657] 1ddb: JUMPI
[codex:281657] 1ddc: PUSH2 0x0000
[codex:281657] 1ddf: JUMP
[codex:281657] 1de0: JUMPDEST
[codex:281657] 1de1: PUSH1 0x06
[codex:281657] 1de3: SLOAD
[codex:281657] 1de4: SWAP2
[codex:281657] 1de5: POP
[codex:281657] 1de6: PUSH1 0x80
[codex:281657] 1de8: PUSH1 0x40
[codex:281657] 
[codex:281657] thinking
[codex:281657] **Continuing exploration**
[codex:281657] exec
[codex:281657] /bin/bash -lc "python - <<'PY'
[codex:281657] import re
[codex:281657] from pathlib import Path
[codex:281657] hexdata=Path('BYTECODE_BUNDLE.txt').read_text()
[codex:281657] code=re.search(r'0x([0-9a-fA-F]+)', hexdata).group(1)
[codex:281657] bytecode=bytes.fromhex(code)
[codex:281657] 
[codex:281657] opnames={
[codex:281657]     0x00:'STOP',0x01:'ADD',0x02:'MUL',0x03:'SUB',0x04:'DIV',0x05:'SDIV',0x06:'MOD',0x07:'SMOD',0x08:'ADDMOD',0x09:'MULMOD',0x0a:'EXP',0x0b:'SIGNEXTEND',
[codex:281657]     0x10:'LT',0x11:'GT',0x12:'SLT',0x13:'SGT',0x14:'EQ',0x15:'ISZERO',0x16:'AND',0x17:'OR',0x18:'XOR',0x19:'NOT',0x1a:'BYTE',0x1b:'SHL',0x1c:'SHR',0x1d:'SAR',
[codex:281657]     0x20:'SHA3',
[codex:281657]     0x30:'ADDRESS',0x31:'BALANCE',0x32:'ORIGIN',0x33:'CALLER',0x34:'CALLVALUE',0x35:'CALLDATALOAD',0x36:'CALLDATASIZE',0x37:'CALLDATACOPY',0x38:'CODESIZE',0x39:'CODECOPY',0x3a:'GASPRICE',0x3b:'EXTCODESIZE',0x3c:'EXTCODECOPY',0x3d:'RETURNDATASIZE',0x3e:'RETURNDATACOPY',0x3f:'EXTCODEHASH',
[codex:281657]     0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x46:'CHAINID',0x47:'SELFBALANCE',0x48:'BASEFEE',
[codex:281657]     0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x53:'MSTORE8',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x58:'PC',0x59:'MSIZE',0x5a:'GAS',0x5b:'JUMPDEST',
[codex:281657]     0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'
[codex:281657] }
[codex:281657] for i in range(1,17):
[codex:281657]     opnames[0x7f+i]=f'DUP{i}'
[codex:281657] for i in range(1,17):
[codex:281657]     opnames[0x8f+i]=f'SWAP{i}'
[codex:281657] for i in range(0,5):
[codex:281657]     opnames[0xa0+i]=f'LOG{i}'
[codex:281657] 
[codex:281657] 
[codex:281657] def disasm(start, end):
[codex:281657]     i=start
[codex:281657]     out=[]
[codex:281657]     while i<end and i<len(bytecode):
[codex:281657]         op=bytecode[i]
[codex:281657]         name=opnames.get(op, f'OP{op:02x}')
[codex:281657]         if 0x60 <= op <= 0x7f:
[codex:281657]             n=op-0x5f
[codex:281657]             data=bytecode[i+1:i+1+n]
[codex:281657]             out.append((i, f'PUSH{n}', data.hex()))
[codex:281657]             i += 1+n
[codex:281657]         else:
[codex:281657]             out.append((i, name, ''))
[codex:281657]             i += 1
[codex:281657]     return out
[codex:281657] 
[codex:281657] for off, name, data in disasm(0x1e3f, 0x1ec0):
[codex:281657]     if data:
[codex:281657]         print(f\"{off:04x}: {name} 0x{data}\")
[codex:281657]     else:
[codex:281657]         print(f\"{off:04x}: {name}\")
[codex:281657] PY" in /tmp/codex-multi-q6dbli10 succeeded in 30ms:
[codex:281657] 1e3f: PUSH2 0x0100
[codex:281657] 1e42: EXP
[codex:281657] 1e43: DUP2
[codex:281657] 1e44: SLOAD
[codex:281657] 1e45: DUP2
[codex:281657] 1e46: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
[codex:281657] 1e5b: MUL
[codex:281657] 1e5c: NOT
[codex:281657] 1e5d: AND
[codex:281657] 1e5e: SWAP1
[codex:281657] 1e5f: DUP4
[codex:281657] 1e60: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
[codex:281657] 1e75: AND
[codex:281657] 1e76: MUL
[codex:281657] 1e77: OR
[codex:281657] 1e78: SWAP1
[codex:281657] 1e79: SSTORE
[codex:281657] 1e7a: POP
[codex:281657] 1e7b: PUSH1 0x20
[codex:281657] 1e7d: DUP3
[codex:281657] 
[codex:281657] thinking
[codex:281657] **Proceeding with next steps**
[codex:281657] exec
[codex:281657] /bin/bash -lc "python - <<'PY'
[codex:281657] import re
[codex:281657] from pathlib import Path
[codex:281657] hexdata=Path('BYTECODE_BUNDLE.txt').read_text()
[codex:281657] code=re.search(r'0x([0-9a-fA-F]+)', hexdata).group(1)
[codex:281657] bytecode=bytes.fromhex(code)
[codex:281657] 
[codex:281657] opnames={
[codex:281657]     0x00:'STOP',0x01:'ADD',0x02:'MUL',0x03:'SUB',0x04:'DIV',0x05:'SDIV',0x06:'MOD',0x07:'SMOD',0x08:'ADDMOD',0x09:'MULMOD',0x0a:'EXP',0x0b:'SIGNEXTEND',
[codex:281657]     0x10:'LT',0x11:'GT',0x12:'SLT',0x13:'SGT',0x14:'EQ',0x15:'ISZERO',0x16:'AND',0x17:'OR',0x18:'XOR',0x19:'NOT',0x1a:'BYTE',0x1b:'SHL',0x1c:'SHR',0x1d:'SAR',
[codex:281657]     0x20:'SHA3',
[codex:281657]     0x30:'ADDRESS',0x31:'BALANCE',0x32:'ORIGIN',0x33:'CALLER',0x34:'CALLVALUE',0x35:'CALLDATALOAD',0x36:'CALLDATASIZE',0x37:'CALLDATACOPY',0x38:'CODESIZE',0x39:'CODECOPY',0x3a:'GASPRICE',0x3b:'EXTCODESIZE',0x3c:'EXTCODECOPY',0x3d:'RETURNDATASIZE',0x3e:'RETURNDATACOPY',0x3f:'EXTCODEHASH',
[codex:281657]     0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x46:'CHAINID',0x47:'SELFBALANCE',0x48:'BASEFEE',
[codex:281657]     0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x53:'MSTORE8',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x58:'PC',0x59:'MSIZE',0x5a:'GAS',0x5b:'JUMPDEST',
[codex:281657]     0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'
[codex:281657] }
[codex:281657] for i in range(1,17):
[codex:281657]     opnames[0x7f+i]=f'DUP{i}'
[codex:281657] for i in range(1,17):
[codex:281657]     opnames[0x8f+i]=f'SWAP{i}'
[codex:281657] for i in range(0,5):
[codex:281657]     opnames[0xa0+i]=f'LOG{i}'
[codex:281657] 
[codex:281657] 
[codex:281657] def disasm(start, end):
[codex:281657]     i=start
[codex:281657]     out=[]
[codex:281657]     while i<end and i<len(bytecode):
[codex:281657]         op=bytecode[i]
[codex:281657]         name=opnames.get(op, f'OP{op:02x}')
[codex:281657]         if 0x60 <= op <= 0x7f:
[codex:281657]             n=op-0x5f
[codex:281657]             data=bytecode[i+1:i+1+n]
[codex:281657]             out.append((i, f'PUSH{n}', data.hex()))
[codex:281657]             i += 1+n
[codex:281657]         else:
[codex:281657]             out.append((i, name, ''))
[codex:281657]             i += 1
[codex:281657]     return out
[codex:281657] 
[codex:281657] for off, name, data in disasm(0x1ebf, 0x1f40):
[codex:281657]     if data:
[codex:281657]         print(f\"{off:04x}: {name} 0x{data}\")
[codex:281657]     else:
[codex:281657]         print(f\"{off:04x}: {name}\")
[codex:281657] PY" in /tmp/codex-multi-q6dbli10 succeeded in 29ms:
[codex:281657] 1ebf: PUSH1 0x1f
[codex:281657] 1ec1: LT
[codex:281657] 1ec2: PUSH2 0x1ed6
[codex:281657] 1ec5: JUMPI
[codex:281657] 1ec6: DUP1
[codex:281657] 1ec7: MLOAD
[codex:281657] 1ec8: PUSH1 0xff
[codex:281657] 1eca: NOT
[codex:281657] 1ecb: AND
[codex:281657] 1ecc: DUP4
[codex:281657] 1ecd: DUP1
[codex:281657] 1ece: ADD
[codex:281657] 1ecf: OR
[codex:281657] 1ed0: DUP6
[codex:281657] 1ed1: SSTORE
[codex:281657] 1ed2: PUSH2 0x1f04
[codex:281657] 1ed5: JUMP
[codex:281657] 1ed6: JUMPDEST
[codex:281657] 1ed7: DUP3
[codex:281657] 1ed8: DUP1
[codex:281657] 
[codex:281657] thinking
[codex:281657] **Analyzing function call and flow**
[codex:281657] exec
[codex:281657] /bin/bash -lc "python - <<'PY'
[codex:281657] import re
[codex:281657] from pathlib import Path
[codex:281657] hexdata=Path('BYTECODE_BUNDLE.txt').read_text()
[codex:281657] code=re.search(r'0x([0-9a-fA-F]+)', hexdata).group(1)
[codex:281657] bytecode=bytes.fromhex(code)
[codex:281657] 
[codex:281657] opnames={
[codex:281657]     0x00:'STOP',0x01:'ADD',0x02:'MUL',0x03:'SUB',0x04:'DIV',0x05:'SDIV',0x06:'MOD',0x07:'SMOD',0x08:'ADDMOD',0x09:'MULMOD',0x0a:'EXP',0x0b:'SIGNEXTEND',
[codex:281657]     0x10:'LT',0x11:'GT',0x12:'SLT',0x13:'SGT',0x14:'EQ',0x15:'ISZERO',0x16:'AND',0x17:'OR',0x18:'XOR',0x19:'NOT',0x1a:'BYTE',0x1b:'SHL',0x1c:'SHR',0x1d:'SAR',
[codex:281657]     0x20:'SHA3',
[codex:281657]     0x30:'ADDRESS',0x31:'BALANCE',0x32:'ORIGIN',0x33:'CALLER',0x34:'CALLVALUE',0x35:'CALLDATALOAD',0x36:'CALLDATASIZE',0x37:'CALLDATACOPY',0x38:'CODESIZE',0x39:'CODECOPY',0x3a:'GASPRICE',0x3b:'EXTCODESIZE',0x3c:'EXTCODECOPY',0x3d:'RETURNDATASIZE',0x3e:'RETURNDATACOPY',0x3f:'EXTCODEHASH',
[codex:281657]     0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x46:'CHAINID',0x47:'SELFBALANCE',0x48:'BASEFEE',
[codex:281657]     0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x53:'MSTORE8',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x58:'PC',0x59:'MSIZE',0x5a:'GAS',0x5b:'JUMPDEST',
[codex:281657]     0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'
[codex:281657] }
[codex:281657] for i in range(1,17):
[codex:281657]     opnames[0x7f+i]=f'DUP{i}'
[codex:281657] for i in range(1,17):
[codex:281657]     opnames[0x8f+i]=f'SWAP{i}'
[codex:281657] for i in range(0,5):
[codex:281657]     opnames[0xa0+i]=f'LOG{i}'
[codex:281657] 
[codex:281657] 
[codex:281657] def disasm(start, end):
[codex:281657]     i=start
[codex:281657]     out=[]
[codex:281657]     while i<end and i<len(bytecode):
[codex:281657]         op=bytecode[i]
[codex:281657]         name=opnames.get(op, f'OP{op:02x}')
[codex:281657]         if 0x60 <= op <= 0x7f:
[codex:281657]             n=op-0x5f
[codex:281657]             data=bytecode[i+1:i+1+n]
[codex:281657]             out.append((i, f'PUSH{n}', data.hex()))
[codex:281657]             i += 1+n
[codex:281657]         else:
[codex:281657]             out.append((i, name, ''))
[codex:281657]             i += 1
[codex:281657]     return out
[codex:281657] 
[codex:281657] for off, name, data in disasm(0x1bf5, 0x1db2):
[codex:281657]     if data:
[codex:281657]         print(f\"{off:04x}: {name} 0x{data}\")
[codex:281657]     else:
[codex:281657]         print(f\"{off:04x}: {name}\")
[codex:281657] PY" in /tmp/codex-multi-q6dbli10 succeeded in 29ms:
[codex:281657] 1bf5: JUMPDEST
[codex:281657] 1bf6: PUSH1 0x00
[codex:281657] 1bf8: DUP2
[codex:281657] 1bf9: PUSH1 0x01
[codex:281657] 1bfb: PUSH1 0x00
[codex:281657] 1bfd: DUP3
[codex:281657] 1bfe: DUP2
[codex:281657] 1bff: MSTORE
[codex:281657] 1c00: PUSH1 0x20
[codex:281657] 1c02: ADD
[codex:281657] 1c03: SWAP1
[codex:281657] 1c04: DUP2
[codex:281657] 1c05: MSTORE
[codex:281657] 1c06: PUSH1 0x20
[codex:281657] 1c08: ADD
[codex:281657] 1c09: PUSH1 0x00
[codex:281657] 1c0b: SHA3
[codex:281657] 1c0c: PUSH1 0x03
[codex:281657] 1c0e: ADD
[codex:281657] 1c0f: PUSH1 0x00
[codex:281657] 
[codex:281657] thinking
[codex:281657] **Analyzing internal function and storage mapping**
[codex:281657] exec
[codex:281657] /bin/bash -lc "python - <<'PY'
[codex:281657] import re
[codex:281657] from pathlib import Path
[codex:281657] hexdata=Path('BYTECODE_BUNDLE.txt').read_text()
[codex:281657] code=re.search(r'0x([0-9a-fA-F]+)', hexdata).group(1)
[codex:281657] bytecode=bytes.fromhex(code)
[codex:281657] 
[codex:281657] opnames={
[codex:281657]     0x00:'STOP',0x01:'ADD',0x02:'MUL',0x03:'SUB',0x04:'DIV',0x05:'SDIV',0x06:'MOD',0x07:'SMOD',0x08:'ADDMOD',0x09:'MULMOD',0x0a:'EXP',0x0b:'SIGNEXTEND',
[codex:281657]     0x10:'LT',0x11:'GT',0x12:'SLT',0x13:'SGT',0x14:'EQ',0x15:'ISZERO',0x16:'AND',0x17:'OR',0x18:'XOR',0x19:'NOT',0x1a:'BYTE',0x1b:'SHL',0x1c:'SHR',0x1d:'SAR',
[codex:281657]     0x20:'SHA3',
[codex:281657]     0x30:'ADDRESS',0x31:'BALANCE',0x32:'ORIGIN',0x33:'CALLER',0x34:'CALLVALUE',0x35:'CALLDATALOAD',0x36:'CALLDATASIZE',0x37:'CALLDATACOPY',0x38:'CODESIZE',0x39:'CODECOPY',0x3a:'GASPRICE',0x3b:'EXTCODESIZE',0x3c:'EXTCODECOPY',0x3d:'RETURNDATASIZE',0x3e:'RETURNDATACOPY',0x3f:'EXTCODEHASH',
[codex:281657]     0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x46:'CHAINID',0x47:'SELFBALANCE',0x48:'BASEFEE',
[codex:281657]     0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x53:'MSTORE8',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x58:'PC',0x59:'MSIZE',0x5a:'GAS',0x5b:'JUMPDEST',
[codex:281657]     0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'
[codex:281657] }
[codex:281657] for i in range(1,17):
[codex:281657]     opnames[0x7f+i]=f'DUP{i}'
[codex:281657] for i in range(1,17):
[codex:281657]     opnames[0x8f+i]=f'SWAP{i}'
[codex:281657] for i in range(0,5):
[codex:281657]     opnames[0xa0+i]=f'LOG{i}'
[codex:281657] 
[codex:281657] 
[codex:281657] def disasm(start, end):
[codex:281657]     i=start
[codex:281657]     out=[]
[codex:281657]     while i<end and i<len(bytecode):
[codex:281657]         op=bytecode[i]
[codex:281657]         name=opnames.get(op, f'OP{op:02x}')
[codex:281657]         if 0x60 <= op <= 0x7f:
[codex:281657]             n=op-0x5f
[codex:281657]             data=bytecode[i+1:i+1+n]
[codex:281657]             out.append((i, f'PUSH{n}', data.hex()))
[codex:281657]             i += 1+n
[codex:281657]         else:
[codex:281657]             out.append((i, name, ''))
[codex:281657]             i += 1
[codex:281657]     return out
[codex:281657] 
[codex:281657] for off, name, data in disasm(0x1b60, 0x1bcf):
[codex:281657]     if data:
[codex:281657]         print(f\"{off:04x}: {name} 0x{data}\")
[codex:281657]     else:
[codex:281657]         print(f\"{off:04x}: {name}\")
[codex:281657] PY" in /tmp/codex-multi-q6dbli10 succeeded in 27ms:
[codex:281657] 1b60: SLOAD
[codex:281657] 1b61: DUP2
[codex:281657] 1b62: PUSH1 0xff
[codex:281657] 1b64: MUL
[codex:281657] 1b65: NOT
[codex:281657] 1b66: AND
[codex:281657] 1b67: SWAP1
[codex:281657] 1b68: DUP4
[codex:281657] 1b69: ISZERO
[codex:281657] 1b6a: ISZERO
[codex:281657] 1b6b: MUL
[codex:281657] 1b6c: OR
[codex:281657] 1b6d: SWAP1
[codex:281657] 1b6e: SSTORE
[codex:281657] 1b6f: POP
[codex:281657] 1b70: DUP5
[codex:281657] 1b71: CALLER
[codex:281657] 1b72: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
[codex:281657] 1b87: AND
[codex:281657] 1b88: PUSH32 0x4a504a94899432a9846e1aa406dceb1bcfd538bb839071d49d1e5e23f5be30ef
[codex:281657] 
[codex:281657] thinking
[codex:281657] **Analyzing EVM stack and call arguments**
[codex:281657] 
[codex:281657] I'm examining an EVM function's stack behavior to determine how call arguments like `to` and `value` are passed. The plan includes simulating stack operations symbolically from key offsets to figure out the precise arrangement before the CALL opcode, which involves tracking deep DUP instructions and conditional jumps to reconstruct function parameters safely.
[codex:281657] exec
[codex:281657] /bin/bash -lc "python - <<'PY'
[codex:281657] # simulate stack from 1d15 to CALL
[codex:281657] stack = [f's{i}' for i in range(10)]  # s0 bottom, s9 top
[codex:281657] 
[codex:281657] def push(x):
[codex:281657]     stack.append(x)
[codex:281657] 
[codex:281657] def pop():
[codex:281657]     return stack.pop()
[codex:281657] 
[codex:281657] def dup(n):
[codex:281657]     # n=1 duplicates top
[codex:281657]     stack.append(stack[-n])
[codex:281657] 
[codex:281657] def swap(n):
[codex:281657]     # swap top with nth item
[codex:281657]     stack[-1], stack[-1-n] = stack[-1-n], stack[-1]
[codex:281657] 
[codex:281657] # simulate sequence
[codex:281657] push('0')        # PUSH1 0x00
[codex:281657] push('0x40')     # PUSH1 0x40
[codex:281657] # MLOAD
[codex:281657] ptr = pop()
[codex:281657] push(f'MLOAD({ptr})')
[codex:281657] # DUP1
[codex:281657] dup(1)
[codex:281657] # DUP4
[codex:281657] dup(4)
[codex:281657] # SUB
[codex:281657] b = pop(); a = pop(); push(f'({a}-{b})')
[codex:281657] # DUP2
[codex:281657] dup(2)
[codex:281657] # DUP6
[codex:281657] dup(6)
[codex:281657] # DUP8
[codex:281657] dup(8)
[codex:281657] # PUSH2 0x8502
[codex:281657] push('0x8502')
[codex:281657] # GAS
[codex:281657] push('GAS')
[codex:281657] # SUB
[codex:281657] b = pop(); a = pop(); push(f'({a}-{b})')
[codex:281657] 
[codex:281657] print('stack before CALL (top last):')
[codex:281657] for i, val in enumerate(stack):
[codex:281657]     print(i, val)
[codex:281657] 
[codex:281657] # Determine CALL args: gas, to, value, inOffset, inSize, outOffset, outSize
[codex:281657] # They are popped in that order from top
[codex:281657] args = [pop() for _ in range(7)]
[codex:281657] print('CALL args (gas,to,value,inOffset,inSize,outOffset,outSize) from top):')
[codex:281657] print(args)
[codex:281657] PY" in /tmp/codex-multi-q6dbli10 succeeded in 21ms:
[codex:281657] stack before CALL (top last):
[codex:281657] 0 s0
[codex:281657] 1 s1
[codex:281657] 2 s2
[codex:281657] 3 s3
[codex:281657] 4 s4
[codex:281657] 5 s5
[codex:281657] 6 s6
[codex:281657] 7 s7
[codex:281657] 8 s8
[codex:281657] 9 s9
[codex:281657] 10 0
[codex:281657] 11 MLOAD(0x40)
[codex:281657] 12 (MLOAD(0x40)-s9)
[codex:281657] 13 MLOAD(0x40)
[codex:281657] 14 s8
[codex:281657] 15 s7
[codex:281657] 16 (0x8502-GAS)
[codex:281657] CALL args (gas,to,value,inOffset,inSize,outOffset,outSize) from top):
[codex:281657] ['(0x8502-GAS)', 's7', 's8', 'MLOAD(0x40)', '(MLOAD(0x40)-s9)', 'MLOAD(0x40)', '0']
[codex:281657] 
[codex:281657] thinking
[codex:281657] **Clarifying EVM SUB operand order**
[codex:281657] exec
[codex:281657] /bin/bash -lc "python - <<'PY'
[codex:281657] stack = [f's{i}' for i in range(10)]
[codex:281657] 
[codex:281657] def push(x):
[codex:281657]     stack.append(x)
[codex:281657] 
[codex:281657] def pop():
[codex:281657]     return stack.pop()
[codex:281657] 
[codex:281657] def dup(n):
[codex:281657]     stack.append(stack[-n])
[codex:281657] 
[codex:281657] def sub():
[codex:281657]     a = pop(); b = pop(); push(f'({a}-{b})')
[codex:281657] 
[codex:281657] push('0')
[codex:281657] push('0x40')
[codex:281657] ptr = pop(); push(f'MLOAD({ptr})')
[codex:281657] dup(1)
[codex:281657] dup(4)
[codex:281657] sub()
[codex:281657] dup(2)
[codex:281657] dup(6)
[codex:281657] dup(8)
[codex:281657] push('0x8502')
[codex:281657] push('GAS')
[codex:281657] sub()
[codex:281657] 
[codex:281657] print('stack before CALL (top last):')
[codex:281657] for i, val in enumerate(stack):
[codex:281657]     print(i, val)
[codex:281657] 
[codex:281657] # gather args
[codex:281657] args = [pop() for _ in range(7)]
[codex:281657] print('CALL args (gas,to,value,inOffset,inSize,outOffset,outSize) from top):')
[codex:281657] print(args)
[codex:281657] PY" in /tmp/codex-multi-q6dbli10 succeeded in 25ms:
[codex:281657] stack before CALL (top last):
[codex:281657] 0 s0
[codex:281657] 1 s1
[codex:281657] 2 s2
[codex:281657] 3 s3
[codex:281657] 4 s4
[codex:281657] 5 s5
[codex:281657] 6 s6
[codex:281657] 7 s7
[codex:281657] 8 s8
[codex:281657] 9 s9
[codex:281657] 10 0
[codex:281657] 11 MLOAD(0x40)
[codex:281657] 12 (s9-MLOAD(0x40))
[codex:281657] 13 MLOAD(0x40)
[codex:281657] 14 s8
[codex:281657] 15 s7
[codex:281657] 16 (GAS-0x8502)
[codex:281657] CALL args (gas,to,value,inOffset,inSize,outOffset,outSize) from top):
[codex:281657] ['(GAS-0x8502)', 's7', 's8', 'MLOAD(0x40)', '(s9-MLOAD(0x40))', 'MLOAD(0x40)', '0']
[codex:281657] 
[codex:281657] thinking
[codex:281657] **Analyzing stack and call parameters**
[codex:281657] exec
[codex:281657] /bin/bash -lc "python - <<'PY'
[codex:281657] import re
[codex:281657] from pathlib import Path
[codex:281657] hexdata=Path('BYTECODE_BUNDLE.txt').read_text()
[codex:281657] code=re.search(r'0x([0-9a-fA-F]+)', hexdata).group(1)
[codex:281657] bytecode=bytes.fromhex(code)
[codex:281657] 
[codex:281657] # instruction decoding
[codex:281657] 
[codex:281657] def decode(pc):
[codex:281657]     op = bytecode[pc]
[codex:281657]     if 0x60 <= op <= 0x7f:
[codex:281657]         n = op - 0x5f
[codex:281657]         data = bytecode[pc+1:pc+1+n]
[codex:281657]         return (op, data, pc+1+n)
[codex:281657]     else:
[codex:281657]         return (op, None, pc+1)
[codex:281657] 
[codex:281657] # symbolic helpers
[codex:281657] 
[codex:281657] counter = 0
[codex:281657] 
[codex:281657] def sym(name):
[codex:281657]     global counter
[codex:281657]     counter += 1
[codex:281657]     return f'{name}{counter}'
[codex:281657] 
[codex:281657] # initial stack with placeholders
[codex:281657] # assume 6 items (args + ret), but may be more. Use 10 placeholders to be safe.
[codex:281657] stack = [f'S{i}' for i in range(10)]  # S0 bottom, S9 top
[codex:281657] mem = {}
[codex:281657] 
[codex:281657] # branch decisions: pc -> True (jump) or False (fall-through)
[codex:281657] branch = {
[codex:281657]     0x1c1e: True,   # JUMPI to 0x1c26
[codex:281657]     0x1c31: False,  # do not jump to 0x1db2
[codex:281657]     0x1cc5: True,   # jump to 0x1d0f (length==0)
[codex:281657] }
[codex:281657] 
[codex:281657] # execute
[codex:281657] pc = 0x1bf5
[codex:281657] steps = 0
[codex:281657] 
[codex:281657] # opcodes
[codex:281657] 
[codex:281657] while pc < 0x1d15 and steps < 10000:
[codex:281657]     steps += 1
[codex:281657]     op, data, next_pc = decode(pc)
[codex:281657]     # PUSH
[codex:281657]     if 0x60 <= op <= 0x7f:
[codex:281657]         val = int.from_bytes(data, 'big')
[codex:281657]         stack.append(f'0x{val:x}')
[codex:281657]         pc = next_pc
[codex:281657]         continue
[codex:281657]     # DUP
[codex:281657]     if 0x80 <= op <= 0x8f:
[codex:281657]         n = op - 0x7f
[codex:281657]         stack.append(stack[-n])
[codex:281657]         pc = next_pc
[codex:281657]         continue
[codex:281657]     # SWAP
[codex:281657]     if 0x90 <= op <= 0x9f:
[codex:281657]         n = op - 0x8f
[codex:281657]         stack[-1], stack[-1-n] = stack[-1-n], stack[-1]
[codex:281657]         pc = next_pc
[codex:281657]         continue
[codex:281657]     # basic ops
[codex:281657]     def pop():
[codex:281657]         return stack.pop()
[codex:281657]     def push(x):
[codex:281657]         stack.append(x)
[codex:281657] 
[codex:281657]     if op == 0x50:  # POP
[codex:281657]         pop(); pc = next_pc; continue
[codex:281657]     if op == 0x01:  # ADD
[codex:281657]         a=pop(); b=pop(); push(f'({a}+{b})'); pc=next_pc; continue
[codex:281657]     if op == 0x02:  # MUL
[codex:281657]         a=pop(); b=pop(); push(f'({a}*{b})'); pc=next_pc; continue
[codex:281657]     if op == 0x03:  # SUB
[codex:281657]         a=pop(); b=pop(); push(f'({a}-{b})'); pc=next_pc; continue
[codex:281657]     if op == 0x04:  # DIV
[codex:281657]         a=pop(); b=pop(); push(f'({a}/{b})'); pc=next_pc; continue
[codex:281657]     if op == 0x10:  # LT
[codex:281657]         a=pop(); b=pop(); push(f'({a}<{b})'); pc=next_pc; continue
[codex:281657]     if op == 0x11:  # GT
[codex:281657]         a=pop(); b=pop(); push(f'({a}>{b})'); pc=next_pc; continue
[codex:281657]     if op == 0x14:  # EQ
[codex:281657]         a=pop(); b=pop(); push(f'({a}=={b})'); pc=next_pc; continue
[codex:281657]     if op == 0x15:  # ISZERO
[codex:281657]         a=pop(); push(f'ISZERO({a})'); pc=next_pc; continue
[codex:281657]     if op == 0x16:  # AND
[codex:281657]         a=pop(); b=pop(); push(f'({a}&{b})'); pc=next_pc; continue
[codex:281657]     if op == 0x17:  # OR
[codex:281657]         a=pop(); b=pop(); push(f'({a}|{b})'); pc=next_pc; continue
[codex:281657]     if op == 0x19:  # NOT
[codex:281657]         a=pop(); push(f'NOT({a})'); pc=next_pc; continue
[codex:281657]     if op == 0x20:  # SHA3
[codex:281657]         a=pop(); b=pop(); push(f'keccak({a},{b})'); pc=next_pc; continue
[codex:281657]     if op == 0x51:  # MLOAD
[codex:281657]         a=pop(); push(mem.get(a, f'MLOAD({a})')); pc=next_pc; continue
[codex:281657]     if op == 0x52:  # MSTORE
[codex:281657]         a=pop(); b=pop(); mem[a]=b; pc=next_pc; continue
[codex:281657]     if op == 0x54:  # SLOAD
[codex:281657]         a=pop(); push(f'SLOAD({a})'); pc=next_pc; continue
[codex:281657]     if op == 0x55:  # SSTORE
[codex:281657]         a=pop(); b=pop(); # ignore
[codex:281657]         pc=next_pc; continue
[codex:281657]     if op == 0x56:  # JUMP
[codex:281657]         dest = pop()
[codex:281657]         # if dest is literal hex string, jump
[codex:281657]         if dest.startswith('0x'):
[codex:281657]             pc = int(dest, 16)
[codex:281657]         else:
[codex:281657]             # unknown dest; stop
[codex:281657]             print('Unknown JUMP dest', dest)
[codex:281657]             break
[codex:281657]         continue
[codex:281657]     if op == 0x57:  # JUMPI
[codex:281657]         dest = pop(); cond = pop()
[codex:281657]         # choose branch if specified
[codex:281657]         take = branch.get(pc, False)
[codex:281657]         if take:
[codex:281657]             if dest.startswith('0x'):
[codex:281657]                 pc = int(dest, 16)
[codex:281657]             else:
[codex:281657]                 print('Unknown JUMPI dest', dest)
[codex:281657]                 break
[codex:281657]         else:
[codex:281657]             pc = next_pc
[codex:281657]         continue
[codex:281657]     if op == 0x5b:  # JUMPDEST
[codex:281657]         pc = next_pc; continue
[codex:281657] 
[codex:281657]     # for other ops, just push unknown
[codex:281657]     push(f'OP{op:02x}')
[codex:281657]     pc = next_pc
[codex:281657] 
[codex:281657] print('Stopped at pc', hex(pc), 'steps', steps)
[codex:281657] print('Stack size', len(stack))
[codex:281657] print('Top 15 stack items:')
[codex:281657] for val in stack[-15:]:
[codex:281657]     print(val)
[codex:281657] PY" in /tmp/codex-multi-q6dbli10 succeeded in 31ms:
[codex:281657] Unknown JUMP dest OPa2
[codex:281657] Stopped at pc 0x179 steps 188
[codex:281657] Stack size 21
[codex:281657] Top 15 stack items:
[codex:281657] S6
[codex:281657] S7
[codex:281657] S8
[codex:281657] S9
[codex:281657] 0x0
[codex:281657] S9
[codex:281657] SLOAD((0x3+keccak(0x0,(0x20+(0x20+0x0)))))
[codex:281657] 0x0
[codex:281657] 0x0
[codex:281657] (0xffffffff&(OP35/0x100000000000000000000000000000000000000000000000000000000))
[codex:281657] 0x17a
[codex:281657] (0xffffffffffffffffffffffffffffffffffffffff&OP33)
[codex:281657] 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c
[codex:281657] ((0x20+0x60)-0x60)
[codex:281657] 0x60
[codex:281657] 
[codex:281657] thinking
[codex:281657] **Analyzing opcode handling issues in simulation**
[codex:281657] 
[codex:281657] I’m figuring out that the simulation’s unexpected jump destination comes from incorrectly handling certain opcodes like EXP and LOG variants—treating unknown ops as pushes is messing up the stack and control flow. To fix this, I’ll implement the missing opcodes with proper stack effects, especially EXP, and then rerun to see if the interpreter stays on the right path.
[codex:281657] exec
[codex:281657] /bin/bash -lc "python - <<'PY'
[codex:281657] import re
[codex:281657] from pathlib import Path
[codex:281657] hexdata=Path('BYTECODE_BUNDLE.txt').read_text()
[codex:281657] code=re.search(r'0x([0-9a-fA-F]+)', hexdata).group(1)
[codex:281657] bytecode=bytes.fromhex(code)
[codex:281657] 
[codex:281657] # decode
[codex:281657] 
[codex:281657] def decode(pc):
[codex:281657]     op = bytecode[pc]
[codex:281657]     if 0x60 <= op <= 0x7f:
[codex:281657]         n = op - 0x5f
[codex:281657]         data = bytecode[pc+1:pc+1+n]
[codex:281657]         return (op, data, pc+1+n)
[codex:281657]     else:
[codex:281657]         return (op, None, pc+1)
[codex:281657] 
[codex:281657] # initial stack placeholders
[codex:281657] stack = [f'S{i}' for i in range(10)]
[codex:281657] mem = {}
[codex:281657] 
[codex:281657] branch = {
[codex:281657]     0x1c1e: True,
[codex:281657]     0x1c31: False,
[codex:281657]     0x1cc5: True,
[codex:281657] }
[codex:281657] 
[codex:281657] pc = 0x1bf5
[codex:281657] steps = 0
[codex:281657] 
[codex:281657] 
[codex:281657] def pop():
[codex:281657]     return stack.pop()
[codex:281657] 
[codex:281657] def push(x):
[codex:281657]     stack.append(x)
[codex:281657] 
[codex:281657] while pc < 0x1d15 and steps < 10000:
[codex:281657]     steps += 1
[codex:281657]     op, data, next_pc = decode(pc)
[codex:281657]     # PUSH
[codex:281657]     if 0x60 <= op <= 0x7f:
[codex:281657]         val = int.from_bytes(data, 'big')
[codex:281657]         push(f'0x{val:x}')
[codex:281657]         pc = next_pc
[codex:281657]         continue
[codex:281657]     # DUP
[codex:281657]     if 0x80 <= op <= 0x8f:
[codex:281657]         n = op - 0x7f
[codex:281657]         push(stack[-n])
[codex:281657]         pc = next_pc
[codex:281657]         continue
[codex:281657]     # SWAP
[codex:281657]     if 0x90 <= op <= 0x9f:
[codex:281657]         n = op - 0x8f
[codex:281657]         stack[-1], stack[-1-n] = stack[-1-n], stack[-1]
[codex:281657]         pc = next_pc
[codex:281657]         continue
[codex:281657] 
[codex:281657]     # operations
[codex:281657]     if op == 0x50:  # POP
[codex:281657]         pop(); pc=next_pc; continue
[codex:281657]     if op == 0x01:  # ADD
[codex:281657]         a=pop(); b=pop(); push(f'({a}+{b})'); pc=next_pc; continue
[codex:281657]     if op == 0x02:  # MUL
[codex:281657]         a=pop(); b=pop(); push(f'({a}*{b})'); pc=next_pc; continue
[codex:281657]     if op == 0x03:  # SUB
[codex:281657]         a=pop(); b=pop(); push(f'({a}-{b})'); pc=next_pc; continue
[codex:281657]     if op == 0x04:  # DIV
[codex:281657]         a=pop(); b=pop(); push(f'({a}/{b})'); pc=next_pc; continue
[codex:281657]     if op == 0x0a:  # EXP
[codex:281657]         a=pop(); b=pop(); push(f'({a}**{b})'); pc=next_pc; continue
[codex:281657]     if op == 0x10:  # LT
[codex:281657]         a=pop(); b=pop(); push(f'({a}<{b})'); pc=next_pc; continue
[codex:281657]     if op == 0x11:  # GT
[codex:281657]         a=pop(); b=pop(); push(f'({a}>{b})'); pc=next_pc; continue
[codex:281657]     if op == 0x14:  # EQ
[codex:281657]         a=pop(); b=pop(); push(f'({a}=={b})'); pc=next_pc; continue
[codex:281657]     if op == 0x15:  # ISZERO
[codex:281657]         a=pop(); push(f'ISZERO({a})'); pc=next_pc; continue
[codex:281657]     if op == 0x16:  # AND
[codex:281657]         a=pop(); b=pop(); push(f'({a}&{b})'); pc=next_pc; continue
[codex:281657]     if op == 0x17:  # OR
[codex:281657]         a=pop(); b=pop(); push(f'({a}|{b})'); pc=next_pc; continue
[codex:281657]     if op == 0x19:  # NOT
[codex:281657]         a=pop(); push(f'NOT({a})'); pc=next_pc; continue
[codex:281657]     if op == 0x20:  # SHA3
[codex:281657]         a=pop(); b=pop(); push(f'keccak({a},{b})'); pc=next_pc; continue
[codex:281657]     if op == 0x51:  # MLOAD
[codex:281657]         a=pop(); push(mem.get(a, f'MLOAD({a})')); pc=next_pc; continue
[codex:281657]     if op == 0x52:  # MSTORE
[codex:281657]         a=pop(); b=pop(); mem[a]=b; pc=next_pc; continue
[codex:281657]     if op == 0x54:  # SLOAD
[codex:281657]         a=pop(); push(f'SLOAD({a})'); pc=next_pc; continue
[codex:281657]     if op == 0x55:  # SSTORE
[codex:281657]         a=pop(); b=pop(); pc=next_pc; continue
[codex:281657]     if op == 0x56:  # JUMP
[codex:281657]         dest = pop()
[codex:281657]         if dest.startswith('0x'):
[codex:281657]             pc = int(dest, 16)
[codex:281657]         else:
[codex:281657]             print('Unknown JUMP dest', dest)
[codex:281657]             break
[codex:281657]         continue
[codex:281657]     if op == 0x57:  # JUMPI
[codex:281657]         dest = pop(); cond = pop()
[codex:281657]         take = branch.get(pc, False)
[codex:281657]         if take:
[codex:281657]             if dest.startswith('0x'):
[codex:281657]                 pc = int(dest, 16)
[codex:281657]             else:
[codex:281657]                 print('Unknown JUMPI dest', dest)
[codex:281657]                 break
[codex:281657]         else:
[codex:281657]             pc = next_pc
[codex:281657]         continue
[codex:281657]     if op == 0x5b:  # JUMPDEST
[codex:281657]         pc = next_pc; continue
[codex:281657] 
[codex:281657]     # unhandled op
[codex:281657]     print('Unhandled op', hex(op), 'at', hex(pc))
[codex:281657]     break
[codex:281657] 
[codex:281657] print('Stopped at pc', hex(pc), 'steps', steps)
[codex:281657] print('Stack size', len(stack))
[codex:281657] print('Top 15 stack items:')
[codex:281657] for val in stack[-15:]:
[codex:281657]     print(val)
[codex:281657] PY" in /tmp/codex-multi-q6dbli10 succeeded in 29ms:
[codex:281657] Unhandled op 0x36 at 0x5
[codex:281657] Stopped at pc 0x5 steps 38
[codex:281657] Stack size 12
[codex:281657] Top 15 stack items:
[codex:281657] S0
[codex:281657] S1
[codex:281657] S2
[codex:281657] S3
[codex:281657] S4
[codex:281657] S5
[codex:281657] S6
[codex:281657] S7
[codex:281657] S8
[codex:281657] S9
[codex:281657] 0x0
[codex:281657] S9
[codex:281657] 
[codex:281657] thinking
[codex:281657] **Analyzing jump and branch misalignment**
[codex:281657] exec
[codex:281657] /bin/bash -lc "python - <<'PY'
[codex:281657] import re
[codex:281657] from pathlib import Path
[codex:281657] hexdata=Path('BYTECODE_BUNDLE.txt').read_text()
[codex:281657] code=re.search(r'0x([0-9a-fA-F]+)', hexdata).group(1)
[codex:281657] bytecode=bytes.fromhex(code)
[codex:281657] 
[codex:281657] def decode(pc):
[codex:281657]     op=bytecode[pc]
[codex:281657]     if 0x60 <= op <= 0x7f:
[codex:281657]         n=op-0x5f
[codex:281657]         data=bytecode[pc+1:pc+1+n]
[codex:281657]         return op,data,pc+1+n
[codex:281657]     return op,None,pc+1
[codex:281657] 
[codex:281657] stack=[f'S{i}' for i in range(10)]
[codex:281657] mem={}
[codex:281657] branch={
[codex:281657]     0x1c21: True,  # jump to 0x1c26
[codex:281657]     0x1c34: False, # do not jump to 0x1db2
[codex:281657]     0x1cc8: True,  # jump to 0x1d0f
[codex:281657] }
[codex:281657] 
[codex:281657] pc=0x1bf5
[codex:281657] steps=0
[codex:281657] 
[codex:281657] def pop():
[codex:281657]     return stack.pop()
[codex:281657] 
[codex:281657] def push(x):
[codex:281657]     stack.append(x)
[codex:281657] 
[codex:281657] while pc < 0x1d15 and steps < 10000:
[codex:281657]     steps+=1
[codex:281657]     op,data,next_pc=decode(pc)
[codex:281657]     if 0x60<=op<=0x7f:
[codex:281657]         val=int.from_bytes(data,'big')
[codex:281657]         push(f'0x{val:x}')
[codex:281657]         pc=next_pc; continue
[codex:281657]     if 0x80<=op<=0x8f:
[codex:281657]         n=op-0x7f; push(stack[-n]); pc=next_pc; continue
[codex:281657]     if 0x90<=op<=0x9f:
[codex:281657]         n=op-0x8f; stack[-1],stack[-1-n]=stack[-1-n],stack[-1]; pc=next_pc; continue
[codex:281657]     if op==0x50: pop(); pc=next_pc; continue
[codex:281657]     if op==0x01: a=pop(); b=pop(); push(f'({a}+{b})'); pc=next_pc; continue
[codex:281657]     if op==0x02: a=pop(); b=pop(); push(f'({a}*{b})'); pc=next_pc; continue
[codex:281657]     if op==0x03: a=pop(); b=pop(); push(f'({a}-{b})'); pc=next_pc; continue
[codex:281657]     if op==0x04: a=pop(); b=pop(); push(f'({a}/{b})'); pc=next_pc; continue
[codex:281657]     if op==0x0a: a=pop(); b=pop(); push(f'({a}**{b})'); pc=next_pc; continue
[codex:281657]     if op==0x10: a=pop(); b=pop(); push(f'({a}<{b})'); pc=next_pc; continue
[codex:281657]     if op==0x11: a=pop(); b=pop(); push(f'({a}>{b})'); pc=next_pc; continue
[codex:281657]     if op==0x14: a=pop(); b=pop(); push(f'({a}=={b})'); pc=next_pc; continue
[codex:281657]     if op==0x15: a=pop(); push(f'ISZERO({a})'); pc=next_pc; continue
[codex:281657]     if op==0x16: a=pop(); b=pop(); push(f'({a}&{b})'); pc=next_pc; continue
[codex:281657]     if op==0x17: a=pop(); b=pop(); push(f'({a}|{b})'); pc=next_pc; continue
[codex:281657]     if op==0x19: a=pop(); push(f'NOT({a})'); pc=next_pc; continue
[codex:281657]     if op==0x20: a=pop(); b=pop(); push(f'keccak({a},{b})'); pc=next_pc; continue
[codex:281657]     if op==0x51: a=pop(); push(mem.get(a,f'MLOAD({a})')); pc=next_pc; continue
[codex:281657]     if op==0x52: a=pop(); b=pop(); mem[a]=b; pc=next_pc; continue
[codex:281657]     if op==0x54: a=pop(); push(f'SLOAD({a})'); pc=next_pc; continue
[codex:281657]     if op==0x55: a=pop(); b=pop(); pc=next_pc; continue
[codex:281657]     if op==0x56: dest=pop();
[codex:281657]         if dest.startswith('0x'):
[codex:281657]             pc=int(dest,16)
[codex:281657]         else:
[codex:281657]             print('Unknown JUMP dest',dest); break
[codex:281657]         continue
[codex:281657]     if op==0x57:
[codex:281657]         dest=pop(); cond=pop(); take=branch.get(pc,False)
[codex:281657]         if take:
[codex:281657]             if dest.startswith('0x'): pc=int(dest,16)
[codex:281657]             else: print('Unknown JUMPI dest',dest); break
[codex:281657]         else:
[codex:281657]             pc=next_pc
[codex:281657]         continue
[codex:281657]     if op==0x5b: pc=next_pc; continue
[codex:281657]     print('Unhandled op',hex(op),'at',hex(pc)); break
[codex:281657] 
[codex:281657] print('Stopped at pc',hex(pc),'steps',steps)
[codex:281657] print('Stack size',len(stack))
[codex:281657] print('Top 15 stack items:')
[codex:281657] for val in stack[-15:]:
[codex:281657]     print(val)
[codex:281657] PY" in /tmp/codex-multi-q6dbli10 exited 1 in 32ms:
[codex:281657]   File "<stdin>", line 62
[codex:281657]     if dest.startswith('0x'):
[codex:281657] IndentationError: unexpected indent
[codex:281657] 
[codex:281657] thinking
[codex:281657] **Fixing indentation error**
[codex:281657] exec
[codex:281657] /bin/bash -lc "python - <<'PY'
[codex:281657] import re
[codex:281657] from pathlib import Path
[codex:281657] hexdata=Path('BYTECODE_BUNDLE.txt').read_text()
[codex:281657] code=re.search(r'0x([0-9a-fA-F]+)', hexdata).group(1)
[codex:281657] bytecode=bytes.fromhex(code)
[codex:281657] 
[codex:281657] def decode(pc):
[codex:281657]     op=bytecode[pc]
[codex:281657]     if 0x60 <= op <= 0x7f:
[codex:281657]         n=op-0x5f
[codex:281657]         data=bytecode[pc+1:pc+1+n]
[codex:281657]         return op,data,pc+1+n
[codex:281657]     return op,None,pc+1
[codex:281657] 
[codex:281657] stack=[f'S{i}' for i in range(10)]
[codex:281657] mem={}
[codex:281657] branch={
[codex:281657]     0x1c21: True,
[codex:281657]     0x1c34: False,
[codex:281657]     0x1cc8: True,
[codex:281657] }
[codex:281657] 
[codex:281657] pc=0x1bf5
[codex:281657] steps=0
[codex:281657] 
[codex:281657] def pop():
[codex:281657]     return stack.pop()
[codex:281657] 
[codex:281657] def push(x):
[codex:281657]     stack.append(x)
[codex:281657] 
[codex:281657] while pc < 0x1d15 and steps < 10000:
[codex:281657]     steps+=1
[codex:281657]     op,data,next_pc=decode(pc)
[codex:281657]     if 0x60 <= op <= 0x7f:
[codex:281657]         val=int.from_bytes(data,'big')
[codex:281657]         push(f'0x{val:x}')
[codex:281657]         pc=next_pc
[codex:281657]         continue
[codex:281657]     if 0x80 <= op <= 0x8f:
[codex:281657]         n=op-0x7f
[codex:281657]         push(stack[-n])
[codex:281657]         pc=next_pc
[codex:281657]         continue
[codex:281657]     if 0x90 <= op <= 0x9f:
[codex:281657]         n=op-0x8f
[codex:281657]         stack[-1],stack[-1-n]=stack[-1-n],stack[-1]
[codex:281657]         pc=next_pc
[codex:281657]         continue
[codex:281657] 
[codex:281657]     if op==0x50:
[codex:281657]         pop(); pc=next_pc; continue
[codex:281657]     if op==0x01:
[codex:281657]         a=pop(); b=pop(); push(f'({a}+{b})'); pc=next_pc; continue
[codex:281657]     if op==0x02:
[codex:281657]         a=pop(); b=pop(); push(f'({a}*{b})'); pc=next_pc; continue
[codex:281657]     if op==0x03:
[codex:281657]         a=pop(); b=pop(); push(f'({a}-{b})'); pc=next_pc; continue
[codex:281657]     if op==0x04:
[codex:281657]         a=pop(); b=pop(); push(f'({a}/{b})'); pc=next_pc; continue
[codex:281657]     if op==0x0a:
[codex:281657]         a=pop(); b=pop(); push(f'({a}**{b})'); pc=next_pc; continue
[codex:281657]     if op==0x10:
[codex:281657]         a=pop(); b=pop(); push(f'({a}<{b})'); pc=next_pc; continue
[codex:281657]     if op==0x11:
[codex:281657]         a=pop(); b=pop(); push(f'({a}>{b})'); pc=next_pc; continue
[codex:281657]     if op==0x14:
[codex:281657]         a=pop(); b=pop(); push(f'({a}=={b})'); pc=next_pc; continue
[codex:281657]     if op==0x15:
[codex:281657]         a=pop(); push(f'ISZERO({a})'); pc=next_pc; continue
[codex:281657]     if op==0x16:
[codex:281657]         a=pop(); b=pop(); push(f'({a}&{b})'); pc=next_pc; continue
[codex:281657]     if op==0x17:
[codex:281657]         a=pop(); b=pop(); push(f'({a}|{b})'); pc=next_pc; continue
[codex:281657]     if op==0x19:
[codex:281657]         a=pop(); push(f'NOT({a})'); pc=next_pc; continue
[codex:281657]     if op==0x20:
[codex:281657]         a=pop(); b=pop(); push(f'keccak({a},{b})'); pc=next_pc; continue
[codex:281657]     if op==0x51:
[codex:281657]         a=pop(); push(mem.get(a,f'MLOAD({a})')); pc=next_pc; continue
[codex:281657]     if op==0x52:
[codex:281657]         a=pop(); b=pop(); mem[a]=b; pc=next_pc; continue
[codex:281657]     if op==0x54:
[codex:281657]         a=pop(); push(f'SLOAD({a})'); pc=next_pc; continue
[codex:281657]     if op==0x55:
[codex:281657]         a=pop(); b=pop(); pc=next_pc; continue
[codex:281657]     if op==0x56:
[codex:281657]         dest=pop()
[codex:281657]         if dest.startswith('0x'):
[codex:281657]             pc=int(dest,16)
[codex:281657]         else:
[codex:281657]             print('Unknown JUMP dest',dest); break
[codex:281657]         continue
[codex:281657]     if op==0x57:
[codex:281657]         dest=pop(); cond=pop(); take=branch.get(pc,False)
[codex:281657]         if take:
[codex:281657]             if dest.startswith('0x'):
[codex:281657]                 pc=int(dest,16)
[codex:281657]             else:
[codex:281657]                 print('Unknown JUMPI dest',dest); break
[codex:281657]         else:
[codex:281657]             pc=next_pc
[codex:281657]         continue
[codex:281657]     if op==0x5b:
[codex:281657]         pc=next_pc; continue
[codex:281657] 
[codex:281657]     print('Unhandled op',hex(op),'at',hex(pc)); break
[codex:281657] 
[codex:281657] print('Stopped at pc',hex(pc),'steps',steps)
[codex:281657] print('Stack size',len(stack))
[codex:281657] print('Top 15 stack items:')
[codex:281657] for val in stack[-15:]:
[codex:281657]     print(val)
[codex:281657] PY" in /tmp/codex-multi-q6dbli10 succeeded in 30ms:
[codex:281657] Stopped at pc 0x1d15 steps 247
[codex:281657] Stack size 15
[codex:281657] Top 15 stack items:
[codex:281657] S0
[codex:281657] S1
[codex:281657] S2
[codex:281657] S3
[codex:281657] S4
[codex:281657] S5
[codex:281657] S6
[codex:281657] S7
[codex:281657] S8
[codex:281657] S9
[codex:281657] keccak(0x0,(0x20+(0x20+0x0)))
[codex:281657] S9
[codex:281657] (0xffffffffffffffffffffffffffffffffffffffff&(0xffffffffffffffffffffffffffffffffffffffff&(SLOAD((0x0+keccak(0x0,(0x20+(0x20+0x0)))))/(0x100**0x0))))
[codex:281657] SLOAD((0x1+keccak(0x0,(0x20+(0x20+0x0)))))
[codex:281657] MLOAD(0x40)
[codex:281657] 
[codex:281657] thinking
[codex:281657] **Mapping stack items before CALL simulation**
[codex:281657] exec
[codex:281657] /bin/bash -lc "python - <<'PY'
[codex:281657] import re
[codex:281657] from pathlib import Path
[codex:281657] hexdata=Path('BYTECODE_BUNDLE.txt').read_text()
[codex:281657] code=re.search(r'0x([0-9a-fA-F]+)', hexdata).group(1)
[codex:281657] bytecode=bytes.fromhex(code)
[codex:281657] 
[codex:281657] def decode(pc):
[codex:281657]     op=bytecode[pc]
[codex:281657]     if 0x60 <= op <= 0x7f:
[codex:281657]         n=op-0x5f
[codex:281657]         data=bytecode[pc+1:pc+1+n]
[codex:281657]         return op,data,pc+1+n
[codex:281657]     return op,None,pc+1
[codex:281657] 
[codex:281657] # We'll run same simulation as before, then continue to CALL
[codex:281657] 
[codex:281657] stack=[f'S{i}' for i in range(10)]
[codex:281657] mem={}
[codex:281657] branch={
[codex:281657]     0x1c21: True,
[codex:281657]     0x1c34: False,
[codex:281657]     0x1cc8: True,
[codex:281657] }
[codex:281657] 
[codex:281657] pc=0x1bf5
[codex:281657] steps=0
[codex:281657] 
[codex:281657] def pop():
[codex:281657]     return stack.pop()
[codex:281657] 
[codex:281657] def push(x):
[codex:281657]     stack.append(x)
[codex:281657] 
[codex:281657] while steps < 10000:
[codex:281657]     steps+=1
[codex:281657]     op,data,next_pc=decode(pc)
[codex:281657]     if 0x60 <= op <= 0x7f:
[codex:281657]         val=int.from_bytes(data,'big'); push(f'0x{val:x}'); pc=next_pc; continue
[codex:281657]     if 0x80 <= op <= 0x8f:
[codex:281657]         n=op-0x7f; push(stack[-n]); pc=next_pc; continue
[codex:281657]     if 0x90 <= op <= 0x9f:
[codex:281657]         n=op-0x8f; stack[-1],stack[-1-n]=stack[-1-n],stack[-1]; pc=next_pc; continue
[codex:281657]     if op==0x50:
[codex:281657]         pop(); pc=next_pc; continue
[codex:281657]     if op==0x01:
[codex:281657]         a=pop(); b=pop(); push(f'({a}+{b})'); pc=next_pc; continue
[codex:281657]     if op==0x02:
[codex:281657]         a=pop(); b=pop(); push(f'({a}*{b})'); pc=next_pc; continue
[codex:281657]     if op==0x03:
[codex:281657]         a=pop(); b=pop(); push(f'({a}-{b})'); pc=next_pc; continue
[codex:281657]     if op==0x04:
[codex:281657]         a=pop(); b=pop(); push(f'({a}/{b})'); pc=next_pc; continue
[codex:281657]     if op==0x0a:
[codex:281657]         a=pop(); b=pop(); push(f'({a}**{b})'); pc=next_pc; continue
[codex:281657]     if op==0x10:
[codex:281657]         a=pop(); b=pop(); push(f'({a}<{b})'); pc=next_pc; continue
[codex:281657]     if op==0x11:
[codex:281657]         a=pop(); b=pop(); push(f'({a}>{b})'); pc=next_pc; continue
[codex:281657]     if op==0x14:
[codex:281657]         a=pop(); b=pop(); push(f'({a}=={b})'); pc=next_pc; continue
[codex:281657]     if op==0x15:
[codex:281657]         a=pop(); push(f'ISZERO({a})'); pc=next_pc; continue
[codex:281657]     if op==0x16:
[codex:281657]         a=pop(); b=pop(); push(f'({a}&{b})'); pc=next_pc; continue
[codex:281657]     if op==0x17:
[codex:281657]         a=pop(); b=pop(); push(f'({a}|{b})'); pc=next_pc; continue
[codex:281657]     if op==0x19:
[codex:281657]         a=pop(); push(f'NOT({a})'); pc=next_pc; continue
[codex:281657]     if op==0x20:
[codex:281657]         a=pop(); b=pop(); push(f'keccak({a},{b})'); pc=next_pc; continue
[codex:281657]     if op==0x51:
[codex:281657]         a=pop(); push(mem.get(a,f'MLOAD({a})')); pc=next_pc; continue
[codex:281657]     if op==0x52:
[codex:281657]         a=pop(); b=pop(); mem[a]=b; pc=next_pc; continue
[codex:281657]     if op==0x54:
[codex:281657]         a=pop(); push(f'SLOAD({a})'); pc=next_pc; continue
[codex:281657]     if op==0x55:
[codex:281657]         a=pop(); b=pop(); pc=next_pc; continue
[codex:281657]     if op==0x56:
[codex:281657]         dest=pop()
[codex:281657]         if dest.startswith('0x'): pc=int(dest,16)
[codex:281657]         else: print('Unknown JUMP dest',dest); break
[codex:281657]         continue
[codex:281657]     if op==0x57:
[codex:281657]         dest=pop(); cond=pop(); take=branch.get(pc,False)
[codex:281657]         if take:
[codex:281657]             if dest.startswith('0x'): pc=int(dest,16)
[codex:281657]             else: print('Unknown JUMPI dest',dest); break
[codex:281657]         else:
[codex:281657]             pc=next_pc
[codex:281657]         continue
[codex:281657]     if op==0x5b:
[codex:281657]         pc=next_pc; continue
[codex:281657]     if op==0xf1:  # CALL
[codex:281657]         # pop args
[codex:281657]         gas=pop(); to=pop(); value=pop(); in_off=pop(); in_sz=pop(); out_off=pop(); out_sz=pop();
[codex:281657]         print('CALL reached at pc',hex(pc))
[codex:281657]         print('gas',gas)
[codex:281657]         print('to',to)
[codex:281657]         print('value',value)
[codex:281657]         print('in_off',in_off)
[codex:281657]         print('in_sz',in_sz)
[codex:281657]         print('out_off',out_off)
[codex:281657]         print('out_sz',out_sz)
[codex:281657]         break
[codex:281657]     if op==0x5a:  # GAS
[codex:281657]         push('GAS'); pc=next_pc; continue
[codex:281657] 
[codex:281657]     print('Unhandled op',hex(op),'at',hex(pc)); break
[codex:281657] 
[codex:281657] PY" in /tmp/codex-multi-q6dbli10 succeeded in 28ms:
[codex:281657] CALL reached at pc 0x1d25
[codex:281657] gas (GAS-0x8502)
[codex:281657] to (0xffffffffffffffffffffffffffffffffffffffff&(0xffffffffffffffffffffffffffffffffffffffff&(SLOAD((0x0+keccak(0x0,(0x20+(0x20+0x0)))))/(0x100**0x0))))
[codex:281657] value SLOAD((0x1+keccak(0x0,(0x20+(0x20+0x0)))))
[codex:281657] in_off MLOAD(0x40)
[codex:281657] in_sz (MLOAD(0x40)-MLOAD(0x40))
[codex:281657] out_off MLOAD(0x40)
[codex:281657] out_sz 0x0
[codex:281657] 
[codex:281657] thinking
[codex:281657] **Analyzing symbolic call parameters and storage keys**
[codex:281657] exec
[codex:281657] /bin/bash -lc "python - <<'PY'
[codex:281657] import re
[codex:281657] from pathlib import Path
[codex:281657] hexdata=Path('BYTECODE_BUNDLE.txt').read_text()
[codex:281657] code=re.search(r'0x([0-9a-fA-F]+)', hexdata).group(1)
[codex:281657] bytecode=bytes.fromhex(code)
[codex:281657] 
[codex:281657] def decode(pc):
[codex:281657]     op=bytecode[pc]
[codex:281657]     if 0x60<=op<=0x7f:
[codex:281657]         n=op-0x5f
[codex:281657]         data=bytecode[pc+1:pc+1+n]
[codex:281657]         return op,data,pc+1+n
[codex:281657]     return op,None,pc+1
[codex:281657] 
[codex:281657] stack=[f'S{i}' for i in range(10)]
[codex:281657] mem={}
[codex:281657] 
[codex:281657] pc=0x1bf5
[codex:281657] steps=0
[codex:281657] 
[codex:281657] 
[codex:281657] def pop():
[codex:281657]     return stack.pop()
[codex:281657] 
[codex:281657] def push(x):
[codex:281657]     stack.append(x)
[codex:281657] 
[codex:281657] while pc < 0x1c0c and steps < 200:
[codex:281657]     steps+=1
[codex:281657]     op,data,next_pc=decode(pc)
[codex:281657]     if 0x60<=op<=0x7f:
[codex:281657]         val=int.from_bytes(data,'big'); push(f'0x{val:x}'); pc=next_pc; continue
[codex:281657]     if 0x80<=op<=0x8f:
[codex:281657]         n=op-0x7f; push(stack[-n]); pc=next_pc; continue
[codex:281657]     if 0x90<=op<=0x9f:
[codex:281657]         n=op-0x8f; stack[-1],stack[-1-n]=stack[-1-n],stack[-1]; pc=next_pc; continue
[codex:281657]     if op==0x50:
[codex:281657]         pop(); pc=next_pc; continue
[codex:281657]     if op==0x01:
[codex:281657]         a=pop(); b=pop(); push(f'({a}+{b})'); pc=next_pc; continue
[codex:281657]     if op==0x20:
[codex:281657]         a=pop(); b=pop(); push(f'keccak({a},{b})'); pc=next_pc; continue
[codex:281657]     if op==0x51:
[codex:281657]         a=pop(); push(mem.get(a,f'MLOAD({a})')); pc=next_pc; continue
[codex:281657]     if op==0x52:
[codex:281657]         a=pop(); b=pop(); mem[a]=b; pc=next_pc; continue
[codex:281657]     if op==0x54:
[codex:281657]         a=pop(); push(f'SLOAD({a})'); pc=next_pc; continue
[codex:281657]     if op==0x0a:
[codex:281657]         a=pop(); b=pop(); push(f'({a}**{b})'); pc=next_pc; continue
[codex:281657]     if op==0x03:
[codex:281657]         a=pop(); b=pop(); push(f'({a}-{b})'); pc=next_pc; continue
[codex:281657]     if op==0x04:
[codex:281657]         a=pop(); b=pop(); push(f'({a}/{b})'); pc=next_pc; continue
[codex:281657]     if op==0x16:
[codex:281657]         a=pop(); b=pop(); push(f'({a}&{b})'); pc=next_pc; continue
[codex:281657]     if op==0x15:
[codex:281657]         a=pop(); push(f'ISZERO({a})'); pc=next_pc; continue
[codex:281657]     if op==0x57:
[codex:281657]         dest=pop(); cond=pop(); pc=next_pc; continue
[codex:281657]     if op==0x5b:
[codex:281657]         pc=next_pc; continue
[codex:281657] 
[codex:281657]     # ignore others for this part
[codex:281657]     pc=next_pc
[codex:281657] 
[codex:281657] print('pc',hex(pc))
[codex:281657] print('mem contents:')
[codex:281657] for k,v in mem.items():
[codex:281657]     print(k, '=>', v)
[codex:281657] print('stack top:', stack[-5:])
[codex:281657] PY" in /tmp/codex-multi-q6dbli10 succeeded in 30ms:
[codex:281657] pc 0x1c0c
[codex:281657] mem contents:
[codex:281657] 0x0 => S9
[codex:281657] (0x20+0x0) => 0x1
[codex:281657] stack top: ['S8', 'S9', '0x0', 'S9', 'keccak(0x0,(0x20+(0x20+0x0)))']
[codex:281657] 
[codex:281657] thinking
[codex:281657] **Analyzing mapping structure and access check**
[codex:281657] exec
[codex:281657] /bin/bash -lc "python - <<'PY'
[codex:281657] import re
[codex:281657] from pathlib import Path
[codex:281657] hexdata=Path('BYTECODE_BUNDLE.txt').read_text()
[codex:281657] code=re.search(r'0x([0-9a-fA-F]+)', hexdata).group(1)
[codex:281657] bytecode=bytes.fromhex(code)
[codex:281657] 
[codex:281657] opnames={
[codex:281657]     0x00:'STOP',0x01:'ADD',0x02:'MUL',0x03:'SUB',0x04:'DIV',0x05:'SDIV',0x06:'MOD',0x07:'SMOD',0x08:'ADDMOD',0x09:'MULMOD',0x0a:'EXP',0x0b:'SIGNEXTEND',
[codex:281657]     0x10:'LT',0x11:'GT',0x12:'SLT',0x13:'SGT',0x14:'EQ',0x15:'ISZERO',0x16:'AND',0x17:'OR',0x18:'XOR',0x19:'NOT',0x1a:'BYTE',0x1b:'SHL',0x1c:'SHR',0x1d:'SAR',
[codex:281657]     0x20:'SHA3',
[codex:281657]     0x30:'ADDRESS',0x31:'BALANCE',0x32:'ORIGIN',0x33:'CALLER',0x34:'CALLVALUE',0x35:'CALLDATALOAD',0x36:'CALLDATASIZE',0x37:'CALLDATACOPY',0x38:'CODESIZE',0x39:'CODECOPY',0x3a:'GASPRICE',0x3b:'EXTCODESIZE',0x3c:'EXTCODECOPY',0x3d:'RETURNDATASIZE',0x3e:'RETURNDATACOPY',0x3f:'EXTCODEHASH',
[codex:281657]     0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x46:'CHAINID',0x47:'SELFBALANCE',0x48:'BASEFEE',
[codex:281657]     0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x53:'MSTORE8',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x58:'PC',0x59:'MSIZE',0x5a:'GAS',0x5b:'JUMPDEST',
[codex:281657]     0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'
[codex:281657] }
[codex:281657] for i in range(1,17):
[codex:281657]     opnames[0x7f+i]=f'DUP{i}'
[codex:281657] for i in range(1,17):
[codex:281657]     opnames[0x8f+i]=f'SWAP{i}'
[codex:281657] for i in range(0,5):
[codex:281657]     opnames[0xa0+i]=f'LOG{i}'
[codex:281657] 
[codex:281657] 
[codex:281657] def disasm(start, end):
[codex:281657]     i=start
[codex:281657]     out=[]
[codex:281657]     while i<end and i<len(bytecode):
[codex:281657]         op=bytecode[i]
[codex:281657]         name=opnames.get(op, f'OP{op:02x}')
[codex:281657]         if 0x60 <= op <= 0x7f:
[codex:281657]             n=op-0x5f
[codex:281657]             data=bytecode[i+1:i+1+n]
[codex:281657]             out.append((i, f'PUSH{n}', data.hex()))
[codex:281657]             i += 1+n
[codex:281657]         else:
[codex:281657]             out.append((i, name, ''))
[codex:281657]             i += 1
[codex:281657]     return out
[codex:281657] 
[codex:281657] for off,name,data in disasm(0x0fd0,0x10a0):
[codex:281657]     if data:
[codex:281657]         print(f\"{off:04x}: {name} 0x{data}\")
[codex:281657]     else:
[codex:281657]         print(f\"{off:04x}: {name}\")
[codex:281657] PY" in /tmp/codex-multi-q6dbli10 succeeded in 31ms:
[codex:281657] 0fd0: POP
[codex:281657] 0fd1: POP
[codex:281657] 0fd2: JUMPDEST
[codex:281657] 0fd3: POP
[codex:281657] 0fd4: JUMPDEST
[codex:281657] 0fd5: POP
[codex:281657] 0fd6: JUMPDEST
[codex:281657] 0fd7: POP
[codex:281657] 0fd8: JUMP
[codex:281657] 0fd9: JUMPDEST
[codex:281657] 0fda: PUSH1 0x00
[codex:281657] 0fdc: PUSH1 0x00
[codex:281657] 0fde: PUSH1 0x00
[codex:281657] 0fe0: PUSH1 0x00
[codex:281657] 0fe2: SWAP2
[codex:281657] 0fe3: POP
[codex:281657] 0fe4: PUSH1 0x00
[codex:281657] 0fe6: SWAP1
[codex:281657] 0fe7: POP
[codex:281657] 0fe8: JUMPDEST
[codex:281657] 
[codex:281657] thinking
[codex:281657] **Continuing process**
[codex:281657] exec
[codex:281657] /bin/bash -lc "python - <<'PY'
[codex:281657] import re
[codex:281657] from pathlib import Path
[codex:281657] hexdata=Path('BYTECODE_BUNDLE.txt').read_text()
[codex:281657] code=re.search(r'0x([0-9a-fA-F]+)', hexdata).group(1)
[codex:281657] bytecode=bytes.fromhex(code)
[codex:281657] 
[codex:281657] opnames={
[codex:281657]     0x00:'STOP',0x01:'ADD',0x02:'MUL',0x03:'SUB',0x04:'DIV',0x05:'SDIV',0x06:'MOD',0x07:'SMOD',0x08:'ADDMOD',0x09:'MULMOD',0x0a:'EXP',0x0b:'SIGNEXTEND',
[codex:281657]     0x10:'LT',0x11:'GT',0x12:'SLT',0x13:'SGT',0x14:'EQ',0x15:'ISZERO',0x16:'AND',0x17:'OR',0x18:'XOR',0x19:'NOT',0x1a:'BYTE',0x1b:'SHL',0x1c:'SHR',0x1d:'SAR',
[codex:281657]     0x20:'SHA3',
[codex:281657]     0x30:'ADDRESS',0x31:'BALANCE',0x32:'ORIGIN',0x33:'CALLER',0x34:'CALLVALUE',0x35:'CALLDATALOAD',0x36:'CALLDATASIZE',0x37:'CALLDATACOPY',0x38:'CODESIZE',0x39:'CODECOPY',0x3a:'GASPRICE',0x3b:'EXTCODESIZE',0x3c:'EXTCODECOPY',0x3d:'RETURNDATASIZE',0x3e:'RETURNDATACOPY',0x3f:'EXTCODEHASH',
[codex:281657]     0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x46:'CHAINID',0x47:'SELFBALANCE',0x48:'BASEFEE',
[codex:281657]     0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x53:'MSTORE8',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x58:'PC',0x59:'MSIZE',0x5a:'GAS',0x5b:'JUMPDEST',
[codex:281657]     0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'
[codex:281657] }
[codex:281657] for i in range(1,17):
[codex:281657]     opnames[0x7f+i]=f'DUP{i}'
[codex:281657] for i in range(1,17):
[codex:281657]     opnames[0x8f+i]=f'SWAP{i}'
[codex:281657] for i in range(0,5):
[codex:281657]     opnames[0xa0+i]=f'LOG{i}'
[codex:281657] 
[codex:281657] 
[codex:281657] def disasm(start,end):
[codex:281657]     i=start
[codex:281657]     out=[]
[codex:281657]     while i<end and i<len(bytecode):
[codex:281657]         op=bytecode[i]
[codex:281657]         name=opnames.get(op,f'OP{op:02x}')
[codex:281657]         if 0x60 <= op <= 0x7f:
[codex:281657]             n=op-0x5f
[codex:281657]             data=bytecode[i+1:i+1+n]
[codex:281657]             out.append((i,f'PUSH{n}',data.hex()))
[codex:281657]             i+=1+n
[codex:281657]         else:
[codex:281657]             out.append((i,name,''))
[codex:281657]             i+=1
[codex:281657]     return out
[codex:281657] 
[codex:281657] for off,name,data in disasm(0x1090,0x10c0):
[codex:281657]     if data:
[codex:281657]         print(f\"{off:04x}: {name} 0x{data}\")
[codex:281657]     else:
[codex:281657]         print(f\"{off:04x}: {name}\")
[codex:281657] PY" in /tmp/codex-multi-q6dbli10 succeeded in 27ms:
[codex:281657] 1090: JUMPI
[codex:281657] 1091: PUSH1 0x01
[codex:281657] 1093: DUP3
[codex:281657] 1094: ADD
[codex:281657] 1095: SWAP2
[codex:281657] 1096: POP
[codex:281657] 1097: JUMPDEST
[codex:281657] 1098: PUSH1 0x05
[codex:281657] 109a: SLOAD
[codex:281657] 109b: DUP3
[codex:281657] 109c: EQ
[codex:281657] 109d: ISZERO
[codex:281657] 109e: PUSH2 0x10aa
[codex:281657] 10a1: JUMPI
[codex:281657] 10a2: PUSH1 0x01
[codex:281657] 10a4: SWAP3
[codex:281657] 10a5: POP
[codex:281657] 10a6: PUSH2 0x10b9
[codex:281657] 10a9: JUMP
[codex:281657] 10aa: JUMPDEST
[codex:281657] 
[codex:281657] thinking
[codex:281657] **Analyzing multisig ownership and confirmation logic**
[codex:281657] 
[codex:281657] I'm examining the bytecode function that loops through stored owners and their confirmations to verify if a transaction meets the required approval threshold, likely part of a MultiSig wallet's execute function. I'm considering vulnerabilities like missing access control on owner addition or confirmation, and planning to analyze CALLER checks by disassembling the bytecode to detect how ownership and permissions are enforced.
[codex:281657] exec
[codex:281657] /bin/bash -lc "python - <<'PY'
[codex:281657] import re
[codex:281657] from pathlib import Path
[codex:281657] hexdata=Path('BYTECODE_BUNDLE.txt').read_text()
[codex:281657] code=re.search(r'0x([0-9a-fA-F]+)', hexdata).group(1)
[codex:281657] bytecode=bytes.fromhex(code)
[codex:281657] 
[codex:281657] # decode opcodes into list of (pc, op, data)
[codex:281657] ops=[]
[codex:281657] pc=0
[codex:281657] while pc < len(bytecode):
[codex:281657]     op=bytecode[pc]
[codex:281657]     if 0x60 <= op <= 0x7f:
[codex:281657]         n=op-0x5f
[codex:281657]         data=bytecode[pc+1:pc+1+n]
[codex:281657]         ops.append((pc, op, data))
[codex:281657]         pc += 1+n
[codex:281657]     else:
[codex:281657]         ops.append((pc, op, None))
[codex:281657]         pc += 1
[codex:281657] 
[codex:281657] # map op to name for some
[codex:281657] opname={0x33:'CALLER',0x54:'SLOAD',0x14:'EQ',0x15:'ISZERO',0x57:'JUMPI'}
[codex:281657] 
[codex:281657] # find caller occurrences
[codex:281657] for idx,(pc,op,data) in enumerate(ops):
[codex:281657]     if op==0x33:
[codex:281657]         # show nearby ops
[codex:281657]         snippet=ops[idx:idx+6]
[codex:281657]         print('CALLER at',hex(pc))
[codex:281657]         for spc,sop,sdata in snippet:
[codex:281657]             name=opname.get(sop,f'OP{sop:02x}')
[codex:281657]             if 0x60 <= sop <= 0x7f:
[codex:281657]                 val=int.from_bytes(sdata,'big')
[codex:281657]                 print(f'  {hex(spc)}: PUSH{len(sdata)} 0x{val:x}')
[codex:281657]             else:
[codex:281657]                 print(f'  {hex(spc)}: {name}')
[codex:281657]         print('---')
[codex:281657] PY" in /tmp/codex-multi-q6dbli10 succeeded in 31ms:
[codex:281657] CALLER at 0x129
[codex:281657]   0x129: CALLER
[codex:281657]   0x12a: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
[codex:281657]   0x13f: OP16
[codex:281657]   0x140: PUSH32 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c
[codex:281657]   0x161: OP34
[codex:281657]   0x162: PUSH1 0x40
[codex:281657] ---
[codex:281657] CALLER at 0x837
[codex:281657]   0x837: CALLER
[codex:281657]   0x838: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
[codex:281657]   0x84d: OP16
[codex:281657]   0x84e: EQ
[codex:281657]   0x84f: ISZERO
[codex:281657]   0x850: ISZERO
[codex:281657] ---
[codex:281657] CALLER at 0xaf3
[codex:281657]   0xaf3: CALLER
[codex:281657]   0xaf4: PUSH1 0x3
[codex:281657]   0xaf6: PUSH1 0x0
[codex:281657] 
[codex:281657] thinking
[codex:281657] **Analyzing access control patterns**
[codex:281657] exec
[codex:281657] /bin/bash -lc "python - <<'PY'
[codex:281657] import re
[codex:281657] from pathlib import Path
[codex:281657] hexdata=Path('BYTECODE_BUNDLE.txt').read_text()
[codex:281657] code=re.search(r'0x([0-9a-fA-F]+)', hexdata).group(1)
[codex:281657] bytecode=bytes.fromhex(code)
[codex:281657] 
[codex:281657] opnames={
[codex:281657]     0x00:'STOP',0x01:'ADD',0x02:'MUL',0x03:'SUB',0x04:'DIV',0x05:'SDIV',0x06:'MOD',0x07:'SMOD',0x08:'ADDMOD',0x09:'MULMOD',0x0a:'EXP',0x0b:'SIGNEXTEND',
[codex:281657]     0x10:'LT',0x11:'GT',0x12:'SLT',0x13:'SGT',0x14:'EQ',0x15:'ISZERO',0x16:'AND',0x17:'OR',0x18:'XOR',0x19:'NOT',0x1a:'BYTE',0x1b:'SHL',0x1c:'SHR',0x1d:'SAR',
[codex:281657]     0x20:'SHA3',
[codex:281657]     0x30:'ADDRESS',0x31:'BALANCE',0x32:'ORIGIN',0x33:'CALLER',0x34:'CALLVALUE',0x35:'CALLDATALOAD',0x36:'CALLDATASIZE',0x37:'CALLDATACOPY',0x38:'CODESIZE',0x39:'CODECOPY',0x3a:'GASPRICE',0x3b:'EXTCODESIZE',0x3c:'EXTCODECOPY',0x3d:'RETURNDATASIZE',0x3e:'RETURNDATACOPY',0x3f:'EXTCODEHASH',
[codex:281657]     0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x46:'CHAINID',0x47:'SELFBALANCE',0x48:'BASEFEE',
[codex:281657]     0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x53:'MSTORE8',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x58:'PC',0x59:'MSIZE',0x5a:'GAS',0x5b:'JUMPDEST',
[codex:281657]     0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'
[codex:281657] }
[codex:281657] for i in range(1,17):
[codex:281657]     opnames[0x7f+i]=f'DUP{i}'
[codex:281657] for i in range(1,17):
[codex:281657]     opnames[0x8f+i]=f'SWAP{i}'
[codex:281657] for i in range(0,5):
[codex:281657]     opnames[0xa0+i]=f'LOG{i}'
[codex:281657] 
[codex:281657] 
[codex:281657] def disasm(start,end):
[codex:281657]     i=start
[codex:281657]     while i<end and i<len(bytecode):
[codex:281657]         op=bytecode[i]
[codex:281657]         name=opnames.get(op,f'OP{op:02x}')
[codex:281657]         if 0x60<=op<=0x7f:
[codex:281657]             n=op-0x5f
[codex:281657]             data=bytecode[i+1:i+1+n]
[codex:281657]             val=int.from_bytes(data,'big')
[codex:281657]             print(f\"{i:04x}: PUSH{n} 0x{val:x}\")
[codex:281657]             i+=1+n
[codex:281657]         else:
[codex:281657]             print(f\"{i:04x}: {name}\")
[codex:281657]             i+=1
[codex:281657] 
[codex:281657] print('--- disasm 0x820-0x880 ---')
[codex:281657] disasm(0x820,0x880)
[codex:281657] PY" in /tmp/codex-multi-q6dbli10 succeeded in 29ms:
[codex:281657] --- disasm 0x820-0x880 ---
[codex:281657] 0820: ADDRESS
[codex:281657] 0821: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
[codex:281657] 0836: AND
[codex:281657] 0837: CALLER
[codex:281657] 0838: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
[codex:281657] 084d: AND
[codex:281657] 084e: EQ
[codex:281657] 084f: ISZERO
[codex:281657] 0850: ISZERO
[codex:281657] 0851: PUSH2 0x859
[codex:281657] 0854: JUMPI
[codex:281657] 0855: PUSH2 0x0
[codex:281657] 0858: JUMP
[codex:281657] 0859: JUMPDEST
[codex:281657] 085a: DUP2
[codex:281657] 085b: PUSH1 0x3
[codex:281657] 085d: PUSH1 0x0
[codex:281657] 085f: DUP3
[codex:281657] 0860: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
[codex:281657] 
[codex:281657] thinking
[codex:281657] **Analyzing internal caller checks**
[codex:281657] exec
[codex:281657] /bin/bash -lc "python - <<'PY'
[codex:281657] import re
[codex:281657] from pathlib import Path
[codex:281657] hexdata=Path('BYTECODE_BUNDLE.txt').read_text()
[codex:281657] code=re.search(r'0x([0-9a-fA-F]+)', hexdata).group(1)
[codex:281657] bytecode=bytes.fromhex(code)
[codex:281657] 
[codex:281657] opnames={
[codex:281657]     0x00:'STOP',0x01:'ADD',0x02:'MUL',0x03:'SUB',0x04:'DIV',0x05:'SDIV',0x06:'MOD',0x07:'SMOD',0x08:'ADDMOD',0x09:'MULMOD',0x0a:'EXP',0x0b:'SIGNEXTEND',
[codex:281657]     0x10:'LT',0x11:'GT',0x12:'SLT',0x13:'SGT',0x14:'EQ',0x15:'ISZERO',0x16:'AND',0x17:'OR',0x18:'XOR',0x19:'NOT',0x1a:'BYTE',0x1b:'SHL',0x1c:'SHR',0x1d:'SAR',
[codex:281657]     0x20:'SHA3',
[codex:281657]     0x30:'ADDRESS',0x31:'BALANCE',0x32:'ORIGIN',0x33:'CALLER',0x34:'CALLVALUE',0x35:'CALLDATALOAD',0x36:'CALLDATASIZE',0x37:'CALLDATACOPY',0x38:'CODESIZE',0x39:'CODECOPY',0x3a:'GASPRICE',0x3b:'EXTCODESIZE',0x3c:'EXTCODECOPY',0x3d:'RETURNDATASIZE',0x3e:'RETURNDATACOPY',0x3f:'EXTCODEHASH',
[codex:281657]     0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x46:'CHAINID',0x47:'SELFBALANCE',0x48:'BASEFEE',
[codex:281657]     0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x53:'MSTORE8',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x58:'PC',0x59:'MSIZE',0x5a:'GAS',0x5b:'JUMPDEST',
[codex:281657]     0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'
[codex:281657] }
[codex:281657] for i in range(1,17):
[codex:281657]     opnames[0x7f+i]=f'DUP{i}'
[codex:281657] for i in range(1,17):
[codex:281657]     opnames[0x8f+i]=f'SWAP{i}'
[codex:281657] for i in range(0,5):
[codex:281657]     opnames[0xa0+i]=f'LOG{i}'
[codex:281657] 
[codex:281657] 
[codex:281657] def disasm(start,end):
[codex:281657]     i=start
[codex:281657]     while i<end and i<len(bytecode):
[codex:281657]         op=bytecode[i]
[codex:281657]         name=opnames.get(op,f'OP{op:02x}')
[codex:281657]         if 0x60<=op<=0x7f:
[codex:281657]             n=op-0x5f
[codex:281657]             val=int.from_bytes(bytecode[i+1:i+1+n],'big')
[codex:281657]             print(f\"{i:04x}: PUSH{n} 0x{val:x}\")
[codex:281657]             i+=1+n
[codex:281657]         else:
[codex:281657]             print(f\"{i:04x}: {name}\")
[codex:281657]             i+=1
[codex:281657] 
[codex:281657] print('--- disasm 0xae0-0xb40 ---')
[codex:281657] disasm(0xae0,0xb40)
[codex:281657] PY" in /tmp/codex-multi-q6dbli10 succeeded in 44ms:
[codex:281657] --- disasm 0xae0-0xb40 ---
[codex:281657] 0ae0: DUP1
[codex:281657] 0ae1: SWAP1
[codex:281657] 0ae2: POP
[codex:281657] 0ae3: PUSH1 0x40
[codex:281657] 0ae5: MLOAD
[codex:281657] 0ae6: DUP1
[codex:281657] 0ae7: SWAP2
[codex:281657] 0ae8: SUB
[codex:281657] 0ae9: SWAP1
[codex:281657] 0aea: LOG2
[codex:281657] 0aeb: JUMPDEST
[codex:281657] 0aec: JUMPDEST
[codex:281657] 0aed: POP
[codex:281657] 0aee: JUMPDEST
[codex:281657] 0aef: POP
[codex:281657] 0af0: POP
[codex:281657] 0af1: JUMP
[codex:281657] 0af2: JUMPDEST
[codex:281657] 0af3: CALLER
[codex:281657] 
[codex:281657] thinking
[codex:281657] **Continuing exploration**
[codex:281657] exec
[codex:281657] /bin/bash -lc "python - <<'PY'
[codex:281657] import re
[codex:281657] from pathlib import Path
[codex:281657] hexdata=Path('BYTECODE_BUNDLE.txt').read_text()
[codex:281657] code=re.search(r'0x([0-9a-fA-F]+)', hexdata).group(1)
[codex:281657] bytecode=bytes.fromhex(code)
[codex:281657] 
[codex:281657] opnames={
[codex:281657]     0x00:'STOP',0x01:'ADD',0x02:'MUL',0x03:'SUB',0x04:'DIV',0x05:'SDIV',0x06:'MOD',0x07:'SMOD',0x08:'ADDMOD',0x09:'MULMOD',0x0a:'EXP',0x0b:'SIGNEXTEND',
[codex:281657]     0x10:'LT',0x11:'GT',0x12:'SLT',0x13:'SGT',0x14:'EQ',0x15:'ISZERO',0x16:'AND',0x17:'OR',0x18:'XOR',0x19:'NOT',0x1a:'BYTE',0x1b:'SHL',0x1c:'SHR',0x1d:'SAR',
[codex:281657]     0x20:'SHA3',
[codex:281657]     0x30:'ADDRESS',0x31:'BALANCE',0x32:'ORIGIN',0x33:'CALLER',0x34:'CALLVALUE',0x35:'CALLDATALOAD',0x36:'CALLDATASIZE',0x37:'CALLDATACOPY',0x38:'CODESIZE',0x39:'CODECOPY',0x3a:'GASPRICE',0x3b:'EXTCODESIZE',0x3c:'EXTCODECOPY',0x3d:'RETURNDATASIZE',0x3e:'RETURNDATACOPY',0x3f:'EXTCODEHASH',
[codex:281657]     0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x46:'CHAINID',0x47:'SELFBALANCE',0x48:'BASEFEE',
[codex:281657]     0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x53:'MSTORE8',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x58:'PC',0x59:'MSIZE',0x5a:'GAS',0x5b:'JUMPDEST',
[codex:281657]     0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'
[codex:281657] }
[codex:281657] for i in range(1,17):
[codex:281657]     opnames[0x7f+i]=f'DUP{i}'
[codex:281657] for i in range(1,17):
[codex:281657]     opnames[0x8f+i]=f'SWAP{i}'
[codex:281657] for i in range(0,5):
[codex:281657]     opnames[0xa0+i]=f'LOG{i}'
[codex:281657] 
[codex:281657] 
[codex:281657] def disasm(start,end):
[codex:281657]     i=start
[codex:281657]     while i<end and i<len(bytecode):
[codex:281657]         op=bytecode[i]
[codex:281657]         name=opnames.get(op,f'OP{op:02x}')
[codex:281657]         if 0x60<=op<=0x7f:
[codex:281657]             n=op-0x5f
[codex:281657]             val=int.from_bytes(bytecode[i+1:i+1+n],'big')
[codex:281657]             print(f\"{i:04x}: PUSH{n} 0x{val:x}\")
[codex:281657]             i+=1+n
[codex:281657]         else:
[codex:281657]             print(f\"{i:04x}: {name}\")
[codex:281657]             i+=1
[codex:281657] 
[codex:281657] print('--- disasm 0xb3e-0xb90 ---')
[codex:281657] disasm(0xb3e,0xb90)
[codex:281657] PY" in /tmp/codex-multi-q6dbli10 succeeded in 32ms:
[codex:281657] --- disasm 0xb3e-0xb90 ---
[codex:281657] 0b3e: PUSH1 0xff
[codex:281657] 0b40: AND
[codex:281657] 0b41: ISZERO
[codex:281657] 0b42: ISZERO
[codex:281657] 0b43: PUSH2 0xb4b
[codex:281657] 0b46: JUMPI
[codex:281657] 0b47: PUSH2 0x0
[codex:281657] 0b4a: JUMP
[codex:281657] 0b4b: JUMPDEST
[codex:281657] 0b4c: DUP2
[codex:281657] 0b4d: CALLER
[codex:281657] 0b4e: PUSH1 0x2
[codex:281657] 0b50: PUSH1 0x0
[codex:281657] 0b52: DUP4
[codex:281657] 0b53: DUP2
[codex:281657] 0b54: MSTORE
[codex:281657] 0b55: PUSH1 0x20
[codex:281657] 0b57: ADD
[codex:281657] 0b58: SWAP1
[codex:281657] 
[codex:281657] thinking
[codex:281657] **Continuing exploration**
[codex:281657] exec
[codex:281657] /bin/bash -lc "python - <<'PY'
[codex:281657] import re
[codex:281657] from pathlib import Path
[codex:281657] hexdata=Path('BYTECODE_BUNDLE.txt').read_text()
[codex:281657] code=re.search(r'0x([0-9a-fA-F]+)', hexdata).group(1)
[codex:281657] bytecode=bytes.fromhex(code)
[codex:281657] 
[codex:281657] opnames={
[codex:281657]     0x00:'STOP',0x01:'ADD',0x02:'MUL',0x03:'SUB',0x04:'DIV',0x05:'SDIV',0x06:'MOD',0x07:'SMOD',0x08:'ADDMOD',0x09:'MULMOD',0x0a:'EXP',0x0b:'SIGNEXTEND',
[codex:281657]     0x10:'LT',0x11:'GT',0x12:'SLT',0x13:'SGT',0x14:'EQ',0x15:'ISZERO',0x16:'AND',0x17:'OR',0x18:'XOR',0x19:'NOT',0x1a:'BYTE',0x1b:'SHL',0x1c:'SHR',0x1d:'SAR',
[codex:281657]     0x20:'SHA3',
[codex:281657]     0x30:'ADDRESS',0x31:'BALANCE',0x32:'ORIGIN',0x33:'CALLER',0x34:'CALLVALUE',0x35:'CALLDATALOAD',0x36:'CALLDATASIZE',0x37:'CALLDATACOPY',0x38:'CODESIZE',0x39:'CODECOPY',0x3a:'GASPRICE',0x3b:'EXTCODESIZE',0x3c:'EXTCODECOPY',0x3d:'RETURNDATASIZE',0x3e:'RETURNDATACOPY',0x3f:'EXTCODEHASH',
[codex:281657]     0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x46:'CHAINID',0x47:'SELFBALANCE',0x48:'BASEFEE',
[codex:281657]     0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x53:'MSTORE8',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x58:'PC',0x59:'MSIZE',0x5a:'GAS',0x5b:'JUMPDEST',
[codex:281657]     0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'
[codex:281657] }
[codex:281657] for i in range(1,17):
[codex:281657]     opnames[0x7f+i]=f'DUP{i}'
[codex:281657] for i in range(1,17):
[codex:281657]     opnames[0x8f+i]=f'SWAP{i}'
[codex:281657] for i in range(0,5):
[codex:281657]     opnames[0xa0+i]=f'LOG{i}'
[codex:281657] 
[codex:281657] 
[codex:281657] def disasm(start,end):
[codex:281657]     i=start
[codex:281657]     while i<end and i<len(bytecode):
[codex:281657]         op=bytecode[i]
[codex:281657]         name=opnames.get(op,f'OP{op:02x}')
[codex:281657]         if 0x60<=op<=0x7f:
[codex:281657]             n=op-0x5f
[codex:281657]             val=int.from_bytes(bytecode[i+1:i+1+n],'big')
[codex:281657]             print(f\"{i:04x}: PUSH{n} 0x{val:x}\")
[codex:281657]             i+=1+n
[codex:281657]         else:
[codex:281657]             print(f\"{i:04x}: {name}\")
[codex:281657]             i+=1
[codex:281657] 
[codex:281657] print('--- disasm 0xb8f-0xbe5 ---')
[codex:281657] disasm(0xb8f,0xbe5)
[codex:281657] PY" in /tmp/codex-multi-q6dbli10 succeeded in 27ms:
[codex:281657] --- disasm 0xb8f-0xbe5 ---
[codex:281657] 0b8f: AND
[codex:281657] 0b90: DUP2
[codex:281657] 0b91: MSTORE
[codex:281657] 0b92: PUSH1 0x20
[codex:281657] 0b94: ADD
[codex:281657] 0b95: SWAP1
[codex:281657] 0b96: DUP2
[codex:281657] 0b97: MSTORE
[codex:281657] 0b98: PUSH1 0x20
[codex:281657] 0b9a: ADD
[codex:281657] 0b9b: PUSH1 0x0
[codex:281657] 0b9d: SHA3
[codex:281657] 0b9e: PUSH1 0x0
[codex:281657] 0ba0: SWAP1
[codex:281657] 0ba1: SLOAD
[codex:281657] 0ba2: SWAP1
[codex:281657] 0ba3: PUSH2 0x100
[codex:281657] 0ba6: EXP
[codex:281657] 0ba7: SWAP1
[codex:281657] 
[codex:281657] thinking
[codex:281657] **Analyzing multi-sig contract bytecode**
[codex:281657] exec
[codex:281657] /bin/bash -lc "python - <<'PY'
[codex:281657] import re
[codex:281657] from pathlib import Path
[codex:281657] hexdata=Path('BYTECODE_BUNDLE.txt').read_text()
[codex:281657] code=re.search(r'0x([0-9a-fA-F]+)', hexdata).group(1)
[codex:281657] bytecode=bytes.fromhex(code)
[codex:281657] 
[codex:281657] opnames={
[codex:281657]     0x00:'STOP',0x01:'ADD',0x02:'MUL',0x03:'SUB',0x04:'DIV',0x05:'SDIV',0x06:'MOD',0x07:'SMOD',0x08:'ADDMOD',0x09:'MULMOD',0x0a:'EXP',0x0b:'SIGNEXTEND',
[codex:281657]     0x10:'LT',0x11:'GT',0x12:'SLT',0x13:'SGT',0x14:'EQ',0x15:'ISZERO',0x16:'AND',0x17:'OR',0x18:'XOR',0x19:'NOT',0x1a:'BYTE',0x1b:'SHL',0x1c:'SHR',0x1d:'SAR',
[codex:281657]     0x20:'SHA3',
[codex:281657]     0x30:'ADDRESS',0x31:'BALANCE',0x32:'ORIGIN',0x33:'CALLER',0x34:'CALLVALUE',0x35:'CALLDATALOAD',0x36:'CALLDATASIZE',0x37:'CALLDATACOPY',0x38:'CODESIZE',0x39:'CODECOPY',0x3a:'GASPRICE',0x3b:'EXTCODESIZE',0x3c:'EXTCODECOPY',0x3d:'RETURNDATASIZE',0x3e:'RETURNDATACOPY',0x3f:'EXTCODEHASH',
[codex:281657]     0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x46:'CHAINID',0x47:'SELFBALANCE',0x48:'BASEFEE',
[codex:281657]     0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x53:'MSTORE8',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x58:'PC',0x59:'MSIZE',0x5a:'GAS',0x5b:'JUMPDEST',
[codex:281657]     0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'
[codex:281657] }
[codex:281657] for i in range(1,17):
[codex:281657]     opnames[0x7f+i]=f'DUP{i}'
[codex:281657] for i in range(1,17):
[codex:281657]     opnames[0x8f+i]=f'SWAP{i}'
[codex:281657] for i in range(0,5):
[codex:281657]     opnames[0xa0+i]=f'LOG{i}'
[codex:281657] 
[codex:281657] 
[codex:281657] def disasm(start,end):
[codex:281657]     i=start
[codex:281657]     while i<end and i<len(bytecode):
[codex:281657]         op=bytecode[i]
[codex:281657]         name=opnames.get(op,f'OP{op:02x}')
[codex:281657]         if 0x60<=op<=0x7f:
[codex:281657]             n=op-0x5f
[codex:281657]             val=int.from_bytes(bytecode[i+1:i+1+n],'big')
[codex:281657]             print(f\"{i:04x}: PUSH{n} 0x{val:x}\")
[codex:281657]             i+=1+n
[codex:281657]         else:
[codex:281657]             print(f\"{i:04x}: {name}\")
[codex:281657]             i+=1
[codex:281657] 
[codex:281657] print('--- disasm 0x700-0x780 ---')
[codex:281657] disasm(0x700,0x780)
[codex:281657] PY" in /tmp/codex-multi-q6dbli10 succeeded in 27ms:
[codex:281657] --- disasm 0x700-0x780 ---
[codex:281657] 0700: POP
[codex:281657] 0701: PUSH2 0x19e8
[codex:281657] 0704: JUMP
[codex:281657] 0705: JUMPDEST
[codex:281657] 0706: STOP
[codex:281657] 0707: JUMPDEST
[codex:281657] 0708: CALLVALUE
[codex:281657] 0709: PUSH2 0x0
[codex:281657] 070c: JUMPI
[codex:281657] 070d: PUSH2 0x784
[codex:281657] 0710: PUSH1 0x4
[codex:281657] 0712: DUP1
[codex:281657] 0713: DUP1
[codex:281657] 0714: CALLDATALOAD
[codex:281657] 0715: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
[codex:281657] 072a: AND
[codex:281657] 072b: SWAP1
[codex:281657] 072c: PUSH1 0x20
[codex:281657] 072e: ADD
[codex:281657] 
[codex:281657] thinking
[codex:281657] **Examining calldata decoding function**
[codex:281657] exec
[codex:281657] /bin/bash -lc "python - <<'PY'
[codex:281657] import re
[codex:281657] from pathlib import Path
[codex:281657] hexdata=Path('BYTECODE_BUNDLE.txt').read_text()
[codex:281657] code=re.search(r'0x([0-9a-fA-F]+)', hexdata).group(1)
[codex:281657] bytecode=bytes.fromhex(code)
[codex:281657] 
[codex:281657] opnames={
[codex:281657]     0x00:'STOP',0x01:'ADD',0x02:'MUL',0x03:'SUB',0x04:'DIV',0x05:'SDIV',0x06:'MOD',0x07:'SMOD',0x08:'ADDMOD',0x09:'MULMOD',0x0a:'EXP',0x0b:'SIGNEXTEND',
[codex:281657]     0x10:'LT',0x11:'GT',0x12:'SLT',0x13:'SGT',0x14:'EQ',0x15:'ISZERO',0x16:'AND',0x17:'OR',0x18:'XOR',0x19:'NOT',0x1a:'BYTE',0x1b:'SHL',0x1c:'SHR',0x1d:'SAR',
[codex:281657]     0x20:'SHA3',
[codex:281657]     0x30:'ADDRESS',0x31:'BALANCE',0x32:'ORIGIN',0x33:'CALLER',0x34:'CALLVALUE',0x35:'CALLDATALOAD',0x36:'CALLDATASIZE',0x37:'CALLDATACOPY',0x38:'CODESIZE',0x39:'CODECOPY',0x3a:'GASPRICE',0x3b:'EXTCODESIZE',0x3c:'EXTCODECOPY',0x3d:'RETURNDATASIZE',0x3e:'RETURNDATACOPY',0x3f:'EXTCODEHASH',
[codex:281657]     0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x46:'CHAINID',0x47:'SELFBALANCE',0x48:'BASEFEE',
[codex:281657]     0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x53:'MSTORE8',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x58:'PC',0x59:'MSIZE',0x5a:'GAS',0x5b:'JUMPDEST',
[codex:281657]     0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'
[codex:281657] }
[codex:281657] for i in range(1,17):
[codex:281657]     opnames[0x7f+i]=f'DUP{i}'
[codex:281657] for i in range(1,17):
[codex:281657]     opnames[0x8f+i]=f'SWAP{i}'
[codex:281657] for i in range(0,5):
[codex:281657]     opnames[0xa0+i]=f'LOG{i}'
[codex:281657] 
[codex:281657] 
[codex:281657] def disasm(start,end):
[codex:281657]     i=start
[codex:281657]     while i<end and i<len(bytecode):
[codex:281657]         op=bytecode[i]
[codex:281657]         name=opnames.get(op,f'OP{op:02x}')
[codex:281657]         if 0x60<=op<=0x7f:
[codex:281657]             n=op-0x5f
[codex:281657]             val=int.from_bytes(bytecode[i+1:i+1+n],'big')
[codex:281657]             print(f\"{i:04x}: PUSH{n} 0x{val:x}\")
[codex:281657]             i+=1+n
[codex:281657]         else:
[codex:281657]             print(f\"{i:04x}: {name}\")
[codex:281657]             i+=1
[codex:281657] 
[codex:281657] print('--- disasm 0x780-0x860 ---')
[codex:281657] disasm(0x780,0x860)
[codex:281657] PY" in /tmp/codex-multi-q6dbli10 succeeded in 29ms:
[codex:281657] --- disasm 0x780-0x860 ---
[codex:281657] 0780: PUSH2 0x1bca
[codex:281657] 0783: JUMP
[codex:281657] 0784: JUMPDEST
[codex:281657] 0785: PUSH1 0x40
[codex:281657] 0787: MLOAD
[codex:281657] 0788: DUP1
[codex:281657] 0789: DUP3
[codex:281657] 078a: DUP2
[codex:281657] 078b: MSTORE
[codex:281657] 078c: PUSH1 0x20
[codex:281657] 078e: ADD
[codex:281657] 078f: SWAP2
[codex:281657] 0790: POP
[codex:281657] 0791: POP
[codex:281657] 0792: PUSH1 0x40
[codex:281657] 0794: MLOAD
[codex:281657] 0795: DUP1
[codex:281657] 0796: SWAP2
[codex:281657] 0797: SUB
[codex:281657] 
[codex:281657] thinking
[codex:281657] **Analyzing submitTransaction ownership checks**
[codex:281657] exec
[codex:281657] /bin/bash -lc "python - <<'PY'
[codex:281657] import re
[codex:281657] from pathlib import Path
[codex:281657] hexdata=Path('BYTECODE_BUNDLE.txt').read_text()
[codex:281657] code=re.search(r'0x([0-9a-fA-F]+)', hexdata).group(1)
[codex:281657] bytecode=bytes.fromhex(code)
[codex:281657] 
[codex:281657] opnames={
[codex:281657]     0x00:'STOP',0x01:'ADD',0x02:'MUL',0x03:'SUB',0x04:'DIV',0x05:'SDIV',0x06:'MOD',0x07:'SMOD',0x08:'ADDMOD',0x09:'MULMOD',0x0a:'EXP',0x0b:'SIGNEXTEND',
[codex:281657]     0x10:'LT',0x11:'GT',0x12:'SLT',0x13:'SGT',0x14:'EQ',0x15:'ISZERO',0x16:'AND',0x17:'OR',0x18:'XOR',0x19:'NOT',0x1a:'BYTE',0x1b:'SHL',0x1c:'SHR',0x1d:'SAR',
[codex:281657]     0x20:'SHA3',
[codex:281657]     0x30:'ADDRESS',0x31:'BALANCE',0x32:'ORIGIN',0x33:'CALLER',0x34:'CALLVALUE',0x35:'CALLDATALOAD',0x36:'CALLDATASIZE',0x37:'CALLDATACOPY',0x38:'CODESIZE',0x39:'CODECOPY',0x3a:'GASPRICE',0x3b:'EXTCODESIZE',0x3c:'EXTCODECOPY',0x3d:'RETURNDATASIZE',0x3e:'RETURNDATACOPY',0x3f:'EXTCODEHASH',
[codex:281657]     0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x46:'CHAINID',0x47:'SELFBALANCE',0x48:'BASEFEE',
[codex:281657]     0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x53:'MSTORE8',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x58:'PC',0x59:'MSIZE',0x5a:'GAS',0x5b:'JUMPDEST',
[codex:281657]     0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'
[codex:281657] }
[codex:281657] for i in range(1,17):
[codex:281657]     opnames[0x7f+i]=f'DUP{i}'
[codex:281657] for i in range(1,17):
[codex:281657]     opnames[0x8f+i]=f'SWAP{i}'
[codex:281657] for i in range(0,5):
[codex:281657]     opnames[0xa0+i]=f'LOG{i}'
[codex:281657] 
[codex:281657] 
[codex:281657] def disasm(start,end):
[codex:281657]     i=start
[codex:281657]     while i<end and i<len(bytecode):
[codex:281657]         op=bytecode[i]
[codex:281657]         name=opnames.get(op,f'OP{op:02x}')
[codex:281657]         if 0x60<=op<=0x7f:
[codex:281657]             n=op-0x5f
[codex:281657]             val=int.from_bytes(bytecode[i+1:i+1+n],'big')
[codex:281657]             print(f\"{i:04x}: PUSH{n} 0x{val:x}\")
[codex:281657]             i+=1+n
[codex:281657]         else:
[codex:281657]             print(f\"{i:04x}: {name}\")
[codex:281657]             i+=1
[codex:281657] 
[codex:281657] print('--- disasm 0x1b00-0x1b70 ---')
[codex:281657] disasm(0x1b00,0x1b70)
[codex:281657] PY" in /tmp/codex-multi-q6dbli10 succeeded in 27ms:
[codex:281657] --- disasm 0x1b00-0x1b70 ---
[codex:281657] 1b00: MOD
[codex:281657] 1b01: JUMPI
[codex:281657] 1b02: PUSH2 0x0
[codex:281657] 1b05: JUMP
[codex:281657] 1b06: JUMPDEST
[codex:281657] 1b07: PUSH1 0x1
[codex:281657] 1b09: PUSH1 0x2
[codex:281657] 1b0b: PUSH1 0x0
[codex:281657] 1b0d: DUP8
[codex:281657] 1b0e: DUP2
[codex:281657] 1b0f: MSTORE
[codex:281657] 1b10: PUSH1 0x20
[codex:281657] 1b12: ADD
[codex:281657] 1b13: SWAP1
[codex:281657] 1b14: DUP2
[codex:281657] 1b15: MSTORE
[codex:281657] 1b16: PUSH1 0x20
[codex:281657] 1b18: ADD
[codex:281657] 1b19: PUSH1 0x0
[codex:281657] 
[codex:281657] thinking
[codex:281657] **Analyzing Gnosis MultiSig security**
[codex:281657] 
[codex:281657] I'm reviewing if the contract's known Gnosis MultiSig functions enforce proper ownership checks and prevent exploits like unauthorized owner setup or zero-threshold execution. I see standard protections like onlyWallet on addOwner, no public init loophole, and no selfdestruct calls, so no clear exploit path is present. I'll produce a JSON report confirming no findings per the user's instructions.
[codex:281657] codex
[codex:281657] {"no_findings":true,"summary":"Reviewed the full runtime bytecode bundle; the only external value transfer is a low-level CALL using stored transaction fields and appears gated by confirmation/owner logic. No concrete, exploitable path to extract ETH/tokens/NFTs was identified from bytecode alone.","findings":[]}
[codex:281657] tokens used
[codex:281657] 147,141
[codex:281657] {"no_findings":true,"summary":"Reviewed the full runtime bytecode bundle; the only external value transfer is a low-level CALL using stored transaction fields and appears gated by confirmation/owner logic. No concrete, exploitable path to extract ETH/tokens/NFTs was identified from bytecode alone.","findings":[]}
Metadata
{
    "codex": {
        "ran_at": "2026-01-01T20:28:17.506178+00:00",
        "returncode": 0
    },
    "summary": "Reviewed the full runtime bytecode bundle; the only external value transfer is a low-level CALL using stored transaction fields and appears gated by confirmation/owner logic. No concrete, exploitable path to extract ETH/tokens/NFTs was identified from bytecode alone.",
    "raw_final": {
        "summary": "Reviewed the full runtime bytecode bundle; the only external value transfer is a low-level CALL using stored transaction fields and appears gated by confirmation/owner logic. No concrete, exploitable path to extract ETH/tokens/NFTs was identified from bytecode alone.",
        "findings": [],
        "no_findings": true
    },
    "no_findings": true,
    "schema_version": 1
}

Opcode Heuristics

tool.cast_disasm
Delegatecall
0
Selfdestruct
0
CREATE2
0
CALL-family (heavy)
1
EXT*/BALANCE
0
Total opcodes
4482
Flags
No heuristic flags raised.
View cast disassembly output
00000000: PUSH1 0x60
00000002: PUSH1 0x40
00000004: MSTORE
00000005: CALLDATASIZE
00000006: ISZERO
00000007: PUSH2 0x011b
0000000a: JUMPI
0000000b: PUSH1 0x00
0000000d: CALLDATALOAD
0000000e: PUSH29 0x0100000000000000000000000000000000000000000000000000000000
0000002c: SWAP1
0000002d: DIV
0000002e: PUSH4 0xffffffff
00000033: AND
00000034: DUP1
00000035: PUSH4 0x025e7c27
0000003a: EQ
0000003b: PUSH2 0x017c
0000003e: JUMPI
0000003f: DUP1
00000040: PUSH4 0x173825d9
00000045: EQ
00000046: PUSH2 0x01d9
00000049: JUMPI
0000004a: DUP1
0000004b: PUSH4 0x20ea8d86
00000050: EQ
00000051: PUSH2 0x020c
00000054: JUMPI
00000055: DUP1
00000056: PUSH4 0x2f54bf6e
0000005b: EQ
0000005c: PUSH2 0x0229
0000005f: JUMPI
00000060: DUP1
00000061: PUSH4 0x3411c81c
00000066: EQ
00000067: PUSH2 0x0274
0000006a: JUMPI
0000006b: DUP1
0000006c: PUSH4 0x4c3a6ae0
00000071: EQ
00000072: PUSH2 0x02c8
00000075: JUMPI
00000076: DUP1
00000077: PUSH4 0x54741525
0000007c: EQ
0000007d: PUSH2 0x02ef
00000080: JUMPI
00000081: DUP1
00000082: PUSH4 0x7065cb48
00000087: EQ
00000088: PUSH2 0x032d
0000008b: JUMPI
0000008c: DUP1
0000008d: PUSH4 0x784547a7
00000092: EQ
00000093: PUSH2 0x0360
00000096: JUMPI
00000097: DUP1
00000098: PUSH4 0x8a88c4fe
0000009d: EQ
0000009e: PUSH2 0x0395
000000a1: JUMPI
000000a2: DUP1
000000a3: PUSH4 0x8b51d13f
000000a8: EQ
000000a9: PUSH2 0x03f0
000000ac: JUMPI
000000ad: DUP1
000000ae: PUSH4 0x9ace38c2
000000b3: EQ
000000b4: PUSH2 0x0421
000000b7: JUMPI
000000b8: DUP1
000000b9: PUSH4 0xa0e67e2b
000000be: EQ
000000bf: PUSH2 0x0519
000000c2: JUMPI
000000c3: DUP1
000000c4: PUSH4 0xa8abe69a
000000c9: EQ
000000ca: PUSH2 0x058b
000000cd: JUMPI
000000ce: DUP1
000000cf: PUSH4 0xb5dc40c3
000000d4: EQ
000000d5: PUSH2 0x062a
000000d8: JUMPI
000000d9: DUP1
000000da: PUSH4 0xb77bf600
000000df: EQ
000000e0: PUSH2 0x06aa
000000e3: JUMPI
000000e4: DUP1
000000e5: PUSH4 0xba51a6df
000000ea: EQ
000000eb: PUSH2 0x06cd
000000ee: JUMPI
000000ef: DUP1
000000f0: PUSH4 0xc01a8c84
000000f5: EQ
000000f6: PUSH2 0x06ea
000000f9: JUMPI
000000fa: DUP1
000000fb: PUSH4 0xc6427474
00000100: EQ
00000101: PUSH2 0x0707
00000104: JUMPI
00000105: DUP1
00000106: PUSH4 0xd74f8edd
0000010b: EQ
0000010c: PUSH2 0x079a
0000010f: JUMPI
00000110: DUP1
00000111: PUSH4 0xdc8452cd
00000116: EQ
00000117: PUSH2 0x07bd
0000011a: JUMPI
0000011b: JUMPDEST
0000011c: PUSH2 0x017a
0000011f: JUMPDEST
00000120: PUSH1 0x00
00000122: CALLVALUE
00000123: GT
00000124: ISZERO
00000125: PUSH2 0x0177
00000128: JUMPI
00000129: CALLER
0000012a: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
0000013f: AND
00000140: PUSH32 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c
00000161: CALLVALUE
00000162: PUSH1 0x40
00000164: MLOAD
00000165: DUP1
00000166: DUP3
00000167: DUP2
00000168: MSTORE
00000169: PUSH1 0x20
0000016b: ADD
0000016c: SWAP2
0000016d: POP
0000016e: POP
0000016f: PUSH1 0x40
00000171: MLOAD
00000172: DUP1
00000173: SWAP2
00000174: SUB
00000175: SWAP1
00000176: LOG2
00000177: JUMPDEST
00000178: JUMPDEST
00000179: JUMP
0000017a: JUMPDEST
0000017b: STOP
0000017c: JUMPDEST
0000017d: CALLVALUE
0000017e: PUSH2 0x0000
00000181: JUMPI
00000182: PUSH2 0x0197
00000185: PUSH1 0x04
00000187: DUP1
00000188: DUP1
00000189: CALLDATALOAD
0000018a: SWAP1
0000018b: PUSH1 0x20
0000018d: ADD
0000018e: SWAP1
0000018f: SWAP2
00000190: SWAP1
00000191: POP
00000192: POP
00000193: PUSH2 0x07e0
00000196: JUMP
00000197: JUMPDEST
00000198: PUSH1 0x40
0000019a: MLOAD
0000019b: DUP1
0000019c: DUP3
0000019d: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
000001b2: AND
000001b3: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
000001c8: AND
000001c9: DUP2
000001ca: MSTORE
000001cb: PUSH1 0x20
000001cd: ADD
000001ce: SWAP2
000001cf: POP
000001d0: POP
000001d1: PUSH1 0x40
000001d3: MLOAD
000001d4: DUP1
000001d5: SWAP2
000001d6: SUB
000001d7: SWAP1
000001d8: RETURN
000001d9: JUMPDEST
000001da: CALLVALUE
000001db: PUSH2 0x0000
000001de: JUMPI
000001df: PUSH2 0x020a
000001e2: PUSH1 0x04
000001e4: DUP1
000001e5: DUP1
000001e6: CALLDATALOAD
000001e7: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
000001fc: AND
000001fd: SWAP1
000001fe: PUSH1 0x20
00000200: ADD
00000201: SWAP1
00000202: SWAP2
00000203: SWAP1
00000204: POP
00000205: POP
00000206: PUSH2 0x081d
00000209: JUMP
0000020a: JUMPDEST
0000020b: STOP
0000020c: JUMPDEST
0000020d: CALLVALUE
0000020e: PUSH2 0x0000
00000211: JUMPI
00000212: PUSH2 0x0227
00000215: PUSH1 0x04
00000217: DUP1
00000218: DUP1
00000219: CALLDATALOAD
0000021a: SWAP1
0000021b: PUSH1 0x20
0000021d: ADD
0000021e: SWAP1
0000021f: SWAP2
00000220: SWAP1
00000221: POP
00000222: POP
00000223: PUSH2 0x0af2
00000226: JUMP
00000227: JUMPDEST
00000228: STOP
00000229: JUMPDEST
0000022a: CALLVALUE
0000022b: PUSH2 0x0000
0000022e: JUMPI
0000022f: PUSH2 0x025a
00000232: PUSH1 0x04
00000234: DUP1
00000235: DUP1
00000236: CALLDATALOAD
00000237: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
0000024c: AND
0000024d: SWAP1
0000024e: PUSH1 0x20
00000250: ADD
00000251: SWAP1
00000252: SWAP2
00000253: SWAP1
00000254: POP
00000255: POP
00000256: PUSH2 0x0ca0
00000259: JUMP
0000025a: JUMPDEST
0000025b: PUSH1 0x40
0000025d: MLOAD
0000025e: DUP1
0000025f: DUP3
00000260: ISZERO
00000261: ISZERO
00000262: ISZERO
00000263: ISZERO
00000264: DUP2
00000265: MSTORE
00000266: PUSH1 0x20
00000268: ADD
00000269: SWAP2
0000026a: POP
0000026b: POP
0000026c: PUSH1 0x40
0000026e: MLOAD
0000026f: DUP1
00000270: SWAP2
00000271: SUB
00000272: SWAP1
00000273: RETURN
00000274: JUMPDEST
00000275: CALLVALUE
00000276: PUSH2 0x0000
00000279: JUMPI
0000027a: PUSH2 0x02ae
0000027d: PUSH1 0x04
0000027f: DUP1
00000280: DUP1
00000281: CALLDATALOAD
00000282: SWAP1
00000283: PUSH1 0x20
00000285: ADD
00000286: SWAP1
00000287: SWAP2
00000288: SWAP1
00000289: DUP1
0000028a: CALLDATALOAD
0000028b: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
000002a0: AND
000002a1: SWAP1
000002a2: PUSH1 0x20
000002a4: ADD
000002a5: SWAP1
000002a6: SWAP2
000002a7: SWAP1
000002a8: POP
000002a9: POP
000002aa: PUSH2 0x0cc0
000002ad: JUMP
000002ae: JUMPDEST
000002af: PUSH1 0x40
000002b1: MLOAD
000002b2: DUP1
000002b3: DUP3
000002b4: ISZERO
000002b5: ISZERO
000002b6: ISZERO
000002b7: ISZERO
000002b8: DUP2
000002b9: MSTORE
000002ba: PUSH1 0x20
000002bc: ADD
000002bd: SWAP2
000002be: POP
000002bf: POP
000002c0: PUSH1 0x40
000002c2: MLOAD
000002c3: DUP1
000002c4: SWAP2
000002c5: SUB
000002c6: SWAP1
000002c7: RETURN
000002c8: JUMPDEST
000002c9: CALLVALUE
000002ca: PUSH2 0x0000
000002cd: JUMPI
000002ce: PUSH2 0x02d5
000002d1: PUSH2 0x0cef
000002d4: JUMP
000002d5: JUMPDEST
000002d6: PUSH1 0x40
000002d8: MLOAD
000002d9: DUP1
000002da: DUP3
000002db: ISZERO
000002dc: ISZERO
000002dd: ISZERO
000002de: ISZERO
000002df: DUP2
000002e0: MSTORE
000002e1: PUSH1 0x20
000002e3: ADD
000002e4: SWAP2
000002e5: POP
000002e6: POP
000002e7: PUSH1 0x40
000002e9: MLOAD
000002ea: DUP1
000002eb: SWAP2
000002ec: SUB
000002ed: SWAP1
000002ee: RETURN
000002ef: JUMPDEST
000002f0: CALLVALUE
000002f1: PUSH2 0x0000
000002f4: JUMPI
000002f5: PUSH2 0x0317
000002f8: PUSH1 0x04
000002fa: DUP1
000002fb: DUP1
000002fc: CALLDATALOAD
000002fd: ISZERO
000002fe: ISZERO
000002ff: SWAP1
00000300: PUSH1 0x20
00000302: ADD
00000303: SWAP1
00000304: SWAP2
00000305: SWAP1
00000306: DUP1
00000307: CALLDATALOAD
00000308: ISZERO
00000309: ISZERO
0000030a: SWAP1
0000030b: PUSH1 0x20
0000030d: ADD
0000030e: SWAP1
0000030f: SWAP2
00000310: SWAP1
00000311: POP
00000312: POP
00000313: PUSH2 0x0d02
00000316: JUMP
00000317: JUMPDEST
00000318: PUSH1 0x40
0000031a: MLOAD
0000031b: DUP1
0000031c: DUP3
0000031d: DUP2
0000031e: MSTORE
0000031f: PUSH1 0x20
00000321: ADD
00000322: SWAP2
00000323: POP
00000324: POP
00000325: PUSH1 0x40
00000327: MLOAD
00000328: DUP1
00000329: SWAP2
0000032a: SUB
0000032b: SWAP1
0000032c: RETURN
0000032d: JUMPDEST
0000032e: CALLVALUE
0000032f: PUSH2 0x0000
00000332: JUMPI
00000333: PUSH2 0x035e
00000336: PUSH1 0x04
00000338: DUP1
00000339: DUP1
0000033a: CALLDATALOAD
0000033b: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00000350: AND
00000351: SWAP1
00000352: PUSH1 0x20
00000354: ADD
00000355: SWAP1
00000356: SWAP2
00000357: SWAP1
00000358: POP
00000359: POP
0000035a: PUSH2 0x0d99
0000035d: JUMP
0000035e: JUMPDEST
0000035f: STOP
00000360: JUMPDEST
00000361: CALLVALUE
00000362: PUSH2 0x0000
00000365: JUMPI
00000366: PUSH2 0x037b
00000369: PUSH1 0x04
0000036b: DUP1
0000036c: DUP1
0000036d: CALLDATALOAD
0000036e: SWAP1
0000036f: PUSH1 0x20
00000371: ADD
00000372: SWAP1
00000373: SWAP2
00000374: SWAP1
00000375: POP
00000376: POP
00000377: PUSH2 0x0fd9
0000037a: JUMP
0000037b: JUMPDEST
0000037c: PUSH1 0x40
0000037e: MLOAD
0000037f: DUP1
00000380: DUP3
00000381: ISZERO
00000382: ISZERO
00000383: ISZERO
00000384: ISZERO
00000385: DUP2
00000386: MSTORE
00000387: PUSH1 0x20
00000389: ADD
0000038a: SWAP2
0000038b: POP
0000038c: POP
0000038d: PUSH1 0x40
0000038f: MLOAD
00000390: DUP1
00000391: SWAP2
00000392: SUB
00000393: SWAP1
00000394: RETURN
00000395: JUMPDEST
00000396: CALLVALUE
00000397: PUSH2 0x0000
0000039a: JUMPI
0000039b: PUSH2 0x03ee
0000039e: PUSH1 0x04
000003a0: DUP1
000003a1: DUP1
000003a2: CALLDATALOAD
000003a3: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
000003b8: AND
000003b9: SWAP1
000003ba: PUSH1 0x20
000003bc: ADD
000003bd: SWAP1
000003be: SWAP2
000003bf: SWAP1
000003c0: DUP1
000003c1: CALLDATALOAD
000003c2: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
000003d7: AND
000003d8: SWAP1
000003d9: PUSH1 0x20
000003db: ADD
000003dc: SWAP1
000003dd: SWAP2
000003de: SWAP1
000003df: DUP1
000003e0: CALLDATALOAD
000003e1: SWAP1
000003e2: PUSH1 0x20
000003e4: ADD
000003e5: SWAP1
000003e6: SWAP2
000003e7: SWAP1
000003e8: POP
000003e9: POP
000003ea: PUSH2 0x10c0
000003ed: JUMP
000003ee: JUMPDEST
000003ef: STOP
000003f0: JUMPDEST
000003f1: CALLVALUE
000003f2: PUSH2 0x0000
000003f5: JUMPI
000003f6: PUSH2 0x040b
000003f9: PUSH1 0x04
000003fb: DUP1
000003fc: DUP1
000003fd: CALLDATALOAD
000003fe: SWAP1
000003ff: PUSH1 0x20
00000401: ADD
00000402: SWAP1
00000403: SWAP2
00000404: SWAP1
00000405: POP
00000406: POP
00000407: PUSH2 0x13bb
0000040a: JUMP
0000040b: JUMPDEST
0000040c: PUSH1 0x40
0000040e: MLOAD
0000040f: DUP1
00000410: DUP3
00000411: DUP2
00000412: MSTORE
00000413: PUSH1 0x20
00000415: ADD
00000416: SWAP2
00000417: POP
00000418: POP
00000419: PUSH1 0x40
0000041b: MLOAD
0000041c: DUP1
0000041d: SWAP2
0000041e: SUB
0000041f: SWAP1
00000420: RETURN
00000421: JUMPDEST
00000422: CALLVALUE
00000423: PUSH2 0x0000
00000426: JUMPI
00000427: PUSH2 0x043c
0000042a: PUSH1 0x04
0000042c: DUP1
0000042d: DUP1
0000042e: CALLDATALOAD
0000042f: SWAP1
00000430: PUSH1 0x20
00000432: ADD
00000433: SWAP1
00000434: SWAP2
00000435: SWAP1
00000436: POP
00000437: POP
00000438: PUSH2 0x1488
0000043b: JUMP
0000043c: JUMPDEST
0000043d: PUSH1 0x40
0000043f: MLOAD
00000440: DUP1
00000441: DUP6
00000442: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00000457: AND
00000458: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
0000046d: AND
0000046e: DUP2
0000046f: MSTORE
00000470: PUSH1 0x20
00000472: ADD
00000473: DUP5
00000474: DUP2
00000475: MSTORE
00000476: PUSH1 0x20
00000478: ADD
00000479: DUP1
0000047a: PUSH1 0x20
0000047c: ADD
0000047d: DUP4
0000047e: ISZERO
0000047f: ISZERO
00000480: ISZERO
00000481: ISZERO
00000482: DUP2
00000483: MSTORE
00000484: PUSH1 0x20
00000486: ADD
00000487: DUP3
00000488: DUP2
00000489: SUB
0000048a: DUP3
0000048b: MSTORE
0000048c: DUP5
0000048d: DUP2
0000048e: DUP2
0000048f: SLOAD
00000490: PUSH1 0x01
00000492: DUP2
00000493: PUSH1 0x01
00000495: AND
00000496: ISZERO
00000497: PUSH2 0x0100
0000049a: MUL
0000049b: SUB
0000049c: AND
0000049d: PUSH1 0x02
0000049f: SWAP1
000004a0: DIV
000004a1: DUP2
000004a2: MSTORE
000004a3: PUSH1 0x20
000004a5: ADD
000004a6: SWAP2
000004a7: POP
000004a8: DUP1
000004a9: SLOAD
000004aa: PUSH1 0x01
000004ac: DUP2
000004ad: PUSH1 0x01
000004af: AND
000004b0: ISZERO
000004b1: PUSH2 0x0100
000004b4: MUL
000004b5: SUB
000004b6: AND
000004b7: PUSH1 0x02
000004b9: SWAP1
000004ba: DIV
000004bb: DUP1
000004bc: ISZERO
000004bd: PUSH2 0x0507
000004c0: JUMPI
000004c1: DUP1
000004c2: PUSH1 0x1f
000004c4: LT
000004c5: PUSH2 0x04dc
000004c8: JUMPI
000004c9: PUSH2 0x0100
000004cc: DUP1
000004cd: DUP4
000004ce: SLOAD
000004cf: DIV
000004d0: MUL
000004d1: DUP4
000004d2: MSTORE
000004d3: SWAP2
000004d4: PUSH1 0x20
000004d6: ADD
000004d7: SWAP2
000004d8: PUSH2 0x0507
000004db: JUMP
000004dc: JUMPDEST
000004dd: DUP3
000004de: ADD
000004df: SWAP2
000004e0: SWAP1
000004e1: PUSH1 0x00
000004e3: MSTORE
000004e4: PUSH1 0x20
000004e6: PUSH1 0x00
000004e8: KECCAK256
000004e9: SWAP1
000004ea: JUMPDEST
000004eb: DUP2
000004ec: SLOAD
000004ed: DUP2
000004ee: MSTORE
000004ef: SWAP1
000004f0: PUSH1 0x01
000004f2: ADD
000004f3: SWAP1
000004f4: PUSH1 0x20
000004f6: ADD
000004f7: DUP1
000004f8: DUP4
000004f9: GT
000004fa: PUSH2 0x04ea
000004fd: JUMPI
000004fe: DUP3
000004ff: SWAP1
00000500: SUB
00000501: PUSH1 0x1f
00000503: AND
00000504: DUP3
00000505: ADD
00000506: SWAP2
00000507: JUMPDEST
00000508: POP
00000509: POP
0000050a: SWAP6
0000050b: POP
0000050c: POP
0000050d: POP
0000050e: POP
0000050f: POP
00000510: POP
00000511: PUSH1 0x40
00000513: MLOAD
00000514: DUP1
00000515: SWAP2
00000516: SUB
00000517: SWAP1
00000518: RETURN
00000519: JUMPDEST
0000051a: CALLVALUE
0000051b: PUSH2 0x0000
0000051e: JUMPI
0000051f: PUSH2 0x0526
00000522: PUSH2 0x14e4
00000525: JUMP
00000526: JUMPDEST
00000527: PUSH1 0x40
00000529: MLOAD
0000052a: DUP1
0000052b: DUP1
0000052c: PUSH1 0x20
0000052e: ADD
0000052f: DUP3
00000530: DUP2
00000531: SUB
00000532: DUP3
00000533: MSTORE
00000534: DUP4
00000535: DUP2
00000536: DUP2
00000537: MLOAD
00000538: DUP2
00000539: MSTORE
0000053a: PUSH1 0x20
0000053c: ADD
0000053d: SWAP2
0000053e: POP
0000053f: DUP1
00000540: MLOAD
00000541: SWAP1
00000542: PUSH1 0x20
00000544: ADD
00000545: SWAP1
00000546: PUSH1 0x20
00000548: MUL
00000549: DUP1
0000054a: DUP4
0000054b: DUP4
0000054c: PUSH1 0x00
0000054e: DUP4
0000054f: EQ
00000550: PUSH2 0x0578
00000553: JUMPI
00000554: JUMPDEST
00000555: DUP1
00000556: MLOAD
00000557: DUP3
00000558: MSTORE
00000559: PUSH1 0x20
0000055b: DUP4
0000055c: GT
0000055d: ISZERO
0000055e: PUSH2 0x0578
00000561: JUMPI
00000562: PUSH1 0x20
00000564: DUP3
00000565: ADD
00000566: SWAP2
00000567: POP
00000568: PUSH1 0x20
0000056a: DUP2
0000056b: ADD
0000056c: SWAP1
0000056d: POP
0000056e: PUSH1 0x20
00000570: DUP4
00000571: SUB
00000572: SWAP3
00000573: POP
00000574: PUSH2 0x0554
00000577: JUMP
00000578: JUMPDEST
00000579: POP
0000057a: POP
0000057b: POP
0000057c: SWAP1
0000057d: POP
0000057e: ADD
0000057f: SWAP3
00000580: POP
00000581: POP
00000582: POP
00000583: PUSH1 0x40
00000585: MLOAD
00000586: DUP1
00000587: SWAP2
00000588: SUB
00000589: SWAP1
0000058a: RETURN
0000058b: JUMPDEST
0000058c: CALLVALUE
0000058d: PUSH2 0x0000
00000590: JUMPI
00000591: PUSH2 0x05c5
00000594: PUSH1 0x04
00000596: DUP1
00000597: DUP1
00000598: CALLDATALOAD
00000599: SWAP1
0000059a: PUSH1 0x20
0000059c: ADD
0000059d: SWAP1
0000059e: SWAP2
0000059f: SWAP1
000005a0: DUP1
000005a1: CALLDATALOAD
000005a2: SWAP1
000005a3: PUSH1 0x20
000005a5: ADD
000005a6: SWAP1
000005a7: SWAP2
000005a8: SWAP1
000005a9: DUP1
000005aa: CALLDATALOAD
000005ab: ISZERO
000005ac: ISZERO
000005ad: SWAP1
000005ae: PUSH1 0x20
000005b0: ADD
000005b1: SWAP1
000005b2: SWAP2
000005b3: SWAP1
000005b4: DUP1
000005b5: CALLDATALOAD
000005b6: ISZERO
000005b7: ISZERO
000005b8: SWAP1
000005b9: PUSH1 0x20
000005bb: ADD
000005bc: SWAP1
000005bd: SWAP2
000005be: SWAP1
000005bf: POP
000005c0: POP
000005c1: PUSH2 0x1582
000005c4: JUMP
000005c5: JUMPDEST
000005c6: PUSH1 0x40
000005c8: MLOAD
000005c9: DUP1
000005ca: DUP1
000005cb: PUSH1 0x20
000005cd: ADD
000005ce: DUP3
000005cf: DUP2
000005d0: SUB
000005d1: DUP3
000005d2: MSTORE
000005d3: DUP4
000005d4: DUP2
000005d5: DUP2
000005d6: MLOAD
000005d7: DUP2
000005d8: MSTORE
000005d9: PUSH1 0x20
000005db: ADD
000005dc: SWAP2
000005dd: POP
000005de: DUP1
000005df: MLOAD
000005e0: SWAP1
000005e1: PUSH1 0x20
000005e3: ADD
000005e4: SWAP1
000005e5: PUSH1 0x20
000005e7: MUL
000005e8: DUP1
000005e9: DUP4
000005ea: DUP4
000005eb: PUSH1 0x00
000005ed: DUP4
000005ee: EQ
000005ef: PUSH2 0x0617
000005f2: JUMPI
000005f3: JUMPDEST
000005f4: DUP1
000005f5: MLOAD
000005f6: DUP3
000005f7: MSTORE
000005f8: PUSH1 0x20
000005fa: DUP4
000005fb: GT
000005fc: ISZERO
000005fd: PUSH2 0x0617
00000600: JUMPI
00000601: PUSH1 0x20
00000603: DUP3
00000604: ADD
00000605: SWAP2
00000606: POP
00000607: PUSH1 0x20
00000609: DUP2
0000060a: ADD
0000060b: SWAP1
0000060c: POP
0000060d: PUSH1 0x20
0000060f: DUP4
00000610: SUB
00000611: SWAP3
00000612: POP
00000613: PUSH2 0x05f3
00000616: JUMP
00000617: JUMPDEST
00000618: POP
00000619: POP
0000061a: POP
0000061b: SWAP1
0000061c: POP
0000061d: ADD
0000061e: SWAP3
0000061f: POP
00000620: POP
00000621: POP
00000622: PUSH1 0x40
00000624: MLOAD
00000625: DUP1
00000626: SWAP2
00000627: SUB
00000628: SWAP1
00000629: RETURN
0000062a: JUMPDEST
0000062b: CALLVALUE
0000062c: PUSH2 0x0000
0000062f: JUMPI
00000630: PUSH2 0x0645
00000633: PUSH1 0x04
00000635: DUP1
00000636: DUP1
00000637: CALLDATALOAD
00000638: SWAP1
00000639: PUSH1 0x20
0000063b: ADD
0000063c: SWAP1
0000063d: SWAP2
0000063e: SWAP1
0000063f: POP
00000640: POP
00000641: PUSH2 0x16ef
00000644: JUMP
00000645: JUMPDEST
00000646: PUSH1 0x40
00000648: MLOAD
00000649: DUP1
0000064a: DUP1
0000064b: PUSH1 0x20
0000064d: ADD
0000064e: DUP3
0000064f: DUP2
00000650: SUB
00000651: DUP3
00000652: MSTORE
00000653: DUP4
00000654: DUP2
00000655: DUP2
00000656: MLOAD
00000657: DUP2
00000658: MSTORE
00000659: PUSH1 0x20
0000065b: ADD
0000065c: SWAP2
0000065d: POP
0000065e: DUP1
0000065f: MLOAD
00000660: SWAP1
00000661: PUSH1 0x20
00000663: ADD
00000664: SWAP1
00000665: PUSH1 0x20
00000667: MUL
00000668: DUP1
00000669: DUP4
0000066a: DUP4
0000066b: PUSH1 0x00
0000066d: DUP4
0000066e: EQ
0000066f: PUSH2 0x0697
00000672: JUMPI
00000673: JUMPDEST
00000674: DUP1
00000675: MLOAD
00000676: DUP3
00000677: MSTORE
00000678: PUSH1 0x20
0000067a: DUP4
0000067b: GT
0000067c: ISZERO
0000067d: PUSH2 0x0697
00000680: JUMPI
00000681: PUSH1 0x20
00000683: DUP3
00000684: ADD
00000685: SWAP2
00000686: POP
00000687: PUSH1 0x20
00000689: DUP2
0000068a: ADD
0000068b: SWAP1
0000068c: POP
0000068d: PUSH1 0x20
0000068f: DUP4
00000690: SUB
00000691: SWAP3
00000692: POP
00000693: PUSH2 0x0673
00000696: JUMP
00000697: JUMPDEST
00000698: POP
00000699: POP
0000069a: POP
0000069b: SWAP1
0000069c: POP
0000069d: ADD
0000069e: SWAP3
0000069f: POP
000006a0: POP
000006a1: POP
000006a2: PUSH1 0x40
000006a4: MLOAD
000006a5: DUP1
000006a6: SWAP2
000006a7: SUB
000006a8: SWAP1
000006a9: RETURN
000006aa: JUMPDEST
000006ab: CALLVALUE
000006ac: PUSH2 0x0000
000006af: JUMPI
000006b0: PUSH2 0x06b7
000006b3: PUSH2 0x1924
000006b6: JUMP
000006b7: JUMPDEST
000006b8: PUSH1 0x40
000006ba: MLOAD
000006bb: DUP1
000006bc: DUP3
000006bd: DUP2
000006be: MSTORE
000006bf: PUSH1 0x20
000006c1: ADD
000006c2: SWAP2
000006c3: POP
000006c4: POP
000006c5: PUSH1 0x40
000006c7: MLOAD
000006c8: DUP1
000006c9: SWAP2
000006ca: SUB
000006cb: SWAP1
000006cc: RETURN
000006cd: JUMPDEST
000006ce: CALLVALUE
000006cf: PUSH2 0x0000
000006d2: JUMPI
000006d3: PUSH2 0x06e8
000006d6: PUSH1 0x04
000006d8: DUP1
000006d9: DUP1
000006da: CALLDATALOAD
000006db: SWAP1
000006dc: PUSH1 0x20
000006de: ADD
000006df: SWAP1
000006e0: SWAP2
000006e1: SWAP1
000006e2: POP
000006e3: POP
000006e4: PUSH2 0x192a
000006e7: JUMP
000006e8: JUMPDEST
000006e9: STOP
000006ea: JUMPDEST
000006eb: CALLVALUE
000006ec: PUSH2 0x0000
000006ef: JUMPI
000006f0: PUSH2 0x0705
000006f3: PUSH1 0x04
000006f5: DUP1
000006f6: DUP1
000006f7: CALLDATALOAD
000006f8: SWAP1
000006f9: PUSH1 0x20
000006fb: ADD
000006fc: SWAP1
000006fd: SWAP2
000006fe: SWAP1
000006ff: POP
00000700: POP
00000701: PUSH2 0x19e8
00000704: JUMP
00000705: JUMPDEST
00000706: STOP
00000707: JUMPDEST
00000708: CALLVALUE
00000709: PUSH2 0x0000
0000070c: JUMPI
0000070d: PUSH2 0x0784
00000710: PUSH1 0x04
00000712: DUP1
00000713: DUP1
00000714: CALLDATALOAD
00000715: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
0000072a: AND
0000072b: SWAP1
0000072c: PUSH1 0x20
0000072e: ADD
0000072f: SWAP1
00000730: SWAP2
00000731: SWAP1
00000732: DUP1
00000733: CALLDATALOAD
00000734: SWAP1
00000735: PUSH1 0x20
00000737: ADD
00000738: SWAP1
00000739: SWAP2
0000073a: SWAP1
0000073b: DUP1
0000073c: CALLDATALOAD
0000073d: SWAP1
0000073e: PUSH1 0x20
00000740: ADD
00000741: SWAP1
00000742: DUP3
00000743: ADD
00000744: DUP1
00000745: CALLDATALOAD
00000746: SWAP1
00000747: PUSH1 0x20
00000749: ADD
0000074a: SWAP1
0000074b: DUP1
0000074c: DUP1
0000074d: PUSH1 0x1f
0000074f: ADD
00000750: PUSH1 0x20
00000752: DUP1
00000753: SWAP2
00000754: DIV
00000755: MUL
00000756: PUSH1 0x20
00000758: ADD
00000759: PUSH1 0x40
0000075b: MLOAD
0000075c: SWAP1
0000075d: DUP2
0000075e: ADD
0000075f: PUSH1 0x40
00000761: MSTORE
00000762: DUP1
00000763: SWAP4
00000764: SWAP3
00000765: SWAP2
00000766: SWAP1
00000767: DUP2
00000768: DUP2
00000769: MSTORE
0000076a: PUSH1 0x20
0000076c: ADD
0000076d: DUP4
0000076e: DUP4
0000076f: DUP1
00000770: DUP3
00000771: DUP5
00000772: CALLDATACOPY
00000773: DUP3
00000774: ADD
00000775: SWAP2
00000776: POP
00000777: POP
00000778: POP
00000779: POP
0000077a: POP
0000077b: POP
0000077c: SWAP2
0000077d: SWAP1
0000077e: POP
0000077f: POP
00000780: PUSH2 0x1bca
00000783: JUMP
00000784: JUMPDEST
00000785: PUSH1 0x40
00000787: MLOAD
00000788: DUP1
00000789: DUP3
0000078a: DUP2
0000078b: MSTORE
0000078c: PUSH1 0x20
0000078e: ADD
0000078f: SWAP2
00000790: POP
00000791: POP
00000792: PUSH1 0x40
00000794: MLOAD
00000795: DUP1
00000796: SWAP2
00000797: SUB
00000798: SWAP1
00000799: RETURN
0000079a: JUMPDEST
0000079b: CALLVALUE
0000079c: PUSH2 0x0000
0000079f: JUMPI
000007a0: PUSH2 0x07a7
000007a3: PUSH2 0x1bea
000007a6: JUMP
000007a7: JUMPDEST
000007a8: PUSH1 0x40
000007aa: MLOAD
000007ab: DUP1
000007ac: DUP3
000007ad: DUP2
000007ae: MSTORE
000007af: PUSH1 0x20
000007b1: ADD
000007b2: SWAP2
000007b3: POP
000007b4: POP
000007b5: PUSH1 0x40
000007b7: MLOAD
000007b8: DUP1
000007b9: SWAP2
000007ba: SUB
000007bb: SWAP1
000007bc: RETURN
000007bd: JUMPDEST
000007be: CALLVALUE
000007bf: PUSH2 0x0000
000007c2: JUMPI
000007c3: PUSH2 0x07ca
000007c6: PUSH2 0x1bef
000007c9: JUMP
000007ca: JUMPDEST
000007cb: PUSH1 0x40
000007cd: MLOAD
000007ce: DUP1
000007cf: DUP3
000007d0: DUP2
000007d1: MSTORE
000007d2: PUSH1 0x20
000007d4: ADD
000007d5: SWAP2
000007d6: POP
000007d7: POP
000007d8: PUSH1 0x40
000007da: MLOAD
000007db: DUP1
000007dc: SWAP2
000007dd: SUB
000007de: SWAP1
000007df: RETURN
000007e0: JUMPDEST
000007e1: PUSH1 0x04
000007e3: DUP2
000007e4: DUP2
000007e5: SLOAD
000007e6: DUP2
000007e7: LT
000007e8: ISZERO
000007e9: PUSH2 0x0000
000007ec: JUMPI
000007ed: SWAP1
000007ee: PUSH1 0x00
000007f0: MSTORE
000007f1: PUSH1 0x20
000007f3: PUSH1 0x00
000007f5: KECCAK256
000007f6: SWAP1
000007f7: ADD
000007f8: PUSH1 0x00
000007fa: JUMPDEST
000007fb: SWAP2
000007fc: POP
000007fd: SLOAD
000007fe: SWAP1
000007ff: PUSH2 0x0100
00000802: EXP
00000803: SWAP1
00000804: DIV
00000805: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
0000081a: AND
0000081b: DUP2
0000081c: JUMP
0000081d: JUMPDEST
0000081e: PUSH1 0x00
00000820: ADDRESS
00000821: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00000836: AND
00000837: CALLER
00000838: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
0000084d: AND
0000084e: EQ
0000084f: ISZERO
00000850: ISZERO
00000851: PUSH2 0x0859
00000854: JUMPI
00000855: PUSH2 0x0000
00000858: JUMP
00000859: JUMPDEST
0000085a: DUP2
0000085b: PUSH1 0x03
0000085d: PUSH1 0x00
0000085f: DUP3
00000860: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00000875: AND
00000876: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
0000088b: AND
0000088c: DUP2
0000088d: MSTORE
0000088e: PUSH1 0x20
00000890: ADD
00000891: SWAP1
00000892: DUP2
00000893: MSTORE
00000894: PUSH1 0x20
00000896: ADD
00000897: PUSH1 0x00
00000899: KECCAK256
0000089a: PUSH1 0x00
0000089c: SWAP1
0000089d: SLOAD
0000089e: SWAP1
0000089f: PUSH2 0x0100
000008a2: EXP
000008a3: SWAP1
000008a4: DIV
000008a5: PUSH1 0xff
000008a7: AND
000008a8: ISZERO
000008a9: ISZERO
000008aa: PUSH2 0x08b2
000008ad: JUMPI
000008ae: PUSH2 0x0000
000008b1: JUMP
000008b2: JUMPDEST
000008b3: PUSH1 0x00
000008b5: PUSH1 0x03
000008b7: PUSH1 0x00
000008b9: DUP6
000008ba: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
000008cf: AND
000008d0: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
000008e5: AND
000008e6: DUP2
000008e7: MSTORE
000008e8: PUSH1 0x20
000008ea: ADD
000008eb: SWAP1
000008ec: DUP2
000008ed: MSTORE
000008ee: PUSH1 0x20
000008f0: ADD
000008f1: PUSH1 0x00
000008f3: KECCAK256
000008f4: PUSH1 0x00
000008f6: PUSH2 0x0100
000008f9: EXP
000008fa: DUP2
000008fb: SLOAD
000008fc: DUP2
000008fd: PUSH1 0xff
000008ff: MUL
00000900: NOT
00000901: AND
00000902: SWAP1
00000903: DUP4
00000904: ISZERO
00000905: ISZERO
00000906: MUL
00000907: OR
00000908: SWAP1
00000909: SSTORE
0000090a: POP
0000090b: PUSH1 0x00
0000090d: SWAP2
0000090e: POP
0000090f: JUMPDEST
00000910: PUSH1 0x01
00000912: PUSH1 0x04
00000914: DUP1
00000915: SLOAD
00000916: SWAP1
00000917: POP
00000918: SUB
00000919: DUP3
0000091a: LT
0000091b: ISZERO
0000091c: PUSH2 0x0a35
0000091f: JUMPI
00000920: DUP3
00000921: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00000936: AND
00000937: PUSH1 0x04
00000939: DUP4
0000093a: DUP2
0000093b: SLOAD
0000093c: DUP2
0000093d: LT
0000093e: ISZERO
0000093f: PUSH2 0x0000
00000942: JUMPI
00000943: SWAP1
00000944: PUSH1 0x00
00000946: MSTORE
00000947: PUSH1 0x20
00000949: PUSH1 0x00
0000094b: KECCAK256
0000094c: SWAP1
0000094d: ADD
0000094e: PUSH1 0x00
00000950: JUMPDEST
00000951: SWAP1
00000952: SLOAD
00000953: SWAP1
00000954: PUSH2 0x0100
00000957: EXP
00000958: SWAP1
00000959: DIV
0000095a: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
0000096f: AND
00000970: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00000985: AND
00000986: EQ
00000987: ISZERO
00000988: PUSH2 0x0a27
0000098b: JUMPI
0000098c: PUSH1 0x04
0000098e: PUSH1 0x01
00000990: PUSH1 0x04
00000992: DUP1
00000993: SLOAD
00000994: SWAP1
00000995: POP
00000996: SUB
00000997: DUP2
00000998: SLOAD
00000999: DUP2
0000099a: LT
0000099b: ISZERO
0000099c: PUSH2 0x0000
0000099f: JUMPI
000009a0: SWAP1
000009a1: PUSH1 0x00
000009a3: MSTORE
000009a4: PUSH1 0x20
000009a6: PUSH1 0x00
000009a8: KECCAK256
000009a9: SWAP1
000009aa: ADD
000009ab: PUSH1 0x00
000009ad: JUMPDEST
000009ae: SWAP1
000009af: SLOAD
000009b0: SWAP1
000009b1: PUSH2 0x0100
000009b4: EXP
000009b5: SWAP1
000009b6: DIV
000009b7: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
000009cc: AND
000009cd: PUSH1 0x04
000009cf: DUP4
000009d0: DUP2
000009d1: SLOAD
000009d2: DUP2
000009d3: LT
000009d4: ISZERO
000009d5: PUSH2 0x0000
000009d8: JUMPI
000009d9: SWAP1
000009da: PUSH1 0x00
000009dc: MSTORE
000009dd: PUSH1 0x20
000009df: PUSH1 0x00
000009e1: KECCAK256
000009e2: SWAP1
000009e3: ADD
000009e4: PUSH1 0x00
000009e6: JUMPDEST
000009e7: PUSH2 0x0100
000009ea: EXP
000009eb: DUP2
000009ec: SLOAD
000009ed: DUP2
000009ee: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00000a03: MUL
00000a04: NOT
00000a05: AND
00000a06: SWAP1
00000a07: DUP4
00000a08: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00000a1d: AND
00000a1e: MUL
00000a1f: OR
00000a20: SWAP1
00000a21: SSTORE
00000a22: POP
00000a23: PUSH2 0x0a35
00000a26: JUMP
00000a27: JUMPDEST
00000a28: JUMPDEST
00000a29: DUP2
00000a2a: DUP1
00000a2b: PUSH1 0x01
00000a2d: ADD
00000a2e: SWAP3
00000a2f: POP
00000a30: POP
00000a31: PUSH2 0x090f
00000a34: JUMP
00000a35: JUMPDEST
00000a36: PUSH1 0x01
00000a38: PUSH1 0x04
00000a3a: DUP2
00000a3b: DUP2
00000a3c: DUP1
00000a3d: SLOAD
00000a3e: SWAP1
00000a3f: POP
00000a40: SUB
00000a41: SWAP2
00000a42: POP
00000a43: DUP2
00000a44: DUP2
00000a45: SLOAD
00000a46: DUP2
00000a47: DUP4
00000a48: SSTORE
00000a49: DUP2
00000a4a: DUP2
00000a4b: ISZERO
00000a4c: GT
00000a4d: PUSH2 0x0a82
00000a50: JUMPI
00000a51: DUP2
00000a52: DUP4
00000a53: PUSH1 0x00
00000a55: MSTORE
00000a56: PUSH1 0x20
00000a58: PUSH1 0x00
00000a5a: KECCAK256
00000a5b: SWAP2
00000a5c: DUP3
00000a5d: ADD
00000a5e: SWAP2
00000a5f: ADD
00000a60: PUSH2 0x0a81
00000a63: SWAP2
00000a64: SWAP1
00000a65: JUMPDEST
00000a66: DUP1
00000a67: DUP3
00000a68: GT
00000a69: ISZERO
00000a6a: PUSH2 0x0a7d
00000a6d: JUMPI
00000a6e: PUSH1 0x00
00000a70: DUP2
00000a71: PUSH1 0x00
00000a73: SWAP1
00000a74: SSTORE
00000a75: POP
00000a76: PUSH1 0x01
00000a78: ADD
00000a79: PUSH2 0x0a65
00000a7c: JUMP
00000a7d: JUMPDEST
00000a7e: POP
00000a7f: SWAP1
00000a80: JUMP
00000a81: JUMPDEST
00000a82: JUMPDEST
00000a83: POP
00000a84: POP
00000a85: POP
00000a86: POP
00000a87: PUSH1 0x04
00000a89: DUP1
00000a8a: SLOAD
00000a8b: SWAP1
00000a8c: POP
00000a8d: PUSH1 0x05
00000a8f: SLOAD
00000a90: GT
00000a91: ISZERO
00000a92: PUSH2 0x0aa4
00000a95: JUMPI
00000a96: PUSH2 0x0aa3
00000a99: PUSH1 0x04
00000a9b: DUP1
00000a9c: SLOAD
00000a9d: SWAP1
00000a9e: POP
00000a9f: PUSH2 0x192a
00000aa2: JUMP
00000aa3: JUMPDEST
00000aa4: JUMPDEST
00000aa5: DUP3
00000aa6: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00000abb: AND
00000abc: PUSH32 0x8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b90
00000add: PUSH1 0x40
00000adf: MLOAD
00000ae0: DUP1
00000ae1: SWAP1
00000ae2: POP
00000ae3: PUSH1 0x40
00000ae5: MLOAD
00000ae6: DUP1
00000ae7: SWAP2
00000ae8: SUB
00000ae9: SWAP1
00000aea: LOG2
00000aeb: JUMPDEST
00000aec: JUMPDEST
00000aed: POP
00000aee: JUMPDEST
00000aef: POP
00000af0: POP
00000af1: JUMP
00000af2: JUMPDEST
00000af3: CALLER
00000af4: PUSH1 0x03
00000af6: PUSH1 0x00
00000af8: DUP3
00000af9: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00000b0e: AND
00000b0f: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00000b24: AND
00000b25: DUP2
00000b26: MSTORE
00000b27: PUSH1 0x20
00000b29: ADD
00000b2a: SWAP1
00000b2b: DUP2
00000b2c: MSTORE
00000b2d: PUSH1 0x20
00000b2f: ADD
00000b30: PUSH1 0x00
00000b32: KECCAK256
00000b33: PUSH1 0x00
00000b35: SWAP1
00000b36: SLOAD
00000b37: SWAP1
00000b38: PUSH2 0x0100
00000b3b: EXP
00000b3c: SWAP1
00000b3d: DIV
00000b3e: PUSH1 0xff
00000b40: AND
00000b41: ISZERO
00000b42: ISZERO
00000b43: PUSH2 0x0b4b
00000b46: JUMPI
00000b47: PUSH2 0x0000
00000b4a: JUMP
00000b4b: JUMPDEST
00000b4c: DUP2
00000b4d: CALLER
00000b4e: PUSH1 0x02
00000b50: PUSH1 0x00
00000b52: DUP4
00000b53: DUP2
00000b54: MSTORE
00000b55: PUSH1 0x20
00000b57: ADD
00000b58: SWAP1
00000b59: DUP2
00000b5a: MSTORE
00000b5b: PUSH1 0x20
00000b5d: ADD
00000b5e: PUSH1 0x00
00000b60: KECCAK256
00000b61: PUSH1 0x00
00000b63: DUP3
00000b64: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00000b79: AND
00000b7a: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00000b8f: AND
00000b90: DUP2
00000b91: MSTORE
00000b92: PUSH1 0x20
00000b94: ADD
00000b95: SWAP1
00000b96: DUP2
00000b97: MSTORE
00000b98: PUSH1 0x20
00000b9a: ADD
00000b9b: PUSH1 0x00
00000b9d: KECCAK256
00000b9e: PUSH1 0x00
00000ba0: SWAP1
00000ba1: SLOAD
00000ba2: SWAP1
00000ba3: PUSH2 0x0100
00000ba6: EXP
00000ba7: SWAP1
00000ba8: DIV
00000ba9: PUSH1 0xff
00000bab: AND
00000bac: ISZERO
00000bad: ISZERO
00000bae: PUSH2 0x0bb6
00000bb1: JUMPI
00000bb2: PUSH2 0x0000
00000bb5: JUMP
00000bb6: JUMPDEST
00000bb7: DUP4
00000bb8: PUSH1 0x01
00000bba: PUSH1 0x00
00000bbc: DUP3
00000bbd: DUP2
00000bbe: MSTORE
00000bbf: PUSH1 0x20
00000bc1: ADD
00000bc2: SWAP1
00000bc3: DUP2
00000bc4: MSTORE
00000bc5: PUSH1 0x20
00000bc7: ADD
00000bc8: PUSH1 0x00
00000bca: KECCAK256
00000bcb: PUSH1 0x03
00000bcd: ADD
00000bce: PUSH1 0x00
00000bd0: SWAP1
00000bd1: SLOAD
00000bd2: SWAP1
00000bd3: PUSH2 0x0100
00000bd6: EXP
00000bd7: SWAP1
00000bd8: DIV
00000bd9: PUSH1 0xff
00000bdb: AND
00000bdc: ISZERO
00000bdd: PUSH2 0x0be5
00000be0: JUMPI
00000be1: PUSH2 0x0000
00000be4: JUMP
00000be5: JUMPDEST
00000be6: PUSH1 0x00
00000be8: PUSH1 0x02
00000bea: PUSH1 0x00
00000bec: DUP8
00000bed: DUP2
00000bee: MSTORE
00000bef: PUSH1 0x20
00000bf1: ADD
00000bf2: SWAP1
00000bf3: DUP2
00000bf4: MSTORE
00000bf5: PUSH1 0x20
00000bf7: ADD
00000bf8: PUSH1 0x00
00000bfa: KECCAK256
00000bfb: PUSH1 0x00
00000bfd: CALLER
00000bfe: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00000c13: AND
00000c14: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00000c29: AND
00000c2a: DUP2
00000c2b: MSTORE
00000c2c: PUSH1 0x20
00000c2e: ADD
00000c2f: SWAP1
00000c30: DUP2
00000c31: MSTORE
00000c32: PUSH1 0x20
00000c34: ADD
00000c35: PUSH1 0x00
00000c37: KECCAK256
00000c38: PUSH1 0x00
00000c3a: PUSH2 0x0100
00000c3d: EXP
00000c3e: DUP2
00000c3f: SLOAD
00000c40: DUP2
00000c41: PUSH1 0xff
00000c43: MUL
00000c44: NOT
00000c45: AND
00000c46: SWAP1
00000c47: DUP4
00000c48: ISZERO
00000c49: ISZERO
00000c4a: MUL
00000c4b: OR
00000c4c: SWAP1
00000c4d: SSTORE
00000c4e: POP
00000c4f: DUP5
00000c50: CALLER
00000c51: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00000c66: AND
00000c67: PUSH32 0xf6a317157440607f36269043eb55f1287a5a19ba2216afeab88cd46cbcfb88e9
00000c88: PUSH1 0x40
00000c8a: MLOAD
00000c8b: DUP1
00000c8c: SWAP1
00000c8d: POP
00000c8e: PUSH1 0x40
00000c90: MLOAD
00000c91: DUP1
00000c92: SWAP2
00000c93: SUB
00000c94: SWAP1
00000c95: LOG3
00000c96: JUMPDEST
00000c97: JUMPDEST
00000c98: POP
00000c99: JUMPDEST
00000c9a: POP
00000c9b: POP
00000c9c: JUMPDEST
00000c9d: POP
00000c9e: POP
00000c9f: JUMP
00000ca0: JUMPDEST
00000ca1: PUSH1 0x03
00000ca3: PUSH1 0x20
00000ca5: MSTORE
00000ca6: DUP1
00000ca7: PUSH1 0x00
00000ca9: MSTORE
00000caa: PUSH1 0x40
00000cac: PUSH1 0x00
00000cae: KECCAK256
00000caf: PUSH1 0x00
00000cb1: SWAP2
00000cb2: POP
00000cb3: SLOAD
00000cb4: SWAP1
00000cb5: PUSH2 0x0100
00000cb8: EXP
00000cb9: SWAP1
00000cba: DIV
00000cbb: PUSH1 0xff
00000cbd: AND
00000cbe: DUP2
00000cbf: JUMP
00000cc0: JUMPDEST
00000cc1: PUSH1 0x02
00000cc3: PUSH1 0x20
00000cc5: MSTORE
00000cc6: DUP2
00000cc7: PUSH1 0x00
00000cc9: MSTORE
00000cca: PUSH1 0x40
00000ccc: PUSH1 0x00
00000cce: KECCAK256
00000ccf: PUSH1 0x20
00000cd1: MSTORE
00000cd2: DUP1
00000cd3: PUSH1 0x00
00000cd5: MSTORE
00000cd6: PUSH1 0x40
00000cd8: PUSH1 0x00
00000cda: KECCAK256
00000cdb: PUSH1 0x00
00000cdd: SWAP2
00000cde: POP
00000cdf: SWAP2
00000ce0: POP
00000ce1: SWAP1
00000ce2: SLOAD
00000ce3: SWAP1
00000ce4: PUSH2 0x0100
00000ce7: EXP
00000ce8: SWAP1
00000ce9: DIV
00000cea: PUSH1 0xff
00000cec: AND
00000ced: DUP2
00000cee: JUMP
00000cef: JUMPDEST
00000cf0: PUSH1 0x00
00000cf2: PUSH1 0x00
00000cf4: SWAP1
00000cf5: SLOAD
00000cf6: SWAP1
00000cf7: PUSH2 0x0100
00000cfa: EXP
00000cfb: SWAP1
00000cfc: DIV
00000cfd: PUSH1 0xff
00000cff: AND
00000d00: DUP2
00000d01: JUMP
00000d02: JUMPDEST
00000d03: PUSH1 0x00
00000d05: PUSH1 0x00
00000d07: PUSH1 0x00
00000d09: SWAP1
00000d0a: POP
00000d0b: JUMPDEST
00000d0c: PUSH1 0x06
00000d0e: SLOAD
00000d0f: DUP2
00000d10: LT
00000d11: ISZERO
00000d12: PUSH2 0x0d91
00000d15: JUMPI
00000d16: DUP4
00000d17: DUP1
00000d18: ISZERO
00000d19: PUSH2 0x0d43
00000d1c: JUMPI
00000d1d: POP
00000d1e: PUSH1 0x01
00000d20: PUSH1 0x00
00000d22: DUP3
00000d23: DUP2
00000d24: MSTORE
00000d25: PUSH1 0x20
00000d27: ADD
00000d28: SWAP1
00000d29: DUP2
00000d2a: MSTORE
00000d2b: PUSH1 0x20
00000d2d: ADD
00000d2e: PUSH1 0x00
00000d30: KECCAK256
00000d31: PUSH1 0x03
00000d33: ADD
00000d34: PUSH1 0x00
00000d36: SWAP1
00000d37: SLOAD
00000d38: SWAP1
00000d39: PUSH2 0x0100
00000d3c: EXP
00000d3d: SWAP1
00000d3e: DIV
00000d3f: PUSH1 0xff
00000d41: AND
00000d42: ISZERO
00000d43: JUMPDEST
00000d44: DUP1
00000d45: PUSH2 0x0d77
00000d48: JUMPI
00000d49: POP
00000d4a: DUP3
00000d4b: DUP1
00000d4c: ISZERO
00000d4d: PUSH2 0x0d76
00000d50: JUMPI
00000d51: POP
00000d52: PUSH1 0x01
00000d54: PUSH1 0x00
00000d56: DUP3
00000d57: DUP2
00000d58: MSTORE
00000d59: PUSH1 0x20
00000d5b: ADD
00000d5c: SWAP1
00000d5d: DUP2
00000d5e: MSTORE
00000d5f: PUSH1 0x20
00000d61: ADD
00000d62: PUSH1 0x00
00000d64: KECCAK256
00000d65: PUSH1 0x03
00000d67: ADD
00000d68: PUSH1 0x00
00000d6a: SWAP1
00000d6b: SLOAD
00000d6c: SWAP1
00000d6d: PUSH2 0x0100
00000d70: EXP
00000d71: SWAP1
00000d72: DIV
00000d73: PUSH1 0xff
00000d75: AND
00000d76: JUMPDEST
00000d77: JUMPDEST
00000d78: ISZERO
00000d79: PUSH2 0x0d83
00000d7c: JUMPI
00000d7d: PUSH1 0x01
00000d7f: DUP3
00000d80: ADD
00000d81: SWAP2
00000d82: POP
00000d83: JUMPDEST
00000d84: JUMPDEST
00000d85: DUP1
00000d86: DUP1
00000d87: PUSH1 0x01
00000d89: ADD
00000d8a: SWAP2
00000d8b: POP
00000d8c: POP
00000d8d: PUSH2 0x0d0b
00000d90: JUMP
00000d91: JUMPDEST
00000d92: JUMPDEST
00000d93: POP
00000d94: SWAP3
00000d95: SWAP2
00000d96: POP
00000d97: POP
00000d98: JUMP
00000d99: JUMPDEST
00000d9a: ADDRESS
00000d9b: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00000db0: AND
00000db1: CALLER
00000db2: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00000dc7: AND
00000dc8: EQ
00000dc9: ISZERO
00000dca: ISZERO
00000dcb: PUSH2 0x0dd3
00000dce: JUMPI
00000dcf: PUSH2 0x0000
00000dd2: JUMP
00000dd3: JUMPDEST
00000dd4: DUP1
00000dd5: PUSH1 0x03
00000dd7: PUSH1 0x00
00000dd9: DUP3
00000dda: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00000def: AND
00000df0: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00000e05: AND
00000e06: DUP2
00000e07: MSTORE
00000e08: PUSH1 0x20
00000e0a: ADD
00000e0b: SWAP1
00000e0c: DUP2
00000e0d: MSTORE
00000e0e: PUSH1 0x20
00000e10: ADD
00000e11: PUSH1 0x00
00000e13: KECCAK256
00000e14: PUSH1 0x00
00000e16: SWAP1
00000e17: SLOAD
00000e18: SWAP1
00000e19: PUSH2 0x0100
00000e1c: EXP
00000e1d: SWAP1
00000e1e: DIV
00000e1f: PUSH1 0xff
00000e21: AND
00000e22: ISZERO
00000e23: PUSH2 0x0e2b
00000e26: JUMPI
00000e27: PUSH2 0x0000
00000e2a: JUMP
00000e2b: JUMPDEST
00000e2c: DUP2
00000e2d: PUSH1 0x00
00000e2f: DUP2
00000e30: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00000e45: AND
00000e46: EQ
00000e47: ISZERO
00000e48: PUSH2 0x0e50
00000e4b: JUMPI
00000e4c: PUSH2 0x0000
00000e4f: JUMP
00000e50: JUMPDEST
00000e51: PUSH1 0x01
00000e53: PUSH1 0x04
00000e55: DUP1
00000e56: SLOAD
00000e57: SWAP1
00000e58: POP
00000e59: ADD
00000e5a: PUSH1 0x05
00000e5c: SLOAD
00000e5d: PUSH1 0x32
00000e5f: DUP3
00000e60: GT
00000e61: ISZERO
00000e62: PUSH2 0x0e6a
00000e65: JUMPI
00000e66: PUSH2 0x0000
00000e69: JUMP
00000e6a: JUMPDEST
00000e6b: DUP2
00000e6c: DUP2
00000e6d: GT
00000e6e: ISZERO
00000e6f: PUSH2 0x0e77
00000e72: JUMPI
00000e73: PUSH2 0x0000
00000e76: JUMP
00000e77: JUMPDEST
00000e78: PUSH1 0x00
00000e7a: DUP2
00000e7b: EQ
00000e7c: ISZERO
00000e7d: PUSH2 0x0e85
00000e80: JUMPI
00000e81: PUSH2 0x0000
00000e84: JUMP
00000e85: JUMPDEST
00000e86: PUSH1 0x00
00000e88: DUP3
00000e89: EQ
00000e8a: ISZERO
00000e8b: PUSH2 0x0e93
00000e8e: JUMPI
00000e8f: PUSH2 0x0000
00000e92: JUMP
00000e93: JUMPDEST
00000e94: PUSH1 0x01
00000e96: PUSH1 0x03
00000e98: PUSH1 0x00
00000e9a: DUP8
00000e9b: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00000eb0: AND
00000eb1: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00000ec6: AND
00000ec7: DUP2
00000ec8: MSTORE
00000ec9: PUSH1 0x20
00000ecb: ADD
00000ecc: SWAP1
00000ecd: DUP2
00000ece: MSTORE
00000ecf: PUSH1 0x20
00000ed1: ADD
00000ed2: PUSH1 0x00
00000ed4: KECCAK256
00000ed5: PUSH1 0x00
00000ed7: PUSH2 0x0100
00000eda: EXP
00000edb: DUP2
00000edc: SLOAD
00000edd: DUP2
00000ede: PUSH1 0xff
00000ee0: MUL
00000ee1: NOT
00000ee2: AND
00000ee3: SWAP1
00000ee4: DUP4
00000ee5: ISZERO
00000ee6: ISZERO
00000ee7: MUL
00000ee8: OR
00000ee9: SWAP1
00000eea: SSTORE
00000eeb: POP
00000eec: PUSH1 0x04
00000eee: DUP1
00000eef: SLOAD
00000ef0: DUP1
00000ef1: PUSH1 0x01
00000ef3: ADD
00000ef4: DUP3
00000ef5: DUP2
00000ef6: DUP2
00000ef7: SLOAD
00000ef8: DUP2
00000ef9: DUP4
00000efa: SSTORE
00000efb: DUP2
00000efc: DUP2
00000efd: ISZERO
00000efe: GT
00000eff: PUSH2 0x0f34
00000f02: JUMPI
00000f03: DUP2
00000f04: DUP4
00000f05: PUSH1 0x00
00000f07: MSTORE
00000f08: PUSH1 0x20
00000f0a: PUSH1 0x00
00000f0c: KECCAK256
00000f0d: SWAP2
00000f0e: DUP3
00000f0f: ADD
00000f10: SWAP2
00000f11: ADD
00000f12: PUSH2 0x0f33
00000f15: SWAP2
00000f16: SWAP1
00000f17: JUMPDEST
00000f18: DUP1
00000f19: DUP3
00000f1a: GT
00000f1b: ISZERO
00000f1c: PUSH2 0x0f2f
00000f1f: JUMPI
00000f20: PUSH1 0x00
00000f22: DUP2
00000f23: PUSH1 0x00
00000f25: SWAP1
00000f26: SSTORE
00000f27: POP
00000f28: PUSH1 0x01
00000f2a: ADD
00000f2b: PUSH2 0x0f17
00000f2e: JUMP
00000f2f: JUMPDEST
00000f30: POP
00000f31: SWAP1
00000f32: JUMP
00000f33: JUMPDEST
00000f34: JUMPDEST
00000f35: POP
00000f36: POP
00000f37: POP
00000f38: SWAP2
00000f39: PUSH1 0x00
00000f3b: MSTORE
00000f3c: PUSH1 0x20
00000f3e: PUSH1 0x00
00000f40: KECCAK256
00000f41: SWAP1
00000f42: ADD
00000f43: PUSH1 0x00
00000f45: JUMPDEST
00000f46: DUP8
00000f47: SWAP1
00000f48: SWAP2
00000f49: SWAP1
00000f4a: SWAP2
00000f4b: PUSH2 0x0100
00000f4e: EXP
00000f4f: DUP2
00000f50: SLOAD
00000f51: DUP2
00000f52: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00000f67: MUL
00000f68: NOT
00000f69: AND
00000f6a: SWAP1
00000f6b: DUP4
00000f6c: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00000f81: AND
00000f82: MUL
00000f83: OR
00000f84: SWAP1
00000f85: SSTORE
00000f86: POP
00000f87: POP
00000f88: DUP5
00000f89: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00000f9e: AND
00000f9f: PUSH32 0xf39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d
00000fc0: PUSH1 0x40
00000fc2: MLOAD
00000fc3: DUP1
00000fc4: SWAP1
00000fc5: POP
00000fc6: PUSH1 0x40
00000fc8: MLOAD
00000fc9: DUP1
00000fca: SWAP2
00000fcb: SUB
00000fcc: SWAP1
00000fcd: LOG2
00000fce: JUMPDEST
00000fcf: JUMPDEST
00000fd0: POP
00000fd1: POP
00000fd2: JUMPDEST
00000fd3: POP
00000fd4: JUMPDEST
00000fd5: POP
00000fd6: JUMPDEST
00000fd7: POP
00000fd8: JUMP
00000fd9: JUMPDEST
00000fda: PUSH1 0x00
00000fdc: PUSH1 0x00
00000fde: PUSH1 0x00
00000fe0: PUSH1 0x00
00000fe2: SWAP2
00000fe3: POP
00000fe4: PUSH1 0x00
00000fe6: SWAP1
00000fe7: POP
00000fe8: JUMPDEST
00000fe9: PUSH1 0x04
00000feb: DUP1
00000fec: SLOAD
00000fed: SWAP1
00000fee: POP
00000fef: DUP2
00000ff0: LT
00000ff1: ISZERO
00000ff2: PUSH2 0x10b8
00000ff5: JUMPI
00000ff6: PUSH1 0x02
00000ff8: PUSH1 0x00
00000ffa: DUP6
00000ffb: DUP2
00000ffc: MSTORE
00000ffd: PUSH1 0x20
00000fff: ADD
00001000: SWAP1
00001001: DUP2
00001002: MSTORE
00001003: PUSH1 0x20
00001005: ADD
00001006: PUSH1 0x00
00001008: KECCAK256
00001009: PUSH1 0x00
0000100b: PUSH1 0x04
0000100d: DUP4
0000100e: DUP2
0000100f: SLOAD
00001010: DUP2
00001011: LT
00001012: ISZERO
00001013: PUSH2 0x0000
00001016: JUMPI
00001017: SWAP1
00001018: PUSH1 0x00
0000101a: MSTORE
0000101b: PUSH1 0x20
0000101d: PUSH1 0x00
0000101f: KECCAK256
00001020: SWAP1
00001021: ADD
00001022: PUSH1 0x00
00001024: JUMPDEST
00001025: SWAP1
00001026: SLOAD
00001027: SWAP1
00001028: PUSH2 0x0100
0000102b: EXP
0000102c: SWAP1
0000102d: DIV
0000102e: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00001043: AND
00001044: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00001059: AND
0000105a: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
0000106f: AND
00001070: DUP2
00001071: MSTORE
00001072: PUSH1 0x20
00001074: ADD
00001075: SWAP1
00001076: DUP2
00001077: MSTORE
00001078: PUSH1 0x20
0000107a: ADD
0000107b: PUSH1 0x00
0000107d: KECCAK256
0000107e: PUSH1 0x00
00001080: SWAP1
00001081: SLOAD
00001082: SWAP1
00001083: PUSH2 0x0100
00001086: EXP
00001087: SWAP1
00001088: DIV
00001089: PUSH1 0xff
0000108b: AND
0000108c: ISZERO
0000108d: PUSH2 0x1097
00001090: JUMPI
00001091: PUSH1 0x01
00001093: DUP3
00001094: ADD
00001095: SWAP2
00001096: POP
00001097: JUMPDEST
00001098: PUSH1 0x05
0000109a: SLOAD
0000109b: DUP3
0000109c: EQ
0000109d: ISZERO
0000109e: PUSH2 0x10aa
000010a1: JUMPI
000010a2: PUSH1 0x01
000010a4: SWAP3
000010a5: POP
000010a6: PUSH2 0x10b9
000010a9: JUMP
000010aa: JUMPDEST
000010ab: JUMPDEST
000010ac: DUP1
000010ad: DUP1
000010ae: PUSH1 0x01
000010b0: ADD
000010b1: SWAP2
000010b2: POP
000010b3: POP
000010b4: PUSH2 0x0fe8
000010b7: JUMP
000010b8: JUMPDEST
000010b9: JUMPDEST
000010ba: POP
000010bb: POP
000010bc: SWAP2
000010bd: SWAP1
000010be: POP
000010bf: JUMP
000010c0: JUMPDEST
000010c1: ADDRESS
000010c2: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
000010d7: AND
000010d8: CALLER
000010d9: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
000010ee: AND
000010ef: EQ
000010f0: ISZERO
000010f1: ISZERO
000010f2: PUSH2 0x10fa
000010f5: JUMPI
000010f6: PUSH2 0x0000
000010f9: JUMP
000010fa: JUMPDEST
000010fb: DUP3
000010fc: PUSH1 0x03
000010fe: PUSH1 0x00
00001100: DUP3
00001101: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00001116: AND
00001117: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
0000112c: AND
0000112d: DUP2
0000112e: MSTORE
0000112f: PUSH1 0x20
00001131: ADD
00001132: SWAP1
00001133: DUP2
00001134: MSTORE
00001135: PUSH1 0x20
00001137: ADD
00001138: PUSH1 0x00
0000113a: KECCAK256
0000113b: PUSH1 0x00
0000113d: SWAP1
0000113e: SLOAD
0000113f: SWAP1
00001140: PUSH2 0x0100
00001143: EXP
00001144: SWAP1
00001145: DIV
00001146: PUSH1 0xff
00001148: AND
00001149: ISZERO
0000114a: ISZERO
0000114b: PUSH2 0x1153
0000114e: JUMPI
0000114f: PUSH2 0x0000
00001152: JUMP
00001153: JUMPDEST
00001154: DUP3
00001155: PUSH1 0x03
00001157: PUSH1 0x00
00001159: DUP3
0000115a: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
0000116f: AND
00001170: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00001185: AND
00001186: DUP2
00001187: MSTORE
00001188: PUSH1 0x20
0000118a: ADD
0000118b: SWAP1
0000118c: DUP2
0000118d: MSTORE
0000118e: PUSH1 0x20
00001190: ADD
00001191: PUSH1 0x00
00001193: KECCAK256
00001194: PUSH1 0x00
00001196: SWAP1
00001197: SLOAD
00001198: SWAP1
00001199: PUSH2 0x0100
0000119c: EXP
0000119d: SWAP1
0000119e: DIV
0000119f: PUSH1 0xff
000011a1: AND
000011a2: ISZERO
000011a3: PUSH2 0x11ab
000011a6: JUMPI
000011a7: PUSH2 0x0000
000011aa: JUMP
000011ab: JUMPDEST
000011ac: DUP5
000011ad: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
000011c2: AND
000011c3: PUSH1 0x04
000011c5: DUP5
000011c6: DUP2
000011c7: SLOAD
000011c8: DUP2
000011c9: LT
000011ca: ISZERO
000011cb: PUSH2 0x0000
000011ce: JUMPI
000011cf: SWAP1
000011d0: PUSH1 0x00
000011d2: MSTORE
000011d3: PUSH1 0x20
000011d5: PUSH1 0x00
000011d7: KECCAK256
000011d8: SWAP1
000011d9: ADD
000011da: PUSH1 0x00
000011dc: JUMPDEST
000011dd: SWAP1
000011de: SLOAD
000011df: SWAP1
000011e0: PUSH2 0x0100
000011e3: EXP
000011e4: SWAP1
000011e5: DIV
000011e6: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
000011fb: AND
000011fc: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00001211: AND
00001212: EQ
00001213: ISZERO
00001214: ISZERO
00001215: PUSH2 0x121d
00001218: JUMPI
00001219: PUSH2 0x0000
0000121c: JUMP
0000121d: JUMPDEST
0000121e: DUP4
0000121f: PUSH1 0x04
00001221: DUP5
00001222: DUP2
00001223: SLOAD
00001224: DUP2
00001225: LT
00001226: ISZERO
00001227: PUSH2 0x0000
0000122a: JUMPI
0000122b: SWAP1
0000122c: PUSH1 0x00
0000122e: MSTORE
0000122f: PUSH1 0x20
00001231: PUSH1 0x00
00001233: KECCAK256
00001234: SWAP1
00001235: ADD
00001236: PUSH1 0x00
00001238: JUMPDEST
00001239: PUSH2 0x0100
0000123c: EXP
0000123d: DUP2
0000123e: SLOAD
0000123f: DUP2
00001240: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00001255: MUL
00001256: NOT
00001257: AND
00001258: SWAP1
00001259: DUP4
0000125a: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
0000126f: AND
00001270: MUL
00001271: OR
00001272: SWAP1
00001273: SSTORE
00001274: POP
00001275: PUSH1 0x00
00001277: PUSH1 0x03
00001279: PUSH1 0x00
0000127b: DUP8
0000127c: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00001291: AND
00001292: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
000012a7: AND
000012a8: DUP2
000012a9: MSTORE
000012aa: PUSH1 0x20
000012ac: ADD
000012ad: SWAP1
000012ae: DUP2
000012af: MSTORE
000012b0: PUSH1 0x20
000012b2: ADD
000012b3: PUSH1 0x00
000012b5: KECCAK256
000012b6: PUSH1 0x00
000012b8: PUSH2 0x0100
000012bb: EXP
000012bc: DUP2
000012bd: SLOAD
000012be: DUP2
000012bf: PUSH1 0xff
000012c1: MUL
000012c2: NOT
000012c3: AND
000012c4: SWAP1
000012c5: DUP4
000012c6: ISZERO
000012c7: ISZERO
000012c8: MUL
000012c9: OR
000012ca: SWAP1
000012cb: SSTORE
000012cc: POP
000012cd: PUSH1 0x01
000012cf: PUSH1 0x03
000012d1: PUSH1 0x00
000012d3: DUP7
000012d4: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
000012e9: AND
000012ea: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
000012ff: AND
00001300: DUP2
00001301: MSTORE
00001302: PUSH1 0x20
00001304: ADD
00001305: SWAP1
00001306: DUP2
00001307: MSTORE
00001308: PUSH1 0x20
0000130a: ADD
0000130b: PUSH1 0x00
0000130d: KECCAK256
0000130e: PUSH1 0x00
00001310: PUSH2 0x0100
00001313: EXP
00001314: DUP2
00001315: SLOAD
00001316: DUP2
00001317: PUSH1 0xff
00001319: MUL
0000131a: NOT
0000131b: AND
0000131c: SWAP1
0000131d: DUP4
0000131e: ISZERO
0000131f: ISZERO
00001320: MUL
00001321: OR
00001322: SWAP1
00001323: SSTORE
00001324: POP
00001325: DUP5
00001326: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
0000133b: AND
0000133c: PUSH32 0x8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b90
0000135d: PUSH1 0x40
0000135f: MLOAD
00001360: DUP1
00001361: SWAP1
00001362: POP
00001363: PUSH1 0x40
00001365: MLOAD
00001366: DUP1
00001367: SWAP2
00001368: SUB
00001369: SWAP1
0000136a: LOG2
0000136b: DUP4
0000136c: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00001381: AND
00001382: PUSH32 0xf39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d
000013a3: PUSH1 0x40
000013a5: MLOAD
000013a6: DUP1
000013a7: SWAP1
000013a8: POP
000013a9: PUSH1 0x40
000013ab: MLOAD
000013ac: DUP1
000013ad: SWAP2
000013ae: SUB
000013af: SWAP1
000013b0: LOG2
000013b1: JUMPDEST
000013b2: JUMPDEST
000013b3: POP
000013b4: JUMPDEST
000013b5: POP
000013b6: JUMPDEST
000013b7: POP
000013b8: POP
000013b9: POP
000013ba: JUMP
000013bb: JUMPDEST
000013bc: PUSH1 0x00
000013be: PUSH1 0x00
000013c0: PUSH1 0x00
000013c2: SWAP1
000013c3: POP
000013c4: JUMPDEST
000013c5: PUSH1 0x04
000013c7: DUP1
000013c8: SLOAD
000013c9: SWAP1
000013ca: POP
000013cb: DUP2
000013cc: LT
000013cd: ISZERO
000013ce: PUSH2 0x1481
000013d1: JUMPI
000013d2: PUSH1 0x02
000013d4: PUSH1 0x00
000013d6: DUP5
000013d7: DUP2
000013d8: MSTORE
000013d9: PUSH1 0x20
000013db: ADD
000013dc: SWAP1
000013dd: DUP2
000013de: MSTORE
000013df: PUSH1 0x20
000013e1: ADD
000013e2: PUSH1 0x00
000013e4: KECCAK256
000013e5: PUSH1 0x00
000013e7: PUSH1 0x04
000013e9: DUP4
000013ea: DUP2
000013eb: SLOAD
000013ec: DUP2
000013ed: LT
000013ee: ISZERO
000013ef: PUSH2 0x0000
000013f2: JUMPI
000013f3: SWAP1
000013f4: PUSH1 0x00
000013f6: MSTORE
000013f7: PUSH1 0x20
000013f9: PUSH1 0x00
000013fb: KECCAK256
000013fc: SWAP1
000013fd: ADD
000013fe: PUSH1 0x00
00001400: JUMPDEST
00001401: SWAP1
00001402: SLOAD
00001403: SWAP1
00001404: PUSH2 0x0100
00001407: EXP
00001408: SWAP1
00001409: DIV
0000140a: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
0000141f: AND
00001420: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00001435: AND
00001436: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
0000144b: AND
0000144c: DUP2
0000144d: MSTORE
0000144e: PUSH1 0x20
00001450: ADD
00001451: SWAP1
00001452: DUP2
00001453: MSTORE
00001454: PUSH1 0x20
00001456: ADD
00001457: PUSH1 0x00
00001459: KECCAK256
0000145a: PUSH1 0x00
0000145c: SWAP1
0000145d: SLOAD
0000145e: SWAP1
0000145f: PUSH2 0x0100
00001462: EXP
00001463: SWAP1
00001464: DIV
00001465: PUSH1 0xff
00001467: AND
00001468: ISZERO
00001469: PUSH2 0x1473
0000146c: JUMPI
0000146d: PUSH1 0x01
0000146f: DUP3
00001470: ADD
00001471: SWAP2
00001472: POP
00001473: JUMPDEST
00001474: JUMPDEST
00001475: DUP1
00001476: DUP1
00001477: PUSH1 0x01
00001479: ADD
0000147a: SWAP2
0000147b: POP
0000147c: POP
0000147d: PUSH2 0x13c4
00001480: JUMP
00001481: JUMPDEST
00001482: JUMPDEST
00001483: POP
00001484: SWAP2
00001485: SWAP1
00001486: POP
00001487: JUMP
00001488: JUMPDEST
00001489: PUSH1 0x01
0000148b: PUSH1 0x20
0000148d: MSTORE
0000148e: DUP1
0000148f: PUSH1 0x00
00001491: MSTORE
00001492: PUSH1 0x40
00001494: PUSH1 0x00
00001496: KECCAK256
00001497: PUSH1 0x00
00001499: SWAP2
0000149a: POP
0000149b: SWAP1
0000149c: POP
0000149d: DUP1
0000149e: PUSH1 0x00
000014a0: ADD
000014a1: PUSH1 0x00
000014a3: SWAP1
000014a4: SLOAD
000014a5: SWAP1
000014a6: PUSH2 0x0100
000014a9: EXP
000014aa: SWAP1
000014ab: DIV
000014ac: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
000014c1: AND
000014c2: SWAP1
000014c3: DUP1
000014c4: PUSH1 0x01
000014c6: ADD
000014c7: SLOAD
000014c8: SWAP1
000014c9: DUP1
000014ca: PUSH1 0x02
000014cc: ADD
000014cd: SWAP1
000014ce: DUP1
000014cf: PUSH1 0x03
000014d1: ADD
000014d2: PUSH1 0x00
000014d4: SWAP1
000014d5: SLOAD
000014d6: SWAP1
000014d7: PUSH2 0x0100
000014da: EXP
000014db: SWAP1
000014dc: DIV
000014dd: PUSH1 0xff
000014df: AND
000014e0: SWAP1
000014e1: POP
000014e2: DUP5
000014e3: JUMP
000014e4: JUMPDEST
000014e5: PUSH1 0x20
000014e7: PUSH1 0x40
000014e9: MLOAD
000014ea: SWAP1
000014eb: DUP2
000014ec: ADD
000014ed: PUSH1 0x40
000014ef: MSTORE
000014f0: DUP1
000014f1: PUSH1 0x00
000014f3: DUP2
000014f4: MSTORE
000014f5: POP
000014f6: PUSH1 0x04
000014f8: DUP1
000014f9: SLOAD
000014fa: DUP1
000014fb: PUSH1 0x20
000014fd: MUL
000014fe: PUSH1 0x20
00001500: ADD
00001501: PUSH1 0x40
00001503: MLOAD
00001504: SWAP1
00001505: DUP2
00001506: ADD
00001507: PUSH1 0x40
00001509: MSTORE
0000150a: DUP1
0000150b: SWAP3
0000150c: SWAP2
0000150d: SWAP1
0000150e: DUP2
0000150f: DUP2
00001510: MSTORE
00001511: PUSH1 0x20
00001513: ADD
00001514: DUP3
00001515: DUP1
00001516: SLOAD
00001517: DUP1
00001518: ISZERO
00001519: PUSH2 0x1577
0000151c: JUMPI
0000151d: PUSH1 0x20
0000151f: MUL
00001520: DUP3
00001521: ADD
00001522: SWAP2
00001523: SWAP1
00001524: PUSH1 0x00
00001526: MSTORE
00001527: PUSH1 0x20
00001529: PUSH1 0x00
0000152b: KECCAK256
0000152c: SWAP1
0000152d: JUMPDEST
0000152e: DUP2
0000152f: PUSH1 0x00
00001531: SWAP1
00001532: SLOAD
00001533: SWAP1
00001534: PUSH2 0x0100
00001537: EXP
00001538: SWAP1
00001539: DIV
0000153a: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
0000154f: AND
00001550: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00001565: AND
00001566: DUP2
00001567: MSTORE
00001568: PUSH1 0x20
0000156a: ADD
0000156b: SWAP1
0000156c: PUSH1 0x01
0000156e: ADD
0000156f: SWAP1
00001570: DUP1
00001571: DUP4
00001572: GT
00001573: PUSH2 0x152d
00001576: JUMPI
00001577: JUMPDEST
00001578: POP
00001579: POP
0000157a: POP
0000157b: POP
0000157c: POP
0000157d: SWAP1
0000157e: POP
0000157f: JUMPDEST
00001580: SWAP1
00001581: JUMP
00001582: JUMPDEST
00001583: PUSH1 0x20
00001585: PUSH1 0x40
00001587: MLOAD
00001588: SWAP1
00001589: DUP2
0000158a: ADD
0000158b: PUSH1 0x40
0000158d: MSTORE
0000158e: DUP1
0000158f: PUSH1 0x00
00001591: DUP2
00001592: MSTORE
00001593: POP
00001594: PUSH1 0x20
00001596: PUSH1 0x40
00001598: MLOAD
00001599: SWAP1
0000159a: DUP2
0000159b: ADD
0000159c: PUSH1 0x40
0000159e: MSTORE
0000159f: DUP1
000015a0: PUSH1 0x00
000015a2: DUP2
000015a3: MSTORE
000015a4: POP
000015a5: PUSH1 0x00
000015a7: PUSH1 0x00
000015a9: PUSH1 0x06
000015ab: SLOAD
000015ac: PUSH1 0x40
000015ae: MLOAD
000015af: DUP1
000015b0: MSIZE
000015b1: LT
000015b2: PUSH2 0x15b8
000015b5: JUMPI
000015b6: POP
000015b7: MSIZE
000015b8: JUMPDEST
000015b9: SWAP1
000015ba: DUP1
000015bb: DUP3
000015bc: MSTORE
000015bd: DUP1
000015be: PUSH1 0x20
000015c0: MUL
000015c1: PUSH1 0x20
000015c3: ADD
000015c4: DUP3
000015c5: ADD
000015c6: PUSH1 0x40
000015c8: MSTORE
000015c9: JUMPDEST
000015ca: POP
000015cb: SWAP3
000015cc: POP
000015cd: PUSH1 0x00
000015cf: SWAP2
000015d0: POP
000015d1: PUSH1 0x00
000015d3: SWAP1
000015d4: POP
000015d5: JUMPDEST
000015d6: PUSH1 0x06
000015d8: SLOAD
000015d9: DUP2
000015da: LT
000015db: ISZERO
000015dc: PUSH2 0x1675
000015df: JUMPI
000015e0: DUP6
000015e1: DUP1
000015e2: ISZERO
000015e3: PUSH2 0x160d
000015e6: JUMPI
000015e7: POP
000015e8: PUSH1 0x01
000015ea: PUSH1 0x00
000015ec: DUP3
000015ed: DUP2
000015ee: MSTORE
000015ef: PUSH1 0x20
000015f1: ADD
000015f2: SWAP1
000015f3: DUP2
000015f4: MSTORE
000015f5: PUSH1 0x20
000015f7: ADD
000015f8: PUSH1 0x00
000015fa: KECCAK256
000015fb: PUSH1 0x03
000015fd: ADD
000015fe: PUSH1 0x00
00001600: SWAP1
00001601: SLOAD
00001602: SWAP1
00001603: PUSH2 0x0100
00001606: EXP
00001607: SWAP1
00001608: DIV
00001609: PUSH1 0xff
0000160b: AND
0000160c: ISZERO
0000160d: JUMPDEST
0000160e: DUP1
0000160f: PUSH2 0x1641
00001612: JUMPI
00001613: POP
00001614: DUP5
00001615: DUP1
00001616: ISZERO
00001617: PUSH2 0x1640
0000161a: JUMPI
0000161b: POP
0000161c: PUSH1 0x01
0000161e: PUSH1 0x00
00001620: DUP3
00001621: DUP2
00001622: MSTORE
00001623: PUSH1 0x20
00001625: ADD
00001626: SWAP1
00001627: DUP2
00001628: MSTORE
00001629: PUSH1 0x20
0000162b: ADD
0000162c: PUSH1 0x00
0000162e: KECCAK256
0000162f: PUSH1 0x03
00001631: ADD
00001632: PUSH1 0x00
00001634: SWAP1
00001635: SLOAD
00001636: SWAP1
00001637: PUSH2 0x0100
0000163a: EXP
0000163b: SWAP1
0000163c: DIV
0000163d: PUSH1 0xff
0000163f: AND
00001640: JUMPDEST
00001641: JUMPDEST
00001642: ISZERO
00001643: PUSH2 0x1667
00001646: JUMPI
00001647: DUP1
00001648: DUP4
00001649: DUP4
0000164a: DUP2
0000164b: MLOAD
0000164c: DUP2
0000164d: LT
0000164e: ISZERO
0000164f: PUSH2 0x0000
00001652: JUMPI
00001653: SWAP1
00001654: PUSH1 0x20
00001656: ADD
00001657: SWAP1
00001658: PUSH1 0x20
0000165a: MUL
0000165b: ADD
0000165c: DUP2
0000165d: DUP2
0000165e: MSTORE
0000165f: POP
00001660: POP
00001661: PUSH1 0x01
00001663: DUP3
00001664: ADD
00001665: SWAP2
00001666: POP
00001667: JUMPDEST
00001668: JUMPDEST
00001669: DUP1
0000166a: DUP1
0000166b: PUSH1 0x01
0000166d: ADD
0000166e: SWAP2
0000166f: POP
00001670: POP
00001671: PUSH2 0x15d5
00001674: JUMP
00001675: JUMPDEST
00001676: DUP8
00001677: DUP8
00001678: SUB
00001679: PUSH1 0x40
0000167b: MLOAD
0000167c: DUP1
0000167d: MSIZE
0000167e: LT
0000167f: PUSH2 0x1685
00001682: JUMPI
00001683: POP
00001684: MSIZE
00001685: JUMPDEST
00001686: SWAP1
00001687: DUP1
00001688: DUP3
00001689: MSTORE
0000168a: DUP1
0000168b: PUSH1 0x20
0000168d: MUL
0000168e: PUSH1 0x20
00001690: ADD
00001691: DUP3
00001692: ADD
00001693: PUSH1 0x40
00001695: MSTORE
00001696: JUMPDEST
00001697: POP
00001698: SWAP4
00001699: POP
0000169a: DUP8
0000169b: SWAP1
0000169c: POP
0000169d: JUMPDEST
0000169e: DUP7
0000169f: DUP2
000016a0: LT
000016a1: ISZERO
000016a2: PUSH2 0x16e3
000016a5: JUMPI
000016a6: DUP3
000016a7: DUP2
000016a8: DUP2
000016a9: MLOAD
000016aa: DUP2
000016ab: LT
000016ac: ISZERO
000016ad: PUSH2 0x0000
000016b0: JUMPI
000016b1: SWAP1
000016b2: PUSH1 0x20
000016b4: ADD
000016b5: SWAP1
000016b6: PUSH1 0x20
000016b8: MUL
000016b9: ADD
000016ba: MLOAD
000016bb: DUP5
000016bc: DUP10
000016bd: DUP4
000016be: SUB
000016bf: DUP2
000016c0: MLOAD
000016c1: DUP2
000016c2: LT
000016c3: ISZERO
000016c4: PUSH2 0x0000
000016c7: JUMPI
000016c8: SWAP1
000016c9: PUSH1 0x20
000016cb: ADD
000016cc: SWAP1
000016cd: PUSH1 0x20
000016cf: MUL
000016d0: ADD
000016d1: DUP2
000016d2: DUP2
000016d3: MSTORE
000016d4: POP
000016d5: POP
000016d6: JUMPDEST
000016d7: DUP1
000016d8: DUP1
000016d9: PUSH1 0x01
000016db: ADD
000016dc: SWAP2
000016dd: POP
000016de: POP
000016df: PUSH2 0x169d
000016e2: JUMP
000016e3: JUMPDEST
000016e4: JUMPDEST
000016e5: POP
000016e6: POP
000016e7: POP
000016e8: SWAP5
000016e9: SWAP4
000016ea: POP
000016eb: POP
000016ec: POP
000016ed: POP
000016ee: JUMP
000016ef: JUMPDEST
000016f0: PUSH1 0x20
000016f2: PUSH1 0x40
000016f4: MLOAD
000016f5: SWAP1
000016f6: DUP2
000016f7: ADD
000016f8: PUSH1 0x40
000016fa: MSTORE
000016fb: DUP1
000016fc: PUSH1 0x00
000016fe: DUP2
000016ff: MSTORE
00001700: POP
00001701: PUSH1 0x20
00001703: PUSH1 0x40
00001705: MLOAD
00001706: SWAP1
00001707: DUP2
00001708: ADD
00001709: PUSH1 0x40
0000170b: MSTORE
0000170c: DUP1
0000170d: PUSH1 0x00
0000170f: DUP2
00001710: MSTORE
00001711: POP
00001712: PUSH1 0x00
00001714: PUSH1 0x00
00001716: PUSH1 0x04
00001718: DUP1
00001719: SLOAD
0000171a: SWAP1
0000171b: POP
0000171c: PUSH1 0x40
0000171e: MLOAD
0000171f: DUP1
00001720: MSIZE
00001721: LT
00001722: PUSH2 0x1728
00001725: JUMPI
00001726: POP
00001727: MSIZE
00001728: JUMPDEST
00001729: SWAP1
0000172a: DUP1
0000172b: DUP3
0000172c: MSTORE
0000172d: DUP1
0000172e: PUSH1 0x20
00001730: MUL
00001731: PUSH1 0x20
00001733: ADD
00001734: DUP3
00001735: ADD
00001736: PUSH1 0x40
00001738: MSTORE
00001739: JUMPDEST
0000173a: POP
0000173b: SWAP3
0000173c: POP
0000173d: PUSH1 0x00
0000173f: SWAP2
00001740: POP
00001741: PUSH1 0x00
00001743: SWAP1
00001744: POP
00001745: JUMPDEST
00001746: PUSH1 0x04
00001748: DUP1
00001749: SLOAD
0000174a: SWAP1
0000174b: POP
0000174c: DUP2
0000174d: LT
0000174e: ISZERO
0000174f: PUSH2 0x1882
00001752: JUMPI
00001753: PUSH1 0x02
00001755: PUSH1 0x00
00001757: DUP7
00001758: DUP2
00001759: MSTORE
0000175a: PUSH1 0x20
0000175c: ADD
0000175d: SWAP1
0000175e: DUP2
0000175f: MSTORE
00001760: PUSH1 0x20
00001762: ADD
00001763: PUSH1 0x00
00001765: KECCAK256
00001766: PUSH1 0x00
00001768: PUSH1 0x04
0000176a: DUP4
0000176b: DUP2
0000176c: SLOAD
0000176d: DUP2
0000176e: LT
0000176f: ISZERO
00001770: PUSH2 0x0000
00001773: JUMPI
00001774: SWAP1
00001775: PUSH1 0x00
00001777: MSTORE
00001778: PUSH1 0x20
0000177a: PUSH1 0x00
0000177c: KECCAK256
0000177d: SWAP1
0000177e: ADD
0000177f: PUSH1 0x00
00001781: JUMPDEST
00001782: SWAP1
00001783: SLOAD
00001784: SWAP1
00001785: PUSH2 0x0100
00001788: EXP
00001789: SWAP1
0000178a: DIV
0000178b: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
000017a0: AND
000017a1: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
000017b6: AND
000017b7: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
000017cc: AND
000017cd: DUP2
000017ce: MSTORE
000017cf: PUSH1 0x20
000017d1: ADD
000017d2: SWAP1
000017d3: DUP2
000017d4: MSTORE
000017d5: PUSH1 0x20
000017d7: ADD
000017d8: PUSH1 0x00
000017da: KECCAK256
000017db: PUSH1 0x00
000017dd: SWAP1
000017de: SLOAD
000017df: SWAP1
000017e0: PUSH2 0x0100
000017e3: EXP
000017e4: SWAP1
000017e5: DIV
000017e6: PUSH1 0xff
000017e8: AND
000017e9: ISZERO
000017ea: PUSH2 0x1874
000017ed: JUMPI
000017ee: PUSH1 0x04
000017f0: DUP2
000017f1: DUP2
000017f2: SLOAD
000017f3: DUP2
000017f4: LT
000017f5: ISZERO
000017f6: PUSH2 0x0000
000017f9: JUMPI
000017fa: SWAP1
000017fb: PUSH1 0x00
000017fd: MSTORE
000017fe: PUSH1 0x20
00001800: PUSH1 0x00
00001802: KECCAK256
00001803: SWAP1
00001804: ADD
00001805: PUSH1 0x00
00001807: JUMPDEST
00001808: SWAP1
00001809: SLOAD
0000180a: SWAP1
0000180b: PUSH2 0x0100
0000180e: EXP
0000180f: SWAP1
00001810: DIV
00001811: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00001826: AND
00001827: DUP4
00001828: DUP4
00001829: DUP2
0000182a: MLOAD
0000182b: DUP2
0000182c: LT
0000182d: ISZERO
0000182e: PUSH2 0x0000
00001831: JUMPI
00001832: SWAP1
00001833: PUSH1 0x20
00001835: ADD
00001836: SWAP1
00001837: PUSH1 0x20
00001839: MUL
0000183a: ADD
0000183b: SWAP1
0000183c: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00001851: AND
00001852: SWAP1
00001853: DUP2
00001854: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00001869: AND
0000186a: DUP2
0000186b: MSTORE
0000186c: POP
0000186d: POP
0000186e: PUSH1 0x01
00001870: DUP3
00001871: ADD
00001872: SWAP2
00001873: POP
00001874: JUMPDEST
00001875: JUMPDEST
00001876: DUP1
00001877: DUP1
00001878: PUSH1 0x01
0000187a: ADD
0000187b: SWAP2
0000187c: POP
0000187d: POP
0000187e: PUSH2 0x1745
00001881: JUMP
00001882: JUMPDEST
00001883: DUP2
00001884: PUSH1 0x40
00001886: MLOAD
00001887: DUP1
00001888: MSIZE
00001889: LT
0000188a: PUSH2 0x1890
0000188d: JUMPI
0000188e: POP
0000188f: MSIZE
00001890: JUMPDEST
00001891: SWAP1
00001892: DUP1
00001893: DUP3
00001894: MSTORE
00001895: DUP1
00001896: PUSH1 0x20
00001898: MUL
00001899: PUSH1 0x20
0000189b: ADD
0000189c: DUP3
0000189d: ADD
0000189e: PUSH1 0x40
000018a0: MSTORE
000018a1: JUMPDEST
000018a2: POP
000018a3: SWAP4
000018a4: POP
000018a5: PUSH1 0x00
000018a7: SWAP1
000018a8: POP
000018a9: JUMPDEST
000018aa: DUP2
000018ab: DUP2
000018ac: LT
000018ad: ISZERO
000018ae: PUSH2 0x191b
000018b1: JUMPI
000018b2: DUP3
000018b3: DUP2
000018b4: DUP2
000018b5: MLOAD
000018b6: DUP2
000018b7: LT
000018b8: ISZERO
000018b9: PUSH2 0x0000
000018bc: JUMPI
000018bd: SWAP1
000018be: PUSH1 0x20
000018c0: ADD
000018c1: SWAP1
000018c2: PUSH1 0x20
000018c4: MUL
000018c5: ADD
000018c6: MLOAD
000018c7: DUP5
000018c8: DUP3
000018c9: DUP2
000018ca: MLOAD
000018cb: DUP2
000018cc: LT
000018cd: ISZERO
000018ce: PUSH2 0x0000
000018d1: JUMPI
000018d2: SWAP1
000018d3: PUSH1 0x20
000018d5: ADD
000018d6: SWAP1
000018d7: PUSH1 0x20
000018d9: MUL
000018da: ADD
000018db: SWAP1
000018dc: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
000018f1: AND
000018f2: SWAP1
000018f3: DUP2
000018f4: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00001909: AND
0000190a: DUP2
0000190b: MSTORE
0000190c: POP
0000190d: POP
0000190e: JUMPDEST
0000190f: DUP1
00001910: DUP1
00001911: PUSH1 0x01
00001913: ADD
00001914: SWAP2
00001915: POP
00001916: POP
00001917: PUSH2 0x18a9
0000191a: JUMP
0000191b: JUMPDEST
0000191c: JUMPDEST
0000191d: POP
0000191e: POP
0000191f: POP
00001920: SWAP2
00001921: SWAP1
00001922: POP
00001923: JUMP
00001924: JUMPDEST
00001925: PUSH1 0x06
00001927: SLOAD
00001928: DUP2
00001929: JUMP
0000192a: JUMPDEST
0000192b: ADDRESS
0000192c: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00001941: AND
00001942: CALLER
00001943: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00001958: AND
00001959: EQ
0000195a: ISZERO
0000195b: ISZERO
0000195c: PUSH2 0x1964
0000195f: JUMPI
00001960: PUSH2 0x0000
00001963: JUMP
00001964: JUMPDEST
00001965: PUSH1 0x04
00001967: DUP1
00001968: SLOAD
00001969: SWAP1
0000196a: POP
0000196b: DUP2
0000196c: PUSH1 0x32
0000196e: DUP3
0000196f: GT
00001970: ISZERO
00001971: PUSH2 0x1979
00001974: JUMPI
00001975: PUSH2 0x0000
00001978: JUMP
00001979: JUMPDEST
0000197a: DUP2
0000197b: DUP2
0000197c: GT
0000197d: ISZERO
0000197e: PUSH2 0x1986
00001981: JUMPI
00001982: PUSH2 0x0000
00001985: JUMP
00001986: JUMPDEST
00001987: PUSH1 0x00
00001989: DUP2
0000198a: EQ
0000198b: ISZERO
0000198c: PUSH2 0x1994
0000198f: JUMPI
00001990: PUSH2 0x0000
00001993: JUMP
00001994: JUMPDEST
00001995: PUSH1 0x00
00001997: DUP3
00001998: EQ
00001999: ISZERO
0000199a: PUSH2 0x19a2
0000199d: JUMPI
0000199e: PUSH2 0x0000
000019a1: JUMP
000019a2: JUMPDEST
000019a3: DUP3
000019a4: PUSH1 0x05
000019a6: DUP2
000019a7: SWAP1
000019a8: SSTORE
000019a9: POP
000019aa: PUSH32 0xa3f1ee9126a074d9326c682f561767f710e927faa811f7a99829d49dc421797a
000019cb: DUP4
000019cc: PUSH1 0x40
000019ce: MLOAD
000019cf: DUP1
000019d0: DUP3
000019d1: DUP2
000019d2: MSTORE
000019d3: PUSH1 0x20
000019d5: ADD
000019d6: SWAP2
000019d7: POP
000019d8: POP
000019d9: PUSH1 0x40
000019db: MLOAD
000019dc: DUP1
000019dd: SWAP2
000019de: SUB
000019df: SWAP1
000019e0: LOG1
000019e1: JUMPDEST
000019e2: JUMPDEST
000019e3: POP
000019e4: POP
000019e5: JUMPDEST
000019e6: POP
000019e7: JUMP
000019e8: JUMPDEST
000019e9: CALLER
000019ea: PUSH1 0x03
000019ec: PUSH1 0x00
000019ee: DUP3
000019ef: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00001a04: AND
00001a05: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00001a1a: AND
00001a1b: DUP2
00001a1c: MSTORE
00001a1d: PUSH1 0x20
00001a1f: ADD
00001a20: SWAP1
00001a21: DUP2
00001a22: MSTORE
00001a23: PUSH1 0x20
00001a25: ADD
00001a26: PUSH1 0x00
00001a28: KECCAK256
00001a29: PUSH1 0x00
00001a2b: SWAP1
00001a2c: SLOAD
00001a2d: SWAP1
00001a2e: PUSH2 0x0100
00001a31: EXP
00001a32: SWAP1
00001a33: DIV
00001a34: PUSH1 0xff
00001a36: AND
00001a37: ISZERO
00001a38: ISZERO
00001a39: PUSH2 0x1a41
00001a3c: JUMPI
00001a3d: PUSH2 0x0000
00001a40: JUMP
00001a41: JUMPDEST
00001a42: DUP2
00001a43: PUSH1 0x00
00001a45: PUSH1 0x01
00001a47: PUSH1 0x00
00001a49: DUP4
00001a4a: DUP2
00001a4b: MSTORE
00001a4c: PUSH1 0x20
00001a4e: ADD
00001a4f: SWAP1
00001a50: DUP2
00001a51: MSTORE
00001a52: PUSH1 0x20
00001a54: ADD
00001a55: PUSH1 0x00
00001a57: KECCAK256
00001a58: PUSH1 0x00
00001a5a: ADD
00001a5b: PUSH1 0x00
00001a5d: SWAP1
00001a5e: SLOAD
00001a5f: SWAP1
00001a60: PUSH2 0x0100
00001a63: EXP
00001a64: SWAP1
00001a65: DIV
00001a66: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00001a7b: AND
00001a7c: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00001a91: AND
00001a92: EQ
00001a93: ISZERO
00001a94: PUSH2 0x1a9c
00001a97: JUMPI
00001a98: PUSH2 0x0000
00001a9b: JUMP
00001a9c: JUMPDEST
00001a9d: DUP3
00001a9e: CALLER
00001a9f: PUSH1 0x02
00001aa1: PUSH1 0x00
00001aa3: DUP4
00001aa4: DUP2
00001aa5: MSTORE
00001aa6: PUSH1 0x20
00001aa8: ADD
00001aa9: SWAP1
00001aaa: DUP2
00001aab: MSTORE
00001aac: PUSH1 0x20
00001aae: ADD
00001aaf: PUSH1 0x00
00001ab1: KECCAK256
00001ab2: PUSH1 0x00
00001ab4: DUP3
00001ab5: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00001aca: AND
00001acb: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00001ae0: AND
00001ae1: DUP2
00001ae2: MSTORE
00001ae3: PUSH1 0x20
00001ae5: ADD
00001ae6: SWAP1
00001ae7: DUP2
00001ae8: MSTORE
00001ae9: PUSH1 0x20
00001aeb: ADD
00001aec: PUSH1 0x00
00001aee: KECCAK256
00001aef: PUSH1 0x00
00001af1: SWAP1
00001af2: SLOAD
00001af3: SWAP1
00001af4: PUSH2 0x0100
00001af7: EXP
00001af8: SWAP1
00001af9: DIV
00001afa: PUSH1 0xff
00001afc: AND
00001afd: ISZERO
00001afe: PUSH2 0x1b06
00001b01: JUMPI
00001b02: PUSH2 0x0000
00001b05: JUMP
00001b06: JUMPDEST
00001b07: PUSH1 0x01
00001b09: PUSH1 0x02
00001b0b: PUSH1 0x00
00001b0d: DUP8
00001b0e: DUP2
00001b0f: MSTORE
00001b10: PUSH1 0x20
00001b12: ADD
00001b13: SWAP1
00001b14: DUP2
00001b15: MSTORE
00001b16: PUSH1 0x20
00001b18: ADD
00001b19: PUSH1 0x00
00001b1b: KECCAK256
00001b1c: PUSH1 0x00
00001b1e: CALLER
00001b1f: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00001b34: AND
00001b35: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00001b4a: AND
00001b4b: DUP2
00001b4c: MSTORE
00001b4d: PUSH1 0x20
00001b4f: ADD
00001b50: SWAP1
00001b51: DUP2
00001b52: MSTORE
00001b53: PUSH1 0x20
00001b55: ADD
00001b56: PUSH1 0x00
00001b58: KECCAK256
00001b59: PUSH1 0x00
00001b5b: PUSH2 0x0100
00001b5e: EXP
00001b5f: DUP2
00001b60: SLOAD
00001b61: DUP2
00001b62: PUSH1 0xff
00001b64: MUL
00001b65: NOT
00001b66: AND
00001b67: SWAP1
00001b68: DUP4
00001b69: ISZERO
00001b6a: ISZERO
00001b6b: MUL
00001b6c: OR
00001b6d: SWAP1
00001b6e: SSTORE
00001b6f: POP
00001b70: DUP5
00001b71: CALLER
00001b72: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00001b87: AND
00001b88: PUSH32 0x4a504a94899432a9846e1aa406dceb1bcfd538bb839071d49d1e5e23f5be30ef
00001ba9: PUSH1 0x40
00001bab: MLOAD
00001bac: DUP1
00001bad: SWAP1
00001bae: POP
00001baf: PUSH1 0x40
00001bb1: MLOAD
00001bb2: DUP1
00001bb3: SWAP2
00001bb4: SUB
00001bb5: SWAP1
00001bb6: LOG3
00001bb7: PUSH2 0x1bbf
00001bba: DUP6
00001bbb: PUSH2 0x1bf5
00001bbe: JUMP
00001bbf: JUMPDEST
00001bc0: JUMPDEST
00001bc1: JUMPDEST
00001bc2: POP
00001bc3: POP
00001bc4: JUMPDEST
00001bc5: POP
00001bc6: JUMPDEST
00001bc7: POP
00001bc8: POP
00001bc9: JUMP
00001bca: JUMPDEST
00001bcb: PUSH1 0x00
00001bcd: PUSH2 0x1bd7
00001bd0: DUP5
00001bd1: DUP5
00001bd2: DUP5
00001bd3: PUSH2 0x1db9
00001bd6: JUMP
00001bd7: JUMPDEST
00001bd8: SWAP1
00001bd9: POP
00001bda: PUSH2 0x1be2
00001bdd: DUP2
00001bde: PUSH2 0x19e8
00001be1: JUMP
00001be2: JUMPDEST
00001be3: JUMPDEST
00001be4: SWAP4
00001be5: SWAP3
00001be6: POP
00001be7: POP
00001be8: POP
00001be9: JUMP
00001bea: JUMPDEST
00001beb: PUSH1 0x32
00001bed: DUP2
00001bee: JUMP
00001bef: JUMPDEST
00001bf0: PUSH1 0x05
00001bf2: SLOAD
00001bf3: DUP2
00001bf4: JUMP
00001bf5: JUMPDEST
00001bf6: PUSH1 0x00
00001bf8: DUP2
00001bf9: PUSH1 0x01
00001bfb: PUSH1 0x00
00001bfd: DUP3
00001bfe: DUP2
00001bff: MSTORE
00001c00: PUSH1 0x20
00001c02: ADD
00001c03: SWAP1
00001c04: DUP2
00001c05: MSTORE
00001c06: PUSH1 0x20
00001c08: ADD
00001c09: PUSH1 0x00
00001c0b: KECCAK256
00001c0c: PUSH1 0x03
00001c0e: ADD
00001c0f: PUSH1 0x00
00001c11: SWAP1
00001c12: SLOAD
00001c13: SWAP1
00001c14: PUSH2 0x0100
00001c17: EXP
00001c18: SWAP1
00001c19: DIV
00001c1a: PUSH1 0xff
00001c1c: AND
00001c1d: ISZERO
00001c1e: PUSH2 0x1c26
00001c21: JUMPI
00001c22: PUSH2 0x0000
00001c25: JUMP
00001c26: JUMPDEST
00001c27: PUSH2 0x1c2f
00001c2a: DUP4
00001c2b: PUSH2 0x0fd9
00001c2e: JUMP
00001c2f: JUMPDEST
00001c30: ISZERO
00001c31: PUSH2 0x1db2
00001c34: JUMPI
00001c35: PUSH1 0x01
00001c37: PUSH1 0x00
00001c39: DUP5
00001c3a: DUP2
00001c3b: MSTORE
00001c3c: PUSH1 0x20
00001c3e: ADD
00001c3f: SWAP1
00001c40: DUP2
00001c41: MSTORE
00001c42: PUSH1 0x20
00001c44: ADD
00001c45: PUSH1 0x00
00001c47: KECCAK256
00001c48: SWAP2
00001c49: POP
00001c4a: PUSH1 0x01
00001c4c: DUP3
00001c4d: PUSH1 0x03
00001c4f: ADD
00001c50: PUSH1 0x00
00001c52: PUSH2 0x0100
00001c55: EXP
00001c56: DUP2
00001c57: SLOAD
00001c58: DUP2
00001c59: PUSH1 0xff
00001c5b: MUL
00001c5c: NOT
00001c5d: AND
00001c5e: SWAP1
00001c5f: DUP4
00001c60: ISZERO
00001c61: ISZERO
00001c62: MUL
00001c63: OR
00001c64: SWAP1
00001c65: SSTORE
00001c66: POP
00001c67: DUP2
00001c68: PUSH1 0x00
00001c6a: ADD
00001c6b: PUSH1 0x00
00001c6d: SWAP1
00001c6e: SLOAD
00001c6f: SWAP1
00001c70: PUSH2 0x0100
00001c73: EXP
00001c74: SWAP1
00001c75: DIV
00001c76: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00001c8b: AND
00001c8c: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00001ca1: AND
00001ca2: DUP3
00001ca3: PUSH1 0x01
00001ca5: ADD
00001ca6: SLOAD
00001ca7: DUP4
00001ca8: PUSH1 0x02
00001caa: ADD
00001cab: PUSH1 0x40
00001cad: MLOAD
00001cae: DUP1
00001caf: DUP3
00001cb0: DUP1
00001cb1: SLOAD
00001cb2: PUSH1 0x01
00001cb4: DUP2
00001cb5: PUSH1 0x01
00001cb7: AND
00001cb8: ISZERO
00001cb9: PUSH2 0x0100
00001cbc: MUL
00001cbd: SUB
00001cbe: AND
00001cbf: PUSH1 0x02
00001cc1: SWAP1
00001cc2: DIV
00001cc3: DUP1
00001cc4: ISZERO
00001cc5: PUSH2 0x1d0f
00001cc8: JUMPI
00001cc9: DUP1
00001cca: PUSH1 0x1f
00001ccc: LT
00001ccd: PUSH2 0x1ce4
00001cd0: JUMPI
00001cd1: PUSH2 0x0100
00001cd4: DUP1
00001cd5: DUP4
00001cd6: SLOAD
00001cd7: DIV
00001cd8: MUL
00001cd9: DUP4
00001cda: MSTORE
00001cdb: SWAP2
00001cdc: PUSH1 0x20
00001cde: ADD
00001cdf: SWAP2
00001ce0: PUSH2 0x1d0f
00001ce3: JUMP
00001ce4: JUMPDEST
00001ce5: DUP3
00001ce6: ADD
00001ce7: SWAP2
00001ce8: SWAP1
00001ce9: PUSH1 0x00
00001ceb: MSTORE
00001cec: PUSH1 0x20
00001cee: PUSH1 0x00
00001cf0: KECCAK256
00001cf1: SWAP1
00001cf2: JUMPDEST
00001cf3: DUP2
00001cf4: SLOAD
00001cf5: DUP2
00001cf6: MSTORE
00001cf7: SWAP1
00001cf8: PUSH1 0x01
00001cfa: ADD
00001cfb: SWAP1
00001cfc: PUSH1 0x20
00001cfe: ADD
00001cff: DUP1
00001d00: DUP4
00001d01: GT
00001d02: PUSH2 0x1cf2
00001d05: JUMPI
00001d06: DUP3
00001d07: SWAP1
00001d08: SUB
00001d09: PUSH1 0x1f
00001d0b: AND
00001d0c: DUP3
00001d0d: ADD
00001d0e: SWAP2
00001d0f: JUMPDEST
00001d10: POP
00001d11: POP
00001d12: SWAP2
00001d13: POP
00001d14: POP
00001d15: PUSH1 0x00
00001d17: PUSH1 0x40
00001d19: MLOAD
00001d1a: DUP1
00001d1b: DUP4
00001d1c: SUB
00001d1d: DUP2
00001d1e: DUP6
00001d1f: DUP8
00001d20: PUSH2 0x8502
00001d23: GAS
00001d24: SUB
00001d25: CALL
00001d26: SWAP3
00001d27: POP
00001d28: POP
00001d29: POP
00001d2a: ISZERO
00001d2b: PUSH2 0x1d63
00001d2e: JUMPI
00001d2f: DUP3
00001d30: PUSH32 0x33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed75
00001d51: PUSH1 0x40
00001d53: MLOAD
00001d54: DUP1
00001d55: SWAP1
00001d56: POP
00001d57: PUSH1 0x40
00001d59: MLOAD
00001d5a: DUP1
00001d5b: SWAP2
00001d5c: SUB
00001d5d: SWAP1
00001d5e: LOG2
00001d5f: PUSH2 0x1db1
00001d62: JUMP
00001d63: JUMPDEST
00001d64: DUP3
00001d65: PUSH32 0x526441bb6c1aba3c9a4a6ca1d6545da9c2333c8c48343ef398eb858d72b79236
00001d86: PUSH1 0x40
00001d88: MLOAD
00001d89: DUP1
00001d8a: SWAP1
00001d8b: POP
00001d8c: PUSH1 0x40
00001d8e: MLOAD
00001d8f: DUP1
00001d90: SWAP2
00001d91: SUB
00001d92: SWAP1
00001d93: LOG2
00001d94: PUSH1 0x00
00001d96: DUP3
00001d97: PUSH1 0x03
00001d99: ADD
00001d9a: PUSH1 0x00
00001d9c: PUSH2 0x0100
00001d9f: EXP
00001da0: DUP2
00001da1: SLOAD
00001da2: DUP2
00001da3: PUSH1 0xff
00001da5: MUL
00001da6: NOT
00001da7: AND
00001da8: SWAP1
00001da9: DUP4
00001daa: ISZERO
00001dab: ISZERO
00001dac: MUL
00001dad: OR
00001dae: SWAP1
00001daf: SSTORE
00001db0: POP
00001db1: JUMPDEST
00001db2: JUMPDEST
00001db3: JUMPDEST
00001db4: JUMPDEST
00001db5: POP
00001db6: POP
00001db7: POP
00001db8: JUMP
00001db9: JUMPDEST
00001dba: PUSH1 0x00
00001dbc: DUP4
00001dbd: PUSH1 0x00
00001dbf: DUP2
00001dc0: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00001dd5: AND
00001dd6: EQ
00001dd7: ISZERO
00001dd8: PUSH2 0x1de0
00001ddb: JUMPI
00001ddc: PUSH2 0x0000
00001ddf: JUMP
00001de0: JUMPDEST
00001de1: PUSH1 0x06
00001de3: SLOAD
00001de4: SWAP2
00001de5: POP
00001de6: PUSH1 0x80
00001de8: PUSH1 0x40
00001dea: MLOAD
00001deb: SWAP1
00001dec: DUP2
00001ded: ADD
00001dee: PUSH1 0x40
00001df0: MSTORE
00001df1: DUP1
00001df2: DUP7
00001df3: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00001e08: AND
00001e09: DUP2
00001e0a: MSTORE
00001e0b: PUSH1 0x20
00001e0d: ADD
00001e0e: DUP6
00001e0f: DUP2
00001e10: MSTORE
00001e11: PUSH1 0x20
00001e13: ADD
00001e14: DUP5
00001e15: DUP2
00001e16: MSTORE
00001e17: PUSH1 0x20
00001e19: ADD
00001e1a: PUSH1 0x00
00001e1c: ISZERO
00001e1d: ISZERO
00001e1e: DUP2
00001e1f: MSTORE
00001e20: POP
00001e21: PUSH1 0x01
00001e23: PUSH1 0x00
00001e25: DUP5
00001e26: DUP2
00001e27: MSTORE
00001e28: PUSH1 0x20
00001e2a: ADD
00001e2b: SWAP1
00001e2c: DUP2
00001e2d: MSTORE
00001e2e: PUSH1 0x20
00001e30: ADD
00001e31: PUSH1 0x00
00001e33: KECCAK256
00001e34: PUSH1 0x00
00001e36: DUP3
00001e37: ADD
00001e38: MLOAD
00001e39: DUP2
00001e3a: PUSH1 0x00
00001e3c: ADD
00001e3d: PUSH1 0x00
00001e3f: PUSH2 0x0100
00001e42: EXP
00001e43: DUP2
00001e44: SLOAD
00001e45: DUP2
00001e46: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00001e5b: MUL
00001e5c: NOT
00001e5d: AND
00001e5e: SWAP1
00001e5f: DUP4
00001e60: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00001e75: AND
00001e76: MUL
00001e77: OR
00001e78: SWAP1
00001e79: SSTORE
00001e7a: POP
00001e7b: PUSH1 0x20
00001e7d: DUP3
00001e7e: ADD
00001e7f: MLOAD
00001e80: DUP2
00001e81: PUSH1 0x01
00001e83: ADD
00001e84: SSTORE
00001e85: PUSH1 0x40
00001e87: DUP3
00001e88: ADD
00001e89: MLOAD
00001e8a: DUP2
00001e8b: PUSH1 0x02
00001e8d: ADD
00001e8e: SWAP1
00001e8f: DUP1
00001e90: MLOAD
00001e91: SWAP1
00001e92: PUSH1 0x20
00001e94: ADD
00001e95: SWAP1
00001e96: DUP3
00001e97: DUP1
00001e98: SLOAD
00001e99: PUSH1 0x01
00001e9b: DUP2
00001e9c: PUSH1 0x01
00001e9e: AND
00001e9f: ISZERO
00001ea0: PUSH2 0x0100
00001ea3: MUL
00001ea4: SUB
00001ea5: AND
00001ea6: PUSH1 0x02
00001ea8: SWAP1
00001ea9: DIV
00001eaa: SWAP1
00001eab: PUSH1 0x00
00001ead: MSTORE
00001eae: PUSH1 0x20
00001eb0: PUSH1 0x00
00001eb2: KECCAK256
00001eb3: SWAP1
00001eb4: PUSH1 0x1f
00001eb6: ADD
00001eb7: PUSH1 0x20
00001eb9: SWAP1
00001eba: DIV
00001ebb: DUP2
00001ebc: ADD
00001ebd: SWAP3
00001ebe: DUP3
00001ebf: PUSH1 0x1f
00001ec1: LT
00001ec2: PUSH2 0x1ed6
00001ec5: JUMPI
00001ec6: DUP1
00001ec7: MLOAD
00001ec8: PUSH1 0xff
00001eca: NOT
00001ecb: AND
00001ecc: DUP4
00001ecd: DUP1
00001ece: ADD
00001ecf: OR
00001ed0: DUP6
00001ed1: SSTORE
00001ed2: PUSH2 0x1f04
00001ed5: JUMP
00001ed6: JUMPDEST
00001ed7: DUP3
00001ed8: DUP1
00001ed9: ADD
00001eda: PUSH1 0x01
00001edc: ADD
00001edd: DUP6
00001ede: SSTORE
00001edf: DUP3
00001ee0: ISZERO
00001ee1: PUSH2 0x1f04
00001ee4: JUMPI
00001ee5: SWAP2
00001ee6: DUP3
00001ee7: ADD
00001ee8: JUMPDEST
00001ee9: DUP3
00001eea: DUP2
00001eeb: GT
00001eec: ISZERO
00001eed: PUSH2 0x1f03
00001ef0: JUMPI
00001ef1: DUP3
00001ef2: MLOAD
00001ef3: DUP3
00001ef4: SSTORE
00001ef5: SWAP2
00001ef6: PUSH1 0x20
00001ef8: ADD
00001ef9: SWAP2
00001efa: SWAP1
00001efb: PUSH1 0x01
00001efd: ADD
00001efe: SWAP1
00001eff: PUSH2 0x1ee8
00001f02: JUMP
00001f03: JUMPDEST
00001f04: JUMPDEST
00001f05: POP
00001f06: SWAP1
00001f07: POP
00001f08: PUSH2 0x1f29
00001f0b: SWAP2
00001f0c: SWAP1
00001f0d: JUMPDEST
00001f0e: DUP1
00001f0f: DUP3
00001f10: GT
00001f11: ISZERO
00001f12: PUSH2 0x1f25
00001f15: JUMPI
00001f16: PUSH1 0x00
00001f18: DUP2
00001f19: PUSH1 0x00
00001f1b: SWAP1
00001f1c: SSTORE
00001f1d: POP
00001f1e: PUSH1 0x01
00001f20: ADD
00001f21: PUSH2 0x1f0d
00001f24: JUMP
00001f25: JUMPDEST
00001f26: POP
00001f27: SWAP1
00001f28: JUMP
00001f29: JUMPDEST
00001f2a: POP
00001f2b: POP
00001f2c: PUSH1 0x60
00001f2e: DUP3
00001f2f: ADD
00001f30: MLOAD
00001f31: DUP2
00001f32: PUSH1 0x03
00001f34: ADD
00001f35: PUSH1 0x00
00001f37: PUSH2 0x0100
00001f3a: EXP
00001f3b: DUP2
00001f3c: SLOAD
00001f3d: DUP2
00001f3e: PUSH1 0xff
00001f40: MUL
00001f41: NOT
00001f42: AND
00001f43: SWAP1
00001f44: DUP4
00001f45: ISZERO
00001f46: ISZERO
00001f47: MUL
00001f48: OR
00001f49: SWAP1
00001f4a: SSTORE
00001f4b: POP
00001f4c: SWAP1
00001f4d: POP
00001f4e: POP
00001f4f: PUSH1 0x01
00001f51: PUSH1 0x06
00001f53: PUSH1 0x00
00001f55: DUP3
00001f56: DUP3
00001f57: SLOAD
00001f58: ADD
00001f59: SWAP3
00001f5a: POP
00001f5b: POP
00001f5c: DUP2
00001f5d: SWAP1
00001f5e: SSTORE
00001f5f: POP
00001f60: DUP2
00001f61: PUSH32 0xc0ba8fe4b176c1714197d43b9cc6bcf797a4a7461c5fe8d0ef6e184ae7601e51
00001f82: PUSH1 0x40
00001f84: MLOAD
00001f85: DUP1
00001f86: SWAP1
00001f87: POP
00001f88: PUSH1 0x40
00001f8a: MLOAD
00001f8b: DUP1
00001f8c: SWAP2
00001f8d: SUB
00001f8e: SWAP1
00001f8f: LOG2
00001f90: JUMPDEST
00001f91: JUMPDEST
00001f92: POP
00001f93: SWAP4
00001f94: SWAP3
00001f95: POP
00001f96: POP
00001f97: POP
00001f98: JUMP
00001f99: STOP
00001f9a: LOG1
00001f9b: PUSH6 0x627a7a723058
00001fa2: KECCAK256
00001fa3: PUSH30 0x44fad584bdc5a513776a17ae9cd92b316a91c766c61812184adce9885e7c
00001fc2: DIFFICULTY
00001fc3: STOP
00001fc4: UNKNOWN(0x29)

Findings

validated = confirmed for call sinks; sink observed for others
Severity Category Tool Title Confidence Validated Confirmed Details
medium other detector Untrusted CALL target/value reachable 45 no no
view
trace_id: 0xee69fa89081de05163a3e10b415e65d3293fda689eca53b50ee5e2175a3134e5
call_targets: 0xf1af6f01fd9626c851b7dea6810ee388dea5c846
target_varies: no
classification: constant_target
validation_json
{
    "sink": "CALL",
    "errors": 0,
    "status": "sink_reached",
    "attempts": 1,
    "trace_id": "0xee69fa89081de05163a3e10b415e65d3293fda689eca53b50ee5e2175a3134e5",
    "confirmed": false,
    "trace_mode": "callTracer",
    "call_targets": [
        "0xf1af6f01fd9626c851b7dea6810ee388dea5c846"
    ],
    "matched_probe": null,
    "target_varies": false,
    "classification": "constant_target"
}
witness_json
{
    "notes": "heuristic witness; entrypoints are best-effort selectors with zeroed calldata",
    "constraints": [],
    "entrypoints": [
        {
            "calldata": "0xffffffff",
            "selector": "0xffffffff",
            "calldata_variants": [
                "0xffffffff",
                "0xffffffff0000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0x025e7c27",
            "selector": "0x025e7c27",
            "calldata_variants": [
                "0x025e7c27",
                "0x025e7c270000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0x173825d9",
            "selector": "0x173825d9",
            "calldata_variants": [
                "0x173825d9",
                "0x173825d90000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0x20ea8d86",
            "selector": "0x20ea8d86",
            "calldata_variants": [
                "0x20ea8d86",
                "0x20ea8d860000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0x2f54bf6e",
            "selector": "0x2f54bf6e",
            "calldata_variants": [
                "0x2f54bf6e",
                "0x2f54bf6e0000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0x3411c81c",
            "selector": "0x3411c81c",
            "calldata_variants": [
                "0x3411c81c",
                "0x3411c81c0000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0x4c3a6ae0",
            "selector": "0x4c3a6ae0",
            "calldata_variants": [
                "0x4c3a6ae0",
                "0x4c3a6ae00000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0x54741525",
            "selector": "0x54741525",
            "calldata_variants": [
                "0x54741525",
                "0x547415250000000000000000000000000000000000000000000000000000000000000000"
            ]
        }
    ]
}
evidence_json
{
    "examples": [
        {
            "pc": 7461,
            "opcode": "CALL",
            "returndata_checked": null,
            "value_expression_category": "computed",
            "target_expression_category": "computed"
        }
    ],
    "call_count": 1,
    "guards_detected": [
        {
            "pc": 2103,
            "type": "msg_sender_eq_const",
            "value": "0xffffffffffffffffffffffffffffffffffffffff"
        },
        {
            "pc": 3505,
            "type": "msg_sender_eq_const",
            "value": "0xffffffffffffffffffffffffffffffffffffffff"
        },
        {
            "pc": 4312,
            "type": "msg_sender_eq_const",
            "value": "0xffffffffffffffffffffffffffffffffffffffff"
        },
        {
            "pc": 6466,
            "type": "msg_sender_eq_const",
            "value": "0xffffffffffffffffffffffffffffffffffffffff"
        }
    ],
    "untrusted_call_count": 1
}
medium other detector ETH value transfer possible 40 no no
view
trace_id: 0xee69fa89081de05163a3e10b415e65d3293fda689eca53b50ee5e2175a3134e5
call_targets: 0xf1af6f01fd9626c851b7dea6810ee388dea5c846
target_varies: no
classification: constant_target
validation_json
{
    "sink": "CALL",
    "errors": 0,
    "status": "sink_reached",
    "attempts": 1,
    "trace_id": "0xee69fa89081de05163a3e10b415e65d3293fda689eca53b50ee5e2175a3134e5",
    "confirmed": false,
    "trace_mode": "callTracer",
    "call_targets": [
        "0xf1af6f01fd9626c851b7dea6810ee388dea5c846"
    ],
    "matched_probe": null,
    "target_varies": false,
    "classification": "constant_target"
}
witness_json
{
    "notes": "heuristic witness; entrypoints are best-effort selectors with zeroed calldata",
    "constraints": [],
    "entrypoints": [
        {
            "calldata": "0xffffffff",
            "selector": "0xffffffff",
            "calldata_variants": [
                "0xffffffff",
                "0xffffffff0000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0x025e7c27",
            "selector": "0x025e7c27",
            "calldata_variants": [
                "0x025e7c27",
                "0x025e7c270000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0x173825d9",
            "selector": "0x173825d9",
            "calldata_variants": [
                "0x173825d9",
                "0x173825d90000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0x20ea8d86",
            "selector": "0x20ea8d86",
            "calldata_variants": [
                "0x20ea8d86",
                "0x20ea8d860000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0x2f54bf6e",
            "selector": "0x2f54bf6e",
            "calldata_variants": [
                "0x2f54bf6e",
                "0x2f54bf6e0000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0x3411c81c",
            "selector": "0x3411c81c",
            "calldata_variants": [
                "0x3411c81c",
                "0x3411c81c0000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0x4c3a6ae0",
            "selector": "0x4c3a6ae0",
            "calldata_variants": [
                "0x4c3a6ae0",
                "0x4c3a6ae00000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0x54741525",
            "selector": "0x54741525",
            "calldata_variants": [
                "0x54741525",
                "0x547415250000000000000000000000000000000000000000000000000000000000000000"
            ]
        }
    ]
}
evidence_json
{
    "examples": [
        {
            "pc": 7461,
            "opcode": "CALL",
            "returndata_checked": null,
            "value_expression_category": "computed",
            "target_expression_category": "computed"
        }
    ],
    "eth_value_calls": 1,
    "guards_detected": [
        {
            "pc": 2103,
            "type": "msg_sender_eq_const",
            "value": "0xffffffffffffffffffffffffffffffffffffffff"
        },
        {
            "pc": 3505,
            "type": "msg_sender_eq_const",
            "value": "0xffffffffffffffffffffffffffffffffffffffff"
        },
        {
            "pc": 4312,
            "type": "msg_sender_eq_const",
            "value": "0xffffffffffffffffffffffffffffffffffffffff"
        },
        {
            "pc": 6466,
            "type": "msg_sender_eq_const",
            "value": "0xffffffffffffffffffffffffffffffffffffffff"
        }
    ]
}