73577ec6-1e74-4f61-9fee-a5ebf7f88ac0
Open this run to answer one question: is this real attacker-relevant behavior with real impact, or just normal contract plumbing?
| ID | Type | Status | Attempts | Heartbeat |
|---|---|---|---|---|
| 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 |
No slither job recorded yet.
[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"]}]}
{
"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
}
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
| Severity | Category | Tool | Title | Confidence | Validated | Confirmed | Details |
|---|---|---|---|---|---|---|---|
| critical | access_control | codex | Unrestricted batch transfer allows draining ETH/ERC20 balances | 90 | no | — |
viewevidence_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 |
viewtrace_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 |
viewtrace_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 |
viewtrace_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 | — |
viewevidence_json{
"notes": "runtime can deploy contracts dynamically via CREATE/CREATE2",
"create_count": 0,
"create2_count": 1
}
|