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

Analysis Run

73577ec6-1e74-4f61-9fee-a5ebf7f88ac0

complete
Chain ID
1
Address
Block Number
Created
Mon, Jan 5, 2026 6:38 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
Present
Best current signal
Unrestricted batch transfer allows draining ETH/ERC20 balances
crit 0 high 0 proxy context implementation known
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
31734 report.consolidate complete 1 / 1 3 months ago
95827 artifact.fetch complete 1 / 3 1 week ago
95828 tool.cast_disasm complete 1 / 3 1 week ago
95829 analysis.bundle complete 1 / 3 1 week ago
95830 capability.graph complete 1 / 3 1 week ago
95831 detector.run complete 1 / 3 1 week ago
95832 validation.fork complete 1 / 3 1 week ago

Artifact

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

Slither

tool.slither

No slither job recorded yet.

Codex

report.consolidate
Job Status
complete
Attempts
1 / 1
Findings
1
No findings?
no
Summary
Found an unprotected external entrypoint that executes ETH/ERC20 transfers from the contract using caller-supplied recipient/amount data.
View stderr
[codex:587879] OpenAI Codex v0.77.0 (research preview)
[codex:587879] --------
[codex:587879] workdir: /tmp/codex-multi-5dii8700
[codex:587879] model: gpt-5.2-codex
[codex:587879] provider: openai
[codex:587879] approval: never
[codex:587879] sandbox: read-only
[codex:587879] reasoning effort: xhigh
[codex:587879] reasoning summaries: auto
[codex:587879] session id: 019b8f67-1677-7193-9522-f51dfa7d0122
[codex:587879] --------
[codex:587879] user
[codex:587879] 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:587879] 
[codex:587879] Read `BYTECODE_BUNDLE.txt` completely before concluding.
[codex:587879] 
[codex:587879] ONLY REPORT if you find a CONCRETE, EXPLOITABLE path to profit. We do NOT care about:
[codex:587879] - Gas inefficiency, code quality, or best practices
[codex:587879] - Theoretical vulnerabilities without a clear extraction path
[codex:587879] - Generic footguns (unchecked return values, etc.) unless they enable theft
[codex:587879] - Issues requiring social engineering or off-chain coordination
[codex:587879] 
[codex:587879] PATTERNS WORTH INVESTIGATING in bytecode:
[codex:587879] - CALL/DELEGATECALL with controllable destination or calldata
[codex:587879] - Value transfers (CALL with non-zero value) without prior CALLER/ORIGIN checks
[codex:587879] - SSTORE to low slots (0-10) that might be owner/admin storage
[codex:587879] - ecrecover (signature validation) - look for missing nonce/replay protection
[codex:587879] - External calls before state updates (reentrancy)
[codex:587879] - SELFDESTRUCT with controllable beneficiary
[codex:587879] - Proxy patterns (DELEGATECALL to storage slot) with unprotected upgrade paths
[codex:587879] 
[codex:587879] For each finding, you MUST explain:
[codex:587879] 1. The specific bytecode pattern/offsets that indicate the vulnerability
[codex:587879] 2. The concrete sequence of transactions to extract value
[codex:587879] 3. Why you believe this is exploitable (not just suspicious)
[codex:587879] 
[codex:587879] If you cannot identify a concrete profit path from bytecode alone: set no_findings=true.
[codex:587879] Do NOT hallucinate. Bytecode-only analysis is limited - be honest about uncertainty.
[codex:587879] 
[codex:587879] Output MUST be valid JSON matching the provided schema.
[codex:587879] - severity: info, low, medium, high, critical (use high/critical ONLY for clear extraction paths)
[codex:587879] - category: access_control, reentrancy, math, oracle, upgradeability, auth, other
[codex:587879] mcp startup: no servers
[codex:587879] 
[codex:587879] thinking
[codex:587879] **Preparing to read BYTECODE_BUNDLE.txt**
[codex:587879] exec
[codex:587879] /bin/bash -lc ls in /tmp/codex-multi-5dii8700 succeeded in 6ms:
[codex:587879] BYTECODE_BUNDLE.txt
[codex:587879] codex-output-schema.json
[codex:587879] exec
[codex:587879] /bin/bash -lc 'cat BYTECODE_BUNDLE.txt' in /tmp/codex-multi-5dii8700 succeeded in 5ms:
[codex:587879] Runtime bytecode bundle for best-effort auditing.
[codex:587879] Note: without verified source, conclusions are low-confidence unless a concrete pattern is visible.
[codex:587879] 
[codex:587879] FILE: runtime_bytecode.hex
[codex:587879] 0x6080604052600436106101795760003560e01c80637d729478116100cb578063e38e78211161007f578063f0fd58a711610059578063f0fd58a71461047b578063f5537ede1461049b578063fbfbbfed146104bb57600080fd5b8063e38e78211461040e578063e9bb84c21461043b578063ea23c3891461045b57600080fd5b8063b269681d116100b0578063b269681d146103a1578063c59edb61146103ce578063dc45d642146103ee57600080fd5b80637d72947814610334578063acf854fc1461036157600080fd5b80634867ba151161012d57806372494bd61161010757806372494bd6146102d4578063760b85a7146102f45780637d58d56c1461031457600080fd5b80634867ba151461022757806351acecc4146102475780636e1021ea1461026757600080fd5b80630e67c6bc1161015e5780630e67c6bc146101c75780631ea3a52d146101e75780633641e0831461020757600080fd5b806302906b27146101855780630a0a05e6146101a757600080fd5b3661018057005b600080fd5b34801561019157600080fd5b506101a56101a0366004612c9c565b6104e8565b005b3480156101b357600080fd5b506101a56101c2366004612859565b610855565b3480156101d357600080fd5b506101a56101e2366004612958565b610937565b3480156101f357600080fd5b506101a5610202366004612bf0565b610a19565b34801561021357600080fd5b506101a5610222366004612c14565b610b71565b34801561023357600080fd5b506101a5610242366004612a42565b610ca1565b34801561025357600080fd5b506101a5610262366004612958565b61107b565b34801561027357600080fd5b506102aa610282366004612bd8565b60009081526005602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156102e057600080fd5b506101a56102ef366004612875565b61110f565b34801561030057600080fd5b506101a561030f36600461298c565b61120b565b34801561032057600080fd5b506102aa61032f366004612c7b565b611299565b34801561034057600080fd5b506002546102aa9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561036d57600080fd5b5061039161037c366004612859565b60036020526000908152604090205460ff1681565b60405190151581526020016102cb565b3480156103ad57600080fd5b506000546102aa9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156103da57600080fd5b506102aa6103e9366004612c7b565b6112d1565b3480156103fa57600080fd5b506101a5610409366004612918565b611352565b34801561041a57600080fd5b506001546102aa9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561044757600080fd5b506101a56104563660046128ed565b6115f3565b34801561046757600080fd5b50610391610476366004612bd8565b611695565b34801561048757600080fd5b506101a5610496366004612918565b6116ef565b3480156104a757600080fd5b506101a56104b63660046128ad565b6118c3565b3480156104c757600080fd5b506104db6104d63660046129fc565b611966565b6040516102cb9190612ee5565b3360009081526003602052604090205460ff168061051d575060015473ffffffffffffffffffffffffffffffffffffffff1633145b8061053f575060025473ffffffffffffffffffffffffffffffffffffffff1633145b6105b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105a79060208082526004908201527f216b657900000000000000000000000000000000000000000000000000000000604082015260600190565b60405180910390fd5b6105b985611695565b15610622576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105a79060208082526004908201527f7573656400000000000000000000000000000000000000000000000000000000604082015260600190565b600030866106336104d68587612fda565b60405160200161064593929190612db8565b60405160208183030381529060405280519060200120905060006106f56106b9836040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b87878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611a0d92505050565b60015490915073ffffffffffffffffffffffffffffffffffffffff8083169116148061073b575060025473ffffffffffffffffffffffffffffffffffffffff8281169116145b801561075d575073ffffffffffffffffffffffffffffffffffffffff81163314155b6107c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f217369676e696e674b657900000000000000000000000000000000000000000060448201526064016105a7565b6107cc87611aa2565b60005b8381101561084b576000858583818110610812577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020028101906108249190612ef8565b61082d90612fe7565b905061083881611b06565b508061084381613025565b9150506107cf565b5050505050505050565b3330146108be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600760248201527f2177616c6c65740000000000000000000000000000000000000000000000000060448201526064016105a7565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fb1472bb6509fdfed83bc02e327a52a99b8ecac79087af92efe618a5812dfa8659060200160405180910390a150565b3330146109a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600760248201527f2177616c6c65740000000000000000000000000000000000000000000000000060448201526064016105a7565b60005b81811015610a1457610a028383838181106109e7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050606002018036038101906109fd9190612b8c565b611c43565b80610a0c81613025565b9150506109a3565b505050565b3360009081526003602052604090205460ff16610a92576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f2168656e6573697300000000000000000000000000000000000000000000000060448201526064016105a7565b60008281526005602052604090205473ffffffffffffffffffffffffffffffffffffffff1615610b1e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f657869737400000000000000000000000000000000000000000000000000000060448201526064016105a7565b60009182526005602052604090912080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909216919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff1615610bf3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105a79060208082526004908201527f696e697400000000000000000000000000000000000000000000000000000000604082015260600190565b60008054307fffffffffffffffffffffffff00000000000000000000000000000000000000009182161782559581526005602090815260408083208054891673ffffffffffffffffffffffffffffffffffffffff9889161790559486168252600390529290922080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915580548516918416919091179055600280549093169116179055565b3360009081526003602052604090205460ff1680610cd6575060015473ffffffffffffffffffffffffffffffffffffffff1633145b80610cf8575060025473ffffffffffffffffffffffffffffffffffffffff1633145b610d60576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105a79060208082526004908201527f216b657900000000000000000000000000000000000000000000000000000000604082015260600190565b610d6983611695565b15610dd2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105a79060208082526004908201527f7573656400000000000000000000000000000000000000000000000000000000604082015260600190565b3073ffffffffffffffffffffffffffffffffffffffff871614610e51576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f217468697300000000000000000000000000000000000000000000000000000060448201526064016105a7565b6000868686868686604051602001610e6e96959493929190612d5d565b6040516020818303038152906040528051906020012090506000610f1e610ee2836040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b8b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611a0d92505050565b60015490915073ffffffffffffffffffffffffffffffffffffffff80831691161480610f64575060025473ffffffffffffffffffffffffffffffffffffffff8281169116145b8015610f86575073ffffffffffffffffffffffffffffffffffffffff81163314155b610fec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f217369676e696e674b657900000000000000000000000000000000000000000060448201526064016105a7565b610ff585611aa2565b600060405180608001604052808973ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200188815260200186868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050915250905061106e81611b06565b5050505050505050505050565b6000805473ffffffffffffffffffffffffffffffffffffffff16905b82811015611109576110f78484838181106110db577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050606002018036038101906110f19190612aeb565b83611d99565b8061110181613025565b915050611097565b50505050565b333014611178576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600760248201527f2177616c6c65740000000000000000000000000000000000000000000000000060448201526064016105a7565b6001805473ffffffffffffffffffffffffffffffffffffffff8481167fffffffffffffffffffffffff00000000000000000000000000000000000000009283168117909355600280549185169190921681179091556040805192835260208301919091527f3f37fe575b78353c42326bf60f22f7bb524c0f8fddd82ef95a9a8305314b8d16910160405180910390a15050565b6000805473ffffffffffffffffffffffffffffffffffffffff16905b828110156111095761128784848381811061126b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050604002018036038101906112819190612b2e565b83611e5a565b8061129181613025565b915050611227565b6000828152600560205260408120546112ca90309073ffffffffffffffffffffffffffffffffffffffff1684611f3d565b9392505050565b6000828152600560205260408120546113009073ffffffffffffffffffffffffffffffffffffffff1683612040565b60405173ffffffffffffffffffffffffffffffffffffffff821681529091507fa252ab3a674b76566f9e239fcb0c4d97619af93efaa36e7b5090d50223074e719060200160405180910390a192915050565b3360009081526003602052604090205460ff166113cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f2168656e6573697300000000000000000000000000000000000000000000000060448201526064016105a7565b60005b81811015610a145733838383818110611410577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020160208101906114259190612859565b73ffffffffffffffffffffffffffffffffffffffff1614156114a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f63616e6e6f742072656d6f76652073656c66000000000000000000000000000060448201526064016105a7565b6000600360008585858181106114e2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020160208101906114f79190612859565b73ffffffffffffffffffffffffffffffffffffffff168152602081019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169115159190911790557f9f0aae703cf989b5f0793abb586d06d76abced8c38edde4fc03ba565220b759f8383838181106115a4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020160208101906115b99190612859565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1806115eb81613025565b9150506113ce565b33301461165c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600760248201527f2177616c6c65740000000000000000000000000000000000000000000000000060448201526064016105a7565b604080516060810182526000815273ffffffffffffffffffffffffffffffffffffffff84166020820152908101829052610a14816120b7565b6000806116a1836122e7565b60208082015191517effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600090815260049091526040902054600160ff9092169190911b908116149392505050565b3360009081526003602052604090205460ff16611768576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f2168656e6573697300000000000000000000000000000000000000000000000060448201526064016105a7565b60005b81811015610a14576001600360008585858181106117b2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020160208101906117c79190612859565b73ffffffffffffffffffffffffffffffffffffffff168152602081019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169115159190911790557f4c95871bcdf03605f6f937dba7a5cff42b90c873a094e9a36a24bd64ccea28a2838383818110611874577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020160208101906118899190612859565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1806118bb81613025565b91505061176b565b33301461192c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600760248201527f2177616c6c65740000000000000000000000000000000000000000000000000060448201526064016105a7565b6040805160608101825273ffffffffffffffffffffffffffffffffffffffff808616825284166020820152908101829052611109816120b7565b606060005b8251811015611a075760008382815181106119af577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190508281600001518260200151836040015184606001516040516020016119e2959493929190612e26565b60405160208183030381529060405292505080806119ff90613025565b91505061196b565b50919050565b60008151604114611a7a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016105a7565b60208201516040830151606084015160001a611a9886828585612343565b9695505050505050565b6000611aad826122e7565b60208181015182517effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9081166000908152600490935260408084205494519091168352909120600160ff9092169190911b90911790555050565b60008160200151600014611b1e578160200151611b20565b5a5b9050600080836000015173ffffffffffffffffffffffffffffffffffffffff168385604001518660600151604051611b589190612e0a565b600060405180830381858888f193505050503d8060008114611b96576040519150601f19603f3d011682016040523d82523d6000602084013e611b9b565b606091505b50915091508115611bf4577ffb2d80a8c1584ec3d6857239d88e150a9185f820e45c4ef06369e4b03f9bdc1584600001518560400151866060015184604051611be79493929190612e93565b60405180910390a1611109565b7ff4c3da4067612daed1743cb9ea6c4563a562398f91a9b438f9c46fe2d4f2f7da84600001518560400151866060015184604051611c359493929190612e93565b60405180910390a150505050565b805173ffffffffffffffffffffffffffffffffffffffff16611cbf57806020015173ffffffffffffffffffffffffffffffffffffffff16816040015160405160006040518083038185875af1925050503d8060008114611109576040519150601f19603f3d011682016040523d82523d6000602084013e611109565b8051602080830151604080850151815173ffffffffffffffffffffffffffffffffffffffff938416602482015260448082019290925282518082039092018252606401825292830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905251921691611d599190612e0a565b6000604051808303816000865af19150503d8060008114611109576040519150601f19603f3d011682016040523d82523d6000602084013e611109565b50565b6020808301516000908152600590915260408082205490840151611dd791309173ffffffffffffffffffffffffffffffffffffffff90911690611f3d565b602080850151600090815260059091526040902054909150611e0f9073ffffffffffffffffffffffffffffffffffffffff168261259b565b611e2757611e25836020015184604001516112d1565b505b60408051808201909152835173ffffffffffffffffffffffffffffffffffffffff90811682528216602082015261110981845b60208281015183516040805173ffffffffffffffffffffffffffffffffffffffff9283166024820152858316604480830191909152825180830390910181526064909101825293840180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f9cfddc360000000000000000000000000000000000000000000000000000000017905251911691611ef491612e0a565b6000604051808303816000865af19150503d8060008114611f31576040519150601f19603f3d011682016040523d82523d6000602084013e611f36565b606091505b5050505050565b6040517f3d602d80600a3d3981f3363d3d373d3d3d363d730000000000000000000000008152606083901b601482018190527f5af43d82803e903d91602b57fd5bf300000000000000000000000000000000006028830152603790912060009190611a98848288604080517fff0000000000000000000000000000000000000000000000000000000000000060208083019190915260609390931b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660218201526035810194909452605580850193909352805180850390930183526075909301909252805191012073ffffffffffffffffffffffffffffffffffffffff1690565b6000808360601b90506040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528160148201527f5af43d82803e903d91602b57fd5bf300000000000000000000000000000000006028820152836037826000f59050803b6120af57600080fd5b949350505050565b805173ffffffffffffffffffffffffffffffffffffffff166121a9576000816020015173ffffffffffffffffffffffffffffffffffffffff16826040015160405160006040518083038185875af1925050503d8060008114612135576040519150601f19603f3d011682016040523d82523d6000602084013e61213a565b606091505b50509050806121a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f217472616e73666572000000000000000000000000000000000000000000000060448201526064016105a7565b5050565b80516020820151604080840151905160009373ffffffffffffffffffffffffffffffffffffffff16927fa9059cbb00000000000000000000000000000000000000000000000000000000926122219260240173ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516122aa9190612e0a565b6000604051808303816000865af19150503d8060008114612135576040519150601f19603f3d011682016040523d82523d6000602084013e61213a565b604080518082019091526000808252602082015261230761010083612fc6565b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16815261233661010083613083565b60ff166020820152919050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156123f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016105a7565b8360ff16601b148061240a57508360ff16601c145b612496576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016105a7565b6040805160008082526020820180845288905260ff871692820192909252606081018590526080810184905260019060a0016020604051602081039080840390855afa1580156124ea573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612592576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016105a7565b95945050505050565b6000808360601b90506040517f363d3d373d3d3d363d7300000000000000000000000000000000000000000000815281600a8201527f5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000601e82015260408101602d600082873c600d810151600d83015114815183511416935050505092915050565b600067ffffffffffffffff80841115612638576126386130c6565b8360051b6020612649818301612f77565b86815293508084018583810189101561266157600080fd5b60009350835b8881101561269c5781358681111561267d578586fd5b6126898b828b01612776565b8452509183019190830190600101612667565b5050505050509392505050565b60008083601f8401126126ba578182fd5b50813567ffffffffffffffff8111156126d1578182fd5b6020830191508360208260051b85010111156126ec57600080fd5b9250929050565b60008083601f840112612704578182fd5b50813567ffffffffffffffff81111561271b578182fd5b6020830191508360206060830285010111156126ec57600080fd5b60008083601f840112612747578182fd5b50813567ffffffffffffffff81111561275e578182fd5b6020830191508360208285010111156126ec57600080fd5b600060808284031215612787578081fd5b61278f612f2b565b9050813561279c816130f5565b81526020828101358183015260408084013590830152606083013567ffffffffffffffff808211156127cd57600080fd5b818501915085601f8301126127e157600080fd5b8135818111156127f3576127f36130c6565b612823847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601612f77565b9150808252868482850101111561283957600080fd5b808484018584013760008482840101525080606085015250505092915050565b60006020828403121561286a578081fd5b81356112ca816130f5565b60008060408385031215612887578081fd5b8235612892816130f5565b915060208301356128a2816130f5565b809150509250929050565b6000806000606084860312156128c1578081fd5b83356128cc816130f5565b925060208401356128dc816130f5565b929592945050506040919091013590565b600080604083850312156128ff578182fd5b823561290a816130f5565b946020939093013593505050565b6000806020838503121561292a578182fd5b823567ffffffffffffffff811115612940578283fd5b61294c858286016126a9565b90969095509350505050565b6000806020838503121561296a578182fd5b823567ffffffffffffffff811115612980578283fd5b61294c858286016126f3565b6000806020838503121561299e578182fd5b823567ffffffffffffffff808211156129b5578384fd5b818501915085601f8301126129c8578384fd5b8135818111156129d6578485fd5b8660208260061b85010111156129ea578485fd5b60209290920196919550909350505050565b600060208284031215612a0d578081fd5b813567ffffffffffffffff811115612a23578182fd5b8201601f81018413612a33578182fd5b6120af8482356020840161261d565b60008060008060008060008060c0898b031215612a5d578586fd5b883567ffffffffffffffff80821115612a74578788fd5b612a808c838d01612736565b909a50985060208b01359150612a95826130f5565b90965060408a013590612aa7826130f5565b90955060608a0135945060808a0135935060a08a01359080821115612aca578384fd5b50612ad78b828c01612736565b999c989b5096995094979396929594505050565b600060608284031215612afc578081fd5b612b04612f54565b8235612b0f816130f5565b8152602083810135908201526040928301359281019290925250919050565b600060408284031215612b3f578081fd5b6040516040810181811067ffffffffffffffff82111715612b6257612b626130c6565b6040528235612b70816130f5565b81526020830135612b80816130f5565b60208201529392505050565b600060608284031215612b9d578081fd5b612ba5612f54565b8235612bb0816130f5565b81526020830135612bc0816130f5565b60208201526040928301359281019290925250919050565b600060208284031215612be9578081fd5b5035919050565b60008060408385031215612c02578182fd5b8235915060208301356128a2816130f5565b600080600080600060a08688031215612c2b578283fd5b853594506020860135612c3d816130f5565b93506040860135612c4d816130f5565b92506060860135612c5d816130f5565b91506080860135612c6d816130f5565b809150509295509295909350565b60008060408385031215612c8d578182fd5b50508035926020909101359150565b600080600080600060608688031215612cb3578283fd5b85359450602086013567ffffffffffffffff80821115612cd1578485fd5b612cdd89838a01612736565b90965094506040880135915080821115612cf5578283fd5b50612d02888289016126a9565b969995985093965092949392505050565b60008151808452612d2b816020860160208601612ff9565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60007fffffffffffffffffffffffffffffffffffffffff000000000000000000000000808960601b168352808860601b1660148401525085602883015284604883015282846068840137910160680190815295945050505050565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008460601b16815282601482015260008251612dfb816034850160208701612ff9565b91909101603401949350505050565b60008251612e1c818460208701612ff9565b9190910192915050565b60008651612e38818460208b01612ff9565b80830190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008760601b1681528560148201528460348201528351612e84816054840160208801612ff9565b01605401979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152608060408201526000612ec86080830185612d13565b8281036060840152612eda8185612d13565b979650505050505050565b6020815260006112ca6020830184612d13565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112612e1c578182fd5b6040516080810167ffffffffffffffff81118282101715612f4e57612f4e6130c6565b60405290565b6040516060810167ffffffffffffffff81118282101715612f4e57612f4e6130c6565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612fbe57612fbe6130c6565b604052919050565b600082612fd557612fd5613097565b500490565b60006112ca36848461261d565b6000612ff33683612776565b92915050565b60005b83811015613014578181015183820152602001612ffc565b838111156111095750506000910152565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561307c577f4e487b710000000000000000000000000000000000000000000000000000000081526011600452602481fd5b5060010190565b60008261309257613092613097565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81168114611d9657600080fdfea264697066735822122081126056cb5b2302536912a2c2fcf77a77bb1c180a75f9e4d7e701fbda5f0f8b64736f6c63430008040033
[codex:587879] 
[codex:587879] thinking
[codex:587879] **Preparing bytecode analysis and exploit detection**
[codex:587879] 
[codex:587879] I’m getting ready to analyze the runtime bytecode carefully to find any concrete exploit paths leading to unauthorized ETH or token transfers. Since no external lookups are possible, I’ll rely on opcode patterns, function selectors, and heuristic decoding to identify vulnerabilities or confirm safe behaviors. To aid this, I'll implement a Python script to disassemble the bytecode and map CALL instructions so I can understand control flow and permissions better.
[codex:587879] exec
[codex:587879] /bin/bash -lc "python - <<'PY'
[codex:587879] import re,sys
[codex:587879] from pathlib import Path
[codex:587879] code = Path('/tmp/codex-multi-5dii8700/BYTECODE_BUNDLE.txt').read_text()
[codex:587879] # extract hex after runtime
[codex:587879] m = re.search(r'FILE: runtime_bytecode.hex\\n(0x[0-9a-fA-F]+)', code)
[codex:587879] if not m:
[codex:587879]     print('no match'); sys.exit()
[codex:587879] hexcode = m.group(1)[2:]
[codex:587879] print('len bytes', len(hexcode)//2)
[codex:587879] # opcode map
[codex:587879] opcodes = {0x00:'STOP',0x01:'ADD',0x02:'MUL',0x03:'SUB',0x04:'DIV',0x05:'SDIV',0x06:'MOD',0x07:'SMOD',0x08:'ADDMOD',0x09:'MULMOD',0x0a:'EXP',0x0b:'SIGNEXTEND',
[codex:587879] 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:587879] 0x20:'SHA3',
[codex:587879] 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:587879] 0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x46:'CHAINID',0x47:'SELFBALANCE',0x48:'BASEFEE',
[codex:587879] 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:587879] 0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'}
[codex:587879] # Add DUP/SWAP/PUSH/LOG
[codex:587879] for i in range(1,33):
[codex:587879]     opcodes[0x5f+i] = f'PUSH{i}'
[codex:587879] for i in range(1,17):
[codex:587879]     opcodes[0x7f+i] = f'DUP{i}'
[codex:587879]     opcodes[0x8f+i] = f'SWAP{i}'
[codex:587879] for i in range(0,5):
[codex:587879]     opcodes[0xa0+i] = f'LOG{i}'
[codex:587879] 
[codex:587879] b = bytes.fromhex(hexcode)
[codex:587879] # disassemble and find CALL/DELEGATECALL/CREATE/SELFDESTRUCT
[codex:587879] calls = []
[codex:587879] offs=0
[codex:587879] while offs < len(b):
[codex:587879]     op = b[offs]
[codex:587879]     name = opcodes.get(op, f'OP{op:02x}')
[codex:587879]     if name.startswith('PUSH'):
[codex:587879]         n = int(name[4:])
[codex:587879]         data = b[offs+1:offs+1+n]
[codex:587879]         calls.append((offs, name, data.hex())) if False else None
[codex:587879]         offs += 1+n
[codex:587879]         continue
[codex:587879]     if name in ('CALL','DELEGATECALL','CREATE','CREATE2','SELFDESTRUCT','STATICCALL','CALLCODE'):
[codex:587879]         calls.append((offs, name, None))
[codex:587879]     offs += 1
[codex:587879] 
[codex:587879] print('found', len(calls), 'call-like ops')
[codex:587879] for off,name,_ in calls[:50]:
[codex:587879]     print(hex(off), name)
[codex:587879] print('... last 10')
[codex:587879] for off,name,_ in calls[-10:]:
[codex:587879]     print(hex(off), name)
[codex:587879] 
[codex:587879] # Let's output around CALLs with context instructions (previous few opcodes) to inspect.
[codex:587879] 
[codex:587879] # build full disasm list with immediate data
[codex:587879] ops = []
[codex:587879] offs=0
[codex:587879] while offs < len(b):
[codex:587879]     op = b[offs]; name = opcodes.get(op,f'OP{op:02x}');
[codex:587879]     if name.startswith('PUSH'):
[codex:587879]         n=int(name[4:]); data=b[offs+1:offs+1+n];
[codex:587879]         ops.append((offs, name, data.hex()))
[codex:587879]         offs += 1+n
[codex:587879]     else:
[codex:587879]         ops.append((offs, name, None)); offs +=1
[codex:587879] 
[codex:587879] # create map offset->index
[codex:587879] idx = {o:i for i,(o,_,_) in enumerate(ops)}
[codex:587879] 
[codex:587879] # function to show context around call
[codex:587879] for off,name,_ in calls:
[codex:587879]     if name not in ('CALL','DELEGATECALL','CREATE','CREATE2','SELFDESTRUCT','STATICCALL','CALLCODE'):
[codex:587879]         continue
[codex:587879]     i = idx[off]
[codex:587879]     ctx = ops[max(0,i-8):i+4]
[codex:587879]     print('\\n',hex(off),name)
[codex:587879]     for o,n,d in ctx:
[codex:587879]         if d is None:
[codex:587879]             print(f'{o:06x}: {n}')
[codex:587879]         else:
[codex:587879]             print(f'{o:06x}: {n} 0x{d}')
[codex:587879] PY" in /tmp/codex-multi-5dii8700 succeeded in 46ms:
[codex:587879] len bytes 12621
[codex:587879] found 8 call-like ops
[codex:587879] 0x1b65 CALL
[codex:587879] 0x1c8f CALL
[codex:587879] 0x1d67 CALL
[codex:587879] 0x1f02 CALL
[codex:587879] 0x20a2 CREATE2
[codex:587879] 0x2105 CALL
[codex:587879] 0x22b8 CALL
[codex:587879] 0x24d9 STATICCALL
[codex:587879] ... last 10
[codex:587879] 0x1b65 CALL
[codex:587879] 0x1c8f CALL
[codex:587879] 0x1d67 CALL
[codex:587879] 0x1f02 CALL
[codex:587879] 0x20a2 CREATE2
[codex:587879] 0x2105 CALL
[codex:587879] 0x22b8 CALL
[codex:587879] 0x24d9 STATICCALL
[codex:587879] 
[codex:587879] 
[codex:587879] thinking
[codex:587879] **Analyzing call operations and function contexts**
[codex:587879] exec
[codex:587879] /bin/bash -lc "python - <<'PY'
[codex:587879] import re
[codex:587879] from pathlib import Path
[codex:587879] code = Path('/tmp/codex-multi-5dii8700/BYTECODE_BUNDLE.txt').read_text()
[codex:587879] hexcode = re.search(r'FILE: runtime_bytecode.hex\\n(0x[0-9a-fA-F]+)', code).group(1)[2:]
[codex:587879] b = bytes.fromhex(hexcode)
[codex:587879] # opcode map
[codex:587879] opcodes = {0x00:'STOP',0x01:'ADD',0x02:'MUL',0x03:'SUB',0x04:'DIV',0x05:'SDIV',0x06:'MOD',0x07:'SMOD',0x08:'ADDMOD',0x09:'MULMOD',0x0a:'EXP',0x0b:'SIGNEXTEND',
[codex:587879] 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:587879] 0x20:'SHA3',
[codex:587879] 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:587879] 0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x46:'CHAINID',0x47:'SELFBALANCE',0x48:'BASEFEE',
[codex:587879] 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:587879] 0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'}
[codex:587879] for i in range(1,33): opcodes[0x5f+i]=f'PUSH{i}'
[codex:587879] for i in range(1,17): opcodes[0x7f+i]=f'DUP{i}'; opcodes[0x8f+i]=f'SWAP{i}'
[codex:587879] for i in range(0,5): opcodes[0xa0+i]=f'LOG{i}'
[codex:587879] 
[codex:587879] ops=[]; offs=0
[codex:587879] while offs<len(b):
[codex:587879]     op=b[offs]; name=opcodes.get(op,f'OP{op:02x}')
[codex:587879]     if name.startswith('PUSH'):
[codex:587879]         n=int(name[4:]); data=b[offs+1:offs+1+n]
[codex:587879]         ops.append((offs,name,data))
[codex:587879]         offs+=1+n
[codex:587879]     else:
[codex:587879]         ops.append((offs,name,None)); offs+=1
[codex:587879] 
[codex:587879] # build list of jumpdests
[codex:587879] jumpdests=[o for o,name,_ in ops if name=='JUMPDEST']
[codex:587879] # find call ops
[codex:587879] call_ops=[(o,name) for o,name,_ in ops if name in ('CALL','DELEGATECALL','CREATE','CREATE2','SELFDESTRUCT','STATICCALL','CALLCODE')]
[codex:587879] # map offset->index
[codex:587879] idx={o:i for i,(o,_,_) in enumerate(ops)}
[codex:587879] 
[codex:587879] for off,name in call_ops:
[codex:587879]     # find last JUMPDEST before off
[codex:587879]     prev=[jd for jd in jumpdests if jd<off]
[codex:587879]     start=prev[-1] if prev else 0
[codex:587879]     print('\\nCALL at',hex(off),name,'function start',hex(start))
[codex:587879]     # print disasm from start to off+10 lines
[codex:587879]     si=idx[start]; ei=min(len(ops), idx[off]+15)
[codex:587879]     for o,n,d in ops[si:ei]:
[codex:587879]         if d is None:
[codex:587879]             print(f'{o:06x}: {n}')
[codex:587879]         else:
[codex:587879]             print(f'{o:06x}: {n} 0x{d.hex()}')
[codex:587879] PY" in /tmp/codex-multi-5dii8700 succeeded in 35ms:
[codex:587879] 
[codex:587879] CALL at 0x1b65 CALL function start 0x1b58
[codex:587879] 001b58: JUMPDEST
[codex:587879] 001b59: PUSH1 0x00
[codex:587879] 001b5b: PUSH1 0x40
[codex:587879] 001b5d: MLOAD
[codex:587879] 001b5e: DUP1
[codex:587879] 001b5f: DUP4
[codex:587879] 001b60: SUB
[codex:587879] 001b61: DUP2
[codex:587879] 001b62: DUP6
[codex:587879] 001b63: DUP9
[codex:587879] 001b64: DUP9
[codex:587879] 001b65: CALL
[codex:587879] 001b66: SWAP4
[codex:587879] 001b67: POP
[codex:587879] 001b68: POP
[codex:587879] 001b69: POP
[codex:587879] 001b6a: POP
[codex:587879] 001b6b: RETURNDATASIZE
[codex:587879] 
[codex:587879] thinking
[codex:587879] **Analyzing call sites and function dispatch**
[codex:587879] exec
[codex:587879] /bin/bash -lc "python - <<'PY'
[codex:587879] import re
[codex:587879] from pathlib import Path
[codex:587879] code = Path('/tmp/codex-multi-5dii8700/BYTECODE_BUNDLE.txt').read_text()
[codex:587879] hexcode = re.search(r'FILE: runtime_bytecode.hex\\n(0x[0-9a-fA-F]+)', code).group(1)[2:]
[codex:587879] # simple parse to find selector->dest from dispatcher
[codex:587879] b = bytes.fromhex(hexcode)
[codex:587879] # We'll disassemble until first JUMPDEST after dispatcher? We'll parse for pattern: PUSH4 <sel> ... PUSH2 <dest> JUMPI
[codex:587879] ops=[]; offs=0
[codex:587879] # minimal mapping of opcodes for PUSH only
[codex:587879] opcodes = {}
[codex:587879] for i in range(1,33): opcodes[0x5f+i]=f'PUSH{i}'
[codex:587879] 
[codex:587879] while offs < len(b):
[codex:587879]     op = b[offs]
[codex:587879]     if op==0x5b: # JUMPDEST
[codex:587879]         # stop once runtime functions start? but dispatcher also has JUMPDEST. We'll parse entire and find sequences.
[codex:587879]         pass
[codex:587879]     name = opcodes.get(op)
[codex:587879]     if name:
[codex:587879]         n = int(name[4:])
[codex:587879]         data = b[offs+1:offs+1+n]
[codex:587879]         ops.append((offs,name,data))
[codex:587879]         offs += 1+n
[codex:587879]     else:
[codex:587879]         ops.append((offs,f'OP{op:02x}',None))
[codex:587879]         offs += 1
[codex:587879] 
[codex:587879] # find pattern PUSH4 sel ... PUSH2 dest ... JUMPI
[codex:587879] selectors=[]
[codex:587879] for i,(off,name,data) in enumerate(ops):
[codex:587879]     if name=='PUSH4':
[codex:587879]         sel = data.hex()
[codex:587879]         # search forward within next 10 ops for PUSH2 then JUMPI
[codex:587879]         dest=None
[codex:587879]         for j in range(i+1,i+10):
[codex:587879]             if j>=len(ops): break
[codex:587879]             if ops[j][1]=='PUSH2':
[codex:587879]                 dest = int.from_bytes(ops[j][2],'big')
[codex:587879]             if ops[j][1]=='OP57': # JUMPI
[codex:587879]                 if dest is not None:
[codex:587879]                     selectors.append((sel,dest))
[codex:587879]                 break
[codex:587879] 
[codex:587879] # deduplicate by selector (maybe duplicates)
[codex:587879] seen=set();
[codex:587879] for sel,dest in selectors:
[codex:587879]     if sel in seen: continue
[codex:587879]     seen.add(sel)
[codex:587879]     print(f'{sel} -> 0x{dest:04x}')
[codex:587879] PY" in /tmp/codex-multi-5dii8700 succeeded in 33ms:
[codex:587879] 7d729478 -> 0x00cb
[codex:587879] e38e7821 -> 0x007f
[codex:587879] f0fd58a7 -> 0x0059
[codex:587879] f5537ede -> 0x049b
[codex:587879] fbfbbfed -> 0x04bb
[codex:587879] e9bb84c2 -> 0x043b
[codex:587879] ea23c389 -> 0x045b
[codex:587879] b269681d -> 0x00b0
[codex:587879] c59edb61 -> 0x03ce
[codex:587879] dc45d642 -> 0x03ee
[codex:587879] acf854fc -> 0x0361
[codex:587879] 4867ba15 -> 0x012d
[codex:587879] 72494bd6 -> 0x0107
[codex:587879] 760b85a7 -> 0x02f4
[codex:587879] 7d58d56c -> 0x0314
[codex:587879] 51acecc4 -> 0x0247
[codex:587879] 6e1021ea -> 0x0267
[codex:587879] 0e67c6bc -> 0x015e
[codex:587879] 1ea3a52d -> 0x01e7
[codex:587879] 3641e083 -> 0x0207
[codex:587879] 
[codex:587879] thinking
[codex:587879] **Mapping external to internal functions**
[codex:587879] exec
[codex:587879] /bin/bash -lc "python - <<'PY'
[codex:587879] import re
[codex:587879] from pathlib import Path
[codex:587879] code = Path('/tmp/codex-multi-5dii8700/BYTECODE_BUNDLE.txt').read_text()
[codex:587879] hexcode = re.search(r'FILE: runtime_bytecode.hex\\n(0x[0-9a-fA-F]+)', code).group(1)[2:]
[codex:587879] b = bytes.fromhex(hexcode)
[codex:587879] # opcode map minimal
[codex:587879] opcodes = {0x00:'STOP',0x01:'ADD',0x02:'MUL',0x03:'SUB',0x04:'DIV',0x05:'SDIV',0x06:'MOD',0x07:'SMOD',0x08:'ADDMOD',0x09:'MULMOD',0x0a:'EXP',0x0b:'SIGNEXTEND',0x10:'LT',0x11:'GT',0x12:'SLT',0x13:'SGT',0x14:'EQ',0x15:'ISZERO',0x16:'AND',0x17:'OR',0x18:'XOR',0x19:'NOT',0x1a:'BYTE',0x1b:'SHL',0x1c:'SHR',0x1d:'SAR',0x20:'SHA3',0x30:'ADDRESS',0x31:'BALANCE',0x32:'ORIGIN',0x33:'CALLER',0x34:'CALLVALUE',0x35:'CALLDATALOAD',0x36:'CALLDATASIZE',0x37:'CALLDATACOPY',0x38:'CODESIZE',0x39:'CODECOPY',0x3a:'GASPRICE',0x3b:'EXTCODESIZE',0x3c:'EXTCODECOPY',0x3d:'RETURNDATASIZE',0x3e:'RETURNDATACOPY',0x3f:'EXTCODEHASH',0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x46:'CHAINID',0x47:'SELFBALANCE',0x48:'BASEFEE',0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x53:'MSTORE8',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x58:'PC',0x59:'MSIZE',0x5a:'GAS',0x5b:'JUMPDEST',0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'}
[codex:587879] for i in range(1,33): opcodes[0x5f+i]=f'PUSH{i}'
[codex:587879] for i in range(1,17): opcodes[0x7f+i]=f'DUP{i}'; opcodes[0x8f+i]=f'SWAP{i}'
[codex:587879] for i in range(0,5): opcodes[0xa0+i]=f'LOG{i}'
[codex:587879] 
[codex:587879] ops=[]; offs=0
[codex:587879] while offs<len(b):
[codex:587879]     op=b[offs]; name=opcodes.get(op,f'OP{op:02x}')
[codex:587879]     if name.startswith('PUSH'):
[codex:587879]         n=int(name[4:]); data=b[offs+1:offs+1+n]
[codex:587879]         ops.append((offs,name,data))
[codex:587879]         offs+=1+n
[codex:587879]     else:
[codex:587879]         ops.append((offs,name,None)); offs+=1
[codex:587879] 
[codex:587879] # get selector->dest from earlier
[codex:587879] selectors={
[codex:587879] '7d729478':0x00cb,
[codex:587879] 'e38e7821':0x007f,
[codex:587879] 'f0fd58a7':0x0059,
[codex:587879] 'f5537ede':0x049b,
[codex:587879] 'fbfbbfed':0x04bb,
[codex:587879] 'e9bb84c2':0x043b,
[codex:587879] 'ea23c389':0x045b,
[codex:587879] 'b269681d':0x00b0,
[codex:587879] 'c59edb61':0x03ce,
[codex:587879] 'dc45d642':0x03ee,
[codex:587879] 'acf854fc':0x0361,
[codex:587879] '4867ba15':0x012d,
[codex:587879] '72494bd6':0x0107,
[codex:587879] '760b85a7':0x02f4,
[codex:587879] '7d58d56c':0x0314,
[codex:587879] '51acecc4':0x0247,
[codex:587879] '6e1021ea':0x0267,
[codex:587879] '0e67c6bc':0x015e,
[codex:587879] '1ea3a52d':0x01e7,
[codex:587879] '3641e083':0x0207,
[codex:587879] '02906b27':0x0185,
[codex:587879] '0a0a05e6':0x01a7,
[codex:587879] }
[codex:587879] 
[codex:587879] idx={o:i for i,(o,_,_) in enumerate(ops)}
[codex:587879] 
[codex:587879] for sel,dest in selectors.items():
[codex:587879]     if dest not in idx:
[codex:587879]         # maybe dest points to code before JUMPDEST? let's find nearest JUMPDEST >= dest
[codex:587879]         continue
[codex:587879]     i=idx[dest]
[codex:587879]     print('\\nselector',sel,'dest',hex(dest))
[codex:587879]     for o,n,d in ops[i:i+30]:
[codex:587879]         if d is None:
[codex:587879]             print(f'{o:06x}: {n}')
[codex:587879]         else:
[codex:587879]             print(f'{o:06x}: {n} 0x{d.hex()}')
[codex:587879] PY" in /tmp/codex-multi-5dii8700 succeeded in 35ms:
[codex:587879] 
[codex:587879] selector 7d729478 dest 0xcb
[codex:587879] 0000cb: JUMPDEST
[codex:587879] 0000cc: DUP1
[codex:587879] 0000cd: PUSH4 0x4867ba15
[codex:587879] 0000d2: GT
[codex:587879] 0000d3: PUSH2 0x012d
[codex:587879] 0000d6: JUMPI
[codex:587879] 0000d7: DUP1
[codex:587879] 0000d8: PUSH4 0x72494bd6
[codex:587879] 0000dd: GT
[codex:587879] 0000de: PUSH2 0x0107
[codex:587879] 0000e1: JUMPI
[codex:587879] 0000e2: DUP1
[codex:587879] 0000e3: PUSH4 0x72494bd6
[codex:587879] 0000e8: EQ
[codex:587879] 0000e9: PUSH2 0x02d4
[codex:587879] 0000ec: JUMPI
[codex:587879] 0000ed: DUP1
[codex:587879] 0000ee: PUSH4 0x760b85a7
[codex:587879] 
[codex:587879] thinking
[codex:587879] **Analyzing nested dispatch table mappings**
[codex:587879] exec
[codex:587879] /bin/bash -lc "python - <<'PY'
[codex:587879] import re
[codex:587879] from pathlib import Path
[codex:587879] code=Path('/tmp/codex-multi-5dii8700/BYTECODE_BUNDLE.txt').read_text()
[codex:587879] hexcode=re.search(r'FILE: runtime_bytecode.hex\\n(0x[0-9a-fA-F]+)', code).group(1)[2:]
[codex:587879] b=bytes.fromhex(hexcode)
[codex:587879] # disasm
[codex:587879] opcodes={0x00:'STOP',0x01:'ADD',0x02:'MUL',0x03:'SUB',0x04:'DIV',0x05:'SDIV',0x06:'MOD',0x07:'SMOD',0x08:'ADDMOD',0x09:'MULMOD',0x0a:'EXP',0x0b:'SIGNEXTEND',0x10:'LT',0x11:'GT',0x12:'SLT',0x13:'SGT',0x14:'EQ',0x15:'ISZERO',0x16:'AND',0x17:'OR',0x18:'XOR',0x19:'NOT',0x1a:'BYTE',0x1b:'SHL',0x1c:'SHR',0x1d:'SAR',0x20:'SHA3',0x30:'ADDRESS',0x31:'BALANCE',0x32:'ORIGIN',0x33:'CALLER',0x34:'CALLVALUE',0x35:'CALLDATALOAD',0x36:'CALLDATASIZE',0x37:'CALLDATACOPY',0x38:'CODESIZE',0x39:'CODECOPY',0x3a:'GASPRICE',0x3b:'EXTCODESIZE',0x3c:'EXTCODECOPY',0x3d:'RETURNDATASIZE',0x3e:'RETURNDATACOPY',0x3f:'EXTCODEHASH',0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x46:'CHAINID',0x47:'SELFBALANCE',0x48:'BASEFEE',0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x53:'MSTORE8',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x58:'PC',0x59:'MSIZE',0x5a:'GAS',0x5b:'JUMPDEST',0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'}
[codex:587879] for i in range(1,33): opcodes[0x5f+i]=f'PUSH{i}'
[codex:587879] for i in range(1,17): opcodes[0x7f+i]=f'DUP{i}'; opcodes[0x8f+i]=f'SWAP{i}'
[codex:587879] for i in range(0,5): opcodes[0xa0+i]=f'LOG{i}'
[codex:587879] 
[codex:587879] ops=[]; offs=0
[codex:587879] while offs<len(b):
[codex:587879]     op=b[offs]; name=opcodes.get(op,f'OP{op:02x}')
[codex:587879]     if name.startswith('PUSH'):
[codex:587879]         n=int(name[4:]); data=b[offs+1:offs+1+n]
[codex:587879]         ops.append((offs,name,data))
[codex:587879]         offs+=1+n
[codex:587879]     else:
[codex:587879]         ops.append((offs,name,None)); offs+=1
[codex:587879] 
[codex:587879] # print disasm between start and end
[codex:587879] start=0x1b40; end=0x1c30
[codex:587879] for o,n,d in ops:
[codex:587879]     if o<start or o>end: continue
[codex:587879]     if d is None:
[codex:587879]         print(f'{o:06x}: {n}')
[codex:587879]     else:
[codex:587879]         print(f'{o:06x}: {n} 0x{d.hex()}')
[codex:587879] PY" in /tmp/codex-multi-5dii8700 succeeded in 35ms:
[codex:587879] 001b40: AND
[codex:587879] 001b41: DUP4
[codex:587879] 001b42: DUP6
[codex:587879] 001b43: PUSH1 0x40
[codex:587879] 001b45: ADD
[codex:587879] 001b46: MLOAD
[codex:587879] 001b47: DUP7
[codex:587879] 001b48: PUSH1 0x60
[codex:587879] 001b4a: ADD
[codex:587879] 001b4b: MLOAD
[codex:587879] 001b4c: PUSH1 0x40
[codex:587879] 001b4e: MLOAD
[codex:587879] 001b4f: PUSH2 0x1b58
[codex:587879] 001b52: SWAP2
[codex:587879] 001b53: SWAP1
[codex:587879] 001b54: PUSH2 0x2e0a
[codex:587879] 001b57: JUMP
[codex:587879] 001b58: JUMPDEST
[codex:587879] 001b59: PUSH1 0x00
[codex:587879] 001b5b: PUSH1 0x40
[codex:587879] 
[codex:587879] thinking
[codex:587879] **Analyzing event call setup**
[codex:587879] exec
[codex:587879] /bin/bash -lc "python - <<'PY'
[codex:587879] import re
[codex:587879] from pathlib import Path
[codex:587879] code=Path('/tmp/codex-multi-5dii8700/BYTECODE_BUNDLE.txt').read_text()
[codex:587879] hexcode=re.search(r'FILE: runtime_bytecode.hex\\n(0x[0-9a-fA-F]+)', code).group(1)[2:]
[codex:587879] b=bytes.fromhex(hexcode)
[codex:587879] # disasm
[codex:587879] opcodes={0x00:'STOP',0x01:'ADD',0x02:'MUL',0x03:'SUB',0x04:'DIV',0x05:'SDIV',0x06:'MOD',0x07:'SMOD',0x08:'ADDMOD',0x09:'MULMOD',0x0a:'EXP',0x0b:'SIGNEXTEND',0x10:'LT',0x11:'GT',0x12:'SLT',0x13:'SGT',0x14:'EQ',0x15:'ISZERO',0x16:'AND',0x17:'OR',0x18:'XOR',0x19:'NOT',0x1a:'BYTE',0x1b:'SHL',0x1c:'SHR',0x1d:'SAR',0x20:'SHA3',0x30:'ADDRESS',0x31:'BALANCE',0x32:'ORIGIN',0x33:'CALLER',0x34:'CALLVALUE',0x35:'CALLDATALOAD',0x36:'CALLDATASIZE',0x37:'CALLDATACOPY',0x38:'CODESIZE',0x39:'CODECOPY',0x3a:'GASPRICE',0x3b:'EXTCODESIZE',0x3c:'EXTCODECOPY',0x3d:'RETURNDATASIZE',0x3e:'RETURNDATACOPY',0x3f:'EXTCODEHASH',0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x46:'CHAINID',0x47:'SELFBALANCE',0x48:'BASEFEE',0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x53:'MSTORE8',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x58:'PC',0x59:'MSIZE',0x5a:'GAS',0x5b:'JUMPDEST',0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'}
[codex:587879] for i in range(1,33): opcodes[0x5f+i]=f'PUSH{i}'
[codex:587879] for i in range(1,17): opcodes[0x7f+i]=f'DUP{i}'; opcodes[0x8f+i]=f'SWAP{i}'
[codex:587879] for i in range(0,5): opcodes[0xa0+i]=f'LOG{i}'
[codex:587879] 
[codex:587879] ops=[]; offs=0
[codex:587879] while offs<len(b):
[codex:587879]     op=b[offs]; name=opcodes.get(op,f'OP{op:02x}')
[codex:587879]     if name.startswith('PUSH'):
[codex:587879]         n=int(name[4:]); data=b[offs+1:offs+1+n]
[codex:587879]         ops.append((offs,name,data))
[codex:587879]         offs+=1+n
[codex:587879]     else:
[codex:587879]         ops.append((offs,name,None)); offs+=1
[codex:587879] 
[codex:587879] start=0x1a90; end=0x1c80
[codex:587879] for o,n,d in ops:
[codex:587879]     if o<start or o>end: continue
[codex:587879]     if d is None:
[codex:587879]         print(f'{o:06x}: {n}')
[codex:587879]     else:
[codex:587879]         print(f'{o:06x}: {n} 0x{d.hex()}')
[codex:587879] PY" in /tmp/codex-multi-5dii8700 succeeded in 33ms:
[codex:587879] 001a90: DUP7
[codex:587879] 001a91: DUP3
[codex:587879] 001a92: DUP6
[codex:587879] 001a93: DUP6
[codex:587879] 001a94: PUSH2 0x2343
[codex:587879] 001a97: JUMP
[codex:587879] 001a98: JUMPDEST
[codex:587879] 001a99: SWAP7
[codex:587879] 001a9a: SWAP6
[codex:587879] 001a9b: POP
[codex:587879] 001a9c: POP
[codex:587879] 001a9d: POP
[codex:587879] 001a9e: POP
[codex:587879] 001a9f: POP
[codex:587879] 001aa0: POP
[codex:587879] 001aa1: JUMP
[codex:587879] 001aa2: JUMPDEST
[codex:587879] 001aa3: PUSH1 0x00
[codex:587879] 001aa5: PUSH2 0x1aad
[codex:587879] 001aa8: DUP3
[codex:587879] 
[codex:587879] thinking
[codex:587879] **Analyzing calldata processing and access control**
[codex:587879] 
[codex:587879] This function seems to unpack a struct from memory for a call—extracting target address, gas, value, and data pointers—and then performs a CALL instruction. I’m piecing together likely field layouts and trying to figure out if this logic checks for proper authorization before executing external calls, especially around roles like wallet or guardian. I want to inspect all uses of CALLER to verify if access control is consistently enforced on external calls and token transfers. I’ll consider writing a script to identify CALLER checks near call sites for a thorough review.
[codex:587879] exec
[codex:587879] /bin/bash -lc "python - <<'PY'
[codex:587879] import re
[codex:587879] from pathlib import Path
[codex:587879] code=Path('/tmp/codex-multi-5dii8700/BYTECODE_BUNDLE.txt').read_text()
[codex:587879] hexcode=re.search(r'FILE: runtime_bytecode.hex\\n(0x[0-9a-fA-F]+)', code).group(1)[2:]
[codex:587879] b=bytes.fromhex(hexcode)
[codex:587879] # disasm
[codex:587879] opcodes={0x00:'STOP',0x01:'ADD',0x02:'MUL',0x03:'SUB',0x04:'DIV',0x05:'SDIV',0x06:'MOD',0x07:'SMOD',0x08:'ADDMOD',0x09:'MULMOD',0x0a:'EXP',0x0b:'SIGNEXTEND',0x10:'LT',0x11:'GT',0x12:'SLT',0x13:'SGT',0x14:'EQ',0x15:'ISZERO',0x16:'AND',0x17:'OR',0x18:'XOR',0x19:'NOT',0x1a:'BYTE',0x1b:'SHL',0x1c:'SHR',0x1d:'SAR',0x20:'SHA3',0x30:'ADDRESS',0x31:'BALANCE',0x32:'ORIGIN',0x33:'CALLER',0x34:'CALLVALUE',0x35:'CALLDATALOAD',0x36:'CALLDATASIZE',0x37:'CALLDATACOPY',0x38:'CODESIZE',0x39:'CODECOPY',0x3a:'GASPRICE',0x3b:'EXTCODESIZE',0x3c:'EXTCODECOPY',0x3d:'RETURNDATASIZE',0x3e:'RETURNDATACOPY',0x3f:'EXTCODEHASH',0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x46:'CHAINID',0x47:'SELFBALANCE',0x48:'BASEFEE',0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x53:'MSTORE8',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x58:'PC',0x59:'MSIZE',0x5a:'GAS',0x5b:'JUMPDEST',0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'}
[codex:587879] for i in range(1,33): opcodes[0x5f+i]=f'PUSH{i}'
[codex:587879] for i in range(1,17): opcodes[0x7f+i]=f'DUP{i}'; opcodes[0x8f+i]=f'SWAP{i}'
[codex:587879] for i in range(0,5): opcodes[0xa0+i]=f'LOG{i}'
[codex:587879] 
[codex:587879] ops=[]; offs=0
[codex:587879] while offs<len(b):
[codex:587879]     op=b[offs]; name=opcodes.get(op,f'OP{op:02x}')
[codex:587879]     if name.startswith('PUSH'):
[codex:587879]         n=int(name[4:]); data=b[offs+1:offs+1+n]
[codex:587879]         ops.append((offs,name,data))
[codex:587879]         offs+=1+n
[codex:587879]     else:
[codex:587879]         ops.append((offs,name,None)); offs+=1
[codex:587879] 
[codex:587879] # find CALLER occurrences
[codex:587879] for i,(o,n,d) in enumerate(ops):
[codex:587879]     if n=='CALLER':
[codex:587879]         print('\\nCALLER at',hex(o))
[codex:587879]         for o2,n2,d2 in ops[i-5:i+10]:
[codex:587879]             if d2 is None:
[codex:587879]                 print(f'{o2:06x}: {n2}')
[codex:587879]             else:
[codex:587879]                 print(f'{o2:06x}: {n2} 0x{d2.hex()}')
[codex:587879] PY" in /tmp/codex-multi-5dii8700 succeeded in 47ms:
[codex:587879] 
[codex:587879] CALLER at 0x4e9
[codex:587879] 0004e2: SWAP2
[codex:587879] 0004e3: SWAP1
[codex:587879] 0004e4: PUSH2 0x2ee5
[codex:587879] 0004e7: JUMP
[codex:587879] 0004e8: JUMPDEST
[codex:587879] 0004e9: CALLER
[codex:587879] 0004ea: PUSH1 0x00
[codex:587879] 0004ec: SWAP1
[codex:587879] 0004ed: DUP2
[codex:587879] 0004ee: MSTORE
[codex:587879] 0004ef: PUSH1 0x03
[codex:587879] 0004f1: PUSH1 0x20
[codex:587879] 0004f3: MSTORE
[codex:587879] 0004f4: PUSH1 0x40
[codex:587879] 0004f6: SWAP1
[codex:587879] 
[codex:587879] CALLER at 0x51b
[codex:587879] 000501: POP
[codex:587879] 
[codex:587879] thinking
[codex:587879] **Analyzing self-call protection and signature verification**
[codex:587879] exec
[codex:587879] /bin/bash -lc "python - <<'PY'
[codex:587879] import re
[codex:587879] from pathlib import Path
[codex:587879] code=Path('/tmp/codex-multi-5dii8700/BYTECODE_BUNDLE.txt').read_text()
[codex:587879] hexcode=re.search(r'FILE: runtime_bytecode.hex\\n(0x[0-9a-fA-F]+)', code).group(1)[2:]
[codex:587879] b=bytes.fromhex(hexcode)
[codex:587879] # disasm similar
[codex:587879] opcodes={0x00:'STOP',0x01:'ADD',0x02:'MUL',0x03:'SUB',0x04:'DIV',0x05:'SDIV',0x06:'MOD',0x07:'SMOD',0x08:'ADDMOD',0x09:'MULMOD',0x0a:'EXP',0x0b:'SIGNEXTEND',0x10:'LT',0x11:'GT',0x12:'SLT',0x13:'SGT',0x14:'EQ',0x15:'ISZERO',0x16:'AND',0x17:'OR',0x18:'XOR',0x19:'NOT',0x1a:'BYTE',0x1b:'SHL',0x1c:'SHR',0x1d:'SAR',0x20:'SHA3',0x30:'ADDRESS',0x31:'BALANCE',0x32:'ORIGIN',0x33:'CALLER',0x34:'CALLVALUE',0x35:'CALLDATALOAD',0x36:'CALLDATASIZE',0x37:'CALLDATACOPY',0x38:'CODESIZE',0x39:'CODECOPY',0x3a:'GASPRICE',0x3b:'EXTCODESIZE',0x3c:'EXTCODECOPY',0x3d:'RETURNDATASIZE',0x3e:'RETURNDATACOPY',0x3f:'EXTCODEHASH',0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x46:'CHAINID',0x47:'SELFBALANCE',0x48:'BASEFEE',0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x53:'MSTORE8',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x58:'PC',0x59:'MSIZE',0x5a:'GAS',0x5b:'JUMPDEST',0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'}
[codex:587879] for i in range(1,33): opcodes[0x5f+i]=f'PUSH{i}'
[codex:587879] for i in range(1,17): opcodes[0x7f+i]=f'DUP{i}'; opcodes[0x8f+i]=f'SWAP{i}'
[codex:587879] for i in range(0,5): opcodes[0xa0+i]=f'LOG{i}'
[codex:587879] 
[codex:587879] ops=[]; offs=0
[codex:587879] while offs<len(b):
[codex:587879]     op=b[offs]; name=opcodes.get(op,f'OP{op:02x}')
[codex:587879]     if name.startswith('PUSH'):
[codex:587879]         n=int(name[4:]); data=b[offs+1:offs+1+n]
[codex:587879]         ops.append((offs,name,data))
[codex:587879]         offs+=1+n
[codex:587879]     else:
[codex:587879]         ops.append((offs,name,None)); offs+=1
[codex:587879] 
[codex:587879] start=0x04e8; end=0x0600
[codex:587879] for o,n,d in ops:
[codex:587879]     if o<start or o>end: continue
[codex:587879]     if d is None:
[codex:587879]         print(f'{o:06x}: {n}')
[codex:587879]     else:
[codex:587879]         print(f'{o:06x}: {n} 0x{d.hex()}')
[codex:587879] PY" in /tmp/codex-multi-5dii8700 succeeded in 33ms:
[codex:587879] 0004e8: JUMPDEST
[codex:587879] 0004e9: CALLER
[codex:587879] 0004ea: PUSH1 0x00
[codex:587879] 0004ec: SWAP1
[codex:587879] 0004ed: DUP2
[codex:587879] 0004ee: MSTORE
[codex:587879] 0004ef: PUSH1 0x03
[codex:587879] 0004f1: PUSH1 0x20
[codex:587879] 0004f3: MSTORE
[codex:587879] 0004f4: PUSH1 0x40
[codex:587879] 0004f6: SWAP1
[codex:587879] 0004f7: SHA3
[codex:587879] 0004f8: SLOAD
[codex:587879] 0004f9: PUSH1 0xff
[codex:587879] 0004fb: AND
[codex:587879] 0004fc: DUP1
[codex:587879] 0004fd: PUSH2 0x051d
[codex:587879] 000500: JUMPI
[codex:587879] 000501: POP
[codex:587879] 000502: PUSH1 0x01
[codex:587879] 
[codex:587879] thinking
[codex:587879] **Analyzing authorization and nonce checks**
[codex:587879] exec
[codex:587879] /bin/bash -lc "python - <<'PY'
[codex:587879] import re
[codex:587879] from pathlib import Path
[codex:587879] code=Path('/tmp/codex-multi-5dii8700/BYTECODE_BUNDLE.txt').read_text()
[codex:587879] hexcode=re.search(r'FILE: runtime_bytecode.hex\\n(0x[0-9a-fA-F]+)', code).group(1)[2:]
[codex:587879] b=bytes.fromhex(hexcode)
[codex:587879] # disasm
[codex:587879] opcodes={0x00:'STOP',0x01:'ADD',0x02:'MUL',0x03:'SUB',0x04:'DIV',0x05:'SDIV',0x06:'MOD',0x07:'SMOD',0x08:'ADDMOD',0x09:'MULMOD',0x0a:'EXP',0x0b:'SIGNEXTEND',0x10:'LT',0x11:'GT',0x12:'SLT',0x13:'SGT',0x14:'EQ',0x15:'ISZERO',0x16:'AND',0x17:'OR',0x18:'XOR',0x19:'NOT',0x1a:'BYTE',0x1b:'SHL',0x1c:'SHR',0x1d:'SAR',0x20:'SHA3',0x30:'ADDRESS',0x31:'BALANCE',0x32:'ORIGIN',0x33:'CALLER',0x34:'CALLVALUE',0x35:'CALLDATALOAD',0x36:'CALLDATASIZE',0x37:'CALLDATACOPY',0x38:'CODESIZE',0x39:'CODECOPY',0x3a:'GASPRICE',0x3b:'EXTCODESIZE',0x3c:'EXTCODECOPY',0x3d:'RETURNDATASIZE',0x3e:'RETURNDATACOPY',0x3f:'EXTCODEHASH',0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x46:'CHAINID',0x47:'SELFBALANCE',0x48:'BASEFEE',0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x53:'MSTORE8',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x58:'PC',0x59:'MSIZE',0x5a:'GAS',0x5b:'JUMPDEST',0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'}
[codex:587879] for i in range(1,33): opcodes[0x5f+i]=f'PUSH{i}'
[codex:587879] for i in range(1,17): opcodes[0x7f+i]=f'DUP{i}'; opcodes[0x8f+i]=f'SWAP{i}'
[codex:587879] for i in range(0,5): opcodes[0xa0+i]=f'LOG{i}'
[codex:587879] 
[codex:587879] ops=[]; offs=0
[codex:587879] while offs<len(b):
[codex:587879]     op=b[offs]; name=opcodes.get(op,f'OP{op:02x}')
[codex:587879]     if name.startswith('PUSH'):
[codex:587879]         n=int(name[4:]); data=b[offs+1:offs+1+n]
[codex:587879]         ops.append((offs,name,data))
[codex:587879]         offs+=1+n
[codex:587879]     else:
[codex:587879]         ops.append((offs,name,None)); offs+=1
[codex:587879] 
[codex:587879] start=0x0600; end=0x08a0
[codex:587879] for o,n,d in ops:
[codex:587879]     if o<start or o>end: continue
[codex:587879]     if d is None:
[codex:587879]         print(f'{o:06x}: {n}')
[codex:587879]     else:
[codex:587879]         print(f'{o:06x}: {n} 0x{d.hex()}')
[codex:587879] PY" in /tmp/codex-multi-5dii8700 succeeded in 36ms:
[codex:587879] 000618: PUSH1 0x40
[codex:587879] 00061a: DUP3
[codex:587879] 00061b: ADD
[codex:587879] 00061c: MSTORE
[codex:587879] 00061d: PUSH1 0x60
[codex:587879] 00061f: ADD
[codex:587879] 000620: SWAP1
[codex:587879] 000621: JUMP
[codex:587879] 000622: JUMPDEST
[codex:587879] 000623: PUSH1 0x00
[codex:587879] 000625: ADDRESS
[codex:587879] 000626: DUP7
[codex:587879] 000627: PUSH2 0x0633
[codex:587879] 00062a: PUSH2 0x04d6
[codex:587879] 00062d: DUP6
[codex:587879] 00062e: DUP8
[codex:587879] 00062f: PUSH2 0x2fda
[codex:587879] 000632: JUMP
[codex:587879] 000633: JUMPDEST
[codex:587879] 000634: PUSH1 0x40
[codex:587879] 
[codex:587879] thinking
[codex:587879] **Analyzing function access controls and call paths**
[codex:587879] 
[codex:587879] I'm examining various internal and external functions, focusing on their access controls and how they relate to calls that transfer value or change state. I want to confirm if any externally callable function can bypass signature checks or access restrictions—especially those that call out to other contracts or move tokens—potentially revealing vulnerabilities in authorization. There’s a lot to unpack here, so I'll keep narrowing down which functions actually enforce caller restrictions like `onlySelf` or key checks and which might be improperly exposed.
[codex:587879] exec
[codex:587879] /bin/bash -lc "python - <<'PY'
[codex:587879] import re
[codex:587879] from pathlib import Path
[codex:587879] code=Path('/tmp/codex-multi-5dii8700/BYTECODE_BUNDLE.txt').read_text();
[codex:587879] hexcode=re.search(r'FILE: runtime_bytecode.hex\\n(0x[0-9a-fA-F]+)', code).group(1)[2:]
[codex:587879] b=bytes.fromhex(hexcode)
[codex:587879] # disasm
[codex:587879] opcodes={0x00:'STOP',0x01:'ADD',0x02:'MUL',0x03:'SUB',0x04:'DIV',0x05:'SDIV',0x06:'MOD',0x07:'SMOD',0x08:'ADDMOD',0x09:'MULMOD',0x0a:'EXP',0x0b:'SIGNEXTEND',0x10:'LT',0x11:'GT',0x12:'SLT',0x13:'SGT',0x14:'EQ',0x15:'ISZERO',0x16:'AND',0x17:'OR',0x18:'XOR',0x19:'NOT',0x1a:'BYTE',0x1b:'SHL',0x1c:'SHR',0x1d:'SAR',0x20:'SHA3',0x30:'ADDRESS',0x31:'BALANCE',0x32:'ORIGIN',0x33:'CALLER',0x34:'CALLVALUE',0x35:'CALLDATALOAD',0x36:'CALLDATASIZE',0x37:'CALLDATACOPY',0x38:'CODESIZE',0x39:'CODECOPY',0x3a:'GASPRICE',0x3b:'EXTCODESIZE',0x3c:'EXTCODECOPY',0x3d:'RETURNDATASIZE',0x3e:'RETURNDATACOPY',0x3f:'EXTCODEHASH',0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x46:'CHAINID',0x47:'SELFBALANCE',0x48:'BASEFEE',0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x53:'MSTORE8',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x58:'PC',0x59:'MSIZE',0x5a:'GAS',0x5b:'JUMPDEST',0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'}
[codex:587879] for i in range(1,33): opcodes[0x5f+i]=f'PUSH{i}'
[codex:587879] for i in range(1,17): opcodes[0x7f+i]=f'DUP{i}'; opcodes[0x8f+i]=f'SWAP{i}'
[codex:587879] for i in range(0,5): opcodes[0xa0+i]=f'LOG{i}'
[codex:587879] 
[codex:587879] ops=[]; offs=0
[codex:587879] while offs<len(b):
[codex:587879]     op=b[offs]; name=opcodes.get(op,f'OP{op:02x}')
[codex:587879]     if name.startswith('PUSH'):
[codex:587879]         n=int(name[4:]); data=b[offs+1:offs+1+n]
[codex:587879]         ops.append((offs,name,data))
[codex:587879]         offs+=1+n
[codex:587879]     else:
[codex:587879]         ops.append((offs,name,None)); offs+=1
[codex:587879] 
[codex:587879] start=0x0a19; end=0x0b90
[codex:587879] for o,n,d in ops:
[codex:587879]     if o<start or o>end: continue
[codex:587879]     if d is None:
[codex:587879]         print(f'{o:06x}: {n}')
[codex:587879]     else:
[codex:587879]         print(f'{o:06x}: {n} 0x{d.hex()}')
[codex:587879] PY" in /tmp/codex-multi-5dii8700 succeeded in 40ms:
[codex:587879] 000a19: JUMPDEST
[codex:587879] 000a1a: CALLER
[codex:587879] 000a1b: PUSH1 0x00
[codex:587879] 000a1d: SWAP1
[codex:587879] 000a1e: DUP2
[codex:587879] 000a1f: MSTORE
[codex:587879] 000a20: PUSH1 0x03
[codex:587879] 000a22: PUSH1 0x20
[codex:587879] 000a24: MSTORE
[codex:587879] 000a25: PUSH1 0x40
[codex:587879] 000a27: SWAP1
[codex:587879] 000a28: SHA3
[codex:587879] 000a29: SLOAD
[codex:587879] 000a2a: PUSH1 0xff
[codex:587879] 000a2c: AND
[codex:587879] 000a2d: PUSH2 0x0a92
[codex:587879] 000a30: JUMPI
[codex:587879] 000a31: PUSH1 0x40
[codex:587879] 000a33: MLOAD
[codex:587879] 000a34: PUSH32 0x08c379a000000000000000000000000000000000000000000000000000000000
[codex:587879] 
[codex:587879] thinking
[codex:587879] **Analyzing contract initialization and access control**
[codex:587879] 
[codex:587879] I'm walking through a contract's functions focusing on initialization and caller restrictions. The initializer function sets initial states only if a slot is zero, suggesting it can be called once, but without knowing on-chain state, I can't tell if that creates an exploit. I'm also checking if authorized keys restrict access and if anyone can hijack ownership by calling init before it's set. I'm curious if later functions permit unauthorized token transfers or misuse caller identity; 0x107b is up next for inspection.
[codex:587879] exec
[codex:587879] /bin/bash -lc "python - <<'PY'
[codex:587879] import re
[codex:587879] from pathlib import Path
[codex:587879] code=Path('/tmp/codex-multi-5dii8700/BYTECODE_BUNDLE.txt').read_text();
[codex:587879] hexcode=re.search(r'FILE: runtime_bytecode.hex\\n(0x[0-9a-fA-F]+)', code).group(1)[2:]
[codex:587879] b=bytes.fromhex(hexcode)
[codex:587879] # disasm
[codex:587879] opcodes={0x00:'STOP',0x01:'ADD',0x02:'MUL',0x03:'SUB',0x04:'DIV',0x05:'SDIV',0x06:'MOD',0x07:'SMOD',0x08:'ADDMOD',0x09:'MULMOD',0x0a:'EXP',0x0b:'SIGNEXTEND',0x10:'LT',0x11:'GT',0x12:'SLT',0x13:'SGT',0x14:'EQ',0x15:'ISZERO',0x16:'AND',0x17:'OR',0x18:'XOR',0x19:'NOT',0x1a:'BYTE',0x1b:'SHL',0x1c:'SHR',0x1d:'SAR',0x20:'SHA3',0x30:'ADDRESS',0x31:'BALANCE',0x32:'ORIGIN',0x33:'CALLER',0x34:'CALLVALUE',0x35:'CALLDATALOAD',0x36:'CALLDATASIZE',0x37:'CALLDATACOPY',0x38:'CODESIZE',0x39:'CODECOPY',0x3a:'GASPRICE',0x3b:'EXTCODESIZE',0x3c:'EXTCODECOPY',0x3d:'RETURNDATASIZE',0x3e:'RETURNDATACOPY',0x3f:'EXTCODEHASH',0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x46:'CHAINID',0x47:'SELFBALANCE',0x48:'BASEFEE',0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x53:'MSTORE8',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x58:'PC',0x59:'MSIZE',0x5a:'GAS',0x5b:'JUMPDEST',0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'}
[codex:587879] for i in range(1,33): opcodes[0x5f+i]=f'PUSH{i}'
[codex:587879] for i in range(1,17): opcodes[0x7f+i]=f'DUP{i}'; opcodes[0x8f+i]=f'SWAP{i}'
[codex:587879] for i in range(0,5): opcodes[0xa0+i]=f'LOG{i}'
[codex:587879] 
[codex:587879] ops=[]; offs=0
[codex:587879] while offs<len(b):
[codex:587879]     op=b[offs]; name=opcodes.get(op,f'OP{op:02x}')
[codex:587879]     if name.startswith('PUSH'):
[codex:587879]         n=int(name[4:]); data=b[offs+1:offs+1+n]
[codex:587879]         ops.append((offs,name,data))
[codex:587879]         offs+=1+n
[codex:587879]     else:
[codex:587879]         ops.append((offs,name,None)); offs+=1
[codex:587879] 
[codex:587879] start=0x107b; end=0x1120
[codex:587879] for o,n,d in ops:
[codex:587879]     if o<start or o>end: continue
[codex:587879]     if d is None:
[codex:587879]         print(f'{o:06x}: {n}')
[codex:587879]     else:
[codex:587879]         print(f'{o:06x}: {n} 0x{d.hex()}')
[codex:587879] PY" in /tmp/codex-multi-5dii8700 succeeded in 34ms:
[codex:587879] 00107b: JUMPDEST
[codex:587879] 00107c: PUSH1 0x00
[codex:587879] 00107e: DUP1
[codex:587879] 00107f: SLOAD
[codex:587879] 001080: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
[codex:587879] 001095: AND
[codex:587879] 001096: SWAP1
[codex:587879] 001097: JUMPDEST
[codex:587879] 001098: DUP3
[codex:587879] 001099: DUP2
[codex:587879] 00109a: LT
[codex:587879] 00109b: ISZERO
[codex:587879] 00109c: PUSH2 0x1109
[codex:587879] 00109f: JUMPI
[codex:587879] 0010a0: PUSH2 0x10f7
[codex:587879] 0010a3: DUP5
[codex:587879] 0010a4: DUP5
[codex:587879] 0010a5: DUP4
[codex:587879] 0010a6: DUP2
[codex:587879] 0010a7: DUP2
[codex:587879] 
[codex:587879] thinking
[codex:587879] **Analyzing loop and token transfer function**
[codex:587879] exec
[codex:587879] /bin/bash -lc "python - <<'PY'
[codex:587879] import re
[codex:587879] from pathlib import Path
[codex:587879] code=Path('/tmp/codex-multi-5dii8700/BYTECODE_BUNDLE.txt').read_text();
[codex:587879] hexcode=re.search(r'FILE: runtime_bytecode.hex\\n(0x[0-9a-fA-F]+)', code).group(1)[2:]
[codex:587879] b=bytes.fromhex(hexcode)
[codex:587879] # disasm
[codex:587879] opcodes={0x00:'STOP',0x01:'ADD',0x02:'MUL',0x03:'SUB',0x04:'DIV',0x05:'SDIV',0x06:'MOD',0x07:'SMOD',0x08:'ADDMOD',0x09:'MULMOD',0x0a:'EXP',0x0b:'SIGNEXTEND',0x10:'LT',0x11:'GT',0x12:'SLT',0x13:'SGT',0x14:'EQ',0x15:'ISZERO',0x16:'AND',0x17:'OR',0x18:'XOR',0x19:'NOT',0x1a:'BYTE',0x1b:'SHL',0x1c:'SHR',0x1d:'SAR',0x20:'SHA3',0x30:'ADDRESS',0x31:'BALANCE',0x32:'ORIGIN',0x33:'CALLER',0x34:'CALLVALUE',0x35:'CALLDATALOAD',0x36:'CALLDATASIZE',0x37:'CALLDATACOPY',0x38:'CODESIZE',0x39:'CODECOPY',0x3a:'GASPRICE',0x3b:'EXTCODESIZE',0x3c:'EXTCODECOPY',0x3d:'RETURNDATASIZE',0x3e:'RETURNDATACOPY',0x3f:'EXTCODEHASH',0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x46:'CHAINID',0x47:'SELFBALANCE',0x48:'BASEFEE',0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x53:'MSTORE8',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x58:'PC',0x59:'MSIZE',0x5a:'GAS',0x5b:'JUMPDEST',0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'}
[codex:587879] for i in range(1,33): opcodes[0x5f+i]=f'PUSH{i}'
[codex:587879] for i in range(1,17): opcodes[0x7f+i]=f'DUP{i}'; opcodes[0x8f+i]=f'SWAP{i}'
[codex:587879] for i in range(0,5): opcodes[0xa0+i]=f'LOG{i}'
[codex:587879] 
[codex:587879] ops=[]; offs=0
[codex:587879] while offs<len(b):
[codex:587879]     op=b[offs]; name=opcodes.get(op,f'OP{op:02x}')
[codex:587879]     if name.startswith('PUSH'):
[codex:587879]         n=int(name[4:]); data=b[offs+1:offs+1+n]
[codex:587879]         ops.append((offs,name,data))
[codex:587879]         offs+=1+n
[codex:587879]     else:
[codex:587879]         ops.append((offs,name,None)); offs+=1
[codex:587879] 
[codex:587879] start=0x1d90; end=0x1e40
[codex:587879] for o,n,d in ops:
[codex:587879]     if o<start or o>end: continue
[codex:587879]     if d is None:
[codex:587879]         print(f'{o:06x}: {n}')
[codex:587879]     else:
[codex:587879]         print(f'{o:06x}: {n} 0x{d.hex()}')
[codex:587879] PY" in /tmp/codex-multi-5dii8700 succeeded in 42ms:
[codex:587879] 001d90: ADD
[codex:587879] 001d91: RETURNDATACOPY
[codex:587879] 001d92: PUSH2 0x1109
[codex:587879] 001d95: JUMP
[codex:587879] 001d96: JUMPDEST
[codex:587879] 001d97: POP
[codex:587879] 001d98: JUMP
[codex:587879] 001d99: JUMPDEST
[codex:587879] 001d9a: PUSH1 0x20
[codex:587879] 001d9c: DUP1
[codex:587879] 001d9d: DUP4
[codex:587879] 001d9e: ADD
[codex:587879] 001d9f: MLOAD
[codex:587879] 001da0: PUSH1 0x00
[codex:587879] 001da2: SWAP1
[codex:587879] 001da3: DUP2
[codex:587879] 001da4: MSTORE
[codex:587879] 001da5: PUSH1 0x05
[codex:587879] 001da7: SWAP1
[codex:587879] 001da8: SWAP2
[codex:587879] 
[codex:587879] thinking
[codex:587879] **Analyzing minimal proxy creation code**
[codex:587879] exec
[codex:587879] /bin/bash -lc "python - <<'PY'
[codex:587879] import re
[codex:587879] from pathlib import Path
[codex:587879] code=Path('/tmp/codex-multi-5dii8700/BYTECODE_BUNDLE.txt').read_text();
[codex:587879] hexcode=re.search(r'FILE: runtime_bytecode.hex\\n(0x[0-9a-fA-F]+)', code).group(1)[2:]
[codex:587879] b=bytes.fromhex(hexcode)
[codex:587879] # disasm
[codex:587879] opcodes={0x00:'STOP',0x01:'ADD',0x02:'MUL',0x03:'SUB',0x04:'DIV',0x05:'SDIV',0x06:'MOD',0x07:'SMOD',0x08:'ADDMOD',0x09:'MULMOD',0x0a:'EXP',0x0b:'SIGNEXTEND',0x10:'LT',0x11:'GT',0x12:'SLT',0x13:'SGT',0x14:'EQ',0x15:'ISZERO',0x16:'AND',0x17:'OR',0x18:'XOR',0x19:'NOT',0x1a:'BYTE',0x1b:'SHL',0x1c:'SHR',0x1d:'SAR',0x20:'SHA3',0x30:'ADDRESS',0x31:'BALANCE',0x32:'ORIGIN',0x33:'CALLER',0x34:'CALLVALUE',0x35:'CALLDATALOAD',0x36:'CALLDATASIZE',0x37:'CALLDATACOPY',0x38:'CODESIZE',0x39:'CODECOPY',0x3a:'GASPRICE',0x3b:'EXTCODESIZE',0x3c:'EXTCODECOPY',0x3d:'RETURNDATASIZE',0x3e:'RETURNDATACOPY',0x3f:'EXTCODEHASH',0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x46:'CHAINID',0x47:'SELFBALANCE',0x48:'BASEFEE',0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x53:'MSTORE8',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x58:'PC',0x59:'MSIZE',0x5a:'GAS',0x5b:'JUMPDEST',0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'}
[codex:587879] for i in range(1,33): opcodes[0x5f+i]=f'PUSH{i}'
[codex:587879] for i in range(1,17): opcodes[0x7f+i]=f'DUP{i}'; opcodes[0x8f+i]=f'SWAP{i}'
[codex:587879] for i in range(0,5): opcodes[0xa0+i]=f'LOG{i}'
[codex:587879] 
[codex:587879] ops=[]; offs=0
[codex:587879] while offs<len(b):
[codex:587879]     op=b[offs]; name=opcodes.get(op,f'OP{op:02x}')
[codex:587879]     if name.startswith('PUSH'):
[codex:587879]         n=int(name[4:]); data=b[offs+1:offs+1+n]
[codex:587879]         ops.append((offs,name,data))
[codex:587879]         offs+=1+n
[codex:587879]     else:
[codex:587879]         ops.append((offs,name,None)); offs+=1
[codex:587879] 
[codex:587879] start=0x1f3d; end=0x2060
[codex:587879] for o,n,d in ops:
[codex:587879]     if o<start or o>end: continue
[codex:587879]     if d is None:
[codex:587879]         print(f'{o:06x}: {n}')
[codex:587879]     else:
[codex:587879]         print(f'{o:06x}: {n} 0x{d.hex()}')
[codex:587879] PY" in /tmp/codex-multi-5dii8700 succeeded in 45ms:
[codex:587879] 001f3d: JUMPDEST
[codex:587879] 001f3e: PUSH1 0x40
[codex:587879] 001f40: MLOAD
[codex:587879] 001f41: PUSH32 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000
[codex:587879] 001f62: DUP2
[codex:587879] 001f63: MSTORE
[codex:587879] 001f64: PUSH1 0x60
[codex:587879] 001f66: DUP4
[codex:587879] 001f67: SWAP1
[codex:587879] 001f68: SHL
[codex:587879] 001f69: PUSH1 0x14
[codex:587879] 001f6b: DUP3
[codex:587879] 001f6c: ADD
[codex:587879] 001f6d: DUP2
[codex:587879] 001f6e: SWAP1
[codex:587879] 001f6f: MSTORE
[codex:587879] 001f70: PUSH32 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000
[codex:587879] 001f91: PUSH1 0x28
[codex:587879] 001f93: DUP4
[codex:587879] 001f94: ADD
[codex:587879] 
[codex:587879] thinking
[codex:587879] **Analyzing clone creation functions**
[codex:587879] exec
[codex:587879] /bin/bash -lc "python - <<'PY'
[codex:587879] import re
[codex:587879] from pathlib import Path
[codex:587879] code=Path('/tmp/codex-multi-5dii8700/BYTECODE_BUNDLE.txt').read_text();
[codex:587879] hexcode=re.search(r'FILE: runtime_bytecode.hex\\n(0x[0-9a-fA-F]+)', code).group(1)[2:]
[codex:587879] b=bytes.fromhex(hexcode)
[codex:587879] # disasm
[codex:587879] opcodes={0x00:'STOP',0x01:'ADD',0x02:'MUL',0x03:'SUB',0x04:'DIV',0x05:'SDIV',0x06:'MOD',0x07:'SMOD',0x08:'ADDMOD',0x09:'MULMOD',0x0a:'EXP',0x0b:'SIGNEXTEND',0x10:'LT',0x11:'GT',0x12:'SLT',0x13:'SGT',0x14:'EQ',0x15:'ISZERO',0x16:'AND',0x17:'OR',0x18:'XOR',0x19:'NOT',0x1a:'BYTE',0x1b:'SHL',0x1c:'SHR',0x1d:'SAR',0x20:'SHA3',0x30:'ADDRESS',0x31:'BALANCE',0x32:'ORIGIN',0x33:'CALLER',0x34:'CALLVALUE',0x35:'CALLDATALOAD',0x36:'CALLDATASIZE',0x37:'CALLDATACOPY',0x38:'CODESIZE',0x39:'CODECOPY',0x3a:'GASPRICE',0x3b:'EXTCODESIZE',0x3c:'EXTCODECOPY',0x3d:'RETURNDATASIZE',0x3e:'RETURNDATACOPY',0x3f:'EXTCODEHASH',0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x46:'CHAINID',0x47:'SELFBALANCE',0x48:'BASEFEE',0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x53:'MSTORE8',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x58:'PC',0x59:'MSIZE',0x5a:'GAS',0x5b:'JUMPDEST',0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'}
[codex:587879] for i in range(1,33): opcodes[0x5f+i]=f'PUSH{i}'
[codex:587879] for i in range(1,17): opcodes[0x7f+i]=f'DUP{i}'; opcodes[0x8f+i]=f'SWAP{i}'
[codex:587879] for i in range(0,5): opcodes[0xa0+i]=f'LOG{i}'
[codex:587879] 
[codex:587879] ops=[]; offs=0
[codex:587879] while offs<len(b):
[codex:587879]     op=b[offs]; name=opcodes.get(op,f'OP{op:02x}')
[codex:587879]     if name.startswith('PUSH'):
[codex:587879]         n=int(name[4:]); data=b[offs+1:offs+1+n]
[codex:587879]         ops.append((offs,name,data))
[codex:587879]         offs+=1+n
[codex:587879]     else:
[codex:587879]         ops.append((offs,name,None)); offs+=1
[codex:587879] 
[codex:587879] start=0x120b; end=0x12f0
[codex:587879] for o,n,d in ops:
[codex:587879]     if o<start or o>end: continue
[codex:587879]     if d is None:
[codex:587879]         print(f'{o:06x}: {n}')
[codex:587879]     else:
[codex:587879]         print(f'{o:06x}: {n} 0x{d.hex()}')
[codex:587879] PY" in /tmp/codex-multi-5dii8700 succeeded in 37ms:
[codex:587879] 00120b: JUMPDEST
[codex:587879] 00120c: PUSH1 0x00
[codex:587879] 00120e: DUP1
[codex:587879] 00120f: SLOAD
[codex:587879] 001210: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
[codex:587879] 001225: AND
[codex:587879] 001226: SWAP1
[codex:587879] 001227: JUMPDEST
[codex:587879] 001228: DUP3
[codex:587879] 001229: DUP2
[codex:587879] 00122a: LT
[codex:587879] 00122b: ISZERO
[codex:587879] 00122c: PUSH2 0x1109
[codex:587879] 00122f: JUMPI
[codex:587879] 001230: PUSH2 0x1287
[codex:587879] 001233: DUP5
[codex:587879] 001234: DUP5
[codex:587879] 001235: DUP4
[codex:587879] 001236: DUP2
[codex:587879] 001237: DUP2
[codex:587879] 
[codex:587879] thinking
[codex:587879] **Analyzing function behaviors and relationships**
[codex:587879] exec
[codex:587879] /bin/bash -lc "python - <<'PY'
[codex:587879] import re
[codex:587879] from pathlib import Path
[codex:587879] code=Path('/tmp/codex-multi-5dii8700/BYTECODE_BUNDLE.txt').read_text();
[codex:587879] hexcode=re.search(r'FILE: runtime_bytecode.hex\\n(0x[0-9a-fA-F]+)', code).group(1)[2:]
[codex:587879] b=bytes.fromhex(hexcode)
[codex:587879] # disasm
[codex:587879] opcodes={0x00:'STOP',0x01:'ADD',0x02:'MUL',0x03:'SUB',0x04:'DIV',0x05:'SDIV',0x06:'MOD',0x07:'SMOD',0x08:'ADDMOD',0x09:'MULMOD',0x0a:'EXP',0x0b:'SIGNEXTEND',0x10:'LT',0x11:'GT',0x12:'SLT',0x13:'SGT',0x14:'EQ',0x15:'ISZERO',0x16:'AND',0x17:'OR',0x18:'XOR',0x19:'NOT',0x1a:'BYTE',0x1b:'SHL',0x1c:'SHR',0x1d:'SAR',0x20:'SHA3',0x30:'ADDRESS',0x31:'BALANCE',0x32:'ORIGIN',0x33:'CALLER',0x34:'CALLVALUE',0x35:'CALLDATALOAD',0x36:'CALLDATASIZE',0x37:'CALLDATACOPY',0x38:'CODESIZE',0x39:'CODECOPY',0x3a:'GASPRICE',0x3b:'EXTCODESIZE',0x3c:'EXTCODECOPY',0x3d:'RETURNDATASIZE',0x3e:'RETURNDATACOPY',0x3f:'EXTCODEHASH',0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x46:'CHAINID',0x47:'SELFBALANCE',0x48:'BASEFEE',0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x53:'MSTORE8',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x58:'PC',0x59:'MSIZE',0x5a:'GAS',0x5b:'JUMPDEST',0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'}
[codex:587879] for i in range(1,33): opcodes[0x5f+i]=f'PUSH{i}'
[codex:587879] for i in range(1,17): opcodes[0x7f+i]=f'DUP{i}'; opcodes[0x8f+i]=f'SWAP{i}'
[codex:587879] for i in range(0,5): opcodes[0xa0+i]=f'LOG{i}'
[codex:587879] 
[codex:587879] ops=[]; offs=0
[codex:587879] while offs<len(b):
[codex:587879]     op=b[offs]; name=opcodes.get(op,f'OP{op:02x}')
[codex:587879]     if name.startswith('PUSH'):
[codex:587879]         n=int(name[4:]); data=b[offs+1:offs+1+n]
[codex:587879]         ops.append((offs,name,data))
[codex:587879]         offs+=1+n
[codex:587879]     else:
[codex:587879]         ops.append((offs,name,None)); offs+=1
[codex:587879] 
[codex:587879] start=0x12d1; end=0x1380
[codex:587879] for o,n,d in ops:
[codex:587879]     if o<start or o>end: continue
[codex:587879]     if d is None:
[codex:587879]         print(f'{o:06x}: {n}')
[codex:587879]     else:
[codex:587879]         print(f'{o:06x}: {n} 0x{d.hex()}')
[codex:587879] PY" in /tmp/codex-multi-5dii8700 succeeded in 35ms:
[codex:587879] 0012d1: JUMPDEST
[codex:587879] 0012d2: PUSH1 0x00
[codex:587879] 0012d4: DUP3
[codex:587879] 0012d5: DUP2
[codex:587879] 0012d6: MSTORE
[codex:587879] 0012d7: PUSH1 0x05
[codex:587879] 0012d9: PUSH1 0x20
[codex:587879] 0012db: MSTORE
[codex:587879] 0012dc: PUSH1 0x40
[codex:587879] 0012de: DUP2
[codex:587879] 0012df: SHA3
[codex:587879] 0012e0: SLOAD
[codex:587879] 0012e1: PUSH2 0x1300
[codex:587879] 0012e4: SWAP1
[codex:587879] 0012e5: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
[codex:587879] 0012fa: AND
[codex:587879] 0012fb: DUP4
[codex:587879] 0012fc: PUSH2 0x2040
[codex:587879] 0012ff: JUMP
[codex:587879] 001300: JUMPDEST
[codex:587879] 
[codex:587879] thinking
[codex:587879] **Analyzing wallet clone deployment and access control**
[codex:587879] exec
[codex:587879] /bin/bash -lc "python - <<'PY'
[codex:587879] import re
[codex:587879] from pathlib import Path
[codex:587879] code=Path('/tmp/codex-multi-5dii8700/BYTECODE_BUNDLE.txt').read_text();
[codex:587879] hexcode=re.search(r'FILE: runtime_bytecode.hex\\n(0x[0-9a-fA-F]+)', code).group(1)[2:]
[codex:587879] b=bytes.fromhex(hexcode)
[codex:587879] # disasm
[codex:587879] opcodes={0x00:'STOP',0x01:'ADD',0x02:'MUL',0x03:'SUB',0x04:'DIV',0x05:'SDIV',0x06:'MOD',0x07:'SMOD',0x08:'ADDMOD',0x09:'MULMOD',0x0a:'EXP',0x0b:'SIGNEXTEND',0x10:'LT',0x11:'GT',0x12:'SLT',0x13:'SGT',0x14:'EQ',0x15:'ISZERO',0x16:'AND',0x17:'OR',0x18:'XOR',0x19:'NOT',0x1a:'BYTE',0x1b:'SHL',0x1c:'SHR',0x1d:'SAR',0x20:'SHA3',0x30:'ADDRESS',0x31:'BALANCE',0x32:'ORIGIN',0x33:'CALLER',0x34:'CALLVALUE',0x35:'CALLDATALOAD',0x36:'CALLDATASIZE',0x37:'CALLDATACOPY',0x38:'CODESIZE',0x39:'CODECOPY',0x3a:'GASPRICE',0x3b:'EXTCODESIZE',0x3c:'EXTCODECOPY',0x3d:'RETURNDATASIZE',0x3e:'RETURNDATACOPY',0x3f:'EXTCODEHASH',0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x46:'CHAINID',0x47:'SELFBALANCE',0x48:'BASEFEE',0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x53:'MSTORE8',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x58:'PC',0x59:'MSIZE',0x5a:'GAS',0x5b:'JUMPDEST',0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'}
[codex:587879] for i in range(1,33): opcodes[0x5f+i]=f'PUSH{i}'
[codex:587879] for i in range(1,17): opcodes[0x7f+i]=f'DUP{i}'; opcodes[0x8f+i]=f'SWAP{i}'
[codex:587879] for i in range(0,5): opcodes[0xa0+i]=f'LOG{i}'
[codex:587879] 
[codex:587879] ops=[]; offs=0
[codex:587879] while offs<len(b):
[codex:587879]     op=b[offs]; name=opcodes.get(op,f'OP{op:02x}')
[codex:587879]     if name.startswith('PUSH'):
[codex:587879]         n=int(name[4:]); data=b[offs+1:offs+1+n]
[codex:587879]         ops.append((offs,name,data))
[codex:587879]         offs+=1+n
[codex:587879]     else:
[codex:587879]         ops.append((offs,name,None)); offs+=1
[codex:587879] 
[codex:587879] start=0x16ef; end=0x1780
[codex:587879] for o,n,d in ops:
[codex:587879]     if o<start or o>end: continue
[codex:587879]     if d is None:
[codex:587879]         print(f'{o:06x}: {n}')
[codex:587879]     else:
[codex:587879]         print(f'{o:06x}: {n} 0x{d.hex()}')
[codex:587879] PY" in /tmp/codex-multi-5dii8700 succeeded in 36ms:
[codex:587879] 0016ef: JUMPDEST
[codex:587879] 0016f0: CALLER
[codex:587879] 0016f1: PUSH1 0x00
[codex:587879] 0016f3: SWAP1
[codex:587879] 0016f4: DUP2
[codex:587879] 0016f5: MSTORE
[codex:587879] 0016f6: PUSH1 0x03
[codex:587879] 0016f8: PUSH1 0x20
[codex:587879] 0016fa: MSTORE
[codex:587879] 0016fb: PUSH1 0x40
[codex:587879] 0016fd: SWAP1
[codex:587879] 0016fe: SHA3
[codex:587879] 0016ff: SLOAD
[codex:587879] 001700: PUSH1 0xff
[codex:587879] 001702: AND
[codex:587879] 001703: PUSH2 0x1768
[codex:587879] 001706: JUMPI
[codex:587879] 001707: PUSH1 0x40
[codex:587879] 001709: MLOAD
[codex:587879] 00170a: PUSH32 0x08c379a000000000000000000000000000000000000000000000000000000000
[codex:587879] 
[codex:587879] thinking
[codex:587879] **Analyzing function access controls**
[codex:587879] exec
[codex:587879] /bin/bash -lc "python - <<'PY'
[codex:587879] import re
[codex:587879] from pathlib import Path
[codex:587879] code=Path('/tmp/codex-multi-5dii8700/BYTECODE_BUNDLE.txt').read_text();
[codex:587879] hexcode=re.search(r'FILE: runtime_bytecode.hex\\n(0x[0-9a-fA-F]+)', code).group(1)[2:]
[codex:587879] b=bytes.fromhex(hexcode)
[codex:587879] # search for bytes of PUSH2 0x1c43 (0x61 0x1c 0x43)
[codex:587879] pattern=bytes([0x61,0x1c,0x43])
[codex:587879] for i in range(len(b)):
[codex:587879]     if b[i:i+3]==pattern:
[codex:587879]         print(hex(i))
[codex:587879] PY" in /tmp/codex-multi-5dii8700 succeeded in 32ms:
[codex:587879] 0x9fe
[codex:587879] 
[codex:587879] thinking
[codex:587879] **Analyzing function instructions near 0x09xx**
[codex:587879] exec
[codex:587879] /bin/bash -lc "python - <<'PY'
[codex:587879] import re
[codex:587879] from pathlib import Path
[codex:587879] code=Path('/tmp/codex-multi-5dii8700/BYTECODE_BUNDLE.txt').read_text();
[codex:587879] hexcode=re.search(r'FILE: runtime_bytecode.hex\\n(0x[0-9a-fA-F]+)', code).group(1)[2:]
[codex:587879] b=bytes.fromhex(hexcode)
[codex:587879] # disasm
[codex:587879] opcodes={0x00:'STOP',0x01:'ADD',0x02:'MUL',0x03:'SUB',0x04:'DIV',0x05:'SDIV',0x06:'MOD',0x07:'SMOD',0x08:'ADDMOD',0x09:'MULMOD',0x0a:'EXP',0x0b:'SIGNEXTEND',0x10:'LT',0x11:'GT',0x12:'SLT',0x13:'SGT',0x14:'EQ',0x15:'ISZERO',0x16:'AND',0x17:'OR',0x18:'XOR',0x19:'NOT',0x1a:'BYTE',0x1b:'SHL',0x1c:'SHR',0x1d:'SAR',0x20:'SHA3',0x30:'ADDRESS',0x31:'BALANCE',0x32:'ORIGIN',0x33:'CALLER',0x34:'CALLVALUE',0x35:'CALLDATALOAD',0x36:'CALLDATASIZE',0x37:'CALLDATACOPY',0x38:'CODESIZE',0x39:'CODECOPY',0x3a:'GASPRICE',0x3b:'EXTCODESIZE',0x3c:'EXTCODECOPY',0x3d:'RETURNDATASIZE',0x3e:'RETURNDATACOPY',0x3f:'EXTCODEHASH',0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x46:'CHAINID',0x47:'SELFBALANCE',0x48:'BASEFEE',0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x53:'MSTORE8',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x58:'PC',0x59:'MSIZE',0x5a:'GAS',0x5b:'JUMPDEST',0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'}
[codex:587879] for i in range(1,33): opcodes[0x5f+i]=f'PUSH{i}'
[codex:587879] for i in range(1,17): opcodes[0x7f+i]=f'DUP{i}'; opcodes[0x8f+i]=f'SWAP{i}'
[codex:587879] for i in range(0,5): opcodes[0xa0+i]=f'LOG{i}'
[codex:587879] 
[codex:587879] ops=[]; offs=0
[codex:587879] while offs<len(b):
[codex:587879]     op=b[offs]; name=opcodes.get(op,f'OP{op:02x}')
[codex:587879]     if name.startswith('PUSH'):
[codex:587879]         n=int(name[4:]); data=b[offs+1:offs+1+n]
[codex:587879]         ops.append((offs,name,data))
[codex:587879]         offs+=1+n
[codex:587879]     else:
[codex:587879]         ops.append((offs,name,None)); offs+=1
[codex:587879] 
[codex:587879] start=0x0930; end=0x0a10
[codex:587879] for o,n,d in ops:
[codex:587879]     if o<start or o>end: continue
[codex:587879]     if d is None:
[codex:587879]         print(f'{o:06x}: {n}')
[codex:587879]     else:
[codex:587879]         print(f'{o:06x}: {n} 0x{d.hex()}')
[codex:587879] PY" in /tmp/codex-multi-5dii8700 succeeded in 35ms:
[codex:587879] 000930: DUP1
[codex:587879] 000931: SWAP2
[codex:587879] 000932: SUB
[codex:587879] 000933: SWAP1
[codex:587879] 000934: LOG1
[codex:587879] 000935: POP
[codex:587879] 000936: JUMP
[codex:587879] 000937: JUMPDEST
[codex:587879] 000938: CALLER
[codex:587879] 000939: ADDRESS
[codex:587879] 00093a: EQ
[codex:587879] 00093b: PUSH2 0x09a0
[codex:587879] 00093e: JUMPI
[codex:587879] 00093f: PUSH1 0x40
[codex:587879] 000941: MLOAD
[codex:587879] 000942: PUSH32 0x08c379a000000000000000000000000000000000000000000000000000000000
[codex:587879] 000963: DUP2
[codex:587879] 000964: MSTORE
[codex:587879] 000965: PUSH1 0x20
[codex:587879] 000967: PUSH1 0x04
[codex:587879] 
[codex:587879] thinking
[codex:587879] **Analyzing function access and internal calls**
[codex:587879] exec
[codex:587879] /bin/bash -lc "python - <<'PY'
[codex:587879] import re
[codex:587879] from pathlib import Path
[codex:587879] code=Path('/tmp/codex-multi-5dii8700/BYTECODE_BUNDLE.txt').read_text();
[codex:587879] hexcode=re.search(r'FILE: runtime_bytecode.hex\\n(0x[0-9a-fA-F]+)', code).group(1)[2:]
[codex:587879] b=bytes.fromhex(hexcode)
[codex:587879] # disasm small
[codex:587879] opcodes={0x00:'STOP',0x01:'ADD',0x02:'MUL',0x03:'SUB',0x04:'DIV',0x05:'SDIV',0x06:'MOD',0x07:'SMOD',0x08:'ADDMOD',0x09:'MULMOD',0x0a:'EXP',0x0b:'SIGNEXTEND',0x10:'LT',0x11:'GT',0x12:'SLT',0x13:'SGT',0x14:'EQ',0x15:'ISZERO',0x16:'AND',0x17:'OR',0x18:'XOR',0x19:'NOT',0x1a:'BYTE',0x1b:'SHL',0x1c:'SHR',0x1d:'SAR',0x20:'SHA3',0x30:'ADDRESS',0x31:'BALANCE',0x32:'ORIGIN',0x33:'CALLER',0x34:'CALLVALUE',0x35:'CALLDATALOAD',0x36:'CALLDATASIZE',0x37:'CALLDATACOPY',0x38:'CODESIZE',0x39:'CODECOPY',0x3a:'GASPRICE',0x3b:'EXTCODESIZE',0x3c:'EXTCODECOPY',0x3d:'RETURNDATASIZE',0x3e:'RETURNDATACOPY',0x3f:'EXTCODEHASH',0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x46:'CHAINID',0x47:'SELFBALANCE',0x48:'BASEFEE',0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x53:'MSTORE8',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x58:'PC',0x59:'MSIZE',0x5a:'GAS',0x5b:'JUMPDEST',0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'}
[codex:587879] for i in range(1,33): opcodes[0x5f+i]=f'PUSH{i}'
[codex:587879] for i in range(1,17): opcodes[0x7f+i]=f'DUP{i}'; opcodes[0x8f+i]=f'SWAP{i}'
[codex:587879] for i in range(0,5): opcodes[0xa0+i]=f'LOG{i}'
[codex:587879] 
[codex:587879] ops=[]; offs=0
[codex:587879] while offs<len(b):
[codex:587879]     op=b[offs]; name=opcodes.get(op,f'OP{op:02x}')
[codex:587879]     if name.startswith('PUSH'):
[codex:587879]         n=int(name[4:]); data=b[offs+1:offs+1+n]
[codex:587879]         ops.append((offs,name,data))
[codex:587879]         offs+=1+n
[codex:587879]     else:
[codex:587879]         ops.append((offs,name,None)); offs+=1
[codex:587879] 
[codex:587879] start=0x2580; end=0x25f0
[codex:587879] for o,n,d in ops:
[codex:587879]     if o<start or o>end: continue
[codex:587879]     if d is None:
[codex:587879]         print(f'{o:06x}: {n}')
[codex:587879]     else:
[codex:587879]         print(f'{o:06x}: {n} 0x{d.hex()}')
[codex:587879] PY" in /tmp/codex-multi-5dii8700 succeeded in 33ms:
[codex:587879] 002586: PUSH1 0x44
[codex:587879] 002588: DUP3
[codex:587879] 002589: ADD
[codex:587879] 00258a: MSTORE
[codex:587879] 00258b: PUSH1 0x64
[codex:587879] 00258d: ADD
[codex:587879] 00258e: PUSH2 0x05a7
[codex:587879] 002591: JUMP
[codex:587879] 002592: JUMPDEST
[codex:587879] 002593: SWAP6
[codex:587879] 002594: SWAP5
[codex:587879] 002595: POP
[codex:587879] 002596: POP
[codex:587879] 002597: POP
[codex:587879] 002598: POP
[codex:587879] 002599: POP
[codex:587879] 00259a: JUMP
[codex:587879] 00259b: JUMPDEST
[codex:587879] 00259c: PUSH1 0x00
[codex:587879] 00259e: DUP1
[codex:587879] 
[codex:587879] thinking
[codex:587879] **Analyzing proxy creation and role mappings**
[codex:587879] 
[codex:587879] I'm working through the contract to see how minimal proxy deployment is verified and linked to keys, focusing on code that checks proxies with EXTCODECOPY or EXTCODEHASH. I want to understand if unauthorized deployments or calls can happen, especially looking at how roles like "henesis" are handled through mappings and functions like addWallet, plus studying initialization to clarify role assignments.
[codex:587879] exec
[codex:587879] /bin/bash -lc "python - <<'PY'
[codex:587879] import re
[codex:587879] from pathlib import Path
[codex:587879] code=Path('/tmp/codex-multi-5dii8700/BYTECODE_BUNDLE.txt').read_text();
[codex:587879] hexcode=re.search(r'FILE: runtime_bytecode.hex\\n(0x[0-9a-fA-F]+)', code).group(1)[2:]
[codex:587879] b=bytes.fromhex(hexcode)
[codex:587879] # disasm
[codex:587879] opcodes={0x00:'STOP',0x01:'ADD',0x02:'MUL',0x03:'SUB',0x04:'DIV',0x05:'SDIV',0x06:'MOD',0x07:'SMOD',0x08:'ADDMOD',0x09:'MULMOD',0x0a:'EXP',0x0b:'SIGNEXTEND',0x10:'LT',0x11:'GT',0x12:'SLT',0x13:'SGT',0x14:'EQ',0x15:'ISZERO',0x16:'AND',0x17:'OR',0x18:'XOR',0x19:'NOT',0x1a:'BYTE',0x1b:'SHL',0x1c:'SHR',0x1d:'SAR',0x20:'SHA3',0x30:'ADDRESS',0x31:'BALANCE',0x32:'ORIGIN',0x33:'CALLER',0x34:'CALLVALUE',0x35:'CALLDATALOAD',0x36:'CALLDATASIZE',0x37:'CALLDATACOPY',0x38:'CODESIZE',0x39:'CODECOPY',0x3a:'GASPRICE',0x3b:'EXTCODESIZE',0x3c:'EXTCODECOPY',0x3d:'RETURNDATASIZE',0x3e:'RETURNDATACOPY',0x3f:'EXTCODEHASH',0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x46:'CHAINID',0x47:'SELFBALANCE',0x48:'BASEFEE',0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x53:'MSTORE8',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x58:'PC',0x59:'MSIZE',0x5a:'GAS',0x5b:'JUMPDEST',0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'}
[codex:587879] for i in range(1,33): opcodes[0x5f+i]=f'PUSH{i}'
[codex:587879] for i in range(1,17): opcodes[0x7f+i]=f'DUP{i}'; opcodes[0x8f+i]=f'SWAP{i}'
[codex:587879] for i in range(0,5): opcodes[0xa0+i]=f'LOG{i}'
[codex:587879] 
[codex:587879] ops=[]; offs=0
[codex:587879] while offs<len(b):
[codex:587879]     op=b[offs]; name=opcodes.get(op,f'OP{op:02x}')
[codex:587879]     if name.startswith('PUSH'):
[codex:587879]         n=int(name[4:]); data=b[offs+1:offs+1+n]
[codex:587879]         ops.append((offs,name,data))
[codex:587879]         offs+=1+n
[codex:587879]     else:
[codex:587879]         ops.append((offs,name,None)); offs+=1
[codex:587879] 
[codex:587879] start=0x0b71; end=0x0ca5
[codex:587879] for o,n,d in ops:
[codex:587879]     if o<start or o>end: continue
[codex:587879]     if d is None:
[codex:587879]         print(f'{o:06x}: {n}')
[codex:587879]     else:
[codex:587879]         print(f'{o:06x}: {n} 0x{d.hex()}')
[codex:587879] PY" in /tmp/codex-multi-5dii8700 succeeded in 34ms:
[codex:587879] 000b71: JUMPDEST
[codex:587879] 000b72: PUSH1 0x00
[codex:587879] 000b74: SLOAD
[codex:587879] 000b75: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
[codex:587879] 000b8a: AND
[codex:587879] 000b8b: ISZERO
[codex:587879] 000b8c: PUSH2 0x0bf3
[codex:587879] 000b8f: JUMPI
[codex:587879] 000b90: PUSH1 0x40
[codex:587879] 000b92: MLOAD
[codex:587879] 000b93: PUSH32 0x08c379a000000000000000000000000000000000000000000000000000000000
[codex:587879] 000bb4: DUP2
[codex:587879] 000bb5: MSTORE
[codex:587879] 000bb6: PUSH1 0x04
[codex:587879] 000bb8: ADD
[codex:587879] 000bb9: PUSH2 0x05a7
[codex:587879] 000bbc: SWAP1
[codex:587879] 000bbd: PUSH1 0x20
[codex:587879] 000bbf: DUP1
[codex:587879] 000bc0: DUP3
[codex:587879] 
[codex:587879] thinking
[codex:587879] **Analyzing contract storage and call graph**
[codex:587879] 
[codex:587879] I'm figuring out how slot0 in storage holds the contract's own address as the "wallet" reference, which seems to tie the wallet and key manager roles together. Then, I’m tracing the CALL instructions in several internal functions to understand authorization and find if any external calls could bypass controls. I want to map which external functions lead to these CALLs by checking jump instructions that push call addresses—planning to script this for clarity and spotting potential vulnerabilities.
[codex:587879] exec
[codex:587879] /bin/bash -lc "python - <<'PY'
[codex:587879] import re
[codex:587879] from pathlib import Path
[codex:587879] code=Path('/tmp/codex-multi-5dii8700/BYTECODE_BUNDLE.txt').read_text();
[codex:587879] hexcode=re.search(r'FILE: runtime_bytecode.hex\\n(0x[0-9a-fA-F]+)', code).group(1)[2:]
[codex:587879] b=bytes.fromhex(hexcode)
[codex:587879] 
[codex:587879] # find PUSH2 addresses
[codex:587879] addrs = [0x1b58,0x1c43,0x1d59,0x1ef4,0x20b7,0x22aa,0x2040]
[codex:587879] # mapping
[codex:587879] from collections import defaultdict
[codex:587879] locs=defaultdict(list)
[codex:587879] for i in range(len(b)-3):
[codex:587879]     if b[i]==0x61: # PUSH2
[codex:587879]         val = b[i+1]*256 + b[i+2]
[codex:587879]         if val in addrs:
[codex:587879]             locs[val].append(i)
[codex:587879] 
[codex:587879] for addr in addrs:
[codex:587879]     print(hex(addr), 'push locations:', [hex(x) for x in locs.get(addr,[])])
[codex:587879] PY" in /tmp/codex-multi-5dii8700 succeeded in 29ms:
[codex:587879] 0x1b58 push locations: ['0x1b4f']
[codex:587879] 0x1c43 push locations: ['0x9fe']
[codex:587879] 0x1d59 push locations: ['0x1d50']
[codex:587879] 0x1ef4 push locations: ['0x1eec']
[codex:587879] 0x20b7 push locations: ['0x1691', '0x1962']
[codex:587879] 0x22aa push locations: ['0x22a1']
[codex:587879] 0x2040 push locations: ['0x12fc']
[codex:587879] 
[codex:587879] thinking
[codex:587879] **Analyzing function call hierarchy**
[codex:587879] exec
[codex:587879] /bin/bash -lc "python - <<'PY'
[codex:587879] import re
[codex:587879] from pathlib import Path
[codex:587879] code=Path('/tmp/codex-multi-5dii8700/BYTECODE_BUNDLE.txt').read_text();
[codex:587879] hexcode=re.search(r'FILE: runtime_bytecode.hex\\n(0x[0-9a-fA-F]+)', code).group(1)[2:]
[codex:587879] b=bytes.fromhex(hexcode)
[codex:587879] # disasm
[codex:587879] opcodes={0x00:'STOP',0x01:'ADD',0x02:'MUL',0x03:'SUB',0x04:'DIV',0x05:'SDIV',0x06:'MOD',0x07:'SMOD',0x08:'ADDMOD',0x09:'MULMOD',0x0a:'EXP',0x0b:'SIGNEXTEND',0x10:'LT',0x11:'GT',0x12:'SLT',0x13:'SGT',0x14:'EQ',0x15:'ISZERO',0x16:'AND',0x17:'OR',0x18:'XOR',0x19:'NOT',0x1a:'BYTE',0x1b:'SHL',0x1c:'SHR',0x1d:'SAR',0x20:'SHA3',0x30:'ADDRESS',0x31:'BALANCE',0x32:'ORIGIN',0x33:'CALLER',0x34:'CALLVALUE',0x35:'CALLDATALOAD',0x36:'CALLDATASIZE',0x37:'CALLDATACOPY',0x38:'CODESIZE',0x39:'CODECOPY',0x3a:'GASPRICE',0x3b:'EXTCODESIZE',0x3c:'EXTCODECOPY',0x3d:'RETURNDATASIZE',0x3e:'RETURNDATACOPY',0x3f:'EXTCODEHASH',0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x46:'CHAINID',0x47:'SELFBALANCE',0x48:'BASEFEE',0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x53:'MSTORE8',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x58:'PC',0x59:'MSIZE',0x5a:'GAS',0x5b:'JUMPDEST',0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'}
[codex:587879] for i in range(1,33): opcodes[0x5f+i]=f'PUSH{i}'
[codex:587879] for i in range(1,17): opcodes[0x7f+i]=f'DUP{i}'; opcodes[0x8f+i]=f'SWAP{i}'
[codex:587879] for i in range(0,5): opcodes[0xa0+i]=f'LOG{i}'
[codex:587879] 
[codex:587879] ops=[]; offs=0
[codex:587879] while offs<len(b):
[codex:587879]     op=b[offs]; name=opcodes.get(op,f'OP{op:02x}')
[codex:587879]     if name.startswith('PUSH'):
[codex:587879]         n=int(name[4:]); data=b[offs+1:offs+1+n]
[codex:587879]         ops.append((offs,name,data))
[codex:587879]         offs+=1+n
[codex:587879]     else:
[codex:587879]         ops.append((offs,name,None)); offs+=1
[codex:587879] 
[codex:587879] start=0x1650; end=0x16c5
[codex:587879] for o,n,d in ops:
[codex:587879]     if o<start or o>end: continue
[codex:587879]     if d is None:
[codex:587879]         print(f'{o:06x}: {n}')
[codex:587879]     else:
[codex:587879]         print(f'{o:06x}: {n} 0x{d.hex()}')
[codex:587879] PY" in /tmp/codex-multi-5dii8700 succeeded in 35ms:
[codex:587879] 001650: PUSH1 0x44
[codex:587879] 001652: DUP3
[codex:587879] 001653: ADD
[codex:587879] 001654: MSTORE
[codex:587879] 001655: PUSH1 0x64
[codex:587879] 001657: ADD
[codex:587879] 001658: PUSH2 0x05a7
[codex:587879] 00165b: JUMP
[codex:587879] 00165c: JUMPDEST
[codex:587879] 00165d: PUSH1 0x40
[codex:587879] 00165f: DUP1
[codex:587879] 001660: MLOAD
[codex:587879] 001661: PUSH1 0x60
[codex:587879] 001663: DUP2
[codex:587879] 001664: ADD
[codex:587879] 001665: DUP3
[codex:587879] 001666: MSTORE
[codex:587879] 001667: PUSH1 0x00
[codex:587879] 001669: DUP2
[codex:587879] 00166a: MSTORE
[codex:587879] 
[codex:587879] thinking
[codex:587879] **Analyzing function around 0x1695**
[codex:587879] exec
[codex:587879] /bin/bash -lc "python - <<'PY'
[codex:587879] import re
[codex:587879] from pathlib import Path
[codex:587879] code=Path('/tmp/codex-multi-5dii8700/BYTECODE_BUNDLE.txt').read_text();
[codex:587879] hexcode=re.search(r'FILE: runtime_bytecode.hex\\n(0x[0-9a-fA-F]+)', code).group(1)[2:]
[codex:587879] b=bytes.fromhex(hexcode)
[codex:587879] # disasm
[codex:587879] opcodes={0x00:'STOP',0x01:'ADD',0x02:'MUL',0x03:'SUB',0x04:'DIV',0x05:'SDIV',0x06:'MOD',0x07:'SMOD',0x08:'ADDMOD',0x09:'MULMOD',0x0a:'EXP',0x0b:'SIGNEXTEND',0x10:'LT',0x11:'GT',0x12:'SLT',0x13:'SGT',0x14:'EQ',0x15:'ISZERO',0x16:'AND',0x17:'OR',0x18:'XOR',0x19:'NOT',0x1a:'BYTE',0x1b:'SHL',0x1c:'SHR',0x1d:'SAR',0x20:'SHA3',0x30:'ADDRESS',0x31:'BALANCE',0x32:'ORIGIN',0x33:'CALLER',0x34:'CALLVALUE',0x35:'CALLDATALOAD',0x36:'CALLDATASIZE',0x37:'CALLDATACOPY',0x38:'CODESIZE',0x39:'CODECOPY',0x3a:'GASPRICE',0x3b:'EXTCODESIZE',0x3c:'EXTCODECOPY',0x3d:'RETURNDATASIZE',0x3e:'RETURNDATACOPY',0x3f:'EXTCODEHASH',0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x46:'CHAINID',0x47:'SELFBALANCE',0x48:'BASEFEE',0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x53:'MSTORE8',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x58:'PC',0x59:'MSIZE',0x5a:'GAS',0x5b:'JUMPDEST',0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'}
[codex:587879] for i in range(1,33): opcodes[0x5f+i]=f'PUSH{i}'
[codex:587879] for i in range(1,17): opcodes[0x7f+i]=f'DUP{i}'; opcodes[0x8f+i]=f'SWAP{i}'
[codex:587879] for i in range(0,5): opcodes[0xa0+i]=f'LOG{i}'
[codex:587879] 
[codex:587879] ops=[]; offs=0
[codex:587879] while offs<len(b):
[codex:587879]     op=b[offs]; name=opcodes.get(op,f'OP{op:02x}')
[codex:587879]     if name.startswith('PUSH'):
[codex:587879]         n=int(name[4:]); data=b[offs+1:offs+1+n]
[codex:587879]         ops.append((offs,name,data))
[codex:587879]         offs+=1+n
[codex:587879]     else:
[codex:587879]         ops.append((offs,name,None)); offs+=1
[codex:587879] 
[codex:587879] start=0x15f0; end=0x1695
[codex:587879] for o,n,d in ops:
[codex:587879]     if o<start or o>end: continue
[codex:587879]     if d is None:
[codex:587879]         print(f'{o:06x}: {n}')
[codex:587879]     else:
[codex:587879]         print(f'{o:06x}: {n} 0x{d.hex()}')
[codex:587879] PY" in /tmp/codex-multi-5dii8700 succeeded in 41ms:
[codex:587879] 0015f2: JUMP
[codex:587879] 0015f3: JUMPDEST
[codex:587879] 0015f4: CALLER
[codex:587879] 0015f5: ADDRESS
[codex:587879] 0015f6: EQ
[codex:587879] 0015f7: PUSH2 0x165c
[codex:587879] 0015fa: JUMPI
[codex:587879] 0015fb: PUSH1 0x40
[codex:587879] 0015fd: MLOAD
[codex:587879] 0015fe: PUSH32 0x08c379a000000000000000000000000000000000000000000000000000000000
[codex:587879] 00161f: DUP2
[codex:587879] 001620: MSTORE
[codex:587879] 001621: PUSH1 0x20
[codex:587879] 001623: PUSH1 0x04
[codex:587879] 001625: DUP3
[codex:587879] 001626: ADD
[codex:587879] 001627: MSTORE
[codex:587879] 001628: PUSH1 0x07
[codex:587879] 00162a: PUSH1 0x24
[codex:587879] 00162c: DUP3
[codex:587879] 
[codex:587879] thinking
[codex:587879] **Analyzing function for internal token transfer**
[codex:587879] exec
[codex:587879] /bin/bash -lc "python - <<'PY'
[codex:587879] import re
[codex:587879] from pathlib import Path
[codex:587879] code=Path('/tmp/codex-multi-5dii8700/BYTECODE_BUNDLE.txt').read_text();
[codex:587879] hexcode=re.search(r'FILE: runtime_bytecode.hex\\n(0x[0-9a-fA-F]+)', code).group(1)[2:]
[codex:587879] b=bytes.fromhex(hexcode)
[codex:587879] # disasm
[codex:587879] opcodes={0x00:'STOP',0x01:'ADD',0x02:'MUL',0x03:'SUB',0x04:'DIV',0x05:'SDIV',0x06:'MOD',0x07:'SMOD',0x08:'ADDMOD',0x09:'MULMOD',0x0a:'EXP',0x0b:'SIGNEXTEND',0x10:'LT',0x11:'GT',0x12:'SLT',0x13:'SGT',0x14:'EQ',0x15:'ISZERO',0x16:'AND',0x17:'OR',0x18:'XOR',0x19:'NOT',0x1a:'BYTE',0x1b:'SHL',0x1c:'SHR',0x1d:'SAR',0x20:'SHA3',0x30:'ADDRESS',0x31:'BALANCE',0x32:'ORIGIN',0x33:'CALLER',0x34:'CALLVALUE',0x35:'CALLDATALOAD',0x36:'CALLDATASIZE',0x37:'CALLDATACOPY',0x38:'CODESIZE',0x39:'CODECOPY',0x3a:'GASPRICE',0x3b:'EXTCODESIZE',0x3c:'EXTCODECOPY',0x3d:'RETURNDATASIZE',0x3e:'RETURNDATACOPY',0x3f:'EXTCODEHASH',0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x46:'CHAINID',0x47:'SELFBALANCE',0x48:'BASEFEE',0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x53:'MSTORE8',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x58:'PC',0x59:'MSIZE',0x5a:'GAS',0x5b:'JUMPDEST',0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'}
[codex:587879] for i in range(1,33): opcodes[0x5f+i]=f'PUSH{i}'
[codex:587879] for i in range(1,17): opcodes[0x7f+i]=f'DUP{i}'; opcodes[0x8f+i]=f'SWAP{i}'
[codex:587879] for i in range(0,5): opcodes[0xa0+i]=f'LOG{i}'
[codex:587879] 
[codex:587879] ops=[]; offs=0
[codex:587879] while offs<len(b):
[codex:587879]     op=b[offs]; name=opcodes.get(op,f'OP{op:02x}')
[codex:587879]     if name.startswith('PUSH'):
[codex:587879]         n=int(name[4:]); data=b[offs+1:offs+1+n]
[codex:587879]         ops.append((offs,name,data))
[codex:587879]         offs+=1+n
[codex:587879]     else:
[codex:587879]         ops.append((offs,name,None)); offs+=1
[codex:587879] 
[codex:587879] start=0x1966; end=0x1a20
[codex:587879] for o,n,d in ops:
[codex:587879]     if o<start or o>end: continue
[codex:587879]     if d is None:
[codex:587879]         print(f'{o:06x}: {n}')
[codex:587879]     else:
[codex:587879]         print(f'{o:06x}: {n} 0x{d.hex()}')
[codex:587879] PY" in /tmp/codex-multi-5dii8700 succeeded in 36ms:
[codex:587879] 001966: JUMPDEST
[codex:587879] 001967: PUSH1 0x60
[codex:587879] 001969: PUSH1 0x00
[codex:587879] 00196b: JUMPDEST
[codex:587879] 00196c: DUP3
[codex:587879] 00196d: MLOAD
[codex:587879] 00196e: DUP2
[codex:587879] 00196f: LT
[codex:587879] 001970: ISZERO
[codex:587879] 001971: PUSH2 0x1a07
[codex:587879] 001974: JUMPI
[codex:587879] 001975: PUSH1 0x00
[codex:587879] 001977: DUP4
[codex:587879] 001978: DUP3
[codex:587879] 001979: DUP2
[codex:587879] 00197a: MLOAD
[codex:587879] 00197b: DUP2
[codex:587879] 00197c: LT
[codex:587879] 00197d: PUSH2 0x19af
[codex:587879] 001980: JUMPI
[codex:587879] 
[codex:587879] thinking
[codex:587879] **Analyzing function call relationships**
[codex:587879] exec
[codex:587879] /bin/bash -lc "python - <<'PY'
[codex:587879] import re
[codex:587879] from pathlib import Path
[codex:587879] code=Path('/tmp/codex-multi-5dii8700/BYTECODE_BUNDLE.txt').read_text();
[codex:587879] hexcode=re.search(r'FILE: runtime_bytecode.hex\\n(0x[0-9a-fA-F]+)', code).group(1)[2:]
[codex:587879] b=bytes.fromhex(hexcode)
[codex:587879] # disasm
[codex:587879] opcodes={0x00:'STOP',0x01:'ADD',0x02:'MUL',0x03:'SUB',0x04:'DIV',0x05:'SDIV',0x06:'MOD',0x07:'SMOD',0x08:'ADDMOD',0x09:'MULMOD',0x0a:'EXP',0x0b:'SIGNEXTEND',0x10:'LT',0x11:'GT',0x12:'SLT',0x13:'SGT',0x14:'EQ',0x15:'ISZERO',0x16:'AND',0x17:'OR',0x18:'XOR',0x19:'NOT',0x1a:'BYTE',0x1b:'SHL',0x1c:'SHR',0x1d:'SAR',0x20:'SHA3',0x30:'ADDRESS',0x31:'BALANCE',0x32:'ORIGIN',0x33:'CALLER',0x34:'CALLVALUE',0x35:'CALLDATALOAD',0x36:'CALLDATASIZE',0x37:'CALLDATACOPY',0x38:'CODESIZE',0x39:'CODECOPY',0x3a:'GASPRICE',0x3b:'EXTCODESIZE',0x3c:'EXTCODECOPY',0x3d:'RETURNDATASIZE',0x3e:'RETURNDATACOPY',0x3f:'EXTCODEHASH',0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x46:'CHAINID',0x47:'SELFBALANCE',0x48:'BASEFEE',0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x53:'MSTORE8',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x58:'PC',0x59:'MSIZE',0x5a:'GAS',0x5b:'JUMPDEST',0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'}
[codex:587879] for i in range(1,33): opcodes[0x5f+i]=f'PUSH{i}'
[codex:587879] for i in range(1,17): opcodes[0x7f+i]=f'DUP{i}'; opcodes[0x8f+i]=f'SWAP{i}'
[codex:587879] for i in range(0,5): opcodes[0xa0+i]=f'LOG{i}'
[codex:587879] 
[codex:587879] ops=[]; offs=0
[codex:587879] while offs<len(b):
[codex:587879]     op=b[offs]; name=opcodes.get(op,f'OP{op:02x}')
[codex:587879]     if name.startswith('PUSH'):
[codex:587879]         n=int(name[4:]); data=b[offs+1:offs+1+n]
[codex:587879]         ops.append((offs,name,data))
[codex:587879]         offs+=1+n
[codex:587879]     else:
[codex:587879]         ops.append((offs,name,None)); offs+=1
[codex:587879] 
[codex:587879] start=0x1930; end=0x1980
[codex:587879] for o,n,d in ops:
[codex:587879]     if o<start or o>end: continue
[codex:587879]     if d is None:
[codex:587879]         print(f'{o:06x}: {n}')
[codex:587879]     else:
[codex:587879]         print(f'{o:06x}: {n} 0x{d.hex()}')
[codex:587879] PY" in /tmp/codex-multi-5dii8700 succeeded in 34ms:
[codex:587879] 001930: MLOAD
[codex:587879] 001931: PUSH1 0x60
[codex:587879] 001933: DUP2
[codex:587879] 001934: ADD
[codex:587879] 001935: DUP3
[codex:587879] 001936: MSTORE
[codex:587879] 001937: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
[codex:587879] 00194c: DUP1
[codex:587879] 00194d: DUP7
[codex:587879] 00194e: AND
[codex:587879] 00194f: DUP3
[codex:587879] 001950: MSTORE
[codex:587879] 001951: DUP5
[codex:587879] 001952: AND
[codex:587879] 001953: PUSH1 0x20
[codex:587879] 001955: DUP3
[codex:587879] 001956: ADD
[codex:587879] 001957: MSTORE
[codex:587879] 001958: SWAP1
[codex:587879] 001959: DUP2
[codex:587879] 
[codex:587879] thinking
[codex:587879] **Analyzing public function calling external contract**
[codex:587879] 
[codex:587879] I'm examining a publicly callable function (selector 0xfbfbbfed) that leads to 0x1966 without access control, which then makes an external call (via 0x20b7) with calldata built dynamically. The concern is whether it allows arbitrary external calls, so I'm decoding parameters and stack usage around 0x1930 to check if the target address is unrestricted or constrained. I'll also review the ABI decoding at 0x29fc to understand input processing.
[codex:587879] exec
[codex:587879] /bin/bash -lc "python - <<'PY'
[codex:587879] import re
[codex:587879] from pathlib import Path
[codex:587879] code=Path('/tmp/codex-multi-5dii8700/BYTECODE_BUNDLE.txt').read_text();
[codex:587879] hexcode=re.search(r'FILE: runtime_bytecode.hex\\n(0x[0-9a-fA-F]+)', code).group(1)[2:]
[codex:587879] b=bytes.fromhex(hexcode)
[codex:587879] # disasm
[codex:587879] opcodes={0x00:'STOP',0x01:'ADD',0x02:'MUL',0x03:'SUB',0x04:'DIV',0x05:'SDIV',0x06:'MOD',0x07:'SMOD',0x08:'ADDMOD',0x09:'MULMOD',0x0a:'EXP',0x0b:'SIGNEXTEND',0x10:'LT',0x11:'GT',0x12:'SLT',0x13:'SGT',0x14:'EQ',0x15:'ISZERO',0x16:'AND',0x17:'OR',0x18:'XOR',0x19:'NOT',0x1a:'BYTE',0x1b:'SHL',0x1c:'SHR',0x1d:'SAR',0x20:'SHA3',0x30:'ADDRESS',0x31:'BALANCE',0x32:'ORIGIN',0x33:'CALLER',0x34:'CALLVALUE',0x35:'CALLDATALOAD',0x36:'CALLDATASIZE',0x37:'CALLDATACOPY',0x38:'CODESIZE',0x39:'CODECOPY',0x3a:'GASPRICE',0x3b:'EXTCODESIZE',0x3c:'EXTCODECOPY',0x3d:'RETURNDATASIZE',0x3e:'RETURNDATACOPY',0x3f:'EXTCODEHASH',0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x46:'CHAINID',0x47:'SELFBALANCE',0x48:'BASEFEE',0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x53:'MSTORE8',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x58:'PC',0x59:'MSIZE',0x5a:'GAS',0x5b:'JUMPDEST',0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'}
[codex:587879] for i in range(1,33): opcodes[0x5f+i]=f'PUSH{i}'
[codex:587879] for i in range(1,17): opcodes[0x7f+i]=f'DUP{i}'; opcodes[0x8f+i]=f'SWAP{i}'
[codex:587879] for i in range(0,5): opcodes[0xa0+i]=f'LOG{i}'
[codex:587879] 
[codex:587879] ops=[]; offs=0
[codex:587879] while offs<len(b):
[codex:587879]     op=b[offs]; name=opcodes.get(op,f'OP{op:02x}')
[codex:587879]     if name.startswith('PUSH'):
[codex:587879]         n=int(name[4:]); data=b[offs+1:offs+1+n]
[codex:587879]         ops.append((offs,name,data))
[codex:587879]         offs+=1+n
[codex:587879]     else:
[codex:587879]         ops.append((offs,name,None)); offs+=1
[codex:587879] 
[codex:587879] start=0x29fc; end=0x2a80
[codex:587879] for o,n,d in ops:
[codex:587879]     if o<start or o>end: continue
[codex:587879]     if d is None:
[codex:587879]         print(f'{o:06x}: {n}')
[codex:587879]     else:
[codex:587879]         print(f'{o:06x}: {n} 0x{d.hex()}')
[codex:587879] PY" in /tmp/codex-multi-5dii8700 succeeded in 68ms:
[codex:587879] 0029fc: JUMPDEST
[codex:587879] 0029fd: PUSH1 0x00
[codex:587879] 0029ff: PUSH1 0x20
[codex:587879] 002a01: DUP3
[codex:587879] 002a02: DUP5
[codex:587879] 002a03: SUB
[codex:587879] 002a04: SLT
[codex:587879] 002a05: ISZERO
[codex:587879] 002a06: PUSH2 0x2a0d
[codex:587879] 002a09: JUMPI
[codex:587879] 002a0a: DUP1
[codex:587879] 002a0b: DUP2
[codex:587879] 002a0c: REVERT
[codex:587879] 002a0d: JUMPDEST
[codex:587879] 002a0e: DUP2
[codex:587879] 002a0f: CALLDATALOAD
[codex:587879] 002a10: PUSH8 0xffffffffffffffff
[codex:587879] 002a19: DUP2
[codex:587879] 002a1a: GT
[codex:587879] 002a1b: ISZERO
[codex:587879] 
[codex:587879] thinking
[codex:587879] **Analyzing complex decoder and related call**
[codex:587879] exec
[codex:587879] /bin/bash -lc "python - <<'PY'
[codex:587879] import re
[codex:587879] from pathlib import Path
[codex:587879] code=Path('/tmp/codex-multi-5dii8700/BYTECODE_BUNDLE.txt').read_text();
[codex:587879] hexcode=re.search(r'FILE: runtime_bytecode.hex\\n(0x[0-9a-fA-F]+)', code).group(1)[2:]
[codex:587879] b=bytes.fromhex(hexcode)
[codex:587879] # disasm
[codex:587879] opcodes={0x00:'STOP',0x01:'ADD',0x02:'MUL',0x03:'SUB',0x04:'DIV',0x05:'SDIV',0x06:'MOD',0x07:'SMOD',0x08:'ADDMOD',0x09:'MULMOD',0x0a:'EXP',0x0b:'SIGNEXTEND',0x10:'LT',0x11:'GT',0x12:'SLT',0x13:'SGT',0x14:'EQ',0x15:'ISZERO',0x16:'AND',0x17:'OR',0x18:'XOR',0x19:'NOT',0x1a:'BYTE',0x1b:'SHL',0x1c:'SHR',0x1d:'SAR',0x20:'SHA3',0x30:'ADDRESS',0x31:'BALANCE',0x32:'ORIGIN',0x33:'CALLER',0x34:'CALLVALUE',0x35:'CALLDATALOAD',0x36:'CALLDATASIZE',0x37:'CALLDATACOPY',0x38:'CODESIZE',0x39:'CODECOPY',0x3a:'GASPRICE',0x3b:'EXTCODESIZE',0x3c:'EXTCODECOPY',0x3d:'RETURNDATASIZE',0x3e:'RETURNDATACOPY',0x3f:'EXTCODEHASH',0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x46:'CHAINID',0x47:'SELFBALANCE',0x48:'BASEFEE',0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x53:'MSTORE8',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x58:'PC',0x59:'MSIZE',0x5a:'GAS',0x5b:'JUMPDEST',0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'}
[codex:587879] for i in range(1,33): opcodes[0x5f+i]=f'PUSH{i}'
[codex:587879] for i in range(1,17): opcodes[0x7f+i]=f'DUP{i}'; opcodes[0x8f+i]=f'SWAP{i}'
[codex:587879] for i in range(0,5): opcodes[0xa0+i]=f'LOG{i}'
[codex:587879] 
[codex:587879] ops=[]; offs=0
[codex:587879] while offs<len(b):
[codex:587879]     op=b[offs]; name=opcodes.get(op,f'OP{op:02x}')
[codex:587879]     if name.startswith('PUSH'):
[codex:587879]         n=int(name[4:]); data=b[offs+1:offs+1+n]
[codex:587879]         ops.append((offs,name,data))
[codex:587879]         offs+=1+n
[codex:587879]     else:
[codex:587879]         ops.append((offs,name,None)); offs+=1
[codex:587879] 
[codex:587879] start=0x20b7; end=0x2140
[codex:587879] for o,n,d in ops:
[codex:587879]     if o<start or o>end: continue
[codex:587879]     if d is None:
[codex:587879]         print(f'{o:06x}: {n}')
[codex:587879]     else:
[codex:587879]         print(f'{o:06x}: {n} 0x{d.hex()}')
[codex:587879] PY" in /tmp/codex-multi-5dii8700 succeeded in 39ms:
[codex:587879] 0020b7: JUMPDEST
[codex:587879] 0020b8: DUP1
[codex:587879] 0020b9: MLOAD
[codex:587879] 0020ba: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
[codex:587879] 0020cf: AND
[codex:587879] 0020d0: PUSH2 0x21a9
[codex:587879] 0020d3: JUMPI
[codex:587879] 0020d4: PUSH1 0x00
[codex:587879] 0020d6: DUP2
[codex:587879] 0020d7: PUSH1 0x20
[codex:587879] 0020d9: ADD
[codex:587879] 0020da: MLOAD
[codex:587879] 0020db: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
[codex:587879] 0020f0: AND
[codex:587879] 0020f1: DUP3
[codex:587879] 0020f2: PUSH1 0x40
[codex:587879] 0020f4: ADD
[codex:587879] 0020f5: MLOAD
[codex:587879] 0020f6: PUSH1 0x40
[codex:587879] 0020f8: MLOAD
[codex:587879] 
[codex:587879] thinking
[codex:587879] **Reviewing error handling segment**
[codex:587879] exec
[codex:587879] /bin/bash -lc "python - <<'PY'
[codex:587879] import re
[codex:587879] from pathlib import Path
[codex:587879] code=Path('/tmp/codex-multi-5dii8700/BYTECODE_BUNDLE.txt').read_text();
[codex:587879] hexcode=re.search(r'FILE: runtime_bytecode.hex\\n(0x[0-9a-fA-F]+)', code).group(1)[2:]
[codex:587879] b=bytes.fromhex(hexcode)
[codex:587879] # disasm
[codex:587879] opcodes={0x00:'STOP',0x01:'ADD',0x02:'MUL',0x03:'SUB',0x04:'DIV',0x05:'SDIV',0x06:'MOD',0x07:'SMOD',0x08:'ADDMOD',0x09:'MULMOD',0x0a:'EXP',0x0b:'SIGNEXTEND',0x10:'LT',0x11:'GT',0x12:'SLT',0x13:'SGT',0x14:'EQ',0x15:'ISZERO',0x16:'AND',0x17:'OR',0x18:'XOR',0x19:'NOT',0x1a:'BYTE',0x1b:'SHL',0x1c:'SHR',0x1d:'SAR',0x20:'SHA3',0x30:'ADDRESS',0x31:'BALANCE',0x32:'ORIGIN',0x33:'CALLER',0x34:'CALLVALUE',0x35:'CALLDATALOAD',0x36:'CALLDATASIZE',0x37:'CALLDATACOPY',0x38:'CODESIZE',0x39:'CODECOPY',0x3a:'GASPRICE',0x3b:'EXTCODESIZE',0x3c:'EXTCODECOPY',0x3d:'RETURNDATASIZE',0x3e:'RETURNDATACOPY',0x3f:'EXTCODEHASH',0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x46:'CHAINID',0x47:'SELFBALANCE',0x48:'BASEFEE',0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x53:'MSTORE8',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x58:'PC',0x59:'MSIZE',0x5a:'GAS',0x5b:'JUMPDEST',0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'}
[codex:587879] for i in range(1,33): opcodes[0x5f+i]=f'PUSH{i}'
[codex:587879] for i in range(1,17): opcodes[0x7f+i]=f'DUP{i}'; opcodes[0x8f+i]=f'SWAP{i}'
[codex:587879] for i in range(0,5): opcodes[0xa0+i]=f'LOG{i}'
[codex:587879] 
[codex:587879] ops=[]; offs=0
[codex:587879] while offs<len(b):
[codex:587879]     op=b[offs]; name=opcodes.get(op,f'OP{op:02x}')
[codex:587879]     if name.startswith('PUSH'):
[codex:587879]         n=int(name[4:]); data=b[offs+1:offs+1+n]
[codex:587879]         ops.append((offs,name,data))
[codex:587879]         offs+=1+n
[codex:587879]     else:
[codex:587879]         ops.append((offs,name,None)); offs+=1
[codex:587879] 
[codex:587879] start=0x213a; end=0x21c5
[codex:587879] for o,n,d in ops:
[codex:587879]     if o<start or o>end: continue
[codex:587879]     if d is None:
[codex:587879]         print(f'{o:06x}: {n}')
[codex:587879]     else:
[codex:587879]         print(f'{o:06x}: {n} 0x{d.hex()}')
[codex:587879] PY" in /tmp/codex-multi-5dii8700 succeeded in 36ms:
[codex:587879] 00213a: JUMPDEST
[codex:587879] 00213b: POP
[codex:587879] 00213c: POP
[codex:587879] 00213d: SWAP1
[codex:587879] 00213e: POP
[codex:587879] 00213f: DUP1
[codex:587879] 002140: PUSH2 0x21a5
[codex:587879] 002143: JUMPI
[codex:587879] 002144: PUSH1 0x40
[codex:587879] 002146: MLOAD
[codex:587879] 002147: PUSH32 0x08c379a000000000000000000000000000000000000000000000000000000000
[codex:587879] 002168: DUP2
[codex:587879] 002169: MSTORE
[codex:587879] 00216a: PUSH1 0x20
[codex:587879] 00216c: PUSH1 0x04
[codex:587879] 00216e: DUP3
[codex:587879] 00216f: ADD
[codex:587879] 002170: MSTORE
[codex:587879] 002171: PUSH1 0x09
[codex:587879] 002173: PUSH1 0x24
[codex:587879] 
[codex:587879] thinking
[codex:587879] **Analyzing EVM call logic and branches**
[codex:587879] exec
[codex:587879] /bin/bash -lc "python - <<'PY'
[codex:587879] import re
[codex:587879] from pathlib import Path
[codex:587879] code=Path('/tmp/codex-multi-5dii8700/BYTECODE_BUNDLE.txt').read_text();
[codex:587879] hexcode=re.search(r'FILE: runtime_bytecode.hex\\n(0x[0-9a-fA-F]+)', code).group(1)[2:]
[codex:587879] b=bytes.fromhex(hexcode)
[codex:587879] # disasm
[codex:587879] opcodes={0x00:'STOP',0x01:'ADD',0x02:'MUL',0x03:'SUB',0x04:'DIV',0x05:'SDIV',0x06:'MOD',0x07:'SMOD',0x08:'ADDMOD',0x09:'MULMOD',0x0a:'EXP',0x0b:'SIGNEXTEND',0x10:'LT',0x11:'GT',0x12:'SLT',0x13:'SGT',0x14:'EQ',0x15:'ISZERO',0x16:'AND',0x17:'OR',0x18:'XOR',0x19:'NOT',0x1a:'BYTE',0x1b:'SHL',0x1c:'SHR',0x1d:'SAR',0x20:'SHA3',0x30:'ADDRESS',0x31:'BALANCE',0x32:'ORIGIN',0x33:'CALLER',0x34:'CALLVALUE',0x35:'CALLDATALOAD',0x36:'CALLDATASIZE',0x37:'CALLDATACOPY',0x38:'CODESIZE',0x39:'CODECOPY',0x3a:'GASPRICE',0x3b:'EXTCODESIZE',0x3c:'EXTCODECOPY',0x3d:'RETURNDATASIZE',0x3e:'RETURNDATACOPY',0x3f:'EXTCODEHASH',0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x46:'CHAINID',0x47:'SELFBALANCE',0x48:'BASEFEE',0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x53:'MSTORE8',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x58:'PC',0x59:'MSIZE',0x5a:'GAS',0x5b:'JUMPDEST',0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'}
[codex:587879] for i in range(1,33): opcodes[0x5f+i]=f'PUSH{i}'
[codex:587879] for i in range(1,17): opcodes[0x7f+i]=f'DUP{i}'; opcodes[0x8f+i]=f'SWAP{i}'
[codex:587879] for i in range(0,5): opcodes[0xa0+i]=f'LOG{i}'
[codex:587879] 
[codex:587879] ops=[]; offs=0
[codex:587879] while offs<len(b):
[codex:587879]     op=b[offs]; name=opcodes.get(op,f'OP{op:02x}')
[codex:587879]     if name.startswith('PUSH'):
[codex:587879]         n=int(name[4:]); data=b[offs+1:offs+1+n]
[codex:587879]         ops.append((offs,name,data))
[codex:587879]         offs+=1+n
[codex:587879]     else:
[codex:587879]         ops.append((offs,name,None)); offs+=1
[codex:587879] 
[codex:587879] start=0x21a9; end=0x2280
[codex:587879] for o,n,d in ops:
[codex:587879]     if o<start or o>end: continue
[codex:587879]     if d is None:
[codex:587879]         print(f'{o:06x}: {n}')
[codex:587879]     else:
[codex:587879]         print(f'{o:06x}: {n} 0x{d.hex()}')
[codex:587879] PY" in /tmp/codex-multi-5dii8700 succeeded in 34ms:
[codex:587879] 0021a9: JUMPDEST
[codex:587879] 0021aa: DUP1
[codex:587879] 0021ab: MLOAD
[codex:587879] 0021ac: PUSH1 0x20
[codex:587879] 0021ae: DUP3
[codex:587879] 0021af: ADD
[codex:587879] 0021b0: MLOAD
[codex:587879] 0021b1: PUSH1 0x40
[codex:587879] 0021b3: DUP1
[codex:587879] 0021b4: DUP5
[codex:587879] 0021b5: ADD
[codex:587879] 0021b6: MLOAD
[codex:587879] 0021b7: SWAP1
[codex:587879] 0021b8: MLOAD
[codex:587879] 0021b9: PUSH1 0x00
[codex:587879] 0021bb: SWAP4
[codex:587879] 0021bc: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
[codex:587879] 0021d1: AND
[codex:587879] 0021d2: SWAP3
[codex:587879] 0021d3: PUSH32 0xa9059cbb00000000000000000000000000000000000000000000000000000000
[codex:587879] 
[codex:587879] thinking
[codex:587879] **Analyzing token and ETH transfer logic**
[codex:587879] exec
[codex:587879] /bin/bash -lc "python - <<'PY'
[codex:587879] import re
[codex:587879] from pathlib import Path
[codex:587879] code=Path('/tmp/codex-multi-5dii8700/BYTECODE_BUNDLE.txt').read_text();
[codex:587879] hexcode=re.search(r'FILE: runtime_bytecode.hex\\n(0x[0-9a-fA-F]+)', code).group(1)[2:]
[codex:587879] b=bytes.fromhex(hexcode)
[codex:587879] # disasm
[codex:587879] opcodes={0x00:'STOP',0x01:'ADD',0x02:'MUL',0x03:'SUB',0x04:'DIV',0x05:'SDIV',0x06:'MOD',0x07:'SMOD',0x08:'ADDMOD',0x09:'MULMOD',0x0a:'EXP',0x0b:'SIGNEXTEND',0x10:'LT',0x11:'GT',0x12:'SLT',0x13:'SGT',0x14:'EQ',0x15:'ISZERO',0x16:'AND',0x17:'OR',0x18:'XOR',0x19:'NOT',0x1a:'BYTE',0x1b:'SHL',0x1c:'SHR',0x1d:'SAR',0x20:'SHA3',0x30:'ADDRESS',0x31:'BALANCE',0x32:'ORIGIN',0x33:'CALLER',0x34:'CALLVALUE',0x35:'CALLDATALOAD',0x36:'CALLDATASIZE',0x37:'CALLDATACOPY',0x38:'CODESIZE',0x39:'CODECOPY',0x3a:'GASPRICE',0x3b:'EXTCODESIZE',0x3c:'EXTCODECOPY',0x3d:'RETURNDATASIZE',0x3e:'RETURNDATACOPY',0x3f:'EXTCODEHASH',0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x46:'CHAINID',0x47:'SELFBALANCE',0x48:'BASEFEE',0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x53:'MSTORE8',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x58:'PC',0x59:'MSIZE',0x5a:'GAS',0x5b:'JUMPDEST',0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'}
[codex:587879] for i in range(1,33): opcodes[0x5f+i]=f'PUSH{i}'
[codex:587879] for i in range(1,17): opcodes[0x7f+i]=f'DUP{i}'; opcodes[0x8f+i]=f'SWAP{i}'
[codex:587879] for i in range(0,5): opcodes[0xa0+i]=f'LOG{i}'
[codex:587879] 
[codex:587879] ops=[]; offs=0
[codex:587879] while offs<len(b):
[codex:587879]     op=b[offs]; name=opcodes.get(op,f'OP{op:02x}')
[codex:587879]     if name.startswith('PUSH'):
[codex:587879]         n=int(name[4:]); data=b[offs+1:offs+1+n]
[codex:587879]         ops.append((offs,name,data))
[codex:587879]         offs+=1+n
[codex:587879]     else:
[codex:587879]         ops.append((offs,name,None)); offs+=1
[codex:587879] 
[codex:587879] start=0x2e26; end=0x2e90
[codex:587879] for o,n,d in ops:
[codex:587879]     if o<start or o>end: continue
[codex:587879]     if d is None:
[codex:587879]         print(f'{o:06x}: {n}')
[codex:587879]     else:
[codex:587879]         print(f'{o:06x}: {n} 0x{d.hex()}')
[codex:587879] PY" in /tmp/codex-multi-5dii8700 succeeded in 40ms:
[codex:587879] 002e26: JUMPDEST
[codex:587879] 002e27: PUSH1 0x00
[codex:587879] 002e29: DUP7
[codex:587879] 002e2a: MLOAD
[codex:587879] 002e2b: PUSH2 0x2e38
[codex:587879] 002e2e: DUP2
[codex:587879] 002e2f: DUP5
[codex:587879] 002e30: PUSH1 0x20
[codex:587879] 002e32: DUP12
[codex:587879] 002e33: ADD
[codex:587879] 002e34: PUSH2 0x2ff9
[codex:587879] 002e37: JUMP
[codex:587879] 002e38: JUMPDEST
[codex:587879] 002e39: DUP1
[codex:587879] 002e3a: DUP4
[codex:587879] 002e3b: ADD
[codex:587879] 002e3c: SWAP1
[codex:587879] 002e3d: POP
[codex:587879] 002e3e: PUSH32 0xffffffffffffffffffffffffffffffffffffffff000000000000000000000000
[codex:587879] 002e5f: DUP8
[codex:587879] 
[codex:587879] 
[codex:587879] thinking
[codex:587879] **Analyzing potential batch transfer vulnerability**
[codex:587879] 
[codex:587879] This is a deep dive into a public batch transfer function that loops over an array of token transfers, sending tokens or ETH from the contract’s own balance without any access control or caller checks. The function at 0x1966 takes an array of tuples (token address, recipient, amount), performs ERC20 transfers or ETH sends via call at 0x2105, and is callable through selector 0xfbfbbfed without restriction other than zero call value. That means anyone can drain this contract’s assets if present, representing a critical vulnerability. I’m carefully piecing together the calldata decoding, loop logic, and call dispatch to correlate function offsets and confirm no auth checks, concluding this is a high-risk exploit path if the contract holds funds. Next, I’ll produce a detailed JSON report outlining the vulnerability and evidence with bytecode offsets.
[codex:587879] thinking
[codex:587879] **Preparing structured vulnerability report**
[codex:587879] 
[codex:587879] I'm organizing the vulnerability details into the specified JSON schema, ensuring all required fields like `no_findings`, `summary`, and an array of `findings` are included. Each finding will specify severity, category, title, exploit scenario, recommendation, evidence, and precise bytecode locations referencing offsets like `runtime_bytecode.hex:0x04bb`. I'll summarize the key bytecode patterns showing the unprotected dispatch, the batch transfer loop, the token and ETH transfer logic, and the lack of access control, making a clear case for this critical access control flaw. Next, I'll finalize the JSON output following these points.
[codex:587879] codex
[codex:587879] {"no_findings":false,"summary":"Found an unprotected external entrypoint that executes ETH/ERC20 transfers from the contract using caller-supplied recipient/amount data.","findings":[{"severity":"critical","category":"access_control","title":"Unrestricted batch transfer allows draining ETH/ERC20 balances","exploit_scenario":"1) Read the contract’s ETH or ERC20 balance. 2) Call selector `0xfbfbbfed` with a single-element array where `token = 0x0` (for ETH) or the ERC20 address, `to = attacker`, and `amount = balance`. 3) The function builds a transfer call and executes `CALL` at 0x2105, sending funds from the contract to the attacker. No caller/auth/signature checks are performed, so any user can drain assets.","recommendation":"Restrict this entrypoint to an authorized role or to `onlySelf` (contract-internal) and require signature/nonce validation before allowing transfers. Alternatively, remove public access and route through the authenticated execution flow.","evidence":"External selector `0xfbfbbfed` dispatches at 0x04bb directly to internal function 0x1966 with only a `CALLVALUE==0` check (no caller/auth). Function 0x1966 constructs transfer data and invokes helper 0x20b7, which branches on `token` address and either (a) builds ERC20 `transfer` calldata using selector `a9059cbb` at 0x21d3 or (b) performs a plain ETH `CALL` with value. The actual external call is executed at 0x2105.","locations":["runtime_bytecode.hex:0x04bb","runtime_bytecode.hex:0x1966","runtime_bytecode.hex:0x20b7","runtime_bytecode.hex:0x2105","runtime_bytecode.hex:0x21d3"]}]}
[codex:587879] tokens used
[codex:587879] 165,106
[codex:587879] {"no_findings":false,"summary":"Found an unprotected external entrypoint that executes ETH/ERC20 transfers from the contract using caller-supplied recipient/amount data.","findings":[{"severity":"critical","category":"access_control","title":"Unrestricted batch transfer allows draining ETH/ERC20 balances","exploit_scenario":"1) Read the contract’s ETH or ERC20 balance. 2) Call selector `0xfbfbbfed` with a single-element array where `token = 0x0` (for ETH) or the ERC20 address, `to = attacker`, and `amount = balance`. 3) The function builds a transfer call and executes `CALL` at 0x2105, sending funds from the contract to the attacker. No caller/auth/signature checks are performed, so any user can drain assets.","recommendation":"Restrict this entrypoint to an authorized role or to `onlySelf` (contract-internal) and require signature/nonce validation before allowing transfers. Alternatively, remove public access and route through the authenticated execution flow.","evidence":"External selector `0xfbfbbfed` dispatches at 0x04bb directly to internal function 0x1966 with only a `CALLVALUE==0` check (no caller/auth). Function 0x1966 constructs transfer data and invokes helper 0x20b7, which branches on `token` address and either (a) builds ERC20 `transfer` calldata using selector `a9059cbb` at 0x21d3 or (b) performs a plain ETH `CALL` with value. The actual external call is executed at 0x2105.","locations":["runtime_bytecode.hex:0x04bb","runtime_bytecode.hex:0x1966","runtime_bytecode.hex:0x20b7","runtime_bytecode.hex:0x2105","runtime_bytecode.hex:0x21d3"]}]}
Metadata
{
    "codex": {
        "ran_at": "2026-01-05T18:38:34.777661+00:00",
        "returncode": 0
    },
    "summary": "Found an unprotected external entrypoint that executes ETH/ERC20 transfers from the contract using caller-supplied recipient/amount data.",
    "raw_final": {
        "summary": "Found an unprotected external entrypoint that executes ETH/ERC20 transfers from the contract using caller-supplied recipient/amount data.",
        "findings": [
            {
                "title": "Unrestricted batch transfer allows draining ETH/ERC20 balances",
                "category": "access_control",
                "evidence": "External selector `0xfbfbbfed` dispatches at 0x04bb directly to internal function 0x1966 with only a `CALLVALUE==0` check (no caller/auth). Function 0x1966 constructs transfer data and invokes helper 0x20b7, which branches on `token` address and either (a) builds ERC20 `transfer` calldata using selector `a9059cbb` at 0x21d3 or (b) performs a plain ETH `CALL` with value. The actual external call is executed at 0x2105.",
                "severity": "critical",
                "locations": [
                    "runtime_bytecode.hex:0x04bb",
                    "runtime_bytecode.hex:0x1966",
                    "runtime_bytecode.hex:0x20b7",
                    "runtime_bytecode.hex:0x2105",
                    "runtime_bytecode.hex:0x21d3"
                ],
                "recommendation": "Restrict this entrypoint to an authorized role or to `onlySelf` (contract-internal) and require signature/nonce validation before allowing transfers. Alternatively, remove public access and route through the authenticated execution flow.",
                "exploit_scenario": "1) Read the contract\u2019s ETH or ERC20 balance. 2) Call selector `0xfbfbbfed` with a single-element array where `token = 0x0` (for ETH) or the ERC20 address, `to = attacker`, and `amount = balance`. 3) The function builds a transfer call and executes `CALL` at 0x2105, sending funds from the contract to the attacker. No caller/auth/signature checks are performed, so any user can drain assets."
            }
        ],
        "no_findings": false
    },
    "no_findings": false,
    "schema_version": 1
}

Opcode Heuristics

tool.cast_disasm
Delegatecall
0
Selfdestruct
0
CREATE2
1
CALL-family (heavy)
7
EXT*/BALANCE
2
Total opcodes
6104
Flags
create_opcodes_present
View cast disassembly output
00000000: PUSH1 0x80
00000002: PUSH1 0x40
00000004: MSTORE
00000005: PUSH1 0x04
00000007: CALLDATASIZE
00000008: LT
00000009: PUSH2 0x0179
0000000c: JUMPI
0000000d: PUSH1 0x00
0000000f: CALLDATALOAD
00000010: PUSH1 0xe0
00000012: SHR
00000013: DUP1
00000014: PUSH4 0x7d729478
00000019: GT
0000001a: PUSH2 0x00cb
0000001d: JUMPI
0000001e: DUP1
0000001f: PUSH4 0xe38e7821
00000024: GT
00000025: PUSH2 0x007f
00000028: JUMPI
00000029: DUP1
0000002a: PUSH4 0xf0fd58a7
0000002f: GT
00000030: PUSH2 0x0059
00000033: JUMPI
00000034: DUP1
00000035: PUSH4 0xf0fd58a7
0000003a: EQ
0000003b: PUSH2 0x047b
0000003e: JUMPI
0000003f: DUP1
00000040: PUSH4 0xf5537ede
00000045: EQ
00000046: PUSH2 0x049b
00000049: JUMPI
0000004a: DUP1
0000004b: PUSH4 0xfbfbbfed
00000050: EQ
00000051: PUSH2 0x04bb
00000054: JUMPI
00000055: PUSH1 0x00
00000057: DUP1
00000058: REVERT
00000059: JUMPDEST
0000005a: DUP1
0000005b: PUSH4 0xe38e7821
00000060: EQ
00000061: PUSH2 0x040e
00000064: JUMPI
00000065: DUP1
00000066: PUSH4 0xe9bb84c2
0000006b: EQ
0000006c: PUSH2 0x043b
0000006f: JUMPI
00000070: DUP1
00000071: PUSH4 0xea23c389
00000076: EQ
00000077: PUSH2 0x045b
0000007a: JUMPI
0000007b: PUSH1 0x00
0000007d: DUP1
0000007e: REVERT
0000007f: JUMPDEST
00000080: DUP1
00000081: PUSH4 0xb269681d
00000086: GT
00000087: PUSH2 0x00b0
0000008a: JUMPI
0000008b: DUP1
0000008c: PUSH4 0xb269681d
00000091: EQ
00000092: PUSH2 0x03a1
00000095: JUMPI
00000096: DUP1
00000097: PUSH4 0xc59edb61
0000009c: EQ
0000009d: PUSH2 0x03ce
000000a0: JUMPI
000000a1: DUP1
000000a2: PUSH4 0xdc45d642
000000a7: EQ
000000a8: PUSH2 0x03ee
000000ab: JUMPI
000000ac: PUSH1 0x00
000000ae: DUP1
000000af: REVERT
000000b0: JUMPDEST
000000b1: DUP1
000000b2: PUSH4 0x7d729478
000000b7: EQ
000000b8: PUSH2 0x0334
000000bb: JUMPI
000000bc: DUP1
000000bd: PUSH4 0xacf854fc
000000c2: EQ
000000c3: PUSH2 0x0361
000000c6: JUMPI
000000c7: PUSH1 0x00
000000c9: DUP1
000000ca: REVERT
000000cb: JUMPDEST
000000cc: DUP1
000000cd: PUSH4 0x4867ba15
000000d2: GT
000000d3: PUSH2 0x012d
000000d6: JUMPI
000000d7: DUP1
000000d8: PUSH4 0x72494bd6
000000dd: GT
000000de: PUSH2 0x0107
000000e1: JUMPI
000000e2: DUP1
000000e3: PUSH4 0x72494bd6
000000e8: EQ
000000e9: PUSH2 0x02d4
000000ec: JUMPI
000000ed: DUP1
000000ee: PUSH4 0x760b85a7
000000f3: EQ
000000f4: PUSH2 0x02f4
000000f7: JUMPI
000000f8: DUP1
000000f9: PUSH4 0x7d58d56c
000000fe: EQ
000000ff: PUSH2 0x0314
00000102: JUMPI
00000103: PUSH1 0x00
00000105: DUP1
00000106: REVERT
00000107: JUMPDEST
00000108: DUP1
00000109: PUSH4 0x4867ba15
0000010e: EQ
0000010f: PUSH2 0x0227
00000112: JUMPI
00000113: DUP1
00000114: PUSH4 0x51acecc4
00000119: EQ
0000011a: PUSH2 0x0247
0000011d: JUMPI
0000011e: DUP1
0000011f: PUSH4 0x6e1021ea
00000124: EQ
00000125: PUSH2 0x0267
00000128: JUMPI
00000129: PUSH1 0x00
0000012b: DUP1
0000012c: REVERT
0000012d: JUMPDEST
0000012e: DUP1
0000012f: PUSH4 0x0e67c6bc
00000134: GT
00000135: PUSH2 0x015e
00000138: JUMPI
00000139: DUP1
0000013a: PUSH4 0x0e67c6bc
0000013f: EQ
00000140: PUSH2 0x01c7
00000143: JUMPI
00000144: DUP1
00000145: PUSH4 0x1ea3a52d
0000014a: EQ
0000014b: PUSH2 0x01e7
0000014e: JUMPI
0000014f: DUP1
00000150: PUSH4 0x3641e083
00000155: EQ
00000156: PUSH2 0x0207
00000159: JUMPI
0000015a: PUSH1 0x00
0000015c: DUP1
0000015d: REVERT
0000015e: JUMPDEST
0000015f: DUP1
00000160: PUSH4 0x02906b27
00000165: EQ
00000166: PUSH2 0x0185
00000169: JUMPI
0000016a: DUP1
0000016b: PUSH4 0x0a0a05e6
00000170: EQ
00000171: PUSH2 0x01a7
00000174: JUMPI
00000175: PUSH1 0x00
00000177: DUP1
00000178: REVERT
00000179: JUMPDEST
0000017a: CALLDATASIZE
0000017b: PUSH2 0x0180
0000017e: JUMPI
0000017f: STOP
00000180: JUMPDEST
00000181: PUSH1 0x00
00000183: DUP1
00000184: REVERT
00000185: JUMPDEST
00000186: CALLVALUE
00000187: DUP1
00000188: ISZERO
00000189: PUSH2 0x0191
0000018c: JUMPI
0000018d: PUSH1 0x00
0000018f: DUP1
00000190: REVERT
00000191: JUMPDEST
00000192: POP
00000193: PUSH2 0x01a5
00000196: PUSH2 0x01a0
00000199: CALLDATASIZE
0000019a: PUSH1 0x04
0000019c: PUSH2 0x2c9c
0000019f: JUMP
000001a0: JUMPDEST
000001a1: PUSH2 0x04e8
000001a4: JUMP
000001a5: JUMPDEST
000001a6: STOP
000001a7: JUMPDEST
000001a8: CALLVALUE
000001a9: DUP1
000001aa: ISZERO
000001ab: PUSH2 0x01b3
000001ae: JUMPI
000001af: PUSH1 0x00
000001b1: DUP1
000001b2: REVERT
000001b3: JUMPDEST
000001b4: POP
000001b5: PUSH2 0x01a5
000001b8: PUSH2 0x01c2
000001bb: CALLDATASIZE
000001bc: PUSH1 0x04
000001be: PUSH2 0x2859
000001c1: JUMP
000001c2: JUMPDEST
000001c3: PUSH2 0x0855
000001c6: JUMP
000001c7: JUMPDEST
000001c8: CALLVALUE
000001c9: DUP1
000001ca: ISZERO
000001cb: PUSH2 0x01d3
000001ce: JUMPI
000001cf: PUSH1 0x00
000001d1: DUP1
000001d2: REVERT
000001d3: JUMPDEST
000001d4: POP
000001d5: PUSH2 0x01a5
000001d8: PUSH2 0x01e2
000001db: CALLDATASIZE
000001dc: PUSH1 0x04
000001de: PUSH2 0x2958
000001e1: JUMP
000001e2: JUMPDEST
000001e3: PUSH2 0x0937
000001e6: JUMP
000001e7: JUMPDEST
000001e8: CALLVALUE
000001e9: DUP1
000001ea: ISZERO
000001eb: PUSH2 0x01f3
000001ee: JUMPI
000001ef: PUSH1 0x00
000001f1: DUP1
000001f2: REVERT
000001f3: JUMPDEST
000001f4: POP
000001f5: PUSH2 0x01a5
000001f8: PUSH2 0x0202
000001fb: CALLDATASIZE
000001fc: PUSH1 0x04
000001fe: PUSH2 0x2bf0
00000201: JUMP
00000202: JUMPDEST
00000203: PUSH2 0x0a19
00000206: JUMP
00000207: JUMPDEST
00000208: CALLVALUE
00000209: DUP1
0000020a: ISZERO
0000020b: PUSH2 0x0213
0000020e: JUMPI
0000020f: PUSH1 0x00
00000211: DUP1
00000212: REVERT
00000213: JUMPDEST
00000214: POP
00000215: PUSH2 0x01a5
00000218: PUSH2 0x0222
0000021b: CALLDATASIZE
0000021c: PUSH1 0x04
0000021e: PUSH2 0x2c14
00000221: JUMP
00000222: JUMPDEST
00000223: PUSH2 0x0b71
00000226: JUMP
00000227: JUMPDEST
00000228: CALLVALUE
00000229: DUP1
0000022a: ISZERO
0000022b: PUSH2 0x0233
0000022e: JUMPI
0000022f: PUSH1 0x00
00000231: DUP1
00000232: REVERT
00000233: JUMPDEST
00000234: POP
00000235: PUSH2 0x01a5
00000238: PUSH2 0x0242
0000023b: CALLDATASIZE
0000023c: PUSH1 0x04
0000023e: PUSH2 0x2a42
00000241: JUMP
00000242: JUMPDEST
00000243: PUSH2 0x0ca1
00000246: JUMP
00000247: JUMPDEST
00000248: CALLVALUE
00000249: DUP1
0000024a: ISZERO
0000024b: PUSH2 0x0253
0000024e: JUMPI
0000024f: PUSH1 0x00
00000251: DUP1
00000252: REVERT
00000253: JUMPDEST
00000254: POP
00000255: PUSH2 0x01a5
00000258: PUSH2 0x0262
0000025b: CALLDATASIZE
0000025c: PUSH1 0x04
0000025e: PUSH2 0x2958
00000261: JUMP
00000262: JUMPDEST
00000263: PUSH2 0x107b
00000266: JUMP
00000267: JUMPDEST
00000268: CALLVALUE
00000269: DUP1
0000026a: ISZERO
0000026b: PUSH2 0x0273
0000026e: JUMPI
0000026f: PUSH1 0x00
00000271: DUP1
00000272: REVERT
00000273: JUMPDEST
00000274: POP
00000275: PUSH2 0x02aa
00000278: PUSH2 0x0282
0000027b: CALLDATASIZE
0000027c: PUSH1 0x04
0000027e: PUSH2 0x2bd8
00000281: JUMP
00000282: JUMPDEST
00000283: PUSH1 0x00
00000285: SWAP1
00000286: DUP2
00000287: MSTORE
00000288: PUSH1 0x05
0000028a: PUSH1 0x20
0000028c: MSTORE
0000028d: PUSH1 0x40
0000028f: SWAP1
00000290: KECCAK256
00000291: SLOAD
00000292: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
000002a7: AND
000002a8: SWAP1
000002a9: JUMP
000002aa: JUMPDEST
000002ab: PUSH1 0x40
000002ad: MLOAD
000002ae: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
000002c3: SWAP1
000002c4: SWAP2
000002c5: AND
000002c6: DUP2
000002c7: MSTORE
000002c8: PUSH1 0x20
000002ca: ADD
000002cb: JUMPDEST
000002cc: PUSH1 0x40
000002ce: MLOAD
000002cf: DUP1
000002d0: SWAP2
000002d1: SUB
000002d2: SWAP1
000002d3: RETURN
000002d4: JUMPDEST
000002d5: CALLVALUE
000002d6: DUP1
000002d7: ISZERO
000002d8: PUSH2 0x02e0
000002db: JUMPI
000002dc: PUSH1 0x00
000002de: DUP1
000002df: REVERT
000002e0: JUMPDEST
000002e1: POP
000002e2: PUSH2 0x01a5
000002e5: PUSH2 0x02ef
000002e8: CALLDATASIZE
000002e9: PUSH1 0x04
000002eb: PUSH2 0x2875
000002ee: JUMP
000002ef: JUMPDEST
000002f0: PUSH2 0x110f
000002f3: JUMP
000002f4: JUMPDEST
000002f5: CALLVALUE
000002f6: DUP1
000002f7: ISZERO
000002f8: PUSH2 0x0300
000002fb: JUMPI
000002fc: PUSH1 0x00
000002fe: DUP1
000002ff: REVERT
00000300: JUMPDEST
00000301: POP
00000302: PUSH2 0x01a5
00000305: PUSH2 0x030f
00000308: CALLDATASIZE
00000309: PUSH1 0x04
0000030b: PUSH2 0x298c
0000030e: JUMP
0000030f: JUMPDEST
00000310: PUSH2 0x120b
00000313: JUMP
00000314: JUMPDEST
00000315: CALLVALUE
00000316: DUP1
00000317: ISZERO
00000318: PUSH2 0x0320
0000031b: JUMPI
0000031c: PUSH1 0x00
0000031e: DUP1
0000031f: REVERT
00000320: JUMPDEST
00000321: POP
00000322: PUSH2 0x02aa
00000325: PUSH2 0x032f
00000328: CALLDATASIZE
00000329: PUSH1 0x04
0000032b: PUSH2 0x2c7b
0000032e: JUMP
0000032f: JUMPDEST
00000330: PUSH2 0x1299
00000333: JUMP
00000334: JUMPDEST
00000335: CALLVALUE
00000336: DUP1
00000337: ISZERO
00000338: PUSH2 0x0340
0000033b: JUMPI
0000033c: PUSH1 0x00
0000033e: DUP1
0000033f: REVERT
00000340: JUMPDEST
00000341: POP
00000342: PUSH1 0x02
00000344: SLOAD
00000345: PUSH2 0x02aa
00000348: SWAP1
00000349: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
0000035e: AND
0000035f: DUP2
00000360: JUMP
00000361: JUMPDEST
00000362: CALLVALUE
00000363: DUP1
00000364: ISZERO
00000365: PUSH2 0x036d
00000368: JUMPI
00000369: PUSH1 0x00
0000036b: DUP1
0000036c: REVERT
0000036d: JUMPDEST
0000036e: POP
0000036f: PUSH2 0x0391
00000372: PUSH2 0x037c
00000375: CALLDATASIZE
00000376: PUSH1 0x04
00000378: PUSH2 0x2859
0000037b: JUMP
0000037c: JUMPDEST
0000037d: PUSH1 0x03
0000037f: PUSH1 0x20
00000381: MSTORE
00000382: PUSH1 0x00
00000384: SWAP1
00000385: DUP2
00000386: MSTORE
00000387: PUSH1 0x40
00000389: SWAP1
0000038a: KECCAK256
0000038b: SLOAD
0000038c: PUSH1 0xff
0000038e: AND
0000038f: DUP2
00000390: JUMP
00000391: JUMPDEST
00000392: PUSH1 0x40
00000394: MLOAD
00000395: SWAP1
00000396: ISZERO
00000397: ISZERO
00000398: DUP2
00000399: MSTORE
0000039a: PUSH1 0x20
0000039c: ADD
0000039d: PUSH2 0x02cb
000003a0: JUMP
000003a1: JUMPDEST
000003a2: CALLVALUE
000003a3: DUP1
000003a4: ISZERO
000003a5: PUSH2 0x03ad
000003a8: JUMPI
000003a9: PUSH1 0x00
000003ab: DUP1
000003ac: REVERT
000003ad: JUMPDEST
000003ae: POP
000003af: PUSH1 0x00
000003b1: SLOAD
000003b2: PUSH2 0x02aa
000003b5: SWAP1
000003b6: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
000003cb: AND
000003cc: DUP2
000003cd: JUMP
000003ce: JUMPDEST
000003cf: CALLVALUE
000003d0: DUP1
000003d1: ISZERO
000003d2: PUSH2 0x03da
000003d5: JUMPI
000003d6: PUSH1 0x00
000003d8: DUP1
000003d9: REVERT
000003da: JUMPDEST
000003db: POP
000003dc: PUSH2 0x02aa
000003df: PUSH2 0x03e9
000003e2: CALLDATASIZE
000003e3: PUSH1 0x04
000003e5: PUSH2 0x2c7b
000003e8: JUMP
000003e9: JUMPDEST
000003ea: PUSH2 0x12d1
000003ed: JUMP
000003ee: JUMPDEST
000003ef: CALLVALUE
000003f0: DUP1
000003f1: ISZERO
000003f2: PUSH2 0x03fa
000003f5: JUMPI
000003f6: PUSH1 0x00
000003f8: DUP1
000003f9: REVERT
000003fa: JUMPDEST
000003fb: POP
000003fc: PUSH2 0x01a5
000003ff: PUSH2 0x0409
00000402: CALLDATASIZE
00000403: PUSH1 0x04
00000405: PUSH2 0x2918
00000408: JUMP
00000409: JUMPDEST
0000040a: PUSH2 0x1352
0000040d: JUMP
0000040e: JUMPDEST
0000040f: CALLVALUE
00000410: DUP1
00000411: ISZERO
00000412: PUSH2 0x041a
00000415: JUMPI
00000416: PUSH1 0x00
00000418: DUP1
00000419: REVERT
0000041a: JUMPDEST
0000041b: POP
0000041c: PUSH1 0x01
0000041e: SLOAD
0000041f: PUSH2 0x02aa
00000422: SWAP1
00000423: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00000438: AND
00000439: DUP2
0000043a: JUMP
0000043b: JUMPDEST
0000043c: CALLVALUE
0000043d: DUP1
0000043e: ISZERO
0000043f: PUSH2 0x0447
00000442: JUMPI
00000443: PUSH1 0x00
00000445: DUP1
00000446: REVERT
00000447: JUMPDEST
00000448: POP
00000449: PUSH2 0x01a5
0000044c: PUSH2 0x0456
0000044f: CALLDATASIZE
00000450: PUSH1 0x04
00000452: PUSH2 0x28ed
00000455: JUMP
00000456: JUMPDEST
00000457: PUSH2 0x15f3
0000045a: JUMP
0000045b: JUMPDEST
0000045c: CALLVALUE
0000045d: DUP1
0000045e: ISZERO
0000045f: PUSH2 0x0467
00000462: JUMPI
00000463: PUSH1 0x00
00000465: DUP1
00000466: REVERT
00000467: JUMPDEST
00000468: POP
00000469: PUSH2 0x0391
0000046c: PUSH2 0x0476
0000046f: CALLDATASIZE
00000470: PUSH1 0x04
00000472: PUSH2 0x2bd8
00000475: JUMP
00000476: JUMPDEST
00000477: PUSH2 0x1695
0000047a: JUMP
0000047b: JUMPDEST
0000047c: CALLVALUE
0000047d: DUP1
0000047e: ISZERO
0000047f: PUSH2 0x0487
00000482: JUMPI
00000483: PUSH1 0x00
00000485: DUP1
00000486: REVERT
00000487: JUMPDEST
00000488: POP
00000489: PUSH2 0x01a5
0000048c: PUSH2 0x0496
0000048f: CALLDATASIZE
00000490: PUSH1 0x04
00000492: PUSH2 0x2918
00000495: JUMP
00000496: JUMPDEST
00000497: PUSH2 0x16ef
0000049a: JUMP
0000049b: JUMPDEST
0000049c: CALLVALUE
0000049d: DUP1
0000049e: ISZERO
0000049f: PUSH2 0x04a7
000004a2: JUMPI
000004a3: PUSH1 0x00
000004a5: DUP1
000004a6: REVERT
000004a7: JUMPDEST
000004a8: POP
000004a9: PUSH2 0x01a5
000004ac: PUSH2 0x04b6
000004af: CALLDATASIZE
000004b0: PUSH1 0x04
000004b2: PUSH2 0x28ad
000004b5: JUMP
000004b6: JUMPDEST
000004b7: PUSH2 0x18c3
000004ba: JUMP
000004bb: JUMPDEST
000004bc: CALLVALUE
000004bd: DUP1
000004be: ISZERO
000004bf: PUSH2 0x04c7
000004c2: JUMPI
000004c3: PUSH1 0x00
000004c5: DUP1
000004c6: REVERT
000004c7: JUMPDEST
000004c8: POP
000004c9: PUSH2 0x04db
000004cc: PUSH2 0x04d6
000004cf: CALLDATASIZE
000004d0: PUSH1 0x04
000004d2: PUSH2 0x29fc
000004d5: JUMP
000004d6: JUMPDEST
000004d7: PUSH2 0x1966
000004da: JUMP
000004db: JUMPDEST
000004dc: PUSH1 0x40
000004de: MLOAD
000004df: PUSH2 0x02cb
000004e2: SWAP2
000004e3: SWAP1
000004e4: PUSH2 0x2ee5
000004e7: JUMP
000004e8: JUMPDEST
000004e9: CALLER
000004ea: PUSH1 0x00
000004ec: SWAP1
000004ed: DUP2
000004ee: MSTORE
000004ef: PUSH1 0x03
000004f1: PUSH1 0x20
000004f3: MSTORE
000004f4: PUSH1 0x40
000004f6: SWAP1
000004f7: KECCAK256
000004f8: SLOAD
000004f9: PUSH1 0xff
000004fb: AND
000004fc: DUP1
000004fd: PUSH2 0x051d
00000500: JUMPI
00000501: POP
00000502: PUSH1 0x01
00000504: SLOAD
00000505: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
0000051a: AND
0000051b: CALLER
0000051c: EQ
0000051d: JUMPDEST
0000051e: DUP1
0000051f: PUSH2 0x053f
00000522: JUMPI
00000523: POP
00000524: PUSH1 0x02
00000526: SLOAD
00000527: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
0000053c: AND
0000053d: CALLER
0000053e: EQ
0000053f: JUMPDEST
00000540: PUSH2 0x05b0
00000543: JUMPI
00000544: PUSH1 0x40
00000546: MLOAD
00000547: PUSH32 0x08c379a000000000000000000000000000000000000000000000000000000000
00000568: DUP2
00000569: MSTORE
0000056a: PUSH1 0x04
0000056c: ADD
0000056d: PUSH2 0x05a7
00000570: SWAP1
00000571: PUSH1 0x20
00000573: DUP1
00000574: DUP3
00000575: MSTORE
00000576: PUSH1 0x04
00000578: SWAP1
00000579: DUP3
0000057a: ADD
0000057b: MSTORE
0000057c: PUSH32 0x216b657900000000000000000000000000000000000000000000000000000000
0000059d: PUSH1 0x40
0000059f: DUP3
000005a0: ADD
000005a1: MSTORE
000005a2: PUSH1 0x60
000005a4: ADD
000005a5: SWAP1
000005a6: JUMP
000005a7: JUMPDEST
000005a8: PUSH1 0x40
000005aa: MLOAD
000005ab: DUP1
000005ac: SWAP2
000005ad: SUB
000005ae: SWAP1
000005af: REVERT
000005b0: JUMPDEST
000005b1: PUSH2 0x05b9
000005b4: DUP6
000005b5: PUSH2 0x1695
000005b8: JUMP
000005b9: JUMPDEST
000005ba: ISZERO
000005bb: PUSH2 0x0622
000005be: JUMPI
000005bf: PUSH1 0x40
000005c1: MLOAD
000005c2: PUSH32 0x08c379a000000000000000000000000000000000000000000000000000000000
000005e3: DUP2
000005e4: MSTORE
000005e5: PUSH1 0x04
000005e7: ADD
000005e8: PUSH2 0x05a7
000005eb: SWAP1
000005ec: PUSH1 0x20
000005ee: DUP1
000005ef: DUP3
000005f0: MSTORE
000005f1: PUSH1 0x04
000005f3: SWAP1
000005f4: DUP3
000005f5: ADD
000005f6: MSTORE
000005f7: PUSH32 0x7573656400000000000000000000000000000000000000000000000000000000
00000618: PUSH1 0x40
0000061a: DUP3
0000061b: ADD
0000061c: MSTORE
0000061d: PUSH1 0x60
0000061f: ADD
00000620: SWAP1
00000621: JUMP
00000622: JUMPDEST
00000623: PUSH1 0x00
00000625: ADDRESS
00000626: DUP7
00000627: PUSH2 0x0633
0000062a: PUSH2 0x04d6
0000062d: DUP6
0000062e: DUP8
0000062f: PUSH2 0x2fda
00000632: JUMP
00000633: JUMPDEST
00000634: PUSH1 0x40
00000636: MLOAD
00000637: PUSH1 0x20
00000639: ADD
0000063a: PUSH2 0x0645
0000063d: SWAP4
0000063e: SWAP3
0000063f: SWAP2
00000640: SWAP1
00000641: PUSH2 0x2db8
00000644: JUMP
00000645: JUMPDEST
00000646: PUSH1 0x40
00000648: MLOAD
00000649: PUSH1 0x20
0000064b: DUP2
0000064c: DUP4
0000064d: SUB
0000064e: SUB
0000064f: DUP2
00000650: MSTORE
00000651: SWAP1
00000652: PUSH1 0x40
00000654: MSTORE
00000655: DUP1
00000656: MLOAD
00000657: SWAP1
00000658: PUSH1 0x20
0000065a: ADD
0000065b: KECCAK256
0000065c: SWAP1
0000065d: POP
0000065e: PUSH1 0x00
00000660: PUSH2 0x06f5
00000663: PUSH2 0x06b9
00000666: DUP4
00000667: PUSH1 0x40
00000669: MLOAD
0000066a: PUSH32 0x19457468657265756d205369676e6564204d6573736167653a0a333200000000
0000068b: PUSH1 0x20
0000068d: DUP3
0000068e: ADD
0000068f: MSTORE
00000690: PUSH1 0x3c
00000692: DUP2
00000693: ADD
00000694: DUP3
00000695: SWAP1
00000696: MSTORE
00000697: PUSH1 0x00
00000699: SWAP1
0000069a: PUSH1 0x5c
0000069c: ADD
0000069d: PUSH1 0x40
0000069f: MLOAD
000006a0: PUSH1 0x20
000006a2: DUP2
000006a3: DUP4
000006a4: SUB
000006a5: SUB
000006a6: DUP2
000006a7: MSTORE
000006a8: SWAP1
000006a9: PUSH1 0x40
000006ab: MSTORE
000006ac: DUP1
000006ad: MLOAD
000006ae: SWAP1
000006af: PUSH1 0x20
000006b1: ADD
000006b2: KECCAK256
000006b3: SWAP1
000006b4: POP
000006b5: SWAP2
000006b6: SWAP1
000006b7: POP
000006b8: JUMP
000006b9: JUMPDEST
000006ba: DUP8
000006bb: DUP8
000006bc: DUP1
000006bd: DUP1
000006be: PUSH1 0x1f
000006c0: ADD
000006c1: PUSH1 0x20
000006c3: DUP1
000006c4: SWAP2
000006c5: DIV
000006c6: MUL
000006c7: PUSH1 0x20
000006c9: ADD
000006ca: PUSH1 0x40
000006cc: MLOAD
000006cd: SWAP1
000006ce: DUP2
000006cf: ADD
000006d0: PUSH1 0x40
000006d2: MSTORE
000006d3: DUP1
000006d4: SWAP4
000006d5: SWAP3
000006d6: SWAP2
000006d7: SWAP1
000006d8: DUP2
000006d9: DUP2
000006da: MSTORE
000006db: PUSH1 0x20
000006dd: ADD
000006de: DUP4
000006df: DUP4
000006e0: DUP1
000006e1: DUP3
000006e2: DUP5
000006e3: CALLDATACOPY
000006e4: PUSH1 0x00
000006e6: SWAP3
000006e7: ADD
000006e8: SWAP2
000006e9: SWAP1
000006ea: SWAP2
000006eb: MSTORE
000006ec: POP
000006ed: PUSH2 0x1a0d
000006f0: SWAP3
000006f1: POP
000006f2: POP
000006f3: POP
000006f4: JUMP
000006f5: JUMPDEST
000006f6: PUSH1 0x01
000006f8: SLOAD
000006f9: SWAP1
000006fa: SWAP2
000006fb: POP
000006fc: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00000711: DUP1
00000712: DUP4
00000713: AND
00000714: SWAP2
00000715: AND
00000716: EQ
00000717: DUP1
00000718: PUSH2 0x073b
0000071b: JUMPI
0000071c: POP
0000071d: PUSH1 0x02
0000071f: SLOAD
00000720: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00000735: DUP3
00000736: DUP2
00000737: AND
00000738: SWAP2
00000739: AND
0000073a: EQ
0000073b: JUMPDEST
0000073c: DUP1
0000073d: ISZERO
0000073e: PUSH2 0x075d
00000741: JUMPI
00000742: POP
00000743: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00000758: DUP2
00000759: AND
0000075a: CALLER
0000075b: EQ
0000075c: ISZERO
0000075d: JUMPDEST
0000075e: PUSH2 0x07c3
00000761: JUMPI
00000762: PUSH1 0x40
00000764: MLOAD
00000765: PUSH32 0x08c379a000000000000000000000000000000000000000000000000000000000
00000786: DUP2
00000787: MSTORE
00000788: PUSH1 0x20
0000078a: PUSH1 0x04
0000078c: DUP3
0000078d: ADD
0000078e: MSTORE
0000078f: PUSH1 0x0b
00000791: PUSH1 0x24
00000793: DUP3
00000794: ADD
00000795: MSTORE
00000796: PUSH32 0x217369676e696e674b6579000000000000000000000000000000000000000000
000007b7: PUSH1 0x44
000007b9: DUP3
000007ba: ADD
000007bb: MSTORE
000007bc: PUSH1 0x64
000007be: ADD
000007bf: PUSH2 0x05a7
000007c2: JUMP
000007c3: JUMPDEST
000007c4: PUSH2 0x07cc
000007c7: DUP8
000007c8: PUSH2 0x1aa2
000007cb: JUMP
000007cc: JUMPDEST
000007cd: PUSH1 0x00
000007cf: JUMPDEST
000007d0: DUP4
000007d1: DUP2
000007d2: LT
000007d3: ISZERO
000007d4: PUSH2 0x084b
000007d7: JUMPI
000007d8: PUSH1 0x00
000007da: DUP6
000007db: DUP6
000007dc: DUP4
000007dd: DUP2
000007de: DUP2
000007df: LT
000007e0: PUSH2 0x0812
000007e3: JUMPI
000007e4: PUSH32 0x4e487b7100000000000000000000000000000000000000000000000000000000
00000805: PUSH1 0x00
00000807: MSTORE
00000808: PUSH1 0x32
0000080a: PUSH1 0x04
0000080c: MSTORE
0000080d: PUSH1 0x24
0000080f: PUSH1 0x00
00000811: REVERT
00000812: JUMPDEST
00000813: SWAP1
00000814: POP
00000815: PUSH1 0x20
00000817: MUL
00000818: DUP2
00000819: ADD
0000081a: SWAP1
0000081b: PUSH2 0x0824
0000081e: SWAP2
0000081f: SWAP1
00000820: PUSH2 0x2ef8
00000823: JUMP
00000824: JUMPDEST
00000825: PUSH2 0x082d
00000828: SWAP1
00000829: PUSH2 0x2fe7
0000082c: JUMP
0000082d: JUMPDEST
0000082e: SWAP1
0000082f: POP
00000830: PUSH2 0x0838
00000833: DUP2
00000834: PUSH2 0x1b06
00000837: JUMP
00000838: JUMPDEST
00000839: POP
0000083a: DUP1
0000083b: PUSH2 0x0843
0000083e: DUP2
0000083f: PUSH2 0x3025
00000842: JUMP
00000843: JUMPDEST
00000844: SWAP2
00000845: POP
00000846: POP
00000847: PUSH2 0x07cf
0000084a: JUMP
0000084b: JUMPDEST
0000084c: POP
0000084d: POP
0000084e: POP
0000084f: POP
00000850: POP
00000851: POP
00000852: POP
00000853: POP
00000854: JUMP
00000855: JUMPDEST
00000856: CALLER
00000857: ADDRESS
00000858: EQ
00000859: PUSH2 0x08be
0000085c: JUMPI
0000085d: PUSH1 0x40
0000085f: MLOAD
00000860: PUSH32 0x08c379a000000000000000000000000000000000000000000000000000000000
00000881: DUP2
00000882: MSTORE
00000883: PUSH1 0x20
00000885: PUSH1 0x04
00000887: DUP3
00000888: ADD
00000889: MSTORE
0000088a: PUSH1 0x07
0000088c: PUSH1 0x24
0000088e: DUP3
0000088f: ADD
00000890: MSTORE
00000891: PUSH32 0x2177616c6c657400000000000000000000000000000000000000000000000000
000008b2: PUSH1 0x44
000008b4: DUP3
000008b5: ADD
000008b6: MSTORE
000008b7: PUSH1 0x64
000008b9: ADD
000008ba: PUSH2 0x05a7
000008bd: JUMP
000008be: JUMPDEST
000008bf: PUSH1 0x00
000008c1: DUP1
000008c2: SLOAD
000008c3: PUSH32 0xffffffffffffffffffffffff0000000000000000000000000000000000000000
000008e4: AND
000008e5: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
000008fa: DUP4
000008fb: AND
000008fc: SWAP1
000008fd: DUP2
000008fe: OR
000008ff: SWAP1
00000900: SWAP2
00000901: SSTORE
00000902: PUSH1 0x40
00000904: MLOAD
00000905: SWAP1
00000906: DUP2
00000907: MSTORE
00000908: PUSH32 0xb1472bb6509fdfed83bc02e327a52a99b8ecac79087af92efe618a5812dfa865
00000929: SWAP1
0000092a: PUSH1 0x20
0000092c: ADD
0000092d: PUSH1 0x40
0000092f: MLOAD
00000930: DUP1
00000931: SWAP2
00000932: SUB
00000933: SWAP1
00000934: LOG1
00000935: POP
00000936: JUMP
00000937: JUMPDEST
00000938: CALLER
00000939: ADDRESS
0000093a: EQ
0000093b: PUSH2 0x09a0
0000093e: JUMPI
0000093f: PUSH1 0x40
00000941: MLOAD
00000942: PUSH32 0x08c379a000000000000000000000000000000000000000000000000000000000
00000963: DUP2
00000964: MSTORE
00000965: PUSH1 0x20
00000967: PUSH1 0x04
00000969: DUP3
0000096a: ADD
0000096b: MSTORE
0000096c: PUSH1 0x07
0000096e: PUSH1 0x24
00000970: DUP3
00000971: ADD
00000972: MSTORE
00000973: PUSH32 0x2177616c6c657400000000000000000000000000000000000000000000000000
00000994: PUSH1 0x44
00000996: DUP3
00000997: ADD
00000998: MSTORE
00000999: PUSH1 0x64
0000099b: ADD
0000099c: PUSH2 0x05a7
0000099f: JUMP
000009a0: JUMPDEST
000009a1: PUSH1 0x00
000009a3: JUMPDEST
000009a4: DUP2
000009a5: DUP2
000009a6: LT
000009a7: ISZERO
000009a8: PUSH2 0x0a14
000009ab: JUMPI
000009ac: PUSH2 0x0a02
000009af: DUP4
000009b0: DUP4
000009b1: DUP4
000009b2: DUP2
000009b3: DUP2
000009b4: LT
000009b5: PUSH2 0x09e7
000009b8: JUMPI
000009b9: PUSH32 0x4e487b7100000000000000000000000000000000000000000000000000000000
000009da: PUSH1 0x00
000009dc: MSTORE
000009dd: PUSH1 0x32
000009df: PUSH1 0x04
000009e1: MSTORE
000009e2: PUSH1 0x24
000009e4: PUSH1 0x00
000009e6: REVERT
000009e7: JUMPDEST
000009e8: SWAP1
000009e9: POP
000009ea: PUSH1 0x60
000009ec: MUL
000009ed: ADD
000009ee: DUP1
000009ef: CALLDATASIZE
000009f0: SUB
000009f1: DUP2
000009f2: ADD
000009f3: SWAP1
000009f4: PUSH2 0x09fd
000009f7: SWAP2
000009f8: SWAP1
000009f9: PUSH2 0x2b8c
000009fc: JUMP
000009fd: JUMPDEST
000009fe: PUSH2 0x1c43
00000a01: JUMP
00000a02: JUMPDEST
00000a03: DUP1
00000a04: PUSH2 0x0a0c
00000a07: DUP2
00000a08: PUSH2 0x3025
00000a0b: JUMP
00000a0c: JUMPDEST
00000a0d: SWAP2
00000a0e: POP
00000a0f: POP
00000a10: PUSH2 0x09a3
00000a13: JUMP
00000a14: JUMPDEST
00000a15: POP
00000a16: POP
00000a17: POP
00000a18: JUMP
00000a19: JUMPDEST
00000a1a: CALLER
00000a1b: PUSH1 0x00
00000a1d: SWAP1
00000a1e: DUP2
00000a1f: MSTORE
00000a20: PUSH1 0x03
00000a22: PUSH1 0x20
00000a24: MSTORE
00000a25: PUSH1 0x40
00000a27: SWAP1
00000a28: KECCAK256
00000a29: SLOAD
00000a2a: PUSH1 0xff
00000a2c: AND
00000a2d: PUSH2 0x0a92
00000a30: JUMPI
00000a31: PUSH1 0x40
00000a33: MLOAD
00000a34: PUSH32 0x08c379a000000000000000000000000000000000000000000000000000000000
00000a55: DUP2
00000a56: MSTORE
00000a57: PUSH1 0x20
00000a59: PUSH1 0x04
00000a5b: DUP3
00000a5c: ADD
00000a5d: MSTORE
00000a5e: PUSH1 0x08
00000a60: PUSH1 0x24
00000a62: DUP3
00000a63: ADD
00000a64: MSTORE
00000a65: PUSH32 0x2168656e65736973000000000000000000000000000000000000000000000000
00000a86: PUSH1 0x44
00000a88: DUP3
00000a89: ADD
00000a8a: MSTORE
00000a8b: PUSH1 0x64
00000a8d: ADD
00000a8e: PUSH2 0x05a7
00000a91: JUMP
00000a92: JUMPDEST
00000a93: PUSH1 0x00
00000a95: DUP3
00000a96: DUP2
00000a97: MSTORE
00000a98: PUSH1 0x05
00000a9a: PUSH1 0x20
00000a9c: MSTORE
00000a9d: PUSH1 0x40
00000a9f: SWAP1
00000aa0: KECCAK256
00000aa1: SLOAD
00000aa2: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00000ab7: AND
00000ab8: ISZERO
00000ab9: PUSH2 0x0b1e
00000abc: JUMPI
00000abd: PUSH1 0x40
00000abf: MLOAD
00000ac0: PUSH32 0x08c379a000000000000000000000000000000000000000000000000000000000
00000ae1: DUP2
00000ae2: MSTORE
00000ae3: PUSH1 0x20
00000ae5: PUSH1 0x04
00000ae7: DUP3
00000ae8: ADD
00000ae9: MSTORE
00000aea: PUSH1 0x05
00000aec: PUSH1 0x24
00000aee: DUP3
00000aef: ADD
00000af0: MSTORE
00000af1: PUSH32 0x6578697374000000000000000000000000000000000000000000000000000000
00000b12: PUSH1 0x44
00000b14: DUP3
00000b15: ADD
00000b16: MSTORE
00000b17: PUSH1 0x64
00000b19: ADD
00000b1a: PUSH2 0x05a7
00000b1d: JUMP
00000b1e: JUMPDEST
00000b1f: PUSH1 0x00
00000b21: SWAP2
00000b22: DUP3
00000b23: MSTORE
00000b24: PUSH1 0x05
00000b26: PUSH1 0x20
00000b28: MSTORE
00000b29: PUSH1 0x40
00000b2b: SWAP1
00000b2c: SWAP2
00000b2d: KECCAK256
00000b2e: DUP1
00000b2f: SLOAD
00000b30: PUSH32 0xffffffffffffffffffffffff0000000000000000000000000000000000000000
00000b51: AND
00000b52: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00000b67: SWAP1
00000b68: SWAP3
00000b69: AND
00000b6a: SWAP2
00000b6b: SWAP1
00000b6c: SWAP2
00000b6d: OR
00000b6e: SWAP1
00000b6f: SSTORE
00000b70: JUMP
00000b71: JUMPDEST
00000b72: PUSH1 0x00
00000b74: SLOAD
00000b75: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00000b8a: AND
00000b8b: ISZERO
00000b8c: PUSH2 0x0bf3
00000b8f: JUMPI
00000b90: PUSH1 0x40
00000b92: MLOAD
00000b93: PUSH32 0x08c379a000000000000000000000000000000000000000000000000000000000
00000bb4: DUP2
00000bb5: MSTORE
00000bb6: PUSH1 0x04
00000bb8: ADD
00000bb9: PUSH2 0x05a7
00000bbc: SWAP1
00000bbd: PUSH1 0x20
00000bbf: DUP1
00000bc0: DUP3
00000bc1: MSTORE
00000bc2: PUSH1 0x04
00000bc4: SWAP1
00000bc5: DUP3
00000bc6: ADD
00000bc7: MSTORE
00000bc8: PUSH32 0x696e697400000000000000000000000000000000000000000000000000000000
00000be9: PUSH1 0x40
00000beb: DUP3
00000bec: ADD
00000bed: MSTORE
00000bee: PUSH1 0x60
00000bf0: ADD
00000bf1: SWAP1
00000bf2: JUMP
00000bf3: JUMPDEST
00000bf4: PUSH1 0x00
00000bf6: DUP1
00000bf7: SLOAD
00000bf8: ADDRESS
00000bf9: PUSH32 0xffffffffffffffffffffffff0000000000000000000000000000000000000000
00000c1a: SWAP2
00000c1b: DUP3
00000c1c: AND
00000c1d: OR
00000c1e: DUP3
00000c1f: SSTORE
00000c20: SWAP6
00000c21: DUP2
00000c22: MSTORE
00000c23: PUSH1 0x05
00000c25: PUSH1 0x20
00000c27: SWAP1
00000c28: DUP2
00000c29: MSTORE
00000c2a: PUSH1 0x40
00000c2c: DUP1
00000c2d: DUP4
00000c2e: KECCAK256
00000c2f: DUP1
00000c30: SLOAD
00000c31: DUP10
00000c32: AND
00000c33: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00000c48: SWAP9
00000c49: DUP10
00000c4a: AND
00000c4b: OR
00000c4c: SWAP1
00000c4d: SSTORE
00000c4e: SWAP5
00000c4f: DUP7
00000c50: AND
00000c51: DUP3
00000c52: MSTORE
00000c53: PUSH1 0x03
00000c55: SWAP1
00000c56: MSTORE
00000c57: SWAP3
00000c58: SWAP1
00000c59: SWAP3
00000c5a: KECCAK256
00000c5b: DUP1
00000c5c: SLOAD
00000c5d: PUSH32 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00
00000c7e: AND
00000c7f: PUSH1 0x01
00000c81: SWAP1
00000c82: DUP2
00000c83: OR
00000c84: SWAP1
00000c85: SWAP2
00000c86: SSTORE
00000c87: DUP1
00000c88: SLOAD
00000c89: DUP6
00000c8a: AND
00000c8b: SWAP2
00000c8c: DUP5
00000c8d: AND
00000c8e: SWAP2
00000c8f: SWAP1
00000c90: SWAP2
00000c91: OR
00000c92: SWAP1
00000c93: SSTORE
00000c94: PUSH1 0x02
00000c96: DUP1
00000c97: SLOAD
00000c98: SWAP1
00000c99: SWAP4
00000c9a: AND
00000c9b: SWAP2
00000c9c: AND
00000c9d: OR
00000c9e: SWAP1
00000c9f: SSTORE
00000ca0: JUMP
00000ca1: JUMPDEST
00000ca2: CALLER
00000ca3: PUSH1 0x00
00000ca5: SWAP1
00000ca6: DUP2
00000ca7: MSTORE
00000ca8: PUSH1 0x03
00000caa: PUSH1 0x20
00000cac: MSTORE
00000cad: PUSH1 0x40
00000caf: SWAP1
00000cb0: KECCAK256
00000cb1: SLOAD
00000cb2: PUSH1 0xff
00000cb4: AND
00000cb5: DUP1
00000cb6: PUSH2 0x0cd6
00000cb9: JUMPI
00000cba: POP
00000cbb: PUSH1 0x01
00000cbd: SLOAD
00000cbe: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00000cd3: AND
00000cd4: CALLER
00000cd5: EQ
00000cd6: JUMPDEST
00000cd7: DUP1
00000cd8: PUSH2 0x0cf8
00000cdb: JUMPI
00000cdc: POP
00000cdd: PUSH1 0x02
00000cdf: SLOAD
00000ce0: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00000cf5: AND
00000cf6: CALLER
00000cf7: EQ
00000cf8: JUMPDEST
00000cf9: PUSH2 0x0d60
00000cfc: JUMPI
00000cfd: PUSH1 0x40
00000cff: MLOAD
00000d00: PUSH32 0x08c379a000000000000000000000000000000000000000000000000000000000
00000d21: DUP2
00000d22: MSTORE
00000d23: PUSH1 0x04
00000d25: ADD
00000d26: PUSH2 0x05a7
00000d29: SWAP1
00000d2a: PUSH1 0x20
00000d2c: DUP1
00000d2d: DUP3
00000d2e: MSTORE
00000d2f: PUSH1 0x04
00000d31: SWAP1
00000d32: DUP3
00000d33: ADD
00000d34: MSTORE
00000d35: PUSH32 0x216b657900000000000000000000000000000000000000000000000000000000
00000d56: PUSH1 0x40
00000d58: DUP3
00000d59: ADD
00000d5a: MSTORE
00000d5b: PUSH1 0x60
00000d5d: ADD
00000d5e: SWAP1
00000d5f: JUMP
00000d60: JUMPDEST
00000d61: PUSH2 0x0d69
00000d64: DUP4
00000d65: PUSH2 0x1695
00000d68: JUMP
00000d69: JUMPDEST
00000d6a: ISZERO
00000d6b: PUSH2 0x0dd2
00000d6e: JUMPI
00000d6f: PUSH1 0x40
00000d71: MLOAD
00000d72: PUSH32 0x08c379a000000000000000000000000000000000000000000000000000000000
00000d93: DUP2
00000d94: MSTORE
00000d95: PUSH1 0x04
00000d97: ADD
00000d98: PUSH2 0x05a7
00000d9b: SWAP1
00000d9c: PUSH1 0x20
00000d9e: DUP1
00000d9f: DUP3
00000da0: MSTORE
00000da1: PUSH1 0x04
00000da3: SWAP1
00000da4: DUP3
00000da5: ADD
00000da6: MSTORE
00000da7: PUSH32 0x7573656400000000000000000000000000000000000000000000000000000000
00000dc8: PUSH1 0x40
00000dca: DUP3
00000dcb: ADD
00000dcc: MSTORE
00000dcd: PUSH1 0x60
00000dcf: ADD
00000dd0: SWAP1
00000dd1: JUMP
00000dd2: JUMPDEST
00000dd3: ADDRESS
00000dd4: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00000de9: DUP8
00000dea: AND
00000deb: EQ
00000dec: PUSH2 0x0e51
00000def: JUMPI
00000df0: PUSH1 0x40
00000df2: MLOAD
00000df3: PUSH32 0x08c379a000000000000000000000000000000000000000000000000000000000
00000e14: DUP2
00000e15: MSTORE
00000e16: PUSH1 0x20
00000e18: PUSH1 0x04
00000e1a: DUP3
00000e1b: ADD
00000e1c: MSTORE
00000e1d: PUSH1 0x05
00000e1f: PUSH1 0x24
00000e21: DUP3
00000e22: ADD
00000e23: MSTORE
00000e24: PUSH32 0x2174686973000000000000000000000000000000000000000000000000000000
00000e45: PUSH1 0x44
00000e47: DUP3
00000e48: ADD
00000e49: MSTORE
00000e4a: PUSH1 0x64
00000e4c: ADD
00000e4d: PUSH2 0x05a7
00000e50: JUMP
00000e51: JUMPDEST
00000e52: PUSH1 0x00
00000e54: DUP7
00000e55: DUP7
00000e56: DUP7
00000e57: DUP7
00000e58: DUP7
00000e59: DUP7
00000e5a: PUSH1 0x40
00000e5c: MLOAD
00000e5d: PUSH1 0x20
00000e5f: ADD
00000e60: PUSH2 0x0e6e
00000e63: SWAP7
00000e64: SWAP6
00000e65: SWAP5
00000e66: SWAP4
00000e67: SWAP3
00000e68: SWAP2
00000e69: SWAP1
00000e6a: PUSH2 0x2d5d
00000e6d: JUMP
00000e6e: JUMPDEST
00000e6f: PUSH1 0x40
00000e71: MLOAD
00000e72: PUSH1 0x20
00000e74: DUP2
00000e75: DUP4
00000e76: SUB
00000e77: SUB
00000e78: DUP2
00000e79: MSTORE
00000e7a: SWAP1
00000e7b: PUSH1 0x40
00000e7d: MSTORE
00000e7e: DUP1
00000e7f: MLOAD
00000e80: SWAP1
00000e81: PUSH1 0x20
00000e83: ADD
00000e84: KECCAK256
00000e85: SWAP1
00000e86: POP
00000e87: PUSH1 0x00
00000e89: PUSH2 0x0f1e
00000e8c: PUSH2 0x0ee2
00000e8f: DUP4
00000e90: PUSH1 0x40
00000e92: MLOAD
00000e93: PUSH32 0x19457468657265756d205369676e6564204d6573736167653a0a333200000000
00000eb4: PUSH1 0x20
00000eb6: DUP3
00000eb7: ADD
00000eb8: MSTORE
00000eb9: PUSH1 0x3c
00000ebb: DUP2
00000ebc: ADD
00000ebd: DUP3
00000ebe: SWAP1
00000ebf: MSTORE
00000ec0: PUSH1 0x00
00000ec2: SWAP1
00000ec3: PUSH1 0x5c
00000ec5: ADD
00000ec6: PUSH1 0x40
00000ec8: MLOAD
00000ec9: PUSH1 0x20
00000ecb: DUP2
00000ecc: DUP4
00000ecd: SUB
00000ece: SUB
00000ecf: DUP2
00000ed0: MSTORE
00000ed1: SWAP1
00000ed2: PUSH1 0x40
00000ed4: MSTORE
00000ed5: DUP1
00000ed6: MLOAD
00000ed7: SWAP1
00000ed8: PUSH1 0x20
00000eda: ADD
00000edb: KECCAK256
00000edc: SWAP1
00000edd: POP
00000ede: SWAP2
00000edf: SWAP1
00000ee0: POP
00000ee1: JUMP
00000ee2: JUMPDEST
00000ee3: DUP12
00000ee4: DUP12
00000ee5: DUP1
00000ee6: DUP1
00000ee7: PUSH1 0x1f
00000ee9: ADD
00000eea: PUSH1 0x20
00000eec: DUP1
00000eed: SWAP2
00000eee: DIV
00000eef: MUL
00000ef0: PUSH1 0x20
00000ef2: ADD
00000ef3: PUSH1 0x40
00000ef5: MLOAD
00000ef6: SWAP1
00000ef7: DUP2
00000ef8: ADD
00000ef9: PUSH1 0x40
00000efb: MSTORE
00000efc: DUP1
00000efd: SWAP4
00000efe: SWAP3
00000eff: SWAP2
00000f00: SWAP1
00000f01: DUP2
00000f02: DUP2
00000f03: MSTORE
00000f04: PUSH1 0x20
00000f06: ADD
00000f07: DUP4
00000f08: DUP4
00000f09: DUP1
00000f0a: DUP3
00000f0b: DUP5
00000f0c: CALLDATACOPY
00000f0d: PUSH1 0x00
00000f0f: SWAP3
00000f10: ADD
00000f11: SWAP2
00000f12: SWAP1
00000f13: SWAP2
00000f14: MSTORE
00000f15: POP
00000f16: PUSH2 0x1a0d
00000f19: SWAP3
00000f1a: POP
00000f1b: POP
00000f1c: POP
00000f1d: JUMP
00000f1e: JUMPDEST
00000f1f: PUSH1 0x01
00000f21: SLOAD
00000f22: SWAP1
00000f23: SWAP2
00000f24: POP
00000f25: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00000f3a: DUP1
00000f3b: DUP4
00000f3c: AND
00000f3d: SWAP2
00000f3e: AND
00000f3f: EQ
00000f40: DUP1
00000f41: PUSH2 0x0f64
00000f44: JUMPI
00000f45: POP
00000f46: PUSH1 0x02
00000f48: SLOAD
00000f49: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00000f5e: DUP3
00000f5f: DUP2
00000f60: AND
00000f61: SWAP2
00000f62: AND
00000f63: EQ
00000f64: JUMPDEST
00000f65: DUP1
00000f66: ISZERO
00000f67: PUSH2 0x0f86
00000f6a: JUMPI
00000f6b: POP
00000f6c: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00000f81: DUP2
00000f82: AND
00000f83: CALLER
00000f84: EQ
00000f85: ISZERO
00000f86: JUMPDEST
00000f87: PUSH2 0x0fec
00000f8a: JUMPI
00000f8b: PUSH1 0x40
00000f8d: MLOAD
00000f8e: PUSH32 0x08c379a000000000000000000000000000000000000000000000000000000000
00000faf: DUP2
00000fb0: MSTORE
00000fb1: PUSH1 0x20
00000fb3: PUSH1 0x04
00000fb5: DUP3
00000fb6: ADD
00000fb7: MSTORE
00000fb8: PUSH1 0x0b
00000fba: PUSH1 0x24
00000fbc: DUP3
00000fbd: ADD
00000fbe: MSTORE
00000fbf: PUSH32 0x217369676e696e674b6579000000000000000000000000000000000000000000
00000fe0: PUSH1 0x44
00000fe2: DUP3
00000fe3: ADD
00000fe4: MSTORE
00000fe5: PUSH1 0x64
00000fe7: ADD
00000fe8: PUSH2 0x05a7
00000feb: JUMP
00000fec: JUMPDEST
00000fed: PUSH2 0x0ff5
00000ff0: DUP6
00000ff1: PUSH2 0x1aa2
00000ff4: JUMP
00000ff5: JUMPDEST
00000ff6: PUSH1 0x00
00000ff8: PUSH1 0x40
00000ffa: MLOAD
00000ffb: DUP1
00000ffc: PUSH1 0x80
00000ffe: ADD
00000fff: PUSH1 0x40
00001001: MSTORE
00001002: DUP1
00001003: DUP10
00001004: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00001019: AND
0000101a: DUP2
0000101b: MSTORE
0000101c: PUSH1 0x20
0000101e: ADD
0000101f: PUSH1 0x00
00001021: DUP2
00001022: MSTORE
00001023: PUSH1 0x20
00001025: ADD
00001026: DUP9
00001027: DUP2
00001028: MSTORE
00001029: PUSH1 0x20
0000102b: ADD
0000102c: DUP7
0000102d: DUP7
0000102e: DUP1
0000102f: DUP1
00001030: PUSH1 0x1f
00001032: ADD
00001033: PUSH1 0x20
00001035: DUP1
00001036: SWAP2
00001037: DIV
00001038: MUL
00001039: PUSH1 0x20
0000103b: ADD
0000103c: PUSH1 0x40
0000103e: MLOAD
0000103f: SWAP1
00001040: DUP2
00001041: ADD
00001042: PUSH1 0x40
00001044: MSTORE
00001045: DUP1
00001046: SWAP4
00001047: SWAP3
00001048: SWAP2
00001049: SWAP1
0000104a: DUP2
0000104b: DUP2
0000104c: MSTORE
0000104d: PUSH1 0x20
0000104f: ADD
00001050: DUP4
00001051: DUP4
00001052: DUP1
00001053: DUP3
00001054: DUP5
00001055: CALLDATACOPY
00001056: PUSH1 0x00
00001058: SWAP3
00001059: ADD
0000105a: SWAP2
0000105b: SWAP1
0000105c: SWAP2
0000105d: MSTORE
0000105e: POP
0000105f: POP
00001060: POP
00001061: SWAP2
00001062: MSTORE
00001063: POP
00001064: SWAP1
00001065: POP
00001066: PUSH2 0x106e
00001069: DUP2
0000106a: PUSH2 0x1b06
0000106d: JUMP
0000106e: JUMPDEST
0000106f: POP
00001070: POP
00001071: POP
00001072: POP
00001073: POP
00001074: POP
00001075: POP
00001076: POP
00001077: POP
00001078: POP
00001079: POP
0000107a: JUMP
0000107b: JUMPDEST
0000107c: PUSH1 0x00
0000107e: DUP1
0000107f: SLOAD
00001080: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00001095: AND
00001096: SWAP1
00001097: JUMPDEST
00001098: DUP3
00001099: DUP2
0000109a: LT
0000109b: ISZERO
0000109c: PUSH2 0x1109
0000109f: JUMPI
000010a0: PUSH2 0x10f7
000010a3: DUP5
000010a4: DUP5
000010a5: DUP4
000010a6: DUP2
000010a7: DUP2
000010a8: LT
000010a9: PUSH2 0x10db
000010ac: JUMPI
000010ad: PUSH32 0x4e487b7100000000000000000000000000000000000000000000000000000000
000010ce: PUSH1 0x00
000010d0: MSTORE
000010d1: PUSH1 0x32
000010d3: PUSH1 0x04
000010d5: MSTORE
000010d6: PUSH1 0x24
000010d8: PUSH1 0x00
000010da: REVERT
000010db: JUMPDEST
000010dc: SWAP1
000010dd: POP
000010de: PUSH1 0x60
000010e0: MUL
000010e1: ADD
000010e2: DUP1
000010e3: CALLDATASIZE
000010e4: SUB
000010e5: DUP2
000010e6: ADD
000010e7: SWAP1
000010e8: PUSH2 0x10f1
000010eb: SWAP2
000010ec: SWAP1
000010ed: PUSH2 0x2aeb
000010f0: JUMP
000010f1: JUMPDEST
000010f2: DUP4
000010f3: PUSH2 0x1d99
000010f6: JUMP
000010f7: JUMPDEST
000010f8: DUP1
000010f9: PUSH2 0x1101
000010fc: DUP2
000010fd: PUSH2 0x3025
00001100: JUMP
00001101: JUMPDEST
00001102: SWAP2
00001103: POP
00001104: POP
00001105: PUSH2 0x1097
00001108: JUMP
00001109: JUMPDEST
0000110a: POP
0000110b: POP
0000110c: POP
0000110d: POP
0000110e: JUMP
0000110f: JUMPDEST
00001110: CALLER
00001111: ADDRESS
00001112: EQ
00001113: PUSH2 0x1178
00001116: JUMPI
00001117: PUSH1 0x40
00001119: MLOAD
0000111a: PUSH32 0x08c379a000000000000000000000000000000000000000000000000000000000
0000113b: DUP2
0000113c: MSTORE
0000113d: PUSH1 0x20
0000113f: PUSH1 0x04
00001141: DUP3
00001142: ADD
00001143: MSTORE
00001144: PUSH1 0x07
00001146: PUSH1 0x24
00001148: DUP3
00001149: ADD
0000114a: MSTORE
0000114b: PUSH32 0x2177616c6c657400000000000000000000000000000000000000000000000000
0000116c: PUSH1 0x44
0000116e: DUP3
0000116f: ADD
00001170: MSTORE
00001171: PUSH1 0x64
00001173: ADD
00001174: PUSH2 0x05a7
00001177: JUMP
00001178: JUMPDEST
00001179: PUSH1 0x01
0000117b: DUP1
0000117c: SLOAD
0000117d: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00001192: DUP5
00001193: DUP2
00001194: AND
00001195: PUSH32 0xffffffffffffffffffffffff0000000000000000000000000000000000000000
000011b6: SWAP3
000011b7: DUP4
000011b8: AND
000011b9: DUP2
000011ba: OR
000011bb: SWAP1
000011bc: SWAP4
000011bd: SSTORE
000011be: PUSH1 0x02
000011c0: DUP1
000011c1: SLOAD
000011c2: SWAP2
000011c3: DUP6
000011c4: AND
000011c5: SWAP2
000011c6: SWAP1
000011c7: SWAP3
000011c8: AND
000011c9: DUP2
000011ca: OR
000011cb: SWAP1
000011cc: SWAP2
000011cd: SSTORE
000011ce: PUSH1 0x40
000011d0: DUP1
000011d1: MLOAD
000011d2: SWAP3
000011d3: DUP4
000011d4: MSTORE
000011d5: PUSH1 0x20
000011d7: DUP4
000011d8: ADD
000011d9: SWAP2
000011da: SWAP1
000011db: SWAP2
000011dc: MSTORE
000011dd: PUSH32 0x3f37fe575b78353c42326bf60f22f7bb524c0f8fddd82ef95a9a8305314b8d16
000011fe: SWAP2
000011ff: ADD
00001200: PUSH1 0x40
00001202: MLOAD
00001203: DUP1
00001204: SWAP2
00001205: SUB
00001206: SWAP1
00001207: LOG1
00001208: POP
00001209: POP
0000120a: JUMP
0000120b: JUMPDEST
0000120c: PUSH1 0x00
0000120e: DUP1
0000120f: SLOAD
00001210: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00001225: AND
00001226: SWAP1
00001227: JUMPDEST
00001228: DUP3
00001229: DUP2
0000122a: LT
0000122b: ISZERO
0000122c: PUSH2 0x1109
0000122f: JUMPI
00001230: PUSH2 0x1287
00001233: DUP5
00001234: DUP5
00001235: DUP4
00001236: DUP2
00001237: DUP2
00001238: LT
00001239: PUSH2 0x126b
0000123c: JUMPI
0000123d: PUSH32 0x4e487b7100000000000000000000000000000000000000000000000000000000
0000125e: PUSH1 0x00
00001260: MSTORE
00001261: PUSH1 0x32
00001263: PUSH1 0x04
00001265: MSTORE
00001266: PUSH1 0x24
00001268: PUSH1 0x00
0000126a: REVERT
0000126b: JUMPDEST
0000126c: SWAP1
0000126d: POP
0000126e: PUSH1 0x40
00001270: MUL
00001271: ADD
00001272: DUP1
00001273: CALLDATASIZE
00001274: SUB
00001275: DUP2
00001276: ADD
00001277: SWAP1
00001278: PUSH2 0x1281
0000127b: SWAP2
0000127c: SWAP1
0000127d: PUSH2 0x2b2e
00001280: JUMP
00001281: JUMPDEST
00001282: DUP4
00001283: PUSH2 0x1e5a
00001286: JUMP
00001287: JUMPDEST
00001288: DUP1
00001289: PUSH2 0x1291
0000128c: DUP2
0000128d: PUSH2 0x3025
00001290: JUMP
00001291: JUMPDEST
00001292: SWAP2
00001293: POP
00001294: POP
00001295: PUSH2 0x1227
00001298: JUMP
00001299: JUMPDEST
0000129a: PUSH1 0x00
0000129c: DUP3
0000129d: DUP2
0000129e: MSTORE
0000129f: PUSH1 0x05
000012a1: PUSH1 0x20
000012a3: MSTORE
000012a4: PUSH1 0x40
000012a6: DUP2
000012a7: KECCAK256
000012a8: SLOAD
000012a9: PUSH2 0x12ca
000012ac: SWAP1
000012ad: ADDRESS
000012ae: SWAP1
000012af: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
000012c4: AND
000012c5: DUP5
000012c6: PUSH2 0x1f3d
000012c9: JUMP
000012ca: JUMPDEST
000012cb: SWAP4
000012cc: SWAP3
000012cd: POP
000012ce: POP
000012cf: POP
000012d0: JUMP
000012d1: JUMPDEST
000012d2: PUSH1 0x00
000012d4: DUP3
000012d5: DUP2
000012d6: MSTORE
000012d7: PUSH1 0x05
000012d9: PUSH1 0x20
000012db: MSTORE
000012dc: PUSH1 0x40
000012de: DUP2
000012df: KECCAK256
000012e0: SLOAD
000012e1: PUSH2 0x1300
000012e4: SWAP1
000012e5: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
000012fa: AND
000012fb: DUP4
000012fc: PUSH2 0x2040
000012ff: JUMP
00001300: JUMPDEST
00001301: PUSH1 0x40
00001303: MLOAD
00001304: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00001319: DUP3
0000131a: AND
0000131b: DUP2
0000131c: MSTORE
0000131d: SWAP1
0000131e: SWAP2
0000131f: POP
00001320: PUSH32 0xa252ab3a674b76566f9e239fcb0c4d97619af93efaa36e7b5090d50223074e71
00001341: SWAP1
00001342: PUSH1 0x20
00001344: ADD
00001345: PUSH1 0x40
00001347: MLOAD
00001348: DUP1
00001349: SWAP2
0000134a: SUB
0000134b: SWAP1
0000134c: LOG1
0000134d: SWAP3
0000134e: SWAP2
0000134f: POP
00001350: POP
00001351: JUMP
00001352: JUMPDEST
00001353: CALLER
00001354: PUSH1 0x00
00001356: SWAP1
00001357: DUP2
00001358: MSTORE
00001359: PUSH1 0x03
0000135b: PUSH1 0x20
0000135d: MSTORE
0000135e: PUSH1 0x40
00001360: SWAP1
00001361: KECCAK256
00001362: SLOAD
00001363: PUSH1 0xff
00001365: AND
00001366: PUSH2 0x13cb
00001369: JUMPI
0000136a: PUSH1 0x40
0000136c: MLOAD
0000136d: PUSH32 0x08c379a000000000000000000000000000000000000000000000000000000000
0000138e: DUP2
0000138f: MSTORE
00001390: PUSH1 0x20
00001392: PUSH1 0x04
00001394: DUP3
00001395: ADD
00001396: MSTORE
00001397: PUSH1 0x08
00001399: PUSH1 0x24
0000139b: DUP3
0000139c: ADD
0000139d: MSTORE
0000139e: PUSH32 0x2168656e65736973000000000000000000000000000000000000000000000000
000013bf: PUSH1 0x44
000013c1: DUP3
000013c2: ADD
000013c3: MSTORE
000013c4: PUSH1 0x64
000013c6: ADD
000013c7: PUSH2 0x05a7
000013ca: JUMP
000013cb: JUMPDEST
000013cc: PUSH1 0x00
000013ce: JUMPDEST
000013cf: DUP2
000013d0: DUP2
000013d1: LT
000013d2: ISZERO
000013d3: PUSH2 0x0a14
000013d6: JUMPI
000013d7: CALLER
000013d8: DUP4
000013d9: DUP4
000013da: DUP4
000013db: DUP2
000013dc: DUP2
000013dd: LT
000013de: PUSH2 0x1410
000013e1: JUMPI
000013e2: PUSH32 0x4e487b7100000000000000000000000000000000000000000000000000000000
00001403: PUSH1 0x00
00001405: MSTORE
00001406: PUSH1 0x32
00001408: PUSH1 0x04
0000140a: MSTORE
0000140b: PUSH1 0x24
0000140d: PUSH1 0x00
0000140f: REVERT
00001410: JUMPDEST
00001411: SWAP1
00001412: POP
00001413: PUSH1 0x20
00001415: MUL
00001416: ADD
00001417: PUSH1 0x20
00001419: DUP2
0000141a: ADD
0000141b: SWAP1
0000141c: PUSH2 0x1425
0000141f: SWAP2
00001420: SWAP1
00001421: PUSH2 0x2859
00001424: JUMP
00001425: JUMPDEST
00001426: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
0000143b: AND
0000143c: EQ
0000143d: ISZERO
0000143e: PUSH2 0x14a3
00001441: JUMPI
00001442: PUSH1 0x40
00001444: MLOAD
00001445: PUSH32 0x08c379a000000000000000000000000000000000000000000000000000000000
00001466: DUP2
00001467: MSTORE
00001468: PUSH1 0x20
0000146a: PUSH1 0x04
0000146c: DUP3
0000146d: ADD
0000146e: MSTORE
0000146f: PUSH1 0x12
00001471: PUSH1 0x24
00001473: DUP3
00001474: ADD
00001475: MSTORE
00001476: PUSH32 0x63616e6e6f742072656d6f76652073656c660000000000000000000000000000
00001497: PUSH1 0x44
00001499: DUP3
0000149a: ADD
0000149b: MSTORE
0000149c: PUSH1 0x64
0000149e: ADD
0000149f: PUSH2 0x05a7
000014a2: JUMP
000014a3: JUMPDEST
000014a4: PUSH1 0x00
000014a6: PUSH1 0x03
000014a8: PUSH1 0x00
000014aa: DUP6
000014ab: DUP6
000014ac: DUP6
000014ad: DUP2
000014ae: DUP2
000014af: LT
000014b0: PUSH2 0x14e2
000014b3: JUMPI
000014b4: PUSH32 0x4e487b7100000000000000000000000000000000000000000000000000000000
000014d5: PUSH1 0x00
000014d7: MSTORE
000014d8: PUSH1 0x32
000014da: PUSH1 0x04
000014dc: MSTORE
000014dd: PUSH1 0x24
000014df: PUSH1 0x00
000014e1: REVERT
000014e2: JUMPDEST
000014e3: SWAP1
000014e4: POP
000014e5: PUSH1 0x20
000014e7: MUL
000014e8: ADD
000014e9: PUSH1 0x20
000014eb: DUP2
000014ec: ADD
000014ed: SWAP1
000014ee: PUSH2 0x14f7
000014f1: SWAP2
000014f2: SWAP1
000014f3: PUSH2 0x2859
000014f6: JUMP
000014f7: JUMPDEST
000014f8: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
0000150d: AND
0000150e: DUP2
0000150f: MSTORE
00001510: PUSH1 0x20
00001512: DUP2
00001513: ADD
00001514: SWAP2
00001515: SWAP1
00001516: SWAP2
00001517: MSTORE
00001518: PUSH1 0x40
0000151a: ADD
0000151b: PUSH1 0x00
0000151d: KECCAK256
0000151e: DUP1
0000151f: SLOAD
00001520: PUSH32 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00
00001541: AND
00001542: SWAP2
00001543: ISZERO
00001544: ISZERO
00001545: SWAP2
00001546: SWAP1
00001547: SWAP2
00001548: OR
00001549: SWAP1
0000154a: SSTORE
0000154b: PUSH32 0x9f0aae703cf989b5f0793abb586d06d76abced8c38edde4fc03ba565220b759f
0000156c: DUP4
0000156d: DUP4
0000156e: DUP4
0000156f: DUP2
00001570: DUP2
00001571: LT
00001572: PUSH2 0x15a4
00001575: JUMPI
00001576: PUSH32 0x4e487b7100000000000000000000000000000000000000000000000000000000
00001597: PUSH1 0x00
00001599: MSTORE
0000159a: PUSH1 0x32
0000159c: PUSH1 0x04
0000159e: MSTORE
0000159f: PUSH1 0x24
000015a1: PUSH1 0x00
000015a3: REVERT
000015a4: JUMPDEST
000015a5: SWAP1
000015a6: POP
000015a7: PUSH1 0x20
000015a9: MUL
000015aa: ADD
000015ab: PUSH1 0x20
000015ad: DUP2
000015ae: ADD
000015af: SWAP1
000015b0: PUSH2 0x15b9
000015b3: SWAP2
000015b4: SWAP1
000015b5: PUSH2 0x2859
000015b8: JUMP
000015b9: JUMPDEST
000015ba: PUSH1 0x40
000015bc: MLOAD
000015bd: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
000015d2: SWAP1
000015d3: SWAP2
000015d4: AND
000015d5: DUP2
000015d6: MSTORE
000015d7: PUSH1 0x20
000015d9: ADD
000015da: PUSH1 0x40
000015dc: MLOAD
000015dd: DUP1
000015de: SWAP2
000015df: SUB
000015e0: SWAP1
000015e1: LOG1
000015e2: DUP1
000015e3: PUSH2 0x15eb
000015e6: DUP2
000015e7: PUSH2 0x3025
000015ea: JUMP
000015eb: JUMPDEST
000015ec: SWAP2
000015ed: POP
000015ee: POP
000015ef: PUSH2 0x13ce
000015f2: JUMP
000015f3: JUMPDEST
000015f4: CALLER
000015f5: ADDRESS
000015f6: EQ
000015f7: PUSH2 0x165c
000015fa: JUMPI
000015fb: PUSH1 0x40
000015fd: MLOAD
000015fe: PUSH32 0x08c379a000000000000000000000000000000000000000000000000000000000
0000161f: DUP2
00001620: MSTORE
00001621: PUSH1 0x20
00001623: PUSH1 0x04
00001625: DUP3
00001626: ADD
00001627: MSTORE
00001628: PUSH1 0x07
0000162a: PUSH1 0x24
0000162c: DUP3
0000162d: ADD
0000162e: MSTORE
0000162f: PUSH32 0x2177616c6c657400000000000000000000000000000000000000000000000000
00001650: PUSH1 0x44
00001652: DUP3
00001653: ADD
00001654: MSTORE
00001655: PUSH1 0x64
00001657: ADD
00001658: PUSH2 0x05a7
0000165b: JUMP
0000165c: JUMPDEST
0000165d: PUSH1 0x40
0000165f: DUP1
00001660: MLOAD
00001661: PUSH1 0x60
00001663: DUP2
00001664: ADD
00001665: DUP3
00001666: MSTORE
00001667: PUSH1 0x00
00001669: DUP2
0000166a: MSTORE
0000166b: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00001680: DUP5
00001681: AND
00001682: PUSH1 0x20
00001684: DUP3
00001685: ADD
00001686: MSTORE
00001687: SWAP1
00001688: DUP2
00001689: ADD
0000168a: DUP3
0000168b: SWAP1
0000168c: MSTORE
0000168d: PUSH2 0x0a14
00001690: DUP2
00001691: PUSH2 0x20b7
00001694: JUMP
00001695: JUMPDEST
00001696: PUSH1 0x00
00001698: DUP1
00001699: PUSH2 0x16a1
0000169c: DUP4
0000169d: PUSH2 0x22e7
000016a0: JUMP
000016a1: JUMPDEST
000016a2: PUSH1 0x20
000016a4: DUP1
000016a5: DUP3
000016a6: ADD
000016a7: MLOAD
000016a8: SWAP2
000016a9: MLOAD
000016aa: PUSH31 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
000016ca: AND
000016cb: PUSH1 0x00
000016cd: SWAP1
000016ce: DUP2
000016cf: MSTORE
000016d0: PUSH1 0x04
000016d2: SWAP1
000016d3: SWAP2
000016d4: MSTORE
000016d5: PUSH1 0x40
000016d7: SWAP1
000016d8: KECCAK256
000016d9: SLOAD
000016da: PUSH1 0x01
000016dc: PUSH1 0xff
000016de: SWAP1
000016df: SWAP3
000016e0: AND
000016e1: SWAP2
000016e2: SWAP1
000016e3: SWAP2
000016e4: SHL
000016e5: SWAP1
000016e6: DUP2
000016e7: AND
000016e8: EQ
000016e9: SWAP4
000016ea: SWAP3
000016eb: POP
000016ec: POP
000016ed: POP
000016ee: JUMP
000016ef: JUMPDEST
000016f0: CALLER
000016f1: PUSH1 0x00
000016f3: SWAP1
000016f4: DUP2
000016f5: MSTORE
000016f6: PUSH1 0x03
000016f8: PUSH1 0x20
000016fa: MSTORE
000016fb: PUSH1 0x40
000016fd: SWAP1
000016fe: KECCAK256
000016ff: SLOAD
00001700: PUSH1 0xff
00001702: AND
00001703: PUSH2 0x1768
00001706: JUMPI
00001707: PUSH1 0x40
00001709: MLOAD
0000170a: PUSH32 0x08c379a000000000000000000000000000000000000000000000000000000000
0000172b: DUP2
0000172c: MSTORE
0000172d: PUSH1 0x20
0000172f: PUSH1 0x04
00001731: DUP3
00001732: ADD
00001733: MSTORE
00001734: PUSH1 0x08
00001736: PUSH1 0x24
00001738: DUP3
00001739: ADD
0000173a: MSTORE
0000173b: PUSH32 0x2168656e65736973000000000000000000000000000000000000000000000000
0000175c: PUSH1 0x44
0000175e: DUP3
0000175f: ADD
00001760: MSTORE
00001761: PUSH1 0x64
00001763: ADD
00001764: PUSH2 0x05a7
00001767: JUMP
00001768: JUMPDEST
00001769: PUSH1 0x00
0000176b: JUMPDEST
0000176c: DUP2
0000176d: DUP2
0000176e: LT
0000176f: ISZERO
00001770: PUSH2 0x0a14
00001773: JUMPI
00001774: PUSH1 0x01
00001776: PUSH1 0x03
00001778: PUSH1 0x00
0000177a: DUP6
0000177b: DUP6
0000177c: DUP6
0000177d: DUP2
0000177e: DUP2
0000177f: LT
00001780: PUSH2 0x17b2
00001783: JUMPI
00001784: PUSH32 0x4e487b7100000000000000000000000000000000000000000000000000000000
000017a5: PUSH1 0x00
000017a7: MSTORE
000017a8: PUSH1 0x32
000017aa: PUSH1 0x04
000017ac: MSTORE
000017ad: PUSH1 0x24
000017af: PUSH1 0x00
000017b1: REVERT
000017b2: JUMPDEST
000017b3: SWAP1
000017b4: POP
000017b5: PUSH1 0x20
000017b7: MUL
000017b8: ADD
000017b9: PUSH1 0x20
000017bb: DUP2
000017bc: ADD
000017bd: SWAP1
000017be: PUSH2 0x17c7
000017c1: SWAP2
000017c2: SWAP1
000017c3: PUSH2 0x2859
000017c6: JUMP
000017c7: JUMPDEST
000017c8: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
000017dd: AND
000017de: DUP2
000017df: MSTORE
000017e0: PUSH1 0x20
000017e2: DUP2
000017e3: ADD
000017e4: SWAP2
000017e5: SWAP1
000017e6: SWAP2
000017e7: MSTORE
000017e8: PUSH1 0x40
000017ea: ADD
000017eb: PUSH1 0x00
000017ed: KECCAK256
000017ee: DUP1
000017ef: SLOAD
000017f0: PUSH32 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00
00001811: AND
00001812: SWAP2
00001813: ISZERO
00001814: ISZERO
00001815: SWAP2
00001816: SWAP1
00001817: SWAP2
00001818: OR
00001819: SWAP1
0000181a: SSTORE
0000181b: PUSH32 0x4c95871bcdf03605f6f937dba7a5cff42b90c873a094e9a36a24bd64ccea28a2
0000183c: DUP4
0000183d: DUP4
0000183e: DUP4
0000183f: DUP2
00001840: DUP2
00001841: LT
00001842: PUSH2 0x1874
00001845: JUMPI
00001846: PUSH32 0x4e487b7100000000000000000000000000000000000000000000000000000000
00001867: PUSH1 0x00
00001869: MSTORE
0000186a: PUSH1 0x32
0000186c: PUSH1 0x04
0000186e: MSTORE
0000186f: PUSH1 0x24
00001871: PUSH1 0x00
00001873: REVERT
00001874: JUMPDEST
00001875: SWAP1
00001876: POP
00001877: PUSH1 0x20
00001879: MUL
0000187a: ADD
0000187b: PUSH1 0x20
0000187d: DUP2
0000187e: ADD
0000187f: SWAP1
00001880: PUSH2 0x1889
00001883: SWAP2
00001884: SWAP1
00001885: PUSH2 0x2859
00001888: JUMP
00001889: JUMPDEST
0000188a: PUSH1 0x40
0000188c: MLOAD
0000188d: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
000018a2: SWAP1
000018a3: SWAP2
000018a4: AND
000018a5: DUP2
000018a6: MSTORE
000018a7: PUSH1 0x20
000018a9: ADD
000018aa: PUSH1 0x40
000018ac: MLOAD
000018ad: DUP1
000018ae: SWAP2
000018af: SUB
000018b0: SWAP1
000018b1: LOG1
000018b2: DUP1
000018b3: PUSH2 0x18bb
000018b6: DUP2
000018b7: PUSH2 0x3025
000018ba: JUMP
000018bb: JUMPDEST
000018bc: SWAP2
000018bd: POP
000018be: POP
000018bf: PUSH2 0x176b
000018c2: JUMP
000018c3: JUMPDEST
000018c4: CALLER
000018c5: ADDRESS
000018c6: EQ
000018c7: PUSH2 0x192c
000018ca: JUMPI
000018cb: PUSH1 0x40
000018cd: MLOAD
000018ce: PUSH32 0x08c379a000000000000000000000000000000000000000000000000000000000
000018ef: DUP2
000018f0: MSTORE
000018f1: PUSH1 0x20
000018f3: PUSH1 0x04
000018f5: DUP3
000018f6: ADD
000018f7: MSTORE
000018f8: PUSH1 0x07
000018fa: PUSH1 0x24
000018fc: DUP3
000018fd: ADD
000018fe: MSTORE
000018ff: PUSH32 0x2177616c6c657400000000000000000000000000000000000000000000000000
00001920: PUSH1 0x44
00001922: DUP3
00001923: ADD
00001924: MSTORE
00001925: PUSH1 0x64
00001927: ADD
00001928: PUSH2 0x05a7
0000192b: JUMP
0000192c: JUMPDEST
0000192d: PUSH1 0x40
0000192f: DUP1
00001930: MLOAD
00001931: PUSH1 0x60
00001933: DUP2
00001934: ADD
00001935: DUP3
00001936: MSTORE
00001937: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
0000194c: DUP1
0000194d: DUP7
0000194e: AND
0000194f: DUP3
00001950: MSTORE
00001951: DUP5
00001952: AND
00001953: PUSH1 0x20
00001955: DUP3
00001956: ADD
00001957: MSTORE
00001958: SWAP1
00001959: DUP2
0000195a: ADD
0000195b: DUP3
0000195c: SWAP1
0000195d: MSTORE
0000195e: PUSH2 0x1109
00001961: DUP2
00001962: PUSH2 0x20b7
00001965: JUMP
00001966: JUMPDEST
00001967: PUSH1 0x60
00001969: PUSH1 0x00
0000196b: JUMPDEST
0000196c: DUP3
0000196d: MLOAD
0000196e: DUP2
0000196f: LT
00001970: ISZERO
00001971: PUSH2 0x1a07
00001974: JUMPI
00001975: PUSH1 0x00
00001977: DUP4
00001978: DUP3
00001979: DUP2
0000197a: MLOAD
0000197b: DUP2
0000197c: LT
0000197d: PUSH2 0x19af
00001980: JUMPI
00001981: PUSH32 0x4e487b7100000000000000000000000000000000000000000000000000000000
000019a2: PUSH1 0x00
000019a4: MSTORE
000019a5: PUSH1 0x32
000019a7: PUSH1 0x04
000019a9: MSTORE
000019aa: PUSH1 0x24
000019ac: PUSH1 0x00
000019ae: REVERT
000019af: JUMPDEST
000019b0: PUSH1 0x20
000019b2: MUL
000019b3: PUSH1 0x20
000019b5: ADD
000019b6: ADD
000019b7: MLOAD
000019b8: SWAP1
000019b9: POP
000019ba: DUP3
000019bb: DUP2
000019bc: PUSH1 0x00
000019be: ADD
000019bf: MLOAD
000019c0: DUP3
000019c1: PUSH1 0x20
000019c3: ADD
000019c4: MLOAD
000019c5: DUP4
000019c6: PUSH1 0x40
000019c8: ADD
000019c9: MLOAD
000019ca: DUP5
000019cb: PUSH1 0x60
000019cd: ADD
000019ce: MLOAD
000019cf: PUSH1 0x40
000019d1: MLOAD
000019d2: PUSH1 0x20
000019d4: ADD
000019d5: PUSH2 0x19e2
000019d8: SWAP6
000019d9: SWAP5
000019da: SWAP4
000019db: SWAP3
000019dc: SWAP2
000019dd: SWAP1
000019de: PUSH2 0x2e26
000019e1: JUMP
000019e2: JUMPDEST
000019e3: PUSH1 0x40
000019e5: MLOAD
000019e6: PUSH1 0x20
000019e8: DUP2
000019e9: DUP4
000019ea: SUB
000019eb: SUB
000019ec: DUP2
000019ed: MSTORE
000019ee: SWAP1
000019ef: PUSH1 0x40
000019f1: MSTORE
000019f2: SWAP3
000019f3: POP
000019f4: POP
000019f5: DUP1
000019f6: DUP1
000019f7: PUSH2 0x19ff
000019fa: SWAP1
000019fb: PUSH2 0x3025
000019fe: JUMP
000019ff: JUMPDEST
00001a00: SWAP2
00001a01: POP
00001a02: POP
00001a03: PUSH2 0x196b
00001a06: JUMP
00001a07: JUMPDEST
00001a08: POP
00001a09: SWAP2
00001a0a: SWAP1
00001a0b: POP
00001a0c: JUMP
00001a0d: JUMPDEST
00001a0e: PUSH1 0x00
00001a10: DUP2
00001a11: MLOAD
00001a12: PUSH1 0x41
00001a14: EQ
00001a15: PUSH2 0x1a7a
00001a18: JUMPI
00001a19: PUSH1 0x40
00001a1b: MLOAD
00001a1c: PUSH32 0x08c379a000000000000000000000000000000000000000000000000000000000
00001a3d: DUP2
00001a3e: MSTORE
00001a3f: PUSH1 0x20
00001a41: PUSH1 0x04
00001a43: DUP3
00001a44: ADD
00001a45: MSTORE
00001a46: PUSH1 0x1f
00001a48: PUSH1 0x24
00001a4a: DUP3
00001a4b: ADD
00001a4c: MSTORE
00001a4d: PUSH32 0x45434453413a20696e76616c6964207369676e6174757265206c656e67746800
00001a6e: PUSH1 0x44
00001a70: DUP3
00001a71: ADD
00001a72: MSTORE
00001a73: PUSH1 0x64
00001a75: ADD
00001a76: PUSH2 0x05a7
00001a79: JUMP
00001a7a: JUMPDEST
00001a7b: PUSH1 0x20
00001a7d: DUP3
00001a7e: ADD
00001a7f: MLOAD
00001a80: PUSH1 0x40
00001a82: DUP4
00001a83: ADD
00001a84: MLOAD
00001a85: PUSH1 0x60
00001a87: DUP5
00001a88: ADD
00001a89: MLOAD
00001a8a: PUSH1 0x00
00001a8c: BYTE
00001a8d: PUSH2 0x1a98
00001a90: DUP7
00001a91: DUP3
00001a92: DUP6
00001a93: DUP6
00001a94: PUSH2 0x2343
00001a97: JUMP
00001a98: JUMPDEST
00001a99: SWAP7
00001a9a: SWAP6
00001a9b: POP
00001a9c: POP
00001a9d: POP
00001a9e: POP
00001a9f: POP
00001aa0: POP
00001aa1: JUMP
00001aa2: JUMPDEST
00001aa3: PUSH1 0x00
00001aa5: PUSH2 0x1aad
00001aa8: DUP3
00001aa9: PUSH2 0x22e7
00001aac: JUMP
00001aad: JUMPDEST
00001aae: PUSH1 0x20
00001ab0: DUP2
00001ab1: DUP2
00001ab2: ADD
00001ab3: MLOAD
00001ab4: DUP3
00001ab5: MLOAD
00001ab6: PUSH31 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
00001ad6: SWAP1
00001ad7: DUP2
00001ad8: AND
00001ad9: PUSH1 0x00
00001adb: SWAP1
00001adc: DUP2
00001add: MSTORE
00001ade: PUSH1 0x04
00001ae0: SWAP1
00001ae1: SWAP4
00001ae2: MSTORE
00001ae3: PUSH1 0x40
00001ae5: DUP1
00001ae6: DUP5
00001ae7: KECCAK256
00001ae8: SLOAD
00001ae9: SWAP5
00001aea: MLOAD
00001aeb: SWAP1
00001aec: SWAP2
00001aed: AND
00001aee: DUP4
00001aef: MSTORE
00001af0: SWAP1
00001af1: SWAP2
00001af2: KECCAK256
00001af3: PUSH1 0x01
00001af5: PUSH1 0xff
00001af7: SWAP1
00001af8: SWAP3
00001af9: AND
00001afa: SWAP2
00001afb: SWAP1
00001afc: SWAP2
00001afd: SHL
00001afe: SWAP1
00001aff: SWAP2
00001b00: OR
00001b01: SWAP1
00001b02: SSTORE
00001b03: POP
00001b04: POP
00001b05: JUMP
00001b06: JUMPDEST
00001b07: PUSH1 0x00
00001b09: DUP2
00001b0a: PUSH1 0x20
00001b0c: ADD
00001b0d: MLOAD
00001b0e: PUSH1 0x00
00001b10: EQ
00001b11: PUSH2 0x1b1e
00001b14: JUMPI
00001b15: DUP2
00001b16: PUSH1 0x20
00001b18: ADD
00001b19: MLOAD
00001b1a: PUSH2 0x1b20
00001b1d: JUMP
00001b1e: JUMPDEST
00001b1f: GAS
00001b20: JUMPDEST
00001b21: SWAP1
00001b22: POP
00001b23: PUSH1 0x00
00001b25: DUP1
00001b26: DUP4
00001b27: PUSH1 0x00
00001b29: ADD
00001b2a: MLOAD
00001b2b: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00001b40: AND
00001b41: DUP4
00001b42: DUP6
00001b43: PUSH1 0x40
00001b45: ADD
00001b46: MLOAD
00001b47: DUP7
00001b48: PUSH1 0x60
00001b4a: ADD
00001b4b: MLOAD
00001b4c: PUSH1 0x40
00001b4e: MLOAD
00001b4f: PUSH2 0x1b58
00001b52: SWAP2
00001b53: SWAP1
00001b54: PUSH2 0x2e0a
00001b57: JUMP
00001b58: JUMPDEST
00001b59: PUSH1 0x00
00001b5b: PUSH1 0x40
00001b5d: MLOAD
00001b5e: DUP1
00001b5f: DUP4
00001b60: SUB
00001b61: DUP2
00001b62: DUP6
00001b63: DUP9
00001b64: DUP9
00001b65: CALL
00001b66: SWAP4
00001b67: POP
00001b68: POP
00001b69: POP
00001b6a: POP
00001b6b: RETURNDATASIZE
00001b6c: DUP1
00001b6d: PUSH1 0x00
00001b6f: DUP2
00001b70: EQ
00001b71: PUSH2 0x1b96
00001b74: JUMPI
00001b75: PUSH1 0x40
00001b77: MLOAD
00001b78: SWAP2
00001b79: POP
00001b7a: PUSH1 0x1f
00001b7c: NOT
00001b7d: PUSH1 0x3f
00001b7f: RETURNDATASIZE
00001b80: ADD
00001b81: AND
00001b82: DUP3
00001b83: ADD
00001b84: PUSH1 0x40
00001b86: MSTORE
00001b87: RETURNDATASIZE
00001b88: DUP3
00001b89: MSTORE
00001b8a: RETURNDATASIZE
00001b8b: PUSH1 0x00
00001b8d: PUSH1 0x20
00001b8f: DUP5
00001b90: ADD
00001b91: RETURNDATACOPY
00001b92: PUSH2 0x1b9b
00001b95: JUMP
00001b96: JUMPDEST
00001b97: PUSH1 0x60
00001b99: SWAP2
00001b9a: POP
00001b9b: JUMPDEST
00001b9c: POP
00001b9d: SWAP2
00001b9e: POP
00001b9f: SWAP2
00001ba0: POP
00001ba1: DUP2
00001ba2: ISZERO
00001ba3: PUSH2 0x1bf4
00001ba6: JUMPI
00001ba7: PUSH32 0xfb2d80a8c1584ec3d6857239d88e150a9185f820e45c4ef06369e4b03f9bdc15
00001bc8: DUP5
00001bc9: PUSH1 0x00
00001bcb: ADD
00001bcc: MLOAD
00001bcd: DUP6
00001bce: PUSH1 0x40
00001bd0: ADD
00001bd1: MLOAD
00001bd2: DUP7
00001bd3: PUSH1 0x60
00001bd5: ADD
00001bd6: MLOAD
00001bd7: DUP5
00001bd8: PUSH1 0x40
00001bda: MLOAD
00001bdb: PUSH2 0x1be7
00001bde: SWAP5
00001bdf: SWAP4
00001be0: SWAP3
00001be1: SWAP2
00001be2: SWAP1
00001be3: PUSH2 0x2e93
00001be6: JUMP
00001be7: JUMPDEST
00001be8: PUSH1 0x40
00001bea: MLOAD
00001beb: DUP1
00001bec: SWAP2
00001bed: SUB
00001bee: SWAP1
00001bef: LOG1
00001bf0: PUSH2 0x1109
00001bf3: JUMP
00001bf4: JUMPDEST
00001bf5: PUSH32 0xf4c3da4067612daed1743cb9ea6c4563a562398f91a9b438f9c46fe2d4f2f7da
00001c16: DUP5
00001c17: PUSH1 0x00
00001c19: ADD
00001c1a: MLOAD
00001c1b: DUP6
00001c1c: PUSH1 0x40
00001c1e: ADD
00001c1f: MLOAD
00001c20: DUP7
00001c21: PUSH1 0x60
00001c23: ADD
00001c24: MLOAD
00001c25: DUP5
00001c26: PUSH1 0x40
00001c28: MLOAD
00001c29: PUSH2 0x1c35
00001c2c: SWAP5
00001c2d: SWAP4
00001c2e: SWAP3
00001c2f: SWAP2
00001c30: SWAP1
00001c31: PUSH2 0x2e93
00001c34: JUMP
00001c35: JUMPDEST
00001c36: PUSH1 0x40
00001c38: MLOAD
00001c39: DUP1
00001c3a: SWAP2
00001c3b: SUB
00001c3c: SWAP1
00001c3d: LOG1
00001c3e: POP
00001c3f: POP
00001c40: POP
00001c41: POP
00001c42: JUMP
00001c43: JUMPDEST
00001c44: DUP1
00001c45: MLOAD
00001c46: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00001c5b: AND
00001c5c: PUSH2 0x1cbf
00001c5f: JUMPI
00001c60: DUP1
00001c61: PUSH1 0x20
00001c63: ADD
00001c64: MLOAD
00001c65: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00001c7a: AND
00001c7b: DUP2
00001c7c: PUSH1 0x40
00001c7e: ADD
00001c7f: MLOAD
00001c80: PUSH1 0x40
00001c82: MLOAD
00001c83: PUSH1 0x00
00001c85: PUSH1 0x40
00001c87: MLOAD
00001c88: DUP1
00001c89: DUP4
00001c8a: SUB
00001c8b: DUP2
00001c8c: DUP6
00001c8d: DUP8
00001c8e: GAS
00001c8f: CALL
00001c90: SWAP3
00001c91: POP
00001c92: POP
00001c93: POP
00001c94: RETURNDATASIZE
00001c95: DUP1
00001c96: PUSH1 0x00
00001c98: DUP2
00001c99: EQ
00001c9a: PUSH2 0x1109
00001c9d: JUMPI
00001c9e: PUSH1 0x40
00001ca0: MLOAD
00001ca1: SWAP2
00001ca2: POP
00001ca3: PUSH1 0x1f
00001ca5: NOT
00001ca6: PUSH1 0x3f
00001ca8: RETURNDATASIZE
00001ca9: ADD
00001caa: AND
00001cab: DUP3
00001cac: ADD
00001cad: PUSH1 0x40
00001caf: MSTORE
00001cb0: RETURNDATASIZE
00001cb1: DUP3
00001cb2: MSTORE
00001cb3: RETURNDATASIZE
00001cb4: PUSH1 0x00
00001cb6: PUSH1 0x20
00001cb8: DUP5
00001cb9: ADD
00001cba: RETURNDATACOPY
00001cbb: PUSH2 0x1109
00001cbe: JUMP
00001cbf: JUMPDEST
00001cc0: DUP1
00001cc1: MLOAD
00001cc2: PUSH1 0x20
00001cc4: DUP1
00001cc5: DUP4
00001cc6: ADD
00001cc7: MLOAD
00001cc8: PUSH1 0x40
00001cca: DUP1
00001ccb: DUP6
00001ccc: ADD
00001ccd: MLOAD
00001cce: DUP2
00001ccf: MLOAD
00001cd0: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00001ce5: SWAP4
00001ce6: DUP5
00001ce7: AND
00001ce8: PUSH1 0x24
00001cea: DUP3
00001ceb: ADD
00001cec: MSTORE
00001ced: PUSH1 0x44
00001cef: DUP1
00001cf0: DUP3
00001cf1: ADD
00001cf2: SWAP3
00001cf3: SWAP1
00001cf4: SWAP3
00001cf5: MSTORE
00001cf6: DUP3
00001cf7: MLOAD
00001cf8: DUP1
00001cf9: DUP3
00001cfa: SUB
00001cfb: SWAP1
00001cfc: SWAP3
00001cfd: ADD
00001cfe: DUP3
00001cff: MSTORE
00001d00: PUSH1 0x64
00001d02: ADD
00001d03: DUP3
00001d04: MSTORE
00001d05: SWAP3
00001d06: DUP4
00001d07: ADD
00001d08: DUP1
00001d09: MLOAD
00001d0a: PUSH28 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffff
00001d27: AND
00001d28: PUSH32 0xa9059cbb00000000000000000000000000000000000000000000000000000000
00001d49: OR
00001d4a: SWAP1
00001d4b: MSTORE
00001d4c: MLOAD
00001d4d: SWAP3
00001d4e: AND
00001d4f: SWAP2
00001d50: PUSH2 0x1d59
00001d53: SWAP2
00001d54: SWAP1
00001d55: PUSH2 0x2e0a
00001d58: JUMP
00001d59: JUMPDEST
00001d5a: PUSH1 0x00
00001d5c: PUSH1 0x40
00001d5e: MLOAD
00001d5f: DUP1
00001d60: DUP4
00001d61: SUB
00001d62: DUP2
00001d63: PUSH1 0x00
00001d65: DUP7
00001d66: GAS
00001d67: CALL
00001d68: SWAP2
00001d69: POP
00001d6a: POP
00001d6b: RETURNDATASIZE
00001d6c: DUP1
00001d6d: PUSH1 0x00
00001d6f: DUP2
00001d70: EQ
00001d71: PUSH2 0x1109
00001d74: JUMPI
00001d75: PUSH1 0x40
00001d77: MLOAD
00001d78: SWAP2
00001d79: POP
00001d7a: PUSH1 0x1f
00001d7c: NOT
00001d7d: PUSH1 0x3f
00001d7f: RETURNDATASIZE
00001d80: ADD
00001d81: AND
00001d82: DUP3
00001d83: ADD
00001d84: PUSH1 0x40
00001d86: MSTORE
00001d87: RETURNDATASIZE
00001d88: DUP3
00001d89: MSTORE
00001d8a: RETURNDATASIZE
00001d8b: PUSH1 0x00
00001d8d: PUSH1 0x20
00001d8f: DUP5
00001d90: ADD
00001d91: RETURNDATACOPY
00001d92: PUSH2 0x1109
00001d95: JUMP
00001d96: JUMPDEST
00001d97: POP
00001d98: JUMP
00001d99: JUMPDEST
00001d9a: PUSH1 0x20
00001d9c: DUP1
00001d9d: DUP4
00001d9e: ADD
00001d9f: MLOAD
00001da0: PUSH1 0x00
00001da2: SWAP1
00001da3: DUP2
00001da4: MSTORE
00001da5: PUSH1 0x05
00001da7: SWAP1
00001da8: SWAP2
00001da9: MSTORE
00001daa: PUSH1 0x40
00001dac: DUP1
00001dad: DUP3
00001dae: KECCAK256
00001daf: SLOAD
00001db0: SWAP1
00001db1: DUP5
00001db2: ADD
00001db3: MLOAD
00001db4: PUSH2 0x1dd7
00001db7: SWAP2
00001db8: ADDRESS
00001db9: SWAP2
00001dba: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00001dcf: SWAP1
00001dd0: SWAP2
00001dd1: AND
00001dd2: SWAP1
00001dd3: PUSH2 0x1f3d
00001dd6: JUMP
00001dd7: JUMPDEST
00001dd8: PUSH1 0x20
00001dda: DUP1
00001ddb: DUP6
00001ddc: ADD
00001ddd: MLOAD
00001dde: PUSH1 0x00
00001de0: SWAP1
00001de1: DUP2
00001de2: MSTORE
00001de3: PUSH1 0x05
00001de5: SWAP1
00001de6: SWAP2
00001de7: MSTORE
00001de8: PUSH1 0x40
00001dea: SWAP1
00001deb: KECCAK256
00001dec: SLOAD
00001ded: SWAP1
00001dee: SWAP2
00001def: POP
00001df0: PUSH2 0x1e0f
00001df3: SWAP1
00001df4: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00001e09: AND
00001e0a: DUP3
00001e0b: PUSH2 0x259b
00001e0e: JUMP
00001e0f: JUMPDEST
00001e10: PUSH2 0x1e27
00001e13: JUMPI
00001e14: PUSH2 0x1e25
00001e17: DUP4
00001e18: PUSH1 0x20
00001e1a: ADD
00001e1b: MLOAD
00001e1c: DUP5
00001e1d: PUSH1 0x40
00001e1f: ADD
00001e20: MLOAD
00001e21: PUSH2 0x12d1
00001e24: JUMP
00001e25: JUMPDEST
00001e26: POP
00001e27: JUMPDEST
00001e28: PUSH1 0x40
00001e2a: DUP1
00001e2b: MLOAD
00001e2c: DUP1
00001e2d: DUP3
00001e2e: ADD
00001e2f: SWAP1
00001e30: SWAP2
00001e31: MSTORE
00001e32: DUP4
00001e33: MLOAD
00001e34: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00001e49: SWAP1
00001e4a: DUP2
00001e4b: AND
00001e4c: DUP3
00001e4d: MSTORE
00001e4e: DUP3
00001e4f: AND
00001e50: PUSH1 0x20
00001e52: DUP3
00001e53: ADD
00001e54: MSTORE
00001e55: PUSH2 0x1109
00001e58: DUP2
00001e59: DUP5
00001e5a: JUMPDEST
00001e5b: PUSH1 0x20
00001e5d: DUP3
00001e5e: DUP2
00001e5f: ADD
00001e60: MLOAD
00001e61: DUP4
00001e62: MLOAD
00001e63: PUSH1 0x40
00001e65: DUP1
00001e66: MLOAD
00001e67: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00001e7c: SWAP3
00001e7d: DUP4
00001e7e: AND
00001e7f: PUSH1 0x24
00001e81: DUP3
00001e82: ADD
00001e83: MSTORE
00001e84: DUP6
00001e85: DUP4
00001e86: AND
00001e87: PUSH1 0x44
00001e89: DUP1
00001e8a: DUP4
00001e8b: ADD
00001e8c: SWAP2
00001e8d: SWAP1
00001e8e: SWAP2
00001e8f: MSTORE
00001e90: DUP3
00001e91: MLOAD
00001e92: DUP1
00001e93: DUP4
00001e94: SUB
00001e95: SWAP1
00001e96: SWAP2
00001e97: ADD
00001e98: DUP2
00001e99: MSTORE
00001e9a: PUSH1 0x64
00001e9c: SWAP1
00001e9d: SWAP2
00001e9e: ADD
00001e9f: DUP3
00001ea0: MSTORE
00001ea1: SWAP4
00001ea2: DUP5
00001ea3: ADD
00001ea4: DUP1
00001ea5: MLOAD
00001ea6: PUSH28 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffff
00001ec3: AND
00001ec4: PUSH32 0x9cfddc3600000000000000000000000000000000000000000000000000000000
00001ee5: OR
00001ee6: SWAP1
00001ee7: MSTORE
00001ee8: MLOAD
00001ee9: SWAP2
00001eea: AND
00001eeb: SWAP2
00001eec: PUSH2 0x1ef4
00001eef: SWAP2
00001ef0: PUSH2 0x2e0a
00001ef3: JUMP
00001ef4: JUMPDEST
00001ef5: PUSH1 0x00
00001ef7: PUSH1 0x40
00001ef9: MLOAD
00001efa: DUP1
00001efb: DUP4
00001efc: SUB
00001efd: DUP2
00001efe: PUSH1 0x00
00001f00: DUP7
00001f01: GAS
00001f02: CALL
00001f03: SWAP2
00001f04: POP
00001f05: POP
00001f06: RETURNDATASIZE
00001f07: DUP1
00001f08: PUSH1 0x00
00001f0a: DUP2
00001f0b: EQ
00001f0c: PUSH2 0x1f31
00001f0f: JUMPI
00001f10: PUSH1 0x40
00001f12: MLOAD
00001f13: SWAP2
00001f14: POP
00001f15: PUSH1 0x1f
00001f17: NOT
00001f18: PUSH1 0x3f
00001f1a: RETURNDATASIZE
00001f1b: ADD
00001f1c: AND
00001f1d: DUP3
00001f1e: ADD
00001f1f: PUSH1 0x40
00001f21: MSTORE
00001f22: RETURNDATASIZE
00001f23: DUP3
00001f24: MSTORE
00001f25: RETURNDATASIZE
00001f26: PUSH1 0x00
00001f28: PUSH1 0x20
00001f2a: DUP5
00001f2b: ADD
00001f2c: RETURNDATACOPY
00001f2d: PUSH2 0x1f36
00001f30: JUMP
00001f31: JUMPDEST
00001f32: PUSH1 0x60
00001f34: SWAP2
00001f35: POP
00001f36: JUMPDEST
00001f37: POP
00001f38: POP
00001f39: POP
00001f3a: POP
00001f3b: POP
00001f3c: JUMP
00001f3d: JUMPDEST
00001f3e: PUSH1 0x40
00001f40: MLOAD
00001f41: PUSH32 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000
00001f62: DUP2
00001f63: MSTORE
00001f64: PUSH1 0x60
00001f66: DUP4
00001f67: SWAP1
00001f68: SHL
00001f69: PUSH1 0x14
00001f6b: DUP3
00001f6c: ADD
00001f6d: DUP2
00001f6e: SWAP1
00001f6f: MSTORE
00001f70: PUSH32 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000
00001f91: PUSH1 0x28
00001f93: DUP4
00001f94: ADD
00001f95: MSTORE
00001f96: PUSH1 0x37
00001f98: SWAP1
00001f99: SWAP2
00001f9a: KECCAK256
00001f9b: PUSH1 0x00
00001f9d: SWAP2
00001f9e: SWAP1
00001f9f: PUSH2 0x1a98
00001fa2: DUP5
00001fa3: DUP3
00001fa4: DUP9
00001fa5: PUSH1 0x40
00001fa7: DUP1
00001fa8: MLOAD
00001fa9: PUSH32 0xff00000000000000000000000000000000000000000000000000000000000000
00001fca: PUSH1 0x20
00001fcc: DUP1
00001fcd: DUP4
00001fce: ADD
00001fcf: SWAP2
00001fd0: SWAP1
00001fd1: SWAP2
00001fd2: MSTORE
00001fd3: PUSH1 0x60
00001fd5: SWAP4
00001fd6: SWAP1
00001fd7: SWAP4
00001fd8: SHL
00001fd9: PUSH32 0xffffffffffffffffffffffffffffffffffffffff000000000000000000000000
00001ffa: AND
00001ffb: PUSH1 0x21
00001ffd: DUP3
00001ffe: ADD
00001fff: MSTORE
00002000: PUSH1 0x35
00002002: DUP2
00002003: ADD
00002004: SWAP5
00002005: SWAP1
00002006: SWAP5
00002007: MSTORE
00002008: PUSH1 0x55
0000200a: DUP1
0000200b: DUP6
0000200c: ADD
0000200d: SWAP4
0000200e: SWAP1
0000200f: SWAP4
00002010: MSTORE
00002011: DUP1
00002012: MLOAD
00002013: DUP1
00002014: DUP6
00002015: SUB
00002016: SWAP1
00002017: SWAP4
00002018: ADD
00002019: DUP4
0000201a: MSTORE
0000201b: PUSH1 0x75
0000201d: SWAP1
0000201e: SWAP4
0000201f: ADD
00002020: SWAP1
00002021: SWAP3
00002022: MSTORE
00002023: DUP1
00002024: MLOAD
00002025: SWAP2
00002026: ADD
00002027: KECCAK256
00002028: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
0000203d: AND
0000203e: SWAP1
0000203f: JUMP
00002040: JUMPDEST
00002041: PUSH1 0x00
00002043: DUP1
00002044: DUP4
00002045: PUSH1 0x60
00002047: SHL
00002048: SWAP1
00002049: POP
0000204a: PUSH1 0x40
0000204c: MLOAD
0000204d: PUSH32 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000
0000206e: DUP2
0000206f: MSTORE
00002070: DUP2
00002071: PUSH1 0x14
00002073: DUP3
00002074: ADD
00002075: MSTORE
00002076: PUSH32 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000
00002097: PUSH1 0x28
00002099: DUP3
0000209a: ADD
0000209b: MSTORE
0000209c: DUP4
0000209d: PUSH1 0x37
0000209f: DUP3
000020a0: PUSH1 0x00
000020a2: CREATE2
000020a3: SWAP1
000020a4: POP
000020a5: DUP1
000020a6: EXTCODESIZE
000020a7: PUSH2 0x20af
000020aa: JUMPI
000020ab: PUSH1 0x00
000020ad: DUP1
000020ae: REVERT
000020af: JUMPDEST
000020b0: SWAP5
000020b1: SWAP4
000020b2: POP
000020b3: POP
000020b4: POP
000020b5: POP
000020b6: JUMP
000020b7: JUMPDEST
000020b8: DUP1
000020b9: MLOAD
000020ba: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
000020cf: AND
000020d0: PUSH2 0x21a9
000020d3: JUMPI
000020d4: PUSH1 0x00
000020d6: DUP2
000020d7: PUSH1 0x20
000020d9: ADD
000020da: MLOAD
000020db: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
000020f0: AND
000020f1: DUP3
000020f2: PUSH1 0x40
000020f4: ADD
000020f5: MLOAD
000020f6: PUSH1 0x40
000020f8: MLOAD
000020f9: PUSH1 0x00
000020fb: PUSH1 0x40
000020fd: MLOAD
000020fe: DUP1
000020ff: DUP4
00002100: SUB
00002101: DUP2
00002102: DUP6
00002103: DUP8
00002104: GAS
00002105: CALL
00002106: SWAP3
00002107: POP
00002108: POP
00002109: POP
0000210a: RETURNDATASIZE
0000210b: DUP1
0000210c: PUSH1 0x00
0000210e: DUP2
0000210f: EQ
00002110: PUSH2 0x2135
00002113: JUMPI
00002114: PUSH1 0x40
00002116: MLOAD
00002117: SWAP2
00002118: POP
00002119: PUSH1 0x1f
0000211b: NOT
0000211c: PUSH1 0x3f
0000211e: RETURNDATASIZE
0000211f: ADD
00002120: AND
00002121: DUP3
00002122: ADD
00002123: PUSH1 0x40
00002125: MSTORE
00002126: RETURNDATASIZE
00002127: DUP3
00002128: MSTORE
00002129: RETURNDATASIZE
0000212a: PUSH1 0x00
0000212c: PUSH1 0x20
0000212e: DUP5
0000212f: ADD
00002130: RETURNDATACOPY
00002131: PUSH2 0x213a
00002134: JUMP
00002135: JUMPDEST
00002136: PUSH1 0x60
00002138: SWAP2
00002139: POP
0000213a: JUMPDEST
0000213b: POP
0000213c: POP
0000213d: SWAP1
0000213e: POP
0000213f: DUP1
00002140: PUSH2 0x21a5
00002143: JUMPI
00002144: PUSH1 0x40
00002146: MLOAD
00002147: PUSH32 0x08c379a000000000000000000000000000000000000000000000000000000000
00002168: DUP2
00002169: MSTORE
0000216a: PUSH1 0x20
0000216c: PUSH1 0x04
0000216e: DUP3
0000216f: ADD
00002170: MSTORE
00002171: PUSH1 0x09
00002173: PUSH1 0x24
00002175: DUP3
00002176: ADD
00002177: MSTORE
00002178: PUSH32 0x217472616e736665720000000000000000000000000000000000000000000000
00002199: PUSH1 0x44
0000219b: DUP3
0000219c: ADD
0000219d: MSTORE
0000219e: PUSH1 0x64
000021a0: ADD
000021a1: PUSH2 0x05a7
000021a4: JUMP
000021a5: JUMPDEST
000021a6: POP
000021a7: POP
000021a8: JUMP
000021a9: JUMPDEST
000021aa: DUP1
000021ab: MLOAD
000021ac: PUSH1 0x20
000021ae: DUP3
000021af: ADD
000021b0: MLOAD
000021b1: PUSH1 0x40
000021b3: DUP1
000021b4: DUP5
000021b5: ADD
000021b6: MLOAD
000021b7: SWAP1
000021b8: MLOAD
000021b9: PUSH1 0x00
000021bb: SWAP4
000021bc: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
000021d1: AND
000021d2: SWAP3
000021d3: PUSH32 0xa9059cbb00000000000000000000000000000000000000000000000000000000
000021f4: SWAP3
000021f5: PUSH2 0x2221
000021f8: SWAP3
000021f9: PUSH1 0x24
000021fb: ADD
000021fc: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00002211: SWAP3
00002212: SWAP1
00002213: SWAP3
00002214: AND
00002215: DUP3
00002216: MSTORE
00002217: PUSH1 0x20
00002219: DUP3
0000221a: ADD
0000221b: MSTORE
0000221c: PUSH1 0x40
0000221e: ADD
0000221f: SWAP1
00002220: JUMP
00002221: JUMPDEST
00002222: PUSH1 0x40
00002224: DUP1
00002225: MLOAD
00002226: PUSH32 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0
00002247: DUP2
00002248: DUP5
00002249: SUB
0000224a: ADD
0000224b: DUP2
0000224c: MSTORE
0000224d: SWAP2
0000224e: DUP2
0000224f: MSTORE
00002250: PUSH1 0x20
00002252: DUP3
00002253: ADD
00002254: DUP1
00002255: MLOAD
00002256: PUSH28 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffff
00002273: AND
00002274: PUSH32 0xffffffff00000000000000000000000000000000000000000000000000000000
00002295: SWAP1
00002296: SWAP5
00002297: AND
00002298: SWAP4
00002299: SWAP1
0000229a: SWAP4
0000229b: OR
0000229c: SWAP1
0000229d: SWAP3
0000229e: MSTORE
0000229f: SWAP1
000022a0: MLOAD
000022a1: PUSH2 0x22aa
000022a4: SWAP2
000022a5: SWAP1
000022a6: PUSH2 0x2e0a
000022a9: JUMP
000022aa: JUMPDEST
000022ab: PUSH1 0x00
000022ad: PUSH1 0x40
000022af: MLOAD
000022b0: DUP1
000022b1: DUP4
000022b2: SUB
000022b3: DUP2
000022b4: PUSH1 0x00
000022b6: DUP7
000022b7: GAS
000022b8: CALL
000022b9: SWAP2
000022ba: POP
000022bb: POP
000022bc: RETURNDATASIZE
000022bd: DUP1
000022be: PUSH1 0x00
000022c0: DUP2
000022c1: EQ
000022c2: PUSH2 0x2135
000022c5: JUMPI
000022c6: PUSH1 0x40
000022c8: MLOAD
000022c9: SWAP2
000022ca: POP
000022cb: PUSH1 0x1f
000022cd: NOT
000022ce: PUSH1 0x3f
000022d0: RETURNDATASIZE
000022d1: ADD
000022d2: AND
000022d3: DUP3
000022d4: ADD
000022d5: PUSH1 0x40
000022d7: MSTORE
000022d8: RETURNDATASIZE
000022d9: DUP3
000022da: MSTORE
000022db: RETURNDATASIZE
000022dc: PUSH1 0x00
000022de: PUSH1 0x20
000022e0: DUP5
000022e1: ADD
000022e2: RETURNDATACOPY
000022e3: PUSH2 0x213a
000022e6: JUMP
000022e7: JUMPDEST
000022e8: PUSH1 0x40
000022ea: DUP1
000022eb: MLOAD
000022ec: DUP1
000022ed: DUP3
000022ee: ADD
000022ef: SWAP1
000022f0: SWAP2
000022f1: MSTORE
000022f2: PUSH1 0x00
000022f4: DUP1
000022f5: DUP3
000022f6: MSTORE
000022f7: PUSH1 0x20
000022f9: DUP3
000022fa: ADD
000022fb: MSTORE
000022fc: PUSH2 0x2307
000022ff: PUSH2 0x0100
00002302: DUP4
00002303: PUSH2 0x2fc6
00002306: JUMP
00002307: JUMPDEST
00002308: PUSH31 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
00002328: AND
00002329: DUP2
0000232a: MSTORE
0000232b: PUSH2 0x2336
0000232e: PUSH2 0x0100
00002331: DUP4
00002332: PUSH2 0x3083
00002335: JUMP
00002336: JUMPDEST
00002337: PUSH1 0xff
00002339: AND
0000233a: PUSH1 0x20
0000233c: DUP3
0000233d: ADD
0000233e: MSTORE
0000233f: SWAP2
00002340: SWAP1
00002341: POP
00002342: JUMP
00002343: JUMPDEST
00002344: PUSH1 0x00
00002346: PUSH32 0x7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0
00002367: DUP3
00002368: GT
00002369: ISZERO
0000236a: PUSH2 0x23f5
0000236d: JUMPI
0000236e: PUSH1 0x40
00002370: MLOAD
00002371: PUSH32 0x08c379a000000000000000000000000000000000000000000000000000000000
00002392: DUP2
00002393: MSTORE
00002394: PUSH1 0x20
00002396: PUSH1 0x04
00002398: DUP3
00002399: ADD
0000239a: MSTORE
0000239b: PUSH1 0x22
0000239d: PUSH1 0x24
0000239f: DUP3
000023a0: ADD
000023a1: MSTORE
000023a2: PUSH32 0x45434453413a20696e76616c6964207369676e6174757265202773272076616c
000023c3: PUSH1 0x44
000023c5: DUP3
000023c6: ADD
000023c7: MSTORE
000023c8: PUSH32 0x7565000000000000000000000000000000000000000000000000000000000000
000023e9: PUSH1 0x64
000023eb: DUP3
000023ec: ADD
000023ed: MSTORE
000023ee: PUSH1 0x84
000023f0: ADD
000023f1: PUSH2 0x05a7
000023f4: JUMP
000023f5: JUMPDEST
000023f6: DUP4
000023f7: PUSH1 0xff
000023f9: AND
000023fa: PUSH1 0x1b
000023fc: EQ
000023fd: DUP1
000023fe: PUSH2 0x240a
00002401: JUMPI
00002402: POP
00002403: DUP4
00002404: PUSH1 0xff
00002406: AND
00002407: PUSH1 0x1c
00002409: EQ
0000240a: JUMPDEST
0000240b: PUSH2 0x2496
0000240e: JUMPI
0000240f: PUSH1 0x40
00002411: MLOAD
00002412: PUSH32 0x08c379a000000000000000000000000000000000000000000000000000000000
00002433: DUP2
00002434: MSTORE
00002435: PUSH1 0x20
00002437: PUSH1 0x04
00002439: DUP3
0000243a: ADD
0000243b: MSTORE
0000243c: PUSH1 0x22
0000243e: PUSH1 0x24
00002440: DUP3
00002441: ADD
00002442: MSTORE
00002443: PUSH32 0x45434453413a20696e76616c6964207369676e6174757265202776272076616c
00002464: PUSH1 0x44
00002466: DUP3
00002467: ADD
00002468: MSTORE
00002469: PUSH32 0x7565000000000000000000000000000000000000000000000000000000000000
0000248a: PUSH1 0x64
0000248c: DUP3
0000248d: ADD
0000248e: MSTORE
0000248f: PUSH1 0x84
00002491: ADD
00002492: PUSH2 0x05a7
00002495: JUMP
00002496: JUMPDEST
00002497: PUSH1 0x40
00002499: DUP1
0000249a: MLOAD
0000249b: PUSH1 0x00
0000249d: DUP1
0000249e: DUP3
0000249f: MSTORE
000024a0: PUSH1 0x20
000024a2: DUP3
000024a3: ADD
000024a4: DUP1
000024a5: DUP5
000024a6: MSTORE
000024a7: DUP9
000024a8: SWAP1
000024a9: MSTORE
000024aa: PUSH1 0xff
000024ac: DUP8
000024ad: AND
000024ae: SWAP3
000024af: DUP3
000024b0: ADD
000024b1: SWAP3
000024b2: SWAP1
000024b3: SWAP3
000024b4: MSTORE
000024b5: PUSH1 0x60
000024b7: DUP2
000024b8: ADD
000024b9: DUP6
000024ba: SWAP1
000024bb: MSTORE
000024bc: PUSH1 0x80
000024be: DUP2
000024bf: ADD
000024c0: DUP5
000024c1: SWAP1
000024c2: MSTORE
000024c3: PUSH1 0x01
000024c5: SWAP1
000024c6: PUSH1 0xa0
000024c8: ADD
000024c9: PUSH1 0x20
000024cb: PUSH1 0x40
000024cd: MLOAD
000024ce: PUSH1 0x20
000024d0: DUP2
000024d1: SUB
000024d2: SWAP1
000024d3: DUP1
000024d4: DUP5
000024d5: SUB
000024d6: SWAP1
000024d7: DUP6
000024d8: GAS
000024d9: STATICCALL
000024da: ISZERO
000024db: DUP1
000024dc: ISZERO
000024dd: PUSH2 0x24ea
000024e0: JUMPI
000024e1: RETURNDATASIZE
000024e2: PUSH1 0x00
000024e4: DUP1
000024e5: RETURNDATACOPY
000024e6: RETURNDATASIZE
000024e7: PUSH1 0x00
000024e9: REVERT
000024ea: JUMPDEST
000024eb: POP
000024ec: POP
000024ed: PUSH1 0x40
000024ef: MLOAD
000024f0: PUSH32 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0
00002511: ADD
00002512: MLOAD
00002513: SWAP2
00002514: POP
00002515: POP
00002516: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
0000252b: DUP2
0000252c: AND
0000252d: PUSH2 0x2592
00002530: JUMPI
00002531: PUSH1 0x40
00002533: MLOAD
00002534: PUSH32 0x08c379a000000000000000000000000000000000000000000000000000000000
00002555: DUP2
00002556: MSTORE
00002557: PUSH1 0x20
00002559: PUSH1 0x04
0000255b: DUP3
0000255c: ADD
0000255d: MSTORE
0000255e: PUSH1 0x18
00002560: PUSH1 0x24
00002562: DUP3
00002563: ADD
00002564: MSTORE
00002565: PUSH32 0x45434453413a20696e76616c6964207369676e61747572650000000000000000
00002586: PUSH1 0x44
00002588: DUP3
00002589: ADD
0000258a: MSTORE
0000258b: PUSH1 0x64
0000258d: ADD
0000258e: PUSH2 0x05a7
00002591: JUMP
00002592: JUMPDEST
00002593: SWAP6
00002594: SWAP5
00002595: POP
00002596: POP
00002597: POP
00002598: POP
00002599: POP
0000259a: JUMP
0000259b: JUMPDEST
0000259c: PUSH1 0x00
0000259e: DUP1
0000259f: DUP4
000025a0: PUSH1 0x60
000025a2: SHL
000025a3: SWAP1
000025a4: POP
000025a5: PUSH1 0x40
000025a7: MLOAD
000025a8: PUSH32 0x363d3d373d3d3d363d7300000000000000000000000000000000000000000000
000025c9: DUP2
000025ca: MSTORE
000025cb: DUP2
000025cc: PUSH1 0x0a
000025ce: DUP3
000025cf: ADD
000025d0: MSTORE
000025d1: PUSH32 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000
000025f2: PUSH1 0x1e
000025f4: DUP3
000025f5: ADD
000025f6: MSTORE
000025f7: PUSH1 0x40
000025f9: DUP2
000025fa: ADD
000025fb: PUSH1 0x2d
000025fd: PUSH1 0x00
000025ff: DUP3
00002600: DUP8
00002601: EXTCODECOPY
00002602: PUSH1 0x0d
00002604: DUP2
00002605: ADD
00002606: MLOAD
00002607: PUSH1 0x0d
00002609: DUP4
0000260a: ADD
0000260b: MLOAD
0000260c: EQ
0000260d: DUP2
0000260e: MLOAD
0000260f: DUP4
00002610: MLOAD
00002611: EQ
00002612: AND
00002613: SWAP4
00002614: POP
00002615: POP
00002616: POP
00002617: POP
00002618: SWAP3
00002619: SWAP2
0000261a: POP
0000261b: POP
0000261c: JUMP
0000261d: JUMPDEST
0000261e: PUSH1 0x00
00002620: PUSH8 0xffffffffffffffff
00002629: DUP1
0000262a: DUP5
0000262b: GT
0000262c: ISZERO
0000262d: PUSH2 0x2638
00002630: JUMPI
00002631: PUSH2 0x2638
00002634: PUSH2 0x30c6
00002637: JUMP
00002638: JUMPDEST
00002639: DUP4
0000263a: PUSH1 0x05
0000263c: SHL
0000263d: PUSH1 0x20
0000263f: PUSH2 0x2649
00002642: DUP2
00002643: DUP4
00002644: ADD
00002645: PUSH2 0x2f77
00002648: JUMP
00002649: JUMPDEST
0000264a: DUP7
0000264b: DUP2
0000264c: MSTORE
0000264d: SWAP4
0000264e: POP
0000264f: DUP1
00002650: DUP5
00002651: ADD
00002652: DUP6
00002653: DUP4
00002654: DUP2
00002655: ADD
00002656: DUP10
00002657: LT
00002658: ISZERO
00002659: PUSH2 0x2661
0000265c: JUMPI
0000265d: PUSH1 0x00
0000265f: DUP1
00002660: REVERT
00002661: JUMPDEST
00002662: PUSH1 0x00
00002664: SWAP4
00002665: POP
00002666: DUP4
00002667: JUMPDEST
00002668: DUP9
00002669: DUP2
0000266a: LT
0000266b: ISZERO
0000266c: PUSH2 0x269c
0000266f: JUMPI
00002670: DUP2
00002671: CALLDATALOAD
00002672: DUP7
00002673: DUP2
00002674: GT
00002675: ISZERO
00002676: PUSH2 0x267d
00002679: JUMPI
0000267a: DUP6
0000267b: DUP7
0000267c: REVERT
0000267d: JUMPDEST
0000267e: PUSH2 0x2689
00002681: DUP12
00002682: DUP3
00002683: DUP12
00002684: ADD
00002685: PUSH2 0x2776
00002688: JUMP
00002689: JUMPDEST
0000268a: DUP5
0000268b: MSTORE
0000268c: POP
0000268d: SWAP2
0000268e: DUP4
0000268f: ADD
00002690: SWAP2
00002691: SWAP1
00002692: DUP4
00002693: ADD
00002694: SWAP1
00002695: PUSH1 0x01
00002697: ADD
00002698: PUSH2 0x2667
0000269b: JUMP
0000269c: JUMPDEST
0000269d: POP
0000269e: POP
0000269f: POP
000026a0: POP
000026a1: POP
000026a2: POP
000026a3: SWAP4
000026a4: SWAP3
000026a5: POP
000026a6: POP
000026a7: POP
000026a8: JUMP
000026a9: JUMPDEST
000026aa: PUSH1 0x00
000026ac: DUP1
000026ad: DUP4
000026ae: PUSH1 0x1f
000026b0: DUP5
000026b1: ADD
000026b2: SLT
000026b3: PUSH2 0x26ba
000026b6: JUMPI
000026b7: DUP2
000026b8: DUP3
000026b9: REVERT
000026ba: JUMPDEST
000026bb: POP
000026bc: DUP2
000026bd: CALLDATALOAD
000026be: PUSH8 0xffffffffffffffff
000026c7: DUP2
000026c8: GT
000026c9: ISZERO
000026ca: PUSH2 0x26d1
000026cd: JUMPI
000026ce: DUP2
000026cf: DUP3
000026d0: REVERT
000026d1: JUMPDEST
000026d2: PUSH1 0x20
000026d4: DUP4
000026d5: ADD
000026d6: SWAP2
000026d7: POP
000026d8: DUP4
000026d9: PUSH1 0x20
000026db: DUP3
000026dc: PUSH1 0x05
000026de: SHL
000026df: DUP6
000026e0: ADD
000026e1: ADD
000026e2: GT
000026e3: ISZERO
000026e4: PUSH2 0x26ec
000026e7: JUMPI
000026e8: PUSH1 0x00
000026ea: DUP1
000026eb: REVERT
000026ec: JUMPDEST
000026ed: SWAP3
000026ee: POP
000026ef: SWAP3
000026f0: SWAP1
000026f1: POP
000026f2: JUMP
000026f3: JUMPDEST
000026f4: PUSH1 0x00
000026f6: DUP1
000026f7: DUP4
000026f8: PUSH1 0x1f
000026fa: DUP5
000026fb: ADD
000026fc: SLT
000026fd: PUSH2 0x2704
00002700: JUMPI
00002701: DUP2
00002702: DUP3
00002703: REVERT
00002704: JUMPDEST
00002705: POP
00002706: DUP2
00002707: CALLDATALOAD
00002708: PUSH8 0xffffffffffffffff
00002711: DUP2
00002712: GT
00002713: ISZERO
00002714: PUSH2 0x271b
00002717: JUMPI
00002718: DUP2
00002719: DUP3
0000271a: REVERT
0000271b: JUMPDEST
0000271c: PUSH1 0x20
0000271e: DUP4
0000271f: ADD
00002720: SWAP2
00002721: POP
00002722: DUP4
00002723: PUSH1 0x20
00002725: PUSH1 0x60
00002727: DUP4
00002728: MUL
00002729: DUP6
0000272a: ADD
0000272b: ADD
0000272c: GT
0000272d: ISZERO
0000272e: PUSH2 0x26ec
00002731: JUMPI
00002732: PUSH1 0x00
00002734: DUP1
00002735: REVERT
00002736: JUMPDEST
00002737: PUSH1 0x00
00002739: DUP1
0000273a: DUP4
0000273b: PUSH1 0x1f
0000273d: DUP5
0000273e: ADD
0000273f: SLT
00002740: PUSH2 0x2747
00002743: JUMPI
00002744: DUP2
00002745: DUP3
00002746: REVERT
00002747: JUMPDEST
00002748: POP
00002749: DUP2
0000274a: CALLDATALOAD
0000274b: PUSH8 0xffffffffffffffff
00002754: DUP2
00002755: GT
00002756: ISZERO
00002757: PUSH2 0x275e
0000275a: JUMPI
0000275b: DUP2
0000275c: DUP3
0000275d: REVERT
0000275e: JUMPDEST
0000275f: PUSH1 0x20
00002761: DUP4
00002762: ADD
00002763: SWAP2
00002764: POP
00002765: DUP4
00002766: PUSH1 0x20
00002768: DUP3
00002769: DUP6
0000276a: ADD
0000276b: ADD
0000276c: GT
0000276d: ISZERO
0000276e: PUSH2 0x26ec
00002771: JUMPI
00002772: PUSH1 0x00
00002774: DUP1
00002775: REVERT
00002776: JUMPDEST
00002777: PUSH1 0x00
00002779: PUSH1 0x80
0000277b: DUP3
0000277c: DUP5
0000277d: SUB
0000277e: SLT
0000277f: ISZERO
00002780: PUSH2 0x2787
00002783: JUMPI
00002784: DUP1
00002785: DUP2
00002786: REVERT
00002787: JUMPDEST
00002788: PUSH2 0x278f
0000278b: PUSH2 0x2f2b
0000278e: JUMP
0000278f: JUMPDEST
00002790: SWAP1
00002791: POP
00002792: DUP2
00002793: CALLDATALOAD
00002794: PUSH2 0x279c
00002797: DUP2
00002798: PUSH2 0x30f5
0000279b: JUMP
0000279c: JUMPDEST
0000279d: DUP2
0000279e: MSTORE
0000279f: PUSH1 0x20
000027a1: DUP3
000027a2: DUP2
000027a3: ADD
000027a4: CALLDATALOAD
000027a5: DUP2
000027a6: DUP4
000027a7: ADD
000027a8: MSTORE
000027a9: PUSH1 0x40
000027ab: DUP1
000027ac: DUP5
000027ad: ADD
000027ae: CALLDATALOAD
000027af: SWAP1
000027b0: DUP4
000027b1: ADD
000027b2: MSTORE
000027b3: PUSH1 0x60
000027b5: DUP4
000027b6: ADD
000027b7: CALLDATALOAD
000027b8: PUSH8 0xffffffffffffffff
000027c1: DUP1
000027c2: DUP3
000027c3: GT
000027c4: ISZERO
000027c5: PUSH2 0x27cd
000027c8: JUMPI
000027c9: PUSH1 0x00
000027cb: DUP1
000027cc: REVERT
000027cd: JUMPDEST
000027ce: DUP2
000027cf: DUP6
000027d0: ADD
000027d1: SWAP2
000027d2: POP
000027d3: DUP6
000027d4: PUSH1 0x1f
000027d6: DUP4
000027d7: ADD
000027d8: SLT
000027d9: PUSH2 0x27e1
000027dc: JUMPI
000027dd: PUSH1 0x00
000027df: DUP1
000027e0: REVERT
000027e1: JUMPDEST
000027e2: DUP2
000027e3: CALLDATALOAD
000027e4: DUP2
000027e5: DUP2
000027e6: GT
000027e7: ISZERO
000027e8: PUSH2 0x27f3
000027eb: JUMPI
000027ec: PUSH2 0x27f3
000027ef: PUSH2 0x30c6
000027f2: JUMP
000027f3: JUMPDEST
000027f4: PUSH2 0x2823
000027f7: DUP5
000027f8: PUSH32 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0
00002819: PUSH1 0x1f
0000281b: DUP5
0000281c: ADD
0000281d: AND
0000281e: ADD
0000281f: PUSH2 0x2f77
00002822: JUMP
00002823: JUMPDEST
00002824: SWAP2
00002825: POP
00002826: DUP1
00002827: DUP3
00002828: MSTORE
00002829: DUP7
0000282a: DUP5
0000282b: DUP3
0000282c: DUP6
0000282d: ADD
0000282e: ADD
0000282f: GT
00002830: ISZERO
00002831: PUSH2 0x2839
00002834: JUMPI
00002835: PUSH1 0x00
00002837: DUP1
00002838: REVERT
00002839: JUMPDEST
0000283a: DUP1
0000283b: DUP5
0000283c: DUP5
0000283d: ADD
0000283e: DUP6
0000283f: DUP5
00002840: ADD
00002841: CALLDATACOPY
00002842: PUSH1 0x00
00002844: DUP5
00002845: DUP3
00002846: DUP5
00002847: ADD
00002848: ADD
00002849: MSTORE
0000284a: POP
0000284b: DUP1
0000284c: PUSH1 0x60
0000284e: DUP6
0000284f: ADD
00002850: MSTORE
00002851: POP
00002852: POP
00002853: POP
00002854: SWAP3
00002855: SWAP2
00002856: POP
00002857: POP
00002858: JUMP
00002859: JUMPDEST
0000285a: PUSH1 0x00
0000285c: PUSH1 0x20
0000285e: DUP3
0000285f: DUP5
00002860: SUB
00002861: SLT
00002862: ISZERO
00002863: PUSH2 0x286a
00002866: JUMPI
00002867: DUP1
00002868: DUP2
00002869: REVERT
0000286a: JUMPDEST
0000286b: DUP2
0000286c: CALLDATALOAD
0000286d: PUSH2 0x12ca
00002870: DUP2
00002871: PUSH2 0x30f5
00002874: JUMP
00002875: JUMPDEST
00002876: PUSH1 0x00
00002878: DUP1
00002879: PUSH1 0x40
0000287b: DUP4
0000287c: DUP6
0000287d: SUB
0000287e: SLT
0000287f: ISZERO
00002880: PUSH2 0x2887
00002883: JUMPI
00002884: DUP1
00002885: DUP2
00002886: REVERT
00002887: JUMPDEST
00002888: DUP3
00002889: CALLDATALOAD
0000288a: PUSH2 0x2892
0000288d: DUP2
0000288e: PUSH2 0x30f5
00002891: JUMP
00002892: JUMPDEST
00002893: SWAP2
00002894: POP
00002895: PUSH1 0x20
00002897: DUP4
00002898: ADD
00002899: CALLDATALOAD
0000289a: PUSH2 0x28a2
0000289d: DUP2
0000289e: PUSH2 0x30f5
000028a1: JUMP
000028a2: JUMPDEST
000028a3: DUP1
000028a4: SWAP2
000028a5: POP
000028a6: POP
000028a7: SWAP3
000028a8: POP
000028a9: SWAP3
000028aa: SWAP1
000028ab: POP
000028ac: JUMP
000028ad: JUMPDEST
000028ae: PUSH1 0x00
000028b0: DUP1
000028b1: PUSH1 0x00
000028b3: PUSH1 0x60
000028b5: DUP5
000028b6: DUP7
000028b7: SUB
000028b8: SLT
000028b9: ISZERO
000028ba: PUSH2 0x28c1
000028bd: JUMPI
000028be: DUP1
000028bf: DUP2
000028c0: REVERT
000028c1: JUMPDEST
000028c2: DUP4
000028c3: CALLDATALOAD
000028c4: PUSH2 0x28cc
000028c7: DUP2
000028c8: PUSH2 0x30f5
000028cb: JUMP
000028cc: JUMPDEST
000028cd: SWAP3
000028ce: POP
000028cf: PUSH1 0x20
000028d1: DUP5
000028d2: ADD
000028d3: CALLDATALOAD
000028d4: PUSH2 0x28dc
000028d7: DUP2
000028d8: PUSH2 0x30f5
000028db: JUMP
000028dc: JUMPDEST
000028dd: SWAP3
000028de: SWAP6
000028df: SWAP3
000028e0: SWAP5
000028e1: POP
000028e2: POP
000028e3: POP
000028e4: PUSH1 0x40
000028e6: SWAP2
000028e7: SWAP1
000028e8: SWAP2
000028e9: ADD
000028ea: CALLDATALOAD
000028eb: SWAP1
000028ec: JUMP
000028ed: JUMPDEST
000028ee: PUSH1 0x00
000028f0: DUP1
000028f1: PUSH1 0x40
000028f3: DUP4
000028f4: DUP6
000028f5: SUB
000028f6: SLT
000028f7: ISZERO
000028f8: PUSH2 0x28ff
000028fb: JUMPI
000028fc: DUP2
000028fd: DUP3
000028fe: REVERT
000028ff: JUMPDEST
00002900: DUP3
00002901: CALLDATALOAD
00002902: PUSH2 0x290a
00002905: DUP2
00002906: PUSH2 0x30f5
00002909: JUMP
0000290a: JUMPDEST
0000290b: SWAP5
0000290c: PUSH1 0x20
0000290e: SWAP4
0000290f: SWAP1
00002910: SWAP4
00002911: ADD
00002912: CALLDATALOAD
00002913: SWAP4
00002914: POP
00002915: POP
00002916: POP
00002917: JUMP
00002918: JUMPDEST
00002919: PUSH1 0x00
0000291b: DUP1
0000291c: PUSH1 0x20
0000291e: DUP4
0000291f: DUP6
00002920: SUB
00002921: SLT
00002922: ISZERO
00002923: PUSH2 0x292a
00002926: JUMPI
00002927: DUP2
00002928: DUP3
00002929: REVERT
0000292a: JUMPDEST
0000292b: DUP3
0000292c: CALLDATALOAD
0000292d: PUSH8 0xffffffffffffffff
00002936: DUP2
00002937: GT
00002938: ISZERO
00002939: PUSH2 0x2940
0000293c: JUMPI
0000293d: DUP3
0000293e: DUP4
0000293f: REVERT
00002940: JUMPDEST
00002941: PUSH2 0x294c
00002944: DUP6
00002945: DUP3
00002946: DUP7
00002947: ADD
00002948: PUSH2 0x26a9
0000294b: JUMP
0000294c: JUMPDEST
0000294d: SWAP1
0000294e: SWAP7
0000294f: SWAP1
00002950: SWAP6
00002951: POP
00002952: SWAP4
00002953: POP
00002954: POP
00002955: POP
00002956: POP
00002957: JUMP
00002958: JUMPDEST
00002959: PUSH1 0x00
0000295b: DUP1
0000295c: PUSH1 0x20
0000295e: DUP4
0000295f: DUP6
00002960: SUB
00002961: SLT
00002962: ISZERO
00002963: PUSH2 0x296a
00002966: JUMPI
00002967: DUP2
00002968: DUP3
00002969: REVERT
0000296a: JUMPDEST
0000296b: DUP3
0000296c: CALLDATALOAD
0000296d: PUSH8 0xffffffffffffffff
00002976: DUP2
00002977: GT
00002978: ISZERO
00002979: PUSH2 0x2980
0000297c: JUMPI
0000297d: DUP3
0000297e: DUP4
0000297f: REVERT
00002980: JUMPDEST
00002981: PUSH2 0x294c
00002984: DUP6
00002985: DUP3
00002986: DUP7
00002987: ADD
00002988: PUSH2 0x26f3
0000298b: JUMP
0000298c: JUMPDEST
0000298d: PUSH1 0x00
0000298f: DUP1
00002990: PUSH1 0x20
00002992: DUP4
00002993: DUP6
00002994: SUB
00002995: SLT
00002996: ISZERO
00002997: PUSH2 0x299e
0000299a: JUMPI
0000299b: DUP2
0000299c: DUP3
0000299d: REVERT
0000299e: JUMPDEST
0000299f: DUP3
000029a0: CALLDATALOAD
000029a1: PUSH8 0xffffffffffffffff
000029aa: DUP1
000029ab: DUP3
000029ac: GT
000029ad: ISZERO
000029ae: PUSH2 0x29b5
000029b1: JUMPI
000029b2: DUP4
000029b3: DUP5
000029b4: REVERT
000029b5: JUMPDEST
000029b6: DUP2
000029b7: DUP6
000029b8: ADD
000029b9: SWAP2
000029ba: POP
000029bb: DUP6
000029bc: PUSH1 0x1f
000029be: DUP4
000029bf: ADD
000029c0: SLT
000029c1: PUSH2 0x29c8
000029c4: JUMPI
000029c5: DUP4
000029c6: DUP5
000029c7: REVERT
000029c8: JUMPDEST
000029c9: DUP2
000029ca: CALLDATALOAD
000029cb: DUP2
000029cc: DUP2
000029cd: GT
000029ce: ISZERO
000029cf: PUSH2 0x29d6
000029d2: JUMPI
000029d3: DUP5
000029d4: DUP6
000029d5: REVERT
000029d6: JUMPDEST
000029d7: DUP7
000029d8: PUSH1 0x20
000029da: DUP3
000029db: PUSH1 0x06
000029dd: SHL
000029de: DUP6
000029df: ADD
000029e0: ADD
000029e1: GT
000029e2: ISZERO
000029e3: PUSH2 0x29ea
000029e6: JUMPI
000029e7: DUP5
000029e8: DUP6
000029e9: REVERT
000029ea: JUMPDEST
000029eb: PUSH1 0x20
000029ed: SWAP3
000029ee: SWAP1
000029ef: SWAP3
000029f0: ADD
000029f1: SWAP7
000029f2: SWAP2
000029f3: SWAP6
000029f4: POP
000029f5: SWAP1
000029f6: SWAP4
000029f7: POP
000029f8: POP
000029f9: POP
000029fa: POP
000029fb: JUMP
000029fc: JUMPDEST
000029fd: PUSH1 0x00
000029ff: PUSH1 0x20
00002a01: DUP3
00002a02: DUP5
00002a03: SUB
00002a04: SLT
00002a05: ISZERO
00002a06: PUSH2 0x2a0d
00002a09: JUMPI
00002a0a: DUP1
00002a0b: DUP2
00002a0c: REVERT
00002a0d: JUMPDEST
00002a0e: DUP2
00002a0f: CALLDATALOAD
00002a10: PUSH8 0xffffffffffffffff
00002a19: DUP2
00002a1a: GT
00002a1b: ISZERO
00002a1c: PUSH2 0x2a23
00002a1f: JUMPI
00002a20: DUP2
00002a21: DUP3
00002a22: REVERT
00002a23: JUMPDEST
00002a24: DUP3
00002a25: ADD
00002a26: PUSH1 0x1f
00002a28: DUP2
00002a29: ADD
00002a2a: DUP5
00002a2b: SGT
00002a2c: PUSH2 0x2a33
00002a2f: JUMPI
00002a30: DUP2
00002a31: DUP3
00002a32: REVERT
00002a33: JUMPDEST
00002a34: PUSH2 0x20af
00002a37: DUP5
00002a38: DUP3
00002a39: CALLDATALOAD
00002a3a: PUSH1 0x20
00002a3c: DUP5
00002a3d: ADD
00002a3e: PUSH2 0x261d
00002a41: JUMP
00002a42: JUMPDEST
00002a43: PUSH1 0x00
00002a45: DUP1
00002a46: PUSH1 0x00
00002a48: DUP1
00002a49: PUSH1 0x00
00002a4b: DUP1
00002a4c: PUSH1 0x00
00002a4e: DUP1
00002a4f: PUSH1 0xc0
00002a51: DUP10
00002a52: DUP12
00002a53: SUB
00002a54: SLT
00002a55: ISZERO
00002a56: PUSH2 0x2a5d
00002a59: JUMPI
00002a5a: DUP6
00002a5b: DUP7
00002a5c: REVERT
00002a5d: JUMPDEST
00002a5e: DUP9
00002a5f: CALLDATALOAD
00002a60: PUSH8 0xffffffffffffffff
00002a69: DUP1
00002a6a: DUP3
00002a6b: GT
00002a6c: ISZERO
00002a6d: PUSH2 0x2a74
00002a70: JUMPI
00002a71: DUP8
00002a72: DUP9
00002a73: REVERT
00002a74: JUMPDEST
00002a75: PUSH2 0x2a80
00002a78: DUP13
00002a79: DUP4
00002a7a: DUP14
00002a7b: ADD
00002a7c: PUSH2 0x2736
00002a7f: JUMP
00002a80: JUMPDEST
00002a81: SWAP1
00002a82: SWAP11
00002a83: POP
00002a84: SWAP9
00002a85: POP
00002a86: PUSH1 0x20
00002a88: DUP12
00002a89: ADD
00002a8a: CALLDATALOAD
00002a8b: SWAP2
00002a8c: POP
00002a8d: PUSH2 0x2a95
00002a90: DUP3
00002a91: PUSH2 0x30f5
00002a94: JUMP
00002a95: JUMPDEST
00002a96: SWAP1
00002a97: SWAP7
00002a98: POP
00002a99: PUSH1 0x40
00002a9b: DUP11
00002a9c: ADD
00002a9d: CALLDATALOAD
00002a9e: SWAP1
00002a9f: PUSH2 0x2aa7
00002aa2: DUP3
00002aa3: PUSH2 0x30f5
00002aa6: JUMP
00002aa7: JUMPDEST
00002aa8: SWAP1
00002aa9: SWAP6
00002aaa: POP
00002aab: PUSH1 0x60
00002aad: DUP11
00002aae: ADD
00002aaf: CALLDATALOAD
00002ab0: SWAP5
00002ab1: POP
00002ab2: PUSH1 0x80
00002ab4: DUP11
00002ab5: ADD
00002ab6: CALLDATALOAD
00002ab7: SWAP4
00002ab8: POP
00002ab9: PUSH1 0xa0
00002abb: DUP11
00002abc: ADD
00002abd: CALLDATALOAD
00002abe: SWAP1
00002abf: DUP1
00002ac0: DUP3
00002ac1: GT
00002ac2: ISZERO
00002ac3: PUSH2 0x2aca
00002ac6: JUMPI
00002ac7: DUP4
00002ac8: DUP5
00002ac9: REVERT
00002aca: JUMPDEST
00002acb: POP
00002acc: PUSH2 0x2ad7
00002acf: DUP12
00002ad0: DUP3
00002ad1: DUP13
00002ad2: ADD
00002ad3: PUSH2 0x2736
00002ad6: JUMP
00002ad7: JUMPDEST
00002ad8: SWAP10
00002ad9: SWAP13
00002ada: SWAP9
00002adb: SWAP12
00002adc: POP
00002add: SWAP7
00002ade: SWAP10
00002adf: POP
00002ae0: SWAP5
00002ae1: SWAP8
00002ae2: SWAP4
00002ae3: SWAP7
00002ae4: SWAP3
00002ae5: SWAP6
00002ae6: SWAP5
00002ae7: POP
00002ae8: POP
00002ae9: POP
00002aea: JUMP
00002aeb: JUMPDEST
00002aec: PUSH1 0x00
00002aee: PUSH1 0x60
00002af0: DUP3
00002af1: DUP5
00002af2: SUB
00002af3: SLT
00002af4: ISZERO
00002af5: PUSH2 0x2afc
00002af8: JUMPI
00002af9: DUP1
00002afa: DUP2
00002afb: REVERT
00002afc: JUMPDEST
00002afd: PUSH2 0x2b04
00002b00: PUSH2 0x2f54
00002b03: JUMP
00002b04: JUMPDEST
00002b05: DUP3
00002b06: CALLDATALOAD
00002b07: PUSH2 0x2b0f
00002b0a: DUP2
00002b0b: PUSH2 0x30f5
00002b0e: JUMP
00002b0f: JUMPDEST
00002b10: DUP2
00002b11: MSTORE
00002b12: PUSH1 0x20
00002b14: DUP4
00002b15: DUP2
00002b16: ADD
00002b17: CALLDATALOAD
00002b18: SWAP1
00002b19: DUP3
00002b1a: ADD
00002b1b: MSTORE
00002b1c: PUSH1 0x40
00002b1e: SWAP3
00002b1f: DUP4
00002b20: ADD
00002b21: CALLDATALOAD
00002b22: SWAP3
00002b23: DUP2
00002b24: ADD
00002b25: SWAP3
00002b26: SWAP1
00002b27: SWAP3
00002b28: MSTORE
00002b29: POP
00002b2a: SWAP2
00002b2b: SWAP1
00002b2c: POP
00002b2d: JUMP
00002b2e: JUMPDEST
00002b2f: PUSH1 0x00
00002b31: PUSH1 0x40
00002b33: DUP3
00002b34: DUP5
00002b35: SUB
00002b36: SLT
00002b37: ISZERO
00002b38: PUSH2 0x2b3f
00002b3b: JUMPI
00002b3c: DUP1
00002b3d: DUP2
00002b3e: REVERT
00002b3f: JUMPDEST
00002b40: PUSH1 0x40
00002b42: MLOAD
00002b43: PUSH1 0x40
00002b45: DUP2
00002b46: ADD
00002b47: DUP2
00002b48: DUP2
00002b49: LT
00002b4a: PUSH8 0xffffffffffffffff
00002b53: DUP3
00002b54: GT
00002b55: OR
00002b56: ISZERO
00002b57: PUSH2 0x2b62
00002b5a: JUMPI
00002b5b: PUSH2 0x2b62
00002b5e: PUSH2 0x30c6
00002b61: JUMP
00002b62: JUMPDEST
00002b63: PUSH1 0x40
00002b65: MSTORE
00002b66: DUP3
00002b67: CALLDATALOAD
00002b68: PUSH2 0x2b70
00002b6b: DUP2
00002b6c: PUSH2 0x30f5
00002b6f: JUMP
00002b70: JUMPDEST
00002b71: DUP2
00002b72: MSTORE
00002b73: PUSH1 0x20
00002b75: DUP4
00002b76: ADD
00002b77: CALLDATALOAD
00002b78: PUSH2 0x2b80
00002b7b: DUP2
00002b7c: PUSH2 0x30f5
00002b7f: JUMP
00002b80: JUMPDEST
00002b81: PUSH1 0x20
00002b83: DUP3
00002b84: ADD
00002b85: MSTORE
00002b86: SWAP4
00002b87: SWAP3
00002b88: POP
00002b89: POP
00002b8a: POP
00002b8b: JUMP
00002b8c: JUMPDEST
00002b8d: PUSH1 0x00
00002b8f: PUSH1 0x60
00002b91: DUP3
00002b92: DUP5
00002b93: SUB
00002b94: SLT
00002b95: ISZERO
00002b96: PUSH2 0x2b9d
00002b99: JUMPI
00002b9a: DUP1
00002b9b: DUP2
00002b9c: REVERT
00002b9d: JUMPDEST
00002b9e: PUSH2 0x2ba5
00002ba1: PUSH2 0x2f54
00002ba4: JUMP
00002ba5: JUMPDEST
00002ba6: DUP3
00002ba7: CALLDATALOAD
00002ba8: PUSH2 0x2bb0
00002bab: DUP2
00002bac: PUSH2 0x30f5
00002baf: JUMP
00002bb0: JUMPDEST
00002bb1: DUP2
00002bb2: MSTORE
00002bb3: PUSH1 0x20
00002bb5: DUP4
00002bb6: ADD
00002bb7: CALLDATALOAD
00002bb8: PUSH2 0x2bc0
00002bbb: DUP2
00002bbc: PUSH2 0x30f5
00002bbf: JUMP
00002bc0: JUMPDEST
00002bc1: PUSH1 0x20
00002bc3: DUP3
00002bc4: ADD
00002bc5: MSTORE
00002bc6: PUSH1 0x40
00002bc8: SWAP3
00002bc9: DUP4
00002bca: ADD
00002bcb: CALLDATALOAD
00002bcc: SWAP3
00002bcd: DUP2
00002bce: ADD
00002bcf: SWAP3
00002bd0: SWAP1
00002bd1: SWAP3
00002bd2: MSTORE
00002bd3: POP
00002bd4: SWAP2
00002bd5: SWAP1
00002bd6: POP
00002bd7: JUMP
00002bd8: JUMPDEST
00002bd9: PUSH1 0x00
00002bdb: PUSH1 0x20
00002bdd: DUP3
00002bde: DUP5
00002bdf: SUB
00002be0: SLT
00002be1: ISZERO
00002be2: PUSH2 0x2be9
00002be5: JUMPI
00002be6: DUP1
00002be7: DUP2
00002be8: REVERT
00002be9: JUMPDEST
00002bea: POP
00002beb: CALLDATALOAD
00002bec: SWAP2
00002bed: SWAP1
00002bee: POP
00002bef: JUMP
00002bf0: JUMPDEST
00002bf1: PUSH1 0x00
00002bf3: DUP1
00002bf4: PUSH1 0x40
00002bf6: DUP4
00002bf7: DUP6
00002bf8: SUB
00002bf9: SLT
00002bfa: ISZERO
00002bfb: PUSH2 0x2c02
00002bfe: JUMPI
00002bff: DUP2
00002c00: DUP3
00002c01: REVERT
00002c02: JUMPDEST
00002c03: DUP3
00002c04: CALLDATALOAD
00002c05: SWAP2
00002c06: POP
00002c07: PUSH1 0x20
00002c09: DUP4
00002c0a: ADD
00002c0b: CALLDATALOAD
00002c0c: PUSH2 0x28a2
00002c0f: DUP2
00002c10: PUSH2 0x30f5
00002c13: JUMP
00002c14: JUMPDEST
00002c15: PUSH1 0x00
00002c17: DUP1
00002c18: PUSH1 0x00
00002c1a: DUP1
00002c1b: PUSH1 0x00
00002c1d: PUSH1 0xa0
00002c1f: DUP7
00002c20: DUP9
00002c21: SUB
00002c22: SLT
00002c23: ISZERO
00002c24: PUSH2 0x2c2b
00002c27: JUMPI
00002c28: DUP3
00002c29: DUP4
00002c2a: REVERT
00002c2b: JUMPDEST
00002c2c: DUP6
00002c2d: CALLDATALOAD
00002c2e: SWAP5
00002c2f: POP
00002c30: PUSH1 0x20
00002c32: DUP7
00002c33: ADD
00002c34: CALLDATALOAD
00002c35: PUSH2 0x2c3d
00002c38: DUP2
00002c39: PUSH2 0x30f5
00002c3c: JUMP
00002c3d: JUMPDEST
00002c3e: SWAP4
00002c3f: POP
00002c40: PUSH1 0x40
00002c42: DUP7
00002c43: ADD
00002c44: CALLDATALOAD
00002c45: PUSH2 0x2c4d
00002c48: DUP2
00002c49: PUSH2 0x30f5
00002c4c: JUMP
00002c4d: JUMPDEST
00002c4e: SWAP3
00002c4f: POP
00002c50: PUSH1 0x60
00002c52: DUP7
00002c53: ADD
00002c54: CALLDATALOAD
00002c55: PUSH2 0x2c5d
00002c58: DUP2
00002c59: PUSH2 0x30f5
00002c5c: JUMP
00002c5d: JUMPDEST
00002c5e: SWAP2
00002c5f: POP
00002c60: PUSH1 0x80
00002c62: DUP7
00002c63: ADD
00002c64: CALLDATALOAD
00002c65: PUSH2 0x2c6d
00002c68: DUP2
00002c69: PUSH2 0x30f5
00002c6c: JUMP
00002c6d: JUMPDEST
00002c6e: DUP1
00002c6f: SWAP2
00002c70: POP
00002c71: POP
00002c72: SWAP3
00002c73: SWAP6
00002c74: POP
00002c75: SWAP3
00002c76: SWAP6
00002c77: SWAP1
00002c78: SWAP4
00002c79: POP
00002c7a: JUMP
00002c7b: JUMPDEST
00002c7c: PUSH1 0x00
00002c7e: DUP1
00002c7f: PUSH1 0x40
00002c81: DUP4
00002c82: DUP6
00002c83: SUB
00002c84: SLT
00002c85: ISZERO
00002c86: PUSH2 0x2c8d
00002c89: JUMPI
00002c8a: DUP2
00002c8b: DUP3
00002c8c: REVERT
00002c8d: JUMPDEST
00002c8e: POP
00002c8f: POP
00002c90: DUP1
00002c91: CALLDATALOAD
00002c92: SWAP3
00002c93: PUSH1 0x20
00002c95: SWAP1
00002c96: SWAP2
00002c97: ADD
00002c98: CALLDATALOAD
00002c99: SWAP2
00002c9a: POP
00002c9b: JUMP
00002c9c: JUMPDEST
00002c9d: PUSH1 0x00
00002c9f: DUP1
00002ca0: PUSH1 0x00
00002ca2: DUP1
00002ca3: PUSH1 0x00
00002ca5: PUSH1 0x60
00002ca7: DUP7
00002ca8: DUP9
00002ca9: SUB
00002caa: SLT
00002cab: ISZERO
00002cac: PUSH2 0x2cb3
00002caf: JUMPI
00002cb0: DUP3
00002cb1: DUP4
00002cb2: REVERT
00002cb3: JUMPDEST
00002cb4: DUP6
00002cb5: CALLDATALOAD
00002cb6: SWAP5
00002cb7: POP
00002cb8: PUSH1 0x20
00002cba: DUP7
00002cbb: ADD
00002cbc: CALLDATALOAD
00002cbd: PUSH8 0xffffffffffffffff
00002cc6: DUP1
00002cc7: DUP3
00002cc8: GT
00002cc9: ISZERO
00002cca: PUSH2 0x2cd1
00002ccd: JUMPI
00002cce: DUP5
00002ccf: DUP6
00002cd0: REVERT
00002cd1: JUMPDEST
00002cd2: PUSH2 0x2cdd
00002cd5: DUP10
00002cd6: DUP4
00002cd7: DUP11
00002cd8: ADD
00002cd9: PUSH2 0x2736
00002cdc: JUMP
00002cdd: JUMPDEST
00002cde: SWAP1
00002cdf: SWAP7
00002ce0: POP
00002ce1: SWAP5
00002ce2: POP
00002ce3: PUSH1 0x40
00002ce5: DUP9
00002ce6: ADD
00002ce7: CALLDATALOAD
00002ce8: SWAP2
00002ce9: POP
00002cea: DUP1
00002ceb: DUP3
00002cec: GT
00002ced: ISZERO
00002cee: PUSH2 0x2cf5
00002cf1: JUMPI
00002cf2: DUP3
00002cf3: DUP4
00002cf4: REVERT
00002cf5: JUMPDEST
00002cf6: POP
00002cf7: PUSH2 0x2d02
00002cfa: DUP9
00002cfb: DUP3
00002cfc: DUP10
00002cfd: ADD
00002cfe: PUSH2 0x26a9
00002d01: JUMP
00002d02: JUMPDEST
00002d03: SWAP7
00002d04: SWAP10
00002d05: SWAP6
00002d06: SWAP9
00002d07: POP
00002d08: SWAP4
00002d09: SWAP7
00002d0a: POP
00002d0b: SWAP3
00002d0c: SWAP5
00002d0d: SWAP4
00002d0e: SWAP3
00002d0f: POP
00002d10: POP
00002d11: POP
00002d12: JUMP
00002d13: JUMPDEST
00002d14: PUSH1 0x00
00002d16: DUP2
00002d17: MLOAD
00002d18: DUP1
00002d19: DUP5
00002d1a: MSTORE
00002d1b: PUSH2 0x2d2b
00002d1e: DUP2
00002d1f: PUSH1 0x20
00002d21: DUP7
00002d22: ADD
00002d23: PUSH1 0x20
00002d25: DUP7
00002d26: ADD
00002d27: PUSH2 0x2ff9
00002d2a: JUMP
00002d2b: JUMPDEST
00002d2c: PUSH1 0x1f
00002d2e: ADD
00002d2f: PUSH32 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0
00002d50: AND
00002d51: SWAP3
00002d52: SWAP1
00002d53: SWAP3
00002d54: ADD
00002d55: PUSH1 0x20
00002d57: ADD
00002d58: SWAP3
00002d59: SWAP2
00002d5a: POP
00002d5b: POP
00002d5c: JUMP
00002d5d: JUMPDEST
00002d5e: PUSH1 0x00
00002d60: PUSH32 0xffffffffffffffffffffffffffffffffffffffff000000000000000000000000
00002d81: DUP1
00002d82: DUP10
00002d83: PUSH1 0x60
00002d85: SHL
00002d86: AND
00002d87: DUP4
00002d88: MSTORE
00002d89: DUP1
00002d8a: DUP9
00002d8b: PUSH1 0x60
00002d8d: SHL
00002d8e: AND
00002d8f: PUSH1 0x14
00002d91: DUP5
00002d92: ADD
00002d93: MSTORE
00002d94: POP
00002d95: DUP6
00002d96: PUSH1 0x28
00002d98: DUP4
00002d99: ADD
00002d9a: MSTORE
00002d9b: DUP5
00002d9c: PUSH1 0x48
00002d9e: DUP4
00002d9f: ADD
00002da0: MSTORE
00002da1: DUP3
00002da2: DUP5
00002da3: PUSH1 0x68
00002da5: DUP5
00002da6: ADD
00002da7: CALLDATACOPY
00002da8: SWAP2
00002da9: ADD
00002daa: PUSH1 0x68
00002dac: ADD
00002dad: SWAP1
00002dae: DUP2
00002daf: MSTORE
00002db0: SWAP6
00002db1: SWAP5
00002db2: POP
00002db3: POP
00002db4: POP
00002db5: POP
00002db6: POP
00002db7: JUMP
00002db8: JUMPDEST
00002db9: PUSH32 0xffffffffffffffffffffffffffffffffffffffff000000000000000000000000
00002dda: DUP5
00002ddb: PUSH1 0x60
00002ddd: SHL
00002dde: AND
00002ddf: DUP2
00002de0: MSTORE
00002de1: DUP3
00002de2: PUSH1 0x14
00002de4: DUP3
00002de5: ADD
00002de6: MSTORE
00002de7: PUSH1 0x00
00002de9: DUP3
00002dea: MLOAD
00002deb: PUSH2 0x2dfb
00002dee: DUP2
00002def: PUSH1 0x34
00002df1: DUP6
00002df2: ADD
00002df3: PUSH1 0x20
00002df5: DUP8
00002df6: ADD
00002df7: PUSH2 0x2ff9
00002dfa: JUMP
00002dfb: JUMPDEST
00002dfc: SWAP2
00002dfd: SWAP1
00002dfe: SWAP2
00002dff: ADD
00002e00: PUSH1 0x34
00002e02: ADD
00002e03: SWAP5
00002e04: SWAP4
00002e05: POP
00002e06: POP
00002e07: POP
00002e08: POP
00002e09: JUMP
00002e0a: JUMPDEST
00002e0b: PUSH1 0x00
00002e0d: DUP3
00002e0e: MLOAD
00002e0f: PUSH2 0x2e1c
00002e12: DUP2
00002e13: DUP5
00002e14: PUSH1 0x20
00002e16: DUP8
00002e17: ADD
00002e18: PUSH2 0x2ff9
00002e1b: JUMP
00002e1c: JUMPDEST
00002e1d: SWAP2
00002e1e: SWAP1
00002e1f: SWAP2
00002e20: ADD
00002e21: SWAP3
00002e22: SWAP2
00002e23: POP
00002e24: POP
00002e25: JUMP
00002e26: JUMPDEST
00002e27: PUSH1 0x00
00002e29: DUP7
00002e2a: MLOAD
00002e2b: PUSH2 0x2e38
00002e2e: DUP2
00002e2f: DUP5
00002e30: PUSH1 0x20
00002e32: DUP12
00002e33: ADD
00002e34: PUSH2 0x2ff9
00002e37: JUMP
00002e38: JUMPDEST
00002e39: DUP1
00002e3a: DUP4
00002e3b: ADD
00002e3c: SWAP1
00002e3d: POP
00002e3e: PUSH32 0xffffffffffffffffffffffffffffffffffffffff000000000000000000000000
00002e5f: DUP8
00002e60: PUSH1 0x60
00002e62: SHL
00002e63: AND
00002e64: DUP2
00002e65: MSTORE
00002e66: DUP6
00002e67: PUSH1 0x14
00002e69: DUP3
00002e6a: ADD
00002e6b: MSTORE
00002e6c: DUP5
00002e6d: PUSH1 0x34
00002e6f: DUP3
00002e70: ADD
00002e71: MSTORE
00002e72: DUP4
00002e73: MLOAD
00002e74: PUSH2 0x2e84
00002e77: DUP2
00002e78: PUSH1 0x54
00002e7a: DUP5
00002e7b: ADD
00002e7c: PUSH1 0x20
00002e7e: DUP9
00002e7f: ADD
00002e80: PUSH2 0x2ff9
00002e83: JUMP
00002e84: JUMPDEST
00002e85: ADD
00002e86: PUSH1 0x54
00002e88: ADD
00002e89: SWAP8
00002e8a: SWAP7
00002e8b: POP
00002e8c: POP
00002e8d: POP
00002e8e: POP
00002e8f: POP
00002e90: POP
00002e91: POP
00002e92: JUMP
00002e93: JUMPDEST
00002e94: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
00002ea9: DUP6
00002eaa: AND
00002eab: DUP2
00002eac: MSTORE
00002ead: DUP4
00002eae: PUSH1 0x20
00002eb0: DUP3
00002eb1: ADD
00002eb2: MSTORE
00002eb3: PUSH1 0x80
00002eb5: PUSH1 0x40
00002eb7: DUP3
00002eb8: ADD
00002eb9: MSTORE
00002eba: PUSH1 0x00
00002ebc: PUSH2 0x2ec8
00002ebf: PUSH1 0x80
00002ec1: DUP4
00002ec2: ADD
00002ec3: DUP6
00002ec4: PUSH2 0x2d13
00002ec7: JUMP
00002ec8: JUMPDEST
00002ec9: DUP3
00002eca: DUP2
00002ecb: SUB
00002ecc: PUSH1 0x60
00002ece: DUP5
00002ecf: ADD
00002ed0: MSTORE
00002ed1: PUSH2 0x2eda
00002ed4: DUP2
00002ed5: DUP6
00002ed6: PUSH2 0x2d13
00002ed9: JUMP
00002eda: JUMPDEST
00002edb: SWAP8
00002edc: SWAP7
00002edd: POP
00002ede: POP
00002edf: POP
00002ee0: POP
00002ee1: POP
00002ee2: POP
00002ee3: POP
00002ee4: JUMP
00002ee5: JUMPDEST
00002ee6: PUSH1 0x20
00002ee8: DUP2
00002ee9: MSTORE
00002eea: PUSH1 0x00
00002eec: PUSH2 0x12ca
00002eef: PUSH1 0x20
00002ef1: DUP4
00002ef2: ADD
00002ef3: DUP5
00002ef4: PUSH2 0x2d13
00002ef7: JUMP
00002ef8: JUMPDEST
00002ef9: PUSH1 0x00
00002efb: DUP3
00002efc: CALLDATALOAD
00002efd: PUSH32 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81
00002f1e: DUP4
00002f1f: CALLDATASIZE
00002f20: SUB
00002f21: ADD
00002f22: DUP2
00002f23: SLT
00002f24: PUSH2 0x2e1c
00002f27: JUMPI
00002f28: DUP2
00002f29: DUP3
00002f2a: REVERT
00002f2b: JUMPDEST
00002f2c: PUSH1 0x40
00002f2e: MLOAD
00002f2f: PUSH1 0x80
00002f31: DUP2
00002f32: ADD
00002f33: PUSH8 0xffffffffffffffff
00002f3c: DUP2
00002f3d: GT
00002f3e: DUP3
00002f3f: DUP3
00002f40: LT
00002f41: OR
00002f42: ISZERO
00002f43: PUSH2 0x2f4e
00002f46: JUMPI
00002f47: PUSH2 0x2f4e
00002f4a: PUSH2 0x30c6
00002f4d: JUMP
00002f4e: JUMPDEST
00002f4f: PUSH1 0x40
00002f51: MSTORE
00002f52: SWAP1
00002f53: JUMP
00002f54: JUMPDEST
00002f55: PUSH1 0x40
00002f57: MLOAD
00002f58: PUSH1 0x60
00002f5a: DUP2
00002f5b: ADD
00002f5c: PUSH8 0xffffffffffffffff
00002f65: DUP2
00002f66: GT
00002f67: DUP3
00002f68: DUP3
00002f69: LT
00002f6a: OR
00002f6b: ISZERO
00002f6c: PUSH2 0x2f4e
00002f6f: JUMPI
00002f70: PUSH2 0x2f4e
00002f73: PUSH2 0x30c6
00002f76: JUMP
00002f77: JUMPDEST
00002f78: PUSH1 0x40
00002f7a: MLOAD
00002f7b: PUSH1 0x1f
00002f7d: DUP3
00002f7e: ADD
00002f7f: PUSH32 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0
00002fa0: AND
00002fa1: DUP2
00002fa2: ADD
00002fa3: PUSH8 0xffffffffffffffff
00002fac: DUP2
00002fad: GT
00002fae: DUP3
00002faf: DUP3
00002fb0: LT
00002fb1: OR
00002fb2: ISZERO
00002fb3: PUSH2 0x2fbe
00002fb6: JUMPI
00002fb7: PUSH2 0x2fbe
00002fba: PUSH2 0x30c6
00002fbd: JUMP
00002fbe: JUMPDEST
00002fbf: PUSH1 0x40
00002fc1: MSTORE
00002fc2: SWAP2
00002fc3: SWAP1
00002fc4: POP
00002fc5: JUMP
00002fc6: JUMPDEST
00002fc7: PUSH1 0x00
00002fc9: DUP3
00002fca: PUSH2 0x2fd5
00002fcd: JUMPI
00002fce: PUSH2 0x2fd5
00002fd1: PUSH2 0x3097
00002fd4: JUMP
00002fd5: JUMPDEST
00002fd6: POP
00002fd7: DIV
00002fd8: SWAP1
00002fd9: JUMP
00002fda: JUMPDEST
00002fdb: PUSH1 0x00
00002fdd: PUSH2 0x12ca
00002fe0: CALLDATASIZE
00002fe1: DUP5
00002fe2: DUP5
00002fe3: PUSH2 0x261d
00002fe6: JUMP
00002fe7: JUMPDEST
00002fe8: PUSH1 0x00
00002fea: PUSH2 0x2ff3
00002fed: CALLDATASIZE
00002fee: DUP4
00002fef: PUSH2 0x2776
00002ff2: JUMP
00002ff3: JUMPDEST
00002ff4: SWAP3
00002ff5: SWAP2
00002ff6: POP
00002ff7: POP
00002ff8: JUMP
00002ff9: JUMPDEST
00002ffa: PUSH1 0x00
00002ffc: JUMPDEST
00002ffd: DUP4
00002ffe: DUP2
00002fff: LT
00003000: ISZERO
00003001: PUSH2 0x3014
00003004: JUMPI
00003005: DUP2
00003006: DUP2
00003007: ADD
00003008: MLOAD
00003009: DUP4
0000300a: DUP3
0000300b: ADD
0000300c: MSTORE
0000300d: PUSH1 0x20
0000300f: ADD
00003010: PUSH2 0x2ffc
00003013: JUMP
00003014: JUMPDEST
00003015: DUP4
00003016: DUP2
00003017: GT
00003018: ISZERO
00003019: PUSH2 0x1109
0000301c: JUMPI
0000301d: POP
0000301e: POP
0000301f: PUSH1 0x00
00003021: SWAP2
00003022: ADD
00003023: MSTORE
00003024: JUMP
00003025: JUMPDEST
00003026: PUSH1 0x00
00003028: PUSH32 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
00003049: DUP3
0000304a: EQ
0000304b: ISZERO
0000304c: PUSH2 0x307c
0000304f: JUMPI
00003050: PUSH32 0x4e487b7100000000000000000000000000000000000000000000000000000000
00003071: DUP2
00003072: MSTORE
00003073: PUSH1 0x11
00003075: PUSH1 0x04
00003077: MSTORE
00003078: PUSH1 0x24
0000307a: DUP2
0000307b: REVERT
0000307c: JUMPDEST
0000307d: POP
0000307e: PUSH1 0x01
00003080: ADD
00003081: SWAP1
00003082: JUMP
00003083: JUMPDEST
00003084: PUSH1 0x00
00003086: DUP3
00003087: PUSH2 0x3092
0000308a: JUMPI
0000308b: PUSH2 0x3092
0000308e: PUSH2 0x3097
00003091: JUMP
00003092: JUMPDEST
00003093: POP
00003094: MOD
00003095: SWAP1
00003096: JUMP
00003097: JUMPDEST
00003098: PUSH32 0x4e487b7100000000000000000000000000000000000000000000000000000000
000030b9: PUSH1 0x00
000030bb: MSTORE
000030bc: PUSH1 0x12
000030be: PUSH1 0x04
000030c0: MSTORE
000030c1: PUSH1 0x24
000030c3: PUSH1 0x00
000030c5: REVERT
000030c6: JUMPDEST
000030c7: PUSH32 0x4e487b7100000000000000000000000000000000000000000000000000000000
000030e8: PUSH1 0x00
000030ea: MSTORE
000030eb: PUSH1 0x41
000030ed: PUSH1 0x04
000030ef: MSTORE
000030f0: PUSH1 0x24
000030f2: PUSH1 0x00
000030f4: REVERT
000030f5: JUMPDEST
000030f6: PUSH20 0xffffffffffffffffffffffffffffffffffffffff
0000310b: DUP2
0000310c: AND
0000310d: DUP2
0000310e: EQ
0000310f: PUSH2 0x1d96
00003112: JUMPI
00003113: PUSH1 0x00
00003115: DUP1
00003116: REVERT
00003117: INVALID
00003118: LOG2
00003119: PUSH5 0x6970667358
0000311f: UNKNOWN(0x22)
00003120: SLT
00003121: KECCAK256
00003122: DUP2
00003123: SLT
00003124: PUSH1 0x56
00003126: UNKNOWN(0xCB)
00003127: JUMPDEST
00003128: UNKNOWN(0x23)
00003129: MUL
0000312a: MSTORE8
0000312b: PUSH10 0x12a2c2fcf77a77bb1c18
00003136: EXP
00003137: PUSH22

Findings

validated = confirmed for call sinks; sink observed for others
Severity Category Tool Title Confidence Validated Confirmed Details
critical access_control codex Unrestricted batch transfer allows draining ETH/ERC20 balances 90 no
view
evidence_json
{
    "evidence": "External selector `0xfbfbbfed` dispatches at 0x04bb directly to internal function 0x1966 with only a `CALLVALUE==0` check (no caller/auth). Function 0x1966 constructs transfer data and invokes helper 0x20b7, which branches on `token` address and either (a) builds ERC20 `transfer` calldata using selector `a9059cbb` at 0x21d3 or (b) performs a plain ETH `CALL` with value. The actual external call is executed at 0x2105.",
    "locations": [
        "runtime_bytecode.hex:0x04bb",
        "runtime_bytecode.hex:0x1966",
        "runtime_bytecode.hex:0x20b7",
        "runtime_bytecode.hex:0x2105",
        "runtime_bytecode.hex:0x21d3"
    ],
    "recommendation": "Restrict this entrypoint to an authorized role or to `onlySelf` (contract-internal) and require signature/nonce validation before allowing transfers. Alternatively, remove public access and route through the authenticated execution flow.",
    "exploit_scenario": "1) Read the contract\u2019s ETH or ERC20 balance. 2) Call selector `0xfbfbbfed` with a single-element array where `token = 0x0` (for ETH) or the ERC20 address, `to = attacker`, and `amount = balance`. 3) The function builds a transfer call and executes `CALL` at 0x2105, sending funds from the contract to the attacker. No caller/auth/signature checks are performed, so any user can drain assets."
}
high other detector Untrusted CALL target/value reachable 60 no no
view
trace_id: 0x32ad8ae208aefdcb97989b2e0fae07b4b1c63e54a9f2b64235138e8022228abc
call_targets: 0x30e3da29d03702ef45d2765feaa6e98b89195241
target_varies: no
classification: constant_target
validation_json
{
    "sink": "CALL",
    "errors": 0,
    "status": "sink_reached",
    "attempts": 1,
    "trace_id": "0x32ad8ae208aefdcb97989b2e0fae07b4b1c63e54a9f2b64235138e8022228abc",
    "confirmed": false,
    "trace_mode": "callTracer",
    "call_targets": [
        "0x30e3da29d03702ef45d2765feaa6e98b89195241"
    ],
    "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": "0xf0fd58a7",
            "selector": "0xf0fd58a7",
            "calldata_variants": [
                "0xf0fd58a7",
                "0xf0fd58a70000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xf5537ede",
            "selector": "0xf5537ede",
            "calldata_variants": [
                "0xf5537ede",
                "0xf5537ede0000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xfbfbbfed",
            "selector": "0xfbfbbfed",
            "calldata_variants": [
                "0xfbfbbfed",
                "0xfbfbbfed0000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xe38e7821",
            "selector": "0xe38e7821",
            "calldata_variants": [
                "0xe38e7821",
                "0xe38e78210000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xe9bb84c2",
            "selector": "0xe9bb84c2",
            "calldata_variants": [
                "0xe9bb84c2",
                "0xe9bb84c20000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xea23c389",
            "selector": "0xea23c389",
            "calldata_variants": [
                "0xea23c389",
                "0xea23c3890000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xb269681d",
            "selector": "0xb269681d",
            "calldata_variants": [
                "0xb269681d",
                "0xb269681d0000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xc59edb61",
            "selector": "0xc59edb61",
            "calldata_variants": [
                "0xc59edb61",
                "0xc59edb610000000000000000000000000000000000000000000000000000000000000000"
            ]
        }
    ]
}
evidence_json
{
    "examples": [
        {
            "pc": 7013,
            "opcode": "CALL",
            "returndata_checked": null,
            "value_expression_category": "computed",
            "target_expression_category": "computed"
        },
        {
            "pc": 7311,
            "opcode": "CALL",
            "returndata_checked": null,
            "value_expression_category": "computed",
            "target_expression_category": "computed"
        },
        {
            "pc": 7527,
            "opcode": "CALL",
            "returndata_checked": null,
            "value_expression_category": "computed",
            "target_expression_category": "computed"
        }
    ],
    "call_count": 6,
    "guards_detected": [],
    "untrusted_call_count": 6
}
high other detector ETH value transfer possible 55 no no
view
trace_id: 0x32ad8ae208aefdcb97989b2e0fae07b4b1c63e54a9f2b64235138e8022228abc
call_targets: 0x30e3da29d03702ef45d2765feaa6e98b89195241
target_varies: no
classification: constant_target
validation_json
{
    "sink": "CALL",
    "errors": 0,
    "status": "sink_reached",
    "attempts": 1,
    "trace_id": "0x32ad8ae208aefdcb97989b2e0fae07b4b1c63e54a9f2b64235138e8022228abc",
    "confirmed": false,
    "trace_mode": "callTracer",
    "call_targets": [
        "0x30e3da29d03702ef45d2765feaa6e98b89195241"
    ],
    "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": "0xf0fd58a7",
            "selector": "0xf0fd58a7",
            "calldata_variants": [
                "0xf0fd58a7",
                "0xf0fd58a70000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xf5537ede",
            "selector": "0xf5537ede",
            "calldata_variants": [
                "0xf5537ede",
                "0xf5537ede0000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xfbfbbfed",
            "selector": "0xfbfbbfed",
            "calldata_variants": [
                "0xfbfbbfed",
                "0xfbfbbfed0000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xe38e7821",
            "selector": "0xe38e7821",
            "calldata_variants": [
                "0xe38e7821",
                "0xe38e78210000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xe9bb84c2",
            "selector": "0xe9bb84c2",
            "calldata_variants": [
                "0xe9bb84c2",
                "0xe9bb84c20000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xea23c389",
            "selector": "0xea23c389",
            "calldata_variants": [
                "0xea23c389",
                "0xea23c3890000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xb269681d",
            "selector": "0xb269681d",
            "calldata_variants": [
                "0xb269681d",
                "0xb269681d0000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xc59edb61",
            "selector": "0xc59edb61",
            "calldata_variants": [
                "0xc59edb61",
                "0xc59edb610000000000000000000000000000000000000000000000000000000000000000"
            ]
        }
    ]
}
evidence_json
{
    "examples": [
        {
            "pc": 7013,
            "opcode": "CALL",
            "returndata_checked": null,
            "value_expression_category": "computed",
            "target_expression_category": "computed"
        },
        {
            "pc": 7311,
            "opcode": "CALL",
            "returndata_checked": null,
            "value_expression_category": "computed",
            "target_expression_category": "computed"
        },
        {
            "pc": 7527,
            "opcode": "CALL",
            "returndata_checked": null,
            "value_expression_category": "computed",
            "target_expression_category": "computed"
        }
    ],
    "eth_value_calls": 6,
    "guards_detected": []
}
medium other detector CREATE/CREATE2 reachable 45 no no
view
trace_id: 0x7ccb34ba82fa69b016fbc6007d6b1e9a855fffea7407b2576b95c449e3fce45a
validation_json
{
    "sink": "CREATE",
    "errors": 0,
    "status": "unknown",
    "attempts": 32,
    "trace_id": "0x7ccb34ba82fa69b016fbc6007d6b1e9a855fffea7407b2576b95c449e3fce45a",
    "confirmed": false,
    "trace_mode": "structLogs",
    "call_targets": null,
    "matched_probe": null,
    "target_varies": null,
    "classification": "no_sink"
}
witness_json
{
    "notes": "heuristic witness; entrypoints are best-effort selectors with zeroed calldata",
    "constraints": [],
    "entrypoints": [
        {
            "calldata": "0xf0fd58a7",
            "selector": "0xf0fd58a7",
            "calldata_variants": [
                "0xf0fd58a7",
                "0xf0fd58a70000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xf5537ede",
            "selector": "0xf5537ede",
            "calldata_variants": [
                "0xf5537ede",
                "0xf5537ede0000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xfbfbbfed",
            "selector": "0xfbfbbfed",
            "calldata_variants": [
                "0xfbfbbfed",
                "0xfbfbbfed0000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xe38e7821",
            "selector": "0xe38e7821",
            "calldata_variants": [
                "0xe38e7821",
                "0xe38e78210000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xe9bb84c2",
            "selector": "0xe9bb84c2",
            "calldata_variants": [
                "0xe9bb84c2",
                "0xe9bb84c20000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xea23c389",
            "selector": "0xea23c389",
            "calldata_variants": [
                "0xea23c389",
                "0xea23c3890000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xb269681d",
            "selector": "0xb269681d",
            "calldata_variants": [
                "0xb269681d",
                "0xb269681d0000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xc59edb61",
            "selector": "0xc59edb61",
            "calldata_variants": [
                "0xc59edb61",
                "0xc59edb610000000000000000000000000000000000000000000000000000000000000000"
            ]
        }
    ]
}
evidence_json
{
    "create_count": 0,
    "create2_count": 1
}
low other cast Contract creation opcode present 60 no
view
evidence_json
{
    "notes": "runtime can deploy contracts dynamically via CREATE/CREATE2",
    "create_count": 0,
    "create2_count": 1
}