27854931-6298-47ab-a143-fe61a05b0147
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 |
|---|---|---|---|---|
| 31326 | report.consolidate | complete | 1 / 1 | 3 months ago |
| 110954 | artifact.fetch | complete | 1 / 3 | 1 week ago |
| 110955 | tool.cast_disasm | complete | 1 / 3 | 1 week ago |
| 110956 | analysis.bundle | complete | 1 / 3 | 1 week ago |
| 110957 | capability.graph | complete | 1 / 3 | 1 week ago |
| 110958 | detector.run | complete | 1 / 3 | 1 week ago |
| 110959 | validation.fork | complete | 1 / 3 | 1 week ago |
No slither job recorded yet.
[codex:489133] OpenAI Codex v0.77.0 (research preview)
[codex:489133] --------
[codex:489133] workdir: /tmp/codex-multi-l61vr90y
[codex:489133] model: gpt-5.2-codex
[codex:489133] provider: openai
[codex:489133] approval: never
[codex:489133] sandbox: read-only
[codex:489133] reasoning effort: xhigh
[codex:489133] reasoning summaries: auto
[codex:489133] session id: 019b8032-5557-71a2-97d4-5f7a6a26f1ee
[codex:489133] --------
[codex:489133] user
[codex:489133] You are a profit-focused exploit hunter. Your ONLY goal is finding ways to extract value (ETH, tokens, NFTs) from this contract.
[codex:489133]
[codex:489133] Read `AUDIT_BUNDLE.txt` completely before concluding. Treat `lib/` and `@openzeppelin/` as trusted unless misused.
[codex:489133]
[codex:489133] ONLY REPORT if you find a CONCRETE, EXPLOITABLE path to profit. We do NOT care about:
[codex:489133] - Gas inefficiency, code quality, naming, or best practices
[codex:489133] - Theoretical vulnerabilities without a clear extraction path
[codex:489133] - Centralization risks (admin can rug) - assume admin keys are secure
[codex:489133] - Front-running unless it enables theft beyond MEV
[codex:489133] - DoS, griefing, or issues that don't result in attacker profit
[codex:489133] - Missing events, view function issues, or informational findings
[codex:489133]
[codex:489133] HIGH-VALUE PATTERNS TO HUNT:
[codex:489133] - Reentrancy: external calls before state updates that allow double-withdrawal
[codex:489133] - Access control: missing/bypassable auth on withdraw, transfer, or mint functions
[codex:489133] - Flash loan attacks: borrow -> manipulate -> profit in single tx
[codex:489133] - Price oracle manipulation: TWAP with short window, spot price reads, stale prices
[codex:489133] - Signature replay: missing nonce, chainId, or deadline in permit/meta-tx
[codex:489133] - Proxy hijacking: unprotected initialize(), storage collision, UUPS without auth
[codex:489133] - Accounting errors: rounding that favors attacker, share inflation, first depositor attacks
[codex:489133] - Unchecked external calls: return value ignored on token transfers enabling fake tokens
[codex:489133] - Cross-function reentrancy: state read in function A, modified via reentrant call, used stale in A
[codex:489133]
[codex:489133] For each finding, you MUST provide:
[codex:489133] 1. Exact file and line numbers of vulnerable code
[codex:489133] 2. Step-by-step exploit transaction sequence
[codex:489133] 3. Estimated profit potential (order of magnitude: contract balance, LP reserves, etc.)
[codex:489133]
[codex:489133] If no concrete profit path exists: set no_findings=true. Do NOT pad with low-severity noise.
[codex:489133]
[codex:489133] Output MUST be valid JSON matching the provided schema.
[codex:489133] - severity: info, low, medium, high, critical (use high/critical ONLY for clear extraction paths)
[codex:489133] - category: access_control, reentrancy, math, oracle, upgradeability, auth, other
[codex:489133] mcp startup: no servers
[codex:489133]
[codex:489133] thinking
[codex:489133] **Preparing to read AUDIT_BUNDLE.txt**
[codex:489133] exec
[codex:489133] /bin/bash -lc ls in /tmp/codex-multi-l61vr90y succeeded in 5ms:
[codex:489133] AUDIT_BUNDLE.txt
[codex:489133] codex-output-schema.json
[codex:489133] contracts
[codex:489133] exec
[codex:489133] /bin/bash -lc 'cat AUDIT_BUNDLE.txt' in /tmp/codex-multi-l61vr90y succeeded in 6ms:
[codex:489133] This file concatenates first-party Solidity sources only (lib/@openzeppelin excluded).
[codex:489133]
[codex:489133] ================================================================================
[codex:489133] FILE: contracts/@keep-network/keep-core/contracts/Authorizations.sol
[codex:489133] ================================================================================
[codex:489133] /**
[codex:489133] ▓▓▌ ▓▓ ▐▓▓ ▓▓▓▓▓▓▓▓▓▓▌▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▄
[codex:489133] ▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▌▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
[codex:489133] ▓▓▓▓▓▓ ▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓ ▐▓▓▓▓▓ ▓▓▓▓▓▓ ▓▓▓▓▓ ▐▓▓▓▓▓▌ ▐▓▓▓▓▓▓
[codex:489133] ▓▓▓▓▓▓▄▄▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓▄▄▄▄ ▓▓▓▓▓▓▄▄▄▄ ▐▓▓▓▓▓▌ ▐▓▓▓▓▓▓
[codex:489133] ▓▓▓▓▓▓▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▌ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
[codex:489133] ▓▓▓▓▓▓▀▀▓▓▓▓▓▓▄ ▐▓▓▓▓▓▓▀▀▀▀ ▓▓▓▓▓▓▀▀▀▀ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▀
[codex:489133] ▓▓▓▓▓▓ ▀▓▓▓▓▓▓▄ ▐▓▓▓▓▓▓ ▓▓▓▓▓ ▓▓▓▓▓▓ ▓▓▓▓▓ ▐▓▓▓▓▓▌
[codex:489133] ▓▓▓▓▓▓▓▓▓▓ █▓▓▓▓▓▓▓▓▓ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓
[codex:489133] ▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓
[codex:489133]
[codex:489133] Trust math, not hardware.
[codex:489133] */
[codex:489133]
[codex:489133] pragma solidity 0.5.17;
[codex:489133]
[codex:489133] thinking
[codex:489133] **Analyzing large audit bundle for exploits**
[codex:489133] exec
[codex:489133] /bin/bash -lc "rg -n \"initialize|init|upgrade|proxy|delegatecall|call\\.value|transfer\\(|send\\(|call\\(\" -S contracts/AUDIT_BUNDLE.txt" in /tmp/codex-multi-l61vr90y exited 2 in 14ms:
[codex:489133] rg: contracts/AUDIT_BUNDLE.txt: IO error for operation on contracts/AUDIT_BUNDLE.txt: No such file or directory (os error 2)
[codex:489133]
[codex:489133] thinking
[codex:489133] **Correcting file path to root**
[codex:489133] exec
[codex:489133] /bin/bash -lc "rg -n \"initialize|init|upgrade|proxy|delegatecall|call\\.value|transfer\\(|send\\(\" -S AUDIT_BUNDLE.txt" in /tmp/codex-multi-l61vr90y succeeded in 11ms:
[codex:489133] 67: // Registry contract with a list of approved operator contracts and upgraders.
[codex:489133] 338: // Each service contract has a Operator Contract Upgrader whose purpose
[codex:489133] 340: // The Operator Contract Upgrader can add new operator contracts to the
[codex:489133] 342: mapping(address => address) public operatorContractUpgraders;
[codex:489133] 344: // Operator contract may have a Service Contract Upgrader whose purpose is
[codex:489133] 346: // Service Contract Upgrader can add and remove service contracts
[codex:489133] 351: mapping(address => address) public serviceContractUpgraders;
[codex:489133] 367: event OperatorContractUpgraderUpdated(
[codex:489133] 369: address upgrader
[codex:489133] 371: event ServiceContractUpgraderUpdated(
[codex:489133] 466: function setOperatorContractUpgrader(
[codex:489133] 468: address _operatorContractUpgrader
[codex:489133] 470: operatorContractUpgraders[_serviceContract] = _operatorContractUpgrader;
[codex:489133] 471: emit OperatorContractUpgraderUpdated(
[codex:489133] 473: _operatorContractUpgrader
[codex:489133] 477: function setServiceContractUpgrader(
[codex:489133] 479: address _serviceContractUpgrader
[codex:489133] 481: serviceContractUpgraders[_operatorContract] = _serviceContractUpgrader;
[codex:489133] 482: emit ServiceContractUpgraderUpdated(
[codex:489133] 484: _serviceContractUpgrader
[codex:489133]
[codex:489133] thinking
[codex:489133] **Investigating potential reentrancy vulnerabilities**
[codex:489133] exec
[codex:489133] /bin/bash -lc 'rg --files contracts' in /tmp/codex-multi-l61vr90y succeeded in 8ms:
[codex:489133] contracts/solidity/contracts/KeepBonding.sol
[codex:489133] contracts/solidity/contracts/CandidatesPools.sol
[codex:489133] contracts/solidity/contracts/AbstractBonding.sol
[codex:489133] contracts/solidity/contracts/KeepCreator.sol
[codex:489133] contracts/solidity/contracts/BondedECDSAKeepFactory.sol
[codex:489133] contracts/solidity/contracts/CloneFactory.sol
[codex:489133] contracts/solidity/contracts/GroupSelectionSeed.sol
[codex:489133] contracts/solidity/contracts/AbstractBondedECDSAKeep.sol
[codex:489133] contracts/solidity/contracts/BondedECDSAKeep.sol
[codex:489133] contracts/solidity/contracts/api/IBondedECDSAKeep.sol
[codex:489133] contracts/solidity/contracts/api/IBondedECDSAKeepFactory.sol
[codex:489133] contracts/solidity/contracts/api/IBondingManagement.sol
[codex:489133] contracts/openzeppelin-solidity/contracts/math/SafeMath.sol
[codex:489133] contracts/@keep-network/keep-core/contracts/Authorizations.sol
[codex:489133] contracts/@keep-network/keep-core/contracts/IRandomBeacon.sol
[codex:489133] contracts/@keep-network/keep-core/contracts/KeepToken.sol
[codex:489133] contracts/@keep-network/keep-core/contracts/ManagedGrant.sol
[codex:489133] contracts/@keep-network/keep-core/contracts/TokenSender.sol
[codex:489133] contracts/@keep-network/keep-core/contracts/TokenGrant.sol
[codex:489133] contracts/@keep-network/keep-core/contracts/GrantStakingPolicy.sol
[codex:489133]
[codex:489133] thinking
[codex:489133] **Investigating potential reentrancy vulnerability**
[codex:489133] exec
[codex:489133] /bin/bash -lc "sed -n '1,240p' contracts/solidity/contracts/KeepBonding.sol" in /tmp/codex-multi-l61vr90y succeeded in 5ms:
[codex:489133] /**
[codex:489133] ▓▓▌ ▓▓ ▐▓▓ ▓▓▓▓▓▓▓▓▓▓▌▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▄
[codex:489133] ▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▌▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
[codex:489133] ▓▓▓▓▓▓ ▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓ ▐▓▓▓▓▓ ▓▓▓▓▓▓ ▓▓▓▓▓ ▐▓▓▓▓▓▌ ▐▓▓▓▓▓▓
[codex:489133] ▓▓▓▓▓▓▄▄▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓▄▄▄▄ ▓▓▓▓▓▓▄▄▄▄ ▐▓▓▓▓▓▌ ▐▓▓▓▓▓▓
[codex:489133] ▓▓▓▓▓▓▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▌ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
[codex:489133] ▓▓▓▓▓▓▀▀▓▓▓▓▓▓▄ ▐▓▓▓▓▓▓▀▀▀▀ ▓▓▓▓▓▓▀▀▀▀ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▀
[codex:489133] ▓▓▓▓▓▓ ▀▓▓▓▓▓▓▄ ▐▓▓▓▓▓▓ ▓▓▓▓▓ ▓▓▓▓▓▓ ▓▓▓▓▓ ▐▓▓▓▓▓▌
[codex:489133] ▓▓▓▓▓▓▓▓▓▓ █▓▓▓▓▓▓▓▓▓ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓
[codex:489133] ▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓
[codex:489133]
[codex:489133] Trust math, not hardware.
[codex:489133] */
[codex:489133]
[codex:489133] pragma solidity 0.5.17;
[codex:489133]
[codex:489133] import "./AbstractBonding.sol";
[codex:489133]
[codex:489133] import "@keep-network/keep-core/contracts/TokenGrant.sol";
[codex:489133] import "@keep-network/keep-core/contracts/libraries/RolesLookup.sol";
[codex:489133]
[codex:489133] thinking
[codex:489133] **Checking inheritance for withdrawBond method**
[codex:489133] exec
[codex:489133] /bin/bash -lc "sed -n '1,240p' contracts/solidity/contracts/AbstractBonding.sol" in /tmp/codex-multi-l61vr90y succeeded in 6ms:
[codex:489133] /**
[codex:489133] ▓▓▌ ▓▓ ▐▓▓ ▓▓▓▓▓▓▓▓▓▓▌▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▄
[codex:489133] ▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▌▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
[codex:489133] ▓▓▓▓▓▓ ▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓ ▐▓▓▓▓▓ ▓▓▓▓▓▓ ▓▓▓▓▓ ▐▓▓▓▓▓▌ ▐▓▓▓▓▓▓
[codex:489133] ▓▓▓▓▓▓▄▄▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓▄▄▄▄ ▓▓▓▓▓▓▄▄▄▄ ▐▓▓▓▓▓▌ ▐▓▓▓▓▓▓
[codex:489133] ▓▓▓▓▓▓▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▌ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
[codex:489133] ▓▓▓▓▓▓▀▀▓▓▓▓▓▓▄ ▐▓▓▓▓▓▓▀▀▀▀ ▓▓▓▓▓▓▀▀▀▀ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▀
[codex:489133] ▓▓▓▓▓▓ ▀▓▓▓▓▓▓▄ ▐▓▓▓▓▓▓ ▓▓▓▓▓ ▓▓▓▓▓▓ ▓▓▓▓▓ ▐▓▓▓▓▓▌
[codex:489133] ▓▓▓▓▓▓▓▓▓▓ █▓▓▓▓▓▓▓▓▓ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓
[codex:489133] ▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓
[codex:489133]
[codex:489133] Trust math, not hardware.
[codex:489133] */
[codex:489133]
[codex:489133] pragma solidity 0.5.17;
[codex:489133]
[codex:489133] import "./api/IBondingManagement.sol";
[codex:489133]
[codex:489133] import "@keep-network/keep-core/contracts/KeepRegistry.sol";
[codex:489133]
[codex:489133] exec
[codex:489133] /bin/bash -lc "sed -n '240,520p' contracts/solidity/contracts/AbstractBonding.sol" in /tmp/codex-multi-l61vr90y succeeded in 5ms:
[codex:489133] lockedBonds[bondID] = 0;
[codex:489133] unbondedValue[operator] = unbondedValue[operator].add(amount);
[codex:489133]
[codex:489133] emit BondReleased(operator, referenceID);
[codex:489133] }
[codex:489133]
[codex:489133] /// @notice Seizes the bond by moving some or all of the locked bond to the
[codex:489133] /// provided destination address.
[codex:489133] /// @dev Function requires that a caller is the holder of the bond which is
[codex:489133] /// being seized.
[codex:489133] /// @param operator Address of the bonded operator.
[codex:489133] /// @param referenceID Reference ID of the bond.
[codex:489133] /// @param amount Amount to be seized.
[codex:489133] /// @param destination Address to send the amount to.
[codex:489133] function seizeBond(
[codex:489133] address operator,
[codex:489133] uint256 referenceID,
[codex:489133] uint256 amount,
[codex:489133] address payable destination
[codex:489133] ) public {
[codex:489133]
[codex:489133] thinking
[codex:489133] **Analyzing reentrancy and initialization risks**
[codex:489133]
[codex:489133] I'm scrutinizing how state updates before external calls might prevent reentrancy in withdrawBond and seizeBond. While direct reentrancy seems guarded by state changes, I’m curious about other attack vectors like unauthorized bond seizure or misuse of initialization in cloned contracts, especially if unprotected initialize functions could let an attacker hijack keeps before factory setup completes. There's a lot here around permissions and potential attack surfaces to explore!
[codex:489133] exec
[codex:489133] /bin/bash -lc "sed -n '1,260p' contracts/solidity/contracts/BondedECDSAKeepFactory.sol" in /tmp/codex-multi-l61vr90y succeeded in 5ms:
[codex:489133] /**
[codex:489133] ▓▓▌ ▓▓ ▐▓▓ ▓▓▓▓▓▓▓▓▓▓▌▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▄
[codex:489133] ▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▌▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
[codex:489133] ▓▓▓▓▓▓ ▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓ ▐▓▓▓▓▓ ▓▓▓▓▓▓ ▓▓▓▓▓ ▐▓▓▓▓▓▌ ▐▓▓▓▓▓▓
[codex:489133] ▓▓▓▓▓▓▄▄▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓▄▄▄▄ ▓▓▓▓▓▓▄▄▄▄ ▐▓▓▓▓▓▌ ▐▓▓▓▓▓▓
[codex:489133] ▓▓▓▓▓▓▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▌ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
[codex:489133] ▓▓▓▓▓▓▀▀▓▓▓▓▓▓▄ ▐▓▓▓▓▓▓▀▀▀▀ ▓▓▓▓▓▓▀▀▀▀ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▀
[codex:489133] ▓▓▓▓▓▓ ▀▓▓▓▓▓▓▄ ▐▓▓▓▓▓▓ ▓▓▓▓▓ ▓▓▓▓▓▓ ▓▓▓▓▓ ▐▓▓▓▓▓▌
[codex:489133] ▓▓▓▓▓▓▓▓▓▓ █▓▓▓▓▓▓▓▓▓ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓
[codex:489133] ▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓
[codex:489133]
[codex:489133] Trust math, not hardware.
[codex:489133] */
[codex:489133]
[codex:489133] pragma solidity 0.5.17;
[codex:489133]
[codex:489133] import "./BondedECDSAKeep.sol";
[codex:489133] import "./KeepBonding.sol";
[codex:489133] import "./api/IBondedECDSAKeepFactory.sol";
[codex:489133] import "./KeepCreator.sol";
[codex:489133]
[codex:489133] thinking
[codex:489133] **Inspecting reentrancy protections**
[codex:489133] exec
[codex:489133] /bin/bash -lc "sed -n '1,280p' contracts/solidity/contracts/BondedECDSAKeep.sol" in /tmp/codex-multi-l61vr90y succeeded in 6ms:
[codex:489133] /**
[codex:489133] ▓▓▌ ▓▓ ▐▓▓ ▓▓▓▓▓▓▓▓▓▓▌▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▄
[codex:489133] ▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▌▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
[codex:489133] ▓▓▓▓▓▓ ▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓ ▐▓▓▓▓▓ ▓▓▓▓▓▓ ▓▓▓▓▓ ▐▓▓▓▓▓▌ ▐▓▓▓▓▓▓
[codex:489133] ▓▓▓▓▓▓▄▄▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓▄▄▄▄ ▓▓▓▓▓▓▄▄▄▄ ▐▓▓▓▓▓▌ ▐▓▓▓▓▓▓
[codex:489133] ▓▓▓▓▓▓▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▌ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
[codex:489133] ▓▓▓▓▓▓▀▀▓▓▓▓▓▓▄ ▐▓▓▓▓▓▓▀▀▀▀ ▓▓▓▓▓▓▀▀▀▀ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▀
[codex:489133] ▓▓▓▓▓▓ ▀▓▓▓▓▓▓▄ ▐▓▓▓▓▓▓ ▓▓▓▓▓ ▓▓▓▓▓▓ ▓▓▓▓▓ ▐▓▓▓▓▓▌
[codex:489133] ▓▓▓▓▓▓▓▓▓▓ █▓▓▓▓▓▓▓▓▓ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓
[codex:489133] ▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓
[codex:489133]
[codex:489133] Trust math, not hardware.
[codex:489133] */
[codex:489133]
[codex:489133] pragma solidity 0.5.17;
[codex:489133]
[codex:489133] import "./AbstractBondedECDSAKeep.sol";
[codex:489133] import "./BondedECDSAKeepFactory.sol";
[codex:489133]
[codex:489133] import "@keep-network/keep-core/contracts/TokenStaking.sol";
[codex:489133]
[codex:489133] thinking
[codex:489133] **Inspecting AbstractBondedECDSAKeep for vulnerabilities**
[codex:489133] exec
[codex:489133] /bin/bash -lc "sed -n '1,260p' contracts/solidity/contracts/AbstractBondedECDSAKeep.sol" in /tmp/codex-multi-l61vr90y succeeded in 7ms:
[codex:489133] /**
[codex:489133] ▓▓▌ ▓▓ ▐▓▓ ▓▓▓▓▓▓▓▓▓▓▌▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▄
[codex:489133] ▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▌▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
[codex:489133] ▓▓▓▓▓▓ ▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓ ▐▓▓▓▓▓ ▓▓▓▓▓▓ ▓▓▓▓▓ ▐▓▓▓▓▓▌ ▐▓▓▓▓▓▓
[codex:489133] ▓▓▓▓▓▓▄▄▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓▄▄▄▄ ▓▓▓▓▓▓▄▄▄▄ ▐▓▓▓▓▓▌ ▐▓▓▓▓▓▓
[codex:489133] ▓▓▓▓▓▓▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▌ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
[codex:489133] ▓▓▓▓▓▓▀▀▓▓▓▓▓▓▄ ▐▓▓▓▓▓▓▀▀▀▀ ▓▓▓▓▓▓▀▀▀▀ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▀
[codex:489133] ▓▓▓▓▓▓ ▀▓▓▓▓▓▓▄ ▐▓▓▓▓▓▓ ▓▓▓▓▓ ▓▓▓▓▓▓ ▓▓▓▓▓ ▐▓▓▓▓▓▌
[codex:489133] ▓▓▓▓▓▓▓▓▓▓ █▓▓▓▓▓▓▓▓▓ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓
[codex:489133] ▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓
[codex:489133]
[codex:489133] Trust math, not hardware.
[codex:489133] */
[codex:489133]
[codex:489133] pragma solidity 0.5.17;
[codex:489133]
[codex:489133] import "./api/IBondedECDSAKeep.sol";
[codex:489133] import "./api/IBondingManagement.sol";
[codex:489133]
[codex:489133] import "@keep-network/keep-core/contracts/utils/AddressArrayUtils.sol";
[codex:489133] exec
[codex:489133] /bin/bash -lc "sed -n '260,620p' contracts/solidity/contracts/AbstractBondedECDSAKeep.sol" in /tmp/codex-multi-l61vr90y succeeded in 5ms:
[codex:489133] uint256 dividend = msg.value.div(memberCount);
[codex:489133]
[codex:489133] require(dividend > 0, "Dividend value must be non-zero");
[codex:489133]
[codex:489133] for (uint16 i = 0; i < memberCount - 1; i++) {
[codex:489133] memberETHBalances[members[i]] += dividend;
[codex:489133] }
[codex:489133]
[codex:489133] // Give the dividend to the last signer. Remainder might be equal to
[codex:489133] // zero in case of even distribution or some small number.
[codex:489133] uint256 remainder = msg.value.mod(memberCount);
[codex:489133] memberETHBalances[members[memberCount - 1]] += dividend.add(remainder);
[codex:489133]
[codex:489133] emit ETHRewardDistributed(msg.value);
[codex:489133] }
[codex:489133]
[codex:489133] /// @notice Distributes ERC20 reward evenly across all keep signer beneficiaries.
[codex:489133] /// @dev This works with any ERC20 token that implements a transferFrom
[codex:489133] /// function similar to the interface imported here from
[codex:489133] /// OpenZeppelin. This function only has authority over pre-approved
[codex:489133] exec
[codex:489133] /bin/bash -lc "sed -n '620,980p' contracts/solidity/contracts/AbstractBondedECDSAKeep.sol" in /tmp/codex-multi-l61vr90y succeeded in 5ms:
[codex:489133] markAsTerminated();
[codex:489133] }
[codex:489133]
[codex:489133] /// @notice Punishes keep members after proving a signature fraud.
[codex:489133] function slashForSignatureFraud() internal;
[codex:489133]
[codex:489133] /// @notice Gets the beneficiary for the specified member address.
[codex:489133] /// @param _member Member address.
[codex:489133] /// @return Beneficiary address.
[codex:489133] function beneficiaryOf(address _member)
[codex:489133] internal
[codex:489133] view
[codex:489133] returns (address payable);
[codex:489133]
[codex:489133] /// @notice Checks if the caller is the keep's owner.
[codex:489133] /// @dev Throws an error if called by any account other than owner.
[codex:489133] modifier onlyOwner() {
[codex:489133] require(owner == msg.sender, "Caller is not the keep owner");
[codex:489133] _;
[codex:489133] }
[codex:489133]
[codex:489133] thinking
[codex:489133] **Analyzing potential withdraw vulnerabilities**
[codex:489133] exec
[codex:489133] /bin/bash -lc "rg -n \"call\\.value\" contracts -S" in /tmp/codex-multi-l61vr90y succeeded in 13ms:
[codex:489133] contracts/solidity/contracts/GroupSelectionSeed.sol:126: address(randomBeacon).call.value(payment)(
[codex:489133] contracts/solidity/contracts/AbstractBonding.sol:274: (bool success, ) = destination.call.value(amount)("");
[codex:489133] contracts/solidity/contracts/AbstractBonding.sol:353: (bool success, ) = beneficiary.call.value(amount)("");
[codex:489133] contracts/solidity/contracts/AbstractBondedECDSAKeep.sol:338: (bool success, ) = beneficiaryOf(_member).call.value(value)("");
[codex:489133]
[codex:489133] thinking
[codex:489133] **Analyzing possible reentrancy in GroupSelectionSeed**
[codex:489133] exec
[codex:489133] /bin/bash -lc "sed -n '1,220p' contracts/solidity/contracts/GroupSelectionSeed.sol" in /tmp/codex-multi-l61vr90y succeeded in 5ms:
[codex:489133] /**
[codex:489133] ▓▓▌ ▓▓ ▐▓▓ ▓▓▓▓▓▓▓▓▓▓▌▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▄
[codex:489133] ▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▌▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
[codex:489133] ▓▓▓▓▓▓ ▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓ ▐▓▓▓▓▓ ▓▓▓▓▓▓ ▓▓▓▓▓ ▐▓▓▓▓▓▌ ▐▓▓▓▓▓▓
[codex:489133] ▓▓▓▓▓▓▄▄▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓▄▄▄▄ ▓▓▓▓▓▓▄▄▄▄ ▐▓▓▓▓▓▌ ▐▓▓▓▓▓▓
[codex:489133] ▓▓▓▓▓▓▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▌ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
[codex:489133] ▓▓▓▓▓▓▀▀▓▓▓▓▓▓▄ ▐▓▓▓▓▓▓▀▀▀▀ ▓▓▓▓▓▓▀▀▀▀ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▀
[codex:489133] ▓▓▓▓▓▓ ▀▓▓▓▓▓▓▄ ▐▓▓▓▓▓▓ ▓▓▓▓▓ ▓▓▓▓▓▓ ▓▓▓▓▓ ▐▓▓▓▓▓▌
[codex:489133] ▓▓▓▓▓▓▓▓▓▓ █▓▓▓▓▓▓▓▓▓ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓
[codex:489133] ▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓
[codex:489133]
[codex:489133] Trust math, not hardware.
[codex:489133] */
[codex:489133]
[codex:489133] pragma solidity 0.5.17;
[codex:489133]
[codex:489133] import "@keep-network/keep-core/contracts/IRandomBeacon.sol";
[codex:489133]
[codex:489133] import "openzeppelin-solidity/contracts/math/SafeMath.sol";
[codex:489133] import "openzeppelin-solidity/contracts/utils/ReentrancyGuard.sol";
[codex:489133]
[codex:489133] thinking
[codex:489133] **Analyzing reentrancy risks and token grant concerns**
[codex:489133] exec
[codex:489133] /bin/bash -lc "sed -n '1,260p' contracts/@keep-network/keep-core/contracts/TokenGrant.sol" in /tmp/codex-multi-l61vr90y succeeded in 5ms:
[codex:489133] pragma solidity 0.5.17;
[codex:489133]
[codex:489133] import "openzeppelin-solidity/contracts/token/ERC20/ERC20Burnable.sol";
[codex:489133] import "openzeppelin-solidity/contracts/token/ERC20/SafeERC20.sol";
[codex:489133] import "openzeppelin-solidity/contracts/math/SafeMath.sol";
[codex:489133] import "./libraries/grant/UnlockingSchedule.sol";
[codex:489133] import "./utils/BytesLib.sol";
[codex:489133] import "./utils/AddressArrayUtils.sol";
[codex:489133] import "./TokenStaking.sol";
[codex:489133] import "./TokenGrantStake.sol";
[codex:489133] import "./GrantStakingPolicy.sol";
[codex:489133]
[codex:489133]
[codex:489133] /// @title TokenGrant
[codex:489133] /// @notice A token grant contract for a specified standard ERC20Burnable token.
[codex:489133] /// Has additional functionality to stake delegate/undelegate token grants.
[codex:489133] /// Tokens are granted to the grantee via unlocking scheme and can be
[codex:489133] /// withdrawn gradually based on the unlocking schedule cliff and unlocking duration.
[codex:489133] /// Optionally grant can be revoked by the token grant manager.
[codex:489133] contract TokenGrant {
[codex:489133] exec
[codex:489133] /bin/bash -lc "sed -n '260,620p' contracts/@keep-network/keep-core/contracts/TokenGrant.sol" in /tmp/codex-multi-l61vr90y succeeded in 5ms:
[codex:489133] /// @dev Transfers unlocked tokens of the token grant to grantee.
[codex:489133] /// @param _id Grant ID.
[codex:489133] function withdraw(uint256 _id) public {
[codex:489133] uint256 amount = withdrawable(_id);
[codex:489133] require(amount > 0, "Grant available to withdraw amount should be greater than zero.");
[codex:489133]
[codex:489133] // Update withdrawn amount.
[codex:489133] grants[_id].withdrawn = grants[_id].withdrawn.add(amount);
[codex:489133]
[codex:489133] // Update grantee grants balance.
[codex:489133] balances[grants[_id].grantee] = balances[grants[_id].grantee].sub(amount);
[codex:489133]
[codex:489133] // Transfer tokens from this contract balance to the grantee token balance.
[codex:489133] token.safeTransfer(grants[_id].grantee, amount);
[codex:489133]
[codex:489133] emit TokenGrantWithdrawn(_id, amount);
[codex:489133] }
[codex:489133]
[codex:489133] /// @notice Calculates and returns unlocked grant amount.
[codex:489133] /// @dev Calculates token grant amount that has already unlocked,
[codex:489133]
[codex:489133] thinking
[codex:489133] **Analyzing potential TokenGrant vulnerabilities**
[codex:489133] exec
[codex:489133] /bin/bash -lc "sed -n '1,260p' contracts/@keep-network/keep-core/contracts/TokenGrantStake.sol" in /tmp/codex-multi-l61vr90y succeeded in 6ms:
[codex:489133] pragma solidity 0.5.17;
[codex:489133]
[codex:489133] import "openzeppelin-solidity/contracts/token/ERC20/ERC20Burnable.sol";
[codex:489133] import "openzeppelin-solidity/contracts/token/ERC20/SafeERC20.sol";
[codex:489133] import "openzeppelin-solidity/contracts/math/SafeMath.sol";
[codex:489133] import "./TokenStaking.sol";
[codex:489133] import "./TokenSender.sol";
[codex:489133] import "./utils/BytesLib.sol";
[codex:489133]
[codex:489133] /// @dev Interface of sender contract for approveAndCall pattern.
[codex:489133] interface tokenSender {
[codex:489133] function approveAndCall(address _spender, uint256 _value, bytes calldata _extraData) external;
[codex:489133] }
[codex:489133]
[codex:489133] contract TokenGrantStake {
[codex:489133] using SafeMath for uint256;
[codex:489133] using BytesLib for bytes;
[codex:489133]
[codex:489133] ERC20Burnable token;
[codex:489133] TokenStaking tokenStaking;
[codex:489133]
[codex:489133] thinking
[codex:489133] **Verifying access control**
[codex:489133] exec
[codex:489133] /bin/bash -lc "sed -n '1,260p' contracts/@keep-network/keep-core/contracts/TokenStaking.sol" in /tmp/codex-multi-l61vr90y succeeded in 6ms:
[codex:489133] /**
[codex:489133] ▓▓▌ ▓▓ ▐▓▓ ▓▓▓▓▓▓▓▓▓▓▌▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▄
[codex:489133] ▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▌▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
[codex:489133] ▓▓▓▓▓▓ ▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓ ▐▓▓▓▓▓ ▓▓▓▓▓▓ ▓▓▓▓▓ ▐▓▓▓▓▓▌ ▐▓▓▓▓▓▓
[codex:489133] ▓▓▓▓▓▓▄▄▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓▄▄▄▄ ▓▓▓▓▓▓▄▄▄▄ ▐▓▓▓▓▓▌ ▐▓▓▓▓▓▓
[codex:489133] ▓▓▓▓▓▓▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▌ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
[codex:489133] ▓▓▓▓▓▓▀▀▓▓▓▓▓▓▄ ▐▓▓▓▓▓▓▀▀▀▀ ▓▓▓▓▓▓▀▀▀▀ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▀
[codex:489133] ▓▓▓▓▓▓ ▀▓▓▓▓▓▓▄ ▐▓▓▓▓▓▓ ▓▓▓▓▓ ▓▓▓▓▓▓ ▓▓▓▓▓ ▐▓▓▓▓▓▌
[codex:489133] ▓▓▓▓▓▓▓▓▓▓ █▓▓▓▓▓▓▓▓▓ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓
[codex:489133] ▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓
[codex:489133]
[codex:489133] Trust math, not hardware.
[codex:489133] */
[codex:489133]
[codex:489133] pragma solidity 0.5.17;
[codex:489133]
[codex:489133] import "openzeppelin-solidity/contracts/token/ERC20/ERC20Burnable.sol";
[codex:489133] import "openzeppelin-solidity/contracts/token/ERC20/SafeERC20.sol";
[codex:489133] import "openzeppelin-solidity/contracts/math/SafeMath.sol";
[codex:489133] import "./StakeDelegatable.sol";
[codex:489133]
[codex:489133] thinking
[codex:489133] **Searching for withdrawal functions**
[codex:489133] exec
[codex:489133] /bin/bash -lc "rg -n \"withdraw|recover|seize|slash|transfer|call\\.value\" contracts/@keep-network/keep-core/contracts/TokenStaking.sol" in /tmp/codex-multi-l61vr90y succeeded in 6ms:
[codex:489133] 35:/// and recover the stake after undelegation period is over.
[codex:489133] 127: /// @notice Receives approval of token transfer and stakes the approved
[codex:489133] 139: /// @param _from The owner of the tokens who approved them to transfer.
[codex:489133] 140: /// @param _value Approved amount for the transfer and stake.
[codex:489133] 174: /// @param _from The owner of the tokens who approved them to transfer.
[codex:489133] 175: /// @param _value Approved amount for the transfer and stake.
[codex:489133] 221: /// @param _from The owner of the tokens who approved them to transfer.
[codex:489133] 222: /// @param _value Approved amount for the transfer and top-up to
[codex:489133] 306: transferOrDeposit(owner, _operator, amount);
[codex:489133] 309: /// @notice Undelegates staked tokens. You will be able to recover your stake by calling
[codex:489133] 310: /// `recoverStake()` with operator address once undelegation period is over.
[codex:489133] 318: /// You will be able to recover your stake by calling
[codex:489133] 319: /// `recoverStake()` with operator address once undelegation period is over.
[codex:489133] 356: /// @notice Recovers staked tokens and transfers them back to the owner.
[codex:489133] 360: function recoverStake(address _operator) public {
[codex:489133] 381: transferOrDeposit(operators[_operator].owner, _operator, amount);
[codex:489133] 398: /// Locked stake may not be recovered until the lock expires or is released,
[codex:489133] 450: /// Also applicable to prevent inadvertent DoS of `recoverStake`
[codex:489133] 480: /// @param amountToSlash Token amount to slash from every misbehaved operator.
[codex:489133] 481: /// @param misbehavedOperators Array of addresses to seize the tokens from.
[codex:489133]
[codex:489133] thinking
[codex:489133] **Reviewing access control in recoverStake and transferOrDeposit**
[codex:489133] exec
[codex:489133] /bin/bash -lc "sed -n '280,420p' contracts/@keep-network/keep-core/contracts/TokenStaking.sol" in /tmp/codex-multi-l61vr90y succeeded in 5ms:
[codex:489133] initializationPeriod
[codex:489133] );
[codex:489133] }
[codex:489133]
[codex:489133] /// @notice Cancels stake of tokens within the operator initialization period
[codex:489133] /// without being subjected to the token lockup for the undelegation period.
[codex:489133] /// This can be used to undo mistaken delegation to the wrong operator address.
[codex:489133] /// @param _operator Address of the stake operator.
[codex:489133] function cancelStake(address _operator) public {
[codex:489133] address owner = operators[_operator].owner;
[codex:489133] require(
[codex:489133] msg.sender == owner ||
[codex:489133] msg.sender == _operator ||
[codex:489133] grantStaking.canUndelegate(_operator, tokenGrant),
[codex:489133] "Not authorized"
[codex:489133] );
[codex:489133] uint256 operatorParams = operators[_operator].packedParams;
[codex:489133]
[codex:489133] require(
[codex:489133] !_isInitialized(operatorParams),
[codex:489133]
[codex:489133] thinking
[codex:489133] **Analyzing recoverStake and staking flow**
[codex:489133] exec
[codex:489133] /bin/bash -lc "sed -n '660,780p' contracts/@keep-network/keep-core/contracts/TokenStaking.sol" in /tmp/codex-multi-l61vr90y succeeded in 6ms:
[codex:489133] /// @return True if has enough active stake to participate in the network,
[codex:489133] /// false otherwise.
[codex:489133] function hasMinimumStake(
[codex:489133] address staker,
[codex:489133] address operatorContract
[codex:489133] ) public view returns(bool) {
[codex:489133] return activeStake(staker, operatorContract) >= minimumStake();
[codex:489133] }
[codex:489133]
[codex:489133] /// @notice Is the operator with the given params initialized
[codex:489133] function _isInitialized(uint256 _operatorParams)
[codex:489133] internal view returns (bool) {
[codex:489133] return block.timestamp > _operatorParams.getCreationTimestamp().add(initializationPeriod);
[codex:489133] }
[codex:489133]
[codex:489133] /// @notice Is the operator with the given params undelegating
[codex:489133] function _isUndelegating(uint256 _operatorParams)
[codex:489133] internal view returns (bool) {
[codex:489133] uint256 undelegatedAt = _operatorParams.getUndelegationTimestamp();
[codex:489133] return (undelegatedAt != 0) && (block.timestamp > undelegatedAt);
[codex:489133]
[codex:489133] thinking
[codex:489133] **Checking TokenStakingEscrow for vulnerabilities**
[codex:489133] exec
[codex:489133] /bin/bash -lc "sed -n '1,260p' contracts/@keep-network/keep-core/contracts/TokenStakingEscrow.sol" in /tmp/codex-multi-l61vr90y succeeded in 6ms:
[codex:489133] /**
[codex:489133] ▓▓▌ ▓▓ ▐▓▓ ▓▓▓▓▓▓▓▓▓▓▌▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▄
[codex:489133] ▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▌▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
[codex:489133] ▓▓▓▓▓▓ ▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓ ▐▓▓▓▓▓ ▓▓▓▓▓▓ ▓▓▓▓▓ ▐▓▓▓▓▓▌ ▐▓▓▓▓▓▓
[codex:489133] ▓▓▓▓▓▓▄▄▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓▄▄▄▄ ▓▓▓▓▓▓▄▄▄▄ ▐▓▓▓▓▓▌ ▐▓▓▓▓▓▓
[codex:489133] ▓▓▓▓▓▓▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▌ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
[codex:489133] ▓▓▓▓▓▓▀▀▓▓▓▓▓▓▄ ▐▓▓▓▓▓▓▀▀▀▀ ▓▓▓▓▓▓▀▀▀▀ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▀
[codex:489133] ▓▓▓▓▓▓ ▀▓▓▓▓▓▓▄ ▐▓▓▓▓▓▓ ▓▓▓▓▓ ▓▓▓▓▓▓ ▓▓▓▓▓ ▐▓▓▓▓▓▌
[codex:489133] ▓▓▓▓▓▓▓▓▓▓ █▓▓▓▓▓▓▓▓▓ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓
[codex:489133] ▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓
[codex:489133]
[codex:489133] Trust math, not hardware.
[codex:489133] */
[codex:489133]
[codex:489133] pragma solidity 0.5.17;
[codex:489133]
[codex:489133] import "openzeppelin-solidity/contracts/ownership/Ownable.sol";
[codex:489133] import "openzeppelin-solidity/contracts/token/ERC20/SafeERC20.sol";
[codex:489133] import "openzeppelin-solidity/contracts/math/SafeMath.sol";
[codex:489133]
[codex:489133] exec
[codex:489133] /bin/bash -lc "sed -n '260,620p' contracts/@keep-network/keep-core/contracts/TokenStakingEscrow.sol" in /tmp/codex-multi-l61vr90y succeeded in 5ms:
[codex:489133] if (deposit.withdrawn.add(deposit.redelegated) < unlocked) {
[codex:489133] return unlocked.sub(deposit.withdrawn).sub(deposit.redelegated);
[codex:489133] }
[codex:489133] }
[codex:489133]
[codex:489133] return 0;
[codex:489133] }
[codex:489133]
[codex:489133] /// @notice Withdraws currently unlocked tokens deposited in the escrow
[codex:489133] /// after undelegating them from the provided operator. Only grantee or
[codex:489133] /// operator can call this function. Important: this function can not be
[codex:489133] /// called for a `ManagedGrant` grantee. This may lead to locking tokens.
[codex:489133] /// For `ManagedGrant`, please use `withdrawToManagedGrantee` instead.
[codex:489133] /// @param operator Address of the operator from the undelegated/canceled
[codex:489133] /// delegation from which tokens were deposited.
[codex:489133] function withdraw(address operator) public {
[codex:489133] Deposit memory deposit = deposits[operator];
[codex:489133] address grantee = getGrantee(deposit.grantId);
[codex:489133]
[codex:489133] // Make sure this function is not called for a managed grant.
[codex:489133]
[codex:489133] thinking
[codex:489133] **Analyzing withdrawRevoked call logic**
[codex:489133] exec
[codex:489133] /bin/bash -lc "sed -n '1,240p' contracts/@keep-network/keep-core/contracts/ManagedGrant.sol" in /tmp/codex-multi-l61vr90y succeeded in 6ms:
[codex:489133] pragma solidity ^0.5.4;
[codex:489133]
[codex:489133] import "openzeppelin-solidity/contracts/token/ERC20/ERC20Burnable.sol";
[codex:489133] import "openzeppelin-solidity/contracts/token/ERC20/SafeERC20.sol";
[codex:489133] import "./TokenGrant.sol";
[codex:489133]
[codex:489133] /// @title ManagedGrant
[codex:489133] /// @notice A managed grant acts as the grantee towards the token grant contract,
[codex:489133] /// proxying instructions from the actual grantee.
[codex:489133] /// The address used by the actual grantee
[codex:489133] /// to issue instructions and withdraw tokens
[codex:489133] /// can be reassigned with the consent of the grant manager.
[codex:489133] contract ManagedGrant {
[codex:489133] using SafeERC20 for ERC20Burnable;
[codex:489133]
[codex:489133] ERC20Burnable public token;
[codex:489133] TokenGrant public tokenGrant;
[codex:489133] address public grantManager;
[codex:489133] uint256 public grantId;
[codex:489133] address public grantee;
[codex:489133]
[codex:489133] thinking
[codex:489133] **Analyzing potential escrow and staking vulnerabilities**
[codex:489133]
[codex:489133] I'm carefully examining the TokenStakingEscrow withdraw and withdrawRevoked functions to spot arithmetic or state bugs that might allow draining tokens. I'm also evaluating how sent tokens affect balances and underflows in TokenGrantStake returnTokens and recoverStake flow, checking if attackers could exploit token transfers to the contract. It’s complicated but looks like some state overwrites or underflows could cause inconsistencies, though actual profit or token loss seems limited by balance and access controls. Let's continue inspecting related code for more clues.
[codex:489133] exec
[codex:489133] /bin/bash -lc "sed -n '1,200p' contracts/@keep-network/keep-core/contracts/TokenSender.sol" in /tmp/codex-multi-l61vr90y succeeded in 8ms:
[codex:489133] pragma solidity 0.5.17;
[codex:489133]
[codex:489133] /// @dev Interface of sender contract for approveAndCall pattern.
[codex:489133] interface TokenSender {
[codex:489133] function approveAndCall(address _spender, uint256 _value, bytes calldata _extraData) external;
[codex:489133] }
[codex:489133]
[codex:489133] thinking
[codex:489133] **Analyzing potential contract vulnerabilities**
[codex:489133] exec
[codex:489133] /bin/bash -lc "sed -n '1,240p' contracts/@keep-network/keep-core/contracts/libraries/RolesLookup.sol" in /tmp/codex-multi-l61vr90y succeeded in 5ms:
[codex:489133] pragma solidity 0.5.17;
[codex:489133]
[codex:489133] import "../utils/AddressArrayUtils.sol";
[codex:489133] import "../StakeDelegatable.sol";
[codex:489133] import "../TokenGrant.sol";
[codex:489133] import "../ManagedGrant.sol";
[codex:489133]
[codex:489133] /// @title Roles Lookup
[codex:489133] /// @notice Library facilitating lookup of roles in stake delegation setup.
[codex:489133] library RolesLookup {
[codex:489133] using AddressArrayUtils for address[];
[codex:489133]
[codex:489133] /// @notice Returns true if the tokenOwner delegated tokens to operator
[codex:489133] /// using the provided stakeDelegatable contract. Othwerwise, returns false.
[codex:489133] /// This function works only for the case when tokenOwner own those tokens
[codex:489133] /// and those are not tokens from a grant.
[codex:489133] function isTokenOwnerForOperator(
[codex:489133] address tokenOwner,
[codex:489133] address operator,
[codex:489133] StakeDelegatable stakeDelegatable
[codex:489133]
[codex:489133] thinking
[codex:489133] **Analyzing access control risks in staking and withdrawals**
[codex:489133] exec
[codex:489133] /bin/bash -lc "rg -n \"safeTransfer|transfer\\(\" contracts/solidity/contracts -S" in /tmp/codex-multi-l61vr90y succeeded in 9ms:
[codex:489133] contracts/solidity/contracts/AbstractBondedECDSAKeep.sol:297: token.safeTransferFrom(
[codex:489133] contracts/solidity/contracts/AbstractBondedECDSAKeep.sol:307: token.safeTransferFrom(
[codex:489133]
[codex:489133] thinking
[codex:489133] **Investigating token transfer methods**
[codex:489133] exec
[codex:489133] /bin/bash -lc "sed -n '1,260p' contracts/@keep-network/sortition-pools/contracts/BondedSortitionPool.sol" in /tmp/codex-multi-l61vr90y succeeded in 5ms:
[codex:489133] pragma solidity 0.5.17;
[codex:489133]
[codex:489133] import "./AbstractSortitionPool.sol";
[codex:489133] import "./RNG.sol";
[codex:489133] import "./api/IStaking.sol";
[codex:489133] import "./api/IBonding.sol";
[codex:489133] import "./DynamicArray.sol";
[codex:489133]
[codex:489133] /// @title Bonded Sortition Pool
[codex:489133] /// @notice A logarithmic data structure used to store the pool of eligible
[codex:489133] /// operators weighted by their stakes. It allows to select a group of operators
[codex:489133] /// based on the provided pseudo-random seed and bonding requirements.
[codex:489133] /// @dev Keeping pool up to date cannot be done eagerly as proliferation of
[codex:489133] /// privileged customers could be used to perform DOS attacks by increasing the
[codex:489133] /// cost of such updates. When a sortition pool prospectively selects an
[codex:489133] /// operator, the selected operator’s eligibility status and weight needs to be
[codex:489133] /// checked and, if necessary, updated in the sortition pool. If the changes
[codex:489133] /// would be detrimental to the operator, the operator selection is performed
[codex:489133] /// again with the updated input to ensure correctness.
[codex:489133] /// The pool should specify a reasonable minimum bondable value for operators
[codex:489133]
[codex:489133] thinking
[codex:489133] **Analyzing potential exploit paths in sortition and bonding**
[codex:489133] exec
[codex:489133] /bin/bash -lc "sed -n '1,260p' contracts/@keep-network/keep-core/contracts/KeepRegistry.sol" in /tmp/codex-multi-l61vr90y succeeded in 5ms:
[codex:489133] pragma solidity 0.5.17;
[codex:489133]
[codex:489133]
[codex:489133] /// @title KeepRegistry
[codex:489133] /// @notice Governance owned registry of approved contracts and roles.
[codex:489133] contract KeepRegistry {
[codex:489133] enum ContractStatus {New, Approved, Disabled}
[codex:489133]
[codex:489133] // Governance role is to enable recovery from key compromise by rekeying
[codex:489133] // other roles. Also, it can disable operator contract panic buttons
[codex:489133] // permanently.
[codex:489133] address public governance;
[codex:489133]
[codex:489133] // Registry Keeper maintains approved operator contracts. Each operator
[codex:489133] // contract must be approved before it can be authorized by a staker or
[codex:489133] // used by a service contract.
[codex:489133] address public registryKeeper;
[codex:489133]
[codex:489133] // Each operator contract has a Panic Button which can disable malicious
[codex:489133] // or malfunctioning contract that have been previously approved by the
[codex:489133]
[codex:489133] thinking
[codex:489133] **Analyzing potential vulnerabilities in authorization and group selection**
[codex:489133]
[codex:489133] I'm examining if the Authorizations contract’s claimDelegatedAuthority function could enable recursion or abuse, but it seems unlikely to cause profit. I'm also looking at GroupSelectionSeed’s fallback and newGroupSelectionSeed usage of msg.value, noticing the flow of fees and refunds with openKeep and random beacon interactions, which appears intentional rather than a vulnerability. Next, I plan to investigate CandidatesPools for possible issues.
[codex:489133] exec
[codex:489133] /bin/bash -lc "sed -n '1,240p' contracts/solidity/contracts/CandidatesPools.sol" in /tmp/codex-multi-l61vr90y succeeded in 5ms:
[codex:489133] pragma solidity 0.5.17;
[codex:489133]
[codex:489133] import "@keep-network/sortition-pools/contracts/AbstractSortitionPool.sol";
[codex:489133]
[codex:489133] contract CandidatesPools {
[codex:489133] // Notification that a new sortition pool has been created.
[codex:489133] event SortitionPoolCreated(
[codex:489133] address indexed application,
[codex:489133] address sortitionPool
[codex:489133] );
[codex:489133]
[codex:489133] // Mapping of pools with registered member candidates for each application.
[codex:489133] mapping(address => address) candidatesPools; // application -> candidates pool
[codex:489133]
[codex:489133] /// @notice Creates new sortition pool for the application.
[codex:489133] /// @dev Emits an event after sortition pool creation.
[codex:489133] /// @param _application Address of the application.
[codex:489133] /// @return Address of the created sortition pool contract.
[codex:489133] function createSortitionPool(address _application)
[codex:489133] external
[codex:489133]
[codex:489133] thinking
[codex:489133] **Analyzing potential vulnerabilities in staking logic**
[codex:489133] exec
[codex:489133] /bin/bash -lc "sed -n '440,620p' contracts/@keep-network/keep-core/contracts/TokenStaking.sol" in /tmp/codex-multi-l61vr90y succeeded in 5ms:
[codex:489133] isAuthorizedForOperator(operator, msg.sender),
[codex:489133] "Not authorized"
[codex:489133] );
[codex:489133] locks.releaseLock(operator);
[codex:489133] }
[codex:489133]
[codex:489133] /// @notice Removes the lock of the specified operator contract
[codex:489133] /// if the lock has expired or the contract has been disabled.
[codex:489133] /// @dev Necessary for removing locks placed by contracts
[codex:489133] /// that have been disabled by the panic button.
[codex:489133] /// Also applicable to prevent inadvertent DoS of `recoverStake`
[codex:489133] /// if too many operator contracts have failed to clean up their locks.
[codex:489133] function releaseExpiredLock(
[codex:489133] address operator,
[codex:489133] address operatorContract
[codex:489133] ) public {
[codex:489133] locks.releaseExpiredLock(operator, operatorContract, address(this));
[codex:489133] }
[codex:489133]
[codex:489133] /// @notice Check whether the operator has any active locks
[codex:489133]
[codex:489133] thinking
[codex:489133] **Analyzing authorization and potential vulnerabilities**
[codex:489133] exec
[codex:489133] /bin/bash -lc "sed -n '1,220p' contracts/@keep-network/keep-core/contracts/KeepToken.sol" in /tmp/codex-multi-l61vr90y succeeded in 5ms:
[codex:489133] pragma solidity 0.5.17;
[codex:489133]
[codex:489133] import "openzeppelin-solidity/contracts/token/ERC20/ERC20Burnable.sol";
[codex:489133] import "openzeppelin-solidity/contracts/token/ERC20/ERC20Detailed.sol";
[codex:489133]
[codex:489133]
[codex:489133] /// @dev Interface of recipient contract for approveAndCall pattern.
[codex:489133] interface tokenRecipient { function receiveApproval(address _from, uint256 _value, address _token, bytes calldata _extraData) external; }
[codex:489133]
[codex:489133] /// @title KEEP Token
[codex:489133] /// @dev Standard ERC20Burnable token
[codex:489133] contract KeepToken is ERC20Burnable, ERC20Detailed {
[codex:489133] string public constant NAME = "KEEP Token";
[codex:489133] string public constant SYMBOL = "KEEP";
[codex:489133] uint8 public constant DECIMALS = 18; // The number of digits after the decimal place when displaying token values on-screen.
[codex:489133] uint256 public constant INITIAL_SUPPLY = 10**27; // 1 billion tokens, 18 decimal places.
[codex:489133]
[codex:489133] /// @dev Gives msg.sender all of existing tokens.
[codex:489133] constructor() public ERC20Detailed(NAME, SYMBOL, DECIMALS) {
[codex:489133] _mint(msg.sender, INITIAL_SUPPLY);
[codex:489133]
[codex:489133] thinking
[codex:489133] **Analyzing TokenGrantStake delegation vulnerability**
[codex:489133] exec
[codex:489133] /bin/bash -lc "sed -n '1,260p' contracts/@keep-network/keep-core/contracts/libraries/staking/GrantStaking.sol" in /tmp/codex-multi-l61vr90y succeeded in 5ms:
[codex:489133] pragma solidity 0.5.17;
[codex:489133]
[codex:489133] import "../../TokenGrant.sol";
[codex:489133] import "../../TokenStakingEscrow.sol";
[codex:489133] import "../..//utils/BytesLib.sol";
[codex:489133] import "../RolesLookup.sol";
[codex:489133]
[codex:489133] /// @notice TokenStaking contract library allowing to capture the details of
[codex:489133] /// delegated grants and offering functions allowing to check grantee
[codex:489133] /// authentication for stake delegation management.
[codex:489133] library GrantStaking {
[codex:489133] using BytesLib for bytes;
[codex:489133] using RolesLookup for address payable;
[codex:489133]
[codex:489133] /// @dev Grant ID is flagged with the most significant bit set, to
[codex:489133] /// distinguish the grant ID `0` from default (null) value. The flag is
[codex:489133] /// toggled with bitwise XOR (`^`) which keeps all other bits intact but
[codex:489133] /// flips the flag bit. The flag should be set before writing to
[codex:489133] /// `operatorToGrant`, and unset after reading from `operatorToGrant`
[codex:489133] /// before using the value.
[codex:489133]
[codex:489133] thinking
[codex:489133] **Analyzing contract interaction risks**
[codex:489133] exec
[codex:489133] /bin/bash -lc 'rg -n "newSortitionPool" -n contracts/solidity/contracts/BondedECDSAKeepFactory.sol' in /tmp/codex-multi-l61vr90y succeeded in 6ms:
[codex:489133] 259: function newSortitionPool(address _application) internal returns (address) {
[codex:489133] exec
[codex:489133] /bin/bash -lc "sed -n '240,340p' contracts/solidity/contracts/BondedECDSAKeepFactory.sol" in /tmp/codex-multi-l61vr90y succeeded in 5ms:
[codex:489133] ///
[codex:489133] /// @param _operator operator's address
[codex:489133] /// @return True if the factory has access to the staked token balance of
[codex:489133] /// the provided operator and can slash that stake. False otherwise.
[codex:489133] function isOperatorAuthorized(address _operator)
[codex:489133] public
[codex:489133] view
[codex:489133] returns (bool)
[codex:489133] {
[codex:489133] return tokenStaking.isAuthorizedForOperator(_operator, address(this));
[codex:489133] }
[codex:489133]
[codex:489133] /// @notice Gets the stake balance of the specified operator.
[codex:489133] /// @param _operator The operator to query the balance of.
[codex:489133] /// @return An uint256 representing the amount staked by the passed operator.
[codex:489133] function balanceOf(address _operator) public view returns (uint256) {
[codex:489133] return tokenStaking.balanceOf(_operator);
[codex:489133] }
[codex:489133]
[codex:489133] function newSortitionPool(address _application) internal returns (address) {
[codex:489133]
[codex:489133] thinking
[codex:489133] **Inspecting BondedSortitionPoolFactory**
[codex:489133] exec
[codex:489133] /bin/bash -lc "sed -n '1,260p' contracts/@keep-network/sortition-pools/contracts/BondedSortitionPoolFactory.sol" in /tmp/codex-multi-l61vr90y succeeded in 5ms:
[codex:489133] pragma solidity 0.5.17;
[codex:489133]
[codex:489133] import "./BondedSortitionPool.sol";
[codex:489133] import "./api/IBonding.sol";
[codex:489133] import "./api/IStaking.sol";
[codex:489133]
[codex:489133] /// @title Bonded Sortition Pool Factory
[codex:489133] /// @notice Factory for the creation of new bonded sortition pools.
[codex:489133] contract BondedSortitionPoolFactory {
[codex:489133] /// @notice Creates a new bonded sortition pool instance.
[codex:489133] /// @return Address of the new bonded sortition pool contract instance.
[codex:489133] function createSortitionPool(
[codex:489133] IStaking stakingContract,
[codex:489133] IBonding bondingContract,
[codex:489133] uint256 minimumStake,
[codex:489133] uint256 initialMinimumBond,
[codex:489133] uint256 poolWeightDivisor
[codex:489133] ) public returns (address) {
[codex:489133] return
[codex:489133] address(
[codex:489133]
[codex:489133]
[codex:489133] thinking
[codex:489133] **Analyzing potential contract vulnerabilities**
[codex:489133]
[codex:489133] I'm carefully examining various smart contract functions and interactions, checking for access control issues, reentrancy risks, and logic flaws that might allow unauthorized withdrawals or state corruption. There is a lot to unpack! I'm focusing on `TokenStakingEscrow`, `BondedECDSAKeepFactory`, and related pools to see if attackers could exploit any permission gaps or race conditions, but so far many concerns appear design-intent or non-profitable for attackers.
[codex:489133] thinking
[codex:489133] **Investigating TokenStaking receiveApproval risks**
[codex:489133]
[codex:489133] There’s a public function accepting callbacks without verifying the caller, allowing anyone to stake tokens from users who’ve previously approved the contract. This can let an attacker redirect stakes under their chosen operator and beneficiary, potentially enabling them to withdraw ETH bonds tied to that operator if such deposits exist. While direct token theft seems unlikely, the interplay of operator, beneficiary, and grants suggests nuanced risks worth exploring further.
[codex:489133] exec
[codex:489133] /bin/bash -lc "sed -n '1,260p' contracts/@keep-network/keep-core/contracts/StakeDelegatable.sol" in /tmp/codex-multi-l61vr90y succeeded in 6ms:
[codex:489133] /**
[codex:489133] ▓▓▌ ▓▓ ▐▓▓ ▓▓▓▓▓▓▓▓▓▓▌▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▄
[codex:489133] ▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▌▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
[codex:489133] ▓▓▓▓▓▓ ▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓ ▐▓▓▓▓▓ ▓▓▓▓▓▓ ▓▓▓▓▓ ▐▓▓▓▓▓▌ ▐▓▓▓▓▓▓
[codex:489133] ▓▓▓▓▓▓▄▄▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓▄▄▄▄ ▓▓▓▓▓▓▄▄▄▄ ▐▓▓▓▓▓▌ ▐▓▓▓▓▓▓
[codex:489133] ▓▓▓▓▓▓▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▌ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
[codex:489133] ▓▓▓▓▓▓▀▀▓▓▓▓▓▓▄ ▐▓▓▓▓▓▓▀▀▀▀ ▓▓▓▓▓▓▀▀▀▀ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▀
[codex:489133] ▓▓▓▓▓▓ ▀▓▓▓▓▓▓▄ ▐▓▓▓▓▓▓ ▓▓▓▓▓ ▓▓▓▓▓▓ ▓▓▓▓▓ ▐▓▓▓▓▓▌
[codex:489133] ▓▓▓▓▓▓▓▓▓▓ █▓▓▓▓▓▓▓▓▓ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓
[codex:489133] ▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓
[codex:489133]
[codex:489133] Trust math, not hardware.
[codex:489133] */
[codex:489133]
[codex:489133] pragma solidity 0.5.17;
[codex:489133]
[codex:489133] import "./utils/OperatorParams.sol";
[codex:489133]
[codex:489133] /// @title Stake Delegatable
[codex:489133] /// @notice A base contract to allow stake delegation for staking contracts.
[codex:489133]
[codex:489133]
[codex:489133] thinking
[codex:489133] **Analyzing potential token theft and operator control**
[codex:489133] thinking
[codex:489133] **Examining grant-based stake recovery and unauthorized token transfers**
[codex:489133]
[codex:489133] I’m analyzing possible abuse in recoverStake and TokenGrant.receiveApproval where missing sender verification might let attackers exploit token allowances to create grants with immediate unlock and withdraw tokens, enabling a concrete profit path. I’m also considering how these logic flows interact with stake cancellation, redelegation, and managed grantee checks.
[codex:489133] exec
[codex:489133] /bin/bash -lc "nl -ba contracts/@keep-network/keep-core/contracts/TokenGrant.sol | sed -n '120,240p'" in /tmp/codex-multi-l61vr90y succeeded in 6ms:
[codex:489133] 120 /// @return staked The amount of tokens that have been staked from the grant.
[codex:489133] 121 /// @return revoked A boolean indicating whether the grant has been revoked,
[codex:489133] 122 /// which is to say that it is no longer unlocking.
[codex:489133] 123 /// @return grantee The grantee of grant.
[codex:489133] 124 function getGrant(uint256 _id) public view returns (
[codex:489133] 125 uint256 amount,
[codex:489133] 126 uint256 withdrawn,
[codex:489133] 127 uint256 staked,
[codex:489133] 128 uint256 revokedAmount,
[codex:489133] 129 uint256 revokedAt,
[codex:489133] 130 address grantee
[codex:489133] 131 ) {
[codex:489133] 132 return (
[codex:489133] 133 grants[_id].amount,
[codex:489133] 134 grants[_id].withdrawn,
[codex:489133] 135 grants[_id].staked,
[codex:489133] 136 grants[_id].revokedAmount,
[codex:489133] 137 grants[_id].revokedAt,
[codex:489133] 138 grants[_id].grantee
[codex:489133] 139 );
[codex:489133] exec
[codex:489133] /bin/bash -lc "nl -ba contracts/@keep-network/keep-core/contracts/TokenGrant.sol | sed -n '240,340p'" in /tmp/codex-multi-l61vr90y succeeded in 6ms:
[codex:489133] 240 _start,
[codex:489133] 241 _start.add(_cliffDuration),
[codex:489133] 242 0, 0,
[codex:489133] 243 GrantStakingPolicy(_stakingPolicy)
[codex:489133] 244 );
[codex:489133] 245
[codex:489133] 246 // Maintain a record to make it easier to query grants by grant manager.
[codex:489133] 247 grantIndices[_from].push(id);
[codex:489133] 248
[codex:489133] 249 // Maintain a record to make it easier to query grants by grantee.
[codex:489133] 250 grantIndices[_grantee].push(id);
[codex:489133] 251
[codex:489133] 252 token.safeTransferFrom(_from, address(this), _amount);
[codex:489133] 253
[codex:489133] 254 // Maintain a record of the unlocked amount
[codex:489133] 255 balances[_grantee] = balances[_grantee].add(_amount);
[codex:489133] 256 emit TokenGrantCreated(id);
[codex:489133] 257 }
[codex:489133] 258
[codex:489133] 259 /// @notice Withdraws Token grant amount to grantee.
[codex:489133]
[codex:489133] thinking
[codex:489133] **Analyzing exploit scenario with receiveApproval**
[codex:489133] exec
[codex:489133] /bin/bash -lc "sed -n '1,220p' contracts/@keep-network/keep-core/contracts/libraries/grant/UnlockingSchedule.sol" in /tmp/codex-multi-l61vr90y succeeded in 6ms:
[codex:489133] pragma solidity 0.5.17;
[codex:489133]
[codex:489133] import "openzeppelin-solidity/contracts/math/SafeMath.sol";
[codex:489133]
[codex:489133] library UnlockingSchedule {
[codex:489133] using SafeMath for uint256;
[codex:489133]
[codex:489133] function getUnlockedAmount(
[codex:489133] uint256 _now,
[codex:489133] uint256 grantedAmount,
[codex:489133] uint256 duration,
[codex:489133] uint256 start,
[codex:489133] uint256 cliff
[codex:489133] ) internal pure returns (uint256) {
[codex:489133] bool cliffNotReached = _now < cliff;
[codex:489133] if (cliffNotReached) { return 0; }
[codex:489133]
[codex:489133] uint256 timeElapsed = _now.sub(start);
[codex:489133]
[codex:489133] bool unlockingPeriodFinished = timeElapsed >= duration;
[codex:489133]
[codex:489133] thinking
[codex:489133] **Summarizing critical TokenGrant exploit**
[codex:489133]
[codex:489133] I’m analyzing a critical vulnerability in TokenGrant.receiveApproval that allows an attacker to create token grants using any victim’s approved allowance without proper msg.sender verification, then immediately withdraw those tokens. The exploit involves calling receiveApproval with crafted parameters to transfer tokens from victims and set attacker-controlled grants, enabling theft of funds up to the full approved allowance. I’m preparing a detailed JSON report including the exploit scenario, severity, evidence, and recommendations, with exact file and line number references.
[codex:489133] codex
[codex:489133] {"no_findings":false,"summary":"Critical auth bypass in TokenGrant.receiveApproval lets an attacker steal KEEP from any address that has approved the TokenGrant contract.","findings":[{"severity":"critical","category":"auth","title":"TokenGrant.receiveApproval allows arbitrary grant creation using victims’ allowances, enabling immediate token theft","exploit_scenario":"1) Attacker monitors for any address that has approved the TokenGrant contract to spend KEEP (non‑zero allowance). 2) Attacker calls `TokenGrant.receiveApproval` with `_from = victim`, `_amount = allowance`, `_token = KEEP`, and `_extraData` encoding `grantManager=attacker`, `grantee=attacker`, `duration=0`, `start=block.timestamp`, `cliffDuration=0`, `revocable=false`, `stakingPolicy=<any non‑zero address>`. 3) The contract pulls `_amount` KEEP from the victim using their allowance and creates a grant owned by the attacker. 4) Attacker calls `TokenGrant.withdraw(grantId)` to withdraw the fully unlocked amount to themselves. Profit potential: up to the full approved allowance (often large/infinite) or victim’s KEEP balance per address that has approved TokenGrant; could be the entirety of a grant manager’s funding.","recommendation":"Require `msg.sender == address(token)` (approveAndCall-only) and/or `msg.sender == _from` in `receiveApproval`. Consider using EIP‑2612 permits or a separate `createGrant` function callable only by the token owner/grant manager.","evidence":"`receiveApproval` is public and trusts caller-supplied `_from` without verifying the caller; it then transfers from `_from` via `token.safeTransferFrom`, enabling anyone to spend any existing allowance. Combined with `withdraw` (public) this allows immediate extraction by setting attacker as grantee with a zero-duration schedule.","locations":["contracts/@keep-network/keep-core/contracts/TokenGrant.sol:210","contracts/@keep-network/keep-core/contracts/TokenGrant.sol:252","contracts/@keep-network/keep-core/contracts/TokenGrant.sol:262"]}]}
[codex:489133] tokens used
[codex:489133] 100,772
[codex:489133] {"no_findings":false,"summary":"Critical auth bypass in TokenGrant.receiveApproval lets an attacker steal KEEP from any address that has approved the TokenGrant contract.","findings":[{"severity":"critical","category":"auth","title":"TokenGrant.receiveApproval allows arbitrary grant creation using victims’ allowances, enabling immediate token theft","exploit_scenario":"1) Attacker monitors for any address that has approved the TokenGrant contract to spend KEEP (non‑zero allowance). 2) Attacker calls `TokenGrant.receiveApproval` with `_from = victim`, `_amount = allowance`, `_token = KEEP`, and `_extraData` encoding `grantManager=attacker`, `grantee=attacker`, `duration=0`, `start=block.timestamp`, `cliffDuration=0`, `revocable=false`, `stakingPolicy=<any non‑zero address>`. 3) The contract pulls `_amount` KEEP from the victim using their allowance and creates a grant owned by the attacker. 4) Attacker calls `TokenGrant.withdraw(grantId)` to withdraw the fully unlocked amount to themselves. Profit potential: up to the full approved allowance (often large/infinite) or victim’s KEEP balance per address that has approved TokenGrant; could be the entirety of a grant manager’s funding.","recommendation":"Require `msg.sender == address(token)` (approveAndCall-only) and/or `msg.sender == _from` in `receiveApproval`. Consider using EIP‑2612 permits or a separate `createGrant` function callable only by the token owner/grant manager.","evidence":"`receiveApproval` is public and trusts caller-supplied `_from` without verifying the caller; it then transfers from `_from` via `token.safeTransferFrom`, enabling anyone to spend any existing allowance. Combined with `withdraw` (public) this allows immediate extraction by setting attacker as grantee with a zero-duration schedule.","locations":["contracts/@keep-network/keep-core/contracts/TokenGrant.sol:210","contracts/@keep-network/keep-core/contracts/TokenGrant.sol:252","contracts/@keep-network/keep-core/contracts/TokenGrant.sol:262"]}]}
{
"codex": {
"ran_at": "2026-01-02T19:42:09.708751+00:00",
"returncode": 0
},
"summary": "Critical auth bypass in TokenGrant.receiveApproval lets an attacker steal KEEP from any address that has approved the TokenGrant contract.",
"raw_final": {
"summary": "Critical auth bypass in TokenGrant.receiveApproval lets an attacker steal KEEP from any address that has approved the TokenGrant contract.",
"findings": [
{
"title": "TokenGrant.receiveApproval allows arbitrary grant creation using victims\u2019 allowances, enabling immediate token theft",
"category": "auth",
"evidence": "`receiveApproval` is public and trusts caller-supplied `_from` without verifying the caller; it then transfers from `_from` via `token.safeTransferFrom`, enabling anyone to spend any existing allowance. Combined with `withdraw` (public) this allows immediate extraction by setting attacker as grantee with a zero-duration schedule.",
"severity": "critical",
"locations": [
"contracts/@keep-network/keep-core/contracts/TokenGrant.sol:210",
"contracts/@keep-network/keep-core/contracts/TokenGrant.sol:252",
"contracts/@keep-network/keep-core/contracts/TokenGrant.sol:262"
],
"recommendation": "Require `msg.sender == address(token)` (approveAndCall-only) and/or `msg.sender == _from` in `receiveApproval`. Consider using EIP\u20112612 permits or a separate `createGrant` function callable only by the token owner/grant manager.",
"exploit_scenario": "1) Attacker monitors for any address that has approved the TokenGrant contract to spend KEEP (non\u2011zero allowance). 2) Attacker calls `TokenGrant.receiveApproval` with `_from = victim`, `_amount = allowance`, `_token = KEEP`, and `_extraData` encoding `grantManager=attacker`, `grantee=attacker`, `duration=0`, `start=block.timestamp`, `cliffDuration=0`, `revocable=false`, `stakingPolicy=<any non\u2011zero address>`. 3) The contract pulls `_amount` KEEP from the victim using their allowance and creates a grant owned by the attacker. 4) Attacker calls `TokenGrant.withdraw(grantId)` to withdraw the fully unlocked amount to themselves. Profit potential: up to the full approved allowance (often large/infinite) or victim\u2019s KEEP balance per address that has approved TokenGrant; could be the entirety of a grant manager\u2019s funding."
}
],
"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 0x01c2 0000000c: JUMPI 0000000d: PUSH1 0x00 0000000f: CALLDATALOAD 00000010: PUSH1 0xe0 00000012: SHR 00000013: DUP1 00000014: PUSH4 0xa10132ad 00000019: GT 0000001a: PUSH2 0x00f7 0000001d: JUMPI 0000001e: DUP1 0000001f: PUSH4 0xb7a6f483 00000024: GT 00000025: PUSH2 0x0095 00000028: JUMPI 00000029: DUP1 0000002a: PUSH4 0xd14fede1 0000002f: GT 00000030: PUSH2 0x0064 00000033: JUMPI 00000034: DUP1 00000035: PUSH4 0xd14fede1 0000003a: EQ 0000003b: PUSH2 0x05bf 0000003e: JUMPI 0000003f: DUP1 00000040: PUSH4 0xd870c034 00000045: EQ 00000046: PUSH2 0x05f2 00000049: JUMPI 0000004a: DUP1 0000004b: PUSH4 0xebcbb39f 00000050: EQ 00000051: PUSH2 0x0625 00000054: JUMPI 00000055: DUP1 00000056: PUSH4 0xeca4a80d 0000005b: EQ 0000005c: PUSH2 0x0658 0000005f: JUMPI 00000060: PUSH2 0x01c2 00000063: JUMP 00000064: JUMPDEST 00000065: DUP1 00000066: PUSH4 0xb7a6f483 0000006b: EQ 0000006c: PUSH2 0x04fb 0000006f: JUMPI 00000070: DUP1 00000071: PUSH4 0xb8ee9156 00000076: EQ 00000077: PUSH2 0x0536 0000007a: JUMPI 0000007b: DUP1 0000007c: PUSH4 0xbc2c289f 00000081: EQ 00000082: PUSH2 0x056c 00000085: JUMPI 00000086: DUP1 00000087: PUSH4 0xca050cfd 0000008c: EQ 0000008d: PUSH2 0x0581 00000090: JUMPI 00000091: PUSH2 0x01c2 00000094: JUMP 00000095: JUMPDEST 00000096: DUP1 00000097: PUSH4 0xa5a53fb5 0000009c: GT 0000009d: PUSH2 0x00d1 000000a0: JUMPI 000000a1: DUP1 000000a2: PUSH4 0xa5a53fb5 000000a7: EQ 000000a8: PUSH2 0x04a7 000000ab: JUMPI 000000ac: DUP1 000000ad: PUSH4 0xa5b31055 000000b2: EQ 000000b3: PUSH2 0x04bc 000000b6: JUMPI 000000b7: DUP1 000000b8: PUSH4 0xaa7517e1 000000bd: EQ 000000be: PUSH2 0x04d1 000000c1: JUMPI 000000c2: DUP1 000000c3: PUSH4 0xb2dc7593 000000c8: EQ 000000c9: PUSH2 0x04e6 000000cc: JUMPI 000000cd: PUSH2 0x01c2 000000d0: JUMP 000000d1: JUMPDEST 000000d2: DUP1 000000d3: PUSH4 0xa10132ad 000000d8: EQ 000000d9: PUSH2 0x0424 000000dc: JUMPI 000000dd: DUP1 000000de: PUSH4 0xa23af330 000000e3: EQ 000000e4: PUSH2 0x0439 000000e7: JUMPI 000000e8: DUP1 000000e9: PUSH4 0xa3c28a13 000000ee: EQ 000000ef: PUSH2 0x0474 000000f2: JUMPI 000000f3: PUSH2 0x01c2 000000f6: JUMP 000000f7: JUMPDEST 000000f8: DUP1 000000f9: PUSH4 0x5b0d5b8e 000000fe: GT 000000ff: PUSH2 0x0164 00000102: JUMPI 00000103: DUP1 00000104: PUSH4 0x70a08231 00000109: GT 0000010a: PUSH2 0x013e 0000010d: JUMPI 0000010e: DUP1 0000010f: PUSH4 0x70a08231 00000114: EQ 00000115: PUSH2 0x037f 00000118: JUMPI 00000119: DUP1 0000011a: PUSH4 0x79a382e9 0000011f: EQ 00000120: PUSH2 0x03b2 00000123: JUMPI 00000124: DUP1 00000125: PUSH4 0x8701af42 0000012a: EQ 0000012b: PUSH2 0x03c7 0000012e: JUMPI 0000012f: DUP1 00000130: PUSH4 0x92ae584a 00000135: EQ 00000136: PUSH2 0x03f1 00000139: JUMPI 0000013a: PUSH2 0x01c2 0000013d: JUMP 0000013e: JUMPDEST 0000013f: DUP1 00000140: PUSH4 0x5b0d5b8e 00000145: EQ 00000146: PUSH2 0x02fc 00000149: JUMPI 0000014a: DUP1 0000014b: PUSH4 0x5c1c0710 00000150: EQ 00000151: PUSH2 0x0337 00000154: JUMPI 00000155: DUP1 00000156: PUSH4 0x5cef8417 0000015b: EQ 0000015c: PUSH2 0x036a 0000015f: JUMPI 00000160: PUSH2 0x01c2 00000163: JUMP 00000164: JUMPDEST 00000165: DUP1 00000166: PUSH4 0x356e0728 0000016b: GT 0000016c: PUSH2 0x01a0 0000016f: JUMPI 00000170: DUP1 00000171: PUSH4 0x356e0728 00000176: EQ 00000177: PUSH2 0x024f 0000017a: JUMPI 0000017b: DUP1 0000017c: PUSH4 0x36c2a000 00000181: EQ 00000182: PUSH2 0x0279 00000185: JUMPI 00000186: DUP1 00000187: PUSH4 0x38400400 0000018c: EQ 0000018d: PUSH2 0x02c0 00000190: JUMPI 00000191: DUP1 00000192: PUSH4 0x51489985 00000197: EQ 00000198: PUSH2 0x02e7 0000019b: JUMPI 0000019c: PUSH2 0x01c2 0000019f: JUMP 000001a0: JUMPDEST 000001a1: DUP1 000001a2: PUSH4 0x09211ceb 000001a7: EQ 000001a8: PUSH2 0x01cc 000001ab: JUMPI 000001ac: DUP1 000001ad: PUSH4 0x202bb9f0 000001b2: EQ 000001b3: PUSH2 0x021b 000001b6: JUMPI 000001b7: DUP1 000001b8: PUSH4 0x21f74e56 000001bd: EQ 000001be: PUSH2 0x0245 000001c1: JUMPI 000001c2: JUMPDEST 000001c3: PUSH1 0x05 000001c5: DUP1 000001c6: SLOAD 000001c7: CALLVALUE 000001c8: ADD 000001c9: SWAP1 000001ca: SSTORE 000001cb: STOP 000001cc: JUMPDEST 000001cd: CALLVALUE 000001ce: DUP1 000001cf: ISZERO 000001d0: PUSH2 0x01d8 000001d3: JUMPI 000001d4: PUSH1 0x00 000001d6: DUP1 000001d7: REVERT 000001d8: JUMPDEST 000001d9: POP 000001da: PUSH2 0x01ff 000001dd: PUSH1 0x04 000001df: DUP1 000001e0: CALLDATASIZE 000001e1: SUB 000001e2: PUSH1 0x20 000001e4: DUP2 000001e5: LT 000001e6: ISZERO 000001e7: PUSH2 0x01ef 000001ea: JUMPI 000001eb: PUSH1 0x00 000001ed: DUP1 000001ee: REVERT 000001ef: JUMPDEST 000001f0: POP 000001f1: CALLDATALOAD 000001f2: PUSH1 0x01 000001f4: PUSH1 0x01 000001f6: PUSH1 0xa0 000001f8: SHL 000001f9: SUB 000001fa: AND 000001fb: PUSH2 0x0693 000001fe: JUMP 000001ff: JUMPDEST 00000200: PUSH1 0x40 00000202: DUP1 00000203: MLOAD 00000204: PUSH1 0x01 00000206: PUSH1 0x01 00000208: PUSH1 0xa0 0000020a: SHL 0000020b: SUB 0000020c: SWAP1 0000020d: SWAP3 0000020e: AND 0000020f: DUP3 00000210: MSTORE 00000211: MLOAD 00000212: SWAP1 00000213: DUP2 00000214: SWAP1 00000215: SUB 00000216: PUSH1 0x20 00000218: ADD 00000219: SWAP1 0000021a: RETURN 0000021b: JUMPDEST 0000021c: CALLVALUE 0000021d: DUP1 0000021e: ISZERO 0000021f: PUSH2 0x0227 00000222: JUMPI 00000223: PUSH1 0x00 00000225: DUP1 00000226: REVERT 00000227: JUMPDEST 00000228: POP 00000229: PUSH2 0x01ff 0000022c: PUSH1 0x04 0000022e: DUP1 0000022f: CALLDATASIZE 00000230: SUB 00000231: PUSH1 0x20 00000233: DUP2 00000234: LT 00000235: ISZERO 00000236: PUSH2 0x023e 00000239: JUMPI 0000023a: PUSH1 0x00 0000023c: DUP1 0000023d: REVERT 0000023e: JUMPDEST 0000023f: POP 00000240: CALLDATALOAD 00000241: PUSH2 0x070a 00000244: JUMP 00000245: JUMPDEST 00000246: PUSH2 0x024d 00000249: PUSH2 0x077c 0000024c: JUMP 0000024d: JUMPDEST 0000024e: STOP 0000024f: JUMPDEST 00000250: CALLVALUE 00000251: DUP1 00000252: ISZERO 00000253: PUSH2 0x025b 00000256: JUMPI 00000257: PUSH1 0x00 00000259: DUP1 0000025a: REVERT 0000025b: JUMPDEST 0000025c: POP 0000025d: PUSH2 0x024d 00000260: PUSH1 0x04 00000262: DUP1 00000263: CALLDATASIZE 00000264: SUB 00000265: PUSH1 0x20 00000267: DUP2 00000268: LT 00000269: ISZERO 0000026a: PUSH2 0x0272 0000026d: JUMPI 0000026e: PUSH1 0x00 00000270: DUP1 00000271: REVERT 00000272: JUMPDEST 00000273: POP 00000274: CALLDATALOAD 00000275: PUSH2 0x096b 00000278: JUMP 00000279: JUMPDEST 0000027a: CALLVALUE 0000027b: DUP1 0000027c: ISZERO 0000027d: PUSH2 0x0285 00000280: JUMPI 00000281: PUSH1 0x00 00000283: DUP1 00000284: REVERT 00000285: JUMPDEST 00000286: POP 00000287: PUSH2 0x02ac 0000028a: PUSH1 0x04 0000028c: DUP1 0000028d: CALLDATASIZE 0000028e: SUB 0000028f: PUSH1 0x20 00000291: DUP2 00000292: LT 00000293: ISZERO 00000294: PUSH2 0x029c 00000297: JUMPI 00000298: PUSH1 0x00 0000029a: DUP1 0000029b: REVERT 0000029c: JUMPDEST 0000029d: POP 0000029e: CALLDATALOAD 0000029f: PUSH1 0x01 000002a1: PUSH1 0x01 000002a3: PUSH1 0xa0 000002a5: SHL 000002a6: SUB 000002a7: AND 000002a8: PUSH2 0x09cf 000002ab: JUMP 000002ac: JUMPDEST 000002ad: PUSH1 0x40 000002af: DUP1 000002b0: MLOAD 000002b1: SWAP2 000002b2: ISZERO 000002b3: ISZERO 000002b4: DUP3 000002b5: MSTORE 000002b6: MLOAD 000002b7: SWAP1 000002b8: DUP2 000002b9: SWAP1 000002ba: SUB 000002bb: PUSH1 0x20 000002bd: ADD 000002be: SWAP1 000002bf: RETURN 000002c0: JUMPDEST 000002c1: CALLVALUE 000002c2: DUP1 000002c3: ISZERO 000002c4: PUSH2 0x02cc 000002c7: JUMPI 000002c8: PUSH1 0x00 000002ca: DUP1 000002cb: REVERT 000002cc: JUMPDEST 000002cd: POP 000002ce: PUSH2 0x02d5 000002d1: PUSH2 0x0a58 000002d4: JUMP 000002d5: JUMPDEST 000002d6: PUSH1 0x40 000002d8: DUP1 000002d9: MLOAD 000002da: SWAP2 000002db: DUP3 000002dc: MSTORE 000002dd: MLOAD 000002de: SWAP1 000002df: DUP2 000002e0: SWAP1 000002e1: SUB 000002e2: PUSH1 0x20 000002e4: ADD 000002e5: SWAP1 000002e6: RETURN 000002e7: JUMPDEST 000002e8: CALLVALUE 000002e9: DUP1 000002ea: ISZERO 000002eb: PUSH2 0x02f3 000002ee: JUMPI 000002ef: PUSH1 0x00 000002f1: DUP1 000002f2: REVERT 000002f3: JUMPDEST 000002f4: POP 000002f5: PUSH2 0x02d5 000002f8: PUSH2 0x0b05 000002fb: JUMP 000002fc: JUMPDEST 000002fd: CALLVALUE 000002fe: DUP1 000002ff: ISZERO 00000300: PUSH2 0x0308 00000303: JUMPI 00000304: PUSH1 0x00 00000306: DUP1 00000307: REVERT 00000308: JUMPDEST 00000309: POP 0000030a: PUSH2 0x02ac 0000030d: PUSH1 0x04 0000030f: DUP1 00000310: CALLDATASIZE 00000311: SUB 00000312: PUSH1 0x40 00000314: DUP2 00000315: LT 00000316: ISZERO 00000317: PUSH2 0x031f 0000031a: JUMPI 0000031b: PUSH1 0x00 0000031d: DUP1 0000031e: REVERT 0000031f: JUMPDEST 00000320: POP 00000321: PUSH1 0x01 00000323: PUSH1 0x01 00000325: PUSH1 0xa0 00000327: SHL 00000328: SUB 00000329: DUP2 0000032a: CALLDATALOAD 0000032b: DUP2 0000032c: AND 0000032d: SWAP2 0000032e: PUSH1 0x20 00000330: ADD 00000331: CALLDATALOAD 00000332: AND 00000333: PUSH2 0x0b87 00000336: JUMP 00000337: JUMPDEST 00000338: CALLVALUE 00000339: DUP1 0000033a: ISZERO 0000033b: PUSH2 0x0343 0000033e: JUMPI 0000033f: PUSH1 0x00 00000341: DUP1 00000342: REVERT 00000343: JUMPDEST 00000344: POP 00000345: PUSH2 0x02ac 00000348: PUSH1 0x04 0000034a: DUP1 0000034b: CALLDATASIZE 0000034c: SUB 0000034d: PUSH1 0x20 0000034f: DUP2 00000350: LT 00000351: ISZERO 00000352: PUSH2 0x035a 00000355: JUMPI 00000356: PUSH1 0x00 00000358: DUP1 00000359: REVERT 0000035a: JUMPDEST 0000035b: POP 0000035c: CALLDATALOAD 0000035d: PUSH1 0x01 0000035f: PUSH1 0x01 00000361: PUSH1 0xa0 00000363: SHL 00000364: SUB 00000365: AND 00000366: PUSH2 0x0c41 00000369: JUMP 0000036a: JUMPDEST 0000036b: CALLVALUE 0000036c: DUP1 0000036d: ISZERO 0000036e: PUSH2 0x0376 00000371: JUMPI 00000372: PUSH1 0x00 00000374: DUP1 00000375: REVERT 00000376: JUMPDEST 00000377: POP 00000378: PUSH2 0x01ff 0000037b: PUSH2 0x0c97 0000037e: JUMP 0000037f: JUMPDEST 00000380: CALLVALUE 00000381: DUP1 00000382: ISZERO 00000383: PUSH2 0x038b 00000386: JUMPI 00000387: PUSH1 0x00 00000389: DUP1 0000038a: REVERT 0000038b: JUMPDEST 0000038c: POP 0000038d: PUSH2 0x02d5 00000390: PUSH1 0x04 00000392: DUP1 00000393: CALLDATASIZE 00000394: SUB 00000395: PUSH1 0x20 00000397: DUP2 00000398: LT 00000399: ISZERO 0000039a: PUSH2 0x03a2 0000039d: JUMPI 0000039e: PUSH1 0x00 000003a0: DUP1 000003a1: REVERT 000003a2: JUMPDEST 000003a3: POP 000003a4: CALLDATALOAD 000003a5: PUSH1 0x01 000003a7: PUSH1 0x01 000003a9: PUSH1 0xa0 000003ab: SHL 000003ac: SUB 000003ad: AND 000003ae: PUSH2 0x0ca6 000003b1: JUMP 000003b2: JUMPDEST 000003b3: CALLVALUE 000003b4: DUP1 000003b5: ISZERO 000003b6: PUSH2 0x03be 000003b9: JUMPI 000003ba: PUSH1 0x00 000003bc: DUP1 000003bd: REVERT 000003be: JUMPDEST 000003bf: POP 000003c0: PUSH2 0x02d5 000003c3: PUSH2 0x0cf7 000003c6: JUMP 000003c7: JUMPDEST 000003c8: CALLVALUE 000003c9: DUP1 000003ca: ISZERO 000003cb: PUSH2 0x03d3 000003ce: JUMPI 000003cf: PUSH1 0x00 000003d1: DUP1 000003d2: REVERT 000003d3: JUMPDEST 000003d4: POP 000003d5: PUSH2 0x01ff 000003d8: PUSH1 0x04 000003da: DUP1 000003db: CALLDATASIZE 000003dc: SUB 000003dd: PUSH1 0x20 000003df: DUP2 000003e0: LT 000003e1: ISZERO 000003e2: PUSH2 0x03ea 000003e5: JUMPI 000003e6: PUSH1 0x00 000003e8: DUP1 000003e9: REVERT 000003ea: JUMPDEST 000003eb: POP 000003ec: CALLDATALOAD 000003ed: PUSH2 0x0cfd 000003f0: JUMP 000003f1: JUMPDEST 000003f2: CALLVALUE 000003f3: DUP1 000003f4: ISZERO 000003f5: PUSH2 0x03fd 000003f8: JUMPI 000003f9: PUSH1 0x00 000003fb: DUP1 000003fc: REVERT 000003fd: JUMPDEST 000003fe: POP 000003ff: PUSH2 0x024d 00000402: PUSH1 0x04 00000404: DUP1 00000405: CALLDATASIZE 00000406: SUB 00000407: PUSH1 0x20 00000409: DUP2 0000040a: LT 0000040b: ISZERO 0000040c: PUSH2 0x0414 0000040f: JUMPI 00000410: PUSH1 0x00 00000412: DUP1 00000413: REVERT 00000414: JUMPDEST 00000415: POP 00000416: CALLDATALOAD 00000417: PUSH1 0x01 00000419: PUSH1 0x01 0000041b: PUSH1 0xa0 0000041d: SHL 0000041e: SUB 0000041f: AND 00000420: PUSH2 0x0d24 00000423: JUMP 00000424: JUMPDEST 00000425: CALLVALUE 00000426: DUP1 00000427: ISZERO 00000428: PUSH2 0x0430 0000042b: JUMPI 0000042c: PUSH1 0x00 0000042e: DUP1 0000042f: REVERT 00000430: JUMPDEST 00000431: POP 00000432: PUSH2 0x02d5 00000435: PUSH2 0x0e22 00000438: JUMP 00000439: JUMPDEST 0000043a: CALLVALUE 0000043b: DUP1 0000043c: ISZERO 0000043d: PUSH2 0x0445 00000440: JUMPI 00000441: PUSH1 0x00 00000443: DUP1 00000444: REVERT 00000445: JUMPDEST 00000446: POP 00000447: PUSH2 0x02ac 0000044a: PUSH1 0x04 0000044c: DUP1 0000044d: CALLDATASIZE 0000044e: SUB 0000044f: PUSH1 0x40 00000451: DUP2 00000452: LT 00000453: ISZERO 00000454: PUSH2 0x045c 00000457: JUMPI 00000458: PUSH1 0x00 0000045a: DUP1 0000045b: REVERT 0000045c: JUMPDEST 0000045d: POP 0000045e: PUSH1 0x01 00000460: PUSH1 0x01 00000462: PUSH1 0xa0 00000464: SHL 00000465: SUB 00000466: DUP2 00000467: CALLDATALOAD 00000468: DUP2 00000469: AND 0000046a: SWAP2 0000046b: PUSH1 0x20 0000046d: ADD 0000046e: CALLDATALOAD 0000046f: AND 00000470: PUSH2 0x0e28 00000473: JUMP 00000474: JUMPDEST 00000475: CALLVALUE 00000476: DUP1 00000477: ISZERO 00000478: PUSH2 0x0480 0000047b: JUMPI 0000047c: PUSH1 0x00 0000047e: DUP1 0000047f: REVERT 00000480: JUMPDEST 00000481: POP 00000482: PUSH2 0x01ff 00000485: PUSH1 0x04 00000487: DUP1 00000488: CALLDATASIZE 00000489: SUB 0000048a: PUSH1 0x20 0000048c: DUP2 0000048d: LT 0000048e: ISZERO 0000048f: PUSH2 0x0497 00000492: JUMPI 00000493: PUSH1 0x00 00000495: DUP1 00000496: REVERT 00000497: JUMPDEST 00000498: POP 00000499: CALLDATALOAD 0000049a: PUSH1 0x01 0000049c: PUSH1 0x01 0000049e: PUSH1 0xa0 000004a0: SHL 000004a1: SUB 000004a2: AND 000004a3: PUSH2 0x0ebc 000004a6: JUMP 000004a7: JUMPDEST 000004a8: CALLVALUE 000004a9: DUP1 000004aa: ISZERO 000004ab: PUSH2 0x04b3 000004ae: JUMPI 000004af: PUSH1 0x00 000004b1: DUP1 000004b2: REVERT 000004b3: JUMPDEST 000004b4: POP 000004b5: PUSH2 0x02d5 000004b8: PUSH2 0x0fbd 000004bb: JUMP 000004bc: JUMPDEST 000004bd: CALLVALUE 000004be: DUP1 000004bf: ISZERO 000004c0: PUSH2 0x04c8 000004c3: JUMPI 000004c4: PUSH1 0x00 000004c6: DUP1 000004c7: REVERT 000004c8: JUMPDEST 000004c9: POP 000004ca: PUSH2 0x02d5 000004cd: PUSH2 0x0fc9 000004d0: JUMP 000004d1: JUMPDEST 000004d2: CALLVALUE 000004d3: DUP1 000004d4: ISZERO 000004d5: PUSH2 0x04dd 000004d8: JUMPI 000004d9: PUSH1 0x00 000004db: DUP1 000004dc: REVERT 000004dd: JUMPDEST 000004de: POP 000004df: PUSH2 0x02d5 000004e2: PUSH2 0x0fcf 000004e5: JUMP 000004e6: JUMPDEST 000004e7: CALLVALUE 000004e8: DUP1 000004e9: ISZERO 000004ea: PUSH2 0x04f2 000004ed: JUMPI 000004ee: PUSH1 0x00 000004f0: DUP1 000004f1: REVERT 000004f2: JUMPDEST 000004f3: POP 000004f4: PUSH2 0x02d5 000004f7: PUSH2 0x0fdc 000004fa: JUMP 000004fb: JUMPDEST 000004fc: CALLVALUE 000004fd: DUP1 000004fe: ISZERO 000004ff: PUSH2 0x0507 00000502: JUMPI 00000503: PUSH1 0x00 00000505: DUP1 00000506: REVERT 00000507: JUMPDEST 00000508: POP 00000509: PUSH2 0x02ac 0000050c: PUSH1 0x04 0000050e: DUP1 0000050f: CALLDATASIZE 00000510: SUB 00000511: PUSH1 0x40 00000513: DUP2 00000514: LT 00000515: ISZERO 00000516: PUSH2 0x051e 00000519: JUMPI 0000051a: PUSH1 0x00 0000051c: DUP1 0000051d: REVERT 0000051e: JUMPDEST 0000051f: POP 00000520: PUSH1 0x01 00000522: PUSH1 0x01 00000524: PUSH1 0xa0 00000526: SHL 00000527: SUB 00000528: DUP2 00000529: CALLDATALOAD 0000052a: DUP2 0000052b: AND 0000052c: SWAP2 0000052d: PUSH1 0x20 0000052f: ADD 00000530: CALLDATALOAD 00000531: AND 00000532: PUSH2 0x0fe2 00000535: JUMP 00000536: JUMPDEST 00000537: CALLVALUE 00000538: DUP1 00000539: ISZERO 0000053a: PUSH2 0x0542 0000053d: JUMPI 0000053e: PUSH1 0x00 00000540: DUP1 00000541: REVERT 00000542: JUMPDEST 00000543: POP 00000544: PUSH2 0x024d 00000547: PUSH1 0x04 00000549: DUP1 0000054a: CALLDATASIZE 0000054b: SUB 0000054c: PUSH1 0x60 0000054e: DUP2 0000054f: LT 00000550: ISZERO 00000551: PUSH2 0x0559 00000554: JUMPI 00000555: PUSH1 0x00 00000557: DUP1 00000558: REVERT 00000559: JUMPDEST 0000055a: POP 0000055b: DUP1 0000055c: CALLDATALOAD 0000055d: SWAP1 0000055e: PUSH1 0x20 00000560: DUP2 00000561: ADD 00000562: CALLDATALOAD 00000563: SWAP1 00000564: PUSH1 0x40 00000566: ADD 00000567: CALLDATALOAD 00000568: PUSH2 0x1066 0000056b: JUMP 0000056c: JUMPDEST 0000056d: CALLVALUE 0000056e: DUP1 0000056f: ISZERO 00000570: PUSH2 0x0578 00000573: JUMPI 00000574: PUSH1 0x00 00000576: DUP1 00000577: REVERT 00000578: JUMPDEST 00000579: POP 0000057a: PUSH2 0x02d5 0000057d: PUSH2 0x10e0 00000580: JUMP 00000581: JUMPDEST 00000582: PUSH2 0x01ff 00000585: PUSH1 0x04 00000587: DUP1 00000588: CALLDATASIZE 00000589: SUB 0000058a: PUSH1 0xa0 0000058c: DUP2 0000058d: LT 0000058e: ISZERO 0000058f: PUSH2 0x0597 00000592: JUMPI 00000593: PUSH1 0x00 00000595: DUP1 00000596: REVERT 00000597: JUMPDEST 00000598: POP 00000599: DUP1 0000059a: CALLDATALOAD 0000059b: SWAP1 0000059c: PUSH1 0x20 0000059e: DUP2 0000059f: ADD 000005a0: CALLDATALOAD 000005a1: SWAP1 000005a2: PUSH1 0x01 000005a4: PUSH1 0x01 000005a6: PUSH1 0xa0 000005a8: SHL 000005a9: SUB 000005aa: PUSH1 0x40 000005ac: DUP3 000005ad: ADD 000005ae: CALLDATALOAD 000005af: AND 000005b0: SWAP1 000005b1: PUSH1 0x60 000005b3: DUP2 000005b4: ADD 000005b5: CALLDATALOAD 000005b6: SWAP1 000005b7: PUSH1 0x80 000005b9: ADD 000005ba: CALLDATALOAD 000005bb: PUSH2 0x10ef 000005be: JUMP 000005bf: JUMPDEST 000005c0: CALLVALUE 000005c1: DUP1 000005c2: ISZERO 000005c3: PUSH2 0x05cb 000005c6: JUMPI 000005c7: PUSH1 0x00 000005c9: DUP1 000005ca: REVERT 000005cb: JUMPDEST 000005cc: POP 000005cd: PUSH2 0x02d5 000005d0: PUSH1 0x04 000005d2: DUP1 000005d3: CALLDATASIZE 000005d4: SUB 000005d5: PUSH1 0x20 000005d7: DUP2 000005d8: LT 000005d9: ISZERO 000005da: PUSH2 0x05e2 000005dd: JUMPI 000005de: PUSH1 0x00 000005e0: DUP1 000005e1: REVERT 000005e2: JUMPDEST 000005e3: POP 000005e4: CALLDATALOAD 000005e5: PUSH1 0x01 000005e7: PUSH1 0x01 000005e9: PUSH1 0xa0 000005eb: SHL 000005ec: SUB 000005ed: AND 000005ee: PUSH2 0x1781 000005f1: JUMP 000005f2: JUMPDEST 000005f3: CALLVALUE 000005f4: DUP1 000005f5: ISZERO 000005f6: PUSH2 0x05fe 000005f9: JUMPI 000005fa: PUSH1 0x00 000005fc: DUP1 000005fd: REVERT 000005fe: JUMPDEST 000005ff: POP 00000600: PUSH2 0x02ac 00000603: PUSH1 0x04 00000605: DUP1 00000606: CALLDATASIZE 00000607: SUB 00000608: PUSH1 0x20 0000060a: DUP2 0000060b: LT 0000060c: ISZERO 0000060d: PUSH2 0x0615 00000610: JUMPI 00000611: PUSH1 0x00 00000613: DUP1 00000614: REVERT 00000615: JUMPDEST 00000616: POP 00000617: CALLDATALOAD 00000618: PUSH1 0x01 0000061a: PUSH1 0x01 0000061c: PUSH1 0xa0 0000061e: SHL 0000061f: SUB 00000620: AND 00000621: PUSH2 0x179c 00000624: JUMP 00000625: JUMPDEST 00000626: CALLVALUE 00000627: DUP1 00000628: ISZERO 00000629: PUSH2 0x0631 0000062c: JUMPI 0000062d: PUSH1 0x00 0000062f: DUP1 00000630: REVERT 00000631: JUMPDEST 00000632: POP 00000633: PUSH2 0x02d5 00000636: PUSH1 0x04 00000638: DUP1 00000639: CALLDATASIZE 0000063a: SUB 0000063b: PUSH1 0x20 0000063d: DUP2 0000063e: LT 0000063f: ISZERO 00000640: PUSH2 0x0648 00000643: JUMPI 00000644: PUSH1 0x00 00000646: DUP1 00000647: REVERT 00000648: JUMPDEST 00000649: POP 0000064a: CALLDATALOAD 0000064b: PUSH1 0x01 0000064d: PUSH1 0x01 0000064f: PUSH1 0xa0 00000651: SHL 00000652: SUB 00000653: AND 00000654: PUSH2 0x17b9 00000657: JUMP 00000658: JUMPDEST 00000659: CALLVALUE 0000065a: DUP1 0000065b: ISZERO 0000065c: PUSH2 0x0664 0000065f: JUMPI 00000660: PUSH1 0x00 00000662: DUP1 00000663: REVERT 00000664: JUMPDEST 00000665: POP 00000666: PUSH2 0x024d 00000669: PUSH1 0x04 0000066b: DUP1 0000066c: CALLDATASIZE 0000066d: SUB 0000066e: PUSH1 0x40 00000670: DUP2 00000671: LT 00000672: ISZERO 00000673: PUSH2 0x067b 00000676: JUMPI 00000677: PUSH1 0x00 00000679: DUP1 0000067a: REVERT 0000067b: JUMPDEST 0000067c: POP 0000067d: PUSH1 0x01 0000067f: PUSH1 0x01 00000681: PUSH1 0xa0 00000683: SHL 00000684: SUB 00000685: DUP2 00000686: CALLDATALOAD 00000687: DUP2 00000688: AND 00000689: SWAP2 0000068a: PUSH1 0x20 0000068c: ADD 0000068d: CALLDATALOAD 0000068e: AND 0000068f: PUSH2 0x17fc 00000692: JUMP 00000693: JUMPDEST 00000694: PUSH1 0x01 00000696: PUSH1 0x01 00000698: PUSH1 0xa0 0000069a: SHL 0000069b: SUB 0000069c: DUP2 0000069d: DUP2 0000069e: AND 0000069f: PUSH1 0x00 000006a1: SWAP1 000006a2: DUP2 000006a3: MSTORE 000006a4: PUSH1 0x07 000006a6: PUSH1 0x20 000006a8: MSTORE 000006a9: PUSH1 0x40 000006ab: DUP2 000006ac: KECCAK256 000006ad: SLOAD 000006ae: SWAP1 000006af: SWAP2 000006b0: AND 000006b1: PUSH2 0x06eb 000006b4: JUMPI 000006b5: PUSH1 0x40 000006b7: MLOAD 000006b8: PUSH3 0x461bcd 000006bc: PUSH1 0xe5 000006be: SHL 000006bf: DUP2 000006c0: MSTORE 000006c1: PUSH1 0x04 000006c3: ADD 000006c4: DUP1 000006c5: DUP1 000006c6: PUSH1 0x20 000006c8: ADD 000006c9: DUP3 000006ca: DUP2 000006cb: SUB 000006cc: DUP3 000006cd: MSTORE 000006ce: PUSH1 0x21 000006d0: DUP2 000006d1: MSTORE 000006d2: PUSH1 0x20 000006d4: ADD 000006d5: DUP1 000006d6: PUSH2 0x1e08 000006d9: PUSH1 0x21 000006db: SWAP2 000006dc: CODECOPY 000006dd: PUSH1 0x40 000006df: ADD 000006e0: SWAP2 000006e1: POP 000006e2: POP 000006e3: PUSH1 0x40 000006e5: MLOAD 000006e6: DUP1 000006e7: SWAP2 000006e8: SUB 000006e9: SWAP1 000006ea: REVERT 000006eb: JUMPDEST 000006ec: POP 000006ed: PUSH1 0x01 000006ef: PUSH1 0x01 000006f1: PUSH1 0xa0 000006f3: SHL 000006f4: SUB 000006f5: SWAP1 000006f6: DUP2 000006f7: AND 000006f8: PUSH1 0x00 000006fa: SWAP1 000006fb: DUP2 000006fc: MSTORE 000006fd: PUSH1 0x07 000006ff: PUSH1 0x20 00000701: MSTORE 00000702: PUSH1 0x40 00000704: SWAP1 00000705: KECCAK256 00000706: SLOAD 00000707: AND 00000708: SWAP1 00000709: JUMP 0000070a: JUMPDEST 0000070b: PUSH1 0x01 0000070d: SLOAD 0000070e: PUSH1 0x00 00000710: SWAP1 00000711: DUP3 00000712: LT 00000713: PUSH2 0x0754 00000716: JUMPI 00000717: PUSH1 0x40 00000719: DUP1 0000071a: MLOAD 0000071b: PUSH3 0x461bcd 0000071f: PUSH1 0xe5 00000721: SHL 00000722: DUP2 00000723: MSTORE 00000724: PUSH1 0x20 00000726: PUSH1 0x04 00000728: DUP3 00000729: ADD 0000072a: MSTORE 0000072b: PUSH1 0x0e 0000072d: PUSH1 0x24 0000072f: DUP3 00000730: ADD 00000731: MSTORE 00000732: PUSH14 0x27baba1037b3103137bab7323997 00000741: PUSH1 0x91 00000743: SHL 00000744: PUSH1 0x44 00000746: DUP3 00000747: ADD 00000748: MSTORE 00000749: SWAP1 0000074a: MLOAD 0000074b: SWAP1 0000074c: DUP2 0000074d: SWAP1 0000074e: SUB 0000074f: PUSH1 0x64 00000751: ADD 00000752: SWAP1 00000753: REVERT 00000754: JUMPDEST 00000755: PUSH1 0x01 00000757: DUP3 00000758: DUP2 00000759: SLOAD 0000075a: DUP2 0000075b: LT 0000075c: PUSH2 0x0761 0000075f: JUMPI 00000760: INVALID 00000761: JUMPDEST 00000762: PUSH1 0x00 00000764: SWAP2 00000765: DUP3 00000766: MSTORE 00000767: PUSH1 0x20 00000769: SWAP1 0000076a: SWAP2 0000076b: KECCAK256 0000076c: ADD 0000076d: SLOAD 0000076e: PUSH1 0x01 00000770: PUSH1 0x01 00000772: PUSH1 0xa0 00000774: SHL 00000775: SUB 00000776: AND 00000777: SWAP3 00000778: SWAP2 00000779: POP 0000077a: POP 0000077b: JUMP 0000077c: JUMPDEST 0000077d: PUSH1 0x03 0000077f: DUP1 00000780: SLOAD 00000781: PUSH1 0x01 00000783: ADD 00000784: SWAP1 00000785: DUP2 00000786: SWAP1 00000787: SSTORE 00000788: PUSH1 0x05 0000078a: SLOAD 0000078b: PUSH2 0x079a 0000078e: SWAP1 0000078f: CALLVALUE 00000790: PUSH4 0xffffffff 00000795: PUSH2 0x1879 00000798: AND 00000799: JUMP 0000079a: JUMPDEST 0000079b: PUSH1 0x05 0000079d: SSTORE 0000079e: PUSH1 0x04 000007a0: DUP1 000007a1: SLOAD 000007a2: PUSH1 0x40 000007a4: DUP1 000007a5: MLOAD 000007a6: PUSH4 0xd13f1391 000007ab: PUSH1 0xe0 000007ad: SHL 000007ae: DUP2 000007af: MSTORE 000007b0: PUSH2 0x7530 000007b3: SWAP4 000007b4: DUP2 000007b5: ADD 000007b6: SWAP4 000007b7: SWAP1 000007b8: SWAP4 000007b9: MSTORE 000007ba: MLOAD 000007bb: PUSH1 0x00 000007bd: SWAP3 000007be: PUSH1 0x01 000007c0: PUSH1 0x01 000007c2: PUSH1 0xa0 000007c4: SHL 000007c5: SUB 000007c6: SWAP1 000007c7: SWAP3 000007c8: AND 000007c9: SWAP2 000007ca: PUSH4 0xd13f1391 000007cf: SWAP2 000007d0: PUSH1 0x24 000007d2: DUP1 000007d3: DUP4 000007d4: ADD 000007d5: SWAP3 000007d6: PUSH1 0x20 000007d8: SWAP3 000007d9: SWAP2 000007da: SWAP1 000007db: DUP3 000007dc: SWAP1 000007dd: SUB 000007de: ADD 000007df: DUP2 000007e0: DUP7 000007e1: DUP1 000007e2: EXTCODESIZE 000007e3: ISZERO 000007e4: DUP1 000007e5: ISZERO 000007e6: PUSH2 0x07ee 000007e9: JUMPI 000007ea: PUSH1 0x00 000007ec: DUP1 000007ed: REVERT 000007ee: JUMPDEST 000007ef: POP 000007f0: GAS 000007f1: STATICCALL 000007f2: ISZERO 000007f3: DUP1 000007f4: ISZERO 000007f5: PUSH2 0x0802 000007f8: JUMPI 000007f9: RETURNDATASIZE 000007fa: PUSH1 0x00 000007fc: DUP1 000007fd: RETURNDATACOPY 000007fe: RETURNDATASIZE 000007ff: PUSH1 0x00 00000801: REVERT 00000802: JUMPDEST 00000803: POP 00000804: POP 00000805: POP 00000806: POP 00000807: PUSH1 0x40 00000809: MLOAD 0000080a: RETURNDATASIZE 0000080b: PUSH1 0x20 0000080d: DUP2 0000080e: LT 0000080f: ISZERO 00000810: PUSH2 0x0818 00000813: JUMPI 00000814: PUSH1 0x00 00000816: DUP1 00000817: REVERT 00000818: JUMPDEST 00000819: POP 0000081a: MLOAD 0000081b: PUSH1 0x05 0000081d: SLOAD 0000081e: SWAP1 0000081f: SWAP2 00000820: POP 00000821: DUP2 00000822: GT 00000823: ISZERO 00000824: PUSH2 0x085e 00000827: JUMPI 00000828: PUSH1 0x40 0000082a: MLOAD 0000082b: PUSH3 0x461bcd 0000082f: PUSH1 0xe5 00000831: SHL 00000832: DUP2 00000833: MSTORE 00000834: PUSH1 0x04 00000836: ADD 00000837: DUP1 00000838: DUP1 00000839: PUSH1 0x20 0000083b: ADD 0000083c: DUP3 0000083d: DUP2 0000083e: SUB 0000083f: DUP3 00000840: MSTORE 00000841: PUSH1 0x22 00000843: DUP2 00000844: MSTORE 00000845: PUSH1 0x20 00000847: ADD 00000848: DUP1 00000849: PUSH2 0x1e54 0000084c: PUSH1 0x22 0000084e: SWAP2 0000084f: CODECOPY 00000850: PUSH1 0x40 00000852: ADD 00000853: SWAP2 00000854: POP 00000855: POP 00000856: PUSH1 0x40 00000858: MLOAD 00000859: DUP1 0000085a: SWAP2 0000085b: SUB 0000085c: SWAP1 0000085d: REVERT 0000085e: JUMPDEST 0000085f: PUSH1 0x05 00000861: SLOAD 00000862: PUSH2 0x0871 00000865: SWAP1 00000866: DUP3 00000867: PUSH4 0xffffffff 0000086c: PUSH2 0x18da 0000086f: AND 00000870: JUMP 00000871: JUMPDEST 00000872: PUSH1 0x05 00000874: SSTORE 00000875: PUSH1 0x00 00000877: PUSH1 0x60 00000879: PUSH2 0x0881 0000087c: DUP4 0000087d: PUSH2 0x1937 00000880: JUMP 00000881: JUMPDEST 00000882: SWAP2 00000883: POP 00000884: SWAP2 00000885: POP 00000886: DUP2 00000887: PUSH2 0x090f 0000088a: JUMPI 0000088b: DUP1 0000088c: PUSH1 0x40 0000088e: MLOAD 0000088f: PUSH3 0x461bcd 00000893: PUSH1 0xe5 00000895: SHL 00000896: DUP2 00000897: MSTORE 00000898: PUSH1 0x04 0000089a: ADD 0000089b: DUP1 0000089c: DUP1 0000089d: PUSH1 0x20 0000089f: ADD 000008a0: DUP3 000008a1: DUP2 000008a2: SUB 000008a3: DUP3 000008a4: MSTORE 000008a5: DUP4 000008a6: DUP2 000008a7: DUP2 000008a8: MLOAD 000008a9: DUP2 000008aa: MSTORE 000008ab: PUSH1 0x20 000008ad: ADD 000008ae: SWAP2 000008af: POP 000008b0: DUP1 000008b1: MLOAD 000008b2: SWAP1 000008b3: PUSH1 0x20 000008b5: ADD 000008b6: SWAP1 000008b7: DUP1 000008b8: DUP4 000008b9: DUP4 000008ba: PUSH1 0x00 000008bc: JUMPDEST 000008bd: DUP4 000008be: DUP2 000008bf: LT 000008c0: ISZERO 000008c1: PUSH2 0x08d4 000008c4: JUMPI 000008c5: DUP2 000008c6: DUP2 000008c7: ADD 000008c8: MLOAD 000008c9: DUP4 000008ca: DUP3 000008cb: ADD 000008cc: MSTORE 000008cd: PUSH1 0x20 000008cf: ADD 000008d0: PUSH2 0x08bc 000008d3: JUMP 000008d4: JUMPDEST 000008d5: POP 000008d6: POP 000008d7: POP 000008d8: POP 000008d9: SWAP1 000008da: POP 000008db: SWAP1 000008dc: DUP2 000008dd: ADD 000008de: SWAP1 000008df: PUSH1 0x1f 000008e1: AND 000008e2: DUP1 000008e3: ISZERO 000008e4: PUSH2 0x0901 000008e7: JUMPI 000008e8: DUP1 000008e9: DUP3 000008ea: SUB 000008eb: DUP1 000008ec: MLOAD 000008ed: PUSH1 0x01 000008ef: DUP4 000008f0: PUSH1 0x20 000008f2: SUB 000008f3: PUSH2 0x0100 000008f6: EXP 000008f7: SUB 000008f8: NOT 000008f9: AND 000008fa: DUP2 000008fb: MSTORE 000008fc: PUSH1 0x20 000008fe: ADD 000008ff: SWAP2 00000900: POP 00000901: JUMPDEST 00000902: POP 00000903: SWAP3 00000904: POP 00000905: POP 00000906: POP 00000907: PUSH1 0x40 00000909: MLOAD 0000090a: DUP1 0000090b: SWAP2 0000090c: SUB 0000090d: SWAP1 0000090e: REVERT 0000090f: JUMPDEST 00000910: POP 00000911: POP 00000912: POP 00000913: PUSH1 0x03 00000915: SLOAD 00000916: DUP2 00000917: EQ 00000918: PUSH2 0x0968 0000091b: JUMPI 0000091c: PUSH1 0x40 0000091e: DUP1 0000091f: MLOAD 00000920: PUSH3 0x461bcd 00000924: PUSH1 0xe5 00000926: SHL 00000927: DUP2 00000928: MSTORE 00000929: PUSH1 0x20 0000092b: PUSH1 0x04 0000092d: DUP3 0000092e: ADD 0000092f: MSTORE 00000930: PUSH1 0x1f 00000932: PUSH1 0x24 00000934: DUP3 00000935: ADD 00000936: MSTORE 00000937: PUSH32 0x5265656e7472616e637947756172643a207265656e7472616e742063616c6c00 00000958: PUSH1 0x44 0000095a: DUP3 0000095b: ADD 0000095c: MSTORE 0000095d: SWAP1 0000095e: MLOAD 0000095f: SWAP1 00000960: DUP2 00000961: SWAP1 00000962: SUB 00000963: PUSH1 0x64 00000965: ADD 00000966: SWAP1 00000967: REVERT 00000968: JUMPDEST 00000969: POP 0000096a: JUMP 0000096b: JUMPDEST 0000096c: PUSH1 0x04 0000096e: SLOAD 0000096f: PUSH1 0x01 00000971: PUSH1 0x01 00000973: PUSH1 0xa0 00000975: SHL 00000976: SUB 00000977: AND 00000978: CALLER 00000979: EQ 0000097a: PUSH2 0x09ca 0000097d: JUMPI 0000097e: PUSH1 0x40 00000980: DUP1 00000981: MLOAD 00000982: PUSH3 0x461bcd 00000986: PUSH1 0xe5 00000988: SHL 00000989: DUP2 0000098a: MSTORE 0000098b: PUSH1 0x20 0000098d: PUSH1 0x04 0000098f: DUP3 00000990: ADD 00000991: MSTORE 00000992: PUSH1 0x1f 00000994: PUSH1 0x24 00000996: DUP3 00000997: ADD 00000998: MSTORE 00000999: PUSH32 0x43616c6c6572206973206e6f74207468652072616e646f6d20626561636f6e00 000009ba: PUSH1 0x44 000009bc: DUP3 000009bd: ADD 000009be: MSTORE 000009bf: SWAP1 000009c0: MLOAD 000009c1: SWAP1 000009c2: DUP2 000009c3: SWAP1 000009c4: SUB 000009c5: PUSH1 0x64 000009c7: ADD 000009c8: SWAP1 000009c9: REVERT 000009ca: JUMPDEST 000009cb: PUSH1 0x06 000009cd: SSTORE 000009ce: JUMP 000009cf: JUMPDEST 000009d0: PUSH1 0x09 000009d2: SLOAD 000009d3: PUSH1 0x40 000009d5: DUP1 000009d6: MLOAD 000009d7: PUSH4 0xef1f9661 000009dc: PUSH1 0xe0 000009de: SHL 000009df: DUP2 000009e0: MSTORE 000009e1: PUSH1 0x01 000009e3: PUSH1 0x01 000009e5: PUSH1 0xa0 000009e7: SHL 000009e8: SUB 000009e9: DUP5 000009ea: DUP2 000009eb: AND 000009ec: PUSH1 0x04 000009ee: DUP4 000009ef: ADD 000009f0: MSTORE 000009f1: ADDRESS 000009f2: PUSH1 0x24 000009f4: DUP4 000009f5: ADD 000009f6: MSTORE 000009f7: SWAP2 000009f8: MLOAD 000009f9: PUSH1 0x00 000009fb: SWAP4 000009fc: SWAP3 000009fd: SWAP1 000009fe: SWAP3 000009ff: AND 00000a00: SWAP2 00000a01: PUSH4 0xef1f9661 00000a06: SWAP2 00000a07: PUSH1 0x44 00000a09: DUP1 00000a0a: DUP3 00000a0b: ADD 00000a0c: SWAP3 00000a0d: PUSH1 0x20 00000a0f: SWAP3 00000a10: SWAP1 00000a11: SWAP2 00000a12: SWAP1 00000a13: DUP3 00000a14: SWAP1 00000a15: SUB 00000a16: ADD 00000a17: DUP2 00000a18: DUP7 00000a19: DUP1 00000a1a: EXTCODESIZE 00000a1b: ISZERO 00000a1c: DUP1 00000a1d: ISZERO 00000a1e: PUSH2 0x0a26 00000a21: JUMPI 00000a22: PUSH1 0x00 00000a24: DUP1 00000a25: REVERT 00000a26: JUMPDEST 00000a27: POP 00000a28: GAS 00000a29: STATICCALL 00000a2a: ISZERO 00000a2b: DUP1 00000a2c: ISZERO 00000a2d: PUSH2 0x0a3a 00000a30: JUMPI 00000a31: RETURNDATASIZE 00000a32: PUSH1 0x00 00000a34: DUP1 00000a35: RETURNDATACOPY 00000a36: RETURNDATASIZE 00000a37: PUSH1 0x00 00000a39: REVERT 00000a3a: JUMPDEST 00000a3b: POP 00000a3c: POP 00000a3d: POP 00000a3e: POP 00000a3f: PUSH1 0x40 00000a41: MLOAD 00000a42: RETURNDATASIZE 00000a43: PUSH1 0x20 00000a45: DUP2 00000a46: LT 00000a47: ISZERO 00000a48: PUSH2 0x0a50 00000a4b: JUMPI 00000a4c: PUSH1 0x00 00000a4e: DUP1 00000a4f: REVERT 00000a50: JUMPDEST 00000a51: POP 00000a52: MLOAD 00000a53: SWAP3 00000a54: SWAP2 00000a55: POP 00000a56: POP 00000a57: JUMP 00000a58: JUMPDEST 00000a59: PUSH1 0x04 00000a5b: DUP1 00000a5c: SLOAD 00000a5d: PUSH1 0x40 00000a5f: DUP1 00000a60: MLOAD 00000a61: PUSH4 0xd13f1391 00000a66: PUSH1 0xe0 00000a68: SHL 00000a69: DUP2 00000a6a: MSTORE 00000a6b: PUSH2 0x7530 00000a6e: SWAP4 00000a6f: DUP2 00000a70: ADD 00000a71: SWAP4 00000a72: SWAP1 00000a73: SWAP4 00000a74: MSTORE 00000a75: MLOAD 00000a76: PUSH1 0x00 00000a78: SWAP3 00000a79: DUP4 00000a7a: SWAP3 00000a7b: PUSH1 0x01 00000a7d: PUSH1 0x01 00000a7f: PUSH1 0xa0 00000a81: SHL 00000a82: SUB 00000a83: AND 00000a84: SWAP2 00000a85: PUSH4 0xd13f1391 00000a8a: SWAP2 00000a8b: PUSH1 0x24 00000a8d: DUP1 00000a8e: DUP3 00000a8f: ADD 00000a90: SWAP3 00000a91: PUSH1 0x20 00000a93: SWAP3 00000a94: SWAP1 00000a95: SWAP2 00000a96: SWAP1 00000a97: DUP3 00000a98: SWAP1 00000a99: SUB 00000a9a: ADD 00000a9b: DUP2 00000a9c: DUP7 00000a9d: DUP1 00000a9e: EXTCODESIZE 00000a9f: ISZERO 00000aa0: DUP1 00000aa1: ISZERO 00000aa2: PUSH2 0x0aaa 00000aa5: JUMPI 00000aa6: PUSH1 0x00 00000aa8: DUP1 00000aa9: REVERT 00000aaa: JUMPDEST 00000aab: POP 00000aac: GAS 00000aad: STATICCALL 00000aae: ISZERO 00000aaf: DUP1 00000ab0: ISZERO 00000ab1: PUSH2 0x0abe 00000ab4: JUMPI 00000ab5: RETURNDATASIZE 00000ab6: PUSH1 0x00 00000ab8: DUP1 00000ab9: RETURNDATACOPY 00000aba: RETURNDATASIZE 00000abb: PUSH1 0x00 00000abd: REVERT 00000abe: JUMPDEST 00000abf: POP 00000ac0: POP 00000ac1: POP 00000ac2: POP 00000ac3: PUSH1 0x40 00000ac5: MLOAD 00000ac6: RETURNDATASIZE 00000ac7: PUSH1 0x20 00000ac9: DUP2 00000aca: LT 00000acb: ISZERO 00000acc: PUSH2 0x0ad4 00000acf: JUMPI 00000ad0: PUSH1 0x00 00000ad2: DUP1 00000ad3: REVERT 00000ad4: JUMPDEST 00000ad5: POP 00000ad6: MLOAD 00000ad7: PUSH1 0x05 00000ad9: SLOAD 00000ada: SWAP1 00000adb: SWAP2 00000adc: POP 00000add: DUP2 00000ade: GT 00000adf: ISZERO 00000ae0: PUSH2 0x0afc 00000ae3: JUMPI 00000ae4: PUSH1 0x05 00000ae6: SLOAD 00000ae7: PUSH2 0x0af7 00000aea: SWAP1 00000aeb: DUP3 00000aec: SWAP1 00000aed: PUSH4 0xffffffff 00000af2: PUSH2 0x18da 00000af5: AND 00000af6: JUMP 00000af7: JUMPDEST 00000af8: PUSH2 0x0aff 00000afb: JUMP 00000afc: JUMPDEST 00000afd: PUSH1 0x00 00000aff: JUMPDEST 00000b00: SWAP2 00000b01: POP 00000b02: POP 00000b03: SWAP1 00000b04: JUMP 00000b05: JUMPDEST 00000b06: PUSH1 0x04 00000b08: DUP1 00000b09: SLOAD 00000b0a: PUSH1 0x40 00000b0c: DUP1 00000b0d: MLOAD 00000b0e: PUSH4 0xd13f1391 00000b13: PUSH1 0xe0 00000b15: SHL 00000b16: DUP2 00000b17: MSTORE 00000b18: PUSH2 0x7530 00000b1b: SWAP4 00000b1c: DUP2 00000b1d: ADD 00000b1e: SWAP4 00000b1f: SWAP1 00000b20: SWAP4 00000b21: MSTORE 00000b22: MLOAD 00000b23: PUSH1 0x00 00000b25: SWAP3 00000b26: PUSH1 0x01 00000b28: PUSH1 0x01 00000b2a: PUSH1 0xa0 00000b2c: SHL 00000b2d: SUB 00000b2e: SWAP1 00000b2f: SWAP3 00000b30: AND 00000b31: SWAP2 00000b32: PUSH4 0xd13f1391 00000b37: SWAP2 00000b38: PUSH1 0x24 00000b3a: DUP1 00000b3b: DUP4 00000b3c: ADD 00000b3d: SWAP3 00000b3e: PUSH1 0x20 00000b40: SWAP3 00000b41: SWAP2 00000b42: SWAP1 00000b43: DUP3 00000b44: SWAP1 00000b45: SUB 00000b46: ADD 00000b47: DUP2 00000b48: DUP7 00000b49: DUP1 00000b4a: EXTCODESIZE 00000b4b: ISZERO 00000b4c: DUP1 00000b4d: ISZERO 00000b4e: PUSH2 0x0b56 00000b51: JUMPI 00000b52: PUSH1 0x00 00000b54: DUP1 00000b55: REVERT 00000b56: JUMPDEST 00000b57: POP 00000b58: GAS 00000b59: STATICCALL 00000b5a: ISZERO 00000b5b: DUP1 00000b5c: ISZERO 00000b5d: PUSH2 0x0b6a 00000b60: JUMPI 00000b61: RETURNDATASIZE 00000b62: PUSH1 0x00 00000b64: DUP1 00000b65: RETURNDATACOPY 00000b66: RETURNDATASIZE 00000b67: PUSH1 0x00 00000b69: REVERT 00000b6a: JUMPDEST 00000b6b: POP 00000b6c: POP 00000b6d: POP 00000b6e: POP 00000b6f: PUSH1 0x40 00000b71: MLOAD 00000b72: RETURNDATASIZE 00000b73: PUSH1 0x20 00000b75: DUP2 00000b76: LT 00000b77: ISZERO 00000b78: PUSH2 0x0b80 00000b7b: JUMPI 00000b7c: PUSH1 0x00 00000b7e: DUP1 00000b7f: REVERT 00000b80: JUMPDEST 00000b81: POP 00000b82: MLOAD 00000b83: SWAP1 00000b84: POP 00000b85: SWAP1 00000b86: JUMP 00000b87: JUMPDEST 00000b88: PUSH1 0x01 00000b8a: PUSH1 0x01 00000b8c: PUSH1 0xa0 00000b8e: SHL 00000b8f: SUB 00000b90: DUP2 00000b91: DUP2 00000b92: AND 00000b93: PUSH1 0x00 00000b95: SWAP1 00000b96: DUP2 00000b97: MSTORE 00000b98: PUSH1 0x07 00000b9a: PUSH1 0x20 00000b9c: MSTORE 00000b9d: PUSH1 0x40 00000b9f: DUP2 00000ba0: KECCAK256 00000ba1: SLOAD 00000ba2: SWAP1 00000ba3: SWAP2 00000ba4: AND 00000ba5: PUSH2 0x0bb0 00000ba8: JUMPI 00000ba9: POP 00000baa: PUSH1 0x00 00000bac: PUSH2 0x0c3b 00000baf: JUMP 00000bb0: JUMPDEST 00000bb1: PUSH1 0x01 00000bb3: PUSH1 0x01 00000bb5: PUSH1 0xa0 00000bb7: SHL 00000bb8: SUB 00000bb9: DUP1 00000bba: DUP4 00000bbb: AND 00000bbc: PUSH1 0x00 00000bbe: SWAP1 00000bbf: DUP2 00000bc0: MSTORE 00000bc1: PUSH1 0x07 00000bc3: PUSH1 0x20 00000bc5: SWAP1 00000bc6: DUP2 00000bc7: MSTORE 00000bc8: PUSH1 0x40 00000bca: SWAP2 00000bcb: DUP3 00000bcc: SWAP1 00000bcd: KECCAK256 00000bce: SLOAD 00000bcf: DUP3 00000bd0: MLOAD 00000bd1: PUSH4 0x5a3b342b 00000bd6: PUSH1 0xe1 00000bd8: SHL 00000bd9: DUP2 00000bda: MSTORE 00000bdb: DUP8 00000bdc: DUP6 00000bdd: AND 00000bde: PUSH1 0x04 00000be0: DUP3 00000be1: ADD 00000be2: MSTORE 00000be3: SWAP3 00000be4: MLOAD 00000be5: SWAP4 00000be6: AND 00000be7: SWAP3 00000be8: DUP4 00000be9: SWAP3 00000bea: PUSH4 0xb4766856 00000bef: SWAP3 00000bf0: PUSH1 0x24 00000bf2: DUP1 00000bf3: DUP4 00000bf4: ADD 00000bf5: SWAP4 00000bf6: SWAP2 00000bf7: SWAP3 00000bf8: DUP3 00000bf9: SWAP1 00000bfa: SUB 00000bfb: ADD 00000bfc: DUP2 00000bfd: DUP7 00000bfe: DUP1 00000bff: EXTCODESIZE 00000c00: ISZERO 00000c01: DUP1 00000c02: ISZERO 00000c03: PUSH2 0x0c0b 00000c06: JUMPI 00000c07: PUSH1 0x00 00000c09: DUP1 00000c0a: REVERT 00000c0b: JUMPDEST 00000c0c: POP 00000c0d: GAS 00000c0e: STATICCALL 00000c0f: ISZERO 00000c10: DUP1 00000c11: ISZERO 00000c12: PUSH2 0x0c1f 00000c15: JUMPI 00000c16: RETURNDATASIZE 00000c17: PUSH1 0x00 00000c19: DUP1 00000c1a: RETURNDATACOPY 00000c1b: RETURNDATASIZE 00000c1c: PUSH1 0x00 00000c1e: REVERT 00000c1f: JUMPDEST 00000c20: POP 00000c21: POP 00000c22: POP 00000c23: POP 00000c24: PUSH1 0x40 00000c26: MLOAD 00000c27: RETURNDATASIZE 00000c28: PUSH1 0x20 00000c2a: DUP2 00000c2b: LT 00000c2c: ISZERO 00000c2d: PUSH2 0x0c35 00000c30: JUMPI 00000c31: PUSH1 0x00 00000c33: DUP1 00000c34: REVERT 00000c35: JUMPDEST 00000c36: POP 00000c37: MLOAD 00000c38: SWAP2 00000c39: POP 00000c3a: POP 00000c3b: JUMPDEST 00000c3c: SWAP3 00000c3d: SWAP2 00000c3e: POP 00000c3f: POP 00000c40: JUMP 00000c41: JUMPDEST 00000c42: PUSH1 0x09 00000c44: SLOAD 00000c45: PUSH1 0x40 00000c47: DUP1 00000c48: MLOAD 00000c49: PUSH3 0x4298fb 00000c4d: PUSH1 0xe6 00000c4f: SHL 00000c50: DUP2 00000c51: MSTORE 00000c52: PUSH1 0x01 00000c54: PUSH1 0x01 00000c56: PUSH1 0xa0 00000c58: SHL 00000c59: SUB 00000c5a: DUP5 00000c5b: DUP2 00000c5c: AND 00000c5d: PUSH1 0x04 00000c5f: DUP4 00000c60: ADD 00000c61: MSTORE 00000c62: ADDRESS 00000c63: PUSH1 0x24 00000c65: DUP4 00000c66: ADD 00000c67: MSTORE 00000c68: SWAP2 00000c69: MLOAD 00000c6a: PUSH1 0x00 00000c6c: SWAP4 00000c6d: SWAP3 00000c6e: SWAP1 00000c6f: SWAP3 00000c70: AND 00000c71: SWAP2 00000c72: PUSH4 0x10a63ec0 00000c77: SWAP2 00000c78: PUSH1 0x44 00000c7a: DUP1 00000c7b: DUP3 00000c7c: ADD 00000c7d: SWAP3 00000c7e: PUSH1 0x20 00000c80: SWAP3 00000c81: SWAP1 00000c82: SWAP2 00000c83: SWAP1 00000c84: DUP3 00000c85: SWAP1 00000c86: SUB 00000c87: ADD 00000c88: DUP2 00000c89: DUP7 00000c8a: DUP1 00000c8b: EXTCODESIZE 00000c8c: ISZERO 00000c8d: DUP1 00000c8e: ISZERO 00000c8f: PUSH2 0x0a26 00000c92: JUMPI 00000c93: PUSH1 0x00 00000c95: DUP1 00000c96: REVERT 00000c97: JUMPDEST 00000c98: PUSH1 0x00 00000c9a: SLOAD 00000c9b: PUSH1 0x01 00000c9d: PUSH1 0x01 00000c9f: PUSH1 0xa0 00000ca1: SHL 00000ca2: SUB 00000ca3: AND 00000ca4: DUP2 00000ca5: JUMP 00000ca6: JUMPDEST 00000ca7: PUSH1 0x09 00000ca9: SLOAD 00000caa: PUSH1 0x40 00000cac: DUP1 00000cad: MLOAD 00000cae: PUSH4 0x70a08231 00000cb3: PUSH1 0xe0 00000cb5: SHL 00000cb6: DUP2 00000cb7: MSTORE 00000cb8: PUSH1 0x01 00000cba: PUSH1 0x01 00000cbc: PUSH1 0xa0 00000cbe: SHL 00000cbf: SUB 00000cc0: DUP5 00000cc1: DUP2 00000cc2: AND 00000cc3: PUSH1 0x04 00000cc5: DUP4 00000cc6: ADD 00000cc7: MSTORE 00000cc8: SWAP2 00000cc9: MLOAD 00000cca: PUSH1 0x00 00000ccc: SWAP4 00000ccd: SWAP3 00000cce: SWAP1 00000ccf: SWAP3 00000cd0: AND 00000cd1: SWAP2 00000cd2: PUSH4 0x70a08231 00000cd7: SWAP2 00000cd8: PUSH1 0x24 00000cda: DUP1 00000cdb: DUP3 00000cdc: ADD 00000cdd: SWAP3 00000cde: PUSH1 0x20 00000ce0: SWAP3 00000ce1: SWAP1 00000ce2: SWAP2 00000ce3: SWAP1 00000ce4: DUP3 00000ce5: SWAP1 00000ce6: SUB 00000ce7: ADD 00000ce8: DUP2 00000ce9: DUP7 00000cea: DUP1 00000ceb: EXTCODESIZE 00000cec: ISZERO 00000ced: DUP1 00000cee: ISZERO 00000cef: PUSH2 0x0a26 00000cf2: JUMPI 00000cf3: PUSH1 0x00 00000cf5: DUP1 00000cf6: REVERT 00000cf7: JUMPDEST 00000cf8: PUSH1 0x06 00000cfa: SLOAD 00000cfb: DUP2 00000cfc: JUMP 00000cfd: JUMPDEST 00000cfe: PUSH1 0x01 00000d00: DUP2 00000d01: DUP2 00000d02: SLOAD 00000d03: DUP2 00000d04: LT 00000d05: PUSH2 0x0d0a 00000d08: JUMPI 00000d09: INVALID 00000d0a: JUMPDEST 00000d0b: PUSH1 0x00 00000d0d: SWAP2 00000d0e: DUP3 00000d0f: MSTORE 00000d10: PUSH1 0x20 00000d12: SWAP1 00000d13: SWAP2 00000d14: KECCAK256 00000d15: ADD 00000d16: SLOAD 00000d17: PUSH1 0x01 00000d19: PUSH1 0x01 00000d1b: PUSH1 0xa0 00000d1d: SHL 00000d1e: SUB 00000d1f: AND 00000d20: SWAP1 00000d21: POP 00000d22: DUP2 00000d23: JUMP 00000d24: JUMPDEST 00000d25: PUSH1 0x00 00000d27: PUSH2 0x0d2f 00000d2a: DUP3 00000d2b: PUSH2 0x0693 00000d2e: JUMP 00000d2f: JUMPDEST 00000d30: PUSH1 0x40 00000d32: DUP1 00000d33: MLOAD 00000d34: PUSH4 0x07b8c367 00000d39: PUSH1 0xe5 00000d3b: SHL 00000d3c: DUP2 00000d3d: MSTORE 00000d3e: CALLER 00000d3f: PUSH1 0x04 00000d41: DUP3 00000d42: ADD 00000d43: DUP2 00000d44: SWAP1 00000d45: MSTORE 00000d46: SWAP2 00000d47: MLOAD 00000d48: SWAP3 00000d49: SWAP4 00000d4a: POP 00000d4b: SWAP1 00000d4c: SWAP2 00000d4d: PUSH1 0x01 00000d4f: PUSH1 0x01 00000d51: PUSH1 0xa0 00000d53: SHL 00000d54: SUB 00000d55: DUP5 00000d56: AND 00000d57: SWAP2 00000d58: PUSH4 0xf7186ce0 00000d5d: SWAP2 00000d5e: PUSH1 0x24 00000d60: DUP1 00000d61: DUP4 00000d62: ADD 00000d63: SWAP3 00000d64: PUSH1 0x20 00000d66: SWAP3 00000d67: SWAP2 00000d68: SWAP1 00000d69: DUP3 00000d6a: SWAP1 00000d6b: SUB 00000d6c: ADD 00000d6d: DUP2 00000d6e: DUP7 00000d6f: DUP1 00000d70: EXTCODESIZE 00000d71: ISZERO 00000d72: DUP1 00000d73: ISZERO 00000d74: PUSH2 0x0d7c 00000d77: JUMPI 00000d78: PUSH1 0x00 00000d7a: DUP1 00000d7b: REVERT 00000d7c: JUMPDEST 00000d7d: POP 00000d7e: GAS 00000d7f: STATICCALL 00000d80: ISZERO 00000d81: DUP1 00000d82: ISZERO 00000d83: PUSH2 0x0d90 00000d86: JUMPI 00000d87: RETURNDATASIZE 00000d88: PUSH1 0x00 00000d8a: DUP1 00000d8b: RETURNDATACOPY 00000d8c: RETURNDATASIZE 00000d8d: PUSH1 0x00 00000d8f: REVERT 00000d90: JUMPDEST 00000d91: POP 00000d92: POP 00000d93: POP 00000d94: POP 00000d95: PUSH1 0x40 00000d97: MLOAD 00000d98: RETURNDATASIZE 00000d99: PUSH1 0x20 00000d9b: DUP2 00000d9c: LT 00000d9d: ISZERO 00000d9e: PUSH2 0x0da6 00000da1: JUMPI 00000da2: PUSH1 0x00 00000da4: DUP1 00000da5: REVERT 00000da6: JUMPDEST 00000da7: POP 00000da8: MLOAD 00000da9: PUSH2 0x0e1d 00000dac: JUMPI 00000dad: DUP2 00000dae: PUSH1 0x01 00000db0: PUSH1 0x01 00000db2: PUSH1 0xa0 00000db4: SHL 00000db5: SUB 00000db6: AND 00000db7: PUSH4 0x1ae0e73d 00000dbc: DUP3 00000dbd: PUSH1 0x40 00000dbf: MLOAD 00000dc0: DUP3 00000dc1: PUSH4 0xffffffff 00000dc6: AND 00000dc7: PUSH1 0xe0 00000dc9: SHL 00000dca: DUP2 00000dcb: MSTORE 00000dcc: PUSH1 0x04 00000dce: ADD 00000dcf: DUP1 00000dd0: DUP3 00000dd1: PUSH1 0x01 00000dd3: PUSH1 0x01 00000dd5: PUSH1 0xa0 00000dd7: SHL 00000dd8: SUB 00000dd9: AND 00000dda: PUSH1 0x01 00000ddc: PUSH1 0x01 00000dde: PUSH1 0xa0 00000de0: SHL 00000de1: SUB 00000de2: AND 00000de3: DUP2 00000de4: MSTORE 00000de5: PUSH1 0x20 00000de7: ADD 00000de8: SWAP2 00000de9: POP 00000dea: POP 00000deb: PUSH1 0x00 00000ded: PUSH1 0x40 00000def: MLOAD 00000df0: DUP1 00000df1: DUP4 00000df2: SUB 00000df3: DUP2 00000df4: PUSH1 0x00 00000df6: DUP8 00000df7: DUP1 00000df8: EXTCODESIZE 00000df9: ISZERO 00000dfa: DUP1 00000dfb: ISZERO 00000dfc: PUSH2 0x0e04 00000dff: JUMPI 00000e00: PUSH1 0x00 00000e02: DUP1 00000e03: REVERT 00000e04: JUMPDEST 00000e05: POP 00000e06: GAS 00000e07: CALL 00000e08: ISZERO 00000e09: DUP1 00000e0a: ISZERO 00000e0b: PUSH2 0x0e18 00000e0e: JUMPI 00000e0f: RETURNDATASIZE 00000e10: PUSH1 0x00 00000e12: DUP1 00000e13: RETURNDATACOPY 00000e14: RETURNDATASIZE 00000e15: PUSH1 0x00 00000e17: REVERT 00000e18: JUMPDEST 00000e19: POP 00000e1a: POP 00000e1b: POP 00000e1c: POP 00000e1d: JUMPDEST 00000e1e: POP 00000e1f: POP 00000e20: POP 00000e21: JUMP 00000e22: JUMPDEST 00000e23: PUSH2 0x7530 00000e26: DUP2 00000e27: JUMP 00000e28: JUMPDEST 00000e29: PUSH1 0x00 00000e2b: PUSH2 0x0e34 00000e2e: DUP4 00000e2f: DUP4 00000e30: PUSH2 0x1a2d 00000e33: JUMP 00000e34: JUMPDEST 00000e35: PUSH1 0x01 00000e37: PUSH1 0x01 00000e39: PUSH1 0xa0 00000e3b: SHL 00000e3c: SUB 00000e3d: AND 00000e3e: PUSH4 0xe686440f 00000e43: DUP5 00000e44: PUSH1 0x40 00000e46: MLOAD 00000e47: DUP3 00000e48: PUSH4 0xffffffff 00000e4d: AND 00000e4e: PUSH1 0xe0 00000e50: SHL 00000e51: DUP2 00000e52: MSTORE 00000e53: PUSH1 0x04 00000e55: ADD 00000e56: DUP1 00000e57: DUP3 00000e58: PUSH1 0x01 00000e5a: PUSH1 0x01 00000e5c: PUSH1 0xa0 00000e5e: SHL 00000e5f: SUB 00000e60: AND 00000e61: PUSH1 0x01 00000e63: PUSH1 0x01 00000e65: PUSH1 0xa0 00000e67: SHL 00000e68: SUB 00000e69: AND 00000e6a: DUP2 00000e6b: MSTORE 00000e6c: PUSH1 0x20 00000e6e: ADD 00000e6f: SWAP2 00000e70: POP 00000e71: POP 00000e72: PUSH1 0x20 00000e74: PUSH1 0x40 00000e76: MLOAD 00000e77: DUP1 00000e78: DUP4 00000e79: SUB 00000e7a: DUP2 00000e7b: DUP7 00000e7c: DUP1 00000e7d: EXTCODESIZE 00000e7e: ISZERO 00000e7f: DUP1 00000e80: ISZERO 00000e81: PUSH2 0x0e89 00000e84: JUMPI 00000e85: PUSH1 0x00 00000e87: DUP1 00000e88: REVERT 00000e89: JUMPDEST 00000e8a: POP 00000e8b: GAS 00000e8c: STATICCALL 00000e8d: ISZERO 00000e8e: DUP1 00000e8f: ISZERO 00000e90: PUSH2 0x0e9d 00000e93: JUMPI 00000e94: RETURNDATASIZE 00000e95: PUSH1 0x00 00000e97: DUP1 00000e98: RETURNDATACOPY 00000e99: RETURNDATASIZE 00000e9a: PUSH1 0x00 00000e9c: REVERT 00000e9d: JUMPDEST 00000e9e: POP 00000e9f: POP 00000ea0: POP 00000ea1: POP 00000ea2: PUSH1 0x40 00000ea4: MLOAD 00000ea5: RETURNDATASIZE 00000ea6: PUSH1 0x20 00000ea8: DUP2 00000ea9: LT 00000eaa: ISZERO 00000eab: PUSH2 0x0eb3 00000eae: JUMPI 00000eaf: PUSH1 0x00 00000eb1: DUP1 00000eb2: REVERT 00000eb3: JUMPDEST 00000eb4: POP 00000eb5: MLOAD 00000eb6: SWAP4 00000eb7: SWAP3 00000eb8: POP 00000eb9: POP 00000eba: POP 00000ebb: JUMP 00000ebc: JUMPDEST 00000ebd: PUSH1 0x01 00000ebf: PUSH1 0x01 00000ec1: PUSH1 0xa0 00000ec3: SHL 00000ec4: SUB 00000ec5: DUP2 00000ec6: DUP2 00000ec7: AND 00000ec8: PUSH1 0x00 00000eca: SWAP1 00000ecb: DUP2 00000ecc: MSTORE 00000ecd: PUSH1 0x07 00000ecf: PUSH1 0x20 00000ed1: MSTORE 00000ed2: PUSH1 0x40 00000ed4: DUP2 00000ed5: KECCAK256 00000ed6: SLOAD 00000ed7: SWAP1 00000ed8: SWAP2 00000ed9: AND 00000eda: ISZERO 00000edb: PUSH2 0x0f2b 00000ede: JUMPI 00000edf: PUSH1 0x40 00000ee1: DUP1 00000ee2: MLOAD 00000ee3: PUSH3 0x461bcd 00000ee7: PUSH1 0xe5 00000ee9: SHL 00000eea: DUP2 00000eeb: MSTORE 00000eec: PUSH1 0x20 00000eee: PUSH1 0x04 00000ef0: DUP3 00000ef1: ADD 00000ef2: MSTORE 00000ef3: PUSH1 0x1d 00000ef5: PUSH1 0x24 00000ef7: DUP3 00000ef8: ADD 00000ef9: MSTORE 00000efa: PUSH32 0x536f72746974696f6e20706f6f6c20616c726561647920657869737473000000 00000f1b: PUSH1 0x44 00000f1d: DUP3 00000f1e: ADD 00000f1f: MSTORE 00000f20: SWAP1 00000f21: MLOAD 00000f22: SWAP1 00000f23: DUP2 00000f24: SWAP1 00000f25: SUB 00000f26: PUSH1 0x64 00000f28: ADD 00000f29: SWAP1 00000f2a: REVERT 00000f2b: JUMPDEST 00000f2c: PUSH1 0x00 00000f2e: PUSH2 0x0f36 00000f31: DUP4 00000f32: PUSH2 0x1a95 00000f35: JUMP 00000f36: JUMPDEST 00000f37: PUSH1 0x01 00000f39: PUSH1 0x01 00000f3b: PUSH1 0xa0 00000f3d: SHL 00000f3e: SUB 00000f3f: DUP5 00000f40: DUP2 00000f41: AND 00000f42: PUSH1 0x00 00000f44: DUP2 00000f45: DUP2 00000f46: MSTORE 00000f47: PUSH1 0x07 00000f49: PUSH1 0x20 00000f4b: SWAP1 00000f4c: DUP2 00000f4d: MSTORE 00000f4e: PUSH1 0x40 00000f50: SWAP2 00000f51: DUP3 00000f52: SWAP1 00000f53: KECCAK256 00000f54: DUP1 00000f55: SLOAD 00000f56: PUSH1 0x01 00000f58: PUSH1 0x01 00000f5a: PUSH1 0xa0 00000f5c: SHL 00000f5d: SUB 00000f5e: NOT 00000f5f: AND 00000f60: SWAP5 00000f61: DUP7 00000f62: AND 00000f63: SWAP5 00000f64: DUP6 00000f65: OR 00000f66: SWAP1 00000f67: SSTORE 00000f68: DUP2 00000f69: MLOAD 00000f6a: SWAP4 00000f6b: DUP5 00000f6c: MSTORE 00000f6d: SWAP1 00000f6e: MLOAD 00000f6f: SWAP4 00000f70: SWAP5 00000f71: POP 00000f72: SWAP1 00000f73: SWAP3 00000f74: PUSH32 0x693c68cd964926544cbaee02b00d9352aa98c6de2484515e8bd74130c005e6af 00000f95: SWAP3 00000f96: DUP2 00000f97: SWAP1 00000f98: SUB 00000f99: SWAP1 00000f9a: SWAP2 00000f9b: ADD 00000f9c: SWAP1 00000f9d: LOG2 00000f9e: POP 00000f9f: POP 00000fa0: PUSH1 0x01 00000fa2: PUSH1 0x01 00000fa4: PUSH1 0xa0 00000fa6: SHL 00000fa7: SUB 00000fa8: SWAP1 00000fa9: DUP2 00000faa: AND 00000fab: PUSH1 0x00 00000fad: SWAP1 00000fae: DUP2 00000faf: MSTORE 00000fb0: PUSH1 0x07 00000fb2: PUSH1 0x20 00000fb4: MSTORE 00000fb5: PUSH1 0x40 00000fb7: SWAP1 00000fb8: KECCAK256 00000fb9: SLOAD 00000fba: AND 00000fbb: SWAP1 00000fbc: JUMP 00000fbd: JUMPDEST 00000fbe: PUSH8 0x0de0b6b3a7640000 00000fc7: DUP2 00000fc8: JUMP 00000fc9: JUMPDEST 00000fca: PUSH1 0x05 00000fcc: SLOAD 00000fcd: DUP2 00000fce: JUMP 00000fcf: JUMPDEST 00000fd0: PUSH9 0x01158e460913d00000 00000fda: DUP2 00000fdb: JUMP 00000fdc: JUMPDEST 00000fdd: PUSH1 0x01 00000fdf: SLOAD 00000fe0: SWAP1 00000fe1: JUMP 00000fe2: JUMPDEST 00000fe3: PUSH1 0x01 00000fe5: PUSH1 0x01 00000fe7: PUSH1 0xa0 00000fe9: SHL 00000fea: SUB 00000feb: DUP2 00000fec: DUP2 00000fed: AND 00000fee: PUSH1 0x00 00000ff0: SWAP1 00000ff1: DUP2 00000ff2: MSTORE 00000ff3: PUSH1 0x07 00000ff5: PUSH1 0x20 00000ff7: MSTORE 00000ff8: PUSH1 0x40 00000ffa: DUP2 00000ffb: KECCAK256 00000ffc: SLOAD 00000ffd: SWAP1 00000ffe: SWAP2 00000fff: AND 00001000: PUSH2 0x100b 00001003: JUMPI 00001004: POP 00001005: PUSH1 0x00 00001007: PUSH2 0x0c3b 0000100a: JUMP 0000100b: JUMPDEST 0000100c: PUSH1 0x01 0000100e: PUSH1 0x01 00001010: PUSH1 0xa0 00001012: SHL 00001013: SUB 00001014: DUP1 00001015: DUP4 00001016: AND 00001017: PUSH1 0x00 00001019: SWAP1 0000101a: DUP2 0000101b: MSTORE 0000101c: PUSH1 0x07 0000101e: PUSH1 0x20 00001020: SWAP1 00001021: DUP2 00001022: MSTORE 00001023: PUSH1 0x40 00001025: SWAP2 00001026: DUP3 00001027: SWAP1 00001028: KECCAK256 00001029: SLOAD 0000102a: DUP3 0000102b: MLOAD 0000102c: PUSH4 0x0d6320df 00001031: PUSH1 0xe3 00001033: SHL 00001034: DUP2 00001035: MSTORE 00001036: DUP8 00001037: DUP6 00001038: AND 00001039: PUSH1 0x04 0000103b: DUP3 0000103c: ADD 0000103d: MSTORE 0000103e: SWAP3 0000103f: MLOAD 00001040: SWAP4 00001041: AND 00001042: SWAP3 00001043: DUP4 00001044: SWAP3 00001045: PUSH4 0x6b1906f8 0000104a: SWAP3 0000104b: PUSH1 0x24 0000104d: DUP1 0000104e: DUP4 0000104f: ADD 00001050: SWAP4 00001051: SWAP2 00001052: SWAP3 00001053: DUP3 00001054: SWAP1 00001055: SUB 00001056: ADD 00001057: DUP2 00001058: DUP7 00001059: DUP1 0000105a: EXTCODESIZE 0000105b: ISZERO 0000105c: DUP1 0000105d: ISZERO 0000105e: PUSH2 0x0c0b 00001061: JUMPI 00001062: PUSH1 0x00 00001064: DUP1 00001065: REVERT 00001066: JUMPDEST 00001067: PUSH1 0x00 00001069: PUSH2 0x1072 0000106c: DUP5 0000106d: DUP5 0000106e: PUSH2 0x1ba4 00001071: JUMP 00001072: JUMPDEST 00001073: SWAP1 00001074: POP 00001075: PUSH2 0x107d 00001078: CALLER 00001079: PUSH2 0x0693 0000107c: JUMP 0000107d: JUMPDEST 0000107e: PUSH1 0x01 00001080: PUSH1 0x01 00001082: PUSH1 0xa0 00001084: SHL 00001085: SUB 00001086: AND 00001087: PUSH4 0x34ce30f0 0000108c: DUP3 0000108d: PUSH1 0x40 0000108f: MLOAD 00001090: DUP3 00001091: PUSH4 0xffffffff 00001096: AND 00001097: PUSH1 0xe0 00001099: SHL 0000109a: DUP2 0000109b: MSTORE 0000109c: PUSH1 0x04 0000109e: ADD 0000109f: DUP1 000010a0: DUP3 000010a1: DUP2 000010a2: MSTORE 000010a3: PUSH1 0x20 000010a5: ADD 000010a6: SWAP2 000010a7: POP 000010a8: POP 000010a9: PUSH1 0x00 000010ab: PUSH1 0x40 000010ad: MLOAD 000010ae: DUP1 000010af: DUP4 000010b0: SUB 000010b1: DUP2 000010b2: PUSH1 0x00 000010b4: DUP8 000010b5: DUP1 000010b6: EXTCODESIZE 000010b7: ISZERO 000010b8: DUP1 000010b9: ISZERO 000010ba: PUSH2 0x10c2 000010bd: JUMPI 000010be: PUSH1 0x00 000010c0: DUP1 000010c1: REVERT 000010c2: JUMPDEST 000010c3: POP 000010c4: GAS 000010c5: CALL 000010c6: ISZERO 000010c7: DUP1 000010c8: ISZERO 000010c9: PUSH2 0x10d6 000010cc: JUMPI 000010cd: RETURNDATASIZE 000010ce: PUSH1 0x00 000010d0: DUP1 000010d1: RETURNDATACOPY 000010d2: RETURNDATASIZE 000010d3: PUSH1 0x00 000010d5: REVERT 000010d6: JUMPDEST 000010d7: POP 000010d8: POP 000010d9: POP 000010da: POP 000010db: POP 000010dc: POP 000010dd: POP 000010de: POP 000010df: JUMP 000010e0: JUMPDEST 000010e1: PUSH1 0x00 000010e3: PUSH2 0x10ea 000010e6: PUSH2 0x0b05 000010e9: JUMP 000010ea: JUMPDEST 000010eb: SWAP1 000010ec: POP 000010ed: SWAP1 000010ee: JUMP 000010ef: JUMPDEST 000010f0: PUSH1 0x03 000010f2: DUP1 000010f3: SLOAD 000010f4: PUSH1 0x01 000010f6: ADD 000010f7: SWAP1 000010f8: DUP2 000010f9: SWAP1 000010fa: SSTORE 000010fb: PUSH1 0x00 000010fd: SWAP1 000010fe: DUP7 000010ff: PUSH2 0x114f 00001102: JUMPI 00001103: PUSH1 0x40 00001105: DUP1 00001106: MLOAD 00001107: PUSH3 0x461bcd 0000110b: PUSH1 0xe5 0000110d: SHL 0000110e: DUP2 0000110f: MSTORE 00001110: PUSH1 0x20 00001112: PUSH1 0x04 00001114: DUP3 00001115: ADD 00001116: MSTORE 00001117: PUSH1 0x1f 00001119: PUSH1 0x24 0000111b: DUP3 0000111c: ADD 0000111d: MSTORE 0000111e: PUSH32 0x4d696e696d756d207369676e696e672067726f75702073697a65206973203100 0000113f: PUSH1 0x44 00001141: DUP3 00001142: ADD 00001143: MSTORE 00001144: SWAP1 00001145: MLOAD 00001146: SWAP1 00001147: DUP2 00001148: SWAP1 00001149: SUB 0000114a: PUSH1 0x64 0000114c: ADD 0000114d: SWAP1 0000114e: REVERT 0000114f: JUMPDEST 00001150: PUSH1 0x10 00001152: DUP8 00001153: GT 00001154: ISZERO 00001155: PUSH2 0x11a5 00001158: JUMPI 00001159: PUSH1 0x40 0000115b: DUP1 0000115c: MLOAD 0000115d: PUSH3 0x461bcd 00001161: PUSH1 0xe5 00001163: SHL 00001164: DUP2 00001165: MSTORE 00001166: PUSH1 0x20 00001168: PUSH1 0x04 0000116a: DUP3 0000116b: ADD 0000116c: DUP2 0000116d: SWAP1 0000116e: MSTORE 0000116f: PUSH1 0x24 00001171: DUP3 00001172: ADD 00001173: MSTORE 00001174: PUSH32 0x4d6178696d756d207369676e696e672067726f75702073697a65206973203136 00001195: PUSH1 0x44 00001197: DUP3 00001198: ADD 00001199: MSTORE 0000119a: SWAP1 0000119b: MLOAD 0000119c: SWAP1 0000119d: DUP2 0000119e: SWAP1 0000119f: SUB 000011a0: PUSH1 0x64 000011a2: ADD 000011a3: SWAP1 000011a4: REVERT 000011a5: JUMPDEST 000011a6: PUSH1 0x00 000011a8: DUP7 000011a9: GT 000011aa: PUSH2 0x11e4 000011ad: JUMPI 000011ae: PUSH1 0x40 000011b0: MLOAD 000011b1: PUSH3 0x461bcd 000011b5: PUSH1 0xe5 000011b7: SHL 000011b8: DUP2 000011b9: MSTORE 000011ba: PUSH1 0x04 000011bc: ADD 000011bd: DUP1 000011be: DUP1 000011bf: PUSH1 0x20 000011c1: ADD 000011c2: DUP3 000011c3: DUP2 000011c4: SUB 000011c5: DUP3 000011c6: MSTORE 000011c7: PUSH1 0x27 000011c9: DUP2 000011ca: MSTORE 000011cb: PUSH1 0x20 000011cd: ADD 000011ce: DUP1 000011cf: PUSH2 0x1de1 000011d2: PUSH1 0x27 000011d4: SWAP2 000011d5: CODECOPY 000011d6: PUSH1 0x40 000011d8: ADD 000011d9: SWAP2 000011da: POP 000011db: POP 000011dc: PUSH1 0x40 000011de: MLOAD 000011df: DUP1 000011e0: SWAP2 000011e1: SUB 000011e2: SWAP1 000011e3: REVERT 000011e4: JUMPDEST 000011e5: DUP7 000011e6: DUP7 000011e7: GT 000011e8: ISZERO 000011e9: PUSH2 0x1223 000011ec: JUMPI 000011ed: PUSH1 0x40 000011ef: MLOAD 000011f0: PUSH3 0x461bcd 000011f4: PUSH1 0xe5 000011f6: SHL 000011f7: DUP2 000011f8: MSTORE 000011f9: PUSH1 0x04 000011fb: ADD 000011fc: DUP1 000011fd: DUP1 000011fe: PUSH1 0x20 00001200: ADD 00001201: DUP3 00001202: DUP2 00001203: SUB 00001204: DUP3 00001205: MSTORE 00001206: PUSH1 0x35 00001208: DUP2 00001209: MSTORE 0000120a: PUSH1 0x20 0000120c: ADD 0000120d: DUP1 0000120e: PUSH2 0x1d83 00001211: PUSH1 0x35 00001213: SWAP2 00001214: CODECOPY 00001215: PUSH1 0x40 00001217: ADD 00001218: SWAP2 00001219: POP 0000121a: POP 0000121b: PUSH1 0x40 0000121d: MLOAD 0000121e: DUP1 0000121f: SWAP2 00001220: SUB 00001221: SWAP1 00001222: REVERT 00001223: JUMPDEST 00001224: CALLER 00001225: PUSH1 0x00 00001227: PUSH2 0x122f 0000122a: DUP3 0000122b: PUSH2 0x0693 0000122e: JUMP 0000122f: JUMPDEST 00001230: SWAP1 00001231: POP 00001232: PUSH1 0x00 00001234: PUSH2 0x123d 00001237: DUP8 00001238: DUP12 00001239: PUSH2 0x1ba4 0000123c: JUMP 0000123d: JUMPDEST 0000123e: SWAP1 0000123f: POP 00001240: PUSH1 0x00 00001242: DUP2 00001243: GT 00001244: PUSH2 0x127e 00001247: JUMPI 00001248: PUSH1 0x40 0000124a: MLOAD 0000124b: PUSH3 0x461bcd 0000124f: PUSH1 0xe5 00001251: SHL 00001252: DUP2 00001253: MSTORE 00001254: PUSH1 0x04 00001256: ADD 00001257: DUP1 00001258: DUP1 00001259: PUSH1 0x20 0000125b: ADD 0000125c: DUP3 0000125d: DUP2 0000125e: SUB 0000125f: DUP3 00001260: MSTORE 00001261: PUSH1 0x29 00001263: DUP2 00001264: MSTORE 00001265: PUSH1 0x20 00001267: ADD 00001268: DUP1 00001269: PUSH2 0x1db8 0000126c: PUSH1 0x29 0000126e: SWAP2 0000126f: CODECOPY 00001270: PUSH1 0x40 00001272: ADD 00001273: SWAP2 00001274: POP 00001275: POP 00001276: PUSH1 0x40 00001278: MLOAD 00001279: DUP1 0000127a: SWAP2 0000127b: SUB 0000127c: SWAP1 0000127d: REVERT 0000127e: JUMPDEST 0000127f: PUSH2 0x1286 00001282: PUSH2 0x10e0 00001285: JUMP 00001286: JUMPDEST 00001287: CALLVALUE 00001288: LT 00001289: ISZERO 0000128a: PUSH2 0x12c4 0000128d: JUMPI 0000128e: PUSH1 0x40 00001290: MLOAD 00001291: PUSH3 0x461bcd 00001295: PUSH1 0xe5 00001297: SHL 00001298: DUP2 00001299: MSTORE 0000129a: PUSH1 0x04 0000129c: ADD 0000129d: DUP1 0000129e: DUP1 0000129f: PUSH1 0x20 000012a1: ADD 000012a2: DUP3 000012a3: DUP2 000012a4: SUB 000012a5: DUP3 000012a6: MSTORE 000012a7: PUSH1 0x2b 000012a9: DUP2 000012aa: MSTORE 000012ab: PUSH1 0x20 000012ad: ADD 000012ae: DUP1 000012af: PUSH2 0x1d58 000012b2: PUSH1 0x2b 000012b4: SWAP2 000012b5: CODECOPY 000012b6: PUSH1 0x40 000012b8: ADD 000012b9: SWAP2 000012ba: POP 000012bb: POP 000012bc: PUSH1 0x40 000012be: MLOAD 000012bf: DUP1 000012c0: SWAP2 000012c1: SUB 000012c2: SWAP1 000012c3: REVERT 000012c4: JUMPDEST 000012c5: PUSH1 0x09 000012c7: SLOAD 000012c8: PUSH1 0x40 000012ca: DUP1 000012cb: MLOAD 000012cc: PUSH4 0x762ffd61 000012d1: PUSH1 0xe1 000012d3: SHL 000012d4: DUP2 000012d5: MSTORE 000012d6: SWAP1 000012d7: MLOAD 000012d8: PUSH1 0x00 000012da: SWAP3 000012db: PUSH1 0x01 000012dd: PUSH1 0x01 000012df: PUSH1 0xa0 000012e1: SHL 000012e2: SUB 000012e3: AND 000012e4: SWAP2 000012e5: PUSH4 0xec5ffac2 000012ea: SWAP2 000012eb: PUSH1 0x04 000012ed: DUP1 000012ee: DUP4 000012ef: ADD 000012f0: SWAP3 000012f1: PUSH1 0x20 000012f3: SWAP3 000012f4: SWAP2 000012f5: SWAP1 000012f6: DUP3 000012f7: SWAP1 000012f8: SUB 000012f9: ADD 000012fa: DUP2 000012fb: DUP7 000012fc: DUP1 000012fd: EXTCODESIZE 000012fe: ISZERO 000012ff: DUP1 00001300: ISZERO 00001301: PUSH2 0x1309 00001304: JUMPI 00001305: PUSH1 0x00 00001307: DUP1 00001308: REVERT 00001309: JUMPDEST 0000130a: POP 0000130b: GAS 0000130c: STATICCALL 0000130d: ISZERO 0000130e: DUP1 0000130f: ISZERO 00001310: PUSH2 0x131d 00001313: JUMPI 00001314: RETURNDATASIZE 00001315: PUSH1 0x00 00001317: DUP1 00001318: RETURNDATACOPY 00001319: RETURNDATASIZE 0000131a: PUSH1 0x00 0000131c: REVERT 0000131d: JUMPDEST 0000131e: POP 0000131f: POP 00001320: POP 00001321: POP 00001322: PUSH1 0x40 00001324: MLOAD 00001325: RETURNDATASIZE 00001326: PUSH1 0x20 00001328: DUP2 00001329: LT 0000132a: ISZERO 0000132b: PUSH2 0x1333 0000132e: JUMPI 0000132f: PUSH1 0x00 00001331: DUP1 00001332: REVERT 00001333: JUMPDEST 00001334: POP 00001335: MLOAD 00001336: PUSH1 0x06 00001338: SLOAD 00001339: PUSH1 0x40 0000133b: DUP1 0000133c: MLOAD 0000133d: PUSH4 0x51665351 00001342: PUSH1 0xe1 00001344: SHL 00001345: DUP2 00001346: MSTORE 00001347: PUSH1 0x04 00001349: DUP2 0000134a: ADD 0000134b: DUP16 0000134c: SWAP1 0000134d: MSTORE 0000134e: PUSH1 0x24 00001350: DUP2 00001351: ADD 00001352: SWAP3 00001353: SWAP1 00001354: SWAP3 00001355: MSTORE 00001356: PUSH1 0x44 00001358: DUP3 00001359: ADD 0000135a: DUP4 0000135b: SWAP1 0000135c: MSTORE 0000135d: PUSH1 0x64 0000135f: DUP3 00001360: ADD 00001361: DUP6 00001362: SWAP1 00001363: MSTORE 00001364: MLOAD 00001365: SWAP2 00001366: SWAP3 00001367: POP 00001368: PUSH1 0x60 0000136a: SWAP2 0000136b: PUSH1 0x01 0000136d: PUSH1 0x01 0000136f: PUSH1 0xa0 00001371: SHL 00001372: SUB 00001373: DUP7 00001374: AND 00001375: SWAP2 00001376: PUSH4 0xa2cca6a2 0000137b: SWAP2 0000137c: PUSH1 0x84 0000137e: DUP1 0000137f: DUP4 00001380: ADD 00001381: SWAP3 00001382: PUSH1 0x00 00001384: SWAP3 00001385: SWAP2 00001386: SWAP1 00001387: DUP3 00001388: SWAP1 00001389: SUB 0000138a: ADD 0000138b: DUP2 0000138c: DUP4 0000138d: DUP8 0000138e: DUP1 0000138f: EXTCODESIZE 00001390: ISZERO 00001391: DUP1 00001392: ISZERO 00001393: PUSH2 0x139b 00001396: JUMPI 00001397: PUSH1 0x00 00001399: DUP1 0000139a: REVERT 0000139b: JUMPDEST 0000139c: POP 0000139d: GAS 0000139e: CALL 0000139f: ISZERO 000013a0: DUP1 000013a1: ISZERO 000013a2: PUSH2 0x13af 000013a5: JUMPI 000013a6: RETURNDATASIZE 000013a7: PUSH1 0x00 000013a9: DUP1 000013aa: RETURNDATACOPY 000013ab: RETURNDATASIZE 000013ac: PUSH1 0x00 000013ae: REVERT 000013af: JUMPDEST 000013b0: POP 000013b1: POP 000013b2: POP 000013b3: POP 000013b4: PUSH1 0x40 000013b6: MLOAD 000013b7: RETURNDATASIZE 000013b8: PUSH1 0x00 000013ba: DUP3 000013bb: RETURNDATACOPY 000013bc: PUSH1 0x1f 000013be: RETURNDATASIZE 000013bf: SWAP1 000013c0: DUP2 000013c1: ADD 000013c2: PUSH1 0x1f 000013c4: NOT 000013c5: AND 000013c6: DUP3 000013c7: ADD 000013c8: PUSH1 0x40 000013ca: MSTORE 000013cb: PUSH1 0x20 000013cd: DUP2 000013ce: LT 000013cf: ISZERO 000013d0: PUSH2 0x13d8 000013d3: JUMPI 000013d4: PUSH1 0x00 000013d6: DUP1 000013d7: REVERT 000013d8: JUMPDEST 000013d9: DUP2 000013da: ADD 000013db: SWAP1 000013dc: DUP1 000013dd: DUP1 000013de: MLOAD 000013df: PUSH1 0x40 000013e1: MLOAD 000013e2: SWAP4 000013e3: SWAP3 000013e4: SWAP2 000013e5: SWAP1 000013e6: DUP5 000013e7: PUSH5 0x0100000000 000013ed: DUP3 000013ee: GT 000013ef: ISZERO 000013f0: PUSH2 0x13f8 000013f3: JUMPI 000013f4: PUSH1 0x00 000013f6: DUP1 000013f7: REVERT 000013f8: JUMPDEST 000013f9: SWAP1 000013fa: DUP4 000013fb: ADD 000013fc: SWAP1 000013fd: PUSH1 0x20 000013ff: DUP3 00001400: ADD 00001401: DUP6 00001402: DUP2 00001403: GT 00001404: ISZERO 00001405: PUSH2 0x140d 00001408: JUMPI 00001409: PUSH1 0x00 0000140b: DUP1 0000140c: REVERT 0000140d: JUMPDEST 0000140e: DUP3 0000140f: MLOAD 00001410: DUP7 00001411: PUSH1 0x20 00001413: DUP3 00001414: MUL 00001415: DUP4 00001416: ADD 00001417: GT 00001418: PUSH5 0x0100000000 0000141e: DUP3 0000141f: GT 00001420: OR 00001421: ISZERO 00001422: PUSH2 0x142a 00001425: JUMPI 00001426: PUSH1 0x00 00001428: DUP1 00001429: REVERT 0000142a: JUMPDEST 0000142b: DUP3 0000142c: MSTORE 0000142d: POP 0000142e: DUP2 0000142f: MLOAD 00001430: PUSH1 0x20 00001432: SWAP2 00001433: DUP3 00001434: ADD 00001435: SWAP3 00001436: DUP3 00001437: ADD 00001438: SWAP2 00001439: MUL 0000143a: DUP1 0000143b: DUP4 0000143c: DUP4 0000143d: PUSH1 0x00 0000143f: JUMPDEST 00001440: DUP4 00001441: DUP2 00001442: LT 00001443: ISZERO 00001444: PUSH2 0x1457 00001447: JUMPI 00001448: DUP2 00001449: DUP2 0000144a: ADD 0000144b: MLOAD 0000144c: DUP4 0000144d: DUP3 0000144e: ADD 0000144f: MSTORE 00001450: PUSH1 0x20 00001452: ADD 00001453: PUSH2 0x143f 00001456: JUMP 00001457: JUMPDEST 00001458: POP 00001459: POP 0000145a: POP 0000145b: POP 0000145c: SWAP1 0000145d: POP 0000145e: ADD 0000145f: PUSH1 0x40 00001461: MSTORE 00001462: POP 00001463: POP 00001464: POP 00001465: SWAP1 00001466: POP 00001467: PUSH2 0x146e 0000146a: PUSH2 0x1bd7 0000146d: JUMP 0000146e: JUMPDEST 0000146f: PUSH2 0x1476 00001472: PUSH2 0x1c27 00001475: JUMP 00001476: JUMPDEST 00001477: SWAP7 00001478: POP 00001479: DUP7 0000147a: PUSH1 0x01 0000147c: PUSH1 0x01 0000147e: PUSH1 0xa0 00001480: SHL 00001481: SUB 00001482: AND 00001483: PUSH4 0x79a80491 00001488: DUP12 00001489: DUP4 0000148a: DUP15 0000148b: DUP7 0000148c: DUP14 0000148d: PUSH1 0x09 0000148f: PUSH1 0x00 00001491: SWAP1 00001492: SLOAD 00001493: SWAP1 00001494: PUSH2 0x0100 00001497: EXP 00001498: SWAP1 00001499: DIV 0000149a: PUSH1 0x01 0000149c: PUSH1 0x01 0000149e: PUSH1 0xa0 000014a0: SHL 000014a1: SUB 000014a2: AND 000014a3: PUSH1 0x0a 000014a5: PUSH1 0x00 000014a7: SWAP1 000014a8: SLOAD 000014a9: SWAP1 000014aa: PUSH2 0x0100 000014ad: EXP 000014ae: SWAP1 000014af: DIV 000014b0: PUSH1 0x01 000014b2: PUSH1 0x01 000014b4: PUSH1 0xa0 000014b6: SHL 000014b7: SUB 000014b8: AND 000014b9: ADDRESS 000014ba: PUSH1 0x40 000014bc: MLOAD 000014bd: DUP10 000014be: PUSH4 0xffffffff 000014c3: AND 000014c4: PUSH1 0xe0 000014c6: SHL 000014c7: DUP2 000014c8: MSTORE 000014c9: PUSH1 0x04 000014cb: ADD 000014cc: DUP1 000014cd: DUP10 000014ce: PUSH1 0x01 000014d0: PUSH1 0x01 000014d2: PUSH1 0xa0 000014d4: SHL 000014d5: SUB 000014d6: AND 000014d7: PUSH1 0x01 000014d9: PUSH1 0x01 000014db: PUSH1 0xa0 000014dd: SHL 000014de: SUB 000014df: AND 000014e0: DUP2 000014e1: MSTORE 000014e2: PUSH1 0x20 000014e4: ADD 000014e5: DUP1 000014e6: PUSH1 0x20 000014e8: ADD 000014e9: DUP9 000014ea: DUP2 000014eb: MSTORE 000014ec: PUSH1 0x20 000014ee: ADD 000014ef: DUP8 000014f0: DUP2 000014f1: MSTORE 000014f2: PUSH1 0x20 000014f4: ADD 000014f5: DUP7 000014f6: DUP2 000014f7: MSTORE 000014f8: PUSH1 0x20 000014fa: ADD 000014fb: DUP6 000014fc: PUSH1 0x01 000014fe: PUSH1 0x01 00001500: PUSH1 0xa0 00001502: SHL 00001503: SUB 00001504: AND 00001505: PUSH1 0x01 00001507: PUSH1 0x01 00001509: PUSH1 0xa0 0000150b: SHL 0000150c: SUB 0000150d: AND 0000150e: DUP2 0000150f: MSTORE 00001510: PUSH1 0x20 00001512: ADD 00001513: DUP5 00001514: PUSH1 0x01 00001516: PUSH1 0x01 00001518: PUSH1 0xa0 0000151a: SHL 0000151b: SUB 0000151c: AND 0000151d: PUSH1 0x01 0000151f: PUSH1 0x01 00001521: PUSH1 0xa0 00001523: SHL 00001524: SUB 00001525: AND 00001526: DUP2 00001527: MSTORE 00001528: PUSH1 0x20 0000152a: ADD 0000152b: DUP4 0000152c: PUSH1 0x01 0000152e: PUSH1 0x01 00001530: PUSH1 0xa0 00001532: SHL 00001533: SUB 00001534: AND 00001535: PUSH1 0x01 00001537: PUSH1 0x01 00001539: PUSH1 0xa0 0000153b: SHL 0000153c: SUB 0000153d: AND 0000153e: DUP2 0000153f: MSTORE 00001540: PUSH1 0x20 00001542: ADD 00001543: DUP3 00001544: DUP2 00001545: SUB 00001546: DUP3 00001547: MSTORE 00001548: DUP10 00001549: DUP2 0000154a: DUP2 0000154b: MLOAD 0000154c: DUP2 0000154d: MSTORE 0000154e: PUSH1 0x20 00001550: ADD 00001551: SWAP2 00001552: POP 00001553: DUP1 00001554: MLOAD 00001555: SWAP1 00001556: PUSH1 0x20 00001558: ADD 00001559: SWAP1 0000155a: PUSH1 0x20 0000155c: MUL 0000155d: DUP1 0000155e: DUP4 0000155f: DUP4 00001560: PUSH1 0x00 00001562: JUMPDEST 00001563: DUP4 00001564: DUP2 00001565: LT 00001566: ISZERO 00001567: PUSH2 0x157a 0000156a: JUMPI 0000156b: DUP2 0000156c: DUP2 0000156d: ADD 0000156e: MLOAD 0000156f: DUP4 00001570: DUP3 00001571: ADD 00001572: MSTORE 00001573: PUSH1 0x20 00001575: ADD 00001576: PUSH2 0x1562 00001579: JUMP 0000157a: JUMPDEST 0000157b: POP 0000157c: POP 0000157d: POP 0000157e: POP 0000157f: SWAP1 00001580: POP 00001581: ADD 00001582: SWAP10 00001583: POP 00001584: POP 00001585: POP 00001586: POP 00001587: POP 00001588: POP 00001589: POP 0000158a: POP 0000158b: POP 0000158c: POP 0000158d: PUSH1 0x00 0000158f: PUSH1 0x40 00001591: MLOAD 00001592: DUP1 00001593: DUP4 00001594: SUB 00001595: DUP2 00001596: PUSH1 0x00 00001598: DUP8 00001599: DUP1 0000159a: EXTCODESIZE 0000159b: ISZERO 0000159c: DUP1 0000159d: ISZERO 0000159e: PUSH2 0x15a6 000015a1: JUMPI 000015a2: PUSH1 0x00 000015a4: DUP1 000015a5: REVERT 000015a6: JUMPDEST 000015a7: POP 000015a8: GAS 000015a9: CALL 000015aa: ISZERO 000015ab: DUP1 000015ac: ISZERO 000015ad: PUSH2 0x15ba 000015b0: JUMPI 000015b1: RETURNDATASIZE 000015b2: PUSH1 0x00 000015b4: DUP1 000015b5: RETURNDATACOPY 000015b6: RETURNDATASIZE 000015b7: PUSH1 0x00 000015b9: REVERT 000015ba: JUMPDEST 000015bb: POP 000015bc: PUSH1 0x00 000015be: SWAP3 000015bf: POP 000015c0: POP 000015c1: POP 000015c2: JUMPDEST 000015c3: DUP13 000015c4: DUP2 000015c5: LT 000015c6: ISZERO 000015c7: PUSH2 0x1680 000015ca: JUMPI 000015cb: PUSH1 0x0a 000015cd: SLOAD 000015ce: DUP3 000015cf: MLOAD 000015d0: PUSH1 0x01 000015d2: PUSH1 0x01 000015d4: PUSH1 0xa0 000015d6: SHL 000015d7: SUB 000015d8: SWAP1 000015d9: SWAP2 000015da: AND 000015db: SWAP1 000015dc: PUSH4 0xd20a62fc 000015e1: SWAP1 000015e2: DUP5 000015e3: SWAP1 000015e4: DUP5 000015e5: SWAP1 000015e6: DUP2 000015e7: LT 000015e8: PUSH2 0x15ed 000015eb: JUMPI 000015ec: INVALID 000015ed: JUMPDEST 000015ee: PUSH1 0x20 000015f0: SWAP1 000015f1: DUP2 000015f2: MUL 000015f3: SWAP2 000015f4: SWAP1 000015f5: SWAP2 000015f6: ADD 000015f7: ADD 000015f8: MLOAD 000015f9: PUSH1 0x40 000015fb: DUP1 000015fc: MLOAD 000015fd: PUSH1 0x01 000015ff: PUSH1 0x01 00001601: PUSH1 0xe0 00001603: SHL 00001604: SUB 00001605: NOT 00001606: PUSH1 0xe0 00001608: DUP6 00001609: SWAP1 0000160a: SHL 0000160b: AND 0000160c: DUP2 0000160d: MSTORE 0000160e: PUSH1 0x01 00001610: PUSH1 0x01 00001612: PUSH1 0xa0 00001614: SHL 00001615: SUB 00001616: SWAP3 00001617: DUP4 00001618: AND 00001619: PUSH1 0x04 0000161b: DUP3 0000161c: ADD 0000161d: MSTORE 0000161e: DUP3 0000161f: DUP14 00001620: AND 00001621: PUSH1 0x24 00001623: DUP3 00001624: ADD 00001625: DUP2 00001626: SWAP1 00001627: MSTORE 00001628: PUSH1 0x44 0000162a: DUP3 0000162b: ADD 0000162c: MSTORE 0000162d: PUSH1 0x64 0000162f: DUP2 00001630: ADD 00001631: DUP10 00001632: SWAP1 00001633: MSTORE 00001634: SWAP2 00001635: DUP10 00001636: AND 00001637: PUSH1 0x84 00001639: DUP4 0000163a: ADD 0000163b: MSTORE 0000163c: MLOAD 0000163d: PUSH1 0xa4 0000163f: DUP1 00001640: DUP4 00001641: ADD 00001642: SWAP3 00001643: PUSH1 0x00 00001645: SWAP3 00001646: SWAP2 00001647: SWAP1 00001648: DUP3 00001649: SWAP1 0000164a: SUB 0000164b: ADD 0000164c: DUP2 0000164d: DUP4 0000164e: DUP8 0000164f: DUP1 00001650: EXTCODESIZE 00001651: ISZERO 00001652: DUP1 00001653: ISZERO 00001654: PUSH2 0x165c 00001657: JUMPI 00001658: PUSH1 0x00 0000165a: DUP1 0000165b: REVERT 0000165c: JUMPDEST 0000165d: POP 0000165e: GAS 0000165f: CALL 00001660: ISZERO 00001661: DUP1 00001662: ISZERO 00001663: PUSH2 0x1670 00001666: JUMPI 00001667: RETURNDATASIZE 00001668: PUSH1 0x00 0000166a: DUP1 0000166b: RETURNDATACOPY 0000166c: RETURNDATASIZE 0000166d: PUSH1 0x00 0000166f: REVERT 00001670: JUMPDEST 00001671: POP 00001672: POP 00001673: PUSH1 0x01 00001675: SWAP1 00001676: SWAP3 00001677: ADD 00001678: SWAP2 00001679: POP 0000167a: PUSH2 0x15c2 0000167d: SWAP1 0000167e: POP 0000167f: JUMP 00001680: JUMPDEST 00001681: POP 00001682: DUP5 00001683: PUSH1 0x01 00001685: PUSH1 0x01 00001687: PUSH1 0xa0 00001689: SHL 0000168a: SUB 0000168b: AND 0000168c: DUP11 0000168d: PUSH1 0x01 0000168f: PUSH1 0x01 00001691: PUSH1 0xa0 00001693: SHL 00001694: SUB 00001695: AND 00001696: DUP9 00001697: PUSH1 0x01 00001699: PUSH1 0x01 0000169b: PUSH1 0xa0 0000169d: SHL 0000169e: SUB 0000169f: AND 000016a0: PUSH32 0x7c030f3f8c902fa5a59193f1e3c08ae7245fc0e3b7ab290b6a9548a57a46ac60 000016c1: DUP5 000016c2: DUP16 000016c3: PUSH1 0x40 000016c5: MLOAD 000016c6: DUP1 000016c7: DUP1 000016c8: PUSH1 0x20 000016ca: ADD 000016cb: DUP4 000016cc: DUP2 000016cd: MSTORE 000016ce: PUSH1 0x20 000016d0: ADD 000016d1: DUP3 000016d2: DUP2 000016d3: SUB 000016d4: DUP3 000016d5: MSTORE 000016d6: DUP5 000016d7: DUP2 000016d8: DUP2 000016d9: MLOAD 000016da: DUP2 000016db: MSTORE 000016dc: PUSH1 0x20 000016de: ADD 000016df: SWAP2 000016e0: POP 000016e1: DUP1 000016e2: MLOAD 000016e3: SWAP1 000016e4: PUSH1 0x20 000016e6: ADD 000016e7: SWAP1 000016e8: PUSH1 0x20 000016ea: MUL 000016eb: DUP1 000016ec: DUP4 000016ed: DUP4 000016ee: PUSH1 0x00 000016f0: JUMPDEST 000016f1: DUP4 000016f2: DUP2 000016f3: LT 000016f4: ISZERO 000016f5: PUSH2 0x1708 000016f8: JUMPI 000016f9: DUP2 000016fa: DUP2 000016fb: ADD 000016fc: MLOAD 000016fd: DUP4 000016fe: DUP3 000016ff: ADD 00001700: MSTORE 00001701: PUSH1 0x20 00001703: ADD 00001704: PUSH2 0x16f0 00001707: JUMP 00001708: JUMPDEST 00001709: POP 0000170a: POP 0000170b: POP 0000170c: POP 0000170d: SWAP1 0000170e: POP 0000170f: ADD 00001710: SWAP4 00001711: POP 00001712: POP 00001713: POP 00001714: POP 00001715: PUSH1 0x40 00001717: MLOAD 00001718: DUP1 00001719: SWAP2 0000171a: SUB 0000171b: SWAP1 0000171c: LOG4 0000171d: POP 0000171e: POP 0000171f: POP 00001720: POP 00001721: POP 00001722: PUSH1 0x03 00001724: SLOAD 00001725: DUP2 00001726: EQ 00001727: PUSH2 0x1777 0000172a: JUMPI 0000172b: PUSH1 0x40 0000172d: DUP1 0000172e: MLOAD 0000172f: PUSH3 0x461bcd 00001733: PUSH1 0xe5 00001735: SHL 00001736: DUP2 00001737: MSTORE 00001738: PUSH1 0x20 0000173a: PUSH1 0x04 0000173c: DUP3 0000173d: ADD 0000173e: MSTORE 0000173f: PUSH1 0x1f 00001741: PUSH1 0x24 00001743: DUP3 00001744: ADD 00001745: MSTORE 00001746: PUSH32 0x5265656e7472616e637947756172643a207265656e7472616e742063616c6c00 00001767: PUSH1 0x44 00001769: DUP3 0000176a: ADD 0000176b: MSTORE 0000176c: SWAP1 0000176d: MLOAD 0000176e: SWAP1 0000176f: DUP2 00001770: SWAP1 00001771: SUB 00001772: PUSH1 0x64 00001774: ADD 00001775: SWAP1 00001776: REVERT 00001777: JUMPDEST 00001778: POP 00001779: SWAP6 0000177a: SWAP5 0000177b: POP 0000177c: POP 0000177d: POP 0000177e: POP 0000177f: POP 00001780: JUMP 00001781: JUMPDEST 00001782: PUSH1 0x01 00001784: PUSH1 0x01 00001786: PUSH1 0xa0 00001788: SHL 00001789: SUB 0000178a: AND 0000178b: PUSH1 0x00 0000178d: SWAP1 0000178e: DUP2 0000178f: MSTORE 00001790: PUSH1 0x02 00001792: PUSH1 0x20 00001794: MSTORE 00001795: PUSH1 0x40 00001797: SWAP1 00001798: KECCAK256 00001799: SLOAD 0000179a: SWAP1 0000179b: JUMP 0000179c: JUMPDEST 0000179d: PUSH1 0x01 0000179f: PUSH1 0x01 000017a1: PUSH1 0xa0 000017a3: SHL 000017a4: SUB 000017a5: AND 000017a6: PUSH1 0x00 000017a8: SWAP1 000017a9: DUP2 000017aa: MSTORE 000017ab: PUSH1 0x02 000017ad: PUSH1 0x20 000017af: MSTORE 000017b0: PUSH1 0x40 000017b2: SWAP1 000017b3: KECCAK256 000017b4: SLOAD 000017b5: ISZERO 000017b6: ISZERO 000017b7: SWAP1 000017b8: JUMP 000017b9: JUMPDEST 000017ba: PUSH1 0x00 000017bc: PUSH2 0x17c4 000017bf: DUP3 000017c0: PUSH2 0x0693 000017c3: JUMP 000017c4: JUMPDEST 000017c5: PUSH1 0x01 000017c7: PUSH1 0x01 000017c9: PUSH1 0xa0 000017cb: SHL 000017cc: SUB 000017cd: AND 000017ce: PUSH4 0x96c82e57 000017d3: PUSH1 0x40 000017d5: MLOAD 000017d6: DUP2 000017d7: PUSH4 0xffffffff 000017dc: AND 000017dd: PUSH1 0xe0 000017df: SHL 000017e0: DUP2 000017e1: MSTORE 000017e2: PUSH1 0x04 000017e4: ADD 000017e5: PUSH1 0x20 000017e7: PUSH1 0x40 000017e9: MLOAD 000017ea: DUP1 000017eb: DUP4 000017ec: SUB 000017ed: DUP2 000017ee: DUP7 000017ef: DUP1 000017f0: EXTCODESIZE 000017f1: ISZERO 000017f2: DUP1 000017f3: ISZERO 000017f4: PUSH2 0x0a26 000017f7: JUMPI 000017f8: PUSH1 0x00 000017fa: DUP1 000017fb: REVERT 000017fc: JUMPDEST 000017fd: PUSH2 0x1806 00001800: DUP3 00001801: DUP3 00001802: PUSH2 0x1a2d 00001805: JUMP 00001806: JUMPDEST 00001807: PUSH1 0x01 00001809: PUSH1 0x01 0000180b: PUSH1 0xa0 0000180d: SHL 0000180e: SUB 0000180f: AND 00001810: PUSH4 0x1c5b0762 00001815: DUP4 00001816: PUSH1 0x40 00001818: MLOAD 00001819: DUP3 0000181a: PUSH4 0xffffffff 0000181f: AND 00001820: PUSH1 0xe0 00001822: SHL 00001823: DUP2 00001824: MSTORE 00001825: PUSH1 0x04 00001827: ADD 00001828: DUP1 00001829: DUP3 0000182a: PUSH1 0x01 0000182c: PUSH1 0x01 0000182e: PUSH1 0xa0 00001830: SHL 00001831: SUB 00001832: AND 00001833: PUSH1 0x01 00001835: PUSH1 0x01 00001837: PUSH1 0xa0 00001839: SHL 0000183a: SUB 0000183b: AND 0000183c: DUP2 0000183d: MSTORE 0000183e: PUSH1 0x20 00001840: ADD 00001841: SWAP2 00001842: POP 00001843: POP 00001844: PUSH1 0x00 00001846: PUSH1 0x40 00001848: MLOAD 00001849: DUP1 0000184a: DUP4 0000184b: SUB 0000184c: DUP2 0000184d: PUSH1 0x00 0000184f: DUP8 00001850: DUP1 00001851: EXTCODESIZE 00001852: ISZERO 00001853: DUP1 00001854: ISZERO 00001855: PUSH2 0x185d 00001858: JUMPI 00001859: PUSH1 0x00 0000185b: DUP1 0000185c: REVERT 0000185d: JUMPDEST 0000185e: POP 0000185f: GAS 00001860: CALL 00001861: ISZERO 00001862: DUP1 00001863: ISZERO 00001864: PUSH2 0x1871 00001867: JUMPI 00001868: RETURNDATASIZE 00001869: PUSH1 0x00 0000186b: DUP1 0000186c: RETURNDATACOPY 0000186d: RETURNDATASIZE 0000186e: PUSH1 0x00 00001870: REVERT 00001871: JUMPDEST 00001872: POP 00001873: POP 00001874: POP 00001875: POP 00001876: POP 00001877: POP 00001878: JUMP 00001879: JUMPDEST 0000187a: PUSH1 0x00 0000187c: DUP3 0000187d: DUP3 0000187e: ADD 0000187f: DUP4 00001880: DUP2 00001881: LT 00001882: ISZERO 00001883: PUSH2 0x18d3 00001886: JUMPI 00001887: PUSH1 0x40 00001889: DUP1 0000188a: MLOAD 0000188b: PUSH3 0x461bcd 0000188f: PUSH1 0xe5 00001891: SHL 00001892: DUP2 00001893: MSTORE 00001894: PUSH1 0x20 00001896: PUSH1 0x04 00001898: DUP3 00001899: ADD 0000189a: MSTORE 0000189b: PUSH1 0x1b 0000189d: PUSH1 0x24 0000189f: DUP3 000018a0: ADD 000018a1: MSTORE 000018a2: PUSH32 0x536166654d6174683a206164646974696f6e206f766572666c6f770000000000 000018c3: PUSH1 0x44 000018c5: DUP3 000018c6: ADD 000018c7: MSTORE 000018c8: SWAP1 000018c9: MLOAD 000018ca: SWAP1 000018cb: DUP2 000018cc: SWAP1 000018cd: SUB 000018ce: PUSH1 0x64 000018d0: ADD 000018d1: SWAP1 000018d2: REVERT 000018d3: JUMPDEST 000018d4: SWAP4 000018d5: SWAP3 000018d6: POP 000018d7: POP 000018d8: POP 000018d9: JUMP 000018da: JUMPDEST 000018db: PUSH1 0x00 000018dd: DUP3 000018de: DUP3 000018df: GT 000018e0: ISZERO 000018e1: PUSH2 0x1931 000018e4: JUMPI 000018e5: PUSH1 0x40 000018e7: DUP1 000018e8: MLOAD 000018e9: PUSH3 0x461bcd 000018ed: PUSH1 0xe5 000018ef: SHL 000018f0: DUP2 000018f1: MSTORE 000018f2: PUSH1 0x20 000018f4: PUSH1 0x04 000018f6: DUP3 000018f7: ADD 000018f8: MSTORE 000018f9: PUSH1 0x1e 000018fb: PUSH1 0x24 000018fd: DUP3 000018fe: ADD 000018ff: MSTORE 00001900: PUSH32 0x536166654d6174683a207375627472616374696f6e206f766572666c6f770000 00001921: PUSH1 0x44 00001923: DUP3 00001924: ADD 00001925: MSTORE 00001926: SWAP1 00001927: MLOAD 00001928: SWAP1 00001929: DUP2 0000192a: SWAP1 0000192b: SUB 0000192c: PUSH1 0x64 0000192e: ADD 0000192f: SWAP1 00001930: REVERT 00001931: JUMPDEST 00001932: POP 00001933: SWAP1 00001934: SUB 00001935: SWAP1 00001936: JUMP 00001937: JUMPDEST 00001938: PUSH1 0x04 0000193a: SLOAD 0000193b: PUSH1 0x40 0000193d: DUP1 0000193e: MLOAD 0000193f: ADDRESS 00001940: PUSH1 0x24 00001942: DUP3 00001943: ADD 00001944: MSTORE 00001945: PUSH2 0x7530 00001948: PUSH1 0x44 0000194a: DUP1 0000194b: DUP4 0000194c: ADD 0000194d: SWAP2 0000194e: SWAP1 0000194f: SWAP2 00001950: MSTORE 00001951: DUP3 00001952: MLOAD 00001953: DUP1 00001954: DUP4 00001955: SUB 00001956: SWAP1 00001957: SWAP2 00001958: ADD 00001959: DUP2 0000195a: MSTORE 0000195b: PUSH1 0x64 0000195d: SWAP1 0000195e: SWAP2 0000195f: ADD 00001960: DUP3 00001961: MSTORE 00001962: PUSH1 0x20 00001964: DUP2 00001965: ADD 00001966: DUP1 00001967: MLOAD 00001968: PUSH1 0x01 0000196a: PUSH1 0x01 0000196c: PUSH1 0xe0 0000196e: SHL 0000196f: SUB 00001970: AND 00001971: PUSH4 0x0e1f9589 00001976: PUSH1 0xe4 00001978: SHL 00001979: OR 0000197a: DUP2 0000197b: MSTORE 0000197c: SWAP2 0000197d: MLOAD 0000197e: DUP2 0000197f: MLOAD 00001980: PUSH1 0x00 00001982: SWAP5 00001983: PUSH1 0x60 00001985: SWAP5 00001986: PUSH1 0x01 00001988: PUSH1 0x01 0000198a: PUSH1 0xa0 0000198c: SHL 0000198d: SUB 0000198e: SWAP1 0000198f: SWAP2 00001990: AND 00001991: SWAP4 00001992: DUP8 00001993: SWAP4 00001994: SWAP1 00001995: SWAP3 00001996: SWAP1 00001997: SWAP2 00001998: DUP3 00001999: SWAP2 0000199a: DUP1 0000199b: DUP4 0000199c: DUP4 0000199d: JUMPDEST 0000199e: PUSH1 0x20 000019a0: DUP4 000019a1: LT 000019a2: PUSH2 0x19bc 000019a5: JUMPI 000019a6: DUP1 000019a7: MLOAD 000019a8: DUP3 000019a9: MSTORE 000019aa: PUSH1 0x1f 000019ac: NOT 000019ad: SWAP1 000019ae: SWAP3 000019af: ADD 000019b0: SWAP2 000019b1: PUSH1 0x20 000019b3: SWAP2 000019b4: DUP3 000019b5: ADD 000019b6: SWAP2 000019b7: ADD 000019b8: PUSH2 0x199d 000019bb: JUMP 000019bc: JUMPDEST 000019bd: PUSH1 0x01 000019bf: DUP4 000019c0: PUSH1 0x20 000019c2: SUB 000019c3: PUSH2 0x0100 000019c6: EXP 000019c7: SUB 000019c8: DUP1 000019c9: NOT 000019ca: DUP3 000019cb: MLOAD 000019cc: AND 000019cd: DUP2 000019ce: DUP5 000019cf: MLOAD 000019d0: AND 000019d1: DUP1 000019d2: DUP3 000019d3: OR 000019d4: DUP6 000019d5: MSTORE 000019d6: POP 000019d7: POP 000019d8: POP 000019d9: POP 000019da: POP 000019db: POP 000019dc: SWAP1 000019dd: POP 000019de: ADD 000019df: SWAP2 000019e0: POP 000019e1: POP 000019e2: PUSH1 0x00 000019e4: PUSH1 0x40 000019e6: MLOAD 000019e7: DUP1 000019e8: DUP4 000019e9: SUB 000019ea: DUP2 000019eb: DUP6 000019ec: DUP8 000019ed: GAS 000019ee: CALL 000019ef: SWAP3 000019f0: POP 000019f1: POP 000019f2: POP 000019f3: RETURNDATASIZE 000019f4: DUP1 000019f5: PUSH1 0x00 000019f7: DUP2 000019f8: EQ 000019f9: PUSH2 0x1a1e 000019fc: JUMPI 000019fd: PUSH1 0x40 000019ff: MLOAD 00001a00: SWAP2 00001a01: POP 00001a02: PUSH1 0x1f 00001a04: NOT 00001a05: PUSH1 0x3f 00001a07: RETURNDATASIZE 00001a08: ADD 00001a09: AND 00001a0a: DUP3 00001a0b: ADD 00001a0c: PUSH1 0x40 00001a0e: MSTORE 00001a0f: RETURNDATASIZE 00001a10: DUP3 00001a11: MSTORE 00001a12: RETURNDATASIZE 00001a13: PUSH1 0x00 00001a15: PUSH1 0x20 00001a17: DUP5 00001a18: ADD 00001a19: RETURNDATACOPY 00001a1a: PUSH2 0x1a23 00001a1d: JUMP 00001a1e: JUMPDEST 00001a1f: PUSH1 0x60 00001a21: SWAP2 00001a22: POP 00001a23: JUMPDEST 00001a24: POP 00001a25: SWAP2 00001a26: POP 00001a27: SWAP2 00001a28: POP 00001a29: SWAP2 00001a2a: POP 00001a2b: SWAP2 00001a2c: JUMP 00001a2d: JUMPDEST 00001a2e: PUSH1 0x00 00001a30: PUSH2 0x1a39 00001a33: DUP4 00001a34: DUP4 00001a35: PUSH2 0x0fe2 00001a38: JUMP 00001a39: JUMPDEST 00001a3a: PUSH2 0x1a74 00001a3d: JUMPI 00001a3e: PUSH1 0x40 00001a40: MLOAD 00001a41: PUSH3 0x461bcd 00001a45: PUSH1 0xe5 00001a47: SHL 00001a48: DUP2 00001a49: MSTORE 00001a4a: PUSH1 0x04 00001a4c: ADD 00001a4d: DUP1 00001a4e: DUP1 00001a4f: PUSH1 0x20 00001a51: ADD 00001a52: DUP3 00001a53: DUP2 00001a54: SUB 00001a55: DUP3 00001a56: MSTORE 00001a57: PUSH1 0x2b 00001a59: DUP2 00001a5a: MSTORE 00001a5b: PUSH1 0x20 00001a5d: ADD 00001a5e: DUP1 00001a5f: PUSH2 0x1e29 00001a62: PUSH1 0x2b 00001a64: SWAP2 00001a65: CODECOPY 00001a66: PUSH1 0x40 00001a68: ADD 00001a69: SWAP2 00001a6a: POP 00001a6b: POP 00001a6c: PUSH1 0x40 00001a6e: MLOAD 00001a6f: DUP1 00001a70: SWAP2 00001a71: SUB 00001a72: SWAP1 00001a73: REVERT 00001a74: JUMPDEST 00001a75: POP 00001a76: PUSH1 0x01 00001a78: PUSH1 0x01 00001a7a: PUSH1 0xa0 00001a7c: SHL 00001a7d: SUB 00001a7e: SWAP1 00001a7f: DUP2 00001a80: AND 00001a81: PUSH1 0x00 00001a83: SWAP1 00001a84: DUP2 00001a85: MSTORE 00001a86: PUSH1 0x07 00001a88: PUSH1 0x20 00001a8a: MSTORE 00001a8b: PUSH1 0x40 00001a8d: SWAP1 00001a8e: KECCAK256 00001a8f: SLOAD 00001a90: AND 00001a91: SWAP2 00001a92: SWAP1 00001a93: POP 00001a94: JUMP 00001a95: JUMPDEST 00001a96: PUSH1 0x08 00001a98: SLOAD 00001a99: PUSH1 0x09 00001a9b: SLOAD 00001a9c: PUSH1 0x0a 00001a9e: SLOAD 00001a9f: PUSH1 0x40 00001aa1: DUP1 00001aa2: MLOAD 00001aa3: PUSH4 0x762ffd61 00001aa8: PUSH1 0xe1 00001aaa: SHL 00001aab: DUP2 00001aac: MSTORE 00001aad: SWAP1 00001aae: MLOAD 00001aaf: PUSH1 0x00 00001ab1: SWAP5 00001ab2: PUSH1 0x01 00001ab4: PUSH1 0x01 00001ab6: PUSH1 0xa0 00001ab8: SHL 00001ab9: SUB 00001aba: SWAP1 00001abb: DUP2 00001abc: AND 00001abd: SWAP5 00001abe: PUSH4 0x56385578 00001ac3: SWAP5 00001ac4: SWAP1 00001ac5: DUP3 00001ac6: AND 00001ac7: SWAP4 00001ac8: SWAP2 00001ac9: AND 00001aca: SWAP2 00001acb: DUP4 00001acc: SWAP2 00001acd: PUSH4 0xec5ffac2 00001ad2: SWAP2 00001ad3: PUSH1 0x04 00001ad5: DUP1 00001ad6: DUP4 00001ad7: ADD 00001ad8: SWAP3 00001ad9: PUSH1 0x20 00001adb: SWAP3 00001adc: SWAP2 00001add: SWAP1 00001ade: DUP3 00001adf: SWAP1 00001ae0: SUB 00001ae1: ADD 00001ae2: DUP2 00001ae3: DUP7 00001ae4: DUP1 00001ae5: EXTCODESIZE 00001ae6: ISZERO 00001ae7: DUP1 00001ae8: ISZERO 00001ae9: PUSH2 0x1af1 00001aec: JUMPI 00001aed: PUSH1 0x00 00001aef: DUP1 00001af0: REVERT 00001af1: JUMPDEST 00001af2: POP 00001af3: GAS 00001af4: STATICCALL 00001af5: ISZERO 00001af6: DUP1 00001af7: ISZERO 00001af8: PUSH2 0x1b05 00001afb: JUMPI 00001afc: RETURNDATASIZE 00001afd: PUSH1 0x00 00001aff: DUP1 00001b00: RETURNDATACOPY 00001b01: RETURNDATASIZE 00001b02: PUSH1 0x00 00001b04: REVERT 00001b05: JUMPDEST 00001b06: POP 00001b07: POP 00001b08: POP 00001b09: POP 00001b0a: PUSH1 0x40 00001b0c: MLOAD 00001b0d: RETURNDATASIZE 00001b0e: PUSH1 0x20 00001b10: DUP2 00001b11: LT 00001b12: ISZERO 00001b13: PUSH2 0x1b1b 00001b16: JUMPI 00001b17: PUSH1 0x00 00001b19: DUP1 00001b1a: REVERT 00001b1b: JUMPDEST 00001b1c: POP 00001b1d: MLOAD 00001b1e: PUSH1 0x40 00001b20: DUP1 00001b21: MLOAD 00001b22: PUSH1 0x01 00001b24: PUSH1 0x01 00001b26: PUSH1 0xe0 00001b28: SHL 00001b29: SUB 00001b2a: NOT 00001b2b: PUSH1 0xe0 00001b2d: DUP8 00001b2e: SWAP1 00001b2f: SHL 00001b30: AND 00001b31: DUP2 00001b32: MSTORE 00001b33: PUSH1 0x01 00001b35: PUSH1 0x01 00001b37: PUSH1 0xa0 00001b39: SHL 00001b3a: SUB 00001b3b: SWAP5 00001b3c: DUP6 00001b3d: AND 00001b3e: PUSH1 0x04 00001b40: DUP3 00001b41: ADD 00001b42: MSTORE 00001b43: SWAP3 00001b44: SWAP1 00001b45: SWAP4 00001b46: AND 00001b47: PUSH1 0x24 00001b49: DUP4 00001b4a: ADD 00001b4b: MSTORE 00001b4c: PUSH1 0x44 00001b4e: DUP3 00001b4f: ADD 00001b50: MSTORE 00001b51: PUSH9 0x01158e460913d00000 00001b5b: PUSH1 0x64 00001b5d: DUP3 00001b5e: ADD 00001b5f: MSTORE 00001b60: PUSH8 0x0de0b6b3a7640000 00001b69: PUSH1 0x84 00001b6b: DUP3 00001b6c: ADD 00001b6d: MSTORE 00001b6e: SWAP1 00001b6f: MLOAD 00001b70: PUSH1 0xa4 00001b72: DUP1 00001b73: DUP4 00001b74: ADD 00001b75: SWAP3 00001b76: PUSH1 0x20 00001b78: SWAP3 00001b79: SWAP2 00001b7a: SWAP1 00001b7b: DUP3 00001b7c: SWAP1 00001b7d: SUB 00001b7e: ADD 00001b7f: DUP2 00001b80: PUSH1 0x00 00001b82: DUP8 00001b83: DUP1 00001b84: EXTCODESIZE 00001b85: ISZERO 00001b86: DUP1 00001b87: ISZERO 00001b88: PUSH2 0x1b90 00001b8b: JUMPI 00001b8c: PUSH1 0x00 00001b8e: DUP1 00001b8f: REVERT 00001b90: JUMPDEST 00001b91: POP 00001b92: GAS 00001b93: CALL 00001b94: ISZERO 00001b95: DUP1 00001b96: ISZERO 00001b97: PUSH2 0x0a3a 00001b9a: JUMPI 00001b9b: RETURNDATASIZE 00001b9c: PUSH1 0x00 00001b9e: DUP1 00001b9f: RETURNDATACOPY 00001ba0: RETURNDATASIZE 00001ba1: PUSH1 0x00 00001ba3: REVERT 00001ba4: JUMPDEST 00001ba5: PUSH1 0x00 00001ba7: PUSH2 0x18d3 00001baa: DUP3 00001bab: PUSH2 0x1bcb 00001bae: PUSH1 0x01 00001bb0: PUSH2 0x1bbf 00001bb3: DUP8 00001bb4: DUP5 00001bb5: PUSH4 0xffffffff 00001bba: PUSH2 0x1879 00001bbd: AND 00001bbe: JUMP 00001bbf: JUMPDEST 00001bc0: SWAP1 00001bc1: PUSH4 0xffffffff 00001bc6: PUSH2 0x18da 00001bc9: AND 00001bca: JUMP 00001bcb: JUMPDEST 00001bcc: SWAP1 00001bcd: PUSH4 0xffffffff 00001bd2: PUSH2 0x1c9b 00001bd5: AND 00001bd6: JUMP 00001bd7: JUMPDEST 00001bd8: PUSH1 0x06 00001bda: DUP1 00001bdb: SLOAD 00001bdc: PUSH1 0x40 00001bde: DUP1 00001bdf: MLOAD 00001be0: PUSH1 0x20 00001be2: DUP1 00001be3: DUP3 00001be4: ADD 00001be5: SWAP4 00001be6: SWAP1 00001be7: SWAP4 00001be8: MSTORE 00001be9: ADDRESS 00001bea: PUSH1 0x60 00001bec: SHL 00001bed: DUP2 00001bee: DUP4 00001bef: ADD 00001bf0: MSTORE 00001bf1: DUP2 00001bf2: MLOAD 00001bf3: PUSH1 0x34 00001bf5: DUP2 00001bf6: DUP4 00001bf7: SUB 00001bf8: ADD 00001bf9: DUP2 00001bfa: MSTORE 00001bfb: PUSH1 0x54 00001bfd: SWAP1 00001bfe: SWAP2 00001bff: ADD 00001c00: SWAP1 00001c01: SWAP2 00001c02: MSTORE 00001c03: DUP1 00001c04: MLOAD 00001c05: SWAP2 00001c06: ADD 00001c07: KECCAK256 00001c08: SWAP1 00001c09: SSTORE 00001c0a: PUSH1 0x00 00001c0c: PUSH2 0x1c14 00001c0f: CALLVALUE 00001c10: PUSH2 0x1937 00001c13: JUMP 00001c14: JUMPDEST 00001c15: POP 00001c16: SWAP1 00001c17: POP 00001c18: DUP1 00001c19: PUSH2 0x0968 00001c1c: JUMPI 00001c1d: PUSH1 0x05 00001c1f: DUP1 00001c20: SLOAD 00001c21: CALLVALUE 00001c22: ADD 00001c23: SWAP1 00001c24: SSTORE 00001c25: POP 00001c26: JUMP 00001c27: JUMPDEST 00001c28: PUSH1 0x00 00001c2a: DUP1 00001c2b: SLOAD 00001c2c: PUSH2 0x1c3d 00001c2f: SWAP1 00001c30: PUSH1 0x01 00001c32: PUSH1 0x01 00001c34: PUSH1 0xa0 00001c36: SHL 00001c37: SUB 00001c38: AND 00001c39: PUSH2 0x1d05 00001c3c: JUMP 00001c3d: JUMPDEST 00001c3e: PUSH1 0x01 00001c40: DUP1 00001c41: SLOAD 00001c42: DUP1 00001c43: DUP3 00001c44: ADD 00001c45: SWAP1 00001c46: SWAP2 00001c47: SSTORE 00001c48: PUSH32 0xb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6 00001c69: ADD 00001c6a: DUP1 00001c6b: SLOAD 00001c6c: PUSH1 0x01 00001c6e: PUSH1 0x01 00001c70: PUSH1 0xa0 00001c72: SHL 00001c73: SUB 00001c74: NOT 00001c75: AND 00001c76: PUSH1 0x01 00001c78: PUSH1 0x01 00001c7a: PUSH1 0xa0 00001c7c: SHL 00001c7d: SUB 00001c7e: DUP4 00001c7f: AND 00001c80: SWAP1 00001c81: DUP2 00001c82: OR 00001c83: SWAP1 00001c84: SWAP2 00001c85: SSTORE 00001c86: PUSH1 0x00 00001c88: SWAP1 00001c89: DUP2 00001c8a: MSTORE 00001c8b: PUSH1 0x02 00001c8d: PUSH1 0x20 00001c8f: MSTORE 00001c90: PUSH1 0x40 00001c92: SWAP1 00001c93: KECCAK256 00001c94: TIMESTAMP 00001c95: SWAP1 00001c96: SSTORE 00001c97: SWAP2 00001c98: SWAP1 00001c99: POP 00001c9a: JUMP 00001c9b: JUMPDEST 00001c9c: PUSH1 0x00 00001c9e: DUP1 00001c9f: DUP3 00001ca0: GT 00001ca1: PUSH2 0x1cf1 00001ca4: JUMPI 00001ca5: PUSH1 0x40 00001ca7: DUP1 00001ca8: MLOAD 00001ca9: PUSH3 0x461bcd 00001cad: PUSH1 0xe5 00001caf: SHL 00001cb0: DUP2 00001cb1: MSTORE 00001cb2: PUSH1 0x20 00001cb4: PUSH1 0x04 00001cb6: DUP3 00001cb7: ADD 00001cb8: MSTORE 00001cb9: PUSH1 0x1a 00001cbb: PUSH1 0x24 00001cbd: DUP3 00001cbe: ADD 00001cbf: MSTORE 00001cc0: PUSH32 0x536166654d6174683a206469766973696f6e206279207a65726f000000000000 00001ce1: PUSH1 0x44 00001ce3: DUP3 00001ce4: ADD 00001ce5: MSTORE 00001ce6: SWAP1 00001ce7: MLOAD 00001ce8: SWAP1 00001ce9: DUP2 00001cea: SWAP1 00001ceb: SUB 00001cec: PUSH1 0x64 00001cee: ADD 00001cef: SWAP1 00001cf0: REVERT 00001cf1: JUMPDEST 00001cf2: PUSH1 0x00 00001cf4: DUP3 00001cf5: DUP5 00001cf6: DUP2 00001cf7: PUSH2 0x1cfc 00001cfa: JUMPI 00001cfb: INVALID 00001cfc: JUMPDEST 00001cfd: DIV 00001cfe: SWAP5 00001cff: SWAP4 00001d00: POP 00001d01: POP 00001d02: POP 00001d03: POP 00001d04: JUMP 00001d05: JUMPDEST 00001d06: PUSH1 0x00 00001d08: DUP1 00001d09: DUP3 00001d0a: PUSH1 0x60 00001d0c: SHL 00001d0d: SWAP1 00001d0e: POP 00001d0f: PUSH1 0x40 00001d11: MLOAD 00001d12: PUSH20 0x3d602d80600a3d3981f3363d3d373d3d3d363d73 00001d27: PUSH1 0x60 00001d29: SHL 00001d2a: DUP2 00001d2b: MSTORE 00001d2c: DUP2 00001d2d: PUSH1 0x14 00001d2f: DUP3 00001d30: ADD 00001d31: MSTORE 00001d32: PUSH15 0x5af43d82803e903d91602b57fd5bf3 00001d42: PUSH1 0x88 00001d44: SHL 00001d45: PUSH1 0x28 00001d47: DUP3 00001d48: ADD 00001d49: MSTORE 00001d4a: PUSH1 0x37 00001d4c: DUP2 00001d4d: PUSH1 0x00 00001d4f: CREATE 00001d50: SWAP5 00001d51: SWAP4 00001d52: POP 00001d53: POP 00001d54: POP 00001d55: POP 00001d56: JUMP 00001d57: INVALID 00001d58: BLOBHASH 00001d59: PUSH15 0x73756666696369656e74207061796d 00001d69: PUSH6 0x6e7420666f72 00001d70: KECCAK256 00001d71: PUSH16 0x70656e696e672061206e6577206b6565 00001d82: PUSH17 0x486f6e657374207468726573686f6c6420 00001d94: PUSH14 0x757374206265206c657373206f72 00001da3: KECCAK256 00001da4: PUSH6 0x7175616c2074 00001dab: PUSH9 0x652067726f75702073 00001db5: PUSH10 0x7a65426f6e6420706572 00001dc0: KECCAK256 00001dc1: PUSH14 0x656d626572206d75737420626520 00001dd0: PUSH8 0x7265617465722074 00001dd9: PUSH9 0x616e207a65726f486f 00001de3: PUSH15 0x657374207468726573686f6c64206d 00001df3: PUSH22 0x73742062652067726561746572207468616e20304e6f 00001e0a: KECCAK256 00001e0b: PUSH17 0x6f6f6c20666f756e6420666f7220746865 00001e1d: KECCAK256 00001e1e: PUSH2 0x7070 00001e21: PUSH13 0x69636174696f6e4f7065726174 00001e2f: PUSH16 0x72206e6f742072656769737465726564 00001e40: KECCAK256 00001e41: PUSH7 0x6f722074686520 00001e49: PUSH2 0x7070 00001e4c: PUSH13 0x69636174696f6e4e6f7420656e 00001e5a: PUSH16 0x7567682066756e647320746f20747269 00001e6b: PUSH8 0x6765722072657365 00001e74: PUSH6 0x64a265627a7a 00001e7b: PUSH19 0x315820ccf51f128a7bc9e04b0bd60c25381623 00001e8f: UNKNOWN(0xDA) 00001e90: UNKNOWN(0xE0) 00001e91: SHL 00001e92: PUSH22 0xcbcbb65c1aa6c3680fa2b63d64736f6c634300051100 00001ea9: ORIGIN
| Severity | Category | Tool | Title | Confidence | Validated | Confirmed | Details |
|---|---|---|---|---|---|---|---|
| critical | auth | codex | TokenGrant.receiveApproval allows arbitrary grant creation using victims’ allowances, enabling immediate token theft | 90 | no | — |
viewevidence_json{
"evidence": "`receiveApproval` is public and trusts caller-supplied `_from` without verifying the caller; it then transfers from `_from` via `token.safeTransferFrom`, enabling anyone to spend any existing allowance. Combined with `withdraw` (public) this allows immediate extraction by setting attacker as grantee with a zero-duration schedule.",
"locations": [
"contracts/@keep-network/keep-core/contracts/TokenGrant.sol:210",
"contracts/@keep-network/keep-core/contracts/TokenGrant.sol:252",
"contracts/@keep-network/keep-core/contracts/TokenGrant.sol:262"
],
"recommendation": "Require `msg.sender == address(token)` (approveAndCall-only) and/or `msg.sender == _from` in `receiveApproval`. Consider using EIP\u20112612 permits or a separate `createGrant` function callable only by the token owner/grant manager.",
"exploit_scenario": "1) Attacker monitors for any address that has approved the TokenGrant contract to spend KEEP (non\u2011zero allowance). 2) Attacker calls `TokenGrant.receiveApproval` with `_from = victim`, `_amount = allowance`, `_token = KEEP`, and `_extraData` encoding `grantManager=attacker`, `grantee=attacker`, `duration=0`, `start=block.timestamp`, `cliffDuration=0`, `revocable=false`, `stakingPolicy=<any non\u2011zero address>`. 3) The contract pulls `_amount` KEEP from the victim using their allowance and creates a grant owned by the attacker. 4) Attacker calls `TokenGrant.withdraw(grantId)` to withdraw the fully unlocked amount to themselves. Profit potential: up to the full approved allowance (often large/infinite) or victim\u2019s KEEP balance per address that has approved TokenGrant; could be the entirety of a grant manager\u2019s funding."
}
|
| high | auth | detector | Authorization based on tx.origin | 70 | no | — |
viewvalidation_json{
"reason": "missing sink mapping",
"status": "no_sink"
}
witness_json{
"notes": "heuristic witness; entrypoints are best-effort selectors with zeroed calldata",
"constraints": [],
"entrypoints": [
{
"calldata": "0xd14fede1",
"selector": "0xd14fede1",
"calldata_variants": [
"0xd14fede1",
"0xd14fede10000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xd870c034",
"selector": "0xd870c034",
"calldata_variants": [
"0xd870c034",
"0xd870c0340000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xebcbb39f",
"selector": "0xebcbb39f",
"calldata_variants": [
"0xebcbb39f",
"0xebcbb39f0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xeca4a80d",
"selector": "0xeca4a80d",
"calldata_variants": [
"0xeca4a80d",
"0xeca4a80d0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xb7a6f483",
"selector": "0xb7a6f483",
"calldata_variants": [
"0xb7a6f483",
"0xb7a6f4830000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xb8ee9156",
"selector": "0xb8ee9156",
"calldata_variants": [
"0xb8ee9156",
"0xb8ee91560000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xbc2c289f",
"selector": "0xbc2c289f",
"calldata_variants": [
"0xbc2c289f",
"0xbc2c289f0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xca050cfd",
"selector": "0xca050cfd",
"calldata_variants": [
"0xca050cfd",
"0xca050cfd0000000000000000000000000000000000000000000000000000000000000000"
]
}
]
}
evidence_json{
"guards_detected": [
{
"pc": 7849,
"type": "tx_origin_used"
}
]
}
|
| medium | other | detector | ETH value transfer possible | 40 | no | no |
viewtrace_id: 0x30d986c4e6a1b6cc9b6fe89e7df38694d02efc3b334bec789c8d22ef46435793
call_targets:
0xa7d9e842efb252389d613da88eda3731512e40bd
target_varies:
no
classification:
constant_target
validation_json{
"sink": "CALL",
"errors": 0,
"status": "sink_reached",
"attempts": 1,
"trace_id": "0x30d986c4e6a1b6cc9b6fe89e7df38694d02efc3b334bec789c8d22ef46435793",
"confirmed": false,
"trace_mode": "callTracer",
"call_targets": [
"0xa7d9e842efb252389d613da88eda3731512e40bd"
],
"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": "0xd14fede1",
"selector": "0xd14fede1",
"calldata_variants": [
"0xd14fede1",
"0xd14fede10000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xd870c034",
"selector": "0xd870c034",
"calldata_variants": [
"0xd870c034",
"0xd870c0340000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xebcbb39f",
"selector": "0xebcbb39f",
"calldata_variants": [
"0xebcbb39f",
"0xebcbb39f0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xeca4a80d",
"selector": "0xeca4a80d",
"calldata_variants": [
"0xeca4a80d",
"0xeca4a80d0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xb7a6f483",
"selector": "0xb7a6f483",
"calldata_variants": [
"0xb7a6f483",
"0xb7a6f4830000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xb8ee9156",
"selector": "0xb8ee9156",
"calldata_variants": [
"0xb8ee9156",
"0xb8ee91560000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xbc2c289f",
"selector": "0xbc2c289f",
"calldata_variants": [
"0xbc2c289f",
"0xbc2c289f0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xca050cfd",
"selector": "0xca050cfd",
"calldata_variants": [
"0xca050cfd",
"0xca050cfd0000000000000000000000000000000000000000000000000000000000000000"
]
}
]
}
evidence_json{
"examples": [
{
"pc": 3591,
"opcode": "CALL",
"returndata_checked": null,
"value_expression_category": "computed",
"target_expression_category": "computed"
},
{
"pc": 4293,
"opcode": "CALL",
"returndata_checked": null,
"value_expression_category": "computed",
"target_expression_category": "computed"
},
{
"pc": 5022,
"opcode": "CALL",
"returndata_checked": null,
"value_expression_category": "computed",
"target_expression_category": "computed"
}
],
"eth_value_calls": 8,
"guards_detected": [
{
"pc": 7849,
"type": "tx_origin_used"
}
]
}
|
| medium | other | detector | CREATE/CREATE2 reachable | 45 | yes | yes |
viewtrace_id: 0xf2dea1cb0db7a07e4429802b40147d7937c84397dadd0c3ae1cbf05f2fc89e1f
validation_json{
"sink": "CREATE",
"errors": 0,
"status": "confirmed",
"attempts": 30,
"trace_id": "0xf2dea1cb0db7a07e4429802b40147d7937c84397dadd0c3ae1cbf05f2fc89e1f",
"confirmed": true,
"trace_mode": "structLogs",
"call_targets": null,
"matched_probe": null,
"target_varies": null,
"classification": "sink_reached"
}
witness_json{
"notes": "heuristic witness; entrypoints are best-effort selectors with zeroed calldata",
"constraints": [],
"entrypoints": [
{
"calldata": "0xd14fede1",
"selector": "0xd14fede1",
"calldata_variants": [
"0xd14fede1",
"0xd14fede10000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xd870c034",
"selector": "0xd870c034",
"calldata_variants": [
"0xd870c034",
"0xd870c0340000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xebcbb39f",
"selector": "0xebcbb39f",
"calldata_variants": [
"0xebcbb39f",
"0xebcbb39f0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xeca4a80d",
"selector": "0xeca4a80d",
"calldata_variants": [
"0xeca4a80d",
"0xeca4a80d0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xb7a6f483",
"selector": "0xb7a6f483",
"calldata_variants": [
"0xb7a6f483",
"0xb7a6f4830000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xb8ee9156",
"selector": "0xb8ee9156",
"calldata_variants": [
"0xb8ee9156",
"0xb8ee91560000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xbc2c289f",
"selector": "0xbc2c289f",
"calldata_variants": [
"0xbc2c289f",
"0xbc2c289f0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xca050cfd",
"selector": "0xca050cfd",
"calldata_variants": [
"0xca050cfd",
"0xca050cfd0000000000000000000000000000000000000000000000000000000000000000"
]
}
]
}
evidence_json{
"create_count": 1,
"create2_count": 0
}
|
| medium | other | detector | Untrusted CALL target/value reachable | 45 | no | no |
viewtrace_id: 0x30d986c4e6a1b6cc9b6fe89e7df38694d02efc3b334bec789c8d22ef46435793
call_targets:
0xa7d9e842efb252389d613da88eda3731512e40bd
target_varies:
no
classification:
constant_target
validation_json{
"sink": "CALL",
"errors": 0,
"status": "sink_reached",
"attempts": 1,
"trace_id": "0x30d986c4e6a1b6cc9b6fe89e7df38694d02efc3b334bec789c8d22ef46435793",
"confirmed": false,
"trace_mode": "callTracer",
"call_targets": [
"0xa7d9e842efb252389d613da88eda3731512e40bd"
],
"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": "0xd14fede1",
"selector": "0xd14fede1",
"calldata_variants": [
"0xd14fede1",
"0xd14fede10000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xd870c034",
"selector": "0xd870c034",
"calldata_variants": [
"0xd870c034",
"0xd870c0340000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xebcbb39f",
"selector": "0xebcbb39f",
"calldata_variants": [
"0xebcbb39f",
"0xebcbb39f0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xeca4a80d",
"selector": "0xeca4a80d",
"calldata_variants": [
"0xeca4a80d",
"0xeca4a80d0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xb7a6f483",
"selector": "0xb7a6f483",
"calldata_variants": [
"0xb7a6f483",
"0xb7a6f4830000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xb8ee9156",
"selector": "0xb8ee9156",
"calldata_variants": [
"0xb8ee9156",
"0xb8ee91560000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xbc2c289f",
"selector": "0xbc2c289f",
"calldata_variants": [
"0xbc2c289f",
"0xbc2c289f0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xca050cfd",
"selector": "0xca050cfd",
"calldata_variants": [
"0xca050cfd",
"0xca050cfd0000000000000000000000000000000000000000000000000000000000000000"
]
}
]
}
evidence_json{
"examples": [
{
"pc": 3591,
"opcode": "CALL",
"returndata_checked": null,
"value_expression_category": "computed",
"target_expression_category": "computed"
},
{
"pc": 4293,
"opcode": "CALL",
"returndata_checked": null,
"value_expression_category": "computed",
"target_expression_category": "computed"
},
{
"pc": 5022,
"opcode": "CALL",
"returndata_checked": null,
"value_expression_category": "computed",
"target_expression_category": "computed"
}
],
"call_count": 8,
"guards_detected": [
{
"pc": 7849,
"type": "tx_origin_used"
}
],
"untrusted_call_count": 8
}
|
| low | other | cast | Contract creation opcode present | 60 | no | — |
viewevidence_json{
"notes": "runtime can deploy contracts dynamically via CREATE/CREATE2",
"create_count": 1,
"create2_count": 0
}
|
| info | other | cast | Heavy EXTCODE*/BALANCE usage | 55 | no | — |
viewevidence_json{
"notes": "frequent external code or balance checks; may indicate introspection or validation logic",
"ext_balance_count": 20
}
|
| info | other | cast | Heavy CALL-family usage | 55 | no | — |
viewevidence_json{
"notes": "large number of CALL/CALLCODE/STATICCALL opcodes; review external call patterns",
"call_family_count": 17
}
|