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

Analysis Run

019d5666-7793-71fe-8365-fe0e83fcb95f

failed
Chain ID
1
Address
Block Number
Created
Sat, Apr 4, 2026 2:50 AM
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
Authorization based on tx.origin
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
42911 artifact.fetch complete 1 / 3 1 week ago
42912 proxy.resolve complete 1 / 3 1 week ago
42913 tool.cast_disasm complete 1 / 3 1 week ago
42914 analysis.bundle complete 1 / 3 1 week ago
42915 capability.graph complete 1 / 3 1 week ago
42916 detector.run complete 1 / 3 1 week ago
42917 validation.fork complete 1 / 3 1 week ago
43002 report.consolidate complete 1 / 6 1 week ago
43003 tool.slither failed 2 / 2 1 week ago

Artifact

Runtime bytecode: available
Creation TX:
Deployer:
Proxy: no not_proxy
Implementation:
Verified Source: yes
Proxy evidence
{
    "status": "not_proxy"
}

Slither

tool.slither
Status
failed 500 Server Error: Internal Server Error for url: https://tripwire.topgun.bot/internal/jobs/43003/complete
Attempts
2 / 2
Findings
0
Solc
View stderr
Traceback (most recent call last):
  File "/var/www/tripwire/worker/worker.py", line 199, in main
    laravel_client.complete_job(job_id, payload if payload else None)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/var/www/tripwire/worker/laravel_client.py", line 27, in complete_job
    return self._post(f"/internal/jobs/{job_id}/complete", payload=payload)
           ~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/var/www/tripwire/worker/laravel_client.py", line 17, in _post
    response.raise_for_status()
    ~~~~~~~~~~~~~~~~~~~~~~~~~^^
  File "/var/www/tripwire/.venv/lib/python3.13/site-packages/requests/models.py", line 1026, in raise_for_status
    raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 500 Server Error: Internal Server Error for url: https://tripwire.topgun.bot/internal/jobs/43003/complete

Codex

report.consolidate
Job Status
complete
Attempts
1 / 6
Findings
2
No findings?
no
Summary
Two exploitable auth issues were found: third parties can consume any valid signature nonce before the intended call executes, and signed payloads are not bound to a specific fund instance, enabling cross-fund replay.
View stdout
{"no_findings":false,"summary":"Two exploitable auth issues were found: third parties can consume any valid signature nonce before the intended call executes, and signed payloads are not bound to a specific fund instance, enabling cross-fund replay.","findings":[{"severity":"high","category":"auth","title":"Signed actions can be replayed across different GuruFund instances","exploit_scenario":"A user or guru who participates in multiple funds can reuse a signature that was issued for Fund A against Fund B, because signature verification happens only in the factory domain and the signed message does not include the target fund address. For example, a withdrawal signature for one closed WETH-only fund can be submitted to another compatible fund where the same user also holds shares, draining value from the wrong fund.","recommendation":"Bind every signed action to the specific fund address and action type. The simplest fix is to include `address(this)` or an explicit `fund` field in the signed struct for all fund actions, or move signature verification/nonces into each GuruFund so the EIP-712 domain is per-fund.","evidence":"`_verifyEIP712` hashes only `(nonce, account, keccak256(data), expiresAt)`. `GuruFund` always verifies through the shared `FundFactory`, and the action structs being signed do not include any fund identifier.","locations":["contracts/helpers/EIP712Helper.sol:78","contracts/FundFactory.sol:151","contracts/GuruFund.sol:258","contracts/lib/FundAction.sol:11","contracts/lib/FundAction.sol:65","contracts/lib/FundAction.sol:87"]},{"severity":"medium","category":"auth","title":"Anyone can front-run and consume another user's signed payload nonce","exploit_scenario":"An attacker watching the mempool can copy a victim's signed payload and call `FundFactory.verifySignature(victim, payload)` first. That call succeeds and increments `noncesByUser[victim]`, causing the victim's subsequent `createFund`, `deposit`, `withdraw`, `rebalance`, or `close` transaction to revert with an invalid signature. The attacker can repeat this cheaply to censor protocol actions.","recommendation":"Do not expose a public state-changing signature verifier. Make verification internal/private, or restrict it to trusted entrypoints. Also consider consuming the nonce only inside the final action after all authorization checks for that action are complete.","evidence":"`FundFactory.verifySignature` is public and directly calls `_verifyEIP712`, which increments `noncesByUser[_account]++` as part of verification. There is no requirement that `msg.sender == account` or that the caller is an authorized contract entrypoint.","locations":["contracts/FundFactory.sol:151","contracts/helpers/EIP712Helper.sol:66","contracts/helpers/EIP712Helper.sol:81","contracts/FundFactory.sol:178","contracts/GuruFund.sol:258"]}]}
View stderr
OpenAI Codex v0.118.0 (research preview)
--------
workdir: /tmp/codex-qadnxli7
model: gpt-5.4
provider: openai
approval: never
sandbox: read-only
reasoning effort: high
reasoning summaries: none
session id: 019d56aa-de7d-7f23-8469-127f6166c789
--------
user
You are a security auditor. Audit this Solidity codebase for exploitable vulnerabilities.
Focus on: reentrancy, access control, upgradeability/proxy issues, signature validation, oracle manipulation,
accounting/invariant breaks, external call patterns, unchecked return values, and dangerous delegatecall.

Scope rules:
- You MUST fully read `AUDIT_BUNDLE.txt` before concluding. It contains the complete contents of all first-party Solidity sources in this workspace.
- Treat `lib/` and `@openzeppelin/` as third-party dependencies; skip them unless there is a concrete misuse angle in first-party code.
- If there are only dependency files and no first-party sources, set no_findings=true and explain in summary.

Output MUST be valid JSON matching the provided schema.
- If you find nothing meaningful: set no_findings=true and findings=[].
- Otherwise: set no_findings=false and include findings with severity/category/title and file/line locations when possible.

Output constraints (IMPORTANT):
- severity MUST be exactly one of: info, low, medium, high, critical (lowercase).
- category MUST be exactly one of: access_control, reentrancy, math, oracle, upgradeability, auth, other.
Keep summary short and concrete.
warning: Codex could not find system bubblewrap on PATH. Please install bubblewrap with your package manager. Codex will use the vendored bubblewrap in the meantime.
  → Inspect workspace and fully read AUDIT_BUNDLE.txt as required
  • Analyze first-party Solidity sources for exploitable issues in scoped categories
  • Produce JSON audit result with evidence and locations
exec
/bin/bash -lc pwd in /tmp/codex-qadnxli7
 succeeded in 0ms:
/tmp/codex-qadnxli7

exec
/bin/bash -lc 'rg --files' in /tmp/codex-qadnxli7
 succeeded in 0ms:
codex-output-schema.json
AUDIT_BUNDLE.txt
contracts/GuruFund.sol
contracts/helpers/EIP712Helper.sol
contracts/helpers/SwapHelper.sol
contracts/helpers/TransferHelper.sol
contracts/interfaces/IWETH.sol
@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol
contracts/lib/Error.sol
contracts/lib/FundAction.sol
contracts/FundFactory.sol
@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol
contracts/structs/SignedPayload.sol
contracts/structs/AssetIndex.sol
contracts/structs/DepositAmounts.sol
contracts/structs/Swap.sol
contracts/structs/WithdrawalAmounts.sol
contracts/structs/InitialDeposit.sol
@openzeppelin/contracts/interfaces/IERC1363.sol
@openzeppelin/contracts/interfaces/IERC20.sol
@openzeppelin/contracts/interfaces/IERC1271.sol
@openzeppelin/contracts/interfaces/draft-IERC6093.sol
@openzeppelin/contracts/interfaces/IERC5267.sol
@openzeppelin/contracts/interfaces/IERC165.sol
@openzeppelin/contracts/utils/Strings.sol
@openzeppelin/contracts/access/Ownable.sol
@openzeppelin/contracts/proxy/Clones.sol
@openzeppelin/contracts/utils/Address.sol
@openzeppelin/contracts/utils/Errors.sol
@openzeppelin/contracts/utils/Context.sol
@openzeppelin/contracts/utils/Pausable.sol
@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol
@openzeppelin/contracts/utils/math/Math.sol
@openzeppelin/contracts/utils/math/SafeCast.sol
@openzeppelin/contracts/utils/StorageSlot.sol
@openzeppelin/contracts/utils/math/SignedMath.sol
@openzeppelin/contracts/utils/ShortStrings.sol
@openzeppelin/contracts/utils/Panic.sol
@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol
@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol
@openzeppelin/contracts/utils/introspection/IERC165.sol
@openzeppelin/contracts/utils/cryptography/SignatureChecker.sol
@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol
@openzeppelin/contracts/utils/cryptography/ECDSA.sol
@openzeppelin/contracts/utils/cryptography/EIP712.sol
@openzeppelin/contracts/token/ERC20/ERC20.sol
@openzeppelin/contracts/token/ERC20/IERC20.sol
@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol
@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol

exec
/bin/bash -lc "wc -l AUDIT_BUNDLE.txt && sed -n '1,260p' AUDIT_BUNDLE.txt && printf '\\n<<CHUNK_BREAK>>\\n' && sed -n '261,520p' AUDIT_BUNDLE.txt && printf '\\n<<CHUNK_BREAK>>\\n' && sed -n '521,780p' AUDIT_BUNDLE.txt && printf '\\n<<CHUNK_BREAK>>\\n' && sed -n '781,1040p' AUDIT_BUNDLE.txt && printf '\\n<<CHUNK_BREAK>>\\n' && sed -n '1041,1300p' AUDIT_BUNDLE.txt" in /tmp/codex-qadnxli7
 succeeded in 0ms:
1739 AUDIT_BUNDLE.txt
This file concatenates the full contents of first-party Solidity sources for auditing.
Do not treat dependency code under lib/ or @openzeppelin/ as first-party.

================================================================================
FILE: contracts/FundFactory.sol
================================================================================
// SPDX-License-Identifier: MIT
pragma solidity =0.8.27;

import { Ownable } from '@openzeppelin/contracts/access/Ownable.sol';
import { Pausable } from '@openzeppelin/contracts/utils/Pausable.sol';
import { ERC20 } from '@openzeppelin/contracts/token/ERC20/ERC20.sol';
import { SafeERC20 } from '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol';
import { Clones } from '@openzeppelin/contracts/proxy/Clones.sol';

import { GuruFund } from 'contracts/GuruFund.sol';
import { EIP712Helper } from 'contracts/helpers/EIP712Helper.sol';
import { SignedPayload } from 'contracts/structs/SignedPayload.sol';
import { IWETH } from 'contracts/interfaces/IWETH.sol';
import { InitialDeposit } from 'contracts/structs/InitialDeposit.sol';
import { Error } from 'contracts/lib/Error.sol';

contract FundFactory is EIP712Helper, Pausable {
    // Immutable variables (stored in code, not storage)
    IWETH public immutable weth;
    GuruFund public immutable fundImplementation;

    // Constants (not stored in storage)
    bytes32 public constant SIGNED_ACTION_TYPEHASH =
        keccak256(
            'SignedAction(uint256 nonce,address account,bytes data,uint256 expiresAt)'
        );
    uint24 public constant FEE_DENOMINATOR = 100_000;
    uint16 public constant MAX_PROFIT_FEE = 20_000; // 20%
    uint16 public constant GURU_PROFIT_FEE = 10_000; // 10%
    uint16 public constant MAX_DEPOSIT_FEE = 1_000; // 1%
    uint16 public constant MAX_SWAP_FEE = 200; // 0.2%

    // Storage variables packed into slots
    address public vault; // slot 0 (20 bytes)
    uint32 public signatureValidityPeriod = 10; // slot 0 (4 bytes)
    uint16 public protocolProfitFee = 5_000; // slot 0 (2 bytes)
    uint16 public protocolDepositFee = 1_000; // slot 0 (2 bytes)
    uint16 public protocolSwapFee = 200; // slot 0 (2 bytes)

    address public guruBurner; // slot 1 (20 bytes)
    uint64 public minimumGuruInitialDepositValue = 1000_000000; // slot 1 (8 bytes)
    uint64 public protocolFundCreationFeeValue = 100_000000; // slot 1 (8 bytes)

    address public admin; // slot 2 (20 bytes)

    // events
    event VaultUpdated(address newVault);
    event GuruBurnerUpdated(address newGuruBurner);
    event AdminUpdated(address newAdmin);
    event MinimumGuruInitialDepositValueUpdated(
        uint64 newMinimumInitialDeposit
    );
    event SignatureValidityPeriodUpdated(uint32 newSignatureValidityPeriod);
    event ProtocolProfitFeeUpdated(uint16 newProtocolProfitFee);
    event ProtocolFundCreationFeeUpdated(uint64 newProtocolFundCreationFee);
    event ProtocolDepositFeeUpdated(uint16 newProtocolDepositFee);
    event ProtocolSwapFeeUpdated(uint16 newProtocolSwapFee);
    event FundCreated(address indexed fund, address indexed creator);

    // errors
    error InsufficientFirstDeposit(uint256 received, uint256 required);
    error FeesTooHigh(uint256 fee, uint256 max);

    constructor(
        address _offchainSigner,
        address _vault,
        address _guruBurner,
        address _admin,
        IWETH _wethAddress
    ) Ownable(msg.sender) EIP712Helper('GURU.FUND', 'v0.1.0', _offchainSigner) {
        vault = _vault;
        guruBurner = _guruBurner;
        weth = _wethAddress;
        admin = _admin;
        fundImplementation = new GuruFund();
    }

    function getTotalProfitFee() public view returns (uint256) {
        return GURU_PROFIT_FEE + protocolProfitFee;
    }

    // config
    function setVault(address _newVault) public onlyOwner {
        vault = _newVault;
        emit VaultUpdated(_newVault);
    }

    function setGuruBurner(address _newGuruBurner) public onlyOwner {
        guruBurner = _newGuruBurner;
        emit GuruBurnerUpdated(_newGuruBurner);
    }

    function setAdmin(address _newAdmin) public onlyOwner {
        admin = _newAdmin;
        emit AdminUpdated(_newAdmin);
    }

    function setProtocolFundCreationFee(
        uint64 _newProtocolFundCreationFee
    ) public onlyOwner {
        protocolFundCreationFeeValue = _newProtocolFundCreationFee;
        emit ProtocolFundCreationFeeUpdated(_newProtocolFundCreationFee);
    }

    function setProtocolDepositFee(
        uint16 _newProtocolDepositFee
    ) public onlyOwner {
        require(
            _newProtocolDepositFee <= MAX_DEPOSIT_FEE,
            FeesTooHigh(_newProtocolDepositFee, MAX_DEPOSIT_FEE)
        );
        protocolDepositFee = _newProtocolDepositFee;
        emit ProtocolDepositFeeUpdated(_newProtocolDepositFee);
    }

    function setProtocolProfitFee(
        uint16 _newProtocolFeeOnProfits
    ) public onlyOwner {
        require(
            GURU_PROFIT_FEE + _newProtocolFeeOnProfits <= MAX_PROFIT_FEE,
            FeesTooHigh(
                GURU_PROFIT_FEE + _newProtocolFeeOnProfits,
                MAX_PROFIT_FEE
            )
        );
        protocolProfitFee = _newProtocolFeeOnProfits;
        emit ProtocolProfitFeeUpdated(_newProtocolFeeOnProfits);
    }

    function setProtocolSwapFee(uint16 _newProtocolSwapFee) public onlyOwner {
        require(
            _newProtocolSwapFee <= MAX_SWAP_FEE,
            FeesTooHigh(_newProtocolSwapFee, MAX_SWAP_FEE)
        );
        protocolSwapFee = _newProtocolSwapFee;
        emit ProtocolSwapFeeUpdated(_newProtocolSwapFee);
    }

    function setMinimumFirstDepositValue(uint64 _newMinimum) public onlyOwner {
        minimumGuruInitialDepositValue = _newMinimum;
        emit MinimumGuruInitialDepositValueUpdated(_newMinimum);
    }

    function setSignatureValidityPeriod(
        uint32 _newSignatureValidityPeriod
    ) public onlyOwner {
        signatureValidityPeriod = _newSignatureValidityPeriod;
        emit SignatureValidityPeriodUpdated(_newSignatureValidityPeriod);
    }

    function verifySignature(
        address account,
        SignedPayload calldata _signedPayload
    ) public {
        _verifyEIP712(SIGNED_ACTION_TYPEHASH, account, _signedPayload);
    }

    function pause() public onlyOwner {
        _pause();
    }

    function unpause() public onlyOwner {
        _unpause();
    }

    /**
     * @notice Creates a new fund with a minimum deposit of 1000 USDT worth of WETH
     * @param _name Name of the fund token
     * @param _symbol Symbol of the fund token
     * @param _signedPayload Signed payload containing expiration, signature, and
     * the encoded price feed with latest WETH/USDT price
     */
    function createFund(
        string calldata _name,
        string calldata _symbol,
        SignedPayload calldata _signedPayload
    ) public payable whenNotPaused {
        verifySignature(msg.sender, _signedPayload);

        InitialDeposit memory initialDeposit = abi.decode(
            _signedPayload.data,
            (InitialDeposit)
        );

        // Any check on the deposit min amount is handled offchain: here we
        // just verify that the amount received is matching the signed payload
        require(
            initialDeposit.amountsWei.input +
                initialDeposit.amountsWei.buybackFee ==
                msg.value,
            Error.MismatchingDepositAmount(initialDeposit.amountsWei, msg.value)
        );

        address fund = Clones.clone(address(fundImplementation));

        GuruFund(payable(fund)).initialize{ value: msg.value }(
            msg.sender,
            _name,
            _symbol,
            initialDeposit
        );

        emit FundCreated(fund, msg.sender);
    }
}

================================================================================
FILE: contracts/GuruFund.sol
================================================================================
// SPDX-License-Identifier: MIT
pragma solidity =0.8.27;

import { OwnableUpgradeable } from '@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol';
import { ReentrancyGuardUpgradeable } from '@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol';
import { ERC20Upgradeable } from '@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol';
import { SafeERC20 } from '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol';
import { ERC20 } from '@openzeppelin/contracts/token/ERC20/ERC20.sol';

import { SignedPayload } from 'contracts/helpers/EIP712Helper.sol';
import { SwapHelper } from 'contracts/helpers/SwapHelper.sol';
import { TransferHelper } from 'contracts/helpers/TransferHelper.sol';
import { Error } from 'contracts/lib/Error.sol';
import { FundAction } from 'contracts/lib/FundAction.sol';
import { InitialDeposit } from 'contracts/structs/InitialDeposit.sol';
import { DepositAmounts } from 'contracts/structs/DepositAmounts.sol';
import { WithdrawalAmounts } from 'contracts/structs/WithdrawalAmounts.sol';
import { FundFactory } from 'contracts/FundFactory.sol';
import { AssetIndex } from 'contracts/structs/AssetIndex.sol';

/**
 * @title GuruFund
 * @author @numa0x
 * @notice This is the contract for a GuruFund, which is a fund handled by a manager (Guru) that invests in a set of digital assets.
 * The fund is represented by a FundToken, which is minted to the Guru when the fund is created as well as to investors when they deposit.
 * - Implements 6-decimals ERC20 for fund tokens, representing the users' shares of the fund
 * - Implements cooldowns for ERC20 transfers to have users wait before withdrawing their funds
 * - Requires signed payloads for every key operations
 * - Funds support up to 8 ERC20 assets
 * - Tracks invested capital per user to accurately compute PnL and fees
 * - Uses nonce system to prevent outdated deposit transactions
 * - Has protocol-wide pause functionality
 */
contract GuruFund is
    ReentrancyGuardUpgradeable,
    OwnableUpgradeable,
    SwapHelper,
    ERC20Upgradeable,
    TransferHelper
{
    using SafeERC20 for ERC20;

    /// Constants ///

    /**

<<CHUNK_BREAK>>
     * @notice The duration of the grace period after the fund is closed. The protocol will
     * not allow any withdrawals after this period.
     */
    uint256 public constant GRACE_PERIOD_DURATION = 180 days;
    uint256 public constant MAX_DEPOSIT_COOLDOWN = 90 days;
    uint256 public constant MANAGEMENT_FEE_PERIOD = 30 days;
    /**
     * @notice The denominator for the management fee mint amount.
     * Monthly rate denominator:
     * ------------------------------------------------------------
     *   Two percent yearly rate: 2/100
     * * Pro-rated monthly: 1/12
     * = 2/100 * 1/12 = 2/1200 = 1/600
     * ------------------------------------------------------------
     * So: if the minted amount needs to be 1/600 of the total supply AFTER the mint,
     * then we need to mint 1/599 of the total supply BEFORE the mint.
     */
    uint256 public constant MANAGEMENT_FEE_DENOMINATOR = 599;

    /// States ///

    /**
     * @notice The factory that created this fund.
     */
    FundFactory public immutable fundFactory;

    /**
     * @notice Whether the fund is open for deposits and withdrawals.
     */
    bool public isOpen;

    /**
     * @notice The fund's assets
     */
    ERC20[8] public assets;

    /**
     * @notice A nonce updated on every rebalance, to prevent users from
     * submitting deposits with outdated swaps.
     */
    uint256 public nonce;

    /**
     * @notice The minimum deposit value for a user to deposit into the fund.
     */
    uint256 public minUserDepositValue;

    /**
     * @notice The minimum time for a user to wait before withdrawing their deposit
     */
    uint256 public minUserDepositCooldown;

    /**
     * @notice The timestamp of the last management fee mint
     */
    uint256 public latestManagementFeeMint;

    /**
     * @notice The end of the grace period after the Guru closed the fund, users can
     * withdraw their funds up to this timestamp
     */
    uint256 public gracePeriodEnd;

    /**
     * @notice The invested capital for each user.
     * @dev This is the sum of the positive TVL deltas during deposits, subtracted
     * of all capital removed through withdrawals.
     */
    mapping(address => uint256) public investedCapital;

    /**
     * @notice The cooldowns of the users
     */
    mapping(address => CooldownsByUser) private _cooldownsByUser;

    /**
     * @notice User deposit cooldown entry
     * @dev The offset is used to skip the cooldowns that have already been processed
     */
    struct CooldownsByUser {
        uint256 offset;
        Cooldown[] cooldowns;
    }

    /**
     * @param timestamp The timestamp of the cooldown end
     * @param amount The amount of tokens that are still locked
     */
    struct Cooldown {
        uint256 timestamp;
        uint256 amount;
    }

    /// Events ///

    /**
     * @notice Emitted when a deposit is made to the fund from a Disciple.
     * @param from The address of the Disciple
     * @param tvlDelta The TVL difference between the initial TVL and the final TVL
     * @param amountsWei The deposit amounts in wei units
     * @param amountsValue The deposit amounts in USDT units
     */
    event Deposited(
        address indexed from,
        int256 tvlDelta,
        uint256 fundTokensMinted,
        DepositAmounts amountsWei,
        DepositAmounts amountsValue
    );

    /**
     * @notice Emitted when an ERC20 asset is added into the fund by the Guru.
     * @param asset The asset deposited
     * @param amount The amount of the asset deposited
     * @param tvlDelta The TVL difference between the initial TVL and the final TVL
     */
    event DepositedAsset(ERC20 asset, uint256 amount, int256 tvlDelta);

    /**
     * @notice Emitted when the assets of the fund are updated.
     * @param assets The updated list of assets
     */
    event AssetsUpdated(ERC20[8] assets);

    /**
     * @notice Emitted when the fund is rebalanced.
     */
    event Rebalanced();

    /**
     * @notice Emitted when a user withdraws their share of the fund.
     * This will swap the assets back to ETH and return it to the user.
     * @param from The address of the user liquidating
     * @param burnAmount The amount of Fund tokens burned
     * @param amountsWei The withdrawal amounts in wei units
     * @param amountsValue The withdrawal amounts in USDT units
     * @param tvlDelta The TVL difference between the initial TVL and the final TVL
     */
    event Withdrawn(
        address indexed from,
        uint256 burnAmount,
        WithdrawalAmounts amountsWei,
        WithdrawalAmounts amountsValue,
        int256 tvlDelta
    );

    /**
     * @notice Emitted when the fund is closed by the Guru
     */
    event Closed();

    /**
     * @notice Emitted when the minimum deposit value for a user is updated.
     * @param newMinimum The new minimum deposit value
     */
    event MinUserDepositValueUpdated(uint256 newMinimum);

    /**
     * @notice Emitted when the minimum deposit cooldown for a user is updated.
     * @param newMinimum The new minimum deposit cooldown
     */
    event MinUserDepositCooldownUpdated(uint256 newMinimum);

    /**
     * @notice Emitted when the management fee is minted.
     * @param amount The amount of management fee minted
     */
    event ManagementFeeMinted(uint256 amount);

    /**
     * @notice Emitted when the grace period is extended.
     * @param newGracePeriodEnd The new grace period end
     */
    event GracePeriodExtended(uint256 newGracePeriodEnd);

    /**
     * @notice Emitted when the protocol owner claims remaining funds for buyback and burn
     */
    event AbandonedFundsClaimed();

    // errors
    error FundClosed();
    error ProtocolHalted();
    error UnexpectedFeeData(
        uint256 fees,
        uint256 maxExpectedFees,
        address feeRecipient
    );
    error MaxCooldownExceeded(uint256 cooldown);
    error DepositMustIncreaseTvl(int256 tvlDelta);
    error InvalidDepositNonce(uint256 depositNonce, uint256 currentNonce);
    error InvalidSwapDirection(address tokenFrom, address tokenTo);
    error AssetIndexAlreadyOccupied(uint8 index, ERC20 assetAtIndex);
    error CooldownNotExpired(uint256 availableBalance, uint256 transferAmount);
    error InvalidTransferAmount(
        uint256 availableBalance,
        uint256 transferAmount
    );
    error ManagementFeePeriodNotElapsed();
    error GracePeriodEnded();

    // modifiers
    modifier onlyOpen() {
        require(isOpen, FundClosed());
        _;
    }

    modifier onlyNotPaused() {
        require(!fundFactory.paused(), ProtocolHalted());
        _;
    }

    modifier verifyingSignature(SignedPayload calldata _payload) {
        fundFactory.verifySignature(msg.sender, _payload);
        _;
    }

    /**
     * @dev This will only be called once when deploying the Fund Factory.
     * Clones initializers will be called by the FundFactory.
     */
    constructor() {
        fundFactory = FundFactory(msg.sender);
        _disableInitializers();
    }

    /// External Functions ///

    /**
     * @notice Initializes the fund with a deposit of ETH, which is wrapped.
     * @dev Only the fund factory can call this function, after verifying the signature of the payload.
     * @param _guru The address of the Guru (owner) of the fund
     * @param _initialDeposit The initial deposit of the fund
     */
    function initialize(
        address _guru,
        string calldata _name,
        string calldata _symbol,
        InitialDeposit calldata _initialDeposit
    ) external payable initializer {
        require(msg.sender == address(fundFactory), Error.Unauthorized());
        require(
            _initialDeposit.minUserDepositCooldown <= MAX_DEPOSIT_COOLDOWN,
            MaxCooldownExceeded(_initialDeposit.minUserDepositCooldown)
        );

        __SwapHelper_init_unchained(
            address(fundFactory.weth()),
            address(fundFactory.vault())
        );
        __Ownable_init_unchained(_guru);
        __ERC20_init_unchained(_name, _symbol);

        // Open the fund
        minUserDepositValue = _initialDeposit.minUserDepositValue;
        minUserDepositCooldown = _initialDeposit.minUserDepositCooldown;
        latestManagementFeeMint = block.timestamp; // Allows first mint in the next period
        isOpen = true;

        // Wrap the initial deposit net amount

<<CHUNK_BREAK>>
        _wrapETH(msg.value - _initialDeposit.amountsWei.buybackFee);

        // Initialize the assets array with WETH
        assets[0] = ERC20(address(fundFactory.weth()));

        emit AssetsUpdated(assets);

        // Mint the fund tokens to the Guru
        _mint(_guru, _initialDeposit.amountsValue.input);

        // Update the invested capital
        investedCapital[_guru] = uint256(_initialDeposit.amountsValue.input);

        // Handle buyback and burn
        _safeTransferETH(
            fundFactory.guruBurner(),
            _initialDeposit.amountsWei.buybackFee
        );

        emit Deposited(
            _guru,
            int256(_initialDeposit.amountsValue.input), // first ∆ TVL is the initial deposit value
            _initialDeposit.amountsValue.input, // first deposit mint amount matches its USDT value
            _initialDeposit.amountsWei,
            _initialDeposit.amountsValue
        );
    }

    /**
     * @notice Gurus can call this function to directly deposit an asset into the fund.
     * @param _signedAssetDeposit The signed payload containing the asset to deposit
     */
    function depositAsset(
        SignedPayload calldata _signedAssetDeposit
    ) external nonReentrant onlyOwner verifyingSignature(_signedAssetDeposit) {
        FundAction.AssetDeposit memory _deposit = abi.decode(
            _signedAssetDeposit.data,
            (FundAction.AssetDeposit)
        );

        require(
            _deposit.tvlDelta >= 0,
            DepositMustIncreaseTvl(_deposit.tvlDelta)
        );

        /// 1. Update asset index
        require(
            assets[_deposit.assetIndex] == ERC20(address(0)) ||
                assets[_deposit.assetIndex] == _deposit.asset,
            AssetIndexAlreadyOccupied(
                _deposit.assetIndex,
                assets[_deposit.assetIndex]
            )
        );

        assets[_deposit.assetIndex] = _deposit.asset;

        /// 2. Transfer deposit in
        _deposit.asset.safeTransferFrom(
            msg.sender,
            address(this),
            _deposit.amount
        );

        /// 3. Mint fund tokens
        _mint(msg.sender, _deposit.mintAmount);

        /// 4. Update invested capital
        investedCapital[msg.sender] += uint256(_deposit.tvlDelta);

        emit DepositedAsset(_deposit.asset, _deposit.amount, _deposit.tvlDelta);
    }

    /**
     * @notice Deposits ETH into the fund, which will get swapped and rebalanced
     * accordingly to the current fund composition.
     * @param _signedDepositPayload The signed payload containing the deposit data,
     * including the amount of ETH to deposit and the swaps to execute.
     */
    function deposit(
        SignedPayload calldata _signedDepositPayload
    )
        external
        payable
        nonReentrant
        onlyOpen
        onlyNotPaused
        verifyingSignature(_signedDepositPayload)
    {
        // Prevents management from accidentally depositing into any fund
        require(msg.sender != fundFactory.admin(), Error.Unauthorized());

        FundAction.Deposit memory _deposit = abi.decode(
            _signedDepositPayload.data,
            (FundAction.Deposit)
        );

        require(
            _deposit.nonce == nonce,
            InvalidDepositNonce(_deposit.nonce, nonce)
        );

        require(
            _deposit.tvlDelta >= 0,
            DepositMustIncreaseTvl(_deposit.tvlDelta)
        );

        /// 1. Validate fees and deposit amounts

        uint256 fees = _deposit.amountsWei.fee + _deposit.amountsWei.buybackFee;

        require(
            fees <= (msg.value * fundFactory.protocolDepositFee()) / 100_000 &&
                _deposit.feeRecipient != address(0),
            UnexpectedFeeData(
                fees,
                fundFactory.protocolDepositFee(),
                _deposit.feeRecipient
            )
        );

        uint256 netDeposit = msg.value - fees;

        require(
            _deposit.amountsWei.input == netDeposit,
            Error.MismatchingDepositAmount(_deposit.amountsWei, netDeposit)
        );

        /// 2. Wrap ETH
        _wrapETH(netDeposit);

        /// 3. Loop and swap
        _executeSwaps(_deposit.swaps);

        /// 4. Mint fund tokens
        _mint(msg.sender, _deposit.mintAmount);

        /// 5. Update invested capital
        investedCapital[msg.sender] += uint256(_deposit.tvlDelta);

        /// 6. Collect fees
        if (_deposit.amountsWei.fee > 0) {
            _safeTransferETH(_deposit.feeRecipient, _deposit.amountsWei.fee);
        }

        if (_deposit.amountsWei.buybackFee > 0) {
            _safeTransferETH(
                fundFactory.guruBurner(),
                _deposit.amountsWei.buybackFee
            );
        }

        emit Deposited(
            msg.sender,
            _deposit.tvlDelta,
            _deposit.mintAmount,
            _deposit.amountsWei,
            _deposit.amountsValue
        );
    }

    /**
     * @notice Swaps tokens for ETH.
     * @param _signedSwapPayload The signed payload containing the swap data
     */
    function swapTokensForETH(
        SignedPayload calldata _signedSwapPayload
    )
        external
        nonReentrant
        onlyOpen
        onlyNotPaused
        onlyOwner
        verifyingSignature(_signedSwapPayload)
    {
        FundAction.SingleSwap memory swapAction = abi.decode(
            _signedSwapPayload.data,
            (FundAction.SingleSwap)
        );

        require(
            address(swapAction.swap.tokenOut) == address(fundFactory.weth()),
            InvalidSwapDirection(
                address(swapAction.swap.tokenIn),
                address(swapAction.swap.tokenOut)
            )
        );

        _executeSingleSwap(swapAction.swap);
        _updateAssets(swapAction.assetIndexes);

        unchecked {
            nonce++;
        }
    }

    /**
     * @notice Swaps ETH for tokens.
     * @param _signedSwapPayload The signed payload containing the swap data
     */
    function swapETHForTokens(
        SignedPayload calldata _signedSwapPayload
    )
        external
        nonReentrant
        onlyOpen
        onlyNotPaused
        onlyOwner
        verifyingSignature(_signedSwapPayload)
    {
        FundAction.SingleSwap memory swapAction = abi.decode(
            _signedSwapPayload.data,
            (FundAction.SingleSwap)
        );

        require(
            address(swapAction.swap.tokenIn) == address(fundFactory.weth()),
            InvalidSwapDirection(
                address(swapAction.swap.tokenIn),
                address(swapAction.swap.tokenOut)
            )
        );

        _executeSingleSwap(swapAction.swap);
        _updateAssets(swapAction.assetIndexes);

        unchecked {
            nonce++;
        }
    }

    /**
     * @notice Rebalances the fund by changing the allocations of the assets.
     * @param _signedRebalancePayload The signed payload containing the rebalancing data,
     * including the changes to apply to the asset lists and the swaps to execute.
     */
    function rebalance(
        SignedPayload calldata _signedRebalancePayload
    )
        external
        nonReentrant
        onlyOpen
        onlyNotPaused
        onlyOwner
        verifyingSignature(_signedRebalancePayload)
    {
        FundAction.Rebalance memory _rebalance = abi.decode(
            _signedRebalancePayload.data,
            (FundAction.Rebalance)
        );

        _updateAssets(_rebalance.assetIndexes);
        _executeSwaps(_rebalance.swaps);

        unchecked {
            nonce++;
        }

        emit Rebalanced();
    }

<<CHUNK_BREAK>>

    /**
     * @notice Withdraws the user's share of the fund, swapping the assets back to ETH.
     * @param _signedWithdrawPayload The signed payload containing the withdrawal data,
     */
    function withdraw(
        SignedPayload calldata _signedWithdrawPayload
    ) external nonReentrant verifyingSignature(_signedWithdrawPayload) {
        if (!isOpen) {
            // Investors can withdraw only until the grace period ends
            require(block.timestamp <= gracePeriodEnd, GracePeriodEnded());
        }

        FundAction.Withdraw memory _userWithdrawal = abi.decode(
            _signedWithdrawPayload.data,
            (FundAction.Withdraw)
        );

        // 1. Burn tokens
        _burn(msg.sender, _userWithdrawal.burnAmount);

        // 2. Update invested capital
        unchecked {
            investedCapital[msg.sender] -= _userWithdrawal
                .amountsValue
                .investedCapital;
        }

        // 3. Execute swaps
        _executeSwaps(_userWithdrawal.swaps);

        // 4. Handle ETH transfers and fees
        _executeWithdrawalTransfers(_userWithdrawal.amountsWei);

        emit Withdrawn(
            msg.sender,
            _userWithdrawal.burnAmount,
            _userWithdrawal.amountsWei,
            _userWithdrawal.amountsValue,
            _userWithdrawal.tvlDelta
        );
    }

    /**
     * @notice Executes the withdrawal transfers, including fees.
     * @param amountsWei The withdrawal amounts in wei units
     */
    function _executeWithdrawalTransfers(
        WithdrawalAmounts memory amountsWei
    ) internal {
        if (amountsWei.grossPnl <= 0) {
            _unwrapETH(amountsWei.netOutput);
        } else {
            unchecked {
                _unwrapETH(
                    amountsWei.netOutput +
                        amountsWei.protocolFee +
                        amountsWei.guruFee
                );
            }

            _safeTransferETH(fundFactory.vault(), amountsWei.protocolFee);
            _safeTransferETH(owner(), amountsWei.guruFee);
        }
        _safeTransferETH(msg.sender, amountsWei.netOutput);
    }

    /**
     * @notice Mints the management fee to the admin.
     * @dev Only the management admin can call this function.
     */
    function mintManagementFee() external onlyOpen onlyNotPaused {
        require(msg.sender == fundFactory.admin(), Error.Unauthorized());
        require(
            block.timestamp - latestManagementFeeMint > MANAGEMENT_FEE_PERIOD,
            ManagementFeePeriodNotElapsed()
        );

        uint256 amount = totalSupply() / MANAGEMENT_FEE_DENOMINATOR;
        _mint(fundFactory.admin(), amount);
        latestManagementFeeMint = block.timestamp;

        emit ManagementFeeMinted(amount);
    }

    /**
     * @notice Closes the fund, liquidating all assets. Users will be able to withdraw their capital.
     * @param _signedClosePayload The signed payload containing the close data
     */
    function close(
        SignedPayload calldata _signedClosePayload
    )
        external
        nonReentrant
        onlyOpen
        onlyOwner
        verifyingSignature(_signedClosePayload)
    {
        isOpen = false;
        gracePeriodEnd = block.timestamp + GRACE_PERIOD_DURATION;

        // Liquidate all assets
        FundAction.Close memory _liquidation = abi.decode(
            _signedClosePayload.data,
            (FundAction.Close)
        );

        _executeSwaps(_liquidation.swaps);

        emit Closed();
    }

    /**
     * @notice Extends the grace period.
     * @param _newGracePeriodEnd The new grace period end
     */
    function extendGracePeriod(uint256 _newGracePeriodEnd) external {
        // Only protocol owner can extend the grace period
        require(
            msg.sender == fundFactory.owner() &&
                _newGracePeriodEnd > gracePeriodEnd,
            Error.Unauthorized()
        );
        gracePeriodEnd = _newGracePeriodEnd;
        emit GracePeriodExtended(_newGracePeriodEnd);
    }

    /**
     * @notice After the grace period ends, the protocol owner can claim any
     * remaining funds to buyback and burn $GURU.
     */
    function claimAbandonedFundsForBuybackAndBurn() external {
        require(
            !isOpen &&
                msg.sender == fundFactory.owner() &&
                block.timestamp > gracePeriodEnd,
            Error.Unauthorized()
        );
        _unwrapETH(fundFactory.weth().balanceOf(address(this)));
        _safeTransferETH(fundFactory.guruBurner(), address(this).balance);
        emit AbandonedFundsClaimed();
    }

    /**
     * @notice Updates the minimum deposit value for a user.
     * @param _newMinValue The new minimum deposit value
     */
    function updateMinUserDepositValue(
        uint256 _newMinValue
    ) external onlyOpen onlyOwner {
        minUserDepositValue = _newMinValue;
        emit MinUserDepositValueUpdated(_newMinValue);
    }

    /**
     * @notice Updates the minimum deposit cooldown for a user.
     * @param _newMinCooldown The new minimum deposit cooldown
     */
    function updateMinDepositCooldown(
        uint256 _newMinCooldown
    ) external onlyOpen onlyOwner {
        require(
            _newMinCooldown <= MAX_DEPOSIT_COOLDOWN,
            MaxCooldownExceeded(_newMinCooldown)
        );
        minUserDepositCooldown = _newMinCooldown;
        emit MinUserDepositCooldownUpdated(_newMinCooldown);
    }

    /**
     * @notice Returns the available balance for a user, i.e. the balance that is not cooling down.
     * @param _account The address of the user
     * @return availableBalance The available balance for the user
     */
    function availableBalanceOf(
        address _account
    ) external view returns (uint256 availableBalance) {
        availableBalance = balanceOf(_account);

        if (hasCooldown(_account)) {
            (uint256 lockedBalance, ) = _getCooldownDetails(_account);
            availableBalance -= lockedBalance;
        }
    }

    /**
     * @notice Returns the assets of the fund.
     */
    function getAssets() external view returns (ERC20[8] memory) {
        if (isOpen) {
            return assets;
        } else {
            ERC20[8] memory _assets;
            _assets[0] = ERC20(address(fundFactory.weth()));
            return _assets;
        }
    }

    /**
     * @notice Returns the cooldown details for a user.
     * @param _account The address of the user
     * @return cooldownDetails The cooldown details for the user
     */
    function getCooldownByUser(
        address _account
    ) public view returns (CooldownsByUser memory) {
        return _cooldownsByUser[_account];
    }

    /// Public Functions ///

    /**
     * @dev [ERC20] Using 6 decimals to match USDT precision
     */
    function decimals() public pure override returns (uint8) {
        return 6;
    }

    /**
     * @notice Returns whether a user has a cooldown.
     * @param _account The address of the user
     * @return Whether the user has a cooldown
     */
    function hasCooldown(address _account) public view returns (bool) {
        return _cooldownsByUser[_account].cooldowns.length > 0;
    }

    /**
     * @notice Disable direct token transfers
     */
    function transfer(address, uint256) public pure override returns (bool) {
        revert Error.Unauthorized();
    }

    /**
     * @notice Disable direct token transfers
     */
    function transferFrom(
        address,
        address,
        uint256
    ) public pure override returns (bool) {
        revert Error.Unauthorized();
    }

    /**
     * @notice Transfers shares to another account updating the invested capital.
     * @param to The address of the recipient
     * @param amount The amount of shares to transfer
     * @return Whether the transfer was successful
     */
    function transferShares(address to, uint256 amount) public returns (bool) {
        uint256 senderBalance = balanceOf(msg.sender);
        // Validate transfer amount
        require(
            senderBalance >= amount && amount != 0,
            InvalidTransferAmount(senderBalance, amount)
        );

        // Update invested capital for both sender and recipient when transferring between accounts

<<CHUNK_BREAK>>
        unchecked {
            // Transfer amount validation ensures arithmetic safety: cannot divide by zero
            uint256 capitalTransferred = (amount *
                investedCapital[msg.sender]) / senderBalance;
            // `capitalTransferred` is proportional to `amount`, which is capped to sender balance,
            // so it cannot exceed sender's invested capital
            investedCapital[msg.sender] -= capitalTransferred;
            investedCapital[to] += capitalTransferred;
        }

        _transfer(msg.sender, to, amount);

        return true;
    }

    /**
     * @notice Disable ownership renouncement
     */
    function renounceOwnership() public pure override {
        revert Error.Unauthorized();
    }

    /**
     * @notice Transfer ownership to a new address
     * @param newOwner The address of the new owner
     */
    function transferOwnership(address newOwner) public override onlyOwner {
        require(newOwner != address(0), Error.Unauthorized());

        uint256 ownerBalance = balanceOf(owner());
        if (ownerBalance > 0) {
            transferShares(newOwner, ownerBalance);
        }

        _transferOwnership(newOwner);
    }

    /// Internal Functions ///

    /**
     * @dev Wraps ETH into WETH
     */
    function _wrapETH(uint256 amount) internal {
        fundFactory.weth().deposit{ value: amount }();
    }

    /**
     * @dev Unwraps WETH into ETH
     */
    function _unwrapETH(uint256 amount) internal {
        fundFactory.weth().withdraw(amount);
    }

    /**
     * @dev Updates the fund asset list.
     * NOTE: Validation of these asset list updates is done off-chain
     * @param _updates The updates to apply
     */
    function _updateAssets(AssetIndex[] memory _updates) internal {
        for (uint8 i = 0; i < _updates.length; i++) {
            assets[_updates[i].index] = _updates[i].asset;
        }

        emit AssetsUpdated(assets);
    }

    /**
     * @notice Returns the cooldown details for a user.
     * NOTE: this assumes that the user does have a cooldown, meaning:
     * `_cooldownsByUser[_user].cooldowns.length > 0`
     * @dev The offset represents the index before which all cooldowns have expired.
     * The loop is checking backwards, from the end of the cooldowns array (most
     * recent) to the beginning (earliest) and stopping when it finds a cooldown that
     * has eventually expired. This means that any previous cooldowns are also expired,
     * and we can update the offset with the current index.
     * @param account The address of the user
     * @return coolingDownBalance User balance that is still locked due to cooldown
     * @return offset The index offset of the cooldowns array, possibly to be updated in
     * the _cooldownsByUser struct: all cooldowns before this offset are expired.
     */
    function _getCooldownDetails(
        address account
    ) internal view returns (uint256 coolingDownBalance, uint256 offset) {
        uint256 newOffset = _cooldownsByUser[account].cooldowns.length;
        offset = _cooldownsByUser[account].offset;

        while (newOffset > offset) {
            Cooldown memory _cooldown = _cooldownsByUser[account].cooldowns[
                newOffset - 1
            ];
            if (block.timestamp <= _cooldown.timestamp) {
                unchecked {
                    coolingDownBalance += _cooldown.amount;
                    newOffset--;
                }
            } else {
                offset = newOffset;
            }
        }
    }

    /**
     * @dev [ERC20] Overrides the default ERC20 _update function to implement cooldown logic.
     * @param from The address of the user
     * @param to The address of the recipient
     * @param amount The amount of tokens to transfer
     */
    function _update(
        address from,
        address to,
        uint256 amount
    ) internal override {
        if (isOpen) {
            if (from == address(0) && to != fundFactory.admin()) {
                // When minting tokens (except for management fee), apply cooldown:
                _cooldownsByUser[to].cooldowns.push(
                    Cooldown({
                        timestamp: block.timestamp + minUserDepositCooldown,
                        amount: amount
                    })
                );
            } else if (hasCooldown(from)) {
                // Otherwise check cooldown for user:
                (uint256 lockedBalance, uint256 offset) = _getCooldownDetails(
                    from
                );

                // NOTE: lockedBalance is the amount of tokens that are still locked due to cooldown.
                // Therefore, the available balance for the user is:
                uint256 availableBalance = balanceOf(from) - lockedBalance;
                require(
                    availableBalance >= amount,
                    CooldownNotExpired(availableBalance, amount)
                );

                if (offset == _cooldownsByUser[from].cooldowns.length) {
                    delete _cooldownsByUser[from];
                } else {
                    _cooldownsByUser[from].offset = offset;
                }
            }
        }

        super._update(from, to, amount);
    }

    /**
     * @dev Allows contract to unwrap WETH
     */
    receive() external payable {}
}

================================================================================
FILE: contracts/helpers/EIP712Helper.sol
================================================================================
// SPDX-License-Identifier: MIT
pragma solidity =0.8.27;

import '@openzeppelin/contracts/access/Ownable.sol';
import '@openzeppelin/contracts/token/ERC20/ERC20.sol';
import '@openzeppelin/contracts/utils/cryptography/EIP712.sol';
import '@openzeppelin/contracts/utils/cryptography/SignatureChecker.sol';

import 'contracts/lib/Error.sol';
import 'contracts/structs/SignedPayload.sol';

/// @title EIP712Helper: Verifies EIP712 signatures
abstract contract EIP712Helper is EIP712, Ownable {
    address private signer;
    mapping(address => uint256) public noncesByUser;

    error InvalidSignature();
    error ExpiredSignature();
    event SignerUpdated(address signer);

    /**
     * @param _name Name of the signing domain.
     * @param _version Version of the signing domain.
     * @param _signer Signer
     */
    constructor(
        string memory _name,
        string memory _version,
        address _signer
    ) EIP712(_name, _version) {
        _setOffchainSigner(_signer);
    }

    /**
     * @notice Get the off-chain signer
     * @return Signer address
     */
    function getOffchainSigner() external view returns (address) {
        return signer;
    }

    /**
     * @notice Set the off-chain signer (only Owner)
     * @param _signer New signer
     */
    function setOffchainSigner(address _signer) external onlyOwner {
        _setOffchainSigner(_signer);
    }

    /// @param _signer Signer
    function _setOffchainSigner(address _signer) internal {
        require(
            _signer != address(0) && signer != _signer,
            Error.InvalidAddress()
        );
        signer = _signer;
        emit SignerUpdated(_signer);
    }

    /**
     * @dev Verifies the signature
     * @param _typeHash Type hash
     * @param _account Address of the user the signature was signed for
     * @param _payload Signed payload containing the data, signature and expiration
     */
    function _verifyEIP712(
        bytes32 _typeHash,
        address _account,
        SignedPayload calldata _payload
    ) internal {
        require(_payload.expiresAt >= block.number, ExpiredSignature());

        unchecked {
            require(
                SignatureChecker.isValidSignatureNow(
                    signer,
                    _hashTypedDataV4(
                        keccak256(
                            abi.encode(
                                _typeHash,
                                noncesByUser[_account]++,
                                _account,
                                keccak256(_payload.data),
                                _payload.expiresAt
                            )
                        )
                    ),
                    _payload.signature
                ),
                InvalidSignature()
            );
        }
    }
}

================================================================================
FILE: contracts/helpers/SwapHelper.sol
================================================================================
// SPDX-License-Identifier: MIT
pragma solidity =0.8.27;

import '@openzeppelin/contracts/token/ERC20/ERC20.sol';
import '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol';
import '@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol';


exec
/bin/bash -lc "sed -n '1041,1400p' AUDIT_BUNDLE.txt && printf '\\n<<CHUNK_BREAK>>\\n' && sed -n '1401,1739p' AUDIT_BUNDLE.txt" in /tmp/codex-qadnxli7
 succeeded in 0ms:
        unchecked {
            // Transfer amount validation ensures arithmetic safety: cannot divide by zero
            uint256 capitalTransferred = (amount *
                investedCapital[msg.sender]) / senderBalance;
            // `capitalTransferred` is proportional to `amount`, which is capped to sender balance,
            // so it cannot exceed sender's invested capital
            investedCapital[msg.sender] -= capitalTransferred;
            investedCapital[to] += capitalTransferred;
        }

        _transfer(msg.sender, to, amount);

        return true;
    }

    /**
     * @notice Disable ownership renouncement
     */
    function renounceOwnership() public pure override {
        revert Error.Unauthorized();
    }

    /**
     * @notice Transfer ownership to a new address
     * @param newOwner The address of the new owner
     */
    function transferOwnership(address newOwner) public override onlyOwner {
        require(newOwner != address(0), Error.Unauthorized());

        uint256 ownerBalance = balanceOf(owner());
        if (ownerBalance > 0) {
            transferShares(newOwner, ownerBalance);
        }

        _transferOwnership(newOwner);
    }

    /// Internal Functions ///

    /**
     * @dev Wraps ETH into WETH
     */
    function _wrapETH(uint256 amount) internal {
        fundFactory.weth().deposit{ value: amount }();
    }

    /**
     * @dev Unwraps WETH into ETH
     */
    function _unwrapETH(uint256 amount) internal {
        fundFactory.weth().withdraw(amount);
    }

    /**
     * @dev Updates the fund asset list.
     * NOTE: Validation of these asset list updates is done off-chain
     * @param _updates The updates to apply
     */
    function _updateAssets(AssetIndex[] memory _updates) internal {
        for (uint8 i = 0; i < _updates.length; i++) {
            assets[_updates[i].index] = _updates[i].asset;
        }

        emit AssetsUpdated(assets);
    }

    /**
     * @notice Returns the cooldown details for a user.
     * NOTE: this assumes that the user does have a cooldown, meaning:
     * `_cooldownsByUser[_user].cooldowns.length > 0`
     * @dev The offset represents the index before which all cooldowns have expired.
     * The loop is checking backwards, from the end of the cooldowns array (most
     * recent) to the beginning (earliest) and stopping when it finds a cooldown that
     * has eventually expired. This means that any previous cooldowns are also expired,
     * and we can update the offset with the current index.
     * @param account The address of the user
     * @return coolingDownBalance User balance that is still locked due to cooldown
     * @return offset The index offset of the cooldowns array, possibly to be updated in
     * the _cooldownsByUser struct: all cooldowns before this offset are expired.
     */
    function _getCooldownDetails(
        address account
    ) internal view returns (uint256 coolingDownBalance, uint256 offset) {
        uint256 newOffset = _cooldownsByUser[account].cooldowns.length;
        offset = _cooldownsByUser[account].offset;

        while (newOffset > offset) {
            Cooldown memory _cooldown = _cooldownsByUser[account].cooldowns[
                newOffset - 1
            ];
            if (block.timestamp <= _cooldown.timestamp) {
                unchecked {
                    coolingDownBalance += _cooldown.amount;
                    newOffset--;
                }
            } else {
                offset = newOffset;
            }
        }
    }

    /**
     * @dev [ERC20] Overrides the default ERC20 _update function to implement cooldown logic.
     * @param from The address of the user
     * @param to The address of the recipient
     * @param amount The amount of tokens to transfer
     */
    function _update(
        address from,
        address to,
        uint256 amount
    ) internal override {
        if (isOpen) {
            if (from == address(0) && to != fundFactory.admin()) {
                // When minting tokens (except for management fee), apply cooldown:
                _cooldownsByUser[to].cooldowns.push(
                    Cooldown({
                        timestamp: block.timestamp + minUserDepositCooldown,
                        amount: amount
                    })
                );
            } else if (hasCooldown(from)) {
                // Otherwise check cooldown for user:
                (uint256 lockedBalance, uint256 offset) = _getCooldownDetails(
                    from
                );

                // NOTE: lockedBalance is the amount of tokens that are still locked due to cooldown.
                // Therefore, the available balance for the user is:
                uint256 availableBalance = balanceOf(from) - lockedBalance;
                require(
                    availableBalance >= amount,
                    CooldownNotExpired(availableBalance, amount)
                );

                if (offset == _cooldownsByUser[from].cooldowns.length) {
                    delete _cooldownsByUser[from];
                } else {
                    _cooldownsByUser[from].offset = offset;
                }
            }
        }

        super._update(from, to, amount);
    }

    /**
     * @dev Allows contract to unwrap WETH
     */
    receive() external payable {}
}

================================================================================
FILE: contracts/helpers/EIP712Helper.sol
================================================================================
// SPDX-License-Identifier: MIT
pragma solidity =0.8.27;

import '@openzeppelin/contracts/access/Ownable.sol';
import '@openzeppelin/contracts/token/ERC20/ERC20.sol';
import '@openzeppelin/contracts/utils/cryptography/EIP712.sol';
import '@openzeppelin/contracts/utils/cryptography/SignatureChecker.sol';

import 'contracts/lib/Error.sol';
import 'contracts/structs/SignedPayload.sol';

/// @title EIP712Helper: Verifies EIP712 signatures
abstract contract EIP712Helper is EIP712, Ownable {
    address private signer;
    mapping(address => uint256) public noncesByUser;

    error InvalidSignature();
    error ExpiredSignature();
    event SignerUpdated(address signer);

    /**
     * @param _name Name of the signing domain.
     * @param _version Version of the signing domain.
     * @param _signer Signer
     */
    constructor(
        string memory _name,
        string memory _version,
        address _signer
    ) EIP712(_name, _version) {
        _setOffchainSigner(_signer);
    }

    /**
     * @notice Get the off-chain signer
     * @return Signer address
     */
    function getOffchainSigner() external view returns (address) {
        return signer;
    }

    /**
     * @notice Set the off-chain signer (only Owner)
     * @param _signer New signer
     */
    function setOffchainSigner(address _signer) external onlyOwner {
        _setOffchainSigner(_signer);
    }

    /// @param _signer Signer
    function _setOffchainSigner(address _signer) internal {
        require(
            _signer != address(0) && signer != _signer,
            Error.InvalidAddress()
        );
        signer = _signer;
        emit SignerUpdated(_signer);
    }

    /**
     * @dev Verifies the signature
     * @param _typeHash Type hash
     * @param _account Address of the user the signature was signed for
     * @param _payload Signed payload containing the data, signature and expiration
     */
    function _verifyEIP712(
        bytes32 _typeHash,
        address _account,
        SignedPayload calldata _payload
    ) internal {
        require(_payload.expiresAt >= block.number, ExpiredSignature());

        unchecked {
            require(
                SignatureChecker.isValidSignatureNow(
                    signer,
                    _hashTypedDataV4(
                        keccak256(
                            abi.encode(
                                _typeHash,
                                noncesByUser[_account]++,
                                _account,
                                keccak256(_payload.data),
                                _payload.expiresAt
                            )
                        )
                    ),
                    _payload.signature
                ),
                InvalidSignature()
            );
        }
    }
}

================================================================================
FILE: contracts/helpers/SwapHelper.sol
================================================================================
// SPDX-License-Identifier: MIT
pragma solidity =0.8.27;

import '@openzeppelin/contracts/token/ERC20/ERC20.sol';
import '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol';
import '@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol';

import 'contracts/structs/Swap.sol';

contract SwapHelper is Initializable {
    using SafeERC20 for ERC20;

    address public weth;
    address public feeCollector;

    function __SwapHelper_init_unchained(
        address _weth,
        address _feeCollector
    ) internal onlyInitializing {
        weth = _weth;
        feeCollector = _feeCollector;
    }

    event SwapExecuted(
        address indexed sender,
        address indexed tokenIn,
        address indexed tokenOut,
        uint256 amountSent,
        uint256 amountReceived,
        address router
    );

    /**
     * @notice Execute the swaps in the provided order, based on the swap type and fee tier
     * @param _swaps The swaps to execute
     */
    function _executeSwaps(Swap[] memory _swaps) internal {
        for (uint8 i = 0; i < _swaps.length; i++) {
            _executeSingleSwap(_swaps[i]);
        }
    }

    /**
     * @notice Executes a single swap.
     * @param _swap The swap to execute
     */
    function _executeSingleSwap(Swap memory _swap) internal {
        uint256 tokenInBalanceBefore = _swap.tokenIn.balanceOf(address(this));
        uint256 tokenOutBalanceBefore = _swap.tokenOut.balanceOf(address(this));

        // Approve the router to spend the tokenIn
        _swap.tokenIn.forceApprove(address(_swap.router), _swap.amountToSend);

        // Forward the call to the router
        (bool success, bytes memory returnData) = _swap.router.call(
            _swap.callData
        );
        require(success, string(returnData));

        ERC20(weth).safeTransfer(feeCollector, _swap.swapFee);

        uint256 tokenInBalanceAfter = _swap.tokenIn.balanceOf(address(this));
        uint256 tokenOutBalanceAfter = _swap.tokenOut.balanceOf(address(this));

        emit SwapExecuted(
            msg.sender,
            address(_swap.tokenIn),
            address(_swap.tokenOut),
            tokenInBalanceBefore - tokenInBalanceAfter,
            tokenOutBalanceAfter - tokenOutBalanceBefore,
            _swap.router
        );
    }
}

================================================================================
FILE: contracts/helpers/TransferHelper.sol
================================================================================
// SPDX-License-Identifier: MIT
pragma solidity =0.8.27;

contract TransferHelper {
    mapping(address => uint256) creditByAddress;

    event CreditAdded(address indexed creditor, uint256 value);
    event CreditWithdrawn(address indexed recipient, uint256 value);

    error NativeTransferFailed();

    /**
     * @notice Safe transfer of ETH to an address. If the transfer fails, the value is added to the credit of the address.
     * @param recipient The address to transfer ETH to
     * @param value The amount of ETH to transfer
     */
    function _safeTransferETH(address recipient, uint256 value) internal {
        (bool success, ) = recipient.call{ value: value }('');

        if (!success) {
            creditByAddress[recipient] += value;
            emit CreditAdded(recipient, value);
        }
    }

    /**
     * @notice Withdraws the caller's credit to the specified recipient. This transfer will either succeed or revert.
     * @param recipient The address to transfer the ETH to
     */

<<CHUNK_BREAK>>
    function withdrawCredit(address recipient) external {
        uint256 value = creditByAddress[msg.sender];
        creditByAddress[msg.sender] = 0;
        (bool success, ) = recipient.call{ value: value }('');
        require(success, NativeTransferFailed());
        emit CreditWithdrawn(recipient, value);
    }
}

================================================================================
FILE: contracts/interfaces/IWETH.sol
================================================================================
/// SPDX-License-Identifier: MIT
pragma solidity =0.8.27;

interface IWETH {
    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    function decimals() external view returns (uint8);

    function balanceOf(address owner) external view returns (uint);

    function allowance(address owner, address spender) external view returns (uint);

    function totalSupply() external view returns (uint);

    function approve(address spender, uint wad) external returns (bool);

    function transfer(address to, uint wad) external returns (bool);

    function transferFrom(address from, address to, uint wad) external returns (bool);

    function deposit() external payable;

    function withdraw(uint wad) external;

    event Approval(address indexed owner, address indexed spender, uint wad);
    event Transfer(address indexed from, address indexed to, uint wad);
    event Deposit(address indexed to, uint wad);
    event Withdrawal(address indexed from, uint wad);
}

================================================================================
FILE: contracts/lib/Error.sol
================================================================================
// SPDX-License-Identifier: MIT
pragma solidity =0.8.27;

import 'contracts/structs/DepositAmounts.sol';

library Error {
    error InvalidAddress();
    error Unauthorized();
    error MismatchingDepositAmount(
        DepositAmounts depositAmounts,
        uint256 msgValue
    );
}

================================================================================
FILE: contracts/lib/FundAction.sol
================================================================================
// SPDX-License-Identifier: MIT
pragma solidity =0.8.27;

import { Swap } from 'contracts/structs/Swap.sol';
import { AssetIndex } from 'contracts/structs/AssetIndex.sol';
import { DepositAmounts } from 'contracts/structs/DepositAmounts.sol';
import { WithdrawalAmounts } from 'contracts/structs/WithdrawalAmounts.sol';
import { ERC20 } from '@openzeppelin/contracts/token/ERC20/ERC20.sol';

library FundAction {
    struct Deposit {
        /**
         * @notice The nonce at the time of the deposit
         */
        uint256 nonce;
        /**
         * @notice Deposit amounts in wei units
         */
        DepositAmounts amountsWei;
        /**
         * @notice Deposit amounts in USDT units
         */
        DepositAmounts amountsValue;
        /**
         * @notice Swaps to be executed to maintain the fund allocations after deposit
         */
        Swap[] swaps;
        /**
         * @notice The amount of Fund tokens to mint
         */
        uint256 mintAmount;
        /**
         * @notice Either the vault or a referral address
         */
        address feeRecipient;
        /**
         * @notice The difference in TVL between the initial TVL and the final TVL
         */
        int256 tvlDelta;
    }

    struct AssetDeposit {
        /**
         * @notice The index of the asset to deposit
         */
        uint8 assetIndex;
        /**
         * @notice The asset to deposit
         */
        ERC20 asset;
        /**
         * @notice The amount of asset to deposit
         */
        uint256 amount;
        /**
         * @notice The amount of Fund tokens to mint
         */
        uint256 mintAmount;
        /**
         * @notice The difference in TVL between the initial TVL and the final TVL
         */
        int256 tvlDelta;
    }

    struct Rebalance {
        /**
         * @notice Updates to the fund assets
         */
        AssetIndex[] assetIndexes;
        /**
         * @notice Swaps to be executed to rebalance the fund allocations
         */
        Swap[] swaps;
    }

    struct SingleSwap {
        /**
         * @notice The indexes of the assets to swap
         */
        AssetIndex[] assetIndexes;
        /**
         * @notice The swap to execute
         */
        Swap swap;
    }

    struct Withdraw {
        /**
         * @notice The amount of Fund tokens to burn
         */
        uint256 burnAmount;
        /**
         * @notice Swaps to be executed to withdraw the position
         */
        Swap[] swaps;
        /**
         * @notice The amounts in wei units
         */
        WithdrawalAmounts amountsWei;
        /**
         * @notice The amounts in USDT units
         */
        WithdrawalAmounts amountsValue;
        /**
         * @notice The difference in TVL between the initial TVL and the final TVL
         */
        int256 tvlDelta;
    }

    struct Close {
        /**
         * @notice Swaps to be executed to liquidate the fund
         */
        Swap[] swaps;
    }
}

================================================================================
FILE: contracts/structs/AssetIndex.sol
================================================================================
// SPDX-License-Identifier: MIT
pragma solidity =0.8.27;

import { ERC20 } from '@openzeppelin/contracts/token/ERC20/ERC20.sol';

/**
 * @notice Data structure including the index of the asset in the asset list and the new asset address
 */
struct AssetIndex {
    /**
     * @notice Index of the asset in the asset list
     */
    uint8 index;
    /**
     * @notice Address of the new asset (0x0 to remove the asset at the index)
     */
    ERC20 asset;
}

================================================================================
FILE: contracts/structs/DepositAmounts.sol
================================================================================
// SPDX-License-Identifier: MIT
pragma solidity =0.8.27;

struct DepositAmounts {
    /**
     * @notice The raw amount input to the contract by the user
     */
    uint256 input;
    /**
     * @notice Protocol fees either for project vault or referral
     */
    uint256 fee;
    /**
     * @notice Fees to be used for buybacks and burn
     */
    uint256 buybackFee;
}

================================================================================
FILE: contracts/structs/InitialDeposit.sol
================================================================================
// SPDX-License-Identifier: MIT
pragma solidity =0.8.27;

import 'contracts/structs/DepositAmounts.sol';
struct InitialDeposit {
    /**
     * @notice Wei amounts of the deposit
     */
    DepositAmounts amountsWei;
    /**
     * @notice Values in USDT units
     */
    DepositAmounts amountsValue;
    /**
     * @notice Value of the min deposit in USDT units by the users
     */
    uint256 minUserDepositValue;
    /**
     * @notice Minimum time for a user to wait before withdrawing their deposit
     */
    uint256 minUserDepositCooldown;
}

================================================================================
FILE: contracts/structs/SignedPayload.sol
================================================================================
// SPDX-License-Identifier: MIT
pragma solidity =0.8.27;

struct SignedPayload {
    /**
     * @notice Encoded payload
     */
    bytes data;
    /**
     * @notice Signature of the payload
     */
    bytes signature;
    /**
     * @notice Expiration block number of the payload
     */
    uint256 expiresAt;
}

================================================================================
FILE: contracts/structs/Swap.sol
================================================================================
// SPDX-License-Identifier: MIT
pragma solidity =0.8.27;

import '@openzeppelin/contracts/token/ERC20/ERC20.sol';

struct Swap {
    /**
     * @notice The address of the router to use for the swap
     */
    address router;
    /**
     * @notice The encoded function call data for the swap
     */
    bytes callData;
    /**
     * @notice The token to send
     */
    ERC20 tokenIn;
    /**
     * @notice The token to receive
     */
    ERC20 tokenOut;
    /**
     * @notice The amount of tokenIn, decoded for token approval
     */
    uint256 amountToSend;
    /**
     * @notice The swap fee amount we apply to this swap
     */
    uint256 swapFee;
}

================================================================================
FILE: contracts/structs/WithdrawalAmounts.sol
================================================================================
// SPDX-License-Identifier: MIT
pragma solidity =0.8.27;

struct WithdrawalAmounts {
    /**
     * @notice The withdrawn portion of the user's capital
     * that was invested in the fund
     */
    uint256 investedCapital;
    /**
     * @notice The gross PNL: positive for profit, negative for loss
     */
    int256 grossPnl;
    /**
     * @notice Guru's fee (0 if at loss)
     */
    uint256 guruFee;
    /**
     * @notice The protocol fee (0 if at loss)
     */
    uint256 protocolFee;
    /**
     * @notice The net amount of ETH received by the user.
     * In case of a profit: user will receive more than their invested capital, deducted of fee.
     * In case of a loss: fees will be zero but the user will receive less than their invested capital.
     * @dev netOutput = investedCapital + grossPnl - guruFee - protocolFee
     */
    uint256 netOutput;
}


Finished reading the full audit bundle. I’m pulling exact line references from the first-party contracts and validating the main exploit paths before writing the report.
  ✓ Inspect workspace and fully read AUDIT_BUNDLE.txt as required
  → Analyze first-party Solidity sources for exploitable issues in scoped categories
  • Produce JSON audit result with evidence and locations
exec
/bin/bash -lc "nl -ba contracts/helpers/EIP712Helper.sol | sed -n '1,140p'" in /tmp/codex-qadnxli7
 succeeded in 0ms:
     1	// SPDX-License-Identifier: MIT
     2	pragma solidity =0.8.27;
     3	
     4	import '@openzeppelin/contracts/access/Ownable.sol';
     5	import '@openzeppelin/contracts/token/ERC20/ERC20.sol';
     6	import '@openzeppelin/contracts/utils/cryptography/EIP712.sol';
     7	import '@openzeppelin/contracts/utils/cryptography/SignatureChecker.sol';
     8	
     9	import 'contracts/lib/Error.sol';
    10	import 'contracts/structs/SignedPayload.sol';
    11	
    12	/// @title EIP712Helper: Verifies EIP712 signatures
    13	abstract contract EIP712Helper is EIP712, Ownable {
    14	    address private signer;
    15	    mapping(address => uint256) public noncesByUser;
    16	
    17	    error InvalidSignature();
    18	    error ExpiredSignature();
    19	    event SignerUpdated(address signer);
    20	
    21	    /**
    22	     * @param _name Name of the signing domain.
    23	     * @param _version Version of the signing domain.
    24	     * @param _signer Signer
    25	     */
    26	    constructor(
    27	        string memory _name,
    28	        string memory _version,
    29	        address _signer
    30	    ) EIP712(_name, _version) {
    31	        _setOffchainSigner(_signer);
    32	    }
    33	
    34	    /**
    35	     * @notice Get the off-chain signer
    36	     * @return Signer address
    37	     */
    38	    function getOffchainSigner() external view returns (address) {
    39	        return signer;
    40	    }
    41	
    42	    /**
    43	     * @notice Set the off-chain signer (only Owner)
    44	     * @param _signer New signer
    45	     */
    46	    function setOffchainSigner(address _signer) external onlyOwner {
    47	        _setOffchainSigner(_signer);
    48	    }
    49	
    50	    /// @param _signer Signer
    51	    function _setOffchainSigner(address _signer) internal {
    52	        require(
    53	            _signer != address(0) && signer != _signer,
    54	            Error.InvalidAddress()
    55	        );
    56	        signer = _signer;
    57	        emit SignerUpdated(_signer);
    58	    }
    59	
    60	    /**
    61	     * @dev Verifies the signature
    62	     * @param _typeHash Type hash
    63	     * @param _account Address of the user the signature was signed for
    64	     * @param _payload Signed payload containing the data, signature and expiration
    65	     */
    66	    function _verifyEIP712(
    67	        bytes32 _typeHash,
    68	        address _account,
    69	        SignedPayload calldata _payload
    70	    ) internal {
    71	        require(_payload.expiresAt >= block.number, ExpiredSignature());
    72	
    73	        unchecked {
    74	            require(
    75	                SignatureChecker.isValidSignatureNow(
    76	                    signer,
    77	                    _hashTypedDataV4(
    78	                        keccak256(
    79	                            abi.encode(
    80	                                _typeHash,
    81	                                noncesByUser[_account]++,
    82	                                _account,
    83	                                keccak256(_payload.data),
    84	                                _payload.expiresAt
    85	                            )
    86	                        )
    87	                    ),
    88	                    _payload.signature
    89	                ),
    90	                InvalidSignature()
    91	            );
    92	        }
    93	    }
    94	}

exec
/bin/bash -lc "nl -ba contracts/GuruFund.sol | sed -n '1,260p'" in /tmp/codex-qadnxli7
 succeeded in 0ms:
     1	// SPDX-License-Identifier: MIT
     2	pragma solidity =0.8.27;
     3	
     4	import { OwnableUpgradeable } from '@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol';
     5	import { ReentrancyGuardUpgradeable } from '@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol';
     6	import { ERC20Upgradeable } from '@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol';
     7	import { SafeERC20 } from '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol';
     8	import { ERC20 } from '@openzeppelin/contracts/token/ERC20/ERC20.sol';
     9	
    10	import { SignedPayload } from 'contracts/helpers/EIP712Helper.sol';
    11	import { SwapHelper } from 'contracts/helpers/SwapHelper.sol';
    12	import { TransferHelper } from 'contracts/helpers/TransferHelper.sol';
    13	import { Error } from 'contracts/lib/Error.sol';
    14	import { FundAction } from 'contracts/lib/FundAction.sol';
    15	import { InitialDeposit } from 'contracts/structs/InitialDeposit.sol';
    16	import { DepositAmounts } from 'contracts/structs/DepositAmounts.sol';
    17	import { WithdrawalAmounts } from 'contracts/structs/WithdrawalAmounts.sol';
    18	import { FundFactory } from 'contracts/FundFactory.sol';
    19	import { AssetIndex } from 'contracts/structs/AssetIndex.sol';
    20	
    21	/**
    22	 * @title GuruFund
    23	 * @author @numa0x
    24	 * @notice This is the contract for a GuruFund, which is a fund handled by a manager (Guru) that invests in a set of digital assets.
    25	 * The fund is represented by a FundToken, which is minted to the Guru when the fund is created as well as to investors when they deposit.
    26	 * - Implements 6-decimals ERC20 for fund tokens, representing the users' shares of the fund
    27	 * - Implements cooldowns for ERC20 transfers to have users wait before withdrawing their funds
    28	 * - Requires signed payloads for every key operations
    29	 * - Funds support up to 8 ERC20 assets
    30	 * - Tracks invested capital per user to accurately compute PnL and fees
    31	 * - Uses nonce system to prevent outdated deposit transactions
    32	 * - Has protocol-wide pause functionality
    33	 */
    34	contract GuruFund is
    35	    ReentrancyGuardUpgradeable,
    36	    OwnableUpgradeable,
    37	    SwapHelper,
    38	    ERC20Upgradeable,
    39	    TransferHelper
    40	{
    41	    using SafeERC20 for ERC20;
    42	
    43	    /// Constants ///
    44	
    45	    /**
    46	     * @notice The duration of the grace period after the fund is closed. The protocol will
    47	     * not allow any withdrawals after this period.
    48	     */
    49	    uint256 public constant GRACE_PERIOD_DURATION = 180 days;
    50	    uint256 public constant MAX_DEPOSIT_COOLDOWN = 90 days;
    51	    uint256 public constant MANAGEMENT_FEE_PERIOD = 30 days;
    52	    /**
    53	     * @notice The denominator for the management fee mint amount.
    54	     * Monthly rate denominator:
    55	     * ------------------------------------------------------------
    56	     *   Two percent yearly rate: 2/100
    57	     * * Pro-rated monthly: 1/12
    58	     * = 2/100 * 1/12 = 2/1200 = 1/600
    59	     * ------------------------------------------------------------
    60	     * So: if the minted amount needs to be 1/600 of the total supply AFTER the mint,
    61	     * then we need to mint 1/599 of the total supply BEFORE the mint.
    62	     */
    63	    uint256 public constant MANAGEMENT_FEE_DENOMINATOR = 599;
    64	
    65	    /// States ///
    66	
    67	    /**
    68	     * @notice The factory that created this fund.
    69	     */
    70	    FundFactory public immutable fundFactory;
    71	
    72	    /**
    73	     * @notice Whether the fund is open for deposits and withdrawals.
    74	     */
    75	    bool public isOpen;
    76	
    77	    /**
    78	     * @notice The fund's assets
    79	     */
    80	    ERC20[8] public assets;
    81	
    82	    /**
    83	     * @notice A nonce updated on every rebalance, to prevent users from
    84	     * submitting deposits with outdated swaps.
    85	     */
    86	    uint256 public nonce;
    87	
    88	    /**
    89	     * @notice The minimum deposit value for a user to deposit into the fund.
    90	     */
    91	    uint256 public minUserDepositValue;
    92	
    93	    /**
    94	     * @notice The minimum time for a user to wait before withdrawing their deposit
    95	     */
    96	    uint256 public minUserDepositCooldown;
    97	
    98	    /**
    99	     * @notice The timestamp of the last management fee mint
   100	     */
   101	    uint256 public latestManagementFeeMint;
   102	
   103	    /**
   104	     * @notice The end of the grace period after the Guru closed the fund, users can
   105	     * withdraw their funds up to this timestamp
   106	     */
   107	    uint256 public gracePeriodEnd;
   108	
   109	    /**
   110	     * @notice The invested capital for each user.
   111	     * @dev This is the sum of the positive TVL deltas during deposits, subtracted
   112	     * of all capital removed through withdrawals.
   113	     */
   114	    mapping(address => uint256) public investedCapital;
   115	
   116	    /**
   117	     * @notice The cooldowns of the users
   118	     */
   119	    mapping(address => CooldownsByUser) private _cooldownsByUser;
   120	
   121	    /**
   122	     * @notice User deposit cooldown entry
   123	     * @dev The offset is used to skip the cooldowns that have already been processed
   124	     */
   125	    struct CooldownsByUser {
   126	        uint256 offset;
   127	        Cooldown[] cooldowns;
   128	    }
   129	
   130	    /**
   131	     * @param timestamp The timestamp of the cooldown end
   132	     * @param amount The amount of tokens that are still locked
   133	     */
   134	    struct Cooldown {
   135	        uint256 timestamp;
   136	        uint256 amount;
   137	    }
   138	
   139	    /// Events ///
   140	
   141	    /**
   142	     * @notice Emitted when a deposit is made to the fund from a Disciple.
   143	     * @param from The address of the Disciple
   144	     * @param tvlDelta The TVL difference between the initial TVL and the final TVL
   145	     * @param amountsWei The deposit amounts in wei units
   146	     * @param amountsValue The deposit amounts in USDT units
   147	     */
   148	    event Deposited(
   149	        address indexed from,
   150	        int256 tvlDelta,
   151	        uint256 fundTokensMinted,
   152	        DepositAmounts amountsWei,
   153	        DepositAmounts amountsValue
   154	    );
   155	
   156	    /**
   157	     * @notice Emitted when an ERC20 asset is added into the fund by the Guru.
   158	     * @param asset The asset deposited
   159	     * @param amount The amount of the asset deposited
   160	     * @param tvlDelta The TVL difference between the initial TVL and the final TVL
   161	     */
   162	    event DepositedAsset(ERC20 asset, uint256 amount, int256 tvlDelta);
   163	
   164	    /**
   165	     * @notice Emitted when the assets of the fund are updated.
   166	     * @param assets The updated list of assets
   167	     */
   168	    event AssetsUpdated(ERC20[8] assets);
   169	
   170	    /**
   171	     * @notice Emitted when the fund is rebalanced.
   172	     */
   173	    event Rebalanced();
   174	
   175	    /**
   176	     * @notice Emitted when a user withdraws their share of the fund.
   177	     * This will swap the assets back to ETH and return it to the user.
   178	     * @param from The address of the user liquidating
   179	     * @param burnAmount The amount of Fund tokens burned
   180	     * @param amountsWei The withdrawal amounts in wei units
   181	     * @param amountsValue The withdrawal amounts in USDT units
   182	     * @param tvlDelta The TVL difference between the initial TVL and the final TVL
   183	     */
   184	    event Withdrawn(
   185	        address indexed from,
   186	        uint256 burnAmount,
   187	        WithdrawalAmounts amountsWei,
   188	        WithdrawalAmounts amountsValue,
   189	        int256 tvlDelta
   190	    );
   191	
   192	    /**
   193	     * @notice Emitted when the fund is closed by the Guru
   194	     */
   195	    event Closed();
   196	
   197	    /**
   198	     * @notice Emitted when the minimum deposit value for a user is updated.
   199	     * @param newMinimum The new minimum deposit value
   200	     */
   201	    event MinUserDepositValueUpdated(uint256 newMinimum);
   202	
   203	    /**
   204	     * @notice Emitted when the minimum deposit cooldown for a user is updated.
   205	     * @param newMinimum The new minimum deposit cooldown
   206	     */
   207	    event MinUserDepositCooldownUpdated(uint256 newMinimum);
   208	
   209	    /**
   210	     * @notice Emitted when the management fee is minted.
   211	     * @param amount The amount of management fee minted
   212	     */
   213	    event ManagementFeeMinted(uint256 amount);
   214	
   215	    /**
   216	     * @notice Emitted when the grace period is extended.
   217	     * @param newGracePeriodEnd The new grace period end
   218	     */
   219	    event GracePeriodExtended(uint256 newGracePeriodEnd);
   220	
   221	    /**
   222	     * @notice Emitted when the protocol owner claims remaining funds for buyback and burn
   223	     */
   224	    event AbandonedFundsClaimed();
   225	
   226	    // errors
   227	    error FundClosed();
   228	    error ProtocolHalted();
   229	    error UnexpectedFeeData(
   230	        uint256 fees,
   231	        uint256 maxExpectedFees,
   232	        address feeRecipient
   233	    );
   234	    error MaxCooldownExceeded(uint256 cooldown);
   235	    error DepositMustIncreaseTvl(int256 tvlDelta);
   236	    error InvalidDepositNonce(uint256 depositNonce, uint256 currentNonce);
   237	    error InvalidSwapDirection(address tokenFrom, address tokenTo);
   238	    error AssetIndexAlreadyOccupied(uint8 index, ERC20 assetAtIndex);
   239	    error CooldownNotExpired(uint256 availableBalance, uint256 transferAmount);
   240	    error InvalidTransferAmount(
   241	        uint256 availableBalance,
   242	        uint256 transferAmount
   243	    );
   244	    error ManagementFeePeriodNotElapsed();
   245	    error GracePeriodEnded();
   246	
   247	    // modifiers
   248	    modifier onlyOpen() {
   249	        require(isOpen, FundClosed());
   250	        _;
   251	    }
   252	
   253	    modifier onlyNotPaused() {
   254	        require(!fundFactory.paused(), ProtocolHalted());
   255	        _;
   256	    }
   257	
   258	    modifier verifyingSignature(SignedPayload calldata _payload) {
   259	        fundFactory.verifySignature(msg.sender, _payload);
   260	        _;

exec
/bin/bash -lc "nl -ba contracts/GuruFund.sol | sed -n '260,520p'" in /tmp/codex-qadnxli7
 succeeded in 0ms:
   260	        _;
   261	    }
   262	
   263	    /**
   264	     * @dev This will only be called once when deploying the Fund Factory.
   265	     * Clones initializers will be called by the FundFactory.
   266	     */
   267	    constructor() {
   268	        fundFactory = FundFactory(msg.sender);
   269	        _disableInitializers();
   270	    }
   271	
   272	    /// External Functions ///
   273	
   274	    /**
   275	     * @notice Initializes the fund with a deposit of ETH, which is wrapped.
   276	     * @dev Only the fund factory can call this function, after verifying the signature of the payload.
   277	     * @param _guru The address of the Guru (owner) of the fund
   278	     * @param _initialDeposit The initial deposit of the fund
   279	     */
   280	    function initialize(
   281	        address _guru,
   282	        string calldata _name,
   283	        string calldata _symbol,
   284	        InitialDeposit calldata _initialDeposit
   285	    ) external payable initializer {
   286	        require(msg.sender == address(fundFactory), Error.Unauthorized());
   287	        require(
   288	            _initialDeposit.minUserDepositCooldown <= MAX_DEPOSIT_COOLDOWN,
   289	            MaxCooldownExceeded(_initialDeposit.minUserDepositCooldown)
   290	        );
   291	
   292	        __SwapHelper_init_unchained(
   293	            address(fundFactory.weth()),
   294	            address(fundFactory.vault())
   295	        );
   296	        __Ownable_init_unchained(_guru);
   297	        __ERC20_init_unchained(_name, _symbol);
   298	
   299	        // Open the fund
   300	        minUserDepositValue = _initialDeposit.minUserDepositValue;
   301	        minUserDepositCooldown = _initialDeposit.minUserDepositCooldown;
   302	        latestManagementFeeMint = block.timestamp; // Allows first mint in the next period
   303	        isOpen = true;
   304	
   305	        // Wrap the initial deposit net amount
   306	        _wrapETH(msg.value - _initialDeposit.amountsWei.buybackFee);
   307	
   308	        // Initialize the assets array with WETH
   309	        assets[0] = ERC20(address(fundFactory.weth()));
   310	
   311	        emit AssetsUpdated(assets);
   312	
   313	        // Mint the fund tokens to the Guru
   314	        _mint(_guru, _initialDeposit.amountsValue.input);
   315	
   316	        // Update the invested capital
   317	        investedCapital[_guru] = uint256(_initialDeposit.amountsValue.input);
   318	
   319	        // Handle buyback and burn
   320	        _safeTransferETH(
   321	            fundFactory.guruBurner(),
   322	            _initialDeposit.amountsWei.buybackFee
   323	        );
   324	
   325	        emit Deposited(
   326	            _guru,
   327	            int256(_initialDeposit.amountsValue.input), // first ∆ TVL is the initial deposit value
   328	            _initialDeposit.amountsValue.input, // first deposit mint amount matches its USDT value
   329	            _initialDeposit.amountsWei,
   330	            _initialDeposit.amountsValue
   331	        );
   332	    }
   333	
   334	    /**
   335	     * @notice Gurus can call this function to directly deposit an asset into the fund.
   336	     * @param _signedAssetDeposit The signed payload containing the asset to deposit
   337	     */
   338	    function depositAsset(
   339	        SignedPayload calldata _signedAssetDeposit
   340	    ) external nonReentrant onlyOwner verifyingSignature(_signedAssetDeposit) {
   341	        FundAction.AssetDeposit memory _deposit = abi.decode(
   342	            _signedAssetDeposit.data,
   343	            (FundAction.AssetDeposit)
   344	        );
   345	
   346	        require(
   347	            _deposit.tvlDelta >= 0,
   348	            DepositMustIncreaseTvl(_deposit.tvlDelta)
   349	        );
   350	
   351	        /// 1. Update asset index
   352	        require(
   353	            assets[_deposit.assetIndex] == ERC20(address(0)) ||
   354	                assets[_deposit.assetIndex] == _deposit.asset,
   355	            AssetIndexAlreadyOccupied(
   356	                _deposit.assetIndex,
   357	                assets[_deposit.assetIndex]
   358	            )
   359	        );
   360	
   361	        assets[_deposit.assetIndex] = _deposit.asset;
   362	
   363	        /// 2. Transfer deposit in
   364	        _deposit.asset.safeTransferFrom(
   365	            msg.sender,
   366	            address(this),
   367	            _deposit.amount
   368	        );
   369	
   370	        /// 3. Mint fund tokens
   371	        _mint(msg.sender, _deposit.mintAmount);
   372	
   373	        /// 4. Update invested capital
   374	        investedCapital[msg.sender] += uint256(_deposit.tvlDelta);
   375	
   376	        emit DepositedAsset(_deposit.asset, _deposit.amount, _deposit.tvlDelta);
   377	    }
   378	
   379	    /**
   380	     * @notice Deposits ETH into the fund, which will get swapped and rebalanced
   381	     * accordingly to the current fund composition.
   382	     * @param _signedDepositPayload The signed payload containing the deposit data,
   383	     * including the amount of ETH to deposit and the swaps to execute.
   384	     */
   385	    function deposit(
   386	        SignedPayload calldata _signedDepositPayload
   387	    )
   388	        external
   389	        payable
   390	        nonReentrant
   391	        onlyOpen
   392	        onlyNotPaused
   393	        verifyingSignature(_signedDepositPayload)
   394	    {
   395	        // Prevents management from accidentally depositing into any fund
   396	        require(msg.sender != fundFactory.admin(), Error.Unauthorized());
   397	
   398	        FundAction.Deposit memory _deposit = abi.decode(
   399	            _signedDepositPayload.data,
   400	            (FundAction.Deposit)
   401	        );
   402	
   403	        require(
   404	            _deposit.nonce == nonce,
   405	            InvalidDepositNonce(_deposit.nonce, nonce)
   406	        );
   407	
   408	        require(
   409	            _deposit.tvlDelta >= 0,
   410	            DepositMustIncreaseTvl(_deposit.tvlDelta)
   411	        );
   412	
   413	        /// 1. Validate fees and deposit amounts
   414	
   415	        uint256 fees = _deposit.amountsWei.fee + _deposit.amountsWei.buybackFee;
   416	
   417	        require(
   418	            fees <= (msg.value * fundFactory.protocolDepositFee()) / 100_000 &&
   419	                _deposit.feeRecipient != address(0),
   420	            UnexpectedFeeData(
   421	                fees,
   422	                fundFactory.protocolDepositFee(),
   423	                _deposit.feeRecipient
   424	            )
   425	        );
   426	
   427	        uint256 netDeposit = msg.value - fees;
   428	
   429	        require(
   430	            _deposit.amountsWei.input == netDeposit,
   431	            Error.MismatchingDepositAmount(_deposit.amountsWei, netDeposit)
   432	        );
   433	
   434	        /// 2. Wrap ETH
   435	        _wrapETH(netDeposit);
   436	
   437	        /// 3. Loop and swap
   438	        _executeSwaps(_deposit.swaps);
   439	
   440	        /// 4. Mint fund tokens
   441	        _mint(msg.sender, _deposit.mintAmount);
   442	
   443	        /// 5. Update invested capital
   444	        investedCapital[msg.sender] += uint256(_deposit.tvlDelta);
   445	
   446	        /// 6. Collect fees
   447	        if (_deposit.amountsWei.fee > 0) {
   448	            _safeTransferETH(_deposit.feeRecipient, _deposit.amountsWei.fee);
   449	        }
   450	
   451	        if (_deposit.amountsWei.buybackFee > 0) {
   452	            _safeTransferETH(
   453	                fundFactory.guruBurner(),
   454	                _deposit.amountsWei.buybackFee
   455	            );
   456	        }
   457	
   458	        emit Deposited(
   459	            msg.sender,
   460	            _deposit.tvlDelta,
   461	            _deposit.mintAmount,
   462	            _deposit.amountsWei,
   463	            _deposit.amountsValue
   464	        );
   465	    }
   466	
   467	    /**
   468	     * @notice Swaps tokens for ETH.
   469	     * @param _signedSwapPayload The signed payload containing the swap data
   470	     */
   471	    function swapTokensForETH(
   472	        SignedPayload calldata _signedSwapPayload
   473	    )
   474	        external
   475	        nonReentrant
   476	        onlyOpen
   477	        onlyNotPaused
   478	        onlyOwner
   479	        verifyingSignature(_signedSwapPayload)
   480	    {
   481	        FundAction.SingleSwap memory swapAction = abi.decode(
   482	            _signedSwapPayload.data,
   483	            (FundAction.SingleSwap)
   484	        );
   485	
   486	        require(
   487	            address(swapAction.swap.tokenOut) == address(fundFactory.weth()),
   488	            InvalidSwapDirection(
   489	                address(swapAction.swap.tokenIn),
   490	                address(swapAction.swap.tokenOut)
   491	            )
   492	        );
   493	
   494	        _executeSingleSwap(swapAction.swap);
   495	        _updateAssets(swapAction.assetIndexes);
   496	
   497	        unchecked {
   498	            nonce++;
   499	        }
   500	    }
   501	
   502	    /**
   503	     * @notice Swaps ETH for tokens.
   504	     * @param _signedSwapPayload The signed payload containing the swap data
   505	     */
   506	    function swapETHForTokens(
   507	        SignedPayload calldata _signedSwapPayload
   508	    )
   509	        external
   510	        nonReentrant
   511	        onlyOpen
   512	        onlyNotPaused
   513	        onlyOwner
   514	        verifyingSignature(_signedSwapPayload)
   515	    {
   516	        FundAction.SingleSwap memory swapAction = abi.decode(
   517	            _signedSwapPayload.data,
   518	            (FundAction.SingleSwap)
   519	        );
   520	

exec
/bin/bash -lc "nl -ba contracts/FundFactory.sol | sed -n '1,220p'" in /tmp/codex-qadnxli7
 succeeded in 0ms:
     1	// SPDX-License-Identifier: MIT
     2	pragma solidity =0.8.27;
     3	
     4	import { Ownable } from '@openzeppelin/contracts/access/Ownable.sol';
     5	import { Pausable } from '@openzeppelin/contracts/utils/Pausable.sol';
     6	import { ERC20 } from '@openzeppelin/contracts/token/ERC20/ERC20.sol';
     7	import { SafeERC20 } from '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol';
     8	import { Clones } from '@openzeppelin/contracts/proxy/Clones.sol';
     9	
    10	import { GuruFund } from 'contracts/GuruFund.sol';
    11	import { EIP712Helper } from 'contracts/helpers/EIP712Helper.sol';
    12	import { SignedPayload } from 'contracts/structs/SignedPayload.sol';
    13	import { IWETH } from 'contracts/interfaces/IWETH.sol';
    14	import { InitialDeposit } from 'contracts/structs/InitialDeposit.sol';
    15	import { Error } from 'contracts/lib/Error.sol';
    16	
    17	contract FundFactory is EIP712Helper, Pausable {
    18	    // Immutable variables (stored in code, not storage)
    19	    IWETH public immutable weth;
    20	    GuruFund public immutable fundImplementation;
    21	
    22	    // Constants (not stored in storage)
    23	    bytes32 public constant SIGNED_ACTION_TYPEHASH =
    24	        keccak256(
    25	            'SignedAction(uint256 nonce,address account,bytes data,uint256 expiresAt)'
    26	        );
    27	    uint24 public constant FEE_DENOMINATOR = 100_000;
    28	    uint16 public constant MAX_PROFIT_FEE = 20_000; // 20%
    29	    uint16 public constant GURU_PROFIT_FEE = 10_000; // 10%
    30	    uint16 public constant MAX_DEPOSIT_FEE = 1_000; // 1%
    31	    uint16 public constant MAX_SWAP_FEE = 200; // 0.2%
    32	
    33	    // Storage variables packed into slots
    34	    address public vault; // slot 0 (20 bytes)
    35	    uint32 public signatureValidityPeriod = 10; // slot 0 (4 bytes)
    36	    uint16 public protocolProfitFee = 5_000; // slot 0 (2 bytes)
    37	    uint16 public protocolDepositFee = 1_000; // slot 0 (2 bytes)
    38	    uint16 public protocolSwapFee = 200; // slot 0 (2 bytes)
    39	
    40	    address public guruBurner; // slot 1 (20 bytes)
    41	    uint64 public minimumGuruInitialDepositValue = 1000_000000; // slot 1 (8 bytes)
    42	    uint64 public protocolFundCreationFeeValue = 100_000000; // slot 1 (8 bytes)
    43	
    44	    address public admin; // slot 2 (20 bytes)
    45	
    46	    // events
    47	    event VaultUpdated(address newVault);
    48	    event GuruBurnerUpdated(address newGuruBurner);
    49	    event AdminUpdated(address newAdmin);
    50	    event MinimumGuruInitialDepositValueUpdated(
    51	        uint64 newMinimumInitialDeposit
    52	    );
    53	    event SignatureValidityPeriodUpdated(uint32 newSignatureValidityPeriod);
    54	    event ProtocolProfitFeeUpdated(uint16 newProtocolProfitFee);
    55	    event ProtocolFundCreationFeeUpdated(uint64 newProtocolFundCreationFee);
    56	    event ProtocolDepositFeeUpdated(uint16 newProtocolDepositFee);
    57	    event ProtocolSwapFeeUpdated(uint16 newProtocolSwapFee);
    58	    event FundCreated(address indexed fund, address indexed creator);
    59	
    60	    // errors
    61	    error InsufficientFirstDeposit(uint256 received, uint256 required);
    62	    error FeesTooHigh(uint256 fee, uint256 max);
    63	
    64	    constructor(
    65	        address _offchainSigner,
    66	        address _vault,
    67	        address _guruBurner,
    68	        address _admin,
    69	        IWETH _wethAddress
    70	    ) Ownable(msg.sender) EIP712Helper('GURU.FUND', 'v0.1.0', _offchainSigner) {
    71	        vault = _vault;
    72	        guruBurner = _guruBurner;
    73	        weth = _wethAddress;
    74	        admin = _admin;
    75	        fundImplementation = new GuruFund();
    76	    }
    77	
    78	    function getTotalProfitFee() public view returns (uint256) {
    79	        return GURU_PROFIT_FEE + protocolProfitFee;
    80	    }
    81	
    82	    // config
    83	    function setVault(address _newVault) public onlyOwner {
    84	        vault = _newVault;
    85	        emit VaultUpdated(_newVault);
    86	    }
    87	
    88	    function setGuruBurner(address _newGuruBurner) public onlyOwner {
    89	        guruBurner = _newGuruBurner;
    90	        emit GuruBurnerUpdated(_newGuruBurner);
    91	    }
    92	
    93	    function setAdmin(address _newAdmin) public onlyOwner {
    94	        admin = _newAdmin;
    95	        emit AdminUpdated(_newAdmin);
    96	    }
    97	
    98	    function setProtocolFundCreationFee(
    99	        uint64 _newProtocolFundCreationFee
   100	    ) public onlyOwner {
   101	        protocolFundCreationFeeValue = _newProtocolFundCreationFee;
   102	        emit ProtocolFundCreationFeeUpdated(_newProtocolFundCreationFee);
   103	    }
   104	
   105	    function setProtocolDepositFee(
   106	        uint16 _newProtocolDepositFee
   107	    ) public onlyOwner {
   108	        require(
   109	            _newProtocolDepositFee <= MAX_DEPOSIT_FEE,
   110	            FeesTooHigh(_newProtocolDepositFee, MAX_DEPOSIT_FEE)
   111	        );
   112	        protocolDepositFee = _newProtocolDepositFee;
   113	        emit ProtocolDepositFeeUpdated(_newProtocolDepositFee);
   114	    }
   115	
   116	    function setProtocolProfitFee(
   117	        uint16 _newProtocolFeeOnProfits
   118	    ) public onlyOwner {
   119	        require(
   120	            GURU_PROFIT_FEE + _newProtocolFeeOnProfits <= MAX_PROFIT_FEE,
   121	            FeesTooHigh(
   122	                GURU_PROFIT_FEE + _newProtocolFeeOnProfits,
   123	                MAX_PROFIT_FEE
   124	            )
   125	        );
   126	        protocolProfitFee = _newProtocolFeeOnProfits;
   127	        emit ProtocolProfitFeeUpdated(_newProtocolFeeOnProfits);
   128	    }
   129	
   130	    function setProtocolSwapFee(uint16 _newProtocolSwapFee) public onlyOwner {
   131	        require(
   132	            _newProtocolSwapFee <= MAX_SWAP_FEE,
   133	            FeesTooHigh(_newProtocolSwapFee, MAX_SWAP_FEE)
   134	        );
   135	        protocolSwapFee = _newProtocolSwapFee;
   136	        emit ProtocolSwapFeeUpdated(_newProtocolSwapFee);
   137	    }
   138	
   139	    function setMinimumFirstDepositValue(uint64 _newMinimum) public onlyOwner {
   140	        minimumGuruInitialDepositValue = _newMinimum;
   141	        emit MinimumGuruInitialDepositValueUpdated(_newMinimum);
   142	    }
   143	
   144	    function setSignatureValidityPeriod(
   145	        uint32 _newSignatureValidityPeriod
   146	    ) public onlyOwner {
   147	        signatureValidityPeriod = _newSignatureValidityPeriod;
   148	        emit SignatureValidityPeriodUpdated(_newSignatureValidityPeriod);
   149	    }
   150	
   151	    function verifySignature(
   152	        address account,
   153	        SignedPayload calldata _signedPayload
   154	    ) public {
   155	        _verifyEIP712(SIGNED_ACTION_TYPEHASH, account, _signedPayload);
   156	    }
   157	
   158	    function pause() public onlyOwner {
   159	        _pause();
   160	    }
   161	
   162	    function unpause() public onlyOwner {
   163	        _unpause();
   164	    }
   165	
   166	    /**
   167	     * @notice Creates a new fund with a minimum deposit of 1000 USDT worth of WETH
   168	     * @param _name Name of the fund token
   169	     * @param _symbol Symbol of the fund token
   170	     * @param _signedPayload Signed payload containing expiration, signature, and
   171	     * the encoded price feed with latest WETH/USDT price
   172	     */
   173	    function createFund(
   174	        string calldata _name,
   175	        string calldata _symbol,
   176	        SignedPayload calldata _signedPayload
   177	    ) public payable whenNotPaused {
   178	        verifySignature(msg.sender, _signedPayload);
   179	
   180	        InitialDeposit memory initialDeposit = abi.decode(
   181	            _signedPayload.data,
   182	            (InitialDeposit)
   183	        );
   184	
   185	        // Any check on the deposit min amount is handled offchain: here we
   186	        // just verify that the amount received is matching the signed payload
   187	        require(
   188	            initialDeposit.amountsWei.input +
   189	                initialDeposit.amountsWei.buybackFee ==
   190	                msg.value,
   191	            Error.MismatchingDepositAmount(initialDeposit.amountsWei, msg.value)
   192	        );
   193	
   194	        address fund = Clones.clone(address(fundImplementation));
   195	
   196	        GuruFund(payable(fund)).initialize{ value: msg.value }(
   197	            msg.sender,
   198	            _name,
   199	            _symbol,
   200	            initialDeposit
   201	        );
   202	
   203	        emit FundCreated(fund, msg.sender);
   204	    }
   205	}

exec
/bin/bash -lc "nl -ba contracts/GuruFund.sol | sed -n '520,760p'" in /tmp/codex-qadnxli7
 succeeded in 0ms:
   520	
   521	        require(
   522	            address(swapAction.swap.tokenIn) == address(fundFactory.weth()),
   523	            InvalidSwapDirection(
   524	                address(swapAction.swap.tokenIn),
   525	                address(swapAction.swap.tokenOut)
   526	            )
   527	        );
   528	
   529	        _executeSingleSwap(swapAction.swap);
   530	        _updateAssets(swapAction.assetIndexes);
   531	
   532	        unchecked {
   533	            nonce++;
   534	        }
   535	    }
   536	
   537	    /**
   538	     * @notice Rebalances the fund by changing the allocations of the assets.
   539	     * @param _signedRebalancePayload The signed payload containing the rebalancing data,
   540	     * including the changes to apply to the asset lists and the swaps to execute.
   541	     */
   542	    function rebalance(
   543	        SignedPayload calldata _signedRebalancePayload
   544	    )
   545	        external
   546	        nonReentrant
   547	        onlyOpen
   548	        onlyNotPaused
   549	        onlyOwner
   550	        verifyingSignature(_signedRebalancePayload)
   551	    {
   552	        FundAction.Rebalance memory _rebalance = abi.decode(
   553	            _signedRebalancePayload.data,
   554	            (FundAction.Rebalance)
   555	        );
   556	
   557	        _updateAssets(_rebalance.assetIndexes);
   558	        _executeSwaps(_rebalance.swaps);
   559	
   560	        unchecked {
   561	            nonce++;
   562	        }
   563	
   564	        emit Rebalanced();
   565	    }
   566	
   567	    /**
   568	     * @notice Withdraws the user's share of the fund, swapping the assets back to ETH.
   569	     * @param _signedWithdrawPayload The signed payload containing the withdrawal data,
   570	     */
   571	    function withdraw(
   572	        SignedPayload calldata _signedWithdrawPayload
   573	    ) external nonReentrant verifyingSignature(_signedWithdrawPayload) {
   574	        if (!isOpen) {
   575	            // Investors can withdraw only until the grace period ends
   576	            require(block.timestamp <= gracePeriodEnd, GracePeriodEnded());
   577	        }
   578	
   579	        FundAction.Withdraw memory _userWithdrawal = abi.decode(
   580	            _signedWithdrawPayload.data,
   581	            (FundAction.Withdraw)
   582	        );
   583	
   584	        // 1. Burn tokens
   585	        _burn(msg.sender, _userWithdrawal.burnAmount);
   586	
   587	        // 2. Update invested capital
   588	        unchecked {
   589	            investedCapital[msg.sender] -= _userWithdrawal
   590	                .amountsValue
   591	                .investedCapital;
   592	        }
   593	
   594	        // 3. Execute swaps
   595	        _executeSwaps(_userWithdrawal.swaps);
   596	
   597	        // 4. Handle ETH transfers and fees
   598	        _executeWithdrawalTransfers(_userWithdrawal.amountsWei);
   599	
   600	        emit Withdrawn(
   601	            msg.sender,
   602	            _userWithdrawal.burnAmount,
   603	            _userWithdrawal.amountsWei,
   604	            _userWithdrawal.amountsValue,
   605	            _userWithdrawal.tvlDelta
   606	        );
   607	    }
   608	
   609	    /**
   610	     * @notice Executes the withdrawal transfers, including fees.
   611	     * @param amountsWei The withdrawal amounts in wei units
   612	     */
   613	    function _executeWithdrawalTransfers(
   614	        WithdrawalAmounts memory amountsWei
   615	    ) internal {
   616	        if (amountsWei.grossPnl <= 0) {
   617	            _unwrapETH(amountsWei.netOutput);
   618	        } else {
   619	            unchecked {
   620	                _unwrapETH(
   621	                    amountsWei.netOutput +
   622	                        amountsWei.protocolFee +
   623	                        amountsWei.guruFee
   624	                );
   625	            }
   626	
   627	            _safeTransferETH(fundFactory.vault(), amountsWei.protocolFee);
   628	            _safeTransferETH(owner(), amountsWei.guruFee);
   629	        }
   630	        _safeTransferETH(msg.sender, amountsWei.netOutput);
   631	    }
   632	
   633	    /**
   634	     * @notice Mints the management fee to the admin.
   635	     * @dev Only the management admin can call this function.
   636	     */
   637	    function mintManagementFee() external onlyOpen onlyNotPaused {
   638	        require(msg.sender == fundFactory.admin(), Error.Unauthorized());
   639	        require(
   640	            block.timestamp - latestManagementFeeMint > MANAGEMENT_FEE_PERIOD,
   641	            ManagementFeePeriodNotElapsed()
   642	        );
   643	
   644	        uint256 amount = totalSupply() / MANAGEMENT_FEE_DENOMINATOR;
   645	        _mint(fundFactory.admin(), amount);
   646	        latestManagementFeeMint = block.timestamp;
   647	
   648	        emit ManagementFeeMinted(amount);
   649	    }
   650	
   651	    /**
   652	     * @notice Closes the fund, liquidating all assets. Users will be able to withdraw their capital.
   653	     * @param _signedClosePayload The signed payload containing the close data
   654	     */
   655	    function close(
   656	        SignedPayload calldata _signedClosePayload
   657	    )
   658	        external
   659	        nonReentrant
   660	        onlyOpen
   661	        onlyOwner
   662	        verifyingSignature(_signedClosePayload)
   663	    {
   664	        isOpen = false;
   665	        gracePeriodEnd = block.timestamp + GRACE_PERIOD_DURATION;
   666	
   667	        // Liquidate all assets
   668	        FundAction.Close memory _liquidation = abi.decode(
   669	            _signedClosePayload.data,
   670	            (FundAction.Close)
   671	        );
   672	
   673	        _executeSwaps(_liquidation.swaps);
   674	
   675	        emit Closed();
   676	    }
   677	
   678	    /**
   679	     * @notice Extends the grace period.
   680	     * @param _newGracePeriodEnd The new grace period end
   681	     */
   682	    function extendGracePeriod(uint256 _newGracePeriodEnd) external {
   683	        // Only protocol owner can extend the grace period
   684	        require(
   685	            msg.sender == fundFactory.owner() &&
   686	                _newGracePeriodEnd > gracePeriodEnd,
   687	            Error.Unauthorized()
   688	        );
   689	        gracePeriodEnd = _newGracePeriodEnd;
   690	        emit GracePeriodExtended(_newGracePeriodEnd);
   691	    }
   692	
   693	    /**
   694	     * @notice After the grace period ends, the protocol owner can claim any
   695	     * remaining funds to buyback and burn $GURU.
   696	     */
   697	    function claimAbandonedFundsForBuybackAndBurn() external {
   698	        require(
   699	            !isOpen &&
   700	                msg.sender == fundFactory.owner() &&
   701	                block.timestamp > gracePeriodEnd,
   702	            Error.Unauthorized()
   703	        );
   704	        _unwrapETH(fundFactory.weth().balanceOf(address(this)));
   705	        _safeTransferETH(fundFactory.guruBurner(), address(this).balance);
   706	        emit AbandonedFundsClaimed();
   707	    }
   708	
   709	    /**
   710	     * @notice Updates the minimum deposit value for a user.
   711	     * @param _newMinValue The new minimum deposit value
   712	     */
   713	    function updateMinUserDepositValue(
   714	        uint256 _newMinValue
   715	    ) external onlyOpen onlyOwner {
   716	        minUserDepositValue = _newMinValue;
   717	        emit MinUserDepositValueUpdated(_newMinValue);
   718	    }
   719	
   720	    /**
   721	     * @notice Updates the minimum deposit cooldown for a user.
   722	     * @param _newMinCooldown The new minimum deposit cooldown
   723	     */
   724	    function updateMinDepositCooldown(
   725	        uint256 _newMinCooldown
   726	    ) external onlyOpen onlyOwner {
   727	        require(
   728	            _newMinCooldown <= MAX_DEPOSIT_COOLDOWN,
   729	            MaxCooldownExceeded(_newMinCooldown)
   730	        );
   731	        minUserDepositCooldown = _newMinCooldown;
   732	        emit MinUserDepositCooldownUpdated(_newMinCooldown);
   733	    }
   734	
   735	    /**
   736	     * @notice Returns the available balance for a user, i.e. the balance that is not cooling down.
   737	     * @param _account The address of the user
   738	     * @return availableBalance The available balance for the user
   739	     */
   740	    function availableBalanceOf(
   741	        address _account
   742	    ) external view returns (uint256 availableBalance) {
   743	        availableBalance = balanceOf(_account);
   744	
   745	        if (hasCooldown(_account)) {
   746	            (uint256 lockedBalance, ) = _getCooldownDetails(_account);
   747	            availableBalance -= lockedBalance;
   748	        }
   749	    }
   750	
   751	    /**
   752	     * @notice Returns the assets of the fund.
   753	     */
   754	    function getAssets() external view returns (ERC20[8] memory) {
   755	        if (isOpen) {
   756	            return assets;
   757	        } else {
   758	            ERC20[8] memory _assets;
   759	            _assets[0] = ERC20(address(fundFactory.weth()));
   760	            return _assets;

exec
/bin/bash -lc "nl -ba contracts/helpers/SwapHelper.sol | sed -n '1,220p'" in /tmp/codex-qadnxli7
 succeeded in 0ms:
     1	// SPDX-License-Identifier: MIT
     2	pragma solidity =0.8.27;
     3	
     4	import '@openzeppelin/contracts/token/ERC20/ERC20.sol';
     5	import '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol';
     6	import '@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol';
     7	
     8	import 'contracts/structs/Swap.sol';
     9	
    10	contract SwapHelper is Initializable {
    11	    using SafeERC20 for ERC20;
    12	
    13	    address public weth;
    14	    address public feeCollector;
    15	
    16	    function __SwapHelper_init_unchained(
    17	        address _weth,
    18	        address _feeCollector
    19	    ) internal onlyInitializing {
    20	        weth = _weth;
    21	        feeCollector = _feeCollector;
    22	    }
    23	
    24	    event SwapExecuted(
    25	        address indexed sender,
    26	        address indexed tokenIn,
    27	        address indexed tokenOut,
    28	        uint256 amountSent,
    29	        uint256 amountReceived,
    30	        address router
    31	    );
    32	
    33	    /**
    34	     * @notice Execute the swaps in the provided order, based on the swap type and fee tier
    35	     * @param _swaps The swaps to execute
    36	     */
    37	    function _executeSwaps(Swap[] memory _swaps) internal {
    38	        for (uint8 i = 0; i < _swaps.length; i++) {
    39	            _executeSingleSwap(_swaps[i]);
    40	        }
    41	    }
    42	
    43	    /**
    44	     * @notice Executes a single swap.
    45	     * @param _swap The swap to execute
    46	     */
    47	    function _executeSingleSwap(Swap memory _swap) internal {
    48	        uint256 tokenInBalanceBefore = _swap.tokenIn.balanceOf(address(this));
    49	        uint256 tokenOutBalanceBefore = _swap.tokenOut.balanceOf(address(this));
    50	
    51	        // Approve the router to spend the tokenIn
    52	        _swap.tokenIn.forceApprove(address(_swap.router), _swap.amountToSend);
    53	
    54	        // Forward the call to the router
    55	        (bool success, bytes memory returnData) = _swap.router.call(
    56	            _swap.callData
    57	        );
    58	        require(success, string(returnData));
    59	
    60	        ERC20(weth).safeTransfer(feeCollector, _swap.swapFee);
    61	
    62	        uint256 tokenInBalanceAfter = _swap.tokenIn.balanceOf(address(this));
    63	        uint256 tokenOutBalanceAfter = _swap.tokenOut.balanceOf(address(this));
    64	
    65	        emit SwapExecuted(
    66	            msg.sender,
    67	            address(_swap.tokenIn),
    68	            address(_swap.tokenOut),
    69	            tokenInBalanceBefore - tokenInBalanceAfter,
    70	            tokenOutBalanceAfter - tokenOutBalanceBefore,
    71	            _swap.router
    72	        );
    73	    }
    74	}

exec
/bin/bash -lc "nl -ba contracts/helpers/TransferHelper.sol | sed -n '1,160p'" in /tmp/codex-qadnxli7
 succeeded in 0ms:
     1	// SPDX-License-Identifier: MIT
     2	pragma solidity =0.8.27;
     3	
     4	contract TransferHelper {
     5	    mapping(address => uint256) creditByAddress;
     6	
     7	    event CreditAdded(address indexed creditor, uint256 value);
     8	    event CreditWithdrawn(address indexed recipient, uint256 value);
     9	
    10	    error NativeTransferFailed();
    11	
    12	    /**
    13	     * @notice Safe transfer of ETH to an address. If the transfer fails, the value is added to the credit of the address.
    14	     * @param recipient The address to transfer ETH to
    15	     * @param value The amount of ETH to transfer
    16	     */
    17	    function _safeTransferETH(address recipient, uint256 value) internal {
    18	        (bool success, ) = recipient.call{ value: value }('');
    19	
    20	        if (!success) {
    21	            creditByAddress[recipient] += value;
    22	            emit CreditAdded(recipient, value);
    23	        }
    24	    }
    25	
    26	    /**
    27	     * @notice Withdraws the caller's credit to the specified recipient. This transfer will either succeed or revert.
    28	     * @param recipient The address to transfer the ETH to
    29	     */
    30	    function withdrawCredit(address recipient) external {
    31	        uint256 value = creditByAddress[msg.sender];
    32	        creditByAddress[msg.sender] = 0;
    33	        (bool success, ) = recipient.call{ value: value }('');
    34	        require(success, NativeTransferFailed());
    35	        emit CreditWithdrawn(recipient, value);
    36	    }
    37	}

exec
/bin/bash -lc "nl -ba contracts/structs/Swap.sol | sed -n '1,160p'" in /tmp/codex-qadnxli7
 succeeded in 0ms:
     1	// SPDX-License-Identifier: MIT
     2	pragma solidity =0.8.27;
     3	
     4	import '@openzeppelin/contracts/token/ERC20/ERC20.sol';
     5	
     6	struct Swap {
     7	    /**
     8	     * @notice The address of the router to use for the swap
     9	     */
    10	    address router;
    11	    /**
    12	     * @notice The encoded function call data for the swap
    13	     */
    14	    bytes callData;
    15	    /**
    16	     * @notice The token to send
    17	     */
    18	    ERC20 tokenIn;
    19	    /**
    20	     * @notice The token to receive
    21	     */
    22	    ERC20 tokenOut;
    23	    /**
    24	     * @notice The amount of tokenIn, decoded for token approval
    25	     */
    26	    uint256 amountToSend;
    27	    /**
    28	     * @notice The swap fee amount we apply to this swap
    29	     */
    30	    uint256 swapFee;
    31	}

exec
/bin/bash -lc "nl -ba contracts/lib/FundAction.sol | sed -n '1,220p'" in /tmp/codex-qadnxli7
 succeeded in 0ms:
     1	// SPDX-License-Identifier: MIT
     2	pragma solidity =0.8.27;
     3	
     4	import { Swap } from 'contracts/structs/Swap.sol';
     5	import { AssetIndex } from 'contracts/structs/AssetIndex.sol';
     6	import { DepositAmounts } from 'contracts/structs/DepositAmounts.sol';
     7	import { WithdrawalAmounts } from 'contracts/structs/WithdrawalAmounts.sol';
     8	import { ERC20 } from '@openzeppelin/contracts/token/ERC20/ERC20.sol';
     9	
    10	library FundAction {
    11	    struct Deposit {
    12	        /**
    13	         * @notice The nonce at the time of the deposit
    14	         */
    15	        uint256 nonce;
    16	        /**
    17	         * @notice Deposit amounts in wei units
    18	         */
    19	        DepositAmounts amountsWei;
    20	        /**
    21	         * @notice Deposit amounts in USDT units
    22	         */
    23	        DepositAmounts amountsValue;
    24	        /**
    25	         * @notice Swaps to be executed to maintain the fund allocations after deposit
    26	         */
    27	        Swap[] swaps;
    28	        /**
    29	         * @notice The amount of Fund tokens to mint
    30	         */
    31	        uint256 mintAmount;
    32	        /**
    33	         * @notice Either the vault or a referral address
    34	         */
    35	        address feeRecipient;
    36	        /**
    37	         * @notice The difference in TVL between the initial TVL and the final TVL
    38	         */
    39	        int256 tvlDelta;
    40	    }
    41	
    42	    struct AssetDeposit {
    43	        /**
    44	         * @notice The index of the asset to deposit
    45	         */
    46	        uint8 assetIndex;
    47	        /**
    48	         * @notice The asset to deposit
    49	         */
    50	        ERC20 asset;
    51	        /**
    52	         * @notice The amount of asset to deposit
    53	         */
    54	        uint256 amount;
    55	        /**
    56	         * @notice The amount of Fund tokens to mint
    57	         */
    58	        uint256 mintAmount;
    59	        /**
    60	         * @notice The difference in TVL between the initial TVL and the final TVL
    61	         */
    62	        int256 tvlDelta;
    63	    }
    64	
    65	    struct Rebalance {
    66	        /**
    67	         * @notice Updates to the fund assets
    68	         */
    69	        AssetIndex[] assetIndexes;
    70	        /**
    71	         * @notice Swaps to be executed to rebalance the fund allocations
    72	         */
    73	        Swap[] swaps;
    74	    }
    75	
    76	    struct SingleSwap {
    77	        /**
    78	         * @notice The indexes of the assets to swap
    79	         */
    80	        AssetIndex[] assetIndexes;
    81	        /**
    82	         * @notice The swap to execute
    83	         */
    84	        Swap swap;
    85	    }
    86	
    87	    struct Withdraw {
    88	        /**
    89	         * @notice The amount of Fund tokens to burn
    90	         */
    91	        uint256 burnAmount;
    92	        /**
    93	         * @notice Swaps to be executed to withdraw the position
    94	         */
    95	        Swap[] swaps;
    96	        /**
    97	         * @notice The amounts in wei units
    98	         */
    99	        WithdrawalAmounts amountsWei;
   100	        /**
   101	         * @notice The amounts in USDT units
   102	         */
   103	        WithdrawalAmounts amountsValue;
   104	        /**
   105	         * @notice The difference in TVL between the initial TVL and the final TVL
   106	         */
   107	        int256 tvlDelta;
   108	    }
   109	
   110	    struct Close {
   111	        /**
   112	         * @notice Swaps to be executed to liquidate the fund
   113	         */
   114	        Swap[] swaps;
   115	    }
   116	}

Identified two actionable auth flaws: public nonce consumption enables mempool griefing, and signed payloads are not bound to a specific fund, enabling cross-fund replay. Preparing the final JSON report.
  ✓ Inspect workspace and fully read AUDIT_BUNDLE.txt as required
  ✓ Analyze first-party Solidity sources for exploitable issues in scoped categories
  → Produce JSON audit result with evidence and locations
codex
{"no_findings":false,"summary":"Two exploitable auth issues were found: third parties can consume any valid signature nonce before the intended call executes, and signed payloads are not bound to a specific fund instance, enabling cross-fund replay.","findings":[{"severity":"high","category":"auth","title":"Signed actions can be replayed across different GuruFund instances","exploit_scenario":"A user or guru who participates in multiple funds can reuse a signature that was issued for Fund A against Fund B, because signature verification happens only in the factory domain and the signed message does not include the target fund address. For example, a withdrawal signature for one closed WETH-only fund can be submitted to another compatible fund where the same user also holds shares, draining value from the wrong fund.","recommendation":"Bind every signed action to the specific fund address and action type. The simplest fix is to include `address(this)` or an explicit `fund` field in the signed struct for all fund actions, or move signature verification/nonces into each GuruFund so the EIP-712 domain is per-fund.","evidence":"`_verifyEIP712` hashes only `(nonce, account, keccak256(data), expiresAt)`. `GuruFund` always verifies through the shared `FundFactory`, and the action structs being signed do not include any fund identifier.","locations":["contracts/helpers/EIP712Helper.sol:78","contracts/FundFactory.sol:151","contracts/GuruFund.sol:258","contracts/lib/FundAction.sol:11","contracts/lib/FundAction.sol:65","contracts/lib/FundAction.sol:87"]},{"severity":"medium","category":"auth","title":"Anyone can front-run and consume another user's signed payload nonce","exploit_scenario":"An attacker watching the mempool can copy a victim's signed payload and call `FundFactory.verifySignature(victim, payload)` first. That call succeeds and increments `noncesByUser[victim]`, causing the victim's subsequent `createFund`, `deposit`, `withdraw`, `rebalance`, or `close` transaction to revert with an invalid signature. The attacker can repeat this cheaply to censor protocol actions.","recommendation":"Do not expose a public state-changing signature verifier. Make verification internal/private, or restrict it to trusted entrypoints. Also consider consuming the nonce only inside the final action after all authorization checks for that action are complete.","evidence":"`FundFactory.verifySignature` is public and directly calls `_verifyEIP712`, which increments `noncesByUser[_account]++` as part of verification. There is no requirement that `msg.sender == account` or that the caller is an authorized contract entrypoint.","locations":["contracts/FundFactory.sol:151","contracts/helpers/EIP712Helper.sol:66","contracts/helpers/EIP712Helper.sol:81","contracts/FundFactory.sol:178","contracts/GuruFund.sol:258"]}]}
tokens used
60,685
Metadata
{
    "codex": {
        "ran_at": "2026-04-04T04:07:54.145708+00:00",
        "returncode": 0
    },
    "project": {
        "mode": "source",
        "file_count": 47,
        "import_count": 56,
        "first_party_contracts_count": 14
    },
    "summary": "Two exploitable auth issues were found: third parties can consume any valid signature nonce before the intended call executes, and signed payloads are not bound to a specific fund instance, enabling cross-fund replay.",
    "raw_final": {
        "summary": "Two exploitable auth issues were found: third parties can consume any valid signature nonce before the intended call executes, and signed payloads are not bound to a specific fund instance, enabling cross-fund replay.",
        "findings": [
            {
                "title": "Signed actions can be replayed across different GuruFund instances",
                "category": "auth",
                "evidence": "`_verifyEIP712` hashes only `(nonce, account, keccak256(data), expiresAt)`. `GuruFund` always verifies through the shared `FundFactory`, and the action structs being signed do not include any fund identifier.",
                "severity": "high",
                "locations": [
                    "contracts/helpers/EIP712Helper.sol:78",
                    "contracts/FundFactory.sol:151",
                    "contracts/GuruFund.sol:258",
                    "contracts/lib/FundAction.sol:11",
                    "contracts/lib/FundAction.sol:65",
                    "contracts/lib/FundAction.sol:87"
                ],
                "recommendation": "Bind every signed action to the specific fund address and action type. The simplest fix is to include `address(this)` or an explicit `fund` field in the signed struct for all fund actions, or move signature verification/nonces into each GuruFund so the EIP-712 domain is per-fund.",
                "exploit_scenario": "A user or guru who participates in multiple funds can reuse a signature that was issued for Fund A against Fund B, because signature verification happens only in the factory domain and the signed message does not include the target fund address. For example, a withdrawal signature for one closed WETH-only fund can be submitted to another compatible fund where the same user also holds shares, draining value from the wrong fund."
            },
            {
                "title": "Anyone can front-run and consume another user's signed payload nonce",
                "category": "auth",
                "evidence": "`FundFactory.verifySignature` is public and directly calls `_verifyEIP712`, which increments `noncesByUser[_account]++` as part of verification. There is no requirement that `msg.sender == account` or that the caller is an authorized contract entrypoint.",
                "severity": "medium",
                "locations": [
                    "contracts/FundFactory.sol:151",
                    "contracts/helpers/EIP712Helper.sol:66",
                    "contracts/helpers/EIP712Helper.sol:81",
                    "contracts/FundFactory.sol:178",
                    "contracts/GuruFund.sol:258"
                ],
                "recommendation": "Do not expose a public state-changing signature verifier. Make verification internal/private, or restrict it to trusted entrypoints. Also consider consuming the nonce only inside the final action after all authorization checks for that action are complete.",
                "exploit_scenario": "An attacker watching the mempool can copy a victim's signed payload and call `FundFactory.verifySignature(victim, payload)` first. That call succeeds and increments `noncesByUser[victim]`, causing the victim's subsequent `createFund`, `deposit`, `withdraw`, `rebalance`, or `close` transaction to revert with an invalid signature. The attacker can repeat this cheaply to censor protocol actions."
            }
        ],
        "no_findings": false
    },
    "no_findings": false,
    "schema_version": 1
}

Opcode Heuristics

tool.cast_disasm
Delegatecall
1
Selfdestruct
0
CREATE2
0
CALL-family (heavy)
46
EXT*/BALANCE
12
Total opcodes
12598
Flags
delegatecall_present heavy_ext_balance_usage call_family_heavy
View cast disassembly output
00000000: PUSH1 0x80
00000002: PUSH1 0x40
00000004: MSTORE
00000005: PUSH1 0x04
00000007: CALLDATASIZE
00000008: LT
00000009: PUSH2 0x0281
0000000c: JUMPI
0000000d: PUSH1 0x00
0000000f: CALLDATALOAD
00000010: PUSH1 0xe0
00000012: SHR
00000013: DUP1
00000014: PUSH4 0x6c8cc9d9
00000019: GT
0000001a: PUSH2 0x014f
0000001d: JUMPI
0000001e: DUP1
0000001f: PUSH4 0xa9059cbb
00000024: GT
00000025: PUSH2 0x00c1
00000028: JUMPI
00000029: DUP1
0000002a: PUSH4 0xcf35bdd0
0000002f: GT
00000030: PUSH2 0x007a
00000033: JUMPI
00000034: DUP1
00000035: PUSH4 0xcf35bdd0
0000003a: EQ
0000003b: PUSH2 0x078b
0000003e: JUMPI
0000003f: DUP1
00000040: PUSH4 0xdae2a76c
00000045: EQ
00000046: PUSH2 0x07ab
00000049: JUMPI
0000004a: DUP1
0000004b: PUSH4 0xdd62ed3e
00000050: EQ
00000051: PUSH2 0x07c1
00000054: JUMPI
00000055: DUP1
00000056: PUSH4 0xe6b4d21c
0000005b: EQ
0000005c: PUSH2 0x0826
0000005f: JUMPI
00000060: DUP1
00000061: PUSH4 0xeb3b7fd8
00000066: EQ
00000067: PUSH2 0x0839
0000006a: JUMPI
0000006b: DUP1
0000006c: PUSH4 0xf2fde38b
00000071: EQ
00000072: PUSH2 0x0859
00000075: JUMPI
00000076: PUSH1 0x00
00000078: DUP1
00000079: REVERT
0000007a: JUMPDEST
0000007b: DUP1
0000007c: PUSH4 0xa9059cbb
00000081: EQ
00000082: PUSH2 0x06e0
00000085: JUMPI
00000086: DUP1
00000087: PUSH4 0xaffed0e0
0000008c: EQ
0000008d: PUSH2 0x06fb
00000090: JUMPI
00000091: DUP1
00000092: PUSH4 0xb5adcc54
00000097: EQ
00000098: PUSH2 0x0711
0000009b: JUMPI
0000009c: DUP1
0000009d: PUSH4 0xbbc18f6f
000000a2: EQ
000000a3: PUSH2 0x073e
000000a6: JUMPI
000000a7: DUP1
000000a8: PUSH4 0xc415b95c
000000ad: EQ
000000ae: PUSH2 0x0755
000000b1: JUMPI
000000b2: DUP1
000000b3: PUSH4 0xce677235
000000b8: EQ
000000b9: PUSH2 0x0775
000000bc: JUMPI
000000bd: PUSH1 0x00
000000bf: DUP1
000000c0: REVERT
000000c1: JUMPDEST
000000c2: DUP1
000000c3: PUSH4 0x8da5cb5b
000000c8: GT
000000c9: PUSH2 0x0113
000000cc: JUMPI
000000cd: DUP1
000000ce: PUSH4 0x8da5cb5b
000000d3: EQ
000000d4: PUSH2 0x064c
000000d7: JUMPI
000000d8: DUP1
000000d9: PUSH4 0x8fcb4e5b
000000de: EQ
000000df: PUSH2 0x0661
000000e2: JUMPI
000000e3: DUP1
000000e4: PUSH4 0x906737e7
000000e9: EQ
000000ea: PUSH2 0x0681
000000ed: JUMPI
000000ee: DUP1
000000ef: PUSH4 0x95d89b41
000000f4: EQ
000000f5: PUSH2 0x0694
000000f8: JUMPI
000000f9: DUP1
000000fa: PUSH4 0x99e89a3c
000000ff: EQ
00000100: PUSH2 0x06a9
00000103: JUMPI
00000104: DUP1
00000105: PUSH4 0x9c8cebf1
0000010a: EQ
0000010b: PUSH2 0x06c0
0000010e: JUMPI
0000010f: PUSH1 0x00
00000111: DUP1
00000112: REVERT
00000113: JUMPDEST
00000114: DUP1
00000115: PUSH4 0x6c8cc9d9
0000011a: EQ
0000011b: PUSH2 0x05b7
0000011e: JUMPI
0000011f: DUP1
00000120: PUSH4 0x700f2c58
00000125: EQ
00000126: PUSH2 0x05d7
00000129: JUMPI
0000012a: DUP1
0000012b: PUSH4 0x70a08231
00000130: EQ
00000131: PUSH2 0x05f7
00000134: JUMPI
00000135: DUP1
00000136: PUSH4 0x715018a6
0000013b: EQ
0000013c: PUSH2 0x0617
0000013f: JUMPI
00000140: DUP1
00000141: PUSH4 0x8610d2a4
00000146: EQ
00000147: PUSH2 0x062c
0000014a: JUMPI
0000014b: PUSH1 0x00
0000014d: DUP1
0000014e: REVERT
0000014f: JUMPDEST
00000150: DUP1
00000151: PUSH4 0x2fa45fe8
00000156: GT
00000157: PUSH2 0x01f3
0000015a: JUMPI
0000015b: DUP1
0000015c: PUSH4 0x413f6f59
00000161: GT
00000162: PUSH2 0x01ac
00000165: JUMPI
00000166: DUP1
00000167: PUSH4 0x413f6f59
0000016c: EQ
0000016d: PUSH2 0x0511
00000170: JUMPI
00000171: DUP1
00000172: PUSH4 0x47535d7b
00000177: EQ
00000178: PUSH2 0x0531
0000017b: JUMPI
0000017c: DUP1
0000017d: PUSH4 0x5ded9321
00000182: EQ
00000183: PUSH2 0x054b
00000186: JUMPI
00000187: DUP1
00000188: PUSH4 0x6768dc32
0000018d: EQ
0000018e: PUSH2 0x0560
00000191: JUMPI
00000192: DUP1
00000193: PUSH4 0x67e4ac2c
00000198: EQ
00000199: PUSH2 0x0575
0000019c: JUMPI
0000019d: DUP1
0000019e: PUSH4 0x6a17b022
000001a3: EQ
000001a4: PUSH2 0x0597
000001a7: JUMPI
000001a8: PUSH1 0x00
000001aa: DUP1
000001ab: REVERT
000001ac: JUMPDEST
000001ad: DUP1
000001ae: PUSH4 0x2fa45fe8
000001b3: EQ
000001b4: PUSH2 0x0446
000001b7: JUMPI
000001b8: DUP1
000001b9: PUSH4 0x313ce567
000001be: EQ
000001bf: PUSH2 0x045d
000001c2: JUMPI
000001c3: DUP1
000001c4: PUSH4 0x334dcfee
000001c9: EQ
000001ca: PUSH2 0x0479
000001cd: JUMPI
000001ce: DUP1
000001cf: PUSH4 0x3ad0e5c1
000001d4: EQ
000001d5: PUSH2 0x048f
000001d8: JUMPI
000001d9: DUP1
000001da: PUSH4 0x3dea9e66
000001df: EQ
000001e0: PUSH2 0x04a5
000001e3: JUMPI
000001e4: DUP1
000001e5: PUSH4 0x3fc8cef3
000001ea: EQ
000001eb: PUSH2 0x04f1
000001ee: JUMPI
000001ef: PUSH1 0x00
000001f1: DUP1
000001f2: REVERT
000001f3: JUMPDEST
000001f4: DUP1
000001f5: PUSH4 0x23b872dd
000001fa: GT
000001fb: PUSH2 0x0245
000001fe: JUMPI
000001ff: DUP1
00000200: PUSH4 0x23b872dd
00000205: EQ
00000206: PUSH2 0x0375
00000209: JUMPI
0000020a: DUP1
0000020b: PUSH4 0x25c1a4dd
00000210: EQ
00000211: PUSH2 0x0395
00000214: JUMPI
00000215: DUP1
00000216: PUSH4 0x25d998bb
0000021b: EQ
0000021c: PUSH2 0x03b5
0000021f: JUMPI
00000220: DUP1
00000221: PUSH4 0x2cd522fc
00000226: EQ
00000227: PUSH2 0x03d5
0000022a: JUMPI
0000022b: DUP1
0000022c: PUSH4 0x2dd19bed
00000231: EQ
00000232: PUSH2 0x03eb
00000235: JUMPI
00000236: DUP1
00000237: PUSH4 0x2f206068
0000023c: EQ
0000023d: PUSH2 0x040b
00000240: JUMPI
00000241: PUSH1 0x00
00000243: DUP1
00000244: REVERT
00000245: JUMPDEST
00000246: DUP1
00000247: PUSH4 0x06fdde03
0000024c: EQ
0000024d: PUSH2 0x028d
00000250: JUMPI
00000251: DUP1
00000252: PUSH4 0x095ea7b3
00000257: EQ
00000258: PUSH2 0x02b8
0000025b: JUMPI
0000025c: DUP1
0000025d: PUSH4 0x0af3af0a
00000262: EQ
00000263: PUSH2 0x02e8
00000266: JUMPI
00000267: DUP1
00000268: PUSH4 0x18160ddd
0000026d: EQ
0000026e: PUSH2 0x030a
00000271: JUMPI
00000272: DUP1
00000273: PUSH4 0x1efc751b
00000278: EQ
00000279: PUSH2 0x0348
0000027c: JUMPI
0000027d: PUSH1 0x00
0000027f: DUP1
00000280: REVERT
00000281: JUMPDEST
00000282: CALLDATASIZE
00000283: PUSH2 0x0288
00000286: JUMPI
00000287: STOP
00000288: JUMPDEST
00000289: PUSH1 0x00
0000028b: DUP1
0000028c: REVERT
0000028d: JUMPDEST
0000028e: CALLVALUE
0000028f: DUP1
00000290: ISZERO
00000291: PUSH2 0x0299
00000294: JUMPI
00000295: PUSH1 0x00
00000297: DUP1
00000298: REVERT
00000299: JUMPDEST
0000029a: POP
0000029b: PUSH2 0x02a2
0000029e: PUSH2 0x0879
000002a1: JUMP
000002a2: JUMPDEST
000002a3: PUSH1 0x40
000002a5: MLOAD
000002a6: PUSH2 0x02af
000002a9: SWAP2
000002aa: SWAP1
000002ab: PUSH2 0x3dbc
000002ae: JUMP
000002af: JUMPDEST
000002b0: PUSH1 0x40
000002b2: MLOAD
000002b3: DUP1
000002b4: SWAP2
000002b5: SUB
000002b6: SWAP1
000002b7: RETURN
000002b8: JUMPDEST
000002b9: CALLVALUE
000002ba: DUP1
000002bb: ISZERO
000002bc: PUSH2 0x02c4
000002bf: JUMPI
000002c0: PUSH1 0x00
000002c2: DUP1
000002c3: REVERT
000002c4: JUMPDEST
000002c5: POP
000002c6: PUSH2 0x02d8
000002c9: PUSH2 0x02d3
000002cc: CALLDATASIZE
000002cd: PUSH1 0x04
000002cf: PUSH2 0x3e0f
000002d2: JUMP
000002d3: JUMPDEST
000002d4: PUSH2 0x093c
000002d7: JUMP
000002d8: JUMPDEST
000002d9: PUSH1 0x40
000002db: MLOAD
000002dc: SWAP1
000002dd: ISZERO
000002de: ISZERO
000002df: DUP2
000002e0: MSTORE
000002e1: PUSH1 0x20
000002e3: ADD
000002e4: PUSH2 0x02af
000002e7: JUMP
000002e8: JUMPDEST
000002e9: CALLVALUE
000002ea: DUP1
000002eb: ISZERO
000002ec: PUSH2 0x02f4
000002ef: JUMPI
000002f0: PUSH1 0x00
000002f2: DUP1
000002f3: REVERT
000002f4: JUMPDEST
000002f5: POP
000002f6: PUSH2 0x0308
000002f9: PUSH2 0x0303
000002fc: CALLDATASIZE
000002fd: PUSH1 0x04
000002ff: PUSH2 0x3e3b
00000302: JUMP
00000303: JUMPDEST
00000304: PUSH2 0x0956
00000307: JUMP
00000308: JUMPDEST
00000309: STOP
0000030a: JUMPDEST
0000030b: CALLVALUE
0000030c: DUP1
0000030d: ISZERO
0000030e: PUSH2 0x0316
00000311: JUMPI
00000312: PUSH1 0x00
00000314: DUP1
00000315: REVERT
00000316: JUMPDEST
00000317: POP
00000318: PUSH32 0x52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace02
00000339: SLOAD
0000033a: JUMPDEST
0000033b: PUSH1 0x40
0000033d: MLOAD
0000033e: SWAP1
0000033f: DUP2
00000340: MSTORE
00000341: PUSH1 0x20
00000343: ADD
00000344: PUSH2 0x02af
00000347: JUMP
00000348: JUMPDEST
00000349: CALLVALUE
0000034a: DUP1
0000034b: ISZERO
0000034c: PUSH2 0x0354
0000034f: JUMPI
00000350: PUSH1 0x00
00000352: DUP1
00000353: REVERT
00000354: JUMPDEST
00000355: POP
00000356: PUSH2 0x033a
00000359: PUSH2 0x0363
0000035c: CALLDATASIZE
0000035d: PUSH1 0x04
0000035f: PUSH2 0x3e54
00000362: JUMP
00000363: JUMPDEST
00000364: PUSH1 0x11
00000366: PUSH1 0x20
00000368: MSTORE
00000369: PUSH1 0x00
0000036b: SWAP1
0000036c: DUP2
0000036d: MSTORE
0000036e: PUSH1 0x40
00000370: SWAP1
00000371: KECCAK256
00000372: SLOAD
00000373: DUP2
00000374: JUMP
00000375: JUMPDEST
00000376: CALLVALUE
00000377: DUP1
00000378: ISZERO
00000379: PUSH2 0x0381
0000037c: JUMPI
0000037d: PUSH1 0x00
0000037f: DUP1
00000380: REVERT
00000381: JUMPDEST
00000382: POP
00000383: PUSH2 0x02d8
00000386: PUSH2 0x0390
00000389: CALLDATASIZE
0000038a: PUSH1 0x04
0000038c: PUSH2 0x3e78
0000038f: JUMP
00000390: JUMPDEST
00000391: PUSH2 0x0a51
00000394: JUMP
00000395: JUMPDEST
00000396: CALLVALUE
00000397: DUP1
00000398: ISZERO
00000399: PUSH2 0x03a1
0000039c: JUMPI
0000039d: PUSH1 0x00
0000039f: DUP1
000003a0: REVERT
000003a1: JUMPDEST
000003a2: POP
000003a3: PUSH2 0x0308
000003a6: PUSH2 0x03b0
000003a9: CALLDATASIZE
000003aa: PUSH1 0x04
000003ac: PUSH2 0x3eb9
000003af: JUMP
000003b0: JUMPDEST
000003b1: PUSH2 0x0a6b
000003b4: JUMP
000003b5: JUMPDEST
000003b6: CALLVALUE
000003b7: DUP1
000003b8: ISZERO
000003b9: PUSH2 0x03c1
000003bc: JUMPI
000003bd: PUSH1 0x00
000003bf: DUP1
000003c0: REVERT
000003c1: JUMPDEST
000003c2: POP
000003c3: PUSH2 0x033a
000003c6: PUSH2 0x03d0
000003c9: CALLDATASIZE
000003ca: PUSH1 0x04
000003cc: PUSH2 0x3e54
000003cf: JUMP
000003d0: JUMPDEST
000003d1: PUSH2 0x0cf4
000003d4: JUMP
000003d5: JUMPDEST
000003d6: CALLVALUE
000003d7: DUP1
000003d8: ISZERO
000003d9: PUSH2 0x03e1
000003dc: JUMPI
000003dd: PUSH1 0x00
000003df: DUP1
000003e0: REVERT
000003e1: JUMPDEST
000003e2: POP
000003e3: PUSH2 0x033a
000003e6: PUSH1 0x0f
000003e8: SLOAD
000003e9: DUP2
000003ea: JUMP
000003eb: JUMPDEST
000003ec: CALLVALUE
000003ed: DUP1
000003ee: ISZERO
000003ef: PUSH2 0x03f7
000003f2: JUMPI
000003f3: PUSH1 0x00
000003f5: DUP1
000003f6: REVERT
000003f7: JUMPDEST
000003f8: POP
000003f9: PUSH2 0x0308
000003fc: PUSH2 0x0406
000003ff: CALLDATASIZE
00000400: PUSH1 0x04
00000402: PUSH2 0x3e3b
00000405: JUMP
00000406: JUMPDEST
00000407: PUSH2 0x0d4b
0000040a: JUMP
0000040b: JUMPDEST
0000040c: CALLVALUE
0000040d: DUP1
0000040e: ISZERO
0000040f: PUSH2 0x0417
00000412: JUMPI
00000413: PUSH1 0x00
00000415: DUP1
00000416: REVERT
00000417: JUMPDEST
00000418: POP
00000419: PUSH2 0x02d8
0000041c: PUSH2 0x0426
0000041f: CALLDATASIZE
00000420: PUSH1 0x04
00000422: PUSH2 0x3e54
00000425: JUMP
00000426: JUMPDEST
00000427: PUSH1 0x01
00000429: PUSH1 0x01
0000042b: PUSH1 0xa0
0000042d: SHL
0000042e: SUB
0000042f: AND
00000430: PUSH1 0x00
00000432: SWAP1
00000433: DUP2
00000434: MSTORE
00000435: PUSH1 0x12
00000437: PUSH1 0x20
00000439: MSTORE
0000043a: PUSH1 0x40
0000043c: SWAP1
0000043d: KECCAK256
0000043e: PUSH1 0x01
00000440: ADD
00000441: SLOAD
00000442: ISZERO
00000443: ISZERO
00000444: SWAP1
00000445: JUMP
00000446: JUMPDEST
00000447: CALLVALUE
00000448: DUP1
00000449: ISZERO
0000044a: PUSH2 0x0452
0000044d: JUMPI
0000044e: PUSH1 0x00
00000450: DUP1
00000451: REVERT
00000452: JUMPDEST
00000453: POP
00000454: PUSH2 0x033a
00000457: PUSH3 0x76a700
0000045b: DUP2
0000045c: JUMP
0000045d: JUMPDEST
0000045e: CALLVALUE
0000045f: DUP1
00000460: ISZERO
00000461: PUSH2 0x0469
00000464: JUMPI
00000465: PUSH1 0x00
00000467: DUP1
00000468: REVERT
00000469: JUMPDEST
0000046a: POP
0000046b: PUSH1 0x40
0000046d: MLOAD
0000046e: PUSH1 0x06
00000470: DUP2
00000471: MSTORE
00000472: PUSH1 0x20
00000474: ADD
00000475: PUSH2 0x02af
00000478: JUMP
00000479: JUMPDEST
0000047a: CALLVALUE
0000047b: DUP1
0000047c: ISZERO
0000047d: PUSH2 0x0485
00000480: JUMPI
00000481: PUSH1 0x00
00000483: DUP1
00000484: REVERT
00000485: JUMPDEST
00000486: POP
00000487: PUSH2 0x033a
0000048a: PUSH1 0x0e
0000048c: SLOAD
0000048d: DUP2
0000048e: JUMP
0000048f: JUMPDEST
00000490: CALLVALUE
00000491: DUP1
00000492: ISZERO
00000493: PUSH2 0x049b
00000496: JUMPI
00000497: PUSH1 0x00
00000499: DUP1
0000049a: REVERT
0000049b: JUMPDEST
0000049c: POP
0000049d: PUSH2 0x033a
000004a0: PUSH1 0x0d
000004a2: SLOAD
000004a3: DUP2
000004a4: JUMP
000004a5: JUMPDEST
000004a6: CALLVALUE
000004a7: DUP1
000004a8: ISZERO
000004a9: PUSH2 0x04b1
000004ac: JUMPI
000004ad: PUSH1 0x00
000004af: DUP1
000004b0: REVERT
000004b1: JUMPDEST
000004b2: POP
000004b3: PUSH2 0x04d9
000004b6: PUSH32 0x000000000000000000000000d0f4de81e0b6e9d8018f2b8bf7f05da0edbc963f
000004d7: DUP2
000004d8: JUMP
000004d9: JUMPDEST
000004da: PUSH1 0x40
000004dc: MLOAD
000004dd: PUSH1 0x01
000004df: PUSH1 0x01
000004e1: PUSH1 0xa0
000004e3: SHL
000004e4: SUB
000004e5: SWAP1
000004e6: SWAP2
000004e7: AND
000004e8: DUP2
000004e9: MSTORE
000004ea: PUSH1 0x20
000004ec: ADD
000004ed: PUSH2 0x02af
000004f0: JUMP
000004f1: JUMPDEST
000004f2: CALLVALUE
000004f3: DUP1
000004f4: ISZERO
000004f5: PUSH2 0x04fd
000004f8: JUMPI
000004f9: PUSH1 0x00
000004fb: DUP1
000004fc: REVERT
000004fd: JUMPDEST
000004fe: POP
000004ff: PUSH1 0x00
00000501: SLOAD
00000502: PUSH2 0x04d9
00000505: SWAP1
00000506: PUSH1 0x01
00000508: PUSH1 0x01
0000050a: PUSH1 0xa0
0000050c: SHL
0000050d: SUB
0000050e: AND
0000050f: DUP2
00000510: JUMP
00000511: JUMPDEST
00000512: CALLVALUE
00000513: DUP1
00000514: ISZERO
00000515: PUSH2 0x051d
00000518: JUMPI
00000519: PUSH1 0x00
0000051b: DUP1
0000051c: REVERT
0000051d: JUMPDEST
0000051e: POP
0000051f: PUSH2 0x0308
00000522: PUSH2 0x052c
00000525: CALLDATASIZE
00000526: PUSH1 0x04
00000528: PUSH2 0x3e3b
0000052b: JUMP
0000052c: JUMPDEST
0000052d: PUSH2 0x0dd4
00000530: JUMP
00000531: JUMPDEST
00000532: CALLVALUE
00000533: DUP1
00000534: ISZERO
00000535: PUSH2 0x053d
00000538: JUMPI
00000539: PUSH1 0x00
0000053b: DUP1
0000053c: REVERT
0000053d: JUMPDEST
0000053e: POP
0000053f: PUSH1 0x03
00000541: SLOAD
00000542: PUSH2 0x02d8
00000545: SWAP1
00000546: PUSH1 0xff
00000548: AND
00000549: DUP2
0000054a: JUMP
0000054b: JUMPDEST
0000054c: CALLVALUE
0000054d: DUP1
0000054e: ISZERO
0000054f: PUSH2 0x0557
00000552: JUMPI
00000553: PUSH1 0x00
00000555: DUP1
00000556: REVERT
00000557: JUMPDEST
00000558: POP
00000559: PUSH2 0x0308
0000055c: PUSH2 0x0e34
0000055f: JUMP
00000560: JUMPDEST
00000561: CALLVALUE
00000562: DUP1
00000563: ISZERO
00000564: PUSH2 0x056c
00000567: JUMPI
00000568: PUSH1 0x00
0000056a: DUP1
0000056b: REVERT
0000056c: JUMPDEST
0000056d: POP
0000056e: PUSH2 0x0308
00000571: PUSH2 0x10d1
00000574: JUMP
00000575: JUMPDEST
00000576: CALLVALUE
00000577: DUP1
00000578: ISZERO
00000579: PUSH2 0x0581
0000057c: JUMPI
0000057d: PUSH1 0x00
0000057f: DUP1
00000580: REVERT
00000581: JUMPDEST
00000582: POP
00000583: PUSH2 0x058a
00000586: PUSH2 0x1349
00000589: JUMP
0000058a: JUMPDEST
0000058b: PUSH1 0x40
0000058d: MLOAD
0000058e: PUSH2 0x02af
00000591: SWAP2
00000592: SWAP1
00000593: PUSH2 0x3ef3
00000596: JUMP
00000597: JUMPDEST
00000598: CALLVALUE
00000599: DUP1
0000059a: ISZERO
0000059b: PUSH2 0x05a3
0000059e: JUMPI
0000059f: PUSH1 0x00
000005a1: DUP1
000005a2: REVERT
000005a3: JUMPDEST
000005a4: POP
000005a5: PUSH2 0x0308
000005a8: PUSH2 0x05b2
000005ab: CALLDATASIZE
000005ac: PUSH1 0x04
000005ae: PUSH2 0x3eb9
000005b1: JUMP
000005b2: JUMPDEST
000005b3: PUSH2 0x1434
000005b6: JUMP
000005b7: JUMPDEST
000005b8: CALLVALUE
000005b9: DUP1
000005ba: ISZERO
000005bb: PUSH2 0x05c3
000005be: JUMPI
000005bf: PUSH1 0x00
000005c1: DUP1
000005c2: REVERT
000005c3: JUMPDEST
000005c4: POP
000005c5: PUSH2 0x0308
000005c8: PUSH2 0x05d2
000005cb: CALLDATASIZE
000005cc: PUSH1 0x04
000005ce: PUSH2 0x3e54
000005d1: JUMP
000005d2: JUMPDEST
000005d3: PUSH2 0x1678
000005d6: JUMP
000005d7: JUMPDEST
000005d8: CALLVALUE
000005d9: DUP1
000005da: ISZERO
000005db: PUSH2 0x05e3
000005de: JUMPI
000005df: PUSH1 0x00
000005e1: DUP1
000005e2: REVERT
000005e3: JUMPDEST
000005e4: POP
000005e5: PUSH2 0x0308
000005e8: PUSH2 0x05f2
000005eb: CALLDATASIZE
000005ec: PUSH1 0x04
000005ee: PUSH2 0x3eb9
000005f1: JUMP
000005f2: JUMPDEST
000005f3: PUSH2 0x1747
000005f6: JUMP
000005f7: JUMPDEST
000005f8: CALLVALUE
000005f9: DUP1
000005fa: ISZERO
000005fb: PUSH2 0x0603
000005fe: JUMPI
000005ff: PUSH1 0x00
00000601: DUP1
00000602: REVERT
00000603: JUMPDEST
00000604: POP
00000605: PUSH2 0x033a
00000608: PUSH2 0x0612
0000060b: CALLDATASIZE
0000060c: PUSH1 0x04
0000060e: PUSH2 0x3e54
00000611: JUMP
00000612: JUMPDEST
00000613: PUSH2 0x1881
00000616: JUMP
00000617: JUMPDEST
00000618: CALLVALUE
00000619: DUP1
0000061a: ISZERO
0000061b: PUSH2 0x0623
0000061e: JUMPI
0000061f: PUSH1 0x00
00000621: DUP1
00000622: REVERT
00000623: JUMPDEST
00000624: POP
00000625: PUSH2 0x0308
00000628: PUSH2 0x18a9
0000062b: JUMP
0000062c: JUMPDEST
0000062d: CALLVALUE
0000062e: DUP1
0000062f: ISZERO
00000630: PUSH2 0x0638
00000633: JUMPI
00000634: PUSH1 0x00
00000636: DUP1
00000637: REVERT
00000638: JUMPDEST
00000639: POP
0000063a: PUSH2 0x0308
0000063d: PUSH2 0x0647
00000640: CALLDATASIZE
00000641: PUSH1 0x04
00000643: PUSH2 0x3eb9
00000646: JUMP
00000647: JUMPDEST
00000648: PUSH2 0x18c1
0000064b: JUMP
0000064c: JUMPDEST
0000064d: CALLVALUE
0000064e: DUP1
0000064f: ISZERO
00000650: PUSH2 0x0658
00000653: JUMPI
00000654: PUSH1 0x00
00000656: DUP1
00000657: REVERT
00000658: JUMPDEST
00000659: POP
0000065a: PUSH2 0x04d9
0000065d: PUSH2 0x1a99
00000660: JUMP
00000661: JUMPDEST
00000662: CALLVALUE
00000663: DUP1
00000664: ISZERO
00000665: PUSH2 0x066d
00000668: JUMPI
00000669: PUSH1 0x00
0000066b: DUP1
0000066c: REVERT
0000066d: JUMPDEST
0000066e: POP
0000066f: PUSH2 0x02d8
00000672: PUSH2 0x067c
00000675: CALLDATASIZE
00000676: PUSH1 0x04
00000678: PUSH2 0x3e0f
0000067b: JUMP
0000067c: JUMPDEST
0000067d: PUSH2 0x1ac7
00000680: JUMP
00000681: JUMPDEST
00000682: PUSH2 0x0308
00000685: PUSH2 0x068f
00000688: CALLDATASIZE
00000689: PUSH1 0x04
0000068b: PUSH2 0x3f76
0000068e: JUMP
0000068f: JUMPDEST
00000690: PUSH2 0x1b72
00000693: JUMP
00000694: JUMPDEST
00000695: CALLVALUE
00000696: DUP1
00000697: ISZERO
00000698: PUSH2 0x06a0
0000069b: JUMPI
0000069c: PUSH1 0x00
0000069e: DUP1
0000069f: REVERT
000006a0: JUMPDEST
000006a1: POP
000006a2: PUSH2 0x02a2
000006a5: PUSH2 0x2090
000006a8: JUMP
000006a9: JUMPDEST
000006aa: CALLVALUE
000006ab: DUP1
000006ac: ISZERO
000006ad: PUSH2 0x06b5
000006b0: JUMPI
000006b1: PUSH1 0x00
000006b3: DUP1
000006b4: REVERT
000006b5: JUMPDEST
000006b6: POP
000006b7: PUSH2 0x033a
000006ba: PUSH3 0x278d00
000006be: DUP2
000006bf: JUMP
000006c0: JUMPDEST
000006c1: CALLVALUE
000006c2: DUP1
000006c3: ISZERO
000006c4: PUSH2 0x06cc
000006c7: JUMPI
000006c8: PUSH1 0x00
000006ca: DUP1
000006cb: REVERT
000006cc: JUMPDEST
000006cd: POP
000006ce: PUSH2 0x0308
000006d1: PUSH2 0x06db
000006d4: CALLDATASIZE
000006d5: PUSH1 0x04
000006d7: PUSH2 0x3eb9
000006da: JUMP
000006db: JUMPDEST
000006dc: PUSH2 0x20cf
000006df: JUMP
000006e0: JUMPDEST
000006e1: CALLVALUE
000006e2: DUP1
000006e3: ISZERO
000006e4: PUSH2 0x06ec
000006e7: JUMPI
000006e8: PUSH1 0x00
000006ea: DUP1
000006eb: REVERT
000006ec: JUMPDEST
000006ed: POP
000006ee: PUSH2 0x02d8
000006f1: PUSH2 0x0390
000006f4: CALLDATASIZE
000006f5: PUSH1 0x04
000006f7: PUSH2 0x3e0f
000006fa: JUMP
000006fb: JUMPDEST
000006fc: CALLVALUE
000006fd: DUP1
000006fe: ISZERO
000006ff: PUSH2 0x0707
00000702: JUMPI
00000703: PUSH1 0x00
00000705: DUP1
00000706: REVERT
00000707: JUMPDEST
00000708: POP
00000709: PUSH2 0x033a
0000070c: PUSH1 0x0c
0000070e: SLOAD
0000070f: DUP2
00000710: JUMP
00000711: JUMPDEST
00000712: CALLVALUE
00000713: DUP1
00000714: ISZERO
00000715: PUSH2 0x071d
00000718: JUMPI
00000719: PUSH1 0x00
0000071b: DUP1
0000071c: REVERT
0000071d: JUMPDEST
0000071e: POP
0000071f: PUSH2 0x0731
00000722: PUSH2 0x072c
00000725: CALLDATASIZE
00000726: PUSH1 0x04
00000728: PUSH2 0x3e54
0000072b: JUMP
0000072c: JUMPDEST
0000072d: PUSH2 0x2360
00000730: JUMP
00000731: JUMPDEST
00000732: PUSH1 0x40
00000734: MLOAD
00000735: PUSH2 0x02af
00000738: SWAP2
00000739: SWAP1
0000073a: PUSH2 0x4018
0000073d: JUMP
0000073e: JUMPDEST
0000073f: CALLVALUE
00000740: DUP1
00000741: ISZERO
00000742: PUSH2 0x074a
00000745: JUMPI
00000746: PUSH1 0x00
00000748: DUP1
00000749: REVERT
0000074a: JUMPDEST
0000074b: POP
0000074c: PUSH2 0x033a
0000074f: PUSH3 0xed4e00
00000753: DUP2
00000754: JUMP
00000755: JUMPDEST
00000756: CALLVALUE
00000757: DUP1
00000758: ISZERO
00000759: PUSH2 0x0761
0000075c: JUMPI
0000075d: PUSH1 0x00
0000075f: DUP1
00000760: REVERT
00000761: JUMPDEST
00000762: POP
00000763: PUSH1 0x01
00000765: SLOAD
00000766: PUSH2 0x04d9
00000769: SWAP1
0000076a: PUSH1 0x01
0000076c: PUSH1 0x01
0000076e: PUSH1 0xa0
00000770: SHL
00000771: SUB
00000772: AND
00000773: DUP2
00000774: JUMP
00000775: JUMPDEST
00000776: CALLVALUE
00000777: DUP1
00000778: ISZERO
00000779: PUSH2 0x0781
0000077c: JUMPI
0000077d: PUSH1 0x00
0000077f: DUP1
00000780: REVERT
00000781: JUMPDEST
00000782: POP
00000783: PUSH2 0x033a
00000786: PUSH2 0x0257
00000789: DUP2
0000078a: JUMP
0000078b: JUMPDEST
0000078c: CALLVALUE
0000078d: DUP1
0000078e: ISZERO
0000078f: PUSH2 0x0797
00000792: JUMPI
00000793: PUSH1 0x00
00000795: DUP1
00000796: REVERT
00000797: JUMPDEST
00000798: POP
00000799: PUSH2 0x04d9
0000079c: PUSH2 0x07a6
0000079f: CALLDATASIZE
000007a0: PUSH1 0x04
000007a2: PUSH2 0x3e3b
000007a5: JUMP
000007a6: JUMPDEST
000007a7: PUSH2 0x2414
000007aa: JUMP
000007ab: JUMPDEST
000007ac: CALLVALUE
000007ad: DUP1
000007ae: ISZERO
000007af: PUSH2 0x07b7
000007b2: JUMPI
000007b3: PUSH1 0x00
000007b5: DUP1
000007b6: REVERT
000007b7: JUMPDEST
000007b8: POP
000007b9: PUSH2 0x033a
000007bc: PUSH1 0x10
000007be: SLOAD
000007bf: DUP2
000007c0: JUMP
000007c1: JUMPDEST
000007c2: CALLVALUE
000007c3: DUP1
000007c4: ISZERO
000007c5: PUSH2 0x07cd
000007c8: JUMPI
000007c9: PUSH1 0x00
000007cb: DUP1
000007cc: REVERT
000007cd: JUMPDEST
000007ce: POP
000007cf: PUSH2 0x033a
000007d2: PUSH2 0x07dc
000007d5: CALLDATASIZE
000007d6: PUSH1 0x04
000007d8: PUSH2 0x4080
000007db: JUMP
000007dc: JUMPDEST
000007dd: PUSH1 0x01
000007df: PUSH1 0x01
000007e1: PUSH1 0xa0
000007e3: SHL
000007e4: SUB
000007e5: SWAP2
000007e6: DUP3
000007e7: AND
000007e8: PUSH1 0x00
000007ea: SWAP1
000007eb: DUP2
000007ec: MSTORE
000007ed: PUSH32 0x52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace01
0000080e: PUSH1 0x20
00000810: SWAP1
00000811: DUP2
00000812: MSTORE
00000813: PUSH1 0x40
00000815: DUP1
00000816: DUP4
00000817: KECCAK256
00000818: SWAP4
00000819: SWAP1
0000081a: SWAP5
0000081b: AND
0000081c: DUP3
0000081d: MSTORE
0000081e: SWAP2
0000081f: SWAP1
00000820: SWAP2
00000821: MSTORE
00000822: KECCAK256
00000823: SLOAD
00000824: SWAP1
00000825: JUMP
00000826: JUMPDEST
00000827: PUSH2 0x0308
0000082a: PUSH2 0x0834
0000082d: CALLDATASIZE
0000082e: PUSH1 0x04
00000830: PUSH2 0x3eb9
00000833: JUMP
00000834: JUMPDEST
00000835: PUSH2 0x2434
00000838: JUMP
00000839: JUMPDEST
0000083a: CALLVALUE
0000083b: DUP1
0000083c: ISZERO
0000083d: PUSH2 0x0845
00000840: JUMPI
00000841: PUSH1 0x00
00000843: DUP1
00000844: REVERT
00000845: JUMPDEST
00000846: POP
00000847: PUSH2 0x0308
0000084a: PUSH2 0x0854
0000084d: CALLDATASIZE
0000084e: PUSH1 0x04
00000850: PUSH2 0x3eb9
00000853: JUMP
00000854: JUMPDEST
00000855: PUSH2 0x2a17
00000858: JUMP
00000859: JUMPDEST
0000085a: CALLVALUE
0000085b: DUP1
0000085c: ISZERO
0000085d: PUSH2 0x0865
00000860: JUMPI
00000861: PUSH1 0x00
00000863: DUP1
00000864: REVERT
00000865: JUMPDEST
00000866: POP
00000867: PUSH2 0x0308
0000086a: PUSH2 0x0874
0000086d: CALLDATASIZE
0000086e: PUSH1 0x04
00000870: PUSH2 0x3e54
00000873: JUMP
00000874: JUMPDEST
00000875: PUSH2 0x2b99
00000878: JUMP
00000879: JUMPDEST
0000087a: PUSH32 0x52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace03
0000089b: DUP1
0000089c: SLOAD
0000089d: PUSH1 0x60
0000089f: SWAP2
000008a0: PUSH1 0x00
000008a2: DUP1
000008a3: MLOAD
000008a4: PUSH1 0x20
000008a6: PUSH2 0x4d10
000008a9: DUP4
000008aa: CODECOPY
000008ab: DUP2
000008ac: MLOAD
000008ad: SWAP2
000008ae: MSTORE
000008af: SWAP2
000008b0: PUSH2 0x08b8
000008b3: SWAP1
000008b4: PUSH2 0x40b9
000008b7: JUMP
000008b8: JUMPDEST
000008b9: DUP1
000008ba: PUSH1 0x1f
000008bc: ADD
000008bd: PUSH1 0x20
000008bf: DUP1
000008c0: SWAP2
000008c1: DIV
000008c2: MUL
000008c3: PUSH1 0x20
000008c5: ADD
000008c6: PUSH1 0x40
000008c8: MLOAD
000008c9: SWAP1
000008ca: DUP2
000008cb: ADD
000008cc: PUSH1 0x40
000008ce: MSTORE
000008cf: DUP1
000008d0: SWAP3
000008d1: SWAP2
000008d2: SWAP1
000008d3: DUP2
000008d4: DUP2
000008d5: MSTORE
000008d6: PUSH1 0x20
000008d8: ADD
000008d9: DUP3
000008da: DUP1
000008db: SLOAD
000008dc: PUSH2 0x08e4
000008df: SWAP1
000008e0: PUSH2 0x40b9
000008e3: JUMP
000008e4: JUMPDEST
000008e5: DUP1
000008e6: ISZERO
000008e7: PUSH2 0x0931
000008ea: JUMPI
000008eb: DUP1
000008ec: PUSH1 0x1f
000008ee: LT
000008ef: PUSH2 0x0906
000008f2: JUMPI
000008f3: PUSH2 0x0100
000008f6: DUP1
000008f7: DUP4
000008f8: SLOAD
000008f9: DIV
000008fa: MUL
000008fb: DUP4
000008fc: MSTORE
000008fd: SWAP2
000008fe: PUSH1 0x20
00000900: ADD
00000901: SWAP2
00000902: PUSH2 0x0931
00000905: JUMP
00000906: JUMPDEST
00000907: DUP3
00000908: ADD
00000909: SWAP2
0000090a: SWAP1
0000090b: PUSH1 0x00
0000090d: MSTORE
0000090e: PUSH1 0x20
00000910: PUSH1 0x00
00000912: KECCAK256
00000913: SWAP1
00000914: JUMPDEST
00000915: DUP2
00000916: SLOAD
00000917: DUP2
00000918: MSTORE
00000919: SWAP1
0000091a: PUSH1 0x01
0000091c: ADD
0000091d: SWAP1
0000091e: PUSH1 0x20
00000920: ADD
00000921: DUP1
00000922: DUP4
00000923: GT
00000924: PUSH2 0x0914
00000927: JUMPI
00000928: DUP3
00000929: SWAP1
0000092a: SUB
0000092b: PUSH1 0x1f
0000092d: AND
0000092e: DUP3
0000092f: ADD
00000930: SWAP2
00000931: JUMPDEST
00000932: POP
00000933: POP
00000934: POP
00000935: POP
00000936: POP
00000937: SWAP2
00000938: POP
00000939: POP
0000093a: SWAP1
0000093b: JUMP
0000093c: JUMPDEST
0000093d: PUSH1 0x00
0000093f: CALLER
00000940: PUSH2 0x094a
00000943: DUP2
00000944: DUP6
00000945: DUP6
00000946: PUSH2 0x2bf5
00000949: JUMP
0000094a: JUMPDEST
0000094b: PUSH1 0x01
0000094d: SWAP2
0000094e: POP
0000094f: POP
00000950: JUMPDEST
00000951: SWAP3
00000952: SWAP2
00000953: POP
00000954: POP
00000955: JUMP
00000956: JUMPDEST
00000957: PUSH32 0x000000000000000000000000d0f4de81e0b6e9d8018f2b8bf7f05da0edbc963f
00000978: PUSH1 0x01
0000097a: PUSH1 0x01
0000097c: PUSH1 0xa0
0000097e: SHL
0000097f: SUB
00000980: AND
00000981: PUSH4 0x8da5cb5b
00000986: PUSH1 0x40
00000988: MLOAD
00000989: DUP2
0000098a: PUSH4 0xffffffff
0000098f: AND
00000990: PUSH1 0xe0
00000992: SHL
00000993: DUP2
00000994: MSTORE
00000995: PUSH1 0x04
00000997: ADD
00000998: PUSH1 0x20
0000099a: PUSH1 0x40
0000099c: MLOAD
0000099d: DUP1
0000099e: DUP4
0000099f: SUB
000009a0: DUP2
000009a1: DUP7
000009a2: GAS
000009a3: STATICCALL
000009a4: ISZERO
000009a5: DUP1
000009a6: ISZERO
000009a7: PUSH2 0x09b4
000009aa: JUMPI
000009ab: RETURNDATASIZE
000009ac: PUSH1 0x00
000009ae: DUP1
000009af: RETURNDATACOPY
000009b0: RETURNDATASIZE
000009b1: PUSH1 0x00
000009b3: REVERT
000009b4: JUMPDEST
000009b5: POP
000009b6: POP
000009b7: POP
000009b8: POP
000009b9: PUSH1 0x40
000009bb: MLOAD
000009bc: RETURNDATASIZE
000009bd: PUSH1 0x1f
000009bf: NOT
000009c0: PUSH1 0x1f
000009c2: DUP3
000009c3: ADD
000009c4: AND
000009c5: DUP3
000009c6: ADD
000009c7: DUP1
000009c8: PUSH1 0x40
000009ca: MSTORE
000009cb: POP
000009cc: DUP2
000009cd: ADD
000009ce: SWAP1
000009cf: PUSH2 0x09d8
000009d2: SWAP2
000009d3: SWAP1
000009d4: PUSH2 0x40f3
000009d7: JUMP
000009d8: JUMPDEST
000009d9: PUSH1 0x01
000009db: PUSH1 0x01
000009dd: PUSH1 0xa0
000009df: SHL
000009e0: SUB
000009e1: AND
000009e2: CALLER
000009e3: PUSH1 0x01
000009e5: PUSH1 0x01
000009e7: PUSH1 0xa0
000009e9: SHL
000009ea: SUB
000009eb: AND
000009ec: EQ
000009ed: DUP1
000009ee: ISZERO
000009ef: PUSH2 0x09f9
000009f2: JUMPI
000009f3: POP
000009f4: PUSH1 0x10
000009f6: SLOAD
000009f7: DUP2
000009f8: GT
000009f9: JUMPDEST
000009fa: PUSH2 0x0a15
000009fd: JUMPI
000009fe: PUSH1 0x40
00000a00: MLOAD
00000a01: PUSH3 0x82b429
00000a05: PUSH1 0xe8
00000a07: SHL
00000a08: DUP2
00000a09: MSTORE
00000a0a: PUSH1 0x04
00000a0c: ADD
00000a0d: PUSH1 0x40
00000a0f: MLOAD
00000a10: DUP1
00000a11: SWAP2
00000a12: SUB
00000a13: SWAP1
00000a14: REVERT
00000a15: JUMPDEST
00000a16: PUSH1 0x10
00000a18: DUP2
00000a19: SWAP1
00000a1a: SSTORE
00000a1b: PUSH1 0x40
00000a1d: MLOAD
00000a1e: DUP2
00000a1f: DUP2
00000a20: MSTORE
00000a21: PUSH32 0x9811c28c9a13f1919200fd56ce5e849d33a25e9e693b76292ad3df46937c9aed
00000a42: SWAP1
00000a43: PUSH1 0x20
00000a45: ADD
00000a46: JUMPDEST
00000a47: PUSH1 0x40
00000a49: MLOAD
00000a4a: DUP1
00000a4b: SWAP2
00000a4c: SUB
00000a4d: SWAP1
00000a4e: LOG1
00000a4f: POP
00000a50: JUMP
00000a51: JUMPDEST
00000a52: PUSH1 0x00
00000a54: PUSH1 0x40
00000a56: MLOAD
00000a57: PUSH3 0x82b429
00000a5b: PUSH1 0xe8
00000a5d: SHL
00000a5e: DUP2
00000a5f: MSTORE
00000a60: PUSH1 0x04
00000a62: ADD
00000a63: PUSH1 0x40
00000a65: MLOAD
00000a66: DUP1
00000a67: SWAP2
00000a68: SUB
00000a69: SWAP1
00000a6a: REVERT
00000a6b: JUMPDEST
00000a6c: PUSH2 0x0a73
00000a6f: PUSH2 0x2c07
00000a72: JUMP
00000a73: JUMPDEST
00000a74: PUSH1 0x03
00000a76: SLOAD
00000a77: PUSH1 0xff
00000a79: AND
00000a7a: PUSH2 0x0a96
00000a7d: JUMPI
00000a7e: PUSH1 0x40
00000a80: MLOAD
00000a81: PUSH4 0x0bc4868d
00000a86: PUSH1 0xe1
00000a88: SHL
00000a89: DUP2
00000a8a: MSTORE
00000a8b: PUSH1 0x04
00000a8d: ADD
00000a8e: PUSH1 0x40
00000a90: MLOAD
00000a91: DUP1
00000a92: SWAP2
00000a93: SUB
00000a94: SWAP1
00000a95: REVERT
00000a96: JUMPDEST
00000a97: PUSH32 0x000000000000000000000000d0f4de81e0b6e9d8018f2b8bf7f05da0edbc963f
00000ab8: PUSH1 0x01
00000aba: PUSH1 0x01
00000abc: PUSH1 0xa0
00000abe: SHL
00000abf: SUB
00000ac0: AND
00000ac1: PUSH4 0x5c975abb
00000ac6: PUSH1 0x40
00000ac8: MLOAD
00000ac9: DUP2
00000aca: PUSH4 0xffffffff
00000acf: AND
00000ad0: PUSH1 0xe0
00000ad2: SHL
00000ad3: DUP2
00000ad4: MSTORE
00000ad5: PUSH1 0x04
00000ad7: ADD
00000ad8: PUSH1 0x20
00000ada: PUSH1 0x40
00000adc: MLOAD
00000add: DUP1
00000ade: DUP4
00000adf: SUB
00000ae0: DUP2
00000ae1: DUP7
00000ae2: GAS
00000ae3: STATICCALL
00000ae4: ISZERO
00000ae5: DUP1
00000ae6: ISZERO
00000ae7: PUSH2 0x0af4
00000aea: JUMPI
00000aeb: RETURNDATASIZE
00000aec: PUSH1 0x00
00000aee: DUP1
00000aef: RETURNDATACOPY
00000af0: RETURNDATASIZE
00000af1: PUSH1 0x00
00000af3: REVERT
00000af4: JUMPDEST
00000af5: POP
00000af6: POP
00000af7: POP
00000af8: POP
00000af9: PUSH1 0x40
00000afb: MLOAD
00000afc: RETURNDATASIZE
00000afd: PUSH1 0x1f
00000aff: NOT
00000b00: PUSH1 0x1f
00000b02: DUP3
00000b03: ADD
00000b04: AND
00000b05: DUP3
00000b06: ADD
00000b07: DUP1
00000b08: PUSH1 0x40
00000b0a: MSTORE
00000b0b: POP
00000b0c: DUP2
00000b0d: ADD
00000b0e: SWAP1
00000b0f: PUSH2 0x0b18
00000b12: SWAP2
00000b13: SWAP1
00000b14: PUSH2 0x4110
00000b17: JUMP
00000b18: JUMPDEST
00000b19: ISZERO
00000b1a: PUSH2 0x0b36
00000b1d: JUMPI
00000b1e: PUSH1 0x40
00000b20: MLOAD
00000b21: PUSH4 0xd69df317
00000b26: PUSH1 0xe0
00000b28: SHL
00000b29: DUP2
00000b2a: MSTORE
00000b2b: PUSH1 0x04
00000b2d: ADD
00000b2e: PUSH1 0x40
00000b30: MLOAD
00000b31: DUP1
00000b32: SWAP2
00000b33: SUB
00000b34: SWAP1
00000b35: REVERT
00000b36: JUMPDEST
00000b37: PUSH2 0x0b3e
00000b3a: PUSH2 0x2c3f
00000b3d: JUMP
00000b3e: JUMPDEST
00000b3f: PUSH1 0x40
00000b41: MLOAD
00000b42: PUSH4 0x139d99a1
00000b47: PUSH1 0xe0
00000b49: SHL
00000b4a: DUP2
00000b4b: MSTORE
00000b4c: DUP2
00000b4d: SWAP1
00000b4e: PUSH1 0x01
00000b50: PUSH1 0x01
00000b52: PUSH1 0xa0
00000b54: SHL
00000b55: SUB
00000b56: PUSH32 0x000000000000000000000000d0f4de81e0b6e9d8018f2b8bf7f05da0edbc963f
00000b77: AND
00000b78: SWAP1
00000b79: PUSH4 0x139d99a1
00000b7e: SWAP1
00000b7f: PUSH2 0x0b8e
00000b82: SWAP1
00000b83: CALLER
00000b84: SWAP1
00000b85: DUP6
00000b86: SWAP1
00000b87: PUSH1 0x04
00000b89: ADD
00000b8a: PUSH2 0x41a0
00000b8d: JUMP
00000b8e: JUMPDEST
00000b8f: PUSH1 0x00
00000b91: PUSH1 0x40
00000b93: MLOAD
00000b94: DUP1
00000b95: DUP4
00000b96: SUB
00000b97: DUP2
00000b98: PUSH1 0x00
00000b9a: DUP8
00000b9b: DUP1
00000b9c: EXTCODESIZE
00000b9d: ISZERO
00000b9e: DUP1
00000b9f: ISZERO
00000ba0: PUSH2 0x0ba8
00000ba3: JUMPI
00000ba4: PUSH1 0x00
00000ba6: DUP1
00000ba7: REVERT
00000ba8: JUMPDEST
00000ba9: POP
00000baa: GAS
00000bab: CALL
00000bac: ISZERO
00000bad: DUP1
00000bae: ISZERO
00000baf: PUSH2 0x0bbc
00000bb2: JUMPI
00000bb3: RETURNDATASIZE
00000bb4: PUSH1 0x00
00000bb6: DUP1
00000bb7: RETURNDATACOPY
00000bb8: RETURNDATASIZE
00000bb9: PUSH1 0x00
00000bbb: REVERT
00000bbc: JUMPDEST
00000bbd: POP
00000bbe: PUSH1 0x00
00000bc0: SWAP3
00000bc1: POP
00000bc2: PUSH2 0x0bcf
00000bc5: SWAP2
00000bc6: POP
00000bc7: DUP5
00000bc8: SWAP1
00000bc9: POP
00000bca: DUP1
00000bcb: PUSH2 0x4216
00000bce: JUMP
00000bcf: JUMPDEST
00000bd0: DUP2
00000bd1: ADD
00000bd2: SWAP1
00000bd3: PUSH2 0x0bdc
00000bd6: SWAP2
00000bd7: SWAP1
00000bd8: PUSH2 0x44ef
00000bdb: JUMP
00000bdc: JUMPDEST
00000bdd: SWAP1
00000bde: POP
00000bdf: PUSH32 0x000000000000000000000000d0f4de81e0b6e9d8018f2b8bf7f05da0edbc963f
00000c00: PUSH1 0x01
00000c02: PUSH1 0x01
00000c04: PUSH1 0xa0
00000c06: SHL
00000c07: SUB
00000c08: AND
00000c09: PUSH4 0x3fc8cef3
00000c0e: PUSH1 0x40
00000c10: MLOAD
00000c11: DUP2
00000c12: PUSH4 0xffffffff
00000c17: AND
00000c18: PUSH1 0xe0
00000c1a: SHL
00000c1b: DUP2
00000c1c: MSTORE
00000c1d: PUSH1 0x04
00000c1f: ADD
00000c20: PUSH1 0x20
00000c22: PUSH1 0x40
00000c24: MLOAD
00000c25: DUP1
00000c26: DUP4
00000c27: SUB
00000c28: DUP2
00000c29: DUP7
00000c2a: GAS
00000c2b: STATICCALL
00000c2c: ISZERO
00000c2d: DUP1
00000c2e: ISZERO
00000c2f: PUSH2 0x0c3c
00000c32: JUMPI
00000c33: RETURNDATASIZE
00000c34: PUSH1 0x00
00000c36: DUP1
00000c37: RETURNDATACOPY
00000c38: RETURNDATASIZE
00000c39: PUSH1 0x00
00000c3b: REVERT
00000c3c: JUMPDEST
00000c3d: POP
00000c3e: POP
00000c3f: POP
00000c40: POP
00000c41: PUSH1 0x40
00000c43: MLOAD
00000c44: RETURNDATASIZE
00000c45: PUSH1 0x1f
00000c47: NOT
00000c48: PUSH1 0x1f
00000c4a: DUP3
00000c4b: ADD
00000c4c: AND
00000c4d: DUP3
00000c4e: ADD
00000c4f: DUP1
00000c50: PUSH1 0x40
00000c52: MSTORE
00000c53: POP
00000c54: DUP2
00000c55: ADD
00000c56: SWAP1
00000c57: PUSH2 0x0c60
00000c5a: SWAP2
00000c5b: SWAP1
00000c5c: PUSH2 0x40f3
00000c5f: JUMP
00000c60: JUMPDEST
00000c61: PUSH1 0x20
00000c63: DUP3
00000c64: ADD
00000c65: MLOAD
00000c66: PUSH1 0x40
00000c68: DUP2
00000c69: ADD
00000c6a: MLOAD
00000c6b: PUSH1 0x60
00000c6d: SWAP1
00000c6e: SWAP2
00000c6f: ADD
00000c70: MLOAD
00000c71: SWAP1
00000c72: SWAP2
00000c73: PUSH1 0x01
00000c75: PUSH1 0x01
00000c77: PUSH1 0xa0
00000c79: SHL
00000c7a: SUB
00000c7b: DUP4
00000c7c: DUP2
00000c7d: AND
00000c7e: SWAP2
00000c7f: AND
00000c80: EQ
00000c81: PUSH2 0x0cb5
00000c84: JUMPI
00000c85: PUSH1 0x40
00000c87: MLOAD
00000c88: PUSH4 0x7bed3891
00000c8d: PUSH1 0xe0
00000c8f: SHL
00000c90: DUP2
00000c91: MSTORE
00000c92: PUSH1 0x01
00000c94: PUSH1 0x01
00000c96: PUSH1 0xa0
00000c98: SHL
00000c99: SUB
00000c9a: SWAP3
00000c9b: DUP4
00000c9c: AND
00000c9d: PUSH1 0x04
00000c9f: DUP3
00000ca0: ADD
00000ca1: MSTORE
00000ca2: SWAP2
00000ca3: AND
00000ca4: PUSH1 0x24
00000ca6: DUP3
00000ca7: ADD
00000ca8: MSTORE
00000ca9: PUSH1 0x44
00000cab: ADD
00000cac: JUMPDEST
00000cad: PUSH1 0x40
00000caf: MLOAD
00000cb0: DUP1
00000cb1: SWAP2
00000cb2: SUB
00000cb3: SWAP1
00000cb4: REVERT
00000cb5: JUMPDEST
00000cb6: POP
00000cb7: POP
00000cb8: PUSH2 0x0cc4
00000cbb: DUP2
00000cbc: PUSH1 0x20
00000cbe: ADD
00000cbf: MLOAD
00000cc0: PUSH2 0x2c73
00000cc3: JUMP
00000cc4: JUMPDEST
00000cc5: DUP1
00000cc6: MLOAD
00000cc7: PUSH2 0x0ccf
00000cca: SWAP1
00000ccb: PUSH2 0x2f8c
00000cce: JUMP
00000ccf: JUMPDEST
00000cd0: POP
00000cd1: POP
00000cd2: PUSH1 0x0c
00000cd4: DUP1
00000cd5: SLOAD
00000cd6: PUSH1 0x01
00000cd8: ADD
00000cd9: SWAP1
00000cda: SSTORE
00000cdb: PUSH2 0x0cf1
00000cde: PUSH1 0x01
00000ce0: PUSH1 0x00
00000ce2: DUP1
00000ce3: MLOAD
00000ce4: PUSH1 0x20
00000ce6: PUSH2 0x4d30
00000ce9: DUP4
00000cea: CODECOPY
00000ceb: DUP2
00000cec: MLOAD
00000ced: SWAP2
00000cee: MSTORE
00000cef: SSTORE
00000cf0: JUMP
00000cf1: JUMPDEST
00000cf2: POP
00000cf3: JUMP
00000cf4: JUMPDEST
00000cf5: PUSH1 0x00
00000cf7: PUSH2 0x0cff
00000cfa: DUP3
00000cfb: PUSH2 0x1881
00000cfe: JUMP
00000cff: JUMPDEST
00000d00: SWAP1
00000d01: POP
00000d02: PUSH2 0x0d25
00000d05: DUP3
00000d06: PUSH1 0x01
00000d08: PUSH1 0x01
00000d0a: PUSH1 0xa0
00000d0c: SHL
00000d0d: SUB
00000d0e: AND
00000d0f: PUSH1 0x00
00000d11: SWAP1
00000d12: DUP2
00000d13: MSTORE
00000d14: PUSH1 0x12
00000d16: PUSH1 0x20
00000d18: MSTORE
00000d19: PUSH1 0x40
00000d1b: SWAP1
00000d1c: KECCAK256
00000d1d: PUSH1 0x01
00000d1f: ADD
00000d20: SLOAD
00000d21: ISZERO
00000d22: ISZERO
00000d23: SWAP1
00000d24: JUMP
00000d25: JUMPDEST
00000d26: ISZERO
00000d27: PUSH2 0x0d46
00000d2a: JUMPI
00000d2b: PUSH1 0x00
00000d2d: PUSH2 0x0d35
00000d30: DUP4
00000d31: PUSH2 0x3054
00000d34: JUMP
00000d35: JUMPDEST
00000d36: POP
00000d37: SWAP1
00000d38: POP
00000d39: PUSH2 0x0d42
00000d3c: DUP2
00000d3d: DUP4
00000d3e: PUSH2 0x459f
00000d41: JUMP
00000d42: JUMPDEST
00000d43: SWAP2
00000d44: POP
00000d45: POP
00000d46: JUMPDEST
00000d47: SWAP2
00000d48: SWAP1
00000d49: POP
00000d4a: JUMP
00000d4b: JUMPDEST
00000d4c: PUSH1 0x03
00000d4e: SLOAD
00000d4f: PUSH1 0xff
00000d51: AND
00000d52: PUSH2 0x0d6e
00000d55: JUMPI
00000d56: PUSH1 0x40
00000d58: MLOAD
00000d59: PUSH4 0x0bc4868d
00000d5e: PUSH1 0xe1
00000d60: SHL
00000d61: DUP2
00000d62: MSTORE
00000d63: PUSH1 0x04
00000d65: ADD
00000d66: PUSH1 0x40
00000d68: MLOAD
00000d69: DUP1
00000d6a: SWAP2
00000d6b: SUB
00000d6c: SWAP1
00000d6d: REVERT
00000d6e: JUMPDEST
00000d6f: PUSH2 0x0d76
00000d72: PUSH2 0x2c3f
00000d75: JUMP
00000d76: JUMPDEST
00000d77: DUP1
00000d78: PUSH3 0x76a700
00000d7c: DUP2
00000d7d: GT
00000d7e: ISZERO
00000d7f: PUSH2 0x0d9e
00000d82: JUMPI
00000d83: PUSH1 0x40
00000d85: MLOAD
00000d86: PUSH4 0x72c50e0d
00000d8b: PUSH1 0xe1
00000d8d: SHL
00000d8e: DUP2
00000d8f: MSTORE
00000d90: PUSH1 0x04
00000d92: ADD
00000d93: PUSH2 0x0cac
00000d96: SWAP2
00000d97: DUP2
00000d98: MSTORE
00000d99: PUSH1 0x20
00000d9b: ADD
00000d9c: SWAP1
00000d9d: JUMP
00000d9e: JUMPDEST
00000d9f: POP
00000da0: PUSH1 0x0e
00000da2: DUP2
00000da3: SWAP1
00000da4: SSTORE
00000da5: PUSH1 0x40
00000da7: MLOAD
00000da8: DUP2
00000da9: DUP2
00000daa: MSTORE
00000dab: PUSH32 0x0b322229f2d3dfa405aa31c93977d24557d0810957ba17ac4ca950b93ba077c6
00000dcc: SWAP1
00000dcd: PUSH1 0x20
00000dcf: ADD
00000dd0: PUSH2 0x0a46
00000dd3: JUMP
00000dd4: JUMPDEST
00000dd5: PUSH1 0x03
00000dd7: SLOAD
00000dd8: PUSH1 0xff
00000dda: AND
00000ddb: PUSH2 0x0df7
00000dde: JUMPI
00000ddf: PUSH1 0x40
00000de1: MLOAD
00000de2: PUSH4 0x0bc4868d
00000de7: PUSH1 0xe1
00000de9: SHL
00000dea: DUP2
00000deb: MSTORE
00000dec: PUSH1 0x04
00000dee: ADD
00000def: PUSH1 0x40
00000df1: MLOAD
00000df2: DUP1
00000df3: SWAP2
00000df4: SUB
00000df5: SWAP1
00000df6: REVERT
00000df7: JUMPDEST
00000df8: PUSH2 0x0dff
00000dfb: PUSH2 0x2c3f
00000dfe: JUMP
00000dff: JUMPDEST
00000e00: PUSH1 0x0d
00000e02: DUP2
00000e03: SWAP1
00000e04: SSTORE
00000e05: PUSH1 0x40
00000e07: MLOAD
00000e08: DUP2
00000e09: DUP2
00000e0a: MSTORE
00000e0b: PUSH32 0x08bfea04f54ad359c30eeb68a7490abf15d5cf22d91a1279f3b26768b77717fb
00000e2c: SWAP1
00000e2d: PUSH1 0x20
00000e2f: ADD
00000e30: PUSH2 0x0a46
00000e33: JUMP
00000e34: JUMPDEST
00000e35: PUSH1 0x03
00000e37: SLOAD
00000e38: PUSH1 0xff
00000e3a: AND
00000e3b: PUSH2 0x0e57
00000e3e: JUMPI
00000e3f: PUSH1 0x40
00000e41: MLOAD
00000e42: PUSH4 0x0bc4868d
00000e47: PUSH1 0xe1
00000e49: SHL
00000e4a: DUP2
00000e4b: MSTORE
00000e4c: PUSH1 0x04
00000e4e: ADD
00000e4f: PUSH1 0x40
00000e51: MLOAD
00000e52: DUP1
00000e53: SWAP2
00000e54: SUB
00000e55: SWAP1
00000e56: REVERT
00000e57: JUMPDEST
00000e58: PUSH32 0x000000000000000000000000d0f4de81e0b6e9d8018f2b8bf7f05da0edbc963f
00000e79: PUSH1 0x01
00000e7b: PUSH1 0x01
00000e7d: PUSH1 0xa0
00000e7f: SHL
00000e80: SUB
00000e81: AND
00000e82: PUSH4 0x5c975abb
00000e87: PUSH1 0x40
00000e89: MLOAD
00000e8a: DUP2
00000e8b: PUSH4 0xffffffff
00000e90: AND
00000e91: PUSH1 0xe0
00000e93: SHL
00000e94: DUP2
00000e95: MSTORE
00000e96: PUSH1 0x04
00000e98: ADD
00000e99: PUSH1 0x20
00000e9b: PUSH1 0x40
00000e9d: MLOAD
00000e9e: DUP1
00000e9f: DUP4
00000ea0: SUB
00000ea1: DUP2
00000ea2: DUP7
00000ea3: GAS
00000ea4: STATICCALL
00000ea5: ISZERO
00000ea6: DUP1
00000ea7: ISZERO
00000ea8: PUSH2 0x0eb5
00000eab: JUMPI
00000eac: RETURNDATASIZE
00000ead: PUSH1 0x00
00000eaf: DUP1
00000eb0: RETURNDATACOPY
00000eb1: RETURNDATASIZE
00000eb2: PUSH1 0x00
00000eb4: REVERT
00000eb5: JUMPDEST
00000eb6: POP
00000eb7: POP
00000eb8: POP
00000eb9: POP
00000eba: PUSH1 0x40
00000ebc: MLOAD
00000ebd: RETURNDATASIZE
00000ebe: PUSH1 0x1f
00000ec0: NOT
00000ec1: PUSH1 0x1f
00000ec3: DUP3
00000ec4: ADD
00000ec5: AND
00000ec6: DUP3
00000ec7: ADD
00000ec8: DUP1
00000ec9: PUSH1 0x40
00000ecb: MSTORE
00000ecc: POP
00000ecd: DUP2
00000ece: ADD
00000ecf: SWAP1
00000ed0: PUSH2 0x0ed9
00000ed3: SWAP2
00000ed4: SWAP1
00000ed5: PUSH2 0x4110
00000ed8: JUMP
00000ed9: JUMPDEST
00000eda: ISZERO
00000edb: PUSH2 0x0ef7
00000ede: JUMPI
00000edf: PUSH1 0x40
00000ee1: MLOAD
00000ee2: PUSH4 0xd69df317
00000ee7: PUSH1 0xe0
00000ee9: SHL
00000eea: DUP2
00000eeb: MSTORE
00000eec: PUSH1 0x04
00000eee: ADD
00000eef: PUSH1 0x40
00000ef1: MLOAD
00000ef2: DUP1
00000ef3: SWAP2
00000ef4: SUB
00000ef5: SWAP1
00000ef6: REVERT
00000ef7: JUMPDEST
00000ef8: PUSH32 0x000000000000000000000000d0f4de81e0b6e9d8018f2b8bf7f05da0edbc963f
00000f19: PUSH1 0x01
00000f1b: PUSH1 0x01
00000f1d: PUSH1 0xa0
00000f1f: SHL
00000f20: SUB
00000f21: AND
00000f22: PUSH4 0xf851a440
00000f27: PUSH1 0x40
00000f29: MLOAD
00000f2a: DUP2
00000f2b: PUSH4 0xffffffff
00000f30: AND
00000f31: PUSH1 0xe0
00000f33: SHL
00000f34: DUP2
00000f35: MSTORE
00000f36: PUSH1 0x04
00000f38: ADD
00000f39: PUSH1 0x20
00000f3b: PUSH1 0x40
00000f3d: MLOAD
00000f3e: DUP1
00000f3f: DUP4
00000f40: SUB
00000f41: DUP2
00000f42: DUP7
00000f43: GAS
00000f44: STATICCALL
00000f45: ISZERO
00000f46: DUP1
00000f47: ISZERO
00000f48: PUSH2 0x0f55
00000f4b: JUMPI
00000f4c: RETURNDATASIZE
00000f4d: PUSH1 0x00
00000f4f: DUP1
00000f50: RETURNDATACOPY
00000f51: RETURNDATASIZE
00000f52: PUSH1 0x00
00000f54: REVERT
00000f55: JUMPDEST
00000f56: POP
00000f57: POP
00000f58: POP
00000f59: POP
00000f5a: PUSH1 0x40
00000f5c: MLOAD
00000f5d: RETURNDATASIZE
00000f5e: PUSH1 0x1f
00000f60: NOT
00000f61: PUSH1 0x1f
00000f63: DUP3
00000f64: ADD
00000f65: AND
00000f66: DUP3
00000f67: ADD
00000f68: DUP1
00000f69: PUSH1 0x40
00000f6b: MSTORE
00000f6c: POP
00000f6d: DUP2
00000f6e: ADD
00000f6f: SWAP1
00000f70: PUSH2 0x0f79
00000f73: SWAP2
00000f74: SWAP1
00000f75: PUSH2 0x40f3
00000f78: JUMP
00000f79: JUMPDEST
00000f7a: PUSH1 0x01
00000f7c: PUSH1 0x01
00000f7e: PUSH1 0xa0
00000f80: SHL
00000f81: SUB
00000f82: AND
00000f83: CALLER
00000f84: PUSH1 0x01
00000f86: PUSH1 0x01
00000f88: PUSH1 0xa0
00000f8a: SHL
00000f8b: SUB
00000f8c: AND
00000f8d: EQ
00000f8e: PUSH2 0x0fa9
00000f91: JUMPI
00000f92: PUSH1 0x40
00000f94: MLOAD
00000f95: PUSH3 0x82b429
00000f99: PUSH1 0xe8
00000f9b: SHL
00000f9c: DUP2
00000f9d: MSTORE
00000f9e: PUSH1 0x04
00000fa0: ADD
00000fa1: PUSH1 0x40
00000fa3: MLOAD
00000fa4: DUP1
00000fa5: SWAP2
00000fa6: SUB
00000fa7: SWAP1
00000fa8: REVERT
00000fa9: JUMPDEST
00000faa: PUSH3 0x278d00
00000fae: PUSH1 0x0f
00000fb0: SLOAD
00000fb1: TIMESTAMP
00000fb2: PUSH2 0x0fbb
00000fb5: SWAP2
00000fb6: SWAP1
00000fb7: PUSH2 0x459f
00000fba: JUMP
00000fbb: JUMPDEST
00000fbc: GT
00000fbd: PUSH2 0x0fd9
00000fc0: JUMPI
00000fc1: PUSH1 0x40
00000fc3: MLOAD
00000fc4: PUSH4 0x248fb7ff
00000fc9: PUSH1 0xe0
00000fcb: SHL
00000fcc: DUP2
00000fcd: MSTORE
00000fce: PUSH1 0x04
00000fd0: ADD
00000fd1: PUSH1 0x40
00000fd3: MLOAD
00000fd4: DUP1
00000fd5: SWAP2
00000fd6: SUB
00000fd7: SWAP1
00000fd8: REVERT
00000fd9: JUMPDEST
00000fda: PUSH1 0x00
00000fdc: PUSH2 0x0257
00000fdf: PUSH2 0x1006
00000fe2: PUSH32 0x52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace02
00001003: SLOAD
00001004: SWAP1
00001005: JUMP
00001006: JUMPDEST
00001007: PUSH2 0x1010
0000100a: SWAP2
0000100b: SWAP1
0000100c: PUSH2 0x45c8
0000100f: JUMP
00001010: JUMPDEST
00001011: SWAP1
00001012: POP
00001013: PUSH2 0x109d
00001016: PUSH32 0x000000000000000000000000d0f4de81e0b6e9d8018f2b8bf7f05da0edbc963f
00001037: PUSH1 0x01
00001039: PUSH1 0x01
0000103b: PUSH1 0xa0
0000103d: SHL
0000103e: SUB
0000103f: AND
00001040: PUSH4 0xf851a440
00001045: PUSH1 0x40
00001047: MLOAD
00001048: DUP2
00001049: PUSH4 0xffffffff
0000104e: AND
0000104f: PUSH1 0xe0
00001051: SHL
00001052: DUP2
00001053: MSTORE
00001054: PUSH1 0x04
00001056: ADD
00001057: PUSH1 0x20
00001059: PUSH1 0x40
0000105b: MLOAD
0000105c: DUP1
0000105d: DUP4
0000105e: SUB
0000105f: DUP2
00001060: DUP7
00001061: GAS
00001062: STATICCALL
00001063: ISZERO
00001064: DUP1
00001065: ISZERO
00001066: PUSH2 0x1073
00001069: JUMPI
0000106a: RETURNDATASIZE
0000106b: PUSH1 0x00
0000106d: DUP1
0000106e: RETURNDATACOPY
0000106f: RETURNDATASIZE
00001070: PUSH1 0x00
00001072: REVERT
00001073: JUMPDEST
00001074: POP
00001075: POP
00001076: POP
00001077: POP
00001078: PUSH1 0x40
0000107a: MLOAD
0000107b: RETURNDATASIZE
0000107c: PUSH1 0x1f
0000107e: NOT
0000107f: PUSH1 0x1f
00001081: DUP3
00001082: ADD
00001083: AND
00001084: DUP3
00001085: ADD
00001086: DUP1
00001087: PUSH1 0x40
00001089: MSTORE
0000108a: POP
0000108b: DUP2
0000108c: ADD
0000108d: SWAP1
0000108e: PUSH2 0x1097
00001091: SWAP2
00001092: SWAP1
00001093: PUSH2 0x40f3
00001096: JUMP
00001097: JUMPDEST
00001098: DUP3
00001099: PUSH2 0x3115
0000109c: JUMP
0000109d: JUMPDEST
0000109e: TIMESTAMP
0000109f: PUSH1 0x0f
000010a1: SSTORE
000010a2: PUSH1 0x40
000010a4: MLOAD
000010a5: DUP2
000010a6: DUP2
000010a7: MSTORE
000010a8: PUSH32 0x41c725bc51912ad4b67c601410606bf7ec3aa627cd30eaab4c91c77e576ceb5f
000010c9: SWAP1
000010ca: PUSH1 0x20
000010cc: ADD
000010cd: PUSH2 0x0a46
000010d0: JUMP
000010d1: JUMPDEST
000010d2: PUSH1 0x03
000010d4: SLOAD
000010d5: PUSH1 0xff
000010d7: AND
000010d8: ISZERO
000010d9: DUP1
000010da: ISZERO
000010db: PUSH2 0x1176
000010de: JUMPI
000010df: POP
000010e0: PUSH32 0x000000000000000000000000d0f4de81e0b6e9d8018f2b8bf7f05da0edbc963f
00001101: PUSH1 0x01
00001103: PUSH1 0x01
00001105: PUSH1 0xa0
00001107: SHL
00001108: SUB
00001109: AND
0000110a: PUSH4 0x8da5cb5b
0000110f: PUSH1 0x40
00001111: MLOAD
00001112: DUP2
00001113: PUSH4 0xffffffff
00001118: AND
00001119: PUSH1 0xe0
0000111b: SHL
0000111c: DUP2
0000111d: MSTORE
0000111e: PUSH1 0x04
00001120: ADD
00001121: PUSH1 0x20
00001123: PUSH1 0x40
00001125: MLOAD
00001126: DUP1
00001127: DUP4
00001128: SUB
00001129: DUP2
0000112a: DUP7
0000112b: GAS
0000112c: STATICCALL
0000112d: ISZERO
0000112e: DUP1
0000112f: ISZERO
00001130: PUSH2 0x113d
00001133: JUMPI
00001134: RETURNDATASIZE
00001135: PUSH1 0x00
00001137: DUP1
00001138: RETURNDATACOPY
00001139: RETURNDATASIZE
0000113a: PUSH1 0x00
0000113c: REVERT
0000113d: JUMPDEST
0000113e: POP
0000113f: POP
00001140: POP
00001141: POP
00001142: PUSH1 0x40
00001144: MLOAD
00001145: RETURNDATASIZE
00001146: PUSH1 0x1f
00001148: NOT
00001149: PUSH1 0x1f
0000114b: DUP3
0000114c: ADD
0000114d: AND
0000114e: DUP3
0000114f: ADD
00001150: DUP1
00001151: PUSH1 0x40
00001153: MSTORE
00001154: POP
00001155: DUP2
00001156: ADD
00001157: SWAP1
00001158: PUSH2 0x1161
0000115b: SWAP2
0000115c: SWAP1
0000115d: PUSH2 0x40f3
00001160: JUMP
00001161: JUMPDEST
00001162: PUSH1 0x01
00001164: PUSH1 0x01
00001166: PUSH1 0xa0
00001168: SHL
00001169: SUB
0000116a: AND
0000116b: CALLER
0000116c: PUSH1 0x01
0000116e: PUSH1 0x01
00001170: PUSH1 0xa0
00001172: SHL
00001173: SUB
00001174: AND
00001175: EQ
00001176: JUMPDEST
00001177: DUP1
00001178: ISZERO
00001179: PUSH2 0x1183
0000117c: JUMPI
0000117d: POP
0000117e: PUSH1 0x10
00001180: SLOAD
00001181: TIMESTAMP
00001182: GT
00001183: JUMPDEST
00001184: PUSH2 0x119f
00001187: JUMPI
00001188: PUSH1 0x40
0000118a: MLOAD
0000118b: PUSH3 0x82b429
0000118f: PUSH1 0xe8
00001191: SHL
00001192: DUP2
00001193: MSTORE
00001194: PUSH1 0x04
00001196: ADD
00001197: PUSH1 0x40
00001199: MLOAD
0000119a: DUP1
0000119b: SWAP2
0000119c: SUB
0000119d: SWAP1
0000119e: REVERT
0000119f: JUMPDEST
000011a0: PUSH2 0x1293
000011a3: PUSH32 0x000000000000000000000000d0f4de81e0b6e9d8018f2b8bf7f05da0edbc963f
000011c4: PUSH1 0x01
000011c6: PUSH1 0x01
000011c8: PUSH1 0xa0
000011ca: SHL
000011cb: SUB
000011cc: AND
000011cd: PUSH4 0x3fc8cef3
000011d2: PUSH1 0x40
000011d4: MLOAD
000011d5: DUP2
000011d6: PUSH4 0xffffffff
000011db: AND
000011dc: PUSH1 0xe0
000011de: SHL
000011df: DUP2
000011e0: MSTORE
000011e1: PUSH1 0x04
000011e3: ADD
000011e4: PUSH1 0x20
000011e6: PUSH1 0x40
000011e8: MLOAD
000011e9: DUP1
000011ea: DUP4
000011eb: SUB
000011ec: DUP2
000011ed: DUP7
000011ee: GAS
000011ef: STATICCALL
000011f0: ISZERO
000011f1: DUP1
000011f2: ISZERO
000011f3: PUSH2 0x1200
000011f6: JUMPI
000011f7: RETURNDATASIZE
000011f8: PUSH1 0x00
000011fa: DUP1
000011fb: RETURNDATACOPY
000011fc: RETURNDATASIZE
000011fd: PUSH1 0x00
000011ff: REVERT
00001200: JUMPDEST
00001201: POP
00001202: POP
00001203: POP
00001204: POP
00001205: PUSH1 0x40
00001207: MLOAD
00001208: RETURNDATASIZE
00001209: PUSH1 0x1f
0000120b: NOT
0000120c: PUSH1 0x1f
0000120e: DUP3
0000120f: ADD
00001210: AND
00001211: DUP3
00001212: ADD
00001213: DUP1
00001214: PUSH1 0x40
00001216: MSTORE
00001217: POP
00001218: DUP2
00001219: ADD
0000121a: SWAP1
0000121b: PUSH2 0x1224
0000121e: SWAP2
0000121f: SWAP1
00001220: PUSH2 0x40f3
00001223: JUMP
00001224: JUMPDEST
00001225: PUSH1 0x40
00001227: MLOAD
00001228: PUSH4 0x70a08231
0000122d: PUSH1 0xe0
0000122f: SHL
00001230: DUP2
00001231: MSTORE
00001232: ADDRESS
00001233: PUSH1 0x04
00001235: DUP3
00001236: ADD
00001237: MSTORE
00001238: PUSH1 0x01
0000123a: PUSH1 0x01
0000123c: PUSH1 0xa0
0000123e: SHL
0000123f: SUB
00001240: SWAP2
00001241: SWAP1
00001242: SWAP2
00001243: AND
00001244: SWAP1
00001245: PUSH4 0x70a08231
0000124a: SWAP1
0000124b: PUSH1 0x24
0000124d: ADD
0000124e: PUSH1 0x20
00001250: PUSH1 0x40
00001252: MLOAD
00001253: DUP1
00001254: DUP4
00001255: SUB
00001256: DUP2
00001257: DUP7
00001258: GAS
00001259: STATICCALL
0000125a: ISZERO
0000125b: DUP1
0000125c: ISZERO
0000125d: PUSH2 0x126a
00001260: JUMPI
00001261: RETURNDATASIZE
00001262: PUSH1 0x00
00001264: DUP1
00001265: RETURNDATACOPY
00001266: RETURNDATASIZE
00001267: PUSH1 0x00
00001269: REVERT
0000126a: JUMPDEST
0000126b: POP
0000126c: POP
0000126d: POP
0000126e: POP
0000126f: PUSH1 0x40
00001271: MLOAD
00001272: RETURNDATASIZE
00001273: PUSH1 0x1f
00001275: NOT
00001276: PUSH1 0x1f
00001278: DUP3
00001279: ADD
0000127a: AND
0000127b: DUP3
0000127c: ADD
0000127d: DUP1
0000127e: PUSH1 0x40
00001280: MSTORE
00001281: POP
00001282: DUP2
00001283: ADD
00001284: SWAP1
00001285: PUSH2 0x128e
00001288: SWAP2
00001289: SWAP1
0000128a: PUSH2 0x45ea
0000128d: JUMP
0000128e: JUMPDEST
0000128f: PUSH2 0x314b
00001292: JUMP
00001293: JUMPDEST
00001294: PUSH2 0x131e
00001297: PUSH32 0x000000000000000000000000d0f4de81e0b6e9d8018f2b8bf7f05da0edbc963f
000012b8: PUSH1 0x01
000012ba: PUSH1 0x01
000012bc: PUSH1 0xa0
000012be: SHL
000012bf: SUB
000012c0: AND
000012c1: PUSH4 0x987af2b6
000012c6: PUSH1 0x40
000012c8: MLOAD
000012c9: DUP2
000012ca: PUSH4 0xffffffff
000012cf: AND
000012d0: PUSH1 0xe0
000012d2: SHL
000012d3: DUP2
000012d4: MSTORE
000012d5: PUSH1 0x04
000012d7: ADD
000012d8: PUSH1 0x20
000012da: PUSH1 0x40
000012dc: MLOAD
000012dd: DUP1
000012de: DUP4
000012df: SUB
000012e0: DUP2
000012e1: DUP7
000012e2: GAS
000012e3: STATICCALL
000012e4: ISZERO
000012e5: DUP1
000012e6: ISZERO
000012e7: PUSH2 0x12f4
000012ea: JUMPI
000012eb: RETURNDATASIZE
000012ec: PUSH1 0x00
000012ee: DUP1
000012ef: RETURNDATACOPY
000012f0: RETURNDATASIZE
000012f1: PUSH1 0x00
000012f3: REVERT
000012f4: JUMPDEST
000012f5: POP
000012f6: POP
000012f7: POP
000012f8: POP
000012f9: PUSH1 0x40
000012fb: MLOAD
000012fc: RETURNDATASIZE
000012fd: PUSH1 0x1f
000012ff: NOT
00001300: PUSH1 0x1f
00001302: DUP3
00001303: ADD
00001304: AND
00001305: DUP3
00001306: ADD
00001307: DUP1
00001308: PUSH1 0x40
0000130a: MSTORE
0000130b: POP
0000130c: DUP2
0000130d: ADD
0000130e: SWAP1
0000130f: PUSH2 0x1318
00001312: SWAP2
00001313: SWAP1
00001314: PUSH2 0x40f3
00001317: JUMP
00001318: JUMPDEST
00001319: SELFBALANCE
0000131a: PUSH2 0x322f
0000131d: JUMP
0000131e: JUMPDEST
0000131f: PUSH1 0x40
00001321: MLOAD
00001322: PUSH32 0xa0b4c7abcd59421dd308af86eb655a256def5dfd3cd36e98c440a826461db6f6
00001343: SWAP1
00001344: PUSH1 0x00
00001346: SWAP1
00001347: LOG1
00001348: JUMP
00001349: JUMPDEST
0000134a: PUSH2 0x1351
0000134d: PUSH2 0x3d3e
00001350: JUMP
00001351: JUMPDEST
00001352: PUSH1 0x03
00001354: SLOAD
00001355: PUSH1 0xff
00001357: AND
00001358: ISZERO
00001359: PUSH2 0x139a
0000135c: JUMPI
0000135d: PUSH1 0x40
0000135f: DUP1
00001360: MLOAD
00001361: PUSH2 0x0100
00001364: DUP2
00001365: ADD
00001366: SWAP2
00001367: DUP3
00001368: SWAP1
00001369: MSTORE
0000136a: SWAP1
0000136b: PUSH1 0x04
0000136d: SWAP1
0000136e: PUSH1 0x08
00001370: SWAP1
00001371: DUP3
00001372: DUP5
00001373: JUMPDEST
00001374: DUP2
00001375: SLOAD
00001376: PUSH1 0x01
00001378: PUSH1 0x01
0000137a: PUSH1 0xa0
0000137c: SHL
0000137d: SUB
0000137e: AND
0000137f: DUP2
00001380: MSTORE
00001381: PUSH1 0x01
00001383: SWAP1
00001384: SWAP2
00001385: ADD
00001386: SWAP1
00001387: PUSH1 0x20
00001389: ADD
0000138a: DUP1
0000138b: DUP4
0000138c: GT
0000138d: PUSH2 0x1373
00001390: JUMPI
00001391: POP
00001392: POP
00001393: POP
00001394: POP
00001395: POP
00001396: SWAP1
00001397: POP
00001398: SWAP1
00001399: JUMP
0000139a: JUMPDEST
0000139b: PUSH2 0x13a2
0000139e: PUSH2 0x3d3e
000013a1: JUMP
000013a2: JUMPDEST
000013a3: PUSH32 0x000000000000000000000000d0f4de81e0b6e9d8018f2b8bf7f05da0edbc963f
000013c4: PUSH1 0x01
000013c6: PUSH1 0x01
000013c8: PUSH1 0xa0
000013ca: SHL
000013cb: SUB
000013cc: AND
000013cd: PUSH4 0x3fc8cef3
000013d2: PUSH1 0x40
000013d4: MLOAD
000013d5: DUP2
000013d6: PUSH4 0xffffffff
000013db: AND
000013dc: PUSH1 0xe0
000013de: SHL
000013df: DUP2
000013e0: MSTORE
000013e1: PUSH1 0x04
000013e3: ADD
000013e4: PUSH1 0x20
000013e6: PUSH1 0x40
000013e8: MLOAD
000013e9: DUP1
000013ea: DUP4
000013eb: SUB
000013ec: DUP2
000013ed: DUP7
000013ee: GAS
000013ef: STATICCALL
000013f0: ISZERO
000013f1: DUP1
000013f2: ISZERO
000013f3: PUSH2 0x1400
000013f6: JUMPI
000013f7: RETURNDATASIZE
000013f8: PUSH1 0x00
000013fa: DUP1
000013fb: RETURNDATACOPY
000013fc: RETURNDATASIZE
000013fd: PUSH1 0x00
000013ff: REVERT
00001400: JUMPDEST
00001401: POP
00001402: POP
00001403: POP
00001404: POP
00001405: PUSH1 0x40
00001407: MLOAD
00001408: RETURNDATASIZE
00001409: PUSH1 0x1f
0000140b: NOT
0000140c: PUSH1 0x1f
0000140e: DUP3
0000140f: ADD
00001410: AND
00001411: DUP3
00001412: ADD
00001413: DUP1
00001414: PUSH1 0x40
00001416: MSTORE
00001417: POP
00001418: DUP2
00001419: ADD
0000141a: SWAP1
0000141b: PUSH2 0x1424
0000141e: SWAP2
0000141f: SWAP1
00001420: PUSH2 0x40f3
00001423: JUMP
00001424: JUMPDEST
00001425: PUSH1 0x01
00001427: PUSH1 0x01
00001429: PUSH1 0xa0
0000142b: SHL
0000142c: SUB
0000142d: AND
0000142e: DUP2
0000142f: MSTORE
00001430: SWAP2
00001431: SWAP1
00001432: POP
00001433: JUMP
00001434: JUMPDEST
00001435: PUSH2 0x143c
00001438: PUSH2 0x2c07
0000143b: JUMP
0000143c: JUMPDEST
0000143d: PUSH1 0x03
0000143f: SLOAD
00001440: PUSH1 0xff
00001442: AND
00001443: PUSH2 0x145f
00001446: JUMPI
00001447: PUSH1 0x40
00001449: MLOAD
0000144a: PUSH4 0x0bc4868d
0000144f: PUSH1 0xe1
00001451: SHL
00001452: DUP2
00001453: MSTORE
00001454: PUSH1 0x04
00001456: ADD
00001457: PUSH1 0x40
00001459: MLOAD
0000145a: DUP1
0000145b: SWAP2
0000145c: SUB
0000145d: SWAP1
0000145e: REVERT
0000145f: JUMPDEST
00001460: PUSH32 0x000000000000000000000000d0f4de81e0b6e9d8018f2b8bf7f05da0edbc963f
00001481: PUSH1 0x01
00001483: PUSH1 0x01
00001485: PUSH1 0xa0
00001487: SHL
00001488: SUB
00001489: AND
0000148a: PUSH4 0x5c975abb
0000148f: PUSH1 0x40
00001491: MLOAD
00001492: DUP2
00001493: PUSH4 0xffffffff
00001498: AND
00001499: PUSH1 0xe0
0000149b: SHL
0000149c: DUP2
0000149d: MSTORE
0000149e: PUSH1 0x04
000014a0: ADD
000014a1: PUSH1 0x20
000014a3: PUSH1 0x40
000014a5: MLOAD
000014a6: DUP1
000014a7: DUP4
000014a8: SUB
000014a9: DUP2
000014aa: DUP7
000014ab: GAS
000014ac: STATICCALL
000014ad: ISZERO
000014ae: DUP1
000014af: ISZERO
000014b0: PUSH2 0x14bd
000014b3: JUMPI
000014b4: RETURNDATASIZE
000014b5: PUSH1 0x00
000014b7: DUP1
000014b8: RETURNDATACOPY
000014b9: RETURNDATASIZE
000014ba: PUSH1 0x00
000014bc: REVERT
000014bd: JUMPDEST
000014be: POP
000014bf: POP
000014c0: POP
000014c1: POP
000014c2: PUSH1 0x40
000014c4: MLOAD
000014c5: RETURNDATASIZE
000014c6: PUSH1 0x1f
000014c8: NOT
000014c9: PUSH1 0x1f
000014cb: DUP3
000014cc: ADD
000014cd: AND
000014ce: DUP3
000014cf: ADD
000014d0: DUP1
000014d1: PUSH1 0x40
000014d3: MSTORE
000014d4: POP
000014d5: DUP2
000014d6: ADD
000014d7: SWAP1
000014d8: PUSH2 0x14e1
000014db: SWAP2
000014dc: SWAP1
000014dd: PUSH2 0x4110
000014e0: JUMP
000014e1: JUMPDEST
000014e2: ISZERO
000014e3: PUSH2 0x14ff
000014e6: JUMPI
000014e7: PUSH1 0x40
000014e9: MLOAD
000014ea: PUSH4 0xd69df317
000014ef: PUSH1 0xe0
000014f1: SHL
000014f2: DUP2
000014f3: MSTORE
000014f4: PUSH1 0x04
000014f6: ADD
000014f7: PUSH1 0x40
000014f9: MLOAD
000014fa: DUP1
000014fb: SWAP2
000014fc: SUB
000014fd: SWAP1
000014fe: REVERT
000014ff: JUMPDEST
00001500: PUSH2 0x1507
00001503: PUSH2 0x2c3f
00001506: JUMP
00001507: JUMPDEST
00001508: PUSH1 0x40
0000150a: MLOAD
0000150b: PUSH4 0x139d99a1
00001510: PUSH1 0xe0
00001512: SHL
00001513: DUP2
00001514: MSTORE
00001515: DUP2
00001516: SWAP1
00001517: PUSH1 0x01
00001519: PUSH1 0x01
0000151b: PUSH1 0xa0
0000151d: SHL
0000151e: SUB
0000151f: PUSH32 0x000000000000000000000000d0f4de81e0b6e9d8018f2b8bf7f05da0edbc963f
00001540: AND
00001541: SWAP1
00001542: PUSH4 0x139d99a1
00001547: SWAP1
00001548: PUSH2 0x1557
0000154b: SWAP1
0000154c: CALLER
0000154d: SWAP1
0000154e: DUP6
0000154f: SWAP1
00001550: PUSH1 0x04
00001552: ADD
00001553: PUSH2 0x41a0
00001556: JUMP
00001557: JUMPDEST
00001558: PUSH1 0x00
0000155a: PUSH1 0x40
0000155c: MLOAD
0000155d: DUP1
0000155e: DUP4
0000155f: SUB
00001560: DUP2
00001561: PUSH1 0x00
00001563: DUP8
00001564: DUP1
00001565: EXTCODESIZE
00001566: ISZERO
00001567: DUP1
00001568: ISZERO
00001569: PUSH2 0x1571
0000156c: JUMPI
0000156d: PUSH1 0x00
0000156f: DUP1
00001570: REVERT
00001571: JUMPDEST
00001572: POP
00001573: GAS
00001574: CALL
00001575: ISZERO
00001576: DUP1
00001577: ISZERO
00001578: PUSH2 0x1585
0000157b: JUMPI
0000157c: RETURNDATASIZE
0000157d: PUSH1 0x00
0000157f: DUP1
00001580: RETURNDATACOPY
00001581: RETURNDATASIZE
00001582: PUSH1 0x00
00001584: REVERT
00001585: JUMPDEST
00001586: POP
00001587: PUSH1 0x00
00001589: SWAP3
0000158a: POP
0000158b: PUSH2 0x1598
0000158e: SWAP2
0000158f: POP
00001590: DUP5
00001591: SWAP1
00001592: POP
00001593: DUP1
00001594: PUSH2 0x4216
00001597: JUMP
00001598: JUMPDEST
00001599: DUP2
0000159a: ADD
0000159b: SWAP1
0000159c: PUSH2 0x15a5
0000159f: SWAP2
000015a0: SWAP1
000015a1: PUSH2 0x44ef
000015a4: JUMP
000015a5: JUMPDEST
000015a6: SWAP1
000015a7: POP
000015a8: PUSH32 0x000000000000000000000000d0f4de81e0b6e9d8018f2b8bf7f05da0edbc963f
000015c9: PUSH1 0x01
000015cb: PUSH1 0x01
000015cd: PUSH1 0xa0
000015cf: SHL
000015d0: SUB
000015d1: AND
000015d2: PUSH4 0x3fc8cef3
000015d7: PUSH1 0x40
000015d9: MLOAD
000015da: DUP2
000015db: PUSH4 0xffffffff
000015e0: AND
000015e1: PUSH1 0xe0
000015e3: SHL
000015e4: DUP2
000015e5: MSTORE
000015e6: PUSH1 0x04
000015e8: ADD
000015e9: PUSH1 0x20
000015eb: PUSH1 0x40
000015ed: MLOAD
000015ee: DUP1
000015ef: DUP4
000015f0: SUB
000015f1: DUP2
000015f2: DUP7
000015f3: GAS
000015f4: STATICCALL
000015f5: ISZERO
000015f6: DUP1
000015f7: ISZERO
000015f8: PUSH2 0x1605
000015fb: JUMPI
000015fc: RETURNDATASIZE
000015fd: PUSH1 0x00
000015ff: DUP1
00001600: RETURNDATACOPY
00001601: RETURNDATASIZE
00001602: PUSH1 0x00
00001604: REVERT
00001605: JUMPDEST
00001606: POP
00001607: POP
00001608: POP
00001609: POP
0000160a: PUSH1 0x40
0000160c: MLOAD
0000160d: RETURNDATASIZE
0000160e: PUSH1 0x1f
00001610: NOT
00001611: PUSH1 0x1f
00001613: DUP3
00001614: ADD
00001615: AND
00001616: DUP3
00001617: ADD
00001618: DUP1
00001619: PUSH1 0x40
0000161b: MSTORE
0000161c: POP
0000161d: DUP2
0000161e: ADD
0000161f: SWAP1
00001620: PUSH2 0x1629
00001623: SWAP2
00001624: SWAP1
00001625: PUSH2 0x40f3
00001628: JUMP
00001629: JUMPDEST
0000162a: PUSH1 0x20
0000162c: DUP3
0000162d: ADD
0000162e: MLOAD
0000162f: PUSH1 0x60
00001631: DUP2
00001632: ADD
00001633: MLOAD
00001634: PUSH1 0x40
00001636: SWAP1
00001637: SWAP2
00001638: ADD
00001639: MLOAD
0000163a: SWAP2
0000163b: PUSH1 0x01
0000163d: PUSH1 0x01
0000163f: PUSH1 0xa0
00001641: SHL
00001642: SUB
00001643: DUP3
00001644: DUP2
00001645: AND
00001646: SWAP2
00001647: AND
00001648: EQ
00001649: PUSH2 0x0cb5
0000164c: JUMPI
0000164d: PUSH1 0x40
0000164f: MLOAD
00001650: PUSH4 0x7bed3891
00001655: PUSH1 0xe0
00001657: SHL
00001658: DUP2
00001659: MSTORE
0000165a: PUSH1 0x01
0000165c: PUSH1 0x01
0000165e: PUSH1 0xa0
00001660: SHL
00001661: SUB
00001662: SWAP3
00001663: DUP4
00001664: AND
00001665: PUSH1 0x04
00001667: DUP3
00001668: ADD
00001669: MSTORE
0000166a: SWAP2
0000166b: AND
0000166c: PUSH1 0x24
0000166e: DUP3
0000166f: ADD
00001670: MSTORE
00001671: PUSH1 0x44
00001673: ADD
00001674: PUSH2 0x0cac
00001677: JUMP
00001678: JUMPDEST
00001679: CALLER
0000167a: PUSH1 0x00
0000167c: SWAP1
0000167d: DUP2
0000167e: MSTORE
0000167f: PUSH1 0x02
00001681: PUSH1 0x20
00001683: MSTORE
00001684: PUSH1 0x40
00001686: DUP1
00001687: DUP3
00001688: KECCAK256
00001689: DUP1
0000168a: SLOAD
0000168b: SWAP1
0000168c: DUP4
0000168d: SWAP1
0000168e: SSTORE
0000168f: SWAP1
00001690: MLOAD
00001691: SWAP1
00001692: SWAP2
00001693: SWAP1
00001694: PUSH1 0x01
00001696: PUSH1 0x01
00001698: PUSH1 0xa0
0000169a: SHL
0000169b: SUB
0000169c: DUP5
0000169d: AND
0000169e: SWAP1
0000169f: DUP4
000016a0: SWAP1
000016a1: DUP4
000016a2: DUP2
000016a3: DUP2
000016a4: DUP2
000016a5: DUP6
000016a6: DUP8
000016a7: GAS
000016a8: CALL
000016a9: SWAP3
000016aa: POP
000016ab: POP
000016ac: POP
000016ad: RETURNDATASIZE
000016ae: DUP1
000016af: PUSH1 0x00
000016b1: DUP2
000016b2: EQ
000016b3: PUSH2 0x16d8
000016b6: JUMPI
000016b7: PUSH1 0x40
000016b9: MLOAD
000016ba: SWAP2
000016bb: POP
000016bc: PUSH1 0x1f
000016be: NOT
000016bf: PUSH1 0x3f
000016c1: RETURNDATASIZE
000016c2: ADD
000016c3: AND
000016c4: DUP3
000016c5: ADD
000016c6: PUSH1 0x40
000016c8: MSTORE
000016c9: RETURNDATASIZE
000016ca: DUP3
000016cb: MSTORE
000016cc: RETURNDATASIZE
000016cd: PUSH1 0x00
000016cf: PUSH1 0x20
000016d1: DUP5
000016d2: ADD
000016d3: RETURNDATACOPY
000016d4: PUSH2 0x16dd
000016d7: JUMP
000016d8: JUMPDEST
000016d9: PUSH1 0x60
000016db: SWAP2
000016dc: POP
000016dd: JUMPDEST
000016de: POP
000016df: POP
000016e0: SWAP1
000016e1: POP
000016e2: DUP1
000016e3: PUSH2 0x16ff
000016e6: JUMPI
000016e7: PUSH1 0x40
000016e9: MLOAD
000016ea: PUSH4 0x3d2cec6f
000016ef: PUSH1 0xe2
000016f1: SHL
000016f2: DUP2
000016f3: MSTORE
000016f4: PUSH1 0x04
000016f6: ADD
000016f7: PUSH1 0x40
000016f9: MLOAD
000016fa: DUP1
000016fb: SWAP2
000016fc: SUB
000016fd: SWAP1
000016fe: REVERT
000016ff: JUMPDEST
00001700: DUP3
00001701: PUSH1 0x01
00001703: PUSH1 0x01
00001705: PUSH1 0xa0
00001707: SHL
00001708: SUB
00001709: AND
0000170a: PUSH32 0x6b00960292e7976c9eb5434816470b38a441061eee645921536131ccb937cafe
0000172b: DUP4
0000172c: PUSH1 0x40
0000172e: MLOAD
0000172f: PUSH2 0x173a
00001732: SWAP2
00001733: DUP2
00001734: MSTORE
00001735: PUSH1 0x20
00001737: ADD
00001738: SWAP1
00001739: JUMP
0000173a: JUMPDEST
0000173b: PUSH1 0x40
0000173d: MLOAD
0000173e: DUP1
0000173f: SWAP2
00001740: SUB
00001741: SWAP1
00001742: LOG2
00001743: POP
00001744: POP
00001745: POP
00001746: JUMP
00001747: JUMPDEST
00001748: PUSH2 0x174f
0000174b: PUSH2 0x2c07
0000174e: JUMP
0000174f: JUMPDEST
00001750: PUSH1 0x03
00001752: SLOAD
00001753: PUSH1 0xff
00001755: AND
00001756: PUSH2 0x1772
00001759: JUMPI
0000175a: PUSH1 0x40
0000175c: MLOAD
0000175d: PUSH4 0x0bc4868d
00001762: PUSH1 0xe1
00001764: SHL
00001765: DUP2
00001766: MSTORE
00001767: PUSH1 0x04
00001769: ADD
0000176a: PUSH1 0x40
0000176c: MLOAD
0000176d: DUP1
0000176e: SWAP2
0000176f: SUB
00001770: SWAP1
00001771: REVERT
00001772: JUMPDEST
00001773: PUSH2 0x177a
00001776: PUSH2 0x2c3f
00001779: JUMP
0000177a: JUMPDEST
0000177b: PUSH1 0x40
0000177d: MLOAD
0000177e: PUSH4 0x139d99a1
00001783: PUSH1 0xe0
00001785: SHL
00001786: DUP2
00001787: MSTORE
00001788: DUP2
00001789: SWAP1
0000178a: PUSH1 0x01
0000178c: PUSH1 0x01
0000178e: PUSH1 0xa0
00001790: SHL
00001791: SUB
00001792: PUSH32 0x000000000000000000000000d0f4de81e0b6e9d8018f2b8bf7f05da0edbc963f
000017b3: AND
000017b4: SWAP1
000017b5: PUSH4 0x139d99a1
000017ba: SWAP1
000017bb: PUSH2 0x17ca
000017be: SWAP1
000017bf: CALLER
000017c0: SWAP1
000017c1: DUP6
000017c2: SWAP1
000017c3: PUSH1 0x04
000017c5: ADD
000017c6: PUSH2 0x41a0
000017c9: JUMP
000017ca: JUMPDEST
000017cb: PUSH1 0x00
000017cd: PUSH1 0x40
000017cf: MLOAD
000017d0: DUP1
000017d1: DUP4
000017d2: SUB
000017d3: DUP2
000017d4: PUSH1 0x00
000017d6: DUP8
000017d7: DUP1
000017d8: EXTCODESIZE
000017d9: ISZERO
000017da: DUP1
000017db: ISZERO
000017dc: PUSH2 0x17e4
000017df: JUMPI
000017e0: PUSH1 0x00
000017e2: DUP1
000017e3: REVERT
000017e4: JUMPDEST
000017e5: POP
000017e6: GAS
000017e7: CALL
000017e8: ISZERO
000017e9: DUP1
000017ea: ISZERO
000017eb: PUSH2 0x17f8
000017ee: JUMPI
000017ef: RETURNDATASIZE
000017f0: PUSH1 0x00
000017f2: DUP1
000017f3: RETURNDATACOPY
000017f4: RETURNDATASIZE
000017f5: PUSH1 0x00
000017f7: REVERT
000017f8: JUMPDEST
000017f9: POP
000017fa: POP
000017fb: PUSH1 0x03
000017fd: DUP1
000017fe: SLOAD
000017ff: PUSH1 0xff
00001801: NOT
00001802: AND
00001803: SWAP1
00001804: SSTORE
00001805: POP
00001806: PUSH2 0x1814
00001809: SWAP1
0000180a: POP
0000180b: PUSH3 0xed4e00
0000180f: TIMESTAMP
00001810: PUSH2 0x4619
00001813: JUMP
00001814: JUMPDEST
00001815: PUSH1 0x10
00001817: SSTORE
00001818: PUSH1 0x00
0000181a: PUSH2 0x1823
0000181d: DUP4
0000181e: DUP1
0000181f: PUSH2 0x4216
00001822: JUMP
00001823: JUMPDEST
00001824: DUP2
00001825: ADD
00001826: SWAP1
00001827: PUSH2 0x1830
0000182a: SWAP2
0000182b: SWAP1
0000182c: PUSH2 0x46ae
0000182f: JUMP
00001830: JUMPDEST
00001831: SWAP1
00001832: POP
00001833: PUSH2 0x183f
00001836: DUP2
00001837: PUSH1 0x00
00001839: ADD
0000183a: MLOAD
0000183b: PUSH2 0x32f2
0000183e: JUMP
0000183f: JUMPDEST
00001840: PUSH1 0x40
00001842: MLOAD
00001843: PUSH32 0x1cdde67b72a90f19919ac732a437ac2f7a10fc128d28c2a6e525d89ce5cd9d3a
00001864: SWAP1
00001865: PUSH1 0x00
00001867: SWAP1
00001868: LOG1
00001869: POP
0000186a: POP
0000186b: PUSH2 0x0cf1
0000186e: PUSH1 0x01
00001870: PUSH1 0x00
00001872: DUP1
00001873: MLOAD
00001874: PUSH1 0x20
00001876: PUSH2 0x4d30
00001879: DUP4
0000187a: CODECOPY
0000187b: DUP2
0000187c: MLOAD
0000187d: SWAP2
0000187e: MSTORE
0000187f: SSTORE
00001880: JUMP
00001881: JUMPDEST
00001882: PUSH1 0x01
00001884: PUSH1 0x01
00001886: PUSH1 0xa0
00001888: SHL
00001889: SUB
0000188a: AND
0000188b: PUSH1 0x00
0000188d: SWAP1
0000188e: DUP2
0000188f: MSTORE
00001890: PUSH1 0x00
00001892: DUP1
00001893: MLOAD
00001894: PUSH1 0x20
00001896: PUSH2 0x4d10
00001899: DUP4
0000189a: CODECOPY
0000189b: DUP2
0000189c: MLOAD
0000189d: SWAP2
0000189e: MSTORE
0000189f: PUSH1 0x20
000018a1: MSTORE
000018a2: PUSH1 0x40
000018a4: SWAP1
000018a5: KECCAK256
000018a6: SLOAD
000018a7: SWAP1
000018a8: JUMP
000018a9: JUMPDEST
000018aa: PUSH1 0x40
000018ac: MLOAD
000018ad: PUSH3 0x82b429
000018b1: PUSH1 0xe8
000018b3: SHL
000018b4: DUP2
000018b5: MSTORE
000018b6: PUSH1 0x04
000018b8: ADD
000018b9: PUSH1 0x40
000018bb: MLOAD
000018bc: DUP1
000018bd: SWAP2
000018be: SUB
000018bf: SWAP1
000018c0: REVERT
000018c1: JUMPDEST
000018c2: PUSH2 0x18c9
000018c5: PUSH2 0x2c07
000018c8: JUMP
000018c9: JUMPDEST
000018ca: PUSH1 0x03
000018cc: SLOAD
000018cd: PUSH1 0xff
000018cf: AND
000018d0: PUSH2 0x18ec
000018d3: JUMPI
000018d4: PUSH1 0x40
000018d6: MLOAD
000018d7: PUSH4 0x0bc4868d
000018dc: PUSH1 0xe1
000018de: SHL
000018df: DUP2
000018e0: MSTORE
000018e1: PUSH1 0x04
000018e3: ADD
000018e4: PUSH1 0x40
000018e6: MLOAD
000018e7: DUP1
000018e8: SWAP2
000018e9: SUB
000018ea: SWAP1
000018eb: REVERT
000018ec: JUMPDEST
000018ed: PUSH32 0x000000000000000000000000d0f4de81e0b6e9d8018f2b8bf7f05da0edbc963f
0000190e: PUSH1 0x01
00001910: PUSH1 0x01
00001912: PUSH1 0xa0
00001914: SHL
00001915: SUB
00001916: AND
00001917: PUSH4 0x5c975abb
0000191c: PUSH1 0x40
0000191e: MLOAD
0000191f: DUP2
00001920: PUSH4 0xffffffff
00001925: AND
00001926: PUSH1 0xe0
00001928: SHL
00001929: DUP2
0000192a: MSTORE
0000192b: PUSH1 0x04
0000192d: ADD
0000192e: PUSH1 0x20
00001930: PUSH1 0x40
00001932: MLOAD
00001933: DUP1
00001934: DUP4
00001935: SUB
00001936: DUP2
00001937: DUP7
00001938: GAS
00001939: STATICCALL
0000193a: ISZERO
0000193b: DUP1
0000193c: ISZERO
0000193d: PUSH2 0x194a
00001940: JUMPI
00001941: RETURNDATASIZE
00001942: PUSH1 0x00
00001944: DUP1
00001945: RETURNDATACOPY
00001946: RETURNDATASIZE
00001947: PUSH1 0x00
00001949: REVERT
0000194a: JUMPDEST
0000194b: POP
0000194c: POP
0000194d: POP
0000194e: POP
0000194f: PUSH1 0x40
00001951: MLOAD
00001952: RETURNDATASIZE
00001953: PUSH1 0x1f
00001955: NOT
00001956: PUSH1 0x1f
00001958: DUP3
00001959: ADD
0000195a: AND
0000195b: DUP3
0000195c: ADD
0000195d: DUP1
0000195e: PUSH1 0x40
00001960: MSTORE
00001961: POP
00001962: DUP2
00001963: ADD
00001964: SWAP1
00001965: PUSH2 0x196e
00001968: SWAP2
00001969: SWAP1
0000196a: PUSH2 0x4110
0000196d: JUMP
0000196e: JUMPDEST
0000196f: ISZERO
00001970: PUSH2 0x198c
00001973: JUMPI
00001974: PUSH1 0x40
00001976: MLOAD
00001977: PUSH4 0xd69df317
0000197c: PUSH1 0xe0
0000197e: SHL
0000197f: DUP2
00001980: MSTORE
00001981: PUSH1 0x04
00001983: ADD
00001984: PUSH1 0x40
00001986: MLOAD
00001987: DUP1
00001988: SWAP2
00001989: SUB
0000198a: SWAP1
0000198b: REVERT
0000198c: JUMPDEST
0000198d: PUSH2 0x1994
00001990: PUSH2 0x2c3f
00001993: JUMP
00001994: JUMPDEST
00001995: PUSH1 0x40
00001997: MLOAD
00001998: PUSH4 0x139d99a1
0000199d: PUSH1 0xe0
0000199f: SHL
000019a0: DUP2
000019a1: MSTORE
000019a2: DUP2
000019a3: SWAP1
000019a4: PUSH1 0x01
000019a6: PUSH1 0x01
000019a8: PUSH1 0xa0
000019aa: SHL
000019ab: SUB
000019ac: PUSH32 0x000000000000000000000000d0f4de81e0b6e9d8018f2b8bf7f05da0edbc963f
000019cd: AND
000019ce: SWAP1
000019cf: PUSH4 0x139d99a1
000019d4: SWAP1
000019d5: PUSH2 0x19e4
000019d8: SWAP1
000019d9: CALLER
000019da: SWAP1
000019db: DUP6
000019dc: SWAP1
000019dd: PUSH1 0x04
000019df: ADD
000019e0: PUSH2 0x41a0
000019e3: JUMP
000019e4: JUMPDEST
000019e5: PUSH1 0x00
000019e7: PUSH1 0x40
000019e9: MLOAD
000019ea: DUP1
000019eb: DUP4
000019ec: SUB
000019ed: DUP2
000019ee: PUSH1 0x00
000019f0: DUP8
000019f1: DUP1
000019f2: EXTCODESIZE
000019f3: ISZERO
000019f4: DUP1
000019f5: ISZERO
000019f6: PUSH2 0x19fe
000019f9: JUMPI
000019fa: PUSH1 0x00
000019fc: DUP1
000019fd: REVERT
000019fe: JUMPDEST
000019ff: POP
00001a00: GAS
00001a01: CALL
00001a02: ISZERO
00001a03: DUP1
00001a04: ISZERO
00001a05: PUSH2 0x1a12
00001a08: JUMPI
00001a09: RETURNDATASIZE
00001a0a: PUSH1 0x00
00001a0c: DUP1
00001a0d: RETURNDATACOPY
00001a0e: RETURNDATASIZE
00001a0f: PUSH1 0x00
00001a11: REVERT
00001a12: JUMPDEST
00001a13: POP
00001a14: PUSH1 0x00
00001a16: SWAP3
00001a17: POP
00001a18: PUSH2 0x1a25
00001a1b: SWAP2
00001a1c: POP
00001a1d: DUP5
00001a1e: SWAP1
00001a1f: POP
00001a20: DUP1
00001a21: PUSH2 0x4216
00001a24: JUMP
00001a25: JUMPDEST
00001a26: DUP2
00001a27: ADD
00001a28: SWAP1
00001a29: PUSH2 0x1a32
00001a2c: SWAP2
00001a2d: SWAP1
00001a2e: PUSH2 0x473a
00001a31: JUMP
00001a32: JUMPDEST
00001a33: SWAP1
00001a34: POP
00001a35: PUSH2 0x1a41
00001a38: DUP2
00001a39: PUSH1 0x00
00001a3b: ADD
00001a3c: MLOAD
00001a3d: PUSH2 0x2f8c
00001a40: JUMP
00001a41: JUMPDEST
00001a42: PUSH2 0x1a4e
00001a45: DUP2
00001a46: PUSH1 0x20
00001a48: ADD
00001a49: MLOAD
00001a4a: PUSH2 0x32f2
00001a4d: JUMP
00001a4e: JUMPDEST
00001a4f: PUSH1 0x0c
00001a51: DUP1
00001a52: SLOAD
00001a53: PUSH1 0x01
00001a55: ADD
00001a56: SWAP1
00001a57: SSTORE
00001a58: PUSH1 0x40
00001a5a: MLOAD
00001a5b: PUSH32 0xc741dbaad15a4f298fe8d80943fa8e005e7bcb2f5b0a0c8dec1fc35be457f146
00001a7c: SWAP1
00001a7d: PUSH1 0x00
00001a7f: SWAP1
00001a80: LOG1
00001a81: POP
00001a82: POP
00001a83: PUSH2 0x0cf1
00001a86: PUSH1 0x01
00001a88: PUSH1 0x00
00001a8a: DUP1
00001a8b: MLOAD
00001a8c: PUSH1 0x20
00001a8e: PUSH2 0x4d30
00001a91: DUP4
00001a92: CODECOPY
00001a93: DUP2
00001a94: MLOAD
00001a95: SWAP2
00001a96: MSTORE
00001a97: SSTORE
00001a98: JUMP
00001a99: JUMPDEST
00001a9a: PUSH32 0x9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300
00001abb: SLOAD
00001abc: PUSH1 0x01
00001abe: PUSH1 0x01
00001ac0: PUSH1 0xa0
00001ac2: SHL
00001ac3: SUB
00001ac4: AND
00001ac5: SWAP1
00001ac6: JUMP
00001ac7: JUMPDEST
00001ac8: PUSH1 0x00
00001aca: DUP1
00001acb: PUSH2 0x1ad3
00001ace: CALLER
00001acf: PUSH2 0x1881
00001ad2: JUMP
00001ad3: JUMPDEST
00001ad4: SWAP1
00001ad5: POP
00001ad6: DUP3
00001ad7: DUP2
00001ad8: LT
00001ad9: ISZERO
00001ada: DUP1
00001adb: ISZERO
00001adc: PUSH2 0x1ae4
00001adf: JUMPI
00001ae0: POP
00001ae1: DUP3
00001ae2: ISZERO
00001ae3: ISZERO
00001ae4: JUMPDEST
00001ae5: DUP2
00001ae6: DUP5
00001ae7: SWAP1
00001ae8: SWAP2
00001ae9: PUSH2 0x1b0e
00001aec: JUMPI
00001aed: PUSH1 0x40
00001aef: MLOAD
00001af0: PUSH4 0x3a854faf
00001af5: PUSH1 0xe2
00001af7: SHL
00001af8: DUP2
00001af9: MSTORE
00001afa: PUSH1 0x04
00001afc: DUP2
00001afd: ADD
00001afe: SWAP3
00001aff: SWAP1
00001b00: SWAP3
00001b01: MSTORE
00001b02: PUSH1 0x24
00001b04: DUP3
00001b05: ADD
00001b06: MSTORE
00001b07: PUSH1 0x44
00001b09: ADD
00001b0a: PUSH2 0x0cac
00001b0d: JUMP
00001b0e: JUMPDEST
00001b0f: POP
00001b10: POP
00001b11: CALLER
00001b12: PUSH1 0x00
00001b14: SWAP1
00001b15: DUP2
00001b16: MSTORE
00001b17: PUSH1 0x11
00001b19: PUSH1 0x20
00001b1b: MSTORE
00001b1c: PUSH1 0x40
00001b1e: DUP2
00001b1f: KECCAK256
00001b20: SLOAD
00001b21: DUP3
00001b22: SWAP1
00001b23: DUP6
00001b24: MUL
00001b25: DUP2
00001b26: PUSH2 0x1b31
00001b29: JUMPI
00001b2a: PUSH2 0x1b31
00001b2d: PUSH2 0x45b2
00001b30: JUMP
00001b31: JUMPDEST
00001b32: CALLER
00001b33: PUSH1 0x00
00001b35: DUP2
00001b36: DUP2
00001b37: MSTORE
00001b38: PUSH1 0x11
00001b3a: PUSH1 0x20
00001b3c: MSTORE
00001b3d: PUSH1 0x40
00001b3f: DUP1
00001b40: DUP3
00001b41: KECCAK256
00001b42: DUP1
00001b43: SLOAD
00001b44: SWAP6
00001b45: SWAP1
00001b46: SWAP5
00001b47: DIV
00001b48: SWAP5
00001b49: DUP6
00001b4a: SWAP1
00001b4b: SUB
00001b4c: SWAP1
00001b4d: SWAP4
00001b4e: SSTORE
00001b4f: PUSH1 0x01
00001b51: PUSH1 0x01
00001b53: PUSH1 0xa0
00001b55: SHL
00001b56: SUB
00001b57: DUP10
00001b58: AND
00001b59: DUP2
00001b5a: MSTORE
00001b5b: SWAP2
00001b5c: SWAP1
00001b5d: SWAP2
00001b5e: KECCAK256
00001b5f: DUP1
00001b60: SLOAD
00001b61: SWAP1
00001b62: SWAP3
00001b63: ADD
00001b64: SWAP1
00001b65: SWAP2
00001b66: SSTORE
00001b67: PUSH2 0x094a
00001b6a: SWAP2
00001b6b: POP
00001b6c: DUP6
00001b6d: DUP6
00001b6e: PUSH2 0x3338
00001b71: JUMP
00001b72: JUMPDEST
00001b73: PUSH32 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00
00001b94: DUP1
00001b95: SLOAD
00001b96: PUSH1 0x01
00001b98: PUSH1 0x40
00001b9a: SHL
00001b9b: DUP2
00001b9c: DIV
00001b9d: PUSH1 0xff
00001b9f: AND
00001ba0: ISZERO
00001ba1: SWAP1
00001ba2: PUSH1 0x01
00001ba4: PUSH1 0x01
00001ba6: PUSH1 0x40
00001ba8: SHL
00001ba9: SUB
00001baa: AND
00001bab: PUSH1 0x00
00001bad: DUP2
00001bae: ISZERO
00001baf: DUP1
00001bb0: ISZERO
00001bb1: PUSH2 0x1bb7
00001bb4: JUMPI
00001bb5: POP
00001bb6: DUP3
00001bb7: JUMPDEST
00001bb8: SWAP1
00001bb9: POP
00001bba: PUSH1 0x00
00001bbc: DUP3
00001bbd: PUSH1 0x01
00001bbf: PUSH1 0x01
00001bc1: PUSH1 0x40
00001bc3: SHL
00001bc4: SUB
00001bc5: AND
00001bc6: PUSH1 0x01
00001bc8: EQ
00001bc9: DUP1
00001bca: ISZERO
00001bcb: PUSH2 0x1bd3
00001bce: JUMPI
00001bcf: POP
00001bd0: ADDRESS
00001bd1: EXTCODESIZE
00001bd2: ISZERO
00001bd3: JUMPDEST
00001bd4: SWAP1
00001bd5: POP
00001bd6: DUP2
00001bd7: ISZERO
00001bd8: DUP1
00001bd9: ISZERO
00001bda: PUSH2 0x1be1
00001bdd: JUMPI
00001bde: POP
00001bdf: DUP1
00001be0: ISZERO
00001be1: JUMPDEST
00001be2: ISZERO
00001be3: PUSH2 0x1bff
00001be6: JUMPI
00001be7: PUSH1 0x40
00001be9: MLOAD
00001bea: PUSH4 0xf92ee8a9
00001bef: PUSH1 0xe0
00001bf1: SHL
00001bf2: DUP2
00001bf3: MSTORE
00001bf4: PUSH1 0x04
00001bf6: ADD
00001bf7: PUSH1 0x40
00001bf9: MLOAD
00001bfa: DUP1
00001bfb: SWAP2
00001bfc: SUB
00001bfd: SWAP1
00001bfe: REVERT
00001bff: JUMPDEST
00001c00: DUP5
00001c01: SLOAD
00001c02: PUSH8 0xffffffffffffffff
00001c0b: NOT
00001c0c: AND
00001c0d: PUSH1 0x01
00001c0f: OR
00001c10: DUP6
00001c11: SSTORE
00001c12: DUP4
00001c13: ISZERO
00001c14: PUSH2 0x1c29
00001c17: JUMPI
00001c18: DUP5
00001c19: SLOAD
00001c1a: PUSH1 0xff
00001c1c: PUSH1 0x40
00001c1e: SHL
00001c1f: NOT
00001c20: AND
00001c21: PUSH1 0x01
00001c23: PUSH1 0x40
00001c25: SHL
00001c26: OR
00001c27: DUP6
00001c28: SSTORE
00001c29: JUMPDEST
00001c2a: CALLER
00001c2b: PUSH1 0x01
00001c2d: PUSH1 0x01
00001c2f: PUSH1 0xa0
00001c31: SHL
00001c32: SUB
00001c33: PUSH32 0x000000000000000000000000d0f4de81e0b6e9d8018f2b8bf7f05da0edbc963f
00001c54: AND
00001c55: EQ
00001c56: PUSH2 0x1c71
00001c59: JUMPI
00001c5a: PUSH1 0x40
00001c5c: MLOAD
00001c5d: PUSH3 0x82b429
00001c61: PUSH1 0xe8
00001c63: SHL
00001c64: DUP2
00001c65: MSTORE
00001c66: PUSH1 0x04
00001c68: ADD
00001c69: PUSH1 0x40
00001c6b: MLOAD
00001c6c: DUP1
00001c6d: SWAP2
00001c6e: SUB
00001c6f: SWAP1
00001c70: REVERT
00001c71: JUMPDEST
00001c72: PUSH1 0xe0
00001c74: DUP7
00001c75: ADD
00001c76: CALLDATALOAD
00001c77: PUSH3 0x76a700
00001c7b: DUP2
00001c7c: GT
00001c7d: ISZERO
00001c7e: PUSH2 0x1c9d
00001c81: JUMPI
00001c82: PUSH1 0x40
00001c84: MLOAD
00001c85: PUSH4 0x72c50e0d
00001c8a: PUSH1 0xe1
00001c8c: SHL
00001c8d: DUP2
00001c8e: MSTORE
00001c8f: PUSH1 0x04
00001c91: ADD
00001c92: PUSH2 0x0cac
00001c95: SWAP2
00001c96: DUP2
00001c97: MSTORE
00001c98: PUSH1 0x20
00001c9a: ADD
00001c9b: SWAP1
00001c9c: JUMP
00001c9d: JUMPDEST
00001c9e: POP
00001c9f: PUSH2 0x1daa
00001ca2: PUSH32 0x000000000000000000000000d0f4de81e0b6e9d8018f2b8bf7f05da0edbc963f
00001cc3: PUSH1 0x01
00001cc5: PUSH1 0x01
00001cc7: PUSH1 0xa0
00001cc9: SHL
00001cca: SUB
00001ccb: AND
00001ccc: PUSH4 0x3fc8cef3
00001cd1: PUSH1 0x40
00001cd3: MLOAD
00001cd4: DUP2
00001cd5: PUSH4 0xffffffff
00001cda: AND
00001cdb: PUSH1 0xe0
00001cdd: SHL
00001cde: DUP2
00001cdf: MSTORE
00001ce0: PUSH1 0x04
00001ce2: ADD
00001ce3: PUSH1 0x20
00001ce5: PUSH1 0x40
00001ce7: MLOAD
00001ce8: DUP1
00001ce9: DUP4
00001cea: SUB
00001ceb: DUP2
00001cec: DUP7
00001ced: GAS
00001cee: STATICCALL
00001cef: ISZERO
00001cf0: DUP1
00001cf1: ISZERO
00001cf2: PUSH2 0x1cff
00001cf5: JUMPI
00001cf6: RETURNDATASIZE
00001cf7: PUSH1 0x00
00001cf9: DUP1
00001cfa: RETURNDATACOPY
00001cfb: RETURNDATASIZE
00001cfc: PUSH1 0x00
00001cfe: REVERT
00001cff: JUMPDEST
00001d00: POP
00001d01: POP
00001d02: POP
00001d03: POP
00001d04: PUSH1 0x40
00001d06: MLOAD
00001d07: RETURNDATASIZE
00001d08: PUSH1 0x1f
00001d0a: NOT
00001d0b: PUSH1 0x1f
00001d0d: DUP3
00001d0e: ADD
00001d0f: AND
00001d10: DUP3
00001d11: ADD
00001d12: DUP1
00001d13: PUSH1 0x40
00001d15: MSTORE
00001d16: POP
00001d17: DUP2
00001d18: ADD
00001d19: SWAP1
00001d1a: PUSH2 0x1d23
00001d1d: SWAP2
00001d1e: SWAP1
00001d1f: PUSH2 0x40f3
00001d22: JUMP
00001d23: JUMPDEST
00001d24: PUSH32 0x000000000000000000000000d0f4de81e0b6e9d8018f2b8bf7f05da0edbc963f
00001d45: PUSH1 0x01
00001d47: PUSH1 0x01
00001d49: PUSH1 0xa0
00001d4b: SHL
00001d4c: SUB
00001d4d: AND
00001d4e: PUSH4 0xfbfa77cf
00001d53: PUSH1 0x40
00001d55: MLOAD
00001d56: DUP2
00001d57: PUSH4 0xffffffff
00001d5c: AND
00001d5d: PUSH1 0xe0
00001d5f: SHL
00001d60: DUP2
00001d61: MSTORE
00001d62: PUSH1 0x04
00001d64: ADD
00001d65: PUSH1 0x20
00001d67: PUSH1 0x40
00001d69: MLOAD
00001d6a: DUP1
00001d6b: DUP4
00001d6c: SUB
00001d6d: DUP2
00001d6e: DUP7
00001d6f: GAS
00001d70: STATICCALL
00001d71: ISZERO
00001d72: DUP1
00001d73: ISZERO
00001d74: PUSH2 0x1d81
00001d77: JUMPI
00001d78: RETURNDATASIZE
00001d79: PUSH1 0x00
00001d7b: DUP1
00001d7c: RETURNDATACOPY
00001d7d: RETURNDATASIZE
00001d7e: PUSH1 0x00
00001d80: REVERT
00001d81: JUMPDEST
00001d82: POP
00001d83: POP
00001d84: POP
00001d85: POP
00001d86: PUSH1 0x40
00001d88: MLOAD
00001d89: RETURNDATASIZE
00001d8a: PUSH1 0x1f
00001d8c: NOT
00001d8d: PUSH1 0x1f
00001d8f: DUP3
00001d90: ADD
00001d91: AND
00001d92: DUP3
00001d93: ADD
00001d94: DUP1
00001d95: PUSH1 0x40
00001d97: MSTORE
00001d98: POP
00001d99: DUP2
00001d9a: ADD
00001d9b: SWAP1
00001d9c: PUSH2 0x1da5
00001d9f: SWAP2
00001da0: SWAP1
00001da1: PUSH2 0x40f3
00001da4: JUMP
00001da5: JUMPDEST
00001da6: PUSH2 0x3397
00001da9: JUMP
00001daa: JUMPDEST
00001dab: PUSH2 0x1db3
00001dae: DUP12
00001daf: PUSH2 0x33cd
00001db2: JUMP
00001db3: JUMPDEST
00001db4: PUSH2 0x1e26
00001db7: DUP11
00001db8: DUP11
00001db9: DUP1
00001dba: DUP1
00001dbb: PUSH1 0x1f
00001dbd: ADD
00001dbe: PUSH1 0x20
00001dc0: DUP1
00001dc1: SWAP2
00001dc2: DIV
00001dc3: MUL
00001dc4: PUSH1 0x20
00001dc6: ADD
00001dc7: PUSH1 0x40
00001dc9: MLOAD
00001dca: SWAP1
00001dcb: DUP2
00001dcc: ADD
00001dcd: PUSH1 0x40
00001dcf: MSTORE
00001dd0: DUP1
00001dd1: SWAP4
00001dd2: SWAP3
00001dd3: SWAP2
00001dd4: SWAP1
00001dd5: DUP2
00001dd6: DUP2
00001dd7: MSTORE
00001dd8: PUSH1 0x20
00001dda: ADD
00001ddb: DUP4
00001ddc: DUP4
00001ddd: DUP1
00001dde: DUP3
00001ddf: DUP5
00001de0: CALLDATACOPY
00001de1: PUSH1 0x00
00001de3: SWAP3
00001de4: ADD
00001de5: SWAP2
00001de6: SWAP1
00001de7: SWAP2
00001de8: MSTORE
00001de9: POP
00001dea: POP
00001deb: PUSH1 0x40
00001ded: DUP1
00001dee: MLOAD
00001def: PUSH1 0x20
00001df1: PUSH1 0x1f
00001df3: DUP15
00001df4: ADD
00001df5: DUP2
00001df6: SWAP1
00001df7: DIV
00001df8: DUP2
00001df9: MUL
00001dfa: DUP3
00001dfb: ADD
00001dfc: DUP2
00001dfd: ADD
00001dfe: SWAP1
00001dff: SWAP3
00001e00: MSTORE
00001e01: DUP13
00001e02: DUP2
00001e03: MSTORE
00001e04: SWAP3
00001e05: POP
00001e06: DUP13
00001e07: SWAP2
00001e08: POP
00001e09: DUP12
00001e0a: SWAP1
00001e0b: DUP2
00001e0c: SWAP1
00001e0d: DUP5
00001e0e: ADD
00001e0f: DUP4
00001e10: DUP3
00001e11: DUP1
00001e12: DUP3
00001e13: DUP5
00001e14: CALLDATACOPY
00001e15: PUSH1 0x00
00001e17: SWAP3
00001e18: ADD
00001e19: SWAP2
00001e1a: SWAP1
00001e1b: SWAP2
00001e1c: MSTORE
00001e1d: POP
00001e1e: PUSH2 0x3408
00001e21: SWAP3
00001e22: POP
00001e23: POP
00001e24: POP
00001e25: JUMP
00001e26: JUMPDEST
00001e27: PUSH1 0xc0
00001e29: DUP7
00001e2a: ADD
00001e2b: CALLDATALOAD
00001e2c: PUSH1 0x0d
00001e2e: SSTORE
00001e2f: PUSH1 0xe0
00001e31: DUP7
00001e32: ADD
00001e33: CALLDATALOAD
00001e34: PUSH1 0x0e
00001e36: SSTORE
00001e37: TIMESTAMP
00001e38: PUSH1 0x0f
00001e3a: SSTORE
00001e3b: PUSH1 0x03
00001e3d: DUP1
00001e3e: SLOAD
00001e3f: PUSH1 0xff
00001e41: NOT
00001e42: AND
00001e43: PUSH1 0x01
00001e45: OR
00001e46: SWAP1
00001e47: SSTORE
00001e48: PUSH2 0x1e5d
00001e4b: PUSH2 0x1e58
00001e4e: PUSH1 0x40
00001e50: DUP9
00001e51: ADD
00001e52: CALLDATALOAD
00001e53: CALLVALUE
00001e54: PUSH2 0x459f
00001e57: JUMP
00001e58: JUMPDEST
00001e59: PUSH2 0x345f
00001e5c: JUMP
00001e5d: JUMPDEST
00001e5e: PUSH32 0x000000000000000000000000d0f4de81e0b6e9d8018f2b8bf7f05da0edbc963f
00001e7f: PUSH1 0x01
00001e81: PUSH1 0x01
00001e83: PUSH1 0xa0
00001e85: SHL
00001e86: SUB
00001e87: AND
00001e88: PUSH4 0x3fc8cef3
00001e8d: PUSH1 0x40
00001e8f: MLOAD
00001e90: DUP2
00001e91: PUSH4 0xffffffff
00001e96: AND
00001e97: PUSH1 0xe0
00001e99: SHL
00001e9a: DUP2
00001e9b: MSTORE
00001e9c: PUSH1 0x04
00001e9e: ADD
00001e9f: PUSH1 0x20
00001ea1: PUSH1 0x40
00001ea3: MLOAD
00001ea4: DUP1
00001ea5: DUP4
00001ea6: SUB
00001ea7: DUP2
00001ea8: DUP7
00001ea9: GAS
00001eaa: STATICCALL
00001eab: ISZERO
00001eac: DUP1
00001ead: ISZERO
00001eae: PUSH2 0x1ebb
00001eb1: JUMPI
00001eb2: RETURNDATASIZE
00001eb3: PUSH1 0x00
00001eb5: DUP1
00001eb6: RETURNDATACOPY
00001eb7: RETURNDATASIZE
00001eb8: PUSH1 0x00
00001eba: REVERT
00001ebb: JUMPDEST
00001ebc: POP
00001ebd: POP
00001ebe: POP
00001ebf: POP
00001ec0: PUSH1 0x40
00001ec2: MLOAD
00001ec3: RETURNDATASIZE
00001ec4: PUSH1 0x1f
00001ec6: NOT
00001ec7: PUSH1 0x1f
00001ec9: DUP3
00001eca: ADD
00001ecb: AND
00001ecc: DUP3
00001ecd: ADD
00001ece: DUP1
00001ecf: PUSH1 0x40
00001ed1: MSTORE
00001ed2: POP
00001ed3: DUP2
00001ed4: ADD
00001ed5: SWAP1
00001ed6: PUSH2 0x1edf
00001ed9: SWAP2
00001eda: SWAP1
00001edb: PUSH2 0x40f3
00001ede: JUMP
00001edf: JUMPDEST
00001ee0: PUSH1 0x04
00001ee2: DUP1
00001ee3: SLOAD
00001ee4: PUSH1 0x01
00001ee6: PUSH1 0x01
00001ee8: PUSH1 0xa0
00001eea: SHL
00001eeb: SUB
00001eec: NOT
00001eed: AND
00001eee: PUSH1 0x01
00001ef0: PUSH1 0x01
00001ef2: PUSH1 0xa0
00001ef4: SHL
00001ef5: SUB
00001ef6: SWAP3
00001ef7: SWAP1
00001ef8: SWAP3
00001ef9: AND
00001efa: SWAP2
00001efb: SWAP1
00001efc: SWAP2
00001efd: OR
00001efe: DUP2
00001eff: SSTORE
00001f00: PUSH1 0x40
00001f02: MLOAD
00001f03: PUSH32 0xc18e7f80e60372d1fd896a89b5550a10b4f712fcc8e4fc3a006f529617f1e737
00001f24: SWAP2
00001f25: PUSH2 0x1f2d
00001f28: SWAP2
00001f29: PUSH2 0x47c6
00001f2c: JUMP
00001f2d: JUMPDEST
00001f2e: PUSH1 0x40
00001f30: MLOAD
00001f31: DUP1
00001f32: SWAP2
00001f33: SUB
00001f34: SWAP1
00001f35: LOG1
00001f36: PUSH2 0x1f43
00001f39: DUP12
00001f3a: PUSH1 0x60
00001f3c: DUP9
00001f3d: ADD
00001f3e: CALLDATALOAD
00001f3f: PUSH2 0x3115
00001f42: JUMP
00001f43: JUMPDEST
00001f44: PUSH1 0x01
00001f46: PUSH1 0x01
00001f48: PUSH1 0xa0
00001f4a: SHL
00001f4b: SUB
00001f4c: DUP1
00001f4d: DUP13
00001f4e: AND
00001f4f: PUSH1 0x00
00001f51: SWAP1
00001f52: DUP2
00001f53: MSTORE
00001f54: PUSH1 0x11
00001f56: PUSH1 0x20
00001f58: SWAP1
00001f59: DUP2
00001f5a: MSTORE
00001f5b: PUSH1 0x40
00001f5d: SWAP2
00001f5e: DUP3
00001f5f: SWAP1
00001f60: KECCAK256
00001f61: PUSH1 0x60
00001f63: DUP11
00001f64: ADD
00001f65: CALLDATALOAD
00001f66: SWAP1
00001f67: SSTORE
00001f68: DUP2
00001f69: MLOAD
00001f6a: PUSH4 0x4c3d795b
00001f6f: PUSH1 0xe1
00001f71: SHL
00001f72: DUP2
00001f73: MSTORE
00001f74: SWAP2
00001f75: MLOAD
00001f76: PUSH2 0x1ff1
00001f79: SWAP4
00001f7a: PUSH32 0x000000000000000000000000d0f4de81e0b6e9d8018f2b8bf7f05da0edbc963f
00001f9b: AND
00001f9c: SWAP3
00001f9d: PUSH4 0x987af2b6
00001fa2: SWAP3
00001fa3: PUSH1 0x04
00001fa5: DUP1
00001fa6: DUP4
00001fa7: ADD
00001fa8: SWAP4
00001fa9: SWAP2
00001faa: SWAP3
00001fab: DUP3
00001fac: SWAP1
00001fad: SUB
00001fae: ADD
00001faf: DUP2
00001fb0: DUP7
00001fb1: GAS
00001fb2: STATICCALL
00001fb3: ISZERO
00001fb4: DUP1
00001fb5: ISZERO
00001fb6: PUSH2 0x1fc3
00001fb9: JUMPI
00001fba: RETURNDATASIZE
00001fbb: PUSH1 0x00
00001fbd: DUP1
00001fbe: RETURNDATACOPY
00001fbf: RETURNDATASIZE
00001fc0: PUSH1 0x00
00001fc2: REVERT
00001fc3: JUMPDEST
00001fc4: POP
00001fc5: POP
00001fc6: POP
00001fc7: POP
00001fc8: PUSH1 0x40
00001fca: MLOAD
00001fcb: RETURNDATASIZE
00001fcc: PUSH1 0x1f
00001fce: NOT
00001fcf: PUSH1 0x1f
00001fd1: DUP3
00001fd2: ADD
00001fd3: AND
00001fd4: DUP3
00001fd5: ADD
00001fd6: DUP1
00001fd7: PUSH1 0x40
00001fd9: MSTORE
00001fda: POP
00001fdb: DUP2
00001fdc: ADD
00001fdd: SWAP1
00001fde: PUSH2 0x1fe7
00001fe1: SWAP2
00001fe2: SWAP1
00001fe3: PUSH2 0x40f3
00001fe6: JUMP
00001fe7: JUMPDEST
00001fe8: PUSH1 0x40
00001fea: DUP9
00001feb: ADD
00001fec: CALLDATALOAD
00001fed: PUSH2 0x322f
00001ff0: JUMP
00001ff1: JUMPDEST
00001ff2: PUSH1 0x40
00001ff4: MLOAD
00001ff5: PUSH1 0x01
00001ff7: PUSH1 0x01
00001ff9: PUSH1 0xa0
00001ffb: SHL
00001ffc: SUB
00001ffd: DUP13
00001ffe: AND
00001fff: SWAP1
00002000: PUSH32 0x6f301d931e6dfbda4364250e68b430fb2357688c019bc4bd78f4627f3714c039
00002021: SWAP1
00002022: PUSH2 0x2035
00002025: SWAP1
00002026: PUSH1 0x60
00002028: DUP11
00002029: ADD
0000202a: DUP1
0000202b: CALLDATALOAD
0000202c: SWAP2
0000202d: DUP3
0000202e: SWAP2
0000202f: DUP13
00002030: SWAP2
00002031: PUSH2 0x47f8
00002034: JUMP
00002035: JUMPDEST
00002036: PUSH1 0x40
00002038: MLOAD
00002039: DUP1
0000203a: SWAP2
0000203b: SUB
0000203c: SWAP1
0000203d: LOG2
0000203e: DUP4
0000203f: ISZERO
00002040: PUSH2 0x2083
00002043: JUMPI
00002044: DUP5
00002045: SLOAD
00002046: PUSH1 0xff
00002048: PUSH1 0x40
0000204a: SHL
0000204b: NOT
0000204c: AND
0000204d: DUP6
0000204e: SSTORE
0000204f: PUSH1 0x40
00002051: MLOAD
00002052: PUSH1 0x01
00002054: DUP2
00002055: MSTORE
00002056: PUSH32 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2
00002077: SWAP1
00002078: PUSH1 0x20
0000207a: ADD
0000207b: PUSH1 0x40
0000207d: MLOAD
0000207e: DUP1
0000207f: SWAP2
00002080: SUB
00002081: SWAP1
00002082: LOG1
00002083: JUMPDEST
00002084: POP
00002085: POP
00002086: POP
00002087: POP
00002088: POP
00002089: POP
0000208a: POP
0000208b: POP
0000208c: POP
0000208d: POP
0000208e: POP
0000208f: JUMP
00002090: JUMPDEST
00002091: PUSH32 0x52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace04
000020b2: DUP1
000020b3: SLOAD
000020b4: PUSH1 0x60
000020b6: SWAP2
000020b7: PUSH1 0x00
000020b9: DUP1
000020ba: MLOAD
000020bb: PUSH1 0x20
000020bd: PUSH2 0x4d10
000020c0: DUP4
000020c1: CODECOPY
000020c2: DUP2
000020c3: MLOAD
000020c4: SWAP2
000020c5: MSTORE
000020c6: SWAP2
000020c7: PUSH2 0x08b8
000020ca: SWAP1
000020cb: PUSH2 0x40b9
000020ce: JUMP
000020cf: JUMPDEST
000020d0: PUSH2 0x20d7
000020d3: PUSH2 0x2c07
000020d6: JUMP
000020d7: JUMPDEST
000020d8: PUSH2 0x20df
000020db: PUSH2 0x2c3f
000020de: JUMP
000020df: JUMPDEST
000020e0: PUSH1 0x40
000020e2: MLOAD
000020e3: PUSH4 0x139d99a1
000020e8: PUSH1 0xe0
000020ea: SHL
000020eb: DUP2
000020ec: MSTORE
000020ed: DUP2
000020ee: SWAP1
000020ef: PUSH1 0x01
000020f1: PUSH1 0x01
000020f3: PUSH1 0xa0
000020f5: SHL
000020f6: SUB
000020f7: PUSH32 0x000000000000000000000000d0f4de81e0b6e9d8018f2b8bf7f05da0edbc963f
00002118: AND
00002119: SWAP1
0000211a: PUSH4 0x139d99a1
0000211f: SWAP1
00002120: PUSH2 0x212f
00002123: SWAP1
00002124: CALLER
00002125: SWAP1
00002126: DUP6
00002127: SWAP1
00002128: PUSH1 0x04
0000212a: ADD
0000212b: PUSH2 0x41a0
0000212e: JUMP
0000212f: JUMPDEST
00002130: PUSH1 0x00
00002132: PUSH1 0x40
00002134: MLOAD
00002135: DUP1
00002136: DUP4
00002137: SUB
00002138: DUP2
00002139: PUSH1 0x00
0000213b: DUP8
0000213c: DUP1
0000213d: EXTCODESIZE
0000213e: ISZERO
0000213f: DUP1
00002140: ISZERO
00002141: PUSH2 0x2149
00002144: JUMPI
00002145: PUSH1 0x00
00002147: DUP1
00002148: REVERT
00002149: JUMPDEST
0000214a: POP
0000214b: GAS
0000214c: CALL
0000214d: ISZERO
0000214e: DUP1
0000214f: ISZERO
00002150: PUSH2 0x215d
00002153: JUMPI
00002154: RETURNDATASIZE
00002155: PUSH1 0x00
00002157: DUP1
00002158: RETURNDATACOPY
00002159: RETURNDATASIZE
0000215a: PUSH1 0x00
0000215c: REVERT
0000215d: JUMPDEST
0000215e: POP
0000215f: PUSH1 0x00
00002161: SWAP3
00002162: POP
00002163: PUSH2 0x2170
00002166: SWAP2
00002167: POP
00002168: DUP5
00002169: SWAP1
0000216a: POP
0000216b: DUP1
0000216c: PUSH2 0x4216
0000216f: JUMP
00002170: JUMPDEST
00002171: DUP2
00002172: ADD
00002173: SWAP1
00002174: PUSH2 0x217d
00002177: SWAP2
00002178: SWAP1
00002179: PUSH2 0x484d
0000217c: JUMP
0000217d: JUMPDEST
0000217e: PUSH1 0x80
00002180: DUP2
00002181: ADD
00002182: MLOAD
00002183: SWAP1
00002184: SWAP2
00002185: POP
00002186: PUSH1 0x00
00002188: DUP2
00002189: SLT
0000218a: ISZERO
0000218b: PUSH2 0x21aa
0000218e: JUMPI
0000218f: PUSH1 0x40
00002191: MLOAD
00002192: PUSH4 0x1120b22f
00002197: PUSH1 0xe2
00002199: SHL
0000219a: DUP2
0000219b: MSTORE
0000219c: PUSH1 0x04
0000219e: ADD
0000219f: PUSH2 0x0cac
000021a2: SWAP2
000021a3: DUP2
000021a4: MSTORE
000021a5: PUSH1 0x20
000021a7: ADD
000021a8: SWAP1
000021a9: JUMP
000021aa: JUMPDEST
000021ab: POP
000021ac: DUP1
000021ad: MLOAD
000021ae: PUSH1 0x00
000021b0: SWAP1
000021b1: PUSH1 0x04
000021b3: SWAP1
000021b4: PUSH1 0xff
000021b6: AND
000021b7: PUSH1 0x08
000021b9: DUP2
000021ba: LT
000021bb: PUSH2 0x21c6
000021be: JUMPI
000021bf: PUSH2 0x21c6
000021c2: PUSH2 0x4603
000021c5: JUMP
000021c6: JUMPDEST
000021c7: ADD
000021c8: SLOAD
000021c9: PUSH1 0x01
000021cb: PUSH1 0x01
000021cd: PUSH1 0xa0
000021cf: SHL
000021d0: SUB
000021d1: AND
000021d2: EQ
000021d3: DUP1
000021d4: PUSH2 0x220d
000021d7: JUMPI
000021d8: POP
000021d9: DUP1
000021da: PUSH1 0x20
000021dc: ADD
000021dd: MLOAD
000021de: PUSH1 0x01
000021e0: PUSH1 0x01
000021e2: PUSH1 0xa0
000021e4: SHL
000021e5: SUB
000021e6: AND
000021e7: PUSH1 0x04
000021e9: DUP3
000021ea: PUSH1 0x00
000021ec: ADD
000021ed: MLOAD
000021ee: PUSH1 0xff
000021f0: AND
000021f1: PUSH1 0x08
000021f3: DUP2
000021f4: LT
000021f5: PUSH2 0x2200
000021f8: JUMPI
000021f9: PUSH2 0x2200
000021fc: PUSH2 0x4603
000021ff: JUMP
00002200: JUMPDEST
00002201: ADD
00002202: SLOAD
00002203: PUSH1 0x01
00002205: PUSH1 0x01
00002207: PUSH1 0xa0
00002209: SHL
0000220a: SUB
0000220b: AND
0000220c: EQ
0000220d: JUMPDEST
0000220e: DUP2
0000220f: MLOAD
00002210: PUSH1 0x04
00002212: PUSH1 0xff
00002214: DUP3
00002215: AND
00002216: PUSH1 0x08
00002218: DUP2
00002219: LT
0000221a: PUSH2 0x2225
0000221d: JUMPI
0000221e: PUSH2 0x2225
00002221: PUSH2 0x4603
00002224: JUMP
00002225: JUMPDEST
00002226: ADD
00002227: SLOAD
00002228: SWAP1
00002229: SWAP2
0000222a: PUSH1 0x01
0000222c: PUSH1 0x01
0000222e: PUSH1 0xa0
00002230: SHL
00002231: SUB
00002232: SWAP1
00002233: SWAP2
00002234: AND
00002235: SWAP1
00002236: PUSH2 0x2266
00002239: JUMPI
0000223a: PUSH1 0x40
0000223c: MLOAD
0000223d: PUSH4 0x3232f2d5
00002242: PUSH1 0xe2
00002244: SHL
00002245: DUP2
00002246: MSTORE
00002247: PUSH1 0xff
00002249: SWAP1
0000224a: SWAP3
0000224b: AND
0000224c: PUSH1 0x04
0000224e: DUP4
0000224f: ADD
00002250: MSTORE
00002251: PUSH1 0x01
00002253: PUSH1 0x01
00002255: PUSH1 0xa0
00002257: SHL
00002258: SUB
00002259: AND
0000225a: PUSH1 0x24
0000225c: DUP3
0000225d: ADD
0000225e: MSTORE
0000225f: PUSH1 0x44
00002261: ADD
00002262: PUSH2 0x0cac
00002265: JUMP
00002266: JUMPDEST
00002267: POP
00002268: POP
00002269: PUSH1 0x20
0000226b: DUP2
0000226c: ADD
0000226d: MLOAD
0000226e: DUP2
0000226f: MLOAD
00002270: PUSH1 0x04
00002272: SWAP1
00002273: PUSH1 0xff
00002275: AND
00002276: PUSH1 0x08
00002278: DUP2
00002279: LT
0000227a: PUSH2 0x2285
0000227d: JUMPI
0000227e: PUSH2 0x2285
00002281: PUSH2 0x4603
00002284: JUMP
00002285: JUMPDEST
00002286: ADD
00002287: DUP1
00002288: SLOAD
00002289: PUSH1 0x01
0000228b: PUSH1 0x01
0000228d: PUSH1 0xa0
0000228f: SHL
00002290: SUB
00002291: NOT
00002292: AND
00002293: PUSH1 0x01
00002295: PUSH1 0x01
00002297: PUSH1 0xa0
00002299: SHL
0000229a: SUB
0000229b: SWAP3
0000229c: DUP4
0000229d: AND
0000229e: OR
0000229f: SWAP1
000022a0: SSTORE
000022a1: PUSH1 0x40
000022a3: DUP3
000022a4: ADD
000022a5: MLOAD
000022a6: PUSH1 0x20
000022a8: DUP4
000022a9: ADD
000022aa: MLOAD
000022ab: PUSH2 0x22b9
000022ae: SWAP3
000022af: AND
000022b0: SWAP1
000022b1: CALLER
000022b2: SWAP1
000022b3: ADDRESS
000022b4: SWAP1
000022b5: PUSH2 0x3537
000022b8: JUMP
000022b9: JUMPDEST
000022ba: PUSH2 0x22c7
000022bd: CALLER
000022be: DUP3
000022bf: PUSH1 0x60
000022c1: ADD
000022c2: MLOAD
000022c3: PUSH2 0x3115
000022c6: JUMP
000022c7: JUMPDEST
000022c8: PUSH1 0x80
000022ca: DUP2
000022cb: ADD
000022cc: MLOAD
000022cd: CALLER
000022ce: PUSH1 0x00
000022d0: SWAP1
000022d1: DUP2
000022d2: MSTORE
000022d3: PUSH1 0x11
000022d5: PUSH1 0x20
000022d7: MSTORE
000022d8: PUSH1 0x40
000022da: DUP2
000022db: KECCAK256
000022dc: DUP1
000022dd: SLOAD
000022de: SWAP1
000022df: SWAP2
000022e0: SWAP1
000022e1: PUSH2 0x22eb
000022e4: SWAP1
000022e5: DUP5
000022e6: SWAP1
000022e7: PUSH2 0x4619
000022ea: JUMP
000022eb: JUMPDEST
000022ec: SWAP1
000022ed: SWAP2
000022ee: SSTORE
000022ef: POP
000022f0: POP
000022f1: PUSH1 0x20
000022f3: DUP1
000022f4: DUP3
000022f5: ADD
000022f6: MLOAD
000022f7: PUSH1 0x40
000022f9: DUP1
000022fa: DUP5
000022fb: ADD
000022fc: MLOAD
000022fd: PUSH1 0x80
000022ff: DUP6
00002300: ADD
00002301: MLOAD
00002302: DUP3
00002303: MLOAD
00002304: PUSH1 0x01
00002306: PUSH1 0x01
00002308: PUSH1 0xa0
0000230a: SHL
0000230b: SUB
0000230c: SWAP1
0000230d: SWAP5
0000230e: AND
0000230f: DUP5
00002310: MSTORE
00002311: SWAP4
00002312: DUP4
00002313: ADD
00002314: MSTORE
00002315: DUP2
00002316: ADD
00002317: SWAP2
00002318: SWAP1
00002319: SWAP2
0000231a: MSTORE
0000231b: PUSH32 0x241954c029f95a1524821b3549607058b38dfb162d5cf4381ad9f1ec5866827c
0000233c: SWAP1
0000233d: PUSH1 0x60
0000233f: ADD
00002340: PUSH1 0x40
00002342: MLOAD
00002343: DUP1
00002344: SWAP2
00002345: SUB
00002346: SWAP1
00002347: LOG1
00002348: POP
00002349: POP
0000234a: PUSH2 0x0cf1
0000234d: PUSH1 0x01
0000234f: PUSH1 0x00
00002351: DUP1
00002352: MLOAD
00002353: PUSH1 0x20
00002355: PUSH2 0x4d30
00002358: DUP4
00002359: CODECOPY
0000235a: DUP2
0000235b: MLOAD
0000235c: SWAP2
0000235d: MSTORE
0000235e: SSTORE
0000235f: JUMP
00002360: JUMPDEST
00002361: PUSH1 0x40
00002363: DUP1
00002364: MLOAD
00002365: DUP1
00002366: DUP3
00002367: ADD
00002368: SWAP1
00002369: SWAP2
0000236a: MSTORE
0000236b: PUSH1 0x00
0000236d: DUP2
0000236e: MSTORE
0000236f: PUSH1 0x60
00002371: PUSH1 0x20
00002373: DUP3
00002374: ADD
00002375: MSTORE
00002376: PUSH1 0x01
00002378: PUSH1 0x01
0000237a: PUSH1 0xa0
0000237c: SHL
0000237d: SUB
0000237e: DUP3
0000237f: AND
00002380: PUSH1 0x00
00002382: SWAP1
00002383: DUP2
00002384: MSTORE
00002385: PUSH1 0x12
00002387: PUSH1 0x20
00002389: SWAP1
0000238a: DUP2
0000238b: MSTORE
0000238c: PUSH1 0x40
0000238e: DUP1
0000238f: DUP4
00002390: KECCAK256
00002391: DUP2
00002392: MLOAD
00002393: DUP1
00002394: DUP4
00002395: ADD
00002396: DUP4
00002397: MSTORE
00002398: DUP2
00002399: SLOAD
0000239a: DUP2
0000239b: MSTORE
0000239c: PUSH1 0x01
0000239e: DUP3
0000239f: ADD
000023a0: DUP1
000023a1: SLOAD
000023a2: DUP5
000023a3: MLOAD
000023a4: DUP2
000023a5: DUP8
000023a6: MUL
000023a7: DUP2
000023a8: ADD
000023a9: DUP8
000023aa: ADD
000023ab: SWAP1
000023ac: SWAP6
000023ad: MSTORE
000023ae: DUP1
000023af: DUP6
000023b0: MSTORE
000023b1: SWAP2
000023b2: SWAP6
000023b3: SWAP3
000023b4: SWAP5
000023b5: DUP7
000023b6: DUP2
000023b7: ADD
000023b8: SWAP5
000023b9: SWAP4
000023ba: SWAP2
000023bb: SWAP3
000023bc: SWAP2
000023bd: SWAP1
000023be: DUP5
000023bf: ADD
000023c0: JUMPDEST
000023c1: DUP3
000023c2: DUP3
000023c3: LT
000023c4: ISZERO
000023c5: PUSH2 0x2406
000023c8: JUMPI
000023c9: DUP4
000023ca: DUP3
000023cb: SWAP1
000023cc: PUSH1 0x00
000023ce: MSTORE
000023cf: PUSH1 0x20
000023d1: PUSH1 0x00
000023d3: KECCAK256
000023d4: SWAP1
000023d5: PUSH1 0x02
000023d7: MUL
000023d8: ADD
000023d9: PUSH1 0x40
000023db: MLOAD
000023dc: DUP1
000023dd: PUSH1 0x40
000023df: ADD
000023e0: PUSH1 0x40
000023e2: MSTORE
000023e3: SWAP1
000023e4: DUP2
000023e5: PUSH1 0x00
000023e7: DUP3
000023e8: ADD
000023e9: SLOAD
000023ea: DUP2
000023eb: MSTORE
000023ec: PUSH1 0x20
000023ee: ADD
000023ef: PUSH1 0x01
000023f1: DUP3
000023f2: ADD
000023f3: SLOAD
000023f4: DUP2
000023f5: MSTORE
000023f6: POP
000023f7: POP
000023f8: DUP2
000023f9: MSTORE
000023fa: PUSH1 0x20
000023fc: ADD
000023fd: SWAP1
000023fe: PUSH1 0x01
00002400: ADD
00002401: SWAP1
00002402: PUSH2 0x23c0
00002405: JUMP
00002406: JUMPDEST
00002407: POP
00002408: POP
00002409: POP
0000240a: SWAP2
0000240b: MSTORE
0000240c: POP
0000240d: SWAP1
0000240e: SWAP4
0000240f: SWAP3
00002410: POP
00002411: POP
00002412: POP
00002413: JUMP
00002414: JUMPDEST
00002415: PUSH1 0x04
00002417: DUP2
00002418: PUSH1 0x08
0000241a: DUP2
0000241b: LT
0000241c: PUSH2 0x2424
0000241f: JUMPI
00002420: PUSH1 0x00
00002422: DUP1
00002423: REVERT
00002424: JUMPDEST
00002425: ADD
00002426: SLOAD
00002427: PUSH1 0x01
00002429: PUSH1 0x01
0000242b: PUSH1 0xa0
0000242d: SHL
0000242e: SUB
0000242f: AND
00002430: SWAP1
00002431: POP
00002432: DUP2
00002433: JUMP
00002434: JUMPDEST
00002435: PUSH2 0x243c
00002438: PUSH2 0x2c07
0000243b: JUMP
0000243c: JUMPDEST
0000243d: PUSH1 0x03
0000243f: SLOAD
00002440: PUSH1 0xff
00002442: AND
00002443: PUSH2 0x245f
00002446: JUMPI
00002447: PUSH1 0x40
00002449: MLOAD
0000244a: PUSH4 0x0bc4868d
0000244f: PUSH1 0xe1
00002451: SHL
00002452: DUP2
00002453: MSTORE
00002454: PUSH1 0x04
00002456: ADD
00002457: PUSH1 0x40
00002459: MLOAD
0000245a: DUP1
0000245b: SWAP2
0000245c: SUB
0000245d: SWAP1
0000245e: REVERT
0000245f: JUMPDEST
00002460: PUSH32 0x000000000000000000000000d0f4de81e0b6e9d8018f2b8bf7f05da0edbc963f
00002481: PUSH1 0x01
00002483: PUSH1 0x01
00002485: PUSH1 0xa0
00002487: SHL
00002488: SUB
00002489: AND
0000248a: PUSH4 0x5c975abb
0000248f: PUSH1 0x40
00002491: MLOAD
00002492: DUP2
00002493: PUSH4 0xffffffff
00002498: AND
00002499: PUSH1 0xe0
0000249b: SHL
0000249c: DUP2
0000249d: MSTORE
0000249e: PUSH1 0x04
000024a0: ADD
000024a1: PUSH1 0x20
000024a3: PUSH1 0x40
000024a5: MLOAD
000024a6: DUP1
000024a7: DUP4
000024a8: SUB
000024a9: DUP2
000024aa: DUP7
000024ab: GAS
000024ac: STATICCALL
000024ad: ISZERO
000024ae: DUP1
000024af: ISZERO
000024b0: PUSH2 0x24bd
000024b3: JUMPI
000024b4: RETURNDATASIZE
000024b5: PUSH1 0x00
000024b7: DUP1
000024b8: RETURNDATACOPY
000024b9: RETURNDATASIZE
000024ba: PUSH1 0x00
000024bc: REVERT
000024bd: JUMPDEST
000024be: POP
000024bf: POP
000024c0: POP
000024c1: POP
000024c2: PUSH1 0x40
000024c4: MLOAD
000024c5: RETURNDATASIZE
000024c6: PUSH1 0x1f
000024c8: NOT
000024c9: PUSH1 0x1f
000024cb: DUP3
000024cc: ADD
000024cd: AND
000024ce: DUP3
000024cf: ADD
000024d0: DUP1
000024d1: PUSH1 0x40
000024d3: MSTORE
000024d4: POP
000024d5: DUP2
000024d6: ADD
000024d7: SWAP1
000024d8: PUSH2 0x24e1
000024db: SWAP2
000024dc: SWAP1
000024dd: PUSH2 0x4110
000024e0: JUMP
000024e1: JUMPDEST
000024e2: ISZERO
000024e3: PUSH2 0x24ff
000024e6: JUMPI
000024e7: PUSH1 0x40
000024e9: MLOAD
000024ea: PUSH4 0xd69df317
000024ef: PUSH1 0xe0
000024f1: SHL
000024f2: DUP2
000024f3: MSTORE
000024f4: PUSH1 0x04
000024f6: ADD
000024f7: PUSH1 0x40
000024f9: MLOAD
000024fa: DUP1
000024fb: SWAP2
000024fc: SUB
000024fd: SWAP1
000024fe: REVERT
000024ff: JUMPDEST
00002500: PUSH1 0x40
00002502: MLOAD
00002503: PUSH4 0x139d99a1
00002508: PUSH1 0xe0
0000250a: SHL
0000250b: DUP2
0000250c: MSTORE
0000250d: DUP2
0000250e: SWAP1
0000250f: PUSH1 0x01
00002511: PUSH1 0x01
00002513: PUSH1 0xa0
00002515: SHL
00002516: SUB
00002517: PUSH32 0x000000000000000000000000d0f4de81e0b6e9d8018f2b8bf7f05da0edbc963f
00002538: AND
00002539: SWAP1
0000253a: PUSH4 0x139d99a1
0000253f: SWAP1
00002540: PUSH2 0x254f
00002543: SWAP1
00002544: CALLER
00002545: SWAP1
00002546: DUP6
00002547: SWAP1
00002548: PUSH1 0x04
0000254a: ADD
0000254b: PUSH2 0x41a0
0000254e: JUMP
0000254f: JUMPDEST
00002550: PUSH1 0x00
00002552: PUSH1 0x40
00002554: MLOAD
00002555: DUP1
00002556: DUP4
00002557: SUB
00002558: DUP2
00002559: PUSH1 0x00
0000255b: DUP8
0000255c: DUP1
0000255d: EXTCODESIZE
0000255e: ISZERO
0000255f: DUP1
00002560: ISZERO
00002561: PUSH2 0x2569
00002564: JUMPI
00002565: PUSH1 0x00
00002567: DUP1
00002568: REVERT
00002569: JUMPDEST
0000256a: POP
0000256b: GAS
0000256c: CALL
0000256d: ISZERO
0000256e: DUP1
0000256f: ISZERO
00002570: PUSH2 0x257d
00002573: JUMPI
00002574: RETURNDATASIZE
00002575: PUSH1 0x00
00002577: DUP1
00002578: RETURNDATACOPY
00002579: RETURNDATASIZE
0000257a: PUSH1 0x00
0000257c: REVERT
0000257d: JUMPDEST
0000257e: POP
0000257f: POP
00002580: POP
00002581: POP
00002582: PUSH32 0x000000000000000000000000d0f4de81e0b6e9d8018f2b8bf7f05da0edbc963f
000025a3: PUSH1 0x01
000025a5: PUSH1 0x01
000025a7: PUSH1 0xa0
000025a9: SHL
000025aa: SUB
000025ab: AND
000025ac: PUSH4 0xf851a440
000025b1: PUSH1 0x40
000025b3: MLOAD
000025b4: DUP2
000025b5: PUSH4 0xffffffff
000025ba: AND
000025bb: PUSH1 0xe0
000025bd: SHL
000025be: DUP2
000025bf: MSTORE
000025c0: PUSH1 0x04
000025c2: ADD
000025c3: PUSH1 0x20
000025c5: PUSH1 0x40
000025c7: MLOAD
000025c8: DUP1
000025c9: DUP4
000025ca: SUB
000025cb: DUP2
000025cc: DUP7
000025cd: GAS
000025ce: STATICCALL
000025cf: ISZERO
000025d0: DUP1
000025d1: ISZERO
000025d2: PUSH2 0x25df
000025d5: JUMPI
000025d6: RETURNDATASIZE
000025d7: PUSH1 0x00
000025d9: DUP1
000025da: RETURNDATACOPY
000025db: RETURNDATASIZE
000025dc: PUSH1 0x00
000025de: REVERT
000025df: JUMPDEST
000025e0: POP
000025e1: POP
000025e2: POP
000025e3: POP
000025e4: PUSH1 0x40
000025e6: MLOAD
000025e7: RETURNDATASIZE
000025e8: PUSH1 0x1f
000025ea: NOT
000025eb: PUSH1 0x1f
000025ed: DUP3
000025ee: ADD
000025ef: AND
000025f0: DUP3
000025f1: ADD
000025f2: DUP1
000025f3: PUSH1 0x40
000025f5: MSTORE
000025f6: POP
000025f7: DUP2
000025f8: ADD
000025f9: SWAP1
000025fa: PUSH2 0x2603
000025fd: SWAP2
000025fe: SWAP1
000025ff: PUSH2 0x40f3
00002602: JUMP
00002603: JUMPDEST
00002604: PUSH1 0x01
00002606: PUSH1 0x01
00002608: PUSH1 0xa0
0000260a: SHL
0000260b: SUB
0000260c: AND
0000260d: CALLER
0000260e: SUB
0000260f: PUSH2 0x262a
00002612: JUMPI
00002613: PUSH1 0x40
00002615: MLOAD
00002616: PUSH3 0x82b429
0000261a: PUSH1 0xe8
0000261c: SHL
0000261d: DUP2
0000261e: MSTORE
0000261f: PUSH1 0x04
00002621: ADD
00002622: PUSH1 0x40
00002624: MLOAD
00002625: DUP1
00002626: SWAP2
00002627: SUB
00002628: SWAP1
00002629: REVERT
0000262a: JUMPDEST
0000262b: PUSH1 0x00
0000262d: PUSH2 0x2636
00002630: DUP4
00002631: DUP1
00002632: PUSH2 0x4216
00002635: JUMP
00002636: JUMPDEST
00002637: DUP2
00002638: ADD
00002639: SWAP1
0000263a: PUSH2 0x2643
0000263d: SWAP2
0000263e: SWAP1
0000263f: PUSH2 0x4906
00002642: JUMP
00002643: JUMPDEST
00002644: PUSH1 0x0c
00002646: SLOAD
00002647: DUP2
00002648: MLOAD
00002649: SWAP2
0000264a: SWAP3
0000264b: POP
0000264c: DUP2
0000264d: DUP2
0000264e: EQ
0000264f: PUSH2 0x2674
00002652: JUMPI
00002653: PUSH1 0x40
00002655: MLOAD
00002656: PUSH4 0x538d84ef
0000265b: PUSH1 0xe1
0000265d: SHL
0000265e: DUP2
0000265f: MSTORE
00002660: PUSH1 0x04
00002662: DUP2
00002663: ADD
00002664: SWAP3
00002665: SWAP1
00002666: SWAP3
00002667: MSTORE
00002668: PUSH1 0x24
0000266a: DUP3
0000266b: ADD
0000266c: MSTORE
0000266d: PUSH1 0x44
0000266f: ADD
00002670: PUSH2 0x0cac
00002673: JUMP
00002674: JUMPDEST
00002675: POP
00002676: POP
00002677: PUSH1 0xc0
00002679: DUP2
0000267a: ADD
0000267b: MLOAD
0000267c: PUSH1 0x00
0000267e: DUP2
0000267f: SLT
00002680: ISZERO
00002681: PUSH2 0x26a0
00002684: JUMPI
00002685: PUSH1 0x40
00002687: MLOAD
00002688: PUSH4 0x1120b22f
0000268d: PUSH1 0xe2
0000268f: SHL
00002690: DUP2
00002691: MSTORE
00002692: PUSH1 0x04
00002694: ADD
00002695: PUSH2 0x0cac
00002698: SWAP2
00002699: DUP2
0000269a: MSTORE
0000269b: PUSH1 0x20
0000269d: ADD
0000269e: SWAP1
0000269f: JUMP
000026a0: JUMPDEST
000026a1: POP
000026a2: PUSH1 0x20
000026a4: DUP1
000026a5: DUP3
000026a6: ADD
000026a7: MLOAD
000026a8: PUSH1 0x40
000026aa: DUP2
000026ab: ADD
000026ac: MLOAD
000026ad: SWAP2
000026ae: ADD
000026af: MLOAD
000026b0: PUSH1 0x00
000026b2: SWAP2
000026b3: PUSH2 0x26bb
000026b6: SWAP2
000026b7: PUSH2 0x4619
000026ba: JUMP
000026bb: JUMPDEST
000026bc: SWAP1
000026bd: POP
000026be: PUSH3 0x0186a0
000026c2: PUSH32 0x000000000000000000000000d0f4de81e0b6e9d8018f2b8bf7f05da0edbc963f
000026e3: PUSH1 0x01
000026e5: PUSH1 0x01
000026e7: PUSH1 0xa0
000026e9: SHL
000026ea: SUB
000026eb: AND
000026ec: PUSH4 0x7cd3d277
000026f1: PUSH1 0x40
000026f3: MLOAD
000026f4: DUP2
000026f5: PUSH4 0xffffffff
000026fa: AND
000026fb: PUSH1 0xe0
000026fd: SHL
000026fe: DUP2
000026ff: MSTORE
00002700: PUSH1 0x04
00002702: ADD
00002703: PUSH1 0x20
00002705: PUSH1 0x40
00002707: MLOAD
00002708: DUP1
00002709: DUP4
0000270a: SUB
0000270b: DUP2
0000270c: DUP7
0000270d: GAS
0000270e: STATICCALL
0000270f: ISZERO
00002710: DUP1
00002711: ISZERO
00002712: PUSH2 0x271f
00002715: JUMPI
00002716: RETURNDATASIZE
00002717: PUSH1 0x00
00002719: DUP1
0000271a: RETURNDATACOPY
0000271b: RETURNDATASIZE
0000271c: PUSH1 0x00
0000271e: REVERT
0000271f: JUMPDEST
00002720: POP
00002721: POP
00002722: POP
00002723: POP
00002724: PUSH1 0x40
00002726: MLOAD
00002727: RETURNDATASIZE
00002728: PUSH1 0x1f
0000272a: NOT
0000272b: PUSH1 0x1f
0000272d: DUP3
0000272e: ADD
0000272f: AND
00002730: DUP3
00002731: ADD
00002732: DUP1
00002733: PUSH1 0x40
00002735: MSTORE
00002736: POP
00002737: DUP2
00002738: ADD
00002739: SWAP1
0000273a: PUSH2 0x2743
0000273d: SWAP2
0000273e: SWAP1
0000273f: PUSH2 0x49cd
00002742: JUMP
00002743: JUMPDEST
00002744: PUSH2 0x2751
00002747: SWAP1
00002748: PUSH2 0xffff
0000274b: AND
0000274c: CALLVALUE
0000274d: PUSH2 0x49f1
00002750: JUMP
00002751: JUMPDEST
00002752: PUSH2 0x275b
00002755: SWAP2
00002756: SWAP1
00002757: PUSH2 0x45c8
0000275a: JUMP
0000275b: JUMPDEST
0000275c: DUP2
0000275d: GT
0000275e: ISZERO
0000275f: DUP1
00002760: ISZERO
00002761: PUSH2 0x2776
00002764: JUMPI
00002765: POP
00002766: PUSH1 0xa0
00002768: DUP3
00002769: ADD
0000276a: MLOAD
0000276b: PUSH1 0x01
0000276d: PUSH1 0x01
0000276f: PUSH1 0xa0
00002771: SHL
00002772: SUB
00002773: AND
00002774: ISZERO
00002775: ISZERO
00002776: JUMPDEST
00002777: DUP2
00002778: PUSH32 0x000000000000000000000000d0f4de81e0b6e9d8018f2b8bf7f05da0edbc963f
00002799: PUSH1 0x01
0000279b: PUSH1 0x01
0000279d: PUSH1 0xa0
0000279f: SHL
000027a0: SUB
000027a1: AND
000027a2: PUSH4 0x7cd3d277
000027a7: PUSH1 0x40
000027a9: MLOAD
000027aa: DUP2
000027ab: PUSH4 0xffffffff
000027b0: AND
000027b1: PUSH1 0xe0
000027b3: SHL
000027b4: DUP2
000027b5: MSTORE
000027b6: PUSH1 0x04
000027b8: ADD
000027b9: PUSH1 0x20
000027bb: PUSH1 0x40
000027bd: MLOAD
000027be: DUP1
000027bf: DUP4
000027c0: SUB
000027c1: DUP2
000027c2: DUP7
000027c3: GAS
000027c4: STATICCALL
000027c5: ISZERO
000027c6: DUP1
000027c7: ISZERO
000027c8: PUSH2 0x27d5
000027cb: JUMPI
000027cc: RETURNDATASIZE
000027cd: PUSH1 0x00
000027cf: DUP1
000027d0: RETURNDATACOPY
000027d1: RETURNDATASIZE
000027d2: PUSH1 0x00
000027d4: REVERT
000027d5: JUMPDEST
000027d6: POP
000027d7: POP
000027d8: POP
000027d9: POP
000027da: PUSH1 0x40
000027dc: MLOAD
000027dd: RETURNDATASIZE
000027de: PUSH1 0x1f
000027e0: NOT
000027e1: PUSH1 0x1f
000027e3: DUP3
000027e4: ADD
000027e5: AND
000027e6: DUP3
000027e7: ADD
000027e8: DUP1
000027e9: PUSH1 0x40
000027eb: MSTORE
000027ec: POP
000027ed: DUP2
000027ee: ADD
000027ef: SWAP1
000027f0: PUSH2 0x27f9
000027f3: SWAP2
000027f4: SWAP1
000027f5: PUSH2 0x49cd
000027f8: JUMP
000027f9: JUMPDEST
000027fa: DUP5
000027fb: PUSH1 0xa0
000027fd: ADD
000027fe: MLOAD
000027ff: SWAP1
00002800: SWAP2
00002801: SWAP3
00002802: PUSH2 0x283b
00002805: JUMPI
00002806: PUSH1 0x40
00002808: MLOAD
00002809: PUSH4 0xd956e22b
0000280e: PUSH1 0xe0
00002810: SHL
00002811: DUP2
00002812: MSTORE
00002813: PUSH1 0x04
00002815: DUP2
00002816: ADD
00002817: SWAP4
00002818: SWAP1
00002819: SWAP4
0000281a: MSTORE
0000281b: PUSH2 0xffff
0000281e: SWAP1
0000281f: SWAP2
00002820: AND
00002821: PUSH1 0x24
00002823: DUP4
00002824: ADD
00002825: MSTORE
00002826: PUSH1 0x01
00002828: PUSH1 0x01
0000282a: PUSH1 0xa0
0000282c: SHL
0000282d: SUB
0000282e: AND
0000282f: PUSH1 0x44
00002831: DUP3
00002832: ADD
00002833: MSTORE
00002834: PUSH1 0x64
00002836: ADD
00002837: PUSH2 0x0cac
0000283a: JUMP
0000283b: JUMPDEST
0000283c: POP
0000283d: POP
0000283e: POP
0000283f: PUSH1 0x00
00002841: DUP2
00002842: CALLVALUE
00002843: PUSH2 0x284c
00002846: SWAP2
00002847: SWAP1
00002848: PUSH2 0x459f
0000284b: JUMP
0000284c: JUMPDEST
0000284d: PUSH1 0x20
0000284f: DUP5
00002850: ADD
00002851: MLOAD
00002852: DUP1
00002853: MLOAD
00002854: SWAP2
00002855: SWAP3
00002856: POP
00002857: SWAP1
00002858: DUP3
00002859: SWAP1
0000285a: DUP2
0000285b: EQ
0000285c: PUSH2 0x2892
0000285f: JUMPI
00002860: PUSH1 0x40
00002862: DUP1
00002863: MLOAD
00002864: PUSH3 0xec5dcb
00002868: PUSH1 0xe8
0000286a: SHL
0000286b: DUP2
0000286c: MSTORE
0000286d: DUP4
0000286e: MLOAD
0000286f: PUSH1 0x04
00002871: DUP3
00002872: ADD
00002873: MSTORE
00002874: PUSH1 0x20
00002876: DUP5
00002877: ADD
00002878: MLOAD
00002879: PUSH1 0x24
0000287b: DUP3
0000287c: ADD
0000287d: MSTORE
0000287e: SWAP3
0000287f: ADD
00002880: MLOAD
00002881: PUSH1 0x44
00002883: DUP4
00002884: ADD
00002885: MSTORE
00002886: PUSH1 0x64
00002888: DUP3
00002889: ADD
0000288a: MSTORE
0000288b: PUSH1 0x84
0000288d: ADD
0000288e: PUSH2 0x0cac
00002891: JUMP
00002892: JUMPDEST
00002893: POP
00002894: POP
00002895: PUSH2 0x289d
00002898: DUP2
00002899: PUSH2 0x345f
0000289c: JUMP
0000289d: JUMPDEST
0000289e: PUSH2 0x28aa
000028a1: DUP4
000028a2: PUSH1 0x60
000028a4: ADD
000028a5: MLOAD
000028a6: PUSH2 0x32f2
000028a9: JUMP
000028aa: JUMPDEST
000028ab: PUSH2 0x28b8
000028ae: CALLER
000028af: DUP5
000028b0: PUSH1 0x80
000028b2: ADD
000028b3: MLOAD
000028b4: PUSH2 0x3115
000028b7: JUMP
000028b8: JUMPDEST
000028b9: PUSH1 0xc0
000028bb: DUP4
000028bc: ADD
000028bd: MLOAD
000028be: CALLER
000028bf: PUSH1 0x00
000028c1: SWAP1
000028c2: DUP2
000028c3: MSTORE
000028c4: PUSH1 0x11
000028c6: PUSH1 0x20
000028c8: MSTORE
000028c9: PUSH1 0x40
000028cb: DUP2
000028cc: KECCAK256
000028cd: DUP1
000028ce: SLOAD
000028cf: SWAP1
000028d0: SWAP2
000028d1: SWAP1
000028d2: PUSH2 0x28dc
000028d5: SWAP1
000028d6: DUP5
000028d7: SWAP1
000028d8: PUSH2 0x4619
000028db: JUMP
000028dc: JUMPDEST
000028dd: SWAP1
000028de: SWAP2
000028df: SSTORE
000028e0: POP
000028e1: POP
000028e2: PUSH1 0x20
000028e4: DUP1
000028e5: DUP5
000028e6: ADD
000028e7: MLOAD
000028e8: ADD
000028e9: MLOAD
000028ea: ISZERO
000028eb: PUSH2 0x2904
000028ee: JUMPI
000028ef: PUSH2 0x2904
000028f2: DUP4
000028f3: PUSH1 0xa0
000028f5: ADD
000028f6: MLOAD
000028f7: DUP5
000028f8: PUSH1 0x20
000028fa: ADD
000028fb: MLOAD
000028fc: PUSH1 0x20
000028fe: ADD
000028ff: MLOAD
00002900: PUSH2 0x322f
00002903: JUMP
00002904: JUMPDEST
00002905: PUSH1 0x20
00002907: DUP4
00002908: ADD
00002909: MLOAD
0000290a: PUSH1 0x40
0000290c: ADD
0000290d: MLOAD
0000290e: ISZERO
0000290f: PUSH2 0x29a5
00002912: JUMPI
00002913: PUSH2 0x29a5
00002916: PUSH32 0x000000000000000000000000d0f4de81e0b6e9d8018f2b8bf7f05da0edbc963f
00002937: PUSH1 0x01
00002939: PUSH1 0x01
0000293b: PUSH1 0xa0
0000293d: SHL
0000293e: SUB
0000293f: AND
00002940: PUSH4 0x987af2b6
00002945: PUSH1 0x40
00002947: MLOAD
00002948: DUP2
00002949: PUSH4 0xffffffff
0000294e: AND
0000294f: PUSH1 0xe0
00002951: SHL
00002952: DUP2
00002953: MSTORE
00002954: PUSH1 0x04
00002956: ADD
00002957: PUSH1 0x20
00002959: PUSH1 0x40
0000295b: MLOAD
0000295c: DUP1
0000295d: DUP4
0000295e: SUB
0000295f: DUP2
00002960: DUP7
00002961: GAS
00002962: STATICCALL
00002963: ISZERO
00002964: DUP1
00002965: ISZERO
00002966: PUSH2 0x2973
00002969: JUMPI
0000296a: RETURNDATASIZE
0000296b: PUSH1 0x00
0000296d: DUP1
0000296e: RETURNDATACOPY
0000296f: RETURNDATASIZE
00002970: PUSH1 0x00
00002972: REVERT
00002973: JUMPDEST
00002974: POP
00002975: POP
00002976: POP
00002977: POP
00002978: PUSH1 0x40
0000297a: MLOAD
0000297b: RETURNDATASIZE
0000297c: PUSH1 0x1f
0000297e: NOT
0000297f: PUSH1 0x1f
00002981: DUP3
00002982: ADD
00002983: AND
00002984: DUP3
00002985: ADD
00002986: DUP1
00002987: PUSH1 0x40
00002989: MSTORE
0000298a: POP
0000298b: DUP2
0000298c: ADD
0000298d: SWAP1
0000298e: PUSH2 0x2997
00002991: SWAP2
00002992: SWAP1
00002993: PUSH2 0x40f3
00002996: JUMP
00002997: JUMPDEST
00002998: DUP5
00002999: PUSH1 0x20
0000299b: ADD
0000299c: MLOAD
0000299d: PUSH1 0x40
0000299f: ADD
000029a0: MLOAD
000029a1: PUSH2 0x322f
000029a4: JUMP
000029a5: JUMPDEST
000029a6: CALLER
000029a7: PUSH1 0x01
000029a9: PUSH1 0x01
000029ab: PUSH1 0xa0
000029ad: SHL
000029ae: SUB
000029af: AND
000029b0: PUSH32 0x6f301d931e6dfbda4364250e68b430fb2357688c019bc4bd78f4627f3714c039
000029d1: DUP5
000029d2: PUSH1 0xc0
000029d4: ADD
000029d5: MLOAD
000029d6: DUP6
000029d7: PUSH1 0x80
000029d9: ADD
000029da: MLOAD
000029db: DUP7
000029dc: PUSH1 0x20
000029de: ADD
000029df: MLOAD
000029e0: DUP8
000029e1: PUSH1 0x40
000029e3: ADD
000029e4: MLOAD
000029e5: PUSH1 0x40
000029e7: MLOAD
000029e8: PUSH2 0x29f4
000029eb: SWAP5
000029ec: SWAP4
000029ed: SWAP3
000029ee: SWAP2
000029ef: SWAP1
000029f0: PUSH2 0x4a08
000029f3: JUMP
000029f4: JUMPDEST
000029f5: PUSH1 0x40
000029f7: MLOAD
000029f8: DUP1
000029f9: SWAP2
000029fa: SUB
000029fb: SWAP1
000029fc: LOG2
000029fd: POP
000029fe: POP
000029ff: POP
00002a00: POP
00002a01: PUSH2 0x0cf1
00002a04: PUSH1 0x01
00002a06: PUSH1 0x00
00002a08: DUP1
00002a09: MLOAD
00002a0a: PUSH1 0x20
00002a0c: PUSH2 0x4d30
00002a0f: DUP4
00002a10: CODECOPY
00002a11: DUP2
00002a12: MLOAD
00002a13: SWAP2
00002a14: MSTORE
00002a15: SSTORE
00002a16: JUMP
00002a17: JUMPDEST
00002a18: PUSH2 0x2a1f
00002a1b: PUSH2 0x2c07
00002a1e: JUMP
00002a1f: JUMPDEST
00002a20: PUSH1 0x40
00002a22: MLOAD
00002a23: PUSH4 0x139d99a1
00002a28: PUSH1 0xe0
00002a2a: SHL
00002a2b: DUP2
00002a2c: MSTORE
00002a2d: DUP2
00002a2e: SWAP1
00002a2f: PUSH1 0x01
00002a31: PUSH1 0x01
00002a33: PUSH1 0xa0
00002a35: SHL
00002a36: SUB
00002a37: PUSH32 0x000000000000000000000000d0f4de81e0b6e9d8018f2b8bf7f05da0edbc963f
00002a58: AND
00002a59: SWAP1
00002a5a: PUSH4 0x139d99a1
00002a5f: SWAP1
00002a60: PUSH2 0x2a6f
00002a63: SWAP1
00002a64: CALLER
00002a65: SWAP1
00002a66: DUP6
00002a67: SWAP1
00002a68: PUSH1 0x04
00002a6a: ADD
00002a6b: PUSH2 0x41a0
00002a6e: JUMP
00002a6f: JUMPDEST
00002a70: PUSH1 0x00
00002a72: PUSH1 0x40
00002a74: MLOAD
00002a75: DUP1
00002a76: DUP4
00002a77: SUB
00002a78: DUP2
00002a79: PUSH1 0x00
00002a7b: DUP8
00002a7c: DUP1
00002a7d: EXTCODESIZE
00002a7e: ISZERO
00002a7f: DUP1
00002a80: ISZERO
00002a81: PUSH2 0x2a89
00002a84: JUMPI
00002a85: PUSH1 0x00
00002a87: DUP1
00002a88: REVERT
00002a89: JUMPDEST
00002a8a: POP
00002a8b: GAS
00002a8c: CALL
00002a8d: ISZERO
00002a8e: DUP1
00002a8f: ISZERO
00002a90: PUSH2 0x2a9d
00002a93: JUMPI
00002a94: RETURNDATASIZE
00002a95: PUSH1 0x00
00002a97: DUP1
00002a98: RETURNDATACOPY
00002a99: RETURNDATASIZE
00002a9a: PUSH1 0x00
00002a9c: REVERT
00002a9d: JUMPDEST
00002a9e: POP
00002a9f: POP
00002aa0: PUSH1 0x03
00002aa2: SLOAD
00002aa3: PUSH1 0xff
00002aa5: AND
00002aa6: SWAP2
00002aa7: POP
00002aa8: PUSH2 0x2ad0
00002aab: SWAP1
00002aac: POP
00002aad: JUMPI
00002aae: PUSH1 0x10
00002ab0: SLOAD
00002ab1: TIMESTAMP
00002ab2: GT
00002ab3: ISZERO
00002ab4: PUSH2 0x2ad0
00002ab7: JUMPI
00002ab8: PUSH1 0x40
00002aba: MLOAD
00002abb: PUSH4 0x7eb24ab9
00002ac0: PUSH1 0xe1
00002ac2: SHL
00002ac3: DUP2
00002ac4: MSTORE
00002ac5: PUSH1 0x04
00002ac7: ADD
00002ac8: PUSH1 0x40
00002aca: MLOAD
00002acb: DUP1
00002acc: SWAP2
00002acd: SUB
00002ace: SWAP1
00002acf: REVERT
00002ad0: JUMPDEST
00002ad1: PUSH1 0x00
00002ad3: PUSH2 0x2adc
00002ad6: DUP4
00002ad7: DUP1
00002ad8: PUSH2 0x4216
00002adb: JUMP
00002adc: JUMPDEST
00002add: DUP2
00002ade: ADD
00002adf: SWAP1
00002ae0: PUSH2 0x2ae9
00002ae3: SWAP2
00002ae4: SWAP1
00002ae5: PUSH2 0x4aa7
00002ae8: JUMP
00002ae9: JUMPDEST
00002aea: SWAP1
00002aeb: POP
00002aec: PUSH2 0x2af9
00002aef: CALLER
00002af0: DUP3
00002af1: PUSH1 0x00
00002af3: ADD
00002af4: MLOAD
00002af5: PUSH2 0x359e
00002af8: JUMP
00002af9: JUMPDEST
00002afa: PUSH1 0x60
00002afc: DUP2
00002afd: ADD
00002afe: MLOAD
00002aff: MLOAD
00002b00: CALLER
00002b01: PUSH1 0x00
00002b03: SWAP1
00002b04: DUP2
00002b05: MSTORE
00002b06: PUSH1 0x11
00002b08: PUSH1 0x20
00002b0a: SWAP1
00002b0b: DUP2
00002b0c: MSTORE
00002b0d: PUSH1 0x40
00002b0f: SWAP1
00002b10: SWAP2
00002b11: KECCAK256
00002b12: DUP1
00002b13: SLOAD
00002b14: SWAP3
00002b15: SWAP1
00002b16: SWAP3
00002b17: SUB
00002b18: SWAP1
00002b19: SWAP2
00002b1a: SSTORE
00002b1b: DUP2
00002b1c: ADD
00002b1d: MLOAD
00002b1e: PUSH2 0x2b26
00002b21: SWAP1
00002b22: PUSH2 0x32f2
00002b25: JUMP
00002b26: JUMPDEST
00002b27: PUSH2 0x2b33
00002b2a: DUP2
00002b2b: PUSH1 0x40
00002b2d: ADD
00002b2e: MLOAD
00002b2f: PUSH2 0x35d4
00002b32: JUMP
00002b33: JUMPDEST
00002b34: DUP1
00002b35: MLOAD
00002b36: PUSH1 0x40
00002b38: DUP1
00002b39: DUP4
00002b3a: ADD
00002b3b: MLOAD
00002b3c: PUSH1 0x60
00002b3e: DUP5
00002b3f: ADD
00002b40: MLOAD
00002b41: PUSH1 0x80
00002b43: DUP6
00002b44: ADD
00002b45: MLOAD
00002b46: SWAP3
00002b47: MLOAD
00002b48: CALLER
00002b49: SWAP5
00002b4a: PUSH32 0x019dba413e23d35ab205236bc43f8e4a6ba5e4c4ce92b58ebd456f9524873f37
00002b6b: SWAP5
00002b6c: PUSH2 0x2b78
00002b6f: SWAP5
00002b70: SWAP2
00002b71: SWAP4
00002b72: SWAP2
00002b73: SWAP3
00002b74: PUSH2 0x4b51
00002b77: JUMP
00002b78: JUMPDEST
00002b79: PUSH1 0x40
00002b7b: MLOAD
00002b7c: DUP1
00002b7d: SWAP2
00002b7e: SUB
00002b7f: SWAP1
00002b80: LOG2
00002b81: POP
00002b82: POP
00002b83: PUSH2 0x0cf1
00002b86: PUSH1 0x01
00002b88: PUSH1 0x00
00002b8a: DUP1
00002b8b: MLOAD
00002b8c: PUSH1 0x20
00002b8e: PUSH2 0x4d30
00002b91: DUP4
00002b92: CODECOPY
00002b93: DUP2
00002b94: MLOAD
00002b95: SWAP2
00002b96: MSTORE
00002b97: SSTORE
00002b98: JUMP
00002b99: JUMPDEST
00002b9a: PUSH2 0x2ba1
00002b9d: PUSH2 0x2c3f
00002ba0: JUMP
00002ba1: JUMPDEST
00002ba2: PUSH1 0x01
00002ba4: PUSH1 0x01
00002ba6: PUSH1 0xa0
00002ba8: SHL
00002ba9: SUB
00002baa: DUP2
00002bab: AND
00002bac: PUSH2 0x2bc7
00002baf: JUMPI
00002bb0: PUSH1 0x40
00002bb2: MLOAD
00002bb3: PUSH3 0x82b429
00002bb7: PUSH1 0xe8
00002bb9: SHL
00002bba: DUP2
00002bbb: MSTORE
00002bbc: PUSH1 0x04
00002bbe: ADD
00002bbf: PUSH1 0x40
00002bc1: MLOAD
00002bc2: DUP1
00002bc3: SWAP2
00002bc4: SUB
00002bc5: SWAP1
00002bc6: REVERT
00002bc7: JUMPDEST
00002bc8: PUSH1 0x00
00002bca: PUSH2 0x2bd4
00002bcd: PUSH2 0x0612
00002bd0: PUSH2 0x1a99
00002bd3: JUMP
00002bd4: JUMPDEST
00002bd5: SWAP1
00002bd6: POP
00002bd7: DUP1
00002bd8: ISZERO
00002bd9: PUSH2 0x2be8
00002bdc: JUMPI
00002bdd: PUSH2 0x2be6
00002be0: DUP3
00002be1: DUP3
00002be2: PUSH2 0x1ac7
00002be5: JUMP
00002be6: JUMPDEST
00002be7: POP
00002be8: JUMPDEST
00002be9: PUSH2 0x2bf1
00002bec: DUP3
00002bed: PUSH2 0x36bd
00002bf0: JUMP
00002bf1: JUMPDEST
00002bf2: POP
00002bf3: POP
00002bf4: JUMP
00002bf5: JUMPDEST
00002bf6: PUSH2 0x2c02
00002bf9: DUP4
00002bfa: DUP4
00002bfb: DUP4
00002bfc: PUSH1 0x01
00002bfe: PUSH2 0x372e
00002c01: JUMP
00002c02: JUMPDEST
00002c03: POP
00002c04: POP
00002c05: POP
00002c06: JUMP
00002c07: JUMPDEST
00002c08: PUSH1 0x00
00002c0a: DUP1
00002c0b: MLOAD
00002c0c: PUSH1 0x20
00002c0e: PUSH2 0x4d30
00002c11: DUP4
00002c12: CODECOPY
00002c13: DUP2
00002c14: MLOAD
00002c15: SWAP2
00002c16: MSTORE
00002c17: DUP1
00002c18: SLOAD
00002c19: PUSH1 0x01
00002c1b: NOT
00002c1c: ADD
00002c1d: PUSH2 0x2c39
00002c20: JUMPI
00002c21: PUSH1 0x40
00002c23: MLOAD
00002c24: PUSH4 0x3ee5aeb5
00002c29: PUSH1 0xe0
00002c2b: SHL
00002c2c: DUP2
00002c2d: MSTORE
00002c2e: PUSH1 0x04
00002c30: ADD
00002c31: PUSH1 0x40
00002c33: MLOAD
00002c34: DUP1
00002c35: SWAP2
00002c36: SUB
00002c37: SWAP1
00002c38: REVERT
00002c39: JUMPDEST
00002c3a: PUSH1 0x02
00002c3c: SWAP1
00002c3d: SSTORE
00002c3e: JUMP
00002c3f: JUMPDEST
00002c40: CALLER
00002c41: PUSH2 0x2c48
00002c44: PUSH2 0x1a99
00002c47: JUMP
00002c48: JUMPDEST
00002c49: PUSH1 0x01
00002c4b: PUSH1 0x01
00002c4d: PUSH1 0xa0
00002c4f: SHL
00002c50: SUB
00002c51: AND
00002c52: EQ
00002c53: PUSH2 0x2c71
00002c56: JUMPI
00002c57: PUSH1 0x40
00002c59: MLOAD
00002c5a: PUSH4 0x118cdaa7
00002c5f: PUSH1 0xe0
00002c61: SHL
00002c62: DUP2
00002c63: MSTORE
00002c64: CALLER
00002c65: PUSH1 0x04
00002c67: DUP3
00002c68: ADD
00002c69: MSTORE
00002c6a: PUSH1 0x24
00002c6c: ADD
00002c6d: PUSH2 0x0cac
00002c70: JUMP
00002c71: JUMPDEST
00002c72: JUMP
00002c73: JUMPDEST
00002c74: PUSH1 0x40
00002c76: DUP1
00002c77: DUP3
00002c78: ADD
00002c79: MLOAD
00002c7a: SWAP1
00002c7b: MLOAD
00002c7c: PUSH4 0x70a08231
00002c81: PUSH1 0xe0
00002c83: SHL
00002c84: DUP2
00002c85: MSTORE
00002c86: ADDRESS
00002c87: PUSH1 0x04
00002c89: DUP3
00002c8a: ADD
00002c8b: MSTORE
00002c8c: PUSH1 0x00
00002c8e: SWAP2
00002c8f: PUSH1 0x01
00002c91: PUSH1 0x01
00002c93: PUSH1 0xa0
00002c95: SHL
00002c96: SUB
00002c97: AND
00002c98: SWAP1
00002c99: PUSH4 0x70a08231
00002c9e: SWAP1
00002c9f: PUSH1 0x24
00002ca1: ADD
00002ca2: PUSH1 0x20
00002ca4: PUSH1 0x40
00002ca6: MLOAD
00002ca7: DUP1
00002ca8: DUP4
00002ca9: SUB
00002caa: DUP2
00002cab: DUP7
00002cac: GAS
00002cad: STATICCALL
00002cae: ISZERO
00002caf: DUP1
00002cb0: ISZERO
00002cb1: PUSH2 0x2cbe
00002cb4: JUMPI
00002cb5: RETURNDATASIZE
00002cb6: PUSH1 0x00
00002cb8: DUP1
00002cb9: RETURNDATACOPY
00002cba: RETURNDATASIZE
00002cbb: PUSH1 0x00
00002cbd: REVERT
00002cbe: JUMPDEST
00002cbf: POP
00002cc0: POP
00002cc1: POP
00002cc2: POP
00002cc3: PUSH1 0x40
00002cc5: MLOAD
00002cc6: RETURNDATASIZE
00002cc7: PUSH1 0x1f
00002cc9: NOT
00002cca: PUSH1 0x1f
00002ccc: DUP3
00002ccd: ADD
00002cce: AND
00002ccf: DUP3
00002cd0: ADD
00002cd1: DUP1
00002cd2: PUSH1 0x40
00002cd4: MSTORE
00002cd5: POP
00002cd6: DUP2
00002cd7: ADD
00002cd8: SWAP1
00002cd9: PUSH2 0x2ce2
00002cdc: SWAP2
00002cdd: SWAP1
00002cde: PUSH2 0x45ea
00002ce1: JUMP
00002ce2: JUMPDEST
00002ce3: PUSH1 0x60
00002ce5: DUP4
00002ce6: ADD
00002ce7: MLOAD
00002ce8: PUSH1 0x40
00002cea: MLOAD
00002ceb: PUSH4 0x70a08231
00002cf0: PUSH1 0xe0
00002cf2: SHL
00002cf3: DUP2
00002cf4: MSTORE
00002cf5: ADDRESS
00002cf6: PUSH1 0x04
00002cf8: DUP3
00002cf9: ADD
00002cfa: MSTORE
00002cfb: SWAP2
00002cfc: SWAP3
00002cfd: POP
00002cfe: PUSH1 0x00
00002d00: SWAP2
00002d01: PUSH1 0x01
00002d03: PUSH1 0x01
00002d05: PUSH1 0xa0
00002d07: SHL
00002d08: SUB
00002d09: SWAP1
00002d0a: SWAP2
00002d0b: AND
00002d0c: SWAP1
00002d0d: PUSH4 0x70a08231
00002d12: SWAP1
00002d13: PUSH1 0x24
00002d15: ADD
00002d16: PUSH1 0x20
00002d18: PUSH1 0x40
00002d1a: MLOAD
00002d1b: DUP1
00002d1c: DUP4
00002d1d: SUB
00002d1e: DUP2
00002d1f: DUP7
00002d20: GAS
00002d21: STATICCALL
00002d22: ISZERO
00002d23: DUP1
00002d24: ISZERO
00002d25: PUSH2 0x2d32
00002d28: JUMPI
00002d29: RETURNDATASIZE
00002d2a: PUSH1 0x00
00002d2c: DUP1
00002d2d: RETURNDATACOPY
00002d2e: RETURNDATASIZE
00002d2f: PUSH1 0x00
00002d31: REVERT
00002d32: JUMPDEST
00002d33: POP
00002d34: POP
00002d35: POP
00002d36: POP
00002d37: PUSH1 0x40
00002d39: MLOAD
00002d3a: RETURNDATASIZE
00002d3b: PUSH1 0x1f
00002d3d: NOT
00002d3e: PUSH1 0x1f
00002d40: DUP3
00002d41: ADD
00002d42: AND
00002d43: DUP3
00002d44: ADD
00002d45: DUP1
00002d46: PUSH1 0x40
00002d48: MSTORE
00002d49: POP
00002d4a: DUP2
00002d4b: ADD
00002d4c: SWAP1
00002d4d: PUSH2 0x2d56
00002d50: SWAP2
00002d51: SWAP1
00002d52: PUSH2 0x45ea
00002d55: JUMP
00002d56: JUMPDEST
00002d57: DUP4
00002d58: MLOAD
00002d59: PUSH1 0x80
00002d5b: DUP6
00002d5c: ADD
00002d5d: MLOAD
00002d5e: PUSH1 0x40
00002d60: DUP7
00002d61: ADD
00002d62: MLOAD
00002d63: SWAP3
00002d64: SWAP4
00002d65: POP
00002d66: PUSH2 0x2d79
00002d69: SWAP3
00002d6a: PUSH1 0x01
00002d6c: PUSH1 0x01
00002d6e: PUSH1 0xa0
00002d70: SHL
00002d71: SUB
00002d72: AND
00002d73: SWAP2
00002d74: SWAP1
00002d75: PUSH2 0x3815
00002d78: JUMP
00002d79: JUMPDEST
00002d7a: PUSH1 0x00
00002d7c: DUP1
00002d7d: DUP5
00002d7e: PUSH1 0x00
00002d80: ADD
00002d81: MLOAD
00002d82: PUSH1 0x01
00002d84: PUSH1 0x01
00002d86: PUSH1 0xa0
00002d88: SHL
00002d89: SUB
00002d8a: AND
00002d8b: DUP6
00002d8c: PUSH1 0x20
00002d8e: ADD
00002d8f: MLOAD
00002d90: PUSH1 0x40
00002d92: MLOAD
00002d93: PUSH2 0x2d9c
00002d96: SWAP2
00002d97: SWAP1
00002d98: PUSH2 0x4bcf
00002d9b: JUMP
00002d9c: JUMPDEST
00002d9d: PUSH1 0x00
00002d9f: PUSH1 0x40
00002da1: MLOAD
00002da2: DUP1
00002da3: DUP4
00002da4: SUB
00002da5: DUP2
00002da6: PUSH1 0x00
00002da8: DUP7
00002da9: GAS
00002daa: CALL
00002dab: SWAP2
00002dac: POP
00002dad: POP
00002dae: RETURNDATASIZE
00002daf: DUP1
00002db0: PUSH1 0x00
00002db2: DUP2
00002db3: EQ
00002db4: PUSH2 0x2dd9
00002db7: JUMPI
00002db8: PUSH1 0x40
00002dba: MLOAD
00002dbb: SWAP2
00002dbc: POP
00002dbd: PUSH1 0x1f
00002dbf: NOT
00002dc0: PUSH1 0x3f
00002dc2: RETURNDATASIZE
00002dc3: ADD
00002dc4: AND
00002dc5: DUP3
00002dc6: ADD
00002dc7: PUSH1 0x40
00002dc9: MSTORE
00002dca: RETURNDATASIZE
00002dcb: DUP3
00002dcc: MSTORE
00002dcd: RETURNDATASIZE
00002dce: PUSH1 0x00
00002dd0: PUSH1 0x20
00002dd2: DUP5
00002dd3: ADD
00002dd4: RETURNDATACOPY
00002dd5: PUSH2 0x2dde
00002dd8: JUMP
00002dd9: JUMPDEST
00002dda: PUSH1 0x60
00002ddc: SWAP2
00002ddd: POP
00002dde: JUMPDEST
00002ddf: POP
00002de0: SWAP2
00002de1: POP
00002de2: SWAP2
00002de3: POP
00002de4: DUP2
00002de5: DUP2
00002de6: SWAP1
00002de7: PUSH2 0x2e03
00002dea: JUMPI
00002deb: PUSH1 0x40
00002ded: MLOAD
00002dee: PUSH3 0x461bcd
00002df2: PUSH1 0xe5
00002df4: SHL
00002df5: DUP2
00002df6: MSTORE
00002df7: PUSH1 0x04
00002df9: ADD
00002dfa: PUSH2 0x0cac
00002dfd: SWAP2
00002dfe: SWAP1
00002dff: PUSH2 0x3dbc
00002e02: JUMP
00002e03: JUMPDEST
00002e04: POP
00002e05: PUSH1 0x01
00002e07: SLOAD
00002e08: PUSH1 0xa0
00002e0a: DUP7
00002e0b: ADD
00002e0c: MLOAD
00002e0d: PUSH1 0x00
00002e0f: SLOAD
00002e10: PUSH2 0x2e27
00002e13: SWAP3
00002e14: PUSH1 0x01
00002e16: PUSH1 0x01
00002e18: PUSH1 0xa0
00002e1a: SHL
00002e1b: SUB
00002e1c: SWAP2
00002e1d: DUP3
00002e1e: AND
00002e1f: SWAP3
00002e20: SWAP2
00002e21: AND
00002e22: SWAP1
00002e23: PUSH2 0x38a5
00002e26: JUMP
00002e27: JUMPDEST
00002e28: PUSH1 0x40
00002e2a: DUP1
00002e2b: DUP7
00002e2c: ADD
00002e2d: MLOAD
00002e2e: SWAP1
00002e2f: MLOAD
00002e30: PUSH4 0x70a08231
00002e35: PUSH1 0xe0
00002e37: SHL
00002e38: DUP2
00002e39: MSTORE
00002e3a: ADDRESS
00002e3b: PUSH1 0x04
00002e3d: DUP3
00002e3e: ADD
00002e3f: MSTORE
00002e40: PUSH1 0x00
00002e42: SWAP2
00002e43: PUSH1 0x01
00002e45: PUSH1 0x01
00002e47: PUSH1 0xa0
00002e49: SHL
00002e4a: SUB
00002e4b: AND
00002e4c: SWAP1
00002e4d: PUSH4 0x70a08231
00002e52: SWAP1
00002e53: PUSH1 0x24
00002e55: ADD
00002e56: PUSH1 0x20
00002e58: PUSH1 0x40
00002e5a: MLOAD
00002e5b: DUP1
00002e5c: DUP4
00002e5d: SUB
00002e5e: DUP2
00002e5f: DUP7
00002e60: GAS
00002e61: STATICCALL
00002e62: ISZERO
00002e63: DUP1
00002e64: ISZERO
00002e65: PUSH2 0x2e72
00002e68: JUMPI
00002e69: RETURNDATASIZE
00002e6a: PUSH1 0x00
00002e6c: DUP1
00002e6d: RETURNDATACOPY
00002e6e: RETURNDATASIZE
00002e6f: PUSH1 0x00
00002e71: REVERT
00002e72: JUMPDEST
00002e73: POP
00002e74: POP
00002e75: POP
00002e76: POP
00002e77: PUSH1 0x40
00002e79: MLOAD
00002e7a: RETURNDATASIZE
00002e7b: PUSH1 0x1f
00002e7d: NOT
00002e7e: PUSH1 0x1f
00002e80: DUP3
00002e81: ADD
00002e82: AND
00002e83: DUP3
00002e84: ADD
00002e85: DUP1
00002e86: PUSH1 0x40
00002e88: MSTORE
00002e89: POP
00002e8a: DUP2
00002e8b: ADD
00002e8c: SWAP1
00002e8d: PUSH2 0x2e96
00002e90: SWAP2
00002e91: SWAP1
00002e92: PUSH2 0x45ea
00002e95: JUMP
00002e96: JUMPDEST
00002e97: PUSH1 0x60
00002e99: DUP8
00002e9a: ADD
00002e9b: MLOAD
00002e9c: PUSH1 0x40
00002e9e: MLOAD
00002e9f: PUSH4 0x70a08231
00002ea4: PUSH1 0xe0
00002ea6: SHL
00002ea7: DUP2
00002ea8: MSTORE
00002ea9: ADDRESS
00002eaa: PUSH1 0x04
00002eac: DUP3
00002ead: ADD
00002eae: MSTORE
00002eaf: SWAP2
00002eb0: SWAP3
00002eb1: POP
00002eb2: PUSH1 0x00
00002eb4: SWAP2
00002eb5: PUSH1 0x01
00002eb7: PUSH1 0x01
00002eb9: PUSH1 0xa0
00002ebb: SHL
00002ebc: SUB
00002ebd: SWAP1
00002ebe: SWAP2
00002ebf: AND
00002ec0: SWAP1
00002ec1: PUSH4 0x70a08231
00002ec6: SWAP1
00002ec7: PUSH1 0x24
00002ec9: ADD
00002eca: PUSH1 0x20
00002ecc: PUSH1 0x40
00002ece: MLOAD
00002ecf: DUP1
00002ed0: DUP4
00002ed1: SUB
00002ed2: DUP2
00002ed3: DUP7
00002ed4: GAS
00002ed5: STATICCALL
00002ed6: ISZERO
00002ed7: DUP1
00002ed8: ISZERO
00002ed9: PUSH2 0x2ee6
00002edc: JUMPI
00002edd: RETURNDATASIZE
00002ede: PUSH1 0x00
00002ee0: DUP1
00002ee1: RETURNDATACOPY
00002ee2: RETURNDATASIZE
00002ee3: PUSH1 0x00
00002ee5: REVERT
00002ee6: JUMPDEST
00002ee7: POP
00002ee8: POP
00002ee9: POP
00002eea: POP
00002eeb: PUSH1 0x40
00002eed: MLOAD
00002eee: RETURNDATASIZE
00002eef: PUSH1 0x1f
00002ef1: NOT
00002ef2: PUSH1 0x1f
00002ef4: DUP3
00002ef5: ADD
00002ef6: AND
00002ef7: DUP3
00002ef8: ADD
00002ef9: DUP1
00002efa: PUSH1 0x40
00002efc: MSTORE
00002efd: POP
00002efe: DUP2
00002eff: ADD
00002f00: SWAP1
00002f01: PUSH2 0x2f0a
00002f04: SWAP2
00002f05: SWAP1
00002f06: PUSH2 0x45ea
00002f09: JUMP
00002f0a: JUMPDEST
00002f0b: PUSH1 0x60
00002f0d: DUP9
00002f0e: ADD
00002f0f: MLOAD
00002f10: PUSH1 0x40
00002f12: DUP10
00002f13: ADD
00002f14: MLOAD
00002f15: SWAP2
00002f16: SWAP3
00002f17: POP
00002f18: PUSH1 0x01
00002f1a: PUSH1 0x01
00002f1c: PUSH1 0xa0
00002f1e: SHL
00002f1f: SUB
00002f20: SWAP1
00002f21: DUP2
00002f22: AND
00002f23: SWAP2
00002f24: AND
00002f25: CALLER
00002f26: PUSH32 0x300b4a9ac356114be2eaffe0f530cd615f14560df4b634adc11142d1358e8976
00002f47: PUSH2 0x2f50
00002f4a: DUP7
00002f4b: DUP12
00002f4c: PUSH2 0x459f
00002f4f: JUMP
00002f50: JUMPDEST
00002f51: PUSH2 0x2f5a
00002f54: DUP11
00002f55: DUP8
00002f56: PUSH2 0x459f
00002f59: JUMP
00002f5a: JUMPDEST
00002f5b: DUP13
00002f5c: MLOAD
00002f5d: PUSH1 0x40
00002f5f: DUP1
00002f60: MLOAD
00002f61: SWAP4
00002f62: DUP5
00002f63: MSTORE
00002f64: PUSH1 0x20
00002f66: DUP5
00002f67: ADD
00002f68: SWAP3
00002f69: SWAP1
00002f6a: SWAP3
00002f6b: MSTORE
00002f6c: PUSH1 0x01
00002f6e: PUSH1 0x01
00002f70: PUSH1 0xa0
00002f72: SHL
00002f73: SUB
00002f74: AND
00002f75: SWAP1
00002f76: DUP3
00002f77: ADD
00002f78: MSTORE
00002f79: PUSH1 0x60
00002f7b: ADD
00002f7c: PUSH1 0x40
00002f7e: MLOAD
00002f7f: DUP1
00002f80: SWAP2
00002f81: SUB
00002f82: SWAP1
00002f83: LOG4
00002f84: POP
00002f85: POP
00002f86: POP
00002f87: POP
00002f88: POP
00002f89: POP
00002f8a: POP
00002f8b: JUMP
00002f8c: JUMPDEST
00002f8d: PUSH1 0x00
00002f8f: JUMPDEST
00002f90: DUP2
00002f91: MLOAD
00002f92: DUP2
00002f93: PUSH1 0xff
00002f95: AND
00002f96: LT
00002f97: ISZERO
00002f98: PUSH2 0x3023
00002f9b: JUMPI
00002f9c: DUP2
00002f9d: DUP2
00002f9e: PUSH1 0xff
00002fa0: AND
00002fa1: DUP2
00002fa2: MLOAD
00002fa3: DUP2
00002fa4: LT
00002fa5: PUSH2 0x2fb0
00002fa8: JUMPI
00002fa9: PUSH2 0x2fb0
00002fac: PUSH2 0x4603
00002faf: JUMP
00002fb0: JUMPDEST
00002fb1: PUSH1 0x20
00002fb3: MUL
00002fb4: PUSH1 0x20
00002fb6: ADD
00002fb7: ADD
00002fb8: MLOAD
00002fb9: PUSH1 0x20
00002fbb: ADD
00002fbc: MLOAD
00002fbd: PUSH1 0x04
00002fbf: DUP4
00002fc0: DUP4
00002fc1: PUSH1 0xff
00002fc3: AND
00002fc4: DUP2
00002fc5: MLOAD
00002fc6: DUP2
00002fc7: LT
00002fc8: PUSH2 0x2fd3
00002fcb: JUMPI
00002fcc: PUSH2 0x2fd3
00002fcf: PUSH2 0x4603
00002fd2: JUMP
00002fd3: JUMPDEST
00002fd4: PUSH1 0x20
00002fd6: MUL
00002fd7: PUSH1 0x20
00002fd9: ADD
00002fda: ADD
00002fdb: MLOAD
00002fdc: PUSH1 0x00
00002fde: ADD
00002fdf: MLOAD
00002fe0: PUSH1 0xff
00002fe2: AND
00002fe3: PUSH1 0x08
00002fe5: DUP2
00002fe6: LT
00002fe7: PUSH2 0x2ff2
00002fea: JUMPI
00002feb: PUSH2 0x2ff2
00002fee: PUSH2 0x4603
00002ff1: JUMP
00002ff2: JUMPDEST
00002ff3: ADD
00002ff4: DUP1
00002ff5: SLOAD
00002ff6: PUSH1 0x01
00002ff8: PUSH1 0x01
00002ffa: PUSH1 0xa0
00002ffc: SHL
00002ffd: SUB
00002ffe: NOT
00002fff: AND
00003000: PUSH1 0x01
00003002: PUSH1 0x01
00003004: PUSH1 0xa0
00003006: SHL
00003007: SUB
00003008: SWAP3
00003009: SWAP1
0000300a: SWAP3
0000300b: AND
0000300c: SWAP2
0000300d: SWAP1
0000300e: SWAP2
0000300f: OR
00003010: SWAP1
00003011: SSTORE
00003012: DUP1
00003013: PUSH2 0x301b
00003016: DUP2
00003017: PUSH2 0x4beb
0000301a: JUMP
0000301b: JUMPDEST
0000301c: SWAP2
0000301d: POP
0000301e: POP
0000301f: PUSH2 0x2f8f
00003022: JUMP
00003023: JUMPDEST
00003024: POP
00003025: PUSH32 0xc18e7f80e60372d1fd896a89b5550a10b4f712fcc8e4fc3a006f529617f1e737
00003046: PUSH1 0x04
00003048: PUSH1 0x40
0000304a: MLOAD
0000304b: PUSH2 0x0a46
0000304e: SWAP2
0000304f: SWAP1
00003050: PUSH2 0x47c6
00003053: JUMP
00003054: JUMPDEST
00003055: PUSH1 0x01
00003057: PUSH1 0x01
00003059: PUSH1 0xa0
0000305b: SHL
0000305c: SUB
0000305d: DUP2
0000305e: AND
0000305f: PUSH1 0x00
00003061: SWAP1
00003062: DUP2
00003063: MSTORE
00003064: PUSH1 0x12
00003066: PUSH1 0x20
00003068: MSTORE
00003069: PUSH1 0x40
0000306b: DUP2
0000306c: KECCAK256
0000306d: PUSH1 0x01
0000306f: DUP2
00003070: ADD
00003071: SLOAD
00003072: SWAP1
00003073: SLOAD
00003074: SWAP1
00003075: JUMPDEST
00003076: DUP2
00003077: DUP2
00003078: GT
00003079: ISZERO
0000307a: PUSH2 0x310f
0000307d: JUMPI
0000307e: PUSH1 0x01
00003080: PUSH1 0x01
00003082: PUSH1 0xa0
00003084: SHL
00003085: SUB
00003086: DUP5
00003087: AND
00003088: PUSH1 0x00
0000308a: SWAP1
0000308b: DUP2
0000308c: MSTORE
0000308d: PUSH1 0x12
0000308f: PUSH1 0x20
00003091: MSTORE
00003092: PUSH1 0x40
00003094: DUP2
00003095: KECCAK256
00003096: PUSH1 0x01
00003098: SWAP1
00003099: DUP2
0000309a: ADD
0000309b: SWAP1
0000309c: PUSH2 0x30a5
0000309f: SWAP1
000030a0: DUP5
000030a1: PUSH2 0x459f
000030a4: JUMP
000030a5: JUMPDEST
000030a6: DUP2
000030a7: SLOAD
000030a8: DUP2
000030a9: LT
000030aa: PUSH2 0x30b5
000030ad: JUMPI
000030ae: PUSH2 0x30b5
000030b1: PUSH2 0x4603
000030b4: JUMP
000030b5: JUMPDEST
000030b6: SWAP1
000030b7: PUSH1 0x00
000030b9: MSTORE
000030ba: PUSH1 0x20
000030bc: PUSH1 0x00
000030be: KECCAK256
000030bf: SWAP1
000030c0: PUSH1 0x02
000030c2: MUL
000030c3: ADD
000030c4: PUSH1 0x40
000030c6: MLOAD
000030c7: DUP1
000030c8: PUSH1 0x40
000030ca: ADD
000030cb: PUSH1 0x40
000030cd: MSTORE
000030ce: SWAP1
000030cf: DUP2
000030d0: PUSH1 0x00
000030d2: DUP3
000030d3: ADD
000030d4: SLOAD
000030d5: DUP2
000030d6: MSTORE
000030d7: PUSH1 0x20
000030d9: ADD
000030da: PUSH1 0x01
000030dc: DUP3
000030dd: ADD
000030de: SLOAD
000030df: DUP2
000030e0: MSTORE
000030e1: POP
000030e2: POP
000030e3: SWAP1
000030e4: POP
000030e5: DUP1
000030e6: PUSH1 0x00
000030e8: ADD
000030e9: MLOAD
000030ea: TIMESTAMP
000030eb: GT
000030ec: PUSH2 0x3105
000030ef: JUMPI
000030f0: PUSH1 0x20
000030f2: DUP2
000030f3: ADD
000030f4: MLOAD
000030f5: SWAP4
000030f6: SWAP1
000030f7: SWAP4
000030f8: ADD
000030f9: SWAP3
000030fa: PUSH1 0x00
000030fc: NOT
000030fd: SWAP1
000030fe: SWAP2
000030ff: ADD
00003100: SWAP1
00003101: PUSH2 0x3109
00003104: JUMP
00003105: JUMPDEST
00003106: DUP2
00003107: SWAP3
00003108: POP
00003109: JUMPDEST
0000310a: POP
0000310b: PUSH2 0x3075
0000310e: JUMP
0000310f: JUMPDEST
00003110: POP
00003111: SWAP2
00003112: POP
00003113: SWAP2
00003114: JUMP
00003115: JUMPDEST
00003116: PUSH1 0x01
00003118: PUSH1 0x01
0000311a: PUSH1 0xa0
0000311c: SHL
0000311d: SUB
0000311e: DUP3
0000311f: AND
00003120: PUSH2 0x313f
00003123: JUMPI
00003124: PUSH1 0x40
00003126: MLOAD
00003127: PUSH4 0xec442f05
0000312c: PUSH1 0xe0
0000312e: SHL
0000312f: DUP2
00003130: MSTORE
00003131: PUSH1 0x00
00003133: PUSH1 0x04
00003135: DUP3
00003136: ADD
00003137: MSTORE
00003138: PUSH1 0x24
0000313a: ADD
0000313b: PUSH2 0x0cac
0000313e: JUMP
0000313f: JUMPDEST
00003140: PUSH2 0x2bf1
00003143: PUSH1 0x00
00003145: DUP4
00003146: DUP4
00003147: PUSH2 0x38d6
0000314a: JUMP
0000314b: JUMPDEST
0000314c: PUSH32 0x000000000000000000000000d0f4de81e0b6e9d8018f2b8bf7f05da0edbc963f
0000316d: PUSH1 0x01
0000316f: PUSH1 0x01
00003171: PUSH1 0xa0
00003173: SHL
00003174: SUB
00003175: AND
00003176: PUSH4 0x3fc8cef3
0000317b: PUSH1 0x40
0000317d: MLOAD
0000317e: DUP2
0000317f: PUSH4 0xffffffff
00003184: AND
00003185: PUSH1 0xe0
00003187: SHL
00003188: DUP2
00003189: MSTORE
0000318a: PUSH1 0x04
0000318c: ADD
0000318d: PUSH1 0x20
0000318f: PUSH1 0x40
00003191: MLOAD
00003192: DUP1
00003193: DUP4
00003194: SUB
00003195: DUP2
00003196: DUP7
00003197: GAS
00003198: STATICCALL
00003199: ISZERO
0000319a: DUP1
0000319b: ISZERO
0000319c: PUSH2 0x31a9
0000319f: JUMPI
000031a0: RETURNDATASIZE
000031a1: PUSH1 0x00
000031a3: DUP1
000031a4: RETURNDATACOPY
000031a5: RETURNDATASIZE
000031a6: PUSH1 0x00
000031a8: REVERT
000031a9: JUMPDEST
000031aa: POP
000031ab: POP
000031ac: POP
000031ad: POP
000031ae: PUSH1 0x40
000031b0: MLOAD
000031b1: RETURNDATASIZE
000031b2: PUSH1 0x1f
000031b4: NOT
000031b5: PUSH1 0x1f
000031b7: DUP3
000031b8: ADD
000031b9: AND
000031ba: DUP3
000031bb: ADD
000031bc: DUP1
000031bd: PUSH1 0x40
000031bf: MSTORE
000031c0: POP
000031c1: DUP2
000031c2: ADD
000031c3: SWAP1
000031c4: PUSH2 0x31cd
000031c7: SWAP2
000031c8: SWAP1
000031c9: PUSH2 0x40f3
000031cc: JUMP
000031cd: JUMPDEST
000031ce: PUSH1 0x01
000031d0: PUSH1 0x01
000031d2: PUSH1 0xa0
000031d4: SHL
000031d5: SUB
000031d6: AND
000031d7: PUSH4 0x2e1a7d4d
000031dc: DUP3
000031dd: PUSH1 0x40
000031df: MLOAD
000031e0: DUP3
000031e1: PUSH4 0xffffffff
000031e6: AND
000031e7: PUSH1 0xe0
000031e9: SHL
000031ea: DUP2
000031eb: MSTORE
000031ec: PUSH1 0x04
000031ee: ADD
000031ef: PUSH2 0x31fa
000031f2: SWAP2
000031f3: DUP2
000031f4: MSTORE
000031f5: PUSH1 0x20
000031f7: ADD
000031f8: SWAP1
000031f9: JUMP
000031fa: JUMPDEST
000031fb: PUSH1 0x00
000031fd: PUSH1 0x40
000031ff: MLOAD
00003200: DUP1
00003201: DUP4
00003202: SUB
00003203: DUP2
00003204: PUSH1 0x00
00003206: DUP8
00003207: DUP1
00003208: EXTCODESIZE
00003209: ISZERO
0000320a: DUP1
0000320b: ISZERO
0000320c: PUSH2 0x3214
0000320f: JUMPI
00003210: PUSH1 0x00
00003212: DUP1
00003213: REVERT
00003214: JUMPDEST
00003215: POP
00003216: GAS
00003217: CALL
00003218: ISZERO
00003219: DUP1
0000321a: ISZERO
0000321b: PUSH2 0x3228
0000321e: JUMPI
0000321f: RETURNDATASIZE
00003220: PUSH1 0x00
00003222: DUP1
00003223: RETURNDATACOPY
00003224: RETURNDATASIZE
00003225: PUSH1 0x00
00003227: REVERT
00003228: JUMPDEST
00003229: POP
0000322a: POP
0000322b: POP
0000322c: POP
0000322d: POP
0000322e: JUMP
0000322f: JUMPDEST
00003230: PUSH1 0x00
00003232: DUP3
00003233: PUSH1 0x01
00003235: PUSH1 0x01
00003237: PUSH1 0xa0
00003239: SHL
0000323a: SUB
0000323b: AND
0000323c: DUP3
0000323d: PUSH1 0x40
0000323f: MLOAD
00003240: PUSH1 0x00
00003242: PUSH1 0x40
00003244: MLOAD
00003245: DUP1
00003246: DUP4
00003247: SUB
00003248: DUP2
00003249: DUP6
0000324a: DUP8
0000324b: GAS
0000324c: CALL
0000324d: SWAP3
0000324e: POP
0000324f: POP
00003250: POP
00003251: RETURNDATASIZE
00003252: DUP1
00003253: PUSH1 0x00
00003255: DUP2
00003256: EQ
00003257: PUSH2 0x327c
0000325a: JUMPI
0000325b: PUSH1 0x40
0000325d: MLOAD
0000325e: SWAP2
0000325f: POP
00003260: PUSH1 0x1f
00003262: NOT
00003263: PUSH1 0x3f
00003265: RETURNDATASIZE
00003266: ADD
00003267: AND
00003268: DUP3
00003269: ADD
0000326a: PUSH1 0x40
0000326c: MSTORE
0000326d: RETURNDATASIZE
0000326e: DUP3
0000326f: MSTORE
00003270: RETURNDATASIZE
00003271: PUSH1 0x00
00003273: PUSH1 0x20
00003275: DUP5
00003276: ADD
00003277: RETURNDATACOPY
00003278: PUSH2 0x3281
0000327b: JUMP
0000327c: JUMPDEST
0000327d: PUSH1 0x60
0000327f: SWAP2
00003280: POP
00003281: JUMPDEST
00003282: POP
00003283: POP
00003284: SWAP1
00003285: POP
00003286: DUP1
00003287: PUSH2 0x2c02
0000328a: JUMPI
0000328b: PUSH1 0x01
0000328d: PUSH1 0x01
0000328f: PUSH1 0xa0
00003291: SHL
00003292: SUB
00003293: DUP4
00003294: AND
00003295: PUSH1 0x00
00003297: SWAP1
00003298: DUP2
00003299: MSTORE
0000329a: PUSH1 0x02
0000329c: PUSH1 0x20
0000329e: MSTORE
0000329f: PUSH1 0x40
000032a1: DUP2
000032a2: KECCAK256
000032a3: DUP1
000032a4: SLOAD
000032a5: DUP5
000032a6: SWAP3
000032a7: SWAP1
000032a8: PUSH2 0x32b2
000032ab: SWAP1
000032ac: DUP5
000032ad: SWAP1
000032ae: PUSH2 0x4619
000032b1: JUMP
000032b2: JUMPDEST
000032b3: SWAP1
000032b4: SWAP2
000032b5: SSTORE
000032b6: POP
000032b7: POP
000032b8: PUSH1 0x40
000032ba: MLOAD
000032bb: DUP3
000032bc: DUP2
000032bd: MSTORE
000032be: PUSH1 0x01
000032c0: PUSH1 0x01
000032c2: PUSH1 0xa0
000032c4: SHL
000032c5: SUB
000032c6: DUP5
000032c7: AND
000032c8: SWAP1
000032c9: PUSH32 0x648ec643b30463f72debf7027a0f9ff84bbdf4dc1a2a7ab973cb77dec5326568
000032ea: SWAP1
000032eb: PUSH1 0x20
000032ed: ADD
000032ee: PUSH2 0x173a
000032f1: JUMP
000032f2: JUMPDEST
000032f3: PUSH1 0x00
000032f5: JUMPDEST
000032f6: DUP2
000032f7: MLOAD
000032f8: DUP2
000032f9: PUSH1 0xff
000032fb: AND
000032fc: LT
000032fd: ISZERO
000032fe: PUSH2 0x2bf1
00003301: JUMPI
00003302: PUSH2 0x3326
00003305: DUP3
00003306: DUP3
00003307: PUSH1 0xff
00003309: AND
0000330a: DUP2
0000330b: MLOAD
0000330c: DUP2
0000330d: LT
0000330e: PUSH2 0x3319
00003311: JUMPI
00003312: PUSH2 0x3319
00003315: PUSH2 0x4603
00003318: JUMP
00003319: JUMPDEST
0000331a: PUSH1 0x20
0000331c: MUL
0000331d: PUSH1 0x20
0000331f: ADD
00003320: ADD
00003321: MLOAD
00003322: PUSH2 0x2c73
00003325: JUMP
00003326: JUMPDEST
00003327: DUP1
00003328: PUSH2 0x3330
0000332b: DUP2
0000332c: PUSH2 0x4beb
0000332f: JUMP
00003330: JUMPDEST
00003331: SWAP2
00003332: POP
00003333: POP
00003334: PUSH2 0x32f5
00003337: JUMP
00003338: JUMPDEST
00003339: PUSH1 0x01
0000333b: PUSH1 0x01
0000333d: PUSH1 0xa0
0000333f: SHL
00003340: SUB
00003341: DUP4
00003342: AND
00003343: PUSH2 0x3362
00003346: JUMPI
00003347: PUSH1 0x40
00003349: MLOAD
0000334a: PUSH4 0x4b637e8f
0000334f: PUSH1 0xe1
00003351: SHL
00003352: DUP2
00003353: MSTORE
00003354: PUSH1 0x00
00003356: PUSH1 0x04
00003358: DUP3
00003359: ADD
0000335a: MSTORE
0000335b: PUSH1 0x24
0000335d: ADD
0000335e: PUSH2 0x0cac
00003361: JUMP
00003362: JUMPDEST
00003363: PUSH1 0x01
00003365: PUSH1 0x01
00003367: PUSH1 0xa0
00003369: SHL
0000336a: SUB
0000336b: DUP3
0000336c: AND
0000336d: PUSH2 0x338c
00003370: JUMPI
00003371: PUSH1 0x40
00003373: MLOAD
00003374: PUSH4 0xec442f05
00003379: PUSH1 0xe0
0000337b: SHL
0000337c: DUP2
0000337d: MSTORE
0000337e: PUSH1 0x00
00003380: PUSH1 0x04
00003382: DUP3
00003383: ADD
00003384: MSTORE
00003385: PUSH1 0x24
00003387: ADD
00003388: PUSH2 0x0cac
0000338b: JUMP
0000338c: JUMPDEST
0000338d: PUSH2 0x2c02
00003390: DUP4
00003391: DUP4
00003392: DUP4
00003393: PUSH2 0x38d6
00003396: JUMP
00003397: JUMPDEST
00003398: PUSH2 0x339f
0000339b: PUSH2 0x3af7
0000339e: JUMP
0000339f: JUMPDEST
000033a0: PUSH1 0x00
000033a2: DUP1
000033a3: SLOAD
000033a4: PUSH1 0x01
000033a6: PUSH1 0x01
000033a8: PUSH1 0xa0
000033aa: SHL
000033ab: SUB
000033ac: SWAP4
000033ad: DUP5
000033ae: AND
000033af: PUSH1 0x01
000033b1: PUSH1 0x01
000033b3: PUSH1 0xa0
000033b5: SHL
000033b6: SUB
000033b7: NOT
000033b8: SWAP2
000033b9: DUP3
000033ba: AND
000033bb: OR
000033bc: SWAP1
000033bd: SWAP2
000033be: SSTORE
000033bf: PUSH1 0x01
000033c1: DUP1
000033c2: SLOAD
000033c3: SWAP3
000033c4: SWAP1
000033c5: SWAP4
000033c6: AND
000033c7: SWAP2
000033c8: AND
000033c9: OR
000033ca: SWAP1
000033cb: SSTORE
000033cc: JUMP
000033cd: JUMPDEST
000033ce: PUSH2 0x33d5
000033d1: PUSH2 0x3af7
000033d4: JUMP
000033d5: JUMPDEST
000033d6: PUSH1 0x01
000033d8: PUSH1 0x01
000033da: PUSH1 0xa0
000033dc: SHL
000033dd: SUB
000033de: DUP2
000033df: AND
000033e0: PUSH2 0x33ff
000033e3: JUMPI
000033e4: PUSH1 0x40
000033e6: MLOAD
000033e7: PUSH4 0x1e4fbdf7
000033ec: PUSH1 0xe0
000033ee: SHL
000033ef: DUP2
000033f0: MSTORE
000033f1: PUSH1 0x00
000033f3: PUSH1 0x04
000033f5: DUP3
000033f6: ADD
000033f7: MSTORE
000033f8: PUSH1 0x24
000033fa: ADD
000033fb: PUSH2 0x0cac
000033fe: JUMP
000033ff: JUMPDEST
00003400: PUSH2 0x0cf1
00003403: DUP2
00003404: PUSH2 0x36bd
00003407: JUMP
00003408: JUMPDEST
00003409: PUSH2 0x3410
0000340c: PUSH2 0x3af7
0000340f: JUMP
00003410: JUMPDEST
00003411: PUSH1 0x00
00003413: DUP1
00003414: MLOAD
00003415: PUSH1 0x20
00003417: PUSH2 0x4d10
0000341a: DUP4
0000341b: CODECOPY
0000341c: DUP2
0000341d: MLOAD
0000341e: SWAP2
0000341f: MSTORE
00003420: PUSH32 0x52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace03
00003441: PUSH2 0x344a
00003444: DUP5
00003445: DUP3
00003446: PUSH2 0x4c51
00003449: JUMP
0000344a: JUMPDEST
0000344b: POP
0000344c: PUSH1 0x04
0000344e: DUP2
0000344f: ADD
00003450: PUSH2 0x3459
00003453: DUP4
00003454: DUP3
00003455: PUSH2 0x4c51
00003458: JUMP
00003459: JUMPDEST
0000345a: POP
0000345b: POP
0000345c: POP
0000345d: POP
0000345e: JUMP
0000345f: JUMPDEST
00003460: PUSH32 0x000000000000000000000000d0f4de81e0b6e9d8018f2b8bf7f05da0edbc963f
00003481: PUSH1 0x01
00003483: PUSH1 0x01
00003485: PUSH1 0xa0
00003487: SHL
00003488: SUB
00003489: AND
0000348a: PUSH4 0x3fc8cef3
0000348f: PUSH1 0x40
00003491: MLOAD
00003492: DUP2
00003493: PUSH4 0xffffffff
00003498: AND
00003499: PUSH1 0xe0
0000349b: SHL
0000349c: DUP2
0000349d: MSTORE
0000349e: PUSH1 0x04
000034a0: ADD
000034a1: PUSH1 0x20
000034a3: PUSH1 0x40
000034a5: MLOAD
000034a6: DUP1
000034a7: DUP4
000034a8: SUB
000034a9: DUP2
000034aa: DUP7
000034ab: GAS
000034ac: STATICCALL
000034ad: ISZERO
000034ae: DUP1
000034af: ISZERO
000034b0: PUSH2 0x34bd
000034b3: JUMPI
000034b4: RETURNDATASIZE
000034b5: PUSH1 0x00
000034b7: DUP1
000034b8: RETURNDATACOPY
000034b9: RETURNDATASIZE
000034ba: PUSH1 0x00
000034bc: REVERT
000034bd: JUMPDEST
000034be: POP
000034bf: POP
000034c0: POP
000034c1: POP
000034c2: PUSH1 0x40
000034c4: MLOAD
000034c5: RETURNDATASIZE
000034c6: PUSH1 0x1f
000034c8: NOT
000034c9: PUSH1 0x1f
000034cb: DUP3
000034cc: ADD
000034cd: AND
000034ce: DUP3
000034cf: ADD
000034d0: DUP1
000034d1: PUSH1 0x40
000034d3: MSTORE
000034d4: POP
000034d5: DUP2
000034d6: ADD
000034d7: SWAP1
000034d8: PUSH2 0x34e1
000034db: SWAP2
000034dc: SWAP1
000034dd: PUSH2 0x40f3
000034e0: JUMP
000034e1: JUMPDEST
000034e2: PUSH1 0x01
000034e4: PUSH1 0x01
000034e6: PUSH1 0xa0
000034e8: SHL
000034e9: SUB
000034ea: AND
000034eb: PUSH4 0xd0e30db0
000034f0: DUP3
000034f1: PUSH1 0x40
000034f3: MLOAD
000034f4: DUP3
000034f5: PUSH4 0xffffffff
000034fa: AND
000034fb: PUSH1 0xe0
000034fd: SHL
000034fe: DUP2
000034ff: MSTORE
00003500: PUSH1 0x04
00003502: ADD
00003503: PUSH1 0x00
00003505: PUSH1 0x40
00003507: MLOAD
00003508: DUP1
00003509: DUP4
0000350a: SUB
0000350b: DUP2
0000350c: DUP6
0000350d: DUP9
0000350e: DUP1
0000350f: EXTCODESIZE
00003510: ISZERO
00003511: DUP1
00003512: ISZERO
00003513: PUSH2 0x351b
00003516: JUMPI
00003517: PUSH1 0x00
00003519: DUP1
0000351a: REVERT
0000351b: JUMPDEST
0000351c: POP
0000351d: GAS
0000351e: CALL
0000351f: ISZERO
00003520: DUP1
00003521: ISZERO
00003522: PUSH2 0x352f
00003525: JUMPI
00003526: RETURNDATASIZE
00003527: PUSH1 0x00
00003529: DUP1
0000352a: RETURNDATACOPY
0000352b: RETURNDATASIZE
0000352c: PUSH1 0x00
0000352e: REVERT
0000352f: JUMPDEST
00003530: POP
00003531: POP
00003532: POP
00003533: POP
00003534: POP
00003535: POP
00003536: JUMP
00003537: JUMPDEST
00003538: PUSH1 0x40
0000353a: MLOAD
0000353b: PUSH1 0x01
0000353d: PUSH1 0x01
0000353f: PUSH1 0xa0
00003541: SHL
00003542: SUB
00003543: DUP5
00003544: DUP2
00003545: AND
00003546: PUSH1 0x24
00003548: DUP4
00003549: ADD
0000354a: MSTORE
0000354b: DUP4
0000354c: DUP2
0000354d: AND
0000354e: PUSH1 0x44
00003550: DUP4
00003551: ADD
00003552: MSTORE
00003553: PUSH1 0x64
00003555: DUP3
00003556: ADD
00003557: DUP4
00003558: SWAP1
00003559: MSTORE
0000355a: PUSH2 0x3459
0000355d: SWAP2
0000355e: DUP7
0000355f: SWAP2
00003560: DUP3
00003561: AND
00003562: SWAP1
00003563: PUSH4 0x23b872dd
00003568: SWAP1
00003569: PUSH1 0x84
0000356b: ADD
0000356c: JUMPDEST
0000356d: PUSH1 0x40
0000356f: MLOAD
00003570: PUSH1 0x20
00003572: DUP2
00003573: DUP4
00003574: SUB
00003575: SUB
00003576: DUP2
00003577: MSTORE
00003578: SWAP1
00003579: PUSH1 0x40
0000357b: MSTORE
0000357c: SWAP2
0000357d: POP
0000357e: PUSH1 0xe0
00003580: SHL
00003581: PUSH1 0x20
00003583: DUP3
00003584: ADD
00003585: DUP1
00003586: MLOAD
00003587: PUSH1 0x01
00003589: PUSH1 0x01
0000358b: PUSH1 0xe0
0000358d: SHL
0000358e: SUB
0000358f: DUP4
00003590: DUP2
00003591: DUP4
00003592: AND
00003593: OR
00003594: DUP4
00003595: MSTORE
00003596: POP
00003597: POP
00003598: POP
00003599: POP
0000359a: PUSH2 0x3b40
0000359d: JUMP
0000359e: JUMPDEST
0000359f: PUSH1 0x01
000035a1: PUSH1 0x01
000035a3: PUSH1 0xa0
000035a5: SHL
000035a6: SUB
000035a7: DUP3
000035a8: AND
000035a9: PUSH2 0x35c8
000035ac: JUMPI
000035ad: PUSH1 0x40
000035af: MLOAD
000035b0: PUSH4 0x4b637e8f
000035b5: PUSH1 0xe1
000035b7: SHL
000035b8: DUP2
000035b9: MSTORE
000035ba: PUSH1 0x00
000035bc: PUSH1 0x04
000035be: DUP3
000035bf: ADD
000035c0: MSTORE
000035c1: PUSH1 0x24
000035c3: ADD
000035c4: PUSH2 0x0cac
000035c7: JUMP
000035c8: JUMPDEST
000035c9: PUSH2 0x2bf1
000035cc: DUP3
000035cd: PUSH1 0x00
000035cf: DUP4
000035d0: PUSH2 0x38d6
000035d3: JUMP
000035d4: JUMPDEST
000035d5: PUSH1 0x00
000035d7: DUP2
000035d8: PUSH1 0x20
000035da: ADD
000035db: MLOAD
000035dc: SGT
000035dd: PUSH2 0x35f2
000035e0: JUMPI
000035e1: PUSH2 0x35ed
000035e4: DUP2
000035e5: PUSH1 0x80
000035e7: ADD
000035e8: MLOAD
000035e9: PUSH2 0x314b
000035ec: JUMP
000035ed: JUMPDEST
000035ee: PUSH2 0x36af
000035f1: JUMP
000035f2: JUMPDEST
000035f3: PUSH2 0x360b
000035f6: DUP2
000035f7: PUSH1 0x40
000035f9: ADD
000035fa: MLOAD
000035fb: DUP3
000035fc: PUSH1 0x60
000035fe: ADD
000035ff: MLOAD
00003600: DUP4
00003601: PUSH1 0x80
00003603: ADD
00003604: MLOAD
00003605: ADD
00003606: ADD
00003607: PUSH2 0x314b
0000360a: JUMP
0000360b: JUMPDEST
0000360c: PUSH2 0x369a
0000360f: PUSH32 0x000000000000000000000000d0f4de81e0b6e9d8018f2b8bf7f05da0edbc963f
00003630: PUSH1 0x01
00003632: PUSH1 0x01
00003634: PUSH1 0xa0
00003636: SHL
00003637: SUB
00003638: AND
00003639: PUSH4 0xfbfa77cf
0000363e: PUSH1 0x40
00003640: MLOAD
00003641: DUP2
00003642: PUSH4 0xffffffff
00003647: AND
00003648: PUSH1 0xe0
0000364a: SHL
0000364b: DUP2
0000364c: MSTORE
0000364d: PUSH1 0x04
0000364f: ADD
00003650: PUSH1 0x20
00003652: PUSH1 0x40
00003654: MLOAD
00003655: DUP1
00003656: DUP4
00003657: SUB
00003658: DUP2
00003659: DUP7
0000365a: GAS
0000365b: STATICCALL
0000365c: ISZERO
0000365d: DUP1
0000365e: ISZERO
0000365f: PUSH2 0x366c
00003662: JUMPI
00003663: RETURNDATASIZE
00003664: PUSH1 0x00
00003666: DUP1
00003667: RETURNDATACOPY
00003668: RETURNDATASIZE
00003669: PUSH1 0x00
0000366b: REVERT
0000366c: JUMPDEST
0000366d: POP
0000366e: POP
0000366f: POP
00003670: POP
00003671: PUSH1 0x40
00003673: MLOAD
00003674: RETURNDATASIZE
00003675: PUSH1 0x1f
00003677: NOT
00003678: PUSH1 0x1f
0000367a: DUP3
0000367b: ADD
0000367c: AND
0000367d: DUP3
0000367e: ADD
0000367f: DUP1
00003680: PUSH1 0x40
00003682: MSTORE
00003683: POP
00003684: DUP2
00003685: ADD
00003686: SWAP1
00003687: PUSH2 0x3690
0000368a: SWAP2
0000368b: SWAP1
0000368c: PUSH2 0x40f3
0000368f: JUMP
00003690: JUMPDEST
00003691: DUP3
00003692: PUSH1 0x60
00003694: ADD
00003695: MLOAD
00003696: PUSH2 0x322f
00003699: JUMP
0000369a: JUMPDEST
0000369b: PUSH2 0x36af
0000369e: PUSH2 0x36a5
000036a1: PUSH2 0x1a99
000036a4: JUMP
000036a5: JUMPDEST
000036a6: DUP3
000036a7: PUSH1 0x40
000036a9: ADD
000036aa: MLOAD
000036ab: PUSH2 0x322f
000036ae: JUMP
000036af: JUMPDEST
000036b0: PUSH2 0x0cf1
000036b3: CALLER
000036b4: DUP3
000036b5: PUSH1 0x80
000036b7: ADD
000036b8: MLOAD
000036b9: PUSH2 0x322f
000036bc: JUMP
000036bd: JUMPDEST
000036be: PUSH32 0x9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300
000036df: DUP1
000036e0: SLOAD
000036e1: PUSH1 0x01
000036e3: PUSH1 0x01
000036e5: PUSH1 0xa0
000036e7: SHL
000036e8: SUB
000036e9: NOT
000036ea: DUP2
000036eb: AND
000036ec: PUSH1 0x01
000036ee: PUSH1 0x01
000036f0: PUSH1 0xa0
000036f2: SHL
000036f3: SUB
000036f4: DUP5
000036f5: DUP2
000036f6: AND
000036f7: SWAP2
000036f8: DUP3
000036f9: OR
000036fa: DUP5
000036fb: SSTORE
000036fc: PUSH1 0x40
000036fe: MLOAD
000036ff: SWAP3
00003700: AND
00003701: SWAP2
00003702: DUP3
00003703: SWAP1
00003704: PUSH32 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0
00003725: SWAP1
00003726: PUSH1 0x00
00003728: SWAP1
00003729: LOG3
0000372a: POP
0000372b: POP
0000372c: POP
0000372d: JUMP
0000372e: JUMPDEST
0000372f: PUSH1 0x00
00003731: DUP1
00003732: MLOAD
00003733: PUSH1 0x20
00003735: PUSH2 0x4d10
00003738: DUP4
00003739: CODECOPY
0000373a: DUP2
0000373b: MLOAD
0000373c: SWAP2
0000373d: MSTORE
0000373e: PUSH1 0x01
00003740: PUSH1 0x01
00003742: PUSH1 0xa0
00003744: SHL
00003745: SUB
00003746: DUP6
00003747: AND
00003748: PUSH2 0x3767
0000374b: JUMPI
0000374c: PUSH1 0x40
0000374e: MLOAD
0000374f: PUSH4 0xe602df05
00003754: PUSH1 0xe0
00003756: SHL
00003757: DUP2
00003758: MSTORE
00003759: PUSH1 0x00
0000375b: PUSH1 0x04
0000375d: DUP3
0000375e: ADD
0000375f: MSTORE
00003760: PUSH1 0x24
00003762: ADD
00003763: PUSH2 0x0cac
00003766: JUMP
00003767: JUMPDEST
00003768: PUSH1 0x01
0000376a: PUSH1 0x01
0000376c: PUSH1 0xa0
0000376e: SHL
0000376f: SUB
00003770: DUP5
00003771: AND
00003772: PUSH2 0x3791
00003775: JUMPI
00003776: PUSH1 0x40
00003778: MLOAD
00003779: PUSH4 0x4a1406b1
0000377e: PUSH1 0xe1
00003780: SHL
00003781: DUP2
00003782: MSTORE
00003783: PUSH1 0x00
00003785: PUSH1 0x04
00003787: DUP3
00003788: ADD
00003789: MSTORE
0000378a: PUSH1 0x24
0000378c: ADD
0000378d: PUSH2 0x0cac
00003790: JUMP
00003791: JUMPDEST
00003792: PUSH1 0x01
00003794: PUSH1 0x01
00003796: PUSH1 0xa0
00003798: SHL
00003799: SUB
0000379a: DUP1
0000379b: DUP7
0000379c: AND
0000379d: PUSH1 0x00
0000379f: SWAP1
000037a0: DUP2
000037a1: MSTORE
000037a2: PUSH1 0x01
000037a4: DUP4
000037a5: ADD
000037a6: PUSH1 0x20
000037a8: SWAP1
000037a9: DUP2
000037aa: MSTORE
000037ab: PUSH1 0x40
000037ad: DUP1
000037ae: DUP4
000037af: KECCAK256
000037b0: SWAP4
000037b1: DUP9
000037b2: AND
000037b3: DUP4
000037b4: MSTORE
000037b5: SWAP3
000037b6: SWAP1
000037b7: MSTORE
000037b8: KECCAK256
000037b9: DUP4
000037ba: SWAP1
000037bb: SSTORE
000037bc: DUP2
000037bd: ISZERO
000037be: PUSH2 0x3228
000037c1: JUMPI
000037c2: DUP4
000037c3: PUSH1 0x01
000037c5: PUSH1 0x01
000037c7: PUSH1 0xa0
000037c9: SHL
000037ca: SUB
000037cb: AND
000037cc: DUP6
000037cd: PUSH1 0x01
000037cf: PUSH1 0x01
000037d1: PUSH1 0xa0
000037d3: SHL
000037d4: SUB
000037d5: AND
000037d6: PUSH32 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925
000037f7: DUP6
000037f8: PUSH1 0x40
000037fa: MLOAD
000037fb: PUSH2 0x3806
000037fe: SWAP2
000037ff: DUP2
00003800: MSTORE
00003801: PUSH1 0x20
00003803: ADD
00003804: SWAP1
00003805: JUMP
00003806: JUMPDEST
00003807: PUSH1 0x40
00003809: MLOAD
0000380a: DUP1
0000380b: SWAP2
0000380c: SUB
0000380d: SWAP1
0000380e: LOG3
0000380f: POP
00003810: POP
00003811: POP
00003812: POP
00003813: POP
00003814: JUMP
00003815: JUMPDEST
00003816: PUSH1 0x40
00003818: DUP1
00003819: MLOAD
0000381a: PUSH1 0x01
0000381c: PUSH1 0x01
0000381e: PUSH1 0xa0
00003820: SHL
00003821: SUB
00003822: DUP5
00003823: AND
00003824: PUSH1 0x24
00003826: DUP3
00003827: ADD
00003828: MSTORE
00003829: PUSH1 0x44
0000382b: DUP1
0000382c: DUP3
0000382d: ADD
0000382e: DUP5
0000382f: SWAP1
00003830: MSTORE
00003831: DUP3
00003832: MLOAD
00003833: DUP1
00003834: DUP4
00003835: SUB
00003836: SWAP1
00003837: SWAP2
00003838: ADD
00003839: DUP2
0000383a: MSTORE
0000383b: PUSH1 0x64
0000383d: SWAP1
0000383e: SWAP2
0000383f: ADD
00003840: SWAP1
00003841: SWAP2
00003842: MSTORE
00003843: PUSH1 0x20
00003845: DUP2
00003846: ADD
00003847: DUP1
00003848: MLOAD
00003849: PUSH1 0x01
0000384b: PUSH1 0x01
0000384d: PUSH1 0xe0
0000384f: SHL
00003850: SUB
00003851: AND
00003852: PUSH4 0x095ea7b3
00003857: PUSH1 0xe0
00003859: SHL
0000385a: OR
0000385b: SWAP1
0000385c: MSTORE
0000385d: PUSH2 0x3866
00003860: DUP5
00003861: DUP3
00003862: PUSH2 0x3bb1
00003865: JUMP
00003866: JUMPDEST
00003867: PUSH2 0x3459
0000386a: JUMPI
0000386b: PUSH1 0x40
0000386d: MLOAD
0000386e: PUSH1 0x01
00003870: PUSH1 0x01
00003872: PUSH1 0xa0
00003874: SHL
00003875: SUB
00003876: DUP5
00003877: DUP2
00003878: AND
00003879: PUSH1 0x24
0000387b: DUP4
0000387c: ADD
0000387d: MSTORE
0000387e: PUSH1 0x00
00003880: PUSH1 0x44
00003882: DUP4
00003883: ADD
00003884: MSTORE
00003885: PUSH2 0x389b
00003888: SWAP2
00003889: DUP7
0000388a: SWAP2
0000388b: DUP3
0000388c: AND
0000388d: SWAP1
0000388e: PUSH4 0x095ea7b3
00003893: SWAP1
00003894: PUSH1 0x64
00003896: ADD
00003897: PUSH2 0x356c
0000389a: JUMP
0000389b: JUMPDEST
0000389c: PUSH2 0x3459
0000389f: DUP5
000038a0: DUP3
000038a1: PUSH2 0x3b40
000038a4: JUMP
000038a5: JUMPDEST
000038a6: PUSH1 0x40
000038a8: MLOAD
000038a9: PUSH1 0x01
000038ab: PUSH1 0x01
000038ad: PUSH1 0xa0
000038af: SHL
000038b0: SUB
000038b1: DUP4
000038b2: DUP2
000038b3: AND
000038b4: PUSH1 0x24
000038b6: DUP4
000038b7: ADD
000038b8: MSTORE
000038b9: PUSH1 0x44
000038bb: DUP3
000038bc: ADD
000038bd: DUP4
000038be: SWAP1
000038bf: MSTORE
000038c0: PUSH2 0x2c02
000038c3: SWAP2
000038c4: DUP6
000038c5: SWAP2
000038c6: DUP3
000038c7: AND
000038c8: SWAP1
000038c9: PUSH4 0xa9059cbb
000038ce: SWAP1
000038cf: PUSH1 0x64
000038d1: ADD
000038d2: PUSH2 0x356c
000038d5: JUMP
000038d6: JUMPDEST
000038d7: PUSH1 0x03
000038d9: SLOAD
000038da: PUSH1 0xff
000038dc: AND
000038dd: ISZERO
000038de: PUSH2 0x3aec
000038e1: JUMPI
000038e2: PUSH1 0x01
000038e4: PUSH1 0x01
000038e6: PUSH1 0xa0
000038e8: SHL
000038e9: SUB
000038ea: DUP4
000038eb: AND
000038ec: ISZERO
000038ed: DUP1
000038ee: ISZERO
000038ef: PUSH2 0x398b
000038f2: JUMPI
000038f3: POP
000038f4: PUSH32 0x000000000000000000000000d0f4de81e0b6e9d8018f2b8bf7f05da0edbc963f
00003915: PUSH1 0x01
00003917: PUSH1 0x01
00003919: PUSH1 0xa0
0000391b: SHL
0000391c: SUB
0000391d: AND
0000391e: PUSH4 0xf851a440
00003923: PUSH1 0x40
00003925: MLOAD
00003926: DUP2
00003927: PUSH4 0xffffffff
0000392c: AND
0000392d: PUSH1 0xe0
0000392f: SHL
00003930: DUP2
00003931: MSTORE
00003932: PUSH1 0x04
00003934: ADD
00003935: PUSH1 0x20
00003937: PUSH1 0x40
00003939: MLOAD
0000393a: DUP1
0000393b: DUP4
0000393c: SUB
0000393d: DUP2
0000393e: DUP7
0000393f: GAS
00003940: STATICCALL
00003941: ISZERO
00003942: DUP1
00003943: ISZERO
00003944: PUSH2 0x3951
00003947: JUMPI
00003948: RETURNDATASIZE
00003949: PUSH1 0x00
0000394b: DUP1
0000394c: RETURNDATACOPY
0000394d: RETURNDATASIZE
0000394e: PUSH1 0x00
00003950: REVERT
00003951: JUMPDEST
00003952: POP
00003953: POP
00003954: POP
00003955: POP
00003956: PUSH1 0x40
00003958: MLOAD
00003959: RETURNDATASIZE
0000395a: PUSH1 0x1f
0000395c: NOT
0000395d: PUSH1 0x1f
0000395f: DUP3
00003960: ADD
00003961: AND
00003962: DUP3
00003963: ADD
00003964: DUP1
00003965: PUSH1 0x40
00003967: MSTORE
00003968: POP
00003969: DUP2
0000396a: ADD
0000396b: SWAP1
0000396c: PUSH2 0x3975
0000396f: SWAP2
00003970: SWAP1
00003971: PUSH2 0x40f3
00003974: JUMP
00003975: JUMPDEST
00003976: PUSH1 0x01
00003978: PUSH1 0x01
0000397a: PUSH1 0xa0
0000397c: SHL
0000397d: SUB
0000397e: AND
0000397f: DUP3
00003980: PUSH1 0x01
00003982: PUSH1 0x01
00003984: PUSH1 0xa0
00003986: SHL
00003987: SUB
00003988: AND
00003989: EQ
0000398a: ISZERO
0000398b: JUMPDEST
0000398c: ISZERO
0000398d: PUSH2 0x3a03
00003990: JUMPI
00003991: PUSH1 0x12
00003993: PUSH1 0x00
00003995: DUP4
00003996: PUSH1 0x01
00003998: PUSH1 0x01
0000399a: PUSH1 0xa0
0000399c: SHL
0000399d: SUB
0000399e: AND
0000399f: PUSH1 0x01
000039a1: PUSH1 0x01
000039a3: PUSH1 0xa0
000039a5: SHL
000039a6: SUB
000039a7: AND
000039a8: DUP2
000039a9: MSTORE
000039aa: PUSH1 0x20
000039ac: ADD
000039ad: SWAP1
000039ae: DUP2
000039af: MSTORE
000039b0: PUSH1 0x20
000039b2: ADD
000039b3: PUSH1 0x00
000039b5: KECCAK256
000039b6: PUSH1 0x01
000039b8: ADD
000039b9: PUSH1 0x40
000039bb: MLOAD
000039bc: DUP1
000039bd: PUSH1 0x40
000039bf: ADD
000039c0: PUSH1 0x40
000039c2: MSTORE
000039c3: DUP1
000039c4: PUSH1 0x0e
000039c6: SLOAD
000039c7: TIMESTAMP
000039c8: PUSH2 0x39d1
000039cb: SWAP2
000039cc: SWAP1
000039cd: PUSH2 0x4619
000039d0: JUMP
000039d1: JUMPDEST
000039d2: DUP2
000039d3: MSTORE
000039d4: PUSH1 0x20
000039d6: SWAP1
000039d7: DUP2
000039d8: ADD
000039d9: DUP5
000039da: SWAP1
000039db: MSTORE
000039dc: DUP3
000039dd: SLOAD
000039de: PUSH1 0x01
000039e0: DUP2
000039e1: DUP2
000039e2: ADD
000039e3: DUP6
000039e4: SSTORE
000039e5: PUSH1 0x00
000039e7: SWAP5
000039e8: DUP6
000039e9: MSTORE
000039ea: SWAP4
000039eb: DUP3
000039ec: SWAP1
000039ed: KECCAK256
000039ee: DUP4
000039ef: MLOAD
000039f0: PUSH1 0x02
000039f2: SWAP1
000039f3: SWAP3
000039f4: MUL
000039f5: ADD
000039f6: SWAP1
000039f7: DUP2
000039f8: SSTORE
000039f9: SWAP2
000039fa: ADD
000039fb: MLOAD
000039fc: SWAP2
000039fd: ADD
000039fe: SSTORE
000039ff: PUSH2 0x3aec
00003a02: JUMP
00003a03: JUMPDEST
00003a04: PUSH1 0x01
00003a06: PUSH1 0x01
00003a08: PUSH1 0xa0
00003a0a: SHL
00003a0b: SUB
00003a0c: DUP4
00003a0d: AND
00003a0e: PUSH1 0x00
00003a10: SWAP1
00003a11: DUP2
00003a12: MSTORE
00003a13: PUSH1 0x12
00003a15: PUSH1 0x20
00003a17: MSTORE
00003a18: PUSH1 0x40
00003a1a: SWAP1
00003a1b: KECCAK256
00003a1c: PUSH1 0x01
00003a1e: ADD
00003a1f: SLOAD
00003a20: ISZERO
00003a21: PUSH2 0x3aec
00003a24: JUMPI
00003a25: PUSH1 0x00
00003a27: DUP1
00003a28: PUSH2 0x3a30
00003a2b: DUP6
00003a2c: PUSH2 0x3054
00003a2f: JUMP
00003a30: JUMPDEST
00003a31: SWAP2
00003a32: POP
00003a33: SWAP2
00003a34: POP
00003a35: PUSH1 0x00
00003a37: DUP3
00003a38: PUSH2 0x3a40
00003a3b: DUP8
00003a3c: PUSH2 0x1881
00003a3f: JUMP
00003a40: JUMPDEST
00003a41: PUSH2 0x3a4a
00003a44: SWAP2
00003a45: SWAP1
00003a46: PUSH2 0x459f
00003a49: JUMP
00003a4a: JUMPDEST
00003a4b: SWAP1
00003a4c: POP
00003a4d: DUP1
00003a4e: DUP5
00003a4f: DUP1
00003a50: DUP3
00003a51: LT
00003a52: ISZERO
00003a53: PUSH2 0x3a78
00003a56: JUMPI
00003a57: PUSH1 0x40
00003a59: MLOAD
00003a5a: PUSH4 0xb388f18d
00003a5f: PUSH1 0xe0
00003a61: SHL
00003a62: DUP2
00003a63: MSTORE
00003a64: PUSH1 0x04
00003a66: DUP2
00003a67: ADD
00003a68: SWAP3
00003a69: SWAP1
00003a6a: SWAP3
00003a6b: MSTORE
00003a6c: PUSH1 0x24
00003a6e: DUP3
00003a6f: ADD
00003a70: MSTORE
00003a71: PUSH1 0x44
00003a73: ADD
00003a74: PUSH2 0x0cac
00003a77: JUMP
00003a78: JUMPDEST
00003a79: POP
00003a7a: POP
00003a7b: PUSH1 0x01
00003a7d: PUSH1 0x01
00003a7f: PUSH1 0xa0
00003a81: SHL
00003a82: SUB
00003a83: DUP7
00003a84: AND
00003a85: PUSH1 0x00
00003a87: SWAP1
00003a88: DUP2
00003a89: MSTORE
00003a8a: PUSH1 0x12
00003a8c: PUSH1 0x20
00003a8e: MSTORE
00003a8f: PUSH1 0x40
00003a91: SWAP1
00003a92: KECCAK256
00003a93: PUSH1 0x01
00003a95: ADD
00003a96: SLOAD
00003a97: DUP3
00003a98: SUB
00003a99: PUSH2 0x3acc
00003a9c: JUMPI
00003a9d: PUSH1 0x01
00003a9f: PUSH1 0x01
00003aa1: PUSH1 0xa0
00003aa3: SHL
00003aa4: SUB
00003aa5: DUP7
00003aa6: AND
00003aa7: PUSH1 0x00
00003aa9: SWAP1
00003aaa: DUP2
00003aab: MSTORE
00003aac: PUSH1 0x12
00003aae: PUSH1 0x20
00003ab0: MSTORE
00003ab1: PUSH1 0x40
00003ab3: DUP2
00003ab4: KECCAK256
00003ab5: DUP2
00003ab6: DUP2
00003ab7: SSTORE
00003ab8: SWAP1
00003ab9: PUSH2 0x3ac5
00003abc: PUSH1 0x01
00003abe: DUP4
00003abf: ADD
00003ac0: DUP3
00003ac1: PUSH2 0x3d5d
00003ac4: JUMP
00003ac5: JUMPDEST
00003ac6: POP
00003ac7: POP
00003ac8: PUSH2 0x3ae8
00003acb: JUMP
00003acc: JUMPDEST
00003acd: PUSH1 0x01
00003acf: PUSH1 0x01
00003ad1: PUSH1 0xa0
00003ad3: SHL
00003ad4: SUB
00003ad5: DUP7
00003ad6: AND
00003ad7: PUSH1 0x00
00003ad9: SWAP1
00003ada: DUP2
00003adb: MSTORE
00003adc: PUSH1 0x12
00003ade: PUSH1 0x20
00003ae0: MSTORE
00003ae1: PUSH1 0x40
00003ae3: SWAP1
00003ae4: KECCAK256
00003ae5: DUP3
00003ae6: SWAP1
00003ae7: SSTORE
00003ae8: JUMPDEST
00003ae9: POP
00003aea: POP
00003aeb: POP
00003aec: JUMPDEST
00003aed: PUSH2 0x2c02
00003af0: DUP4
00003af1: DUP4
00003af2: DUP4
00003af3: PUSH2 0x3c00
00003af6: JUMP
00003af7: JUMPDEST
00003af8: PUSH32 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00
00003b19: SLOAD
00003b1a: PUSH1 0x01
00003b1c: PUSH1 0x40
00003b1e: SHL
00003b1f: SWAP1
00003b20: DIV
00003b21: PUSH1 0xff
00003b23: AND
00003b24: PUSH2 0x2c71
00003b27: JUMPI
00003b28: PUSH1 0x40
00003b2a: MLOAD
00003b2b: PUSH4 0x1afcd79f
00003b30: PUSH1 0xe3
00003b32: SHL
00003b33: DUP2
00003b34: MSTORE
00003b35: PUSH1 0x04
00003b37: ADD
00003b38: PUSH1 0x40
00003b3a: MLOAD
00003b3b: DUP1
00003b3c: SWAP2
00003b3d: SUB
00003b3e: SWAP1
00003b3f: REVERT
00003b40: JUMPDEST
00003b41: PUSH1 0x00
00003b43: DUP1
00003b44: PUSH1 0x20
00003b46: PUSH1 0x00
00003b48: DUP5
00003b49: MLOAD
00003b4a: PUSH1 0x20
00003b4c: DUP7
00003b4d: ADD
00003b4e: PUSH1 0x00
00003b50: DUP9
00003b51: GAS
00003b52: CALL
00003b53: DUP1
00003b54: PUSH2 0x3b63
00003b57: JUMPI
00003b58: PUSH1 0x40
00003b5a: MLOAD
00003b5b: RETURNDATASIZE
00003b5c: PUSH1 0x00
00003b5e: DUP3
00003b5f: RETURNDATACOPY
00003b60: RETURNDATASIZE
00003b61: DUP2
00003b62: REVERT
00003b63: JUMPDEST
00003b64: POP
00003b65: POP
00003b66: PUSH1 0x00
00003b68: MLOAD
00003b69: RETURNDATASIZE
00003b6a: SWAP2
00003b6b: POP
00003b6c: DUP2
00003b6d: ISZERO
00003b6e: PUSH2 0x3b7b
00003b71: JUMPI
00003b72: DUP1
00003b73: PUSH1 0x01
00003b75: EQ
00003b76: ISZERO
00003b77: PUSH2 0x3b88
00003b7a: JUMP
00003b7b: JUMPDEST
00003b7c: PUSH1 0x01
00003b7e: PUSH1 0x01
00003b80: PUSH1 0xa0
00003b82: SHL
00003b83: SUB
00003b84: DUP5
00003b85: AND
00003b86: EXTCODESIZE
00003b87: ISZERO
00003b88: JUMPDEST
00003b89: ISZERO
00003b8a: PUSH2 0x3459
00003b8d: JUMPI
00003b8e: PUSH1 0x40
00003b90: MLOAD
00003b91: PUSH4 0x5274afe7
00003b96: PUSH1 0xe0
00003b98: SHL
00003b99: DUP2
00003b9a: MSTORE
00003b9b: PUSH1 0x01
00003b9d: PUSH1 0x01
00003b9f: PUSH1 0xa0
00003ba1: SHL
00003ba2: SUB
00003ba3: DUP6
00003ba4: AND
00003ba5: PUSH1 0x04
00003ba7: DUP3
00003ba8: ADD
00003ba9: MSTORE
00003baa: PUSH1 0x24
00003bac: ADD
00003bad: PUSH2 0x0cac
00003bb0: JUMP
00003bb1: JUMPDEST
00003bb2: PUSH1 0x00
00003bb4: DUP1
00003bb5: PUSH1 0x00
00003bb7: DUP1
00003bb8: PUSH1 0x20
00003bba: PUSH1 0x00
00003bbc: DUP7
00003bbd: MLOAD
00003bbe: PUSH1 0x20
00003bc0: DUP9
00003bc1: ADD
00003bc2: PUSH1 0x00
00003bc4: DUP11
00003bc5: GAS
00003bc6: CALL
00003bc7: SWAP3
00003bc8: POP
00003bc9: RETURNDATASIZE
00003bca: SWAP2
00003bcb: POP
00003bcc: PUSH1 0x00
00003bce: MLOAD
00003bcf: SWAP1
00003bd0: POP
00003bd1: DUP3
00003bd2: DUP1
00003bd3: ISZERO
00003bd4: PUSH2 0x3bf6
00003bd7: JUMPI
00003bd8: POP
00003bd9: DUP2
00003bda: ISZERO
00003bdb: PUSH2 0x3be7
00003bde: JUMPI
00003bdf: DUP1
00003be0: PUSH1 0x01
00003be2: EQ
00003be3: PUSH2 0x3bf6
00003be6: JUMP
00003be7: JUMPDEST
00003be8: PUSH1 0x00
00003bea: DUP7
00003beb: PUSH1 0x01
00003bed: PUSH1 0x01
00003bef: PUSH1 0xa0
00003bf1: SHL
00003bf2: SUB
00003bf3: AND
00003bf4: EXTCODESIZE
00003bf5: GT
00003bf6: JUMPDEST
00003bf7: SWAP7
00003bf8: SWAP6
00003bf9: POP
00003bfa: POP
00003bfb: POP
00003bfc: POP
00003bfd: POP
00003bfe: POP
00003bff: JUMP
00003c00: JUMPDEST
00003c01: PUSH1 0x00
00003c03: DUP1
00003c04: MLOAD
00003c05: PUSH1 0x20
00003c07: PUSH2 0x4d10
00003c0a: DUP4
00003c0b: CODECOPY
00003c0c: DUP2
00003c0d: MLOAD
00003c0e: SWAP2
00003c0f: MSTORE
00003c10: PUSH1 0x01
00003c12: PUSH1 0x01
00003c14: PUSH1 0xa0
00003c16: SHL
00003c17: SUB
00003c18: DUP5
00003c19: AND
00003c1a: PUSH2 0x3c3c
00003c1d: JUMPI
00003c1e: DUP2
00003c1f: DUP2
00003c20: PUSH1 0x02
00003c22: ADD
00003c23: PUSH1 0x00
00003c25: DUP3
00003c26: DUP3
00003c27: SLOAD
00003c28: PUSH2 0x3c31
00003c2b: SWAP2
00003c2c: SWAP1
00003c2d: PUSH2 0x4619
00003c30: JUMP
00003c31: JUMPDEST
00003c32: SWAP1
00003c33: SWAP2
00003c34: SSTORE
00003c35: POP
00003c36: PUSH2 0x3cae
00003c39: SWAP1
00003c3a: POP
00003c3b: JUMP
00003c3c: JUMPDEST
00003c3d: PUSH1 0x01
00003c3f: PUSH1 0x01
00003c41: PUSH1 0xa0
00003c43: SHL
00003c44: SUB
00003c45: DUP5
00003c46: AND
00003c47: PUSH1 0x00
00003c49: SWAP1
00003c4a: DUP2
00003c4b: MSTORE
00003c4c: PUSH1 0x20
00003c4e: DUP3
00003c4f: SWAP1
00003c50: MSTORE
00003c51: PUSH1 0x40
00003c53: SWAP1
00003c54: KECCAK256
00003c55: SLOAD
00003c56: DUP3
00003c57: DUP2
00003c58: LT
00003c59: ISZERO
00003c5a: PUSH2 0x3c8f
00003c5d: JUMPI
00003c5e: PUSH1 0x40
00003c60: MLOAD
00003c61: PUSH4 0x391434e3
00003c66: PUSH1 0xe2
00003c68: SHL
00003c69: DUP2
00003c6a: MSTORE
00003c6b: PUSH1 0x01
00003c6d: PUSH1 0x01
00003c6f: PUSH1 0xa0
00003c71: SHL
00003c72: SUB
00003c73: DUP7
00003c74: AND
00003c75: PUSH1 0x04
00003c77: DUP3
00003c78: ADD
00003c79: MSTORE
00003c7a: PUSH1 0x24
00003c7c: DUP2
00003c7d: ADD
00003c7e: DUP3
00003c7f: SWAP1
00003c80: MSTORE
00003c81: PUSH1 0x44
00003c83: DUP2
00003c84: ADD
00003c85: DUP5
00003c86: SWAP1
00003c87: MSTORE
00003c88: PUSH1 0x64
00003c8a: ADD
00003c8b: PUSH2 0x0cac
00003c8e: JUMP
00003c8f: JUMPDEST
00003c90: PUSH1 0x01
00003c92: PUSH1 0x01
00003c94: PUSH1 0xa0
00003c96: SHL
00003c97: SUB
00003c98: DUP6
00003c99: AND
00003c9a: PUSH1 0x00
00003c9c: SWAP1
00003c9d: DUP2
00003c9e: MSTORE
00003c9f: PUSH1 0x20
00003ca1: DUP4
00003ca2: SWAP1
00003ca3: MSTORE
00003ca4: PUSH1 0x40
00003ca6: SWAP1
00003ca7: KECCAK256
00003ca8: SWAP1
00003ca9: DUP4
00003caa: SWAP1
00003cab: SUB
00003cac: SWAP1
00003cad: SSTORE
00003cae: JUMPDEST
00003caf: PUSH1 0x01
00003cb1: PUSH1 0x01
00003cb3: PUSH1 0xa0
00003cb5: SHL
00003cb6: SUB
00003cb7: DUP4
00003cb8: AND
00003cb9: PUSH2 0x3ccc
00003cbc: JUMPI
00003cbd: PUSH1 0x02
00003cbf: DUP2
00003cc0: ADD
00003cc1: DUP1
00003cc2: SLOAD
00003cc3: DUP4
00003cc4: SWAP1
00003cc5: SUB
00003cc6: SWAP1
00003cc7: SSTORE
00003cc8: PUSH2 0x3ceb
00003ccb: JUMP
00003ccc: JUMPDEST
00003ccd: PUSH1 0x01
00003ccf: PUSH1 0x01
00003cd1: PUSH1 0xa0
00003cd3: SHL
00003cd4: SUB
00003cd5: DUP4
00003cd6: AND
00003cd7: PUSH1 0x00
00003cd9: SWAP1
00003cda: DUP2
00003cdb: MSTORE
00003cdc: PUSH1 0x20
00003cde: DUP3
00003cdf: SWAP1
00003ce0: MSTORE
00003ce1: PUSH1 0x40
00003ce3: SWAP1
00003ce4: KECCAK256
00003ce5: DUP1
00003ce6: SLOAD
00003ce7: DUP4
00003ce8: ADD
00003ce9: SWAP1
00003cea: SSTORE
00003ceb: JUMPDEST
00003cec: DUP3
00003ced: PUSH1 0x01
00003cef: PUSH1 0x01
00003cf1: PUSH1 0xa0
00003cf3: SHL
00003cf4: SUB
00003cf5: AND
00003cf6: DUP5
00003cf7: PUSH1 0x01
00003cf9: PUSH1 0x01
00003cfb: PUSH1 0xa0
00003cfd: SHL
00003cfe: SUB
00003cff: AND
00003d00: PUSH32 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef
00003d21: DUP5
00003d22: PUSH1 0x40
00003d24: MLOAD
00003d25: PUSH2 0x3d30
00003d28: SWAP2
00003d29: DUP2
00003d2a: MSTORE
00003d2b: PUSH1 0x20
00003d2d: ADD
00003d2e: SWAP1
00003d2f: JUMP
00003d30: JUMPDEST
00003d31: PUSH1 0x40
00003d33: MLOAD
00003d34: DUP1
00003d35: SWAP2
00003d36: SUB
00003d37: SWAP1
00003d38: LOG3
00003d39: POP
00003d3a: POP
00003d3b: POP
00003d3c: POP
00003d3d: JUMP
00003d3e: JUMPDEST
00003d3f: PUSH1 0x40
00003d41: MLOAD
00003d42: DUP1
00003d43: PUSH2 0x0100
00003d46: ADD
00003d47: PUSH1 0x40
00003d49: MSTORE
00003d4a: DUP1
00003d4b: PUSH1 0x08
00003d4d: SWAP1
00003d4e: PUSH1 0x20
00003d50: DUP3
00003d51: MUL
00003d52: DUP1
00003d53: CALLDATASIZE
00003d54: DUP4
00003d55: CALLDATACOPY
00003d56: POP
00003d57: SWAP2
00003d58: SWAP3
00003d59: SWAP2
00003d5a: POP
00003d5b: POP
00003d5c: JUMP
00003d5d: JUMPDEST
00003d5e: POP
00003d5f: DUP1
00003d60: SLOAD
00003d61: PUSH1 0x00
00003d63: DUP3
00003d64: SSTORE
00003d65: PUSH1 0x02
00003d67: MUL
00003d68: SWAP1
00003d69: PUSH1 0x00
00003d6b: MSTORE
00003d6c: PUSH1 0x20
00003d6e: PUSH1 0x00
00003d70: KECCAK256
00003d71: SWAP1
00003d72: DUP2
00003d73: ADD
00003d74: SWAP1
00003d75: PUSH2 0x0cf1
00003d78: SWAP2
00003d79: SWAP1
00003d7a: JUMPDEST
00003d7b: DUP1
00003d7c: DUP3
00003d7d: GT
00003d7e: ISZERO
00003d7f: PUSH2 0x3d94
00003d82: JUMPI
00003d83: PUSH1 0x00
00003d85: DUP1
00003d86: DUP3
00003d87: SSTORE
00003d88: PUSH1 0x01
00003d8a: DUP3
00003d8b: ADD
00003d8c: SSTORE
00003d8d: PUSH1 0x02
00003d8f: ADD
00003d90: PUSH2 0x3d7a
00003d93: JUMP
00003d94: JUMPDEST
00003d95: POP
00003d96: SWAP1
00003d97: JUMP
00003d98: JUMPDEST
00003d99: PUSH1 0x00
00003d9b: JUMPDEST
00003d9c: DUP4
00003d9d: DUP2
00003d9e: LT
00003d9f: ISZERO
00003da0: PUSH2 0x3db3
00003da3: JUMPI
00003da4: DUP2
00003da5: DUP2
00003da6: ADD
00003da7: MLOAD
00003da8: DUP4
00003da9: DUP3
00003daa: ADD
00003dab: MSTORE
00003dac: PUSH1 0x20
00003dae: ADD
00003daf: PUSH2 0x3d9b
00003db2: JUMP
00003db3: JUMPDEST
00003db4: POP
00003db5: POP
00003db6: PUSH1 0x00
00003db8: SWAP2
00003db9: ADD
00003dba: MSTORE
00003dbb: JUMP
00003dbc: JUMPDEST
00003dbd: PUSH1 0x20
00003dbf: DUP2
00003dc0: MSTORE
00003dc1: PUSH1 0x00
00003dc3: DUP3
00003dc4: MLOAD
00003dc5: DUP1
00003dc6: PUSH1 0x20
00003dc8: DUP5
00003dc9: ADD
00003dca: MSTORE
00003dcb: PUSH2 0x3ddb
00003dce: DUP2
00003dcf: PUSH1 0x40
00003dd1: DUP6
00003dd2: ADD
00003dd3: PUSH1 0x20
00003dd5: DUP8
00003dd6: ADD
00003dd7: PUSH2 0x3d98
00003dda: JUMP
00003ddb: JUMPDEST
00003ddc: PUSH1 0x1f
00003dde: ADD
00003ddf: PUSH1 0x1f
00003de1: NOT
00003de2: AND
00003de3: SWAP2
00003de4: SWAP1
00003de5: SWAP2
00003de6: ADD
00003de7: PUSH1 0x40
00003de9: ADD
00003dea: SWAP3
00003deb: SWAP2
00003dec: POP
00003ded: POP
00003dee: JUMP
00003def: JUMPDEST
00003df0: PUSH1 0x01
00003df2: PUSH1 0x01
00003df4: PUSH1 0xa0
00003df6: SHL
00003df7: SUB
00003df8: DUP2
00003df9: AND
00003dfa: DUP2
00003dfb: EQ
00003dfc: PUSH2 0x0cf1
00003dff: JUMPI
00003e00: PUSH1 0x00
00003e02: DUP1
00003e03: REVERT
00003e04: JUMPDEST
00003e05: DUP1
00003e06: CALLDATALOAD
00003e07: PUSH2 0x0d46
00003e0a: DUP2
00003e0b: PUSH2 0x3def
00003e0e: JUMP
00003e0f: JUMPDEST
00003e10: PUSH1 0x00
00003e12: DUP1
00003e13: PUSH1 0x40
00003e15: DUP4
00003e16: DUP6
00003e17: SUB
00003e18: SLT
00003e19: ISZERO
00003e1a: PUSH2 0x3e22
00003e1d: JUMPI
00003e1e: PUSH1 0x00
00003e20: DUP1
00003e21: REVERT
00003e22: JUMPDEST
00003e23: DUP3
00003e24: CALLDATALOAD
00003e25: PUSH2 0x3e2d
00003e28: DUP2
00003e29: PUSH2 0x3def
00003e2c: JUMP
00003e2d: JUMPDEST
00003e2e: SWAP5
00003e2f: PUSH1 0x20
00003e31: SWAP4
00003e32: SWAP1
00003e33: SWAP4
00003e34: ADD
00003e35: CALLDATALOAD
00003e36: SWAP4
00003e37: POP
00003e38: POP
00003e39: POP
00003e3a: JUMP
00003e3b: JUMPDEST
00003e3c: PUSH1 0x00
00003e3e: PUSH1 0x20
00003e40: DUP3
00003e41: DUP5
00003e42: SUB
00003e43: SLT
00003e44: ISZERO
00003e45: PUSH2 0x3e4d
00003e48: JUMPI
00003e49: PUSH1 0x00
00003e4b: DUP1
00003e4c: REVERT
00003e4d: JUMPDEST
00003e4e: POP
00003e4f: CALLDATALOAD
00003e50: SWAP2
00003e51: SWAP1
00003e52: POP
00003e53: JUMP
00003e54: JUMPDEST
00003e55: PUSH1 0x00
00003e57: PUSH1 0x20
00003e59: DUP3
00003e5a: DUP5
00003e5b: SUB
00003e5c: SLT
00003e5d: ISZERO
00003e5e: PUSH2 0x3e66
00003e61: JUMPI
00003e62: PUSH1 0x00
00003e64: DUP1
00003e65: REVERT
00003e66: JUMPDEST
00003e67: DUP2
00003e68: CALLDATALOAD
00003e69: PUSH2 0x3e71
00003e6c: DUP2
00003e6d: PUSH2 0x3def
00003e70: JUMP
00003e71: JUMPDEST
00003e72: SWAP4
00003e73: SWAP3
00003e74: POP
00003e75: POP
00003e76: POP
00003e77: JUMP
00003e78: JUMPDEST
00003e79: PUSH1 0x00
00003e7b: DUP1
00003e7c: PUSH1 0x00
00003e7e: PUSH1 0x60
00003e80: DUP5
00003e81: DUP7
00003e82: SUB
00003e83: SLT
00003e84: ISZERO
00003e85: PUSH2 0x3e8d
00003e88: JUMPI
00003e89: PUSH1 0x00
00003e8b: DUP1
00003e8c: REVERT
00003e8d: JUMPDEST
00003e8e: DUP4
00003e8f: CALLDATALOAD
00003e90: PUSH2 0x3e98
00003e93: DUP2
00003e94: PUSH2 0x3def
00003e97: JUMP
00003e98: JUMPDEST
00003e99: SWAP3
00003e9a: POP
00003e9b: PUSH1 0x20
00003e9d: DUP5
00003e9e: ADD
00003e9f: CALLDATALOAD
00003ea0: PUSH2 0x3ea8
00003ea3: DUP2
00003ea4: PUSH2 0x3def
00003ea7: JUMP
00003ea8: JUMPDEST
00003ea9: SWAP3
00003eaa: SWAP6
00003eab: SWAP3
00003eac: SWAP5
00003ead: POP
00003eae: POP
00003eaf: POP
00003eb0: PUSH1 0x40
00003eb2: SWAP2
00003eb3: SWAP1
00003eb4: SWAP2
00003eb5: ADD
00003eb6: CALLDATALOAD
00003eb7: SWAP1
00003eb8: JUMP
00003eb9: JUMPDEST
00003eba: PUSH1 0x00
00003ebc: PUSH1 0x20
00003ebe: DUP3
00003ebf: DUP5
00003ec0: SUB
00003ec1: SLT
00003ec2: ISZERO
00003ec3: PUSH2 0x3ecb
00003ec6: JUMPI
00003ec7: PUSH1 0x00
00003ec9: DUP1
00003eca: REVERT
00003ecb: JUMPDEST
00003ecc: DUP2
00003ecd: CALLDATALOAD
00003ece: PUSH1 0x01
00003ed0: PUSH1 0x01
00003ed2: PUSH1 0x40
00003ed4: SHL
00003ed5: SUB
00003ed6: DUP2
00003ed7: GT
00003ed8: ISZERO
00003ed9: PUSH2 0x3ee1
00003edc: JUMPI
00003edd: PUSH1 0x00
00003edf: DUP1
00003ee0: REVERT
00003ee1: JUMPDEST
00003ee2: DUP3
00003ee3: ADD
00003ee4: PUSH1 0x60
00003ee6: DUP2
00003ee7: DUP6
00003ee8: SUB
00003ee9: SLT
00003eea: ISZERO
00003eeb: PUSH2 0x3e71
00003eee: JUMPI
00003eef: PUSH1 0x00
00003ef1: DUP1
00003ef2: REVERT
00003ef3: JUMPDEST
00003ef4: PUSH2 0x0100
00003ef7: DUP2
00003ef8: ADD
00003ef9: DUP2
00003efa: DUP4
00003efb: PUSH1 0x00
00003efd: JUMPDEST
00003efe: PUSH1 0x08
00003f00: DUP2
00003f01: LT
00003f02: ISZERO
00003f03: PUSH2 0x3f25
00003f06: JUMPI
00003f07: DUP2
00003f08: MLOAD
00003f09: PUSH1 0x01
00003f0b: PUSH1 0x01
00003f0d: PUSH1 0xa0
00003f0f: SHL
00003f10: SUB
00003f11: AND
00003f12: DUP4
00003f13: MSTORE
00003f14: PUSH1 0x20
00003f16: SWAP3
00003f17: DUP4
00003f18: ADD
00003f19: SWAP3
00003f1a: SWAP1
00003f1b: SWAP2
00003f1c: ADD
00003f1d: SWAP1
00003f1e: PUSH1 0x01
00003f20: ADD
00003f21: PUSH2 0x3efd
00003f24: JUMP
00003f25: JUMPDEST
00003f26: POP
00003f27: POP
00003f28: POP
00003f29: SWAP3
00003f2a: SWAP2
00003f2b: POP
00003f2c: POP
00003f2d: JUMP
00003f2e: JUMPDEST
00003f2f: PUSH1 0x00
00003f31: DUP1
00003f32: DUP4
00003f33: PUSH1 0x1f
00003f35: DUP5
00003f36: ADD
00003f37: SLT
00003f38: PUSH2 0x3f40
00003f3b: JUMPI
00003f3c: PUSH1 0x00
00003f3e: DUP1
00003f3f: REVERT
00003f40: JUMPDEST
00003f41: POP
00003f42: DUP2
00003f43: CALLDATALOAD
00003f44: PUSH1 0x01
00003f46: PUSH1 0x01
00003f48: PUSH1 0x40
00003f4a: SHL
00003f4b: SUB
00003f4c: DUP2
00003f4d: GT
00003f4e: ISZERO
00003f4f: PUSH2 0x3f57
00003f52: JUMPI
00003f53: PUSH1 0x00
00003f55: DUP1
00003f56: REVERT
00003f57: JUMPDEST
00003f58: PUSH1 0x20
00003f5a: DUP4
00003f5b: ADD
00003f5c: SWAP2
00003f5d: POP
00003f5e: DUP4
00003f5f: PUSH1 0x20
00003f61: DUP3
00003f62: DUP6
00003f63: ADD
00003f64: ADD
00003f65: GT
00003f66: ISZERO
00003f67: PUSH2 0x3f6f
00003f6a: JUMPI
00003f6b: PUSH1 0x00
00003f6d: DUP1
00003f6e: REVERT
00003f6f: JUMPDEST
00003f70: SWAP3
00003f71: POP
00003f72: SWAP3
00003f73: SWAP1
00003f74: POP
00003f75: JUMP
00003f76: JUMPDEST
00003f77: PUSH1 0x00
00003f79: DUP1
00003f7a: PUSH1 0x00
00003f7c: DUP1
00003f7d: PUSH1 0x00
00003f7f: DUP1
00003f80: DUP7
00003f81: DUP9
00003f82: SUB
00003f83: PUSH2 0x0160
00003f86: DUP2
00003f87: SLT
00003f88: ISZERO
00003f89: PUSH2 0x3f91
00003f8c: JUMPI
00003f8d: PUSH1 0x00
00003f8f: DUP1
00003f90: REVERT
00003f91: JUMPDEST
00003f92: DUP8
00003f93: CALLDATALOAD
00003f94: PUSH2 0x3f9c
00003f97: DUP2
00003f98: PUSH2 0x3def
00003f9b: JUMP
00003f9c: JUMPDEST
00003f9d: SWAP7
00003f9e: POP
00003f9f: PUSH1 0x20
00003fa1: DUP9
00003fa2: ADD
00003fa3: CALLDATALOAD
00003fa4: PUSH1 0x01
00003fa6: PUSH1 0x01
00003fa8: PUSH1 0x40
00003faa: SHL
00003fab: SUB
00003fac: DUP2
00003fad: GT
00003fae: ISZERO
00003faf: PUSH2 0x3fb7
00003fb2: JUMPI
00003fb3: PUSH1 0x00
00003fb5: DUP1
00003fb6: REVERT
00003fb7: JUMPDEST
00003fb8: PUSH2 0x3fc3
00003fbb: DUP11
00003fbc: DUP3
00003fbd: DUP12
00003fbe: ADD
00003fbf: PUSH2 0x3f2e
00003fc2: JUMP
00003fc3: JUMPDEST
00003fc4: SWAP1
00003fc5: SWAP8
00003fc6: POP
00003fc7: SWAP6
00003fc8: POP
00003fc9: POP
00003fca: PUSH1 0x40
00003fcc: DUP9
00003fcd: ADD
00003fce: CALLDATALOAD
00003fcf: PUSH1 0x01
00003fd1: PUSH1 0x01
00003fd3: PUSH1 0x40
00003fd5: SHL
00003fd6: SUB
00003fd7: DUP2
00003fd8: GT
00003fd9: ISZERO
00003fda: PUSH2 0x3fe2
00003fdd: JUMPI
00003fde: PUSH1 0x00
00003fe0: DUP1
00003fe1: REVERT
00003fe2: JUMPDEST
00003fe3: PUSH2 0x3fee
00003fe6: DUP11
00003fe7: DUP3
00003fe8: DUP12
00003fe9: ADD
00003fea: PUSH2 0x3f2e
00003fed: JUMP
00003fee: JUMPDEST
00003fef: SWAP1
00003ff0: SWAP6
00003ff1: POP
00003ff2: SWAP4
00003ff3: POP
00003ff4: POP
00003ff5: PUSH2 0x0100
00003ff8: PUSH1 0x5f
00003ffa: NOT
00003ffb: DUP3
00003ffc: ADD
00003ffd: SLT
00003ffe: ISZERO
00003fff: PUSH2 0x4007
00004002: JUMPI
00004003: PUSH1 0x00
00004005: DUP1
00004006: REVERT
00004007: JUMPDEST
00004008: POP
00004009: PUSH1 0x60
0000400b: DUP8
0000400c: ADD
0000400d: SWAP1
0000400e: POP
0000400f: SWAP3
00004010: SWAP6
00004011: POP
00004012: SWAP3
00004013: SWAP6
00004014: POP
00004015: SWAP3
00004016: SWAP6
00004017: JUMP
00004018: JUMPDEST
00004019: PUSH1 0x20
0000401b: DUP1
0000401c: DUP3
0000401d: MSTORE
0000401e: DUP3
0000401f: MLOAD
00004020: DUP3
00004021: DUP3
00004022: ADD
00004023: MSTORE
00004024: DUP3
00004025: DUP2
00004026: ADD
00004027: MLOAD
00004028: PUSH1 0x40
0000402a: DUP1
0000402b: DUP5
0000402c: ADD
0000402d: MSTORE
0000402e: DUP1
0000402f: MLOAD
00004030: PUSH1 0x60
00004032: DUP5
00004033: ADD
00004034: DUP2
00004035: SWAP1
00004036: MSTORE
00004037: PUSH1 0x00
00004039: SWAP3
0000403a: SWAP2
0000403b: SWAP1
0000403c: SWAP2
0000403d: ADD
0000403e: SWAP1
0000403f: DUP3
00004040: SWAP1
00004041: PUSH1 0x80
00004043: DUP6
00004044: ADD
00004045: SWAP1
00004046: JUMPDEST
00004047: DUP1
00004048: DUP4
00004049: LT
0000404a: ISZERO
0000404b: PUSH2 0x4076
0000404e: JUMPI
0000404f: DUP4
00004050: MLOAD
00004051: DUP1
00004052: MLOAD
00004053: DUP4
00004054: MSTORE
00004055: PUSH1 0x20
00004057: DUP2
00004058: ADD
00004059: MLOAD
0000405a: PUSH1 0x20
0000405c: DUP5
0000405d: ADD
0000405e: MSTORE
0000405f: POP
00004060: PUSH1 0x40
00004062: DUP3
00004063: ADD
00004064: SWAP2
00004065: POP
00004066: PUSH1 0x20
00004068: DUP5
00004069: ADD
0000406a: SWAP4
0000406b: POP
0000406c: PUSH1 0x01
0000406e: DUP4
0000406f: ADD
00004070: SWAP3
00004071: POP
00004072: PUSH2 0x4046
00004075: JUMP
00004076: JUMPDEST
00004077: POP
00004078: SWAP6
00004079: SWAP5
0000407a: POP
0000407b: POP
0000407c: POP
0000407d: POP
0000407e: POP
0000407f: JUMP
00004080: JUMPDEST
00004081: PUSH1 0x00
00004083: DUP1
00004084: PUSH1 0x40
00004086: DUP4
00004087: DUP6
00004088: SUB
00004089: SLT
0000408a: ISZERO
0000408b: PUSH2 0x4093
0000408e: JUMPI
0000408f: PUSH1 0x00
00004091: DUP1
00004092: REVERT
00004093: JUMPDEST
00004094: DUP3
00004095: CALLDATALOAD
00004096: PUSH2 0x409e
00004099: DUP2
0000409a: PUSH2 0x3def
0000409d: JUMP
0000409e: JUMPDEST
0000409f: SWAP2
000040a0: POP
000040a1: PUSH1 0x20
000040a3: DUP4
000040a4: ADD
000040a5: CALLDATALOAD
000040a6: PUSH2 0x40ae
000040a9: DUP2
000040aa: PUSH2 0x3def
000040ad: JUMP
000040ae: JUMPDEST
000040af: DUP1
000040b0: SWAP2
000040b1: POP
000040b2: POP
000040b3: SWAP3
000040b4: POP
000040b5: SWAP3
000040b6: SWAP1
000040b7: POP
000040b8: JUMP
000040b9: JUMPDEST
000040ba: PUSH1 0x01
000040bc: DUP2
000040bd: DUP2
000040be: SHR
000040bf: SWAP1
000040c0: DUP3
000040c1: AND
000040c2: DUP1
000040c3: PUSH2 0x40cd
000040c6: JUMPI
000040c7: PUSH1 0x7f
000040c9: DUP3
000040ca: AND
000040cb: SWAP2
000040cc: POP
000040cd: JUMPDEST
000040ce: PUSH1 0x20
000040d0: DUP3
000040d1: LT
000040d2: DUP2
000040d3: SUB
000040d4: PUSH2 0x40ed
000040d7: JUMPI
000040d8: PUSH4 0x4e487b71
000040dd: PUSH1 0xe0
000040df: SHL
000040e0: PUSH1 0x00
000040e2: MSTORE
000040e3: PUSH1 0x22
000040e5: PUSH1 0x04
000040e7: MSTORE
000040e8: PUSH1 0x24
000040ea: PUSH1 0x00
000040ec: REVERT
000040ed: JUMPDEST
000040ee: POP
000040ef: SWAP2
000040f0: SWAP1
000040f1: POP
000040f2: JUMP
000040f3: JUMPDEST
000040f4: PUSH1 0x00
000040f6: PUSH1 0x20
000040f8: DUP3
000040f9: DUP5
000040fa: SUB
000040fb: SLT
000040fc: ISZERO
000040fd: PUSH2 0x4105
00004100: JUMPI
00004101: PUSH1 0x00
00004103: DUP1
00004104: REVERT
00004105: JUMPDEST
00004106: DUP2
00004107: MLOAD
00004108: PUSH2 0x3e71
0000410b: DUP2
0000410c: PUSH2 0x3def
0000410f: JUMP
00004110: JUMPDEST
00004111: PUSH1 0x00
00004113: PUSH1 0x20
00004115: DUP3
00004116: DUP5
00004117: SUB
00004118: SLT
00004119: ISZERO
0000411a: PUSH2 0x4122
0000411d: JUMPI
0000411e: PUSH1 0x00
00004120: DUP1
00004121: REVERT
00004122: JUMPDEST
00004123: DUP2
00004124: MLOAD
00004125: DUP1
00004126: ISZERO
00004127: ISZERO
00004128: DUP2
00004129: EQ
0000412a: PUSH2 0x3e71
0000412d: JUMPI
0000412e: PUSH1 0x00
00004130: DUP1
00004131: REVERT
00004132: JUMPDEST
00004133: PUSH1 0x00
00004135: DUP1
00004136: DUP4
00004137: CALLDATALOAD
00004138: PUSH1 0x1e
0000413a: NOT
0000413b: DUP5
0000413c: CALLDATASIZE
0000413d: SUB
0000413e: ADD
0000413f: DUP2
00004140: SLT
00004141: PUSH2 0x4149
00004144: JUMPI
00004145: PUSH1 0x00
00004147: DUP1
00004148: REVERT
00004149: JUMPDEST
0000414a: DUP4
0000414b: ADD
0000414c: PUSH1 0x20
0000414e: DUP2
0000414f: ADD
00004150: SWAP3
00004151: POP
00004152: CALLDATALOAD
00004153: SWAP1
00004154: POP
00004155: PUSH1 0x01
00004157: PUSH1 0x01
00004159: PUSH1 0x40
0000415b: SHL
0000415c: SUB
0000415d: DUP2
0000415e: GT
0000415f: ISZERO
00004160: PUSH2 0x4168
00004163: JUMPI
00004164: PUSH1 0x00
00004166: DUP1
00004167: REVERT
00004168: JUMPDEST
00004169: DUP1
0000416a: CALLDATASIZE
0000416b: SUB
0000416c: DUP3
0000416d: SGT
0000416e: ISZERO
0000416f: PUSH2 0x3f6f
00004172: JUMPI
00004173: PUSH1 0x00
00004175: DUP1
00004176: REVERT
00004177: JUMPDEST
00004178: DUP2
00004179: DUP4
0000417a: MSTORE
0000417b: DUP2
0000417c: DUP2
0000417d: PUSH1 0x20
0000417f: DUP6
00004180: ADD
00004181: CALLDATACOPY
00004182: POP
00004183: PUSH1 0x00
00004185: DUP3
00004186: DUP3
00004187: ADD
00004188: PUSH1 0x20
0000418a: SWAP1
0000418b: DUP2
0000418c: ADD
0000418d: SWAP2
0000418e: SWAP1
0000418f: SWAP2
00004190: MSTORE
00004191: PUSH1 0x1f
00004193: SWAP1
00004194: SWAP2
00004195: ADD
00004196: PUSH1 0x1f
00004198: NOT
00004199: AND
0000419a: SWAP1
0000419b: SWAP2
0000419c: ADD
0000419d: ADD
0000419e: SWAP1
0000419f: JUMP
000041a0: JUMPDEST
000041a1: PUSH1 0x01
000041a3: PUSH1 0x01
000041a5: PUSH1 0xa0
000041a7: SHL
000041a8: SUB
000041a9: DUP4
000041aa: AND
000041ab: DUP2
000041ac: MSTORE
000041ad: PUSH1 0x40
000041af: PUSH1 0x20
000041b1: DUP3
000041b2: ADD
000041b3: MSTORE
000041b4: PUSH1 0x00
000041b6: PUSH2 0x41bf
000041b9: DUP4
000041ba: DUP1
000041bb: PUSH2 0x4132
000041be: JUMP
000041bf: JUMPDEST
000041c0: PUSH1 0x60
000041c2: PUSH1 0x40
000041c4: DUP6
000041c5: ADD
000041c6: MSTORE
000041c7: PUSH2 0x41d4
000041ca: PUSH1 0xa0
000041cc: DUP6
000041cd: ADD
000041ce: DUP3
000041cf: DUP5
000041d0: PUSH2 0x4177
000041d3: JUMP
000041d4: JUMPDEST
000041d5: SWAP2
000041d6: POP
000041d7: POP
000041d8: PUSH2 0x41e4
000041db: PUSH1 0x20
000041dd: DUP6
000041de: ADD
000041df: DUP6
000041e0: PUSH2 0x4132
000041e3: JUMP
000041e4: JUMPDEST
000041e5: DUP5
000041e6: DUP4
000041e7: SUB
000041e8: PUSH1 0x3f
000041ea: NOT
000041eb: ADD
000041ec: PUSH1 0x60
000041ee: DUP7
000041ef: ADD
000041f0: MSTORE
000041f1: PUSH2 0x41fb
000041f4: DUP4
000041f5: DUP3
000041f6: DUP5
000041f7: PUSH2 0x4177
000041fa: JUMP
000041fb: JUMPDEST
000041fc: PUSH1 0x40
000041fe: SWAP7
000041ff: SWAP1
00004200: SWAP7
00004201: ADD
00004202: CALLDATALOAD
00004203: PUSH1 0x80
00004205: SWAP6
00004206: SWAP1
00004207: SWAP6
00004208: ADD
00004209: SWAP5
0000420a: SWAP1
0000420b: SWAP5
0000420c: MSTORE
0000420d: POP
0000420e: SWAP3
0000420f: SWAP5
00004210: SWAP4
00004211: POP
00004212: POP
00004213: POP
00004214: POP
00004215: JUMP
00004216: JUMPDEST
00004217: PUSH1 0x00
00004219: DUP1
0000421a: DUP4
0000421b: CALLDATALOAD
0000421c: PUSH1 0x1e
0000421e: NOT
0000421f: DUP5
00004220: CALLDATASIZE
00004221: SUB
00004222: ADD
00004223: DUP2
00004224: SLT
00004225: PUSH2 0x422d
00004228: JUMPI
00004229: PUSH1 0x00
0000422b: DUP1
0000422c: REVERT
0000422d: JUMPDEST
0000422e: DUP4
0000422f: ADD
00004230: DUP1
00004231: CALLDATALOAD
00004232: SWAP2
00004233: POP
00004234: PUSH1 0x01
00004236: PUSH1 0x01
00004238: PUSH1 0x40
0000423a: SHL
0000423b: SUB
0000423c: DUP3
0000423d: GT
0000423e: ISZERO
0000423f: PUSH2 0x4247
00004242: JUMPI
00004243: PUSH1 0x00
00004245: DUP1
00004246: REVERT
00004247: JUMPDEST
00004248: PUSH1 0x20
0000424a: ADD
0000424b: SWAP2
0000424c: POP
0000424d: CALLDATASIZE
0000424e: DUP2
0000424f: SWAP1
00004250: SUB
00004251: DUP3
00004252: SGT
00004253: ISZERO
00004254: PUSH2 0x3f6f
00004257: JUMPI
00004258: PUSH1 0x00
0000425a: DUP1
0000425b: REVERT
0000425c: JUMPDEST
0000425d: PUSH4 0x4e487b71
00004262: PUSH1 0xe0
00004264: SHL
00004265: PUSH1 0x00
00004267: MSTORE
00004268: PUSH1 0x41
0000426a: PUSH1 0x04
0000426c: MSTORE
0000426d: PUSH1 0x24
0000426f: PUSH1 0x00
00004271: REVERT
00004272: JUMPDEST
00004273: PUSH1 0x40
00004275: DUP1
00004276: MLOAD
00004277: SWAP1
00004278: DUP2
00004279: ADD
0000427a: PUSH1 0x01
0000427c: PUSH1 0x01
0000427e: PUSH1 0x40
00004280: SHL
00004281: SUB
00004282: DUP2
00004283: GT
00004284: DUP3
00004285: DUP3
00004286: LT
00004287: OR
00004288: ISZERO
00004289: PUSH2 0x4294
0000428c: JUMPI
0000428d: PUSH2 0x4294
00004290: PUSH2 0x425c
00004293: JUMP
00004294: JUMPDEST
00004295: PUSH1 0x40
00004297: MSTORE
00004298: SWAP1
00004299: JUMP
0000429a: JUMPDEST
0000429b: PUSH1 0x40
0000429d: MLOAD
0000429e: PUSH1 0xc0
000042a0: DUP2
000042a1: ADD
000042a2: PUSH1 0x01
000042a4: PUSH1 0x01
000042a6: PUSH1 0x40
000042a8: SHL
000042a9: SUB
000042aa: DUP2
000042ab: GT
000042ac: DUP3
000042ad: DUP3
000042ae: LT
000042af: OR
000042b0: ISZERO
000042b1: PUSH2 0x4294
000042b4: JUMPI
000042b5: PUSH2 0x4294
000042b8: PUSH2 0x425c
000042bb: JUMP
000042bc: JUMPDEST
000042bd: PUSH1 0x40
000042bf: MLOAD
000042c0: PUSH1 0xa0
000042c2: DUP2
000042c3: ADD
000042c4: PUSH1 0x01
000042c6: PUSH1 0x01
000042c8: PUSH1 0x40
000042ca: SHL
000042cb: SUB
000042cc: DUP2
000042cd: GT
000042ce: DUP3
000042cf: DUP3
000042d0: LT
000042d1: OR
000042d2: ISZERO
000042d3: PUSH2 0x4294
000042d6: JUMPI
000042d7: PUSH2 0x4294
000042da: PUSH2 0x425c
000042dd: JUMP
000042de: JUMPDEST
000042df: PUSH1 0x40
000042e1: MLOAD
000042e2: PUSH1 0xe0
000042e4: DUP2
000042e5: ADD
000042e6: PUSH1 0x01
000042e8: PUSH1 0x01
000042ea: PUSH1 0x40
000042ec: SHL
000042ed: SUB
000042ee: DUP2
000042ef: GT
000042f0: DUP3
000042f1: DUP3
000042f2: LT
000042f3: OR
000042f4: ISZERO
000042f5: PUSH2 0x4294
000042f8: JUMPI
000042f9: PUSH2 0x4294
000042fc: PUSH2 0x425c
000042ff: JUMP
00004300: JUMPDEST
00004301: PUSH1 0x40
00004303: MLOAD
00004304: PUSH1 0x1f
00004306: DUP3
00004307: ADD
00004308: PUSH1 0x1f
0000430a: NOT
0000430b: AND
0000430c: DUP2
0000430d: ADD
0000430e: PUSH1 0x01
00004310: PUSH1 0x01
00004312: PUSH1 0x40
00004314: SHL
00004315: SUB
00004316: DUP2
00004317: GT
00004318: DUP3
00004319: DUP3
0000431a: LT
0000431b: OR
0000431c: ISZERO
0000431d: PUSH2 0x4328
00004320: JUMPI
00004321: PUSH2 0x4328
00004324: PUSH2 0x425c
00004327: JUMP
00004328: JUMPDEST
00004329: PUSH1 0x40
0000432b: MSTORE
0000432c: SWAP2
0000432d: SWAP1
0000432e: POP
0000432f: JUMP
00004330: JUMPDEST
00004331: PUSH1 0x00
00004333: PUSH1 0x01
00004335: PUSH1 0x01
00004337: PUSH1 0x40
00004339: SHL
0000433a: SUB
0000433b: DUP3
0000433c: GT
0000433d: ISZERO
0000433e: PUSH2 0x4349
00004341: JUMPI
00004342: PUSH2 0x4349
00004345: PUSH2 0x425c
00004348: JUMP
00004349: JUMPDEST
0000434a: POP
0000434b: PUSH1 0x05
0000434d: SHL
0000434e: PUSH1 0x20
00004350: ADD
00004351: SWAP1
00004352: JUMP
00004353: JUMPDEST
00004354: DUP1
00004355: CALLDATALOAD
00004356: PUSH1 0xff
00004358: DUP2
00004359: AND
0000435a: DUP2
0000435b: EQ
0000435c: PUSH2 0x0d46
0000435f: JUMPI
00004360: PUSH1 0x00
00004362: DUP1
00004363: REVERT
00004364: JUMPDEST
00004365: PUSH1 0x00
00004367: DUP3
00004368: PUSH1 0x1f
0000436a: DUP4
0000436b: ADD
0000436c: SLT
0000436d: PUSH2 0x4375
00004370: JUMPI
00004371: PUSH1 0x00
00004373: DUP1
00004374: REVERT
00004375: JUMPDEST
00004376: DUP2
00004377: CALLDATALOAD
00004378: PUSH2 0x4388
0000437b: PUSH2 0x4383
0000437e: DUP3
0000437f: PUSH2 0x4330
00004382: JUMP
00004383: JUMPDEST
00004384: PUSH2 0x4300
00004387: JUMP
00004388: JUMPDEST
00004389: DUP1
0000438a: DUP3
0000438b: DUP3
0000438c: MSTORE
0000438d: PUSH1 0x20
0000438f: DUP3
00004390: ADD
00004391: SWAP2
00004392: POP
00004393: PUSH1 0x20
00004395: DUP4
00004396: PUSH1 0x06
00004398: SHL
00004399: DUP7
0000439a: ADD
0000439b: ADD
0000439c: SWAP3
0000439d: POP
0000439e: DUP6
0000439f: DUP4
000043a0: GT
000043a1: ISZERO
000043a2: PUSH2 0x43aa
000043a5: JUMPI
000043a6: PUSH1 0x00
000043a8: DUP1
000043a9: REVERT
000043aa: JUMPDEST
000043ab: PUSH1 0x20
000043ad: DUP6
000043ae: ADD
000043af: JUMPDEST
000043b0: DUP4
000043b1: DUP2
000043b2: LT
000043b3: ISZERO
000043b4: PUSH2 0x4076
000043b7: JUMPI
000043b8: PUSH1 0x40
000043ba: DUP2
000043bb: DUP9
000043bc: SUB
000043bd: SLT
000043be: ISZERO
000043bf: PUSH2 0x43c7
000043c2: JUMPI
000043c3: PUSH1 0x00
000043c5: DUP1
000043c6: REVERT
000043c7: JUMPDEST
000043c8: PUSH2 0x43cf
000043cb: PUSH2 0x4272
000043ce: JUMP
000043cf: JUMPDEST
000043d0: PUSH2 0x43d8
000043d3: DUP3
000043d4: PUSH2 0x4353
000043d7: JUMP
000043d8: JUMPDEST
000043d9: DUP2
000043da: MSTORE
000043db: PUSH1 0x20
000043dd: DUP3
000043de: ADD
000043df: CALLDATALOAD
000043e0: PUSH2 0x43e8
000043e3: DUP2
000043e4: PUSH2 0x3def
000043e7: JUMP
000043e8: JUMPDEST
000043e9: PUSH1 0x20
000043eb: DUP3
000043ec: DUP2
000043ed: ADD
000043ee: SWAP2
000043ef: SWAP1
000043f0: SWAP2
000043f1: MSTORE
000043f2: SWAP1
000043f3: DUP5
000043f4: MSTORE
000043f5: SWAP3
000043f6: SWAP1
000043f7: SWAP3
000043f8: ADD
000043f9: SWAP2
000043fa: PUSH1 0x40
000043fc: ADD
000043fd: PUSH2 0x43af
00004400: JUMP
00004401: JUMPDEST
00004402: PUSH1 0x00
00004404: PUSH1 0xc0
00004406: DUP3
00004407: DUP5
00004408: SUB
00004409: SLT
0000440a: ISZERO
0000440b: PUSH2 0x4413
0000440e: JUMPI
0000440f: PUSH1 0x00
00004411: DUP1
00004412: REVERT
00004413: JUMPDEST
00004414: PUSH2 0x441b
00004417: PUSH2 0x429a
0000441a: JUMP
0000441b: JUMPDEST
0000441c: SWAP1
0000441d: POP
0000441e: DUP2
0000441f: CALLDATALOAD
00004420: PUSH2 0x4428
00004423: DUP2
00004424: PUSH2 0x3def
00004427: JUMP
00004428: JUMPDEST
00004429: DUP2
0000442a: MSTORE
0000442b: PUSH1 0x20
0000442d: DUP3
0000442e: ADD
0000442f: CALLDATALOAD
00004430: PUSH1 0x01
00004432: PUSH1 0x01
00004434: PUSH1 0x40
00004436: SHL
00004437: SUB
00004438: DUP2
00004439: GT
0000443a: ISZERO
0000443b: PUSH2 0x4443
0000443e: JUMPI
0000443f: PUSH1 0x00
00004441: DUP1
00004442: REVERT
00004443: JUMPDEST
00004444: DUP3
00004445: ADD
00004446: PUSH1 0x1f
00004448: DUP2
00004449: ADD
0000444a: DUP5
0000444b: SGT
0000444c: PUSH2 0x4454
0000444f: JUMPI
00004450: PUSH1 0x00
00004452: DUP1
00004453: REVERT
00004454: JUMPDEST
00004455: DUP1
00004456: CALLDATALOAD
00004457: PUSH1 0x01
00004459: PUSH1 0x01
0000445b: PUSH1 0x40
0000445d: SHL
0000445e: SUB
0000445f: DUP2
00004460: GT
00004461: ISZERO
00004462: PUSH2 0x446d
00004465: JUMPI
00004466: PUSH2 0x446d
00004469: PUSH2 0x425c
0000446c: JUMP
0000446d: JUMPDEST
0000446e: PUSH2 0x4480
00004471: PUSH1 0x1f
00004473: DUP3
00004474: ADD
00004475: PUSH1 0x1f
00004477: NOT
00004478: AND
00004479: PUSH1 0x20
0000447b: ADD
0000447c: PUSH2 0x4300
0000447f: JUMP
00004480: JUMPDEST
00004481: DUP2
00004482: DUP2
00004483: MSTORE
00004484: DUP6
00004485: PUSH1 0x20
00004487: DUP4
00004488: DUP6
00004489: ADD
0000448a: ADD
0000448b: GT
0000448c: ISZERO
0000448d: PUSH2 0x4495
00004490: JUMPI
00004491: PUSH1 0x00
00004493: DUP1
00004494: REVERT
00004495: JUMPDEST
00004496: DUP2
00004497: PUSH1 0x20
00004499: DUP5
0000449a: ADD
0000449b: PUSH1 0x20
0000449d: DUP4
0000449e: ADD
0000449f: CALLDATACOPY
000044a0: PUSH1 0x00
000044a2: PUSH1 0x20
000044a4: DUP4
000044a5: DUP4
000044a6: ADD
000044a7: ADD
000044a8: MSTORE
000044a9: DUP1
000044aa: PUSH1 0x20
000044ac: DUP6
000044ad: ADD
000044ae: MSTORE
000044af: POP
000044b0: POP
000044b1: POP
000044b2: PUSH2 0x44bd
000044b5: PUSH1 0x40
000044b7: DUP4
000044b8: ADD
000044b9: PUSH2 0x3e04
000044bc: JUMP
000044bd: JUMPDEST
000044be: PUSH1 0x40
000044c0: DUP3
000044c1: ADD
000044c2: MSTORE
000044c3: PUSH2 0x44ce
000044c6: PUSH1 0x60
000044c8: DUP4
000044c9: ADD
000044ca: PUSH2 0x3e04
000044cd: JUMP
000044ce: JUMPDEST
000044cf: PUSH1 0x60
000044d1: DUP3
000044d2: ADD
000044d3: MSTORE
000044d4: PUSH1 0x80
000044d6: DUP3
000044d7: DUP2
000044d8: ADD
000044d9: CALLDATALOAD
000044da: SWAP1
000044db: DUP3
000044dc: ADD
000044dd: MSTORE
000044de: PUSH1 0xa0
000044e0: SWAP2
000044e1: DUP3
000044e2: ADD
000044e3: CALLDATALOAD
000044e4: SWAP2
000044e5: DUP2
000044e6: ADD
000044e7: SWAP2
000044e8: SWAP1
000044e9: SWAP2
000044ea: MSTORE
000044eb: SWAP2
000044ec: SWAP1
000044ed: POP
000044ee: JUMP
000044ef: JUMPDEST
000044f0: PUSH1 0x00
000044f2: PUSH1 0x20
000044f4: DUP3
000044f5: DUP5
000044f6: SUB
000044f7: SLT
000044f8: ISZERO
000044f9: PUSH2 0x4501
000044fc: JUMPI
000044fd: PUSH1 0x00
000044ff: DUP1
00004500: REVERT
00004501: JUMPDEST
00004502: DUP2
00004503: CALLDATALOAD
00004504: PUSH1 0x01
00004506: PUSH1 0x01
00004508: PUSH1 0x40
0000450a: SHL
0000450b: SUB
0000450c: DUP2
0000450d: GT
0000450e: ISZERO
0000450f: PUSH2 0x4517
00004512: JUMPI
00004513: PUSH1 0x00
00004515: DUP1
00004516: REVERT
00004517: JUMPDEST
00004518: DUP3
00004519: ADD
0000451a: PUSH1 0x40
0000451c: DUP2
0000451d: DUP6
0000451e: SUB
0000451f: SLT
00004520: ISZERO
00004521: PUSH2 0x4529
00004524: JUMPI
00004525: PUSH1 0x00
00004527: DUP1
00004528: REVERT
00004529: JUMPDEST
0000452a: PUSH2 0x4531
0000452d: PUSH2 0x4272
00004530: JUMP
00004531: JUMPDEST
00004532: DUP2
00004533: CALLDATALOAD
00004534: PUSH1 0x01
00004536: PUSH1 0x01
00004538: PUSH1 0x40
0000453a: SHL
0000453b: SUB
0000453c: DUP2
0000453d: GT
0000453e: ISZERO
0000453f: PUSH2 0x4547
00004542: JUMPI
00004543: PUSH1 0x00
00004545: DUP1
00004546: REVERT
00004547: JUMPDEST
00004548: PUSH2 0x4553
0000454b: DUP7
0000454c: DUP3
0000454d: DUP6
0000454e: ADD
0000454f: PUSH2 0x4364
00004552: JUMP
00004553: JUMPDEST
00004554: DUP3
00004555: MSTORE
00004556: POP
00004557: PUSH1 0x20
00004559: DUP3
0000455a: ADD
0000455b: CALLDATALOAD
0000455c: PUSH1 0x01
0000455e: PUSH1 0x01
00004560: PUSH1 0x40
00004562: SHL
00004563: SUB
00004564: DUP2
00004565: GT
00004566: ISZERO
00004567: PUSH2 0x456f
0000456a: JUMPI
0000456b: PUSH1 0x00
0000456d: DUP1
0000456e: REVERT
0000456f: JUMPDEST
00004570: PUSH2 0x457b
00004573: DUP7
00004574: DUP3
00004575: DUP6
00004576: ADD
00004577: PUSH2 0x4401
0000457a: JUMP
0000457b: JUMPDEST
0000457c: PUSH1 0x20
0000457e: DUP4
0000457f: ADD
00004580: MSTORE
00004581: POP
00004582: SWAP5
00004583: SWAP4
00004584: POP
00004585: POP
00004586: POP
00004587: POP
00004588: JUMP
00004589: JUMPDEST
0000458a: PUSH4 0x4e487b71
0000458f: PUSH1 0xe0
00004591: SHL
00004592: PUSH1 0x00
00004594: MSTORE
00004595: PUSH1 0x11
00004597: PUSH1 0x04
00004599: MSTORE
0000459a: PUSH1 0x24
0000459c: PUSH1 0x00
0000459e: REVERT
0000459f: JUMPDEST
000045a0: DUP2
000045a1: DUP2
000045a2: SUB
000045a3: DUP2
000045a4: DUP2
000045a5: GT
000045a6: ISZERO
000045a7: PUSH2 0x0950
000045aa: JUMPI
000045ab: PUSH2 0x0950
000045ae: PUSH2 0x4589
000045b1: JUMP
000045b2: JUMPDEST
000045b3: PUSH4 0x4e487b71
000045b8: PUSH1 0xe0
000045ba: SHL
000045bb: PUSH1 0x00
000045bd: MSTORE
000045be: PUSH1 0x12
000045c0: PUSH1 0x04
000045c2: MSTORE
000045c3: PUSH1 0x24
000045c5: PUSH1 0x00
000045c7: REVERT
000045c8: JUMPDEST
000045c9: PUSH1 0x00
000045cb: DUP3
000045cc: PUSH2 0x45e5
000045cf: JUMPI
000045d0: PUSH4 0x4e487b71
000045d5: PUSH1 0xe0
000045d7: SHL
000045d8: PUSH1 0x00
000045da: MSTORE
000045db: PUSH1 0x12
000045dd: PUSH1 0x04
000045df: MSTORE
000045e0: PUSH1 0x24
000045e2: PUSH1 0x00
000045e4: REVERT
000045e5: JUMPDEST
000045e6: POP
000045e7: DIV
000045e8: SWAP1
000045e9: JUMP
000045ea: JUMPDEST
000045eb: PUSH1 0x00
000045ed: PUSH1 0x20
000045ef: DUP3
000045f0: DUP5
000045f1: SUB
000045f2: SLT
000045f3: ISZERO
000045f4: PUSH2 0x45fc
000045f7: JUMPI
000045f8: PUSH1 0x00
000045fa: DUP1
000045fb: REVERT
000045fc: JUMPDEST
000045fd: POP
000045fe: MLOAD
000045ff: SWAP2
00004600: SWAP1
00004601: POP
00004602: JUMP
00004603: JUMPDEST
00004604: PUSH4 0x4e487b71
00004609: PUSH1 0xe0
0000460b: SHL
0000460c: PUSH1 0x00
0000460e: MSTORE
0000460f: PUSH1 0x32
00004611: PUSH1 0x04
00004613: MSTORE
00004614: PUSH1 0x24
00004616: PUSH1 0x00
00004618: REVERT
00004619: JUMPDEST
0000461a: DUP1
0000461b: DUP3
0000461c: ADD
0000461d: DUP1
0000461e: DUP3
0000461f: GT
00004620: ISZERO
00004621: PUSH2 0x0950
00004624: JUMPI
00004625: PUSH2 0x0950
00004628: PUSH2 0x4589
0000462b: JUMP
0000462c: JUMPDEST
0000462d: PUSH1 0x00
0000462f: DUP3
00004630: PUSH1 0x1f
00004632: DUP4
00004633: ADD
00004634: SLT
00004635: PUSH2 0x463d
00004638: JUMPI
00004639: PUSH1 0x00
0000463b: DUP1
0000463c: REVERT
0000463d: JUMPDEST
0000463e: DUP2
0000463f: CALLDATALOAD
00004640: PUSH2 0x464b
00004643: PUSH2 0x4383
00004646: DUP3
00004647: PUSH2 0x4330
0000464a: JUMP
0000464b: JUMPDEST
0000464c: DUP1
0000464d: DUP3
0000464e: DUP3
0000464f: MSTORE
00004650: PUSH1 0x20
00004652: DUP3
00004653: ADD
00004654: SWAP2
00004655: POP
00004656: PUSH1 0x20
00004658: DUP4
00004659: PUSH1 0x05
0000465b: SHL
0000465c: DUP7
0000465d: ADD
0000465e: ADD
0000465f: SWAP3
00004660: POP
00004661: DUP6
00004662: DUP4
00004663: GT
00004664: ISZERO
00004665: PUSH2 0x466d
00004668: JUMPI
00004669: PUSH1 0x00
0000466b: DUP1
0000466c: REVERT
0000466d: JUMPDEST
0000466e: PUSH1 0x20
00004670: DUP6
00004671: ADD
00004672: JUMPDEST
00004673: DUP4
00004674: DUP2
00004675: LT
00004676: ISZERO
00004677: PUSH2 0x4076
0000467a: JUMPI
0000467b: DUP1
0000467c: CALLDATALOAD
0000467d: PUSH1 0x01
0000467f: PUSH1 0x01
00004681: PUSH1 0x40
00004683: SHL
00004684: SUB
00004685: DUP2
00004686: GT
00004687: ISZERO
00004688: PUSH2 0x4690
0000468b: JUMPI
0000468c: PUSH1 0x00
0000468e: DUP1
0000468f: REVERT
00004690: JUMPDEST
00004691: PUSH2 0x469f
00004694: DUP9
00004695: PUSH1 0x20
00004697: DUP4
00004698: DUP11
00004699: ADD
0000469a: ADD
0000469b: PUSH2 0x4401
0000469e: JUMP
0000469f: JUMPDEST
000046a0: DUP5
000046a1: MSTORE
000046a2: POP
000046a3: PUSH1 0x20
000046a5: SWAP3
000046a6: DUP4
000046a7: ADD
000046a8: SWAP3
000046a9: ADD
000046aa: PUSH2 0x4672
000046ad: JUMP
000046ae: JUMPDEST
000046af: PUSH1 0x00
000046b1: PUSH1 0x20
000046b3: DUP3
000046b4: DUP5
000046b5: SUB
000046b6: SLT
000046b7: ISZERO
000046b8: PUSH2 0x46c0
000046bb: JUMPI
000046bc: PUSH1 0x00
000046be: DUP1
000046bf: REVERT
000046c0: JUMPDEST
000046c1: DUP2
000046c2: CALLDATALOAD
000046c3: PUSH1 0x01
000046c5: PUSH1 0x01
000046c7: PUSH1 0x40
000046c9: SHL
000046ca: SUB
000046cb: DUP2
000046cc: GT
000046cd: ISZERO
000046ce: PUSH2 0x46d6
000046d1: JUMPI
000046d2: PUSH1 0x00
000046d4: DUP1
000046d5: REVERT
000046d6: JUMPDEST
000046d7: DUP3
000046d8: ADD
000046d9: PUSH1 0x20
000046db: DUP2
000046dc: DUP6
000046dd: SUB
000046de: SLT
000046df: ISZERO
000046e0: PUSH2 0x46e8
000046e3: JUMPI
000046e4: PUSH1 0x00
000046e6: DUP1
000046e7: REVERT
000046e8: JUMPDEST
000046e9: PUSH1 0x40
000046eb: MLOAD
000046ec: PUSH1 0x20
000046ee: DUP2
000046ef: ADD
000046f0: PUSH1 0x01
000046f2: PUSH1 0x01
000046f4: PUSH1 0x40
000046f6: SHL
000046f7: SUB
000046f8: DUP2
000046f9: GT
000046fa: DUP3
000046fb: DUP3
000046fc: LT
000046fd: OR
000046fe: ISZERO
000046ff: PUSH2 0x470a
00004702: JUMPI
00004703: PUSH2 0x470a
00004706: PUSH2 0x425c
00004709: JUMP
0000470a: JUMPDEST
0000470b: PUSH1 0x40
0000470d: MSTORE
0000470e: DUP2
0000470f: CALLDATALOAD
00004710: PUSH1 0x01
00004712: PUSH1 0x01
00004714: PUSH1 0x40
00004716: SHL
00004717: SUB
00004718: DUP2
00004719: GT
0000471a: ISZERO
0000471b: PUSH2 0x4723
0000471e: JUMPI
0000471f: PUSH1 0x00
00004721: DUP1
00004722: REVERT
00004723: JUMPDEST
00004724: PUSH2 0x472f
00004727: DUP7
00004728: DUP3
00004729: DUP6
0000472a: ADD
0000472b: PUSH2 0x462c
0000472e: JUMP
0000472f: JUMPDEST
00004730: DUP3
00004731: MSTORE
00004732: POP
00004733: SWAP5
00004734: SWAP4
00004735: POP
00004736: POP
00004737: POP
00004738: POP
00004739: JUMP
0000473a: JUMPDEST
0000473b: PUSH1 0x00
0000473d: PUSH1 0x20
0000473f: DUP3
00004740: DUP5
00004741: SUB
00004742: SLT
00004743: ISZERO
00004744: PUSH2 0x474c
00004747: JUMPI
00004748: PUSH1 0x00
0000474a: DUP1
0000474b: REVERT
0000474c: JUMPDEST
0000474d: DUP2
0000474e: CALLDATALOAD
0000474f: PUSH1 0x01
00004751: PUSH1 0x01
00004753: PUSH1 0x40
00004755: SHL
00004756: SUB
00004757: DUP2
00004758: GT
00004759: ISZERO
0000475a: PUSH2 0x4762
0000475d: JUMPI
0000475e: PUSH1 0x00
00004760: DUP1
00004761: REVERT
00004762: JUMPDEST
00004763: DUP3
00004764: ADD
00004765: PUSH1 0x40
00004767: DUP2
00004768: DUP6
00004769: SUB
0000476a: SLT
0000476b: ISZERO
0000476c: PUSH2 0x4774
0000476f: JUMPI
00004770: PUSH1 0x00
00004772: DUP1
00004773: REVERT
00004774: JUMPDEST
00004775: PUSH2 0x477c
00004778: PUSH2 0x4272
0000477b: JUMP
0000477c: JUMPDEST
0000477d: DUP2
0000477e: CALLDATALOAD
0000477f: PUSH1 0x01
00004781: PUSH1 0x01
00004783: PUSH1 0x40
00004785: SHL
00004786: SUB
00004787: DUP2
00004788: GT
00004789: ISZERO
0000478a: PUSH2 0x4792
0000478d: JUMPI
0000478e: PUSH1 0x00
00004790: DUP1
00004791: REVERT
00004792: JUMPDEST
00004793: PUSH2 0x479e
00004796: DUP7
00004797: DUP3
00004798: DUP6
00004799: ADD
0000479a: PUSH2 0x4364
0000479d: JUMP
0000479e: JUMPDEST
0000479f: DUP3
000047a0: MSTORE
000047a1: POP
000047a2: PUSH1 0x20
000047a4: DUP3
000047a5: ADD
000047a6: CALLDATALOAD
000047a7: PUSH1 0x01
000047a9: PUSH1 0x01
000047ab: PUSH1 0x40
000047ad: SHL
000047ae: SUB
000047af: DUP2
000047b0: GT
000047b1: ISZERO
000047b2: PUSH2 0x47ba
000047b5: JUMPI
000047b6: PUSH1 0x00
000047b8: DUP1
000047b9: REVERT
000047ba: JUMPDEST
000047bb: PUSH2 0x457b
000047be: DUP7
000047bf: DUP3
000047c0: DUP6
000047c1: ADD
000047c2: PUSH2 0x462c
000047c5: JUMP
000047c6: JUMPDEST
000047c7: PUSH2 0x0100
000047ca: DUP2
000047cb: ADD
000047cc: DUP2
000047cd: DUP4
000047ce: PUSH1 0x00
000047d0: JUMPDEST
000047d1: PUSH1 0x08
000047d3: DUP2
000047d4: LT
000047d5: ISZERO
000047d6: PUSH2 0x3f25
000047d9: JUMPI
000047da: DUP2
000047db: SLOAD
000047dc: PUSH1 0x01
000047de: PUSH1 0x01
000047e0: PUSH1 0xa0
000047e2: SHL
000047e3: SUB
000047e4: AND
000047e5: DUP4
000047e6: MSTORE
000047e7: PUSH1 0x20
000047e9: SWAP1
000047ea: SWAP3
000047eb: ADD
000047ec: SWAP2
000047ed: PUSH1 0x01
000047ef: SWAP2
000047f0: DUP3
000047f1: ADD
000047f2: SWAP2
000047f3: ADD
000047f4: PUSH2 0x47d0
000047f7: JUMP
000047f8: JUMPDEST
000047f9: DUP5
000047fa: DUP2
000047fb: MSTORE
000047fc: PUSH1 0x20
000047fe: DUP2
000047ff: ADD
00004800: DUP5
00004801: SWAP1
00004802: MSTORE
00004803: PUSH2 0x0100
00004806: DUP2
00004807: ADD
00004808: PUSH2 0x4828
0000480b: PUSH1 0x40
0000480d: DUP4
0000480e: ADD
0000480f: DUP6
00004810: DUP1
00004811: CALLDATALOAD
00004812: DUP3
00004813: MSTORE
00004814: PUSH1 0x20
00004816: DUP1
00004817: DUP3
00004818: ADD
00004819: CALLDATALOAD
0000481a: SWAP1
0000481b: DUP4
0000481c: ADD
0000481d: MSTORE
0000481e: PUSH1 0x40
00004820: SWAP1
00004821: DUP2
00004822: ADD
00004823: CALLDATALOAD
00004824: SWAP2
00004825: ADD
00004826: MSTORE
00004827: JUMP
00004828: JUMPDEST
00004829: DUP3
0000482a: CALLDATALOAD
0000482b: PUSH1 0xa0
0000482d: DUP4
0000482e: ADD
0000482f: MSTORE
00004830: PUSH1 0x20
00004832: DUP4
00004833: ADD
00004834: CALLDATALOAD
00004835: PUSH1 0xc0
00004837: DUP4
00004838: ADD
00004839: MSTORE
0000483a: PUSH1 0x40
0000483c: DUP4
0000483d: ADD
0000483e: CALLDATALOAD
0000483f: PUSH1 0xe0
00004841: DUP4
00004842: ADD
00004843: MSTORE
00004844: JUMPDEST
00004845: SWAP6
00004846: SWAP5
00004847: POP
00004848: POP
00004849: POP
0000484a: POP
0000484b: POP
0000484c: JUMP
0000484d: JUMPDEST
0000484e: PUSH1 0x00
00004850: PUSH1 0xa0
00004852: DUP3
00004853: DUP5
00004854: SUB
00004855: SLT
00004856: DUP1
00004857: ISZERO
00004858: PUSH2 0x4860
0000485b: JUMPI
0000485c: PUSH1 0x00
0000485e: DUP1
0000485f: REVERT
00004860: JUMPDEST
00004861: POP
00004862: PUSH2 0x4869
00004865: PUSH2 0x42bc
00004868: JUMP
00004869: JUMPDEST
0000486a: PUSH2 0x4872
0000486d: DUP4
0000486e: PUSH2 0x4353
00004871: JUMP
00004872: JUMPDEST
00004873: DUP2
00004874: MSTORE
00004875: PUSH1 0x20
00004877: DUP4
00004878: ADD
00004879: CALLDATALOAD
0000487a: PUSH2 0x4882
0000487d: DUP2
0000487e: PUSH2 0x3def
00004881: JUMP
00004882: JUMPDEST
00004883: PUSH1 0x20
00004885: DUP3
00004886: ADD
00004887: MSTORE
00004888: PUSH1 0x40
0000488a: DUP4
0000488b: DUP2
0000488c: ADD
0000488d: CALLDATALOAD
0000488e: SWAP1
0000488f: DUP3
00004890: ADD
00004891: MSTORE
00004892: PUSH1 0x60
00004894: DUP1
00004895: DUP5
00004896: ADD
00004897: CALLDATALOAD
00004898: SWAP1
00004899: DUP3
0000489a: ADD
0000489b: MSTORE
0000489c: PUSH1 0x80
0000489e: SWAP3
0000489f: DUP4
000048a0: ADD
000048a1: CALLDATALOAD
000048a2: SWAP3
000048a3: DUP2
000048a4: ADD
000048a5: SWAP3
000048a6: SWAP1
000048a7: SWAP3
000048a8: MSTORE
000048a9: POP
000048aa: SWAP2
000048ab: SWAP1
000048ac: POP
000048ad: JUMP
000048ae: JUMPDEST
000048af: PUSH1 0x00
000048b1: PUSH1 0x60
000048b3: DUP3
000048b4: DUP5
000048b5: SUB
000048b6: SLT
000048b7: ISZERO
000048b8: PUSH2 0x48c0
000048bb: JUMPI
000048bc: PUSH1 0x00
000048be: DUP1
000048bf: REVERT
000048c0: JUMPDEST
000048c1: PUSH1 0x40
000048c3: MLOAD
000048c4: PUSH1 0x60
000048c6: DUP2
000048c7: ADD
000048c8: PUSH1 0x01
000048ca: PUSH1 0x01
000048cc: PUSH1 0x40
000048ce: SHL
000048cf: SUB
000048d0: DUP2
000048d1: GT
000048d2: DUP3
000048d3: DUP3
000048d4: LT
000048d5: OR
000048d6: ISZERO
000048d7: PUSH2 0x48e2
000048da: JUMPI
000048db: PUSH2 0x48e2
000048de: PUSH2 0x425c
000048e1: JUMP
000048e2: JUMPDEST
000048e3: PUSH1 0x40
000048e5: SWAP1
000048e6: DUP2
000048e7: MSTORE
000048e8: DUP4
000048e9: CALLDATALOAD
000048ea: DUP3
000048eb: MSTORE
000048ec: PUSH1 0x20
000048ee: DUP1
000048ef: DUP6
000048f0: ADD
000048f1: CALLDATALOAD
000048f2: SWAP1
000048f3: DUP4
000048f4: ADD
000048f5: MSTORE
000048f6: SWAP3
000048f7: DUP4
000048f8: ADD
000048f9: CALLDATALOAD
000048fa: SWAP3
000048fb: DUP2
000048fc: ADD
000048fd: SWAP3
000048fe: SWAP1
000048ff: SWAP3
00004900: MSTORE
00004901: POP
00004902: SWAP2
00004903: SWAP1
00004904: POP
00004905: JUMP
00004906: JUMPDEST
00004907: PUSH1 0x00
00004909: PUSH1 0x20
0000490b: DUP3
0000490c: DUP5
0000490d: SUB
0000490e: SLT
0000490f: ISZERO
00004910: PUSH2 0x4918
00004913: JUMPI
00004914: PUSH1 0x00
00004916: DUP1
00004917: REVERT
00004918: JUMPDEST
00004919: DUP2
0000491a: CALLDATALOAD
0000491b: PUSH1 0x01
0000491d: PUSH1 0x01
0000491f: PUSH1 0x40
00004921: SHL
00004922: SUB
00004923: DUP2
00004924: GT
00004925: ISZERO
00004926: PUSH2 0x492e
00004929: JUMPI
0000492a: PUSH1 0x00
0000492c: DUP1
0000492d: REVERT
0000492e: JUMPDEST
0000492f: DUP3
00004930: ADD
00004931: PUSH2 0x0160
00004934: DUP2
00004935: DUP6
00004936: SUB
00004937: SLT
00004938: ISZERO
00004939: PUSH2 0x4941
0000493c: JUMPI
0000493d: PUSH1 0x00
0000493f: DUP1
00004940: REVERT
00004941: JUMPDEST
00004942: PUSH2 0x4949
00004945: PUSH2 0x42de
00004948: JUMP
00004949: JUMPDEST
0000494a: DUP2
0000494b: CALLDATALOAD
0000494c: DUP2
0000494d: MSTORE
0000494e: PUSH2 0x495a
00004951: DUP6
00004952: PUSH1 0x20
00004954: DUP5
00004955: ADD
00004956: PUSH2 0x48ae
00004959: JUMP
0000495a: JUMPDEST
0000495b: PUSH1 0x20
0000495d: DUP3
0000495e: ADD
0000495f: MSTORE
00004960: PUSH2 0x496c
00004963: DUP6
00004964: PUSH1 0x80
00004966: DUP5
00004967: ADD
00004968: PUSH2 0x48ae
0000496b: JUMP
0000496c: JUMPDEST
0000496d: PUSH1 0x40
0000496f: DUP3
00004970: ADD
00004971: MSTORE
00004972: PUSH1 0xe0
00004974: DUP3
00004975: ADD
00004976: CALLDATALOAD
00004977: PUSH1 0x01
00004979: PUSH1 0x01
0000497b: PUSH1 0x40
0000497d: SHL
0000497e: SUB
0000497f: DUP2
00004980: GT
00004981: ISZERO
00004982: PUSH2 0x498a
00004985: JUMPI
00004986: PUSH1 0x00
00004988: DUP1
00004989: REVERT
0000498a: JUMPDEST
0000498b: PUSH2 0x4996
0000498e: DUP7
0000498f: DUP3
00004990: DUP6
00004991: ADD
00004992: PUSH2 0x462c
00004995: JUMP
00004996: JUMPDEST
00004997: PUSH1 0x60
00004999: DUP4
0000499a: ADD
0000499b: MSTORE
0000499c: POP
0000499d: PUSH2 0x0100
000049a0: DUP3
000049a1: ADD
000049a2: CALLDATALOAD
000049a3: PUSH1 0x80
000049a5: DUP3
000049a6: ADD
000049a7: MSTORE
000049a8: PUSH2 0x49b4
000049ab: PUSH2 0x0120
000049ae: DUP4
000049af: ADD
000049b0: PUSH2 0x3e04
000049b3: JUMP
000049b4: JUMPDEST
000049b5: PUSH1 0xa0
000049b7: DUP3
000049b8: ADD
000049b9: MSTORE
000049ba: PUSH2 0x0140
000049bd: SWAP2
000049be: SWAP1
000049bf: SWAP2
000049c0: ADD
000049c1: CALLDATALOAD
000049c2: PUSH1 0xc0
000049c4: DUP3
000049c5: ADD
000049c6: MSTORE
000049c7: SWAP4
000049c8: SWAP3
000049c9: POP
000049ca: POP
000049cb: POP
000049cc: JUMP
000049cd: JUMPDEST
000049ce: PUSH1 0x00
000049d0: PUSH1 0x20
000049d2: DUP3
000049d3: DUP5
000049d4: SUB
000049d5: SLT
000049d6: ISZERO
000049d7: PUSH2 0x49df
000049da: JUMPI
000049db: PUSH1 0x00
000049dd: DUP1
000049de: REVERT
000049df: JUMPDEST
000049e0: DUP2
000049e1: MLOAD
000049e2: PUSH2 0xffff
000049e5: DUP2
000049e6: AND
000049e7: DUP2
000049e8: EQ
000049e9: PUSH2 0x3e71
000049ec: JUMPI
000049ed: PUSH1 0x00
000049ef: DUP1
000049f0: REVERT
000049f1: JUMPDEST
000049f2: DUP1
000049f3: DUP3
000049f4: MUL
000049f5: DUP2
000049f6: ISZERO
000049f7: DUP3
000049f8: DUP3
000049f9: DIV
000049fa: DUP5
000049fb: EQ
000049fc: OR
000049fd: PUSH2 0x0950
00004a00: JUMPI
00004a01: PUSH2 0x0950
00004a04: PUSH2 0x4589
00004a07: JUMP
00004a08: JUMPDEST
00004a09: DUP5
00004a0a: DUP2
00004a0b: MSTORE
00004a0c: PUSH1 0x20
00004a0e: DUP2
00004a0f: ADD
00004a10: DUP5
00004a11: SWAP1
00004a12: MSTORE
00004a13: PUSH2 0x0100
00004a16: DUP2
00004a17: ADD
00004a18: PUSH2 0x4a38
00004a1b: PUSH1 0x40
00004a1d: DUP4
00004a1e: ADD
00004a1f: DUP6
00004a20: DUP1
00004a21: MLOAD
00004a22: DUP3
00004a23: MSTORE
00004a24: PUSH1 0x20
00004a26: DUP1
00004a27: DUP3
00004a28: ADD
00004a29: MLOAD
00004a2a: SWAP1
00004a2b: DUP4
00004a2c: ADD
00004a2d: MSTORE
00004a2e: PUSH1 0x40
00004a30: SWAP1
00004a31: DUP2
00004a32: ADD
00004a33: MLOAD
00004a34: SWAP2
00004a35: ADD
00004a36: MSTORE
00004a37: JUMP
00004a38: JUMPDEST
00004a39: DUP3
00004a3a: MLOAD
00004a3b: PUSH1 0xa0
00004a3d: DUP4
00004a3e: ADD
00004a3f: MSTORE
00004a40: PUSH1 0x20
00004a42: DUP4
00004a43: ADD
00004a44: MLOAD
00004a45: PUSH1 0xc0
00004a47: DUP4
00004a48: ADD
00004a49: MSTORE
00004a4a: PUSH1 0x40
00004a4c: DUP4
00004a4d: ADD
00004a4e: MLOAD
00004a4f: PUSH1 0xe0
00004a51: DUP4
00004a52: ADD
00004a53: MSTORE
00004a54: PUSH2 0x4844
00004a57: JUMP
00004a58: JUMPDEST
00004a59: PUSH1 0x00
00004a5b: PUSH1 0xa0
00004a5d: DUP3
00004a5e: DUP5
00004a5f: SUB
00004a60: SLT
00004a61: ISZERO
00004a62: PUSH2 0x4a6a
00004a65: JUMPI
00004a66: PUSH1 0x00
00004a68: DUP1
00004a69: REVERT
00004a6a: JUMPDEST
00004a6b: PUSH2 0x4a72
00004a6e: PUSH2 0x42bc
00004a71: JUMP
00004a72: JUMPDEST
00004a73: DUP3
00004a74: CALLDATALOAD
00004a75: DUP2
00004a76: MSTORE
00004a77: PUSH1 0x20
00004a79: DUP1
00004a7a: DUP5
00004a7b: ADD
00004a7c: CALLDATALOAD
00004a7d: SWAP1
00004a7e: DUP3
00004a7f: ADD
00004a80: MSTORE
00004a81: PUSH1 0x40
00004a83: DUP1
00004a84: DUP5
00004a85: ADD
00004a86: CALLDATALOAD
00004a87: SWAP1
00004a88: DUP3
00004a89: ADD
00004a8a: MSTORE
00004a8b: PUSH1 0x60
00004a8d: DUP1
00004a8e: DUP5
00004a8f: ADD
00004a90: CALLDATALOAD
00004a91: SWAP1
00004a92: DUP3
00004a93: ADD
00004a94: MSTORE
00004a95: PUSH1 0x80
00004a97: SWAP3
00004a98: DUP4
00004a99: ADD
00004a9a: CALLDATALOAD
00004a9b: SWAP3
00004a9c: DUP2
00004a9d: ADD
00004a9e: SWAP3
00004a9f: SWAP1
00004aa0: SWAP3
00004aa1: MSTORE
00004aa2: POP
00004aa3: SWAP2
00004aa4: SWAP1
00004aa5: POP
00004aa6: JUMP
00004aa7: JUMPDEST
00004aa8: PUSH1 0x00
00004aaa: PUSH1 0x20
00004aac: DUP3
00004aad: DUP5
00004aae: SUB
00004aaf: SLT
00004ab0: ISZERO
00004ab1: PUSH2 0x4ab9
00004ab4: JUMPI
00004ab5: PUSH1 0x00
00004ab7: DUP1
00004ab8: REVERT
00004ab9: JUMPDEST
00004aba: DUP2
00004abb: CALLDATALOAD
00004abc: PUSH1 0x01
00004abe: PUSH1 0x01
00004ac0: PUSH1 0x40
00004ac2: SHL
00004ac3: SUB
00004ac4: DUP2
00004ac5: GT
00004ac6: ISZERO
00004ac7: PUSH2 0x4acf
00004aca: JUMPI
00004acb: PUSH1 0x00
00004acd: DUP1
00004ace: REVERT
00004acf: JUMPDEST
00004ad0: DUP3
00004ad1: ADD
00004ad2: PUSH2 0x01a0
00004ad5: DUP2
00004ad6: DUP6
00004ad7: SUB
00004ad8: SLT
00004ad9: ISZERO
00004ada: PUSH2 0x4ae2
00004add: JUMPI
00004ade: PUSH1 0x00
00004ae0: DUP1
00004ae1: REVERT
00004ae2: JUMPDEST
00004ae3: PUSH2 0x4aea
00004ae6: PUSH2 0x42bc
00004ae9: JUMP
00004aea: JUMPDEST
00004aeb: DUP2
00004aec: CALLDATALOAD
00004aed: DUP2
00004aee: MSTORE
00004aef: PUSH1 0x20
00004af1: DUP3
00004af2: ADD
00004af3: CALLDATALOAD
00004af4: PUSH1 0x01
00004af6: PUSH1 0x01
00004af8: PUSH1 0x40
00004afa: SHL
00004afb: SUB
00004afc: DUP2
00004afd: GT
00004afe: ISZERO
00004aff: PUSH2 0x4b07
00004b02: JUMPI
00004b03: PUSH1 0x00
00004b05: DUP1
00004b06: REVERT
00004b07: JUMPDEST
00004b08: PUSH2 0x4b13
00004b0b: DUP7
00004b0c: DUP3
00004b0d: DUP6
00004b0e: ADD
00004b0f: PUSH2 0x462c
00004b12: JUMP
00004b13: JUMPDEST
00004b14: PUSH1 0x20
00004b16: DUP4
00004b17: ADD
00004b18: MSTORE
00004b19: POP
00004b1a: PUSH2 0x4b26
00004b1d: DUP6
00004b1e: PUSH1 0x40
00004b20: DUP5
00004b21: ADD
00004b22: PUSH2 0x4a58
00004b25: JUMP
00004b26: JUMPDEST
00004b27: PUSH1 0x40
00004b29: DUP3
00004b2a: ADD
00004b2b: MSTORE
00004b2c: PUSH2 0x4b38
00004b2f: DUP6
00004b30: PUSH1 0xe0
00004b32: DUP5
00004b33: ADD
00004b34: PUSH2 0x4a58
00004b37: JUMP
00004b38: JUMPDEST
00004b39: PUSH1 0x60
00004b3b: DUP3
00004b3c: ADD
00004b3d: MSTORE
00004b3e: PUSH2 0x0180
00004b41: SWAP2
00004b42: SWAP1
00004b43: SWAP2
00004b44: ADD
00004b45: CALLDATALOAD
00004b46: PUSH1 0x80
00004b48: DUP3
00004b49: ADD
00004b4a: MSTORE
00004b4b: SWAP4
00004b4c: SWAP3
00004b4d: POP
00004b4e: POP
00004b4f: POP
00004b50: JUMP
00004b51: JUMPDEST
00004b52: DUP5
00004b53: DUP2
00004b54: MSTORE
00004b55: PUSH2 0x0180
00004b58: DUP2
00004b59: ADD
00004b5a: PUSH2 0x4b91
00004b5d: PUSH1 0x20
00004b5f: DUP4
00004b60: ADD
00004b61: DUP7
00004b62: DUP1
00004b63: MLOAD
00004b64: DUP3
00004b65: MSTORE
00004b66: PUSH1 0x20
00004b68: DUP2
00004b69: ADD
00004b6a: MLOAD
00004b6b: PUSH1 0x20
00004b6d: DUP4
00004b6e: ADD
00004b6f: MSTORE
00004b70: PUSH1 0x40
00004b72: DUP2
00004b73: ADD
00004b74: MLOAD
00004b75: PUSH1 0x40
00004b77: DUP4
00004b78: ADD
00004b79: MSTORE
00004b7a: PUSH1 0x60
00004b7c: DUP2
00004b7d: ADD
00004b7e: MLOAD
00004b7f: PUSH1 0x60
00004b81: DUP4
00004b82: ADD
00004b83: MSTORE
00004b84: PUSH1 0x80
00004b86: DUP2
00004b87: ADD
00004b88: MLOAD
00004b89: PUSH1 0x80
00004b8b: DUP4
00004b8c: ADD
00004b8d: MSTORE
00004b8e: POP
00004b8f: POP
00004b90: JUMP
00004b91: JUMPDEST
00004b92: DUP4
00004b93: MLOAD
00004b94: PUSH1 0xc0
00004b96: DUP4
00004b97: ADD
00004b98: MSTORE
00004b99: PUSH1 0x20
00004b9b: DUP5
00004b9c: ADD
00004b9d: MLOAD
00004b9e: PUSH1 0xe0
00004ba0: DUP4
00004ba1: ADD
00004ba2: MSTORE
00004ba3: PUSH1 0x40
00004ba5: DUP5
00004ba6: ADD
00004ba7: MLOAD
00004ba8: PUSH2 0x0100
00004bab: DUP4
00004bac: ADD
00004bad: MSTORE
00004bae: PUSH1 0x60
00004bb0: DUP5
00004bb1: ADD
00004bb2: MLOAD
00004bb3: PUSH2 0x0120
00004bb6: DUP4
00004bb7: ADD
00004bb8: MSTORE
00004bb9: PUSH1 0x80
00004bbb: SWAP1
00004bbc: SWAP4
00004bbd: ADD
00004bbe: MLOAD
00004bbf: PUSH2 0x0140
00004bc2: DUP3
00004bc3: ADD
00004bc4: MSTORE
00004bc5: PUSH2 0x0160
00004bc8: ADD
00004bc9: MSTORE
00004bca: SWAP3
00004bcb: SWAP2
00004bcc: POP
00004bcd: POP
00004bce: JUMP
00004bcf: JUMPDEST
00004bd0: PUSH1 0x00
00004bd2: DUP3
00004bd3: MLOAD
00004bd4: PUSH2 0x4be1
00004bd7: DUP2
00004bd8: DUP5
00004bd9: PUSH1 0x20
00004bdb: DUP8
00004bdc: ADD
00004bdd: PUSH2 0x3d98
00004be0: JUMP
00004be1: JUMPDEST
00004be2: SWAP2
00004be3: SWAP1
00004be4: SWAP2
00004be5: ADD
00004be6: SWAP3
00004be7: SWAP2
00004be8: POP
00004be9: POP
00004bea: JUMP
00004beb: JUMPDEST
00004bec: PUSH1 0x00
00004bee: PUSH1 0xff
00004bf0: DUP3
00004bf1: AND
00004bf2: PUSH1 0xff
00004bf4: DUP2
00004bf5: SUB
00004bf6: PUSH2 0x4c01
00004bf9: JUMPI
00004bfa: PUSH2 0x4c01
00004bfd: PUSH2 0x4589
00004c00: JUMP
00004c01: JUMPDEST
00004c02: PUSH1 0x01
00004c04: ADD
00004c05: SWAP3
00004c06: SWAP2
00004c07: POP
00004c08: POP
00004c09: JUMP
00004c0a: JUMPDEST
00004c0b: PUSH1 0x1f
00004c0d: DUP3
00004c0e: GT
00004c0f: ISZERO
00004c10: PUSH2 0x2c02
00004c13: JUMPI
00004c14: DUP1
00004c15: PUSH1 0x00
00004c17: MSTORE
00004c18: PUSH1 0x20
00004c1a: PUSH1 0x00
00004c1c: KECCAK256
00004c1d: PUSH1 0x1f
00004c1f: DUP5
00004c20: ADD
00004c21: PUSH1 0x05
00004c23: SHR
00004c24: DUP2
00004c25: ADD
00004c26: PUSH1 0x20
00004c28: DUP6
00004c29: LT
00004c2a: ISZERO
00004c2b: PUSH2 0x4c31
00004c2e: JUMPI
00004c2f: POP
00004c30: DUP1
00004c31: JUMPDEST
00004c32: PUSH1 0x1f
00004c34: DUP5
00004c35: ADD
00004c36: PUSH1 0x05
00004c38: SHR
00004c39: DUP3
00004c3a: ADD
00004c3b: SWAP2
00004c3c: POP
00004c3d: JUMPDEST
00004c3e: DUP2
00004c3f: DUP2
00004c40: LT
00004c41: ISZERO
00004c42: PUSH2 0x3228
00004c45: JUMPI
00004c46: PUSH1 0x00
00004c48: DUP2
00004c49: SSTORE
00004c4a: PUSH1 0x01
00004c4c: ADD
00004c4d: PUSH2 0x4c3d
00004c50: JUMP
00004c51: JUMPDEST
00004c52: DUP2
00004c53: MLOAD
00004c54: PUSH1 0x01
00004c56: PUSH1 0x01
00004c58: PUSH1 0x40
00004c5a: SHL
00004c5b: SUB
00004c5c: DUP2
00004c5d: GT
00004c5e: ISZERO
00004c5f: PUSH2 0x4c6a
00004c62: JUMPI
00004c63: PUSH2 0x4c6a
00004c66: PUSH2 0x425c
00004c69: JUMP
00004c6a: JUMPDEST
00004c6b: PUSH2 0x4c7e
00004c6e: DUP2
00004c6f: PUSH2 0x4c78
00004c72: DUP5
00004c73: SLOAD
00004c74: PUSH2 0x40b9
00004c77: JUMP
00004c78: JUMPDEST
00004c79: DUP5
00004c7a: PUSH2 0x4c0a
00004c7d: JUMP
00004c7e: JUMPDEST
00004c7f: PUSH1 0x20
00004c81: PUSH1 0x1f
00004c83: DUP3
00004c84: GT
00004c85: PUSH1 0x01
00004c87: DUP2
00004c88: EQ
00004c89: PUSH2 0x4cb2
00004c8c: JUMPI
00004c8d: PUSH1 0x00
00004c8f: DUP4
00004c90: ISZERO
00004c91: PUSH2 0x4c9a
00004c94: JUMPI
00004c95: POP
00004c96: DUP5
00004c97: DUP3
00004c98: ADD
00004c99: MLOAD
00004c9a: JUMPDEST
00004c9b: PUSH1 0x00
00004c9d: NOT
00004c9e: PUSH1 0x03
00004ca0: DUP6
00004ca1: SWAP1
00004ca2: SHL
00004ca3: SHR
00004ca4: NOT
00004ca5: AND
00004ca6: PUSH1 0x01
00004ca8: DUP5
00004ca9: SWAP1
00004caa: SHL
00004cab: OR
00004cac: DUP5
00004cad: SSTORE
00004cae: PUSH2 0x3228
00004cb1: JUMP
00004cb2: JUMPDEST
00004cb3: PUSH1 0x00
00004cb5: DUP5
00004cb6: DUP2
00004cb7: MSTORE
00004cb8: PUSH1 0x20
00004cba: DUP2
00004cbb: KECCAK256
00004cbc: PUSH1 0x1f
00004cbe: NOT
00004cbf: DUP6
00004cc0: AND
00004cc1: SWAP2
00004cc2: JUMPDEST
00004cc3: DUP3
00004cc4: DUP2
00004cc5: LT
00004cc6: ISZERO
00004cc7: PUSH2 0x4ce2
00004cca: JUMPI
00004ccb: DUP8
00004ccc: DUP6
00004ccd: ADD
00004cce: MLOAD
00004ccf: DUP3
00004cd0: SSTORE
00004cd1: PUSH1 0x20
00004cd3: SWAP5
00004cd4: DUP6
00004cd5: ADD
00004cd6: SWAP5
00004cd7: PUSH1 0x01
00004cd9: SWAP1
00004cda: SWAP3
00004cdb: ADD
00004cdc: SWAP2
00004cdd: ADD
00004cde: PUSH2 0x4cc2
00004ce1: JUMP
00004ce2: JUMPDEST
00004ce3: POP
00004ce4: DUP5
00004ce5: DUP3
00004ce6: LT
00004ce7: ISZERO
00004ce8: PUSH2 0x4d00
00004ceb: JUMPI
00004cec: DUP7
00004ced: DUP5
00004cee: ADD
00004cef: MLOAD
00004cf0: PUSH1 0x00
00004cf2: NOT
00004cf3: PUSH1 0x03
00004cf5: DUP8
00004cf6: SWAP1
00004cf7: SHL
00004cf8: PUSH1 0xf8
00004cfa: AND
00004cfb: SHR
00004cfc: NOT
00004cfd: AND
00004cfe: DUP2
00004cff: SSTORE
00004d00: JUMPDEST
00004d01: POP
00004d02: POP
00004d03: POP
00004d04: POP
00004d05: PUSH1 0x01
00004d07: SWAP1
00004d08: DUP2
00004d09: SHL
00004d0a: ADD
00004d0b: SWAP1
00004d0c: SSTORE
00004d0d: POP
00004d0e: JUMP
00004d0f: INVALID
00004d10: MSTORE
00004d11: UNKNOWN(0xC6)
00004d12: ORIGIN
00004d13: SELFBALANCE
00004d14: UNKNOWN(0xE1)
00004d15: DELEGATECALL
00004d16: PUSH30 0xb19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace009b779b1742
00004d35: UNKNOWN(0x2D)
00004d36: UNKNOWN(0x0D)
00004d37: UNKNOWN(0xF9)
00004d38: UNKNOWN(0x22)
00004d39: UNKNOWN(0x23)
00004d3a: ADD
00004d3b: DUP12
00004d3c: ORIGIN
00004d3d: UNKNOWN(0xB4)
00004d3e: UNKNOWN(0xD1)
00004d3f: STATICCALL
00004d40: CHAINID
00004d41: UNKNOWN(0xE0)
00004d42: PUSH18 0x723d6817e2486d003becc55f00a264697066
00004d55: PUSH20 0x58221220b2dcf96f84f27556268f96c9980cecf5
00004d6a: UNKNOWN(0xE3)
00004d6b: DUP5
00004d6c: UNKNOWN(0xED)
00004d6d: UNKNOWN(0x26)
00004d6e: UNKNOWN(0xC5)
00004d6f: PUSH26

Findings

validated = confirmed for call sinks; sink observed for others
Severity Category Tool Title Confidence Validated Confirmed Details
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": "0xcf35bdd0",
            "selector": "0xcf35bdd0",
            "calldata_variants": [
                "0xcf35bdd0",
                "0xcf35bdd00000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xdae2a76c",
            "selector": "0xdae2a76c",
            "calldata_variants": [
                "0xdae2a76c",
                "0xdae2a76c0000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xdd62ed3e",
            "selector": "0xdd62ed3e",
            "calldata_variants": [
                "0xdd62ed3e",
                "0xdd62ed3e0000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xe6b4d21c",
            "selector": "0xe6b4d21c",
            "calldata_variants": [
                "0xe6b4d21c",
                "0xe6b4d21c0000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xeb3b7fd8",
            "selector": "0xeb3b7fd8",
            "calldata_variants": [
                "0xeb3b7fd8",
                "0xeb3b7fd80000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xf2fde38b",
            "selector": "0xf2fde38b",
            "calldata_variants": [
                "0xf2fde38b",
                "0xf2fde38b0000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xa9059cbb",
            "selector": "0xa9059cbb",
            "calldata_variants": [
                "0xa9059cbb",
                "0xa9059cbb0000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xaffed0e0",
            "selector": "0xaffed0e0",
            "calldata_variants": [
                "0xaffed0e0",
                "0xaffed0e00000000000000000000000000000000000000000000000000000000000000000"
            ]
        }
    ]
}
evidence_json
{
    "guards_detected": [
        {
            "pc": 19730,
            "type": "tx_origin_used"
        },
        {
            "pc": 19772,
            "type": "tx_origin_used"
        }
    ]
}
high upgradeability detector Untrusted DELEGATECALL target reachable 55 no no
view
trace_id: 0x9ebdf8eefbc2e9d333072b960cacc414a429ffe81bec5a5134d6923b0261ecfe
validation_json
{
    "sink": "DELEGATECALL",
    "errors": 0,
    "status": "unknown",
    "attempts": 192,
    "trace_id": "0x9ebdf8eefbc2e9d333072b960cacc414a429ffe81bec5a5134d6923b0261ecfe",
    "confirmed": false,
    "trace_mode": "callTracer",
    "call_targets": null,
    "matched_probe": null,
    "target_varies": null,
    "classification": "no_sink"
}
witness_json
{
    "notes": "heuristic witness; entrypoints are best-effort selectors with zeroed calldata",
    "constraints": [],
    "entrypoints": [
        {
            "calldata": "0xcf35bdd0",
            "selector": "0xcf35bdd0",
            "calldata_variants": [
                "0xcf35bdd0",
                "0xcf35bdd00000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xdae2a76c",
            "selector": "0xdae2a76c",
            "calldata_variants": [
                "0xdae2a76c",
                "0xdae2a76c0000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xdd62ed3e",
            "selector": "0xdd62ed3e",
            "calldata_variants": [
                "0xdd62ed3e",
                "0xdd62ed3e0000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xe6b4d21c",
            "selector": "0xe6b4d21c",
            "calldata_variants": [
                "0xe6b4d21c",
                "0xe6b4d21c0000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xeb3b7fd8",
            "selector": "0xeb3b7fd8",
            "calldata_variants": [
                "0xeb3b7fd8",
                "0xeb3b7fd80000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xf2fde38b",
            "selector": "0xf2fde38b",
            "calldata_variants": [
                "0xf2fde38b",
                "0xf2fde38b0000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xa9059cbb",
            "selector": "0xa9059cbb",
            "calldata_variants": [
                "0xa9059cbb",
                "0xa9059cbb0000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xaffed0e0",
            "selector": "0xaffed0e0",
            "calldata_variants": [
                "0xaffed0e0",
                "0xaffed0e00000000000000000000000000000000000000000000000000000000000000000"
            ]
        }
    ]
}
evidence_json
{
    "examples": [
        {
            "pc": 19733,
            "opcode": "DELEGATECALL",
            "returndata_checked": null,
            "value_expression_category": "n/a",
            "target_expression_category": "computed"
        }
    ],
    "guards_detected": [
        {
            "pc": 19730,
            "type": "tx_origin_used"
        },
        {
            "pc": 19772,
            "type": "tx_origin_used"
        }
    ],
    "delegatecall_count": 1,
    "untrusted_delegatecall_count": 1
}
high auth codex Signed actions can be replayed across different GuruFund instances 85 no
view
evidence_json
{
    "evidence": "`_verifyEIP712` hashes only `(nonce, account, keccak256(data), expiresAt)`. `GuruFund` always verifies through the shared `FundFactory`, and the action structs being signed do not include any fund identifier.",
    "locations": [
        "contracts/helpers/EIP712Helper.sol:78",
        "contracts/FundFactory.sol:151",
        "contracts/GuruFund.sol:258",
        "contracts/lib/FundAction.sol:11",
        "contracts/lib/FundAction.sol:65",
        "contracts/lib/FundAction.sol:87"
    ],
    "recommendation": "Bind every signed action to the specific fund address and action type. The simplest fix is to include `address(this)` or an explicit `fund` field in the signed struct for all fund actions, or move signature verification/nonces into each GuruFund so the EIP-712 domain is per-fund.",
    "exploit_scenario": "A user or guru who participates in multiple funds can reuse a signature that was issued for Fund A against Fund B, because signature verification happens only in the factory domain and the signed message does not include the target fund address. For example, a withdrawal signature for one closed WETH-only fund can be submitted to another compatible fund where the same user also holds shares, draining value from the wrong fund."
}
medium auth codex Anyone can front-run and consume another user's signed payload nonce 75 no
view
evidence_json
{
    "evidence": "`FundFactory.verifySignature` is public and directly calls `_verifyEIP712`, which increments `noncesByUser[_account]++` as part of verification. There is no requirement that `msg.sender == account` or that the caller is an authorized contract entrypoint.",
    "locations": [
        "contracts/FundFactory.sol:151",
        "contracts/helpers/EIP712Helper.sol:66",
        "contracts/helpers/EIP712Helper.sol:81",
        "contracts/FundFactory.sol:178",
        "contracts/GuruFund.sol:258"
    ],
    "recommendation": "Do not expose a public state-changing signature verifier. Make verification internal/private, or restrict it to trusted entrypoints. Also consider consuming the nonce only inside the final action after all authorization checks for that action are complete.",
    "exploit_scenario": "An attacker watching the mempool can copy a victim's signed payload and call `FundFactory.verifySignature(victim, payload)` first. That call succeeds and increments `noncesByUser[victim]`, causing the victim's subsequent `createFund`, `deposit`, `withdraw`, `rebalance`, or `close` transaction to revert with an invalid signature. The attacker can repeat this cheaply to censor protocol actions."
}
medium other detector Untrusted CALL target/value reachable 45 no no
view
trace_id: 0xab69e7c9f2612cdda5ed8555d7a4fae5ab44d6b5f3ffcd5250a5ed3618b0afea
call_targets: 0xec8902afffb06d0b075ea2d6fb3a45ec8598c39b
target_varies: no
classification: constant_target
validation_json
{
    "sink": "CALL",
    "errors": 0,
    "status": "sink_reached",
    "attempts": 1,
    "trace_id": "0xab69e7c9f2612cdda5ed8555d7a4fae5ab44d6b5f3ffcd5250a5ed3618b0afea",
    "confirmed": false,
    "trace_mode": "callTracer",
    "call_targets": [
        "0xec8902afffb06d0b075ea2d6fb3a45ec8598c39b"
    ],
    "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": "0xcf35bdd0",
            "selector": "0xcf35bdd0",
            "calldata_variants": [
                "0xcf35bdd0",
                "0xcf35bdd00000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xdae2a76c",
            "selector": "0xdae2a76c",
            "calldata_variants": [
                "0xdae2a76c",
                "0xdae2a76c0000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xdd62ed3e",
            "selector": "0xdd62ed3e",
            "calldata_variants": [
                "0xdd62ed3e",
                "0xdd62ed3e0000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xe6b4d21c",
            "selector": "0xe6b4d21c",
            "calldata_variants": [
                "0xe6b4d21c",
                "0xe6b4d21c0000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xeb3b7fd8",
            "selector": "0xeb3b7fd8",
            "calldata_variants": [
                "0xeb3b7fd8",
                "0xeb3b7fd80000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xf2fde38b",
            "selector": "0xf2fde38b",
            "calldata_variants": [
                "0xf2fde38b",
                "0xf2fde38b0000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xa9059cbb",
            "selector": "0xa9059cbb",
            "calldata_variants": [
                "0xa9059cbb",
                "0xa9059cbb0000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xaffed0e0",
            "selector": "0xaffed0e0",
            "calldata_variants": [
                "0xaffed0e0",
                "0xaffed0e00000000000000000000000000000000000000000000000000000000000000000"
            ]
        }
    ]
}
evidence_json
{
    "examples": [
        {
            "pc": 2987,
            "opcode": "CALL",
            "returndata_checked": null,
            "value_expression_category": "computed",
            "target_expression_category": "computed"
        },
        {
            "pc": 5492,
            "opcode": "CALL",
            "returndata_checked": null,
            "value_expression_category": "computed",
            "target_expression_category": "computed"
        },
        {
            "pc": 5800,
            "opcode": "CALL",
            "returndata_checked": null,
            "value_expression_category": "computed",
            "target_expression_category": "computed"
        }
    ],
    "call_count": 14,
    "guards_detected": [
        {
            "pc": 19730,
            "type": "tx_origin_used"
        },
        {
            "pc": 19772,
            "type": "tx_origin_used"
        }
    ],
    "untrusted_call_count": 14
}
medium other detector ETH value transfer possible 40 no no
view
trace_id: 0xab69e7c9f2612cdda5ed8555d7a4fae5ab44d6b5f3ffcd5250a5ed3618b0afea
call_targets: 0xec8902afffb06d0b075ea2d6fb3a45ec8598c39b
target_varies: no
classification: constant_target
validation_json
{
    "sink": "CALL",
    "errors": 0,
    "status": "sink_reached",
    "attempts": 1,
    "trace_id": "0xab69e7c9f2612cdda5ed8555d7a4fae5ab44d6b5f3ffcd5250a5ed3618b0afea",
    "confirmed": false,
    "trace_mode": "callTracer",
    "call_targets": [
        "0xec8902afffb06d0b075ea2d6fb3a45ec8598c39b"
    ],
    "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": "0xcf35bdd0",
            "selector": "0xcf35bdd0",
            "calldata_variants": [
                "0xcf35bdd0",
                "0xcf35bdd00000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xdae2a76c",
            "selector": "0xdae2a76c",
            "calldata_variants": [
                "0xdae2a76c",
                "0xdae2a76c0000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xdd62ed3e",
            "selector": "0xdd62ed3e",
            "calldata_variants": [
                "0xdd62ed3e",
                "0xdd62ed3e0000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xe6b4d21c",
            "selector": "0xe6b4d21c",
            "calldata_variants": [
                "0xe6b4d21c",
                "0xe6b4d21c0000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xeb3b7fd8",
            "selector": "0xeb3b7fd8",
            "calldata_variants": [
                "0xeb3b7fd8",
                "0xeb3b7fd80000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xf2fde38b",
            "selector": "0xf2fde38b",
            "calldata_variants": [
                "0xf2fde38b",
                "0xf2fde38b0000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xa9059cbb",
            "selector": "0xa9059cbb",
            "calldata_variants": [
                "0xa9059cbb",
                "0xa9059cbb0000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xaffed0e0",
            "selector": "0xaffed0e0",
            "calldata_variants": [
                "0xaffed0e0",
                "0xaffed0e00000000000000000000000000000000000000000000000000000000000000000"
            ]
        }
    ]
}
evidence_json
{
    "examples": [
        {
            "pc": 2987,
            "opcode": "CALL",
            "returndata_checked": null,
            "value_expression_category": "computed",
            "target_expression_category": "computed"
        },
        {
            "pc": 5492,
            "opcode": "CALL",
            "returndata_checked": null,
            "value_expression_category": "computed",
            "target_expression_category": "computed"
        },
        {
            "pc": 5800,
            "opcode": "CALL",
            "returndata_checked": null,
            "value_expression_category": "computed",
            "target_expression_category": "computed"
        }
    ],
    "eth_value_calls": 13,
    "guards_detected": [
        {
            "pc": 19730,
            "type": "tx_origin_used"
        },
        {
            "pc": 19772,
            "type": "tx_origin_used"
        }
    ]
}
medium upgradeability cast DELEGATECALL present 80 no
view
evidence_json
{
    "notes": "delegatecall enables execution in caller context; common in proxies/upgradeable patterns",
    "delegatecall_count": 1
}
info other cast Heavy CALL-family usage 55 no
view
evidence_json
{
    "notes": "large number of CALL/CALLCODE/STATICCALL opcodes; review external call patterns",
    "call_family_count": 46
}
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": 12
}