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

Analysis Run

99652185-f97f-481e-ba06-fdb49250a93c

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

What survived the funnel

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

Confirmed
0
Validated
0
Source
Verified
Review Backing
Present
Best current signal
Arbitrary caller can drain any existing allowance by crafting grants
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
31332 report.consolidate complete 1 / 1 3 months ago
110990 artifact.fetch complete 1 / 3 1 week ago
110991 tool.cast_disasm complete 1 / 3 1 week ago
110992 analysis.bundle complete 1 / 3 1 week ago
110993 capability.graph complete 1 / 3 1 week ago
110994 detector.run complete 1 / 3 1 week ago
110995 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
Found 1 exploitable issue enabling theft of approved tokens via TokenGrant.receiveApproval.
View stderr
[codex:488300] OpenAI Codex v0.77.0 (research preview)
[codex:488300] --------
[codex:488300] workdir: /tmp/codex-multi-h68jf3y7
[codex:488300] model: gpt-5.2-codex
[codex:488300] provider: openai
[codex:488300] approval: never
[codex:488300] sandbox: read-only
[codex:488300] reasoning effort: xhigh
[codex:488300] reasoning summaries: auto
[codex:488300] session id: 019b805f-8170-7b51-9c5b-d5f8644f9c0c
[codex:488300] --------
[codex:488300] user
[codex:488300] You are a profit-focused exploit hunter. Your ONLY goal is finding ways to extract value (ETH, tokens, NFTs) from this contract.
[codex:488300] 
[codex:488300] Read `AUDIT_BUNDLE.txt` completely before concluding. Treat `lib/` and `@openzeppelin/` as trusted unless misused.
[codex:488300] 
[codex:488300] ONLY REPORT if you find a CONCRETE, EXPLOITABLE path to profit. We do NOT care about:
[codex:488300] - Gas inefficiency, code quality, naming, or best practices
[codex:488300] - Theoretical vulnerabilities without a clear extraction path
[codex:488300] - Centralization risks (admin can rug) - assume admin keys are secure
[codex:488300] - Front-running unless it enables theft beyond MEV
[codex:488300] - DoS, griefing, or issues that don't result in attacker profit
[codex:488300] - Missing events, view function issues, or informational findings
[codex:488300] 
[codex:488300] HIGH-VALUE PATTERNS TO HUNT:
[codex:488300] - Reentrancy: external calls before state updates that allow double-withdrawal
[codex:488300] - Access control: missing/bypassable auth on withdraw, transfer, or mint functions
[codex:488300] - Flash loan attacks: borrow -> manipulate -> profit in single tx
[codex:488300] - Price oracle manipulation: TWAP with short window, spot price reads, stale prices
[codex:488300] - Signature replay: missing nonce, chainId, or deadline in permit/meta-tx
[codex:488300] - Proxy hijacking: unprotected initialize(), storage collision, UUPS without auth
[codex:488300] - Accounting errors: rounding that favors attacker, share inflation, first depositor attacks
[codex:488300] - Unchecked external calls: return value ignored on token transfers enabling fake tokens
[codex:488300] - Cross-function reentrancy: state read in function A, modified via reentrant call, used stale in A
[codex:488300] 
[codex:488300] For each finding, you MUST provide:
[codex:488300] 1. Exact file and line numbers of vulnerable code
[codex:488300] 2. Step-by-step exploit transaction sequence
[codex:488300] 3. Estimated profit potential (order of magnitude: contract balance, LP reserves, etc.)
[codex:488300] 
[codex:488300] If no concrete profit path exists: set no_findings=true. Do NOT pad with low-severity noise.
[codex:488300] 
[codex:488300] Output MUST be valid JSON matching the provided schema.
[codex:488300] - severity: info, low, medium, high, critical (use high/critical ONLY for clear extraction paths)
[codex:488300] - category: access_control, reentrancy, math, oracle, upgradeability, auth, other
[codex:488300] mcp startup: no servers
[codex:488300] 
[codex:488300] thinking
[codex:488300] **Reading audit bundle file**
[codex:488300] exec
[codex:488300] /bin/bash -lc ls in /tmp/codex-multi-h68jf3y7 succeeded in 5ms:
[codex:488300] AUDIT_BUNDLE.txt
[codex:488300] codex-output-schema.json
[codex:488300] contracts
[codex:488300] exec
[codex:488300] /bin/bash -lc "sed -n '1,200p' AUDIT_BUNDLE.txt" in /tmp/codex-multi-h68jf3y7 succeeded in 6ms:
[codex:488300] This file concatenates first-party Solidity sources only (lib/@openzeppelin excluded).
[codex:488300] 
[codex:488300] ================================================================================
[codex:488300] FILE: contracts/@keep-network/keep-core/contracts/Authorizations.sol
[codex:488300] ================================================================================
[codex:488300] /**
[codex:488300] ▓▓▌ ▓▓ ▐▓▓ ▓▓▓▓▓▓▓▓▓▓▌▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▄
[codex:488300] ▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▌▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
[codex:488300]   ▓▓▓▓▓▓    ▓▓▓▓▓▓▓▀    ▐▓▓▓▓▓▓    ▐▓▓▓▓▓   ▓▓▓▓▓▓     ▓▓▓▓▓   ▐▓▓▓▓▓▌   ▐▓▓▓▓▓▓
[codex:488300]   ▓▓▓▓▓▓▄▄▓▓▓▓▓▓▓▀      ▐▓▓▓▓▓▓▄▄▄▄         ▓▓▓▓▓▓▄▄▄▄         ▐▓▓▓▓▓▌   ▐▓▓▓▓▓▓
[codex:488300]   ▓▓▓▓▓▓▓▓▓▓▓▓▓▀        ▐▓▓▓▓▓▓▓▓▓▓         ▓▓▓▓▓▓▓▓▓▓▌        ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
[codex:488300]   ▓▓▓▓▓▓▀▀▓▓▓▓▓▓▄       ▐▓▓▓▓▓▓▀▀▀▀         ▓▓▓▓▓▓▀▀▀▀         ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▀
[codex:488300]   ▓▓▓▓▓▓   ▀▓▓▓▓▓▓▄     ▐▓▓▓▓▓▓     ▓▓▓▓▓   ▓▓▓▓▓▓     ▓▓▓▓▓   ▐▓▓▓▓▓▌
[codex:488300] ▓▓▓▓▓▓▓▓▓▓ █▓▓▓▓▓▓▓▓▓ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓  ▓▓▓▓▓▓▓▓▓▓
[codex:488300] ▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓  ▓▓▓▓▓▓▓▓▓▓
[codex:488300] 
[codex:488300]                            Trust math, not hardware.
[codex:488300] */
[codex:488300] 
[codex:488300] pragma solidity 0.5.17;
[codex:488300] 
[codex:488300] thinking
[codex:488300] **Continuing exploration**
[codex:488300] exec
[codex:488300] /bin/bash -lc "sed -n '200,400p' AUDIT_BUNDLE.txt" in /tmp/codex-multi-h68jf3y7 succeeded in 5ms:
[codex:488300]     // other roles. Also, it can disable operator contract panic buttons
[codex:488300]     // permanently.
[codex:488300]     address public governance;
[codex:488300] 
[codex:488300]     // Registry Keeper maintains approved operator contracts. Each operator
[codex:488300]     // contract must be approved before it can be authorized by a staker or
[codex:488300]     // used by a service contract.
[codex:488300]     address public registryKeeper;
[codex:488300] 
[codex:488300]     // Each operator contract has a Panic Button which can disable malicious
[codex:488300]     // or malfunctioning contract that have been previously approved by the
[codex:488300]     // Registry Keeper.
[codex:488300]     //
[codex:488300]     // New operator contract added to the registry has a default panic button
[codex:488300]     // value assigned (defaultPanicButton). Panic button for each operator
[codex:488300]     // contract can be later updated by Governance to individual value.
[codex:488300]     //
[codex:488300]     // It is possible to disable panic button for individual contract by
[codex:488300]     // setting the panic button to zero address. In such case, operator contract
[codex:488300]     // can not be disabled and is permanently approved in the registry.
[codex:488300] 
[codex:488300] thinking
[codex:488300] **Continuing exploration**
[codex:488300] exec
[codex:488300] /bin/bash -lc "sed -n '400,800p' AUDIT_BUNDLE.txt" in /tmp/codex-multi-h68jf3y7 succeeded in 6ms:
[codex:488300]         return operatorContracts[operatorContract] == ContractStatus.New;
[codex:488300]     }
[codex:488300] 
[codex:488300]     function isApprovedOperatorContract(address operatorContract)
[codex:488300]         public
[codex:488300]         view
[codex:488300]         returns (bool)
[codex:488300]     {
[codex:488300]         return operatorContracts[operatorContract] == ContractStatus.Approved;
[codex:488300]     }
[codex:488300] 
[codex:488300]     function operatorContractUpgraderFor(address _serviceContract)
[codex:488300]         public
[codex:488300]         view
[codex:488300]         returns (address)
[codex:488300]     {
[codex:488300]         return operatorContractUpgraders[_serviceContract];
[codex:488300]     }
[codex:488300] 
[codex:488300]     function serviceContractUpgraderFor(address _operatorContract)
[codex:488300] 
[codex:488300] thinking
[codex:488300] **Requesting full file**
[codex:488300] exec
[codex:488300] /bin/bash -lc "sed -n '800,1200p' AUDIT_BUNDLE.txt" in /tmp/codex-multi-h68jf3y7 succeeded in 5ms:
[codex:488300]     mapping(uint256 => Grant) public grants;
[codex:488300] 
[codex:488300]     // Token grants stakes.
[codex:488300]     mapping(address => TokenGrantStake) public grantStakes;
[codex:488300] 
[codex:488300]     // Mapping of token grant IDs per particular address
[codex:488300]     // involved in a grant as a grantee or as a grant manager.
[codex:488300]     mapping(address => uint256[]) public grantIndices;
[codex:488300] 
[codex:488300]     // Token grants balances. Sum of all granted tokens to a grantee.
[codex:488300]     // This includes granted tokens that are already unlocked and
[codex:488300]     // available to be withdrawn to the grantee
[codex:488300]     mapping(address => uint256) public balances;
[codex:488300] 
[codex:488300]     // Mapping of operator addresses per particular grantee address.
[codex:488300]     mapping(address => address[]) public granteesToOperators;
[codex:488300] 
[codex:488300]     /// @notice Creates a token grant contract for a provided Standard ERC20Burnable token.
[codex:488300]     /// @param _tokenAddress address of a token that will be linked to this contract.
[codex:488300]     constructor(address _tokenAddress) public {
[codex:488300] exec
[codex:488300] /bin/bash -lc "sed -n '1200,1600p' AUDIT_BUNDLE.txt" in /tmp/codex-multi-h68jf3y7 succeeded in 5ms:
[codex:488300]     function undelegate(address _operator) public {
[codex:488300]         TokenGrantStake grantStake = grantStakes[_operator];
[codex:488300]         uint256 grantId = grantStake.getGrantId();
[codex:488300]         require(
[codex:488300]             msg.sender == _operator || msg.sender == grants[grantId].grantee,
[codex:488300]             "Only operator or grantee can undelegate."
[codex:488300]         );
[codex:488300] 
[codex:488300]         grantStake.undelegate();
[codex:488300]     }
[codex:488300] 
[codex:488300]     /// @notice Force cancellation of a revoked grant's stake.
[codex:488300]     /// Can be used by the grant manager
[codex:488300]     /// to immediately withdraw tokens back into the grant,
[codex:488300]     /// from an operator still within the initialization period.
[codex:488300]     /// These tokens can then be withdrawn
[codex:488300]     /// if some revoked tokens haven't been withdrawn yet.
[codex:488300]     function cancelRevokedStake(address _operator) public {
[codex:488300]         TokenGrantStake grantStake = grantStakes[_operator];
[codex:488300]         uint256 grantId = grantStake.getGrantId();
[codex:488300] 
[codex:488300] thinking
[codex:488300] **Continuing to assess vulnerability context**
[codex:488300] exec
[codex:488300] /bin/bash -lc "sed -n '1600,2000p' AUDIT_BUNDLE.txt" in /tmp/codex-multi-h68jf3y7 succeeded in 5ms:
[codex:488300]         emit StakeDelegated(_from, _operator);
[codex:488300]         emit OperatorStaked(_operator, beneficiary, authorizer, _value);
[codex:488300]     }
[codex:488300] 
[codex:488300]     /// @notice Performs top-up to an existing operator. Tokens added during
[codex:488300]     /// stake initialization period are immediatelly added to the stake and
[codex:488300]     /// stake initialization timer is reset to the current block. Tokens added
[codex:488300]     /// in a top-up after the stake initialization period is over are not
[codex:488300]     /// included in the operator stake until the initialization period for
[codex:488300]     /// a top-up passes and top-up is committed. Operator must not have the stake
[codex:488300]     /// undelegated. It is expected that the top-up is done from the same source
[codex:488300]     /// of tokens as the initial delegation. That is, if the tokens were
[codex:488300]     /// delegated from a grant, top-up has to be performed from the same grant.
[codex:488300]     /// If the delegation was done using liquid tokens, only liquid tokens from
[codex:488300]     /// the same owner can be used to top-up the stake.
[codex:488300]     /// Top-up can not be cancelled so it is important to be careful with the
[codex:488300]     /// amount of KEEP added to the stake.
[codex:488300]     /// @param _from The owner of the tokens who approved them to transfer.
[codex:488300]     /// @param _value Approved amount for the transfer and top-up to
[codex:488300]     /// an existing stake.
[codex:488300] 
[codex:488300] thinking
[codex:488300] **Continuing vulnerability scan**
[codex:488300] exec
[codex:488300] /bin/bash -lc "sed -n '2000,2400p' AUDIT_BUNDLE.txt" in /tmp/codex-multi-h68jf3y7 succeeded in 5ms:
[codex:488300]         // `undelegatedAt`.
[codex:488300]         if (
[codex:488300]             isAuthorizedForOperator(_operator, _operatorContract) &&
[codex:488300]             _isInitialized(operatorParams) &&
[codex:488300]             !_isUndelegating(operatorParams)
[codex:488300]         ) {
[codex:488300]             balance = operatorParams.getAmount();
[codex:488300]         }
[codex:488300]     }
[codex:488300] 
[codex:488300]     /// @notice Gets the active stake balance of the specified address.
[codex:488300]     /// An active stake is a stake that passed the initialization period,
[codex:488300]     /// and may be in the process of undelegation
[codex:488300]     /// but has not been released yet,
[codex:488300]     /// either because the undelegation period is not over,
[codex:488300]     /// or because the operator contract has an active lock on the operator.
[codex:488300]     /// Also, the operator had to approve the specified operator contract.
[codex:488300]     ///
[codex:488300]     /// The difference between eligible stake is that active stake does not make
[codex:488300]     /// the operator eligible for work selection but it may be still finishing
[codex:488300] 
[codex:488300] thinking
[codex:488300] **Continuing exploration**
[codex:488300] exec
[codex:488300] /bin/bash -lc "sed -n '2400,2800p' AUDIT_BUNDLE.txt" in /tmp/codex-multi-h68jf3y7 succeeded in 7ms:
[codex:488300]         // If called for a managed grant, tokens could be locked there.
[codex:488300]         // Better be safe than sorry.
[codex:488300]         (bool success, ) = address(this).call(
[codex:488300]             abi.encodeWithSignature("getManagedGrantee(address)", grantee)
[codex:488300]         );
[codex:488300]         require(!success, "Can not be called for managed grant");
[codex:488300] 
[codex:488300]         require(
[codex:488300]             msg.sender == grantee || msg.sender == operator,
[codex:488300]             "Only grantee or operator can withdraw"
[codex:488300]         );
[codex:488300] 
[codex:488300]         withdraw(deposit, operator, grantee);
[codex:488300]     }
[codex:488300] 
[codex:488300]     /// @notice Withdraws currently unlocked tokens deposited in the escrow
[codex:488300]     /// after undelegating them from the provided operator. Only grantee or
[codex:488300]     /// operator can call this function. This function works only for
[codex:488300]     /// `ManagedGrant` grantees. For a standard grant, please use `withdraw`
[codex:488300]     /// instead.
[codex:488300] exec
[codex:488300] /bin/bash -lc "sed -n '2800,3200p' AUDIT_BUNDLE.txt" in /tmp/codex-multi-h68jf3y7 succeeded in 7ms:
[codex:488300]             uint256 grantId = extraData.toUint(60);
[codex:488300]             setGrantForOperator(self, operator, grantId);
[codex:488300]             return (true, grantId);
[codex:488300]         } else {
[codex:488300]             return tryCapturingGrantId(self, tokenGrant, operator);
[codex:488300]         }
[codex:488300]     }
[codex:488300] 
[codex:488300]     /// @notice Checks if the delegation for the given operator has been created
[codex:488300]     /// from a grant defined in the passed token grant contract and if so,
[codex:488300]     /// captures the grant ID for that delegation.
[codex:488300]     /// Grant ID can be later retrieved based on the operator address and used
[codex:488300]     /// to authenticate grantee or to fetch the information about grant
[codex:488300]     /// unlocking schedule for escrow.
[codex:488300]     /// @param tokenGrant KEEP token grant contract reference.
[codex:488300]     /// @param operator The operator tokens are delegated to.
[codex:488300]     function tryCapturingGrantId(
[codex:488300]         Storage storage self,
[codex:488300]         TokenGrant tokenGrant,
[codex:488300]         address operator
[codex:488300] 
[codex:488300] thinking
[codex:488300] **Checking for exploits**
[codex:488300] exec
[codex:488300] /bin/bash -lc "sed -n '3200,3600p' AUDIT_BUNDLE.txt" in /tmp/codex-multi-h68jf3y7 succeeded in 6ms:
[codex:488300]     /// time counter.
[codex:488300]     /// @dev This function should be called only for not yet initialized stake.
[codex:488300]     /// @param value Top-up value, the number of tokens added to the stake.
[codex:488300]     /// @param operator Operator The operator with existing delegation to which
[codex:488300]     /// the tokens should be added to.
[codex:488300]     /// @param operatorParams Parameters of that operator, as stored in the
[codex:488300]     /// staking contract.
[codex:488300]     /// @param escrow Reference to TokenStakingEscrow contract.
[codex:488300]     /// @return New value of parameters. It should be updated for the operator
[codex:488300]     /// in the staking contract.
[codex:488300]     function instantComplete(
[codex:488300]         Storage storage self,
[codex:488300]         uint256 value,
[codex:488300]         address operator,
[codex:488300]         uint256 operatorParams,
[codex:488300]         TokenStakingEscrow escrow
[codex:488300]     ) public returns (uint256 newParams) {
[codex:488300]         // Stake is not yet initialized so we don't need to check if the
[codex:488300]         // operator is not undelegating - initializing and undelegating at the
[codex:488300]         // same time is not possible. We do however, need to check whether the
[codex:488300] 
[codex:488300] 
[codex:488300] thinking
[codex:488300] **Analyzing missing access control and approveAndCall exploits**
[codex:488300] 
[codex:488300] I’m investigating missing access controls and potential exploit paths, focusing on the approveAndCall pattern in TokenGrant.receiveApproval. I see attackers might leverage existing token allowances to create grants with immediate unlocks and withdraw tokens to themselves, bypassing msg.sender checks typical in secure implementations. This looks like a concrete vulnerability where an attacker can exploit leftover allowances to profit, especially since receiveApproval lacks verification that calls come from the token contract.
[codex:488300] thinking
[codex:488300] **Confirming vulnerability details and locating code**
[codex:488300] 
[codex:488300] I’m clarifying that approving TokenGrant is unsafe due to unrestricted calls leveraging token allowances, creating a concrete exploit scenario. Now I’m focusing on precisely locating the vulnerable code and line numbers in TokenGrant.sol within the repo, so I can report the issue clearly with file paths and line references.
[codex:488300] exec
[codex:488300] /bin/bash -lc 'rg -n "function receiveApproval" -n contracts/@keep-network/keep-core/contracts/TokenGrant.sol' in /tmp/codex-multi-h68jf3y7 succeeded in 10ms:
[codex:488300] 210:    function receiveApproval(address _from, uint256 _amount, address _token, bytes memory _extraData) public {
[codex:488300] 
[codex:488300] thinking
[codex:488300] **Preparing to locate missing check**
[codex:488300] exec
[codex:488300] /bin/bash -lc "nl -ba contracts/@keep-network/keep-core/contracts/TokenGrant.sol | sed -n '200,260p'" in /tmp/codex-multi-h68jf3y7 succeeded in 6ms:
[codex:488300]    200	    /// @param _token Token contract address.
[codex:488300]    201	    /// @param _extraData This byte array must have the following values ABI encoded:
[codex:488300]    202	    /// grantManager (address) Address of the grant manager.
[codex:488300]    203	    /// grantee (address) Address of the grantee.
[codex:488300]    204	    /// duration (uint256) Duration in seconds of the unlocking period.
[codex:488300]    205	    /// start (uint256) Timestamp at which unlocking will start.
[codex:488300]    206	    /// cliffDuration (uint256) Duration in seconds of the cliff;
[codex:488300]    207	    ///               no tokens will be unlocked until the time `start + cliff`.
[codex:488300]    208	    /// revocable (bool) Whether the token grant is revocable or not (1 or 0).
[codex:488300]    209	    /// stakingPolicy (address) Address of the staking policy for the grant.
[codex:488300]    210	    function receiveApproval(address _from, uint256 _amount, address _token, bytes memory _extraData) public {
[codex:488300]    211	        require(ERC20Burnable(_token) == token, "Token contract must be the same one linked to this contract.");
[codex:488300]    212	        require(_amount <= token.balanceOf(_from), "Sender must have enough amount.");
[codex:488300]    213	        (address _grantManager,
[codex:488300]    214	         address _grantee,
[codex:488300]    215	         uint256 _duration,
[codex:488300]    216	         uint256 _start,
[codex:488300]    217	         uint256 _cliffDuration,
[codex:488300]    218	         bool _revocable,
[codex:488300]    219	         address _stakingPolicy) = abi.decode(
[codex:488300] 
[codex:488300] thinking
[codex:488300] **Analyzing exploit due to missing sender check**
[codex:488300] exec
[codex:488300] /bin/bash -lc "nl -ba contracts/@keep-network/keep-core/contracts/TokenGrant.sol | sed -n '260,320p'" in /tmp/codex-multi-h68jf3y7 succeeded in 6ms:
[codex:488300]    260	    /// @dev Transfers unlocked tokens of the token grant to grantee.
[codex:488300]    261	    /// @param _id Grant ID.
[codex:488300]    262	    function withdraw(uint256 _id) public {
[codex:488300]    263	        uint256 amount = withdrawable(_id);
[codex:488300]    264	        require(amount > 0, "Grant available to withdraw amount should be greater than zero.");
[codex:488300]    265	
[codex:488300]    266	        // Update withdrawn amount.
[codex:488300]    267	        grants[_id].withdrawn = grants[_id].withdrawn.add(amount);
[codex:488300]    268	
[codex:488300]    269	        // Update grantee grants balance.
[codex:488300]    270	        balances[grants[_id].grantee] = balances[grants[_id].grantee].sub(amount);
[codex:488300]    271	
[codex:488300]    272	        // Transfer tokens from this contract balance to the grantee token balance.
[codex:488300]    273	        token.safeTransfer(grants[_id].grantee, amount);
[codex:488300]    274	
[codex:488300]    275	        emit TokenGrantWithdrawn(_id, amount);
[codex:488300]    276	    }
[codex:488300]    277	
[codex:488300]    278	    /// @notice Calculates and returns unlocked grant amount.
[codex:488300]    279	    /// @dev Calculates token grant amount that has already unlocked,
[codex:488300] 
[codex:488300] thinking
[codex:488300] **Summarizing vulnerability report as JSON**
[codex:488300] 
[codex:488300] I'll produce a JSON output detailing a high-severity access control issue in TokenGrant.receiveApproval, including a step-by-step exploit scenario, recommendation to check msg.sender, evidence citing relevant lines, and clear findings following the required schema.
[codex:488300] codex
[codex:488300] {"no_findings":false,"summary":"Found 1 exploitable issue enabling theft of approved tokens via TokenGrant.receiveApproval.","findings":[{"severity":"high","category":"access_control","title":"Arbitrary caller can drain any existing allowance by crafting grants","exploit_scenario":"1) Victim approves TokenGrant to spend X KEEP (e.g., via `approve` in a separate tx before calling it). 2) Attacker calls `TokenGrant.receiveApproval` with `_from` set to the victim, `_amount` <= allowance, and `_extraData` encoding `grantee=attacker`, `duration=0`, `start=0`, `cliffDuration=0` (immediate unlock), `stakingPolicy` any non-zero. 3) TokenGrant pulls X tokens from the victim and creates a fully unlocked grant. 4) Attacker calls `TokenGrant.withdraw(grantId)` (or does it in the same tx via a wrapper) to transfer X KEEP to themselves. Profit: up to the victim’s approved allowance; if users grant unlimited allowance, this can drain their full KEEP balance.","recommendation":"Require `msg.sender == address(token)` in `receiveApproval` (approve-and-call pattern), and optionally reject direct calls by enforcing that only the token contract can invoke it.","evidence":"`receiveApproval` is public and only checks `_token` equality, then uses attacker-controlled `_extraData` and calls `token.safeTransferFrom(_from, address(this), _amount)` without validating `msg.sender`, enabling anyone to consume existing allowances and set themselves as grantee.","locations":["contracts/@keep-network/keep-core/contracts/TokenGrant.sol:210","contracts/@keep-network/keep-core/contracts/TokenGrant.sol:211","contracts/@keep-network/keep-core/contracts/TokenGrant.sol:252","contracts/@keep-network/keep-core/contracts/TokenGrant.sol:262"]}]}
[codex:488300] tokens used
[codex:488300] 97,586
[codex:488300] {"no_findings":false,"summary":"Found 1 exploitable issue enabling theft of approved tokens via TokenGrant.receiveApproval.","findings":[{"severity":"high","category":"access_control","title":"Arbitrary caller can drain any existing allowance by crafting grants","exploit_scenario":"1) Victim approves TokenGrant to spend X KEEP (e.g., via `approve` in a separate tx before calling it). 2) Attacker calls `TokenGrant.receiveApproval` with `_from` set to the victim, `_amount` <= allowance, and `_extraData` encoding `grantee=attacker`, `duration=0`, `start=0`, `cliffDuration=0` (immediate unlock), `stakingPolicy` any non-zero. 3) TokenGrant pulls X tokens from the victim and creates a fully unlocked grant. 4) Attacker calls `TokenGrant.withdraw(grantId)` (or does it in the same tx via a wrapper) to transfer X KEEP to themselves. Profit: up to the victim’s approved allowance; if users grant unlimited allowance, this can drain their full KEEP balance.","recommendation":"Require `msg.sender == address(token)` in `receiveApproval` (approve-and-call pattern), and optionally reject direct calls by enforcing that only the token contract can invoke it.","evidence":"`receiveApproval` is public and only checks `_token` equality, then uses attacker-controlled `_extraData` and calls `token.safeTransferFrom(_from, address(this), _amount)` without validating `msg.sender`, enabling anyone to consume existing allowances and set themselves as grantee.","locations":["contracts/@keep-network/keep-core/contracts/TokenGrant.sol:210","contracts/@keep-network/keep-core/contracts/TokenGrant.sol:211","contracts/@keep-network/keep-core/contracts/TokenGrant.sol:252","contracts/@keep-network/keep-core/contracts/TokenGrant.sol:262"]}]}
Metadata
{
    "codex": {
        "ran_at": "2026-01-02T20:25:04.375523+00:00",
        "returncode": 0
    },
    "summary": "Found 1 exploitable issue enabling theft of approved tokens via TokenGrant.receiveApproval.",
    "raw_final": {
        "summary": "Found 1 exploitable issue enabling theft of approved tokens via TokenGrant.receiveApproval.",
        "findings": [
            {
                "title": "Arbitrary caller can drain any existing allowance by crafting grants",
                "category": "access_control",
                "evidence": "`receiveApproval` is public and only checks `_token` equality, then uses attacker-controlled `_extraData` and calls `token.safeTransferFrom(_from, address(this), _amount)` without validating `msg.sender`, enabling anyone to consume existing allowances and set themselves as grantee.",
                "severity": "high",
                "locations": [
                    "contracts/@keep-network/keep-core/contracts/TokenGrant.sol:210",
                    "contracts/@keep-network/keep-core/contracts/TokenGrant.sol:211",
                    "contracts/@keep-network/keep-core/contracts/TokenGrant.sol:252",
                    "contracts/@keep-network/keep-core/contracts/TokenGrant.sol:262"
                ],
                "recommendation": "Require `msg.sender == address(token)` in `receiveApproval` (approve-and-call pattern), and optionally reject direct calls by enforcing that only the token contract can invoke it.",
                "exploit_scenario": "1) Victim approves TokenGrant to spend X KEEP (e.g., via `approve` in a separate tx before calling it). 2) Attacker calls `TokenGrant.receiveApproval` with `_from` set to the victim, `_amount` <= allowance, and `_extraData` encoding `grantee=attacker`, `duration=0`, `start=0`, `cliffDuration=0` (immediate unlock), `stakingPolicy` any non-zero. 3) TokenGrant pulls X tokens from the victim and creates a fully unlocked grant. 4) Attacker calls `TokenGrant.withdraw(grantId)` (or does it in the same tx via a wrapper) to transfer X KEEP to themselves. Profit: up to the victim\u2019s approved allowance; if users grant unlimited allowance, this can drain their full KEEP balance."
            }
        ],
        "no_findings": false
    },
    "no_findings": false,
    "schema_version": 1
}

Opcode Heuristics

tool.cast_disasm
Delegatecall
0
Selfdestruct
0
CREATE2
0
CALL-family (heavy)
9
EXT*/BALANCE
8
Total opcodes
4300
Flags
heavy_ext_balance_usage
View cast disassembly output
00000000: PUSH1 0x80
00000002: PUSH1 0x40
00000004: MSTORE
00000005: PUSH1 0x04
00000007: CALLDATASIZE
00000008: LT
00000009: PUSH2 0x00f2
0000000c: JUMPI
0000000d: PUSH1 0x00
0000000f: CALLDATALOAD
00000010: PUSH1 0xe0
00000012: SHR
00000013: DUP1
00000014: PUSH4 0x7ab3cf93
00000019: GT
0000001a: PUSH2 0x008a
0000001d: JUMPI
0000001e: DUP1
0000001f: PUSH4 0xd20a62fc
00000024: GT
00000025: PUSH2 0x0059
00000028: JUMPI
00000029: DUP1
0000002a: PUSH4 0xd20a62fc
0000002f: EQ
00000030: PUSH2 0x041b
00000033: JUMPI
00000034: DUP1
00000035: PUSH4 0xef1f9661
0000003a: EQ
0000003b: PUSH2 0x046c
0000003e: JUMPI
0000003f: DUP1
00000040: PUSH4 0xf340fa01
00000045: EQ
00000046: PUSH2 0x04a7
00000049: JUMPI
0000004a: DUP1
0000004b: PUSH4 0xfb1677b1
00000050: EQ
00000051: PUSH2 0x04cd
00000054: JUMPI
00000055: PUSH2 0x00f2
00000058: JUMP
00000059: JUMPDEST
0000005a: DUP1
0000005b: PUSH4 0x7ab3cf93
00000060: EQ
00000061: PUSH2 0x0311
00000064: JUMPI
00000065: DUP1
00000066: PUSH4 0x972f2457
0000006b: EQ
0000006c: PUSH2 0x034a
0000006f: JUMPI
00000070: DUP1
00000071: PUSH4 0xba7bffd3
00000076: EQ
00000077: PUSH2 0x0391
0000007a: JUMPI
0000007b: DUP1
0000007c: PUSH4 0xc5786174
00000081: EQ
00000082: PUSH2 0x03e0
00000085: JUMPI
00000086: PUSH2 0x00f2
00000089: JUMP
0000008a: JUMPDEST
0000008b: DUP1
0000008c: PUSH4 0x446f0f9e
00000091: GT
00000092: PUSH2 0x00c6
00000095: JUMPI
00000096: DUP1
00000097: PUSH4 0x446f0f9e
0000009c: EQ
0000009d: PUSH2 0x020b
000000a0: JUMPI
000000a1: DUP1
000000a2: PUSH4 0x5823cfad
000000a7: EQ
000000a8: PUSH2 0x024e
000000ab: JUMPI
000000ac: DUP1
000000ad: PUSH4 0x5fcac8ff
000000b2: EQ
000000b3: PUSH2 0x0281
000000b6: JUMPI
000000b7: DUP1
000000b8: PUSH4 0x78f011c1
000000bd: EQ
000000be: PUSH2 0x02c2
000000c1: JUMPI
000000c2: PUSH2 0x00f2
000000c5: JUMP
000000c6: JUMPDEST
000000c7: DUP1
000000c8: PUSH3 0xf714ce
000000cc: EQ
000000cd: PUSH2 0x00f7
000000d0: JUMPI
000000d1: DUP1
000000d2: PUSH4 0x0b102471
000000d7: EQ
000000d8: PUSH2 0x0132
000000db: JUMPI
000000dc: DUP1
000000dd: PUSH4 0x0cb0a677
000000e2: EQ
000000e3: PUSH2 0x016d
000000e6: JUMPI
000000e7: DUP1
000000e8: PUSH4 0x42bcb965
000000ed: EQ
000000ee: PUSH2 0x01b4
000000f1: JUMPI
000000f2: JUMPDEST
000000f3: PUSH1 0x00
000000f5: DUP1
000000f6: REVERT
000000f7: JUMPDEST
000000f8: CALLVALUE
000000f9: DUP1
000000fa: ISZERO
000000fb: PUSH2 0x0103
000000fe: JUMPI
000000ff: PUSH1 0x00
00000101: DUP1
00000102: REVERT
00000103: JUMPDEST
00000104: POP
00000105: PUSH2 0x0130
00000108: PUSH1 0x04
0000010a: DUP1
0000010b: CALLDATASIZE
0000010c: SUB
0000010d: PUSH1 0x40
0000010f: DUP2
00000110: LT
00000111: ISZERO
00000112: PUSH2 0x011a
00000115: JUMPI
00000116: PUSH1 0x00
00000118: DUP1
00000119: REVERT
0000011a: JUMPDEST
0000011b: POP
0000011c: DUP1
0000011d: CALLDATALOAD
0000011e: SWAP1
0000011f: PUSH1 0x20
00000121: ADD
00000122: CALLDATALOAD
00000123: PUSH1 0x01
00000125: PUSH1 0x01
00000127: PUSH1 0xa0
00000129: SHL
0000012a: SUB
0000012b: AND
0000012c: PUSH2 0x0500
0000012f: JUMP
00000130: JUMPDEST
00000131: STOP
00000132: JUMPDEST
00000133: CALLVALUE
00000134: DUP1
00000135: ISZERO
00000136: PUSH2 0x013e
00000139: JUMPI
0000013a: PUSH1 0x00
0000013c: DUP1
0000013d: REVERT
0000013e: JUMPDEST
0000013f: POP
00000140: PUSH2 0x0130
00000143: PUSH1 0x04
00000145: DUP1
00000146: CALLDATASIZE
00000147: SUB
00000148: PUSH1 0x40
0000014a: DUP2
0000014b: LT
0000014c: ISZERO
0000014d: PUSH2 0x0155
00000150: JUMPI
00000151: PUSH1 0x00
00000153: DUP1
00000154: REVERT
00000155: JUMPDEST
00000156: POP
00000157: PUSH1 0x01
00000159: PUSH1 0x01
0000015b: PUSH1 0xa0
0000015d: SHL
0000015e: SUB
0000015f: DUP2
00000160: CALLDATALOAD
00000161: DUP2
00000162: AND
00000163: SWAP2
00000164: PUSH1 0x20
00000166: ADD
00000167: CALLDATALOAD
00000168: AND
00000169: PUSH2 0x059f
0000016c: JUMP
0000016d: JUMPDEST
0000016e: CALLVALUE
0000016f: DUP1
00000170: ISZERO
00000171: PUSH2 0x0179
00000174: JUMPI
00000175: PUSH1 0x00
00000177: DUP1
00000178: REVERT
00000179: JUMPDEST
0000017a: POP
0000017b: PUSH2 0x0130
0000017e: PUSH1 0x04
00000180: DUP1
00000181: CALLDATASIZE
00000182: SUB
00000183: PUSH1 0x80
00000185: DUP2
00000186: LT
00000187: ISZERO
00000188: PUSH2 0x0190
0000018b: JUMPI
0000018c: PUSH1 0x00
0000018e: DUP1
0000018f: REVERT
00000190: JUMPDEST
00000191: POP
00000192: PUSH1 0x01
00000194: PUSH1 0x01
00000196: PUSH1 0xa0
00000198: SHL
00000199: SUB
0000019a: DUP2
0000019b: CALLDATALOAD
0000019c: DUP2
0000019d: AND
0000019e: SWAP2
0000019f: PUSH1 0x20
000001a1: DUP2
000001a2: ADD
000001a3: CALLDATALOAD
000001a4: SWAP2
000001a5: PUSH1 0x40
000001a7: DUP3
000001a8: ADD
000001a9: CALLDATALOAD
000001aa: SWAP2
000001ab: PUSH1 0x60
000001ad: ADD
000001ae: CALLDATALOAD
000001af: AND
000001b0: PUSH2 0x0626
000001b3: JUMP
000001b4: JUMPDEST
000001b5: CALLVALUE
000001b6: DUP1
000001b7: ISZERO
000001b8: PUSH2 0x01c0
000001bb: JUMPI
000001bc: PUSH1 0x00
000001be: DUP1
000001bf: REVERT
000001c0: JUMPDEST
000001c1: POP
000001c2: PUSH2 0x01f9
000001c5: PUSH1 0x04
000001c7: DUP1
000001c8: CALLDATASIZE
000001c9: SUB
000001ca: PUSH1 0x60
000001cc: DUP2
000001cd: LT
000001ce: ISZERO
000001cf: PUSH2 0x01d7
000001d2: JUMPI
000001d3: PUSH1 0x00
000001d5: DUP1
000001d6: REVERT
000001d7: JUMPDEST
000001d8: POP
000001d9: PUSH1 0x01
000001db: PUSH1 0x01
000001dd: PUSH1 0xa0
000001df: SHL
000001e0: SUB
000001e1: DUP2
000001e2: CALLDATALOAD
000001e3: DUP2
000001e4: AND
000001e5: SWAP2
000001e6: PUSH1 0x20
000001e8: DUP2
000001e9: ADD
000001ea: CALLDATALOAD
000001eb: DUP3
000001ec: AND
000001ed: SWAP2
000001ee: PUSH1 0x40
000001f0: SWAP1
000001f1: SWAP2
000001f2: ADD
000001f3: CALLDATALOAD
000001f4: AND
000001f5: PUSH2 0x0815
000001f8: JUMP
000001f9: JUMPDEST
000001fa: PUSH1 0x40
000001fc: DUP1
000001fd: MLOAD
000001fe: SWAP2
000001ff: DUP3
00000200: MSTORE
00000201: MLOAD
00000202: SWAP1
00000203: DUP2
00000204: SWAP1
00000205: SUB
00000206: PUSH1 0x20
00000208: ADD
00000209: SWAP1
0000020a: RETURN
0000020b: JUMPDEST
0000020c: CALLVALUE
0000020d: DUP1
0000020e: ISZERO
0000020f: PUSH2 0x0217
00000212: JUMPI
00000213: PUSH1 0x00
00000215: DUP1
00000216: REVERT
00000217: JUMPDEST
00000218: POP
00000219: PUSH2 0x01f9
0000021c: PUSH1 0x04
0000021e: DUP1
0000021f: CALLDATASIZE
00000220: SUB
00000221: PUSH1 0x60
00000223: DUP2
00000224: LT
00000225: ISZERO
00000226: PUSH2 0x022e
00000229: JUMPI
0000022a: PUSH1 0x00
0000022c: DUP1
0000022d: REVERT
0000022e: JUMPDEST
0000022f: POP
00000230: PUSH1 0x01
00000232: PUSH1 0x01
00000234: PUSH1 0xa0
00000236: SHL
00000237: SUB
00000238: DUP2
00000239: CALLDATALOAD
0000023a: DUP2
0000023b: AND
0000023c: SWAP2
0000023d: PUSH1 0x20
0000023f: DUP2
00000240: ADD
00000241: CALLDATALOAD
00000242: SWAP1
00000243: SWAP2
00000244: AND
00000245: SWAP1
00000246: PUSH1 0x40
00000248: ADD
00000249: CALLDATALOAD
0000024a: PUSH2 0x08e0
0000024d: JUMP
0000024e: JUMPDEST
0000024f: CALLVALUE
00000250: DUP1
00000251: ISZERO
00000252: PUSH2 0x025a
00000255: JUMPI
00000256: PUSH1 0x00
00000258: DUP1
00000259: REVERT
0000025a: JUMPDEST
0000025b: POP
0000025c: PUSH2 0x01f9
0000025f: PUSH1 0x04
00000261: DUP1
00000262: CALLDATASIZE
00000263: SUB
00000264: PUSH1 0x20
00000266: DUP2
00000267: LT
00000268: ISZERO
00000269: PUSH2 0x0271
0000026c: JUMPI
0000026d: PUSH1 0x00
0000026f: DUP1
00000270: REVERT
00000271: JUMPDEST
00000272: POP
00000273: CALLDATALOAD
00000274: PUSH1 0x01
00000276: PUSH1 0x01
00000278: PUSH1 0xa0
0000027a: SHL
0000027b: SUB
0000027c: AND
0000027d: PUSH2 0x0938
00000280: JUMP
00000281: JUMPDEST
00000282: CALLVALUE
00000283: DUP1
00000284: ISZERO
00000285: PUSH2 0x028d
00000288: JUMPI
00000289: PUSH1 0x00
0000028b: DUP1
0000028c: REVERT
0000028d: JUMPDEST
0000028e: POP
0000028f: PUSH2 0x0130
00000292: PUSH1 0x04
00000294: DUP1
00000295: CALLDATASIZE
00000296: SUB
00000297: PUSH1 0x60
00000299: DUP2
0000029a: LT
0000029b: ISZERO
0000029c: PUSH2 0x02a4
0000029f: JUMPI
000002a0: PUSH1 0x00
000002a2: DUP1
000002a3: REVERT
000002a4: JUMPDEST
000002a5: POP
000002a6: DUP1
000002a7: CALLDATALOAD
000002a8: SWAP1
000002a9: PUSH1 0x01
000002ab: PUSH1 0x01
000002ad: PUSH1 0xa0
000002af: SHL
000002b0: SUB
000002b1: PUSH1 0x20
000002b3: DUP3
000002b4: ADD
000002b5: CALLDATALOAD
000002b6: DUP2
000002b7: AND
000002b8: SWAP2
000002b9: PUSH1 0x40
000002bb: ADD
000002bc: CALLDATALOAD
000002bd: AND
000002be: PUSH2 0x094a
000002c1: JUMP
000002c2: JUMPDEST
000002c3: CALLVALUE
000002c4: DUP1
000002c5: ISZERO
000002c6: PUSH2 0x02ce
000002c9: JUMPI
000002ca: PUSH1 0x00
000002cc: DUP1
000002cd: REVERT
000002ce: JUMPDEST
000002cf: POP
000002d0: PUSH2 0x02fd
000002d3: PUSH1 0x04
000002d5: DUP1
000002d6: CALLDATASIZE
000002d7: SUB
000002d8: PUSH1 0x40
000002da: DUP2
000002db: LT
000002dc: ISZERO
000002dd: PUSH2 0x02e5
000002e0: JUMPI
000002e1: PUSH1 0x00
000002e3: DUP1
000002e4: REVERT
000002e5: JUMPDEST
000002e6: POP
000002e7: PUSH1 0x01
000002e9: PUSH1 0x01
000002eb: PUSH1 0xa0
000002ed: SHL
000002ee: SUB
000002ef: DUP2
000002f0: CALLDATALOAD
000002f1: DUP2
000002f2: AND
000002f3: SWAP2
000002f4: PUSH1 0x20
000002f6: ADD
000002f7: CALLDATALOAD
000002f8: AND
000002f9: PUSH2 0x09b5
000002fc: JUMP
000002fd: JUMPDEST
000002fe: PUSH1 0x40
00000300: DUP1
00000301: MLOAD
00000302: SWAP2
00000303: ISZERO
00000304: ISZERO
00000305: DUP3
00000306: MSTORE
00000307: MLOAD
00000308: SWAP1
00000309: DUP2
0000030a: SWAP1
0000030b: SUB
0000030c: PUSH1 0x20
0000030e: ADD
0000030f: SWAP1
00000310: RETURN
00000311: JUMPDEST
00000312: CALLVALUE
00000313: DUP1
00000314: ISZERO
00000315: PUSH2 0x031d
00000318: JUMPI
00000319: PUSH1 0x00
0000031b: DUP1
0000031c: REVERT
0000031d: JUMPDEST
0000031e: POP
0000031f: PUSH2 0x0130
00000322: PUSH1 0x04
00000324: DUP1
00000325: CALLDATASIZE
00000326: SUB
00000327: PUSH1 0x40
00000329: DUP2
0000032a: LT
0000032b: ISZERO
0000032c: PUSH2 0x0334
0000032f: JUMPI
00000330: PUSH1 0x00
00000332: DUP1
00000333: REVERT
00000334: JUMPDEST
00000335: POP
00000336: PUSH1 0x01
00000338: PUSH1 0x01
0000033a: PUSH1 0xa0
0000033c: SHL
0000033d: SUB
0000033e: DUP2
0000033f: CALLDATALOAD
00000340: AND
00000341: SWAP1
00000342: PUSH1 0x20
00000344: ADD
00000345: CALLDATALOAD
00000346: PUSH2 0x09e5
00000349: JUMP
0000034a: JUMPDEST
0000034b: CALLVALUE
0000034c: DUP1
0000034d: ISZERO
0000034e: PUSH2 0x0356
00000351: JUMPI
00000352: PUSH1 0x00
00000354: DUP1
00000355: REVERT
00000356: JUMPDEST
00000357: POP
00000358: PUSH2 0x0130
0000035b: PUSH1 0x04
0000035d: DUP1
0000035e: CALLDATASIZE
0000035f: SUB
00000360: PUSH1 0x80
00000362: DUP2
00000363: LT
00000364: ISZERO
00000365: PUSH2 0x036d
00000368: JUMPI
00000369: PUSH1 0x00
0000036b: DUP1
0000036c: REVERT
0000036d: JUMPDEST
0000036e: POP
0000036f: PUSH1 0x01
00000371: PUSH1 0x01
00000373: PUSH1 0xa0
00000375: SHL
00000376: SUB
00000377: DUP2
00000378: CALLDATALOAD
00000379: DUP2
0000037a: AND
0000037b: SWAP2
0000037c: PUSH1 0x20
0000037e: DUP2
0000037f: ADD
00000380: CALLDATALOAD
00000381: SWAP2
00000382: PUSH1 0x40
00000384: DUP3
00000385: ADD
00000386: CALLDATALOAD
00000387: AND
00000388: SWAP1
00000389: PUSH1 0x60
0000038b: ADD
0000038c: CALLDATALOAD
0000038d: PUSH2 0x0b08
00000390: JUMP
00000391: JUMPDEST
00000392: CALLVALUE
00000393: DUP1
00000394: ISZERO
00000395: PUSH2 0x039d
00000398: JUMPI
00000399: PUSH1 0x00
0000039b: DUP1
0000039c: REVERT
0000039d: JUMPDEST
0000039e: POP
0000039f: PUSH2 0x03c4
000003a2: PUSH1 0x04
000003a4: DUP1
000003a5: CALLDATASIZE
000003a6: SUB
000003a7: PUSH1 0x20
000003a9: DUP2
000003aa: LT
000003ab: ISZERO
000003ac: PUSH2 0x03b4
000003af: JUMPI
000003b0: PUSH1 0x00
000003b2: DUP1
000003b3: REVERT
000003b4: JUMPDEST
000003b5: POP
000003b6: CALLDATALOAD
000003b7: PUSH1 0x01
000003b9: PUSH1 0x01
000003bb: PUSH1 0xa0
000003bd: SHL
000003be: SUB
000003bf: AND
000003c0: PUSH2 0x0ca7
000003c3: JUMP
000003c4: JUMPDEST
000003c5: PUSH1 0x40
000003c7: DUP1
000003c8: MLOAD
000003c9: PUSH1 0x01
000003cb: PUSH1 0x01
000003cd: PUSH1 0xa0
000003cf: SHL
000003d0: SUB
000003d1: SWAP1
000003d2: SWAP3
000003d3: AND
000003d4: DUP3
000003d5: MSTORE
000003d6: MLOAD
000003d7: SWAP1
000003d8: DUP2
000003d9: SWAP1
000003da: SUB
000003db: PUSH1 0x20
000003dd: ADD
000003de: SWAP1
000003df: RETURN
000003e0: JUMPDEST
000003e1: CALLVALUE
000003e2: DUP1
000003e3: ISZERO
000003e4: PUSH2 0x03ec
000003e7: JUMPI
000003e8: PUSH1 0x00
000003ea: DUP1
000003eb: REVERT
000003ec: JUMPDEST
000003ed: POP
000003ee: PUSH2 0x0130
000003f1: PUSH1 0x04
000003f3: DUP1
000003f4: CALLDATASIZE
000003f5: SUB
000003f6: PUSH1 0x40
000003f8: DUP2
000003f9: LT
000003fa: ISZERO
000003fb: PUSH2 0x0403
000003fe: JUMPI
000003ff: PUSH1 0x00
00000401: DUP1
00000402: REVERT
00000403: JUMPDEST
00000404: POP
00000405: PUSH1 0x01
00000407: PUSH1 0x01
00000409: PUSH1 0xa0
0000040b: SHL
0000040c: SUB
0000040d: DUP2
0000040e: CALLDATALOAD
0000040f: DUP2
00000410: AND
00000411: SWAP2
00000412: PUSH1 0x20
00000414: ADD
00000415: CALLDATALOAD
00000416: AND
00000417: PUSH2 0x0d2c
0000041a: JUMP
0000041b: JUMPDEST
0000041c: CALLVALUE
0000041d: DUP1
0000041e: ISZERO
0000041f: PUSH2 0x0427
00000422: JUMPI
00000423: PUSH1 0x00
00000425: DUP1
00000426: REVERT
00000427: JUMPDEST
00000428: POP
00000429: PUSH2 0x0130
0000042c: PUSH1 0x04
0000042e: DUP1
0000042f: CALLDATASIZE
00000430: SUB
00000431: PUSH1 0xa0
00000433: DUP2
00000434: LT
00000435: ISZERO
00000436: PUSH2 0x043e
00000439: JUMPI
0000043a: PUSH1 0x00
0000043c: DUP1
0000043d: REVERT
0000043e: JUMPDEST
0000043f: POP
00000440: PUSH1 0x01
00000442: PUSH1 0x01
00000444: PUSH1 0xa0
00000446: SHL
00000447: SUB
00000448: DUP2
00000449: CALLDATALOAD
0000044a: DUP2
0000044b: AND
0000044c: SWAP2
0000044d: PUSH1 0x20
0000044f: DUP2
00000450: ADD
00000451: CALLDATALOAD
00000452: DUP3
00000453: AND
00000454: SWAP2
00000455: PUSH1 0x40
00000457: DUP3
00000458: ADD
00000459: CALLDATALOAD
0000045a: SWAP2
0000045b: PUSH1 0x60
0000045d: DUP2
0000045e: ADD
0000045f: CALLDATALOAD
00000460: SWAP2
00000461: PUSH1 0x80
00000463: SWAP1
00000464: SWAP2
00000465: ADD
00000466: CALLDATALOAD
00000467: AND
00000468: PUSH2 0x0db6
0000046b: JUMP
0000046c: JUMPDEST
0000046d: CALLVALUE
0000046e: DUP1
0000046f: ISZERO
00000470: PUSH2 0x0478
00000473: JUMPI
00000474: PUSH1 0x00
00000476: DUP1
00000477: REVERT
00000478: JUMPDEST
00000479: POP
0000047a: PUSH2 0x02fd
0000047d: PUSH1 0x04
0000047f: DUP1
00000480: CALLDATASIZE
00000481: SUB
00000482: PUSH1 0x40
00000484: DUP2
00000485: LT
00000486: ISZERO
00000487: PUSH2 0x048f
0000048a: JUMPI
0000048b: PUSH1 0x00
0000048d: DUP1
0000048e: REVERT
0000048f: JUMPDEST
00000490: POP
00000491: PUSH1 0x01
00000493: PUSH1 0x01
00000495: PUSH1 0xa0
00000497: SHL
00000498: SUB
00000499: DUP2
0000049a: CALLDATALOAD
0000049b: DUP2
0000049c: AND
0000049d: SWAP2
0000049e: PUSH1 0x20
000004a0: ADD
000004a1: CALLDATALOAD
000004a2: AND
000004a3: PUSH2 0x0f86
000004a6: JUMP
000004a7: JUMPDEST
000004a8: PUSH2 0x0130
000004ab: PUSH1 0x04
000004ad: DUP1
000004ae: CALLDATASIZE
000004af: SUB
000004b0: PUSH1 0x20
000004b2: DUP2
000004b3: LT
000004b4: ISZERO
000004b5: PUSH2 0x04bd
000004b8: JUMPI
000004b9: PUSH1 0x00
000004bb: DUP1
000004bc: REVERT
000004bd: JUMPDEST
000004be: POP
000004bf: CALLDATALOAD
000004c0: PUSH1 0x01
000004c2: PUSH1 0x01
000004c4: PUSH1 0xa0
000004c6: SHL
000004c7: SUB
000004c8: AND
000004c9: PUSH2 0x1014
000004cc: JUMP
000004cd: JUMPDEST
000004ce: CALLVALUE
000004cf: DUP1
000004d0: ISZERO
000004d1: PUSH2 0x04d9
000004d4: JUMPI
000004d5: PUSH1 0x00
000004d7: DUP1
000004d8: REVERT
000004d9: JUMPDEST
000004da: POP
000004db: PUSH2 0x03c4
000004de: PUSH1 0x04
000004e0: DUP1
000004e1: CALLDATASIZE
000004e2: SUB
000004e3: PUSH1 0x20
000004e5: DUP2
000004e6: LT
000004e7: ISZERO
000004e8: PUSH2 0x04f0
000004eb: JUMPI
000004ec: PUSH1 0x00
000004ee: DUP1
000004ef: REVERT
000004f0: JUMPDEST
000004f1: POP
000004f2: CALLDATALOAD
000004f3: PUSH1 0x01
000004f5: PUSH1 0x01
000004f7: PUSH1 0xa0
000004f9: SHL
000004fa: SUB
000004fb: AND
000004fc: PUSH2 0x10ec
000004ff: JUMP
00000500: JUMPDEST
00000501: CALLER
00000502: PUSH1 0x01
00000504: PUSH1 0x01
00000506: PUSH1 0xa0
00000508: SHL
00000509: SUB
0000050a: DUP3
0000050b: AND
0000050c: EQ
0000050d: DUP1
0000050e: PUSH2 0x0531
00000511: JUMPI
00000512: POP
00000513: PUSH1 0x04
00000515: SLOAD
00000516: PUSH2 0x0531
00000519: SWAP1
0000051a: CALLER
0000051b: SWAP1
0000051c: DUP4
0000051d: SWAP1
0000051e: PUSH1 0x01
00000520: PUSH1 0x01
00000522: PUSH1 0xa0
00000524: SHL
00000525: SUB
00000526: AND
00000527: PUSH4 0xffffffff
0000052c: PUSH2 0x113f
0000052f: AND
00000530: JUMP
00000531: JUMPDEST
00000532: DUP1
00000533: PUSH2 0x0556
00000536: JUMPI
00000537: POP
00000538: PUSH1 0x05
0000053a: SLOAD
0000053b: PUSH2 0x0556
0000053e: SWAP1
0000053f: CALLER
00000540: SWAP1
00000541: DUP4
00000542: SWAP1
00000543: PUSH1 0x01
00000545: PUSH1 0x01
00000547: PUSH1 0xa0
00000549: SHL
0000054a: SUB
0000054b: AND
0000054c: PUSH4 0xffffffff
00000551: PUSH2 0x11df
00000554: AND
00000555: JUMP
00000556: JUMPDEST
00000557: PUSH2 0x0591
0000055a: JUMPI
0000055b: PUSH1 0x40
0000055d: MLOAD
0000055e: PUSH3 0x461bcd
00000562: PUSH1 0xe5
00000564: SHL
00000565: DUP2
00000566: MSTORE
00000567: PUSH1 0x04
00000569: ADD
0000056a: DUP1
0000056b: DUP1
0000056c: PUSH1 0x20
0000056e: ADD
0000056f: DUP3
00000570: DUP2
00000571: SUB
00000572: DUP3
00000573: MSTORE
00000574: PUSH1 0x36
00000576: DUP2
00000577: MSTORE
00000578: PUSH1 0x20
0000057a: ADD
0000057b: DUP1
0000057c: PUSH2 0x1895
0000057f: PUSH1 0x36
00000581: SWAP2
00000582: CODECOPY
00000583: PUSH1 0x40
00000585: ADD
00000586: SWAP2
00000587: POP
00000588: POP
00000589: PUSH1 0x40
0000058b: MLOAD
0000058c: DUP1
0000058d: SWAP2
0000058e: SUB
0000058f: SWAP1
00000590: REVERT
00000591: JUMPDEST
00000592: PUSH2 0x059b
00000595: DUP3
00000596: DUP3
00000597: PUSH2 0x1320
0000059a: JUMP
0000059b: JUMPDEST
0000059c: POP
0000059d: POP
0000059e: JUMP
0000059f: JUMPDEST
000005a0: CALLER
000005a1: PUSH2 0x05a9
000005a4: DUP4
000005a5: PUSH2 0x10ec
000005a8: JUMP
000005a9: JUMPDEST
000005aa: PUSH1 0x01
000005ac: PUSH1 0x01
000005ae: PUSH1 0xa0
000005b0: SHL
000005b1: SUB
000005b2: AND
000005b3: EQ
000005b4: PUSH2 0x05f5
000005b7: JUMPI
000005b8: PUSH1 0x40
000005ba: DUP1
000005bb: MLOAD
000005bc: PUSH3 0x461bcd
000005c0: PUSH1 0xe5
000005c2: SHL
000005c3: DUP2
000005c4: MSTORE
000005c5: PUSH1 0x20
000005c7: PUSH1 0x04
000005c9: DUP3
000005ca: ADD
000005cb: MSTORE
000005cc: PUSH1 0x0e
000005ce: PUSH1 0x24
000005d0: DUP3
000005d1: ADD
000005d2: MSTORE
000005d3: PUSH14 0x139bdd08185d5d1a1bdc9a5e9959
000005e2: PUSH1 0x92
000005e4: SHL
000005e5: PUSH1 0x44
000005e7: DUP3
000005e8: ADD
000005e9: MSTORE
000005ea: SWAP1
000005eb: MLOAD
000005ec: SWAP1
000005ed: DUP2
000005ee: SWAP1
000005ef: SUB
000005f0: PUSH1 0x64
000005f2: ADD
000005f3: SWAP1
000005f4: REVERT
000005f5: JUMPDEST
000005f6: PUSH1 0x01
000005f8: PUSH1 0x01
000005fa: PUSH1 0xa0
000005fc: SHL
000005fd: SUB
000005fe: SWAP2
000005ff: DUP3
00000600: AND
00000601: PUSH1 0x00
00000603: SWAP1
00000604: DUP2
00000605: MSTORE
00000606: PUSH1 0x03
00000608: PUSH1 0x20
0000060a: SWAP1
0000060b: DUP2
0000060c: MSTORE
0000060d: PUSH1 0x40
0000060f: DUP1
00000610: DUP4
00000611: KECCAK256
00000612: SWAP4
00000613: SWAP1
00000614: SWAP5
00000615: AND
00000616: DUP3
00000617: MSTORE
00000618: SWAP2
00000619: SWAP1
0000061a: SWAP2
0000061b: MSTORE
0000061c: KECCAK256
0000061d: DUP1
0000061e: SLOAD
0000061f: PUSH1 0xff
00000621: NOT
00000622: AND
00000623: SWAP1
00000624: SSTORE
00000625: JUMP
00000626: JUMPDEST
00000627: PUSH1 0x00
00000629: DUP3
0000062a: GT
0000062b: PUSH2 0x0665
0000062e: JUMPI
0000062f: PUSH1 0x40
00000631: MLOAD
00000632: PUSH3 0x461bcd
00000636: PUSH1 0xe5
00000638: SHL
00000639: DUP2
0000063a: MSTORE
0000063b: PUSH1 0x04
0000063d: ADD
0000063e: DUP1
0000063f: DUP1
00000640: PUSH1 0x20
00000642: ADD
00000643: DUP3
00000644: DUP2
00000645: SUB
00000646: DUP3
00000647: MSTORE
00000648: PUSH1 0x2c
0000064a: DUP2
0000064b: MSTORE
0000064c: PUSH1 0x20
0000064e: ADD
0000064f: DUP1
00000650: PUSH2 0x1869
00000653: PUSH1 0x2c
00000655: SWAP2
00000656: CODECOPY
00000657: PUSH1 0x40
00000659: ADD
0000065a: SWAP2
0000065b: POP
0000065c: POP
0000065d: PUSH1 0x40
0000065f: MLOAD
00000660: DUP1
00000661: SWAP2
00000662: SUB
00000663: SWAP1
00000664: REVERT
00000665: JUMPDEST
00000666: PUSH1 0x40
00000668: DUP1
00000669: MLOAD
0000066a: PUSH1 0x60
0000066c: DUP7
0000066d: DUP2
0000066e: SHL
0000066f: PUSH1 0x01
00000671: PUSH1 0x01
00000673: PUSH1 0x60
00000675: SHL
00000676: SUB
00000677: NOT
00000678: AND
00000679: PUSH1 0x20
0000067b: DUP1
0000067c: DUP5
0000067d: ADD
0000067e: SWAP2
0000067f: SWAP1
00000680: SWAP2
00000681: MSTORE
00000682: CALLER
00000683: SWAP2
00000684: DUP3
00000685: SWAP1
00000686: SHL
00000687: PUSH1 0x34
00000689: DUP5
0000068a: ADD
0000068b: MSTORE
0000068c: PUSH1 0x48
0000068e: DUP1
0000068f: DUP5
00000690: ADD
00000691: DUP9
00000692: SWAP1
00000693: MSTORE
00000694: DUP5
00000695: MLOAD
00000696: DUP1
00000697: DUP6
00000698: SUB
00000699: SWAP1
0000069a: SWAP2
0000069b: ADD
0000069c: DUP2
0000069d: MSTORE
0000069e: PUSH1 0x68
000006a0: SWAP1
000006a1: SWAP4
000006a2: ADD
000006a3: DUP5
000006a4: MSTORE
000006a5: DUP3
000006a6: MLOAD
000006a7: SWAP3
000006a8: DUP2
000006a9: ADD
000006aa: SWAP3
000006ab: SWAP1
000006ac: SWAP3
000006ad: KECCAK256
000006ae: PUSH1 0x00
000006b0: DUP2
000006b1: DUP2
000006b2: MSTORE
000006b3: PUSH1 0x02
000006b5: SWAP1
000006b6: SWAP4
000006b7: MSTORE
000006b8: SWAP3
000006b9: SWAP1
000006ba: SWAP2
000006bb: KECCAK256
000006bc: SLOAD
000006bd: SWAP1
000006be: SWAP2
000006bf: SWAP1
000006c0: DUP5
000006c1: GT
000006c2: ISZERO
000006c3: PUSH2 0x06fd
000006c6: JUMPI
000006c7: PUSH1 0x40
000006c9: MLOAD
000006ca: PUSH3 0x461bcd
000006ce: PUSH1 0xe5
000006d0: SHL
000006d1: DUP2
000006d2: MSTORE
000006d3: PUSH1 0x04
000006d5: ADD
000006d6: DUP1
000006d7: DUP1
000006d8: PUSH1 0x20
000006da: ADD
000006db: DUP3
000006dc: DUP2
000006dd: SUB
000006de: DUP3
000006df: MSTORE
000006e0: PUSH1 0x29
000006e2: DUP2
000006e3: MSTORE
000006e4: PUSH1 0x20
000006e6: ADD
000006e7: DUP1
000006e8: PUSH2 0x1818
000006eb: PUSH1 0x29
000006ed: SWAP2
000006ee: CODECOPY
000006ef: PUSH1 0x40
000006f1: ADD
000006f2: SWAP2
000006f3: POP
000006f4: POP
000006f5: PUSH1 0x40
000006f7: MLOAD
000006f8: DUP1
000006f9: SWAP2
000006fa: SUB
000006fb: SWAP1
000006fc: REVERT
000006fd: JUMPDEST
000006fe: PUSH1 0x00
00000700: DUP2
00000701: DUP2
00000702: MSTORE
00000703: PUSH1 0x02
00000705: PUSH1 0x20
00000707: MSTORE
00000708: PUSH1 0x40
0000070a: SWAP1
0000070b: KECCAK256
0000070c: SLOAD
0000070d: PUSH2 0x071c
00000710: SWAP1
00000711: DUP6
00000712: PUSH4 0xffffffff
00000717: PUSH2 0x14c7
0000071a: AND
0000071b: JUMP
0000071c: JUMPDEST
0000071d: PUSH1 0x00
0000071f: DUP3
00000720: DUP2
00000721: MSTORE
00000722: PUSH1 0x02
00000724: PUSH1 0x20
00000726: MSTORE
00000727: PUSH1 0x40
00000729: DUP1
0000072a: DUP3
0000072b: KECCAK256
0000072c: SWAP3
0000072d: SWAP1
0000072e: SWAP3
0000072f: SSTORE
00000730: SWAP1
00000731: MLOAD
00000732: PUSH1 0x01
00000734: PUSH1 0x01
00000736: PUSH1 0xa0
00000738: SHL
00000739: SUB
0000073a: DUP6
0000073b: AND
0000073c: SWAP1
0000073d: DUP7
0000073e: SWAP1
0000073f: DUP4
00000740: DUP2
00000741: DUP2
00000742: DUP2
00000743: DUP6
00000744: DUP8
00000745: GAS
00000746: CALL
00000747: SWAP3
00000748: POP
00000749: POP
0000074a: POP
0000074b: RETURNDATASIZE
0000074c: DUP1
0000074d: PUSH1 0x00
0000074f: DUP2
00000750: EQ
00000751: PUSH2 0x0776
00000754: JUMPI
00000755: PUSH1 0x40
00000757: MLOAD
00000758: SWAP2
00000759: POP
0000075a: PUSH1 0x1f
0000075c: NOT
0000075d: PUSH1 0x3f
0000075f: RETURNDATASIZE
00000760: ADD
00000761: AND
00000762: DUP3
00000763: ADD
00000764: PUSH1 0x40
00000766: MSTORE
00000767: RETURNDATASIZE
00000768: DUP3
00000769: MSTORE
0000076a: RETURNDATASIZE
0000076b: PUSH1 0x00
0000076d: PUSH1 0x20
0000076f: DUP5
00000770: ADD
00000771: RETURNDATACOPY
00000772: PUSH2 0x077b
00000775: JUMP
00000776: JUMPDEST
00000777: PUSH1 0x60
00000779: SWAP2
0000077a: POP
0000077b: JUMPDEST
0000077c: POP
0000077d: POP
0000077e: SWAP1
0000077f: POP
00000780: DUP1
00000781: PUSH2 0x07c3
00000784: JUMPI
00000785: PUSH1 0x40
00000787: DUP1
00000788: MLOAD
00000789: PUSH3 0x461bcd
0000078d: PUSH1 0xe5
0000078f: SHL
00000790: DUP2
00000791: MSTORE
00000792: PUSH1 0x20
00000794: PUSH1 0x04
00000796: DUP3
00000797: ADD
00000798: MSTORE
00000799: PUSH1 0x0f
0000079b: PUSH1 0x24
0000079d: DUP3
0000079e: ADD
0000079f: MSTORE
000007a0: PUSH15 0x151c985b9cd9995c8819985a5b1959
000007b0: PUSH1 0x8a
000007b2: SHL
000007b3: PUSH1 0x44
000007b5: DUP3
000007b6: ADD
000007b7: MSTORE
000007b8: SWAP1
000007b9: MLOAD
000007ba: SWAP1
000007bb: DUP2
000007bc: SWAP1
000007bd: SUB
000007be: PUSH1 0x64
000007c0: ADD
000007c1: SWAP1
000007c2: REVERT
000007c3: JUMPDEST
000007c4: PUSH1 0x40
000007c6: DUP1
000007c7: MLOAD
000007c8: PUSH1 0x01
000007ca: PUSH1 0x01
000007cc: PUSH1 0xa0
000007ce: SHL
000007cf: SUB
000007d0: DUP7
000007d1: DUP2
000007d2: AND
000007d3: DUP3
000007d4: MSTORE
000007d5: PUSH1 0x20
000007d7: DUP3
000007d8: ADD
000007d9: DUP9
000007da: SWAP1
000007db: MSTORE
000007dc: DUP3
000007dd: MLOAD
000007de: DUP10
000007df: SWAP4
000007e0: SWAP2
000007e1: DUP12
000007e2: AND
000007e3: SWAP3
000007e4: PUSH32 0xf8e947b47b515d01aa96426822ddcf23a08f42d8c2dbfd65e674ba824f551382
00000805: SWAP3
00000806: SWAP1
00000807: DUP3
00000808: SWAP1
00000809: SUB
0000080a: ADD
0000080b: SWAP1
0000080c: LOG3
0000080d: POP
0000080e: POP
0000080f: POP
00000810: POP
00000811: POP
00000812: POP
00000813: POP
00000814: JUMP
00000815: JUMPDEST
00000816: PUSH1 0x00
00000818: DUP1
00000819: SLOAD
0000081a: PUSH1 0x40
0000081c: DUP1
0000081d: MLOAD
0000081e: PUSH4 0x84d57689
00000823: PUSH1 0xe0
00000825: SHL
00000826: DUP2
00000827: MSTORE
00000828: PUSH1 0x01
0000082a: PUSH1 0x01
0000082c: PUSH1 0xa0
0000082e: SHL
0000082f: SUB
00000830: DUP7
00000831: DUP2
00000832: AND
00000833: PUSH1 0x04
00000835: DUP4
00000836: ADD
00000837: MSTORE
00000838: SWAP2
00000839: MLOAD
0000083a: SWAP2
0000083b: SWAP1
0000083c: SWAP3
0000083d: AND
0000083e: SWAP2
0000083f: PUSH4 0x84d57689
00000844: SWAP2
00000845: PUSH1 0x24
00000847: DUP1
00000848: DUP4
00000849: ADD
0000084a: SWAP3
0000084b: PUSH1 0x20
0000084d: SWAP3
0000084e: SWAP2
0000084f: SWAP1
00000850: DUP3
00000851: SWAP1
00000852: SUB
00000853: ADD
00000854: DUP2
00000855: DUP7
00000856: DUP1
00000857: EXTCODESIZE
00000858: ISZERO
00000859: DUP1
0000085a: ISZERO
0000085b: PUSH2 0x0863
0000085e: JUMPI
0000085f: PUSH1 0x00
00000861: DUP1
00000862: REVERT
00000863: JUMPDEST
00000864: POP
00000865: GAS
00000866: STATICCALL
00000867: ISZERO
00000868: DUP1
00000869: ISZERO
0000086a: PUSH2 0x0877
0000086d: JUMPI
0000086e: RETURNDATASIZE
0000086f: PUSH1 0x00
00000871: DUP1
00000872: RETURNDATACOPY
00000873: RETURNDATASIZE
00000874: PUSH1 0x00
00000876: REVERT
00000877: JUMPDEST
00000878: POP
00000879: POP
0000087a: POP
0000087b: POP
0000087c: PUSH1 0x40
0000087e: MLOAD
0000087f: RETURNDATASIZE
00000880: PUSH1 0x20
00000882: DUP2
00000883: LT
00000884: ISZERO
00000885: PUSH2 0x088d
00000888: JUMPI
00000889: PUSH1 0x00
0000088b: DUP1
0000088c: REVERT
0000088d: JUMPDEST
0000088e: POP
0000088f: MLOAD
00000890: DUP1
00000891: ISZERO
00000892: PUSH2 0x08a0
00000895: JUMPI
00000896: POP
00000897: PUSH2 0x08a0
0000089a: DUP5
0000089b: DUP5
0000089c: PUSH2 0x0f86
0000089f: JUMP
000008a0: JUMPDEST
000008a1: DUP1
000008a2: ISZERO
000008a3: PUSH2 0x08b1
000008a6: JUMPI
000008a7: POP
000008a8: PUSH2 0x08b1
000008ab: DUP5
000008ac: DUP4
000008ad: PUSH2 0x09b5
000008b0: JUMP
000008b1: JUMPDEST
000008b2: ISZERO
000008b3: PUSH2 0x08d5
000008b6: JUMPI
000008b7: POP
000008b8: PUSH1 0x01
000008ba: PUSH1 0x01
000008bc: PUSH1 0xa0
000008be: SHL
000008bf: SUB
000008c0: DUP4
000008c1: AND
000008c2: PUSH1 0x00
000008c4: SWAP1
000008c5: DUP2
000008c6: MSTORE
000008c7: PUSH1 0x01
000008c9: PUSH1 0x20
000008cb: MSTORE
000008cc: PUSH1 0x40
000008ce: SWAP1
000008cf: KECCAK256
000008d0: SLOAD
000008d1: PUSH2 0x08d9
000008d4: JUMP
000008d5: JUMPDEST
000008d6: POP
000008d7: PUSH1 0x00
000008d9: JUMPDEST
000008da: SWAP4
000008db: SWAP3
000008dc: POP
000008dd: POP
000008de: POP
000008df: JUMP
000008e0: JUMPDEST
000008e1: PUSH1 0x40
000008e3: DUP1
000008e4: MLOAD
000008e5: PUSH1 0x01
000008e7: PUSH1 0x01
000008e9: PUSH1 0x60
000008eb: SHL
000008ec: SUB
000008ed: NOT
000008ee: PUSH1 0x60
000008f0: SWAP6
000008f1: DUP7
000008f2: SHL
000008f3: DUP2
000008f4: AND
000008f5: PUSH1 0x20
000008f7: DUP1
000008f8: DUP5
000008f9: ADD
000008fa: SWAP2
000008fb: SWAP1
000008fc: SWAP2
000008fd: MSTORE
000008fe: SWAP5
000008ff: SWAP1
00000900: SWAP6
00000901: SHL
00000902: SWAP1
00000903: SWAP5
00000904: AND
00000905: PUSH1 0x34
00000907: DUP6
00000908: ADD
00000909: MSTORE
0000090a: PUSH1 0x48
0000090c: DUP1
0000090d: DUP6
0000090e: ADD
0000090f: SWAP3
00000910: SWAP1
00000911: SWAP3
00000912: MSTORE
00000913: DUP1
00000914: MLOAD
00000915: DUP1
00000916: DUP6
00000917: SUB
00000918: SWAP1
00000919: SWAP3
0000091a: ADD
0000091b: DUP3
0000091c: MSTORE
0000091d: PUSH1 0x68
0000091f: SWAP1
00000920: SWAP4
00000921: ADD
00000922: DUP4
00000923: MSTORE
00000924: DUP1
00000925: MLOAD
00000926: SWAP1
00000927: DUP3
00000928: ADD
00000929: KECCAK256
0000092a: PUSH1 0x00
0000092c: SWAP1
0000092d: DUP2
0000092e: MSTORE
0000092f: PUSH1 0x02
00000931: SWAP1
00000932: SWAP2
00000933: MSTORE
00000934: KECCAK256
00000935: SLOAD
00000936: SWAP1
00000937: JUMP
00000938: JUMPDEST
00000939: PUSH1 0x01
0000093b: PUSH1 0x20
0000093d: MSTORE
0000093e: PUSH1 0x00
00000940: SWAP1
00000941: DUP2
00000942: MSTORE
00000943: PUSH1 0x40
00000945: SWAP1
00000946: KECCAK256
00000947: SLOAD
00000948: DUP2
00000949: JUMP
0000094a: JUMPDEST
0000094b: PUSH1 0x05
0000094d: SLOAD
0000094e: PUSH2 0x096b
00000951: SWAP1
00000952: CALLER
00000953: SWAP1
00000954: DUP5
00000955: SWAP1
00000956: DUP5
00000957: SWAP1
00000958: PUSH1 0x01
0000095a: PUSH1 0x01
0000095c: PUSH1 0xa0
0000095e: SHL
0000095f: SUB
00000960: AND
00000961: PUSH4 0xffffffff
00000966: PUSH2 0x1524
00000969: AND
0000096a: JUMP
0000096b: JUMPDEST
0000096c: PUSH2 0x09a6
0000096f: JUMPI
00000970: PUSH1 0x40
00000972: MLOAD
00000973: PUSH3 0x461bcd
00000977: PUSH1 0xe5
00000979: SHL
0000097a: DUP2
0000097b: MSTORE
0000097c: PUSH1 0x04
0000097e: ADD
0000097f: DUP1
00000980: DUP1
00000981: PUSH1 0x20
00000983: ADD
00000984: DUP3
00000985: DUP2
00000986: SUB
00000987: DUP3
00000988: MSTORE
00000989: PUSH1 0x28
0000098b: DUP2
0000098c: MSTORE
0000098d: PUSH1 0x20
0000098f: ADD
00000990: DUP1
00000991: PUSH2 0x1841
00000994: PUSH1 0x28
00000996: SWAP2
00000997: CODECOPY
00000998: PUSH1 0x40
0000099a: ADD
0000099b: SWAP2
0000099c: POP
0000099d: POP
0000099e: PUSH1 0x40
000009a0: MLOAD
000009a1: DUP1
000009a2: SWAP2
000009a3: SUB
000009a4: SWAP1
000009a5: REVERT
000009a6: JUMPDEST
000009a7: PUSH2 0x09b0
000009aa: DUP4
000009ab: DUP4
000009ac: PUSH2 0x1320
000009af: JUMP
000009b0: JUMPDEST
000009b1: POP
000009b2: POP
000009b3: POP
000009b4: JUMP
000009b5: JUMPDEST
000009b6: PUSH1 0x01
000009b8: PUSH1 0x01
000009ba: PUSH1 0xa0
000009bc: SHL
000009bd: SUB
000009be: DUP1
000009bf: DUP4
000009c0: AND
000009c1: PUSH1 0x00
000009c3: SWAP1
000009c4: DUP2
000009c5: MSTORE
000009c6: PUSH1 0x03
000009c8: PUSH1 0x20
000009ca: SWAP1
000009cb: DUP2
000009cc: MSTORE
000009cd: PUSH1 0x40
000009cf: DUP1
000009d0: DUP4
000009d1: KECCAK256
000009d2: SWAP4
000009d3: DUP6
000009d4: AND
000009d5: DUP4
000009d6: MSTORE
000009d7: SWAP3
000009d8: SWAP1
000009d9: MSTORE
000009da: KECCAK256
000009db: SLOAD
000009dc: PUSH1 0xff
000009de: AND
000009df: JUMPDEST
000009e0: SWAP3
000009e1: SWAP2
000009e2: POP
000009e3: POP
000009e4: JUMP
000009e5: JUMPDEST
000009e6: PUSH1 0x40
000009e8: DUP1
000009e9: MLOAD
000009ea: PUSH1 0x60
000009ec: DUP5
000009ed: DUP2
000009ee: SHL
000009ef: PUSH1 0x01
000009f1: PUSH1 0x01
000009f3: PUSH1 0x60
000009f5: SHL
000009f6: SUB
000009f7: NOT
000009f8: AND
000009f9: PUSH1 0x20
000009fb: DUP1
000009fc: DUP5
000009fd: ADD
000009fe: SWAP2
000009ff: SWAP1
00000a00: SWAP2
00000a01: MSTORE
00000a02: CALLER
00000a03: SWAP2
00000a04: DUP3
00000a05: SWAP1
00000a06: SHL
00000a07: PUSH1 0x34
00000a09: DUP5
00000a0a: ADD
00000a0b: MSTORE
00000a0c: PUSH1 0x48
00000a0e: DUP1
00000a0f: DUP5
00000a10: ADD
00000a11: DUP7
00000a12: SWAP1
00000a13: MSTORE
00000a14: DUP5
00000a15: MLOAD
00000a16: DUP1
00000a17: DUP6
00000a18: SUB
00000a19: SWAP1
00000a1a: SWAP2
00000a1b: ADD
00000a1c: DUP2
00000a1d: MSTORE
00000a1e: PUSH1 0x68
00000a20: SWAP1
00000a21: SWAP4
00000a22: ADD
00000a23: DUP5
00000a24: MSTORE
00000a25: DUP3
00000a26: MLOAD
00000a27: SWAP3
00000a28: DUP2
00000a29: ADD
00000a2a: SWAP3
00000a2b: SWAP1
00000a2c: SWAP3
00000a2d: KECCAK256
00000a2e: PUSH1 0x00
00000a30: DUP2
00000a31: DUP2
00000a32: MSTORE
00000a33: PUSH1 0x02
00000a35: SWAP1
00000a36: SWAP4
00000a37: MSTORE
00000a38: SWAP3
00000a39: SWAP1
00000a3a: SWAP2
00000a3b: KECCAK256
00000a3c: SLOAD
00000a3d: SWAP1
00000a3e: SWAP2
00000a3f: SWAP1
00000a40: PUSH2 0x0a81
00000a43: JUMPI
00000a44: PUSH1 0x40
00000a46: DUP1
00000a47: MLOAD
00000a48: PUSH3 0x461bcd
00000a4c: PUSH1 0xe5
00000a4e: SHL
00000a4f: DUP2
00000a50: MSTORE
00000a51: PUSH1 0x20
00000a53: PUSH1 0x04
00000a55: DUP3
00000a56: ADD
00000a57: MSTORE
00000a58: PUSH1 0x0e
00000a5a: PUSH1 0x24
00000a5c: DUP3
00000a5d: ADD
00000a5e: MSTORE
00000a5f: PUSH14 0x109bdb99081b9bdd08199bdd5b99
00000a6e: PUSH1 0x92
00000a70: SHL
00000a71: PUSH1 0x44
00000a73: DUP3
00000a74: ADD
00000a75: MSTORE
00000a76: SWAP1
00000a77: MLOAD
00000a78: SWAP1
00000a79: DUP2
00000a7a: SWAP1
00000a7b: SUB
00000a7c: PUSH1 0x64
00000a7e: ADD
00000a7f: SWAP1
00000a80: REVERT
00000a81: JUMPDEST
00000a82: PUSH1 0x00
00000a84: DUP2
00000a85: DUP2
00000a86: MSTORE
00000a87: PUSH1 0x02
00000a89: PUSH1 0x20
00000a8b: SWAP1
00000a8c: DUP2
00000a8d: MSTORE
00000a8e: PUSH1 0x40
00000a90: DUP1
00000a91: DUP4
00000a92: KECCAK256
00000a93: DUP1
00000a94: SLOAD
00000a95: SWAP1
00000a96: DUP5
00000a97: SWAP1
00000a98: SSTORE
00000a99: PUSH1 0x01
00000a9b: PUSH1 0x01
00000a9d: PUSH1 0xa0
00000a9f: SHL
00000aa0: SUB
00000aa1: DUP9
00000aa2: AND
00000aa3: DUP5
00000aa4: MSTORE
00000aa5: PUSH1 0x01
00000aa7: SWAP1
00000aa8: SWAP3
00000aa9: MSTORE
00000aaa: SWAP1
00000aab: SWAP2
00000aac: KECCAK256
00000aad: SLOAD
00000aae: PUSH2 0x0abd
00000ab1: SWAP1
00000ab2: DUP3
00000ab3: PUSH4 0xffffffff
00000ab8: PUSH2 0x171a
00000abb: AND
00000abc: JUMP
00000abd: JUMPDEST
00000abe: PUSH1 0x01
00000ac0: PUSH1 0x01
00000ac2: PUSH1 0xa0
00000ac4: SHL
00000ac5: SUB
00000ac6: DUP7
00000ac7: AND
00000ac8: PUSH1 0x00
00000aca: DUP2
00000acb: DUP2
00000acc: MSTORE
00000acd: PUSH1 0x01
00000acf: PUSH1 0x20
00000ad1: MSTORE
00000ad2: PUSH1 0x40
00000ad4: DUP1
00000ad5: DUP3
00000ad6: KECCAK256
00000ad7: SWAP4
00000ad8: SWAP1
00000ad9: SWAP4
00000ada: SSTORE
00000adb: SWAP2
00000adc: MLOAD
00000add: DUP7
00000ade: SWAP3
00000adf: PUSH32 0x60b8ef4216791426b3d7acfb0b6d11a400872350afd70a3ce5ebf62bea7cb0d4
00000b00: SWAP2
00000b01: LOG3
00000b02: POP
00000b03: POP
00000b04: POP
00000b05: POP
00000b06: POP
00000b07: JUMP
00000b08: JUMPDEST
00000b09: PUSH1 0x40
00000b0b: DUP1
00000b0c: MLOAD
00000b0d: PUSH1 0x60
00000b0f: DUP7
00000b10: DUP2
00000b11: SHL
00000b12: PUSH1 0x01
00000b14: PUSH1 0x01
00000b16: PUSH1 0x60
00000b18: SHL
00000b19: SUB
00000b1a: NOT
00000b1b: AND
00000b1c: PUSH1 0x20
00000b1e: DUP1
00000b1f: DUP5
00000b20: ADD
00000b21: SWAP2
00000b22: SWAP1
00000b23: SWAP2
00000b24: MSTORE
00000b25: CALLER
00000b26: SWAP2
00000b27: DUP3
00000b28: SWAP1
00000b29: SHL
00000b2a: PUSH1 0x34
00000b2c: DUP5
00000b2d: ADD
00000b2e: MSTORE
00000b2f: PUSH1 0x48
00000b31: DUP1
00000b32: DUP5
00000b33: ADD
00000b34: DUP9
00000b35: SWAP1
00000b36: MSTORE
00000b37: DUP5
00000b38: MLOAD
00000b39: DUP1
00000b3a: DUP6
00000b3b: SUB
00000b3c: SWAP1
00000b3d: SWAP2
00000b3e: ADD
00000b3f: DUP2
00000b40: MSTORE
00000b41: PUSH1 0x68
00000b43: SWAP1
00000b44: SWAP4
00000b45: ADD
00000b46: DUP5
00000b47: MSTORE
00000b48: DUP3
00000b49: MLOAD
00000b4a: SWAP3
00000b4b: DUP2
00000b4c: ADD
00000b4d: SWAP3
00000b4e: SWAP1
00000b4f: SWAP3
00000b50: KECCAK256
00000b51: PUSH1 0x00
00000b53: DUP2
00000b54: DUP2
00000b55: MSTORE
00000b56: PUSH1 0x02
00000b58: SWAP1
00000b59: SWAP4
00000b5a: MSTORE
00000b5b: SWAP3
00000b5c: SWAP1
00000b5d: SWAP2
00000b5e: KECCAK256
00000b5f: SLOAD
00000b60: SWAP1
00000b61: SWAP2
00000b62: SWAP1
00000b63: PUSH2 0x0ba4
00000b66: JUMPI
00000b67: PUSH1 0x40
00000b69: DUP1
00000b6a: MLOAD
00000b6b: PUSH3 0x461bcd
00000b6f: PUSH1 0xe5
00000b71: SHL
00000b72: DUP2
00000b73: MSTORE
00000b74: PUSH1 0x20
00000b76: PUSH1 0x04
00000b78: DUP3
00000b79: ADD
00000b7a: MSTORE
00000b7b: PUSH1 0x0e
00000b7d: PUSH1 0x24
00000b7f: DUP3
00000b80: ADD
00000b81: MSTORE
00000b82: PUSH14 0x109bdb99081b9bdd08199bdd5b99
00000b91: PUSH1 0x92
00000b93: SHL
00000b94: PUSH1 0x44
00000b96: DUP3
00000b97: ADD
00000b98: MSTORE
00000b99: SWAP1
00000b9a: MLOAD
00000b9b: SWAP1
00000b9c: DUP2
00000b9d: SWAP1
00000b9e: SUB
00000b9f: PUSH1 0x64
00000ba1: ADD
00000ba2: SWAP1
00000ba3: REVERT
00000ba4: JUMPDEST
00000ba5: PUSH1 0x40
00000ba7: DUP1
00000ba8: MLOAD
00000ba9: PUSH1 0x60
00000bab: DUP9
00000bac: DUP2
00000bad: SHL
00000bae: PUSH1 0x01
00000bb0: PUSH1 0x01
00000bb2: PUSH1 0x60
00000bb4: SHL
00000bb5: SUB
00000bb6: NOT
00000bb7: SWAP1
00000bb8: DUP2
00000bb9: AND
00000bba: PUSH1 0x20
00000bbc: DUP1
00000bbd: DUP6
00000bbe: ADD
00000bbf: SWAP2
00000bc0: SWAP1
00000bc1: SWAP2
00000bc2: MSTORE
00000bc3: SWAP2
00000bc4: DUP9
00000bc5: SWAP1
00000bc6: SHL
00000bc7: AND
00000bc8: PUSH1 0x34
00000bca: DUP4
00000bcb: ADD
00000bcc: MSTORE
00000bcd: PUSH1 0x48
00000bcf: DUP1
00000bd0: DUP4
00000bd1: ADD
00000bd2: DUP8
00000bd3: SWAP1
00000bd4: MSTORE
00000bd5: DUP4
00000bd6: MLOAD
00000bd7: DUP1
00000bd8: DUP5
00000bd9: SUB
00000bda: SWAP1
00000bdb: SWAP2
00000bdc: ADD
00000bdd: DUP2
00000bde: MSTORE
00000bdf: PUSH1 0x68
00000be1: SWAP1
00000be2: SWAP3
00000be3: ADD
00000be4: DUP4
00000be5: MSTORE
00000be6: DUP2
00000be7: MLOAD
00000be8: SWAP2
00000be9: DUP2
00000bea: ADD
00000beb: SWAP2
00000bec: SWAP1
00000bed: SWAP2
00000bee: KECCAK256
00000bef: PUSH1 0x00
00000bf1: DUP2
00000bf2: DUP2
00000bf3: MSTORE
00000bf4: PUSH1 0x02
00000bf6: SWAP1
00000bf7: SWAP3
00000bf8: MSTORE
00000bf9: SWAP2
00000bfa: SWAP1
00000bfb: KECCAK256
00000bfc: SLOAD
00000bfd: ISZERO
00000bfe: PUSH2 0x0c38
00000c01: JUMPI
00000c02: PUSH1 0x40
00000c04: MLOAD
00000c05: PUSH3 0x461bcd
00000c09: PUSH1 0xe5
00000c0b: SHL
00000c0c: DUP2
00000c0d: MSTORE
00000c0e: PUSH1 0x04
00000c10: ADD
00000c11: DUP1
00000c12: DUP1
00000c13: PUSH1 0x20
00000c15: ADD
00000c16: DUP3
00000c17: DUP2
00000c18: SUB
00000c19: DUP3
00000c1a: MSTORE
00000c1b: PUSH1 0x2f
00000c1d: DUP2
00000c1e: MSTORE
00000c1f: PUSH1 0x20
00000c21: ADD
00000c22: DUP1
00000c23: PUSH2 0x17c1
00000c26: PUSH1 0x2f
00000c28: SWAP2
00000c29: CODECOPY
00000c2a: PUSH1 0x40
00000c2c: ADD
00000c2d: SWAP2
00000c2e: POP
00000c2f: POP
00000c30: PUSH1 0x40
00000c32: MLOAD
00000c33: DUP1
00000c34: SWAP2
00000c35: SUB
00000c36: SWAP1
00000c37: REVERT
00000c38: JUMPDEST
00000c39: PUSH1 0x00
00000c3b: DUP3
00000c3c: DUP2
00000c3d: MSTORE
00000c3e: PUSH1 0x02
00000c40: PUSH1 0x20
00000c42: SWAP1
00000c43: DUP2
00000c44: MSTORE
00000c45: PUSH1 0x40
00000c47: DUP1
00000c48: DUP4
00000c49: KECCAK256
00000c4a: DUP1
00000c4b: SLOAD
00000c4c: DUP6
00000c4d: DUP6
00000c4e: MSTORE
00000c4f: DUP3
00000c50: DUP6
00000c51: KECCAK256
00000c52: SSTORE
00000c53: DUP6
00000c54: DUP5
00000c55: MSTORE
00000c56: SWAP3
00000c57: SWAP1
00000c58: SWAP3
00000c59: SSTORE
00000c5a: DUP2
00000c5b: MLOAD
00000c5c: PUSH1 0x01
00000c5e: PUSH1 0x01
00000c60: PUSH1 0xa0
00000c62: SHL
00000c63: SUB
00000c64: DUP9
00000c65: DUP2
00000c66: AND
00000c67: DUP3
00000c68: MSTORE
00000c69: SWAP2
00000c6a: DUP2
00000c6b: ADD
00000c6c: DUP8
00000c6d: SWAP1
00000c6e: MSTORE
00000c6f: DUP3
00000c70: MLOAD
00000c71: DUP10
00000c72: SWAP4
00000c73: SWAP3
00000c74: DUP12
00000c75: AND
00000c76: SWAP3
00000c77: PUSH32 0xb1d917176802bfbc813f2d82e745526029a4ccf0ea98d14e7a09a08703595b1e
00000c98: SWAP3
00000c99: DUP3
00000c9a: SWAP1
00000c9b: SUB
00000c9c: ADD
00000c9d: SWAP1
00000c9e: LOG3
00000c9f: POP
00000ca0: POP
00000ca1: POP
00000ca2: POP
00000ca3: POP
00000ca4: POP
00000ca5: POP
00000ca6: JUMP
00000ca7: JUMPDEST
00000ca8: PUSH1 0x04
00000caa: DUP1
00000cab: SLOAD
00000cac: PUSH1 0x40
00000cae: DUP1
00000caf: MLOAD
00000cb0: PUSH4 0xba7bffd3
00000cb5: PUSH1 0xe0
00000cb7: SHL
00000cb8: DUP2
00000cb9: MSTORE
00000cba: PUSH1 0x01
00000cbc: PUSH1 0x01
00000cbe: PUSH1 0xa0
00000cc0: SHL
00000cc1: SUB
00000cc2: DUP6
00000cc3: DUP2
00000cc4: AND
00000cc5: SWAP5
00000cc6: DUP3
00000cc7: ADD
00000cc8: SWAP5
00000cc9: SWAP1
00000cca: SWAP5
00000ccb: MSTORE
00000ccc: SWAP1
00000ccd: MLOAD
00000cce: PUSH1 0x00
00000cd0: SWAP4
00000cd1: SWAP1
00000cd2: SWAP3
00000cd3: AND
00000cd4: SWAP2
00000cd5: PUSH4 0xba7bffd3
00000cda: SWAP2
00000cdb: PUSH1 0x24
00000cdd: DUP1
00000cde: DUP3
00000cdf: ADD
00000ce0: SWAP3
00000ce1: PUSH1 0x20
00000ce3: SWAP3
00000ce4: SWAP1
00000ce5: SWAP2
00000ce6: SWAP1
00000ce7: DUP3
00000ce8: SWAP1
00000ce9: SUB
00000cea: ADD
00000ceb: DUP2
00000cec: DUP7
00000ced: DUP1
00000cee: EXTCODESIZE
00000cef: ISZERO
00000cf0: DUP1
00000cf1: ISZERO
00000cf2: PUSH2 0x0cfa
00000cf5: JUMPI
00000cf6: PUSH1 0x00
00000cf8: DUP1
00000cf9: REVERT
00000cfa: JUMPDEST
00000cfb: POP
00000cfc: GAS
00000cfd: STATICCALL
00000cfe: ISZERO
00000cff: DUP1
00000d00: ISZERO
00000d01: PUSH2 0x0d0e
00000d04: JUMPI
00000d05: RETURNDATASIZE
00000d06: PUSH1 0x00
00000d08: DUP1
00000d09: RETURNDATACOPY
00000d0a: RETURNDATASIZE
00000d0b: PUSH1 0x00
00000d0d: REVERT
00000d0e: JUMPDEST
00000d0f: POP
00000d10: POP
00000d11: POP
00000d12: POP
00000d13: PUSH1 0x40
00000d15: MLOAD
00000d16: RETURNDATASIZE
00000d17: PUSH1 0x20
00000d19: DUP2
00000d1a: LT
00000d1b: ISZERO
00000d1c: PUSH2 0x0d24
00000d1f: JUMPI
00000d20: PUSH1 0x00
00000d22: DUP1
00000d23: REVERT
00000d24: JUMPDEST
00000d25: POP
00000d26: MLOAD
00000d27: SWAP3
00000d28: SWAP2
00000d29: POP
00000d2a: POP
00000d2b: JUMP
00000d2c: JUMPDEST
00000d2d: CALLER
00000d2e: PUSH2 0x0d36
00000d31: DUP4
00000d32: PUSH2 0x10ec
00000d35: JUMP
00000d36: JUMPDEST
00000d37: PUSH1 0x01
00000d39: PUSH1 0x01
00000d3b: PUSH1 0xa0
00000d3d: SHL
00000d3e: SUB
00000d3f: AND
00000d40: EQ
00000d41: PUSH2 0x0d82
00000d44: JUMPI
00000d45: PUSH1 0x40
00000d47: DUP1
00000d48: MLOAD
00000d49: PUSH3 0x461bcd
00000d4d: PUSH1 0xe5
00000d4f: SHL
00000d50: DUP2
00000d51: MSTORE
00000d52: PUSH1 0x20
00000d54: PUSH1 0x04
00000d56: DUP3
00000d57: ADD
00000d58: MSTORE
00000d59: PUSH1 0x0e
00000d5b: PUSH1 0x24
00000d5d: DUP3
00000d5e: ADD
00000d5f: MSTORE
00000d60: PUSH14 0x139bdd08185d5d1a1bdc9a5e9959
00000d6f: PUSH1 0x92
00000d71: SHL
00000d72: PUSH1 0x44
00000d74: DUP3
00000d75: ADD
00000d76: MSTORE
00000d77: SWAP1
00000d78: MLOAD
00000d79: SWAP1
00000d7a: DUP2
00000d7b: SWAP1
00000d7c: SUB
00000d7d: PUSH1 0x64
00000d7f: ADD
00000d80: SWAP1
00000d81: REVERT
00000d82: JUMPDEST
00000d83: PUSH1 0x01
00000d85: PUSH1 0x01
00000d87: PUSH1 0xa0
00000d89: SHL
00000d8a: SUB
00000d8b: SWAP2
00000d8c: DUP3
00000d8d: AND
00000d8e: PUSH1 0x00
00000d90: SWAP1
00000d91: DUP2
00000d92: MSTORE
00000d93: PUSH1 0x03
00000d95: PUSH1 0x20
00000d97: SWAP1
00000d98: DUP2
00000d99: MSTORE
00000d9a: PUSH1 0x40
00000d9c: DUP1
00000d9d: DUP4
00000d9e: KECCAK256
00000d9f: SWAP4
00000da0: SWAP1
00000da1: SWAP5
00000da2: AND
00000da3: DUP3
00000da4: MSTORE
00000da5: SWAP2
00000da6: SWAP1
00000da7: SWAP2
00000da8: MSTORE
00000da9: KECCAK256
00000daa: DUP1
00000dab: SLOAD
00000dac: PUSH1 0xff
00000dae: NOT
00000daf: AND
00000db0: PUSH1 0x01
00000db2: OR
00000db3: SWAP1
00000db4: SSTORE
00000db5: JUMP
00000db6: JUMPDEST
00000db7: DUP2
00000db8: PUSH2 0x0dc2
00000dbb: DUP7
00000dbc: CALLER
00000dbd: DUP5
00000dbe: PUSH2 0x0815
00000dc1: JUMP
00000dc2: JUMPDEST
00000dc3: LT
00000dc4: ISZERO
00000dc5: PUSH2 0x0e15
00000dc8: JUMPI
00000dc9: PUSH1 0x40
00000dcb: DUP1
00000dcc: MLOAD
00000dcd: PUSH3 0x461bcd
00000dd1: PUSH1 0xe5
00000dd3: SHL
00000dd4: DUP2
00000dd5: MSTORE
00000dd6: PUSH1 0x20
00000dd8: PUSH1 0x04
00000dda: DUP3
00000ddb: ADD
00000ddc: MSTORE
00000ddd: PUSH1 0x1b
00000ddf: PUSH1 0x24
00000de1: DUP3
00000de2: ADD
00000de3: MSTORE
00000de4: PUSH32 0x496e73756666696369656e7420756e626f6e6465642076616c75650000000000
00000e05: PUSH1 0x44
00000e07: DUP3
00000e08: ADD
00000e09: MSTORE
00000e0a: SWAP1
00000e0b: MLOAD
00000e0c: SWAP1
00000e0d: DUP2
00000e0e: SWAP1
00000e0f: SUB
00000e10: PUSH1 0x64
00000e12: ADD
00000e13: SWAP1
00000e14: REVERT
00000e15: JUMPDEST
00000e16: PUSH1 0x40
00000e18: DUP1
00000e19: MLOAD
00000e1a: PUSH1 0x60
00000e1c: DUP8
00000e1d: DUP2
00000e1e: SHL
00000e1f: PUSH1 0x01
00000e21: PUSH1 0x01
00000e23: PUSH1 0x60
00000e25: SHL
00000e26: SUB
00000e27: NOT
00000e28: SWAP1
00000e29: DUP2
00000e2a: AND
00000e2b: PUSH1 0x20
00000e2d: DUP1
00000e2e: DUP6
00000e2f: ADD
00000e30: SWAP2
00000e31: SWAP1
00000e32: SWAP2
00000e33: MSTORE
00000e34: SWAP2
00000e35: DUP9
00000e36: SWAP1
00000e37: SHL
00000e38: AND
00000e39: PUSH1 0x34
00000e3b: DUP4
00000e3c: ADD
00000e3d: MSTORE
00000e3e: PUSH1 0x48
00000e40: DUP1
00000e41: DUP4
00000e42: ADD
00000e43: DUP8
00000e44: SWAP1
00000e45: MSTORE
00000e46: DUP4
00000e47: MLOAD
00000e48: DUP1
00000e49: DUP5
00000e4a: SUB
00000e4b: SWAP1
00000e4c: SWAP2
00000e4d: ADD
00000e4e: DUP2
00000e4f: MSTORE
00000e50: PUSH1 0x68
00000e52: SWAP1
00000e53: SWAP3
00000e54: ADD
00000e55: DUP4
00000e56: MSTORE
00000e57: DUP2
00000e58: MLOAD
00000e59: SWAP2
00000e5a: DUP2
00000e5b: ADD
00000e5c: SWAP2
00000e5d: SWAP1
00000e5e: SWAP2
00000e5f: KECCAK256
00000e60: PUSH1 0x00
00000e62: DUP2
00000e63: DUP2
00000e64: MSTORE
00000e65: PUSH1 0x02
00000e67: SWAP1
00000e68: SWAP3
00000e69: MSTORE
00000e6a: SWAP2
00000e6b: SWAP1
00000e6c: KECCAK256
00000e6d: SLOAD
00000e6e: ISZERO
00000e6f: PUSH2 0x0ea9
00000e72: JUMPI
00000e73: PUSH1 0x40
00000e75: MLOAD
00000e76: PUSH3 0x461bcd
00000e7a: PUSH1 0xe5
00000e7c: SHL
00000e7d: DUP2
00000e7e: MSTORE
00000e7f: PUSH1 0x04
00000e81: ADD
00000e82: DUP1
00000e83: DUP1
00000e84: PUSH1 0x20
00000e86: ADD
00000e87: DUP3
00000e88: DUP2
00000e89: SUB
00000e8a: DUP3
00000e8b: MSTORE
00000e8c: PUSH1 0x2f
00000e8e: DUP2
00000e8f: MSTORE
00000e90: PUSH1 0x20
00000e92: ADD
00000e93: DUP1
00000e94: PUSH2 0x17c1
00000e97: PUSH1 0x2f
00000e99: SWAP2
00000e9a: CODECOPY
00000e9b: PUSH1 0x40
00000e9d: ADD
00000e9e: SWAP2
00000e9f: POP
00000ea0: POP
00000ea1: PUSH1 0x40
00000ea3: MLOAD
00000ea4: DUP1
00000ea5: SWAP2
00000ea6: SUB
00000ea7: SWAP1
00000ea8: REVERT
00000ea9: JUMPDEST
00000eaa: PUSH1 0x01
00000eac: PUSH1 0x01
00000eae: PUSH1 0xa0
00000eb0: SHL
00000eb1: SUB
00000eb2: DUP7
00000eb3: AND
00000eb4: PUSH1 0x00
00000eb6: SWAP1
00000eb7: DUP2
00000eb8: MSTORE
00000eb9: PUSH1 0x01
00000ebb: PUSH1 0x20
00000ebd: MSTORE
00000ebe: PUSH1 0x40
00000ec0: SWAP1
00000ec1: KECCAK256
00000ec2: SLOAD
00000ec3: PUSH2 0x0ed2
00000ec6: SWAP1
00000ec7: DUP5
00000ec8: PUSH4 0xffffffff
00000ecd: PUSH2 0x14c7
00000ed0: AND
00000ed1: JUMP
00000ed2: JUMPDEST
00000ed3: PUSH1 0x01
00000ed5: PUSH1 0x01
00000ed7: PUSH1 0xa0
00000ed9: SHL
00000eda: SUB
00000edb: DUP8
00000edc: AND
00000edd: PUSH1 0x00
00000edf: SWAP1
00000ee0: DUP2
00000ee1: MSTORE
00000ee2: PUSH1 0x01
00000ee4: PUSH1 0x20
00000ee6: SWAP1
00000ee7: DUP2
00000ee8: MSTORE
00000ee9: PUSH1 0x40
00000eeb: DUP1
00000eec: DUP4
00000eed: KECCAK256
00000eee: SWAP4
00000eef: SWAP1
00000ef0: SWAP4
00000ef1: SSTORE
00000ef2: DUP4
00000ef3: DUP3
00000ef4: MSTORE
00000ef5: PUSH1 0x02
00000ef7: SWAP1
00000ef8: MSTORE
00000ef9: KECCAK256
00000efa: SLOAD
00000efb: PUSH2 0x0f0a
00000efe: SWAP1
00000eff: DUP5
00000f00: PUSH4 0xffffffff
00000f05: PUSH2 0x171a
00000f08: AND
00000f09: JUMP
00000f0a: JUMPDEST
00000f0b: PUSH1 0x02
00000f0d: PUSH1 0x00
00000f0f: DUP4
00000f10: DUP2
00000f11: MSTORE
00000f12: PUSH1 0x20
00000f14: ADD
00000f15: SWAP1
00000f16: DUP2
00000f17: MSTORE
00000f18: PUSH1 0x20
00000f1a: ADD
00000f1b: PUSH1 0x00
00000f1d: KECCAK256
00000f1e: DUP2
00000f1f: SWAP1
00000f20: SSTORE
00000f21: POP
00000f22: DUP2
00000f23: PUSH1 0x01
00000f25: PUSH1 0x01
00000f27: PUSH1 0xa0
00000f29: SHL
00000f2a: SUB
00000f2b: AND
00000f2c: DUP6
00000f2d: PUSH1 0x01
00000f2f: PUSH1 0x01
00000f31: PUSH1 0xa0
00000f33: SHL
00000f34: SUB
00000f35: AND
00000f36: DUP8
00000f37: PUSH1 0x01
00000f39: PUSH1 0x01
00000f3b: PUSH1 0xa0
00000f3d: SHL
00000f3e: SUB
00000f3f: AND
00000f40: PUSH32 0xa5543d8e139d9ab4342d5c4f6ec1bff5a97f9a52d71f7ffe9845b94f1449fc91
00000f61: DUP8
00000f62: DUP8
00000f63: PUSH1 0x40
00000f65: MLOAD
00000f66: DUP1
00000f67: DUP4
00000f68: DUP2
00000f69: MSTORE
00000f6a: PUSH1 0x20
00000f6c: ADD
00000f6d: DUP3
00000f6e: DUP2
00000f6f: MSTORE
00000f70: PUSH1 0x20
00000f72: ADD
00000f73: SWAP3
00000f74: POP
00000f75: POP
00000f76: POP
00000f77: PUSH1 0x40
00000f79: MLOAD
00000f7a: DUP1
00000f7b: SWAP2
00000f7c: SUB
00000f7d: SWAP1
00000f7e: LOG4
00000f7f: POP
00000f80: POP
00000f81: POP
00000f82: POP
00000f83: POP
00000f84: POP
00000f85: JUMP
00000f86: JUMPDEST
00000f87: PUSH1 0x04
00000f89: DUP1
00000f8a: SLOAD
00000f8b: PUSH1 0x40
00000f8d: DUP1
00000f8e: MLOAD
00000f8f: PUSH4 0xef1f9661
00000f94: PUSH1 0xe0
00000f96: SHL
00000f97: DUP2
00000f98: MSTORE
00000f99: PUSH1 0x01
00000f9b: PUSH1 0x01
00000f9d: PUSH1 0xa0
00000f9f: SHL
00000fa0: SUB
00000fa1: DUP7
00000fa2: DUP2
00000fa3: AND
00000fa4: SWAP5
00000fa5: DUP3
00000fa6: ADD
00000fa7: SWAP5
00000fa8: SWAP1
00000fa9: SWAP5
00000faa: MSTORE
00000fab: DUP5
00000fac: DUP5
00000fad: AND
00000fae: PUSH1 0x24
00000fb0: DUP3
00000fb1: ADD
00000fb2: MSTORE
00000fb3: SWAP1
00000fb4: MLOAD
00000fb5: PUSH1 0x00
00000fb7: SWAP4
00000fb8: SWAP1
00000fb9: SWAP3
00000fba: AND
00000fbb: SWAP2
00000fbc: PUSH4 0xef1f9661
00000fc1: SWAP2
00000fc2: PUSH1 0x44
00000fc4: DUP1
00000fc5: DUP3
00000fc6: ADD
00000fc7: SWAP3
00000fc8: PUSH1 0x20
00000fca: SWAP3
00000fcb: SWAP1
00000fcc: SWAP2
00000fcd: SWAP1
00000fce: DUP3
00000fcf: SWAP1
00000fd0: SUB
00000fd1: ADD
00000fd2: DUP2
00000fd3: DUP7
00000fd4: DUP1
00000fd5: EXTCODESIZE
00000fd6: ISZERO
00000fd7: DUP1
00000fd8: ISZERO
00000fd9: PUSH2 0x0fe1
00000fdc: JUMPI
00000fdd: PUSH1 0x00
00000fdf: DUP1
00000fe0: REVERT
00000fe1: JUMPDEST
00000fe2: POP
00000fe3: GAS
00000fe4: STATICCALL
00000fe5: ISZERO
00000fe6: DUP1
00000fe7: ISZERO
00000fe8: PUSH2 0x0ff5
00000feb: JUMPI
00000fec: RETURNDATASIZE
00000fed: PUSH1 0x00
00000fef: DUP1
00000ff0: RETURNDATACOPY
00000ff1: RETURNDATASIZE
00000ff2: PUSH1 0x00
00000ff4: REVERT
00000ff5: JUMPDEST
00000ff6: POP
00000ff7: POP
00000ff8: POP
00000ff9: POP
00000ffa: PUSH1 0x40
00000ffc: MLOAD
00000ffd: RETURNDATASIZE
00000ffe: PUSH1 0x20
00001000: DUP2
00001001: LT
00001002: ISZERO
00001003: PUSH2 0x100b
00001006: JUMPI
00001007: PUSH1 0x00
00001009: DUP1
0000100a: REVERT
0000100b: JUMPDEST
0000100c: POP
0000100d: MLOAD
0000100e: SWAP4
0000100f: SWAP3
00001010: POP
00001011: POP
00001012: POP
00001013: JUMP
00001014: JUMPDEST
00001015: PUSH1 0x00
00001017: PUSH2 0x101f
0000101a: DUP3
0000101b: PUSH2 0x0ca7
0000101e: JUMP
0000101f: JUMPDEST
00001020: SWAP1
00001021: POP
00001022: PUSH1 0x01
00001024: PUSH1 0x01
00001026: PUSH1 0xa0
00001028: SHL
00001029: SUB
0000102a: DUP2
0000102b: AND
0000102c: PUSH2 0x1066
0000102f: JUMPI
00001030: PUSH1 0x40
00001032: MLOAD
00001033: PUSH3 0x461bcd
00001037: PUSH1 0xe5
00001039: SHL
0000103a: DUP2
0000103b: MSTORE
0000103c: PUSH1 0x04
0000103e: ADD
0000103f: DUP1
00001040: DUP1
00001041: PUSH1 0x20
00001043: ADD
00001044: DUP3
00001045: DUP2
00001046: SUB
00001047: DUP3
00001048: MSTORE
00001049: PUSH1 0x28
0000104b: DUP2
0000104c: MSTORE
0000104d: PUSH1 0x20
0000104f: ADD
00001050: DUP1
00001051: PUSH2 0x17f0
00001054: PUSH1 0x28
00001056: SWAP2
00001057: CODECOPY
00001058: PUSH1 0x40
0000105a: ADD
0000105b: SWAP2
0000105c: POP
0000105d: POP
0000105e: PUSH1 0x40
00001060: MLOAD
00001061: DUP1
00001062: SWAP2
00001063: SUB
00001064: SWAP1
00001065: REVERT
00001066: JUMPDEST
00001067: PUSH1 0x01
00001069: PUSH1 0x01
0000106b: PUSH1 0xa0
0000106d: SHL
0000106e: SUB
0000106f: DUP3
00001070: AND
00001071: PUSH1 0x00
00001073: SWAP1
00001074: DUP2
00001075: MSTORE
00001076: PUSH1 0x01
00001078: PUSH1 0x20
0000107a: MSTORE
0000107b: PUSH1 0x40
0000107d: SWAP1
0000107e: KECCAK256
0000107f: SLOAD
00001080: PUSH2 0x108f
00001083: SWAP1
00001084: CALLVALUE
00001085: PUSH4 0xffffffff
0000108a: PUSH2 0x171a
0000108d: AND
0000108e: JUMP
0000108f: JUMPDEST
00001090: PUSH1 0x01
00001092: PUSH1 0x01
00001094: PUSH1 0xa0
00001096: SHL
00001097: SUB
00001098: DUP1
00001099: DUP5
0000109a: AND
0000109b: PUSH1 0x00
0000109d: DUP2
0000109e: DUP2
0000109f: MSTORE
000010a0: PUSH1 0x01
000010a2: PUSH1 0x20
000010a4: SWAP1
000010a5: DUP2
000010a6: MSTORE
000010a7: PUSH1 0x40
000010a9: SWAP2
000010aa: DUP3
000010ab: SWAP1
000010ac: KECCAK256
000010ad: SWAP5
000010ae: SWAP1
000010af: SWAP5
000010b0: SSTORE
000010b1: DUP1
000010b2: MLOAD
000010b3: CALLVALUE
000010b4: DUP2
000010b5: MSTORE
000010b6: SWAP1
000010b7: MLOAD
000010b8: SWAP3
000010b9: DUP6
000010ba: AND
000010bb: SWAP4
000010bc: SWAP2
000010bd: SWAP3
000010be: PUSH32 0xfd586a32ad24d585b1f7b36ee48e66304ad7627b48b39a0ab1d8a3e84741ea2a
000010df: SWAP3
000010e0: SWAP2
000010e1: DUP2
000010e2: SWAP1
000010e3: SUB
000010e4: SWAP1
000010e5: SWAP2
000010e6: ADD
000010e7: SWAP1
000010e8: LOG3
000010e9: POP
000010ea: POP
000010eb: JUMP
000010ec: JUMPDEST
000010ed: PUSH1 0x04
000010ef: DUP1
000010f0: SLOAD
000010f1: PUSH1 0x40
000010f3: DUP1
000010f4: MLOAD
000010f5: PUSH4 0xfb1677b1
000010fa: PUSH1 0xe0
000010fc: SHL
000010fd: DUP2
000010fe: MSTORE
000010ff: PUSH1 0x01
00001101: PUSH1 0x01
00001103: PUSH1 0xa0
00001105: SHL
00001106: SUB
00001107: DUP6
00001108: DUP2
00001109: AND
0000110a: SWAP5
0000110b: DUP3
0000110c: ADD
0000110d: SWAP5
0000110e: SWAP1
0000110f: SWAP5
00001110: MSTORE
00001111: SWAP1
00001112: MLOAD
00001113: PUSH1 0x00
00001115: SWAP4
00001116: SWAP1
00001117: SWAP3
00001118: AND
00001119: SWAP2
0000111a: PUSH4 0xfb1677b1
0000111f: SWAP2
00001120: PUSH1 0x24
00001122: DUP1
00001123: DUP3
00001124: ADD
00001125: SWAP3
00001126: PUSH1 0x20
00001128: SWAP3
00001129: SWAP1
0000112a: SWAP2
0000112b: SWAP1
0000112c: DUP3
0000112d: SWAP1
0000112e: SUB
0000112f: ADD
00001130: DUP2
00001131: DUP7
00001132: DUP1
00001133: EXTCODESIZE
00001134: ISZERO
00001135: DUP1
00001136: ISZERO
00001137: PUSH2 0x0cfa
0000113a: JUMPI
0000113b: PUSH1 0x00
0000113d: DUP1
0000113e: REVERT
0000113f: JUMPDEST
00001140: PUSH1 0x00
00001142: DUP4
00001143: PUSH1 0x01
00001145: PUSH1 0x01
00001147: PUSH1 0xa0
00001149: SHL
0000114a: SUB
0000114b: AND
0000114c: DUP3
0000114d: PUSH1 0x01
0000114f: PUSH1 0x01
00001151: PUSH1 0xa0
00001153: SHL
00001154: SUB
00001155: AND
00001156: PUSH4 0x14afd79e
0000115b: DUP6
0000115c: PUSH1 0x40
0000115e: MLOAD
0000115f: DUP3
00001160: PUSH4 0xffffffff
00001165: AND
00001166: PUSH1 0xe0
00001168: SHL
00001169: DUP2
0000116a: MSTORE
0000116b: PUSH1 0x04
0000116d: ADD
0000116e: DUP1
0000116f: DUP3
00001170: PUSH1 0x01
00001172: PUSH1 0x01
00001174: PUSH1 0xa0
00001176: SHL
00001177: SUB
00001178: AND
00001179: PUSH1 0x01
0000117b: PUSH1 0x01
0000117d: PUSH1 0xa0
0000117f: SHL
00001180: SUB
00001181: AND
00001182: DUP2
00001183: MSTORE
00001184: PUSH1 0x20
00001186: ADD
00001187: SWAP2
00001188: POP
00001189: POP
0000118a: PUSH1 0x20
0000118c: PUSH1 0x40
0000118e: MLOAD
0000118f: DUP1
00001190: DUP4
00001191: SUB
00001192: DUP2
00001193: DUP7
00001194: DUP1
00001195: EXTCODESIZE
00001196: ISZERO
00001197: DUP1
00001198: ISZERO
00001199: PUSH2 0x11a1
0000119c: JUMPI
0000119d: PUSH1 0x00
0000119f: DUP1
000011a0: REVERT
000011a1: JUMPDEST
000011a2: POP
000011a3: GAS
000011a4: STATICCALL
000011a5: ISZERO
000011a6: DUP1
000011a7: ISZERO
000011a8: PUSH2 0x11b5
000011ab: JUMPI
000011ac: RETURNDATASIZE
000011ad: PUSH1 0x00
000011af: DUP1
000011b0: RETURNDATACOPY
000011b1: RETURNDATASIZE
000011b2: PUSH1 0x00
000011b4: REVERT
000011b5: JUMPDEST
000011b6: POP
000011b7: POP
000011b8: POP
000011b9: POP
000011ba: PUSH1 0x40
000011bc: MLOAD
000011bd: RETURNDATASIZE
000011be: PUSH1 0x20
000011c0: DUP2
000011c1: LT
000011c2: ISZERO
000011c3: PUSH2 0x11cb
000011c6: JUMPI
000011c7: PUSH1 0x00
000011c9: DUP1
000011ca: REVERT
000011cb: JUMPDEST
000011cc: POP
000011cd: MLOAD
000011ce: PUSH1 0x01
000011d0: PUSH1 0x01
000011d2: PUSH1 0xa0
000011d4: SHL
000011d5: SUB
000011d6: AND
000011d7: EQ
000011d8: SWAP5
000011d9: SWAP4
000011da: POP
000011db: POP
000011dc: POP
000011dd: POP
000011de: JUMP
000011df: JUMPDEST
000011e0: PUSH1 0x00
000011e2: PUSH1 0x60
000011e4: DUP3
000011e5: PUSH1 0x01
000011e7: PUSH1 0x01
000011e9: PUSH1 0xa0
000011eb: SHL
000011ec: SUB
000011ed: AND
000011ee: PUSH4 0xca9a33ce
000011f3: DUP7
000011f4: PUSH1 0x40
000011f6: MLOAD
000011f7: DUP3
000011f8: PUSH4 0xffffffff
000011fd: AND
000011fe: PUSH1 0xe0
00001200: SHL
00001201: DUP2
00001202: MSTORE
00001203: PUSH1 0x04
00001205: ADD
00001206: DUP1
00001207: DUP3
00001208: PUSH1 0x01
0000120a: PUSH1 0x01
0000120c: PUSH1 0xa0
0000120e: SHL
0000120f: SUB
00001210: AND
00001211: PUSH1 0x01
00001213: PUSH1 0x01
00001215: PUSH1 0xa0
00001217: SHL
00001218: SUB
00001219: AND
0000121a: DUP2
0000121b: MSTORE
0000121c: PUSH1 0x20
0000121e: ADD
0000121f: SWAP2
00001220: POP
00001221: POP
00001222: PUSH1 0x00
00001224: PUSH1 0x40
00001226: MLOAD
00001227: DUP1
00001228: DUP4
00001229: SUB
0000122a: DUP2
0000122b: DUP7
0000122c: DUP1
0000122d: EXTCODESIZE
0000122e: ISZERO
0000122f: DUP1
00001230: ISZERO
00001231: PUSH2 0x1239
00001234: JUMPI
00001235: PUSH1 0x00
00001237: DUP1
00001238: REVERT
00001239: JUMPDEST
0000123a: POP
0000123b: GAS
0000123c: STATICCALL
0000123d: ISZERO
0000123e: DUP1
0000123f: ISZERO
00001240: PUSH2 0x124d
00001243: JUMPI
00001244: RETURNDATASIZE
00001245: PUSH1 0x00
00001247: DUP1
00001248: RETURNDATACOPY
00001249: RETURNDATASIZE
0000124a: PUSH1 0x00
0000124c: REVERT
0000124d: JUMPDEST
0000124e: POP
0000124f: POP
00001250: POP
00001251: POP
00001252: PUSH1 0x40
00001254: MLOAD
00001255: RETURNDATASIZE
00001256: PUSH1 0x00
00001258: DUP3
00001259: RETURNDATACOPY
0000125a: PUSH1 0x1f
0000125c: RETURNDATASIZE
0000125d: SWAP1
0000125e: DUP2
0000125f: ADD
00001260: PUSH1 0x1f
00001262: NOT
00001263: AND
00001264: DUP3
00001265: ADD
00001266: PUSH1 0x40
00001268: MSTORE
00001269: PUSH1 0x20
0000126b: DUP2
0000126c: LT
0000126d: ISZERO
0000126e: PUSH2 0x1276
00001271: JUMPI
00001272: PUSH1 0x00
00001274: DUP1
00001275: REVERT
00001276: JUMPDEST
00001277: DUP2
00001278: ADD
00001279: SWAP1
0000127a: DUP1
0000127b: DUP1
0000127c: MLOAD
0000127d: PUSH1 0x40
0000127f: MLOAD
00001280: SWAP4
00001281: SWAP3
00001282: SWAP2
00001283: SWAP1
00001284: DUP5
00001285: PUSH5 0x0100000000
0000128b: DUP3
0000128c: GT
0000128d: ISZERO
0000128e: PUSH2 0x1296
00001291: JUMPI
00001292: PUSH1 0x00
00001294: DUP1
00001295: REVERT
00001296: JUMPDEST
00001297: SWAP1
00001298: DUP4
00001299: ADD
0000129a: SWAP1
0000129b: PUSH1 0x20
0000129d: DUP3
0000129e: ADD
0000129f: DUP6
000012a0: DUP2
000012a1: GT
000012a2: ISZERO
000012a3: PUSH2 0x12ab
000012a6: JUMPI
000012a7: PUSH1 0x00
000012a9: DUP1
000012aa: REVERT
000012ab: JUMPDEST
000012ac: DUP3
000012ad: MLOAD
000012ae: DUP7
000012af: PUSH1 0x20
000012b1: DUP3
000012b2: MUL
000012b3: DUP4
000012b4: ADD
000012b5: GT
000012b6: PUSH5 0x0100000000
000012bc: DUP3
000012bd: GT
000012be: OR
000012bf: ISZERO
000012c0: PUSH2 0x12c8
000012c3: JUMPI
000012c4: PUSH1 0x00
000012c6: DUP1
000012c7: REVERT
000012c8: JUMPDEST
000012c9: DUP3
000012ca: MSTORE
000012cb: POP
000012cc: DUP2
000012cd: MLOAD
000012ce: PUSH1 0x20
000012d0: SWAP2
000012d1: DUP3
000012d2: ADD
000012d3: SWAP3
000012d4: DUP3
000012d5: ADD
000012d6: SWAP2
000012d7: MUL
000012d8: DUP1
000012d9: DUP4
000012da: DUP4
000012db: PUSH1 0x00
000012dd: JUMPDEST
000012de: DUP4
000012df: DUP2
000012e0: LT
000012e1: ISZERO
000012e2: PUSH2 0x12f5
000012e5: JUMPI
000012e6: DUP2
000012e7: DUP2
000012e8: ADD
000012e9: MLOAD
000012ea: DUP4
000012eb: DUP3
000012ec: ADD
000012ed: MSTORE
000012ee: PUSH1 0x20
000012f0: ADD
000012f1: PUSH2 0x12dd
000012f4: JUMP
000012f5: JUMPDEST
000012f6: POP
000012f7: POP
000012f8: POP
000012f9: POP
000012fa: SWAP1
000012fb: POP
000012fc: ADD
000012fd: PUSH1 0x40
000012ff: MSTORE
00001300: POP
00001301: POP
00001302: POP
00001303: SWAP1
00001304: POP
00001305: PUSH2 0x1317
00001308: DUP5
00001309: DUP3
0000130a: PUSH2 0x1774
0000130d: SWAP1
0000130e: SWAP2
0000130f: SWAP1
00001310: PUSH4 0xffffffff
00001315: AND
00001316: JUMP
00001317: JUMPDEST
00001318: SWAP6
00001319: SWAP5
0000131a: POP
0000131b: POP
0000131c: POP
0000131d: POP
0000131e: POP
0000131f: JUMP
00001320: JUMPDEST
00001321: PUSH1 0x01
00001323: PUSH1 0x01
00001325: PUSH1 0xa0
00001327: SHL
00001328: SUB
00001329: DUP2
0000132a: AND
0000132b: PUSH1 0x00
0000132d: SWAP1
0000132e: DUP2
0000132f: MSTORE
00001330: PUSH1 0x01
00001332: PUSH1 0x20
00001334: MSTORE
00001335: PUSH1 0x40
00001337: SWAP1
00001338: KECCAK256
00001339: SLOAD
0000133a: DUP3
0000133b: GT
0000133c: ISZERO
0000133d: PUSH2 0x138d
00001340: JUMPI
00001341: PUSH1 0x40
00001343: DUP1
00001344: MLOAD
00001345: PUSH3 0x461bcd
00001349: PUSH1 0xe5
0000134b: SHL
0000134c: DUP2
0000134d: MSTORE
0000134e: PUSH1 0x20
00001350: PUSH1 0x04
00001352: DUP3
00001353: ADD
00001354: MSTORE
00001355: PUSH1 0x1b
00001357: PUSH1 0x24
00001359: DUP3
0000135a: ADD
0000135b: MSTORE
0000135c: PUSH32 0x496e73756666696369656e7420756e626f6e6465642076616c75650000000000
0000137d: PUSH1 0x44
0000137f: DUP3
00001380: ADD
00001381: MSTORE
00001382: SWAP1
00001383: MLOAD
00001384: SWAP1
00001385: DUP2
00001386: SWAP1
00001387: SUB
00001388: PUSH1 0x64
0000138a: ADD
0000138b: SWAP1
0000138c: REVERT
0000138d: JUMPDEST
0000138e: PUSH1 0x01
00001390: PUSH1 0x01
00001392: PUSH1 0xa0
00001394: SHL
00001395: SUB
00001396: DUP2
00001397: AND
00001398: PUSH1 0x00
0000139a: SWAP1
0000139b: DUP2
0000139c: MSTORE
0000139d: PUSH1 0x01
0000139f: PUSH1 0x20
000013a1: MSTORE
000013a2: PUSH1 0x40
000013a4: SWAP1
000013a5: KECCAK256
000013a6: SLOAD
000013a7: PUSH2 0x13b6
000013aa: SWAP1
000013ab: DUP4
000013ac: PUSH4 0xffffffff
000013b1: PUSH2 0x14c7
000013b4: AND
000013b5: JUMP
000013b6: JUMPDEST
000013b7: PUSH1 0x01
000013b9: PUSH1 0x01
000013bb: PUSH1 0xa0
000013bd: SHL
000013be: SUB
000013bf: DUP3
000013c0: AND
000013c1: PUSH1 0x00
000013c3: SWAP1
000013c4: DUP2
000013c5: MSTORE
000013c6: PUSH1 0x01
000013c8: PUSH1 0x20
000013ca: MSTORE
000013cb: PUSH1 0x40
000013cd: DUP2
000013ce: KECCAK256
000013cf: SWAP2
000013d0: SWAP1
000013d1: SWAP2
000013d2: SSTORE
000013d3: PUSH2 0x13db
000013d6: DUP3
000013d7: PUSH2 0x0ca7
000013da: JUMP
000013db: JUMPDEST
000013dc: PUSH1 0x40
000013de: MLOAD
000013df: SWAP1
000013e0: SWAP2
000013e1: POP
000013e2: PUSH1 0x00
000013e4: SWAP1
000013e5: PUSH1 0x01
000013e7: PUSH1 0x01
000013e9: PUSH1 0xa0
000013eb: SHL
000013ec: SUB
000013ed: DUP4
000013ee: AND
000013ef: SWAP1
000013f0: DUP6
000013f1: SWAP1
000013f2: DUP4
000013f3: DUP2
000013f4: DUP2
000013f5: DUP2
000013f6: DUP6
000013f7: DUP8
000013f8: GAS
000013f9: CALL
000013fa: SWAP3
000013fb: POP
000013fc: POP
000013fd: POP
000013fe: RETURNDATASIZE
000013ff: DUP1
00001400: PUSH1 0x00
00001402: DUP2
00001403: EQ
00001404: PUSH2 0x1429
00001407: JUMPI
00001408: PUSH1 0x40
0000140a: MLOAD
0000140b: SWAP2
0000140c: POP
0000140d: PUSH1 0x1f
0000140f: NOT
00001410: PUSH1 0x3f
00001412: RETURNDATASIZE
00001413: ADD
00001414: AND
00001415: DUP3
00001416: ADD
00001417: PUSH1 0x40
00001419: MSTORE
0000141a: RETURNDATASIZE
0000141b: DUP3
0000141c: MSTORE
0000141d: RETURNDATASIZE
0000141e: PUSH1 0x00
00001420: PUSH1 0x20
00001422: DUP5
00001423: ADD
00001424: RETURNDATACOPY
00001425: PUSH2 0x142e
00001428: JUMP
00001429: JUMPDEST
0000142a: PUSH1 0x60
0000142c: SWAP2
0000142d: POP
0000142e: JUMPDEST
0000142f: POP
00001430: POP
00001431: SWAP1
00001432: POP
00001433: DUP1
00001434: PUSH2 0x1476
00001437: JUMPI
00001438: PUSH1 0x40
0000143a: DUP1
0000143b: MLOAD
0000143c: PUSH3 0x461bcd
00001440: PUSH1 0xe5
00001442: SHL
00001443: DUP2
00001444: MSTORE
00001445: PUSH1 0x20
00001447: PUSH1 0x04
00001449: DUP3
0000144a: ADD
0000144b: MSTORE
0000144c: PUSH1 0x0f
0000144e: PUSH1 0x24
00001450: DUP3
00001451: ADD
00001452: MSTORE
00001453: PUSH15 0x151c985b9cd9995c8819985a5b1959
00001463: PUSH1 0x8a
00001465: SHL
00001466: PUSH1 0x44
00001468: DUP3
00001469: ADD
0000146a: MSTORE
0000146b: SWAP1
0000146c: MLOAD
0000146d: SWAP1
0000146e: DUP2
0000146f: SWAP1
00001470: SUB
00001471: PUSH1 0x64
00001473: ADD
00001474: SWAP1
00001475: REVERT
00001476: JUMPDEST
00001477: DUP2
00001478: PUSH1 0x01
0000147a: PUSH1 0x01
0000147c: PUSH1 0xa0
0000147e: SHL
0000147f: SUB
00001480: AND
00001481: DUP4
00001482: PUSH1 0x01
00001484: PUSH1 0x01
00001486: PUSH1 0xa0
00001488: SHL
00001489: SUB
0000148a: AND
0000148b: PUSH32 0x5ebf1d16423ab39117c0ca9327215b5bcd423aaf7042044c87248a4423d252d9
000014ac: DUP7
000014ad: PUSH1 0x40
000014af: MLOAD
000014b0: DUP1
000014b1: DUP3
000014b2: DUP2
000014b3: MSTORE
000014b4: PUSH1 0x20
000014b6: ADD
000014b7: SWAP2
000014b8: POP
000014b9: POP
000014ba: PUSH1 0x40
000014bc: MLOAD
000014bd: DUP1
000014be: SWAP2
000014bf: SUB
000014c0: SWAP1
000014c1: LOG3
000014c2: POP
000014c3: POP
000014c4: POP
000014c5: POP
000014c6: JUMP
000014c7: JUMPDEST
000014c8: PUSH1 0x00
000014ca: DUP3
000014cb: DUP3
000014cc: GT
000014cd: ISZERO
000014ce: PUSH2 0x151e
000014d1: JUMPI
000014d2: PUSH1 0x40
000014d4: DUP1
000014d5: MLOAD
000014d6: PUSH3 0x461bcd
000014da: PUSH1 0xe5
000014dc: SHL
000014dd: DUP2
000014de: MSTORE
000014df: PUSH1 0x20
000014e1: PUSH1 0x04
000014e3: DUP3
000014e4: ADD
000014e5: MSTORE
000014e6: PUSH1 0x1e
000014e8: PUSH1 0x24
000014ea: DUP3
000014eb: ADD
000014ec: MSTORE
000014ed: PUSH32 0x536166654d6174683a207375627472616374696f6e206f766572666c6f770000
0000150e: PUSH1 0x44
00001510: DUP3
00001511: ADD
00001512: MSTORE
00001513: SWAP1
00001514: MLOAD
00001515: SWAP1
00001516: DUP2
00001517: SWAP1
00001518: SUB
00001519: PUSH1 0x64
0000151b: ADD
0000151c: SWAP1
0000151d: REVERT
0000151e: JUMPDEST
0000151f: POP
00001520: SWAP1
00001521: SUB
00001522: SWAP1
00001523: JUMP
00001524: JUMPDEST
00001525: PUSH1 0x00
00001527: DUP5
00001528: PUSH1 0x01
0000152a: PUSH1 0x01
0000152c: PUSH1 0xa0
0000152e: SHL
0000152f: SUB
00001530: AND
00001531: DUP4
00001532: PUSH1 0x01
00001534: PUSH1 0x01
00001536: PUSH1 0xa0
00001538: SHL
00001539: SUB
0000153a: AND
0000153b: PUSH4 0xd5f52076
00001540: PUSH1 0x40
00001542: MLOAD
00001543: DUP2
00001544: PUSH4 0xffffffff
00001549: AND
0000154a: PUSH1 0xe0
0000154c: SHL
0000154d: DUP2
0000154e: MSTORE
0000154f: PUSH1 0x04
00001551: ADD
00001552: PUSH1 0x20
00001554: PUSH1 0x40
00001556: MLOAD
00001557: DUP1
00001558: DUP4
00001559: SUB
0000155a: DUP2
0000155b: DUP7
0000155c: DUP1
0000155d: EXTCODESIZE
0000155e: ISZERO
0000155f: DUP1
00001560: ISZERO
00001561: PUSH2 0x1569
00001564: JUMPI
00001565: PUSH1 0x00
00001567: DUP1
00001568: REVERT
00001569: JUMPDEST
0000156a: POP
0000156b: GAS
0000156c: STATICCALL
0000156d: ISZERO
0000156e: DUP1
0000156f: ISZERO
00001570: PUSH2 0x157d
00001573: JUMPI
00001574: RETURNDATASIZE
00001575: PUSH1 0x00
00001577: DUP1
00001578: RETURNDATACOPY
00001579: RETURNDATASIZE
0000157a: PUSH1 0x00
0000157c: REVERT
0000157d: JUMPDEST
0000157e: POP
0000157f: POP
00001580: POP
00001581: POP
00001582: PUSH1 0x40
00001584: MLOAD
00001585: RETURNDATASIZE
00001586: PUSH1 0x20
00001588: DUP2
00001589: LT
0000158a: ISZERO
0000158b: PUSH2 0x1593
0000158e: JUMPI
0000158f: PUSH1 0x00
00001591: DUP1
00001592: REVERT
00001593: JUMPDEST
00001594: POP
00001595: MLOAD
00001596: PUSH1 0x01
00001598: PUSH1 0x01
0000159a: PUSH1 0xa0
0000159c: SHL
0000159d: SUB
0000159e: AND
0000159f: EQ
000015a0: PUSH2 0x15da
000015a3: JUMPI
000015a4: PUSH1 0x40
000015a6: MLOAD
000015a7: PUSH3 0x461bcd
000015ab: PUSH1 0xe5
000015ad: SHL
000015ae: DUP2
000015af: MSTORE
000015b0: PUSH1 0x04
000015b2: ADD
000015b3: DUP1
000015b4: DUP1
000015b5: PUSH1 0x20
000015b7: ADD
000015b8: DUP3
000015b9: DUP2
000015ba: SUB
000015bb: DUP3
000015bc: MSTORE
000015bd: PUSH1 0x26
000015bf: DUP2
000015c0: MSTORE
000015c1: PUSH1 0x20
000015c3: ADD
000015c4: DUP1
000015c5: PUSH2 0x18cb
000015c8: PUSH1 0x26
000015ca: SWAP2
000015cb: CODECOPY
000015cc: PUSH1 0x40
000015ce: ADD
000015cf: SWAP2
000015d0: POP
000015d1: POP
000015d2: PUSH1 0x40
000015d4: MLOAD
000015d5: DUP1
000015d6: SWAP2
000015d7: SUB
000015d8: SWAP1
000015d9: REVERT
000015da: JUMPDEST
000015db: PUSH1 0x60
000015dd: DUP3
000015de: PUSH1 0x01
000015e0: PUSH1 0x01
000015e2: PUSH1 0xa0
000015e4: SHL
000015e5: SUB
000015e6: AND
000015e7: PUSH4 0xca9a33ce
000015ec: DUP6
000015ed: PUSH1 0x40
000015ef: MLOAD
000015f0: DUP3
000015f1: PUSH4 0xffffffff
000015f6: AND
000015f7: PUSH1 0xe0
000015f9: SHL
000015fa: DUP2
000015fb: MSTORE
000015fc: PUSH1 0x04
000015fe: ADD
000015ff: DUP1
00001600: DUP3
00001601: PUSH1 0x01
00001603: PUSH1 0x01
00001605: PUSH1 0xa0
00001607: SHL
00001608: SUB
00001609: AND
0000160a: PUSH1 0x01
0000160c: PUSH1 0x01
0000160e: PUSH1 0xa0
00001610: SHL
00001611: SUB
00001612: AND
00001613: DUP2
00001614: MSTORE
00001615: PUSH1 0x20
00001617: ADD
00001618: SWAP2
00001619: POP
0000161a: POP
0000161b: PUSH1 0x00
0000161d: PUSH1 0x40
0000161f: MLOAD
00001620: DUP1
00001621: DUP4
00001622: SUB
00001623: DUP2
00001624: DUP7
00001625: DUP1
00001626: EXTCODESIZE
00001627: ISZERO
00001628: DUP1
00001629: ISZERO
0000162a: PUSH2 0x1632
0000162d: JUMPI
0000162e: PUSH1 0x00
00001630: DUP1
00001631: REVERT
00001632: JUMPDEST
00001633: POP
00001634: GAS
00001635: STATICCALL
00001636: ISZERO
00001637: DUP1
00001638: ISZERO
00001639: PUSH2 0x1646
0000163c: JUMPI
0000163d: RETURNDATASIZE
0000163e: PUSH1 0x00
00001640: DUP1
00001641: RETURNDATACOPY
00001642: RETURNDATASIZE
00001643: PUSH1 0x00
00001645: REVERT
00001646: JUMPDEST
00001647: POP
00001648: POP
00001649: POP
0000164a: POP
0000164b: PUSH1 0x40
0000164d: MLOAD
0000164e: RETURNDATASIZE
0000164f: PUSH1 0x00
00001651: DUP3
00001652: RETURNDATACOPY
00001653: PUSH1 0x1f
00001655: RETURNDATASIZE
00001656: SWAP1
00001657: DUP2
00001658: ADD
00001659: PUSH1 0x1f
0000165b: NOT
0000165c: AND
0000165d: DUP3
0000165e: ADD
0000165f: PUSH1 0x40
00001661: MSTORE
00001662: PUSH1 0x20
00001664: DUP2
00001665: LT
00001666: ISZERO
00001667: PUSH2 0x166f
0000166a: JUMPI
0000166b: PUSH1 0x00
0000166d: DUP1
0000166e: REVERT
0000166f: JUMPDEST
00001670: DUP2
00001671: ADD
00001672: SWAP1
00001673: DUP1
00001674: DUP1
00001675: MLOAD
00001676: PUSH1 0x40
00001678: MLOAD
00001679: SWAP4
0000167a: SWAP3
0000167b: SWAP2
0000167c: SWAP1
0000167d: DUP5
0000167e: PUSH5 0x0100000000
00001684: DUP3
00001685: GT
00001686: ISZERO
00001687: PUSH2 0x168f
0000168a: JUMPI
0000168b: PUSH1 0x00
0000168d: DUP1
0000168e: REVERT
0000168f: JUMPDEST
00001690: SWAP1
00001691: DUP4
00001692: ADD
00001693: SWAP1
00001694: PUSH1 0x20
00001696: DUP3
00001697: ADD
00001698: DUP6
00001699: DUP2
0000169a: GT
0000169b: ISZERO
0000169c: PUSH2 0x16a4
0000169f: JUMPI
000016a0: PUSH1 0x00
000016a2: DUP1
000016a3: REVERT
000016a4: JUMPDEST
000016a5: DUP3
000016a6: MLOAD
000016a7: DUP7
000016a8: PUSH1 0x20
000016aa: DUP3
000016ab: MUL
000016ac: DUP4
000016ad: ADD
000016ae: GT
000016af: PUSH5 0x0100000000
000016b5: DUP3
000016b6: GT
000016b7: OR
000016b8: ISZERO
000016b9: PUSH2 0x16c1
000016bc: JUMPI
000016bd: PUSH1 0x00
000016bf: DUP1
000016c0: REVERT
000016c1: JUMPDEST
000016c2: DUP3
000016c3: MSTORE
000016c4: POP
000016c5: DUP2
000016c6: MLOAD
000016c7: PUSH1 0x20
000016c9: SWAP2
000016ca: DUP3
000016cb: ADD
000016cc: SWAP3
000016cd: DUP3
000016ce: ADD
000016cf: SWAP2
000016d0: MUL
000016d1: DUP1
000016d2: DUP4
000016d3: DUP4
000016d4: PUSH1 0x00
000016d6: JUMPDEST
000016d7: DUP4
000016d8: DUP2
000016d9: LT
000016da: ISZERO
000016db: PUSH2 0x16ee
000016de: JUMPI
000016df: DUP2
000016e0: DUP2
000016e1: ADD
000016e2: MLOAD
000016e3: DUP4
000016e4: DUP3
000016e5: ADD
000016e6: MSTORE
000016e7: PUSH1 0x20
000016e9: ADD
000016ea: PUSH2 0x16d6
000016ed: JUMP
000016ee: JUMPDEST
000016ef: POP
000016f0: POP
000016f1: POP
000016f2: POP
000016f3: SWAP1
000016f4: POP
000016f5: ADD
000016f6: PUSH1 0x40
000016f8: MSTORE
000016f9: POP
000016fa: POP
000016fb: POP
000016fc: SWAP1
000016fd: POP
000016fe: PUSH2 0x1710
00001701: DUP6
00001702: DUP3
00001703: PUSH2 0x1774
00001706: SWAP1
00001707: SWAP2
00001708: SWAP1
00001709: PUSH4 0xffffffff
0000170e: AND
0000170f: JUMP
00001710: JUMPDEST
00001711: SWAP7
00001712: SWAP6
00001713: POP
00001714: POP
00001715: POP
00001716: POP
00001717: POP
00001718: POP
00001719: JUMP
0000171a: JUMPDEST
0000171b: PUSH1 0x00
0000171d: DUP3
0000171e: DUP3
0000171f: ADD
00001720: DUP4
00001721: DUP2
00001722: LT
00001723: ISZERO
00001724: PUSH2 0x08d9
00001727: JUMPI
00001728: PUSH1 0x40
0000172a: DUP1
0000172b: MLOAD
0000172c: PUSH3 0x461bcd
00001730: PUSH1 0xe5
00001732: SHL
00001733: DUP2
00001734: MSTORE
00001735: PUSH1 0x20
00001737: PUSH1 0x04
00001739: DUP3
0000173a: ADD
0000173b: MSTORE
0000173c: PUSH1 0x1b
0000173e: PUSH1 0x24
00001740: DUP3
00001741: ADD
00001742: MSTORE
00001743: PUSH32 0x536166654d6174683a206164646974696f6e206f766572666c6f770000000000
00001764: PUSH1 0x44
00001766: DUP3
00001767: ADD
00001768: MSTORE
00001769: SWAP1
0000176a: MLOAD
0000176b: SWAP1
0000176c: DUP2
0000176d: SWAP1
0000176e: SUB
0000176f: PUSH1 0x64
00001771: ADD
00001772: SWAP1
00001773: REVERT
00001774: JUMPDEST
00001775: PUSH1 0x00
00001777: DUP1
00001778: JUMPDEST
00001779: DUP4
0000177a: MLOAD
0000177b: DUP2
0000177c: LT
0000177d: ISZERO
0000177e: PUSH2 0x08d5
00001781: JUMPI
00001782: DUP4
00001783: DUP2
00001784: DUP2
00001785: MLOAD
00001786: DUP2
00001787: LT
00001788: PUSH2 0x178d
0000178b: JUMPI
0000178c: INVALID
0000178d: JUMPDEST
0000178e: PUSH1 0x20
00001790: MUL
00001791: PUSH1 0x20
00001793: ADD
00001794: ADD
00001795: MLOAD
00001796: PUSH1 0x01
00001798: PUSH1 0x01
0000179a: PUSH1 0xa0
0000179c: SHL
0000179d: SUB
0000179e: AND
0000179f: DUP4
000017a0: PUSH1 0x01
000017a2: PUSH1 0x01
000017a4: PUSH1 0xa0
000017a6: SHL
000017a7: SUB
000017a8: AND
000017a9: EQ
000017aa: ISZERO
000017ab: PUSH2 0x17b8
000017ae: JUMPI
000017af: PUSH1 0x01
000017b1: SWAP2
000017b2: POP
000017b3: POP
000017b4: PUSH2 0x09df
000017b7: JUMP
000017b8: JUMPDEST
000017b9: PUSH1 0x01
000017bb: ADD
000017bc: PUSH2 0x1778
000017bf: JUMP
000017c0: INVALID
000017c1: MSTORE
000017c2: PUSH6 0x666572656e63
000017c9: PUSH6 0x204944206e6f
000017d0: PUSH21 0x20756e6971756520666f7220686f6c64657220616e
000017e6: PUSH5 0x206f706572
000017ec: PUSH2 0x746f
000017ef: PUSH19 0x42656e6566696369617279206e6f7420646566
00001803: PUSH10 0x6e656420666f72207468
0000180e: PUSH6 0x206f70657261
00001815: PUSH21 0x6f7252657175657374656420616d6f756e74206973
0000182b: KECCAK256
0000182c: PUSH8 0x7265617465722074
00001835: PUSH9 0x616e2074686520626f
0000183f: PUSH15 0x644f6e6c79206772616e7465652069
0000184f: PUSH20 0x20616c6c6f77656420746f207769746864726177
00001864: KECCAK256
00001865: PUSH3 0x6f6e64
00001869: MSTORE
0000186a: PUSH6 0x717565737465
00001871: PUSH5 0x20616d6f75
00001877: PUSH15 0x742073686f756c6420626520677265
00001887: PUSH2 0x7465
0000188a: PUSH19 0x207468616e207a65726f4f6e6c79206f706572
0000189e: PUSH2 0x746f
000018a1: PUSH19 0x206f7220746865206f776e657220697320616c
000018b5: PUSH13 0x6f77656420746f207769746864
000018c3: PUSH19 0x617720626f6e644e6f742061206772616e7465
000018d7: PUSH6 0x206f66207468
000018de: PUSH6 0x2070726f7669
000018e5: PUSH5 0x656420636f
000018eb: PUSH15 0x7472616374a265627a7a7231582071
000018fb: ADDMOD
000018fc: UNKNOWN(0xD2)
000018fd: ADDMOD
000018fe: UNKNOWN(0xD3)
000018ff: UNKNOWN(0xCE)
00001900: PUSH31 0x91a763eae4d03409a50b7cb2558790a534910b1d1c923017c564736f6c6343
00001920: STOP
00001921: SDIV
00001922: GT
00001923: STOP
00001924: ORIGIN

Findings

validated = confirmed for call sinks; sink observed for others
Severity Category Tool Title Confidence Validated Confirmed Details
high access_control codex Arbitrary caller can drain any existing allowance by crafting grants 85 no
view
evidence_json
{
    "evidence": "`receiveApproval` is public and only checks `_token` equality, then uses attacker-controlled `_extraData` and calls `token.safeTransferFrom(_from, address(this), _amount)` without validating `msg.sender`, enabling anyone to consume existing allowances and set themselves as grantee.",
    "locations": [
        "contracts/@keep-network/keep-core/contracts/TokenGrant.sol:210",
        "contracts/@keep-network/keep-core/contracts/TokenGrant.sol:211",
        "contracts/@keep-network/keep-core/contracts/TokenGrant.sol:252",
        "contracts/@keep-network/keep-core/contracts/TokenGrant.sol:262"
    ],
    "recommendation": "Require `msg.sender == address(token)` in `receiveApproval` (approve-and-call pattern), and optionally reject direct calls by enforcing that only the token contract can invoke it.",
    "exploit_scenario": "1) Victim approves TokenGrant to spend X KEEP (e.g., via `approve` in a separate tx before calling it). 2) Attacker calls `TokenGrant.receiveApproval` with `_from` set to the victim, `_amount` <= allowance, and `_extraData` encoding `grantee=attacker`, `duration=0`, `start=0`, `cliffDuration=0` (immediate unlock), `stakingPolicy` any non-zero. 3) TokenGrant pulls X tokens from the victim and creates a fully unlocked grant. 4) Attacker calls `TokenGrant.withdraw(grantId)` (or does it in the same tx via a wrapper) to transfer X KEEP to themselves. Profit: up to the victim\u2019s approved allowance; if users grant unlimited allowance, this can drain their full KEEP balance."
}
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": "0xd20a62fc",
            "selector": "0xd20a62fc",
            "calldata_variants": [
                "0xd20a62fc",
                "0xd20a62fc0000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xef1f9661",
            "selector": "0xef1f9661",
            "calldata_variants": [
                "0xef1f9661",
                "0xef1f96610000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xf340fa01",
            "selector": "0xf340fa01",
            "calldata_variants": [
                "0xf340fa01",
                "0xf340fa010000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xfb1677b1",
            "selector": "0xfb1677b1",
            "calldata_variants": [
                "0xfb1677b1",
                "0xfb1677b10000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0x7ab3cf93",
            "selector": "0x7ab3cf93",
            "calldata_variants": [
                "0x7ab3cf93",
                "0x7ab3cf930000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0x972f2457",
            "selector": "0x972f2457",
            "calldata_variants": [
                "0x972f2457",
                "0x972f24570000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xba7bffd3",
            "selector": "0xba7bffd3",
            "calldata_variants": [
                "0xba7bffd3",
                "0xba7bffd30000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xc5786174",
            "selector": "0xc5786174",
            "calldata_variants": [
                "0xc5786174",
                "0xc57861740000000000000000000000000000000000000000000000000000000000000000"
            ]
        }
    ]
}
evidence_json
{
    "guards_detected": [
        {
            "pc": 6436,
            "type": "tx_origin_used"
        }
    ]
}
medium other detector Untrusted CALL target/value reachable 45 no no
view
trace_id: 0xb5b7bf796cdee715c8fd30bb007bb182725bac1590f65ac086ca0628c4a586a3
call_targets: 0x27321f84704a599ab740281e285cc4463d89a3d5
target_varies: no
classification: constant_target
validation_json
{
    "sink": "CALL",
    "errors": 0,
    "status": "sink_reached",
    "attempts": 1,
    "trace_id": "0xb5b7bf796cdee715c8fd30bb007bb182725bac1590f65ac086ca0628c4a586a3",
    "confirmed": false,
    "trace_mode": "callTracer",
    "call_targets": [
        "0x27321f84704a599ab740281e285cc4463d89a3d5"
    ],
    "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": "0xd20a62fc",
            "selector": "0xd20a62fc",
            "calldata_variants": [
                "0xd20a62fc",
                "0xd20a62fc0000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xef1f9661",
            "selector": "0xef1f9661",
            "calldata_variants": [
                "0xef1f9661",
                "0xef1f96610000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xf340fa01",
            "selector": "0xf340fa01",
            "calldata_variants": [
                "0xf340fa01",
                "0xf340fa010000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xfb1677b1",
            "selector": "0xfb1677b1",
            "calldata_variants": [
                "0xfb1677b1",
                "0xfb1677b10000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0x7ab3cf93",
            "selector": "0x7ab3cf93",
            "calldata_variants": [
                "0x7ab3cf93",
                "0x7ab3cf930000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0x972f2457",
            "selector": "0x972f2457",
            "calldata_variants": [
                "0x972f2457",
                "0x972f24570000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xba7bffd3",
            "selector": "0xba7bffd3",
            "calldata_variants": [
                "0xba7bffd3",
                "0xba7bffd30000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xc5786174",
            "selector": "0xc5786174",
            "calldata_variants": [
                "0xc5786174",
                "0xc57861740000000000000000000000000000000000000000000000000000000000000000"
            ]
        }
    ]
}
evidence_json
{
    "examples": [
        {
            "pc": 1862,
            "opcode": "CALL",
            "returndata_checked": null,
            "value_expression_category": "computed",
            "target_expression_category": "computed"
        },
        {
            "pc": 5113,
            "opcode": "CALL",
            "returndata_checked": null,
            "value_expression_category": "computed",
            "target_expression_category": "computed"
        }
    ],
    "call_count": 2,
    "guards_detected": [
        {
            "pc": 6436,
            "type": "tx_origin_used"
        }
    ],
    "untrusted_call_count": 2
}
medium other detector ETH value transfer possible 40 no no
view
trace_id: 0xb5b7bf796cdee715c8fd30bb007bb182725bac1590f65ac086ca0628c4a586a3
call_targets: 0x27321f84704a599ab740281e285cc4463d89a3d5
target_varies: no
classification: constant_target
validation_json
{
    "sink": "CALL",
    "errors": 0,
    "status": "sink_reached",
    "attempts": 1,
    "trace_id": "0xb5b7bf796cdee715c8fd30bb007bb182725bac1590f65ac086ca0628c4a586a3",
    "confirmed": false,
    "trace_mode": "callTracer",
    "call_targets": [
        "0x27321f84704a599ab740281e285cc4463d89a3d5"
    ],
    "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": "0xd20a62fc",
            "selector": "0xd20a62fc",
            "calldata_variants": [
                "0xd20a62fc",
                "0xd20a62fc0000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xef1f9661",
            "selector": "0xef1f9661",
            "calldata_variants": [
                "0xef1f9661",
                "0xef1f96610000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xf340fa01",
            "selector": "0xf340fa01",
            "calldata_variants": [
                "0xf340fa01",
                "0xf340fa010000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xfb1677b1",
            "selector": "0xfb1677b1",
            "calldata_variants": [
                "0xfb1677b1",
                "0xfb1677b10000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0x7ab3cf93",
            "selector": "0x7ab3cf93",
            "calldata_variants": [
                "0x7ab3cf93",
                "0x7ab3cf930000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0x972f2457",
            "selector": "0x972f2457",
            "calldata_variants": [
                "0x972f2457",
                "0x972f24570000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xba7bffd3",
            "selector": "0xba7bffd3",
            "calldata_variants": [
                "0xba7bffd3",
                "0xba7bffd30000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xc5786174",
            "selector": "0xc5786174",
            "calldata_variants": [
                "0xc5786174",
                "0xc57861740000000000000000000000000000000000000000000000000000000000000000"
            ]
        }
    ]
}
evidence_json
{
    "examples": [
        {
            "pc": 1862,
            "opcode": "CALL",
            "returndata_checked": null,
            "value_expression_category": "computed",
            "target_expression_category": "computed"
        },
        {
            "pc": 5113,
            "opcode": "CALL",
            "returndata_checked": null,
            "value_expression_category": "computed",
            "target_expression_category": "computed"
        }
    ],
    "eth_value_calls": 2,
    "guards_detected": [
        {
            "pc": 6436,
            "type": "tx_origin_used"
        }
    ]
}
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": 8
}