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

Analysis Run

27854931-6298-47ab-a143-fe61a05b0147

complete
Chain ID
1
Address
Block Number
Created
Fri, Jan 2, 2026 7:42 PM
Review Summary

What survived the funnel

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

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

Processing Jobs

Status & attempts
ID Type Status Attempts Heartbeat
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

Artifact

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

Slither

tool.slither

No slither job recorded yet.

Codex

report.consolidate
Job Status
complete
Attempts
1 / 1
Findings
1
No findings?
no
Summary
Critical auth bypass in TokenGrant.receiveApproval lets an attacker steal KEEP from any address that has approved the TokenGrant contract.
View stderr
[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"]}]}
Metadata
{
    "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
}

Opcode Heuristics

tool.cast_disasm
Delegatecall
0
Selfdestruct
0
CREATE2
0
CALL-family (heavy)
17
EXT*/BALANCE
20
Total opcodes
5193
Flags
create_opcodes_present heavy_ext_balance_usage call_family_heavy
View cast disassembly output
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

Findings

validated = confirmed for call sinks; sink observed for others
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
view
evidence_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
view
validation_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
view
trace_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
view
trace_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
view
trace_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
view
evidence_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
view
evidence_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
view
evidence_json
{
    "notes": "large number of CALL/CALLCODE/STATICCALL opcodes; review external call patterns",
    "call_family_count": 17
}