019d5666-7793-71fe-8365-fe0e83fcb95f
Open this run to answer one question: is this real attacker-relevant behavior with real impact, or just normal contract plumbing?
| ID | Type | Status | Attempts | Heartbeat |
|---|---|---|---|---|
| 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 |
{
"status": "not_proxy"
}
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
{"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"]}]}
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
{
"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
}
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
| Severity | Category | Tool | Title | Confidence | Validated | Confirmed | Details |
|---|---|---|---|---|---|---|---|
| high | auth | detector | Authorization based on tx.origin | 70 | no | — |
viewvalidation_json{
"reason": "missing sink mapping",
"status": "no_sink"
}
witness_json{
"notes": "heuristic witness; entrypoints are best-effort selectors with zeroed calldata",
"constraints": [],
"entrypoints": [
{
"calldata": "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 |
viewtrace_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 | — |
viewevidence_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 | — |
viewevidence_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 |
viewtrace_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 |
viewtrace_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 | — |
viewevidence_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 | — |
viewevidence_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 | — |
viewevidence_json{
"notes": "frequent external code or balance checks; may indicate introspection or validation logic",
"ext_balance_count": 12
}
|