019d5666-ddb2-7138-a85b-4026ca2b3eec
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 |
|---|---|---|---|---|
| 42950 | artifact.fetch | complete | 1 / 3 | 1 week ago |
| 42951 | proxy.resolve | complete | 1 / 3 | 1 week ago |
| 42952 | tool.cast_disasm | complete | 1 / 3 | 1 week ago |
| 42953 | analysis.bundle | complete | 1 / 3 | 1 week ago |
| 42954 | capability.graph | complete | 1 / 3 | 1 week ago |
| 42955 | detector.run | complete | 1 / 3 | 1 week ago |
| 42956 | validation.fork | complete | 1 / 3 | 1 week ago |
| 43006 | report.consolidate | complete | 1 / 6 | 1 week ago |
| 43007 | tool.slither | failed | 2 / 2 | 1 week ago |
{
"status": "not_proxy"
}
Traceback (most recent call last):
File "/var/www/tripwire/worker/worker.py", line 198, in main
payload = dispatch_job(job_type, job_id, job_meta, run_data, config, laravel_client)
File "/var/www/tripwire/worker/worker.py", line 114, in dispatch_job
return slither_run.run(job_id, job_meta, run_data, config, log, laravel_client)
~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/var/www/tripwire/worker/jobs/slither_run.py", line 1084, in run
stdout_text, stderr_text, result_json = _run_slither(
~~~~~~~~~~~~^
workspace,
^^^^^^^^^^
...<4 lines>...
target_path=target_path,
^^^^^^^^^^^^^^^^^^^^^^^^
)
^
File "/var/www/tripwire/worker/jobs/slither_run.py", line 958, in _run_slither
raise RuntimeError(f"slither failed (exit {result.returncode}): {stderr_text or stdout_text}")
RuntimeError: slither failed (exit 1): 'forge clean' running (wd: /tmp/slither-p4ao9bao)
'forge config --json' running
'forge build --build-info --skip ./test/** ./script/** --force' running (wd: /tmp/slither-p4ao9bao)
'forge' returned non-zero exit code 1
Error: Encountered invalid solc version in src/FrontrunMarket.sol: No solc version exists that matches the version requirement: =0.8.20
Traceback (most recent call last):
File "/var/www/tripwire/.venv/bin/slither", line 10, in <module>
sys.exit(main())
~~~~^^
File "/var/www/tripwire/.venv/lib/python3.13/site-packages/slither/__main__.py", line 776, in main
main_impl(all_detector_classes=detectors, all_printer_classes=printers)
~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/var/www/tripwire/.venv/lib/python3.13/site-packages/slither/__main__.py", line 882, in main_impl
) = process_all(filename, args, detector_classes, printer_classes)
~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/var/www/tripwire/.venv/lib/python3.13/site-packages/slither/__main__.py", line 96, in process_all
compilations = compile_all(target, **vars(args))
File "/var/www/tripwire/.venv/lib/python3.13/site-packages/crytic_compile/crytic_compile.py", line 722, in compile_all
compilations.append(CryticCompile(target, **kwargs))
~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^
File "/var/www/tripwire/.venv/lib/python3.13/site-packages/crytic_compile/crytic_compile.py", line 211, in __init__
self._compile(**kwargs)
~~~~~~~~~~~~~^^^^^^^^^^
File "/var/www/tripwire/.venv/lib/python3.13/site-packages/crytic_compile/crytic_compile.py", line 633, in _compile
self._platform.compile(self, **kwargs)
~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^
File "/var/www/tripwire/.venv/lib/python3.13/site-packages/crytic_compile/platform/foundry.py", line 102, in compile
hardhat_like_parsing(
~~~~~~~~~~~~~~~~~~~~^
crytic_compile, str(self._target), build_directory, str(self._project_root)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
File "/var/www/tripwire/.venv/lib/python3.13/site-packages/crytic_compile/platform/hardhat.py", line 52, in hardhat_like_parsing
raise InvalidCompilation(txt)
crytic_compile.platform.exceptions.InvalidCompilation: Compilation failed. Can you run build command?
/tmp/slither-p4ao9bao/out/build-info is not a directory.
{"no_findings":false,"summary":"Reviewed the full first-party bundle (`src/FrontrunMarket.sol`). Found two concrete loss-of-funds issues: escrow accounting breaks for fee-on-transfer collateral tokens, and the owner can de-whitelist an in-use token and withdraw user escrow.","findings":[{"severity":"high","category":"other","title":"Fee-on-transfer collateral tokens let users over-withdraw from pooled escrow","exploit_scenario":"If the owner whitelists a deflationary or fee-on-transfer ERC20, `newOffer`/`fillOffer` record the nominal `value` or `collateral` even when the contract receives less. An attacker can create an offer with a token that takes 10% on inbound transfers, deposit 90 tokens while the contract books 100, then cancel the offer and withdraw 100 from the shared pool. Repeating this drains other users' balances for that token and leaves later settlements/refunds insolvent.","recommendation":"Reject non-standard collateral tokens, or account by actual balance deltas (`balanceAfter - balanceBefore`) instead of user-supplied nominal amounts. Store per-offer deposited amounts based on what was really received.","evidence":"`newOffer` and `fillOffer` call `safeTransferFrom` and then immediately store/order against the caller-provided `value`/`collateral` without checking the actual amount received. `cancelOffer`, `settleFilled`, and `settleCancelled` later pay out based on those nominal amounts from a shared per-token balance.","locations":["src/FrontrunMarket.sol:322","src/FrontrunMarket.sol:343","src/FrontrunMarket.sol:346","src/FrontrunMarket.sol:381","src/FrontrunMarket.sol:410","src/FrontrunMarket.sol:412","src/FrontrunMarket.sol:474","src/FrontrunMarket.sol:513","src/FrontrunMarket.sol:563"]},{"severity":"high","category":"access_control","title":"Owner can de-whitelist an active collateral token and withdraw funds backing live positions","exploit_scenario":"Any accepted collateral token can be toggled to `false` via `setAcceptedTokens`, after which `withdrawStuckToken` will transfer the contract's entire balance of that token to an arbitrary address. If there are still open offers or orders using that token, the owner or a compromised owner key can drain the escrowed funds and leave users unable to cancel or settle their positions.","recommendation":"Do not let rescue logic depend only on the current whitelist flag. Track outstanding liabilities per token and only allow withdrawing true surplus, or forbid de-whitelisting/rescuing any token while open offers/orders still reference it.","evidence":"`setAcceptedTokens` can remove any token from the whitelist with no check for outstanding exposure. `withdrawStuckToken` only requires `!acceptedTokens[_token]`, then transfers the full contract balance of that token even though open offers/orders continue to use pooled balances for refunds and settlements.","locations":["src/FrontrunMarket.sol:656","src/FrontrunMarket.sol:660","src/FrontrunMarket.sol:780","src/FrontrunMarket.sol:782","src/FrontrunMarket.sol:784"]}]}
OpenAI Codex v0.118.0 (research preview)
--------
workdir: /tmp/codex-2v_62mvt
model: gpt-5.4
provider: openai
approval: never
sandbox: read-only
reasoning effort: high
reasoning summaries: none
session id: 019d56b2-800c-7663-9f14-1c673215956b
--------
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 locate first-party Solidity sources, starting with AUDIT_BUNDLE.txt
• Review bundled contracts for exploitable issues in scope categories
• Produce JSON audit findings with evidence and locations
exec
/bin/bash -lc "pwd && rg --files -g 'AUDIT_BUNDLE.txt' -g '*.sol' -g 'AGENTS.md'" in /tmp/codex-2v_62mvt
succeeded in 0ms:
/tmp/codex-2v_62mvt
src/FrontrunMarket.sol
AUDIT_BUNDLE.txt
lib/openzeppelin-contracts/contracts/interfaces/draft-IERC1822.sol
lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Utils.sol
lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol
lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol
lib/openzeppelin-contracts/contracts/proxy/utils/UUPSUpgradeable.sol
lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol
lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol
lib/openzeppelin-contracts-upgradeable/contracts/access/AccessControlUpgradeable.sol
lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol
lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Permit.sol
lib/openzeppelin-contracts/contracts/utils/Address.sol
lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol
lib/openzeppelin-contracts/contracts/access/IAccessControl.sol
lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol
lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol
lib/openzeppelin-contracts-upgradeable/contracts/utils/ReentrancyGuardUpgradeable.sol
lib/openzeppelin-contracts-upgradeable/contracts/utils/introspection/ERC165Upgradeable.sol
lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol
exec
/bin/bash -lc 'wc -l AUDIT_BUNDLE.txt' in /tmp/codex-2v_62mvt
succeeded in 0ms:
793 AUDIT_BUNDLE.txt
exec
/bin/bash -lc "sed -n '1,260p' AUDIT_BUNDLE.txt" in /tmp/codex-2v_62mvt
succeeded in 0ms:
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: src/FrontrunMarket.sol
================================================================================
//SPDX-License-Identifier: Unlicense
pragma solidity 0.8.20;
import '@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol';
import '@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol';
import '@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol';
import '@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol';
import '@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol';
import '@openzeppelin/contracts/token/ERC20/IERC20.sol';
import '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol';
import '@openzeppelin/contracts/utils/cryptography/ECDSA.sol';
struct Token {
address token;
uint48 settleTime;
uint48 settleDuration;
uint152 settleRate; // number of token per point
uint8 status; //
uint256 minAmount;
}
struct Offer {
uint8 offerType;
bytes32 tokenId;
address exToken;
uint256 amount;
uint256 value;
uint256 collateral;
uint256 filledAmount;
uint8 status;
address offeredBy;
uint256 minAmount;
}
struct Order {
uint256 offerId;
uint256 amount;
address seller;
address buyer;
uint8 status;
}
struct Config {
uint256 pledgeRate;
uint256 feeRefund;
uint256 feeSettle;
address feeWallet;
}
contract FrontrunMarket is Initializable, OwnableUpgradeable, ReentrancyGuardUpgradeable {
using SafeERC20 for IERC20;
uint256 constant WEI6 = 10 ** 6;
uint8 constant OFFER_BUY = 1;
uint8 constant OFFER_SELL = 2;
// Status
// Offer status
uint8 constant STATUS_OFFER_OPEN = 1;
uint8 constant STATUS_OFFER_FILLED = 2;
uint8 constant STATUS_OFFER_CANCELLED = 3;
// Order Status
uint8 constant STATUS_ORDER_OPEN = 1;
uint8 constant STATUS_ORDER_SETTLE_FILLED = 2;
uint8 constant STATUS_ORDER_SETTLE_CANCELLED = 3;
uint8 constant STATUS_ORDER_CANCELLED = 4;
// token status
uint8 constant STATUS_TOKEN_ACTIVE = 1;
uint8 constant STATUS_TOKEN_INACTIVE = 2;
uint8 constant STATUS_TOKEN_SETTLE = 3;
struct MarketStorage {
mapping(address => bool) acceptedTokens;
mapping(bytes32 => Token) tokens;
mapping(uint256 => Offer) offers;
uint256 lastOfferId;
mapping(uint256 => Order) orders;
uint256 lastOrderId;
Config config;
}
//keccak256(abi.encode(uint256(keccak256("frontrun.Market")) - 1)) & ~bytes32(uint256(0xff));
bytes32 constant MarketStorageLocation = 0x02c326031f2f3dedd13e7fde59c7c20af05a8826f4c07e8d42538c5f2be06800;
function _getOwnStorage() private pure returns (MarketStorage storage $) {
assembly {
$.slot := MarketStorageLocation
}
}
// event
event NewOffer(
uint256 id,
uint8 offerType,
bytes32 tokenId,
address exToken,
uint256 amount,
uint256 value,
uint256 collateral,
uint256 minAmount,
address doer
);
event NewToken(bytes32 tokenId, uint256 settleDuration, uint256 minAmount);
event NewOrder(uint256 id, uint256 offerId, uint256 amount, address seller, address buyer);
event SettleFilled(uint256 orderId, uint256 value, uint256 fee, address doer);
event SettleCancelled(uint256 orderId, uint256 value, uint256 fee, address doer);
event CancelOrder(uint256 orderId, address doer);
event CancelOffer(uint256 offerId, uint256 refundValue, uint256 refundFee, address doer);
event UpdateAcceptedTokens(address[] tokens, bool isAccepted);
event CloseOffer(uint256 offerId, uint256 refundAmount);
event UpdateConfig(
address oldFeeWallet,
uint256 oldFeeSettle,
uint256 oldFeeRefund,
uint256 oldPledgeRate,
address newFeeWallet,
uint256 newFeeSettle,
uint256 newFeeRefund,
uint256 newPledgeRate
);
event TokenToSettlePhase(bytes32 tokenId, address token, uint256 settleRate, uint256 settleTime);
event UpdateTokenStatus(bytes32 tokenId, uint8 oldValue, uint8 newValue);
event TokenForceCancelSettlePhase(bytes32 tokenId);
event Settle2Steps(uint256 orderId, bytes32 hash, address doer);
event UpdateTokenSettleDuration(bytes32 tokenId, uint48 oldValue, uint48 newValue);
function initialize() external initializer {
__Ownable_init(msg.sender);
// init value
MarketStorage storage $ = _getOwnStorage();
$.config.pledgeRate = WEI6; //
$.config.feeWallet = owner();
$.config.feeSettle = WEI6 / 200; // 0.5%
$.config.feeRefund = 0; // 0.0%
}
///////////////////////////
////// SYSTEM ACTION //////
///////////////////////////
/// @notice Creates a market to trade
/// @param tokenId market identifier
/// @param settleDuration Duration after which buyer of token can claim collateral if seller hasnt delivered
/// @param minAmount minAmount that can be filled for this particular market including offers and orders , 6 decimals
// add min order value in market so that in settle2steps we dont have to pay gas to settle low value orders
function createToken(bytes32 tokenId, uint48 settleDuration, uint256 minAmount) external onlyOwner {
MarketStorage storage $ = _getOwnStorage();
Token storage _token = $.tokens[tokenId];
_token.settleDuration = settleDuration;
_token.minAmount = minAmount;
_token.status = STATUS_TOKEN_ACTIVE;
emit NewToken(tokenId, settleDuration, minAmount);
}
/// @notice moves a market to settlement phase
/// @param tokenId market identifier
/// @param tokenAddress contract address for token to be delivered
/// @param settleRate how many tokens per 1M amount traded(if token to be delivered has 18 decimals write 1e12)
function tokenToSettlePhase(
bytes32 tokenId,
address tokenAddress,
uint152 settleRate // how many token for 1M points
) external onlyOwner {
MarketStorage storage $ = _getOwnStorage();
Token storage _token = $.tokens[tokenId];
require(tokenAddress != address(0), 'Invalid Token Address');
require(settleRate > 0, 'Invalid Settle Rate');
require(_token.status == STATUS_TOKEN_ACTIVE || _token.status == STATUS_TOKEN_INACTIVE, 'Invalid Token Status');
_token.token = tokenAddress;
_token.settleRate = settleRate;
// update token settle status & time
_token.status = STATUS_TOKEN_SETTLE;
_token.settleTime = uint48(block.timestamp);
emit TokenToSettlePhase(tokenId, tokenAddress, settleRate, block.timestamp);
}
/// @notice toggle market active inactive
/// @param tokenId market identifier
function tokenToggleActivation(bytes32 tokenId) external onlyOwner {
MarketStorage storage $ = _getOwnStorage();
Token storage _token = $.tokens[tokenId];
uint8 fromStatus = _token.status;
uint8 toStatus = fromStatus == STATUS_TOKEN_ACTIVE ? STATUS_TOKEN_INACTIVE : STATUS_TOKEN_ACTIVE;
require(fromStatus == STATUS_TOKEN_ACTIVE || fromStatus == STATUS_TOKEN_INACTIVE, 'Cannot Change Token Status');
_token.status = toStatus;
emit UpdateTokenStatus(tokenId, fromStatus, toStatus);
}
/// @notice // in case wrong setting for settle
/// @param tokenId market identifier
function tokenForceCancelSettlePhase(bytes32 tokenId) external onlyOwner {
MarketStorage storage $ = _getOwnStorage();
Token storage _token = $.tokens[tokenId];
require(_token.status == STATUS_TOKEN_SETTLE, 'Invalid Token Status');
_token.status = STATUS_TOKEN_INACTIVE;
emit TokenForceCancelSettlePhase(tokenId);
}
/// @notice // updates settleDuration
/// @param tokenId market identifier
/// @param newValue settleDuration value
function updateSettleDuration(bytes32 tokenId, uint48 newValue) external onlyOwner {
MarketStorage storage $ = _getOwnStorage();
Token storage _token = $.tokens[tokenId];
uint48 oldValue = _token.settleDuration;
_token.settleDuration = newValue;
emit UpdateTokenSettleDuration(tokenId, oldValue, newValue);
}
// force cancel order - by Operator/Owner
// refund for both seller & buyer without any fees cut
/// @notice
/// @param orderId order identifier
function forceCancelOrder(uint256 orderId) public nonReentrant onlyOwner {
MarketStorage storage $ = _getOwnStorage();
Order storage order = $.orders[orderId];
Offer storage offer = $.offers[order.offerId];
require(order.status == STATUS_ORDER_OPEN, 'Invalid Order Status');
// calculate refund
uint256 buyerRefundValue = (order.amount * offer.value) / offer.amount; // value
uint256 sellerRefundValue = (order.amount * offer.collateral) / offer.amount; // collateral
address buyer = order.buyer;
address seller = order.seller;
// refund
if (offer.exToken == address(0)) {
// refund ETH
if (buyerRefundValue > 0 && buyer != address(0)) {
(bool success,) = buyer.call{value: buyerRefundValue}('');
require(success, 'Transfer Funds to Seller Fail');
}
if (sellerRefundValue > 0 && seller != address(0)) {
(bool success,) = seller.call{value: sellerRefundValue}('');
require(success, 'Transfer Funds to Seller Fail');
}
} else {
IERC20 iexToken = IERC20(offer.exToken);
if (buyerRefundValue > 0 && buyer != address(0)) {
exec
/bin/bash -lc "sed -n '1,260p' src/FrontrunMarket.sol" in /tmp/codex-2v_62mvt
succeeded in 0ms:
//SPDX-License-Identifier: Unlicense
pragma solidity 0.8.20;
import '@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol';
import '@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol';
import '@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol';
import '@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol';
import '@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol';
import '@openzeppelin/contracts/token/ERC20/IERC20.sol';
import '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol';
import '@openzeppelin/contracts/utils/cryptography/ECDSA.sol';
struct Token {
address token;
uint48 settleTime;
uint48 settleDuration;
uint152 settleRate; // number of token per point
uint8 status; //
uint256 minAmount;
}
struct Offer {
uint8 offerType;
bytes32 tokenId;
address exToken;
uint256 amount;
uint256 value;
uint256 collateral;
uint256 filledAmount;
uint8 status;
address offeredBy;
uint256 minAmount;
}
struct Order {
uint256 offerId;
uint256 amount;
address seller;
address buyer;
uint8 status;
}
struct Config {
uint256 pledgeRate;
uint256 feeRefund;
uint256 feeSettle;
address feeWallet;
}
contract FrontrunMarket is Initializable, OwnableUpgradeable, ReentrancyGuardUpgradeable {
using SafeERC20 for IERC20;
uint256 constant WEI6 = 10 ** 6;
uint8 constant OFFER_BUY = 1;
uint8 constant OFFER_SELL = 2;
// Status
// Offer status
uint8 constant STATUS_OFFER_OPEN = 1;
uint8 constant STATUS_OFFER_FILLED = 2;
uint8 constant STATUS_OFFER_CANCELLED = 3;
// Order Status
uint8 constant STATUS_ORDER_OPEN = 1;
uint8 constant STATUS_ORDER_SETTLE_FILLED = 2;
uint8 constant STATUS_ORDER_SETTLE_CANCELLED = 3;
uint8 constant STATUS_ORDER_CANCELLED = 4;
// token status
uint8 constant STATUS_TOKEN_ACTIVE = 1;
uint8 constant STATUS_TOKEN_INACTIVE = 2;
uint8 constant STATUS_TOKEN_SETTLE = 3;
struct MarketStorage {
mapping(address => bool) acceptedTokens;
mapping(bytes32 => Token) tokens;
mapping(uint256 => Offer) offers;
uint256 lastOfferId;
mapping(uint256 => Order) orders;
uint256 lastOrderId;
Config config;
}
//keccak256(abi.encode(uint256(keccak256("frontrun.Market")) - 1)) & ~bytes32(uint256(0xff));
bytes32 constant MarketStorageLocation = 0x02c326031f2f3dedd13e7fde59c7c20af05a8826f4c07e8d42538c5f2be06800;
function _getOwnStorage() private pure returns (MarketStorage storage $) {
assembly {
$.slot := MarketStorageLocation
}
}
// event
event NewOffer(
uint256 id,
uint8 offerType,
bytes32 tokenId,
address exToken,
uint256 amount,
uint256 value,
uint256 collateral,
uint256 minAmount,
address doer
);
event NewToken(bytes32 tokenId, uint256 settleDuration, uint256 minAmount);
event NewOrder(uint256 id, uint256 offerId, uint256 amount, address seller, address buyer);
event SettleFilled(uint256 orderId, uint256 value, uint256 fee, address doer);
event SettleCancelled(uint256 orderId, uint256 value, uint256 fee, address doer);
event CancelOrder(uint256 orderId, address doer);
event CancelOffer(uint256 offerId, uint256 refundValue, uint256 refundFee, address doer);
event UpdateAcceptedTokens(address[] tokens, bool isAccepted);
event CloseOffer(uint256 offerId, uint256 refundAmount);
event UpdateConfig(
address oldFeeWallet,
uint256 oldFeeSettle,
uint256 oldFeeRefund,
uint256 oldPledgeRate,
address newFeeWallet,
uint256 newFeeSettle,
uint256 newFeeRefund,
uint256 newPledgeRate
);
event TokenToSettlePhase(bytes32 tokenId, address token, uint256 settleRate, uint256 settleTime);
event UpdateTokenStatus(bytes32 tokenId, uint8 oldValue, uint8 newValue);
event TokenForceCancelSettlePhase(bytes32 tokenId);
event Settle2Steps(uint256 orderId, bytes32 hash, address doer);
event UpdateTokenSettleDuration(bytes32 tokenId, uint48 oldValue, uint48 newValue);
function initialize() external initializer {
__Ownable_init(msg.sender);
// init value
MarketStorage storage $ = _getOwnStorage();
$.config.pledgeRate = WEI6; //
$.config.feeWallet = owner();
$.config.feeSettle = WEI6 / 200; // 0.5%
$.config.feeRefund = 0; // 0.0%
}
///////////////////////////
////// SYSTEM ACTION //////
///////////////////////////
/// @notice Creates a market to trade
/// @param tokenId market identifier
/// @param settleDuration Duration after which buyer of token can claim collateral if seller hasnt delivered
/// @param minAmount minAmount that can be filled for this particular market including offers and orders , 6 decimals
// add min order value in market so that in settle2steps we dont have to pay gas to settle low value orders
function createToken(bytes32 tokenId, uint48 settleDuration, uint256 minAmount) external onlyOwner {
MarketStorage storage $ = _getOwnStorage();
Token storage _token = $.tokens[tokenId];
_token.settleDuration = settleDuration;
_token.minAmount = minAmount;
_token.status = STATUS_TOKEN_ACTIVE;
emit NewToken(tokenId, settleDuration, minAmount);
}
/// @notice moves a market to settlement phase
/// @param tokenId market identifier
/// @param tokenAddress contract address for token to be delivered
/// @param settleRate how many tokens per 1M amount traded(if token to be delivered has 18 decimals write 1e12)
function tokenToSettlePhase(
bytes32 tokenId,
address tokenAddress,
uint152 settleRate // how many token for 1M points
) external onlyOwner {
MarketStorage storage $ = _getOwnStorage();
Token storage _token = $.tokens[tokenId];
require(tokenAddress != address(0), 'Invalid Token Address');
require(settleRate > 0, 'Invalid Settle Rate');
require(_token.status == STATUS_TOKEN_ACTIVE || _token.status == STATUS_TOKEN_INACTIVE, 'Invalid Token Status');
_token.token = tokenAddress;
_token.settleRate = settleRate;
// update token settle status & time
_token.status = STATUS_TOKEN_SETTLE;
_token.settleTime = uint48(block.timestamp);
emit TokenToSettlePhase(tokenId, tokenAddress, settleRate, block.timestamp);
}
/// @notice toggle market active inactive
/// @param tokenId market identifier
function tokenToggleActivation(bytes32 tokenId) external onlyOwner {
MarketStorage storage $ = _getOwnStorage();
Token storage _token = $.tokens[tokenId];
uint8 fromStatus = _token.status;
uint8 toStatus = fromStatus == STATUS_TOKEN_ACTIVE ? STATUS_TOKEN_INACTIVE : STATUS_TOKEN_ACTIVE;
require(fromStatus == STATUS_TOKEN_ACTIVE || fromStatus == STATUS_TOKEN_INACTIVE, 'Cannot Change Token Status');
_token.status = toStatus;
emit UpdateTokenStatus(tokenId, fromStatus, toStatus);
}
/// @notice // in case wrong setting for settle
/// @param tokenId market identifier
function tokenForceCancelSettlePhase(bytes32 tokenId) external onlyOwner {
MarketStorage storage $ = _getOwnStorage();
Token storage _token = $.tokens[tokenId];
require(_token.status == STATUS_TOKEN_SETTLE, 'Invalid Token Status');
_token.status = STATUS_TOKEN_INACTIVE;
emit TokenForceCancelSettlePhase(tokenId);
}
/// @notice // updates settleDuration
/// @param tokenId market identifier
/// @param newValue settleDuration value
function updateSettleDuration(bytes32 tokenId, uint48 newValue) external onlyOwner {
MarketStorage storage $ = _getOwnStorage();
Token storage _token = $.tokens[tokenId];
uint48 oldValue = _token.settleDuration;
_token.settleDuration = newValue;
emit UpdateTokenSettleDuration(tokenId, oldValue, newValue);
}
// force cancel order - by Operator/Owner
// refund for both seller & buyer without any fees cut
/// @notice
/// @param orderId order identifier
function forceCancelOrder(uint256 orderId) public nonReentrant onlyOwner {
MarketStorage storage $ = _getOwnStorage();
Order storage order = $.orders[orderId];
Offer storage offer = $.offers[order.offerId];
require(order.status == STATUS_ORDER_OPEN, 'Invalid Order Status');
// calculate refund
uint256 buyerRefundValue = (order.amount * offer.value) / offer.amount; // value
uint256 sellerRefundValue = (order.amount * offer.collateral) / offer.amount; // collateral
address buyer = order.buyer;
address seller = order.seller;
// refund
if (offer.exToken == address(0)) {
// refund ETH
if (buyerRefundValue > 0 && buyer != address(0)) {
(bool success,) = buyer.call{value: buyerRefundValue}('');
require(success, 'Transfer Funds to Seller Fail');
}
if (sellerRefundValue > 0 && seller != address(0)) {
(bool success,) = seller.call{value: sellerRefundValue}('');
require(success, 'Transfer Funds to Seller Fail');
}
} else {
IERC20 iexToken = IERC20(offer.exToken);
if (buyerRefundValue > 0 && buyer != address(0)) {
iexToken.safeTransfer(buyer, buyerRefundValue);
}
if (sellerRefundValue > 0 && seller != address(0)) {
iexToken.safeTransfer(seller, sellerRefundValue);
}
}
exec
/bin/bash -lc "sed -n '261,520p' AUDIT_BUNDLE.txt" in /tmp/codex-2v_62mvt
succeeded in 0ms:
iexToken.safeTransfer(buyer, buyerRefundValue);
}
if (sellerRefundValue > 0 && seller != address(0)) {
iexToken.safeTransfer(seller, sellerRefundValue);
}
}
order.status = STATUS_ORDER_CANCELLED;
emit CancelOrder(orderId, msg.sender);
}
// 2 steps settle:
// Tx1: Seller sending token to system vault/buyer
// Tx2: then Operator/Owner verify and settle to pay seller money+collateral
function settle2Steps(uint256 orderId, bytes32 hash) public nonReentrant onlyOwner {
MarketStorage storage $ = _getOwnStorage();
Order storage order = $.orders[orderId];
Offer storage offer = $.offers[order.offerId];
Token storage token = $.tokens[offer.tokenId];
// check condition
require(token.status == STATUS_TOKEN_SETTLE, 'Invalid Status');
require(token.token != address(0) && token.settleRate > 0, 'Token Not Set');
require(block.timestamp > token.settleTime, 'Settling Time Not Started');
require(order.status == STATUS_ORDER_OPEN, 'Invalid Order Status');
uint256 collateral = (order.amount * offer.collateral) / offer.amount;
uint256 value = (order.amount * offer.value) / offer.amount;
// transfer liquid to seller
uint256 settleFee = (value * $.config.feeSettle) / WEI6;
uint256 totalValue = value + collateral - settleFee;
if (offer.exToken == address(0)) {
// by ETH
(bool success1,) = order.seller.call{value: totalValue}('');
(bool success2,) = $.config.feeWallet.call{value: settleFee}('');
require(success1 && success2, 'Transfer Funds Fail');
} else {
// by exToken
IERC20 iexToken = IERC20(offer.exToken);
iexToken.safeTransfer(order.seller, totalValue);
iexToken.safeTransfer($.config.feeWallet, settleFee);
}
order.status = STATUS_ORDER_SETTLE_FILLED;
emit Settle2Steps(orderId, hash, msg.sender);
emit SettleFilled(orderId, totalValue, settleFee, msg.sender);
}
function settle2StepsBatch(uint256[] calldata orderIds, bytes32[] calldata hashes) external {
require(orderIds.length == hashes.length, 'Invalid Input');
for (uint256 i = 0; i < orderIds.length; i++) {
settle2Steps(orderIds[i], hashes[i]);
}
}
/////////////////////////
////// USER ACTION //////
/////////////////////////
// make a offer request using erc20 collateral
/// @notice
/// @param tokenId market identifier
/// @param amount amount of market asset in 6 decimals
/// @param value amount of collateral being deposited, price = collateral/amount
/// @param exToken collateral token contract addres
/// @param minAmount min amount that must be filled by the counterparty in 6 decimals
function newOffer(
uint8 offerType,
bytes32 tokenId,
uint256 amount, //amount of asset
uint256 value, // amount of collateral
address exToken,
uint256 minAmount
) external nonReentrant {
MarketStorage storage $ = _getOwnStorage();
Token storage token = $.tokens[tokenId];
require(token.status == STATUS_TOKEN_ACTIVE, 'Invalid Token');
require(exToken != address(0) && $.acceptedTokens[exToken], 'Invalid Offer Token');
require(amount > 0 && value > 0, 'Invalid Amount or Value');
require(amount >= minAmount, 'minamount to be filled cant be greater then amount');
require(minAmount >= token.minAmount, 'minamount should be greater then eual to market global minamount');
IERC20 iexToken = IERC20(exToken);
// collateral
uint256 collateral = (value * $.config.pledgeRate) / WEI6;
// transfer offer value (offer buy) or collateral (offer sell)
uint256 _transferAmount = offerType == OFFER_BUY ? value : collateral;
iexToken.safeTransferFrom(msg.sender, address(this), _transferAmount);
// create new offer
_newOffer(offerType, tokenId, exToken, amount, value, collateral, minAmount);
}
// New offer in ETH
/// @notice
/// @param tokenId market identifier
/// @param amount amount of market asset in 6 decimals
/// @param value amount of collateral being deposited, price = collateral/amount
/// @param minAmount min amount that must be filled by the counterparty in 6 decimals
function newOfferETH(
uint8 offerType,
bytes32 tokenId,
uint256 amount,
uint256 value,
uint256 minAmount
) external payable nonReentrant {
MarketStorage storage $ = _getOwnStorage();
Token storage token = $.tokens[tokenId];
require(token.status == STATUS_TOKEN_ACTIVE, 'Invalid Token');
require(amount > 0 && value > 0, 'Invalid Amount or Value');
require(amount >= minAmount, 'minamount to be filled cant be greater then amount');
require(minAmount >= token.minAmount, 'minamount should be greater then eual to market global minamount');
// collateral
uint256 collateral = (value * $.config.pledgeRate) / WEI6;
uint256 _ethAmount = offerType == OFFER_BUY ? value : collateral;
require(_ethAmount == msg.value, 'Insufficient Funds');
// create new offer
_newOffer(offerType, tokenId, address(0), amount, value, collateral, minAmount);
}
/// @notice fill an offer with erc20 collateral and generate an orderid associated with a trade
/// @param offerId offer identifier
/// @param amount amount of market asset in 6 decimals
function fillOffer(uint256 offerId, uint256 amount) public {
MarketStorage storage $ = _getOwnStorage();
Offer storage offer = $.offers[offerId];
Token storage token = $.tokens[offer.tokenId];
require(offer.status == STATUS_OFFER_OPEN, 'Invalid Offer Status');
require(token.status == STATUS_TOKEN_ACTIVE, 'Invalid token Status');
require(amount > 0, 'Invalid Amount');
require(offer.amount - offer.filledAmount >= amount, 'Insufficient Allocations');
if (offer.amount - offer.filledAmount > offer.minAmount) {
require(amount >= offer.minAmount, 'cannot fill less then offer minamount');
} else {
require(amount == offer.amount - offer.filledAmount, 'if less then asset minamount must fill complete order');
}
require(offer.exToken != address(0), 'Invalid Offer Token');
// transfer value or collecteral
IERC20 iexToken = IERC20(offer.exToken);
uint256 _transferAmount;
address buyer;
address seller;
if (offer.offerType == OFFER_BUY) {
_transferAmount = (offer.collateral * amount) / offer.amount;
buyer = offer.offeredBy;
seller = msg.sender;
} else {
_transferAmount = (offer.value * amount) / offer.amount;
buyer = msg.sender;
seller = offer.offeredBy;
}
iexToken.safeTransferFrom(msg.sender, address(this), _transferAmount);
_fillOffer(offerId, amount, buyer, seller);
}
/// @notice fill an offer with eth collateral and generate an orderid associated with a trade
/// @param offerId offer identifier
/// @param amount amount of market asset in 6 decimals
function fillOfferETH(uint256 offerId, uint256 amount) external payable nonReentrant {
uint256 _ethAmount = _fillOfferETH(offerId, amount);
require(msg.value >= _ethAmount, 'Insufficient Funds');
require(_ethAmount + 5 * 1e16 > msg.value, 'Extra Amount Sent');
}
/// @notice batche fill both types of offers
function batchFillOffer(uint256[] calldata offerId, uint256[] calldata amount) external payable nonReentrant {
require(offerId.length == amount.length, 'Invalid Input');
uint256 _ethAmount;
MarketStorage storage $ = _getOwnStorage();
for (uint256 i = 0; i < offerId.length; i++) {
Offer storage offer = $.offers[offerId[i]];
if (offer.exToken == address(0)) {
_ethAmount += _fillOfferETH(offerId[i], amount[i]);
} else {
fillOffer(offerId[i], amount[i]);
}
}
require(msg.value >= _ethAmount, 'Insufficient Funds');
require(_ethAmount + 5 * 1e16 > msg.value, 'Extra Amount Sent');
}
function _fillOfferETH(uint256 offerId, uint256 amount) internal returns (uint256 _ethAmount) {
MarketStorage storage $ = _getOwnStorage();
Offer storage offer = $.offers[offerId];
Token storage token = $.tokens[offer.tokenId];
require(offer.status == STATUS_OFFER_OPEN, 'Invalid Offer Status');
require(token.status == STATUS_TOKEN_ACTIVE, 'Invalid token Status');
require(amount > 0, 'Invalid Amount');
require(offer.amount - offer.filledAmount >= amount, 'Insufficient Allocations');
if (offer.amount - offer.filledAmount > offer.minAmount) {
require(amount >= offer.minAmount, 'cannot fill less then offer minamount or asset minamount');
} else {
require(amount == offer.amount - offer.filledAmount, 'if less then asset minamount must fill complete order');
}
require(offer.exToken == address(0), 'Invalid Offer Token');
// transfer value or collecteral
address buyer;
address seller;
if (offer.offerType == OFFER_BUY) {
_ethAmount = (offer.collateral * amount) / offer.amount;
buyer = offer.offeredBy;
seller = msg.sender;
} else {
_ethAmount = (offer.value * amount) / offer.amount;
buyer = msg.sender;
seller = offer.offeredBy;
}
// new order
_fillOffer(offerId, amount, buyer, seller);
}
/// @notice close unfullfilled offer - by Offer owner
/// @param offerId offer identifier
function cancelOffer(uint256 offerId) public nonReentrant {
MarketStorage storage $ = _getOwnStorage();
Offer storage offer = $.offers[offerId];
require(offer.offeredBy == msg.sender, 'Offer Owner Only');
require(offer.status == STATUS_OFFER_OPEN, 'Invalid Offer Status');
uint256 refundAmount = offer.amount - offer.filledAmount;
require(refundAmount > 0, 'Insufficient Allocations');
// calculate refund
uint256 refundValue;
if (offer.offerType == OFFER_BUY) {
refundValue = (refundAmount * offer.value) / offer.amount;
} else {
refundValue = (refundAmount * offer.collateral) / offer.amount;
}
uint256 refundFee = (refundValue * $.config.feeRefund) / WEI6;
refundValue -= refundFee;
// refund
if (offer.exToken == address(0)) {
// refund ETH
(bool success1,) = offer.offeredBy.call{value: refundValue}('');
(bool success2,) = $.config.feeWallet.call{value: refundFee}('');
require(success1 && success2, 'Transfer Funds Fail');
} else {
IERC20 iexToken = IERC20(offer.exToken);
iexToken.safeTransfer(offer.offeredBy, refundValue);
iexToken.safeTransfer($.config.feeWallet, refundFee);
}
offer.status = STATUS_OFFER_CANCELLED;
emit CancelOffer(offerId, refundValue, refundFee, msg.sender);
}
//
/// @notice settle order - deliver token to finillize the order
/// @param orderId order identifier
function settleFilled(uint256 orderId) public nonReentrant {
MarketStorage storage $ = _getOwnStorage();
exec
/bin/bash -lc "sed -n '521,793p' AUDIT_BUNDLE.txt" in /tmp/codex-2v_62mvt
succeeded in 0ms:
Order storage order = $.orders[orderId];
Offer storage offer = $.offers[order.offerId];
Token storage token = $.tokens[offer.tokenId];
// check condition
require(token.status == STATUS_TOKEN_SETTLE, 'Invalid Status');
require(token.token != address(0) && token.settleRate > 0, 'Token Not Set');
require(block.timestamp > token.settleTime, 'Settling Time Not Started');
require(order.seller == msg.sender, 'Seller Only');
require(order.status == STATUS_ORDER_OPEN, 'Invalid Order Status');
uint256 collateral = (order.amount * offer.collateral) / offer.amount;
uint256 value = (order.amount * offer.value) / offer.amount;
// transfer token to buyer
IERC20 iToken = IERC20(token.token);
// calculate token amount base on it's decimals
uint256 tokenAmount = (order.amount * token.settleRate) / WEI6;
uint256 tokenAmountFee = (tokenAmount * $.config.feeSettle) / WEI6;
// transfer order fee in token to fee wallet
iToken.safeTransferFrom(order.seller, $.config.feeWallet, tokenAmountFee);
// transfer token after fee to buyer
iToken.safeTransferFrom(order.seller, order.buyer, tokenAmount - tokenAmountFee);
// transfer liquid to seller
uint256 settleFee = (value * $.config.feeSettle) / WEI6;
uint256 totalValue = value + collateral - settleFee;
if (offer.exToken == address(0)) {
// by ETH
(bool success1,) = order.seller.call{value: totalValue}('');
(bool success2,) = $.config.feeWallet.call{value: settleFee}('');
require(success1 && success2, 'Transfer Funds Fail');
} else {
// by exToken
IERC20 iexToken = IERC20(offer.exToken);
iexToken.safeTransfer(order.seller, totalValue);
iexToken.safeTransfer($.config.feeWallet, settleFee);
}
order.status = STATUS_ORDER_SETTLE_FILLED;
emit SettleFilled(orderId, totalValue, settleFee, msg.sender);
}
/// @notice cancel unfilled order by token buyer after settleDuration time frame
/// @notice // token seller lose collateral to token buyer
/// @param orderId order identifier
function settleCancelled(uint256 orderId) public nonReentrant {
MarketStorage storage $ = _getOwnStorage();
Order storage order = $.orders[orderId];
Offer storage offer = $.offers[order.offerId];
Token storage token = $.tokens[offer.tokenId];
// check condition
require(token.status == STATUS_TOKEN_SETTLE, 'Invalid Status');
require(block.timestamp > token.settleTime + token.settleDuration, 'Settling Time Not Ended Yet');
require(order.status == STATUS_ORDER_OPEN, 'Invalid Order Status');
require(order.buyer == msg.sender || owner() == msg.sender, 'Buyer or Operator/Owner Only');
uint256 collateral = (order.amount * offer.collateral) / offer.amount;
uint256 value = (order.amount * offer.value) / offer.amount;
// transfer liquid to buyer
uint256 settleFee = (collateral * $.config.feeSettle * 2) / WEI6;
uint256 totalValue = value + collateral - settleFee;
if (offer.exToken == address(0)) {
// by ETH
(bool success1,) = order.buyer.call{value: totalValue}('');
(bool success2,) = $.config.feeWallet.call{value: settleFee}('');
require(success1 && success2, 'Transfer Funds Fail');
} else {
// by exToken
IERC20 iexToken = IERC20(offer.exToken);
iexToken.safeTransfer(order.buyer, totalValue);
iexToken.safeTransfer($.config.feeWallet, settleFee);
}
order.status = STATUS_ORDER_SETTLE_CANCELLED;
emit SettleCancelled(orderId, totalValue, settleFee, msg.sender);
}
// Batch actions
function batchForceCancelOrders(uint256[] calldata orderIds) external {
for (uint256 i = 0; i < orderIds.length; i++) {
forceCancelOrder(orderIds[i]);
}
}
function batchCancelOffers(uint256[] calldata offerIds) external {
for (uint256 i = 0; i < offerIds.length; i++) {
cancelOffer(offerIds[i]);
}
}
function batchSettleFilleds(uint256[] calldata orderIds) external {
for (uint256 i = 0; i < orderIds.length; i++) {
settleFilled(orderIds[i]);
}
}
function batchSettleCancelleds(uint256[] calldata orderIds) external {
for (uint256 i = 0; i < orderIds.length; i++) {
settleCancelled(orderIds[i]);
}
}
///////////////////////////
///////// SETTER //////////
///////////////////////////
function updateConfig(
address feeWallet_,
uint256 feeSettle_,
uint256 feeRefund_,
uint256 pledgeRate_
) external onlyOwner {
MarketStorage storage $ = _getOwnStorage();
require(feeWallet_ != address(0), 'Invalid Address');
require(feeSettle_ <= WEI6 / 100, 'Settle Fee <= 10%');
require(feeRefund_ <= WEI6 / 100, 'Cancel Fee <= 10%');
emit UpdateConfig(
$.config.feeWallet,
$.config.feeSettle,
$.config.feeRefund,
$.config.pledgeRate,
feeWallet_,
feeSettle_,
feeRefund_,
pledgeRate_
);
// update
$.config.feeWallet = feeWallet_;
$.config.feeSettle = feeSettle_;
$.config.feeRefund = feeRefund_;
$.config.pledgeRate = pledgeRate_;
}
//
/// @notice adding/removing asset to be allowed to use as collateral
function setAcceptedTokens(address[] calldata tokenAddresses, bool isAccepted) external onlyOwner {
MarketStorage storage $ = _getOwnStorage();
for (uint256 i = 0; i < tokenAddresses.length; i++) {
$.acceptedTokens[tokenAddresses[i]] = isAccepted;
}
emit UpdateAcceptedTokens(tokenAddresses, isAccepted);
}
///////////////////////////
///////// GETTER //////////
///////////////////////////
function offerAmount(uint256 offerId) external view returns (uint256) {
MarketStorage storage $ = _getOwnStorage();
return $.offers[offerId].amount;
}
function offerAmountAvailable(uint256 offerId) external view returns (uint256) {
MarketStorage storage $ = _getOwnStorage();
return $.offers[offerId].amount - $.offers[offerId].filledAmount;
}
function offerValue(uint256 offerId) external view returns (uint256) {
MarketStorage storage $ = _getOwnStorage();
return $.offers[offerId].value;
}
function offerExToken(uint256 offerId) external view returns (address) {
MarketStorage storage $ = _getOwnStorage();
return $.offers[offerId].exToken;
}
function isBuyOffer(uint256 offerId) external view returns (bool) {
MarketStorage storage $ = _getOwnStorage();
return $.offers[offerId].offerType == OFFER_BUY;
}
function isSellOffer(uint256 offerId) external view returns (bool) {
MarketStorage storage $ = _getOwnStorage();
return $.offers[offerId].offerType == OFFER_SELL;
}
function offerStatus(uint256 offerId) external view returns (uint256) {
MarketStorage storage $ = _getOwnStorage();
return $.offers[offerId].status;
}
function orderStatus(uint256 orderId) external view returns (uint256) {
MarketStorage storage $ = _getOwnStorage();
return $.orders[orderId].status;
}
function tokens(bytes32 tokenId) external view returns (Token memory) {
MarketStorage storage $ = _getOwnStorage();
return $.tokens[tokenId];
}
function offers(uint256 id) external view returns (Offer memory) {
MarketStorage storage $ = _getOwnStorage();
return $.offers[id];
}
function orders(uint256 id) external view returns (Order memory) {
MarketStorage storage $ = _getOwnStorage();
return $.orders[id];
}
function config() external view returns (Config memory) {
MarketStorage storage $ = _getOwnStorage();
return $.config;
}
function isAcceptedToken(address token) external view returns (bool) {
MarketStorage storage $ = _getOwnStorage();
return $.acceptedTokens[token];
}
function lastOfferId() external view returns (uint256) {
MarketStorage storage $ = _getOwnStorage();
return $.lastOfferId;
}
function lastOrderId() external view returns (uint256) {
MarketStorage storage $ = _getOwnStorage();
return $.lastOrderId;
}
///////////////////////////
//////// INTERNAL /////////
///////////////////////////
function _newOffer(
uint8 offerType,
bytes32 tokenId,
address exToken,
uint256 amount,
uint256 value,
uint256 collateral,
uint256 minAmount
) internal {
MarketStorage storage $ = _getOwnStorage();
// create new offer
$.offers[++$.lastOfferId] =
Offer(offerType, tokenId, exToken, amount, value, collateral, 0, STATUS_OFFER_OPEN, msg.sender, minAmount);
emit NewOffer($.lastOfferId, offerType, tokenId, exToken, amount, value, collateral, minAmount, msg.sender);
}
function _fillOffer(uint256 offerId, uint256 amount, address buyer, address seller) internal {
MarketStorage storage $ = _getOwnStorage();
Offer storage offer = $.offers[offerId];
// new order
$.orders[++$.lastOrderId] = Order(offerId, amount, seller, buyer, STATUS_ORDER_OPEN);
// check if offer is fullfilled
offer.filledAmount += amount;
if (offer.filledAmount == offer.amount) {
offer.status = STATUS_OFFER_FILLED;
emit CloseOffer(offerId, 0);
}
emit NewOrder($.lastOrderId, offerId, amount, seller, buyer);
}
// get stuck token in contract
function withdrawStuckToken(address _token, address _to) external onlyOwner {
MarketStorage storage $ = _getOwnStorage();
require(_token != address(0) && !$.acceptedTokens[_token], 'Invalid Token Address');
uint256 _contractBalance = IERC20(_token).balanceOf(address(this));
IERC20(_token).safeTransfer(_to, _contractBalance);
}
}
exec
/bin/bash -lc "nl -ba src/FrontrunMarket.sol | sed -n '1,260p'" in /tmp/codex-2v_62mvt
succeeded in 0ms:
1 //SPDX-License-Identifier: Unlicense
2 pragma solidity 0.8.20;
3
4 import '@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol';
5 import '@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol';
6 import '@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol';
7 import '@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol';
8 import '@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol';
9 import '@openzeppelin/contracts/token/ERC20/IERC20.sol';
10 import '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol';
11 import '@openzeppelin/contracts/utils/cryptography/ECDSA.sol';
12
13 struct Token {
14 address token;
15 uint48 settleTime;
16 uint48 settleDuration;
17 uint152 settleRate; // number of token per point
18 uint8 status; //
19 uint256 minAmount;
20 }
21
22 struct Offer {
23 uint8 offerType;
24 bytes32 tokenId;
25 address exToken;
26 uint256 amount;
27 uint256 value;
28 uint256 collateral;
29 uint256 filledAmount;
30 uint8 status;
31 address offeredBy;
32 uint256 minAmount;
33 }
34
35 struct Order {
36 uint256 offerId;
37 uint256 amount;
38 address seller;
39 address buyer;
40 uint8 status;
41 }
42
43 struct Config {
44 uint256 pledgeRate;
45 uint256 feeRefund;
46 uint256 feeSettle;
47 address feeWallet;
48 }
49
50 contract FrontrunMarket is Initializable, OwnableUpgradeable, ReentrancyGuardUpgradeable {
51 using SafeERC20 for IERC20;
52
53 uint256 constant WEI6 = 10 ** 6;
54 uint8 constant OFFER_BUY = 1;
55 uint8 constant OFFER_SELL = 2;
56
57 // Status
58 // Offer status
59 uint8 constant STATUS_OFFER_OPEN = 1;
60 uint8 constant STATUS_OFFER_FILLED = 2;
61 uint8 constant STATUS_OFFER_CANCELLED = 3;
62
63 // Order Status
64 uint8 constant STATUS_ORDER_OPEN = 1;
65 uint8 constant STATUS_ORDER_SETTLE_FILLED = 2;
66 uint8 constant STATUS_ORDER_SETTLE_CANCELLED = 3;
67 uint8 constant STATUS_ORDER_CANCELLED = 4;
68
69 // token status
70 uint8 constant STATUS_TOKEN_ACTIVE = 1;
71 uint8 constant STATUS_TOKEN_INACTIVE = 2;
72 uint8 constant STATUS_TOKEN_SETTLE = 3;
73
74 struct MarketStorage {
75 mapping(address => bool) acceptedTokens;
76 mapping(bytes32 => Token) tokens;
77 mapping(uint256 => Offer) offers;
78 uint256 lastOfferId;
79 mapping(uint256 => Order) orders;
80 uint256 lastOrderId;
81 Config config;
82 }
83
84 //keccak256(abi.encode(uint256(keccak256("frontrun.Market")) - 1)) & ~bytes32(uint256(0xff));
85 bytes32 constant MarketStorageLocation = 0x02c326031f2f3dedd13e7fde59c7c20af05a8826f4c07e8d42538c5f2be06800;
86
87 function _getOwnStorage() private pure returns (MarketStorage storage $) {
88 assembly {
89 $.slot := MarketStorageLocation
90 }
91 }
92
93 // event
94
95 event NewOffer(
96 uint256 id,
97 uint8 offerType,
98 bytes32 tokenId,
99 address exToken,
100 uint256 amount,
101 uint256 value,
102 uint256 collateral,
103 uint256 minAmount,
104 address doer
105 );
106 event NewToken(bytes32 tokenId, uint256 settleDuration, uint256 minAmount);
107 event NewOrder(uint256 id, uint256 offerId, uint256 amount, address seller, address buyer);
108
109 event SettleFilled(uint256 orderId, uint256 value, uint256 fee, address doer);
110 event SettleCancelled(uint256 orderId, uint256 value, uint256 fee, address doer);
111
112 event CancelOrder(uint256 orderId, address doer);
113 event CancelOffer(uint256 offerId, uint256 refundValue, uint256 refundFee, address doer);
114
115 event UpdateAcceptedTokens(address[] tokens, bool isAccepted);
116
117 event CloseOffer(uint256 offerId, uint256 refundAmount);
118
119 event UpdateConfig(
120 address oldFeeWallet,
121 uint256 oldFeeSettle,
122 uint256 oldFeeRefund,
123 uint256 oldPledgeRate,
124 address newFeeWallet,
125 uint256 newFeeSettle,
126 uint256 newFeeRefund,
127 uint256 newPledgeRate
128 );
129
130 event TokenToSettlePhase(bytes32 tokenId, address token, uint256 settleRate, uint256 settleTime);
131 event UpdateTokenStatus(bytes32 tokenId, uint8 oldValue, uint8 newValue);
132 event TokenForceCancelSettlePhase(bytes32 tokenId);
133
134 event Settle2Steps(uint256 orderId, bytes32 hash, address doer);
135
136 event UpdateTokenSettleDuration(bytes32 tokenId, uint48 oldValue, uint48 newValue);
137
138 function initialize() external initializer {
139 __Ownable_init(msg.sender);
140 // init value
141 MarketStorage storage $ = _getOwnStorage();
142 $.config.pledgeRate = WEI6; //
143 $.config.feeWallet = owner();
144 $.config.feeSettle = WEI6 / 200; // 0.5%
145 $.config.feeRefund = 0; // 0.0%
146 }
147
148 ///////////////////////////
149 ////// SYSTEM ACTION //////
150 ///////////////////////////
151
152 /// @notice Creates a market to trade
153 /// @param tokenId market identifier
154 /// @param settleDuration Duration after which buyer of token can claim collateral if seller hasnt delivered
155 /// @param minAmount minAmount that can be filled for this particular market including offers and orders , 6 decimals
156 // add min order value in market so that in settle2steps we dont have to pay gas to settle low value orders
157 function createToken(bytes32 tokenId, uint48 settleDuration, uint256 minAmount) external onlyOwner {
158 MarketStorage storage $ = _getOwnStorage();
159 Token storage _token = $.tokens[tokenId];
160 _token.settleDuration = settleDuration;
161 _token.minAmount = minAmount;
162 _token.status = STATUS_TOKEN_ACTIVE;
163 emit NewToken(tokenId, settleDuration, minAmount);
164 }
165
166 /// @notice moves a market to settlement phase
167 /// @param tokenId market identifier
168 /// @param tokenAddress contract address for token to be delivered
169 /// @param settleRate how many tokens per 1M amount traded(if token to be delivered has 18 decimals write 1e12)
170 function tokenToSettlePhase(
171 bytes32 tokenId,
172 address tokenAddress,
173 uint152 settleRate // how many token for 1M points
174 ) external onlyOwner {
175 MarketStorage storage $ = _getOwnStorage();
176 Token storage _token = $.tokens[tokenId];
177 require(tokenAddress != address(0), 'Invalid Token Address');
178 require(settleRate > 0, 'Invalid Settle Rate');
179 require(_token.status == STATUS_TOKEN_ACTIVE || _token.status == STATUS_TOKEN_INACTIVE, 'Invalid Token Status');
180 _token.token = tokenAddress;
181 _token.settleRate = settleRate;
182 // update token settle status & time
183 _token.status = STATUS_TOKEN_SETTLE;
184 _token.settleTime = uint48(block.timestamp);
185
186 emit TokenToSettlePhase(tokenId, tokenAddress, settleRate, block.timestamp);
187 }
188
189 /// @notice toggle market active inactive
190 /// @param tokenId market identifier
191 function tokenToggleActivation(bytes32 tokenId) external onlyOwner {
192 MarketStorage storage $ = _getOwnStorage();
193 Token storage _token = $.tokens[tokenId];
194 uint8 fromStatus = _token.status;
195 uint8 toStatus = fromStatus == STATUS_TOKEN_ACTIVE ? STATUS_TOKEN_INACTIVE : STATUS_TOKEN_ACTIVE;
196
197 require(fromStatus == STATUS_TOKEN_ACTIVE || fromStatus == STATUS_TOKEN_INACTIVE, 'Cannot Change Token Status');
198
199 _token.status = toStatus;
200 emit UpdateTokenStatus(tokenId, fromStatus, toStatus);
201 }
202
203 /// @notice // in case wrong setting for settle
204 /// @param tokenId market identifier
205 function tokenForceCancelSettlePhase(bytes32 tokenId) external onlyOwner {
206 MarketStorage storage $ = _getOwnStorage();
207 Token storage _token = $.tokens[tokenId];
208 require(_token.status == STATUS_TOKEN_SETTLE, 'Invalid Token Status');
209 _token.status = STATUS_TOKEN_INACTIVE;
210 emit TokenForceCancelSettlePhase(tokenId);
211 }
212 /// @notice // updates settleDuration
213 /// @param tokenId market identifier
214 /// @param newValue settleDuration value
215
216 function updateSettleDuration(bytes32 tokenId, uint48 newValue) external onlyOwner {
217 MarketStorage storage $ = _getOwnStorage();
218 Token storage _token = $.tokens[tokenId];
219 uint48 oldValue = _token.settleDuration;
220 _token.settleDuration = newValue;
221 emit UpdateTokenSettleDuration(tokenId, oldValue, newValue);
222 }
223
224 // force cancel order - by Operator/Owner
225 // refund for both seller & buyer without any fees cut
226 /// @notice
227 /// @param orderId order identifier
228 function forceCancelOrder(uint256 orderId) public nonReentrant onlyOwner {
229 MarketStorage storage $ = _getOwnStorage();
230 Order storage order = $.orders[orderId];
231 Offer storage offer = $.offers[order.offerId];
232
233 require(order.status == STATUS_ORDER_OPEN, 'Invalid Order Status');
234
235 // calculate refund
236 uint256 buyerRefundValue = (order.amount * offer.value) / offer.amount; // value
237 uint256 sellerRefundValue = (order.amount * offer.collateral) / offer.amount; // collateral
238 address buyer = order.buyer;
239 address seller = order.seller;
240
241 // refund
242 if (offer.exToken == address(0)) {
243 // refund ETH
244 if (buyerRefundValue > 0 && buyer != address(0)) {
245 (bool success,) = buyer.call{value: buyerRefundValue}('');
246 require(success, 'Transfer Funds to Seller Fail');
247 }
248 if (sellerRefundValue > 0 && seller != address(0)) {
249 (bool success,) = seller.call{value: sellerRefundValue}('');
250 require(success, 'Transfer Funds to Seller Fail');
251 }
252 } else {
253 IERC20 iexToken = IERC20(offer.exToken);
254 if (buyerRefundValue > 0 && buyer != address(0)) {
255 iexToken.safeTransfer(buyer, buyerRefundValue);
256 }
257 if (sellerRefundValue > 0 && seller != address(0)) {
258 iexToken.safeTransfer(seller, sellerRefundValue);
259 }
260 }
exec
/bin/bash -lc "nl -ba src/FrontrunMarket.sol | sed -n '261,520p'" in /tmp/codex-2v_62mvt
succeeded in 0ms:
261 order.status = STATUS_ORDER_CANCELLED;
262 emit CancelOrder(orderId, msg.sender);
263 }
264
265 // 2 steps settle:
266 // Tx1: Seller sending token to system vault/buyer
267 // Tx2: then Operator/Owner verify and settle to pay seller money+collateral
268 function settle2Steps(uint256 orderId, bytes32 hash) public nonReentrant onlyOwner {
269 MarketStorage storage $ = _getOwnStorage();
270 Order storage order = $.orders[orderId];
271 Offer storage offer = $.offers[order.offerId];
272 Token storage token = $.tokens[offer.tokenId];
273
274 // check condition
275 require(token.status == STATUS_TOKEN_SETTLE, 'Invalid Status');
276 require(token.token != address(0) && token.settleRate > 0, 'Token Not Set');
277 require(block.timestamp > token.settleTime, 'Settling Time Not Started');
278 require(order.status == STATUS_ORDER_OPEN, 'Invalid Order Status');
279
280 uint256 collateral = (order.amount * offer.collateral) / offer.amount;
281 uint256 value = (order.amount * offer.value) / offer.amount;
282
283 // transfer liquid to seller
284 uint256 settleFee = (value * $.config.feeSettle) / WEI6;
285 uint256 totalValue = value + collateral - settleFee;
286 if (offer.exToken == address(0)) {
287 // by ETH
288 (bool success1,) = order.seller.call{value: totalValue}('');
289 (bool success2,) = $.config.feeWallet.call{value: settleFee}('');
290 require(success1 && success2, 'Transfer Funds Fail');
291 } else {
292 // by exToken
293 IERC20 iexToken = IERC20(offer.exToken);
294 iexToken.safeTransfer(order.seller, totalValue);
295 iexToken.safeTransfer($.config.feeWallet, settleFee);
296 }
297
298 order.status = STATUS_ORDER_SETTLE_FILLED;
299
300 emit Settle2Steps(orderId, hash, msg.sender);
301 emit SettleFilled(orderId, totalValue, settleFee, msg.sender);
302 }
303
304 function settle2StepsBatch(uint256[] calldata orderIds, bytes32[] calldata hashes) external {
305 require(orderIds.length == hashes.length, 'Invalid Input');
306 for (uint256 i = 0; i < orderIds.length; i++) {
307 settle2Steps(orderIds[i], hashes[i]);
308 }
309 }
310
311 /////////////////////////
312 ////// USER ACTION //////
313 /////////////////////////
314
315 // make a offer request using erc20 collateral
316 /// @notice
317 /// @param tokenId market identifier
318 /// @param amount amount of market asset in 6 decimals
319 /// @param value amount of collateral being deposited, price = collateral/amount
320 /// @param exToken collateral token contract addres
321 /// @param minAmount min amount that must be filled by the counterparty in 6 decimals
322 function newOffer(
323 uint8 offerType,
324 bytes32 tokenId,
325 uint256 amount, //amount of asset
326 uint256 value, // amount of collateral
327 address exToken,
328 uint256 minAmount
329 ) external nonReentrant {
330 MarketStorage storage $ = _getOwnStorage();
331 Token storage token = $.tokens[tokenId];
332 require(token.status == STATUS_TOKEN_ACTIVE, 'Invalid Token');
333 require(exToken != address(0) && $.acceptedTokens[exToken], 'Invalid Offer Token');
334 require(amount > 0 && value > 0, 'Invalid Amount or Value');
335 require(amount >= minAmount, 'minamount to be filled cant be greater then amount');
336 require(minAmount >= token.minAmount, 'minamount should be greater then eual to market global minamount');
337 IERC20 iexToken = IERC20(exToken);
338 // collateral
339 uint256 collateral = (value * $.config.pledgeRate) / WEI6;
340
341 // transfer offer value (offer buy) or collateral (offer sell)
342 uint256 _transferAmount = offerType == OFFER_BUY ? value : collateral;
343 iexToken.safeTransferFrom(msg.sender, address(this), _transferAmount);
344
345 // create new offer
346 _newOffer(offerType, tokenId, exToken, amount, value, collateral, minAmount);
347 }
348
349 // New offer in ETH
350 /// @notice
351 /// @param tokenId market identifier
352 /// @param amount amount of market asset in 6 decimals
353 /// @param value amount of collateral being deposited, price = collateral/amount
354 /// @param minAmount min amount that must be filled by the counterparty in 6 decimals
355 function newOfferETH(
356 uint8 offerType,
357 bytes32 tokenId,
358 uint256 amount,
359 uint256 value,
360 uint256 minAmount
361 ) external payable nonReentrant {
362 MarketStorage storage $ = _getOwnStorage();
363 Token storage token = $.tokens[tokenId];
364 require(token.status == STATUS_TOKEN_ACTIVE, 'Invalid Token');
365 require(amount > 0 && value > 0, 'Invalid Amount or Value');
366 require(amount >= minAmount, 'minamount to be filled cant be greater then amount');
367 require(minAmount >= token.minAmount, 'minamount should be greater then eual to market global minamount');
368
369 // collateral
370 uint256 collateral = (value * $.config.pledgeRate) / WEI6;
371
372 uint256 _ethAmount = offerType == OFFER_BUY ? value : collateral;
373 require(_ethAmount == msg.value, 'Insufficient Funds');
374 // create new offer
375 _newOffer(offerType, tokenId, address(0), amount, value, collateral, minAmount);
376 }
377
378 /// @notice fill an offer with erc20 collateral and generate an orderid associated with a trade
379 /// @param offerId offer identifier
380 /// @param amount amount of market asset in 6 decimals
381 function fillOffer(uint256 offerId, uint256 amount) public {
382 MarketStorage storage $ = _getOwnStorage();
383 Offer storage offer = $.offers[offerId];
384 Token storage token = $.tokens[offer.tokenId];
385 require(offer.status == STATUS_OFFER_OPEN, 'Invalid Offer Status');
386 require(token.status == STATUS_TOKEN_ACTIVE, 'Invalid token Status');
387 require(amount > 0, 'Invalid Amount');
388 require(offer.amount - offer.filledAmount >= amount, 'Insufficient Allocations');
389 if (offer.amount - offer.filledAmount > offer.minAmount) {
390 require(amount >= offer.minAmount, 'cannot fill less then offer minamount');
391 } else {
392 require(amount == offer.amount - offer.filledAmount, 'if less then asset minamount must fill complete order');
393 }
394 require(offer.exToken != address(0), 'Invalid Offer Token');
395
396 // transfer value or collecteral
397 IERC20 iexToken = IERC20(offer.exToken);
398 uint256 _transferAmount;
399 address buyer;
400 address seller;
401 if (offer.offerType == OFFER_BUY) {
402 _transferAmount = (offer.collateral * amount) / offer.amount;
403 buyer = offer.offeredBy;
404 seller = msg.sender;
405 } else {
406 _transferAmount = (offer.value * amount) / offer.amount;
407 buyer = msg.sender;
408 seller = offer.offeredBy;
409 }
410 iexToken.safeTransferFrom(msg.sender, address(this), _transferAmount);
411
412 _fillOffer(offerId, amount, buyer, seller);
413 }
414
415 /// @notice fill an offer with eth collateral and generate an orderid associated with a trade
416 /// @param offerId offer identifier
417 /// @param amount amount of market asset in 6 decimals
418 function fillOfferETH(uint256 offerId, uint256 amount) external payable nonReentrant {
419 uint256 _ethAmount = _fillOfferETH(offerId, amount);
420 require(msg.value >= _ethAmount, 'Insufficient Funds');
421 require(_ethAmount + 5 * 1e16 > msg.value, 'Extra Amount Sent');
422 }
423
424 /// @notice batche fill both types of offers
425 function batchFillOffer(uint256[] calldata offerId, uint256[] calldata amount) external payable nonReentrant {
426 require(offerId.length == amount.length, 'Invalid Input');
427 uint256 _ethAmount;
428 MarketStorage storage $ = _getOwnStorage();
429 for (uint256 i = 0; i < offerId.length; i++) {
430 Offer storage offer = $.offers[offerId[i]];
431 if (offer.exToken == address(0)) {
432 _ethAmount += _fillOfferETH(offerId[i], amount[i]);
433 } else {
434 fillOffer(offerId[i], amount[i]);
435 }
436 }
437 require(msg.value >= _ethAmount, 'Insufficient Funds');
438 require(_ethAmount + 5 * 1e16 > msg.value, 'Extra Amount Sent');
439 }
440
441 function _fillOfferETH(uint256 offerId, uint256 amount) internal returns (uint256 _ethAmount) {
442 MarketStorage storage $ = _getOwnStorage();
443 Offer storage offer = $.offers[offerId];
444 Token storage token = $.tokens[offer.tokenId];
445 require(offer.status == STATUS_OFFER_OPEN, 'Invalid Offer Status');
446 require(token.status == STATUS_TOKEN_ACTIVE, 'Invalid token Status');
447 require(amount > 0, 'Invalid Amount');
448 require(offer.amount - offer.filledAmount >= amount, 'Insufficient Allocations');
449 if (offer.amount - offer.filledAmount > offer.minAmount) {
450 require(amount >= offer.minAmount, 'cannot fill less then offer minamount or asset minamount');
451 } else {
452 require(amount == offer.amount - offer.filledAmount, 'if less then asset minamount must fill complete order');
453 }
454 require(offer.exToken == address(0), 'Invalid Offer Token');
455
456 // transfer value or collecteral
457 address buyer;
458 address seller;
459 if (offer.offerType == OFFER_BUY) {
460 _ethAmount = (offer.collateral * amount) / offer.amount;
461 buyer = offer.offeredBy;
462 seller = msg.sender;
463 } else {
464 _ethAmount = (offer.value * amount) / offer.amount;
465 buyer = msg.sender;
466 seller = offer.offeredBy;
467 }
468 // new order
469 _fillOffer(offerId, amount, buyer, seller);
470 }
471
472 /// @notice close unfullfilled offer - by Offer owner
473 /// @param offerId offer identifier
474 function cancelOffer(uint256 offerId) public nonReentrant {
475 MarketStorage storage $ = _getOwnStorage();
476 Offer storage offer = $.offers[offerId];
477
478 require(offer.offeredBy == msg.sender, 'Offer Owner Only');
479 require(offer.status == STATUS_OFFER_OPEN, 'Invalid Offer Status');
480
481 uint256 refundAmount = offer.amount - offer.filledAmount;
482 require(refundAmount > 0, 'Insufficient Allocations');
483
484 // calculate refund
485 uint256 refundValue;
486 if (offer.offerType == OFFER_BUY) {
487 refundValue = (refundAmount * offer.value) / offer.amount;
488 } else {
489 refundValue = (refundAmount * offer.collateral) / offer.amount;
490 }
491 uint256 refundFee = (refundValue * $.config.feeRefund) / WEI6;
492 refundValue -= refundFee;
493
494 // refund
495 if (offer.exToken == address(0)) {
496 // refund ETH
497 (bool success1,) = offer.offeredBy.call{value: refundValue}('');
498 (bool success2,) = $.config.feeWallet.call{value: refundFee}('');
499 require(success1 && success2, 'Transfer Funds Fail');
500 } else {
501 IERC20 iexToken = IERC20(offer.exToken);
502 iexToken.safeTransfer(offer.offeredBy, refundValue);
503 iexToken.safeTransfer($.config.feeWallet, refundFee);
504 }
505
506 offer.status = STATUS_OFFER_CANCELLED;
507 emit CancelOffer(offerId, refundValue, refundFee, msg.sender);
508 }
509
510 //
511 /// @notice settle order - deliver token to finillize the order
512 /// @param orderId order identifier
513 function settleFilled(uint256 orderId) public nonReentrant {
514 MarketStorage storage $ = _getOwnStorage();
515 Order storage order = $.orders[orderId];
516 Offer storage offer = $.offers[order.offerId];
517 Token storage token = $.tokens[offer.tokenId];
518
519 // check condition
520 require(token.status == STATUS_TOKEN_SETTLE, 'Invalid Status');
exec
/bin/bash -lc "sed -n '1,220p' lib/openzeppelin-contracts-upgradeable/contracts/utils/ReentrancyGuardUpgradeable.sol" in /tmp/codex-2v_62mvt
succeeded in 0ms:
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/ReentrancyGuard.sol)
pragma solidity ^0.8.20;
import {Initializable} from "../proxy/utils/Initializable.sol";
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuardUpgradeable is Initializable {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant NOT_ENTERED = 1;
uint256 private constant ENTERED = 2;
/// @custom:storage-location erc7201:openzeppelin.storage.ReentrancyGuard
struct ReentrancyGuardStorage {
uint256 _status;
}
// keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.ReentrancyGuard")) - 1)) & ~bytes32(uint256(0xff))
bytes32 private constant ReentrancyGuardStorageLocation = 0x9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00;
function _getReentrancyGuardStorage() private pure returns (ReentrancyGuardStorage storage $) {
assembly {
$.slot := ReentrancyGuardStorageLocation
}
}
/**
* @dev Unauthorized reentrant call.
*/
error ReentrancyGuardReentrantCall();
function __ReentrancyGuard_init() internal onlyInitializing {
__ReentrancyGuard_init_unchained();
}
function __ReentrancyGuard_init_unchained() internal onlyInitializing {
ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage();
$._status = NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and making it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage();
// On the first call to nonReentrant, _status will be NOT_ENTERED
if ($._status == ENTERED) {
revert ReentrancyGuardReentrantCall();
}
// Any calls to nonReentrant after this point will fail
$._status = ENTERED;
}
function _nonReentrantAfter() private {
ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage();
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
$._status = NOT_ENTERED;
}
/**
* @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
* `nonReentrant` function in the call stack.
*/
function _reentrancyGuardEntered() internal view returns (bool) {
ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage();
return $._status == ENTERED;
}
}
exec
/bin/bash -lc "nl -ba src/FrontrunMarket.sol | sed -n '521,793p'" in /tmp/codex-2v_62mvt
succeeded in 0ms:
521 require(token.token != address(0) && token.settleRate > 0, 'Token Not Set');
522 require(block.timestamp > token.settleTime, 'Settling Time Not Started');
523 require(order.seller == msg.sender, 'Seller Only');
524 require(order.status == STATUS_ORDER_OPEN, 'Invalid Order Status');
525
526 uint256 collateral = (order.amount * offer.collateral) / offer.amount;
527 uint256 value = (order.amount * offer.value) / offer.amount;
528
529 // transfer token to buyer
530 IERC20 iToken = IERC20(token.token);
531 // calculate token amount base on it's decimals
532 uint256 tokenAmount = (order.amount * token.settleRate) / WEI6;
533 uint256 tokenAmountFee = (tokenAmount * $.config.feeSettle) / WEI6;
534 // transfer order fee in token to fee wallet
535 iToken.safeTransferFrom(order.seller, $.config.feeWallet, tokenAmountFee);
536 // transfer token after fee to buyer
537 iToken.safeTransferFrom(order.seller, order.buyer, tokenAmount - tokenAmountFee);
538
539 // transfer liquid to seller
540 uint256 settleFee = (value * $.config.feeSettle) / WEI6;
541 uint256 totalValue = value + collateral - settleFee;
542 if (offer.exToken == address(0)) {
543 // by ETH
544 (bool success1,) = order.seller.call{value: totalValue}('');
545 (bool success2,) = $.config.feeWallet.call{value: settleFee}('');
546 require(success1 && success2, 'Transfer Funds Fail');
547 } else {
548 // by exToken
549 IERC20 iexToken = IERC20(offer.exToken);
550 iexToken.safeTransfer(order.seller, totalValue);
551 iexToken.safeTransfer($.config.feeWallet, settleFee);
552 }
553
554 order.status = STATUS_ORDER_SETTLE_FILLED;
555
556 emit SettleFilled(orderId, totalValue, settleFee, msg.sender);
557 }
558
559 /// @notice cancel unfilled order by token buyer after settleDuration time frame
560 /// @notice // token seller lose collateral to token buyer
561 /// @param orderId order identifier
562
563 function settleCancelled(uint256 orderId) public nonReentrant {
564 MarketStorage storage $ = _getOwnStorage();
565 Order storage order = $.orders[orderId];
566 Offer storage offer = $.offers[order.offerId];
567 Token storage token = $.tokens[offer.tokenId];
568
569 // check condition
570 require(token.status == STATUS_TOKEN_SETTLE, 'Invalid Status');
571 require(block.timestamp > token.settleTime + token.settleDuration, 'Settling Time Not Ended Yet');
572 require(order.status == STATUS_ORDER_OPEN, 'Invalid Order Status');
573 require(order.buyer == msg.sender || owner() == msg.sender, 'Buyer or Operator/Owner Only');
574
575 uint256 collateral = (order.amount * offer.collateral) / offer.amount;
576 uint256 value = (order.amount * offer.value) / offer.amount;
577
578 // transfer liquid to buyer
579 uint256 settleFee = (collateral * $.config.feeSettle * 2) / WEI6;
580 uint256 totalValue = value + collateral - settleFee;
581 if (offer.exToken == address(0)) {
582 // by ETH
583 (bool success1,) = order.buyer.call{value: totalValue}('');
584 (bool success2,) = $.config.feeWallet.call{value: settleFee}('');
585 require(success1 && success2, 'Transfer Funds Fail');
586 } else {
587 // by exToken
588 IERC20 iexToken = IERC20(offer.exToken);
589 iexToken.safeTransfer(order.buyer, totalValue);
590 iexToken.safeTransfer($.config.feeWallet, settleFee);
591 }
592
593 order.status = STATUS_ORDER_SETTLE_CANCELLED;
594
595 emit SettleCancelled(orderId, totalValue, settleFee, msg.sender);
596 }
597
598 // Batch actions
599 function batchForceCancelOrders(uint256[] calldata orderIds) external {
600 for (uint256 i = 0; i < orderIds.length; i++) {
601 forceCancelOrder(orderIds[i]);
602 }
603 }
604
605 function batchCancelOffers(uint256[] calldata offerIds) external {
606 for (uint256 i = 0; i < offerIds.length; i++) {
607 cancelOffer(offerIds[i]);
608 }
609 }
610
611 function batchSettleFilleds(uint256[] calldata orderIds) external {
612 for (uint256 i = 0; i < orderIds.length; i++) {
613 settleFilled(orderIds[i]);
614 }
615 }
616
617 function batchSettleCancelleds(uint256[] calldata orderIds) external {
618 for (uint256 i = 0; i < orderIds.length; i++) {
619 settleCancelled(orderIds[i]);
620 }
621 }
622
623 ///////////////////////////
624 ///////// SETTER //////////
625 ///////////////////////////
626
627 function updateConfig(
628 address feeWallet_,
629 uint256 feeSettle_,
630 uint256 feeRefund_,
631 uint256 pledgeRate_
632 ) external onlyOwner {
633 MarketStorage storage $ = _getOwnStorage();
634 require(feeWallet_ != address(0), 'Invalid Address');
635 require(feeSettle_ <= WEI6 / 100, 'Settle Fee <= 10%');
636 require(feeRefund_ <= WEI6 / 100, 'Cancel Fee <= 10%');
637 emit UpdateConfig(
638 $.config.feeWallet,
639 $.config.feeSettle,
640 $.config.feeRefund,
641 $.config.pledgeRate,
642 feeWallet_,
643 feeSettle_,
644 feeRefund_,
645 pledgeRate_
646 );
647 // update
648 $.config.feeWallet = feeWallet_;
649 $.config.feeSettle = feeSettle_;
650 $.config.feeRefund = feeRefund_;
651 $.config.pledgeRate = pledgeRate_;
652 }
653
654 //
655 /// @notice adding/removing asset to be allowed to use as collateral
656 function setAcceptedTokens(address[] calldata tokenAddresses, bool isAccepted) external onlyOwner {
657 MarketStorage storage $ = _getOwnStorage();
658
659 for (uint256 i = 0; i < tokenAddresses.length; i++) {
660 $.acceptedTokens[tokenAddresses[i]] = isAccepted;
661 }
662 emit UpdateAcceptedTokens(tokenAddresses, isAccepted);
663 }
664
665 ///////////////////////////
666 ///////// GETTER //////////
667 ///////////////////////////
668 function offerAmount(uint256 offerId) external view returns (uint256) {
669 MarketStorage storage $ = _getOwnStorage();
670 return $.offers[offerId].amount;
671 }
672
673 function offerAmountAvailable(uint256 offerId) external view returns (uint256) {
674 MarketStorage storage $ = _getOwnStorage();
675 return $.offers[offerId].amount - $.offers[offerId].filledAmount;
676 }
677
678 function offerValue(uint256 offerId) external view returns (uint256) {
679 MarketStorage storage $ = _getOwnStorage();
680 return $.offers[offerId].value;
681 }
682
683 function offerExToken(uint256 offerId) external view returns (address) {
684 MarketStorage storage $ = _getOwnStorage();
685 return $.offers[offerId].exToken;
686 }
687
688 function isBuyOffer(uint256 offerId) external view returns (bool) {
689 MarketStorage storage $ = _getOwnStorage();
690 return $.offers[offerId].offerType == OFFER_BUY;
691 }
692
693 function isSellOffer(uint256 offerId) external view returns (bool) {
694 MarketStorage storage $ = _getOwnStorage();
695 return $.offers[offerId].offerType == OFFER_SELL;
696 }
697
698 function offerStatus(uint256 offerId) external view returns (uint256) {
699 MarketStorage storage $ = _getOwnStorage();
700 return $.offers[offerId].status;
701 }
702
703 function orderStatus(uint256 orderId) external view returns (uint256) {
704 MarketStorage storage $ = _getOwnStorage();
705 return $.orders[orderId].status;
706 }
707
708 function tokens(bytes32 tokenId) external view returns (Token memory) {
709 MarketStorage storage $ = _getOwnStorage();
710 return $.tokens[tokenId];
711 }
712
713 function offers(uint256 id) external view returns (Offer memory) {
714 MarketStorage storage $ = _getOwnStorage();
715 return $.offers[id];
716 }
717
718 function orders(uint256 id) external view returns (Order memory) {
719 MarketStorage storage $ = _getOwnStorage();
720 return $.orders[id];
721 }
722
723 function config() external view returns (Config memory) {
724 MarketStorage storage $ = _getOwnStorage();
725 return $.config;
726 }
727
728 function isAcceptedToken(address token) external view returns (bool) {
729 MarketStorage storage $ = _getOwnStorage();
730 return $.acceptedTokens[token];
731 }
732
733 function lastOfferId() external view returns (uint256) {
734 MarketStorage storage $ = _getOwnStorage();
735 return $.lastOfferId;
736 }
737
738 function lastOrderId() external view returns (uint256) {
739 MarketStorage storage $ = _getOwnStorage();
740 return $.lastOrderId;
741 }
742
743 ///////////////////////////
744 //////// INTERNAL /////////
745 ///////////////////////////
746 function _newOffer(
747 uint8 offerType,
748 bytes32 tokenId,
749 address exToken,
750 uint256 amount,
751 uint256 value,
752 uint256 collateral,
753 uint256 minAmount
754 ) internal {
755 MarketStorage storage $ = _getOwnStorage();
756 // create new offer
757 $.offers[++$.lastOfferId] =
758 Offer(offerType, tokenId, exToken, amount, value, collateral, 0, STATUS_OFFER_OPEN, msg.sender, minAmount);
759
760 emit NewOffer($.lastOfferId, offerType, tokenId, exToken, amount, value, collateral, minAmount, msg.sender);
761 }
762
763 function _fillOffer(uint256 offerId, uint256 amount, address buyer, address seller) internal {
764 MarketStorage storage $ = _getOwnStorage();
765 Offer storage offer = $.offers[offerId];
766 // new order
767 $.orders[++$.lastOrderId] = Order(offerId, amount, seller, buyer, STATUS_ORDER_OPEN);
768
769 // check if offer is fullfilled
770 offer.filledAmount += amount;
771 if (offer.filledAmount == offer.amount) {
772 offer.status = STATUS_OFFER_FILLED;
773 emit CloseOffer(offerId, 0);
774 }
775
776 emit NewOrder($.lastOrderId, offerId, amount, seller, buyer);
777 }
778
779 // get stuck token in contract
780 function withdrawStuckToken(address _token, address _to) external onlyOwner {
781 MarketStorage storage $ = _getOwnStorage();
782 require(_token != address(0) && !$.acceptedTokens[_token], 'Invalid Token Address');
783 uint256 _contractBalance = IERC20(_token).balanceOf(address(this));
784 IERC20(_token).safeTransfer(_to, _contractBalance);
785 }
786 }
Finished reading the full bundle and the contract. I’m now validating two concrete loss-of-funds issues around token accounting and privileged withdrawals, and checking whether any other in-scope exploit paths are stronger than those.
✓ Inspect workspace and locate first-party Solidity sources, starting with AUDIT_BUNDLE.txt
→ Review bundled contracts for exploitable issues in scope categories
• Produce JSON audit findings with evidence and locations
✓ Inspect workspace and locate first-party Solidity sources, starting with AUDIT_BUNDLE.txt
✓ Review bundled contracts for exploitable issues in scope categories
→ Produce JSON audit findings with evidence and locations
codex
{"no_findings":false,"summary":"Reviewed the full first-party bundle (`src/FrontrunMarket.sol`). Found two concrete loss-of-funds issues: escrow accounting breaks for fee-on-transfer collateral tokens, and the owner can de-whitelist an in-use token and withdraw user escrow.","findings":[{"severity":"high","category":"other","title":"Fee-on-transfer collateral tokens let users over-withdraw from pooled escrow","exploit_scenario":"If the owner whitelists a deflationary or fee-on-transfer ERC20, `newOffer`/`fillOffer` record the nominal `value` or `collateral` even when the contract receives less. An attacker can create an offer with a token that takes 10% on inbound transfers, deposit 90 tokens while the contract books 100, then cancel the offer and withdraw 100 from the shared pool. Repeating this drains other users' balances for that token and leaves later settlements/refunds insolvent.","recommendation":"Reject non-standard collateral tokens, or account by actual balance deltas (`balanceAfter - balanceBefore`) instead of user-supplied nominal amounts. Store per-offer deposited amounts based on what was really received.","evidence":"`newOffer` and `fillOffer` call `safeTransferFrom` and then immediately store/order against the caller-provided `value`/`collateral` without checking the actual amount received. `cancelOffer`, `settleFilled`, and `settleCancelled` later pay out based on those nominal amounts from a shared per-token balance.","locations":["src/FrontrunMarket.sol:322","src/FrontrunMarket.sol:343","src/FrontrunMarket.sol:346","src/FrontrunMarket.sol:381","src/FrontrunMarket.sol:410","src/FrontrunMarket.sol:412","src/FrontrunMarket.sol:474","src/FrontrunMarket.sol:513","src/FrontrunMarket.sol:563"]},{"severity":"high","category":"access_control","title":"Owner can de-whitelist an active collateral token and withdraw funds backing live positions","exploit_scenario":"Any accepted collateral token can be toggled to `false` via `setAcceptedTokens`, after which `withdrawStuckToken` will transfer the contract's entire balance of that token to an arbitrary address. If there are still open offers or orders using that token, the owner or a compromised owner key can drain the escrowed funds and leave users unable to cancel or settle their positions.","recommendation":"Do not let rescue logic depend only on the current whitelist flag. Track outstanding liabilities per token and only allow withdrawing true surplus, or forbid de-whitelisting/rescuing any token while open offers/orders still reference it.","evidence":"`setAcceptedTokens` can remove any token from the whitelist with no check for outstanding exposure. `withdrawStuckToken` only requires `!acceptedTokens[_token]`, then transfers the full contract balance of that token even though open offers/orders continue to use pooled balances for refunds and settlements.","locations":["src/FrontrunMarket.sol:656","src/FrontrunMarket.sol:660","src/FrontrunMarket.sol:780","src/FrontrunMarket.sol:782","src/FrontrunMarket.sol:784"]}]}
tokens used
32,931
{
"codex": {
"ran_at": "2026-04-04T04:16:39.345192+00:00",
"returncode": 0
},
"project": {
"mode": "source",
"file_count": 19,
"import_count": 22,
"first_party_contracts_count": 1
},
"summary": "Reviewed the full first-party bundle (`src/FrontrunMarket.sol`). Found two concrete loss-of-funds issues: escrow accounting breaks for fee-on-transfer collateral tokens, and the owner can de-whitelist an in-use token and withdraw user escrow.",
"raw_final": {
"summary": "Reviewed the full first-party bundle (`src/FrontrunMarket.sol`). Found two concrete loss-of-funds issues: escrow accounting breaks for fee-on-transfer collateral tokens, and the owner can de-whitelist an in-use token and withdraw user escrow.",
"findings": [
{
"title": "Fee-on-transfer collateral tokens let users over-withdraw from pooled escrow",
"category": "other",
"evidence": "`newOffer` and `fillOffer` call `safeTransferFrom` and then immediately store/order against the caller-provided `value`/`collateral` without checking the actual amount received. `cancelOffer`, `settleFilled`, and `settleCancelled` later pay out based on those nominal amounts from a shared per-token balance.",
"severity": "high",
"locations": [
"src/FrontrunMarket.sol:322",
"src/FrontrunMarket.sol:343",
"src/FrontrunMarket.sol:346",
"src/FrontrunMarket.sol:381",
"src/FrontrunMarket.sol:410",
"src/FrontrunMarket.sol:412",
"src/FrontrunMarket.sol:474",
"src/FrontrunMarket.sol:513",
"src/FrontrunMarket.sol:563"
],
"recommendation": "Reject non-standard collateral tokens, or account by actual balance deltas (`balanceAfter - balanceBefore`) instead of user-supplied nominal amounts. Store per-offer deposited amounts based on what was really received.",
"exploit_scenario": "If the owner whitelists a deflationary or fee-on-transfer ERC20, `newOffer`/`fillOffer` record the nominal `value` or `collateral` even when the contract receives less. An attacker can create an offer with a token that takes 10% on inbound transfers, deposit 90 tokens while the contract books 100, then cancel the offer and withdraw 100 from the shared pool. Repeating this drains other users' balances for that token and leaves later settlements/refunds insolvent."
},
{
"title": "Owner can de-whitelist an active collateral token and withdraw funds backing live positions",
"category": "access_control",
"evidence": "`setAcceptedTokens` can remove any token from the whitelist with no check for outstanding exposure. `withdrawStuckToken` only requires `!acceptedTokens[_token]`, then transfers the full contract balance of that token even though open offers/orders continue to use pooled balances for refunds and settlements.",
"severity": "high",
"locations": [
"src/FrontrunMarket.sol:656",
"src/FrontrunMarket.sol:660",
"src/FrontrunMarket.sol:780",
"src/FrontrunMarket.sol:782",
"src/FrontrunMarket.sol:784"
],
"recommendation": "Do not let rescue logic depend only on the current whitelist flag. Track outstanding liabilities per token and only allow withdrawing true surplus, or forbid de-whitelisting/rescuing any token while open offers/orders still reference it.",
"exploit_scenario": "Any accepted collateral token can be toggled to `false` via `setAcceptedTokens`, after which `withdrawStuckToken` will transfer the contract's entire balance of that token to an arbitrary address. If there are still open offers or orders using that token, the owner or a compromised owner key can drain the escrowed funds and leave users unable to cancel or settle their positions."
}
],
"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 0x01e1 0000000c: JUMPI 0000000d: PUSH1 0x00 0000000f: CALLDATALOAD 00000010: PUSH1 0xe0 00000012: SHR 00000013: DUP1 00000014: PUSH4 0x0787ef39 00000019: EQ 0000001a: PUSH2 0x01e6 0000001d: JUMPI 0000001e: DUP1 0000001f: PUSH4 0x16b4cdb2 00000024: EQ 00000025: PUSH2 0x0208 00000028: JUMPI 00000029: DUP1 0000002a: PUSH4 0x18b4f367 0000002f: EQ 00000030: PUSH2 0x0228 00000033: JUMPI 00000034: DUP1 00000035: PUSH4 0x1f25a2d8 0000003a: EQ 0000003b: PUSH2 0x025d 0000003e: JUMPI 0000003f: DUP1 00000040: PUSH4 0x21146fa2 00000045: EQ 00000046: PUSH2 0x027d 00000049: JUMPI 0000004a: DUP1 0000004b: PUSH4 0x2d670584 00000050: EQ 00000051: PUSH2 0x029d 00000054: JUMPI 00000055: DUP1 00000056: PUSH4 0x3b6e750f 0000005b: EQ 0000005c: PUSH2 0x02bd 0000005f: JUMPI 00000060: DUP1 00000061: PUSH4 0x410ce4c4 00000066: EQ 00000067: PUSH2 0x02dd 0000006a: JUMPI 0000006b: DUP1 0000006c: PUSH4 0x4536bff1 00000071: EQ 00000072: PUSH2 0x02fd 00000075: JUMPI 00000076: DUP1 00000077: PUSH4 0x5662ecc7 0000007c: EQ 0000007d: PUSH2 0x0310 00000080: JUMPI 00000081: DUP1 00000082: PUSH4 0x5d3473e3 00000087: EQ 00000088: PUSH2 0x0333 0000008b: JUMPI 0000008c: DUP1 0000008d: PUSH4 0x643268c9 00000092: EQ 00000093: PUSH2 0x0353 00000096: JUMPI 00000097: DUP1 00000098: PUSH4 0x69bd7dbb 0000009d: EQ 0000009e: PUSH2 0x0368 000000a1: JUMPI 000000a2: DUP1 000000a3: PUSH4 0x6a951f20 000000a8: EQ 000000a9: PUSH2 0x0388 000000ac: JUMPI 000000ad: DUP1 000000ae: PUSH4 0x715018a6 000000b3: EQ 000000b4: PUSH2 0x03a8 000000b7: JUMPI 000000b8: DUP1 000000b9: PUSH4 0x7400f52d 000000be: EQ 000000bf: PUSH2 0x03bd 000000c2: JUMPI 000000c3: DUP1 000000c4: PUSH4 0x76fbc544 000000c9: EQ 000000ca: PUSH2 0x03dd 000000cd: JUMPI 000000ce: DUP1 000000cf: PUSH4 0x78447e7f 000000d4: EQ 000000d5: PUSH2 0x03f0 000000d8: JUMPI 000000d9: DUP1 000000da: PUSH4 0x79502c55 000000df: EQ 000000e0: PUSH2 0x0410 000000e3: JUMPI 000000e4: DUP1 000000e5: PUSH4 0x8129fc1c 000000ea: EQ 000000eb: PUSH2 0x0461 000000ee: JUMPI 000000ef: DUP1 000000f0: PUSH4 0x81cc37b2 000000f5: EQ 000000f6: PUSH2 0x0476 000000f9: JUMPI 000000fa: DUP1 000000fb: PUSH4 0x86aa7db0 00000100: EQ 00000101: PUSH2 0x0489 00000104: JUMPI 00000105: DUP1 00000106: PUSH4 0x8a72ea6a 0000010b: EQ 0000010c: PUSH2 0x04a9 0000010f: JUMPI 00000110: DUP1 00000111: PUSH4 0x8da5cb5b 00000116: EQ 00000117: PUSH2 0x04d6 0000011a: JUMPI 0000011b: DUP1 0000011c: PUSH4 0x904194a3 00000121: EQ 00000122: PUSH2 0x04f8 00000125: JUMPI 00000126: DUP1 00000127: PUSH4 0x982c3402 0000012c: EQ 0000012d: PUSH2 0x0581 00000130: JUMPI 00000131: DUP1 00000132: PUSH4 0x985a7c1d 00000137: EQ 00000138: PUSH2 0x05a1 0000013b: JUMPI 0000013c: DUP1 0000013d: PUSH4 0xa1bd91e1 00000142: EQ 00000143: PUSH2 0x05c1 00000146: JUMPI 00000147: DUP1 00000148: PUSH4 0xa85c38ef 0000014d: EQ 0000014e: PUSH2 0x05e1 00000151: JUMPI 00000152: DUP1 00000153: PUSH4 0xaa22093f 00000158: EQ 00000159: PUSH2 0x0652 0000015c: JUMPI 0000015d: DUP1 0000015e: PUSH4 0xaaab596a 00000163: EQ 00000164: PUSH2 0x0672 00000167: JUMPI 00000168: DUP1 00000169: PUSH4 0xb33ec6f7 0000016e: EQ 0000016f: PUSH2 0x0692 00000172: JUMPI 00000173: DUP1 00000174: PUSH4 0xbc205ad3 00000179: EQ 0000017a: PUSH2 0x06b2 0000017d: JUMPI 0000017e: DUP1 0000017f: PUSH4 0xbff49450 00000184: EQ 00000185: PUSH2 0x06d2 00000188: JUMPI 00000189: DUP1 0000018a: PUSH4 0xd843b2c7 0000018f: EQ 00000190: PUSH2 0x06f2 00000193: JUMPI 00000194: DUP1 00000195: PUSH4 0xdc8beea9 0000019a: EQ 0000019b: PUSH2 0x0712 0000019e: JUMPI 0000019f: DUP1 000001a0: PUSH4 0xdeb2ec6a 000001a5: EQ 000001a6: PUSH2 0x0732 000001a9: JUMPI 000001aa: DUP1 000001ab: PUSH4 0xe3df748a 000001b0: EQ 000001b1: PUSH2 0x0752 000001b4: JUMPI 000001b5: DUP1 000001b6: PUSH4 0xe4cb62c0 000001bb: EQ 000001bc: PUSH2 0x0772 000001bf: JUMPI 000001c0: DUP1 000001c1: PUSH4 0xe7a75949 000001c6: EQ 000001c7: PUSH2 0x0792 000001ca: JUMPI 000001cb: DUP1 000001cc: PUSH4 0xef706adf 000001d1: EQ 000001d2: PUSH2 0x07b2 000001d5: JUMPI 000001d6: DUP1 000001d7: PUSH4 0xf2fde38b 000001dc: EQ 000001dd: PUSH2 0x07d2 000001e0: JUMPI 000001e1: JUMPDEST 000001e2: PUSH1 0x00 000001e4: DUP1 000001e5: REVERT 000001e6: JUMPDEST 000001e7: CALLVALUE 000001e8: DUP1 000001e9: ISZERO 000001ea: PUSH2 0x01f2 000001ed: JUMPI 000001ee: PUSH1 0x00 000001f0: DUP1 000001f1: REVERT 000001f2: JUMPDEST 000001f3: POP 000001f4: PUSH2 0x0206 000001f7: PUSH2 0x0201 000001fa: CALLDATASIZE 000001fb: PUSH1 0x04 000001fd: PUSH2 0x39eb 00000200: JUMP 00000201: JUMPDEST 00000202: PUSH2 0x07f2 00000205: JUMP 00000206: JUMPDEST 00000207: STOP 00000208: JUMPDEST 00000209: CALLVALUE 0000020a: DUP1 0000020b: ISZERO 0000020c: PUSH2 0x0214 0000020f: JUMPI 00000210: PUSH1 0x00 00000212: DUP1 00000213: REVERT 00000214: JUMPDEST 00000215: POP 00000216: PUSH2 0x0206 00000219: PUSH2 0x0223 0000021c: CALLDATASIZE 0000021d: PUSH1 0x04 0000021f: PUSH2 0x3a2c 00000222: JUMP 00000223: JUMPDEST 00000224: PUSH2 0x0835 00000227: JUMP 00000228: JUMPDEST 00000229: CALLVALUE 0000022a: DUP1 0000022b: ISZERO 0000022c: PUSH2 0x0234 0000022f: JUMPI 00000230: PUSH1 0x00 00000232: DUP1 00000233: REVERT 00000234: JUMPDEST 00000235: POP 00000236: PUSH2 0x0248 00000239: PUSH2 0x0243 0000023c: CALLDATASIZE 0000023d: PUSH1 0x04 0000023f: PUSH2 0x3a4e 00000242: JUMP 00000243: JUMPDEST 00000244: PUSH2 0x0bae 00000247: JUMP 00000248: JUMPDEST 00000249: PUSH1 0x40 0000024b: MLOAD 0000024c: SWAP1 0000024d: ISZERO 0000024e: ISZERO 0000024f: DUP2 00000250: MSTORE 00000251: PUSH1 0x20 00000253: ADD 00000254: JUMPDEST 00000255: PUSH1 0x40 00000257: MLOAD 00000258: DUP1 00000259: SWAP2 0000025a: SUB 0000025b: SWAP1 0000025c: RETURN 0000025d: JUMPDEST 0000025e: CALLVALUE 0000025f: DUP1 00000260: ISZERO 00000261: PUSH2 0x0269 00000264: JUMPI 00000265: PUSH1 0x00 00000267: DUP1 00000268: REVERT 00000269: JUMPDEST 0000026a: POP 0000026b: PUSH2 0x0206 0000026e: PUSH2 0x0278 00000271: CALLDATASIZE 00000272: PUSH1 0x04 00000274: PUSH2 0x3a83 00000277: JUMP 00000278: JUMPDEST 00000279: PUSH2 0x0bd8 0000027c: JUMP 0000027d: JUMPDEST 0000027e: CALLVALUE 0000027f: DUP1 00000280: ISZERO 00000281: PUSH2 0x0289 00000284: JUMPI 00000285: PUSH1 0x00 00000287: DUP1 00000288: REVERT 00000289: JUMPDEST 0000028a: POP 0000028b: PUSH2 0x0206 0000028e: PUSH2 0x0298 00000291: CALLDATASIZE 00000292: PUSH1 0x04 00000294: PUSH2 0x3ad2 00000297: JUMP 00000298: JUMPDEST 00000299: PUSH2 0x0d91 0000029c: JUMP 0000029d: JUMPDEST 0000029e: CALLVALUE 0000029f: DUP1 000002a0: ISZERO 000002a1: PUSH2 0x02a9 000002a4: JUMPI 000002a5: PUSH1 0x00 000002a7: DUP1 000002a8: REVERT 000002a9: JUMPDEST 000002aa: POP 000002ab: PUSH2 0x0206 000002ae: PUSH2 0x02b8 000002b1: CALLDATASIZE 000002b2: PUSH1 0x04 000002b4: PUSH2 0x3afe 000002b7: JUMP 000002b8: JUMPDEST 000002b9: PUSH2 0x0e28 000002bc: JUMP 000002bd: JUMPDEST 000002be: CALLVALUE 000002bf: DUP1 000002c0: ISZERO 000002c1: PUSH2 0x02c9 000002c4: JUMPI 000002c5: PUSH1 0x00 000002c7: DUP1 000002c8: REVERT 000002c9: JUMPDEST 000002ca: POP 000002cb: PUSH2 0x0248 000002ce: PUSH2 0x02d8 000002d1: CALLDATASIZE 000002d2: PUSH1 0x04 000002d4: PUSH2 0x3b69 000002d7: JUMP 000002d8: JUMPDEST 000002d9: PUSH2 0x0ea5 000002dc: JUMP 000002dd: JUMPDEST 000002de: CALLVALUE 000002df: DUP1 000002e0: ISZERO 000002e1: PUSH2 0x02e9 000002e4: JUMPI 000002e5: PUSH1 0x00 000002e7: DUP1 000002e8: REVERT 000002e9: JUMPDEST 000002ea: POP 000002eb: PUSH2 0x0206 000002ee: PUSH2 0x02f8 000002f1: CALLDATASIZE 000002f2: PUSH1 0x04 000002f4: PUSH2 0x3b84 000002f7: JUMP 000002f8: JUMPDEST 000002f9: PUSH2 0x0ed3 000002fc: JUMP 000002fd: JUMPDEST 000002fe: PUSH2 0x0206 00000301: PUSH2 0x030b 00000304: CALLDATASIZE 00000305: PUSH1 0x04 00000307: PUSH2 0x3afe 0000030a: JUMP 0000030b: JUMPDEST 0000030c: PUSH2 0x0f77 0000030f: JUMP 00000310: JUMPDEST 00000311: CALLVALUE 00000312: DUP1 00000313: ISZERO 00000314: PUSH2 0x031c 00000317: JUMPI 00000318: PUSH1 0x00 0000031a: DUP1 0000031b: REVERT 0000031c: JUMPDEST 0000031d: POP 0000031e: PUSH2 0x0325 00000321: PUSH2 0x10f6 00000324: JUMP 00000325: JUMPDEST 00000326: PUSH1 0x40 00000328: MLOAD 00000329: SWAP1 0000032a: DUP2 0000032b: MSTORE 0000032c: PUSH1 0x20 0000032e: ADD 0000032f: PUSH2 0x0254 00000332: JUMP 00000333: JUMPDEST 00000334: CALLVALUE 00000335: DUP1 00000336: ISZERO 00000337: PUSH2 0x033f 0000033a: JUMPI 0000033b: PUSH1 0x00 0000033d: DUP1 0000033e: REVERT 0000033f: JUMPDEST 00000340: POP 00000341: PUSH2 0x0248 00000344: PUSH2 0x034e 00000347: CALLDATASIZE 00000348: PUSH1 0x04 0000034a: PUSH2 0x3a4e 0000034d: JUMP 0000034e: JUMPDEST 0000034f: PUSH2 0x110b 00000352: JUMP 00000353: JUMPDEST 00000354: CALLVALUE 00000355: DUP1 00000356: ISZERO 00000357: PUSH2 0x035f 0000035a: JUMPI 0000035b: PUSH1 0x00 0000035d: DUP1 0000035e: REVERT 0000035f: JUMPDEST 00000360: POP 00000361: PUSH2 0x0325 00000364: PUSH2 0x1131 00000367: JUMP 00000368: JUMPDEST 00000369: CALLVALUE 0000036a: DUP1 0000036b: ISZERO 0000036c: PUSH2 0x0374 0000036f: JUMPI 00000370: PUSH1 0x00 00000372: DUP1 00000373: REVERT 00000374: JUMPDEST 00000375: POP 00000376: PUSH2 0x0206 00000379: PUSH2 0x0383 0000037c: CALLDATASIZE 0000037d: PUSH1 0x04 0000037f: PUSH2 0x39eb 00000382: JUMP 00000383: JUMPDEST 00000384: PUSH2 0x1146 00000387: JUMP 00000388: JUMPDEST 00000389: CALLVALUE 0000038a: DUP1 0000038b: ISZERO 0000038c: PUSH2 0x0394 0000038f: JUMPI 00000390: PUSH1 0x00 00000392: DUP1 00000393: REVERT 00000394: JUMPDEST 00000395: POP 00000396: PUSH2 0x0206 00000399: PUSH2 0x03a3 0000039c: CALLDATASIZE 0000039d: PUSH1 0x04 0000039f: PUSH2 0x3a4e 000003a2: JUMP 000003a3: JUMPDEST 000003a4: PUSH2 0x1184 000003a7: JUMP 000003a8: JUMPDEST 000003a9: CALLVALUE 000003aa: DUP1 000003ab: ISZERO 000003ac: PUSH2 0x03b4 000003af: JUMPI 000003b0: PUSH1 0x00 000003b2: DUP1 000003b3: REVERT 000003b4: JUMPDEST 000003b5: POP 000003b6: PUSH2 0x0206 000003b9: PUSH2 0x1289 000003bc: JUMP 000003bd: JUMPDEST 000003be: CALLVALUE 000003bf: DUP1 000003c0: ISZERO 000003c1: PUSH2 0x03c9 000003c4: JUMPI 000003c5: PUSH1 0x00 000003c7: DUP1 000003c8: REVERT 000003c9: JUMPDEST 000003ca: POP 000003cb: PUSH2 0x0206 000003ce: PUSH2 0x03d8 000003d1: CALLDATASIZE 000003d2: PUSH1 0x04 000003d4: PUSH2 0x3a4e 000003d7: JUMP 000003d8: JUMPDEST 000003d9: PUSH2 0x129d 000003dc: JUMP 000003dd: JUMPDEST 000003de: PUSH2 0x0206 000003e1: PUSH2 0x03eb 000003e4: CALLDATASIZE 000003e5: PUSH1 0x04 000003e7: PUSH2 0x3bca 000003ea: JUMP 000003eb: JUMPDEST 000003ec: PUSH2 0x133f 000003ef: JUMP 000003f0: JUMPDEST 000003f1: CALLVALUE 000003f2: DUP1 000003f3: ISZERO 000003f4: PUSH2 0x03fc 000003f7: JUMPI 000003f8: PUSH1 0x00 000003fa: DUP1 000003fb: REVERT 000003fc: JUMPDEST 000003fd: POP 000003fe: PUSH2 0x0206 00000401: PUSH2 0x040b 00000404: CALLDATASIZE 00000405: PUSH1 0x04 00000407: PUSH2 0x3a2c 0000040a: JUMP 0000040b: JUMPDEST 0000040c: PUSH2 0x1477 0000040f: JUMP 00000410: JUMPDEST 00000411: CALLVALUE 00000412: DUP1 00000413: ISZERO 00000414: PUSH2 0x041c 00000417: JUMPI 00000418: PUSH1 0x00 0000041a: DUP1 0000041b: REVERT 0000041c: JUMPDEST 0000041d: POP 0000041e: PUSH2 0x0425 00000421: PUSH2 0x16e9 00000424: JUMP 00000425: JUMPDEST 00000426: PUSH1 0x40 00000428: MLOAD 00000429: PUSH2 0x0254 0000042c: SWAP2 0000042d: SWAP1 0000042e: DUP2 0000042f: MLOAD 00000430: DUP2 00000431: MSTORE 00000432: PUSH1 0x20 00000434: DUP1 00000435: DUP4 00000436: ADD 00000437: MLOAD 00000438: SWAP1 00000439: DUP3 0000043a: ADD 0000043b: MSTORE 0000043c: PUSH1 0x40 0000043e: DUP1 0000043f: DUP4 00000440: ADD 00000441: MLOAD 00000442: SWAP1 00000443: DUP3 00000444: ADD 00000445: MSTORE 00000446: PUSH1 0x60 00000448: SWAP2 00000449: DUP3 0000044a: ADD 0000044b: MLOAD 0000044c: PUSH1 0x01 0000044e: PUSH1 0x01 00000450: PUSH1 0xa0 00000452: SHL 00000453: SUB 00000454: AND 00000455: SWAP2 00000456: DUP2 00000457: ADD 00000458: SWAP2 00000459: SWAP1 0000045a: SWAP2 0000045b: MSTORE 0000045c: PUSH1 0x80 0000045e: ADD 0000045f: SWAP1 00000460: JUMP 00000461: JUMPDEST 00000462: CALLVALUE 00000463: DUP1 00000464: ISZERO 00000465: PUSH2 0x046d 00000468: JUMPI 00000469: PUSH1 0x00 0000046b: DUP1 0000046c: REVERT 0000046d: JUMPDEST 0000046e: POP 0000046f: PUSH2 0x0206 00000472: PUSH2 0x1768 00000475: JUMP 00000476: JUMPDEST 00000477: PUSH2 0x0206 0000047a: PUSH2 0x0484 0000047d: CALLDATASIZE 0000047e: PUSH1 0x04 00000480: PUSH2 0x3a2c 00000483: JUMP 00000484: JUMPDEST 00000485: PUSH2 0x18af 00000488: JUMP 00000489: JUMPDEST 0000048a: CALLVALUE 0000048b: DUP1 0000048c: ISZERO 0000048d: PUSH2 0x0495 00000490: JUMPI 00000491: PUSH1 0x00 00000493: DUP1 00000494: REVERT 00000495: JUMPDEST 00000496: POP 00000497: PUSH2 0x0206 0000049a: PUSH2 0x04a4 0000049d: CALLDATASIZE 0000049e: PUSH1 0x04 000004a0: PUSH2 0x3c19 000004a3: JUMP 000004a4: JUMPDEST 000004a5: PUSH2 0x191d 000004a8: JUMP 000004a9: JUMPDEST 000004aa: CALLVALUE 000004ab: DUP1 000004ac: ISZERO 000004ad: PUSH2 0x04b5 000004b0: JUMPI 000004b1: PUSH1 0x00 000004b3: DUP1 000004b4: REVERT 000004b5: JUMPDEST 000004b6: POP 000004b7: PUSH2 0x04c9 000004ba: PUSH2 0x04c4 000004bd: CALLDATASIZE 000004be: PUSH1 0x04 000004c0: PUSH2 0x3a4e 000004c3: JUMP 000004c4: JUMPDEST 000004c5: PUSH2 0x1a9b 000004c8: JUMP 000004c9: JUMPDEST 000004ca: PUSH1 0x40 000004cc: MLOAD 000004cd: PUSH2 0x0254 000004d0: SWAP2 000004d1: SWAP1 000004d2: PUSH2 0x3c65 000004d5: JUMP 000004d6: JUMPDEST 000004d7: CALLVALUE 000004d8: DUP1 000004d9: ISZERO 000004da: PUSH2 0x04e2 000004dd: JUMPI 000004de: PUSH1 0x00 000004e0: DUP1 000004e1: REVERT 000004e2: JUMPDEST 000004e3: POP 000004e4: PUSH2 0x04eb 000004e7: PUSH2 0x1b93 000004ea: JUMP 000004eb: JUMPDEST 000004ec: PUSH1 0x40 000004ee: MLOAD 000004ef: PUSH2 0x0254 000004f2: SWAP2 000004f3: SWAP1 000004f4: PUSH2 0x3cef 000004f7: JUMP 000004f8: JUMPDEST 000004f9: CALLVALUE 000004fa: DUP1 000004fb: ISZERO 000004fc: PUSH2 0x0504 000004ff: JUMPI 00000500: PUSH1 0x00 00000502: DUP1 00000503: REVERT 00000504: JUMPDEST 00000505: POP 00000506: PUSH2 0x0518 00000509: PUSH2 0x0513 0000050c: CALLDATASIZE 0000050d: PUSH1 0x04 0000050f: PUSH2 0x3a4e 00000512: JUMP 00000513: JUMPDEST 00000514: PUSH2 0x1bae 00000517: JUMP 00000518: JUMPDEST 00000519: PUSH1 0x40 0000051b: DUP1 0000051c: MLOAD 0000051d: DUP3 0000051e: MLOAD 0000051f: PUSH1 0x01 00000521: PUSH1 0x01 00000523: PUSH1 0xa0 00000525: SHL 00000526: SUB 00000527: AND 00000528: DUP2 00000529: MSTORE 0000052a: PUSH1 0x20 0000052c: DUP1 0000052d: DUP5 0000052e: ADD 0000052f: MLOAD 00000530: PUSH6 0xffffffffffff 00000537: SWAP1 00000538: DUP2 00000539: AND 0000053a: SWAP2 0000053b: DUP4 0000053c: ADD 0000053d: SWAP2 0000053e: SWAP1 0000053f: SWAP2 00000540: MSTORE 00000541: DUP4 00000542: DUP4 00000543: ADD 00000544: MLOAD 00000545: AND 00000546: SWAP2 00000547: DUP2 00000548: ADD 00000549: SWAP2 0000054a: SWAP1 0000054b: SWAP2 0000054c: MSTORE 0000054d: PUSH1 0x60 0000054f: DUP1 00000550: DUP4 00000551: ADD 00000552: MLOAD 00000553: PUSH1 0x01 00000555: PUSH1 0x01 00000557: PUSH1 0x98 00000559: SHL 0000055a: SUB 0000055b: AND 0000055c: SWAP1 0000055d: DUP3 0000055e: ADD 0000055f: MSTORE 00000560: PUSH1 0x80 00000562: DUP1 00000563: DUP4 00000564: ADD 00000565: MLOAD 00000566: PUSH1 0xff 00000568: AND 00000569: SWAP1 0000056a: DUP3 0000056b: ADD 0000056c: MSTORE 0000056d: PUSH1 0xa0 0000056f: SWAP2 00000570: DUP3 00000571: ADD 00000572: MLOAD 00000573: SWAP2 00000574: DUP2 00000575: ADD 00000576: SWAP2 00000577: SWAP1 00000578: SWAP2 00000579: MSTORE 0000057a: PUSH1 0xc0 0000057c: ADD 0000057d: PUSH2 0x0254 00000580: JUMP 00000581: JUMPDEST 00000582: CALLVALUE 00000583: DUP1 00000584: ISZERO 00000585: PUSH2 0x058d 00000588: JUMPI 00000589: PUSH1 0x00 0000058b: DUP1 0000058c: REVERT 0000058d: JUMPDEST 0000058e: POP 0000058f: PUSH2 0x0206 00000592: PUSH2 0x059c 00000595: CALLDATASIZE 00000596: PUSH1 0x04 00000598: PUSH2 0x39eb 0000059b: JUMP 0000059c: JUMPDEST 0000059d: PUSH2 0x1c70 000005a0: JUMP 000005a1: JUMPDEST 000005a2: CALLVALUE 000005a3: DUP1 000005a4: ISZERO 000005a5: PUSH2 0x05ad 000005a8: JUMPI 000005a9: PUSH1 0x00 000005ab: DUP1 000005ac: REVERT 000005ad: JUMPDEST 000005ae: POP 000005af: PUSH2 0x0206 000005b2: PUSH2 0x05bc 000005b5: CALLDATASIZE 000005b6: PUSH1 0x04 000005b8: PUSH2 0x3d11 000005bb: JUMP 000005bc: JUMPDEST 000005bd: PUSH2 0x1cae 000005c0: JUMP 000005c1: JUMPDEST 000005c2: CALLVALUE 000005c3: DUP1 000005c4: ISZERO 000005c5: PUSH2 0x05cd 000005c8: JUMPI 000005c9: PUSH1 0x00 000005cb: DUP1 000005cc: REVERT 000005cd: JUMPDEST 000005ce: POP 000005cf: PUSH2 0x0325 000005d2: PUSH2 0x05dc 000005d5: CALLDATASIZE 000005d6: PUSH1 0x04 000005d8: PUSH2 0x3a4e 000005db: JUMP 000005dc: JUMPDEST 000005dd: PUSH2 0x1d74 000005e0: JUMP 000005e1: JUMPDEST 000005e2: CALLVALUE 000005e3: DUP1 000005e4: ISZERO 000005e5: PUSH2 0x05ed 000005e8: JUMPI 000005e9: PUSH1 0x00 000005eb: DUP1 000005ec: REVERT 000005ed: JUMPDEST 000005ee: POP 000005ef: PUSH2 0x0601 000005f2: PUSH2 0x05fc 000005f5: CALLDATASIZE 000005f6: PUSH1 0x04 000005f8: PUSH2 0x3a4e 000005fb: JUMP 000005fc: JUMPDEST 000005fd: PUSH2 0x1dad 00000600: JUMP 00000601: JUMPDEST 00000602: PUSH1 0x40 00000604: MLOAD 00000605: PUSH2 0x0254 00000608: SWAP2 00000609: SWAP1 0000060a: DUP2 0000060b: MLOAD 0000060c: DUP2 0000060d: MSTORE 0000060e: PUSH1 0x20 00000610: DUP1 00000611: DUP4 00000612: ADD 00000613: MLOAD 00000614: SWAP1 00000615: DUP3 00000616: ADD 00000617: MSTORE 00000618: PUSH1 0x40 0000061a: DUP1 0000061b: DUP4 0000061c: ADD 0000061d: MLOAD 0000061e: PUSH1 0x01 00000620: PUSH1 0x01 00000622: PUSH1 0xa0 00000624: SHL 00000625: SUB 00000626: SWAP1 00000627: DUP2 00000628: AND 00000629: SWAP2 0000062a: DUP4 0000062b: ADD 0000062c: SWAP2 0000062d: SWAP1 0000062e: SWAP2 0000062f: MSTORE 00000630: PUSH1 0x60 00000632: DUP1 00000633: DUP5 00000634: ADD 00000635: MLOAD 00000636: SWAP1 00000637: SWAP2 00000638: AND 00000639: SWAP1 0000063a: DUP3 0000063b: ADD 0000063c: MSTORE 0000063d: PUSH1 0x80 0000063f: SWAP2 00000640: DUP3 00000641: ADD 00000642: MLOAD 00000643: PUSH1 0xff 00000645: AND 00000646: SWAP2 00000647: DUP2 00000648: ADD 00000649: SWAP2 0000064a: SWAP1 0000064b: SWAP2 0000064c: MSTORE 0000064d: PUSH1 0xa0 0000064f: ADD 00000650: SWAP1 00000651: JUMP 00000652: JUMPDEST 00000653: CALLVALUE 00000654: DUP1 00000655: ISZERO 00000656: PUSH2 0x065e 00000659: JUMPI 0000065a: PUSH1 0x00 0000065c: DUP1 0000065d: REVERT 0000065e: JUMPDEST 0000065f: POP 00000660: PUSH2 0x0206 00000663: PUSH2 0x066d 00000666: CALLDATASIZE 00000667: PUSH1 0x04 00000669: PUSH2 0x3d5c 0000066c: JUMP 0000066d: JUMPDEST 0000066e: PUSH2 0x1e45 00000671: JUMP 00000672: JUMPDEST 00000673: CALLVALUE 00000674: DUP1 00000675: ISZERO 00000676: PUSH2 0x067e 00000679: JUMPI 0000067a: PUSH1 0x00 0000067c: DUP1 0000067d: REVERT 0000067e: JUMPDEST 0000067f: POP 00000680: PUSH2 0x0206 00000683: PUSH2 0x068d 00000686: CALLDATASIZE 00000687: PUSH1 0x04 00000689: PUSH2 0x3a4e 0000068c: JUMP 0000068d: JUMPDEST 0000068e: PUSH2 0x1fc9 00000691: JUMP 00000692: JUMPDEST 00000693: CALLVALUE 00000694: DUP1 00000695: ISZERO 00000696: PUSH2 0x069e 00000699: JUMPI 0000069a: PUSH1 0x00 0000069c: DUP1 0000069d: REVERT 0000069e: JUMPDEST 0000069f: POP 000006a0: PUSH2 0x0206 000006a3: PUSH2 0x06ad 000006a6: CALLDATASIZE 000006a7: PUSH1 0x04 000006a9: PUSH2 0x39eb 000006ac: JUMP 000006ad: JUMPDEST 000006ae: PUSH2 0x23fd 000006b1: JUMP 000006b2: JUMPDEST 000006b3: CALLVALUE 000006b4: DUP1 000006b5: ISZERO 000006b6: PUSH2 0x06be 000006b9: JUMPI 000006ba: PUSH1 0x00 000006bc: DUP1 000006bd: REVERT 000006be: JUMPDEST 000006bf: POP 000006c0: PUSH2 0x0206 000006c3: PUSH2 0x06cd 000006c6: CALLDATASIZE 000006c7: PUSH1 0x04 000006c9: PUSH2 0x3db4 000006cc: JUMP 000006cd: JUMPDEST 000006ce: PUSH2 0x243b 000006d1: JUMP 000006d2: JUMPDEST 000006d3: CALLVALUE 000006d4: DUP1 000006d5: ISZERO 000006d6: PUSH2 0x06de 000006d9: JUMPI 000006da: PUSH1 0x00 000006dc: DUP1 000006dd: REVERT 000006de: JUMPDEST 000006df: POP 000006e0: PUSH2 0x0325 000006e3: PUSH2 0x06ed 000006e6: CALLDATASIZE 000006e7: PUSH1 0x04 000006e9: PUSH2 0x3a4e 000006ec: JUMP 000006ed: JUMPDEST 000006ee: PUSH2 0x2522 000006f1: JUMP 000006f2: JUMPDEST 000006f3: CALLVALUE 000006f4: DUP1 000006f5: ISZERO 000006f6: PUSH2 0x06fe 000006f9: JUMPI 000006fa: PUSH1 0x00 000006fc: DUP1 000006fd: REVERT 000006fe: JUMPDEST 000006ff: POP 00000700: PUSH2 0x0325 00000703: PUSH2 0x070d 00000706: CALLDATASIZE 00000707: PUSH1 0x04 00000709: PUSH2 0x3a4e 0000070c: JUMP 0000070d: JUMPDEST 0000070e: PUSH2 0x254f 00000711: JUMP 00000712: JUMPDEST 00000713: CALLVALUE 00000714: DUP1 00000715: ISZERO 00000716: PUSH2 0x071e 00000719: JUMPI 0000071a: PUSH1 0x00 0000071c: DUP1 0000071d: REVERT 0000071e: JUMPDEST 0000071f: POP 00000720: PUSH2 0x04eb 00000723: PUSH2 0x072d 00000726: CALLDATASIZE 00000727: PUSH1 0x04 00000729: PUSH2 0x3a4e 0000072c: JUMP 0000072d: JUMPDEST 0000072e: PUSH2 0x2575 00000731: JUMP 00000732: JUMPDEST 00000733: CALLVALUE 00000734: DUP1 00000735: ISZERO 00000736: PUSH2 0x073e 00000739: JUMPI 0000073a: PUSH1 0x00 0000073c: DUP1 0000073d: REVERT 0000073e: JUMPDEST 0000073f: POP 00000740: PUSH2 0x0206 00000743: PUSH2 0x074d 00000746: CALLDATASIZE 00000747: PUSH1 0x04 00000749: PUSH2 0x3a4e 0000074c: JUMP 0000074d: JUMPDEST 0000074e: PUSH2 0x25a5 00000751: JUMP 00000752: JUMPDEST 00000753: CALLVALUE 00000754: DUP1 00000755: ISZERO 00000756: PUSH2 0x075e 00000759: JUMPI 0000075a: PUSH1 0x00 0000075c: DUP1 0000075d: REVERT 0000075e: JUMPDEST 0000075f: POP 00000760: PUSH2 0x0325 00000763: PUSH2 0x076d 00000766: CALLDATASIZE 00000767: PUSH1 0x04 00000769: PUSH2 0x3a4e 0000076c: JUMP 0000076d: JUMPDEST 0000076e: PUSH2 0x287c 00000771: JUMP 00000772: JUMPDEST 00000773: CALLVALUE 00000774: DUP1 00000775: ISZERO 00000776: PUSH2 0x077e 00000779: JUMPI 0000077a: PUSH1 0x00 0000077c: DUP1 0000077d: REVERT 0000077e: JUMPDEST 0000077f: POP 00000780: PUSH2 0x0206 00000783: PUSH2 0x078d 00000786: CALLDATASIZE 00000787: PUSH1 0x04 00000789: PUSH2 0x3a4e 0000078c: JUMP 0000078d: JUMPDEST 0000078e: PUSH2 0x289f 00000791: JUMP 00000792: JUMPDEST 00000793: CALLVALUE 00000794: DUP1 00000795: ISZERO 00000796: PUSH2 0x079e 00000799: JUMPI 0000079a: PUSH1 0x00 0000079c: DUP1 0000079d: REVERT 0000079e: JUMPDEST 0000079f: POP 000007a0: PUSH2 0x0325 000007a3: PUSH2 0x07ad 000007a6: CALLDATASIZE 000007a7: PUSH1 0x04 000007a9: PUSH2 0x3a4e 000007ac: JUMP 000007ad: JUMPDEST 000007ae: PUSH2 0x2c5e 000007b1: JUMP 000007b2: JUMPDEST 000007b3: CALLVALUE 000007b4: DUP1 000007b5: ISZERO 000007b6: PUSH2 0x07be 000007b9: JUMPI 000007ba: PUSH1 0x00 000007bc: DUP1 000007bd: REVERT 000007be: JUMPDEST 000007bf: POP 000007c0: PUSH2 0x0206 000007c3: PUSH2 0x07cd 000007c6: CALLDATASIZE 000007c7: PUSH1 0x04 000007c9: PUSH2 0x3a4e 000007cc: JUMP 000007cd: JUMPDEST 000007ce: PUSH2 0x2c81 000007d1: JUMP 000007d2: JUMPDEST 000007d3: CALLVALUE 000007d4: DUP1 000007d5: ISZERO 000007d6: PUSH2 0x07de 000007d9: JUMPI 000007da: PUSH1 0x00 000007dc: DUP1 000007dd: REVERT 000007de: JUMPDEST 000007df: POP 000007e0: PUSH2 0x0206 000007e3: PUSH2 0x07ed 000007e6: CALLDATASIZE 000007e7: PUSH1 0x04 000007e9: PUSH2 0x3b69 000007ec: JUMP 000007ed: JUMPDEST 000007ee: PUSH2 0x2f78 000007f1: JUMP 000007f2: JUMPDEST 000007f3: PUSH1 0x00 000007f5: JUMPDEST 000007f6: DUP2 000007f7: DUP2 000007f8: LT 000007f9: ISZERO 000007fa: PUSH2 0x0830 000007fd: JUMPI 000007fe: PUSH2 0x081e 00000801: DUP4 00000802: DUP4 00000803: DUP4 00000804: DUP2 00000805: DUP2 00000806: LT 00000807: PUSH2 0x0812 0000080a: JUMPI 0000080b: PUSH2 0x0812 0000080e: PUSH2 0x3dde 00000811: JUMP 00000812: JUMPDEST 00000813: SWAP1 00000814: POP 00000815: PUSH1 0x20 00000817: MUL 00000818: ADD 00000819: CALLDATALOAD 0000081a: PUSH2 0x1fc9 0000081d: JUMP 0000081e: JUMPDEST 0000081f: DUP1 00000820: PUSH2 0x0828 00000823: DUP2 00000824: PUSH2 0x3e0a 00000827: JUMP 00000828: JUMPDEST 00000829: SWAP2 0000082a: POP 0000082b: POP 0000082c: PUSH2 0x07f5 0000082f: JUMP 00000830: JUMPDEST 00000831: POP 00000832: POP 00000833: POP 00000834: JUMP 00000835: JUMPDEST 00000836: PUSH2 0x083d 00000839: PUSH2 0x2fb3 0000083c: JUMP 0000083d: JUMPDEST 0000083e: PUSH2 0x0845 00000841: PUSH2 0x2fe9 00000844: JUMP 00000845: JUMPDEST 00000846: PUSH1 0x00 00000848: PUSH2 0x084f 0000084b: PUSH2 0x301b 0000084e: JUMP 0000084f: JUMPDEST 00000850: PUSH1 0x00 00000852: DUP5 00000853: DUP2 00000854: MSTORE 00000855: PUSH1 0x04 00000857: DUP3 00000858: ADD 00000859: PUSH1 0x20 0000085b: SWAP1 0000085c: DUP2 0000085d: MSTORE 0000085e: PUSH1 0x40 00000860: DUP1 00000861: DUP4 00000862: KECCAK256 00000863: DUP1 00000864: SLOAD 00000865: DUP5 00000866: MSTORE 00000867: PUSH1 0x02 00000869: DUP6 0000086a: ADD 0000086b: DUP4 0000086c: MSTORE 0000086d: DUP2 0000086e: DUP5 0000086f: KECCAK256 00000870: PUSH1 0x01 00000872: DUP1 00000873: DUP3 00000874: ADD 00000875: SLOAD 00000876: DUP7 00000877: MSTORE 00000878: DUP1 00000879: DUP8 0000087a: ADD 0000087b: SWAP1 0000087c: SWAP5 0000087d: MSTORE 0000087e: SWAP2 0000087f: SWAP1 00000880: SWAP4 00000881: KECCAK256 00000882: SWAP2 00000883: DUP3 00000884: ADD 00000885: SLOAD 00000886: SWAP4 00000887: SWAP5 00000888: POP 00000889: SWAP2 0000088a: SWAP3 0000088b: PUSH1 0x01 0000088d: PUSH1 0x98 0000088f: SHL 00000890: SWAP1 00000891: DIV 00000892: PUSH1 0xff 00000894: AND 00000895: PUSH1 0x03 00000897: EQ 00000898: PUSH2 0x08bc 0000089b: JUMPI 0000089c: PUSH1 0x40 0000089e: MLOAD 0000089f: PUSH3 0x461bcd 000008a3: PUSH1 0xe5 000008a5: SHL 000008a6: DUP2 000008a7: MSTORE 000008a8: PUSH1 0x04 000008aa: ADD 000008ab: PUSH2 0x08b3 000008ae: SWAP1 000008af: PUSH2 0x3e23 000008b2: JUMP 000008b3: JUMPDEST 000008b4: PUSH1 0x40 000008b6: MLOAD 000008b7: DUP1 000008b8: SWAP2 000008b9: SUB 000008ba: SWAP1 000008bb: REVERT 000008bc: JUMPDEST 000008bd: DUP1 000008be: SLOAD 000008bf: PUSH1 0x01 000008c1: PUSH1 0x01 000008c3: PUSH1 0xa0 000008c5: SHL 000008c6: SUB 000008c7: AND 000008c8: ISZERO 000008c9: DUP1 000008ca: ISZERO 000008cb: SWAP1 000008cc: PUSH2 0x08e1 000008cf: JUMPI 000008d0: POP 000008d1: PUSH1 0x01 000008d3: DUP2 000008d4: ADD 000008d5: SLOAD 000008d6: PUSH1 0x01 000008d8: PUSH1 0x01 000008da: PUSH1 0x98 000008dc: SHL 000008dd: SUB 000008de: AND 000008df: ISZERO 000008e0: ISZERO 000008e1: JUMPDEST 000008e2: PUSH2 0x08fd 000008e5: JUMPI 000008e6: PUSH1 0x40 000008e8: MLOAD 000008e9: PUSH3 0x461bcd 000008ed: PUSH1 0xe5 000008ef: SHL 000008f0: DUP2 000008f1: MSTORE 000008f2: PUSH1 0x04 000008f4: ADD 000008f5: PUSH2 0x08b3 000008f8: SWAP1 000008f9: PUSH2 0x3e4b 000008fc: JUMP 000008fd: JUMPDEST 000008fe: DUP1 000008ff: SLOAD 00000900: PUSH1 0x01 00000902: PUSH1 0xa0 00000904: SHL 00000905: SWAP1 00000906: DIV 00000907: PUSH6 0xffffffffffff 0000090e: AND 0000090f: TIMESTAMP 00000910: GT 00000911: PUSH2 0x092c 00000914: JUMPI 00000915: PUSH1 0x40 00000917: MLOAD 00000918: PUSH3 0x461bcd 0000091c: PUSH1 0xe5 0000091e: SHL 0000091f: DUP2 00000920: MSTORE 00000921: PUSH1 0x04 00000923: ADD 00000924: PUSH2 0x08b3 00000927: SWAP1 00000928: PUSH2 0x3e72 0000092b: JUMP 0000092c: JUMPDEST 0000092d: PUSH1 0x03 0000092f: DUP4 00000930: ADD 00000931: SLOAD 00000932: PUSH1 0x01 00000934: PUSH1 0xa0 00000936: SHL 00000937: SWAP1 00000938: DIV 00000939: PUSH1 0xff 0000093b: AND 0000093c: PUSH1 0x01 0000093e: EQ 0000093f: PUSH2 0x095a 00000942: JUMPI 00000943: PUSH1 0x40 00000945: MLOAD 00000946: PUSH3 0x461bcd 0000094a: PUSH1 0xe5 0000094c: SHL 0000094d: DUP2 0000094e: MSTORE 0000094f: PUSH1 0x04 00000951: ADD 00000952: PUSH2 0x08b3 00000955: SWAP1 00000956: PUSH2 0x3ea5 00000959: JUMP 0000095a: JUMPDEST 0000095b: PUSH1 0x00 0000095d: DUP3 0000095e: PUSH1 0x03 00000960: ADD 00000961: SLOAD 00000962: DUP4 00000963: PUSH1 0x05 00000965: ADD 00000966: SLOAD 00000967: DUP6 00000968: PUSH1 0x01 0000096a: ADD 0000096b: SLOAD 0000096c: PUSH2 0x0975 0000096f: SWAP2 00000970: SWAP1 00000971: PUSH2 0x3ed3 00000974: JUMP 00000975: JUMPDEST 00000976: PUSH2 0x097f 00000979: SWAP2 0000097a: SWAP1 0000097b: PUSH2 0x3eea 0000097e: JUMP 0000097f: JUMPDEST 00000980: SWAP1 00000981: POP 00000982: PUSH1 0x00 00000984: DUP4 00000985: PUSH1 0x03 00000987: ADD 00000988: SLOAD 00000989: DUP5 0000098a: PUSH1 0x04 0000098c: ADD 0000098d: SLOAD 0000098e: DUP7 0000098f: PUSH1 0x01 00000991: ADD 00000992: SLOAD 00000993: PUSH2 0x099c 00000996: SWAP2 00000997: SWAP1 00000998: PUSH2 0x3ed3 0000099b: JUMP 0000099c: JUMPDEST 0000099d: PUSH2 0x09a6 000009a0: SWAP2 000009a1: SWAP1 000009a2: PUSH2 0x3eea 000009a5: JUMP 000009a6: JUMPDEST 000009a7: SWAP1 000009a8: POP 000009a9: PUSH1 0x00 000009ab: PUSH3 0x0f4240 000009af: DUP8 000009b0: PUSH1 0x06 000009b2: ADD 000009b3: PUSH1 0x02 000009b5: ADD 000009b6: SLOAD 000009b7: DUP4 000009b8: PUSH2 0x09c1 000009bb: SWAP2 000009bc: SWAP1 000009bd: PUSH2 0x3ed3 000009c0: JUMP 000009c1: JUMPDEST 000009c2: PUSH2 0x09cb 000009c5: SWAP2 000009c6: SWAP1 000009c7: PUSH2 0x3eea 000009ca: JUMP 000009cb: JUMPDEST 000009cc: SWAP1 000009cd: POP 000009ce: PUSH1 0x00 000009d0: DUP2 000009d1: PUSH2 0x09da 000009d4: DUP6 000009d5: DUP6 000009d6: PUSH2 0x3f0c 000009d9: JUMP 000009da: JUMPDEST 000009db: PUSH2 0x09e4 000009de: SWAP2 000009df: SWAP1 000009e0: PUSH2 0x3f1f 000009e3: JUMP 000009e4: JUMPDEST 000009e5: PUSH1 0x02 000009e7: DUP8 000009e8: ADD 000009e9: SLOAD 000009ea: SWAP1 000009eb: SWAP2 000009ec: POP 000009ed: PUSH1 0x01 000009ef: PUSH1 0x01 000009f1: PUSH1 0xa0 000009f3: SHL 000009f4: SUB 000009f5: AND 000009f6: PUSH2 0x0ad9 000009f9: JUMPI 000009fa: PUSH1 0x02 000009fc: DUP8 000009fd: ADD 000009fe: SLOAD 000009ff: PUSH1 0x40 00000a01: MLOAD 00000a02: PUSH1 0x00 00000a04: SWAP2 00000a05: PUSH1 0x01 00000a07: PUSH1 0x01 00000a09: PUSH1 0xa0 00000a0b: SHL 00000a0c: SUB 00000a0d: AND 00000a0e: SWAP1 00000a0f: DUP4 00000a10: SWAP1 00000a11: DUP4 00000a12: DUP2 00000a13: DUP2 00000a14: DUP2 00000a15: DUP6 00000a16: DUP8 00000a17: GAS 00000a18: CALL 00000a19: SWAP3 00000a1a: POP 00000a1b: POP 00000a1c: POP 00000a1d: RETURNDATASIZE 00000a1e: DUP1 00000a1f: PUSH1 0x00 00000a21: DUP2 00000a22: EQ 00000a23: PUSH2 0x0a48 00000a26: JUMPI 00000a27: PUSH1 0x40 00000a29: MLOAD 00000a2a: SWAP2 00000a2b: POP 00000a2c: PUSH1 0x1f 00000a2e: NOT 00000a2f: PUSH1 0x3f 00000a31: RETURNDATASIZE 00000a32: ADD 00000a33: AND 00000a34: DUP3 00000a35: ADD 00000a36: PUSH1 0x40 00000a38: MSTORE 00000a39: RETURNDATASIZE 00000a3a: DUP3 00000a3b: MSTORE 00000a3c: RETURNDATASIZE 00000a3d: PUSH1 0x00 00000a3f: PUSH1 0x20 00000a41: DUP5 00000a42: ADD 00000a43: RETURNDATACOPY 00000a44: PUSH2 0x0a4d 00000a47: JUMP 00000a48: JUMPDEST 00000a49: PUSH1 0x60 00000a4b: SWAP2 00000a4c: POP 00000a4d: JUMPDEST 00000a4e: POP 00000a4f: POP 00000a50: PUSH1 0x09 00000a52: DUP11 00000a53: ADD 00000a54: SLOAD 00000a55: PUSH1 0x40 00000a57: MLOAD 00000a58: SWAP2 00000a59: SWAP3 00000a5a: POP 00000a5b: PUSH1 0x00 00000a5d: SWAP2 00000a5e: PUSH1 0x01 00000a60: PUSH1 0x01 00000a62: PUSH1 0xa0 00000a64: SHL 00000a65: SUB 00000a66: SWAP1 00000a67: SWAP2 00000a68: AND 00000a69: SWAP1 00000a6a: DUP6 00000a6b: SWAP1 00000a6c: DUP4 00000a6d: DUP2 00000a6e: DUP2 00000a6f: DUP2 00000a70: DUP6 00000a71: DUP8 00000a72: GAS 00000a73: CALL 00000a74: SWAP3 00000a75: POP 00000a76: POP 00000a77: POP 00000a78: RETURNDATASIZE 00000a79: DUP1 00000a7a: PUSH1 0x00 00000a7c: DUP2 00000a7d: EQ 00000a7e: PUSH2 0x0aa3 00000a81: JUMPI 00000a82: PUSH1 0x40 00000a84: MLOAD 00000a85: SWAP2 00000a86: POP 00000a87: PUSH1 0x1f 00000a89: NOT 00000a8a: PUSH1 0x3f 00000a8c: RETURNDATASIZE 00000a8d: ADD 00000a8e: AND 00000a8f: DUP3 00000a90: ADD 00000a91: PUSH1 0x40 00000a93: MSTORE 00000a94: RETURNDATASIZE 00000a95: DUP3 00000a96: MSTORE 00000a97: RETURNDATASIZE 00000a98: PUSH1 0x00 00000a9a: PUSH1 0x20 00000a9c: DUP5 00000a9d: ADD 00000a9e: RETURNDATACOPY 00000a9f: PUSH2 0x0aa8 00000aa2: JUMP 00000aa3: JUMPDEST 00000aa4: PUSH1 0x60 00000aa6: SWAP2 00000aa7: POP 00000aa8: JUMPDEST 00000aa9: POP 00000aaa: POP 00000aab: SWAP1 00000aac: POP 00000aad: DUP2 00000aae: DUP1 00000aaf: ISZERO 00000ab0: PUSH2 0x0ab6 00000ab3: JUMPI 00000ab4: POP 00000ab5: DUP1 00000ab6: JUMPDEST 00000ab7: PUSH2 0x0ad2 00000aba: JUMPI 00000abb: PUSH1 0x40 00000abd: MLOAD 00000abe: PUSH3 0x461bcd 00000ac2: PUSH1 0xe5 00000ac4: SHL 00000ac5: DUP2 00000ac6: MSTORE 00000ac7: PUSH1 0x04 00000ac9: ADD 00000aca: PUSH2 0x08b3 00000acd: SWAP1 00000ace: PUSH2 0x3f32 00000ad1: JUMP 00000ad2: JUMPDEST 00000ad3: POP 00000ad4: POP 00000ad5: PUSH2 0x0b1a 00000ad8: JUMP 00000ad9: JUMPDEST 00000ada: PUSH1 0x02 00000adc: DUP1 00000add: DUP8 00000ade: ADD 00000adf: SLOAD 00000ae0: SWAP1 00000ae1: DUP9 00000ae2: ADD 00000ae3: SLOAD 00000ae4: PUSH1 0x01 00000ae6: PUSH1 0x01 00000ae8: PUSH1 0xa0 00000aea: SHL 00000aeb: SUB 00000aec: SWAP2 00000aed: DUP3 00000aee: AND 00000aef: SWAP2 00000af0: PUSH2 0x0afc 00000af3: SWAP2 00000af4: DUP4 00000af5: SWAP2 00000af6: AND 00000af7: DUP5 00000af8: PUSH2 0x303f 00000afb: JUMP 00000afc: JUMPDEST 00000afd: PUSH1 0x09 00000aff: DUP10 00000b00: ADD 00000b01: SLOAD 00000b02: PUSH2 0x0b18 00000b05: SWAP1 00000b06: PUSH1 0x01 00000b08: PUSH1 0x01 00000b0a: PUSH1 0xa0 00000b0c: SHL 00000b0d: SUB 00000b0e: DUP4 00000b0f: DUP2 00000b10: AND 00000b11: SWAP2 00000b12: AND 00000b13: DUP6 00000b14: PUSH2 0x303f 00000b17: JUMP 00000b18: JUMPDEST 00000b19: POP 00000b1a: JUMPDEST 00000b1b: PUSH1 0x03 00000b1d: DUP8 00000b1e: ADD 00000b1f: DUP1 00000b20: SLOAD 00000b21: PUSH1 0xff 00000b23: PUSH1 0xa0 00000b25: SHL 00000b26: NOT 00000b27: AND 00000b28: PUSH1 0x01 00000b2a: PUSH1 0xa1 00000b2c: SHL 00000b2d: OR 00000b2e: SWAP1 00000b2f: SSTORE 00000b30: PUSH1 0x40 00000b32: DUP1 00000b33: MLOAD 00000b34: DUP12 00000b35: DUP2 00000b36: MSTORE 00000b37: PUSH1 0x20 00000b39: DUP2 00000b3a: ADD 00000b3b: DUP12 00000b3c: SWAP1 00000b3d: MSTORE 00000b3e: CALLER 00000b3f: DUP2 00000b40: DUP4 00000b41: ADD 00000b42: MSTORE 00000b43: SWAP1 00000b44: MLOAD 00000b45: PUSH32 0xbac7c71779ccc41f8c859e9d622536f76f0375a85b23e1b3d4134f613a9fff54 00000b66: SWAP2 00000b67: PUSH1 0x60 00000b69: SWAP1 00000b6a: DUP3 00000b6b: SWAP1 00000b6c: SUB 00000b6d: ADD 00000b6e: SWAP1 00000b6f: LOG1 00000b70: PUSH1 0x00 00000b72: DUP1 00000b73: MLOAD 00000b74: PUSH1 0x20 00000b76: PUSH2 0x43d8 00000b79: DUP4 00000b7a: CODECOPY 00000b7b: DUP2 00000b7c: MLOAD 00000b7d: SWAP2 00000b7e: MSTORE 00000b7f: DUP11 00000b80: DUP3 00000b81: DUP5 00000b82: CALLER 00000b83: PUSH1 0x40 00000b85: MLOAD 00000b86: PUSH2 0x0b92 00000b89: SWAP5 00000b8a: SWAP4 00000b8b: SWAP3 00000b8c: SWAP2 00000b8d: SWAP1 00000b8e: PUSH2 0x3f5f 00000b91: JUMP 00000b92: JUMPDEST 00000b93: PUSH1 0x40 00000b95: MLOAD 00000b96: DUP1 00000b97: SWAP2 00000b98: SUB 00000b99: SWAP1 00000b9a: LOG1 00000b9b: POP 00000b9c: POP 00000b9d: POP 00000b9e: POP 00000b9f: POP 00000ba0: POP 00000ba1: POP 00000ba2: POP 00000ba3: PUSH2 0x0baa 00000ba6: PUSH2 0x309e 00000ba9: JUMP 00000baa: JUMPDEST 00000bab: POP 00000bac: POP 00000bad: JUMP 00000bae: JUMPDEST 00000baf: PUSH1 0x00 00000bb1: DUP1 00000bb2: PUSH2 0x0bb9 00000bb5: PUSH2 0x301b 00000bb8: JUMP 00000bb9: JUMPDEST 00000bba: PUSH1 0x00 00000bbc: SWAP4 00000bbd: DUP5 00000bbe: MSTORE 00000bbf: PUSH1 0x02 00000bc1: SWAP1 00000bc2: DUP2 00000bc3: ADD 00000bc4: PUSH1 0x20 00000bc6: MSTORE 00000bc7: PUSH1 0x40 00000bc9: SWAP1 00000bca: SWAP4 00000bcb: KECCAK256 00000bcc: SLOAD 00000bcd: PUSH1 0xff 00000bcf: AND 00000bd0: SWAP1 00000bd1: SWAP3 00000bd2: EQ 00000bd3: SWAP3 00000bd4: SWAP2 00000bd5: POP 00000bd6: POP 00000bd7: JUMP 00000bd8: JUMPDEST 00000bd9: PUSH2 0x0be0 00000bdc: PUSH2 0x2fe9 00000bdf: JUMP 00000be0: JUMPDEST 00000be1: PUSH1 0x00 00000be3: PUSH2 0x0bea 00000be6: PUSH2 0x301b 00000be9: JUMP 00000bea: JUMPDEST 00000beb: SWAP1 00000bec: POP 00000bed: PUSH1 0x01 00000bef: PUSH1 0x01 00000bf1: PUSH1 0xa0 00000bf3: SHL 00000bf4: SUB 00000bf5: DUP6 00000bf6: AND 00000bf7: PUSH2 0x0c34 00000bfa: JUMPI 00000bfb: PUSH1 0x40 00000bfd: MLOAD 00000bfe: PUSH3 0x461bcd 00000c02: PUSH1 0xe5 00000c04: SHL 00000c05: DUP2 00000c06: MSTORE 00000c07: PUSH1 0x20 00000c09: PUSH1 0x04 00000c0b: DUP3 00000c0c: ADD 00000c0d: MSTORE 00000c0e: PUSH1 0x0f 00000c10: PUSH1 0x24 00000c12: DUP3 00000c13: ADD 00000c14: MSTORE 00000c15: PUSH15 0x496e76616c69642041646472657373 00000c25: PUSH1 0x88 00000c27: SHL 00000c28: PUSH1 0x44 00000c2a: DUP3 00000c2b: ADD 00000c2c: MSTORE 00000c2d: PUSH1 0x64 00000c2f: ADD 00000c30: PUSH2 0x08b3 00000c33: JUMP 00000c34: JUMPDEST 00000c35: PUSH2 0x0c42 00000c38: PUSH1 0x64 00000c3a: PUSH3 0x0f4240 00000c3e: PUSH2 0x3eea 00000c41: JUMP 00000c42: JUMPDEST 00000c43: DUP5 00000c44: GT 00000c45: ISZERO 00000c46: PUSH2 0x0c85 00000c49: JUMPI 00000c4a: PUSH1 0x40 00000c4c: MLOAD 00000c4d: PUSH3 0x461bcd 00000c51: PUSH1 0xe5 00000c53: SHL 00000c54: DUP2 00000c55: MSTORE 00000c56: PUSH1 0x20 00000c58: PUSH1 0x04 00000c5a: DUP3 00000c5b: ADD 00000c5c: MSTORE 00000c5d: PUSH1 0x11 00000c5f: PUSH1 0x24 00000c61: DUP3 00000c62: ADD 00000c63: MSTORE 00000c64: PUSH17 0x536574746c6520466565203c3d20313025 00000c76: PUSH1 0x78 00000c78: SHL 00000c79: PUSH1 0x44 00000c7b: DUP3 00000c7c: ADD 00000c7d: MSTORE 00000c7e: PUSH1 0x64 00000c80: ADD 00000c81: PUSH2 0x08b3 00000c84: JUMP 00000c85: JUMPDEST 00000c86: PUSH2 0x0c93 00000c89: PUSH1 0x64 00000c8b: PUSH3 0x0f4240 00000c8f: PUSH2 0x3eea 00000c92: JUMP 00000c93: JUMPDEST 00000c94: DUP4 00000c95: GT 00000c96: ISZERO 00000c97: PUSH2 0x0cd6 00000c9a: JUMPI 00000c9b: PUSH1 0x40 00000c9d: MLOAD 00000c9e: PUSH3 0x461bcd 00000ca2: PUSH1 0xe5 00000ca4: SHL 00000ca5: DUP2 00000ca6: MSTORE 00000ca7: PUSH1 0x20 00000ca9: PUSH1 0x04 00000cab: DUP3 00000cac: ADD 00000cad: MSTORE 00000cae: PUSH1 0x11 00000cb0: PUSH1 0x24 00000cb2: DUP3 00000cb3: ADD 00000cb4: MSTORE 00000cb5: PUSH17 0x43616e63656c20466565203c3d20313025 00000cc7: PUSH1 0x78 00000cc9: SHL 00000cca: PUSH1 0x44 00000ccc: DUP3 00000ccd: ADD 00000cce: MSTORE 00000ccf: PUSH1 0x64 00000cd1: ADD 00000cd2: PUSH2 0x08b3 00000cd5: JUMP 00000cd6: JUMPDEST 00000cd7: PUSH1 0x09 00000cd9: DUP2 00000cda: ADD 00000cdb: SLOAD 00000cdc: PUSH1 0x08 00000cde: DUP3 00000cdf: ADD 00000ce0: SLOAD 00000ce1: PUSH1 0x07 00000ce3: DUP4 00000ce4: ADD 00000ce5: SLOAD 00000ce6: PUSH1 0x06 00000ce8: DUP5 00000ce9: ADD 00000cea: SLOAD 00000ceb: PUSH1 0x40 00000ced: DUP1 00000cee: MLOAD 00000cef: PUSH1 0x01 00000cf1: PUSH1 0x01 00000cf3: PUSH1 0xa0 00000cf5: SHL 00000cf6: SUB 00000cf7: SWAP6 00000cf8: DUP7 00000cf9: AND 00000cfa: DUP2 00000cfb: MSTORE 00000cfc: PUSH1 0x20 00000cfe: DUP2 00000cff: ADD 00000d00: SWAP5 00000d01: SWAP1 00000d02: SWAP5 00000d03: MSTORE 00000d04: DUP4 00000d05: ADD 00000d06: SWAP2 00000d07: SWAP1 00000d08: SWAP2 00000d09: MSTORE 00000d0a: PUSH1 0x60 00000d0c: DUP3 00000d0d: ADD 00000d0e: MSTORE 00000d0f: SWAP1 00000d10: DUP7 00000d11: AND 00000d12: PUSH1 0x80 00000d14: DUP3 00000d15: ADD 00000d16: MSTORE 00000d17: PUSH1 0xa0 00000d19: DUP2 00000d1a: ADD 00000d1b: DUP6 00000d1c: SWAP1 00000d1d: MSTORE 00000d1e: PUSH1 0xc0 00000d20: DUP2 00000d21: ADD 00000d22: DUP5 00000d23: SWAP1 00000d24: MSTORE 00000d25: PUSH1 0xe0 00000d27: DUP2 00000d28: ADD 00000d29: DUP4 00000d2a: SWAP1 00000d2b: MSTORE 00000d2c: PUSH32 0x72fe78202ae1d56b2334bc8c804db955e2349789b271b7f55e8109f7122f0a11 00000d4d: SWAP1 00000d4e: PUSH2 0x0100 00000d51: ADD 00000d52: PUSH1 0x40 00000d54: MLOAD 00000d55: DUP1 00000d56: SWAP2 00000d57: SUB 00000d58: SWAP1 00000d59: LOG1 00000d5a: PUSH1 0x09 00000d5c: DUP2 00000d5d: ADD 00000d5e: DUP1 00000d5f: SLOAD 00000d60: PUSH1 0x01 00000d62: PUSH1 0x01 00000d64: PUSH1 0xa0 00000d66: SHL 00000d67: SUB 00000d68: NOT 00000d69: AND 00000d6a: PUSH1 0x01 00000d6c: PUSH1 0x01 00000d6e: PUSH1 0xa0 00000d70: SHL 00000d71: SUB 00000d72: SWAP7 00000d73: SWAP1 00000d74: SWAP7 00000d75: AND 00000d76: SWAP6 00000d77: SWAP1 00000d78: SWAP6 00000d79: OR 00000d7a: SWAP1 00000d7b: SWAP5 00000d7c: SSTORE 00000d7d: PUSH1 0x08 00000d7f: DUP5 00000d80: ADD 00000d81: SWAP3 00000d82: SWAP1 00000d83: SWAP3 00000d84: SSTORE 00000d85: PUSH1 0x07 00000d87: DUP4 00000d88: ADD 00000d89: SSTORE 00000d8a: PUSH1 0x06 00000d8c: SWAP1 00000d8d: SWAP2 00000d8e: ADD 00000d8f: SSTORE 00000d90: JUMP 00000d91: JUMPDEST 00000d92: PUSH2 0x0d99 00000d95: PUSH2 0x2fe9 00000d98: JUMP 00000d99: JUMPDEST 00000d9a: PUSH1 0x00 00000d9c: PUSH2 0x0da3 00000d9f: PUSH2 0x301b 00000da2: JUMP 00000da3: JUMPDEST 00000da4: PUSH1 0x00 00000da6: DUP5 00000da7: DUP2 00000da8: MSTORE 00000da9: PUSH1 0x01 00000dab: DUP3 00000dac: ADD 00000dad: PUSH1 0x20 00000daf: SWAP1 00000db0: DUP2 00000db1: MSTORE 00000db2: PUSH1 0x40 00000db4: SWAP2 00000db5: DUP3 00000db6: SWAP1 00000db7: KECCAK256 00000db8: DUP1 00000db9: SLOAD 00000dba: PUSH6 0xffffffffffff 00000dc1: DUP8 00000dc2: DUP2 00000dc3: AND 00000dc4: PUSH1 0x01 00000dc6: PUSH1 0xd0 00000dc8: SHL 00000dc9: DUP2 00000dca: DUP2 00000dcb: MUL 00000dcc: PUSH1 0x01 00000dce: PUSH1 0x01 00000dd0: PUSH1 0xd0 00000dd2: SHL 00000dd3: SUB 00000dd4: DUP6 00000dd5: AND 00000dd6: OR 00000dd7: DUP6 00000dd8: SSTORE 00000dd9: DUP7 00000dda: MLOAD 00000ddb: DUP12 00000ddc: DUP2 00000ddd: MSTORE 00000dde: SWAP4 00000ddf: DIV 00000de0: SWAP1 00000de1: SWAP2 00000de2: AND 00000de3: SWAP4 00000de4: DUP3 00000de5: ADD 00000de6: DUP5 00000de7: SWAP1 00000de8: MSTORE 00000de9: SWAP4 00000dea: DUP2 00000deb: ADD 00000dec: SWAP4 00000ded: SWAP1 00000dee: SWAP4 00000def: MSTORE 00000df0: SWAP3 00000df1: SWAP4 00000df2: POP 00000df3: SWAP1 00000df4: PUSH32 0xd5042937eda12ebddebb9d9ecaf0d88595a67d0d28513340610674acbd48274b 00000e15: SWAP1 00000e16: PUSH1 0x60 00000e18: ADD 00000e19: JUMPDEST 00000e1a: PUSH1 0x40 00000e1c: MLOAD 00000e1d: DUP1 00000e1e: SWAP2 00000e1f: SUB 00000e20: SWAP1 00000e21: LOG1 00000e22: POP 00000e23: POP 00000e24: POP 00000e25: POP 00000e26: POP 00000e27: JUMP 00000e28: JUMPDEST 00000e29: DUP3 00000e2a: DUP2 00000e2b: EQ 00000e2c: PUSH2 0x0e47 00000e2f: JUMPI 00000e30: PUSH1 0x40 00000e32: MLOAD 00000e33: PUSH3 0x461bcd 00000e37: PUSH1 0xe5 00000e39: SHL 00000e3a: DUP2 00000e3b: MSTORE 00000e3c: PUSH1 0x04 00000e3e: ADD 00000e3f: PUSH2 0x08b3 00000e42: SWAP1 00000e43: PUSH2 0x3f83 00000e46: JUMP 00000e47: JUMPDEST 00000e48: PUSH1 0x00 00000e4a: JUMPDEST 00000e4b: DUP4 00000e4c: DUP2 00000e4d: LT 00000e4e: ISZERO 00000e4f: PUSH2 0x0e9e 00000e52: JUMPI 00000e53: PUSH2 0x0e8c 00000e56: DUP6 00000e57: DUP6 00000e58: DUP4 00000e59: DUP2 00000e5a: DUP2 00000e5b: LT 00000e5c: PUSH2 0x0e67 00000e5f: JUMPI 00000e60: PUSH2 0x0e67 00000e63: PUSH2 0x3dde 00000e66: JUMP 00000e67: JUMPDEST 00000e68: SWAP1 00000e69: POP 00000e6a: PUSH1 0x20 00000e6c: MUL 00000e6d: ADD 00000e6e: CALLDATALOAD 00000e6f: DUP5 00000e70: DUP5 00000e71: DUP5 00000e72: DUP2 00000e73: DUP2 00000e74: LT 00000e75: PUSH2 0x0e80 00000e78: JUMPI 00000e79: PUSH2 0x0e80 00000e7c: PUSH2 0x3dde 00000e7f: JUMP 00000e80: JUMPDEST 00000e81: SWAP1 00000e82: POP 00000e83: PUSH1 0x20 00000e85: MUL 00000e86: ADD 00000e87: CALLDATALOAD 00000e88: PUSH2 0x0835 00000e8b: JUMP 00000e8c: JUMPDEST 00000e8d: DUP1 00000e8e: PUSH2 0x0e96 00000e91: DUP2 00000e92: PUSH2 0x3e0a 00000e95: JUMP 00000e96: JUMPDEST 00000e97: SWAP2 00000e98: POP 00000e99: POP 00000e9a: PUSH2 0x0e4a 00000e9d: JUMP 00000e9e: JUMPDEST 00000e9f: POP 00000ea0: POP 00000ea1: POP 00000ea2: POP 00000ea3: POP 00000ea4: JUMP 00000ea5: JUMPDEST 00000ea6: PUSH1 0x00 00000ea8: DUP1 00000ea9: PUSH2 0x0eb0 00000eac: PUSH2 0x301b 00000eaf: JUMP 00000eb0: JUMPDEST 00000eb1: PUSH1 0x01 00000eb3: PUSH1 0x01 00000eb5: PUSH1 0xa0 00000eb7: SHL 00000eb8: SUB 00000eb9: SWAP1 00000eba: SWAP4 00000ebb: AND 00000ebc: PUSH1 0x00 00000ebe: SWAP1 00000ebf: DUP2 00000ec0: MSTORE 00000ec1: PUSH1 0x20 00000ec3: SWAP4 00000ec4: SWAP1 00000ec5: SWAP4 00000ec6: MSTORE 00000ec7: POP 00000ec8: POP 00000ec9: PUSH1 0x40 00000ecb: SWAP1 00000ecc: KECCAK256 00000ecd: SLOAD 00000ece: PUSH1 0xff 00000ed0: AND 00000ed1: SWAP1 00000ed2: JUMP 00000ed3: JUMPDEST 00000ed4: PUSH2 0x0edb 00000ed7: PUSH2 0x2fe9 00000eda: JUMP 00000edb: JUMPDEST 00000edc: PUSH1 0x00 00000ede: PUSH2 0x0ee5 00000ee1: PUSH2 0x301b 00000ee4: JUMP 00000ee5: JUMPDEST 00000ee6: PUSH1 0x00 00000ee8: DUP6 00000ee9: DUP2 00000eea: MSTORE 00000eeb: PUSH1 0x01 00000eed: DUP3 00000eee: DUP2 00000eef: ADD 00000ef0: PUSH1 0x20 00000ef2: SWAP1 00000ef3: DUP2 00000ef4: MSTORE 00000ef5: PUSH1 0x40 00000ef7: SWAP3 00000ef8: DUP4 00000ef9: SWAP1 00000efa: KECCAK256 00000efb: DUP1 00000efc: SLOAD 00000efd: PUSH6 0xffffffffffff 00000f04: DUP10 00000f05: AND 00000f06: PUSH1 0x01 00000f08: PUSH1 0xd0 00000f0a: SHL 00000f0b: DUP2 00000f0c: MUL 00000f0d: PUSH1 0x01 00000f0f: PUSH1 0x01 00000f11: PUSH1 0xd0 00000f13: SHL 00000f14: SUB 00000f15: SWAP1 00000f16: SWAP3 00000f17: AND 00000f18: SWAP2 00000f19: SWAP1 00000f1a: SWAP2 00000f1b: OR 00000f1c: DUP3 00000f1d: SSTORE 00000f1e: PUSH1 0x02 00000f20: DUP3 00000f21: ADD 00000f22: DUP9 00000f23: SWAP1 00000f24: SSTORE 00000f25: SWAP3 00000f26: DUP2 00000f27: ADD 00000f28: DUP1 00000f29: SLOAD 00000f2a: PUSH1 0xff 00000f2c: PUSH1 0x98 00000f2e: SHL 00000f2f: NOT 00000f30: AND 00000f31: PUSH1 0x01 00000f33: PUSH1 0x98 00000f35: SHL 00000f36: OR 00000f37: SWAP1 00000f38: SSTORE 00000f39: DUP4 00000f3a: MLOAD 00000f3b: DUP10 00000f3c: DUP2 00000f3d: MSTORE 00000f3e: SWAP2 00000f3f: DUP3 00000f40: ADD 00000f41: SWAP3 00000f42: SWAP1 00000f43: SWAP3 00000f44: MSTORE 00000f45: SWAP2 00000f46: DUP3 00000f47: ADD 00000f48: DUP6 00000f49: SWAP1 00000f4a: MSTORE 00000f4b: SWAP2 00000f4c: SWAP3 00000f4d: POP 00000f4e: PUSH32 0x9e0513480601e91dca98526cffea0fce74a3e9eaf7efe15ba940450a4e4d0764 00000f6f: SWAP1 00000f70: PUSH1 0x60 00000f72: ADD 00000f73: PUSH2 0x0e19 00000f76: JUMP 00000f77: JUMPDEST 00000f78: PUSH2 0x0f7f 00000f7b: PUSH2 0x2fb3 00000f7e: JUMP 00000f7f: JUMPDEST 00000f80: DUP3 00000f81: DUP2 00000f82: EQ 00000f83: PUSH2 0x0f9e 00000f86: JUMPI 00000f87: PUSH1 0x40 00000f89: MLOAD 00000f8a: PUSH3 0x461bcd 00000f8e: PUSH1 0xe5 00000f90: SHL 00000f91: DUP2 00000f92: MSTORE 00000f93: PUSH1 0x04 00000f95: ADD 00000f96: PUSH2 0x08b3 00000f99: SWAP1 00000f9a: PUSH2 0x3f83 00000f9d: JUMP 00000f9e: JUMPDEST 00000f9f: PUSH1 0x00 00000fa1: DUP1 00000fa2: PUSH2 0x0fa9 00000fa5: PUSH2 0x301b 00000fa8: JUMP 00000fa9: JUMPDEST 00000faa: SWAP1 00000fab: POP 00000fac: PUSH1 0x00 00000fae: JUMPDEST 00000faf: DUP6 00000fb0: DUP2 00000fb1: LT 00000fb2: ISZERO 00000fb3: PUSH2 0x1096 00000fb6: JUMPI 00000fb7: PUSH1 0x00 00000fb9: DUP3 00000fba: PUSH1 0x02 00000fbc: ADD 00000fbd: PUSH1 0x00 00000fbf: DUP10 00000fc0: DUP10 00000fc1: DUP6 00000fc2: DUP2 00000fc3: DUP2 00000fc4: LT 00000fc5: PUSH2 0x0fd0 00000fc8: JUMPI 00000fc9: PUSH2 0x0fd0 00000fcc: PUSH2 0x3dde 00000fcf: JUMP 00000fd0: JUMPDEST 00000fd1: PUSH1 0x20 00000fd3: SWAP1 00000fd4: DUP2 00000fd5: MUL 00000fd6: SWAP3 00000fd7: SWAP1 00000fd8: SWAP3 00000fd9: ADD 00000fda: CALLDATALOAD 00000fdb: DUP4 00000fdc: MSTORE 00000fdd: POP 00000fde: DUP2 00000fdf: ADD 00000fe0: SWAP2 00000fe1: SWAP1 00000fe2: SWAP2 00000fe3: MSTORE 00000fe4: PUSH1 0x40 00000fe6: ADD 00000fe7: PUSH1 0x00 00000fe9: KECCAK256 00000fea: PUSH1 0x02 00000fec: DUP2 00000fed: ADD 00000fee: SLOAD 00000fef: SWAP1 00000ff0: SWAP2 00000ff1: POP 00000ff2: PUSH1 0x01 00000ff4: PUSH1 0x01 00000ff6: PUSH1 0xa0 00000ff8: SHL 00000ff9: SUB 00000ffa: AND 00000ffb: PUSH2 0x1049 00000ffe: JUMPI 00000fff: PUSH2 0x1038 00001002: DUP9 00001003: DUP9 00001004: DUP5 00001005: DUP2 00001006: DUP2 00001007: LT 00001008: PUSH2 0x1013 0000100b: JUMPI 0000100c: PUSH2 0x1013 0000100f: PUSH2 0x3dde 00001012: JUMP 00001013: JUMPDEST 00001014: SWAP1 00001015: POP 00001016: PUSH1 0x20 00001018: MUL 00001019: ADD 0000101a: CALLDATALOAD 0000101b: DUP8 0000101c: DUP8 0000101d: DUP6 0000101e: DUP2 0000101f: DUP2 00001020: LT 00001021: PUSH2 0x102c 00001024: JUMPI 00001025: PUSH2 0x102c 00001028: PUSH2 0x3dde 0000102b: JUMP 0000102c: JUMPDEST 0000102d: SWAP1 0000102e: POP 0000102f: PUSH1 0x20 00001031: MUL 00001032: ADD 00001033: CALLDATALOAD 00001034: PUSH2 0x30af 00001037: JUMP 00001038: JUMPDEST 00001039: PUSH2 0x1042 0000103c: SWAP1 0000103d: DUP6 0000103e: PUSH2 0x3f0c 00001041: JUMP 00001042: JUMPDEST 00001043: SWAP4 00001044: POP 00001045: PUSH2 0x1083 00001048: JUMP 00001049: JUMPDEST 0000104a: PUSH2 0x1083 0000104d: DUP9 0000104e: DUP9 0000104f: DUP5 00001050: DUP2 00001051: DUP2 00001052: LT 00001053: PUSH2 0x105e 00001056: JUMPI 00001057: PUSH2 0x105e 0000105a: PUSH2 0x3dde 0000105d: JUMP 0000105e: JUMPDEST 0000105f: SWAP1 00001060: POP 00001061: PUSH1 0x20 00001063: MUL 00001064: ADD 00001065: CALLDATALOAD 00001066: DUP8 00001067: DUP8 00001068: DUP6 00001069: DUP2 0000106a: DUP2 0000106b: LT 0000106c: PUSH2 0x1077 0000106f: JUMPI 00001070: PUSH2 0x1077 00001073: PUSH2 0x3dde 00001076: JUMP 00001077: JUMPDEST 00001078: SWAP1 00001079: POP 0000107a: PUSH1 0x20 0000107c: MUL 0000107d: ADD 0000107e: CALLDATALOAD 0000107f: PUSH2 0x1477 00001082: JUMP 00001083: JUMPDEST 00001084: POP 00001085: DUP1 00001086: PUSH2 0x108e 00001089: DUP2 0000108a: PUSH2 0x3e0a 0000108d: JUMP 0000108e: JUMPDEST 0000108f: SWAP2 00001090: POP 00001091: POP 00001092: PUSH2 0x0fae 00001095: JUMP 00001096: JUMPDEST 00001097: POP 00001098: DUP2 00001099: CALLVALUE 0000109a: LT 0000109b: ISZERO 0000109c: PUSH2 0x10b7 0000109f: JUMPI 000010a0: PUSH1 0x40 000010a2: MLOAD 000010a3: PUSH3 0x461bcd 000010a7: PUSH1 0xe5 000010a9: SHL 000010aa: DUP2 000010ab: MSTORE 000010ac: PUSH1 0x04 000010ae: ADD 000010af: PUSH2 0x08b3 000010b2: SWAP1 000010b3: PUSH2 0x3faa 000010b6: JUMP 000010b7: JUMPDEST 000010b8: CALLVALUE 000010b9: PUSH2 0x10c9 000010bc: DUP4 000010bd: PUSH7 0xb1a2bc2ec50000 000010c5: PUSH2 0x3f0c 000010c8: JUMP 000010c9: JUMPDEST 000010ca: GT 000010cb: PUSH2 0x10e6 000010ce: JUMPI 000010cf: PUSH1 0x40 000010d1: MLOAD 000010d2: PUSH3 0x461bcd 000010d6: PUSH1 0xe5 000010d8: SHL 000010d9: DUP2 000010da: MSTORE 000010db: PUSH1 0x04 000010dd: ADD 000010de: PUSH2 0x08b3 000010e1: SWAP1 000010e2: PUSH2 0x3fd6 000010e5: JUMP 000010e6: JUMPDEST 000010e7: POP 000010e8: POP 000010e9: PUSH2 0x10f0 000010ec: PUSH2 0x309e 000010ef: JUMP 000010f0: JUMPDEST 000010f1: POP 000010f2: POP 000010f3: POP 000010f4: POP 000010f5: JUMP 000010f6: JUMPDEST 000010f7: PUSH1 0x00 000010f9: DUP1 000010fa: PUSH2 0x1101 000010fd: PUSH2 0x301b 00001100: JUMP 00001101: JUMPDEST 00001102: PUSH1 0x05 00001104: ADD 00001105: SLOAD 00001106: SWAP3 00001107: SWAP2 00001108: POP 00001109: POP 0000110a: JUMP 0000110b: JUMPDEST 0000110c: PUSH1 0x00 0000110e: DUP1 0000110f: PUSH2 0x1116 00001112: PUSH2 0x301b 00001115: JUMP 00001116: JUMPDEST 00001117: PUSH1 0x00 00001119: SWAP4 0000111a: DUP5 0000111b: MSTORE 0000111c: PUSH1 0x02 0000111e: ADD 0000111f: PUSH1 0x20 00001121: MSTORE 00001122: POP 00001123: POP 00001124: PUSH1 0x40 00001126: SWAP1 00001127: KECCAK256 00001128: SLOAD 00001129: PUSH1 0xff 0000112b: AND 0000112c: PUSH1 0x01 0000112e: EQ 0000112f: SWAP1 00001130: JUMP 00001131: JUMPDEST 00001132: PUSH1 0x00 00001134: DUP1 00001135: PUSH2 0x113c 00001138: PUSH2 0x301b 0000113b: JUMP 0000113c: JUMPDEST 0000113d: PUSH1 0x03 0000113f: ADD 00001140: SLOAD 00001141: SWAP3 00001142: SWAP2 00001143: POP 00001144: POP 00001145: JUMP 00001146: JUMPDEST 00001147: PUSH1 0x00 00001149: JUMPDEST 0000114a: DUP2 0000114b: DUP2 0000114c: LT 0000114d: ISZERO 0000114e: PUSH2 0x0830 00001151: JUMPI 00001152: PUSH2 0x1172 00001155: DUP4 00001156: DUP4 00001157: DUP4 00001158: DUP2 00001159: DUP2 0000115a: LT 0000115b: PUSH2 0x1166 0000115e: JUMPI 0000115f: PUSH2 0x1166 00001162: PUSH2 0x3dde 00001165: JUMP 00001166: JUMPDEST 00001167: SWAP1 00001168: POP 00001169: PUSH1 0x20 0000116b: MUL 0000116c: ADD 0000116d: CALLDATALOAD 0000116e: PUSH2 0x2c81 00001171: JUMP 00001172: JUMPDEST 00001173: DUP1 00001174: PUSH2 0x117c 00001177: DUP2 00001178: PUSH2 0x3e0a 0000117b: JUMP 0000117c: JUMPDEST 0000117d: SWAP2 0000117e: POP 0000117f: POP 00001180: PUSH2 0x1149 00001183: JUMP 00001184: JUMPDEST 00001185: PUSH2 0x118c 00001188: PUSH2 0x2fe9 0000118b: JUMP 0000118c: JUMPDEST 0000118d: PUSH1 0x00 0000118f: PUSH2 0x1196 00001192: PUSH2 0x301b 00001195: JUMP 00001196: JUMPDEST 00001197: PUSH1 0x00 00001199: DUP4 0000119a: DUP2 0000119b: MSTORE 0000119c: PUSH1 0x01 0000119e: DUP3 0000119f: DUP2 000011a0: ADD 000011a1: PUSH1 0x20 000011a3: MSTORE 000011a4: PUSH1 0x40 000011a6: DUP3 000011a7: KECCAK256 000011a8: DUP1 000011a9: DUP3 000011aa: ADD 000011ab: SLOAD 000011ac: SWAP4 000011ad: SWAP5 000011ae: POP 000011af: SWAP3 000011b0: PUSH1 0x01 000011b2: PUSH1 0x98 000011b4: SHL 000011b5: SWAP1 000011b6: DIV 000011b7: PUSH1 0xff 000011b9: AND 000011ba: SWAP2 000011bb: SWAP1 000011bc: DUP3 000011bd: EQ 000011be: PUSH2 0x11c8 000011c1: JUMPI 000011c2: PUSH1 0x01 000011c4: PUSH2 0x11cb 000011c7: JUMP 000011c8: JUMPDEST 000011c9: PUSH1 0x02 000011cb: JUMPDEST 000011cc: SWAP1 000011cd: POP 000011ce: PUSH1 0xff 000011d0: DUP3 000011d1: AND 000011d2: PUSH1 0x01 000011d4: EQ 000011d5: DUP1 000011d6: PUSH2 0x11e2 000011d9: JUMPI 000011da: POP 000011db: PUSH1 0xff 000011dd: DUP3 000011de: AND 000011df: PUSH1 0x02 000011e1: EQ 000011e2: JUMPDEST 000011e3: PUSH2 0x122b 000011e6: JUMPI 000011e7: PUSH1 0x40 000011e9: MLOAD 000011ea: PUSH3 0x461bcd 000011ee: PUSH1 0xe5 000011f0: SHL 000011f1: DUP2 000011f2: MSTORE 000011f3: PUSH1 0x20 000011f5: PUSH1 0x04 000011f7: DUP3 000011f8: ADD 000011f9: MSTORE 000011fa: PUSH1 0x1a 000011fc: PUSH1 0x24 000011fe: DUP3 000011ff: ADD 00001200: MSTORE 00001201: PUSH26 0x43616e6e6f74204368616e676520546f6b656e20537461747573 0000121c: PUSH1 0x30 0000121e: SHL 0000121f: PUSH1 0x44 00001221: DUP3 00001222: ADD 00001223: MSTORE 00001224: PUSH1 0x64 00001226: ADD 00001227: PUSH2 0x08b3 0000122a: JUMP 0000122b: JUMPDEST 0000122c: PUSH1 0x01 0000122e: DUP4 0000122f: ADD 00001230: DUP1 00001231: SLOAD 00001232: PUSH1 0xff 00001234: DUP4 00001235: DUP2 00001236: AND 00001237: PUSH1 0x01 00001239: PUSH1 0x98 0000123b: SHL 0000123c: DUP2 0000123d: MUL 0000123e: PUSH1 0xff 00001240: PUSH1 0x98 00001242: SHL 00001243: NOT 00001244: SWAP1 00001245: SWAP4 00001246: AND 00001247: SWAP3 00001248: SWAP1 00001249: SWAP3 0000124a: OR 0000124b: SWAP1 0000124c: SWAP3 0000124d: SSTORE 0000124e: PUSH1 0x40 00001250: DUP1 00001251: MLOAD 00001252: DUP9 00001253: DUP2 00001254: MSTORE 00001255: SWAP3 00001256: DUP6 00001257: AND 00001258: PUSH1 0x20 0000125a: DUP5 0000125b: ADD 0000125c: MSTORE 0000125d: DUP3 0000125e: ADD 0000125f: MSTORE 00001260: PUSH32 0x853e3a954af7889419a6922a1bc350b54c6217937a4a2aed1176ed3f5a1dfb52 00001281: SWAP1 00001282: PUSH1 0x60 00001284: ADD 00001285: PUSH2 0x0e19 00001288: JUMP 00001289: JUMPDEST 0000128a: PUSH2 0x1291 0000128d: PUSH2 0x2fe9 00001290: JUMP 00001291: JUMPDEST 00001292: PUSH2 0x129b 00001295: PUSH1 0x00 00001297: PUSH2 0x330e 0000129a: JUMP 0000129b: JUMPDEST 0000129c: JUMP 0000129d: JUMPDEST 0000129e: PUSH2 0x12a5 000012a1: PUSH2 0x2fe9 000012a4: JUMP 000012a5: JUMPDEST 000012a6: PUSH1 0x00 000012a8: PUSH2 0x12af 000012ab: PUSH2 0x301b 000012ae: JUMP 000012af: JUMPDEST 000012b0: PUSH1 0x00 000012b2: DUP4 000012b3: DUP2 000012b4: MSTORE 000012b5: PUSH1 0x01 000012b7: DUP1 000012b8: DUP4 000012b9: ADD 000012ba: PUSH1 0x20 000012bc: MSTORE 000012bd: PUSH1 0x40 000012bf: SWAP1 000012c0: SWAP2 000012c1: KECCAK256 000012c2: SWAP1 000012c3: DUP2 000012c4: ADD 000012c5: SLOAD 000012c6: SWAP2 000012c7: SWAP3 000012c8: POP 000012c9: SWAP1 000012ca: PUSH1 0x01 000012cc: PUSH1 0x98 000012ce: SHL 000012cf: SWAP1 000012d0: DIV 000012d1: PUSH1 0xff 000012d3: AND 000012d4: PUSH1 0x03 000012d6: EQ 000012d7: PUSH2 0x12f2 000012da: JUMPI 000012db: PUSH1 0x40 000012dd: MLOAD 000012de: PUSH3 0x461bcd 000012e2: PUSH1 0xe5 000012e4: SHL 000012e5: DUP2 000012e6: MSTORE 000012e7: PUSH1 0x04 000012e9: ADD 000012ea: PUSH2 0x08b3 000012ed: SWAP1 000012ee: PUSH2 0x4001 000012f1: JUMP 000012f2: JUMPDEST 000012f3: PUSH1 0x01 000012f5: DUP2 000012f6: ADD 000012f7: DUP1 000012f8: SLOAD 000012f9: PUSH1 0xff 000012fb: PUSH1 0x98 000012fd: SHL 000012fe: NOT 000012ff: AND 00001300: PUSH1 0x01 00001302: PUSH1 0x99 00001304: SHL 00001305: OR 00001306: SWAP1 00001307: SSTORE 00001308: PUSH1 0x40 0000130a: MLOAD 0000130b: DUP4 0000130c: DUP2 0000130d: MSTORE 0000130e: PUSH32 0x6ac56c552b96d07b41e8ee97200f747e7476892e0e2e53e9803199bfe014b0a8 0000132f: SWAP1 00001330: PUSH1 0x20 00001332: ADD 00001333: PUSH1 0x40 00001335: MLOAD 00001336: DUP1 00001337: SWAP2 00001338: SUB 00001339: SWAP1 0000133a: LOG1 0000133b: POP 0000133c: POP 0000133d: POP 0000133e: JUMP 0000133f: JUMPDEST 00001340: PUSH2 0x1347 00001343: PUSH2 0x2fb3 00001346: JUMP 00001347: JUMPDEST 00001348: PUSH1 0x00 0000134a: PUSH2 0x1351 0000134d: PUSH2 0x301b 00001350: JUMP 00001351: JUMPDEST 00001352: PUSH1 0x00 00001354: DUP7 00001355: DUP2 00001356: MSTORE 00001357: PUSH1 0x01 00001359: DUP1 0000135a: DUP4 0000135b: ADD 0000135c: PUSH1 0x20 0000135e: MSTORE 0000135f: PUSH1 0x40 00001361: SWAP1 00001362: SWAP2 00001363: KECCAK256 00001364: DUP1 00001365: DUP3 00001366: ADD 00001367: SLOAD 00001368: SWAP3 00001369: SWAP4 0000136a: POP 0000136b: SWAP2 0000136c: PUSH1 0x01 0000136e: PUSH1 0x98 00001370: SHL 00001371: SWAP1 00001372: DIV 00001373: PUSH1 0xff 00001375: AND 00001376: EQ 00001377: PUSH2 0x1392 0000137a: JUMPI 0000137b: PUSH1 0x40 0000137d: MLOAD 0000137e: PUSH3 0x461bcd 00001382: PUSH1 0xe5 00001384: SHL 00001385: DUP2 00001386: MSTORE 00001387: PUSH1 0x04 00001389: ADD 0000138a: PUSH2 0x08b3 0000138d: SWAP1 0000138e: PUSH2 0x402f 00001391: JUMP 00001392: JUMPDEST 00001393: PUSH1 0x00 00001395: DUP6 00001396: GT 00001397: DUP1 00001398: ISZERO 00001399: PUSH2 0x13a2 0000139c: JUMPI 0000139d: POP 0000139e: PUSH1 0x00 000013a0: DUP5 000013a1: GT 000013a2: JUMPDEST 000013a3: PUSH2 0x13be 000013a6: JUMPI 000013a7: PUSH1 0x40 000013a9: MLOAD 000013aa: PUSH3 0x461bcd 000013ae: PUSH1 0xe5 000013b0: SHL 000013b1: DUP2 000013b2: MSTORE 000013b3: PUSH1 0x04 000013b5: ADD 000013b6: PUSH2 0x08b3 000013b9: SWAP1 000013ba: PUSH2 0x4056 000013bd: JUMP 000013be: JUMPDEST 000013bf: DUP3 000013c0: DUP6 000013c1: LT 000013c2: ISZERO 000013c3: PUSH2 0x13de 000013c6: JUMPI 000013c7: PUSH1 0x40 000013c9: MLOAD 000013ca: PUSH3 0x461bcd 000013ce: PUSH1 0xe5 000013d0: SHL 000013d1: DUP2 000013d2: MSTORE 000013d3: PUSH1 0x04 000013d5: ADD 000013d6: PUSH2 0x08b3 000013d9: SWAP1 000013da: PUSH2 0x4087 000013dd: JUMP 000013de: JUMPDEST 000013df: DUP1 000013e0: PUSH1 0x02 000013e2: ADD 000013e3: SLOAD 000013e4: DUP4 000013e5: LT 000013e6: ISZERO 000013e7: PUSH2 0x1402 000013ea: JUMPI 000013eb: PUSH1 0x40 000013ed: MLOAD 000013ee: PUSH3 0x461bcd 000013f2: PUSH1 0xe5 000013f4: SHL 000013f5: DUP2 000013f6: MSTORE 000013f7: PUSH1 0x04 000013f9: ADD 000013fa: PUSH2 0x08b3 000013fd: SWAP1 000013fe: PUSH2 0x40d9 00001401: JUMP 00001402: JUMPDEST 00001403: PUSH1 0x06 00001405: DUP3 00001406: ADD 00001407: SLOAD 00001408: PUSH1 0x00 0000140a: SWAP1 0000140b: PUSH3 0x0f4240 0000140f: SWAP1 00001410: PUSH2 0x1419 00001413: SWAP1 00001414: DUP8 00001415: PUSH2 0x3ed3 00001418: JUMP 00001419: JUMPDEST 0000141a: PUSH2 0x1423 0000141d: SWAP2 0000141e: SWAP1 0000141f: PUSH2 0x3eea 00001422: JUMP 00001423: JUMPDEST 00001424: SWAP1 00001425: POP 00001426: PUSH1 0x00 00001428: PUSH1 0xff 0000142a: DUP10 0000142b: AND 0000142c: PUSH1 0x01 0000142e: EQ 0000142f: PUSH2 0x1438 00001432: JUMPI 00001433: DUP2 00001434: PUSH2 0x143a 00001437: JUMP 00001438: JUMPDEST 00001439: DUP6 0000143a: JUMPDEST 0000143b: SWAP1 0000143c: POP 0000143d: CALLVALUE 0000143e: DUP2 0000143f: EQ 00001440: PUSH2 0x145b 00001443: JUMPI 00001444: PUSH1 0x40 00001446: MLOAD 00001447: PUSH3 0x461bcd 0000144b: PUSH1 0xe5 0000144d: SHL 0000144e: DUP2 0000144f: MSTORE 00001450: PUSH1 0x04 00001452: ADD 00001453: PUSH2 0x08b3 00001456: SWAP1 00001457: PUSH2 0x3faa 0000145a: JUMP 0000145b: JUMPDEST 0000145c: PUSH2 0x146b 0000145f: DUP10 00001460: DUP10 00001461: PUSH1 0x00 00001463: DUP11 00001464: DUP11 00001465: DUP8 00001466: DUP12 00001467: PUSH2 0x336a 0000146a: JUMP 0000146b: JUMPDEST 0000146c: POP 0000146d: POP 0000146e: POP 0000146f: POP 00001470: PUSH2 0x0e9e 00001473: PUSH2 0x309e 00001476: JUMP 00001477: JUMPDEST 00001478: PUSH1 0x00 0000147a: PUSH2 0x1481 0000147d: PUSH2 0x301b 00001480: JUMP 00001481: JUMPDEST 00001482: PUSH1 0x00 00001484: DUP5 00001485: DUP2 00001486: MSTORE 00001487: PUSH1 0x02 00001489: DUP3 0000148a: ADD 0000148b: PUSH1 0x20 0000148d: SWAP1 0000148e: DUP2 0000148f: MSTORE 00001490: PUSH1 0x40 00001492: DUP1 00001493: DUP4 00001494: KECCAK256 00001495: PUSH1 0x01 00001497: DUP1 00001498: DUP3 00001499: ADD 0000149a: SLOAD 0000149b: DUP6 0000149c: MSTORE 0000149d: DUP1 0000149e: DUP7 0000149f: ADD 000014a0: SWAP1 000014a1: SWAP4 000014a2: MSTORE 000014a3: SWAP3 000014a4: KECCAK256 000014a5: PUSH1 0x07 000014a7: DUP4 000014a8: ADD 000014a9: SLOAD 000014aa: SWAP4 000014ab: SWAP5 000014ac: POP 000014ad: SWAP2 000014ae: SWAP3 000014af: PUSH1 0xff 000014b1: AND 000014b2: EQ 000014b3: PUSH2 0x14ce 000014b6: JUMPI 000014b7: PUSH1 0x40 000014b9: MLOAD 000014ba: PUSH3 0x461bcd 000014be: PUSH1 0xe5 000014c0: SHL 000014c1: DUP2 000014c2: MSTORE 000014c3: PUSH1 0x04 000014c5: ADD 000014c6: PUSH2 0x08b3 000014c9: SWAP1 000014ca: PUSH2 0x4137 000014cd: JUMP 000014ce: JUMPDEST 000014cf: PUSH1 0x01 000014d1: DUP2 000014d2: DUP2 000014d3: ADD 000014d4: SLOAD 000014d5: PUSH1 0x01 000014d7: PUSH1 0x98 000014d9: SHL 000014da: SWAP1 000014db: DIV 000014dc: PUSH1 0xff 000014de: AND 000014df: EQ 000014e0: PUSH2 0x14fb 000014e3: JUMPI 000014e4: PUSH1 0x40 000014e6: MLOAD 000014e7: PUSH3 0x461bcd 000014eb: PUSH1 0xe5 000014ed: SHL 000014ee: DUP2 000014ef: MSTORE 000014f0: PUSH1 0x04 000014f2: ADD 000014f3: PUSH2 0x08b3 000014f6: SWAP1 000014f7: PUSH2 0x4165 000014fa: JUMP 000014fb: JUMPDEST 000014fc: PUSH1 0x00 000014fe: DUP5 000014ff: GT 00001500: PUSH2 0x151b 00001503: JUMPI 00001504: PUSH1 0x40 00001506: MLOAD 00001507: PUSH3 0x461bcd 0000150b: PUSH1 0xe5 0000150d: SHL 0000150e: DUP2 0000150f: MSTORE 00001510: PUSH1 0x04 00001512: ADD 00001513: PUSH2 0x08b3 00001516: SWAP1 00001517: PUSH2 0x4193 0000151a: JUMP 0000151b: JUMPDEST 0000151c: DUP4 0000151d: DUP3 0000151e: PUSH1 0x06 00001520: ADD 00001521: SLOAD 00001522: DUP4 00001523: PUSH1 0x03 00001525: ADD 00001526: SLOAD 00001527: PUSH2 0x1530 0000152a: SWAP2 0000152b: SWAP1 0000152c: PUSH2 0x3f1f 0000152f: JUMP 00001530: JUMPDEST 00001531: LT 00001532: ISZERO 00001533: PUSH2 0x154e 00001536: JUMPI 00001537: PUSH1 0x40 00001539: MLOAD 0000153a: PUSH3 0x461bcd 0000153e: PUSH1 0xe5 00001540: SHL 00001541: DUP2 00001542: MSTORE 00001543: PUSH1 0x04 00001545: ADD 00001546: PUSH2 0x08b3 00001549: SWAP1 0000154a: PUSH2 0x41bb 0000154d: JUMP 0000154e: JUMPDEST 0000154f: DUP2 00001550: PUSH1 0x08 00001552: ADD 00001553: SLOAD 00001554: DUP3 00001555: PUSH1 0x06 00001557: ADD 00001558: SLOAD 00001559: DUP4 0000155a: PUSH1 0x03 0000155c: ADD 0000155d: SLOAD 0000155e: PUSH2 0x1567 00001561: SWAP2 00001562: SWAP1 00001563: PUSH2 0x3f1f 00001566: JUMP 00001567: JUMPDEST 00001568: GT 00001569: ISZERO 0000156a: PUSH2 0x15c2 0000156d: JUMPI 0000156e: DUP2 0000156f: PUSH1 0x08 00001571: ADD 00001572: SLOAD 00001573: DUP5 00001574: LT 00001575: ISZERO 00001576: PUSH2 0x15bd 00001579: JUMPI 0000157a: PUSH1 0x40 0000157c: MLOAD 0000157d: PUSH3 0x461bcd 00001581: PUSH1 0xe5 00001583: SHL 00001584: DUP2 00001585: MSTORE 00001586: PUSH1 0x20 00001588: PUSH1 0x04 0000158a: DUP3 0000158b: ADD 0000158c: MSTORE 0000158d: PUSH1 0x25 0000158f: PUSH1 0x24 00001591: DUP3 00001592: ADD 00001593: MSTORE 00001594: PUSH1 0x00 00001596: DUP1 00001597: MLOAD 00001598: PUSH1 0x20 0000159a: PUSH2 0x43b8 0000159d: DUP4 0000159e: CODECOPY 0000159f: DUP2 000015a0: MLOAD 000015a1: SWAP2 000015a2: MSTORE 000015a3: PUSH1 0x44 000015a5: DUP3 000015a6: ADD 000015a7: MSTORE 000015a8: PUSH5 0x1b5bdd5b9d 000015ae: PUSH1 0xda 000015b0: SHL 000015b1: PUSH1 0x64 000015b3: DUP3 000015b4: ADD 000015b5: MSTORE 000015b6: PUSH1 0x84 000015b8: ADD 000015b9: PUSH2 0x08b3 000015bc: JUMP 000015bd: JUMPDEST 000015be: PUSH2 0x15f4 000015c1: JUMP 000015c2: JUMPDEST 000015c3: DUP2 000015c4: PUSH1 0x06 000015c6: ADD 000015c7: SLOAD 000015c8: DUP3 000015c9: PUSH1 0x03 000015cb: ADD 000015cc: SLOAD 000015cd: PUSH2 0x15d6 000015d0: SWAP2 000015d1: SWAP1 000015d2: PUSH2 0x3f1f 000015d5: JUMP 000015d6: JUMPDEST 000015d7: DUP5 000015d8: EQ 000015d9: PUSH2 0x15f4 000015dc: JUMPI 000015dd: PUSH1 0x40 000015df: MLOAD 000015e0: PUSH3 0x461bcd 000015e4: PUSH1 0xe5 000015e6: SHL 000015e7: DUP2 000015e8: MSTORE 000015e9: PUSH1 0x04 000015eb: ADD 000015ec: PUSH2 0x08b3 000015ef: SWAP1 000015f0: PUSH2 0x41ed 000015f3: JUMP 000015f4: JUMPDEST 000015f5: PUSH1 0x02 000015f7: DUP3 000015f8: ADD 000015f9: SLOAD 000015fa: PUSH1 0x01 000015fc: PUSH1 0x01 000015fe: PUSH1 0xa0 00001600: SHL 00001601: SUB 00001602: AND 00001603: PUSH2 0x161e 00001606: JUMPI 00001607: PUSH1 0x40 00001609: MLOAD 0000160a: PUSH3 0x461bcd 0000160e: PUSH1 0xe5 00001610: SHL 00001611: DUP2 00001612: MSTORE 00001613: PUSH1 0x04 00001615: ADD 00001616: PUSH2 0x08b3 00001619: SWAP1 0000161a: PUSH2 0x4242 0000161d: JUMP 0000161e: JUMPDEST 0000161f: PUSH1 0x02 00001621: DUP3 00001622: ADD 00001623: SLOAD 00001624: DUP3 00001625: SLOAD 00001626: PUSH1 0x01 00001628: PUSH1 0x01 0000162a: PUSH1 0xa0 0000162c: SHL 0000162d: SUB 0000162e: SWAP1 0000162f: SWAP2 00001630: AND 00001631: SWAP1 00001632: PUSH1 0x00 00001634: SWAP1 00001635: DUP2 00001636: SWAP1 00001637: DUP2 00001638: SWAP1 00001639: PUSH1 0xff 0000163b: AND 0000163c: PUSH1 0x00 0000163e: NOT 0000163f: ADD 00001640: PUSH2 0x1682 00001643: JUMPI 00001644: DUP6 00001645: PUSH1 0x03 00001647: ADD 00001648: SLOAD 00001649: DUP9 0000164a: DUP8 0000164b: PUSH1 0x05 0000164d: ADD 0000164e: SLOAD 0000164f: PUSH2 0x1658 00001652: SWAP2 00001653: SWAP1 00001654: PUSH2 0x3ed3 00001657: JUMP 00001658: JUMPDEST 00001659: PUSH2 0x1662 0000165c: SWAP2 0000165d: SWAP1 0000165e: PUSH2 0x3eea 00001661: JUMP 00001662: JUMPDEST 00001663: PUSH1 0x07 00001665: DUP8 00001666: ADD 00001667: SLOAD 00001668: SWAP1 00001669: SWAP4 0000166a: POP 0000166b: PUSH2 0x0100 0000166e: SWAP1 0000166f: DIV 00001670: PUSH1 0x01 00001672: PUSH1 0x01 00001674: PUSH1 0xa0 00001676: SHL 00001677: SUB 00001678: AND 00001679: SWAP2 0000167a: POP 0000167b: CALLER 0000167c: SWAP1 0000167d: POP 0000167e: PUSH2 0x16bd 00001681: JUMP 00001682: JUMPDEST 00001683: DUP6 00001684: PUSH1 0x03 00001686: ADD 00001687: SLOAD 00001688: DUP9 00001689: DUP8 0000168a: PUSH1 0x04 0000168c: ADD 0000168d: SLOAD 0000168e: PUSH2 0x1697 00001691: SWAP2 00001692: SWAP1 00001693: PUSH2 0x3ed3 00001696: JUMP 00001697: JUMPDEST 00001698: PUSH2 0x16a1 0000169b: SWAP2 0000169c: SWAP1 0000169d: PUSH2 0x3eea 000016a0: JUMP 000016a1: JUMPDEST 000016a2: PUSH1 0x07 000016a4: DUP8 000016a5: ADD 000016a6: SLOAD 000016a7: SWAP1 000016a8: SWAP4 000016a9: POP 000016aa: CALLER 000016ab: SWAP3 000016ac: POP 000016ad: PUSH2 0x0100 000016b0: SWAP1 000016b1: DIV 000016b2: PUSH1 0x01 000016b4: PUSH1 0x01 000016b6: PUSH1 0xa0 000016b8: SHL 000016b9: SUB 000016ba: AND 000016bb: SWAP1 000016bc: POP 000016bd: JUMPDEST 000016be: PUSH2 0x16d2 000016c1: PUSH1 0x01 000016c3: PUSH1 0x01 000016c5: PUSH1 0xa0 000016c7: SHL 000016c8: SUB 000016c9: DUP6 000016ca: AND 000016cb: CALLER 000016cc: ADDRESS 000016cd: DUP7 000016ce: PUSH2 0x354b 000016d1: JUMP 000016d2: JUMPDEST 000016d3: PUSH2 0x16de 000016d6: DUP10 000016d7: DUP10 000016d8: DUP5 000016d9: DUP5 000016da: PUSH2 0x3584 000016dd: JUMP 000016de: JUMPDEST 000016df: POP 000016e0: POP 000016e1: POP 000016e2: POP 000016e3: POP 000016e4: POP 000016e5: POP 000016e6: POP 000016e7: POP 000016e8: JUMP 000016e9: JUMPDEST 000016ea: PUSH2 0x171d 000016ed: PUSH1 0x40 000016ef: MLOAD 000016f0: DUP1 000016f1: PUSH1 0x80 000016f3: ADD 000016f4: PUSH1 0x40 000016f6: MSTORE 000016f7: DUP1 000016f8: PUSH1 0x00 000016fa: DUP2 000016fb: MSTORE 000016fc: PUSH1 0x20 000016fe: ADD 000016ff: PUSH1 0x00 00001701: DUP2 00001702: MSTORE 00001703: PUSH1 0x20 00001705: ADD 00001706: PUSH1 0x00 00001708: DUP2 00001709: MSTORE 0000170a: PUSH1 0x20 0000170c: ADD 0000170d: PUSH1 0x00 0000170f: PUSH1 0x01 00001711: PUSH1 0x01 00001713: PUSH1 0xa0 00001715: SHL 00001716: SUB 00001717: AND 00001718: DUP2 00001719: MSTORE 0000171a: POP 0000171b: SWAP1 0000171c: JUMP 0000171d: JUMPDEST 0000171e: PUSH1 0x00 00001720: PUSH2 0x1727 00001723: PUSH2 0x301b 00001726: JUMP 00001727: JUMPDEST 00001728: PUSH1 0x40 0000172a: DUP1 0000172b: MLOAD 0000172c: PUSH1 0x80 0000172e: DUP2 0000172f: ADD 00001730: DUP3 00001731: MSTORE 00001732: PUSH1 0x06 00001734: DUP4 00001735: ADD 00001736: SLOAD 00001737: DUP2 00001738: MSTORE 00001739: PUSH1 0x07 0000173b: DUP4 0000173c: ADD 0000173d: SLOAD 0000173e: PUSH1 0x20 00001740: DUP3 00001741: ADD 00001742: MSTORE 00001743: PUSH1 0x08 00001745: DUP4 00001746: ADD 00001747: SLOAD 00001748: SWAP2 00001749: DUP2 0000174a: ADD 0000174b: SWAP2 0000174c: SWAP1 0000174d: SWAP2 0000174e: MSTORE 0000174f: PUSH1 0x09 00001751: SWAP1 00001752: SWAP2 00001753: ADD 00001754: SLOAD 00001755: PUSH1 0x01 00001757: PUSH1 0x01 00001759: PUSH1 0xa0 0000175b: SHL 0000175c: SUB 0000175d: AND 0000175e: PUSH1 0x60 00001760: DUP3 00001761: ADD 00001762: MSTORE 00001763: SWAP3 00001764: SWAP2 00001765: POP 00001766: POP 00001767: JUMP 00001768: JUMPDEST 00001769: PUSH1 0x00 0000176b: PUSH2 0x1772 0000176e: PUSH2 0x3752 00001771: JUMP 00001772: JUMPDEST 00001773: DUP1 00001774: SLOAD 00001775: SWAP1 00001776: SWAP2 00001777: POP 00001778: PUSH1 0xff 0000177a: PUSH1 0x01 0000177c: PUSH1 0x40 0000177e: SHL 0000177f: DUP3 00001780: DIV 00001781: AND 00001782: ISZERO 00001783: SWAP1 00001784: PUSH1 0x01 00001786: PUSH1 0x01 00001788: PUSH1 0x40 0000178a: SHL 0000178b: SUB 0000178c: AND 0000178d: PUSH1 0x00 0000178f: DUP2 00001790: ISZERO 00001791: DUP1 00001792: ISZERO 00001793: PUSH2 0x1799 00001796: JUMPI 00001797: POP 00001798: DUP3 00001799: JUMPDEST 0000179a: SWAP1 0000179b: POP 0000179c: PUSH1 0x00 0000179e: DUP3 0000179f: PUSH1 0x01 000017a1: PUSH1 0x01 000017a3: PUSH1 0x40 000017a5: SHL 000017a6: SUB 000017a7: AND 000017a8: PUSH1 0x01 000017aa: EQ 000017ab: DUP1 000017ac: ISZERO 000017ad: PUSH2 0x17b5 000017b0: JUMPI 000017b1: POP 000017b2: ADDRESS 000017b3: EXTCODESIZE 000017b4: ISZERO 000017b5: JUMPDEST 000017b6: SWAP1 000017b7: POP 000017b8: DUP2 000017b9: ISZERO 000017ba: DUP1 000017bb: ISZERO 000017bc: PUSH2 0x17c3 000017bf: JUMPI 000017c0: POP 000017c1: DUP1 000017c2: ISZERO 000017c3: JUMPDEST 000017c4: ISZERO 000017c5: PUSH2 0x17e1 000017c8: JUMPI 000017c9: PUSH1 0x40 000017cb: MLOAD 000017cc: PUSH4 0xf92ee8a9 000017d1: PUSH1 0xe0 000017d3: SHL 000017d4: DUP2 000017d5: MSTORE 000017d6: PUSH1 0x04 000017d8: ADD 000017d9: PUSH1 0x40 000017db: MLOAD 000017dc: DUP1 000017dd: SWAP2 000017de: SUB 000017df: SWAP1 000017e0: REVERT 000017e1: JUMPDEST 000017e2: DUP5 000017e3: SLOAD 000017e4: PUSH1 0x01 000017e6: PUSH1 0x01 000017e8: PUSH1 0x40 000017ea: SHL 000017eb: SUB 000017ec: NOT 000017ed: AND 000017ee: PUSH1 0x01 000017f0: OR 000017f1: DUP6 000017f2: SSTORE 000017f3: DUP4 000017f4: ISZERO 000017f5: PUSH2 0x180a 000017f8: JUMPI 000017f9: DUP5 000017fa: SLOAD 000017fb: PUSH1 0xff 000017fd: PUSH1 0x40 000017ff: SHL 00001800: NOT 00001801: AND 00001802: PUSH1 0x01 00001804: PUSH1 0x40 00001806: SHL 00001807: OR 00001808: DUP6 00001809: SSTORE 0000180a: JUMPDEST 0000180b: PUSH2 0x1813 0000180e: CALLER 0000180f: PUSH2 0x3776 00001812: JUMP 00001813: JUMPDEST 00001814: PUSH1 0x00 00001816: PUSH2 0x181d 00001819: PUSH2 0x301b 0000181c: JUMP 0000181d: JUMPDEST 0000181e: PUSH3 0x0f4240 00001822: PUSH1 0x06 00001824: DUP3 00001825: ADD 00001826: SSTORE 00001827: SWAP1 00001828: POP 00001829: PUSH2 0x1830 0000182c: PUSH2 0x1b93 0000182f: JUMP 00001830: JUMPDEST 00001831: PUSH1 0x09 00001833: DUP3 00001834: ADD 00001835: DUP1 00001836: SLOAD 00001837: PUSH1 0x01 00001839: PUSH1 0x01 0000183b: PUSH1 0xa0 0000183d: SHL 0000183e: SUB 0000183f: NOT 00001840: AND 00001841: PUSH1 0x01 00001843: PUSH1 0x01 00001845: PUSH1 0xa0 00001847: SHL 00001848: SUB 00001849: SWAP3 0000184a: SWAP1 0000184b: SWAP3 0000184c: AND 0000184d: SWAP2 0000184e: SWAP1 0000184f: SWAP2 00001850: OR 00001851: SWAP1 00001852: SSTORE 00001853: PUSH2 0x1860 00001856: PUSH1 0xc8 00001858: PUSH3 0x0f4240 0000185c: PUSH2 0x3eea 0000185f: JUMP 00001860: JUMPDEST 00001861: PUSH1 0x08 00001863: DUP3 00001864: ADD 00001865: SSTORE 00001866: PUSH1 0x00 00001868: PUSH1 0x07 0000186a: SWAP1 0000186b: SWAP2 0000186c: ADD 0000186d: SSTORE 0000186e: DUP4 0000186f: ISZERO 00001870: PUSH2 0x0e9e 00001873: JUMPI 00001874: DUP5 00001875: SLOAD 00001876: PUSH1 0xff 00001878: PUSH1 0x40 0000187a: SHL 0000187b: NOT 0000187c: AND 0000187d: DUP6 0000187e: SSTORE 0000187f: PUSH1 0x40 00001881: MLOAD 00001882: PUSH1 0x01 00001884: DUP2 00001885: MSTORE 00001886: PUSH32 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2 000018a7: SWAP1 000018a8: PUSH1 0x20 000018aa: ADD 000018ab: PUSH2 0x0e19 000018ae: JUMP 000018af: JUMPDEST 000018b0: PUSH2 0x18b7 000018b3: PUSH2 0x2fb3 000018b6: JUMP 000018b7: JUMPDEST 000018b8: PUSH1 0x00 000018ba: PUSH2 0x18c3 000018bd: DUP4 000018be: DUP4 000018bf: PUSH2 0x30af 000018c2: JUMP 000018c3: JUMPDEST 000018c4: SWAP1 000018c5: POP 000018c6: DUP1 000018c7: CALLVALUE 000018c8: LT 000018c9: ISZERO 000018ca: PUSH2 0x18e5 000018cd: JUMPI 000018ce: PUSH1 0x40 000018d0: MLOAD 000018d1: PUSH3 0x461bcd 000018d5: PUSH1 0xe5 000018d7: SHL 000018d8: DUP2 000018d9: MSTORE 000018da: PUSH1 0x04 000018dc: ADD 000018dd: PUSH2 0x08b3 000018e0: SWAP1 000018e1: PUSH2 0x3faa 000018e4: JUMP 000018e5: JUMPDEST 000018e6: CALLVALUE 000018e7: PUSH2 0x18f7 000018ea: DUP3 000018eb: PUSH7 0xb1a2bc2ec50000 000018f3: PUSH2 0x3f0c 000018f6: JUMP 000018f7: JUMPDEST 000018f8: GT 000018f9: PUSH2 0x1914 000018fc: JUMPI 000018fd: PUSH1 0x40 000018ff: MLOAD 00001900: PUSH3 0x461bcd 00001904: PUSH1 0xe5 00001906: SHL 00001907: DUP2 00001908: MSTORE 00001909: PUSH1 0x04 0000190b: ADD 0000190c: PUSH2 0x08b3 0000190f: SWAP1 00001910: PUSH2 0x3fd6 00001913: JUMP 00001914: JUMPDEST 00001915: POP 00001916: PUSH2 0x0baa 00001919: PUSH2 0x309e 0000191c: JUMP 0000191d: JUMPDEST 0000191e: PUSH2 0x1925 00001921: PUSH2 0x2fe9 00001924: JUMP 00001925: JUMPDEST 00001926: PUSH1 0x00 00001928: PUSH2 0x192f 0000192b: PUSH2 0x301b 0000192e: JUMP 0000192f: JUMPDEST 00001930: PUSH1 0x00 00001932: DUP6 00001933: DUP2 00001934: MSTORE 00001935: PUSH1 0x01 00001937: DUP3 00001938: ADD 00001939: PUSH1 0x20 0000193b: MSTORE 0000193c: PUSH1 0x40 0000193e: SWAP1 0000193f: KECCAK256 00001940: SWAP1 00001941: SWAP2 00001942: POP 00001943: PUSH1 0x01 00001945: PUSH1 0x01 00001947: PUSH1 0xa0 00001949: SHL 0000194a: SUB 0000194b: DUP5 0000194c: AND 0000194d: PUSH2 0x1968 00001950: JUMPI 00001951: PUSH1 0x40 00001953: MLOAD 00001954: PUSH3 0x461bcd 00001958: PUSH1 0xe5 0000195a: SHL 0000195b: DUP2 0000195c: MSTORE 0000195d: PUSH1 0x04 0000195f: ADD 00001960: PUSH2 0x08b3 00001963: SWAP1 00001964: PUSH2 0x426f 00001967: JUMP 00001968: JUMPDEST 00001969: PUSH1 0x00 0000196b: DUP4 0000196c: PUSH1 0x01 0000196e: PUSH1 0x01 00001970: PUSH1 0x98 00001972: SHL 00001973: SUB 00001974: AND 00001975: GT 00001976: PUSH2 0x19b7 00001979: JUMPI 0000197a: PUSH1 0x40 0000197c: MLOAD 0000197d: PUSH3 0x461bcd 00001981: PUSH1 0xe5 00001983: SHL 00001984: DUP2 00001985: MSTORE 00001986: PUSH1 0x20 00001988: PUSH1 0x04 0000198a: DUP3 0000198b: ADD 0000198c: MSTORE 0000198d: PUSH1 0x13 0000198f: PUSH1 0x24 00001991: DUP3 00001992: ADD 00001993: MSTORE 00001994: PUSH19 0x496e76616c696420536574746c652052617465 000019a8: PUSH1 0x68 000019aa: SHL 000019ab: PUSH1 0x44 000019ad: DUP3 000019ae: ADD 000019af: MSTORE 000019b0: PUSH1 0x64 000019b2: ADD 000019b3: PUSH2 0x08b3 000019b6: JUMP 000019b7: JUMPDEST 000019b8: PUSH1 0x01 000019ba: DUP2 000019bb: DUP2 000019bc: ADD 000019bd: SLOAD 000019be: PUSH1 0x01 000019c0: PUSH1 0x98 000019c2: SHL 000019c3: SWAP1 000019c4: DIV 000019c5: PUSH1 0xff 000019c7: AND 000019c8: EQ 000019c9: DUP1 000019ca: PUSH2 0x19e1 000019cd: JUMPI 000019ce: POP 000019cf: PUSH1 0x01 000019d1: DUP2 000019d2: ADD 000019d3: SLOAD 000019d4: PUSH1 0x01 000019d6: PUSH1 0x98 000019d8: SHL 000019d9: SWAP1 000019da: DIV 000019db: PUSH1 0xff 000019dd: AND 000019de: PUSH1 0x02 000019e0: EQ 000019e1: JUMPDEST 000019e2: PUSH2 0x19fd 000019e5: JUMPI 000019e6: PUSH1 0x40 000019e8: MLOAD 000019e9: PUSH3 0x461bcd 000019ed: PUSH1 0xe5 000019ef: SHL 000019f0: DUP2 000019f1: MSTORE 000019f2: PUSH1 0x04 000019f4: ADD 000019f5: PUSH2 0x08b3 000019f8: SWAP1 000019f9: PUSH2 0x4001 000019fc: JUMP 000019fd: JUMPDEST 000019fe: DUP1 000019ff: SLOAD 00001a00: PUSH1 0x01 00001a02: DUP3 00001a03: ADD 00001a04: DUP1 00001a05: SLOAD 00001a06: PUSH1 0x01 00001a08: PUSH1 0x01 00001a0a: PUSH1 0x98 00001a0c: SHL 00001a0d: SUB 00001a0e: DUP7 00001a0f: AND 00001a10: PUSH1 0x01 00001a12: PUSH1 0x01 00001a14: PUSH1 0xa0 00001a16: SHL 00001a17: SUB 00001a18: NOT 00001a19: SWAP1 00001a1a: SWAP2 00001a1b: AND 00001a1c: DUP2 00001a1d: OR 00001a1e: PUSH1 0x03 00001a20: PUSH1 0x98 00001a22: SHL 00001a23: OR 00001a24: SWAP1 00001a25: SWAP2 00001a26: SSTORE 00001a27: PUSH1 0x01 00001a29: PUSH1 0x01 00001a2b: PUSH1 0xa0 00001a2d: SHL 00001a2e: SUB 00001a2f: DUP7 00001a30: AND 00001a31: PUSH1 0x01 00001a33: PUSH1 0x01 00001a35: PUSH1 0xd0 00001a37: SHL 00001a38: SUB 00001a39: NOT 00001a3a: SWAP1 00001a3b: SWAP3 00001a3c: AND 00001a3d: DUP3 00001a3e: OR 00001a3f: PUSH1 0x01 00001a41: PUSH1 0xa0 00001a43: SHL 00001a44: TIMESTAMP 00001a45: PUSH6 0xffffffffffff 00001a4c: DUP2 00001a4d: AND 00001a4e: SWAP2 00001a4f: SWAP1 00001a50: SWAP2 00001a51: MUL 00001a52: SWAP2 00001a53: SWAP1 00001a54: SWAP2 00001a55: OR 00001a56: DUP5 00001a57: SSTORE 00001a58: PUSH1 0x40 00001a5a: DUP1 00001a5b: MLOAD 00001a5c: DUP10 00001a5d: DUP2 00001a5e: MSTORE 00001a5f: PUSH1 0x20 00001a61: DUP2 00001a62: ADD 00001a63: SWAP5 00001a64: SWAP1 00001a65: SWAP5 00001a66: MSTORE 00001a67: DUP4 00001a68: ADD 00001a69: SWAP2 00001a6a: SWAP1 00001a6b: SWAP2 00001a6c: MSTORE 00001a6d: PUSH1 0x60 00001a6f: DUP3 00001a70: ADD 00001a71: MSTORE 00001a72: PUSH32 0x973839ac031e9779c3158a52ae98cb3b0be8a378b1adc2b2ce2c14f89c814895 00001a93: SWAP1 00001a94: PUSH1 0x80 00001a96: ADD 00001a97: PUSH2 0x0e19 00001a9a: JUMP 00001a9b: JUMPDEST 00001a9c: PUSH1 0x40 00001a9e: DUP1 00001a9f: MLOAD 00001aa0: PUSH2 0x0140 00001aa3: DUP2 00001aa4: ADD 00001aa5: DUP3 00001aa6: MSTORE 00001aa7: PUSH1 0x00 00001aa9: DUP1 00001aaa: DUP3 00001aab: MSTORE 00001aac: PUSH1 0x20 00001aae: DUP3 00001aaf: ADD 00001ab0: DUP2 00001ab1: SWAP1 00001ab2: MSTORE 00001ab3: SWAP2 00001ab4: DUP2 00001ab5: ADD 00001ab6: DUP3 00001ab7: SWAP1 00001ab8: MSTORE 00001ab9: PUSH1 0x60 00001abb: DUP2 00001abc: ADD 00001abd: DUP3 00001abe: SWAP1 00001abf: MSTORE 00001ac0: PUSH1 0x80 00001ac2: DUP2 00001ac3: ADD 00001ac4: DUP3 00001ac5: SWAP1 00001ac6: MSTORE 00001ac7: PUSH1 0xa0 00001ac9: DUP2 00001aca: ADD 00001acb: DUP3 00001acc: SWAP1 00001acd: MSTORE 00001ace: PUSH1 0xc0 00001ad0: DUP2 00001ad1: ADD 00001ad2: DUP3 00001ad3: SWAP1 00001ad4: MSTORE 00001ad5: PUSH1 0xe0 00001ad7: DUP2 00001ad8: ADD 00001ad9: DUP3 00001ada: SWAP1 00001adb: MSTORE 00001adc: PUSH2 0x0100 00001adf: DUP2 00001ae0: ADD 00001ae1: DUP3 00001ae2: SWAP1 00001ae3: MSTORE 00001ae4: PUSH2 0x0120 00001ae7: DUP2 00001ae8: ADD 00001ae9: DUP3 00001aea: SWAP1 00001aeb: MSTORE 00001aec: SWAP1 00001aed: PUSH2 0x1af4 00001af0: PUSH2 0x301b 00001af3: JUMP 00001af4: JUMPDEST 00001af5: PUSH1 0x00 00001af7: SWAP4 00001af8: DUP5 00001af9: MSTORE 00001afa: PUSH1 0x02 00001afc: SWAP1 00001afd: DUP2 00001afe: ADD 00001aff: PUSH1 0x20 00001b01: SWAP1 00001b02: DUP2 00001b03: MSTORE 00001b04: PUSH1 0x40 00001b06: SWAP5 00001b07: DUP6 00001b08: SWAP1 00001b09: KECCAK256 00001b0a: DUP6 00001b0b: MLOAD 00001b0c: PUSH2 0x0140 00001b0f: DUP2 00001b10: ADD 00001b11: DUP8 00001b12: MSTORE 00001b13: DUP2 00001b14: SLOAD 00001b15: PUSH1 0xff 00001b17: SWAP1 00001b18: DUP2 00001b19: AND 00001b1a: DUP3 00001b1b: MSTORE 00001b1c: PUSH1 0x01 00001b1e: DUP4 00001b1f: ADD 00001b20: SLOAD 00001b21: SWAP4 00001b22: DUP3 00001b23: ADD 00001b24: SWAP4 00001b25: SWAP1 00001b26: SWAP4 00001b27: MSTORE 00001b28: SWAP3 00001b29: DUP2 00001b2a: ADD 00001b2b: SLOAD 00001b2c: PUSH1 0x01 00001b2e: PUSH1 0x01 00001b30: PUSH1 0xa0 00001b32: SHL 00001b33: SUB 00001b34: SWAP1 00001b35: DUP2 00001b36: AND 00001b37: SWAP7 00001b38: DUP5 00001b39: ADD 00001b3a: SWAP7 00001b3b: SWAP1 00001b3c: SWAP7 00001b3d: MSTORE 00001b3e: PUSH1 0x03 00001b40: DUP2 00001b41: ADD 00001b42: SLOAD 00001b43: PUSH1 0x60 00001b45: DUP5 00001b46: ADD 00001b47: MSTORE 00001b48: PUSH1 0x04 00001b4a: DUP2 00001b4b: ADD 00001b4c: SLOAD 00001b4d: PUSH1 0x80 00001b4f: DUP5 00001b50: ADD 00001b51: MSTORE 00001b52: PUSH1 0x05 00001b54: DUP2 00001b55: ADD 00001b56: SLOAD 00001b57: PUSH1 0xa0 00001b59: DUP5 00001b5a: ADD 00001b5b: MSTORE 00001b5c: PUSH1 0x06 00001b5e: DUP2 00001b5f: ADD 00001b60: SLOAD 00001b61: PUSH1 0xc0 00001b63: DUP5 00001b64: ADD 00001b65: MSTORE 00001b66: PUSH1 0x07 00001b68: DUP2 00001b69: ADD 00001b6a: SLOAD 00001b6b: SWAP2 00001b6c: DUP3 00001b6d: AND 00001b6e: PUSH1 0xe0 00001b70: DUP5 00001b71: ADD 00001b72: MSTORE 00001b73: PUSH2 0x0100 00001b76: SWAP2 00001b77: DUP3 00001b78: SWAP1 00001b79: DIV 00001b7a: SWAP1 00001b7b: SWAP6 00001b7c: AND 00001b7d: SWAP1 00001b7e: DUP3 00001b7f: ADD 00001b80: MSTORE 00001b81: PUSH1 0x08 00001b83: SWAP1 00001b84: SWAP4 00001b85: ADD 00001b86: SLOAD 00001b87: PUSH2 0x0120 00001b8a: DUP5 00001b8b: ADD 00001b8c: MSTORE 00001b8d: POP 00001b8e: SWAP1 00001b8f: SWAP2 00001b90: SWAP1 00001b91: POP 00001b92: JUMP 00001b93: JUMPDEST 00001b94: PUSH1 0x00 00001b96: DUP1 00001b97: PUSH2 0x1b9e 00001b9a: PUSH2 0x3787 00001b9d: JUMP 00001b9e: JUMPDEST 00001b9f: SLOAD 00001ba0: PUSH1 0x01 00001ba2: PUSH1 0x01 00001ba4: PUSH1 0xa0 00001ba6: SHL 00001ba7: SUB 00001ba8: AND 00001ba9: SWAP3 00001baa: SWAP2 00001bab: POP 00001bac: POP 00001bad: JUMP 00001bae: JUMPDEST 00001baf: PUSH1 0x40 00001bb1: DUP1 00001bb2: MLOAD 00001bb3: PUSH1 0xc0 00001bb5: DUP2 00001bb6: ADD 00001bb7: DUP3 00001bb8: MSTORE 00001bb9: PUSH1 0x00 00001bbb: DUP1 00001bbc: DUP3 00001bbd: MSTORE 00001bbe: PUSH1 0x20 00001bc0: DUP3 00001bc1: ADD 00001bc2: DUP2 00001bc3: SWAP1 00001bc4: MSTORE 00001bc5: SWAP2 00001bc6: DUP2 00001bc7: ADD 00001bc8: DUP3 00001bc9: SWAP1 00001bca: MSTORE 00001bcb: PUSH1 0x60 00001bcd: DUP2 00001bce: ADD 00001bcf: DUP3 00001bd0: SWAP1 00001bd1: MSTORE 00001bd2: PUSH1 0x80 00001bd4: DUP2 00001bd5: ADD 00001bd6: DUP3 00001bd7: SWAP1 00001bd8: MSTORE 00001bd9: PUSH1 0xa0 00001bdb: DUP2 00001bdc: ADD 00001bdd: DUP3 00001bde: SWAP1 00001bdf: MSTORE 00001be0: SWAP1 00001be1: PUSH2 0x1be8 00001be4: PUSH2 0x301b 00001be7: JUMP 00001be8: JUMPDEST 00001be9: PUSH1 0x00 00001beb: SWAP4 00001bec: DUP5 00001bed: MSTORE 00001bee: PUSH1 0x01 00001bf0: SWAP1 00001bf1: DUP2 00001bf2: ADD 00001bf3: PUSH1 0x20 00001bf5: SWAP1 00001bf6: DUP2 00001bf7: MSTORE 00001bf8: PUSH1 0x40 00001bfa: SWAP5 00001bfb: DUP6 00001bfc: SWAP1 00001bfd: KECCAK256 00001bfe: DUP6 00001bff: MLOAD 00001c00: PUSH1 0xc0 00001c02: DUP2 00001c03: ADD 00001c04: DUP8 00001c05: MSTORE 00001c06: DUP2 00001c07: SLOAD 00001c08: PUSH1 0x01 00001c0a: PUSH1 0x01 00001c0c: PUSH1 0xa0 00001c0e: SHL 00001c0f: SUB 00001c10: DUP2 00001c11: AND 00001c12: DUP3 00001c13: MSTORE 00001c14: PUSH6 0xffffffffffff 00001c1b: PUSH1 0x01 00001c1d: PUSH1 0xa0 00001c1f: SHL 00001c20: DUP3 00001c21: DIV 00001c22: DUP2 00001c23: AND 00001c24: SWAP5 00001c25: DUP4 00001c26: ADD 00001c27: SWAP5 00001c28: SWAP1 00001c29: SWAP5 00001c2a: MSTORE 00001c2b: PUSH1 0x01 00001c2d: PUSH1 0xd0 00001c2f: SHL 00001c30: SWAP1 00001c31: DIV 00001c32: SWAP1 00001c33: SWAP3 00001c34: AND 00001c35: SWAP6 00001c36: DUP3 00001c37: ADD 00001c38: SWAP6 00001c39: SWAP1 00001c3a: SWAP6 00001c3b: MSTORE 00001c3c: SWAP1 00001c3d: DUP5 00001c3e: ADD 00001c3f: SLOAD 00001c40: PUSH1 0x01 00001c42: PUSH1 0x01 00001c44: PUSH1 0x98 00001c46: SHL 00001c47: SUB 00001c48: DUP2 00001c49: AND 00001c4a: PUSH1 0x60 00001c4c: DUP4 00001c4d: ADD 00001c4e: MSTORE 00001c4f: PUSH1 0xff 00001c51: PUSH1 0x01 00001c53: PUSH1 0x98 00001c55: SHL 00001c56: SWAP1 00001c57: SWAP2 00001c58: DIV 00001c59: AND 00001c5a: PUSH1 0x80 00001c5c: DUP3 00001c5d: ADD 00001c5e: MSTORE 00001c5f: PUSH1 0x02 00001c61: SWAP1 00001c62: SWAP4 00001c63: ADD 00001c64: SLOAD 00001c65: PUSH1 0xa0 00001c67: DUP5 00001c68: ADD 00001c69: MSTORE 00001c6a: POP 00001c6b: SWAP1 00001c6c: SWAP2 00001c6d: SWAP1 00001c6e: POP 00001c6f: JUMP 00001c70: JUMPDEST 00001c71: PUSH1 0x00 00001c73: JUMPDEST 00001c74: DUP2 00001c75: DUP2 00001c76: LT 00001c77: ISZERO 00001c78: PUSH2 0x0830 00001c7b: JUMPI 00001c7c: PUSH2 0x1c9c 00001c7f: DUP4 00001c80: DUP4 00001c81: DUP4 00001c82: DUP2 00001c83: DUP2 00001c84: LT 00001c85: PUSH2 0x1c90 00001c88: JUMPI 00001c89: PUSH2 0x1c90 00001c8c: PUSH2 0x3dde 00001c8f: JUMP 00001c90: JUMPDEST 00001c91: SWAP1 00001c92: POP 00001c93: PUSH1 0x20 00001c95: MUL 00001c96: ADD 00001c97: CALLDATALOAD 00001c98: PUSH2 0x289f 00001c9b: JUMP 00001c9c: JUMPDEST 00001c9d: DUP1 00001c9e: PUSH2 0x1ca6 00001ca1: DUP2 00001ca2: PUSH2 0x3e0a 00001ca5: JUMP 00001ca6: JUMPDEST 00001ca7: SWAP2 00001ca8: POP 00001ca9: POP 00001caa: PUSH2 0x1c73 00001cad: JUMP 00001cae: JUMPDEST 00001caf: PUSH2 0x1cb6 00001cb2: PUSH2 0x2fe9 00001cb5: JUMP 00001cb6: JUMPDEST 00001cb7: PUSH1 0x00 00001cb9: PUSH2 0x1cc0 00001cbc: PUSH2 0x301b 00001cbf: JUMP 00001cc0: JUMPDEST 00001cc1: SWAP1 00001cc2: POP 00001cc3: PUSH1 0x00 00001cc5: JUMPDEST 00001cc6: DUP4 00001cc7: DUP2 00001cc8: LT 00001cc9: ISZERO 00001cca: PUSH2 0x1d32 00001ccd: JUMPI 00001cce: DUP3 00001ccf: DUP3 00001cd0: PUSH1 0x00 00001cd2: DUP8 00001cd3: DUP8 00001cd4: DUP6 00001cd5: DUP2 00001cd6: DUP2 00001cd7: LT 00001cd8: PUSH2 0x1ce3 00001cdb: JUMPI 00001cdc: PUSH2 0x1ce3 00001cdf: PUSH2 0x3dde 00001ce2: JUMP 00001ce3: JUMPDEST 00001ce4: SWAP1 00001ce5: POP 00001ce6: PUSH1 0x20 00001ce8: MUL 00001ce9: ADD 00001cea: PUSH1 0x20 00001cec: DUP2 00001ced: ADD 00001cee: SWAP1 00001cef: PUSH2 0x1cf8 00001cf2: SWAP2 00001cf3: SWAP1 00001cf4: PUSH2 0x3b69 00001cf7: JUMP 00001cf8: JUMPDEST 00001cf9: PUSH1 0x01 00001cfb: PUSH1 0x01 00001cfd: PUSH1 0xa0 00001cff: SHL 00001d00: SUB 00001d01: AND 00001d02: DUP2 00001d03: MSTORE 00001d04: PUSH1 0x20 00001d06: DUP2 00001d07: ADD 00001d08: SWAP2 00001d09: SWAP1 00001d0a: SWAP2 00001d0b: MSTORE 00001d0c: PUSH1 0x40 00001d0e: ADD 00001d0f: PUSH1 0x00 00001d11: KECCAK256 00001d12: DUP1 00001d13: SLOAD 00001d14: PUSH1 0xff 00001d16: NOT 00001d17: AND 00001d18: SWAP2 00001d19: ISZERO 00001d1a: ISZERO 00001d1b: SWAP2 00001d1c: SWAP1 00001d1d: SWAP2 00001d1e: OR 00001d1f: SWAP1 00001d20: SSTORE 00001d21: DUP1 00001d22: PUSH2 0x1d2a 00001d25: DUP2 00001d26: PUSH2 0x3e0a 00001d29: JUMP 00001d2a: JUMPDEST 00001d2b: SWAP2 00001d2c: POP 00001d2d: POP 00001d2e: PUSH2 0x1cc5 00001d31: JUMP 00001d32: JUMPDEST 00001d33: POP 00001d34: PUSH32 0x6a980e8ca36409cff27b8778560e2a0f5183fea53171bc0aeff7317906c7c1f4 00001d55: DUP5 00001d56: DUP5 00001d57: DUP5 00001d58: PUSH1 0x40 00001d5a: MLOAD 00001d5b: PUSH2 0x1d66 00001d5e: SWAP4 00001d5f: SWAP3 00001d60: SWAP2 00001d61: SWAP1 00001d62: PUSH2 0x429e 00001d65: JUMP 00001d66: JUMPDEST 00001d67: PUSH1 0x40 00001d69: MLOAD 00001d6a: DUP1 00001d6b: SWAP2 00001d6c: SUB 00001d6d: SWAP1 00001d6e: LOG1 00001d6f: POP 00001d70: POP 00001d71: POP 00001d72: POP 00001d73: JUMP 00001d74: JUMPDEST 00001d75: PUSH1 0x00 00001d77: DUP1 00001d78: PUSH2 0x1d7f 00001d7b: PUSH2 0x301b 00001d7e: JUMP 00001d7f: JUMPDEST 00001d80: PUSH1 0x00 00001d82: DUP5 00001d83: DUP2 00001d84: MSTORE 00001d85: PUSH1 0x02 00001d87: DUP3 00001d88: ADD 00001d89: PUSH1 0x20 00001d8b: MSTORE 00001d8c: PUSH1 0x40 00001d8e: SWAP1 00001d8f: KECCAK256 00001d90: PUSH1 0x06 00001d92: DUP2 00001d93: ADD 00001d94: SLOAD 00001d95: PUSH1 0x03 00001d97: SWAP1 00001d98: SWAP2 00001d99: ADD 00001d9a: SLOAD 00001d9b: SWAP2 00001d9c: SWAP3 00001d9d: POP 00001d9e: PUSH2 0x1da6 00001da1: SWAP2 00001da2: PUSH2 0x3f1f 00001da5: JUMP 00001da6: JUMPDEST 00001da7: SWAP4 00001da8: SWAP3 00001da9: POP 00001daa: POP 00001dab: POP 00001dac: JUMP 00001dad: JUMPDEST 00001dae: PUSH1 0x40 00001db0: DUP1 00001db1: MLOAD 00001db2: PUSH1 0xa0 00001db4: DUP2 00001db5: ADD 00001db6: DUP3 00001db7: MSTORE 00001db8: PUSH1 0x00 00001dba: DUP1 00001dbb: DUP3 00001dbc: MSTORE 00001dbd: PUSH1 0x20 00001dbf: DUP3 00001dc0: ADD 00001dc1: DUP2 00001dc2: SWAP1 00001dc3: MSTORE 00001dc4: SWAP2 00001dc5: DUP2 00001dc6: ADD 00001dc7: DUP3 00001dc8: SWAP1 00001dc9: MSTORE 00001dca: PUSH1 0x60 00001dcc: DUP2 00001dcd: ADD 00001dce: DUP3 00001dcf: SWAP1 00001dd0: MSTORE 00001dd1: PUSH1 0x80 00001dd3: DUP2 00001dd4: ADD 00001dd5: DUP3 00001dd6: SWAP1 00001dd7: MSTORE 00001dd8: SWAP1 00001dd9: PUSH2 0x1de0 00001ddc: PUSH2 0x301b 00001ddf: JUMP 00001de0: JUMPDEST 00001de1: PUSH1 0x00 00001de3: SWAP4 00001de4: DUP5 00001de5: MSTORE 00001de6: PUSH1 0x04 00001de8: ADD 00001de9: PUSH1 0x20 00001deb: SWAP1 00001dec: DUP2 00001ded: MSTORE 00001dee: PUSH1 0x40 00001df0: SWAP4 00001df1: DUP5 00001df2: SWAP1 00001df3: KECCAK256 00001df4: DUP5 00001df5: MLOAD 00001df6: PUSH1 0xa0 00001df8: DUP2 00001df9: ADD 00001dfa: DUP7 00001dfb: MSTORE 00001dfc: DUP2 00001dfd: SLOAD 00001dfe: DUP2 00001dff: MSTORE 00001e00: PUSH1 0x01 00001e02: DUP3 00001e03: ADD 00001e04: SLOAD 00001e05: SWAP3 00001e06: DUP2 00001e07: ADD 00001e08: SWAP3 00001e09: SWAP1 00001e0a: SWAP3 00001e0b: MSTORE 00001e0c: PUSH1 0x02 00001e0e: DUP2 00001e0f: ADD 00001e10: SLOAD 00001e11: PUSH1 0x01 00001e13: PUSH1 0x01 00001e15: PUSH1 0xa0 00001e17: SHL 00001e18: SUB 00001e19: SWAP1 00001e1a: DUP2 00001e1b: AND 00001e1c: SWAP6 00001e1d: DUP4 00001e1e: ADD 00001e1f: SWAP6 00001e20: SWAP1 00001e21: SWAP6 00001e22: MSTORE 00001e23: PUSH1 0x03 00001e25: ADD 00001e26: SLOAD 00001e27: SWAP4 00001e28: DUP5 00001e29: AND 00001e2a: PUSH1 0x60 00001e2c: DUP3 00001e2d: ADD 00001e2e: MSTORE 00001e2f: PUSH1 0x01 00001e31: PUSH1 0xa0 00001e33: SHL 00001e34: SWAP1 00001e35: SWAP4 00001e36: DIV 00001e37: PUSH1 0xff 00001e39: AND 00001e3a: PUSH1 0x80 00001e3c: DUP5 00001e3d: ADD 00001e3e: MSTORE 00001e3f: POP 00001e40: SWAP1 00001e41: SWAP2 00001e42: SWAP1 00001e43: POP 00001e44: JUMP 00001e45: JUMPDEST 00001e46: PUSH2 0x1e4d 00001e49: PUSH2 0x2fb3 00001e4c: JUMP 00001e4d: JUMPDEST 00001e4e: PUSH1 0x00 00001e50: PUSH2 0x1e57 00001e53: PUSH2 0x301b 00001e56: JUMP 00001e57: JUMPDEST 00001e58: PUSH1 0x00 00001e5a: DUP8 00001e5b: DUP2 00001e5c: MSTORE 00001e5d: PUSH1 0x01 00001e5f: DUP1 00001e60: DUP4 00001e61: ADD 00001e62: PUSH1 0x20 00001e64: MSTORE 00001e65: PUSH1 0x40 00001e67: SWAP1 00001e68: SWAP2 00001e69: KECCAK256 00001e6a: DUP1 00001e6b: DUP3 00001e6c: ADD 00001e6d: SLOAD 00001e6e: SWAP3 00001e6f: SWAP4 00001e70: POP 00001e71: SWAP2 00001e72: PUSH1 0x01 00001e74: PUSH1 0x98 00001e76: SHL 00001e77: SWAP1 00001e78: DIV 00001e79: PUSH1 0xff 00001e7b: AND 00001e7c: EQ 00001e7d: PUSH2 0x1e98 00001e80: JUMPI 00001e81: PUSH1 0x40 00001e83: MLOAD 00001e84: PUSH3 0x461bcd 00001e88: PUSH1 0xe5 00001e8a: SHL 00001e8b: DUP2 00001e8c: MSTORE 00001e8d: PUSH1 0x04 00001e8f: ADD 00001e90: PUSH2 0x08b3 00001e93: SWAP1 00001e94: PUSH2 0x402f 00001e97: JUMP 00001e98: JUMPDEST 00001e99: PUSH1 0x01 00001e9b: PUSH1 0x01 00001e9d: PUSH1 0xa0 00001e9f: SHL 00001ea0: SUB 00001ea1: DUP5 00001ea2: AND 00001ea3: ISZERO 00001ea4: DUP1 00001ea5: ISZERO 00001ea6: SWAP1 00001ea7: PUSH2 0x1ec8 00001eaa: JUMPI 00001eab: POP 00001eac: PUSH1 0x01 00001eae: PUSH1 0x01 00001eb0: PUSH1 0xa0 00001eb2: SHL 00001eb3: SUB 00001eb4: DUP5 00001eb5: AND 00001eb6: PUSH1 0x00 00001eb8: SWAP1 00001eb9: DUP2 00001eba: MSTORE 00001ebb: PUSH1 0x20 00001ebd: DUP4 00001ebe: SWAP1 00001ebf: MSTORE 00001ec0: PUSH1 0x40 00001ec2: SWAP1 00001ec3: KECCAK256 00001ec4: SLOAD 00001ec5: PUSH1 0xff 00001ec7: AND 00001ec8: JUMPDEST 00001ec9: PUSH2 0x1ee4 00001ecc: JUMPI 00001ecd: PUSH1 0x40 00001ecf: MLOAD 00001ed0: PUSH3 0x461bcd 00001ed4: PUSH1 0xe5 00001ed6: SHL 00001ed7: DUP2 00001ed8: MSTORE 00001ed9: PUSH1 0x04 00001edb: ADD 00001edc: PUSH2 0x08b3 00001edf: SWAP1 00001ee0: PUSH2 0x4242 00001ee3: JUMP 00001ee4: JUMPDEST 00001ee5: PUSH1 0x00 00001ee7: DUP7 00001ee8: GT 00001ee9: DUP1 00001eea: ISZERO 00001eeb: PUSH2 0x1ef4 00001eee: JUMPI 00001eef: POP 00001ef0: PUSH1 0x00 00001ef2: DUP6 00001ef3: GT 00001ef4: JUMPDEST 00001ef5: PUSH2 0x1f10 00001ef8: JUMPI 00001ef9: PUSH1 0x40 00001efb: MLOAD 00001efc: PUSH3 0x461bcd 00001f00: PUSH1 0xe5 00001f02: SHL 00001f03: DUP2 00001f04: MSTORE 00001f05: PUSH1 0x04 00001f07: ADD 00001f08: PUSH2 0x08b3 00001f0b: SWAP1 00001f0c: PUSH2 0x4056 00001f0f: JUMP 00001f10: JUMPDEST 00001f11: DUP3 00001f12: DUP7 00001f13: LT 00001f14: ISZERO 00001f15: PUSH2 0x1f30 00001f18: JUMPI 00001f19: PUSH1 0x40 00001f1b: MLOAD 00001f1c: PUSH3 0x461bcd 00001f20: PUSH1 0xe5 00001f22: SHL 00001f23: DUP2 00001f24: MSTORE 00001f25: PUSH1 0x04 00001f27: ADD 00001f28: PUSH2 0x08b3 00001f2b: SWAP1 00001f2c: PUSH2 0x4087 00001f2f: JUMP 00001f30: JUMPDEST 00001f31: DUP1 00001f32: PUSH1 0x02 00001f34: ADD 00001f35: SLOAD 00001f36: DUP4 00001f37: LT 00001f38: ISZERO 00001f39: PUSH2 0x1f54 00001f3c: JUMPI 00001f3d: PUSH1 0x40 00001f3f: MLOAD 00001f40: PUSH3 0x461bcd 00001f44: PUSH1 0xe5 00001f46: SHL 00001f47: DUP2 00001f48: MSTORE 00001f49: PUSH1 0x04 00001f4b: ADD 00001f4c: PUSH2 0x08b3 00001f4f: SWAP1 00001f50: PUSH2 0x40d9 00001f53: JUMP 00001f54: JUMPDEST 00001f55: PUSH1 0x06 00001f57: DUP3 00001f58: ADD 00001f59: SLOAD 00001f5a: DUP5 00001f5b: SWAP1 00001f5c: PUSH1 0x00 00001f5e: SWAP1 00001f5f: PUSH3 0x0f4240 00001f63: SWAP1 00001f64: PUSH2 0x1f6d 00001f67: SWAP1 00001f68: DUP10 00001f69: PUSH2 0x3ed3 00001f6c: JUMP 00001f6d: JUMPDEST 00001f6e: PUSH2 0x1f77 00001f71: SWAP2 00001f72: SWAP1 00001f73: PUSH2 0x3eea 00001f76: JUMP 00001f77: JUMPDEST 00001f78: SWAP1 00001f79: POP 00001f7a: PUSH1 0x00 00001f7c: PUSH1 0xff 00001f7e: DUP12 00001f7f: AND 00001f80: PUSH1 0x01 00001f82: EQ 00001f83: PUSH2 0x1f8c 00001f86: JUMPI 00001f87: DUP2 00001f88: PUSH2 0x1f8e 00001f8b: JUMP 00001f8c: JUMPDEST 00001f8d: DUP8 00001f8e: JUMPDEST 00001f8f: SWAP1 00001f90: POP 00001f91: PUSH2 0x1fa5 00001f94: PUSH1 0x01 00001f96: PUSH1 0x01 00001f98: PUSH1 0xa0 00001f9a: SHL 00001f9b: SUB 00001f9c: DUP5 00001f9d: AND 00001f9e: CALLER 00001f9f: ADDRESS 00001fa0: DUP5 00001fa1: PUSH2 0x354b 00001fa4: JUMP 00001fa5: JUMPDEST 00001fa6: PUSH2 0x1fb4 00001fa9: DUP12 00001faa: DUP12 00001fab: DUP10 00001fac: DUP13 00001fad: DUP13 00001fae: DUP8 00001faf: DUP13 00001fb0: PUSH2 0x336a 00001fb3: JUMP 00001fb4: JUMPDEST 00001fb5: POP 00001fb6: POP 00001fb7: POP 00001fb8: POP 00001fb9: POP 00001fba: PUSH2 0x1fc1 00001fbd: PUSH2 0x309e 00001fc0: JUMP 00001fc1: JUMPDEST 00001fc2: POP 00001fc3: POP 00001fc4: POP 00001fc5: POP 00001fc6: POP 00001fc7: POP 00001fc8: JUMP 00001fc9: JUMPDEST 00001fca: PUSH2 0x1fd1 00001fcd: PUSH2 0x2fb3 00001fd0: JUMP 00001fd1: JUMPDEST 00001fd2: PUSH1 0x00 00001fd4: PUSH2 0x1fdb 00001fd7: PUSH2 0x301b 00001fda: JUMP 00001fdb: JUMPDEST 00001fdc: PUSH1 0x00 00001fde: DUP4 00001fdf: DUP2 00001fe0: MSTORE 00001fe1: PUSH1 0x04 00001fe3: DUP3 00001fe4: ADD 00001fe5: PUSH1 0x20 00001fe7: SWAP1 00001fe8: DUP2 00001fe9: MSTORE 00001fea: PUSH1 0x40 00001fec: DUP1 00001fed: DUP4 00001fee: KECCAK256 00001fef: DUP1 00001ff0: SLOAD 00001ff1: DUP5 00001ff2: MSTORE 00001ff3: PUSH1 0x02 00001ff5: DUP6 00001ff6: ADD 00001ff7: DUP4 00001ff8: MSTORE 00001ff9: DUP2 00001ffa: DUP5 00001ffb: KECCAK256 00001ffc: PUSH1 0x01 00001ffe: DUP1 00001fff: DUP3 00002000: ADD 00002001: SLOAD 00002002: DUP7 00002003: MSTORE 00002004: DUP1 00002005: DUP8 00002006: ADD 00002007: SWAP1 00002008: SWAP5 00002009: MSTORE 0000200a: SWAP2 0000200b: SWAP1 0000200c: SWAP4 0000200d: KECCAK256 0000200e: SWAP2 0000200f: DUP3 00002010: ADD 00002011: SLOAD 00002012: SWAP4 00002013: SWAP5 00002014: POP 00002015: SWAP2 00002016: SWAP3 00002017: PUSH1 0x01 00002019: PUSH1 0x98 0000201b: SHL 0000201c: SWAP1 0000201d: DIV 0000201e: PUSH1 0xff 00002020: AND 00002021: PUSH1 0x03 00002023: EQ 00002024: PUSH2 0x203f 00002027: JUMPI 00002028: PUSH1 0x40 0000202a: MLOAD 0000202b: PUSH3 0x461bcd 0000202f: PUSH1 0xe5 00002031: SHL 00002032: DUP2 00002033: MSTORE 00002034: PUSH1 0x04 00002036: ADD 00002037: PUSH2 0x08b3 0000203a: SWAP1 0000203b: PUSH2 0x3e23 0000203e: JUMP 0000203f: JUMPDEST 00002040: DUP1 00002041: SLOAD 00002042: PUSH1 0x01 00002044: PUSH1 0x01 00002046: PUSH1 0xa0 00002048: SHL 00002049: SUB 0000204a: AND 0000204b: ISZERO 0000204c: DUP1 0000204d: ISZERO 0000204e: SWAP1 0000204f: PUSH2 0x2064 00002052: JUMPI 00002053: POP 00002054: PUSH1 0x01 00002056: DUP2 00002057: ADD 00002058: SLOAD 00002059: PUSH1 0x01 0000205b: PUSH1 0x01 0000205d: PUSH1 0x98 0000205f: SHL 00002060: SUB 00002061: AND 00002062: ISZERO 00002063: ISZERO 00002064: JUMPDEST 00002065: PUSH2 0x2080 00002068: JUMPI 00002069: PUSH1 0x40 0000206b: MLOAD 0000206c: PUSH3 0x461bcd 00002070: PUSH1 0xe5 00002072: SHL 00002073: DUP2 00002074: MSTORE 00002075: PUSH1 0x04 00002077: ADD 00002078: PUSH2 0x08b3 0000207b: SWAP1 0000207c: PUSH2 0x3e4b 0000207f: JUMP 00002080: JUMPDEST 00002081: DUP1 00002082: SLOAD 00002083: PUSH1 0x01 00002085: PUSH1 0xa0 00002087: SHL 00002088: SWAP1 00002089: DIV 0000208a: PUSH6 0xffffffffffff 00002091: AND 00002092: TIMESTAMP 00002093: GT 00002094: PUSH2 0x20af 00002097: JUMPI 00002098: PUSH1 0x40 0000209a: MLOAD 0000209b: PUSH3 0x461bcd 0000209f: PUSH1 0xe5 000020a1: SHL 000020a2: DUP2 000020a3: MSTORE 000020a4: PUSH1 0x04 000020a6: ADD 000020a7: PUSH2 0x08b3 000020aa: SWAP1 000020ab: PUSH2 0x3e72 000020ae: JUMP 000020af: JUMPDEST 000020b0: PUSH1 0x02 000020b2: DUP4 000020b3: ADD 000020b4: SLOAD 000020b5: PUSH1 0x01 000020b7: PUSH1 0x01 000020b9: PUSH1 0xa0 000020bb: SHL 000020bc: SUB 000020bd: AND 000020be: CALLER 000020bf: EQ 000020c0: PUSH2 0x20f9 000020c3: JUMPI 000020c4: PUSH1 0x40 000020c6: MLOAD 000020c7: PUSH3 0x461bcd 000020cb: PUSH1 0xe5 000020cd: SHL 000020ce: DUP2 000020cf: MSTORE 000020d0: PUSH1 0x20 000020d2: PUSH1 0x04 000020d4: DUP3 000020d5: ADD 000020d6: MSTORE 000020d7: PUSH1 0x0b 000020d9: PUSH1 0x24 000020db: DUP3 000020dc: ADD 000020dd: MSTORE 000020de: PUSH11 0x53656c6c6572204f6e6c79 000020ea: PUSH1 0xa8 000020ec: SHL 000020ed: PUSH1 0x44 000020ef: DUP3 000020f0: ADD 000020f1: MSTORE 000020f2: PUSH1 0x64 000020f4: ADD 000020f5: PUSH2 0x08b3 000020f8: JUMP 000020f9: JUMPDEST 000020fa: PUSH1 0x03 000020fc: DUP4 000020fd: ADD 000020fe: SLOAD 000020ff: PUSH1 0x01 00002101: PUSH1 0xa0 00002103: SHL 00002104: SWAP1 00002105: DIV 00002106: PUSH1 0xff 00002108: AND 00002109: PUSH1 0x01 0000210b: EQ 0000210c: PUSH2 0x2127 0000210f: JUMPI 00002110: PUSH1 0x40 00002112: MLOAD 00002113: PUSH3 0x461bcd 00002117: PUSH1 0xe5 00002119: SHL 0000211a: DUP2 0000211b: MSTORE 0000211c: PUSH1 0x04 0000211e: ADD 0000211f: PUSH2 0x08b3 00002122: SWAP1 00002123: PUSH2 0x3ea5 00002126: JUMP 00002127: JUMPDEST 00002128: PUSH1 0x00 0000212a: DUP3 0000212b: PUSH1 0x03 0000212d: ADD 0000212e: SLOAD 0000212f: DUP4 00002130: PUSH1 0x05 00002132: ADD 00002133: SLOAD 00002134: DUP6 00002135: PUSH1 0x01 00002137: ADD 00002138: SLOAD 00002139: PUSH2 0x2142 0000213c: SWAP2 0000213d: SWAP1 0000213e: PUSH2 0x3ed3 00002141: JUMP 00002142: JUMPDEST 00002143: PUSH2 0x214c 00002146: SWAP2 00002147: SWAP1 00002148: PUSH2 0x3eea 0000214b: JUMP 0000214c: JUMPDEST 0000214d: SWAP1 0000214e: POP 0000214f: PUSH1 0x00 00002151: DUP4 00002152: PUSH1 0x03 00002154: ADD 00002155: SLOAD 00002156: DUP5 00002157: PUSH1 0x04 00002159: ADD 0000215a: SLOAD 0000215b: DUP7 0000215c: PUSH1 0x01 0000215e: ADD 0000215f: SLOAD 00002160: PUSH2 0x2169 00002163: SWAP2 00002164: SWAP1 00002165: PUSH2 0x3ed3 00002168: JUMP 00002169: JUMPDEST 0000216a: PUSH2 0x2173 0000216d: SWAP2 0000216e: SWAP1 0000216f: PUSH2 0x3eea 00002172: JUMP 00002173: JUMPDEST 00002174: DUP4 00002175: SLOAD 00002176: PUSH1 0x01 00002178: DUP1 00002179: DUP7 0000217a: ADD 0000217b: SLOAD 0000217c: SWAP1 0000217d: DUP9 0000217e: ADD 0000217f: SLOAD 00002180: SWAP3 00002181: SWAP4 00002182: POP 00002183: PUSH1 0x01 00002185: PUSH1 0x01 00002187: PUSH1 0xa0 00002189: SHL 0000218a: SUB 0000218b: SWAP1 0000218c: SWAP2 0000218d: AND 0000218e: SWAP2 0000218f: PUSH1 0x00 00002191: SWAP2 00002192: PUSH3 0x0f4240 00002196: SWAP2 00002197: PUSH2 0x21a9 0000219a: SWAP2 0000219b: PUSH1 0x01 0000219d: PUSH1 0x01 0000219f: PUSH1 0x98 000021a1: SHL 000021a2: SUB 000021a3: AND 000021a4: SWAP1 000021a5: PUSH2 0x3ed3 000021a8: JUMP 000021a9: JUMPDEST 000021aa: PUSH2 0x21b3 000021ad: SWAP2 000021ae: SWAP1 000021af: PUSH2 0x3eea 000021b2: JUMP 000021b3: JUMPDEST 000021b4: SWAP1 000021b5: POP 000021b6: PUSH1 0x00 000021b8: PUSH3 0x0f4240 000021bc: DUP10 000021bd: PUSH1 0x06 000021bf: ADD 000021c0: PUSH1 0x02 000021c2: ADD 000021c3: SLOAD 000021c4: DUP4 000021c5: PUSH2 0x21ce 000021c8: SWAP2 000021c9: SWAP1 000021ca: PUSH2 0x3ed3 000021cd: JUMP 000021ce: JUMPDEST 000021cf: PUSH2 0x21d8 000021d2: SWAP2 000021d3: SWAP1 000021d4: PUSH2 0x3eea 000021d7: JUMP 000021d8: JUMPDEST 000021d9: PUSH1 0x02 000021db: DUP10 000021dc: ADD 000021dd: SLOAD 000021de: PUSH1 0x09 000021e0: DUP12 000021e1: ADD 000021e2: SLOAD 000021e3: SWAP2 000021e4: SWAP3 000021e5: POP 000021e6: PUSH2 0x21ff 000021e9: SWAP2 000021ea: PUSH1 0x01 000021ec: PUSH1 0x01 000021ee: PUSH1 0xa0 000021f0: SHL 000021f1: SUB 000021f2: DUP7 000021f3: DUP2 000021f4: AND 000021f5: SWAP3 000021f6: DUP2 000021f7: AND 000021f8: SWAP2 000021f9: AND 000021fa: DUP5 000021fb: PUSH2 0x354b 000021fe: JUMP 000021ff: JUMPDEST 00002200: PUSH1 0x02 00002202: DUP9 00002203: ADD 00002204: SLOAD 00002205: PUSH1 0x03 00002207: DUP10 00002208: ADD 00002209: SLOAD 0000220a: PUSH2 0x2236 0000220d: SWAP2 0000220e: PUSH1 0x01 00002210: PUSH1 0x01 00002212: PUSH1 0xa0 00002214: SHL 00002215: SUB 00002216: SWAP1 00002217: DUP2 00002218: AND 00002219: SWAP2 0000221a: AND 0000221b: PUSH2 0x2224 0000221e: DUP5 0000221f: DUP7 00002220: PUSH2 0x3f1f 00002223: JUMP 00002224: JUMPDEST 00002225: PUSH1 0x01 00002227: PUSH1 0x01 00002229: PUSH1 0xa0 0000222b: SHL 0000222c: SUB 0000222d: DUP8 0000222e: AND 0000222f: SWAP3 00002230: SWAP2 00002231: SWAP1 00002232: PUSH2 0x354b 00002235: JUMP 00002236: JUMPDEST 00002237: PUSH1 0x08 00002239: DUP10 0000223a: ADD 0000223b: SLOAD 0000223c: PUSH1 0x00 0000223e: SWAP1 0000223f: PUSH3 0x0f4240 00002243: SWAP1 00002244: PUSH2 0x224d 00002247: SWAP1 00002248: DUP8 00002249: PUSH2 0x3ed3 0000224c: JUMP 0000224d: JUMPDEST 0000224e: PUSH2 0x2257 00002251: SWAP2 00002252: SWAP1 00002253: PUSH2 0x3eea 00002256: JUMP 00002257: JUMPDEST 00002258: SWAP1 00002259: POP 0000225a: PUSH1 0x00 0000225c: DUP2 0000225d: PUSH2 0x2266 00002260: DUP9 00002261: DUP9 00002262: PUSH2 0x3f0c 00002265: JUMP 00002266: JUMPDEST 00002267: PUSH2 0x2270 0000226a: SWAP2 0000226b: SWAP1 0000226c: PUSH2 0x3f1f 0000226f: JUMP 00002270: JUMPDEST 00002271: PUSH1 0x02 00002273: DUP11 00002274: ADD 00002275: SLOAD 00002276: SWAP1 00002277: SWAP2 00002278: POP 00002279: PUSH1 0x01 0000227b: PUSH1 0x01 0000227d: PUSH1 0xa0 0000227f: SHL 00002280: SUB 00002281: AND 00002282: PUSH2 0x2365 00002285: JUMPI 00002286: PUSH1 0x02 00002288: DUP11 00002289: ADD 0000228a: SLOAD 0000228b: PUSH1 0x40 0000228d: MLOAD 0000228e: PUSH1 0x00 00002290: SWAP2 00002291: PUSH1 0x01 00002293: PUSH1 0x01 00002295: PUSH1 0xa0 00002297: SHL 00002298: SUB 00002299: AND 0000229a: SWAP1 0000229b: DUP4 0000229c: SWAP1 0000229d: DUP4 0000229e: DUP2 0000229f: DUP2 000022a0: DUP2 000022a1: DUP6 000022a2: DUP8 000022a3: GAS 000022a4: CALL 000022a5: SWAP3 000022a6: POP 000022a7: POP 000022a8: POP 000022a9: RETURNDATASIZE 000022aa: DUP1 000022ab: PUSH1 0x00 000022ad: DUP2 000022ae: EQ 000022af: PUSH2 0x22d4 000022b2: JUMPI 000022b3: PUSH1 0x40 000022b5: MLOAD 000022b6: SWAP2 000022b7: POP 000022b8: PUSH1 0x1f 000022ba: NOT 000022bb: PUSH1 0x3f 000022bd: RETURNDATASIZE 000022be: ADD 000022bf: AND 000022c0: DUP3 000022c1: ADD 000022c2: PUSH1 0x40 000022c4: MSTORE 000022c5: RETURNDATASIZE 000022c6: DUP3 000022c7: MSTORE 000022c8: RETURNDATASIZE 000022c9: PUSH1 0x00 000022cb: PUSH1 0x20 000022cd: DUP5 000022ce: ADD 000022cf: RETURNDATACOPY 000022d0: PUSH2 0x22d9 000022d3: JUMP 000022d4: JUMPDEST 000022d5: PUSH1 0x60 000022d7: SWAP2 000022d8: POP 000022d9: JUMPDEST 000022da: POP 000022db: POP 000022dc: PUSH1 0x09 000022de: DUP14 000022df: ADD 000022e0: SLOAD 000022e1: PUSH1 0x40 000022e3: MLOAD 000022e4: SWAP2 000022e5: SWAP3 000022e6: POP 000022e7: PUSH1 0x00 000022e9: SWAP2 000022ea: PUSH1 0x01 000022ec: PUSH1 0x01 000022ee: PUSH1 0xa0 000022f0: SHL 000022f1: SUB 000022f2: SWAP1 000022f3: SWAP2 000022f4: AND 000022f5: SWAP1 000022f6: DUP6 000022f7: SWAP1 000022f8: DUP4 000022f9: DUP2 000022fa: DUP2 000022fb: DUP2 000022fc: DUP6 000022fd: DUP8 000022fe: GAS 000022ff: CALL 00002300: SWAP3 00002301: POP 00002302: POP 00002303: POP 00002304: RETURNDATASIZE 00002305: DUP1 00002306: PUSH1 0x00 00002308: DUP2 00002309: EQ 0000230a: PUSH2 0x232f 0000230d: JUMPI 0000230e: PUSH1 0x40 00002310: MLOAD 00002311: SWAP2 00002312: POP 00002313: PUSH1 0x1f 00002315: NOT 00002316: PUSH1 0x3f 00002318: RETURNDATASIZE 00002319: ADD 0000231a: AND 0000231b: DUP3 0000231c: ADD 0000231d: PUSH1 0x40 0000231f: MSTORE 00002320: RETURNDATASIZE 00002321: DUP3 00002322: MSTORE 00002323: RETURNDATASIZE 00002324: PUSH1 0x00 00002326: PUSH1 0x20 00002328: DUP5 00002329: ADD 0000232a: RETURNDATACOPY 0000232b: PUSH2 0x2334 0000232e: JUMP 0000232f: JUMPDEST 00002330: PUSH1 0x60 00002332: SWAP2 00002333: POP 00002334: JUMPDEST 00002335: POP 00002336: POP 00002337: SWAP1 00002338: POP 00002339: DUP2 0000233a: DUP1 0000233b: ISZERO 0000233c: PUSH2 0x2342 0000233f: JUMPI 00002340: POP 00002341: DUP1 00002342: JUMPDEST 00002343: PUSH2 0x235e 00002346: JUMPI 00002347: PUSH1 0x40 00002349: MLOAD 0000234a: PUSH3 0x461bcd 0000234e: PUSH1 0xe5 00002350: SHL 00002351: DUP2 00002352: MSTORE 00002353: PUSH1 0x04 00002355: ADD 00002356: PUSH2 0x08b3 00002359: SWAP1 0000235a: PUSH2 0x3f32 0000235d: JUMP 0000235e: JUMPDEST 0000235f: POP 00002360: POP 00002361: PUSH2 0x23a6 00002364: JUMP 00002365: JUMPDEST 00002366: PUSH1 0x02 00002368: DUP1 00002369: DUP11 0000236a: ADD 0000236b: SLOAD 0000236c: SWAP1 0000236d: DUP12 0000236e: ADD 0000236f: SLOAD 00002370: PUSH1 0x01 00002372: PUSH1 0x01 00002374: PUSH1 0xa0 00002376: SHL 00002377: SUB 00002378: SWAP2 00002379: DUP3 0000237a: AND 0000237b: SWAP2 0000237c: PUSH2 0x2388 0000237f: SWAP2 00002380: DUP4 00002381: SWAP2 00002382: AND 00002383: DUP5 00002384: PUSH2 0x303f 00002387: JUMP 00002388: JUMPDEST 00002389: PUSH1 0x09 0000238b: DUP13 0000238c: ADD 0000238d: SLOAD 0000238e: PUSH2 0x23a4 00002391: SWAP1 00002392: PUSH1 0x01 00002394: PUSH1 0x01 00002396: PUSH1 0xa0 00002398: SHL 00002399: SUB 0000239a: DUP4 0000239b: DUP2 0000239c: AND 0000239d: SWAP2 0000239e: AND 0000239f: DUP6 000023a0: PUSH2 0x303f 000023a3: JUMP 000023a4: JUMPDEST 000023a5: POP 000023a6: JUMPDEST 000023a7: PUSH1 0x03 000023a9: DUP11 000023aa: ADD 000023ab: DUP1 000023ac: SLOAD 000023ad: PUSH1 0xff 000023af: PUSH1 0xa0 000023b1: SHL 000023b2: NOT 000023b3: AND 000023b4: PUSH1 0x01 000023b6: PUSH1 0xa1 000023b8: SHL 000023b9: OR 000023ba: SWAP1 000023bb: SSTORE 000023bc: PUSH1 0x40 000023be: MLOAD 000023bf: PUSH1 0x00 000023c1: DUP1 000023c2: MLOAD 000023c3: PUSH1 0x20 000023c5: PUSH2 0x43d8 000023c8: DUP4 000023c9: CODECOPY 000023ca: DUP2 000023cb: MLOAD 000023cc: SWAP2 000023cd: MSTORE 000023ce: SWAP1 000023cf: PUSH2 0x23df 000023d2: SWAP1 000023d3: DUP15 000023d4: SWAP1 000023d5: DUP5 000023d6: SWAP1 000023d7: DUP7 000023d8: SWAP1 000023d9: CALLER 000023da: SWAP1 000023db: PUSH2 0x3f5f 000023de: JUMP 000023df: JUMPDEST 000023e0: PUSH1 0x40 000023e2: MLOAD 000023e3: DUP1 000023e4: SWAP2 000023e5: SUB 000023e6: SWAP1 000023e7: LOG1 000023e8: POP 000023e9: POP 000023ea: POP 000023eb: POP 000023ec: POP 000023ed: POP 000023ee: POP 000023ef: POP 000023f0: POP 000023f1: POP 000023f2: POP 000023f3: PUSH2 0x23fa 000023f6: PUSH2 0x309e 000023f9: JUMP 000023fa: JUMPDEST 000023fb: POP 000023fc: JUMP 000023fd: JUMPDEST 000023fe: PUSH1 0x00 00002400: JUMPDEST 00002401: DUP2 00002402: DUP2 00002403: LT 00002404: ISZERO 00002405: PUSH2 0x0830 00002408: JUMPI 00002409: PUSH2 0x2429 0000240c: DUP4 0000240d: DUP4 0000240e: DUP4 0000240f: DUP2 00002410: DUP2 00002411: LT 00002412: PUSH2 0x241d 00002415: JUMPI 00002416: PUSH2 0x241d 00002419: PUSH2 0x3dde 0000241c: JUMP 0000241d: JUMPDEST 0000241e: SWAP1 0000241f: POP 00002420: PUSH1 0x20 00002422: MUL 00002423: ADD 00002424: CALLDATALOAD 00002425: PUSH2 0x25a5 00002428: JUMP 00002429: JUMPDEST 0000242a: DUP1 0000242b: PUSH2 0x2433 0000242e: DUP2 0000242f: PUSH2 0x3e0a 00002432: JUMP 00002433: JUMPDEST 00002434: SWAP2 00002435: POP 00002436: POP 00002437: PUSH2 0x2400 0000243a: JUMP 0000243b: JUMPDEST 0000243c: PUSH2 0x2443 0000243f: PUSH2 0x2fe9 00002442: JUMP 00002443: JUMPDEST 00002444: PUSH1 0x00 00002446: PUSH2 0x244d 00002449: PUSH2 0x301b 0000244c: JUMP 0000244d: JUMPDEST 0000244e: SWAP1 0000244f: POP 00002450: PUSH1 0x01 00002452: PUSH1 0x01 00002454: PUSH1 0xa0 00002456: SHL 00002457: SUB 00002458: DUP4 00002459: AND 0000245a: ISZERO 0000245b: DUP1 0000245c: ISZERO 0000245d: SWAP1 0000245e: PUSH2 0x2480 00002461: JUMPI 00002462: POP 00002463: PUSH1 0x01 00002465: PUSH1 0x01 00002467: PUSH1 0xa0 00002469: SHL 0000246a: SUB 0000246b: DUP4 0000246c: AND 0000246d: PUSH1 0x00 0000246f: SWAP1 00002470: DUP2 00002471: MSTORE 00002472: PUSH1 0x20 00002474: DUP3 00002475: SWAP1 00002476: MSTORE 00002477: PUSH1 0x40 00002479: SWAP1 0000247a: KECCAK256 0000247b: SLOAD 0000247c: PUSH1 0xff 0000247e: AND 0000247f: ISZERO 00002480: JUMPDEST 00002481: PUSH2 0x249c 00002484: JUMPI 00002485: PUSH1 0x40 00002487: MLOAD 00002488: PUSH3 0x461bcd 0000248c: PUSH1 0xe5 0000248e: SHL 0000248f: DUP2 00002490: MSTORE 00002491: PUSH1 0x04 00002493: ADD 00002494: PUSH2 0x08b3 00002497: SWAP1 00002498: PUSH2 0x426f 0000249b: JUMP 0000249c: JUMPDEST 0000249d: PUSH1 0x40 0000249f: MLOAD 000024a0: PUSH4 0x70a08231 000024a5: PUSH1 0xe0 000024a7: SHL 000024a8: DUP2 000024a9: MSTORE 000024aa: PUSH1 0x00 000024ac: SWAP1 000024ad: PUSH1 0x01 000024af: PUSH1 0x01 000024b1: PUSH1 0xa0 000024b3: SHL 000024b4: SUB 000024b5: DUP6 000024b6: AND 000024b7: SWAP1 000024b8: PUSH4 0x70a08231 000024bd: SWAP1 000024be: PUSH2 0x24cb 000024c1: SWAP1 000024c2: ADDRESS 000024c3: SWAP1 000024c4: PUSH1 0x04 000024c6: ADD 000024c7: PUSH2 0x3cef 000024ca: JUMP 000024cb: JUMPDEST 000024cc: PUSH1 0x20 000024ce: PUSH1 0x40 000024d0: MLOAD 000024d1: DUP1 000024d2: DUP4 000024d3: SUB 000024d4: DUP2 000024d5: DUP7 000024d6: GAS 000024d7: STATICCALL 000024d8: ISZERO 000024d9: DUP1 000024da: ISZERO 000024db: PUSH2 0x24e8 000024de: JUMPI 000024df: RETURNDATASIZE 000024e0: PUSH1 0x00 000024e2: DUP1 000024e3: RETURNDATACOPY 000024e4: RETURNDATASIZE 000024e5: PUSH1 0x00 000024e7: REVERT 000024e8: JUMPDEST 000024e9: POP 000024ea: POP 000024eb: POP 000024ec: POP 000024ed: PUSH1 0x40 000024ef: MLOAD 000024f0: RETURNDATASIZE 000024f1: PUSH1 0x1f 000024f3: NOT 000024f4: PUSH1 0x1f 000024f6: DUP3 000024f7: ADD 000024f8: AND 000024f9: DUP3 000024fa: ADD 000024fb: DUP1 000024fc: PUSH1 0x40 000024fe: MSTORE 000024ff: POP 00002500: DUP2 00002501: ADD 00002502: SWAP1 00002503: PUSH2 0x250c 00002506: SWAP2 00002507: SWAP1 00002508: PUSH2 0x42f5 0000250b: JUMP 0000250c: JUMPDEST 0000250d: SWAP1 0000250e: POP 0000250f: PUSH2 0x10f0 00002512: PUSH1 0x01 00002514: PUSH1 0x01 00002516: PUSH1 0xa0 00002518: SHL 00002519: SUB 0000251a: DUP6 0000251b: AND 0000251c: DUP5 0000251d: DUP4 0000251e: PUSH2 0x303f 00002521: JUMP 00002522: JUMPDEST 00002523: PUSH1 0x00 00002525: DUP1 00002526: PUSH2 0x252d 00002529: PUSH2 0x301b 0000252c: JUMP 0000252d: JUMPDEST 0000252e: PUSH1 0x00 00002530: SWAP4 00002531: DUP5 00002532: MSTORE 00002533: PUSH1 0x04 00002535: ADD 00002536: PUSH1 0x20 00002538: MSTORE 00002539: POP 0000253a: POP 0000253b: PUSH1 0x40 0000253d: SWAP1 0000253e: KECCAK256 0000253f: PUSH1 0x03 00002541: ADD 00002542: SLOAD 00002543: PUSH1 0x01 00002545: PUSH1 0xa0 00002547: SHL 00002548: SWAP1 00002549: DIV 0000254a: PUSH1 0xff 0000254c: AND 0000254d: SWAP1 0000254e: JUMP 0000254f: JUMPDEST 00002550: PUSH1 0x00 00002552: DUP1 00002553: PUSH2 0x255a 00002556: PUSH2 0x301b 00002559: JUMP 0000255a: JUMPDEST 0000255b: PUSH1 0x00 0000255d: SWAP4 0000255e: DUP5 0000255f: MSTORE 00002560: PUSH1 0x02 00002562: ADD 00002563: PUSH1 0x20 00002565: MSTORE 00002566: POP 00002567: POP 00002568: PUSH1 0x40 0000256a: SWAP1 0000256b: KECCAK256 0000256c: PUSH1 0x07 0000256e: ADD 0000256f: SLOAD 00002570: PUSH1 0xff 00002572: AND 00002573: SWAP1 00002574: JUMP 00002575: JUMPDEST 00002576: PUSH1 0x00 00002578: DUP1 00002579: PUSH2 0x2580 0000257c: PUSH2 0x301b 0000257f: JUMP 00002580: JUMPDEST 00002581: PUSH1 0x00 00002583: SWAP4 00002584: DUP5 00002585: MSTORE 00002586: PUSH1 0x02 00002588: SWAP1 00002589: DUP2 0000258a: ADD 0000258b: PUSH1 0x20 0000258d: MSTORE 0000258e: PUSH1 0x40 00002590: SWAP1 00002591: SWAP4 00002592: KECCAK256 00002593: SWAP1 00002594: SWAP3 00002595: ADD 00002596: SLOAD 00002597: PUSH1 0x01 00002599: PUSH1 0x01 0000259b: PUSH1 0xa0 0000259d: SHL 0000259e: SUB 0000259f: AND 000025a0: SWAP3 000025a1: SWAP2 000025a2: POP 000025a3: POP 000025a4: JUMP 000025a5: JUMPDEST 000025a6: PUSH2 0x25ad 000025a9: PUSH2 0x2fb3 000025ac: JUMP 000025ad: JUMPDEST 000025ae: PUSH2 0x25b5 000025b1: PUSH2 0x2fe9 000025b4: JUMP 000025b5: JUMPDEST 000025b6: PUSH1 0x00 000025b8: PUSH2 0x25bf 000025bb: PUSH2 0x301b 000025be: JUMP 000025bf: JUMPDEST 000025c0: PUSH1 0x00 000025c2: DUP4 000025c3: DUP2 000025c4: MSTORE 000025c5: PUSH1 0x04 000025c7: DUP3 000025c8: ADD 000025c9: PUSH1 0x20 000025cb: SWAP1 000025cc: DUP2 000025cd: MSTORE 000025ce: PUSH1 0x40 000025d0: DUP1 000025d1: DUP4 000025d2: KECCAK256 000025d3: DUP1 000025d4: SLOAD 000025d5: DUP5 000025d6: MSTORE 000025d7: PUSH1 0x02 000025d9: DUP6 000025da: ADD 000025db: SWAP1 000025dc: SWAP3 000025dd: MSTORE 000025de: SWAP1 000025df: SWAP2 000025e0: KECCAK256 000025e1: PUSH1 0x03 000025e3: DUP3 000025e4: ADD 000025e5: SLOAD 000025e6: SWAP3 000025e7: SWAP4 000025e8: POP 000025e9: SWAP1 000025ea: SWAP2 000025eb: PUSH1 0x01 000025ed: PUSH1 0xa0 000025ef: SHL 000025f0: SWAP1 000025f1: DIV 000025f2: PUSH1 0xff 000025f4: AND 000025f5: PUSH1 0x01 000025f7: EQ 000025f8: PUSH2 0x2613 000025fb: JUMPI 000025fc: PUSH1 0x40 000025fe: MLOAD 000025ff: PUSH3 0x461bcd 00002603: PUSH1 0xe5 00002605: SHL 00002606: DUP2 00002607: MSTORE 00002608: PUSH1 0x04 0000260a: ADD 0000260b: PUSH2 0x08b3 0000260e: SWAP1 0000260f: PUSH2 0x3ea5 00002612: JUMP 00002613: JUMPDEST 00002614: PUSH1 0x00 00002616: DUP2 00002617: PUSH1 0x03 00002619: ADD 0000261a: SLOAD 0000261b: DUP3 0000261c: PUSH1 0x04 0000261e: ADD 0000261f: SLOAD 00002620: DUP5 00002621: PUSH1 0x01 00002623: ADD 00002624: SLOAD 00002625: PUSH2 0x262e 00002628: SWAP2 00002629: SWAP1 0000262a: PUSH2 0x3ed3 0000262d: JUMP 0000262e: JUMPDEST 0000262f: PUSH2 0x2638 00002632: SWAP2 00002633: SWAP1 00002634: PUSH2 0x3eea 00002637: JUMP 00002638: JUMPDEST 00002639: SWAP1 0000263a: POP 0000263b: PUSH1 0x00 0000263d: DUP3 0000263e: PUSH1 0x03 00002640: ADD 00002641: SLOAD 00002642: DUP4 00002643: PUSH1 0x05 00002645: ADD 00002646: SLOAD 00002647: DUP6 00002648: PUSH1 0x01 0000264a: ADD 0000264b: SLOAD 0000264c: PUSH2 0x2655 0000264f: SWAP2 00002650: SWAP1 00002651: PUSH2 0x3ed3 00002654: JUMP 00002655: JUMPDEST 00002656: PUSH2 0x265f 00002659: SWAP2 0000265a: SWAP1 0000265b: PUSH2 0x3eea 0000265e: JUMP 0000265f: JUMPDEST 00002660: PUSH1 0x03 00002662: DUP6 00002663: ADD 00002664: SLOAD 00002665: PUSH1 0x02 00002667: DUP1 00002668: DUP8 00002669: ADD 0000266a: SLOAD 0000266b: SWAP1 0000266c: DUP7 0000266d: ADD 0000266e: SLOAD 0000266f: SWAP3 00002670: SWAP4 00002671: POP 00002672: PUSH1 0x01 00002674: PUSH1 0x01 00002676: PUSH1 0xa0 00002678: SHL 00002679: SUB 0000267a: SWAP2 0000267b: DUP3 0000267c: AND 0000267d: SWAP3 0000267e: SWAP1 0000267f: DUP3 00002680: AND 00002681: SWAP2 00002682: AND 00002683: PUSH2 0x27af 00002686: JUMPI 00002687: PUSH1 0x00 00002689: DUP5 0000268a: GT 0000268b: DUP1 0000268c: ISZERO 0000268d: PUSH2 0x269e 00002690: JUMPI 00002691: POP 00002692: PUSH1 0x01 00002694: PUSH1 0x01 00002696: PUSH1 0xa0 00002698: SHL 00002699: SUB 0000269a: DUP3 0000269b: AND 0000269c: ISZERO 0000269d: ISZERO 0000269e: JUMPDEST 0000269f: ISZERO 000026a0: PUSH2 0x2718 000026a3: JUMPI 000026a4: PUSH1 0x00 000026a6: DUP3 000026a7: PUSH1 0x01 000026a9: PUSH1 0x01 000026ab: PUSH1 0xa0 000026ad: SHL 000026ae: SUB 000026af: AND 000026b0: DUP6 000026b1: PUSH1 0x40 000026b3: MLOAD 000026b4: PUSH1 0x00 000026b6: PUSH1 0x40 000026b8: MLOAD 000026b9: DUP1 000026ba: DUP4 000026bb: SUB 000026bc: DUP2 000026bd: DUP6 000026be: DUP8 000026bf: GAS 000026c0: CALL 000026c1: SWAP3 000026c2: POP 000026c3: POP 000026c4: POP 000026c5: RETURNDATASIZE 000026c6: DUP1 000026c7: PUSH1 0x00 000026c9: DUP2 000026ca: EQ 000026cb: PUSH2 0x26f0 000026ce: JUMPI 000026cf: PUSH1 0x40 000026d1: MLOAD 000026d2: SWAP2 000026d3: POP 000026d4: PUSH1 0x1f 000026d6: NOT 000026d7: PUSH1 0x3f 000026d9: RETURNDATASIZE 000026da: ADD 000026db: AND 000026dc: DUP3 000026dd: ADD 000026de: PUSH1 0x40 000026e0: MSTORE 000026e1: RETURNDATASIZE 000026e2: DUP3 000026e3: MSTORE 000026e4: RETURNDATASIZE 000026e5: PUSH1 0x00 000026e7: PUSH1 0x20 000026e9: DUP5 000026ea: ADD 000026eb: RETURNDATACOPY 000026ec: PUSH2 0x26f5 000026ef: JUMP 000026f0: JUMPDEST 000026f1: PUSH1 0x60 000026f3: SWAP2 000026f4: POP 000026f5: JUMPDEST 000026f6: POP 000026f7: POP 000026f8: SWAP1 000026f9: POP 000026fa: DUP1 000026fb: PUSH2 0x2716 000026fe: JUMPI 000026ff: PUSH1 0x40 00002701: MLOAD 00002702: PUSH3 0x461bcd 00002706: PUSH1 0xe5 00002708: SHL 00002709: DUP2 0000270a: MSTORE 0000270b: PUSH1 0x04 0000270d: ADD 0000270e: PUSH2 0x08b3 00002711: SWAP1 00002712: PUSH2 0x430e 00002715: JUMP 00002716: JUMPDEST 00002717: POP 00002718: JUMPDEST 00002719: PUSH1 0x00 0000271b: DUP4 0000271c: GT 0000271d: DUP1 0000271e: ISZERO 0000271f: PUSH2 0x2730 00002722: JUMPI 00002723: POP 00002724: PUSH1 0x01 00002726: PUSH1 0x01 00002728: PUSH1 0xa0 0000272a: SHL 0000272b: SUB 0000272c: DUP2 0000272d: AND 0000272e: ISZERO 0000272f: ISZERO 00002730: JUMPDEST 00002731: ISZERO 00002732: PUSH2 0x27aa 00002735: JUMPI 00002736: PUSH1 0x00 00002738: DUP2 00002739: PUSH1 0x01 0000273b: PUSH1 0x01 0000273d: PUSH1 0xa0 0000273f: SHL 00002740: SUB 00002741: AND 00002742: DUP5 00002743: PUSH1 0x40 00002745: MLOAD 00002746: PUSH1 0x00 00002748: PUSH1 0x40 0000274a: MLOAD 0000274b: DUP1 0000274c: DUP4 0000274d: SUB 0000274e: DUP2 0000274f: DUP6 00002750: DUP8 00002751: GAS 00002752: CALL 00002753: SWAP3 00002754: POP 00002755: POP 00002756: POP 00002757: RETURNDATASIZE 00002758: DUP1 00002759: PUSH1 0x00 0000275b: DUP2 0000275c: EQ 0000275d: PUSH2 0x2782 00002760: JUMPI 00002761: PUSH1 0x40 00002763: MLOAD 00002764: SWAP2 00002765: POP 00002766: PUSH1 0x1f 00002768: NOT 00002769: PUSH1 0x3f 0000276b: RETURNDATASIZE 0000276c: ADD 0000276d: AND 0000276e: DUP3 0000276f: ADD 00002770: PUSH1 0x40 00002772: MSTORE 00002773: RETURNDATASIZE 00002774: DUP3 00002775: MSTORE 00002776: RETURNDATASIZE 00002777: PUSH1 0x00 00002779: PUSH1 0x20 0000277b: DUP5 0000277c: ADD 0000277d: RETURNDATACOPY 0000277e: PUSH2 0x2787 00002781: JUMP 00002782: JUMPDEST 00002783: PUSH1 0x60 00002785: SWAP2 00002786: POP 00002787: JUMPDEST 00002788: POP 00002789: POP 0000278a: SWAP1 0000278b: POP 0000278c: DUP1 0000278d: PUSH2 0x27a8 00002790: JUMPI 00002791: PUSH1 0x40 00002793: MLOAD 00002794: PUSH3 0x461bcd 00002798: PUSH1 0xe5 0000279a: SHL 0000279b: DUP2 0000279c: MSTORE 0000279d: PUSH1 0x04 0000279f: ADD 000027a0: PUSH2 0x08b3 000027a3: SWAP1 000027a4: PUSH2 0x430e 000027a7: JUMP 000027a8: JUMPDEST 000027a9: POP 000027aa: JUMPDEST 000027ab: PUSH2 0x2820 000027ae: JUMP 000027af: JUMPDEST 000027b0: PUSH1 0x02 000027b2: DUP6 000027b3: ADD 000027b4: SLOAD 000027b5: PUSH1 0x01 000027b7: PUSH1 0x01 000027b9: PUSH1 0xa0 000027bb: SHL 000027bc: SUB 000027bd: AND 000027be: DUP5 000027bf: ISZERO 000027c0: DUP1 000027c1: ISZERO 000027c2: SWAP1 000027c3: PUSH2 0x27d4 000027c6: JUMPI 000027c7: POP 000027c8: PUSH1 0x01 000027ca: PUSH1 0x01 000027cc: PUSH1 0xa0 000027ce: SHL 000027cf: SUB 000027d0: DUP4 000027d1: AND 000027d2: ISZERO 000027d3: ISZERO 000027d4: JUMPDEST 000027d5: ISZERO 000027d6: PUSH2 0x27ed 000027d9: JUMPI 000027da: PUSH2 0x27ed 000027dd: PUSH1 0x01 000027df: PUSH1 0x01 000027e1: PUSH1 0xa0 000027e3: SHL 000027e4: SUB 000027e5: DUP3 000027e6: AND 000027e7: DUP5 000027e8: DUP8 000027e9: PUSH2 0x303f 000027ec: JUMP 000027ed: JUMPDEST 000027ee: PUSH1 0x00 000027f0: DUP5 000027f1: GT 000027f2: DUP1 000027f3: ISZERO 000027f4: PUSH2 0x2805 000027f7: JUMPI 000027f8: POP 000027f9: PUSH1 0x01 000027fb: PUSH1 0x01 000027fd: PUSH1 0xa0 000027ff: SHL 00002800: SUB 00002801: DUP3 00002802: AND 00002803: ISZERO 00002804: ISZERO 00002805: JUMPDEST 00002806: ISZERO 00002807: PUSH2 0x281e 0000280a: JUMPI 0000280b: PUSH2 0x281e 0000280e: PUSH1 0x01 00002810: PUSH1 0x01 00002812: PUSH1 0xa0 00002814: SHL 00002815: SUB 00002816: DUP3 00002817: AND 00002818: DUP4 00002819: DUP7 0000281a: PUSH2 0x303f 0000281d: JUMP 0000281e: JUMPDEST 0000281f: POP 00002820: JUMPDEST 00002821: PUSH1 0x03 00002823: DUP7 00002824: ADD 00002825: DUP1 00002826: SLOAD 00002827: PUSH1 0xff 00002829: PUSH1 0xa0 0000282b: SHL 0000282c: NOT 0000282d: AND 0000282e: PUSH1 0x01 00002830: PUSH1 0xa2 00002832: SHL 00002833: OR 00002834: SWAP1 00002835: SSTORE 00002836: PUSH1 0x40 00002838: DUP1 00002839: MLOAD 0000283a: DUP10 0000283b: DUP2 0000283c: MSTORE 0000283d: CALLER 0000283e: PUSH1 0x20 00002840: DUP3 00002841: ADD 00002842: MSTORE 00002843: PUSH32 0x22369ba22944aadf9e9d6f4c51462417a50ea7876b9c62c7c46b5522e9c672cc 00002864: SWAP2 00002865: ADD 00002866: PUSH1 0x40 00002868: MLOAD 00002869: DUP1 0000286a: SWAP2 0000286b: SUB 0000286c: SWAP1 0000286d: LOG1 0000286e: POP 0000286f: POP 00002870: POP 00002871: POP 00002872: POP 00002873: POP 00002874: POP 00002875: PUSH2 0x23fa 00002878: PUSH2 0x309e 0000287b: JUMP 0000287c: JUMPDEST 0000287d: PUSH1 0x00 0000287f: DUP1 00002880: PUSH2 0x2887 00002883: PUSH2 0x301b 00002886: JUMP 00002887: JUMPDEST 00002888: PUSH1 0x00 0000288a: SWAP4 0000288b: DUP5 0000288c: MSTORE 0000288d: PUSH1 0x02 0000288f: ADD 00002890: PUSH1 0x20 00002892: MSTORE 00002893: POP 00002894: POP 00002895: PUSH1 0x40 00002897: SWAP1 00002898: KECCAK256 00002899: PUSH1 0x04 0000289b: ADD 0000289c: SLOAD 0000289d: SWAP1 0000289e: JUMP 0000289f: JUMPDEST 000028a0: PUSH2 0x28a7 000028a3: PUSH2 0x2fb3 000028a6: JUMP 000028a7: JUMPDEST 000028a8: PUSH1 0x00 000028aa: PUSH2 0x28b1 000028ad: PUSH2 0x301b 000028b0: JUMP 000028b1: JUMPDEST 000028b2: PUSH1 0x00 000028b4: DUP4 000028b5: DUP2 000028b6: MSTORE 000028b7: PUSH1 0x04 000028b9: DUP3 000028ba: ADD 000028bb: PUSH1 0x20 000028bd: SWAP1 000028be: DUP2 000028bf: MSTORE 000028c0: PUSH1 0x40 000028c2: DUP1 000028c3: DUP4 000028c4: KECCAK256 000028c5: DUP1 000028c6: SLOAD 000028c7: DUP5 000028c8: MSTORE 000028c9: PUSH1 0x02 000028cb: DUP6 000028cc: ADD 000028cd: DUP4 000028ce: MSTORE 000028cf: DUP2 000028d0: DUP5 000028d1: KECCAK256 000028d2: PUSH1 0x01 000028d4: DUP1 000028d5: DUP3 000028d6: ADD 000028d7: SLOAD 000028d8: DUP7 000028d9: MSTORE 000028da: DUP1 000028db: DUP8 000028dc: ADD 000028dd: SWAP1 000028de: SWAP5 000028df: MSTORE 000028e0: SWAP2 000028e1: SWAP1 000028e2: SWAP4 000028e3: KECCAK256 000028e4: SWAP2 000028e5: DUP3 000028e6: ADD 000028e7: SLOAD 000028e8: SWAP4 000028e9: SWAP5 000028ea: POP 000028eb: SWAP2 000028ec: SWAP3 000028ed: PUSH1 0x01 000028ef: PUSH1 0x98 000028f1: SHL 000028f2: SWAP1 000028f3: DIV 000028f4: PUSH1 0xff 000028f6: AND 000028f7: PUSH1 0x03 000028f9: EQ 000028fa: PUSH2 0x2915 000028fd: JUMPI 000028fe: PUSH1 0x40 00002900: MLOAD 00002901: PUSH3 0x461bcd 00002905: PUSH1 0xe5 00002907: SHL 00002908: DUP2 00002909: MSTORE 0000290a: PUSH1 0x04 0000290c: ADD 0000290d: PUSH2 0x08b3 00002910: SWAP1 00002911: PUSH2 0x3e23 00002914: JUMP 00002915: JUMPDEST 00002916: DUP1 00002917: SLOAD 00002918: PUSH2 0x2939 0000291b: SWAP1 0000291c: PUSH6 0xffffffffffff 00002923: PUSH1 0x01 00002925: PUSH1 0xd0 00002927: SHL 00002928: DUP3 00002929: DIV 0000292a: DUP2 0000292b: AND 0000292c: SWAP2 0000292d: PUSH1 0x01 0000292f: PUSH1 0xa0 00002931: SHL 00002932: SWAP1 00002933: DIV 00002934: AND 00002935: PUSH2 0x4345 00002938: JUMP 00002939: JUMPDEST 0000293a: PUSH6 0xffffffffffff 00002941: AND 00002942: TIMESTAMP 00002943: GT 00002944: PUSH2 0x298d 00002947: JUMPI 00002948: PUSH1 0x40 0000294a: MLOAD 0000294b: PUSH3 0x461bcd 0000294f: PUSH1 0xe5 00002951: SHL 00002952: DUP2 00002953: MSTORE 00002954: PUSH1 0x20 00002956: PUSH1 0x04 00002958: DUP3 00002959: ADD 0000295a: MSTORE 0000295b: PUSH1 0x1b 0000295d: PUSH1 0x24 0000295f: DUP3 00002960: ADD 00002961: MSTORE 00002962: PUSH27 0x14d95d1d1b1a5b99c8151a5b5948139bdd08115b9919590816595d 0000297e: PUSH1 0x2a 00002980: SHL 00002981: PUSH1 0x44 00002983: DUP3 00002984: ADD 00002985: MSTORE 00002986: PUSH1 0x64 00002988: ADD 00002989: PUSH2 0x08b3 0000298c: JUMP 0000298d: JUMPDEST 0000298e: PUSH1 0x03 00002990: DUP4 00002991: ADD 00002992: SLOAD 00002993: PUSH1 0x01 00002995: PUSH1 0xa0 00002997: SHL 00002998: SWAP1 00002999: DIV 0000299a: PUSH1 0xff 0000299c: AND 0000299d: PUSH1 0x01 0000299f: EQ 000029a0: PUSH2 0x29bb 000029a3: JUMPI 000029a4: PUSH1 0x40 000029a6: MLOAD 000029a7: PUSH3 0x461bcd 000029ab: PUSH1 0xe5 000029ad: SHL 000029ae: DUP2 000029af: MSTORE 000029b0: PUSH1 0x04 000029b2: ADD 000029b3: PUSH2 0x08b3 000029b6: SWAP1 000029b7: PUSH2 0x3ea5 000029ba: JUMP 000029bb: JUMPDEST 000029bc: PUSH1 0x03 000029be: DUP4 000029bf: ADD 000029c0: SLOAD 000029c1: PUSH1 0x01 000029c3: PUSH1 0x01 000029c5: PUSH1 0xa0 000029c7: SHL 000029c8: SUB 000029c9: AND 000029ca: CALLER 000029cb: EQ 000029cc: DUP1 000029cd: PUSH2 0x29e5 000029d0: JUMPI 000029d1: POP 000029d2: CALLER 000029d3: PUSH2 0x29da 000029d6: PUSH2 0x1b93 000029d9: JUMP 000029da: JUMPDEST 000029db: PUSH1 0x01 000029dd: PUSH1 0x01 000029df: PUSH1 0xa0 000029e1: SHL 000029e2: SUB 000029e3: AND 000029e4: EQ 000029e5: JUMPDEST 000029e6: PUSH2 0x2a30 000029e9: JUMPI 000029ea: PUSH1 0x40 000029ec: MLOAD 000029ed: PUSH3 0x461bcd 000029f1: PUSH1 0xe5 000029f3: SHL 000029f4: DUP2 000029f5: MSTORE 000029f6: PUSH1 0x20 000029f8: PUSH1 0x04 000029fa: DUP3 000029fb: ADD 000029fc: MSTORE 000029fd: PUSH1 0x1c 000029ff: PUSH1 0x24 00002a01: DUP3 00002a02: ADD 00002a03: MSTORE 00002a04: PUSH28 0x4275796572206f72204f70657261746f722f4f776e6572204f6e6c79 00002a21: PUSH1 0x20 00002a23: SHL 00002a24: PUSH1 0x44 00002a26: DUP3 00002a27: ADD 00002a28: MSTORE 00002a29: PUSH1 0x64 00002a2b: ADD 00002a2c: PUSH2 0x08b3 00002a2f: JUMP 00002a30: JUMPDEST 00002a31: PUSH1 0x00 00002a33: DUP3 00002a34: PUSH1 0x03 00002a36: ADD 00002a37: SLOAD 00002a38: DUP4 00002a39: PUSH1 0x05 00002a3b: ADD 00002a3c: SLOAD 00002a3d: DUP6 00002a3e: PUSH1 0x01 00002a40: ADD 00002a41: SLOAD 00002a42: PUSH2 0x2a4b 00002a45: SWAP2 00002a46: SWAP1 00002a47: PUSH2 0x3ed3 00002a4a: JUMP 00002a4b: JUMPDEST 00002a4c: PUSH2 0x2a55 00002a4f: SWAP2 00002a50: SWAP1 00002a51: PUSH2 0x3eea 00002a54: JUMP 00002a55: JUMPDEST 00002a56: SWAP1 00002a57: POP 00002a58: PUSH1 0x00 00002a5a: DUP4 00002a5b: PUSH1 0x03 00002a5d: ADD 00002a5e: SLOAD 00002a5f: DUP5 00002a60: PUSH1 0x04 00002a62: ADD 00002a63: SLOAD 00002a64: DUP7 00002a65: PUSH1 0x01 00002a67: ADD 00002a68: SLOAD 00002a69: PUSH2 0x2a72 00002a6c: SWAP2 00002a6d: SWAP1 00002a6e: PUSH2 0x3ed3 00002a71: JUMP 00002a72: JUMPDEST 00002a73: PUSH2 0x2a7c 00002a76: SWAP2 00002a77: SWAP1 00002a78: PUSH2 0x3eea 00002a7b: JUMP 00002a7c: JUMPDEST 00002a7d: SWAP1 00002a7e: POP 00002a7f: PUSH1 0x00 00002a81: PUSH3 0x0f4240 00002a85: DUP8 00002a86: PUSH1 0x06 00002a88: ADD 00002a89: PUSH1 0x02 00002a8b: ADD 00002a8c: SLOAD 00002a8d: DUP5 00002a8e: PUSH2 0x2a97 00002a91: SWAP2 00002a92: SWAP1 00002a93: PUSH2 0x3ed3 00002a96: JUMP 00002a97: JUMPDEST 00002a98: PUSH2 0x2aa2 00002a9b: SWAP1 00002a9c: PUSH1 0x02 00002a9e: PUSH2 0x3ed3 00002aa1: JUMP 00002aa2: JUMPDEST 00002aa3: PUSH2 0x2aac 00002aa6: SWAP2 00002aa7: SWAP1 00002aa8: PUSH2 0x3eea 00002aab: JUMP 00002aac: JUMPDEST 00002aad: SWAP1 00002aae: POP 00002aaf: PUSH1 0x00 00002ab1: DUP2 00002ab2: PUSH2 0x2abb 00002ab5: DUP6 00002ab6: DUP6 00002ab7: PUSH2 0x3f0c 00002aba: JUMP 00002abb: JUMPDEST 00002abc: PUSH2 0x2ac5 00002abf: SWAP2 00002ac0: SWAP1 00002ac1: PUSH2 0x3f1f 00002ac4: JUMP 00002ac5: JUMPDEST 00002ac6: PUSH1 0x02 00002ac8: DUP8 00002ac9: ADD 00002aca: SLOAD 00002acb: SWAP1 00002acc: SWAP2 00002acd: POP 00002ace: PUSH1 0x01 00002ad0: PUSH1 0x01 00002ad2: PUSH1 0xa0 00002ad4: SHL 00002ad5: SUB 00002ad6: AND 00002ad7: PUSH2 0x2bba 00002ada: JUMPI 00002adb: PUSH1 0x03 00002add: DUP8 00002ade: ADD 00002adf: SLOAD 00002ae0: PUSH1 0x40 00002ae2: MLOAD 00002ae3: PUSH1 0x00 00002ae5: SWAP2 00002ae6: PUSH1 0x01 00002ae8: PUSH1 0x01 00002aea: PUSH1 0xa0 00002aec: SHL 00002aed: SUB 00002aee: AND 00002aef: SWAP1 00002af0: DUP4 00002af1: SWAP1 00002af2: DUP4 00002af3: DUP2 00002af4: DUP2 00002af5: DUP2 00002af6: DUP6 00002af7: DUP8 00002af8: GAS 00002af9: CALL 00002afa: SWAP3 00002afb: POP 00002afc: POP 00002afd: POP 00002afe: RETURNDATASIZE 00002aff: DUP1 00002b00: PUSH1 0x00 00002b02: DUP2 00002b03: EQ 00002b04: PUSH2 0x2b29 00002b07: JUMPI 00002b08: PUSH1 0x40 00002b0a: MLOAD 00002b0b: SWAP2 00002b0c: POP 00002b0d: PUSH1 0x1f 00002b0f: NOT 00002b10: PUSH1 0x3f 00002b12: RETURNDATASIZE 00002b13: ADD 00002b14: AND 00002b15: DUP3 00002b16: ADD 00002b17: PUSH1 0x40 00002b19: MSTORE 00002b1a: RETURNDATASIZE 00002b1b: DUP3 00002b1c: MSTORE 00002b1d: RETURNDATASIZE 00002b1e: PUSH1 0x00 00002b20: PUSH1 0x20 00002b22: DUP5 00002b23: ADD 00002b24: RETURNDATACOPY 00002b25: PUSH2 0x2b2e 00002b28: JUMP 00002b29: JUMPDEST 00002b2a: PUSH1 0x60 00002b2c: SWAP2 00002b2d: POP 00002b2e: JUMPDEST 00002b2f: POP 00002b30: POP 00002b31: PUSH1 0x09 00002b33: DUP11 00002b34: ADD 00002b35: SLOAD 00002b36: PUSH1 0x40 00002b38: MLOAD 00002b39: SWAP2 00002b3a: SWAP3 00002b3b: POP 00002b3c: PUSH1 0x00 00002b3e: SWAP2 00002b3f: PUSH1 0x01 00002b41: PUSH1 0x01 00002b43: PUSH1 0xa0 00002b45: SHL 00002b46: SUB 00002b47: SWAP1 00002b48: SWAP2 00002b49: AND 00002b4a: SWAP1 00002b4b: DUP6 00002b4c: SWAP1 00002b4d: DUP4 00002b4e: DUP2 00002b4f: DUP2 00002b50: DUP2 00002b51: DUP6 00002b52: DUP8 00002b53: GAS 00002b54: CALL 00002b55: SWAP3 00002b56: POP 00002b57: POP 00002b58: POP 00002b59: RETURNDATASIZE 00002b5a: DUP1 00002b5b: PUSH1 0x00 00002b5d: DUP2 00002b5e: EQ 00002b5f: PUSH2 0x2b84 00002b62: JUMPI 00002b63: PUSH1 0x40 00002b65: MLOAD 00002b66: SWAP2 00002b67: POP 00002b68: PUSH1 0x1f 00002b6a: NOT 00002b6b: PUSH1 0x3f 00002b6d: RETURNDATASIZE 00002b6e: ADD 00002b6f: AND 00002b70: DUP3 00002b71: ADD 00002b72: PUSH1 0x40 00002b74: MSTORE 00002b75: RETURNDATASIZE 00002b76: DUP3 00002b77: MSTORE 00002b78: RETURNDATASIZE 00002b79: PUSH1 0x00 00002b7b: PUSH1 0x20 00002b7d: DUP5 00002b7e: ADD 00002b7f: RETURNDATACOPY 00002b80: PUSH2 0x2b89 00002b83: JUMP 00002b84: JUMPDEST 00002b85: PUSH1 0x60 00002b87: SWAP2 00002b88: POP 00002b89: JUMPDEST 00002b8a: POP 00002b8b: POP 00002b8c: SWAP1 00002b8d: POP 00002b8e: DUP2 00002b8f: DUP1 00002b90: ISZERO 00002b91: PUSH2 0x2b97 00002b94: JUMPI 00002b95: POP 00002b96: DUP1 00002b97: JUMPDEST 00002b98: PUSH2 0x2bb3 00002b9b: JUMPI 00002b9c: PUSH1 0x40 00002b9e: MLOAD 00002b9f: PUSH3 0x461bcd 00002ba3: PUSH1 0xe5 00002ba5: SHL 00002ba6: DUP2 00002ba7: MSTORE 00002ba8: PUSH1 0x04 00002baa: ADD 00002bab: PUSH2 0x08b3 00002bae: SWAP1 00002baf: PUSH2 0x3f32 00002bb2: JUMP 00002bb3: JUMPDEST 00002bb4: POP 00002bb5: POP 00002bb6: PUSH2 0x2bfb 00002bb9: JUMP 00002bba: JUMPDEST 00002bbb: PUSH1 0x02 00002bbd: DUP7 00002bbe: ADD 00002bbf: SLOAD 00002bc0: PUSH1 0x03 00002bc2: DUP9 00002bc3: ADD 00002bc4: SLOAD 00002bc5: PUSH1 0x01 00002bc7: PUSH1 0x01 00002bc9: PUSH1 0xa0 00002bcb: SHL 00002bcc: SUB 00002bcd: SWAP2 00002bce: DUP3 00002bcf: AND 00002bd0: SWAP2 00002bd1: PUSH2 0x2bdd 00002bd4: SWAP2 00002bd5: DUP4 00002bd6: SWAP2 00002bd7: AND 00002bd8: DUP5 00002bd9: PUSH2 0x303f 00002bdc: JUMP 00002bdd: JUMPDEST 00002bde: PUSH1 0x09 00002be0: DUP10 00002be1: ADD 00002be2: SLOAD 00002be3: PUSH2 0x2bf9 00002be6: SWAP1 00002be7: PUSH1 0x01 00002be9: PUSH1 0x01 00002beb: PUSH1 0xa0 00002bed: SHL 00002bee: SUB 00002bef: DUP4 00002bf0: DUP2 00002bf1: AND 00002bf2: SWAP2 00002bf3: AND 00002bf4: DUP6 00002bf5: PUSH2 0x303f 00002bf8: JUMP 00002bf9: JUMPDEST 00002bfa: POP 00002bfb: JUMPDEST 00002bfc: PUSH1 0x03 00002bfe: DUP8 00002bff: ADD 00002c00: DUP1 00002c01: SLOAD 00002c02: PUSH1 0xff 00002c04: PUSH1 0xa0 00002c06: SHL 00002c07: NOT 00002c08: AND 00002c09: PUSH1 0x03 00002c0b: PUSH1 0xa0 00002c0d: SHL 00002c0e: OR 00002c0f: SWAP1 00002c10: SSTORE 00002c11: PUSH1 0x40 00002c13: MLOAD 00002c14: PUSH32 0x6353c0ce500c8ea1f1026c8f39a6e0c2d1b2f17034fcd8a4b021c72e6e293e51 00002c35: SWAP1 00002c36: PUSH2 0x2c46 00002c39: SWAP1 00002c3a: DUP12 00002c3b: SWAP1 00002c3c: DUP5 00002c3d: SWAP1 00002c3e: DUP7 00002c3f: SWAP1 00002c40: CALLER 00002c41: SWAP1 00002c42: PUSH2 0x3f5f 00002c45: JUMP 00002c46: JUMPDEST 00002c47: PUSH1 0x40 00002c49: MLOAD 00002c4a: DUP1 00002c4b: SWAP2 00002c4c: SUB 00002c4d: SWAP1 00002c4e: LOG1 00002c4f: POP 00002c50: POP 00002c51: POP 00002c52: POP 00002c53: POP 00002c54: POP 00002c55: POP 00002c56: POP 00002c57: PUSH2 0x23fa 00002c5a: PUSH2 0x309e 00002c5d: JUMP 00002c5e: JUMPDEST 00002c5f: PUSH1 0x00 00002c61: DUP1 00002c62: PUSH2 0x2c69 00002c65: PUSH2 0x301b 00002c68: JUMP 00002c69: JUMPDEST 00002c6a: PUSH1 0x00 00002c6c: SWAP4 00002c6d: DUP5 00002c6e: MSTORE 00002c6f: PUSH1 0x02 00002c71: ADD 00002c72: PUSH1 0x20 00002c74: MSTORE 00002c75: POP 00002c76: POP 00002c77: PUSH1 0x40 00002c79: SWAP1 00002c7a: KECCAK256 00002c7b: PUSH1 0x03 00002c7d: ADD 00002c7e: SLOAD 00002c7f: SWAP1 00002c80: JUMP 00002c81: JUMPDEST 00002c82: PUSH2 0x2c89 00002c85: PUSH2 0x2fb3 00002c88: JUMP 00002c89: JUMPDEST 00002c8a: PUSH1 0x00 00002c8c: PUSH2 0x2c93 00002c8f: PUSH2 0x301b 00002c92: JUMP 00002c93: JUMPDEST 00002c94: PUSH1 0x00 00002c96: DUP4 00002c97: DUP2 00002c98: MSTORE 00002c99: PUSH1 0x02 00002c9b: DUP3 00002c9c: ADD 00002c9d: PUSH1 0x20 00002c9f: MSTORE 00002ca0: PUSH1 0x40 00002ca2: SWAP1 00002ca3: KECCAK256 00002ca4: PUSH1 0x07 00002ca6: DUP2 00002ca7: ADD 00002ca8: SLOAD 00002ca9: SWAP2 00002caa: SWAP3 00002cab: POP 00002cac: SWAP1 00002cad: PUSH2 0x0100 00002cb0: SWAP1 00002cb1: DIV 00002cb2: PUSH1 0x01 00002cb4: PUSH1 0x01 00002cb6: PUSH1 0xa0 00002cb8: SHL 00002cb9: SUB 00002cba: AND 00002cbb: CALLER 00002cbc: EQ 00002cbd: PUSH2 0x2cfb 00002cc0: JUMPI 00002cc1: PUSH1 0x40 00002cc3: MLOAD 00002cc4: PUSH3 0x461bcd 00002cc8: PUSH1 0xe5 00002cca: SHL 00002ccb: DUP2 00002ccc: MSTORE 00002ccd: PUSH1 0x20 00002ccf: PUSH1 0x04 00002cd1: DUP3 00002cd2: ADD 00002cd3: MSTORE 00002cd4: PUSH1 0x10 00002cd6: PUSH1 0x24 00002cd8: DUP3 00002cd9: ADD 00002cda: MSTORE 00002cdb: PUSH16 0x4f66666572204f776e6572204f6e6c79 00002cec: PUSH1 0x80 00002cee: SHL 00002cef: PUSH1 0x44 00002cf1: DUP3 00002cf2: ADD 00002cf3: MSTORE 00002cf4: PUSH1 0x64 00002cf6: ADD 00002cf7: PUSH2 0x08b3 00002cfa: JUMP 00002cfb: JUMPDEST 00002cfc: PUSH1 0x07 00002cfe: DUP2 00002cff: ADD 00002d00: SLOAD 00002d01: PUSH1 0xff 00002d03: AND 00002d04: PUSH1 0x01 00002d06: EQ 00002d07: PUSH2 0x2d22 00002d0a: JUMPI 00002d0b: PUSH1 0x40 00002d0d: MLOAD 00002d0e: PUSH3 0x461bcd 00002d12: PUSH1 0xe5 00002d14: SHL 00002d15: DUP2 00002d16: MSTORE 00002d17: PUSH1 0x04 00002d19: ADD 00002d1a: PUSH2 0x08b3 00002d1d: SWAP1 00002d1e: PUSH2 0x4137 00002d21: JUMP 00002d22: JUMPDEST 00002d23: PUSH1 0x00 00002d25: DUP2 00002d26: PUSH1 0x06 00002d28: ADD 00002d29: SLOAD 00002d2a: DUP3 00002d2b: PUSH1 0x03 00002d2d: ADD 00002d2e: SLOAD 00002d2f: PUSH2 0x2d38 00002d32: SWAP2 00002d33: SWAP1 00002d34: PUSH2 0x3f1f 00002d37: JUMP 00002d38: JUMPDEST 00002d39: SWAP1 00002d3a: POP 00002d3b: PUSH1 0x00 00002d3d: DUP2 00002d3e: GT 00002d3f: PUSH2 0x2d5a 00002d42: JUMPI 00002d43: PUSH1 0x40 00002d45: MLOAD 00002d46: PUSH3 0x461bcd 00002d4a: PUSH1 0xe5 00002d4c: SHL 00002d4d: DUP2 00002d4e: MSTORE 00002d4f: PUSH1 0x04 00002d51: ADD 00002d52: PUSH2 0x08b3 00002d55: SWAP1 00002d56: PUSH2 0x41bb 00002d59: JUMP 00002d5a: JUMPDEST 00002d5b: DUP2 00002d5c: SLOAD 00002d5d: PUSH1 0x00 00002d5f: SWAP1 00002d60: PUSH1 0xff 00002d62: AND 00002d63: PUSH1 0x00 00002d65: NOT 00002d66: ADD 00002d67: PUSH2 0x2d8f 00002d6a: JUMPI 00002d6b: PUSH1 0x03 00002d6d: DUP4 00002d6e: ADD 00002d6f: SLOAD 00002d70: PUSH1 0x04 00002d72: DUP5 00002d73: ADD 00002d74: SLOAD 00002d75: PUSH2 0x2d7e 00002d78: SWAP1 00002d79: DUP5 00002d7a: PUSH2 0x3ed3 00002d7d: JUMP 00002d7e: JUMPDEST 00002d7f: PUSH2 0x2d88 00002d82: SWAP2 00002d83: SWAP1 00002d84: PUSH2 0x3eea 00002d87: JUMP 00002d88: JUMPDEST 00002d89: SWAP1 00002d8a: POP 00002d8b: PUSH2 0x2db0 00002d8e: JUMP 00002d8f: JUMPDEST 00002d90: PUSH1 0x03 00002d92: DUP4 00002d93: ADD 00002d94: SLOAD 00002d95: PUSH1 0x05 00002d97: DUP5 00002d98: ADD 00002d99: SLOAD 00002d9a: PUSH2 0x2da3 00002d9d: SWAP1 00002d9e: DUP5 00002d9f: PUSH2 0x3ed3 00002da2: JUMP 00002da3: JUMPDEST 00002da4: PUSH2 0x2dad 00002da7: SWAP2 00002da8: SWAP1 00002da9: PUSH2 0x3eea 00002dac: JUMP 00002dad: JUMPDEST 00002dae: SWAP1 00002daf: POP 00002db0: JUMPDEST 00002db1: PUSH1 0x07 00002db3: DUP5 00002db4: ADD 00002db5: SLOAD 00002db6: PUSH1 0x00 00002db8: SWAP1 00002db9: PUSH3 0x0f4240 00002dbd: SWAP1 00002dbe: PUSH2 0x2dc7 00002dc1: SWAP1 00002dc2: DUP5 00002dc3: PUSH2 0x3ed3 00002dc6: JUMP 00002dc7: JUMPDEST 00002dc8: PUSH2 0x2dd1 00002dcb: SWAP2 00002dcc: SWAP1 00002dcd: PUSH2 0x3eea 00002dd0: JUMP 00002dd1: JUMPDEST 00002dd2: SWAP1 00002dd3: POP 00002dd4: PUSH2 0x2ddd 00002dd7: DUP2 00002dd8: DUP4 00002dd9: PUSH2 0x3f1f 00002ddc: JUMP 00002ddd: JUMPDEST 00002dde: PUSH1 0x02 00002de0: DUP6 00002de1: ADD 00002de2: SLOAD 00002de3: SWAP1 00002de4: SWAP3 00002de5: POP 00002de6: PUSH1 0x01 00002de8: PUSH1 0x01 00002dea: PUSH1 0xa0 00002dec: SHL 00002ded: SUB 00002dee: AND 00002def: PUSH2 0x2ed7 00002df2: JUMPI 00002df3: PUSH1 0x07 00002df5: DUP5 00002df6: ADD 00002df7: SLOAD 00002df8: PUSH1 0x40 00002dfa: MLOAD 00002dfb: PUSH1 0x00 00002dfd: SWAP2 00002dfe: PUSH2 0x0100 00002e01: SWAP1 00002e02: DIV 00002e03: PUSH1 0x01 00002e05: PUSH1 0x01 00002e07: PUSH1 0xa0 00002e09: SHL 00002e0a: SUB 00002e0b: AND 00002e0c: SWAP1 00002e0d: DUP5 00002e0e: SWAP1 00002e0f: DUP4 00002e10: DUP2 00002e11: DUP2 00002e12: DUP2 00002e13: DUP6 00002e14: DUP8 00002e15: GAS 00002e16: CALL 00002e17: SWAP3 00002e18: POP 00002e19: POP 00002e1a: POP 00002e1b: RETURNDATASIZE 00002e1c: DUP1 00002e1d: PUSH1 0x00 00002e1f: DUP2 00002e20: EQ 00002e21: PUSH2 0x2e46 00002e24: JUMPI 00002e25: PUSH1 0x40 00002e27: MLOAD 00002e28: SWAP2 00002e29: POP 00002e2a: PUSH1 0x1f 00002e2c: NOT 00002e2d: PUSH1 0x3f 00002e2f: RETURNDATASIZE 00002e30: ADD 00002e31: AND 00002e32: DUP3 00002e33: ADD 00002e34: PUSH1 0x40 00002e36: MSTORE 00002e37: RETURNDATASIZE 00002e38: DUP3 00002e39: MSTORE 00002e3a: RETURNDATASIZE 00002e3b: PUSH1 0x00 00002e3d: PUSH1 0x20 00002e3f: DUP5 00002e40: ADD 00002e41: RETURNDATACOPY 00002e42: PUSH2 0x2e4b 00002e45: JUMP 00002e46: JUMPDEST 00002e47: PUSH1 0x60 00002e49: SWAP2 00002e4a: POP 00002e4b: JUMPDEST 00002e4c: POP 00002e4d: POP 00002e4e: PUSH1 0x09 00002e50: DUP8 00002e51: ADD 00002e52: SLOAD 00002e53: PUSH1 0x40 00002e55: MLOAD 00002e56: SWAP2 00002e57: SWAP3 00002e58: POP 00002e59: PUSH1 0x00 00002e5b: SWAP2 00002e5c: PUSH1 0x01 00002e5e: PUSH1 0x01 00002e60: PUSH1 0xa0 00002e62: SHL 00002e63: SUB 00002e64: SWAP1 00002e65: SWAP2 00002e66: AND 00002e67: SWAP1 00002e68: DUP5 00002e69: SWAP1 00002e6a: DUP4 00002e6b: DUP2 00002e6c: DUP2 00002e6d: DUP2 00002e6e: DUP6 00002e6f: DUP8 00002e70: GAS 00002e71: CALL 00002e72: SWAP3 00002e73: POP 00002e74: POP 00002e75: POP 00002e76: RETURNDATASIZE 00002e77: DUP1 00002e78: PUSH1 0x00 00002e7a: DUP2 00002e7b: EQ 00002e7c: PUSH2 0x2ea1 00002e7f: JUMPI 00002e80: PUSH1 0x40 00002e82: MLOAD 00002e83: SWAP2 00002e84: POP 00002e85: PUSH1 0x1f 00002e87: NOT 00002e88: PUSH1 0x3f 00002e8a: RETURNDATASIZE 00002e8b: ADD 00002e8c: AND 00002e8d: DUP3 00002e8e: ADD 00002e8f: PUSH1 0x40 00002e91: MSTORE 00002e92: RETURNDATASIZE 00002e93: DUP3 00002e94: MSTORE 00002e95: RETURNDATASIZE 00002e96: PUSH1 0x00 00002e98: PUSH1 0x20 00002e9a: DUP5 00002e9b: ADD 00002e9c: RETURNDATACOPY 00002e9d: PUSH2 0x2ea6 00002ea0: JUMP 00002ea1: JUMPDEST 00002ea2: PUSH1 0x60 00002ea4: SWAP2 00002ea5: POP 00002ea6: JUMPDEST 00002ea7: POP 00002ea8: POP 00002ea9: SWAP1 00002eaa: POP 00002eab: DUP2 00002eac: DUP1 00002ead: ISZERO 00002eae: PUSH2 0x2eb4 00002eb1: JUMPI 00002eb2: POP 00002eb3: DUP1 00002eb4: JUMPDEST 00002eb5: PUSH2 0x2ed0 00002eb8: JUMPI 00002eb9: PUSH1 0x40 00002ebb: MLOAD 00002ebc: PUSH3 0x461bcd 00002ec0: PUSH1 0xe5 00002ec2: SHL 00002ec3: DUP2 00002ec4: MSTORE 00002ec5: PUSH1 0x04 00002ec7: ADD 00002ec8: PUSH2 0x08b3 00002ecb: SWAP1 00002ecc: PUSH2 0x3f32 00002ecf: JUMP 00002ed0: JUMPDEST 00002ed1: POP 00002ed2: POP 00002ed3: PUSH2 0x2f1e 00002ed6: JUMP 00002ed7: JUMPDEST 00002ed8: PUSH1 0x02 00002eda: DUP5 00002edb: ADD 00002edc: SLOAD 00002edd: PUSH1 0x07 00002edf: DUP6 00002ee0: ADD 00002ee1: SLOAD 00002ee2: PUSH1 0x01 00002ee4: PUSH1 0x01 00002ee6: PUSH1 0xa0 00002ee8: SHL 00002ee9: SUB 00002eea: SWAP2 00002eeb: DUP3 00002eec: AND 00002eed: SWAP2 00002eee: PUSH2 0x2f00 00002ef1: SWAP2 00002ef2: DUP4 00002ef3: SWAP2 00002ef4: PUSH2 0x0100 00002ef7: SWAP1 00002ef8: SWAP2 00002ef9: DIV 00002efa: AND 00002efb: DUP6 00002efc: PUSH2 0x303f 00002eff: JUMP 00002f00: JUMPDEST 00002f01: PUSH1 0x09 00002f03: DUP7 00002f04: ADD 00002f05: SLOAD 00002f06: PUSH2 0x2f1c 00002f09: SWAP1 00002f0a: PUSH1 0x01 00002f0c: PUSH1 0x01 00002f0e: PUSH1 0xa0 00002f10: SHL 00002f11: SUB 00002f12: DUP4 00002f13: DUP2 00002f14: AND 00002f15: SWAP2 00002f16: AND 00002f17: DUP5 00002f18: PUSH2 0x303f 00002f1b: JUMP 00002f1c: JUMPDEST 00002f1d: POP 00002f1e: JUMPDEST 00002f1f: PUSH1 0x07 00002f21: DUP5 00002f22: ADD 00002f23: DUP1 00002f24: SLOAD 00002f25: PUSH1 0xff 00002f27: NOT 00002f28: AND 00002f29: PUSH1 0x03 00002f2b: OR 00002f2c: SWAP1 00002f2d: SSTORE 00002f2e: PUSH1 0x40 00002f30: MLOAD 00002f31: PUSH32 0xf65e543d34c6936603a3741b3eace109133f172d25637c2445b95c1f3288e937 00002f52: SWAP1 00002f53: PUSH2 0x2f63 00002f56: SWAP1 00002f57: DUP9 00002f58: SWAP1 00002f59: DUP6 00002f5a: SWAP1 00002f5b: DUP6 00002f5c: SWAP1 00002f5d: CALLER 00002f5e: SWAP1 00002f5f: PUSH2 0x3f5f 00002f62: JUMP 00002f63: JUMPDEST 00002f64: PUSH1 0x40 00002f66: MLOAD 00002f67: DUP1 00002f68: SWAP2 00002f69: SUB 00002f6a: SWAP1 00002f6b: LOG1 00002f6c: POP 00002f6d: POP 00002f6e: POP 00002f6f: POP 00002f70: POP 00002f71: PUSH2 0x23fa 00002f74: PUSH2 0x309e 00002f77: JUMP 00002f78: JUMPDEST 00002f79: PUSH2 0x2f80 00002f7c: PUSH2 0x2fe9 00002f7f: JUMP 00002f80: JUMPDEST 00002f81: PUSH1 0x01 00002f83: PUSH1 0x01 00002f85: PUSH1 0xa0 00002f87: SHL 00002f88: SUB 00002f89: DUP2 00002f8a: AND 00002f8b: PUSH2 0x2faa 00002f8e: JUMPI 00002f8f: PUSH1 0x00 00002f91: PUSH1 0x40 00002f93: MLOAD 00002f94: PUSH4 0x1e4fbdf7 00002f99: PUSH1 0xe0 00002f9b: SHL 00002f9c: DUP2 00002f9d: MSTORE 00002f9e: PUSH1 0x04 00002fa0: ADD 00002fa1: PUSH2 0x08b3 00002fa4: SWAP2 00002fa5: SWAP1 00002fa6: PUSH2 0x3cef 00002fa9: JUMP 00002faa: JUMPDEST 00002fab: PUSH2 0x23fa 00002fae: DUP2 00002faf: PUSH2 0x330e 00002fb2: JUMP 00002fb3: JUMPDEST 00002fb4: PUSH1 0x00 00002fb6: PUSH2 0x2fbd 00002fb9: PUSH2 0x37ab 00002fbc: JUMP 00002fbd: JUMPDEST 00002fbe: DUP1 00002fbf: SLOAD 00002fc0: SWAP1 00002fc1: SWAP2 00002fc2: POP 00002fc3: PUSH1 0x01 00002fc5: NOT 00002fc6: ADD 00002fc7: PUSH2 0x2fe3 00002fca: JUMPI 00002fcb: PUSH1 0x40 00002fcd: MLOAD 00002fce: PUSH4 0x3ee5aeb5 00002fd3: PUSH1 0xe0 00002fd5: SHL 00002fd6: DUP2 00002fd7: MSTORE 00002fd8: PUSH1 0x04 00002fda: ADD 00002fdb: PUSH1 0x40 00002fdd: MLOAD 00002fde: DUP1 00002fdf: SWAP2 00002fe0: SUB 00002fe1: SWAP1 00002fe2: REVERT 00002fe3: JUMPDEST 00002fe4: PUSH1 0x02 00002fe6: SWAP1 00002fe7: SSTORE 00002fe8: JUMP 00002fe9: JUMPDEST 00002fea: CALLER 00002feb: PUSH2 0x2ff2 00002fee: PUSH2 0x1b93 00002ff1: JUMP 00002ff2: JUMPDEST 00002ff3: PUSH1 0x01 00002ff5: PUSH1 0x01 00002ff7: PUSH1 0xa0 00002ff9: SHL 00002ffa: SUB 00002ffb: AND 00002ffc: EQ 00002ffd: PUSH2 0x129b 00003000: JUMPI 00003001: CALLER 00003002: PUSH1 0x40 00003004: MLOAD 00003005: PUSH4 0x118cdaa7 0000300a: PUSH1 0xe0 0000300c: SHL 0000300d: DUP2 0000300e: MSTORE 0000300f: PUSH1 0x04 00003011: ADD 00003012: PUSH2 0x08b3 00003015: SWAP2 00003016: SWAP1 00003017: PUSH2 0x3cef 0000301a: JUMP 0000301b: JUMPDEST 0000301c: PUSH32 0x02c326031f2f3dedd13e7fde59c7c20af05a8826f4c07e8d42538c5f2be06800 0000303d: SWAP1 0000303e: JUMP 0000303f: JUMPDEST 00003040: PUSH1 0x40 00003042: MLOAD 00003043: PUSH1 0x01 00003045: PUSH1 0x01 00003047: PUSH1 0xa0 00003049: SHL 0000304a: SUB 0000304b: DUP4 0000304c: DUP2 0000304d: AND 0000304e: PUSH1 0x24 00003050: DUP4 00003051: ADD 00003052: MSTORE 00003053: PUSH1 0x44 00003055: DUP3 00003056: ADD 00003057: DUP4 00003058: SWAP1 00003059: MSTORE 0000305a: PUSH2 0x0830 0000305d: SWAP2 0000305e: DUP6 0000305f: SWAP2 00003060: DUP3 00003061: AND 00003062: SWAP1 00003063: PUSH4 0xa9059cbb 00003068: SWAP1 00003069: PUSH1 0x64 0000306b: ADD 0000306c: JUMPDEST 0000306d: PUSH1 0x40 0000306f: MLOAD 00003070: PUSH1 0x20 00003072: DUP2 00003073: DUP4 00003074: SUB 00003075: SUB 00003076: DUP2 00003077: MSTORE 00003078: SWAP1 00003079: PUSH1 0x40 0000307b: MSTORE 0000307c: SWAP2 0000307d: POP 0000307e: PUSH1 0xe0 00003080: SHL 00003081: PUSH1 0x20 00003083: DUP3 00003084: ADD 00003085: DUP1 00003086: MLOAD 00003087: PUSH1 0x01 00003089: PUSH1 0x01 0000308b: PUSH1 0xe0 0000308d: SHL 0000308e: SUB 0000308f: DUP4 00003090: DUP2 00003091: DUP4 00003092: AND 00003093: OR 00003094: DUP4 00003095: MSTORE 00003096: POP 00003097: POP 00003098: POP 00003099: POP 0000309a: PUSH2 0x37cf 0000309d: JUMP 0000309e: JUMPDEST 0000309f: PUSH1 0x00 000030a1: PUSH2 0x30a8 000030a4: PUSH2 0x37ab 000030a7: JUMP 000030a8: JUMPDEST 000030a9: PUSH1 0x01 000030ab: SWAP1 000030ac: SSTORE 000030ad: POP 000030ae: JUMP 000030af: JUMPDEST 000030b0: PUSH1 0x00 000030b2: DUP1 000030b3: PUSH2 0x30ba 000030b6: PUSH2 0x301b 000030b9: JUMP 000030ba: JUMPDEST 000030bb: PUSH1 0x00 000030bd: DUP6 000030be: DUP2 000030bf: MSTORE 000030c0: PUSH1 0x02 000030c2: DUP3 000030c3: ADD 000030c4: PUSH1 0x20 000030c6: SWAP1 000030c7: DUP2 000030c8: MSTORE 000030c9: PUSH1 0x40 000030cb: DUP1 000030cc: DUP4 000030cd: KECCAK256 000030ce: PUSH1 0x01 000030d0: DUP1 000030d1: DUP3 000030d2: ADD 000030d3: SLOAD 000030d4: DUP6 000030d5: MSTORE 000030d6: DUP1 000030d7: DUP7 000030d8: ADD 000030d9: SWAP1 000030da: SWAP4 000030db: MSTORE 000030dc: SWAP3 000030dd: KECCAK256 000030de: PUSH1 0x07 000030e0: DUP4 000030e1: ADD 000030e2: SLOAD 000030e3: SWAP4 000030e4: SWAP5 000030e5: POP 000030e6: SWAP2 000030e7: SWAP3 000030e8: PUSH1 0xff 000030ea: AND 000030eb: EQ 000030ec: PUSH2 0x3107 000030ef: JUMPI 000030f0: PUSH1 0x40 000030f2: MLOAD 000030f3: PUSH3 0x461bcd 000030f7: PUSH1 0xe5 000030f9: SHL 000030fa: DUP2 000030fb: MSTORE 000030fc: PUSH1 0x04 000030fe: ADD 000030ff: PUSH2 0x08b3 00003102: SWAP1 00003103: PUSH2 0x4137 00003106: JUMP 00003107: JUMPDEST 00003108: PUSH1 0x01 0000310a: DUP2 0000310b: DUP2 0000310c: ADD 0000310d: SLOAD 0000310e: PUSH1 0x01 00003110: PUSH1 0x98 00003112: SHL 00003113: SWAP1 00003114: DIV 00003115: PUSH1 0xff 00003117: AND 00003118: EQ 00003119: PUSH2 0x3134 0000311c: JUMPI 0000311d: PUSH1 0x40 0000311f: MLOAD 00003120: PUSH3 0x461bcd 00003124: PUSH1 0xe5 00003126: SHL 00003127: DUP2 00003128: MSTORE 00003129: PUSH1 0x04 0000312b: ADD 0000312c: PUSH2 0x08b3 0000312f: SWAP1 00003130: PUSH2 0x4165 00003133: JUMP 00003134: JUMPDEST 00003135: PUSH1 0x00 00003137: DUP6 00003138: GT 00003139: PUSH2 0x3154 0000313c: JUMPI 0000313d: PUSH1 0x40 0000313f: MLOAD 00003140: PUSH3 0x461bcd 00003144: PUSH1 0xe5 00003146: SHL 00003147: DUP2 00003148: MSTORE 00003149: PUSH1 0x04 0000314b: ADD 0000314c: PUSH2 0x08b3 0000314f: SWAP1 00003150: PUSH2 0x4193 00003153: JUMP 00003154: JUMPDEST 00003155: DUP5 00003156: DUP3 00003157: PUSH1 0x06 00003159: ADD 0000315a: SLOAD 0000315b: DUP4 0000315c: PUSH1 0x03 0000315e: ADD 0000315f: SLOAD 00003160: PUSH2 0x3169 00003163: SWAP2 00003164: SWAP1 00003165: PUSH2 0x3f1f 00003168: JUMP 00003169: JUMPDEST 0000316a: LT 0000316b: ISZERO 0000316c: PUSH2 0x3187 0000316f: JUMPI 00003170: PUSH1 0x40 00003172: MLOAD 00003173: PUSH3 0x461bcd 00003177: PUSH1 0xe5 00003179: SHL 0000317a: DUP2 0000317b: MSTORE 0000317c: PUSH1 0x04 0000317e: ADD 0000317f: PUSH2 0x08b3 00003182: SWAP1 00003183: PUSH2 0x41bb 00003186: JUMP 00003187: JUMPDEST 00003188: DUP2 00003189: PUSH1 0x08 0000318b: ADD 0000318c: SLOAD 0000318d: DUP3 0000318e: PUSH1 0x06 00003190: ADD 00003191: SLOAD 00003192: DUP4 00003193: PUSH1 0x03 00003195: ADD 00003196: SLOAD 00003197: PUSH2 0x31a0 0000319a: SWAP2 0000319b: SWAP1 0000319c: PUSH2 0x3f1f 0000319f: JUMP 000031a0: JUMPDEST 000031a1: GT 000031a2: ISZERO 000031a3: PUSH2 0x320e 000031a6: JUMPI 000031a7: DUP2 000031a8: PUSH1 0x08 000031aa: ADD 000031ab: SLOAD 000031ac: DUP6 000031ad: LT 000031ae: ISZERO 000031af: PUSH2 0x3209 000031b2: JUMPI 000031b3: PUSH1 0x40 000031b5: MLOAD 000031b6: PUSH3 0x461bcd 000031ba: PUSH1 0xe5 000031bc: SHL 000031bd: DUP2 000031be: MSTORE 000031bf: PUSH1 0x20 000031c1: PUSH1 0x04 000031c3: DUP3 000031c4: ADD 000031c5: MSTORE 000031c6: PUSH1 0x38 000031c8: PUSH1 0x24 000031ca: DUP3 000031cb: ADD 000031cc: MSTORE 000031cd: PUSH1 0x00 000031cf: DUP1 000031d0: MLOAD 000031d1: PUSH1 0x20 000031d3: PUSH2 0x43b8 000031d6: DUP4 000031d7: CODECOPY 000031d8: DUP2 000031d9: MLOAD 000031da: SWAP2 000031db: MSTORE 000031dc: PUSH1 0x44 000031de: DUP3 000031df: ADD 000031e0: MSTORE 000031e1: PUSH24 0x1b5bdd5b9d081bdc88185cdcd95d081b5a5b985b5bdd5b9d 000031fa: PUSH1 0x42 000031fc: SHL 000031fd: PUSH1 0x64 000031ff: DUP3 00003200: ADD 00003201: MSTORE 00003202: PUSH1 0x84 00003204: ADD 00003205: PUSH2 0x08b3 00003208: JUMP 00003209: JUMPDEST 0000320a: PUSH2 0x3240 0000320d: JUMP 0000320e: JUMPDEST 0000320f: DUP2 00003210: PUSH1 0x06 00003212: ADD 00003213: SLOAD 00003214: DUP3 00003215: PUSH1 0x03 00003217: ADD 00003218: SLOAD 00003219: PUSH2 0x3222 0000321c: SWAP2 0000321d: SWAP1 0000321e: PUSH2 0x3f1f 00003221: JUMP 00003222: JUMPDEST 00003223: DUP6 00003224: EQ 00003225: PUSH2 0x3240 00003228: JUMPI 00003229: PUSH1 0x40 0000322b: MLOAD 0000322c: PUSH3 0x461bcd 00003230: PUSH1 0xe5 00003232: SHL 00003233: DUP2 00003234: MSTORE 00003235: PUSH1 0x04 00003237: ADD 00003238: PUSH2 0x08b3 0000323b: SWAP1 0000323c: PUSH2 0x41ed 0000323f: JUMP 00003240: JUMPDEST 00003241: PUSH1 0x02 00003243: DUP3 00003244: ADD 00003245: SLOAD 00003246: PUSH1 0x01 00003248: PUSH1 0x01 0000324a: PUSH1 0xa0 0000324c: SHL 0000324d: SUB 0000324e: AND 0000324f: ISZERO 00003250: PUSH2 0x326b 00003253: JUMPI 00003254: PUSH1 0x40 00003256: MLOAD 00003257: PUSH3 0x461bcd 0000325b: PUSH1 0xe5 0000325d: SHL 0000325e: DUP2 0000325f: MSTORE 00003260: PUSH1 0x04 00003262: ADD 00003263: PUSH2 0x08b3 00003266: SWAP1 00003267: PUSH2 0x4242 0000326a: JUMP 0000326b: JUMPDEST 0000326c: DUP2 0000326d: SLOAD 0000326e: PUSH1 0x00 00003270: SWAP1 00003271: DUP2 00003272: SWAP1 00003273: PUSH1 0xff 00003275: AND 00003276: PUSH1 0x00 00003278: NOT 00003279: ADD 0000327a: PUSH2 0x32bc 0000327d: JUMPI 0000327e: DUP4 0000327f: PUSH1 0x03 00003281: ADD 00003282: SLOAD 00003283: DUP8 00003284: DUP6 00003285: PUSH1 0x05 00003287: ADD 00003288: SLOAD 00003289: PUSH2 0x3292 0000328c: SWAP2 0000328d: SWAP1 0000328e: PUSH2 0x3ed3 00003291: JUMP 00003292: JUMPDEST 00003293: PUSH2 0x329c 00003296: SWAP2 00003297: SWAP1 00003298: PUSH2 0x3eea 0000329b: JUMP 0000329c: JUMPDEST 0000329d: PUSH1 0x07 0000329f: DUP6 000032a0: ADD 000032a1: SLOAD 000032a2: SWAP1 000032a3: SWAP7 000032a4: POP 000032a5: PUSH2 0x0100 000032a8: SWAP1 000032a9: DIV 000032aa: PUSH1 0x01 000032ac: PUSH1 0x01 000032ae: PUSH1 0xa0 000032b0: SHL 000032b1: SUB 000032b2: AND 000032b3: SWAP2 000032b4: POP 000032b5: CALLER 000032b6: SWAP1 000032b7: POP 000032b8: PUSH2 0x32f7 000032bb: JUMP 000032bc: JUMPDEST 000032bd: DUP4 000032be: PUSH1 0x03 000032c0: ADD 000032c1: SLOAD 000032c2: DUP8 000032c3: DUP6 000032c4: PUSH1 0x04 000032c6: ADD 000032c7: SLOAD 000032c8: PUSH2 0x32d1 000032cb: SWAP2 000032cc: SWAP1 000032cd: PUSH2 0x3ed3 000032d0: JUMP 000032d1: JUMPDEST 000032d2: PUSH2 0x32db 000032d5: SWAP2 000032d6: SWAP1 000032d7: PUSH2 0x3eea 000032da: JUMP 000032db: JUMPDEST 000032dc: PUSH1 0x07 000032de: DUP6 000032df: ADD 000032e0: SLOAD 000032e1: SWAP1 000032e2: SWAP7 000032e3: POP 000032e4: CALLER 000032e5: SWAP3 000032e6: POP 000032e7: PUSH2 0x0100 000032ea: SWAP1 000032eb: DIV 000032ec: PUSH1 0x01 000032ee: PUSH1 0x01 000032f0: PUSH1 0xa0 000032f2: SHL 000032f3: SUB 000032f4: AND 000032f5: SWAP1 000032f6: POP 000032f7: JUMPDEST 000032f8: PUSH2 0x3303 000032fb: DUP9 000032fc: DUP9 000032fd: DUP5 000032fe: DUP5 000032ff: PUSH2 0x3584 00003302: JUMP 00003303: JUMPDEST 00003304: POP 00003305: POP 00003306: POP 00003307: POP 00003308: POP 00003309: SWAP3 0000330a: SWAP2 0000330b: POP 0000330c: POP 0000330d: JUMP 0000330e: JUMPDEST 0000330f: PUSH1 0x00 00003311: PUSH2 0x3318 00003314: PUSH2 0x3787 00003317: JUMP 00003318: JUMPDEST 00003319: DUP1 0000331a: SLOAD 0000331b: PUSH1 0x01 0000331d: PUSH1 0x01 0000331f: PUSH1 0xa0 00003321: SHL 00003322: SUB 00003323: DUP5 00003324: DUP2 00003325: AND 00003326: PUSH1 0x01 00003328: PUSH1 0x01 0000332a: PUSH1 0xa0 0000332c: SHL 0000332d: SUB 0000332e: NOT 0000332f: DUP4 00003330: AND 00003331: DUP2 00003332: OR 00003333: DUP5 00003334: SSTORE 00003335: PUSH1 0x40 00003337: MLOAD 00003338: SWAP4 00003339: SWAP5 0000333a: POP 0000333b: SWAP2 0000333c: AND 0000333d: SWAP2 0000333e: DUP3 0000333f: SWAP1 00003340: PUSH32 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0 00003361: SWAP1 00003362: PUSH1 0x00 00003364: SWAP1 00003365: LOG3 00003366: POP 00003367: POP 00003368: POP 00003369: JUMP 0000336a: JUMPDEST 0000336b: PUSH1 0x00 0000336d: PUSH2 0x3374 00003370: PUSH2 0x301b 00003373: JUMP 00003374: JUMPDEST 00003375: SWAP1 00003376: POP 00003377: PUSH1 0x40 00003379: MLOAD 0000337a: DUP1 0000337b: PUSH2 0x0140 0000337e: ADD 0000337f: PUSH1 0x40 00003381: MSTORE 00003382: DUP1 00003383: DUP10 00003384: PUSH1 0xff 00003386: AND 00003387: DUP2 00003388: MSTORE 00003389: PUSH1 0x20 0000338b: ADD 0000338c: DUP9 0000338d: DUP2 0000338e: MSTORE 0000338f: PUSH1 0x20 00003391: ADD 00003392: DUP8 00003393: PUSH1 0x01 00003395: PUSH1 0x01 00003397: PUSH1 0xa0 00003399: SHL 0000339a: SUB 0000339b: AND 0000339c: DUP2 0000339d: MSTORE 0000339e: PUSH1 0x20 000033a0: ADD 000033a1: DUP7 000033a2: DUP2 000033a3: MSTORE 000033a4: PUSH1 0x20 000033a6: ADD 000033a7: DUP6 000033a8: DUP2 000033a9: MSTORE 000033aa: PUSH1 0x20 000033ac: ADD 000033ad: DUP5 000033ae: DUP2 000033af: MSTORE 000033b0: PUSH1 0x20 000033b2: ADD 000033b3: PUSH1 0x00 000033b5: DUP2 000033b6: MSTORE 000033b7: PUSH1 0x20 000033b9: ADD 000033ba: PUSH1 0x01 000033bc: PUSH1 0xff 000033be: AND 000033bf: DUP2 000033c0: MSTORE 000033c1: PUSH1 0x20 000033c3: ADD 000033c4: CALLER 000033c5: PUSH1 0x01 000033c7: PUSH1 0x01 000033c9: PUSH1 0xa0 000033cb: SHL 000033cc: SUB 000033cd: AND 000033ce: DUP2 000033cf: MSTORE 000033d0: PUSH1 0x20 000033d2: ADD 000033d3: DUP4 000033d4: DUP2 000033d5: MSTORE 000033d6: POP 000033d7: DUP2 000033d8: PUSH1 0x02 000033da: ADD 000033db: PUSH1 0x00 000033dd: DUP4 000033de: PUSH1 0x03 000033e0: ADD 000033e1: PUSH1 0x00 000033e3: DUP2 000033e4: SLOAD 000033e5: PUSH2 0x33ed 000033e8: SWAP1 000033e9: PUSH2 0x3e0a 000033ec: JUMP 000033ed: JUMPDEST 000033ee: SWAP2 000033ef: DUP3 000033f0: SWAP1 000033f1: SSTORE 000033f2: POP 000033f3: DUP2 000033f4: MSTORE 000033f5: PUSH1 0x20 000033f7: DUP1 000033f8: DUP3 000033f9: ADD 000033fa: SWAP3 000033fb: SWAP1 000033fc: SWAP3 000033fd: MSTORE 000033fe: PUSH1 0x40 00003400: SWAP1 00003401: DUP2 00003402: ADD 00003403: PUSH1 0x00 00003405: KECCAK256 00003406: DUP4 00003407: MLOAD 00003408: DUP2 00003409: SLOAD 0000340a: PUSH1 0xff 0000340c: SWAP2 0000340d: DUP3 0000340e: AND 0000340f: PUSH1 0xff 00003411: NOT 00003412: SWAP1 00003413: SWAP2 00003414: AND 00003415: OR 00003416: DUP3 00003417: SSTORE 00003418: SWAP3 00003419: DUP5 0000341a: ADD 0000341b: MLOAD 0000341c: PUSH1 0x01 0000341e: DUP3 0000341f: ADD 00003420: SSTORE 00003421: DUP4 00003422: DUP3 00003423: ADD 00003424: MLOAD 00003425: PUSH1 0x02 00003427: DUP3 00003428: ADD 00003429: DUP1 0000342a: SLOAD 0000342b: PUSH1 0x01 0000342d: PUSH1 0x01 0000342f: PUSH1 0xa0 00003431: SHL 00003432: SUB 00003433: SWAP3 00003434: DUP4 00003435: AND 00003436: PUSH1 0x01 00003438: PUSH1 0x01 0000343a: PUSH1 0xa0 0000343c: SHL 0000343d: SUB 0000343e: NOT 0000343f: SWAP1 00003440: SWAP2 00003441: AND 00003442: OR 00003443: SWAP1 00003444: SSTORE 00003445: PUSH1 0x60 00003447: DUP6 00003448: ADD 00003449: MLOAD 0000344a: PUSH1 0x03 0000344c: DUP1 0000344d: DUP5 0000344e: ADD 0000344f: SWAP2 00003450: SWAP1 00003451: SWAP2 00003452: SSTORE 00003453: PUSH1 0x80 00003455: DUP7 00003456: ADD 00003457: MLOAD 00003458: PUSH1 0x04 0000345a: DUP5 0000345b: ADD 0000345c: SSTORE 0000345d: PUSH1 0xa0 0000345f: DUP7 00003460: ADD 00003461: MLOAD 00003462: PUSH1 0x05 00003464: DUP5 00003465: ADD 00003466: SSTORE 00003467: PUSH1 0xc0 00003469: DUP7 0000346a: ADD 0000346b: MLOAD 0000346c: PUSH1 0x06 0000346e: DUP5 0000346f: ADD 00003470: SSTORE 00003471: PUSH1 0xe0 00003473: DUP7 00003474: ADD 00003475: MLOAD 00003476: PUSH1 0x07 00003478: DUP5 00003479: ADD 0000347a: DUP1 0000347b: SLOAD 0000347c: PUSH2 0x0100 0000347f: DUP1 00003480: DUP11 00003481: ADD 00003482: MLOAD 00003483: SWAP1 00003484: SWAP6 00003485: AND 00003486: SWAP1 00003487: SWAP5 00003488: MUL 00003489: PUSH1 0x01 0000348b: PUSH1 0x01 0000348d: PUSH1 0xa8 0000348f: SHL 00003490: SUB 00003491: NOT 00003492: SWAP1 00003493: SWAP5 00003494: AND 00003495: SWAP2 00003496: SWAP1 00003497: SWAP7 00003498: AND 00003499: OR 0000349a: SWAP2 0000349b: SWAP1 0000349c: SWAP2 0000349d: OR 0000349e: SWAP1 0000349f: SWAP4 000034a0: SSTORE 000034a1: PUSH2 0x0120 000034a4: SWAP1 000034a5: SWAP4 000034a6: ADD 000034a7: MLOAD 000034a8: PUSH1 0x08 000034aa: SWAP1 000034ab: SWAP4 000034ac: ADD 000034ad: SWAP3 000034ae: SWAP1 000034af: SWAP3 000034b0: SSTORE 000034b1: DUP3 000034b2: ADD 000034b3: SLOAD 000034b4: SWAP1 000034b5: MLOAD 000034b6: PUSH32 0x3c39725ebd87585be65053a2e2e6eb510fec10780b584e490d11c8b2cc9311ea 000034d7: SWAP2 000034d8: PUSH2 0x3539 000034db: SWAP2 000034dc: DUP12 000034dd: SWAP1 000034de: DUP12 000034df: SWAP1 000034e0: DUP12 000034e1: SWAP1 000034e2: DUP12 000034e3: SWAP1 000034e4: DUP12 000034e5: SWAP1 000034e6: DUP12 000034e7: SWAP1 000034e8: DUP12 000034e9: SWAP1 000034ea: CALLER 000034eb: SWAP1 000034ec: SWAP9 000034ed: DUP10 000034ee: MSTORE 000034ef: PUSH1 0xff 000034f1: SWAP8 000034f2: SWAP1 000034f3: SWAP8 000034f4: AND 000034f5: PUSH1 0x20 000034f7: DUP10 000034f8: ADD 000034f9: MSTORE 000034fa: PUSH1 0x40 000034fc: DUP9 000034fd: ADD 000034fe: SWAP6 000034ff: SWAP1 00003500: SWAP6 00003501: MSTORE 00003502: PUSH1 0x01 00003504: PUSH1 0x01 00003506: PUSH1 0xa0 00003508: SHL 00003509: SUB 0000350a: SWAP4 0000350b: DUP5 0000350c: AND 0000350d: PUSH1 0x60 0000350f: DUP9 00003510: ADD 00003511: MSTORE 00003512: PUSH1 0x80 00003514: DUP8 00003515: ADD 00003516: SWAP3 00003517: SWAP1 00003518: SWAP3 00003519: MSTORE 0000351a: PUSH1 0xa0 0000351c: DUP7 0000351d: ADD 0000351e: MSTORE 0000351f: PUSH1 0xc0 00003521: DUP6 00003522: ADD 00003523: MSTORE 00003524: PUSH1 0xe0 00003526: DUP5 00003527: ADD 00003528: SWAP2 00003529: SWAP1 0000352a: SWAP2 0000352b: MSTORE 0000352c: AND 0000352d: PUSH2 0x0100 00003530: DUP3 00003531: ADD 00003532: MSTORE 00003533: PUSH2 0x0120 00003536: ADD 00003537: SWAP1 00003538: JUMP 00003539: JUMPDEST 0000353a: PUSH1 0x40 0000353c: MLOAD 0000353d: DUP1 0000353e: SWAP2 0000353f: SUB 00003540: SWAP1 00003541: LOG1 00003542: POP 00003543: POP 00003544: POP 00003545: POP 00003546: POP 00003547: POP 00003548: POP 00003549: POP 0000354a: JUMP 0000354b: JUMPDEST 0000354c: PUSH1 0x40 0000354e: MLOAD 0000354f: PUSH1 0x01 00003551: PUSH1 0x01 00003553: PUSH1 0xa0 00003555: SHL 00003556: SUB 00003557: DUP5 00003558: DUP2 00003559: AND 0000355a: PUSH1 0x24 0000355c: DUP4 0000355d: ADD 0000355e: MSTORE 0000355f: DUP4 00003560: DUP2 00003561: AND 00003562: PUSH1 0x44 00003564: DUP4 00003565: ADD 00003566: MSTORE 00003567: PUSH1 0x64 00003569: DUP3 0000356a: ADD 0000356b: DUP4 0000356c: SWAP1 0000356d: MSTORE 0000356e: PUSH2 0x10f0 00003571: SWAP2 00003572: DUP7 00003573: SWAP2 00003574: DUP3 00003575: AND 00003576: SWAP1 00003577: PUSH4 0x23b872dd 0000357c: SWAP1 0000357d: PUSH1 0x84 0000357f: ADD 00003580: PUSH2 0x306c 00003583: JUMP 00003584: JUMPDEST 00003585: PUSH1 0x00 00003587: PUSH2 0x358e 0000358a: PUSH2 0x301b 0000358d: JUMP 0000358e: JUMPDEST 0000358f: SWAP1 00003590: POP 00003591: PUSH1 0x00 00003593: DUP2 00003594: PUSH1 0x02 00003596: ADD 00003597: PUSH1 0x00 00003599: DUP8 0000359a: DUP2 0000359b: MSTORE 0000359c: PUSH1 0x20 0000359e: ADD 0000359f: SWAP1 000035a0: DUP2 000035a1: MSTORE 000035a2: PUSH1 0x20 000035a4: ADD 000035a5: PUSH1 0x00 000035a7: KECCAK256 000035a8: SWAP1 000035a9: POP 000035aa: PUSH1 0x40 000035ac: MLOAD 000035ad: DUP1 000035ae: PUSH1 0xa0 000035b0: ADD 000035b1: PUSH1 0x40 000035b3: MSTORE 000035b4: DUP1 000035b5: DUP8 000035b6: DUP2 000035b7: MSTORE 000035b8: PUSH1 0x20 000035ba: ADD 000035bb: DUP7 000035bc: DUP2 000035bd: MSTORE 000035be: PUSH1 0x20 000035c0: ADD 000035c1: DUP5 000035c2: PUSH1 0x01 000035c4: PUSH1 0x01 000035c6: PUSH1 0xa0 000035c8: SHL 000035c9: SUB 000035ca: AND 000035cb: DUP2 000035cc: MSTORE 000035cd: PUSH1 0x20 000035cf: ADD 000035d0: DUP6 000035d1: PUSH1 0x01 000035d3: PUSH1 0x01 000035d5: PUSH1 0xa0 000035d7: SHL 000035d8: SUB 000035d9: AND 000035da: DUP2 000035db: MSTORE 000035dc: PUSH1 0x20 000035de: ADD 000035df: PUSH1 0x01 000035e1: PUSH1 0xff 000035e3: AND 000035e4: DUP2 000035e5: MSTORE 000035e6: POP 000035e7: DUP3 000035e8: PUSH1 0x04 000035ea: ADD 000035eb: PUSH1 0x00 000035ed: DUP5 000035ee: PUSH1 0x05 000035f0: ADD 000035f1: PUSH1 0x00 000035f3: DUP2 000035f4: SLOAD 000035f5: PUSH2 0x35fd 000035f8: SWAP1 000035f9: PUSH2 0x3e0a 000035fc: JUMP 000035fd: JUMPDEST 000035fe: SWAP2 000035ff: DUP3 00003600: SWAP1 00003601: SSTORE 00003602: POP 00003603: DUP2 00003604: MSTORE 00003605: PUSH1 0x20 00003607: DUP1 00003608: DUP3 00003609: ADD 0000360a: SWAP3 0000360b: SWAP1 0000360c: SWAP3 0000360d: MSTORE 0000360e: PUSH1 0x40 00003610: SWAP1 00003611: DUP2 00003612: ADD 00003613: PUSH1 0x00 00003615: SWAP1 00003616: DUP2 00003617: KECCAK256 00003618: DUP5 00003619: MLOAD 0000361a: DUP2 0000361b: SSTORE 0000361c: SWAP3 0000361d: DUP5 0000361e: ADD 0000361f: MLOAD 00003620: PUSH1 0x01 00003622: DUP5 00003623: ADD 00003624: SSTORE 00003625: SWAP1 00003626: DUP4 00003627: ADD 00003628: MLOAD 00003629: PUSH1 0x02 0000362b: DUP4 0000362c: ADD 0000362d: DUP1 0000362e: SLOAD 0000362f: PUSH1 0x01 00003631: PUSH1 0x01 00003633: PUSH1 0xa0 00003635: SHL 00003636: SUB 00003637: SWAP3 00003638: DUP4 00003639: AND 0000363a: PUSH1 0x01 0000363c: PUSH1 0x01 0000363e: PUSH1 0xa0 00003640: SHL 00003641: SUB 00003642: NOT 00003643: SWAP1 00003644: SWAP2 00003645: AND 00003646: OR 00003647: SWAP1 00003648: SSTORE 00003649: PUSH1 0x60 0000364b: DUP5 0000364c: ADD 0000364d: MLOAD 0000364e: PUSH1 0x03 00003650: SWAP1 00003651: SWAP4 00003652: ADD 00003653: DUP1 00003654: SLOAD 00003655: PUSH1 0x80 00003657: SWAP1 00003658: SWAP6 00003659: ADD 0000365a: MLOAD 0000365b: PUSH1 0xff 0000365d: AND 0000365e: PUSH1 0x01 00003660: PUSH1 0xa0 00003662: SHL 00003663: MUL 00003664: PUSH1 0x01 00003666: PUSH1 0x01 00003668: PUSH1 0xa8 0000366a: SHL 0000366b: SUB 0000366c: NOT 0000366d: SWAP1 0000366e: SWAP6 0000366f: AND 00003670: SWAP4 00003671: SWAP1 00003672: SWAP2 00003673: AND 00003674: SWAP3 00003675: SWAP1 00003676: SWAP3 00003677: OR 00003678: SWAP3 00003679: SWAP1 0000367a: SWAP3 0000367b: OR 0000367c: SWAP1 0000367d: SSTORE 0000367e: PUSH1 0x06 00003680: DUP3 00003681: ADD 00003682: DUP1 00003683: SLOAD 00003684: DUP8 00003685: SWAP3 00003686: SWAP1 00003687: PUSH2 0x3691 0000368a: SWAP1 0000368b: DUP5 0000368c: SWAP1 0000368d: PUSH2 0x3f0c 00003690: JUMP 00003691: JUMPDEST 00003692: SWAP1 00003693: SWAP2 00003694: SSTORE 00003695: POP 00003696: POP 00003697: PUSH1 0x03 00003699: DUP2 0000369a: ADD 0000369b: SLOAD 0000369c: PUSH1 0x06 0000369e: DUP3 0000369f: ADD 000036a0: SLOAD 000036a1: SUB 000036a2: PUSH2 0x36ee 000036a5: JUMPI 000036a6: PUSH1 0x07 000036a8: DUP2 000036a9: ADD 000036aa: DUP1 000036ab: SLOAD 000036ac: PUSH1 0xff 000036ae: NOT 000036af: AND 000036b0: PUSH1 0x02 000036b2: OR 000036b3: SWAP1 000036b4: SSTORE 000036b5: PUSH1 0x40 000036b7: DUP1 000036b8: MLOAD 000036b9: DUP8 000036ba: DUP2 000036bb: MSTORE 000036bc: PUSH1 0x00 000036be: PUSH1 0x20 000036c0: DUP3 000036c1: ADD 000036c2: MSTORE 000036c3: PUSH32 0x37a30d6e3fcaec3144b11d51892b9eadbb0ec4d2a8a813d64bb6065c3adfcffa 000036e4: SWAP2 000036e5: ADD 000036e6: PUSH1 0x40 000036e8: MLOAD 000036e9: DUP1 000036ea: SWAP2 000036eb: SUB 000036ec: SWAP1 000036ed: LOG1 000036ee: JUMPDEST 000036ef: PUSH1 0x05 000036f1: DUP3 000036f2: ADD 000036f3: SLOAD 000036f4: PUSH1 0x40 000036f6: DUP1 000036f7: MLOAD 000036f8: SWAP2 000036f9: DUP3 000036fa: MSTORE 000036fb: PUSH1 0x20 000036fd: DUP3 000036fe: ADD 000036ff: DUP9 00003700: SWAP1 00003701: MSTORE 00003702: DUP2 00003703: ADD 00003704: DUP7 00003705: SWAP1 00003706: MSTORE 00003707: PUSH1 0x01 00003709: PUSH1 0x01 0000370b: PUSH1 0xa0 0000370d: SHL 0000370e: SUB 0000370f: DUP1 00003710: DUP6 00003711: AND 00003712: PUSH1 0x60 00003714: DUP4 00003715: ADD 00003716: MSTORE 00003717: DUP6 00003718: AND 00003719: PUSH1 0x80 0000371b: DUP3 0000371c: ADD 0000371d: MSTORE 0000371e: PUSH32 0xdc3effd7f2b46d1989f8b9ec5abba2e3c07eaa9caa9511c8af3c9444ecbb52f2 0000373f: SWAP1 00003740: PUSH1 0xa0 00003742: ADD 00003743: PUSH1 0x40 00003745: MLOAD 00003746: DUP1 00003747: SWAP2 00003748: SUB 00003749: SWAP1 0000374a: LOG1 0000374b: POP 0000374c: POP 0000374d: POP 0000374e: POP 0000374f: POP 00003750: POP 00003751: JUMP 00003752: JUMPDEST 00003753: PUSH32 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00 00003774: SWAP1 00003775: JUMP 00003776: JUMPDEST 00003777: PUSH2 0x377e 0000377a: PUSH2 0x3829 0000377d: JUMP 0000377e: JUMPDEST 0000377f: PUSH2 0x23fa 00003782: DUP2 00003783: PUSH2 0x384e 00003786: JUMP 00003787: JUMPDEST 00003788: PUSH32 0x9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300 000037a9: SWAP1 000037aa: JUMP 000037ab: JUMPDEST 000037ac: PUSH32 0x9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00 000037cd: SWAP1 000037ce: JUMP 000037cf: JUMPDEST 000037d0: PUSH1 0x00 000037d2: PUSH2 0x37e4 000037d5: PUSH1 0x01 000037d7: PUSH1 0x01 000037d9: PUSH1 0xa0 000037db: SHL 000037dc: SUB 000037dd: DUP5 000037de: AND 000037df: DUP4 000037e0: PUSH2 0x3856 000037e3: JUMP 000037e4: JUMPDEST 000037e5: SWAP1 000037e6: POP 000037e7: DUP1 000037e8: MLOAD 000037e9: PUSH1 0x00 000037eb: EQ 000037ec: ISZERO 000037ed: DUP1 000037ee: ISZERO 000037ef: PUSH2 0x3809 000037f2: JUMPI 000037f3: POP 000037f4: DUP1 000037f5: DUP1 000037f6: PUSH1 0x20 000037f8: ADD 000037f9: SWAP1 000037fa: MLOAD 000037fb: DUP2 000037fc: ADD 000037fd: SWAP1 000037fe: PUSH2 0x3807 00003801: SWAP2 00003802: SWAP1 00003803: PUSH2 0x436b 00003806: JUMP 00003807: JUMPDEST 00003808: ISZERO 00003809: JUMPDEST 0000380a: ISZERO 0000380b: PUSH2 0x0830 0000380e: JUMPI 0000380f: DUP3 00003810: PUSH1 0x40 00003812: MLOAD 00003813: PUSH4 0x5274afe7 00003818: PUSH1 0xe0 0000381a: SHL 0000381b: DUP2 0000381c: MSTORE 0000381d: PUSH1 0x04 0000381f: ADD 00003820: PUSH2 0x08b3 00003823: SWAP2 00003824: SWAP1 00003825: PUSH2 0x3cef 00003828: JUMP 00003829: JUMPDEST 0000382a: PUSH2 0x3831 0000382d: PUSH2 0x386d 00003830: JUMP 00003831: JUMPDEST 00003832: PUSH2 0x129b 00003835: JUMPI 00003836: PUSH1 0x40 00003838: MLOAD 00003839: PUSH4 0x1afcd79f 0000383e: PUSH1 0xe3 00003840: SHL 00003841: DUP2 00003842: MSTORE 00003843: PUSH1 0x04 00003845: ADD 00003846: PUSH1 0x40 00003848: MLOAD 00003849: DUP1 0000384a: SWAP2 0000384b: SUB 0000384c: SWAP1 0000384d: REVERT 0000384e: JUMPDEST 0000384f: PUSH2 0x2f80 00003852: PUSH2 0x3829 00003855: JUMP 00003856: JUMPDEST 00003857: PUSH1 0x60 00003859: PUSH2 0x3864 0000385c: DUP4 0000385d: DUP4 0000385e: PUSH1 0x00 00003860: PUSH2 0x3887 00003863: JUMP 00003864: JUMPDEST 00003865: SWAP1 00003866: POP 00003867: JUMPDEST 00003868: SWAP3 00003869: SWAP2 0000386a: POP 0000386b: POP 0000386c: JUMP 0000386d: JUMPDEST 0000386e: PUSH1 0x00 00003870: PUSH2 0x3877 00003873: PUSH2 0x3752 00003876: JUMP 00003877: JUMPDEST 00003878: SLOAD 00003879: PUSH1 0x01 0000387b: PUSH1 0x40 0000387d: SHL 0000387e: SWAP1 0000387f: DIV 00003880: PUSH1 0xff 00003882: AND 00003883: SWAP2 00003884: SWAP1 00003885: POP 00003886: JUMP 00003887: JUMPDEST 00003888: PUSH1 0x60 0000388a: DUP2 0000388b: SELFBALANCE 0000388c: LT 0000388d: ISZERO 0000388e: PUSH2 0x38ac 00003891: JUMPI 00003892: ADDRESS 00003893: PUSH1 0x40 00003895: MLOAD 00003896: PUSH4 0xcd786059 0000389b: PUSH1 0xe0 0000389d: SHL 0000389e: DUP2 0000389f: MSTORE 000038a0: PUSH1 0x04 000038a2: ADD 000038a3: PUSH2 0x08b3 000038a6: SWAP2 000038a7: SWAP1 000038a8: PUSH2 0x3cef 000038ab: JUMP 000038ac: JUMPDEST 000038ad: PUSH1 0x00 000038af: DUP1 000038b0: DUP6 000038b1: PUSH1 0x01 000038b3: PUSH1 0x01 000038b5: PUSH1 0xa0 000038b7: SHL 000038b8: SUB 000038b9: AND 000038ba: DUP5 000038bb: DUP7 000038bc: PUSH1 0x40 000038be: MLOAD 000038bf: PUSH2 0x38c8 000038c2: SWAP2 000038c3: SWAP1 000038c4: PUSH2 0x4388 000038c7: JUMP 000038c8: JUMPDEST 000038c9: PUSH1 0x00 000038cb: PUSH1 0x40 000038cd: MLOAD 000038ce: DUP1 000038cf: DUP4 000038d0: SUB 000038d1: DUP2 000038d2: DUP6 000038d3: DUP8 000038d4: GAS 000038d5: CALL 000038d6: SWAP3 000038d7: POP 000038d8: POP 000038d9: POP 000038da: RETURNDATASIZE 000038db: DUP1 000038dc: PUSH1 0x00 000038de: DUP2 000038df: EQ 000038e0: PUSH2 0x3905 000038e3: JUMPI 000038e4: PUSH1 0x40 000038e6: MLOAD 000038e7: SWAP2 000038e8: POP 000038e9: PUSH1 0x1f 000038eb: NOT 000038ec: PUSH1 0x3f 000038ee: RETURNDATASIZE 000038ef: ADD 000038f0: AND 000038f1: DUP3 000038f2: ADD 000038f3: PUSH1 0x40 000038f5: MSTORE 000038f6: RETURNDATASIZE 000038f7: DUP3 000038f8: MSTORE 000038f9: RETURNDATASIZE 000038fa: PUSH1 0x00 000038fc: PUSH1 0x20 000038fe: DUP5 000038ff: ADD 00003900: RETURNDATACOPY 00003901: PUSH2 0x390a 00003904: JUMP 00003905: JUMPDEST 00003906: PUSH1 0x60 00003908: SWAP2 00003909: POP 0000390a: JUMPDEST 0000390b: POP 0000390c: SWAP2 0000390d: POP 0000390e: SWAP2 0000390f: POP 00003910: PUSH2 0x391a 00003913: DUP7 00003914: DUP4 00003915: DUP4 00003916: PUSH2 0x3924 00003919: JUMP 0000391a: JUMPDEST 0000391b: SWAP7 0000391c: SWAP6 0000391d: POP 0000391e: POP 0000391f: POP 00003920: POP 00003921: POP 00003922: POP 00003923: JUMP 00003924: JUMPDEST 00003925: PUSH1 0x60 00003927: DUP3 00003928: PUSH2 0x3939 0000392b: JUMPI 0000392c: PUSH2 0x3934 0000392f: DUP3 00003930: PUSH2 0x3977 00003933: JUMP 00003934: JUMPDEST 00003935: PUSH2 0x1da6 00003938: JUMP 00003939: JUMPDEST 0000393a: DUP2 0000393b: MLOAD 0000393c: ISZERO 0000393d: DUP1 0000393e: ISZERO 0000393f: PUSH2 0x3950 00003942: JUMPI 00003943: POP 00003944: PUSH1 0x01 00003946: PUSH1 0x01 00003948: PUSH1 0xa0 0000394a: SHL 0000394b: SUB 0000394c: DUP5 0000394d: AND 0000394e: EXTCODESIZE 0000394f: ISZERO 00003950: JUMPDEST 00003951: ISZERO 00003952: PUSH2 0x3970 00003955: JUMPI 00003956: DUP4 00003957: PUSH1 0x40 00003959: MLOAD 0000395a: PUSH4 0x9996b315 0000395f: PUSH1 0xe0 00003961: SHL 00003962: DUP2 00003963: MSTORE 00003964: PUSH1 0x04 00003966: ADD 00003967: PUSH2 0x08b3 0000396a: SWAP2 0000396b: SWAP1 0000396c: PUSH2 0x3cef 0000396f: JUMP 00003970: JUMPDEST 00003971: POP 00003972: DUP1 00003973: PUSH2 0x1da6 00003976: JUMP 00003977: JUMPDEST 00003978: DUP1 00003979: MLOAD 0000397a: ISZERO 0000397b: PUSH2 0x3987 0000397e: JUMPI 0000397f: DUP1 00003980: MLOAD 00003981: DUP1 00003982: DUP3 00003983: PUSH1 0x20 00003985: ADD 00003986: REVERT 00003987: JUMPDEST 00003988: PUSH1 0x40 0000398a: MLOAD 0000398b: PUSH4 0x0a12f521 00003990: PUSH1 0xe1 00003992: SHL 00003993: DUP2 00003994: MSTORE 00003995: PUSH1 0x04 00003997: ADD 00003998: PUSH1 0x40 0000399a: MLOAD 0000399b: DUP1 0000399c: SWAP2 0000399d: SUB 0000399e: SWAP1 0000399f: REVERT 000039a0: JUMPDEST 000039a1: PUSH1 0x00 000039a3: DUP1 000039a4: DUP4 000039a5: PUSH1 0x1f 000039a7: DUP5 000039a8: ADD 000039a9: SLT 000039aa: PUSH2 0x39b2 000039ad: JUMPI 000039ae: PUSH1 0x00 000039b0: DUP1 000039b1: REVERT 000039b2: JUMPDEST 000039b3: POP 000039b4: DUP2 000039b5: CALLDATALOAD 000039b6: PUSH1 0x01 000039b8: PUSH1 0x01 000039ba: PUSH1 0x40 000039bc: SHL 000039bd: SUB 000039be: DUP2 000039bf: GT 000039c0: ISZERO 000039c1: PUSH2 0x39c9 000039c4: JUMPI 000039c5: PUSH1 0x00 000039c7: DUP1 000039c8: REVERT 000039c9: JUMPDEST 000039ca: PUSH1 0x20 000039cc: DUP4 000039cd: ADD 000039ce: SWAP2 000039cf: POP 000039d0: DUP4 000039d1: PUSH1 0x20 000039d3: DUP3 000039d4: PUSH1 0x05 000039d6: SHL 000039d7: DUP6 000039d8: ADD 000039d9: ADD 000039da: GT 000039db: ISZERO 000039dc: PUSH2 0x39e4 000039df: JUMPI 000039e0: PUSH1 0x00 000039e2: DUP1 000039e3: REVERT 000039e4: JUMPDEST 000039e5: SWAP3 000039e6: POP 000039e7: SWAP3 000039e8: SWAP1 000039e9: POP 000039ea: JUMP 000039eb: JUMPDEST 000039ec: PUSH1 0x00 000039ee: DUP1 000039ef: PUSH1 0x20 000039f1: DUP4 000039f2: DUP6 000039f3: SUB 000039f4: SLT 000039f5: ISZERO 000039f6: PUSH2 0x39fe 000039f9: JUMPI 000039fa: PUSH1 0x00 000039fc: DUP1 000039fd: REVERT 000039fe: JUMPDEST 000039ff: DUP3 00003a00: CALLDATALOAD 00003a01: PUSH1 0x01 00003a03: PUSH1 0x01 00003a05: PUSH1 0x40 00003a07: SHL 00003a08: SUB 00003a09: DUP2 00003a0a: GT 00003a0b: ISZERO 00003a0c: PUSH2 0x3a14 00003a0f: JUMPI 00003a10: PUSH1 0x00 00003a12: DUP1 00003a13: REVERT 00003a14: JUMPDEST 00003a15: PUSH2 0x3a20 00003a18: DUP6 00003a19: DUP3 00003a1a: DUP7 00003a1b: ADD 00003a1c: PUSH2 0x39a0 00003a1f: JUMP 00003a20: JUMPDEST 00003a21: SWAP1 00003a22: SWAP7 00003a23: SWAP1 00003a24: SWAP6 00003a25: POP 00003a26: SWAP4 00003a27: POP 00003a28: POP 00003a29: POP 00003a2a: POP 00003a2b: JUMP 00003a2c: JUMPDEST 00003a2d: PUSH1 0x00 00003a2f: DUP1 00003a30: PUSH1 0x40 00003a32: DUP4 00003a33: DUP6 00003a34: SUB 00003a35: SLT 00003a36: ISZERO 00003a37: PUSH2 0x3a3f 00003a3a: JUMPI 00003a3b: PUSH1 0x00 00003a3d: DUP1 00003a3e: REVERT 00003a3f: JUMPDEST 00003a40: POP 00003a41: POP 00003a42: DUP1 00003a43: CALLDATALOAD 00003a44: SWAP3 00003a45: PUSH1 0x20 00003a47: SWAP1 00003a48: SWAP2 00003a49: ADD 00003a4a: CALLDATALOAD 00003a4b: SWAP2 00003a4c: POP 00003a4d: JUMP 00003a4e: JUMPDEST 00003a4f: PUSH1 0x00 00003a51: PUSH1 0x20 00003a53: DUP3 00003a54: DUP5 00003a55: SUB 00003a56: SLT 00003a57: ISZERO 00003a58: PUSH2 0x3a60 00003a5b: JUMPI 00003a5c: PUSH1 0x00 00003a5e: DUP1 00003a5f: REVERT 00003a60: JUMPDEST 00003a61: POP 00003a62: CALLDATALOAD 00003a63: SWAP2 00003a64: SWAP1 00003a65: POP 00003a66: JUMP 00003a67: JUMPDEST 00003a68: DUP1 00003a69: CALLDATALOAD 00003a6a: PUSH1 0x01 00003a6c: PUSH1 0x01 00003a6e: PUSH1 0xa0 00003a70: SHL 00003a71: SUB 00003a72: DUP2 00003a73: AND 00003a74: DUP2 00003a75: EQ 00003a76: PUSH2 0x3a7e 00003a79: JUMPI 00003a7a: PUSH1 0x00 00003a7c: DUP1 00003a7d: REVERT 00003a7e: JUMPDEST 00003a7f: SWAP2 00003a80: SWAP1 00003a81: POP 00003a82: JUMP 00003a83: JUMPDEST 00003a84: PUSH1 0x00 00003a86: DUP1 00003a87: PUSH1 0x00 00003a89: DUP1 00003a8a: PUSH1 0x80 00003a8c: DUP6 00003a8d: DUP8 00003a8e: SUB 00003a8f: SLT 00003a90: ISZERO 00003a91: PUSH2 0x3a99 00003a94: JUMPI 00003a95: PUSH1 0x00 00003a97: DUP1 00003a98: REVERT 00003a99: JUMPDEST 00003a9a: PUSH2 0x3aa2 00003a9d: DUP6 00003a9e: PUSH2 0x3a67 00003aa1: JUMP 00003aa2: JUMPDEST 00003aa3: SWAP7 00003aa4: PUSH1 0x20 00003aa6: DUP7 00003aa7: ADD 00003aa8: CALLDATALOAD 00003aa9: SWAP7 00003aaa: POP 00003aab: PUSH1 0x40 00003aad: DUP7 00003aae: ADD 00003aaf: CALLDATALOAD 00003ab0: SWAP6 00003ab1: PUSH1 0x60 00003ab3: ADD 00003ab4: CALLDATALOAD 00003ab5: SWAP5 00003ab6: POP 00003ab7: SWAP3 00003ab8: POP 00003ab9: POP 00003aba: POP 00003abb: JUMP 00003abc: JUMPDEST 00003abd: DUP1 00003abe: CALLDATALOAD 00003abf: PUSH6 0xffffffffffff 00003ac6: DUP2 00003ac7: AND 00003ac8: DUP2 00003ac9: EQ 00003aca: PUSH2 0x3a7e 00003acd: JUMPI 00003ace: PUSH1 0x00 00003ad0: DUP1 00003ad1: REVERT 00003ad2: JUMPDEST 00003ad3: PUSH1 0x00 00003ad5: DUP1 00003ad6: PUSH1 0x40 00003ad8: DUP4 00003ad9: DUP6 00003ada: SUB 00003adb: SLT 00003adc: ISZERO 00003add: PUSH2 0x3ae5 00003ae0: JUMPI 00003ae1: PUSH1 0x00 00003ae3: DUP1 00003ae4: REVERT 00003ae5: JUMPDEST 00003ae6: DUP3 00003ae7: CALLDATALOAD 00003ae8: SWAP2 00003ae9: POP 00003aea: PUSH2 0x3af5 00003aed: PUSH1 0x20 00003aef: DUP5 00003af0: ADD 00003af1: PUSH2 0x3abc 00003af4: JUMP 00003af5: JUMPDEST 00003af6: SWAP1 00003af7: POP 00003af8: SWAP3 00003af9: POP 00003afa: SWAP3 00003afb: SWAP1 00003afc: POP 00003afd: JUMP 00003afe: JUMPDEST 00003aff: PUSH1 0x00 00003b01: DUP1 00003b02: PUSH1 0x00 00003b04: DUP1 00003b05: PUSH1 0x40 00003b07: DUP6 00003b08: DUP8 00003b09: SUB 00003b0a: SLT 00003b0b: ISZERO 00003b0c: PUSH2 0x3b14 00003b0f: JUMPI 00003b10: PUSH1 0x00 00003b12: DUP1 00003b13: REVERT 00003b14: JUMPDEST 00003b15: DUP5 00003b16: CALLDATALOAD 00003b17: PUSH1 0x01 00003b19: PUSH1 0x01 00003b1b: PUSH1 0x40 00003b1d: SHL 00003b1e: SUB 00003b1f: DUP1 00003b20: DUP3 00003b21: GT 00003b22: ISZERO 00003b23: PUSH2 0x3b2b 00003b26: JUMPI 00003b27: PUSH1 0x00 00003b29: DUP1 00003b2a: REVERT 00003b2b: JUMPDEST 00003b2c: PUSH2 0x3b37 00003b2f: DUP9 00003b30: DUP4 00003b31: DUP10 00003b32: ADD 00003b33: PUSH2 0x39a0 00003b36: JUMP 00003b37: JUMPDEST 00003b38: SWAP1 00003b39: SWAP7 00003b3a: POP 00003b3b: SWAP5 00003b3c: POP 00003b3d: PUSH1 0x20 00003b3f: DUP8 00003b40: ADD 00003b41: CALLDATALOAD 00003b42: SWAP2 00003b43: POP 00003b44: DUP1 00003b45: DUP3 00003b46: GT 00003b47: ISZERO 00003b48: PUSH2 0x3b50 00003b4b: JUMPI 00003b4c: PUSH1 0x00 00003b4e: DUP1 00003b4f: REVERT 00003b50: JUMPDEST 00003b51: POP 00003b52: PUSH2 0x3b5d 00003b55: DUP8 00003b56: DUP3 00003b57: DUP9 00003b58: ADD 00003b59: PUSH2 0x39a0 00003b5c: JUMP 00003b5d: JUMPDEST 00003b5e: SWAP6 00003b5f: SWAP9 00003b60: SWAP5 00003b61: SWAP8 00003b62: POP 00003b63: SWAP6 00003b64: POP 00003b65: POP 00003b66: POP 00003b67: POP 00003b68: JUMP 00003b69: JUMPDEST 00003b6a: PUSH1 0x00 00003b6c: PUSH1 0x20 00003b6e: DUP3 00003b6f: DUP5 00003b70: SUB 00003b71: SLT 00003b72: ISZERO 00003b73: PUSH2 0x3b7b 00003b76: JUMPI 00003b77: PUSH1 0x00 00003b79: DUP1 00003b7a: REVERT 00003b7b: JUMPDEST 00003b7c: PUSH2 0x3864 00003b7f: DUP3 00003b80: PUSH2 0x3a67 00003b83: JUMP 00003b84: JUMPDEST 00003b85: PUSH1 0x00 00003b87: DUP1 00003b88: PUSH1 0x00 00003b8a: PUSH1 0x60 00003b8c: DUP5 00003b8d: DUP7 00003b8e: SUB 00003b8f: SLT 00003b90: ISZERO 00003b91: PUSH2 0x3b99 00003b94: JUMPI 00003b95: PUSH1 0x00 00003b97: DUP1 00003b98: REVERT 00003b99: JUMPDEST 00003b9a: DUP4 00003b9b: CALLDATALOAD 00003b9c: SWAP3 00003b9d: POP 00003b9e: PUSH2 0x3ba9 00003ba1: PUSH1 0x20 00003ba3: DUP6 00003ba4: ADD 00003ba5: PUSH2 0x3abc 00003ba8: JUMP 00003ba9: JUMPDEST 00003baa: SWAP2 00003bab: POP 00003bac: PUSH1 0x40 00003bae: DUP5 00003baf: ADD 00003bb0: CALLDATALOAD 00003bb1: SWAP1 00003bb2: POP 00003bb3: SWAP3 00003bb4: POP 00003bb5: SWAP3 00003bb6: POP 00003bb7: SWAP3 00003bb8: JUMP 00003bb9: JUMPDEST 00003bba: DUP1 00003bbb: CALLDATALOAD 00003bbc: PUSH1 0xff 00003bbe: DUP2 00003bbf: AND 00003bc0: DUP2 00003bc1: EQ 00003bc2: PUSH2 0x3a7e 00003bc5: JUMPI 00003bc6: PUSH1 0x00 00003bc8: DUP1 00003bc9: REVERT 00003bca: JUMPDEST 00003bcb: PUSH1 0x00 00003bcd: DUP1 00003bce: PUSH1 0x00 00003bd0: DUP1 00003bd1: PUSH1 0x00 00003bd3: PUSH1 0xa0 00003bd5: DUP7 00003bd6: DUP9 00003bd7: SUB 00003bd8: SLT 00003bd9: ISZERO 00003bda: PUSH2 0x3be2 00003bdd: JUMPI 00003bde: PUSH1 0x00 00003be0: DUP1 00003be1: REVERT 00003be2: JUMPDEST 00003be3: PUSH2 0x3beb 00003be6: DUP7 00003be7: PUSH2 0x3bb9 00003bea: JUMP 00003beb: JUMPDEST 00003bec: SWAP8 00003bed: PUSH1 0x20 00003bef: DUP8 00003bf0: ADD 00003bf1: CALLDATALOAD 00003bf2: SWAP8 00003bf3: POP 00003bf4: PUSH1 0x40 00003bf6: DUP8 00003bf7: ADD 00003bf8: CALLDATALOAD 00003bf9: SWAP7 00003bfa: PUSH1 0x60 00003bfc: DUP2 00003bfd: ADD 00003bfe: CALLDATALOAD 00003bff: SWAP7 00003c00: POP 00003c01: PUSH1 0x80 00003c03: ADD 00003c04: CALLDATALOAD 00003c05: SWAP5 00003c06: POP 00003c07: SWAP3 00003c08: POP 00003c09: POP 00003c0a: POP 00003c0b: JUMP 00003c0c: JUMPDEST 00003c0d: PUSH1 0x01 00003c0f: PUSH1 0x01 00003c11: PUSH1 0xa0 00003c13: SHL 00003c14: SUB 00003c15: AND 00003c16: SWAP1 00003c17: MSTORE 00003c18: JUMP 00003c19: JUMPDEST 00003c1a: PUSH1 0x00 00003c1c: DUP1 00003c1d: PUSH1 0x00 00003c1f: PUSH1 0x60 00003c21: DUP5 00003c22: DUP7 00003c23: SUB 00003c24: SLT 00003c25: ISZERO 00003c26: PUSH2 0x3c2e 00003c29: JUMPI 00003c2a: PUSH1 0x00 00003c2c: DUP1 00003c2d: REVERT 00003c2e: JUMPDEST 00003c2f: DUP4 00003c30: CALLDATALOAD 00003c31: SWAP3 00003c32: POP 00003c33: PUSH2 0x3c3e 00003c36: PUSH1 0x20 00003c38: DUP6 00003c39: ADD 00003c3a: PUSH2 0x3a67 00003c3d: JUMP 00003c3e: JUMPDEST 00003c3f: SWAP2 00003c40: POP 00003c41: PUSH1 0x40 00003c43: DUP5 00003c44: ADD 00003c45: CALLDATALOAD 00003c46: PUSH1 0x01 00003c48: PUSH1 0x01 00003c4a: PUSH1 0x98 00003c4c: SHL 00003c4d: SUB 00003c4e: DUP2 00003c4f: AND 00003c50: DUP2 00003c51: EQ 00003c52: PUSH2 0x3c5a 00003c55: JUMPI 00003c56: PUSH1 0x00 00003c58: DUP1 00003c59: REVERT 00003c5a: JUMPDEST 00003c5b: DUP1 00003c5c: SWAP2 00003c5d: POP 00003c5e: POP 00003c5f: SWAP3 00003c60: POP 00003c61: SWAP3 00003c62: POP 00003c63: SWAP3 00003c64: JUMP 00003c65: JUMPDEST 00003c66: DUP2 00003c67: MLOAD 00003c68: PUSH1 0xff 00003c6a: AND 00003c6b: DUP2 00003c6c: MSTORE 00003c6d: PUSH2 0x0140 00003c70: DUP2 00003c71: ADD 00003c72: PUSH1 0x20 00003c74: DUP4 00003c75: ADD 00003c76: MLOAD 00003c77: PUSH1 0x20 00003c79: DUP4 00003c7a: ADD 00003c7b: MSTORE 00003c7c: PUSH1 0x40 00003c7e: DUP4 00003c7f: ADD 00003c80: MLOAD 00003c81: PUSH2 0x3c8d 00003c84: PUSH1 0x40 00003c86: DUP5 00003c87: ADD 00003c88: DUP3 00003c89: PUSH2 0x3c0c 00003c8c: JUMP 00003c8d: JUMPDEST 00003c8e: POP 00003c8f: PUSH1 0x60 00003c91: DUP4 00003c92: ADD 00003c93: MLOAD 00003c94: PUSH1 0x60 00003c96: DUP4 00003c97: ADD 00003c98: MSTORE 00003c99: PUSH1 0x80 00003c9b: DUP4 00003c9c: ADD 00003c9d: MLOAD 00003c9e: PUSH1 0x80 00003ca0: DUP4 00003ca1: ADD 00003ca2: MSTORE 00003ca3: PUSH1 0xa0 00003ca5: DUP4 00003ca6: ADD 00003ca7: MLOAD 00003ca8: PUSH1 0xa0 00003caa: DUP4 00003cab: ADD 00003cac: MSTORE 00003cad: PUSH1 0xc0 00003caf: DUP4 00003cb0: ADD 00003cb1: MLOAD 00003cb2: PUSH1 0xc0 00003cb4: DUP4 00003cb5: ADD 00003cb6: MSTORE 00003cb7: PUSH1 0xe0 00003cb9: DUP4 00003cba: ADD 00003cbb: MLOAD 00003cbc: PUSH2 0x3cca 00003cbf: PUSH1 0xe0 00003cc1: DUP5 00003cc2: ADD 00003cc3: DUP3 00003cc4: PUSH1 0xff 00003cc6: AND 00003cc7: SWAP1 00003cc8: MSTORE 00003cc9: JUMP 00003cca: JUMPDEST 00003ccb: POP 00003ccc: PUSH2 0x0100 00003ccf: DUP1 00003cd0: DUP5 00003cd1: ADD 00003cd2: MLOAD 00003cd3: PUSH2 0x3cde 00003cd6: DUP3 00003cd7: DUP6 00003cd8: ADD 00003cd9: DUP3 00003cda: PUSH2 0x3c0c 00003cdd: JUMP 00003cde: JUMPDEST 00003cdf: POP 00003ce0: POP 00003ce1: PUSH2 0x0120 00003ce4: SWAP3 00003ce5: DUP4 00003ce6: ADD 00003ce7: MLOAD 00003ce8: SWAP2 00003ce9: SWAP1 00003cea: SWAP3 00003ceb: ADD 00003cec: MSTORE 00003ced: SWAP1 00003cee: JUMP 00003cef: JUMPDEST 00003cf0: PUSH1 0x01 00003cf2: PUSH1 0x01 00003cf4: PUSH1 0xa0 00003cf6: SHL 00003cf7: SUB 00003cf8: SWAP2 00003cf9: SWAP1 00003cfa: SWAP2 00003cfb: AND 00003cfc: DUP2 00003cfd: MSTORE 00003cfe: PUSH1 0x20 00003d00: ADD 00003d01: SWAP1 00003d02: JUMP 00003d03: JUMPDEST 00003d04: DUP1 00003d05: ISZERO 00003d06: ISZERO 00003d07: DUP2 00003d08: EQ 00003d09: PUSH2 0x23fa 00003d0c: JUMPI 00003d0d: PUSH1 0x00 00003d0f: DUP1 00003d10: REVERT 00003d11: JUMPDEST 00003d12: PUSH1 0x00 00003d14: DUP1 00003d15: PUSH1 0x00 00003d17: PUSH1 0x40 00003d19: DUP5 00003d1a: DUP7 00003d1b: SUB 00003d1c: SLT 00003d1d: ISZERO 00003d1e: PUSH2 0x3d26 00003d21: JUMPI 00003d22: PUSH1 0x00 00003d24: DUP1 00003d25: REVERT 00003d26: JUMPDEST 00003d27: DUP4 00003d28: CALLDATALOAD 00003d29: PUSH1 0x01 00003d2b: PUSH1 0x01 00003d2d: PUSH1 0x40 00003d2f: SHL 00003d30: SUB 00003d31: DUP2 00003d32: GT 00003d33: ISZERO 00003d34: PUSH2 0x3d3c 00003d37: JUMPI 00003d38: PUSH1 0x00 00003d3a: DUP1 00003d3b: REVERT 00003d3c: JUMPDEST 00003d3d: PUSH2 0x3d48 00003d40: DUP7 00003d41: DUP3 00003d42: DUP8 00003d43: ADD 00003d44: PUSH2 0x39a0 00003d47: JUMP 00003d48: JUMPDEST 00003d49: SWAP1 00003d4a: SWAP5 00003d4b: POP 00003d4c: SWAP3 00003d4d: POP 00003d4e: POP 00003d4f: PUSH1 0x20 00003d51: DUP5 00003d52: ADD 00003d53: CALLDATALOAD 00003d54: PUSH2 0x3c5a 00003d57: DUP2 00003d58: PUSH2 0x3d03 00003d5b: JUMP 00003d5c: JUMPDEST 00003d5d: PUSH1 0x00 00003d5f: DUP1 00003d60: PUSH1 0x00 00003d62: DUP1 00003d63: PUSH1 0x00 00003d65: DUP1 00003d66: PUSH1 0xc0 00003d68: DUP8 00003d69: DUP10 00003d6a: SUB 00003d6b: SLT 00003d6c: ISZERO 00003d6d: PUSH2 0x3d75 00003d70: JUMPI 00003d71: PUSH1 0x00 00003d73: DUP1 00003d74: REVERT 00003d75: JUMPDEST 00003d76: PUSH2 0x3d7e 00003d79: DUP8 00003d7a: PUSH2 0x3bb9 00003d7d: JUMP 00003d7e: JUMPDEST 00003d7f: SWAP6 00003d80: POP 00003d81: PUSH1 0x20 00003d83: DUP8 00003d84: ADD 00003d85: CALLDATALOAD 00003d86: SWAP5 00003d87: POP 00003d88: PUSH1 0x40 00003d8a: DUP8 00003d8b: ADD 00003d8c: CALLDATALOAD 00003d8d: SWAP4 00003d8e: POP 00003d8f: PUSH1 0x60 00003d91: DUP8 00003d92: ADD 00003d93: CALLDATALOAD 00003d94: SWAP3 00003d95: POP 00003d96: PUSH2 0x3da1 00003d99: PUSH1 0x80 00003d9b: DUP9 00003d9c: ADD 00003d9d: PUSH2 0x3a67 00003da0: JUMP 00003da1: JUMPDEST 00003da2: SWAP2 00003da3: POP 00003da4: PUSH1 0xa0 00003da6: DUP8 00003da7: ADD 00003da8: CALLDATALOAD 00003da9: SWAP1 00003daa: POP 00003dab: SWAP3 00003dac: SWAP6 00003dad: POP 00003dae: SWAP3 00003daf: SWAP6 00003db0: POP 00003db1: SWAP3 00003db2: SWAP6 00003db3: JUMP 00003db4: JUMPDEST 00003db5: PUSH1 0x00 00003db7: DUP1 00003db8: PUSH1 0x40 00003dba: DUP4 00003dbb: DUP6 00003dbc: SUB 00003dbd: SLT 00003dbe: ISZERO 00003dbf: PUSH2 0x3dc7 00003dc2: JUMPI 00003dc3: PUSH1 0x00 00003dc5: DUP1 00003dc6: REVERT 00003dc7: JUMPDEST 00003dc8: PUSH2 0x3dd0 00003dcb: DUP4 00003dcc: PUSH2 0x3a67 00003dcf: JUMP 00003dd0: JUMPDEST 00003dd1: SWAP2 00003dd2: POP 00003dd3: PUSH2 0x3af5 00003dd6: PUSH1 0x20 00003dd8: DUP5 00003dd9: ADD 00003dda: PUSH2 0x3a67 00003ddd: JUMP 00003dde: JUMPDEST 00003ddf: PUSH4 0x4e487b71 00003de4: PUSH1 0xe0 00003de6: SHL 00003de7: PUSH1 0x00 00003de9: MSTORE 00003dea: PUSH1 0x32 00003dec: PUSH1 0x04 00003dee: MSTORE 00003def: PUSH1 0x24 00003df1: PUSH1 0x00 00003df3: REVERT 00003df4: JUMPDEST 00003df5: PUSH4 0x4e487b71 00003dfa: PUSH1 0xe0 00003dfc: SHL 00003dfd: PUSH1 0x00 00003dff: MSTORE 00003e00: PUSH1 0x11 00003e02: PUSH1 0x04 00003e04: MSTORE 00003e05: PUSH1 0x24 00003e07: PUSH1 0x00 00003e09: REVERT 00003e0a: JUMPDEST 00003e0b: PUSH1 0x00 00003e0d: PUSH1 0x01 00003e0f: DUP3 00003e10: ADD 00003e11: PUSH2 0x3e1c 00003e14: JUMPI 00003e15: PUSH2 0x3e1c 00003e18: PUSH2 0x3df4 00003e1b: JUMP 00003e1c: JUMPDEST 00003e1d: POP 00003e1e: PUSH1 0x01 00003e20: ADD 00003e21: SWAP1 00003e22: JUMP 00003e23: JUMPDEST 00003e24: PUSH1 0x20 00003e26: DUP1 00003e27: DUP3 00003e28: MSTORE 00003e29: PUSH1 0x0e 00003e2b: SWAP1 00003e2c: DUP3 00003e2d: ADD 00003e2e: MSTORE 00003e2f: PUSH14 0x496e76616c696420537461747573 00003e3e: PUSH1 0x90 00003e40: SHL 00003e41: PUSH1 0x40 00003e43: DUP3 00003e44: ADD 00003e45: MSTORE 00003e46: PUSH1 0x60 00003e48: ADD 00003e49: SWAP1 00003e4a: JUMP 00003e4b: JUMPDEST 00003e4c: PUSH1 0x20 00003e4e: DUP1 00003e4f: DUP3 00003e50: MSTORE 00003e51: PUSH1 0x0d 00003e53: SWAP1 00003e54: DUP3 00003e55: ADD 00003e56: MSTORE 00003e57: PUSH13 0x151bdad95b88139bdd0814d95d 00003e65: PUSH1 0x9a 00003e67: SHL 00003e68: PUSH1 0x40 00003e6a: DUP3 00003e6b: ADD 00003e6c: MSTORE 00003e6d: PUSH1 0x60 00003e6f: ADD 00003e70: SWAP1 00003e71: JUMP 00003e72: JUMPDEST 00003e73: PUSH1 0x20 00003e75: DUP1 00003e76: DUP3 00003e77: MSTORE 00003e78: PUSH1 0x19 00003e7a: SWAP1 00003e7b: DUP3 00003e7c: ADD 00003e7d: MSTORE 00003e7e: PUSH25 0x14d95d1d1b1a5b99c8151a5b5948139bdd0814dd185c9d1959 00003e98: PUSH1 0x3a 00003e9a: SHL 00003e9b: PUSH1 0x40 00003e9d: DUP3 00003e9e: ADD 00003e9f: MSTORE 00003ea0: PUSH1 0x60 00003ea2: ADD 00003ea3: SWAP1 00003ea4: JUMP 00003ea5: JUMPDEST 00003ea6: PUSH1 0x20 00003ea8: DUP1 00003ea9: DUP3 00003eaa: MSTORE 00003eab: PUSH1 0x14 00003ead: SWAP1 00003eae: DUP3 00003eaf: ADD 00003eb0: MSTORE 00003eb1: PUSH20 0x496e76616c6964204f7264657220537461747573 00003ec6: PUSH1 0x60 00003ec8: SHL 00003ec9: PUSH1 0x40 00003ecb: DUP3 00003ecc: ADD 00003ecd: MSTORE 00003ece: PUSH1 0x60 00003ed0: ADD 00003ed1: SWAP1 00003ed2: JUMP 00003ed3: JUMPDEST 00003ed4: DUP1 00003ed5: DUP3 00003ed6: MUL 00003ed7: DUP2 00003ed8: ISZERO 00003ed9: DUP3 00003eda: DUP3 00003edb: DIV 00003edc: DUP5 00003edd: EQ 00003ede: OR 00003edf: PUSH2 0x3867 00003ee2: JUMPI 00003ee3: PUSH2 0x3867 00003ee6: PUSH2 0x3df4 00003ee9: JUMP 00003eea: JUMPDEST 00003eeb: PUSH1 0x00 00003eed: DUP3 00003eee: PUSH2 0x3f07 00003ef1: JUMPI 00003ef2: PUSH4 0x4e487b71 00003ef7: PUSH1 0xe0 00003ef9: SHL 00003efa: PUSH1 0x00 00003efc: MSTORE 00003efd: PUSH1 0x12 00003eff: PUSH1 0x04 00003f01: MSTORE 00003f02: PUSH1 0x24 00003f04: PUSH1 0x00 00003f06: REVERT 00003f07: JUMPDEST 00003f08: POP 00003f09: DIV 00003f0a: SWAP1 00003f0b: JUMP 00003f0c: JUMPDEST 00003f0d: DUP1 00003f0e: DUP3 00003f0f: ADD 00003f10: DUP1 00003f11: DUP3 00003f12: GT 00003f13: ISZERO 00003f14: PUSH2 0x3867 00003f17: JUMPI 00003f18: PUSH2 0x3867 00003f1b: PUSH2 0x3df4 00003f1e: JUMP 00003f1f: JUMPDEST 00003f20: DUP2 00003f21: DUP2 00003f22: SUB 00003f23: DUP2 00003f24: DUP2 00003f25: GT 00003f26: ISZERO 00003f27: PUSH2 0x3867 00003f2a: JUMPI 00003f2b: PUSH2 0x3867 00003f2e: PUSH2 0x3df4 00003f31: JUMP 00003f32: JUMPDEST 00003f33: PUSH1 0x20 00003f35: DUP1 00003f36: DUP3 00003f37: MSTORE 00003f38: PUSH1 0x13 00003f3a: SWAP1 00003f3b: DUP3 00003f3c: ADD 00003f3d: MSTORE 00003f3e: PUSH19 0x151c985b9cd9995c88119d5b991cc811985a5b 00003f52: PUSH1 0x6a 00003f54: SHL 00003f55: PUSH1 0x40 00003f57: DUP3 00003f58: ADD 00003f59: MSTORE 00003f5a: PUSH1 0x60 00003f5c: ADD 00003f5d: SWAP1 00003f5e: JUMP 00003f5f: JUMPDEST 00003f60: SWAP4 00003f61: DUP5 00003f62: MSTORE 00003f63: PUSH1 0x20 00003f65: DUP5 00003f66: ADD 00003f67: SWAP3 00003f68: SWAP1 00003f69: SWAP3 00003f6a: MSTORE 00003f6b: PUSH1 0x40 00003f6d: DUP4 00003f6e: ADD 00003f6f: MSTORE 00003f70: PUSH1 0x01 00003f72: PUSH1 0x01 00003f74: PUSH1 0xa0 00003f76: SHL 00003f77: SUB 00003f78: AND 00003f79: PUSH1 0x60 00003f7b: DUP3 00003f7c: ADD 00003f7d: MSTORE 00003f7e: PUSH1 0x80 00003f80: ADD 00003f81: SWAP1 00003f82: JUMP 00003f83: JUMPDEST 00003f84: PUSH1 0x20 00003f86: DUP1 00003f87: DUP3 00003f88: MSTORE 00003f89: PUSH1 0x0d 00003f8b: SWAP1 00003f8c: DUP3 00003f8d: ADD 00003f8e: MSTORE 00003f8f: PUSH13 0x125b9d985b1a5908125b9c1d5d 00003f9d: PUSH1 0x9a 00003f9f: SHL 00003fa0: PUSH1 0x40 00003fa2: DUP3 00003fa3: ADD 00003fa4: MSTORE 00003fa5: PUSH1 0x60 00003fa7: ADD 00003fa8: SWAP1 00003fa9: JUMP 00003faa: JUMPDEST 00003fab: PUSH1 0x20 00003fad: DUP1 00003fae: DUP3 00003faf: MSTORE 00003fb0: PUSH1 0x12 00003fb2: SWAP1 00003fb3: DUP3 00003fb4: ADD 00003fb5: MSTORE 00003fb6: PUSH18 0x496e73756666696369656e742046756e6473 00003fc9: PUSH1 0x70 00003fcb: SHL 00003fcc: PUSH1 0x40 00003fce: DUP3 00003fcf: ADD 00003fd0: MSTORE 00003fd1: PUSH1 0x60 00003fd3: ADD 00003fd4: SWAP1 00003fd5: JUMP 00003fd6: JUMPDEST 00003fd7: PUSH1 0x20 00003fd9: DUP1 00003fda: DUP3 00003fdb: MSTORE 00003fdc: PUSH1 0x11 00003fde: SWAP1 00003fdf: DUP3 00003fe0: ADD 00003fe1: MSTORE 00003fe2: PUSH17 0x115e1d1c9848105b5bdd5b9d0814d95b9d 00003ff4: PUSH1 0x7a 00003ff6: SHL 00003ff7: PUSH1 0x40 00003ff9: DUP3 00003ffa: ADD 00003ffb: MSTORE 00003ffc: PUSH1 0x60 00003ffe: ADD 00003fff: SWAP1 00004000: JUMP 00004001: JUMPDEST 00004002: PUSH1 0x20 00004004: DUP1 00004005: DUP3 00004006: MSTORE 00004007: PUSH1 0x14 00004009: SWAP1 0000400a: DUP3 0000400b: ADD 0000400c: MSTORE 0000400d: PUSH20 0x496e76616c696420546f6b656e20537461747573 00004022: PUSH1 0x60 00004024: SHL 00004025: PUSH1 0x40 00004027: DUP3 00004028: ADD 00004029: MSTORE 0000402a: PUSH1 0x60 0000402c: ADD 0000402d: SWAP1 0000402e: JUMP 0000402f: JUMPDEST 00004030: PUSH1 0x20 00004032: DUP1 00004033: DUP3 00004034: MSTORE 00004035: PUSH1 0x0d 00004037: SWAP1 00004038: DUP3 00004039: ADD 0000403a: MSTORE 0000403b: PUSH13 0x24b73b30b634b2102a37b5b2b7 00004049: PUSH1 0x99 0000404b: SHL 0000404c: PUSH1 0x40 0000404e: DUP3 0000404f: ADD 00004050: MSTORE 00004051: PUSH1 0x60 00004053: ADD 00004054: SWAP1 00004055: JUMP 00004056: JUMPDEST 00004057: PUSH1 0x20 00004059: DUP1 0000405a: DUP3 0000405b: MSTORE 0000405c: PUSH1 0x17 0000405e: SWAP1 0000405f: DUP3 00004060: ADD 00004061: MSTORE 00004062: PUSH23 0x496e76616c696420416d6f756e74206f722056616c7565 0000407a: PUSH1 0x48 0000407c: SHL 0000407d: PUSH1 0x40 0000407f: DUP3 00004080: ADD 00004081: MSTORE 00004082: PUSH1 0x60 00004084: ADD 00004085: SWAP1 00004086: JUMP 00004087: JUMPDEST 00004088: PUSH1 0x20 0000408a: DUP1 0000408b: DUP3 0000408c: MSTORE 0000408d: PUSH1 0x32 0000408f: SWAP1 00004090: DUP3 00004091: ADD 00004092: MSTORE 00004093: PUSH32 0x6d696e616d6f756e7420746f2062652066696c6c65642063616e742062652067 000040b4: PUSH1 0x40 000040b6: DUP3 000040b7: ADD 000040b8: MSTORE 000040b9: PUSH18 0x1c99585d195c881d1a195b88185b5bdd5b9d 000040cc: PUSH1 0x72 000040ce: SHL 000040cf: PUSH1 0x60 000040d1: DUP3 000040d2: ADD 000040d3: MSTORE 000040d4: PUSH1 0x80 000040d6: ADD 000040d7: SWAP1 000040d8: JUMP 000040d9: JUMPDEST 000040da: PUSH1 0x20 000040dc: DUP1 000040dd: DUP3 000040de: MSTORE 000040df: PUSH1 0x40 000040e1: SWAP1 000040e2: DUP3 000040e3: ADD 000040e4: DUP2 000040e5: SWAP1 000040e6: MSTORE 000040e7: PUSH32 0x6d696e616d6f756e742073686f756c642062652067726561746572207468656e 00004108: SWAP1 00004109: DUP3 0000410a: ADD 0000410b: MSTORE 0000410c: PUSH32 0x206575616c20746f206d61726b657420676c6f62616c206d696e616d6f756e74 0000412d: PUSH1 0x60 0000412f: DUP3 00004130: ADD 00004131: MSTORE 00004132: PUSH1 0x80 00004134: ADD 00004135: SWAP1 00004136: JUMP 00004137: JUMPDEST 00004138: PUSH1 0x20 0000413a: DUP1 0000413b: DUP3 0000413c: MSTORE 0000413d: PUSH1 0x14 0000413f: SWAP1 00004140: DUP3 00004141: ADD 00004142: MSTORE 00004143: PUSH20 0x496e76616c6964204f6666657220537461747573 00004158: PUSH1 0x60 0000415a: SHL 0000415b: PUSH1 0x40 0000415d: DUP3 0000415e: ADD 0000415f: MSTORE 00004160: PUSH1 0x60 00004162: ADD 00004163: SWAP1 00004164: JUMP 00004165: JUMPDEST 00004166: PUSH1 0x20 00004168: DUP1 00004169: DUP3 0000416a: MSTORE 0000416b: PUSH1 0x14 0000416d: SWAP1 0000416e: DUP3 0000416f: ADD 00004170: MSTORE 00004171: PUSH20 0x496e76616c696420746f6b656e20537461747573 00004186: PUSH1 0x60 00004188: SHL 00004189: PUSH1 0x40 0000418b: DUP3 0000418c: ADD 0000418d: MSTORE 0000418e: PUSH1 0x60 00004190: ADD 00004191: SWAP1 00004192: JUMP 00004193: JUMPDEST 00004194: PUSH1 0x20 00004196: DUP1 00004197: DUP3 00004198: MSTORE 00004199: PUSH1 0x0e 0000419b: SWAP1 0000419c: DUP3 0000419d: ADD 0000419e: MSTORE 0000419f: PUSH14 0x125b9d985b1a5908105b5bdd5b9d 000041ae: PUSH1 0x92 000041b0: SHL 000041b1: PUSH1 0x40 000041b3: DUP3 000041b4: ADD 000041b5: MSTORE 000041b6: PUSH1 0x60 000041b8: ADD 000041b9: SWAP1 000041ba: JUMP 000041bb: JUMPDEST 000041bc: PUSH1 0x20 000041be: DUP1 000041bf: DUP3 000041c0: MSTORE 000041c1: PUSH1 0x18 000041c3: SWAP1 000041c4: DUP3 000041c5: ADD 000041c6: MSTORE 000041c7: PUSH24 0x496e73756666696369656e7420416c6c6f636174696f6e73 000041e0: PUSH1 0x40 000041e2: SHL 000041e3: PUSH1 0x40 000041e5: DUP3 000041e6: ADD 000041e7: MSTORE 000041e8: PUSH1 0x60 000041ea: ADD 000041eb: SWAP1 000041ec: JUMP 000041ed: JUMPDEST 000041ee: PUSH1 0x20 000041f0: DUP1 000041f1: DUP3 000041f2: MSTORE 000041f3: PUSH1 0x35 000041f5: SWAP1 000041f6: DUP3 000041f7: ADD 000041f8: MSTORE 000041f9: PUSH32 0x6966206c657373207468656e206173736574206d696e616d6f756e74206d7573 0000421a: PUSH1 0x40 0000421c: DUP3 0000421d: ADD 0000421e: MSTORE 0000421f: PUSH21 0x3a103334b6361031b7b6b83632ba329037b93232b9 00004235: PUSH1 0x59 00004237: SHL 00004238: PUSH1 0x60 0000423a: DUP3 0000423b: ADD 0000423c: MSTORE 0000423d: PUSH1 0x80 0000423f: ADD 00004240: SWAP1 00004241: JUMP 00004242: JUMPDEST 00004243: PUSH1 0x20 00004245: DUP1 00004246: DUP3 00004247: MSTORE 00004248: PUSH1 0x13 0000424a: SWAP1 0000424b: DUP3 0000424c: ADD 0000424d: MSTORE 0000424e: PUSH19 0x24b73b30b634b21027b33332b9102a37b5b2b7 00004262: PUSH1 0x69 00004264: SHL 00004265: PUSH1 0x40 00004267: DUP3 00004268: ADD 00004269: MSTORE 0000426a: PUSH1 0x60 0000426c: ADD 0000426d: SWAP1 0000426e: JUMP 0000426f: JUMPDEST 00004270: PUSH1 0x20 00004272: DUP1 00004273: DUP3 00004274: MSTORE 00004275: PUSH1 0x15 00004277: SWAP1 00004278: DUP3 00004279: ADD 0000427a: MSTORE 0000427b: PUSH21 0x496e76616c696420546f6b656e2041646472657373 00004291: PUSH1 0x58 00004293: SHL 00004294: PUSH1 0x40 00004296: DUP3 00004297: ADD 00004298: MSTORE 00004299: PUSH1 0x60 0000429b: ADD 0000429c: SWAP1 0000429d: JUMP 0000429e: JUMPDEST 0000429f: PUSH1 0x40 000042a1: DUP1 000042a2: DUP3 000042a3: MSTORE 000042a4: DUP2 000042a5: ADD 000042a6: DUP4 000042a7: SWAP1 000042a8: MSTORE 000042a9: PUSH1 0x00 000042ab: DUP5 000042ac: PUSH1 0x60 000042ae: DUP4 000042af: ADD 000042b0: DUP3 000042b1: JUMPDEST 000042b2: DUP7 000042b3: DUP2 000042b4: LT 000042b5: ISZERO 000042b6: PUSH2 0x42df 000042b9: JUMPI 000042ba: PUSH1 0x01 000042bc: PUSH1 0x01 000042be: PUSH1 0xa0 000042c0: SHL 000042c1: SUB 000042c2: PUSH2 0x42ca 000042c5: DUP5 000042c6: PUSH2 0x3a67 000042c9: JUMP 000042ca: JUMPDEST 000042cb: AND 000042cc: DUP3 000042cd: MSTORE 000042ce: PUSH1 0x20 000042d0: SWAP3 000042d1: DUP4 000042d2: ADD 000042d3: SWAP3 000042d4: SWAP1 000042d5: SWAP2 000042d6: ADD 000042d7: SWAP1 000042d8: PUSH1 0x01 000042da: ADD 000042db: PUSH2 0x42b1 000042de: JUMP 000042df: JUMPDEST 000042e0: POP 000042e1: DUP1 000042e2: SWAP3 000042e3: POP 000042e4: POP 000042e5: POP 000042e6: DUP3 000042e7: ISZERO 000042e8: ISZERO 000042e9: PUSH1 0x20 000042eb: DUP4 000042ec: ADD 000042ed: MSTORE 000042ee: SWAP5 000042ef: SWAP4 000042f0: POP 000042f1: POP 000042f2: POP 000042f3: POP 000042f4: JUMP 000042f5: JUMPDEST 000042f6: PUSH1 0x00 000042f8: PUSH1 0x20 000042fa: DUP3 000042fb: DUP5 000042fc: SUB 000042fd: SLT 000042fe: ISZERO 000042ff: PUSH2 0x4307 00004302: JUMPI 00004303: PUSH1 0x00 00004305: DUP1 00004306: REVERT 00004307: JUMPDEST 00004308: POP 00004309: MLOAD 0000430a: SWAP2 0000430b: SWAP1 0000430c: POP 0000430d: JUMP 0000430e: JUMPDEST 0000430f: PUSH1 0x20 00004311: DUP1 00004312: DUP3 00004313: MSTORE 00004314: PUSH1 0x1d 00004316: SWAP1 00004317: DUP3 00004318: ADD 00004319: MSTORE 0000431a: PUSH32 0x5472616e736665722046756e647320746f2053656c6c6572204661696c000000 0000433b: PUSH1 0x40 0000433d: DUP3 0000433e: ADD 0000433f: MSTORE 00004340: PUSH1 0x60 00004342: ADD 00004343: SWAP1 00004344: JUMP 00004345: JUMPDEST 00004346: PUSH6 0xffffffffffff 0000434d: DUP2 0000434e: DUP2 0000434f: AND 00004350: DUP4 00004351: DUP3 00004352: AND 00004353: ADD 00004354: SWAP1 00004355: DUP1 00004356: DUP3 00004357: GT 00004358: ISZERO 00004359: PUSH2 0x4364 0000435c: JUMPI 0000435d: PUSH2 0x4364 00004360: PUSH2 0x3df4 00004363: JUMP 00004364: JUMPDEST 00004365: POP 00004366: SWAP3 00004367: SWAP2 00004368: POP 00004369: POP 0000436a: JUMP 0000436b: JUMPDEST 0000436c: PUSH1 0x00 0000436e: PUSH1 0x20 00004370: DUP3 00004371: DUP5 00004372: SUB 00004373: SLT 00004374: ISZERO 00004375: PUSH2 0x437d 00004378: JUMPI 00004379: PUSH1 0x00 0000437b: DUP1 0000437c: REVERT 0000437d: JUMPDEST 0000437e: DUP2 0000437f: MLOAD 00004380: PUSH2 0x1da6 00004383: DUP2 00004384: PUSH2 0x3d03 00004387: JUMP 00004388: JUMPDEST 00004389: PUSH1 0x00 0000438b: DUP3 0000438c: MLOAD 0000438d: PUSH1 0x00 0000438f: JUMPDEST 00004390: DUP2 00004391: DUP2 00004392: LT 00004393: ISZERO 00004394: PUSH2 0x43a9 00004397: JUMPI 00004398: PUSH1 0x20 0000439a: DUP2 0000439b: DUP7 0000439c: ADD 0000439d: DUP2 0000439e: ADD 0000439f: MLOAD 000043a0: DUP6 000043a1: DUP4 000043a2: ADD 000043a3: MSTORE 000043a4: ADD 000043a5: PUSH2 0x438f 000043a8: JUMP 000043a9: JUMPDEST 000043aa: POP 000043ab: PUSH1 0x00 000043ad: SWAP3 000043ae: ADD 000043af: SWAP2 000043b0: DUP3 000043b1: MSTORE 000043b2: POP 000043b3: SWAP2 000043b4: SWAP1 000043b5: POP 000043b6: JUMP 000043b7: INVALID 000043b8: PUSH4 0x616e6e6f 000043bd: PUSH21 0x2066696c6c206c657373207468656e206f66666572 000043d3: KECCAK256 000043d4: PUSH14 0x696e6194d22e970a1abb720b7410 000043e3: GASLIMIT 000043e4: UNKNOWN(0xE4) 000043e5: PUSH18 0xaf3fa516f4e2ede6b665387332888f92f213 000043f8: LOG2 000043f9: PUSH5 0x6970667358 000043ff: UNKNOWN(0x22) 00004400: SLT 00004401: KECCAK256 00004402: UNKNOWN(0xD2) 00004403: UNKNOWN(0xE0) 00004404: UNKNOWN(0x25) 00004405: UNKNOWN(0xFC) 00004406: UNKNOWN(0xC9) 00004407: UNKNOWN(0x2F) 00004408: UNKNOWN(0x2B) 00004409: SLOAD 0000440a: SAR 0000440b: DUP10 0000440c: UNKNOWN(0xA9) 0000440d: UNKNOWN(0xF9) 0000440e: UNKNOWN(0xDE) 0000440f: SWAP11 00004410: JUMPI 00004411: UNKNOWN(0xE8) 00004412: UNKNOWN(0xB3) 00004413: UNKNOWN(0xC1) 00004414: UNKNOWN(0xE6) 00004415: UNKNOWN(0xAF) 00004416: RETURNDATASIZE 00004417: UNKNOWN(0xE7) 00004418: UNKNOWN(0x4D) 00004419: BALANCE 0000441a: ADDRESS 0000441b: PUSH10 0x16844003ec8964736f6c 00004426: PUSH4 0x43000814 0000442b: STOP 0000442c: CALLER
| Severity | Category | Tool | Title | Confidence | Validated | Confirmed | Details |
|---|---|---|---|---|---|---|---|
| high | other | detector | Untrusted CALL target/value reachable | 60 | no | no |
viewtrace_id: 0x57c5b7fb40315ce94ce804aeeffecb25246ef720eee0e6456d4694e585819b51
call_targets:
0x6ac64c4760e0590f88233b2046810e87e0354324
target_varies:
no
classification:
constant_target
validation_json{
"sink": "CALL",
"errors": 0,
"status": "sink_reached",
"attempts": 1,
"trace_id": "0x57c5b7fb40315ce94ce804aeeffecb25246ef720eee0e6456d4694e585819b51",
"confirmed": false,
"trace_mode": "callTracer",
"call_targets": [
"0x6ac64c4760e0590f88233b2046810e87e0354324"
],
"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": "0x0787ef39",
"selector": "0x0787ef39",
"calldata_variants": [
"0x0787ef39",
"0x0787ef390000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0x16b4cdb2",
"selector": "0x16b4cdb2",
"calldata_variants": [
"0x16b4cdb2",
"0x16b4cdb20000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0x18b4f367",
"selector": "0x18b4f367",
"calldata_variants": [
"0x18b4f367",
"0x18b4f3670000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0x1f25a2d8",
"selector": "0x1f25a2d8",
"calldata_variants": [
"0x1f25a2d8",
"0x1f25a2d80000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0x21146fa2",
"selector": "0x21146fa2",
"calldata_variants": [
"0x21146fa2",
"0x21146fa20000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0x2d670584",
"selector": "0x2d670584",
"calldata_variants": [
"0x2d670584",
"0x2d6705840000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0x3b6e750f",
"selector": "0x3b6e750f",
"calldata_variants": [
"0x3b6e750f",
"0x3b6e750f0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0x410ce4c4",
"selector": "0x410ce4c4",
"calldata_variants": [
"0x410ce4c4",
"0x410ce4c40000000000000000000000000000000000000000000000000000000000000000"
]
}
]
}
evidence_json{
"examples": [
{
"pc": 2584,
"opcode": "CALL",
"returndata_checked": null,
"value_expression_category": "computed",
"target_expression_category": "computed"
},
{
"pc": 2675,
"opcode": "CALL",
"returndata_checked": null,
"value_expression_category": "computed",
"target_expression_category": "computed"
},
{
"pc": 8868,
"opcode": "CALL",
"returndata_checked": null,
"value_expression_category": "computed",
"target_expression_category": "computed"
}
],
"call_count": 11,
"guards_detected": [],
"untrusted_call_count": 11
}
|
| high | other | detector | ETH value transfer possible | 55 | no | no |
viewtrace_id: 0x57c5b7fb40315ce94ce804aeeffecb25246ef720eee0e6456d4694e585819b51
call_targets:
0x6ac64c4760e0590f88233b2046810e87e0354324
target_varies:
no
classification:
constant_target
validation_json{
"sink": "CALL",
"errors": 0,
"status": "sink_reached",
"attempts": 1,
"trace_id": "0x57c5b7fb40315ce94ce804aeeffecb25246ef720eee0e6456d4694e585819b51",
"confirmed": false,
"trace_mode": "callTracer",
"call_targets": [
"0x6ac64c4760e0590f88233b2046810e87e0354324"
],
"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": "0x0787ef39",
"selector": "0x0787ef39",
"calldata_variants": [
"0x0787ef39",
"0x0787ef390000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0x16b4cdb2",
"selector": "0x16b4cdb2",
"calldata_variants": [
"0x16b4cdb2",
"0x16b4cdb20000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0x18b4f367",
"selector": "0x18b4f367",
"calldata_variants": [
"0x18b4f367",
"0x18b4f3670000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0x1f25a2d8",
"selector": "0x1f25a2d8",
"calldata_variants": [
"0x1f25a2d8",
"0x1f25a2d80000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0x21146fa2",
"selector": "0x21146fa2",
"calldata_variants": [
"0x21146fa2",
"0x21146fa20000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0x2d670584",
"selector": "0x2d670584",
"calldata_variants": [
"0x2d670584",
"0x2d6705840000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0x3b6e750f",
"selector": "0x3b6e750f",
"calldata_variants": [
"0x3b6e750f",
"0x3b6e750f0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0x410ce4c4",
"selector": "0x410ce4c4",
"calldata_variants": [
"0x410ce4c4",
"0x410ce4c40000000000000000000000000000000000000000000000000000000000000000"
]
}
]
}
evidence_json{
"examples": [
{
"pc": 2584,
"opcode": "CALL",
"returndata_checked": null,
"value_expression_category": "computed",
"target_expression_category": "computed"
},
{
"pc": 2675,
"opcode": "CALL",
"returndata_checked": null,
"value_expression_category": "computed",
"target_expression_category": "computed"
},
{
"pc": 8868,
"opcode": "CALL",
"returndata_checked": null,
"value_expression_category": "computed",
"target_expression_category": "computed"
}
],
"eth_value_calls": 11,
"guards_detected": []
}
|
| high | other | codex | Fee-on-transfer collateral tokens let users over-withdraw from pooled escrow | 85 | no | — |
viewevidence_json{
"evidence": "`newOffer` and `fillOffer` call `safeTransferFrom` and then immediately store/order against the caller-provided `value`/`collateral` without checking the actual amount received. `cancelOffer`, `settleFilled`, and `settleCancelled` later pay out based on those nominal amounts from a shared per-token balance.",
"locations": [
"src/FrontrunMarket.sol:322",
"src/FrontrunMarket.sol:343",
"src/FrontrunMarket.sol:346",
"src/FrontrunMarket.sol:381",
"src/FrontrunMarket.sol:410",
"src/FrontrunMarket.sol:412",
"src/FrontrunMarket.sol:474",
"src/FrontrunMarket.sol:513",
"src/FrontrunMarket.sol:563"
],
"recommendation": "Reject non-standard collateral tokens, or account by actual balance deltas (`balanceAfter - balanceBefore`) instead of user-supplied nominal amounts. Store per-offer deposited amounts based on what was really received.",
"exploit_scenario": "If the owner whitelists a deflationary or fee-on-transfer ERC20, `newOffer`/`fillOffer` record the nominal `value` or `collateral` even when the contract receives less. An attacker can create an offer with a token that takes 10% on inbound transfers, deposit 90 tokens while the contract books 100, then cancel the offer and withdraw 100 from the shared pool. Repeating this drains other users' balances for that token and leaves later settlements/refunds insolvent."
}
|
| high | access_control | codex | Owner can de-whitelist an active collateral token and withdraw funds backing live positions | 85 | no | — |
viewevidence_json{
"evidence": "`setAcceptedTokens` can remove any token from the whitelist with no check for outstanding exposure. `withdrawStuckToken` only requires `!acceptedTokens[_token]`, then transfers the full contract balance of that token even though open offers/orders continue to use pooled balances for refunds and settlements.",
"locations": [
"src/FrontrunMarket.sol:656",
"src/FrontrunMarket.sol:660",
"src/FrontrunMarket.sol:780",
"src/FrontrunMarket.sol:782",
"src/FrontrunMarket.sol:784"
],
"recommendation": "Do not let rescue logic depend only on the current whitelist flag. Track outstanding liabilities per token and only allow withdrawing true surplus, or forbid de-whitelisting/rescuing any token while open offers/orders still reference it.",
"exploit_scenario": "Any accepted collateral token can be toggled to `false` via `setAcceptedTokens`, after which `withdrawStuckToken` will transfer the contract's entire balance of that token to an arbitrary address. If there are still open offers or orders using that token, the owner or a compromised owner key can drain the escrowed funds and leave users unable to cancel or settle their positions."
}
|
| 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": 12
}
|