019d5666-b2b6-72b3-991d-f09cf3f2b2ec
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 |
|---|---|---|---|---|
| 42932 | artifact.fetch | complete | 1 / 3 | 1 week ago |
| 42933 | proxy.resolve | complete | 1 / 3 | 1 week ago |
| 42934 | tool.cast_disasm | complete | 1 / 3 | 1 week ago |
| 42935 | analysis.bundle | complete | 1 / 3 | 1 week ago |
| 42936 | capability.graph | complete | 1 / 3 | 1 week ago |
| 42937 | detector.run | complete | 1 / 3 | 1 week ago |
| 42938 | validation.fork | complete | 1 / 3 | 1 week ago |
| 43004 | report.consolidate | complete | 1 / 6 | 1 week ago |
| 43005 | 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-4ykhde_k)
'forge config --json' running
'forge build --build-info --skip ./test/** ./script/** --force' running (wd: /tmp/slither-4ykhde_k)
'forge' returned non-zero exit code 1
[2m2026-04-04T04:34:08.343021Z[0m [31mERROR[0m [2mfoundry_compilers_artifacts_solc::sources[0m[2m:[0m [3merror[0m[2m=[0m"/tmp/slither-4ykhde_k/lib/openzeppelin-contracts/contracts/token/ERC20/SafeERC20.sol": No such file or directory (os error 2)
stdout: [2m2026-04-04T04:34:08.343150Z[0m [31mERROR[0m [2mfoundry_compilers_artifacts_solc::sources[0m[2m:[0m [3merror[0m[2m=[0m"/tmp/slither-4ykhde_k/lib/openzeppelin-contracts/contracts/cryptography/ECDSA.sol": No such file or directory (os error 2)
stdout: [2m2026-04-04T04:34:08.343323Z[0m [31mERROR[0m [2mfoundry_compilers_artifacts_solc::sources[0m[2m:[0m [3merror[0m[2m=[0m"/tmp/slither-4ykhde_k/lib/openzeppelin-contracts/contracts/utils/SafeCast.sol": No such file or directory (os error 2)
stdout: [2m2026-04-04T04:34:08.343385Z[0m [31mERROR[0m [2mfoundry_compilers_artifacts_solc::sources[0m[2m:[0m [3merror[0m[2m=[0m"/tmp/slither-4ykhde_k/lib/openzeppelin-contracts/contracts/math/SignedSafeMath.sol": No such file or directory (os error 2)
stdout: [2m2026-04-04T04:34:08.343504Z[0m [31mERROR[0m [2mfoundry_compilers_artifacts_solc::sources[0m[2m:[0m [3merror[0m[2m=[0m"/tmp/slither-4ykhde_k/lib/openzeppelin-contracts/contracts/math/SignedSafeMath.sol": No such file or directory (os error 2)
stdout: [2m2026-04-04T04:34:08.343523Z[0m [31mERROR[0m [2mfoundry_compilers_artifacts_solc::sources[0m[2m:[0m [3merror[0m[2m=[0m"/tmp/slither-4ykhde_k/lib/openzeppelin-contracts/contracts/cryptography/ECDSA.sol": No such file or directory (os error 2)
stdout: [2m2026-04-04T04:34:08.343538Z[0m [31mERROR[0m [2mfoundry_compilers_artifacts_solc::sources[0m[2m:[0m [3merror[0m[2m=[0m"/tmp/slither-4ykhde_k/lib/openzeppelin-contracts/contracts/token/ERC20/SafeERC20.sol": No such file or directory (os error 2)
stdout: [2m2026-04-04T04:34:08.343566Z[0m [31mERROR[0m [2mfoundry_compilers_artifacts_solc::sources[0m[2m:[0m [3merror[0m[2m=[0m"/tmp/slither-4ykhde_k/lib/openzeppelin-contracts/contracts/math/SafeMath.sol": No such file or directory (os error 2)
stdout: [2m2026-04-04T04:34:08.343787Z[0m [31mERROR[0m [2mfoundry_compilers_artifacts_solc::sources[0m[2m:[0m [3merror[0m[2m=[0m"/tmp/slither-4ykhde_k/lib/openzeppelin-contracts/contracts/token/ERC20/SafeERC20.sol": No such file or directory (os error 2)
stdout: Unable to resolve imports:
stdout: "@openzeppelin/contracts/math/SafeMath.sol" in "/tmp/slither-4ykhde_k/contracts/lib/UniversalERC20.sol"
stdout: "@openzeppelin/contracts/token/ERC20/SafeERC20.sol" in "/tmp/slither-4ykhde_k/contracts/token/TimeLockRegistry.sol"
stdout: "@openzeppelin/contracts/utils/SafeCast.sol" in "/tmp/slither-4ykhde_k/contracts/gardens/Garden.sol"
stdout: "@openzeppelin/contracts/cryptography/ECDSA.sol" in "/tmp/slither-4ykhde_k/contracts/gardens/Garden.sol"
stdout: "@openzeppelin/contracts/token/ERC20/SafeERC20.sol" in "/tmp/slither-4ykhde_k/contracts/gardens/Garden.sol"
stdout: "@openzeppelin/contracts/math/SignedSafeMath.sol" in "/tmp/slither-4ykhde_k/contracts/gardens/Garden.sol"
stdout: "@openzeppelin/contracts/cryptography/ECDSA.sol" in "/tmp/slither-4ykhde_k/contracts/lib/SignatureChecker.sol"
stdout: "@openzeppelin/contracts/math/SignedSafeMath.sol" in "/tmp/slither-4ykhde_k/contracts/lib/PreciseUnitMath.sol"
stdout: "@openzeppelin/contracts/token/ERC20/SafeERC20.sol" in "/tmp/slither-4ykhde_k/contracts/lib/UniversalERC20.sol"
stdout: with remappings:
stdout: openzeppelin-contracts/=/tmp/slither-4ykhde_k/lib/openzeppelin-contracts/
stdout: @openzeppelin/contracts/=/tmp/slither-4ykhde_k/lib/openzeppelin-contracts/contracts/
Error: Encountered invalid solc version in lib/openzeppelin-contracts/contracts/utils/Address.sol: No solc version exists that matches the version requirement: ^0.8.20
stderr: Encountered invalid solc version in lib/openzeppelin-contracts/contracts/access/Ownable.sol: No solc version exists that matches the version requirement: ^0.8.20
stderr: Encountered invalid solc version in lib/openzeppelin-contracts/contracts/utils/Address.sol: No solc version exists that matches the version requirement: ^0.8.20
stderr: Encountered invalid solc version in lib/openzeppelin-contracts/contracts/access/Ownable.sol: No solc version exists that matches the version requirement: ^0.8.20
stderr: Encountered invalid solc version in lib/openzeppelin-contracts/contracts/proxy/Proxy.sol: No solc version exists that matches the version requirement: ^0.8.20
stderr: Encountered invalid solc version in lib/openzeppelin-contracts/contracts/access/Ownable.sol: No solc version exists that matches the version requirement: ^0.8.20
stderr: Encountered invalid solc version in lib/openzeppelin-contracts/contracts/access/Ownable.sol: No solc version exists that matches the version requirement: ^0.8.20
stderr: Encountered invalid solc version in lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.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-4ykhde_k/out/build-info is not a directory.
{"no_findings":false,"summary":"Three material issues: keeper-supplied share prices can be ratcheted to steal TVL, stake-and-claim signatures replay across gardens, and the vesting registry can be seized before first initialization.","findings":[{"severity":"high","category":"oracle","title":"Keeper-controlled pricePerShare can be stair-stepped away from real NAV and used to overmint/overwithdraw","exploit_scenario":"A malicious keeper collaborates with an attacker contributor and submits a series of tiny `depositBySig` calls that each move `_pricePerShare` by the allowed 25% band. Because the contract only compares the new value to the last recorded value, the keeper can walk `lastPricePerShare` far below real NAV. The attacker then makes a large by-signature deposit at the fake low price, receives far too many garden shares, and later exits against the garden's real valuation, diluting and stealing reserve assets from existing contributors. The same weak check also affects by-signature withdrawals and Heart staking.","recommendation":"Do not trust keeper-supplied share prices. Recompute price per share on-chain for by-signature flows, or at minimum validate the supplied value against the current on-chain valuation within a tight per-transaction tolerance. Do not let historical user-supplied prices become the sole anchor for future pricing.","evidence":"`depositBySig`, `withdrawBySig`, and `stakeBySig` all accept an external `_pricePerShare`. `_checkLastPricePerShare` only bounds the new price against `lastPricePerShare` plus a decay-based slippage window, then overwrites the stored reference unconditionally; it never compares against the garden's actual current valuation.","locations":["contracts/gardens/Garden.sol:315","contracts/gardens/Garden.sol:427","contracts/gardens/Garden.sol:655","contracts/gardens/Garden.sol:1232"]},{"severity":"high","category":"auth","title":"`claimAndStakeRewardsBySig` signatures are replayable across different gardens","exploit_scenario":"A contributor who is in multiple gardens signs a stake-and-claim message for Garden A. A malicious keeper instead submits that same signature to Garden B where the contributor's garden nonce matches. Garden B accepts it because the signed hash is bound to `heartGarden` rather than `address(this)`, then `_sendRewardsInternal` pays out Garden B's reserve-asset rewards and BABL allocation. The attacker can choose whichever matching garden has the largest rewards set aside, draining funds from an unintended garden with a signature that was never scoped to it.","recommendation":"Bind the source garden into the signed payload and verification path. `claimAndStakeRewardsBySig` should hash `address(this)` (and ideally `chainid`) in addition to the Heart-garden context, or use separate signatures for source-garden reward claims and Heart staking.","evidence":"The signed type for staking rewards does not include a source garden field, and `claimAndStakeRewardsBySig` hashes `address(heartGarden)` instead of `address(this)`. Verification then checks only the contributor nonce of whichever garden executes the call, so the same signature is valid in any garden where that nonce matches.","locations":["contracts/gardens/Garden.sol:107","contracts/gardens/Garden.sol:576","contracts/gardens/Garden.sol:590","contracts/gardens/Garden.sol:605"]},{"severity":"medium","category":"access_control","title":"First `setTimeLockRegistry` call is permissionless, enabling vesting-registry takeover","exploit_scenario":"After deployment, if `timeLockRegistry` has not already been initialized in a constructor/initializer, any external account can call `setTimeLockRegistry` first and point it to an attacker-controlled contract. That attacker then becomes the permanent registry authority because future rotations are gated by `Ownable(timeLockRegistry).owner()`. With control of the registry, the attacker can disrupt claims and claw back still-locked team/advisor balances through the token's `onlyTimeLockRegistry` paths.","recommendation":"Make the registry immutable at deployment, or gate the first assignment with `onlyOwner`/a one-time initializer. Do not allow the zero-state registry check to bypass access control.","evidence":"`onlyTimeLockOwner` performs no authorization when `timeLockRegistry` is still zero. `setTimeLockRegistry` uses that modifier directly, so the initial registry assignment is unrestricted.","locations":["contracts/token/TimeLockedToken.sol:69","contracts/token/TimeLockedToken.sol:155","contracts/token/TimeLockedToken.sol:161"]}]}
}
return result;
}
}
================================================================================
FILE: contracts/lib/SafeDecimalMath.sol
================================================================================
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.7.6;
import {IERC20} from '@openzeppelin/contracts/token/ERC20/IERC20.sol';
import {LowGasSafeMath} from '../lib/LowGasSafeMath.sol';
import {UniversalERC20} from '../lib/UniversalERC20.sol';
library SafeDecimalMath {
using LowGasSafeMath for uint256;
using UniversalERC20 for IERC20;
/* Number of decimal places in the representations. */
uint8 internal constant decimals = 18;
/* The number representing 1.0. */
uint256 internal constant UNIT = 10**uint256(decimals);
/**
* @return Provides an interface to UNIT.
*/
function unit() internal pure returns (uint256) {
return UNIT;
}
/**
* @return The result of multiplying x and y, interpreting the operands as fixed-point
* decimals.
*
* @dev A unit factor is divided out after the product of x and y is evaluated,
* so that product must be less than 2**256. As this is an integer division,
exec
/bin/bash -lc "sed -n '3601,4400p' AUDIT_BUNDLE.txt" in /tmp/codex-3hez4cop
succeeded in 0ms:
* the internal division always rounds down. This helps save on gas. Rounding
* is more expensive on gas.
*/
function multiplyDecimal(uint256 x, uint256 y) internal pure returns (uint256) {
/* Divide by UNIT to remove the extra factor introduced by the product. */
return x.mul(y) / UNIT;
}
/**
* @return The result of safely multiplying x and y, interpreting the operands
* as fixed-point decimals of the specified precision unit.
*
* @dev The operands should be in the form of a the specified unit factor which will be
* divided out after the product of x and y is evaluated, so that product must be
* less than 2**256.
*
* Unlike multiplyDecimal, this function rounds the result to the nearest increment.
* Rounding is useful when you need to retain fidelity for small decimal numbers
* (eg. small fractions or percentages).
*/
function _multiplyDecimalRound(
uint256 x,
uint256 y,
uint256 precisionUnit
) private pure returns (uint256) {
/* Divide by UNIT to remove the extra factor introduced by the product. */
uint256 quotientTimesTen = x.mul(y) / (precisionUnit / 10);
if (quotientTimesTen % 10 >= 5) {
quotientTimesTen += 10;
}
return quotientTimesTen / 10;
}
/**
* @return The result of safely multiplying x and y, interpreting the operands
* as fixed-point decimals of a standard unit.
*
* @dev The operands should be in the standard unit factor which will be
* divided out after the product of x and y is evaluated, so that product must be
* less than 2**256.
*
* Unlike multiplyDecimal, this function rounds the result to the nearest increment.
* Rounding is useful when you need to retain fidelity for small decimal numbers
* (eg. small fractions or percentages).
*/
function multiplyDecimalRound(uint256 x, uint256 y) internal pure returns (uint256) {
return _multiplyDecimalRound(x, y, UNIT);
}
/**
* @return The result of safely dividing x and y. The return value is a high
* precision decimal.
*
* @dev y is divided after the product of x and the standard precision unit
* is evaluated, so the product of x and UNIT must be less than 2**256. As
* this is an integer division, the result is always rounded down.
* This helps save on gas. Rounding is more expensive on gas.
*/
function divideDecimal(uint256 x, uint256 y) internal pure returns (uint256) {
/* Reintroduce the UNIT factor that will be divided out by y. */
return x.mul(UNIT).div(y);
}
/**
* @return The result of safely dividing x and y. The return value is as a rounded
* decimal in the precision unit specified in the parameter.
*
* @dev y is divided after the product of x and the specified precision unit
* is evaluated, so the product of x and the specified precision unit must
* be less than 2**256. The result is rounded to the nearest increment.
*/
function _divideDecimalRound(
uint256 x,
uint256 y,
uint256 precisionUnit
) private pure returns (uint256) {
uint256 resultTimesTen = x.mul(precisionUnit * 10).div(y);
if (resultTimesTen % 10 >= 5) {
resultTimesTen += 10;
}
return resultTimesTen / 10;
}
/**
* @return The result of safely dividing x and y. The return value is as a rounded
* standard precision decimal.
*
* @dev y is divided after the product of x and the standard precision unit
* is evaluated, so the product of x and the standard precision unit must
* be less than 2**256. The result is rounded to the nearest increment.
*/
function divideDecimalRound(uint256 x, uint256 y) internal pure returns (uint256) {
return _divideDecimalRound(x, y, UNIT);
}
/**
* Normalizing amount decimals between tokens
* @param _from ERC20 asset address
* @param _to ERC20 asset address
* @param _amount Value _to normalize (e.g. capital)
*/
function normalizeAmountTokens(
address _from,
address _to,
uint256 _amount
) internal view returns (uint256) {
uint256 fromDecimals = IERC20(_from).universalDecimals();
uint256 toDecimals = IERC20(_to).universalDecimals();
if (fromDecimals == toDecimals) {
return _amount;
}
if (toDecimals > fromDecimals) {
return _amount.mul(10**(toDecimals - (fromDecimals)));
}
return _amount.div(10**(fromDecimals - (toDecimals)));
}
}
================================================================================
FILE: contracts/lib/SignatureChecker.sol
================================================================================
// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;
import {ECDSA} from '@openzeppelin/contracts/cryptography/ECDSA.sol';
import {Address} from '@openzeppelin/contracts/utils/Address.sol';
import {IERC1271} from '../interfaces/IERC1271.sol';
/**
* @dev Signature verification helper: Provide a single mechanism to verify both private-key (EOA) ECDSA signature and
* ERC1271 contract sigantures. Using this instead of ECDSA.recover in your contract will make them compatible with
* smart contract wallets such as Argent and Gnosis.
*
* Note: unlike ECDSA signatures, contract signature's are revocable, and the outcome of this function can thus change
* through time. It could return true at block N and false at block N+1 (or the opposite).
*
*/
library SignatureChecker {
function isValidSignatureNow(
address signer,
bytes32 hash,
bytes memory signature
) internal view returns (bool) {
if (Address.isContract(signer)) {
try IERC1271(signer).isValidSignature(hash, signature) returns (bytes4 magicValue) {
return magicValue == IERC1271(signer).isValidSignature.selector;
} catch {
return false;
}
} else {
return ECDSA.recover(hash, signature) == signer;
}
}
}
================================================================================
FILE: contracts/lib/UniversalERC20.sol
================================================================================
// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;
import {SafeERC20} from '@openzeppelin/contracts/token/ERC20/SafeERC20.sol';
import {IERC20} from '@openzeppelin/contracts/token/ERC20/IERC20.sol';
import {SafeMath} from '@openzeppelin/contracts/math/SafeMath.sol';
library UniversalERC20 {
using SafeMath for uint256;
using SafeERC20 for IERC20;
IERC20 private constant ZERO_ADDRESS = IERC20(0x0000000000000000000000000000000000000000);
IERC20 private constant ETH_ADDRESS = IERC20(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE);
function universalTransfer(
IERC20 token,
address to,
uint256 amount
) internal returns (bool) {
if (amount == 0) {
return true;
}
if (isETH(token)) {
address(uint160(to)).transfer(amount);
return true;
} else {
token.safeTransfer(to, amount);
return true;
}
}
function universalTransferFrom(
IERC20 token,
address from,
address to,
uint256 amount
) internal {
if (amount == 0) {
return;
}
if (isETH(token)) {
require(from == msg.sender && msg.value >= amount, 'msg.value is zero');
if (to != address(this)) {
address(uint160(to)).transfer(amount);
}
if (msg.value > amount) {
msg.sender.transfer(msg.value.sub(amount));
}
} else {
token.safeTransferFrom(from, to, amount);
}
}
function universalApprove(
IERC20 token,
address to,
uint256 amount
) internal {
if (!isETH(token)) {
if (amount > 0 && token.allowance(address(this), to) > 0) {
token.safeApprove(to, 0);
}
token.safeApprove(to, amount);
}
}
function universalBalanceOf(IERC20 token, address who) internal view returns (uint256) {
if (isETH(token)) {
return who.balance;
} else {
return token.balanceOf(who);
}
}
function universalDecimals(IERC20 token) internal view returns (uint256) {
if (isETH(token)) {
return 18;
}
(bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSignature('decimals()'));
return success ? abi.decode(data, (uint256)) : 18;
}
function isETH(IERC20 token) internal pure returns (bool) {
return address(token) == address(ZERO_ADDRESS) || address(token) == address(ETH_ADDRESS);
}
}
================================================================================
FILE: contracts/proxy/VTableBeacon.sol
================================================================================
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.7.6;
pragma abicoder v2;
import {Ownable} from '@openzeppelin/contracts/access/Ownable.sol';
/**
* @title VTableBeacon
* @notice Redirects calls to an implementation based on the method signature
*/
contract VTableBeacon is Ownable {
struct ModuleDefinition {
address implementation;
bytes4[] selectors;
}
bytes4 private constant _FALLBACK_SIGN = 0xffffffff;
// Mapping of methods signatures to their implementations
mapping(bytes4 => address) public delegates;
event VTableUpdate(bytes4 indexed selector, address oldImplementation, address newImplementation);
function implementation(bytes4 _selector) external view virtual returns (address module) {
module = delegates[_selector];
if (module != address(0)) return module;
module = delegates[_FALLBACK_SIGN];
if (module != address(0)) return module;
revert('VTableBeacon: No implementation found');
}
/**
* @dev Updates the vtable
*/
function updateVTable(ModuleDefinition[] calldata modules) external onlyOwner {
for (uint256 i = 0; i < modules.length; ++i) {
ModuleDefinition memory module = modules[i];
for (uint256 j = 0; j < module.selectors.length; ++j) {
bytes4 selector = module.selectors[j];
emit VTableUpdate(selector, delegates[selector], module.implementation);
delegates[selector] = module.implementation;
}
}
}
}
================================================================================
FILE: contracts/proxy/VTableBeaconProxy.sol
================================================================================
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.7.6;
pragma abicoder v2;
import '@openzeppelin/contracts/proxy/Proxy.sol';
import './VTableBeacon.sol';
/**
* @title VTableBeaconProxy
*/
contract VTableBeaconProxy is Proxy {
VTableBeacon public immutable beacon;
constructor(VTableBeacon _beacon) {
beacon = _beacon;
}
function _implementation() internal view virtual override returns (address module) {
return beacon.implementation(msg.sig);
}
}
================================================================================
FILE: contracts/token/TimeLockRegistry.sol
================================================================================
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.7.6;
pragma experimental ABIEncoderV2;
import {Ownable} from '@openzeppelin/contracts/access/Ownable.sol';
import {Address} from '@openzeppelin/contracts/utils/Address.sol';
import {SafeERC20} from '@openzeppelin/contracts/token/ERC20/SafeERC20.sol';
import {IERC20} from '@openzeppelin/contracts/token/ERC20/IERC20.sol';
import {TimeLockedToken} from './TimeLockedToken.sol';
import {AddressArrayUtils} from '../lib/AddressArrayUtils.sol';
import {LowGasSafeMath} from '../lib/LowGasSafeMath.sol';
/**
* @title TimeLockRegistry
* @notice Register Lockups for TimeLocked ERC20 Token BABL (e.g. vesting)
* @author Babylon Finance
* @dev This contract allows owner to register distributions for a TimeLockedToken
*
* To register a distribution, register method should be called by the owner.
* claim() should be called only by the BABL Token smartcontract (modifier onlyBABLToken)
* when any account registered to receive tokens make its own claim
* If case of a mistake, owner can cancel registration before the claim is done by the account
*
* Note this contract address must be setup in the TimeLockedToken's contract pointing
* to interact with (e.g. setTimeLockRegistry() function)
*/
contract TimeLockRegistry is Ownable {
using LowGasSafeMath for uint256;
using Address for address;
using AddressArrayUtils for address[];
/* ============ Events ============ */
event Register(address receiver, uint256 distribution);
event Cancel(address receiver, uint256 distribution);
event Claim(address account, uint256 distribution);
/* ============ Modifiers ============ */
modifier onlyBABLToken() {
require(msg.sender == address(token), 'only BABL Token');
_;
}
/* ============ State Variables ============ */
// time locked token
TimeLockedToken public token;
/**
* @notice The profile of each token owner under vesting conditions and its special conditions
* @param receiver Account being registered
* @param investorType Indicates whether or not is a Team member (true = team member / advisor, false = private investor)
* @param vestingStarting Date When the vesting begins for such token owner
* @param distribution Tokens amount that receiver is due to get
*/
struct Registration {
address receiver;
uint256 distribution;
bool investorType;
uint256 vestingStartingDate;
}
/**
* @notice The profile of each token owner under vesting conditions and its special conditions
* @param team Indicates whether or not is a Team member (true = team member / advisor, false = private investor)
* @param vestingBegin When the vesting begins for such token owner
* @param vestingEnd When the vesting ends for such token owner
* @param lastClaim When the last claim was done
*/
struct TokenVested {
bool team;
bool cliff;
uint256 vestingBegin;
uint256 vestingEnd;
uint256 lastClaim;
}
/// @notice A record of token owners under vesting conditions for each account, by index
mapping(address => TokenVested) public tokenVested;
// mapping from token owners under vesting conditions to BABL due amount (e.g. SAFT addresses, team members, advisors)
mapping(address => uint256) public registeredDistributions;
// array of all registrations
address[] public registrations;
// total amount of tokens registered
uint256 public totalTokens;
// vesting for Team Members
uint256 private constant teamVesting = 365 days * 4;
// vesting for Investors and Advisors
uint256 private constant investorVesting = 365 days * 3;
/* ============ Functions ============ */
/* ============ Constructor ============ */
/**
* @notice Construct a new Time Lock Registry and gives ownership to sender
* @param _token TimeLockedToken contract to use in this registry
*/
constructor(TimeLockedToken _token) {
token = _token;
}
/* ============ External Functions ============ */
/* ============ External Getter Functions ============ */
/**
* Gets registrations
*
* @return address[] Returns list of registrations
*/
function getRegistrations() external view returns (address[] memory) {
return registrations;
}
/* =========== Token related Gov Functions ====== */
/**
* PRIVILEGED GOVERNANCE FUNCTION
*
* @notice Register multiple investors/team in a batch
* @param _registrations Registrations to process
*/
function registerBatch(Registration[] memory _registrations) external onlyOwner {
for (uint256 i = 0; i < _registrations.length; i++) {
register(
_registrations[i].receiver,
_registrations[i].distribution,
_registrations[i].investorType,
_registrations[i].vestingStartingDate
);
}
}
/**
* PRIVILEGED GOVERNANCE FUNCTION
*
* @notice Register new account under vesting conditions (Team, Advisors, Investors e.g. SAFT purchaser)
* @param receiver Address belonging vesting conditions
* @param distribution Tokens amount that receiver is due to get
*/
function register(
address receiver,
uint256 distribution,
bool investorType,
uint256 vestingStartingDate
) public onlyOwner {
require(receiver != address(0), 'TimeLockRegistry::register: cannot register the zero address');
require(
receiver != address(this),
'TimeLockRegistry::register: Time Lock Registry contract cannot be an investor'
);
require(distribution != 0, 'TimeLockRegistry::register: Distribution = 0');
require(
registeredDistributions[receiver] == 0,
'TimeLockRegistry::register:Distribution for this address is already registered'
);
require(vestingStartingDate >= 1614553200, 'Cannot register earlier than March 2021'); // 1614553200 is UNIX TIME of 2021 March the 1st
require(
vestingStartingDate <= block.timestamp.add(30 days),
'Cannot register more than 30 days ahead in the future'
);
require(totalTokens.add(distribution) <= IERC20(token).balanceOf(address(this)), 'Not enough tokens');
totalTokens = totalTokens.add(distribution);
// register distribution
registeredDistributions[receiver] = distribution;
registrations.push(receiver);
// register token vested conditions
TokenVested storage newTokenVested = tokenVested[receiver];
newTokenVested.team = investorType;
newTokenVested.vestingBegin = vestingStartingDate;
if (newTokenVested.team == true) {
newTokenVested.vestingEnd = vestingStartingDate.add(teamVesting);
} else {
newTokenVested.vestingEnd = vestingStartingDate.add(investorVesting);
}
newTokenVested.lastClaim = vestingStartingDate;
tokenVested[receiver] = newTokenVested;
// emit register event
emit Register(receiver, distribution);
}
/**
* PRIVILEGED GOVERNANCE FUNCTION. Cancel distribution registration in case of mistake and before a claim is done
*
* @notice Cancel distribution registration
* @dev A claim has not to be done earlier
* @param receiver Address that should have it's distribution removed
* @return Whether or not it succeeded
*/
function cancelRegistration(address receiver) external onlyOwner returns (bool) {
require(registeredDistributions[receiver] != 0, 'Not registered');
// get amount from distributions
uint256 amount = registeredDistributions[receiver];
// set distribution mapping to 0
delete registeredDistributions[receiver];
// set tokenVested mapping to 0
delete tokenVested[receiver];
// remove from the list of all registrations
registrations.remove(receiver);
// decrease total tokens
totalTokens = totalTokens.sub(amount);
// emit cancel event
emit Cancel(receiver, amount);
return true;
}
/**
* PRIVILEGED GOVERNANCE FUNCTION. Cancel distribution registration in case of mistake and before a claim is done
*
* @notice Cancel already delivered tokens. It might only apply when non-completion of vesting period of Team members or Advisors
* @dev An automatic override allowance is granted during the claim process
* @param account Address that should have it's distribution removed
* @return Whether or not it succeeded
*/
function cancelDeliveredTokens(address account) external onlyOwner returns (bool) {
uint256 loosingAmount = token.cancelVestedTokens(account);
// emit cancel event
emit Cancel(account, loosingAmount);
return true;
}
/**
* PRIVILEGED GOVERNANCE FUNCTION. Recover tokens in Time Lock Registry smartcontract address by the owner
*
* @notice Send tokens from smartcontract address to the owner.
* It might only apply after a cancellation of vested tokens
* @param amount Amount to be recovered by the owner of the Time Lock Registry smartcontract from its balance
* @return Whether or not it succeeded
*/
function transferToOwner(uint256 amount) external onlyOwner returns (bool) {
SafeERC20.safeTransfer(token, msg.sender, amount);
return true;
}
/**
* PRIVILEGED GOVERNANCE FUNCTION. Claim locked tokens by the registered account
*
* @notice Claim tokens due amount.
* @dev Claim is done by the user in the TimeLocked contract and the contract is the only allowed to call
* this function on behalf of the user to make the claim
* @return The amount of tokens registered and delivered after the claim
*/
function claim(address _receiver) external onlyBABLToken returns (uint256) {
require(registeredDistributions[_receiver] != 0, 'Not registered');
// get amount from distributions
uint256 amount = registeredDistributions[_receiver];
TokenVested storage claimTokenVested = tokenVested[_receiver];
claimTokenVested.lastClaim = block.timestamp;
// set distribution mapping to 0
delete registeredDistributions[_receiver];
// decrease total tokens
totalTokens = totalTokens.sub(amount);
// register lockup in TimeLockedToken
// this will transfer funds from this contract and lock them for sender
token.registerLockup(
_receiver,
amount,
claimTokenVested.team,
claimTokenVested.vestingBegin,
claimTokenVested.vestingEnd,
claimTokenVested.lastClaim
);
// set tokenVested mapping to 0
delete tokenVested[_receiver];
// emit claim event
emit Claim(_receiver, amount);
return amount;
}
/* ============ Getter Functions ============ */
function checkVesting(address address_)
external
view
returns (
bool team,
uint256 start,
uint256 end,
uint256 last
)
{
TokenVested storage checkTokenVested = tokenVested[address_];
return (
checkTokenVested.team,
checkTokenVested.vestingBegin,
checkTokenVested.vestingEnd,
checkTokenVested.lastClaim
);
}
function checkRegisteredDistribution(address address_) external view returns (uint256 amount) {
return registeredDistributions[address_];
}
}
================================================================================
FILE: contracts/token/TimeLockedToken.sol
================================================================================
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.7.6;
import {IBabController} from '../interfaces/IBabController.sol';
import {TimeLockRegistry} from './TimeLockRegistry.sol';
import {IRewardsDistributor} from '../interfaces/IRewardsDistributor.sol';
import {VoteToken} from './VoteToken.sol';
import {Ownable} from '@openzeppelin/contracts/access/Ownable.sol';
import {Errors, _require} from '../lib/BabylonErrors.sol';
import {LowGasSafeMath} from '../lib/LowGasSafeMath.sol';
import {IBabController} from '../interfaces/IBabController.sol';
/**
* @title TimeLockedToken
* @notice Time Locked ERC20 Token
* @author Babylon Finance
* @dev Contract which gives the ability to time-lock tokens specially for vesting purposes usage
*
* By overriding the balanceOf() and transfer() functions in ERC20,
* an account can show its full, post-distribution balance and use it for voting power
* but only transfer or spend up to an allowed amount
*
* A portion of previously non-spendable tokens are allowed to be transferred
* along the time depending on each vesting conditions, and after all epochs have passed, the full
* account balance is unlocked. In case on non-completion vesting period, only the Time Lock Registry can cancel
* the delivery of the pending tokens and only can cancel the remaining locked ones.
*/
abstract contract TimeLockedToken is VoteToken {
using LowGasSafeMath for uint256;
/* ============ Events ============ */
/// @notice An event that emitted when a new lockout ocurr
event NewLockout(
address account,
uint256 tokenslocked,
bool isTeamOrAdvisor,
uint256 startingVesting,
uint256 endingVesting
);
/// @notice An event that emitted when a new Time Lock is registered
event NewTimeLockRegistration(address previousAddress, address newAddress);
/// @notice An event that emitted when a new Rewards Distributor is registered
event NewRewardsDistributorRegistration(address previousAddress, address newAddress);
/// @notice An event that emitted when a cancellation of Lock tokens is registered
event Cancel(address account, uint256 amount);
/// @notice An event that emitted when a claim of tokens are registered
event Claim(address _receiver, uint256 amount);
/// @notice An event that emitted when a lockedBalance query is done
event LockedBalance(address _account, uint256 amount);
/* ============ Modifiers ============ */
modifier onlyTimeLockRegistry() {
require(
msg.sender == address(timeLockRegistry),
'TimeLockedToken:: onlyTimeLockRegistry: can only be executed by TimeLockRegistry'
);
_;
}
modifier onlyTimeLockOwner() {
if (address(timeLockRegistry) != address(0)) {
require(
msg.sender == Ownable(timeLockRegistry).owner(),
'TimeLockedToken:: onlyTimeLockOwner: can only be executed by the owner of TimeLockRegistry'
);
}
_;
}
modifier onlyUnpaused() {
// Do not execute if Globally or individually paused
_require(!IBabController(controller).isPaused(address(this)), Errors.ONLY_UNPAUSED);
_;
}
/* ============ State Variables ============ */
// represents total distribution for locked balances
mapping(address => uint256) distribution;
/// @notice The profile of each token owner under its particular vesting conditions
/**
* @param team Indicates whether or not is a Team member or Advisor (true = team member/advisor, false = private investor)
* @param vestingBegin When the vesting begins for such token owner
* @param vestingEnd When the vesting ends for such token owner
* @param lastClaim When the last claim was done
*/
struct VestedToken {
bool teamOrAdvisor;
uint256 vestingBegin;
uint256 vestingEnd;
uint256 lastClaim;
}
/// @notice A record of token owners under vesting conditions for each account, by index
mapping(address => VestedToken) public vestedToken;
// address of Time Lock Registry contract
IBabController public controller;
// address of Time Lock Registry contract
TimeLockRegistry public timeLockRegistry;
// address of Rewards Distriburor contract
IRewardsDistributor public rewardsDistributor;
// Enable Transfer of ERC20 BABL Tokens
// Only Minting or transfers from/to TimeLockRegistry and Rewards Distributor can transfer tokens until the protocol is fully decentralized
bool private tokenTransfersEnabled;
bool private tokenTransfersWereDisabled;
/* ============ Functions ============ */
/* ============ Constructor ============ */
constructor(string memory _name, string memory _symbol) VoteToken(_name, _symbol) {
tokenTransfersEnabled = true;
}
/* ============ External Functions ============ */
exec
/bin/bash -lc "sed -n '4401,5200p' AUDIT_BUNDLE.txt" in /tmp/codex-3hez4cop
succeeded in 0ms:
/* =========== Token related Gov Functions ====== */
/**
* PRIVILEGED GOVERNANCE FUNCTION. Disables transfers of ERC20 BABL Tokens
*/
function disableTokensTransfers() external onlyOwner {
require(!tokenTransfersWereDisabled, 'BABL must flow');
tokenTransfersEnabled = false;
tokenTransfersWereDisabled = true;
}
/**
* PRIVILEGED GOVERNANCE FUNCTION. Allows transfers of ERC20 BABL Tokens
* Can only happen after the protocol is fully decentralized.
*/
function enableTokensTransfers() external onlyOwner {
tokenTransfersEnabled = true;
}
/**
* PRIVILEGED GOVERNANCE FUNCTION. Set the Time Lock Registry contract to control token vesting conditions
*
* @notice Set the Time Lock Registry contract to control token vesting conditions
* @param newTimeLockRegistry Address of TimeLockRegistry contract
*/
function setTimeLockRegistry(TimeLockRegistry newTimeLockRegistry) external onlyTimeLockOwner returns (bool) {
require(address(newTimeLockRegistry) != address(0), 'cannot be zero address');
require(address(newTimeLockRegistry) != address(this), 'cannot be this contract');
require(address(newTimeLockRegistry) != address(timeLockRegistry), 'must be new TimeLockRegistry');
emit NewTimeLockRegistration(address(timeLockRegistry), address(newTimeLockRegistry));
timeLockRegistry = newTimeLockRegistry;
return true;
}
/**
* PRIVILEGED GOVERNANCE FUNCTION. Set the Rewards Distributor contract to control either BABL Mining or profit rewards
*
* @notice Set the Rewards Distriburor contract to control both types of rewards (profit and BABL Mining program)
* @param newRewardsDistributor Address of Rewards Distributor contract
*/
function setRewardsDistributor(IRewardsDistributor newRewardsDistributor) external onlyOwner returns (bool) {
require(address(newRewardsDistributor) != address(0), 'cannot be zero address');
require(address(newRewardsDistributor) != address(this), 'cannot be this contract');
require(address(newRewardsDistributor) != address(rewardsDistributor), 'must be new Rewards Distributor');
emit NewRewardsDistributorRegistration(address(rewardsDistributor), address(newRewardsDistributor));
rewardsDistributor = newRewardsDistributor;
return true;
}
/**
* PRIVILEGED GOVERNANCE FUNCTION. Register new token lockup conditions for vested tokens defined only by Time Lock Registry
*
* @notice Tokens are completely delivered during the registration however lockup conditions apply for vested tokens
* locking them according to the distribution epoch periods and the type of recipient (Team, Advisor, Investor)
* Emits a transfer event showing a transfer to the recipient
* Only the registry can call this function
* @param _receiver Address to receive the tokens
* @param _amount Tokens to be transferred
* @param _profile True if is a Team Member or Advisor
* @param _vestingBegin Unix Time when the vesting for that particular address
* @param _vestingEnd Unix Time when the vesting for that particular address
* @param _lastClaim Unix Time when the claim was done from that particular address
*
*/
function registerLockup(
address _receiver,
uint256 _amount,
bool _profile,
uint256 _vestingBegin,
uint256 _vestingEnd,
uint256 _lastClaim
) external onlyTimeLockRegistry returns (bool) {
require(balanceOf(msg.sender) >= _amount, 'insufficient balance');
require(_receiver != address(0), 'cannot be zero address');
require(_receiver != address(this), 'cannot be this contract');
require(_receiver != address(timeLockRegistry), 'cannot be the TimeLockRegistry contract itself');
require(_receiver != msg.sender, 'the owner cannot lockup itself');
// update amount of locked distribution
distribution[_receiver] = distribution[_receiver].add(_amount);
VestedToken storage newVestedToken = vestedToken[_receiver];
newVestedToken.teamOrAdvisor = _profile;
newVestedToken.vestingBegin = _vestingBegin;
newVestedToken.vestingEnd = _vestingEnd;
newVestedToken.lastClaim = _lastClaim;
// transfer tokens to the recipient
_transfer(msg.sender, _receiver, _amount);
emit NewLockout(_receiver, _amount, _profile, _vestingBegin, _vestingEnd);
return true;
}
/**
* PRIVILEGED GOVERNANCE FUNCTION. Cancel and remove locked tokens due to non-completion of vesting period
* applied only by Time Lock Registry and specifically to Team or Advisors as it does not apply to investors.
*
* @dev Cancel distribution registration
* @param lockedAccount that should have its still locked distribution removed due to non-completion of its vesting period
*/
function cancelVestedTokens(address lockedAccount) external onlyTimeLockRegistry returns (uint256) {
return _cancelVestedTokensFromTimeLock(lockedAccount);
}
/**
* GOVERNANCE FUNCTION. Each token owner can claim its own specific tokens with its own specific vesting conditions from the Time Lock Registry
*
* @dev Claim msg.sender tokens (if any available in the registry)
*/
function claimMyTokens() external {
// claim msg.sender tokens from timeLockRegistry
uint256 amount = timeLockRegistry.claim(msg.sender);
// After a proper claim, locked tokens of Team and Advisors profiles are under restricted special vesting conditions so they automatic grant
// rights to the Time Lock Registry to only retire locked tokens if non-compliance vesting conditions take places along the vesting periods.
// It does not apply to Investors under vesting (their locked tokens cannot be removed).
if (vestedToken[msg.sender].teamOrAdvisor == true) {
approve(address(timeLockRegistry), amount);
}
// emit claim event
emit Claim(msg.sender, amount);
}
/**
* GOVERNANCE FUNCTION. Get unlocked balance for an account
*
* @notice Get unlocked balance for an account
* @param account Account to check
* @return Amount that is unlocked and available eg. to transfer
*/
function unlockedBalance(address account) public returns (uint256) {
// totalBalance - lockedBalance
return balanceOf(account).sub(lockedBalance(account));
}
/**
* GOVERNANCE FUNCTION. View the locked balance for an account
*
* @notice View locked balance for an account
* @param account Account to check
* @return Amount locked in the time of checking
*/
function viewLockedBalance(address account) public view returns (uint256) {
// distribution of locked tokens
// get amount from distributions
uint256 amount = distribution[account];
uint256 lockedAmount = amount;
// Team and investors cannot transfer tokens in the first year
if (vestedToken[account].vestingBegin.add(365 days) > block.timestamp && amount != 0) {
return lockedAmount;
}
// in case of vesting has passed, all tokens are now available, if no vesting lock is 0 as well
if (block.timestamp >= vestedToken[account].vestingEnd || amount == 0) {
lockedAmount = 0;
} else if (amount != 0) {
// in case of still under vesting period, locked tokens are recalculated
lockedAmount = amount.mul(vestedToken[account].vestingEnd.sub(block.timestamp)).div(
vestedToken[account].vestingEnd.sub(vestedToken[account].vestingBegin)
);
}
return lockedAmount;
}
/**
* GOVERNANCE FUNCTION. Get locked balance for an account
*
* @notice Get locked balance for an account
* @param account Account to check
* @return Amount locked in the time of checking
*/
function lockedBalance(address account) public returns (uint256) {
// get amount from distributions locked tokens (if any)
uint256 lockedAmount = viewLockedBalance(account);
// in case of vesting has passed, all tokens are now available so we set mapping to 0 only for accounts under vesting
if (
block.timestamp >= vestedToken[account].vestingEnd &&
msg.sender == account &&
lockedAmount == 0 &&
vestedToken[account].vestingEnd != 0
) {
delete distribution[account];
}
emit LockedBalance(account, lockedAmount);
return lockedAmount;
}
/**
* PUBLIC FUNCTION. Get the address of Time Lock Registry
*
* @notice Get the address of Time Lock Registry
* @return Address of the Time Lock Registry
*/
function getTimeLockRegistry() external view returns (address) {
return address(timeLockRegistry);
}
/**
* PRIVILEGED GOVERNANCE FUNCTION. Override the Approval of allowances of ERC20 with special conditions for vesting
*
* @notice Override of "Approve" function to allow the `spender` to transfer up to `amount` from `src`
* @dev This will overwrite the approval amount for `spender` except in the case of spender is Time Lock Registry
* and is subject to issues noted [here](https://eips.ethereum.org/EIPS/eip-20#approve)
* @param spender The address of the account which may transfer tokens
* @param rawAmount The number of tokens that are approved (2^256-1 means infinite)
* @return Whether or not the approval succeeded
*/
function approve(address spender, uint256 rawAmount) public override nonReentrant returns (bool) {
require(spender != address(0), 'TimeLockedToken::approve: spender cannot be zero address');
require(spender != msg.sender, 'TimeLockedToken::approve: spender cannot be the msg.sender');
uint96 amount;
if (rawAmount == uint256(-1)) {
amount = uint96(-1);
} else {
amount = safe96(rawAmount, 'TimeLockedToken::approve: amount exceeds 96 bits');
}
// There is no option to decreaseAllowance to timeLockRegistry in case of vested tokens
if ((spender == address(timeLockRegistry)) && (amount < allowance(msg.sender, address(timeLockRegistry)))) {
amount = safe96(
allowance(msg.sender, address(timeLockRegistry)),
'TimeLockedToken::approve: cannot decrease allowance to timelockregistry'
);
}
_approve(msg.sender, spender, amount);
emit Approval(msg.sender, spender, amount);
return true;
}
/**
* PRIVILEGED GOVERNANCE FUNCTION. Override the Increase of allowances of ERC20 with special conditions for vesting
*
* @notice Atomically increases the allowance granted to `spender` by the caller.
*
* @dev This is an override with respect to the fulfillment of vesting conditions along the way
* However an user can increase allowance many times, it will never be able to transfer locked tokens during vesting period
* @return Whether or not the increaseAllowance succeeded
*/
function increaseAllowance(address spender, uint256 addedValue) public override nonReentrant returns (bool) {
require(
unlockedBalance(msg.sender) >= allowance(msg.sender, spender).add(addedValue) ||
spender == address(timeLockRegistry),
'TimeLockedToken::increaseAllowance:Not enough unlocked tokens'
);
require(spender != address(0), 'TimeLockedToken::increaseAllowance:Spender cannot be zero address');
require(spender != msg.sender, 'TimeLockedToken::increaseAllowance:Spender cannot be the msg.sender');
_approve(msg.sender, spender, allowance(msg.sender, spender).add(addedValue));
return true;
}
/**
* PRIVILEGED GOVERNANCE FUNCTION. Override the decrease of allowances of ERC20 with special conditions for vesting
*
* @notice Atomically decrease the allowance granted to `spender` by the caller.
*
* @dev Atomically decreases the allowance granted to `spender` by the caller.
* This is an override with respect to the fulfillment of vesting conditions along the way
* An user cannot decrease the allowance to the Time Lock Registry who is in charge of vesting conditions
* @return Whether or not the decreaseAllowance succeeded
*/
function decreaseAllowance(address spender, uint256 subtractedValue) public override nonReentrant returns (bool) {
require(spender != address(0), 'TimeLockedToken::decreaseAllowance:Spender cannot be zero address');
require(spender != msg.sender, 'TimeLockedToken::decreaseAllowance:Spender cannot be the msg.sender');
require(
allowance(msg.sender, spender) >= subtractedValue,
'TimeLockedToken::decreaseAllowance:Underflow condition'
);
// There is no option to decreaseAllowance to timeLockRegistry in case of vested tokens
require(
address(spender) != address(timeLockRegistry),
'TimeLockedToken::decreaseAllowance:cannot decrease allowance to timeLockRegistry'
);
_approve(msg.sender, spender, allowance(msg.sender, spender).sub(subtractedValue));
return true;
}
/* ============ Internal Only Function ============ */
/**
* PRIVILEGED GOVERNANCE FUNCTION. Override the _transfer of ERC20 BABL tokens only allowing the transfer of unlocked tokens
*
* @dev Transfer function which includes only unlocked tokens
* Locked tokens can always be transfered back to the returns address
* Transferring to owner allows re-issuance of funds through registry
*
* @param _from The address to send tokens from
* @param _to The address that will receive the tokens
* @param _value The amount of tokens to be transferred
*/
function _transfer(
address _from,
address _to,
uint256 _value
) internal override onlyUnpaused {
require(_from != address(0), 'TimeLockedToken:: _transfer: cannot transfer from the zero address');
require(_to != address(0), 'TimeLockedToken:: _transfer: cannot transfer to the zero address');
require(
_to != address(this),
'TimeLockedToken:: _transfer: do not transfer tokens to the token contract itself'
);
require(balanceOf(_from) >= _value, 'TimeLockedToken:: _transfer: insufficient balance');
// check if enough unlocked balance to transfer
require(unlockedBalance(_from) >= _value, 'TimeLockedToken:: _transfer: attempting to transfer locked funds');
super._transfer(_from, _to, _value);
// voting power
_moveDelegates(
delegates[_from],
delegates[_to],
safe96(_value, 'TimeLockedToken:: _transfer: uint96 overflow')
);
}
/**
* PRIVILEGED GOVERNANCE FUNCTION. Disable BABL token transfer until certain conditions are met
*
* @dev Override the _beforeTokenTransfer of ERC20 BABL tokens until certain conditions are met:
* Only allowing minting or transfers from Time Lock Registry and Rewards Distributor until transfers are allowed in the controller
* Transferring to owner allows re-issuance of funds through registry
*
* @param _from The address to send tokens from
* @param _to The address that will receive the tokens
* @param _value The amount of tokens to be transferred
*/
// Disable garden token transfers. Allow minting and burning.
function _beforeTokenTransfer(
address _from,
address _to,
uint256 _value
) internal virtual override {
super._beforeTokenTransfer(_from, _to, _value);
_require(
_from == address(0) ||
_from == address(timeLockRegistry) ||
_from == address(rewardsDistributor) ||
_to == address(timeLockRegistry) ||
tokenTransfersEnabled,
Errors.BABL_TRANSFERS_DISABLED
);
}
/**
* PRIVILEGED GOVERNANCE FUNCTION. Cancel and remove locked tokens due to non-completion of vesting period
* applied only by Time Lock Registry and specifically to Team or Advisors
*
* @dev Cancel distribution registration
* @param lockedAccount that should have its still locked distribution removed due to non-completion of its vesting period
*/
function _cancelVestedTokensFromTimeLock(address lockedAccount) internal onlyTimeLockRegistry returns (uint256) {
require(distribution[lockedAccount] != 0, 'TimeLockedToken::cancelTokens:Not registered');
// get an update on locked amount from distributions at this precise moment
uint256 loosingAmount = lockedBalance(lockedAccount);
require(loosingAmount > 0, 'TimeLockedToken::cancelTokens:There are no more locked tokens');
require(
vestedToken[lockedAccount].teamOrAdvisor == true,
'TimeLockedToken::cancelTokens:cannot cancel locked tokens to Investors'
);
// set distribution mapping to 0
delete distribution[lockedAccount];
// set tokenVested mapping to 0
delete vestedToken[lockedAccount];
// transfer only locked tokens back to TimeLockRegistry Owner (msg.sender)
require(
transferFrom(lockedAccount, address(timeLockRegistry), loosingAmount),
'TimeLockedToken::cancelTokens:Transfer failed'
);
// emit cancel event
emit Cancel(lockedAccount, loosingAmount);
return loosingAmount;
}
}
================================================================================
FILE: contracts/token/VoteToken.sol
================================================================================
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.7.6;
import {ERC20} from '@openzeppelin/contracts/token/ERC20/ERC20.sol';
import {IVoteToken} from '../interfaces/IVoteToken.sol';
import {ReentrancyGuard} from '@openzeppelin/contracts/utils/ReentrancyGuard.sol';
import {LowGasSafeMath} from '../lib/LowGasSafeMath.sol';
import {Context} from '@openzeppelin/contracts/utils/Context.sol';
import {Ownable} from '@openzeppelin/contracts/access/Ownable.sol';
import {Address} from '@openzeppelin/contracts/utils/Address.sol';
/**
* @title VoteToken
* @notice Custom token which tracks voting power for governance
* @dev This is an abstraction of a fork of the Compound governance contract
* VoteToken is used by BABL to allow tracking voting power
* Checkpoints are created every time state is changed which record voting power
* Inherits standard ERC20 behavior
*/
abstract contract VoteToken is Context, ERC20, Ownable, IVoteToken, ReentrancyGuard {
using LowGasSafeMath for uint256;
using Address for address;
/* ============ Events ============ */
event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);
event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);
/* ============ Modifiers ============ */
/* ============ State Variables ============ */
/// @notice The EIP-712 typehash for the contract's domain
bytes32 public constant DOMAIN_TYPEHASH =
keccak256('EIP712Domain(string name,uint256 chainId,address verifyingContract)');
/// @notice The EIP-712 typehash for the delegation struct used by the contract
bytes32 public constant DELEGATION_TYPEHASH =
keccak256('Delegation(address delegatee,uint256 nonce,uint256 expiry)');
/// @dev A record of votes checkpoints for each account, by index
mapping(address => address) public delegates;
/// @notice A checkpoint for marking number of votes from a given block
struct Checkpoint {
uint32 fromBlock;
uint96 votes;
}
/// @notice A record of votes checkpoints for each account, by index
mapping(address => mapping(uint32 => Checkpoint)) public checkpoints;
/// @notice The number of checkpoints for each account
mapping(address => uint32) public numCheckpoints;
/// @notice A record of states for signing / validating signatures
mapping(address => uint256) public nonces;
/* ============ Functions ============ */
/* ============ Constructor ============ */
constructor(string memory _name, string memory _symbol) ERC20(_name, _symbol) {}
/* ============ External Functions ============ */
/* =========== Token related Gov Functions ====== */
/**
* PRIVILEGED GOVERNANCE FUNCTION. Delegating votes from msg.sender to delegatee
*
* @notice Delegate votes from `msg.sender` to `delegatee`
* @param delegatee The address to delegate votes to
*/
function delegate(address delegatee) external override {
return _delegate(msg.sender, delegatee);
}
/**
* PRIVILEGED GOVERNANCE FUNCTION. Delegate votes using signature to 'delegatee'
*
* @notice Delegates votes from signatory to `delegatee`
* @param delegatee The address to delegate votes to
* @param nonce The contract state required to match the signature
* @param expiry The time at which to expire the signature
* @param v The recovery byte of the signature
* @param r Half of the ECDSA signature pair
* @param s Half of the ECDSA signature pair
*/
function delegateBySig(
address delegatee,
uint256 nonce,
uint256 expiry,
uint8 v,
bytes32 r,
bytes32 s,
bool prefix
) external override {
address signatory;
bytes32 domainSeparator =
keccak256(abi.encode(DOMAIN_TYPEHASH, keccak256(bytes(name())), getChainId(), address(this)));
bytes32 structHash = keccak256(abi.encode(DELEGATION_TYPEHASH, delegatee, nonce, expiry));
bytes32 digest = keccak256(abi.encodePacked('\x19\x01', domainSeparator, structHash));
if (prefix) {
bytes32 digestHash = keccak256(abi.encodePacked('\x19Ethereum Signed Message:\n32', digest));
signatory = ecrecover(digestHash, v, r, s);
} else {
signatory = ecrecover(digest, v, r, s);
}
require(balanceOf(signatory) > 0, 'VoteToken::delegateBySig: invalid delegator');
require(signatory != address(0), 'VoteToken::delegateBySig: invalid signature');
require(nonce == nonces[signatory], 'VoteToken::delegateBySig: invalid nonce');
nonces[signatory]++;
require(block.timestamp <= expiry, 'VoteToken::delegateBySig: signature expired');
return _delegate(signatory, delegatee);
}
/**
* GOVERNANCE FUNCTION. Check Delegate votes using signature to 'delegatee'
*
* @notice Get current voting power for an account
* @param account Account to get voting power for
* @return Voting power for an account
*/
function getCurrentVotes(address account) external view virtual override returns (uint96) {
uint32 nCheckpoints = numCheckpoints[account];
return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0;
}
/**
* GOVERNANCE FUNCTION. Get voting power at a specific block for an account
*
* @param account Account to get voting power for
* @param blockNumber Block to get voting power at
* @return Voting power for an account at specific block
*/
function getPriorVotes(address account, uint256 blockNumber) external view virtual override returns (uint96) {
require(blockNumber < block.number, 'BABLToken::getPriorVotes: not yet determined');
uint32 nCheckpoints = numCheckpoints[account];
if (nCheckpoints == 0) {
return 0;
}
// First check most recent balance
if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) {
return checkpoints[account][nCheckpoints - 1].votes;
}
// Next check implicit zero balance
if (checkpoints[account][0].fromBlock > blockNumber) {
return 0;
}
uint32 lower = 0;
uint32 upper = nCheckpoints - 1;
while (upper > lower) {
uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow
Checkpoint memory cp = checkpoints[account][center];
if (cp.fromBlock == blockNumber) {
return cp.votes;
} else if (cp.fromBlock < blockNumber) {
lower = center;
} else {
upper = center - 1;
}
}
return checkpoints[account][lower].votes;
}
function getMyDelegatee() external view override returns (address) {
return delegates[msg.sender];
}
function getDelegatee(address account) external view override returns (address) {
return delegates[account];
}
function getCheckpoints(address account, uint32 id)
external
view
override
returns (uint32 fromBlock, uint96 votes)
{
Checkpoint storage getCheckpoint = checkpoints[account][id];
return (getCheckpoint.fromBlock, getCheckpoint.votes);
}
function getNumberOfCheckpoints(address account) external view override returns (uint32) {
return numCheckpoints[account];
}
/* ============ Internal Only Function ============ */
/**
* GOVERNANCE FUNCTION. Make a delegation
*
* @dev Internal function to delegate voting power to an account
* @param delegator The address of the account delegating votes from
* @param delegatee The address to delegate votes to
*/
function _delegate(address delegator, address delegatee) internal {
address currentDelegate = delegates[delegator];
uint96 delegatorBalance = safe96(_balanceOf(delegator), 'VoteToken::_delegate: uint96 overflow');
delegates[delegator] = delegatee;
emit DelegateChanged(delegator, currentDelegate, delegatee);
_moveDelegates(currentDelegate, delegatee, delegatorBalance);
}
function _balanceOf(address account) internal view virtual returns (uint256) {
return balanceOf(account);
}
/**
* GOVERNANCE FUNCTION. Move the delegates
*
* @dev Internal function to move delegates between accounts
* @param srcRep The address of the account delegating votes from
* @param dstRep The address of the account delegating votes to
* @param amount The voting power to move
*/
function _moveDelegates(
address srcRep,
address dstRep,
uint96 amount
) internal {
if (srcRep != dstRep && amount > 0) {
// It must not revert but do nothing in cases of address(0) being part of the move
// Sub voting amount to source in case it is not the zero address (e.g. transfers)
if (srcRep != address(0)) {
uint32 srcRepNum = numCheckpoints[srcRep];
uint96 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0;
uint96 srcRepNew = sub96(srcRepOld, amount, 'VoteToken::_moveDelegates: vote amount underflows');
_writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew);
}
if (dstRep != address(0)) {
// Add it to destination in case it is not the zero address (e.g. any transfer of tokens or delegations except a first mint to a specific address)
uint32 dstRepNum = numCheckpoints[dstRep];
uint96 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0;
uint96 dstRepNew = add96(dstRepOld, amount, 'VoteToken::_moveDelegates: vote amount overflows');
_writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew);
}
}
}
/**
* GOVERNANCE FUNCTION. Internal function to write a checkpoint for voting power
*
* @dev internal function to write a checkpoint for voting power
* @param delegatee The address of the account delegating votes to
* @param nCheckpoints The num checkpoint
* @param oldVotes The previous voting power
* @param newVotes The new voting power
*/
function _writeCheckpoint(
address delegatee,
uint32 nCheckpoints,
uint96 oldVotes,
uint96 newVotes
) internal {
uint32 blockNumber = safe32(block.number, 'VoteToken::_writeCheckpoint: block number exceeds 32 bits');
if (nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber) {
checkpoints[delegatee][nCheckpoints - 1].votes = newVotes;
} else {
checkpoints[delegatee][nCheckpoints] = Checkpoint(blockNumber, newVotes);
numCheckpoints[delegatee] = nCheckpoints + 1;
}
emit DelegateVotesChanged(delegatee, oldVotes, newVotes);
}
/**
* INTERNAL FUNCTION. Internal function to convert from uint256 to uint32
*
* @dev internal function to convert from uint256 to uint32
*/
function safe32(uint256 n, string memory errorMessage) internal pure returns (uint32) {
require(n < 2**32, errorMessage);
return uint32(n);
}
/**
* INTERNAL FUNCTION. Internal function to convert from uint256 to uint96
*
* @dev internal function to convert from uint256 to uint96
*/
function safe96(uint256 n, string memory errorMessage) internal pure returns (uint96) {
require(n < 2**96, errorMessage);
return uint96(n);
}
/**
* INTERNAL FUNCTION. Internal function to add two uint96 numbers
*
* @dev internal safe math function to add two uint96 numbers
*/
function add96(
uint96 a,
uint96 b,
string memory errorMessage
) internal pure returns (uint96) {
uint96 c = a + b;
require(c >= a, errorMessage);
return c;
}
/**
* INTERNAL FUNCTION. Internal function to subtract two uint96 numbers
*
* @dev internal safe math function to subtract two uint96 numbers
*/
function sub96(
uint96 a,
uint96 b,
string memory errorMessage
) internal pure returns (uint96) {
require(b <= a, errorMessage);
return a - b;
}
/**
* INTERNAL FUNCTION. Internal function to get chain ID
*
* @dev internal function to get chain ID
*/
function getChainId() internal pure returns (uint256) {
uint256 chainId;
assembly {
chainId := chainid()
}
return chainId;
}
}
================================================================================
FILE: hardhat/console.sol
================================================================================
// SPDX-License-Identifier: MIT
pragma solidity >= 0.4.22 <0.9.0;
library console {
address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);
function _sendLogPayload(bytes memory payload) private view {
uint256 payloadLength = payload.length;
address consoleAddress = CONSOLE_ADDRESS;
assembly {
let payloadStart := add(payload, 32)
let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)
}
}
function log() internal view {
_sendLogPayload(abi.encodeWithSignature("log()"));
}
function logInt(int p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(int)", p0));
}
function logUint(uint p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint)", p0));
}
function logString(string memory p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
}
function logBool(bool p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
}
function logAddress(address p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
}
function logBytes(bytes memory p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes)", p0));
}
function logBytes1(bytes1 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0));
}
function logBytes2(bytes2 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0));
}
function logBytes3(bytes3 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0));
}
function logBytes4(bytes4 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0));
}
function logBytes5(bytes5 p0) internal view {
exec
/bin/bash -lc "sed -n '4401,4700p' AUDIT_BUNDLE.txt" in /tmp/codex-3hez4cop
succeeded in 0ms:
/* =========== Token related Gov Functions ====== */
/**
* PRIVILEGED GOVERNANCE FUNCTION. Disables transfers of ERC20 BABL Tokens
*/
function disableTokensTransfers() external onlyOwner {
require(!tokenTransfersWereDisabled, 'BABL must flow');
tokenTransfersEnabled = false;
tokenTransfersWereDisabled = true;
}
/**
* PRIVILEGED GOVERNANCE FUNCTION. Allows transfers of ERC20 BABL Tokens
* Can only happen after the protocol is fully decentralized.
*/
function enableTokensTransfers() external onlyOwner {
tokenTransfersEnabled = true;
}
/**
* PRIVILEGED GOVERNANCE FUNCTION. Set the Time Lock Registry contract to control token vesting conditions
*
* @notice Set the Time Lock Registry contract to control token vesting conditions
* @param newTimeLockRegistry Address of TimeLockRegistry contract
*/
function setTimeLockRegistry(TimeLockRegistry newTimeLockRegistry) external onlyTimeLockOwner returns (bool) {
require(address(newTimeLockRegistry) != address(0), 'cannot be zero address');
require(address(newTimeLockRegistry) != address(this), 'cannot be this contract');
require(address(newTimeLockRegistry) != address(timeLockRegistry), 'must be new TimeLockRegistry');
emit NewTimeLockRegistration(address(timeLockRegistry), address(newTimeLockRegistry));
timeLockRegistry = newTimeLockRegistry;
return true;
}
/**
* PRIVILEGED GOVERNANCE FUNCTION. Set the Rewards Distributor contract to control either BABL Mining or profit rewards
*
* @notice Set the Rewards Distriburor contract to control both types of rewards (profit and BABL Mining program)
* @param newRewardsDistributor Address of Rewards Distributor contract
*/
function setRewardsDistributor(IRewardsDistributor newRewardsDistributor) external onlyOwner returns (bool) {
require(address(newRewardsDistributor) != address(0), 'cannot be zero address');
require(address(newRewardsDistributor) != address(this), 'cannot be this contract');
require(address(newRewardsDistributor) != address(rewardsDistributor), 'must be new Rewards Distributor');
emit NewRewardsDistributorRegistration(address(rewardsDistributor), address(newRewardsDistributor));
rewardsDistributor = newRewardsDistributor;
return true;
}
/**
* PRIVILEGED GOVERNANCE FUNCTION. Register new token lockup conditions for vested tokens defined only by Time Lock Registry
*
* @notice Tokens are completely delivered during the registration however lockup conditions apply for vested tokens
* locking them according to the distribution epoch periods and the type of recipient (Team, Advisor, Investor)
* Emits a transfer event showing a transfer to the recipient
* Only the registry can call this function
* @param _receiver Address to receive the tokens
* @param _amount Tokens to be transferred
* @param _profile True if is a Team Member or Advisor
* @param _vestingBegin Unix Time when the vesting for that particular address
* @param _vestingEnd Unix Time when the vesting for that particular address
* @param _lastClaim Unix Time when the claim was done from that particular address
*
*/
function registerLockup(
address _receiver,
uint256 _amount,
bool _profile,
uint256 _vestingBegin,
uint256 _vestingEnd,
uint256 _lastClaim
) external onlyTimeLockRegistry returns (bool) {
require(balanceOf(msg.sender) >= _amount, 'insufficient balance');
require(_receiver != address(0), 'cannot be zero address');
require(_receiver != address(this), 'cannot be this contract');
require(_receiver != address(timeLockRegistry), 'cannot be the TimeLockRegistry contract itself');
require(_receiver != msg.sender, 'the owner cannot lockup itself');
// update amount of locked distribution
distribution[_receiver] = distribution[_receiver].add(_amount);
VestedToken storage newVestedToken = vestedToken[_receiver];
newVestedToken.teamOrAdvisor = _profile;
newVestedToken.vestingBegin = _vestingBegin;
newVestedToken.vestingEnd = _vestingEnd;
newVestedToken.lastClaim = _lastClaim;
// transfer tokens to the recipient
_transfer(msg.sender, _receiver, _amount);
emit NewLockout(_receiver, _amount, _profile, _vestingBegin, _vestingEnd);
return true;
}
/**
* PRIVILEGED GOVERNANCE FUNCTION. Cancel and remove locked tokens due to non-completion of vesting period
* applied only by Time Lock Registry and specifically to Team or Advisors as it does not apply to investors.
*
* @dev Cancel distribution registration
* @param lockedAccount that should have its still locked distribution removed due to non-completion of its vesting period
*/
function cancelVestedTokens(address lockedAccount) external onlyTimeLockRegistry returns (uint256) {
return _cancelVestedTokensFromTimeLock(lockedAccount);
}
/**
* GOVERNANCE FUNCTION. Each token owner can claim its own specific tokens with its own specific vesting conditions from the Time Lock Registry
*
* @dev Claim msg.sender tokens (if any available in the registry)
*/
function claimMyTokens() external {
// claim msg.sender tokens from timeLockRegistry
uint256 amount = timeLockRegistry.claim(msg.sender);
// After a proper claim, locked tokens of Team and Advisors profiles are under restricted special vesting conditions so they automatic grant
// rights to the Time Lock Registry to only retire locked tokens if non-compliance vesting conditions take places along the vesting periods.
// It does not apply to Investors under vesting (their locked tokens cannot be removed).
if (vestedToken[msg.sender].teamOrAdvisor == true) {
approve(address(timeLockRegistry), amount);
}
// emit claim event
emit Claim(msg.sender, amount);
}
/**
* GOVERNANCE FUNCTION. Get unlocked balance for an account
*
* @notice Get unlocked balance for an account
* @param account Account to check
* @return Amount that is unlocked and available eg. to transfer
*/
function unlockedBalance(address account) public returns (uint256) {
// totalBalance - lockedBalance
return balanceOf(account).sub(lockedBalance(account));
}
/**
* GOVERNANCE FUNCTION. View the locked balance for an account
*
* @notice View locked balance for an account
* @param account Account to check
* @return Amount locked in the time of checking
*/
function viewLockedBalance(address account) public view returns (uint256) {
// distribution of locked tokens
// get amount from distributions
uint256 amount = distribution[account];
uint256 lockedAmount = amount;
// Team and investors cannot transfer tokens in the first year
if (vestedToken[account].vestingBegin.add(365 days) > block.timestamp && amount != 0) {
return lockedAmount;
}
// in case of vesting has passed, all tokens are now available, if no vesting lock is 0 as well
if (block.timestamp >= vestedToken[account].vestingEnd || amount == 0) {
lockedAmount = 0;
} else if (amount != 0) {
// in case of still under vesting period, locked tokens are recalculated
lockedAmount = amount.mul(vestedToken[account].vestingEnd.sub(block.timestamp)).div(
vestedToken[account].vestingEnd.sub(vestedToken[account].vestingBegin)
);
}
return lockedAmount;
}
/**
* GOVERNANCE FUNCTION. Get locked balance for an account
*
* @notice Get locked balance for an account
* @param account Account to check
* @return Amount locked in the time of checking
*/
function lockedBalance(address account) public returns (uint256) {
// get amount from distributions locked tokens (if any)
uint256 lockedAmount = viewLockedBalance(account);
// in case of vesting has passed, all tokens are now available so we set mapping to 0 only for accounts under vesting
if (
block.timestamp >= vestedToken[account].vestingEnd &&
msg.sender == account &&
lockedAmount == 0 &&
vestedToken[account].vestingEnd != 0
) {
delete distribution[account];
}
emit LockedBalance(account, lockedAmount);
return lockedAmount;
}
/**
* PUBLIC FUNCTION. Get the address of Time Lock Registry
*
* @notice Get the address of Time Lock Registry
* @return Address of the Time Lock Registry
*/
function getTimeLockRegistry() external view returns (address) {
return address(timeLockRegistry);
}
/**
* PRIVILEGED GOVERNANCE FUNCTION. Override the Approval of allowances of ERC20 with special conditions for vesting
*
* @notice Override of "Approve" function to allow the `spender` to transfer up to `amount` from `src`
* @dev This will overwrite the approval amount for `spender` except in the case of spender is Time Lock Registry
* and is subject to issues noted [here](https://eips.ethereum.org/EIPS/eip-20#approve)
* @param spender The address of the account which may transfer tokens
* @param rawAmount The number of tokens that are approved (2^256-1 means infinite)
* @return Whether or not the approval succeeded
*/
function approve(address spender, uint256 rawAmount) public override nonReentrant returns (bool) {
require(spender != address(0), 'TimeLockedToken::approve: spender cannot be zero address');
require(spender != msg.sender, 'TimeLockedToken::approve: spender cannot be the msg.sender');
uint96 amount;
if (rawAmount == uint256(-1)) {
amount = uint96(-1);
} else {
amount = safe96(rawAmount, 'TimeLockedToken::approve: amount exceeds 96 bits');
}
// There is no option to decreaseAllowance to timeLockRegistry in case of vested tokens
if ((spender == address(timeLockRegistry)) && (amount < allowance(msg.sender, address(timeLockRegistry)))) {
amount = safe96(
allowance(msg.sender, address(timeLockRegistry)),
'TimeLockedToken::approve: cannot decrease allowance to timelockregistry'
);
}
_approve(msg.sender, spender, amount);
emit Approval(msg.sender, spender, amount);
return true;
}
/**
* PRIVILEGED GOVERNANCE FUNCTION. Override the Increase of allowances of ERC20 with special conditions for vesting
*
* @notice Atomically increases the allowance granted to `spender` by the caller.
*
* @dev This is an override with respect to the fulfillment of vesting conditions along the way
* However an user can increase allowance many times, it will never be able to transfer locked tokens during vesting period
* @return Whether or not the increaseAllowance succeeded
*/
function increaseAllowance(address spender, uint256 addedValue) public override nonReentrant returns (bool) {
require(
unlockedBalance(msg.sender) >= allowance(msg.sender, spender).add(addedValue) ||
spender == address(timeLockRegistry),
'TimeLockedToken::increaseAllowance:Not enough unlocked tokens'
);
require(spender != address(0), 'TimeLockedToken::increaseAllowance:Spender cannot be zero address');
require(spender != msg.sender, 'TimeLockedToken::increaseAllowance:Spender cannot be the msg.sender');
_approve(msg.sender, spender, allowance(msg.sender, spender).add(addedValue));
return true;
}
/**
* PRIVILEGED GOVERNANCE FUNCTION. Override the decrease of allowances of ERC20 with special conditions for vesting
*
* @notice Atomically decrease the allowance granted to `spender` by the caller.
*
* @dev Atomically decreases the allowance granted to `spender` by the caller.
* This is an override with respect to the fulfillment of vesting conditions along the way
* An user cannot decrease the allowance to the Time Lock Registry who is in charge of vesting conditions
* @return Whether or not the decreaseAllowance succeeded
*/
function decreaseAllowance(address spender, uint256 subtractedValue) public override nonReentrant returns (bool) {
require(spender != address(0), 'TimeLockedToken::decreaseAllowance:Spender cannot be zero address');
require(spender != msg.sender, 'TimeLockedToken::decreaseAllowance:Spender cannot be the msg.sender');
require(
allowance(msg.sender, spender) >= subtractedValue,
'TimeLockedToken::decreaseAllowance:Underflow condition'
);
// There is no option to decreaseAllowance to timeLockRegistry in case of vested tokens
require(
address(spender) != address(timeLockRegistry),
'TimeLockedToken::decreaseAllowance:cannot decrease allowance to timeLockRegistry'
);
_approve(msg.sender, spender, allowance(msg.sender, spender).sub(subtractedValue));
return true;
}
/* ============ Internal Only Function ============ */
/**
* PRIVILEGED GOVERNANCE FUNCTION. Override the _transfer of ERC20 BABL tokens only allowing the transfer of unlocked tokens
*
* @dev Transfer function which includes only unlocked tokens
* Locked tokens can always be transfered back to the returns address
* Transferring to owner allows re-issuance of funds through registry
*
* @param _from The address to send tokens from
* @param _to The address that will receive the tokens
* @param _value The amount of tokens to be transferred
*/
exec
/bin/bash -lc "sed -n '4701,4900p' AUDIT_BUNDLE.txt" in /tmp/codex-3hez4cop
succeeded in 0ms:
function _transfer(
address _from,
address _to,
uint256 _value
) internal override onlyUnpaused {
require(_from != address(0), 'TimeLockedToken:: _transfer: cannot transfer from the zero address');
require(_to != address(0), 'TimeLockedToken:: _transfer: cannot transfer to the zero address');
require(
_to != address(this),
'TimeLockedToken:: _transfer: do not transfer tokens to the token contract itself'
);
require(balanceOf(_from) >= _value, 'TimeLockedToken:: _transfer: insufficient balance');
// check if enough unlocked balance to transfer
require(unlockedBalance(_from) >= _value, 'TimeLockedToken:: _transfer: attempting to transfer locked funds');
super._transfer(_from, _to, _value);
// voting power
_moveDelegates(
delegates[_from],
delegates[_to],
safe96(_value, 'TimeLockedToken:: _transfer: uint96 overflow')
);
}
/**
* PRIVILEGED GOVERNANCE FUNCTION. Disable BABL token transfer until certain conditions are met
*
* @dev Override the _beforeTokenTransfer of ERC20 BABL tokens until certain conditions are met:
* Only allowing minting or transfers from Time Lock Registry and Rewards Distributor until transfers are allowed in the controller
* Transferring to owner allows re-issuance of funds through registry
*
* @param _from The address to send tokens from
* @param _to The address that will receive the tokens
* @param _value The amount of tokens to be transferred
*/
// Disable garden token transfers. Allow minting and burning.
function _beforeTokenTransfer(
address _from,
address _to,
uint256 _value
) internal virtual override {
super._beforeTokenTransfer(_from, _to, _value);
_require(
_from == address(0) ||
_from == address(timeLockRegistry) ||
_from == address(rewardsDistributor) ||
_to == address(timeLockRegistry) ||
tokenTransfersEnabled,
Errors.BABL_TRANSFERS_DISABLED
);
}
/**
* PRIVILEGED GOVERNANCE FUNCTION. Cancel and remove locked tokens due to non-completion of vesting period
* applied only by Time Lock Registry and specifically to Team or Advisors
*
* @dev Cancel distribution registration
* @param lockedAccount that should have its still locked distribution removed due to non-completion of its vesting period
*/
function _cancelVestedTokensFromTimeLock(address lockedAccount) internal onlyTimeLockRegistry returns (uint256) {
require(distribution[lockedAccount] != 0, 'TimeLockedToken::cancelTokens:Not registered');
// get an update on locked amount from distributions at this precise moment
uint256 loosingAmount = lockedBalance(lockedAccount);
require(loosingAmount > 0, 'TimeLockedToken::cancelTokens:There are no more locked tokens');
require(
vestedToken[lockedAccount].teamOrAdvisor == true,
'TimeLockedToken::cancelTokens:cannot cancel locked tokens to Investors'
);
// set distribution mapping to 0
delete distribution[lockedAccount];
// set tokenVested mapping to 0
delete vestedToken[lockedAccount];
// transfer only locked tokens back to TimeLockRegistry Owner (msg.sender)
require(
transferFrom(lockedAccount, address(timeLockRegistry), loosingAmount),
'TimeLockedToken::cancelTokens:Transfer failed'
);
// emit cancel event
emit Cancel(lockedAccount, loosingAmount);
return loosingAmount;
}
}
================================================================================
FILE: contracts/token/VoteToken.sol
================================================================================
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.7.6;
import {ERC20} from '@openzeppelin/contracts/token/ERC20/ERC20.sol';
import {IVoteToken} from '../interfaces/IVoteToken.sol';
import {ReentrancyGuard} from '@openzeppelin/contracts/utils/ReentrancyGuard.sol';
import {LowGasSafeMath} from '../lib/LowGasSafeMath.sol';
import {Context} from '@openzeppelin/contracts/utils/Context.sol';
import {Ownable} from '@openzeppelin/contracts/access/Ownable.sol';
import {Address} from '@openzeppelin/contracts/utils/Address.sol';
/**
* @title VoteToken
* @notice Custom token which tracks voting power for governance
* @dev This is an abstraction of a fork of the Compound governance contract
* VoteToken is used by BABL to allow tracking voting power
* Checkpoints are created every time state is changed which record voting power
* Inherits standard ERC20 behavior
*/
abstract contract VoteToken is Context, ERC20, Ownable, IVoteToken, ReentrancyGuard {
using LowGasSafeMath for uint256;
using Address for address;
/* ============ Events ============ */
event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);
event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);
/* ============ Modifiers ============ */
/* ============ State Variables ============ */
/// @notice The EIP-712 typehash for the contract's domain
bytes32 public constant DOMAIN_TYPEHASH =
keccak256('EIP712Domain(string name,uint256 chainId,address verifyingContract)');
/// @notice The EIP-712 typehash for the delegation struct used by the contract
bytes32 public constant DELEGATION_TYPEHASH =
keccak256('Delegation(address delegatee,uint256 nonce,uint256 expiry)');
/// @dev A record of votes checkpoints for each account, by index
mapping(address => address) public delegates;
/// @notice A checkpoint for marking number of votes from a given block
struct Checkpoint {
uint32 fromBlock;
uint96 votes;
}
/// @notice A record of votes checkpoints for each account, by index
mapping(address => mapping(uint32 => Checkpoint)) public checkpoints;
/// @notice The number of checkpoints for each account
mapping(address => uint32) public numCheckpoints;
/// @notice A record of states for signing / validating signatures
mapping(address => uint256) public nonces;
/* ============ Functions ============ */
/* ============ Constructor ============ */
constructor(string memory _name, string memory _symbol) ERC20(_name, _symbol) {}
/* ============ External Functions ============ */
/* =========== Token related Gov Functions ====== */
/**
* PRIVILEGED GOVERNANCE FUNCTION. Delegating votes from msg.sender to delegatee
*
* @notice Delegate votes from `msg.sender` to `delegatee`
* @param delegatee The address to delegate votes to
*/
function delegate(address delegatee) external override {
return _delegate(msg.sender, delegatee);
}
/**
* PRIVILEGED GOVERNANCE FUNCTION. Delegate votes using signature to 'delegatee'
*
* @notice Delegates votes from signatory to `delegatee`
* @param delegatee The address to delegate votes to
* @param nonce The contract state required to match the signature
* @param expiry The time at which to expire the signature
* @param v The recovery byte of the signature
* @param r Half of the ECDSA signature pair
* @param s Half of the ECDSA signature pair
*/
function delegateBySig(
address delegatee,
uint256 nonce,
uint256 expiry,
uint8 v,
bytes32 r,
bytes32 s,
bool prefix
) external override {
address signatory;
bytes32 domainSeparator =
keccak256(abi.encode(DOMAIN_TYPEHASH, keccak256(bytes(name())), getChainId(), address(this)));
exec
/bin/bash -lc "sed -n '4901,5600p' AUDIT_BUNDLE.txt" in /tmp/codex-3hez4cop
succeeded in 0ms:
bytes32 structHash = keccak256(abi.encode(DELEGATION_TYPEHASH, delegatee, nonce, expiry));
bytes32 digest = keccak256(abi.encodePacked('\x19\x01', domainSeparator, structHash));
if (prefix) {
bytes32 digestHash = keccak256(abi.encodePacked('\x19Ethereum Signed Message:\n32', digest));
signatory = ecrecover(digestHash, v, r, s);
} else {
signatory = ecrecover(digest, v, r, s);
}
require(balanceOf(signatory) > 0, 'VoteToken::delegateBySig: invalid delegator');
require(signatory != address(0), 'VoteToken::delegateBySig: invalid signature');
require(nonce == nonces[signatory], 'VoteToken::delegateBySig: invalid nonce');
nonces[signatory]++;
require(block.timestamp <= expiry, 'VoteToken::delegateBySig: signature expired');
return _delegate(signatory, delegatee);
}
/**
* GOVERNANCE FUNCTION. Check Delegate votes using signature to 'delegatee'
*
* @notice Get current voting power for an account
* @param account Account to get voting power for
* @return Voting power for an account
*/
function getCurrentVotes(address account) external view virtual override returns (uint96) {
uint32 nCheckpoints = numCheckpoints[account];
return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0;
}
/**
* GOVERNANCE FUNCTION. Get voting power at a specific block for an account
*
* @param account Account to get voting power for
* @param blockNumber Block to get voting power at
* @return Voting power for an account at specific block
*/
function getPriorVotes(address account, uint256 blockNumber) external view virtual override returns (uint96) {
require(blockNumber < block.number, 'BABLToken::getPriorVotes: not yet determined');
uint32 nCheckpoints = numCheckpoints[account];
if (nCheckpoints == 0) {
return 0;
}
// First check most recent balance
if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) {
return checkpoints[account][nCheckpoints - 1].votes;
}
// Next check implicit zero balance
if (checkpoints[account][0].fromBlock > blockNumber) {
return 0;
}
uint32 lower = 0;
uint32 upper = nCheckpoints - 1;
while (upper > lower) {
uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow
Checkpoint memory cp = checkpoints[account][center];
if (cp.fromBlock == blockNumber) {
return cp.votes;
} else if (cp.fromBlock < blockNumber) {
lower = center;
} else {
upper = center - 1;
}
}
return checkpoints[account][lower].votes;
}
function getMyDelegatee() external view override returns (address) {
return delegates[msg.sender];
}
function getDelegatee(address account) external view override returns (address) {
return delegates[account];
}
function getCheckpoints(address account, uint32 id)
external
view
override
returns (uint32 fromBlock, uint96 votes)
{
Checkpoint storage getCheckpoint = checkpoints[account][id];
return (getCheckpoint.fromBlock, getCheckpoint.votes);
}
function getNumberOfCheckpoints(address account) external view override returns (uint32) {
return numCheckpoints[account];
}
/* ============ Internal Only Function ============ */
/**
* GOVERNANCE FUNCTION. Make a delegation
*
* @dev Internal function to delegate voting power to an account
* @param delegator The address of the account delegating votes from
* @param delegatee The address to delegate votes to
*/
function _delegate(address delegator, address delegatee) internal {
address currentDelegate = delegates[delegator];
uint96 delegatorBalance = safe96(_balanceOf(delegator), 'VoteToken::_delegate: uint96 overflow');
delegates[delegator] = delegatee;
emit DelegateChanged(delegator, currentDelegate, delegatee);
_moveDelegates(currentDelegate, delegatee, delegatorBalance);
}
function _balanceOf(address account) internal view virtual returns (uint256) {
return balanceOf(account);
}
/**
* GOVERNANCE FUNCTION. Move the delegates
*
* @dev Internal function to move delegates between accounts
* @param srcRep The address of the account delegating votes from
* @param dstRep The address of the account delegating votes to
* @param amount The voting power to move
*/
function _moveDelegates(
address srcRep,
address dstRep,
uint96 amount
) internal {
if (srcRep != dstRep && amount > 0) {
// It must not revert but do nothing in cases of address(0) being part of the move
// Sub voting amount to source in case it is not the zero address (e.g. transfers)
if (srcRep != address(0)) {
uint32 srcRepNum = numCheckpoints[srcRep];
uint96 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0;
uint96 srcRepNew = sub96(srcRepOld, amount, 'VoteToken::_moveDelegates: vote amount underflows');
_writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew);
}
if (dstRep != address(0)) {
// Add it to destination in case it is not the zero address (e.g. any transfer of tokens or delegations except a first mint to a specific address)
uint32 dstRepNum = numCheckpoints[dstRep];
uint96 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0;
uint96 dstRepNew = add96(dstRepOld, amount, 'VoteToken::_moveDelegates: vote amount overflows');
_writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew);
}
}
}
/**
* GOVERNANCE FUNCTION. Internal function to write a checkpoint for voting power
*
* @dev internal function to write a checkpoint for voting power
* @param delegatee The address of the account delegating votes to
* @param nCheckpoints The num checkpoint
* @param oldVotes The previous voting power
* @param newVotes The new voting power
*/
function _writeCheckpoint(
address delegatee,
uint32 nCheckpoints,
uint96 oldVotes,
uint96 newVotes
) internal {
uint32 blockNumber = safe32(block.number, 'VoteToken::_writeCheckpoint: block number exceeds 32 bits');
if (nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber) {
checkpoints[delegatee][nCheckpoints - 1].votes = newVotes;
} else {
checkpoints[delegatee][nCheckpoints] = Checkpoint(blockNumber, newVotes);
numCheckpoints[delegatee] = nCheckpoints + 1;
}
emit DelegateVotesChanged(delegatee, oldVotes, newVotes);
}
/**
* INTERNAL FUNCTION. Internal function to convert from uint256 to uint32
*
* @dev internal function to convert from uint256 to uint32
*/
function safe32(uint256 n, string memory errorMessage) internal pure returns (uint32) {
require(n < 2**32, errorMessage);
return uint32(n);
}
/**
* INTERNAL FUNCTION. Internal function to convert from uint256 to uint96
*
* @dev internal function to convert from uint256 to uint96
*/
function safe96(uint256 n, string memory errorMessage) internal pure returns (uint96) {
require(n < 2**96, errorMessage);
return uint96(n);
}
/**
* INTERNAL FUNCTION. Internal function to add two uint96 numbers
*
* @dev internal safe math function to add two uint96 numbers
*/
function add96(
uint96 a,
uint96 b,
string memory errorMessage
) internal pure returns (uint96) {
uint96 c = a + b;
require(c >= a, errorMessage);
return c;
}
/**
* INTERNAL FUNCTION. Internal function to subtract two uint96 numbers
*
* @dev internal safe math function to subtract two uint96 numbers
*/
function sub96(
uint96 a,
uint96 b,
string memory errorMessage
) internal pure returns (uint96) {
require(b <= a, errorMessage);
return a - b;
}
/**
* INTERNAL FUNCTION. Internal function to get chain ID
*
* @dev internal function to get chain ID
*/
function getChainId() internal pure returns (uint256) {
uint256 chainId;
assembly {
chainId := chainid()
}
return chainId;
}
}
================================================================================
FILE: hardhat/console.sol
================================================================================
// SPDX-License-Identifier: MIT
pragma solidity >= 0.4.22 <0.9.0;
library console {
address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);
function _sendLogPayload(bytes memory payload) private view {
uint256 payloadLength = payload.length;
address consoleAddress = CONSOLE_ADDRESS;
assembly {
let payloadStart := add(payload, 32)
let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)
}
}
function log() internal view {
_sendLogPayload(abi.encodeWithSignature("log()"));
}
function logInt(int p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(int)", p0));
}
function logUint(uint p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint)", p0));
}
function logString(string memory p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
}
function logBool(bool p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
}
function logAddress(address p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
}
function logBytes(bytes memory p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes)", p0));
}
function logBytes1(bytes1 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0));
}
function logBytes2(bytes2 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0));
}
function logBytes3(bytes3 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0));
}
function logBytes4(bytes4 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0));
}
function logBytes5(bytes5 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0));
}
function logBytes6(bytes6 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0));
}
function logBytes7(bytes7 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0));
}
function logBytes8(bytes8 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0));
}
function logBytes9(bytes9 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0));
}
function logBytes10(bytes10 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0));
}
function logBytes11(bytes11 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0));
}
function logBytes12(bytes12 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0));
}
function logBytes13(bytes13 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0));
}
function logBytes14(bytes14 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0));
}
function logBytes15(bytes15 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0));
}
function logBytes16(bytes16 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0));
}
function logBytes17(bytes17 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0));
}
function logBytes18(bytes18 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0));
}
function logBytes19(bytes19 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0));
}
function logBytes20(bytes20 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0));
}
function logBytes21(bytes21 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0));
}
function logBytes22(bytes22 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0));
}
function logBytes23(bytes23 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0));
}
function logBytes24(bytes24 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0));
}
function logBytes25(bytes25 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0));
}
function logBytes26(bytes26 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0));
}
function logBytes27(bytes27 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0));
}
function logBytes28(bytes28 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0));
}
function logBytes29(bytes29 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0));
}
function logBytes30(bytes30 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0));
}
function logBytes31(bytes31 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0));
}
function logBytes32(bytes32 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0));
}
function log(uint p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint)", p0));
}
function log(string memory p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
}
function log(bool p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
}
function log(address p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
}
function log(uint p0, uint p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint)", p0, p1));
}
function log(uint p0, string memory p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string)", p0, p1));
}
function log(uint p0, bool p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool)", p0, p1));
}
function log(uint p0, address p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address)", p0, p1));
}
function log(string memory p0, uint p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint)", p0, p1));
}
function log(string memory p0, string memory p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1));
}
function log(string memory p0, bool p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1));
}
function log(string memory p0, address p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1));
}
function log(bool p0, uint p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint)", p0, p1));
}
function log(bool p0, string memory p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1));
}
function log(bool p0, bool p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1));
}
function log(bool p0, address p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1));
}
function log(address p0, uint p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint)", p0, p1));
}
function log(address p0, string memory p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1));
}
function log(address p0, bool p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1));
}
function log(address p0, address p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1));
}
function log(uint p0, uint p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2));
}
function log(uint p0, uint p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2));
}
function log(uint p0, uint p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2));
}
function log(uint p0, uint p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2));
}
function log(uint p0, string memory p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2));
}
function log(uint p0, string memory p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2));
}
function log(uint p0, string memory p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2));
}
function log(uint p0, string memory p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2));
}
function log(uint p0, bool p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2));
}
function log(uint p0, bool p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2));
}
function log(uint p0, bool p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2));
}
function log(uint p0, bool p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2));
}
function log(uint p0, address p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2));
}
function log(uint p0, address p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2));
}
function log(uint p0, address p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2));
}
function log(uint p0, address p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2));
}
function log(string memory p0, uint p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2));
}
function log(string memory p0, uint p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2));
}
function log(string memory p0, uint p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2));
}
function log(string memory p0, uint p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2));
}
function log(string memory p0, string memory p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,uint)", p0, p1, p2));
}
function log(string memory p0, string memory p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2));
}
function log(string memory p0, string memory p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2));
}
function log(string memory p0, string memory p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2));
}
function log(string memory p0, bool p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint)", p0, p1, p2));
}
function log(string memory p0, bool p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2));
}
function log(string memory p0, bool p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2));
}
function log(string memory p0, bool p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2));
}
function log(string memory p0, address p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint)", p0, p1, p2));
}
function log(string memory p0, address p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2));
}
function log(string memory p0, address p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2));
}
function log(string memory p0, address p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2));
}
function log(bool p0, uint p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2));
}
function log(bool p0, uint p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2));
}
function log(bool p0, uint p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2));
}
function log(bool p0, uint p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2));
}
function log(bool p0, string memory p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint)", p0, p1, p2));
}
function log(bool p0, string memory p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2));
}
function log(bool p0, string memory p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2));
}
function log(bool p0, string memory p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2));
}
function log(bool p0, bool p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint)", p0, p1, p2));
}
function log(bool p0, bool p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2));
}
function log(bool p0, bool p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2));
}
function log(bool p0, bool p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2));
}
function log(bool p0, address p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint)", p0, p1, p2));
}
function log(bool p0, address p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2));
}
function log(bool p0, address p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2));
}
function log(bool p0, address p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2));
}
function log(address p0, uint p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2));
}
function log(address p0, uint p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2));
}
function log(address p0, uint p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2));
}
function log(address p0, uint p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2));
}
function log(address p0, string memory p1, uint p2) internal view {
exec
/bin/bash -lc "sed -n '5601,6300p' AUDIT_BUNDLE.txt" in /tmp/codex-3hez4cop
succeeded in 0ms:
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint)", p0, p1, p2));
}
function log(address p0, string memory p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2));
}
function log(address p0, string memory p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2));
}
function log(address p0, string memory p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2));
}
function log(address p0, bool p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint)", p0, p1, p2));
}
function log(address p0, bool p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2));
}
function log(address p0, bool p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2));
}
function log(address p0, bool p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2));
}
function log(address p0, address p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint)", p0, p1, p2));
}
function log(address p0, address p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2));
}
function log(address p0, address p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2));
}
function log(address p0, address p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2));
}
function log(uint p0, uint p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,string)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,address)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,uint)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,string)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,bool)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,address)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,string)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,address)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,uint)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,string)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,bool)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,address)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,uint)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,string)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,bool)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,address)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,uint)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,string)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,bool)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,address)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,uint)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,string)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,bool)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,address)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,uint)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,string)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,bool)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,address)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,string)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,address)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,uint)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,string)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,bool)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,address)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,string)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,address)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,uint)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,string)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,bool)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,address)", p0, p1, p2, p3));
}
function log(uint p0, address p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,uint)", p0, p1, p2, p3));
}
function log(uint p0, address p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,string)", p0, p1, p2, p3));
}
function log(uint p0, address p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,bool)", p0, p1, p2, p3));
}
function log(uint p0, address p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,address)", p0, p1, p2, p3));
}
function log(uint p0, address p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,uint)", p0, p1, p2, p3));
}
function log(uint p0, address p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,string)", p0, p1, p2, p3));
}
function log(uint p0, address p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,bool)", p0, p1, p2, p3));
}
function log(uint p0, address p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,address)", p0, p1, p2, p3));
}
function log(uint p0, address p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,uint)", p0, p1, p2, p3));
}
function log(uint p0, address p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,string)", p0, p1, p2, p3));
}
function log(uint p0, address p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,bool)", p0, p1, p2, p3));
}
function log(uint p0, address p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,address)", p0, p1, p2, p3));
}
function log(uint p0, address p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,uint)", p0, p1, p2, p3));
}
function log(uint p0, address p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,string)", p0, p1, p2, p3));
}
function log(uint p0, address p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,bool)", p0, p1, p2, p3));
}
function log(uint p0, address p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,address)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,uint)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,string)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,bool)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,address)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,uint)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,string)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,bool)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,address)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,uint)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,string)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,bool)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,address)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,uint)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,string)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,bool)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,address)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,uint)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,string)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,bool)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,address)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,uint)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,string)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,bool)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,address)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,uint)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,string)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,bool)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,address)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,string)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,address)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,uint)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,string)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,bool)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,address)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,string)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,address)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,uint)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,string)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,bool)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,address)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,uint)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,string)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,bool)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,address)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,string)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, uint p2, address p3) internal view {
exec
/bin/bash -lc "sed -n '6301,6673p' AUDIT_BUNDLE.txt" in /tmp/codex-3hez4cop
succeeded in 0ms:
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,address)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3));
}
function log(bool p0, address p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,uint)", p0, p1, p2, p3));
}
function log(bool p0, address p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,string)", p0, p1, p2, p3));
}
function log(bool p0, address p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,bool)", p0, p1, p2, p3));
}
function log(bool p0, address p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,address)", p0, p1, p2, p3));
}
function log(bool p0, address p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint)", p0, p1, p2, p3));
}
function log(bool p0, address p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3));
}
function log(bool p0, address p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3));
}
function log(bool p0, address p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3));
}
function log(bool p0, address p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint)", p0, p1, p2, p3));
}
function log(bool p0, address p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3));
}
function log(bool p0, address p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3));
}
function log(bool p0, address p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3));
}
function log(bool p0, address p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint)", p0, p1, p2, p3));
}
function log(bool p0, address p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3));
}
function log(bool p0, address p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3));
}
function log(bool p0, address p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3));
}
function log(address p0, uint p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,uint)", p0, p1, p2, p3));
}
function log(address p0, uint p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,string)", p0, p1, p2, p3));
}
function log(address p0, uint p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,bool)", p0, p1, p2, p3));
}
function log(address p0, uint p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,address)", p0, p1, p2, p3));
}
function log(address p0, uint p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,uint)", p0, p1, p2, p3));
}
function log(address p0, uint p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,string)", p0, p1, p2, p3));
}
function log(address p0, uint p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,bool)", p0, p1, p2, p3));
}
function log(address p0, uint p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,address)", p0, p1, p2, p3));
}
function log(address p0, uint p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,uint)", p0, p1, p2, p3));
}
function log(address p0, uint p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,string)", p0, p1, p2, p3));
}
function log(address p0, uint p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,bool)", p0, p1, p2, p3));
}
function log(address p0, uint p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,address)", p0, p1, p2, p3));
}
function log(address p0, uint p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,uint)", p0, p1, p2, p3));
}
function log(address p0, uint p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,string)", p0, p1, p2, p3));
}
function log(address p0, uint p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,bool)", p0, p1, p2, p3));
}
function log(address p0, uint p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,address)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,uint)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,string)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,bool)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,address)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3));
}
function log(address p0, bool p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,uint)", p0, p1, p2, p3));
}
function log(address p0, bool p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,string)", p0, p1, p2, p3));
}
function log(address p0, bool p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,bool)", p0, p1, p2, p3));
}
function log(address p0, bool p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,address)", p0, p1, p2, p3));
}
function log(address p0, bool p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint)", p0, p1, p2, p3));
}
function log(address p0, bool p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3));
}
function log(address p0, bool p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3));
}
function log(address p0, bool p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3));
}
function log(address p0, bool p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint)", p0, p1, p2, p3));
}
function log(address p0, bool p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3));
}
function log(address p0, bool p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3));
}
function log(address p0, bool p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3));
}
function log(address p0, bool p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint)", p0, p1, p2, p3));
}
function log(address p0, bool p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3));
}
function log(address p0, bool p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3));
}
function log(address p0, bool p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3));
}
function log(address p0, address p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,uint)", p0, p1, p2, p3));
}
function log(address p0, address p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,string)", p0, p1, p2, p3));
}
function log(address p0, address p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,bool)", p0, p1, p2, p3));
}
function log(address p0, address p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,address)", p0, p1, p2, p3));
}
function log(address p0, address p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint)", p0, p1, p2, p3));
}
function log(address p0, address p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3));
}
function log(address p0, address p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3));
}
function log(address p0, address p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3));
}
function log(address p0, address p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint)", p0, p1, p2, p3));
}
function log(address p0, address p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3));
}
function log(address p0, address p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3));
}
function log(address p0, address p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3));
}
function log(address p0, address p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint)", p0, p1, p2, p3));
}
function log(address p0, address p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3));
}
function log(address p0, address p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3));
}
function log(address p0, address p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3));
}
}
exec
/bin/bash -lc 'rg -n "function _beforeTokenTransfer|function initialize|function makeGardenPublic|delegateBySig|_cancelVestedTokensFromTimeLock|claimMyTokens|claimAndStakeRewardsBySig|stakeBySig|withdrawBySig|depositBySig|onlyTimeLockOwner|updateUserLock|mintShares|isValidSignature" contracts/gardens/Garden.sol contracts/token/TimeLockedToken.sol contracts/token/VoteToken.sol contracts/proxy/VTableBeacon.sol contracts/proxy/VTableBeaconProxy.sol contracts/token/TimeLockRegistry.sol' in /tmp/codex-3hez4cop
succeeded in 0ms:
contracts/token/VoteToken.sol:94: function delegateBySig(
contracts/token/VoteToken.sol:115: require(balanceOf(signatory) > 0, 'VoteToken::delegateBySig: invalid delegator');
contracts/token/VoteToken.sol:116: require(signatory != address(0), 'VoteToken::delegateBySig: invalid signature');
contracts/token/VoteToken.sol:117: require(nonce == nonces[signatory], 'VoteToken::delegateBySig: invalid nonce');
contracts/token/VoteToken.sol:119: require(block.timestamp <= expiry, 'VoteToken::delegateBySig: signature expired');
contracts/token/TimeLockedToken.sol:69: modifier onlyTimeLockOwner() {
contracts/token/TimeLockedToken.sol:73: 'TimeLockedToken:: onlyTimeLockOwner: can only be executed by the owner of TimeLockRegistry'
contracts/token/TimeLockedToken.sol:155: function setTimeLockRegistry(TimeLockRegistry newTimeLockRegistry) external onlyTimeLockOwner returns (bool) {
contracts/token/TimeLockedToken.sol:237: return _cancelVestedTokensFromTimeLock(lockedAccount);
contracts/token/TimeLockedToken.sol:245: function claimMyTokens() external {
contracts/token/TimeLockedToken.sol:468: function _beforeTokenTransfer(
contracts/token/TimeLockedToken.sol:491: function _cancelVestedTokensFromTimeLock(address lockedAccount) internal onlyTimeLockRegistry returns (uint256) {
contracts/gardens/Garden.sol:260: _require(_signer.isValidSignatureNow(_hash, _signature), Errors.INVALID_SIGNER);
contracts/gardens/Garden.sol:283: * of gas ~2kk. Use `depositBySig` for gas efficiency.
contracts/gardens/Garden.sol:315: function depositBySig(
contracts/gardens/Garden.sol:427: function withdrawBySig(
contracts/gardens/Garden.sol:547: function mintShares(address[] calldata _tos, uint256[] calldata _shares) external {
contracts/gardens/Garden.sol:576: function claimAndStakeRewardsBySig(
contracts/gardens/Garden.sol:620: heartGarden.stakeBySig(
contracts/gardens/Garden.sol:655: function stakeBySig(
contracts/gardens/Garden.sol:713: function updateUserLock(
contracts/gardens/Garden.sol:747: function isValidSignature(bytes32 _hash, bytes memory _signature) public view override returns (bytes4 magicValue) {
contracts/gardens/Garden.sol:750: ? this.isValidSignature.selector
contracts/gardens/Garden.sol:861: * See withdraw and withdrawBySig for params and comments.
contracts/gardens/Garden.sol:1065: function _beforeTokenTransfer(
exec
/bin/bash -lc "nl -ba contracts/token/TimeLockedToken.sol | sed -n '60,180p'
nl -ba contracts/gardens/Garden.sol | sed -n '300,380p'
nl -ba contracts/gardens/Garden.sol | sed -n '420,500p'
nl -ba contracts/gardens/Garden.sol | sed -n '1120,1170p'
nl -ba contracts/gardens/Garden.sol | sed -n '560,700p'
nl -ba contracts/token/VoteToken.sol | sed -n '90,130p'" in /tmp/codex-3hez4cop
succeeded in 0ms:
60
61 modifier onlyTimeLockRegistry() {
62 require(
63 msg.sender == address(timeLockRegistry),
64 'TimeLockedToken:: onlyTimeLockRegistry: can only be executed by TimeLockRegistry'
65 );
66 _;
67 }
68
69 modifier onlyTimeLockOwner() {
70 if (address(timeLockRegistry) != address(0)) {
71 require(
72 msg.sender == Ownable(timeLockRegistry).owner(),
73 'TimeLockedToken:: onlyTimeLockOwner: can only be executed by the owner of TimeLockRegistry'
74 );
75 }
76 _;
77 }
78 modifier onlyUnpaused() {
79 // Do not execute if Globally or individually paused
80 _require(!IBabController(controller).isPaused(address(this)), Errors.ONLY_UNPAUSED);
81 _;
82 }
83
84 /* ============ State Variables ============ */
85
86 // represents total distribution for locked balances
87 mapping(address => uint256) distribution;
88
89 /// @notice The profile of each token owner under its particular vesting conditions
90 /**
91 * @param team Indicates whether or not is a Team member or Advisor (true = team member/advisor, false = private investor)
92 * @param vestingBegin When the vesting begins for such token owner
93 * @param vestingEnd When the vesting ends for such token owner
94 * @param lastClaim When the last claim was done
95 */
96 struct VestedToken {
97 bool teamOrAdvisor;
98 uint256 vestingBegin;
99 uint256 vestingEnd;
100 uint256 lastClaim;
101 }
102
103 /// @notice A record of token owners under vesting conditions for each account, by index
104 mapping(address => VestedToken) public vestedToken;
105
106 // address of Time Lock Registry contract
107 IBabController public controller;
108
109 // address of Time Lock Registry contract
110 TimeLockRegistry public timeLockRegistry;
111
112 // address of Rewards Distriburor contract
113 IRewardsDistributor public rewardsDistributor;
114
115 // Enable Transfer of ERC20 BABL Tokens
116 // Only Minting or transfers from/to TimeLockRegistry and Rewards Distributor can transfer tokens until the protocol is fully decentralized
117 bool private tokenTransfersEnabled;
118 bool private tokenTransfersWereDisabled;
119
120 /* ============ Functions ============ */
121
122 /* ============ Constructor ============ */
123
124 constructor(string memory _name, string memory _symbol) VoteToken(_name, _symbol) {
125 tokenTransfersEnabled = true;
126 }
127
128 /* ============ External Functions ============ */
129
130 /* =========== Token related Gov Functions ====== */
131
132 /**
133 * PRIVILEGED GOVERNANCE FUNCTION. Disables transfers of ERC20 BABL Tokens
134 */
135 function disableTokensTransfers() external onlyOwner {
136 require(!tokenTransfersWereDisabled, 'BABL must flow');
137 tokenTransfersEnabled = false;
138 tokenTransfersWereDisabled = true;
139 }
140
141 /**
142 * PRIVILEGED GOVERNANCE FUNCTION. Allows transfers of ERC20 BABL Tokens
143 * Can only happen after the protocol is fully decentralized.
144 */
145 function enableTokensTransfers() external onlyOwner {
146 tokenTransfersEnabled = true;
147 }
148
149 /**
150 * PRIVILEGED GOVERNANCE FUNCTION. Set the Time Lock Registry contract to control token vesting conditions
151 *
152 * @notice Set the Time Lock Registry contract to control token vesting conditions
153 * @param newTimeLockRegistry Address of TimeLockRegistry contract
154 */
155 function setTimeLockRegistry(TimeLockRegistry newTimeLockRegistry) external onlyTimeLockOwner returns (bool) {
156 require(address(newTimeLockRegistry) != address(0), 'cannot be zero address');
157 require(address(newTimeLockRegistry) != address(this), 'cannot be this contract');
158 require(address(newTimeLockRegistry) != address(timeLockRegistry), 'must be new TimeLockRegistry');
159 emit NewTimeLockRegistration(address(timeLockRegistry), address(newTimeLockRegistry));
160
161 timeLockRegistry = newTimeLockRegistry;
162
163 return true;
164 }
165
166 /**
167 * PRIVILEGED GOVERNANCE FUNCTION. Set the Rewards Distributor contract to control either BABL Mining or profit rewards
168 *
169 * @notice Set the Rewards Distriburor contract to control both types of rewards (profit and BABL Mining program)
170 * @param newRewardsDistributor Address of Rewards Distributor contract
171 */
172 function setRewardsDistributor(IRewardsDistributor newRewardsDistributor) external onlyOwner returns (bool) {
173 require(address(newRewardsDistributor) != address(0), 'cannot be zero address');
174 require(address(newRewardsDistributor) != address(this), 'cannot be this contract');
175 require(address(newRewardsDistributor) != address(rewardsDistributor), 'must be new Rewards Distributor');
176 emit NewRewardsDistributorRegistration(address(rewardsDistributor), address(newRewardsDistributor));
177
178 rewardsDistributor = newRewardsDistributor;
179
180 return true;
300 * Deposits the _amountIn in reserve asset into the garden. Gurantee to
301 * recieve at least _minAmountOut.
302 * @param _amountIn Amount of the reserve asset that is received from contributor.
303 * @param _minAmountOut Min amount of Garden shares to receive by contributor.
304 * @param _nonce Current nonce to prevent replay attacks.
305 * @param _maxFee Max fee user is willing to pay keeper. Fee is
306 * substracted from the withdrawn amount. Fee is
307 * expressed in reserve asset.
308 * @param _pricePerShare Price per share of the garden calculated off-chain by Keeper.
309 * @param _to Address to mint shares to.
310 * @param _fee Actual fee keeper demands. Have to be less than _maxFee.
311 * @param _signer The user to who signed the signature.
312 * @param _referrer The user that referred the deposit
313 * @param _signature Signature by the user to verify deposit parmas.
314 */
315 function depositBySig(
316 uint256 _amountIn,
317 uint256 _minAmountOut,
318 uint256 _nonce,
319 uint256 _maxFee,
320 address _to,
321 uint256 _pricePerShare,
322 uint256 _fee,
323 address _signer,
324 address _referrer,
325 bytes memory _signature
326 ) external override nonReentrant {
327 _onlyKeeperAndFee(_fee, _maxFee);
328
329 bytes32 hash =
330 keccak256(
331 abi.encode(
332 DEPOSIT_BY_SIG_TYPEHASH,
333 address(this),
334 _amountIn,
335 _minAmountOut,
336 _nonce,
337 _maxFee,
338 _to,
339 _referrer
340 )
341 )
342 .toEthSignedMessageHash();
343 _onlyValidSigner(_signer, _to, _nonce, hash, _signature);
344
345 // If a Keeper fee is greater than zero then reduce user shares to
346 // exchange and pay keeper the fee.
347 if (_fee > 0) {
348 // account for non 18 decimals ERC20 tokens, e.g. USDC
349 uint256 feeShares = _reserveToShares(_fee, _pricePerShare);
350 _internalDeposit(
351 _amountIn.sub(_fee),
352 _minAmountOut.sub(feeShares),
353 _to,
354 _signer,
355 _pricePerShare,
356 minContribution > _fee ? minContribution.sub(_fee) : 0,
357 _referrer
358 );
359 // pay Keeper the fee
360 IERC20(reserveAsset).safeTransferFrom(_signer, msg.sender, _fee);
361 } else {
362 _internalDeposit(_amountIn, _minAmountOut, _to, _signer, _pricePerShare, minContribution, _referrer);
363 }
364 }
365
366 /**
367 * @notice
368 * Exchanges a contributor gardens shares for at least minimum amount in reserve asset.
369 * @dev
370 * ATTENTION. Do not call withPenalty unless certain. If penalty is set,
371 * it will be applied regardless of the garden state.
372 * It is advised to first try to withdraw with no penalty and it this
373 * reverts then try to with penalty.
374 * @param _amountIn Quantity of the garden token to withdrawal
375 * @param _minAmountOut Min quantity of reserve asset to receive
376 * @param _to Address to send component assets to
377 * @param _withPenalty Whether or not this is an immediate withdrawal
378 * @param _unwindStrategy Strategy to unwind
379 */
380 function withdraw(
420 * @param _unwindStrategy Strategy to unwind
421 * @param _pricePerShare Price per share of the garden calculated off-chain by Keeper.
422 * @param _strategyNAV NAV of the strategy to unwind.
423 * @param _fee Actual fee keeper demands. Have to be less than _maxFee.
424 * @param _signer The user to who signed the signature
425 * @param _signature Signature by the user to verify withdraw parmas.
426 */
427 function withdrawBySig(
428 uint256 _amountIn,
429 uint256 _minAmountOut,
430 uint256 _nonce,
431 uint256 _maxFee,
432 bool _withPenalty,
433 address _unwindStrategy,
434 uint256 _pricePerShare,
435 uint256 _strategyNAV,
436 uint256 _fee,
437 address _signer,
438 bytes memory _signature
439 ) external override nonReentrant {
440 _onlyKeeperAndFee(_fee, _maxFee);
441
442 bytes32 hash =
443 keccak256(
444 abi.encode(
445 WITHDRAW_BY_SIG_TYPEHASH,
446 address(this),
447 _amountIn,
448 _minAmountOut,
449 _nonce,
450 _maxFee,
451 _withPenalty
452 )
453 )
454 .toEthSignedMessageHash();
455
456 _onlyValidSigner(_signer, _signer, _nonce, hash, _signature);
457
458 _withdrawInternal(
459 _amountIn,
460 _minAmountOut.sub(_maxFee),
461 payable(_signer),
462 _withPenalty,
463 _unwindStrategy,
464 _pricePerShare,
465 _strategyNAV,
466 _fee
467 );
468 }
469
470 /**
471 * @notice
472 * Claims a contributor rewards in BABL and reserve asset.
473 * @param _finalizedStrategies Finalized strategies to process
474 */
475 function claimReturns(address[] calldata _finalizedStrategies) external override nonReentrant {
476 _onlyNonDuplicateStrategies(_finalizedStrategies);
477 uint256[] memory rewards = new uint256[](8);
478 rewards = rewardsDistributor.getRewards(address(this), msg.sender, _finalizedStrategies);
479 _sendRewardsInternal(msg.sender, rewards[5], rewards[6], false);
480 }
481
482 /**
483 * @notice
484 * User can claim the rewards from the strategies that his principal was
485 * invested in and stake BABL into Heart Garden
486 * @param _minAmountOut Minimum hBABL as part of the Heart garden BABL staking
487 * @param _finalizedStrategies Finalized strategies to process
488 */
489 function claimAndStakeReturns(uint256 _minAmountOut, address[] calldata _finalizedStrategies)
490 external
491 override
492 nonReentrant
493 {
494 _onlyNonDuplicateStrategies(_finalizedStrategies);
495 uint256[] memory rewards = new uint256[](8);
496 rewards = rewardsDistributor.getRewards(address(this), msg.sender, _finalizedStrategies);
497 IGarden heartGarden = IGarden(address(IHeart(controller.heart()).heartGarden()));
498 // User non BABL rewards are sent to user wallet (_profits)
499 // User BABL rewards are sent to this garden from RD to stake them into Heart Garden
500 // on behalf of user
1120 * @notice
1121 * Approves spending of BABL token to an address
1122 * @dev
1123 * Approves BABL staking amount for claim and stake rewards
1124 * Only used to approve Heart Garden to stake
1125 * @param _to Address to approve to
1126 * @param _amount Amount of allowance
1127 */
1128 function _approveBABL(address _to, uint256 _amount) internal {
1129 IERC20(BABL).safeApprove(_to, _amount);
1130 }
1131
1132 /**
1133 * @notice Updates the contributor data upon deposit
1134 * @param _contributor Contributor to update
1135 * @param _previousBalance Previous balance of the contributor
1136 * @param _amountIn Amount deposited in reserve asset
1137 * @param _sharesToMint Amount of garden shares to mint
1138 */
1139 function _updateContributorDepositInfo(
1140 address _contributor,
1141 uint256 _previousBalance,
1142 uint256 _amountIn,
1143 uint256 _sharesToMint
1144 ) private {
1145 IGarden.Contributor storage contributor = contributors[_contributor];
1146 // If new contributor, create one, increment count, and set the current TS
1147 if (_previousBalance == 0 || contributor.initialDepositAt == 0) {
1148 totalContributors = totalContributors.add(1);
1149 contributor.initialDepositAt = block.timestamp;
1150 }
1151 // We make checkpoints around contributor deposits to give the right rewards afterwards
1152 contributor.totalDeposits = contributor.totalDeposits.add(_amountIn);
1153 contributor.lastDepositAt = block.timestamp;
1154 // RD checkpoint for accurate rewards
1155 rewardsDistributor.updateGardenPowerAndContributor(
1156 address(this),
1157 _contributor,
1158 _previousBalance,
1159 _sharesToMint,
1160 true // true = deposit , false = withdraw
1161 );
1162 }
1163
1164 /**
1165 * @notice Updates the contributor data upon withdrawal
1166 * @param _contributor Contributor to update
1167 * @param _amountOut Amount withdrawn in reserve asset
1168 * @param _previousBalance Previous balance of the contributor
1169 * @param _balance New balance
1170 * @param _amountToBurn Amount of garden shares to burn
560 * Should be called instead of the `claimAndStakeReturns` to save gas due
561 * to getRewards caculated off-chain. The Keeper fee is paid out of user's
562 * reserveAsset and it is calculated off-chain.
563 * @param _babl BABL rewards from mining program.
564 * @param _profits Profit rewards in reserve asset.
565 * @param _minAmountOut Minimum hBABL as part of the Heart Garden BABL staking
566 * @param _nonce Current nonce of user in the claiming garden at to prevent replay attacks.
567 * @param _nonceHeart Current nonce of user in Heart Garden to prevent replay attacks.
568 * @param _maxFee Max fee user is willing to pay keeper. Fee is
569 * substracted from user wallet in reserveAsset. Fee is
570 * expressed in reserve asset.
571 * @param _fee Actual fee keeper demands. Have to be less than _maxFee.
572 * @param _pricePerShare Price per share of Heart Garden
573 * @param _signer Signer of the tx
574 * @param _signature Signature of signer
575 */
576 function claimAndStakeRewardsBySig(
577 uint256 _babl,
578 uint256 _profits,
579 uint256 _minAmountOut,
580 uint256 _nonce,
581 uint256 _nonceHeart,
582 uint256 _maxFee,
583 uint256 _pricePerShare,
584 uint256 _fee,
585 address _signer,
586 bytes memory _signature
587 ) external override nonReentrant {
588 _onlyKeeperAndFee(_fee, _maxFee);
589 IGarden heartGarden = IHeart(controller.heart()).heartGarden();
590 bytes32 hash =
591 keccak256(
592 abi.encode(
593 STAKE_REWARDS_BY_SIG_TYPEHASH,
594 address(heartGarden),
595 _babl,
596 _profits,
597 _minAmountOut,
598 _nonce,
599 _nonceHeart,
600 _maxFee,
601 _signer
602 )
603 )
604 .toEthSignedMessageHash();
605 _onlyValidSigner(_signer, _signer, _nonce, hash, _signature);
606 _require(_fee > 0, Errors.FEE_TOO_LOW);
607 _require(_babl <= CLAIM_BY_SIG_CAP, Errors.MAX_BABL_CAP_REACHED);
608
609 // pay to Keeper the fee to execute the tx on behalf
610 IERC20(reserveAsset).safeTransferFrom(_signer, msg.sender, _fee);
611
612 // User non BABL rewards are sent to user wallet (_profits)
613 // User BABL rewards are sent to this garden from RD to later stake them into Heart Garden
614 // on behalf of the user
615 _sendRewardsInternal(_signer, _babl, _profits, true); // true = stake babl rewards, false = no stake
616 _approveBABL(address(heartGarden), _babl);
617 // grant permission to deposit
618 signer = _signer;
619 // Now this garden makes a deposit on Heart Garden on behalf of user
620 heartGarden.stakeBySig(
621 _babl,
622 _profits,
623 _minAmountOut,
624 _nonce,
625 _nonceHeart,
626 _maxFee,
627 _signer,
628 _pricePerShare,
629 address(this),
630 _signature
631 );
632 // revoke permission to deposit
633 signer = address(0);
634 emit StakeBABLRewards(_signer, _babl);
635 }
636
637 /**
638 * @notice
639 * Stakes _amountIn of BABL into the Heart garden.
640 * @dev
641 * Staking is in practical terms is depositing BABL into Heart garden.
642 * @param _amountIn Amount of the reserve asset that is received from contributor.
643 * @param _profits Amount of the reserve asset that is received from contributor.
644 * @param _minAmountOut Min amount of Garden shares to receive by contributor.
645 * @param _nonce Current nonce to prevent replay attacks.
646 * @param _nonceHeart Current nonce of the Heart garden to prevent replay attacks.
647 * @param _maxFee Max fee user is willing to pay keeper. Fee is
648 * substracted from the withdrawn amount. Fee is
649 * expressed in reserve asset.
650 * @param _pricePerShare Price per share of the garden calculated off-chain by Keeper.
651 * @param _to Address to mint shares to.
652 * @param _signer The user to who signed the signature.
653 * @param _signature Signature by the user to verify deposit params.
654 */
655 function stakeBySig(
656 uint256 _amountIn,
657 uint256 _profits,
658 uint256 _minAmountOut,
659 uint256 _nonce,
660 uint256 _nonceHeart,
661 uint256 _maxFee,
662 address _to,
663 uint256 _pricePerShare,
664 address _signer,
665 bytes memory _signature
666 ) external override nonReentrant {
667 _require(controller.isGarden(msg.sender), Errors.ONLY_ACTIVE_GARDEN);
668 _require(address(this) == address(IHeart(controller.heart()).heartGarden()), Errors.ONLY_HEART_GARDEN);
669
670 bytes32 hash =
671 keccak256(
672 abi.encode(
673 STAKE_REWARDS_BY_SIG_TYPEHASH,
674 address(this),
675 _amountIn,
676 _profits,
677 _minAmountOut,
678 _nonce,
679 _nonceHeart,
680 _maxFee,
681 _to
682 )
683 )
684 .toEthSignedMessageHash();
685 _onlyValidSigner(_signer, _to, _nonceHeart, hash, _signature);
686
687 // Keeper fee must have been paid in the original garden
688 _internalDeposit(_amountIn, _minAmountOut, _to, _signer, _pricePerShare, minContribution, address(0));
689 }
690
691 /**
692 * Allows a contributor to claim an NFT.
693 */
694 function claimNFT() external override {
695 // minContribution is in reserve asset while balance of contributor in
696 // garden shares which can lead to undesired results if reserve assets
697 // decimals are not 18
698 _require(balanceOf(msg.sender) >= minContribution, Errors.ONLY_CONTRIBUTOR);
699 IGarden.Contributor storage contributor = contributors[msg.sender];
700 _require(
90 * @param r Half of the ECDSA signature pair
91 * @param s Half of the ECDSA signature pair
92 */
93
94 function delegateBySig(
95 address delegatee,
96 uint256 nonce,
97 uint256 expiry,
98 uint8 v,
99 bytes32 r,
100 bytes32 s,
101 bool prefix
102 ) external override {
103 address signatory;
104 bytes32 domainSeparator =
105 keccak256(abi.encode(DOMAIN_TYPEHASH, keccak256(bytes(name())), getChainId(), address(this)));
106 bytes32 structHash = keccak256(abi.encode(DELEGATION_TYPEHASH, delegatee, nonce, expiry));
107 bytes32 digest = keccak256(abi.encodePacked('\x19\x01', domainSeparator, structHash));
108 if (prefix) {
109 bytes32 digestHash = keccak256(abi.encodePacked('\x19Ethereum Signed Message:\n32', digest));
110 signatory = ecrecover(digestHash, v, r, s);
111 } else {
112 signatory = ecrecover(digest, v, r, s);
113 }
114
115 require(balanceOf(signatory) > 0, 'VoteToken::delegateBySig: invalid delegator');
116 require(signatory != address(0), 'VoteToken::delegateBySig: invalid signature');
117 require(nonce == nonces[signatory], 'VoteToken::delegateBySig: invalid nonce');
118 nonces[signatory]++;
119 require(block.timestamp <= expiry, 'VoteToken::delegateBySig: signature expired');
120 return _delegate(signatory, delegatee);
121 }
122
123 /**
124 * GOVERNANCE FUNCTION. Check Delegate votes using signature to 'delegatee'
125 *
126 * @notice Get current voting power for an account
127 * @param account Account to get voting power for
128 * @return Voting power for an account
129 */
130 function getCurrentVotes(address account) external view virtual override returns (uint96) {
exec
/bin/bash -lc "nl -ba contracts/gardens/Garden.sol | sed -n '1180,1245p'" in /tmp/codex-3hez4cop
succeeded in 0ms:
1180 // If withdrawn everything
1181 if (_balance == 0) {
1182 contributor.lastDepositAt = 0;
1183 contributor.initialDepositAt = 0;
1184 contributor.withdrawnSince = 0;
1185 contributor.totalDeposits = 0;
1186 userLock[_contributor] = 0;
1187 totalContributors = totalContributors.sub(1);
1188 } else {
1189 contributor.withdrawnSince = contributor.withdrawnSince.add(_amountOut);
1190 }
1191 // RD checkpoint for accurate rewards
1192 rewardsDistributor.updateGardenPowerAndContributor(
1193 address(this),
1194 _contributor,
1195 _previousBalance,
1196 _amountToBurn,
1197 false // true = deposit , false = withdraw
1198 );
1199 }
1200
1201 /**
1202 * @notice Checks if an address is a creator
1203 * @param _creator Creator address
1204 * @return True if creator
1205 */
1206 function _isCreator(address _creator) private view returns (bool) {
1207 return
1208 _creator != address(0) &&
1209 (extraCreators[0] == _creator ||
1210 extraCreators[1] == _creator ||
1211 extraCreators[2] == _creator ||
1212 extraCreators[3] == _creator ||
1213 _creator == creator);
1214 }
1215
1216 /**
1217 * @notice
1218 * Validates that pricePerShare is within acceptable range; if not reverts
1219 * @dev
1220 * Allowed slippage between deposits and withdrawals in terms of the garden price per share is:
1221 *
1222 * slippage = lastPricePerShare % (pricePerShareDelta + timePast * pricePerShareDecayRate);
1223 *
1224 * For example, if lastPricePerShare is 1e18 and slippage is 10% then deposits with pricePerShare between
1225 * 9e17 and 11e17 allowed immediately. After one year (100% change in time) and with a decay rate 1x;
1226 * deposits between 5e17 and 2e18 are possible. Different gardens should have different settings for
1227 * slippage and decay rate due to various volatility of the strategies. For example, stable gardens
1228 * would have low slippage and decay rate while some moonshot gardens may have both of them
1229 * as high as 100% and 10x.
1230 * @param _pricePerShare Price of the graden share to validate against historical data
1231 */
1232 function _checkLastPricePerShare(uint256 _pricePerShare) private {
1233 uint256 slippage = pricePerShareDelta > 0 ? pricePerShareDelta : 25e16;
1234 uint256 decay = pricePerShareDecayRate > 0 ? pricePerShareDecayRate : 1e18;
1235 // if no previous record then just pass the check
1236 if (lastPricePerShare != 0) {
1237 slippage = slippage.add(block.timestamp.sub(lastPricePerShareTS).preciseDiv(365 days).preciseMul(decay));
1238 if (_pricePerShare > lastPricePerShare) {
1239 _require(
1240 _pricePerShare.sub(lastPricePerShare) <= lastPricePerShare.preciseMul(slippage),
1241 Errors.PRICE_PER_SHARE_WRONG
1242 );
1243 } else {
1244 _require(
1245 lastPricePerShare.sub(_pricePerShare) <=
exec
/bin/bash -lc "nl -ba contracts/gardens/Garden.sol | sed -n '1245,1265p'" in /tmp/codex-3hez4cop
succeeded in 0ms:
1245 lastPricePerShare.sub(_pricePerShare) <=
1246 lastPricePerShare.sub(lastPricePerShare.preciseDiv(slippage.add(1e18))),
1247 Errors.PRICE_PER_SHARE_WRONG
1248 );
1249 }
1250 }
1251 lastPricePerShare = _pricePerShare;
1252 lastPricePerShareTS = block.timestamp;
1253 }
1254
1255 /**
1256 * @notice Returns last timestamp of the last contributor deposit
1257 * @param _to Contributor address
1258 * @return Timestamp of the last contributor desposit
1259 */
1260 function _getLastDepositAt(address _to) private view returns (uint256) {
1261 return hardlockStartsAt > contributors[_to].lastDepositAt ? hardlockStartsAt : contributors[_to].lastDepositAt;
1262 }
1263
1264 /**
1265 * @notice Returns the hardlock in seconds for this user
exec
/bin/bash -lc "rg -n \"controller\\s*=|timeLockRegistry\\s*=|rewardsDistributor\\s*=\" contracts/token/TimeLockedToken.sol contracts/token/VoteToken.sol contracts/token/TimeLockRegistry.sol contracts/gardens/Garden.sol" in /tmp/codex-3hez4cop
succeeded in 0ms:
contracts/token/TimeLockedToken.sol:161: timeLockRegistry = newTimeLockRegistry;
contracts/token/TimeLockedToken.sol:178: rewardsDistributor = newRewardsDistributor;
exec
/bin/bash -lc "rg -n \"registrations\\b|\\.remove\\(\" contracts/token/TimeLockRegistry.sol contracts/gardens/Garden.sol contracts/lib/AddressArrayUtils.sol" in /tmp/codex-3hez4cop
succeeded in 0ms:
contracts/token/TimeLockRegistry.sol:88: // array of all registrations
contracts/token/TimeLockRegistry.sol:89: address[] public registrations;
contracts/token/TimeLockRegistry.sol:117: * Gets registrations
contracts/token/TimeLockRegistry.sol:119: * @return address[] Returns list of registrations
contracts/token/TimeLockRegistry.sol:123: return registrations;
contracts/token/TimeLockRegistry.sol:132: * @param _registrations Registrations to process
contracts/token/TimeLockRegistry.sol:134: function registerBatch(Registration[] memory _registrations) external onlyOwner {
contracts/token/TimeLockRegistry.sol:135: for (uint256 i = 0; i < _registrations.length; i++) {
contracts/token/TimeLockRegistry.sol:137: _registrations[i].receiver,
contracts/token/TimeLockRegistry.sol:138: _registrations[i].distribution,
contracts/token/TimeLockRegistry.sol:139: _registrations[i].investorType,
contracts/token/TimeLockRegistry.sol:140: _registrations[i].vestingStartingDate
contracts/token/TimeLockRegistry.sol:178: registrations.push(receiver);
contracts/token/TimeLockRegistry.sol:218: // remove from the list of all registrations
contracts/token/TimeLockRegistry.sol:219: registrations.remove(receiver);
exec
/bin/bash -lc "nl -ba contracts/gardens/Garden.sol | sed -n '90,115p'
nl -ba contracts/token/TimeLockRegistry.sol | sed -n '208,222p'" in /tmp/codex-3hez4cop
succeeded in 0ms:
90 uint256 private constant MAX_COOLDOWN_PERIOD = 7 days;
91
92 uint8 private constant MAX_EXTRA_CREATORS = 4;
93 uint256 private constant EARLY_WITHDRAWAL_PENALTY = 25e15;
94 uint256 private constant TEN_PERCENT = 1e17;
95
96 bytes32 private constant DEPOSIT_BY_SIG_TYPEHASH =
97 keccak256(
98 'DepositBySig(uint256 _amountIn,uint256 _minAmountOut,uint256 _nonce,uint256 _maxFee,address _to,address _referrer)'
99 );
100 bytes32 private constant WITHDRAW_BY_SIG_TYPEHASH =
101 keccak256(
102 'WithdrawBySig(uint256 _amountIn,uint256 _minAmountOut,uint256,_nonce,uint256 _maxFee,uint256 _withPenalty)'
103 );
104 bytes32 private constant REWARDS_BY_SIG_TYPEHASH =
105 keccak256('RewardsBySig(uint256 _babl,uint256 _profits,uint256 _nonce,uint256 _maxFee)');
106
107 bytes32 private constant STAKE_REWARDS_BY_SIG_TYPEHASH =
108 keccak256(
109 'StakeRewardsBySig(uint256 _babl,uint256 _profits,uint256 _minAmountOut,uint256 _nonce,uint256 _nonceHeart,uint256 _maxFee,address _to)'
110 );
111
112 uint256 private constant CLAIM_BY_SIG_CAP = 5_500e18; // 5.5K BABL cap per user per bySig tx
113
114 uint256 private constant MAX_HEART_LOCK_VALUE = 4 * 365 days;
115
208
209 // get amount from distributions
210 uint256 amount = registeredDistributions[receiver];
211
212 // set distribution mapping to 0
213 delete registeredDistributions[receiver];
214
215 // set tokenVested mapping to 0
216 delete tokenVested[receiver];
217
218 // remove from the list of all registrations
219 registrations.remove(receiver);
220
221 // decrease total tokens
222 totalTokens = totalTokens.sub(amount);
exec
/bin/bash -lc "rg -n \"is TimeLockedToken|extends TimeLockedToken|new TimeLockRegistry|setTimeLockRegistry|constructor\\(.*TimeLockedToken|contract .* is .*TimeLockedToken\" contracts -g '*.sol'" in /tmp/codex-3hez4cop
succeeded in 0ms:
contracts/token/TimeLockedToken.sol:155: function setTimeLockRegistry(TimeLockRegistry newTimeLockRegistry) external onlyTimeLockOwner returns (bool) {
contracts/token/TimeLockedToken.sol:158: require(address(newTimeLockRegistry) != address(timeLockRegistry), 'must be new TimeLockRegistry');
contracts/token/TimeLockRegistry.sol:27: * to interact with (e.g. setTimeLockRegistry() function)
contracts/token/TimeLockRegistry.sol:108: constructor(TimeLockedToken _token) {
✓ Inspect workspace and read AUDIT_BUNDLE.txt in full
✓ Analyze first-party Solidity for exploitable issues in requested categories
→ Produce JSON audit report with concrete findings or no-findings summary
codex
{"no_findings":false,"summary":"Three material issues: keeper-supplied share prices can be ratcheted to steal TVL, stake-and-claim signatures replay across gardens, and the vesting registry can be seized before first initialization.","findings":[{"severity":"high","category":"oracle","title":"Keeper-controlled pricePerShare can be stair-stepped away from real NAV and used to overmint/overwithdraw","exploit_scenario":"A malicious keeper collaborates with an attacker contributor and submits a series of tiny `depositBySig` calls that each move `_pricePerShare` by the allowed 25% band. Because the contract only compares the new value to the last recorded value, the keeper can walk `lastPricePerShare` far below real NAV. The attacker then makes a large by-signature deposit at the fake low price, receives far too many garden shares, and later exits against the garden's real valuation, diluting and stealing reserve assets from existing contributors. The same weak check also affects by-signature withdrawals and Heart staking.","recommendation":"Do not trust keeper-supplied share prices. Recompute price per share on-chain for by-signature flows, or at minimum validate the supplied value against the current on-chain valuation within a tight per-transaction tolerance. Do not let historical user-supplied prices become the sole anchor for future pricing.","evidence":"`depositBySig`, `withdrawBySig`, and `stakeBySig` all accept an external `_pricePerShare`. `_checkLastPricePerShare` only bounds the new price against `lastPricePerShare` plus a decay-based slippage window, then overwrites the stored reference unconditionally; it never compares against the garden's actual current valuation.","locations":["contracts/gardens/Garden.sol:315","contracts/gardens/Garden.sol:427","contracts/gardens/Garden.sol:655","contracts/gardens/Garden.sol:1232"]},{"severity":"high","category":"auth","title":"`claimAndStakeRewardsBySig` signatures are replayable across different gardens","exploit_scenario":"A contributor who is in multiple gardens signs a stake-and-claim message for Garden A. A malicious keeper instead submits that same signature to Garden B where the contributor's garden nonce matches. Garden B accepts it because the signed hash is bound to `heartGarden` rather than `address(this)`, then `_sendRewardsInternal` pays out Garden B's reserve-asset rewards and BABL allocation. The attacker can choose whichever matching garden has the largest rewards set aside, draining funds from an unintended garden with a signature that was never scoped to it.","recommendation":"Bind the source garden into the signed payload and verification path. `claimAndStakeRewardsBySig` should hash `address(this)` (and ideally `chainid`) in addition to the Heart-garden context, or use separate signatures for source-garden reward claims and Heart staking.","evidence":"The signed type for staking rewards does not include a source garden field, and `claimAndStakeRewardsBySig` hashes `address(heartGarden)` instead of `address(this)`. Verification then checks only the contributor nonce of whichever garden executes the call, so the same signature is valid in any garden where that nonce matches.","locations":["contracts/gardens/Garden.sol:107","contracts/gardens/Garden.sol:576","contracts/gardens/Garden.sol:590","contracts/gardens/Garden.sol:605"]},{"severity":"medium","category":"access_control","title":"First `setTimeLockRegistry` call is permissionless, enabling vesting-registry takeover","exploit_scenario":"After deployment, if `timeLockRegistry` has not already been initialized in a constructor/initializer, any external account can call `setTimeLockRegistry` first and point it to an attacker-controlled contract. That attacker then becomes the permanent registry authority because future rotations are gated by `Ownable(timeLockRegistry).owner()`. With control of the registry, the attacker can disrupt claims and claw back still-locked team/advisor balances through the token's `onlyTimeLockRegistry` paths.","recommendation":"Make the registry immutable at deployment, or gate the first assignment with `onlyOwner`/a one-time initializer. Do not allow the zero-state registry check to bypass access control.","evidence":"`onlyTimeLockOwner` performs no authorization when `timeLockRegistry` is still zero. `setTimeLockRegistry` uses that modifier directly, so the initial registry assignment is unrestricted.","locations":["contracts/token/TimeLockedToken.sol:69","contracts/token/TimeLockedToken.sol:155","contracts/token/TimeLockedToken.sol:161"]}]}
tokens used
125,681
{
"codex": {
"ran_at": "2026-04-04T04:13:48.661988+00:00",
"returncode": 0
},
"project": {
"mode": "source",
"file_count": 57,
"import_count": 68,
"first_party_contracts_count": 37
},
"summary": "Three material issues: keeper-supplied share prices can be ratcheted to steal TVL, stake-and-claim signatures replay across gardens, and the vesting registry can be seized before first initialization.",
"raw_final": {
"summary": "Three material issues: keeper-supplied share prices can be ratcheted to steal TVL, stake-and-claim signatures replay across gardens, and the vesting registry can be seized before first initialization.",
"findings": [
{
"title": "Keeper-controlled pricePerShare can be stair-stepped away from real NAV and used to overmint/overwithdraw",
"category": "oracle",
"evidence": "`depositBySig`, `withdrawBySig`, and `stakeBySig` all accept an external `_pricePerShare`. `_checkLastPricePerShare` only bounds the new price against `lastPricePerShare` plus a decay-based slippage window, then overwrites the stored reference unconditionally; it never compares against the garden's actual current valuation.",
"severity": "high",
"locations": [
"contracts/gardens/Garden.sol:315",
"contracts/gardens/Garden.sol:427",
"contracts/gardens/Garden.sol:655",
"contracts/gardens/Garden.sol:1232"
],
"recommendation": "Do not trust keeper-supplied share prices. Recompute price per share on-chain for by-signature flows, or at minimum validate the supplied value against the current on-chain valuation within a tight per-transaction tolerance. Do not let historical user-supplied prices become the sole anchor for future pricing.",
"exploit_scenario": "A malicious keeper collaborates with an attacker contributor and submits a series of tiny `depositBySig` calls that each move `_pricePerShare` by the allowed 25% band. Because the contract only compares the new value to the last recorded value, the keeper can walk `lastPricePerShare` far below real NAV. The attacker then makes a large by-signature deposit at the fake low price, receives far too many garden shares, and later exits against the garden's real valuation, diluting and stealing reserve assets from existing contributors. The same weak check also affects by-signature withdrawals and Heart staking."
},
{
"title": "`claimAndStakeRewardsBySig` signatures are replayable across different gardens",
"category": "auth",
"evidence": "The signed type for staking rewards does not include a source garden field, and `claimAndStakeRewardsBySig` hashes `address(heartGarden)` instead of `address(this)`. Verification then checks only the contributor nonce of whichever garden executes the call, so the same signature is valid in any garden where that nonce matches.",
"severity": "high",
"locations": [
"contracts/gardens/Garden.sol:107",
"contracts/gardens/Garden.sol:576",
"contracts/gardens/Garden.sol:590",
"contracts/gardens/Garden.sol:605"
],
"recommendation": "Bind the source garden into the signed payload and verification path. `claimAndStakeRewardsBySig` should hash `address(this)` (and ideally `chainid`) in addition to the Heart-garden context, or use separate signatures for source-garden reward claims and Heart staking.",
"exploit_scenario": "A contributor who is in multiple gardens signs a stake-and-claim message for Garden A. A malicious keeper instead submits that same signature to Garden B where the contributor's garden nonce matches. Garden B accepts it because the signed hash is bound to `heartGarden` rather than `address(this)`, then `_sendRewardsInternal` pays out Garden B's reserve-asset rewards and BABL allocation. The attacker can choose whichever matching garden has the largest rewards set aside, draining funds from an unintended garden with a signature that was never scoped to it."
},
{
"title": "First `setTimeLockRegistry` call is permissionless, enabling vesting-registry takeover",
"category": "access_control",
"evidence": "`onlyTimeLockOwner` performs no authorization when `timeLockRegistry` is still zero. `setTimeLockRegistry` uses that modifier directly, so the initial registry assignment is unrestricted.",
"severity": "medium",
"locations": [
"contracts/token/TimeLockedToken.sol:69",
"contracts/token/TimeLockedToken.sol:155",
"contracts/token/TimeLockedToken.sol:161"
],
"recommendation": "Make the registry immutable at deployment, or gate the first assignment with `onlyOwner`/a one-time initializer. Do not allow the zero-state registry check to bypass access control.",
"exploit_scenario": "After deployment, if `timeLockRegistry` has not already been initialized in a constructor/initializer, any external account can call `setTimeLockRegistry` first and point it to an attacker-controlled contract. That attacker then becomes the permanent registry authority because future rotations are gated by `Ownable(timeLockRegistry).owner()`. With control of the registry, the attacker can disrupt claims and claw back still-locked team/advisor balances through the token's `onlyTimeLockRegistry` paths."
}
],
"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 0x03bc 0000000c: JUMPI 0000000d: PUSH1 0x00 0000000f: CALLDATALOAD 00000010: PUSH1 0xe0 00000012: SHR 00000013: DUP1 00000014: PUSH4 0x77e7ff3c 00000019: GT 0000001a: PUSH2 0x01f2 0000001d: JUMPI 0000001e: DUP1 0000001f: PUSH4 0xb1b75867 00000024: GT 00000025: PUSH2 0x010d 00000028: JUMPI 00000029: DUP1 0000002a: PUSH4 0xcb12233b 0000002f: GT 00000030: PUSH2 0x00a0 00000033: JUMPI 00000034: DUP1 00000035: PUSH4 0xdd62ed3e 0000003a: GT 0000003b: PUSH2 0x006f 0000003e: JUMPI 0000003f: DUP1 00000040: PUSH4 0xdd62ed3e 00000045: EQ 00000046: PUSH2 0x12db 00000049: JUMPI 0000004a: DUP1 0000004b: PUSH4 0xf251fc8c 00000050: EQ 00000051: PUSH2 0x1316 00000054: JUMPI 00000055: DUP1 00000056: PUSH4 0xf77c4791 0000005b: EQ 0000005c: PUSH2 0x132b 0000005f: JUMPI 00000060: DUP1 00000061: PUSH4 0xf85cb5c8 00000066: EQ 00000067: PUSH2 0x1340 0000006a: JUMPI 0000006b: PUSH2 0x03cb 0000006e: JUMP 0000006f: JUMPDEST 00000070: DUP1 00000071: PUSH4 0xcb12233b 00000076: EQ 00000077: PUSH2 0x115c 0000007a: JUMPI 0000007b: DUP1 0000007c: PUSH4 0xd360386c 00000081: EQ 00000082: PUSH2 0x1171 00000085: JUMPI 00000086: DUP1 00000087: PUSH4 0xd6888eab 0000008c: EQ 0000008d: PUSH2 0x1275 00000090: JUMPI 00000091: DUP1 00000092: PUSH4 0xdaeffcca 00000097: EQ 00000098: PUSH2 0x128a 0000009b: JUMPI 0000009c: PUSH2 0x03cb 0000009f: JUMP 000000a0: JUMPDEST 000000a1: DUP1 000000a2: PUSH4 0xb63c44e7 000000a7: GT 000000a8: PUSH2 0x00dc 000000ab: JUMPI 000000ac: DUP1 000000ad: PUSH4 0xb63c44e7 000000b2: EQ 000000b3: PUSH2 0x1005 000000b6: JUMPI 000000b7: DUP1 000000b8: PUSH4 0xb9e67539 000000bd: EQ 000000be: PUSH2 0x101a 000000c1: JUMPI 000000c2: DUP1 000000c3: PUSH4 0xbb4d4436 000000c8: EQ 000000c9: PUSH2 0x102f 000000cc: JUMPI 000000cd: DUP1 000000ce: PUSH4 0xbe546f5e 000000d3: EQ 000000d4: PUSH2 0x1062 000000d7: JUMPI 000000d8: PUSH2 0x03cb 000000db: JUMP 000000dc: JUMPDEST 000000dd: DUP1 000000de: PUSH4 0xb1b75867 000000e3: EQ 000000e4: PUSH2 0x0ea7 000000e7: JUMPI 000000e8: DUP1 000000e9: PUSH4 0xb1e3f40c 000000ee: EQ 000000ef: PUSH2 0x0ebc 000000f2: JUMPI 000000f3: DUP1 000000f4: PUSH4 0xb304b815 000000f9: EQ 000000fa: PUSH2 0x0f8b 000000fd: JUMPI 000000fe: DUP1 000000ff: PUSH4 0xb49a60bb 00000104: EQ 00000105: PUSH2 0x0ff0 00000108: JUMPI 00000109: PUSH2 0x03cb 0000010c: JUMP 0000010d: JUMPDEST 0000010e: DUP1 0000010f: PUSH4 0x95cdbedb 00000114: GT 00000115: PUSH2 0x0185 00000118: JUMPI 00000119: DUP1 0000011a: PUSH4 0xa63c643d 0000011f: GT 00000120: PUSH2 0x0154 00000123: JUMPI 00000124: DUP1 00000125: PUSH4 0xa63c643d 0000012a: EQ 0000012b: PUSH2 0x0e2f 0000012e: JUMPI 0000012f: DUP1 00000130: PUSH4 0xa9059cbb 00000135: EQ 00000136: PUSH2 0x0e44 00000139: JUMPI 0000013a: DUP1 0000013b: PUSH4 0xaaffadf3 00000140: EQ 00000141: PUSH2 0x0e7d 00000144: JUMPI 00000145: DUP1 00000146: PUSH4 0xac9dc9e8 0000014b: EQ 0000014c: PUSH2 0x0e92 0000014f: JUMPI 00000150: PUSH2 0x03cb 00000153: JUMP 00000154: JUMPDEST 00000155: DUP1 00000156: PUSH4 0x95cdbedb 0000015b: EQ 0000015c: PUSH2 0x0db7 0000015f: JUMPI 00000160: DUP1 00000161: PUSH4 0x95d89b41 00000166: EQ 00000167: PUSH2 0x0dcc 0000016a: JUMPI 0000016b: DUP1 0000016c: PUSH4 0xa06931f9 00000171: EQ 00000172: PUSH2 0x0de1 00000175: JUMPI 00000176: DUP1 00000177: PUSH4 0xa457c2d7 0000017c: EQ 0000017d: PUSH2 0x0df6 00000180: JUMPI 00000181: PUSH2 0x03cb 00000184: JUMP 00000185: JUMPDEST 00000186: DUP1 00000187: PUSH4 0x8b0e9f3f 0000018c: GT 0000018d: PUSH2 0x01c1 00000190: JUMPI 00000191: DUP1 00000192: PUSH4 0x8b0e9f3f 00000197: EQ 00000198: PUSH2 0x0bb6 0000019b: JUMPI 0000019c: DUP1 0000019d: PUSH4 0x8bbde0fd 000001a2: EQ 000001a3: PUSH2 0x0bcb 000001a6: JUMPI 000001a7: DUP1 000001a8: PUSH4 0x8fa3eab1 000001ad: EQ 000001ae: PUSH2 0x0be0 000001b1: JUMPI 000001b2: DUP1 000001b3: PUSH4 0x94bd87ac 000001b8: EQ 000001b9: PUSH2 0x0cc0 000001bc: JUMPI 000001bd: PUSH2 0x03cb 000001c0: JUMP 000001c1: JUMPDEST 000001c2: DUP1 000001c3: PUSH4 0x77e7ff3c 000001c8: EQ 000001c9: PUSH2 0x0b3d 000001cc: JUMPI 000001cd: DUP1 000001ce: PUSH4 0x792e42e2 000001d3: EQ 000001d4: PUSH2 0x0b52 000001d7: JUMPI 000001d8: DUP1 000001d9: PUSH4 0x7fab0dd4 000001de: EQ 000001df: PUSH2 0x0b67 000001e2: JUMPI 000001e3: DUP1 000001e4: PUSH4 0x84715b11 000001e9: EQ 000001ea: PUSH2 0x0b7c 000001ed: JUMPI 000001ee: PUSH2 0x03cb 000001f1: JUMP 000001f2: JUMPDEST 000001f3: DUP1 000001f4: PUSH4 0x3a821925 000001f9: GT 000001fa: PUSH2 0x02e2 000001fd: JUMPI 000001fe: DUP1 000001ff: PUSH4 0x59659e90 00000204: GT 00000205: PUSH2 0x0275 00000208: JUMPI 00000209: DUP1 0000020a: PUSH4 0x672756ad 0000020f: GT 00000210: PUSH2 0x0244 00000213: JUMPI 00000214: DUP1 00000215: PUSH4 0x672756ad 0000021a: EQ 0000021b: PUSH2 0x0aa1 0000021e: JUMPI 0000021f: DUP1 00000220: PUSH4 0x7071d1a4 00000225: EQ 00000226: PUSH2 0x0ab6 00000229: JUMPI 0000022a: DUP1 0000022b: PUSH4 0x70a08231 00000230: EQ 00000231: PUSH2 0x0af5 00000234: JUMPI 00000235: DUP1 00000236: PUSH4 0x7550ed18 0000023b: EQ 0000023c: PUSH2 0x0b28 0000023f: JUMPI 00000240: PUSH2 0x03cb 00000243: JUMP 00000244: JUMPDEST 00000245: DUP1 00000246: PUSH4 0x59659e90 0000024b: EQ 0000024c: PUSH2 0x0a38 0000024f: JUMPI 00000250: DUP1 00000251: PUSH4 0x5a16656a 00000256: EQ 00000257: PUSH2 0x0a4d 0000025a: JUMPI 0000025b: DUP1 0000025c: PUSH4 0x60d442ca 00000261: EQ 00000262: PUSH2 0x0a62 00000265: JUMPI 00000266: DUP1 00000267: PUSH4 0x63f568b9 0000026c: EQ 0000026d: PUSH2 0x0a77 00000270: JUMPI 00000271: PUSH2 0x03cb 00000274: JUMP 00000275: JUMPDEST 00000276: DUP1 00000277: PUSH4 0x3deddb3f 0000027c: GT 0000027d: PUSH2 0x02b1 00000280: JUMPI 00000281: DUP1 00000282: PUSH4 0x3deddb3f 00000287: EQ 00000288: PUSH2 0x0957 0000028b: JUMPI 0000028c: DUP1 0000028d: PUSH4 0x4961a279 00000292: EQ 00000293: PUSH2 0x096c 00000296: JUMPI 00000297: DUP1 00000298: PUSH4 0x550c2b7f 0000029d: EQ 0000029e: PUSH2 0x09f0 000002a1: JUMPI 000002a2: DUP1 000002a3: PUSH4 0x5617a6e8 000002a8: EQ 000002a9: PUSH2 0x0a05 000002ac: JUMPI 000002ad: PUSH2 0x03cb 000002b0: JUMP 000002b1: JUMPDEST 000002b2: DUP1 000002b3: PUSH4 0x3a821925 000002b8: EQ 000002b9: PUSH2 0x0818 000002bc: JUMPI 000002bd: DUP1 000002be: PUSH4 0x3aa1f9ed 000002c3: EQ 000002c4: PUSH2 0x084b 000002c7: JUMPI 000002c8: DUP1 000002c9: PUSH4 0x3ad8d04d 000002ce: EQ 000002cf: PUSH2 0x0860 000002d2: JUMPI 000002d3: DUP1 000002d4: PUSH4 0x3d8270f5 000002d9: EQ 000002da: PUSH2 0x08dd 000002dd: JUMPI 000002de: PUSH2 0x03cb 000002e1: JUMP 000002e2: JUMPDEST 000002e3: DUP1 000002e4: PUSH4 0x18160ddd 000002e9: GT 000002ea: PUSH2 0x035a 000002ed: JUMPI 000002ee: DUP1 000002ef: PUSH4 0x30869d87 000002f4: GT 000002f5: PUSH2 0x0329 000002f8: JUMPI 000002f9: DUP1 000002fa: PUSH4 0x30869d87 000002ff: EQ 00000300: PUSH2 0x078a 00000303: JUMPI 00000304: DUP1 00000305: PUSH4 0x313ce567 0000030a: EQ 0000030b: PUSH2 0x079f 0000030e: JUMPI 0000030f: DUP1 00000310: PUSH4 0x38e45bc3 00000315: EQ 00000316: PUSH2 0x07ca 00000319: JUMPI 0000031a: DUP1 0000031b: PUSH4 0x39509351 00000320: EQ 00000321: PUSH2 0x07df 00000324: JUMPI 00000325: PUSH2 0x03cb 00000328: JUMP 00000329: JUMPDEST 0000032a: DUP1 0000032b: PUSH4 0x18160ddd 00000330: EQ 00000331: PUSH2 0x060f 00000334: JUMPI 00000335: DUP1 00000336: PUSH4 0x23b872dd 0000033b: EQ 0000033c: PUSH2 0x0636 0000033f: JUMPI 00000340: DUP1 00000341: PUSH4 0x297ce598 00000346: EQ 00000347: PUSH2 0x0679 0000034a: JUMPI 0000034b: DUP1 0000034c: PUSH4 0x2f214efc 00000351: EQ 00000352: PUSH2 0x068e 00000355: JUMPI 00000356: PUSH2 0x03cb 00000359: JUMP 0000035a: JUMPDEST 0000035b: DUP1 0000035c: PUSH4 0x095ea7b3 00000361: GT 00000362: PUSH2 0x0396 00000365: JUMPI 00000366: DUP1 00000367: PUSH4 0x095ea7b3 0000036c: EQ 0000036d: PUSH2 0x04d5 00000370: JUMPI 00000371: DUP1 00000372: PUSH4 0x0b33dbd6 00000377: EQ 00000378: PUSH2 0x050e 0000037b: JUMPI 0000037c: DUP1 0000037d: PUSH4 0x1626ba7e 00000382: EQ 00000383: PUSH2 0x0523 00000386: JUMPI 00000387: DUP1 00000388: PUSH4 0x1780998b 0000038d: EQ 0000038e: PUSH2 0x05fa 00000391: JUMPI 00000392: PUSH2 0x03cb 00000395: JUMP 00000396: JUMPDEST 00000397: DUP1 00000398: PUSH4 0x02d05d3f 0000039d: EQ 0000039e: PUSH2 0x03d3 000003a1: JUMPI 000003a2: DUP1 000003a3: PUSH4 0x06061dfa 000003a8: EQ 000003a9: PUSH2 0x0404 000003ac: JUMPI 000003ad: DUP1 000003ae: PUSH4 0x06fdde03 000003b3: EQ 000003b4: PUSH2 0x044b 000003b7: JUMPI 000003b8: PUSH2 0x03cb 000003bb: JUMP 000003bc: JUMPDEST 000003bd: CALLDATASIZE 000003be: PUSH2 0x03cb 000003c1: JUMPI 000003c2: PUSH2 0x03c9 000003c5: PUSH2 0x1355 000003c8: JUMP 000003c9: JUMPDEST 000003ca: STOP 000003cb: JUMPDEST 000003cc: PUSH2 0x03c9 000003cf: PUSH2 0x1355 000003d2: JUMP 000003d3: JUMPDEST 000003d4: CALLVALUE 000003d5: DUP1 000003d6: ISZERO 000003d7: PUSH2 0x03df 000003da: JUMPI 000003db: PUSH1 0x00 000003dd: DUP1 000003de: REVERT 000003df: JUMPDEST 000003e0: POP 000003e1: PUSH2 0x03e8 000003e4: PUSH2 0x136f 000003e7: JUMP 000003e8: JUMPDEST 000003e9: PUSH1 0x40 000003eb: DUP1 000003ec: MLOAD 000003ed: PUSH1 0x01 000003ef: PUSH1 0x01 000003f1: PUSH1 0xa0 000003f3: SHL 000003f4: SUB 000003f5: SWAP1 000003f6: SWAP3 000003f7: AND 000003f8: DUP3 000003f9: MSTORE 000003fa: MLOAD 000003fb: SWAP1 000003fc: DUP2 000003fd: SWAP1 000003fe: SUB 000003ff: PUSH1 0x20 00000401: ADD 00000402: SWAP1 00000403: RETURN 00000404: JUMPDEST 00000405: CALLVALUE 00000406: DUP1 00000407: ISZERO 00000408: PUSH2 0x0410 0000040b: JUMPI 0000040c: PUSH1 0x00 0000040e: DUP1 0000040f: REVERT 00000410: JUMPDEST 00000411: POP 00000412: PUSH2 0x0437 00000415: PUSH1 0x04 00000417: DUP1 00000418: CALLDATASIZE 00000419: SUB 0000041a: PUSH1 0x20 0000041c: DUP2 0000041d: LT 0000041e: ISZERO 0000041f: PUSH2 0x0427 00000422: JUMPI 00000423: PUSH1 0x00 00000425: DUP1 00000426: REVERT 00000427: JUMPDEST 00000428: POP 00000429: CALLDATALOAD 0000042a: PUSH1 0x01 0000042c: PUSH1 0x01 0000042e: PUSH1 0xa0 00000430: SHL 00000431: SUB 00000432: AND 00000433: PUSH2 0x137e 00000436: JUMP 00000437: JUMPDEST 00000438: PUSH1 0x40 0000043a: DUP1 0000043b: MLOAD 0000043c: SWAP2 0000043d: ISZERO 0000043e: ISZERO 0000043f: DUP3 00000440: MSTORE 00000441: MLOAD 00000442: SWAP1 00000443: DUP2 00000444: SWAP1 00000445: SUB 00000446: PUSH1 0x20 00000448: ADD 00000449: SWAP1 0000044a: RETURN 0000044b: JUMPDEST 0000044c: CALLVALUE 0000044d: DUP1 0000044e: ISZERO 0000044f: PUSH2 0x0457 00000452: JUMPI 00000453: PUSH1 0x00 00000455: DUP1 00000456: REVERT 00000457: JUMPDEST 00000458: POP 00000459: PUSH2 0x0460 0000045c: PUSH2 0x1393 0000045f: JUMP 00000460: JUMPDEST 00000461: PUSH1 0x40 00000463: DUP1 00000464: MLOAD 00000465: PUSH1 0x20 00000467: DUP1 00000468: DUP3 00000469: MSTORE 0000046a: DUP4 0000046b: MLOAD 0000046c: DUP2 0000046d: DUP4 0000046e: ADD 0000046f: MSTORE 00000470: DUP4 00000471: MLOAD 00000472: SWAP2 00000473: SWAP3 00000474: DUP4 00000475: SWAP3 00000476: SWAP1 00000477: DUP4 00000478: ADD 00000479: SWAP2 0000047a: DUP6 0000047b: ADD 0000047c: SWAP1 0000047d: DUP1 0000047e: DUP4 0000047f: DUP4 00000480: PUSH1 0x00 00000482: JUMPDEST 00000483: DUP4 00000484: DUP2 00000485: LT 00000486: ISZERO 00000487: PUSH2 0x049a 0000048a: JUMPI 0000048b: DUP2 0000048c: DUP2 0000048d: ADD 0000048e: MLOAD 0000048f: DUP4 00000490: DUP3 00000491: ADD 00000492: MSTORE 00000493: PUSH1 0x20 00000495: ADD 00000496: PUSH2 0x0482 00000499: JUMP 0000049a: JUMPDEST 0000049b: POP 0000049c: POP 0000049d: POP 0000049e: POP 0000049f: SWAP1 000004a0: POP 000004a1: SWAP1 000004a2: DUP2 000004a3: ADD 000004a4: SWAP1 000004a5: PUSH1 0x1f 000004a7: AND 000004a8: DUP1 000004a9: ISZERO 000004aa: PUSH2 0x04c7 000004ad: JUMPI 000004ae: DUP1 000004af: DUP3 000004b0: SUB 000004b1: DUP1 000004b2: MLOAD 000004b3: PUSH1 0x01 000004b5: DUP4 000004b6: PUSH1 0x20 000004b8: SUB 000004b9: PUSH2 0x0100 000004bc: EXP 000004bd: SUB 000004be: NOT 000004bf: AND 000004c0: DUP2 000004c1: MSTORE 000004c2: PUSH1 0x20 000004c4: ADD 000004c5: SWAP2 000004c6: POP 000004c7: JUMPDEST 000004c8: POP 000004c9: SWAP3 000004ca: POP 000004cb: POP 000004cc: POP 000004cd: PUSH1 0x40 000004cf: MLOAD 000004d0: DUP1 000004d1: SWAP2 000004d2: SUB 000004d3: SWAP1 000004d4: RETURN 000004d5: JUMPDEST 000004d6: CALLVALUE 000004d7: DUP1 000004d8: ISZERO 000004d9: PUSH2 0x04e1 000004dc: JUMPI 000004dd: PUSH1 0x00 000004df: DUP1 000004e0: REVERT 000004e1: JUMPDEST 000004e2: POP 000004e3: PUSH2 0x0437 000004e6: PUSH1 0x04 000004e8: DUP1 000004e9: CALLDATASIZE 000004ea: SUB 000004eb: PUSH1 0x40 000004ed: DUP2 000004ee: LT 000004ef: ISZERO 000004f0: PUSH2 0x04f8 000004f3: JUMPI 000004f4: PUSH1 0x00 000004f6: DUP1 000004f7: REVERT 000004f8: JUMPDEST 000004f9: POP 000004fa: PUSH1 0x01 000004fc: PUSH1 0x01 000004fe: PUSH1 0xa0 00000500: SHL 00000501: SUB 00000502: DUP2 00000503: CALLDATALOAD 00000504: AND 00000505: SWAP1 00000506: PUSH1 0x20 00000508: ADD 00000509: CALLDATALOAD 0000050a: PUSH2 0x142a 0000050d: JUMP 0000050e: JUMPDEST 0000050f: CALLVALUE 00000510: DUP1 00000511: ISZERO 00000512: PUSH2 0x051a 00000515: JUMPI 00000516: PUSH1 0x00 00000518: DUP1 00000519: REVERT 0000051a: JUMPDEST 0000051b: POP 0000051c: PUSH2 0x0437 0000051f: PUSH2 0x1448 00000522: JUMP 00000523: JUMPDEST 00000524: CALLVALUE 00000525: DUP1 00000526: ISZERO 00000527: PUSH2 0x052f 0000052a: JUMPI 0000052b: PUSH1 0x00 0000052d: DUP1 0000052e: REVERT 0000052f: JUMPDEST 00000530: POP 00000531: PUSH2 0x05dd 00000534: PUSH1 0x04 00000536: DUP1 00000537: CALLDATASIZE 00000538: SUB 00000539: PUSH1 0x40 0000053b: DUP2 0000053c: LT 0000053d: ISZERO 0000053e: PUSH2 0x0546 00000541: JUMPI 00000542: PUSH1 0x00 00000544: DUP1 00000545: REVERT 00000546: JUMPDEST 00000547: DUP2 00000548: CALLDATALOAD 00000549: SWAP2 0000054a: SWAP1 0000054b: DUP2 0000054c: ADD 0000054d: SWAP1 0000054e: PUSH1 0x40 00000550: DUP2 00000551: ADD 00000552: PUSH1 0x20 00000554: DUP3 00000555: ADD 00000556: CALLDATALOAD 00000557: PUSH5 0x0100000000 0000055d: DUP2 0000055e: GT 0000055f: ISZERO 00000560: PUSH2 0x0568 00000563: JUMPI 00000564: PUSH1 0x00 00000566: DUP1 00000567: REVERT 00000568: JUMPDEST 00000569: DUP3 0000056a: ADD 0000056b: DUP4 0000056c: PUSH1 0x20 0000056e: DUP3 0000056f: ADD 00000570: GT 00000571: ISZERO 00000572: PUSH2 0x057a 00000575: JUMPI 00000576: PUSH1 0x00 00000578: DUP1 00000579: REVERT 0000057a: JUMPDEST 0000057b: DUP1 0000057c: CALLDATALOAD 0000057d: SWAP1 0000057e: PUSH1 0x20 00000580: ADD 00000581: SWAP2 00000582: DUP5 00000583: PUSH1 0x01 00000585: DUP4 00000586: MUL 00000587: DUP5 00000588: ADD 00000589: GT 0000058a: PUSH5 0x0100000000 00000590: DUP4 00000591: GT 00000592: OR 00000593: ISZERO 00000594: PUSH2 0x059c 00000597: JUMPI 00000598: PUSH1 0x00 0000059a: DUP1 0000059b: REVERT 0000059c: JUMPDEST 0000059d: SWAP2 0000059e: SWAP1 0000059f: DUP1 000005a0: DUP1 000005a1: PUSH1 0x1f 000005a3: ADD 000005a4: PUSH1 0x20 000005a6: DUP1 000005a7: SWAP2 000005a8: DIV 000005a9: MUL 000005aa: PUSH1 0x20 000005ac: ADD 000005ad: PUSH1 0x40 000005af: MLOAD 000005b0: SWAP1 000005b1: DUP2 000005b2: ADD 000005b3: PUSH1 0x40 000005b5: MSTORE 000005b6: DUP1 000005b7: SWAP4 000005b8: SWAP3 000005b9: SWAP2 000005ba: SWAP1 000005bb: DUP2 000005bc: DUP2 000005bd: MSTORE 000005be: PUSH1 0x20 000005c0: ADD 000005c1: DUP4 000005c2: DUP4 000005c3: DUP1 000005c4: DUP3 000005c5: DUP5 000005c6: CALLDATACOPY 000005c7: PUSH1 0x00 000005c9: SWAP3 000005ca: ADD 000005cb: SWAP2 000005cc: SWAP1 000005cd: SWAP2 000005ce: MSTORE 000005cf: POP 000005d0: SWAP3 000005d1: SWAP6 000005d2: POP 000005d3: PUSH2 0x1451 000005d6: SWAP5 000005d7: POP 000005d8: POP 000005d9: POP 000005da: POP 000005db: POP 000005dc: JUMP 000005dd: JUMPDEST 000005de: PUSH1 0x40 000005e0: DUP1 000005e1: MLOAD 000005e2: PUSH1 0x01 000005e4: PUSH1 0x01 000005e6: PUSH1 0xe0 000005e8: SHL 000005e9: SUB 000005ea: NOT 000005eb: SWAP1 000005ec: SWAP3 000005ed: AND 000005ee: DUP3 000005ef: MSTORE 000005f0: MLOAD 000005f1: SWAP1 000005f2: DUP2 000005f3: SWAP1 000005f4: SUB 000005f5: PUSH1 0x20 000005f7: ADD 000005f8: SWAP1 000005f9: RETURN 000005fa: JUMPDEST 000005fb: CALLVALUE 000005fc: DUP1 000005fd: ISZERO 000005fe: PUSH2 0x0606 00000601: JUMPI 00000602: PUSH1 0x00 00000604: DUP1 00000605: REVERT 00000606: JUMPDEST 00000607: POP 00000608: PUSH2 0x0437 0000060b: PUSH2 0x14a5 0000060e: JUMP 0000060f: JUMPDEST 00000610: CALLVALUE 00000611: DUP1 00000612: ISZERO 00000613: PUSH2 0x061b 00000616: JUMPI 00000617: PUSH1 0x00 00000619: DUP1 0000061a: REVERT 0000061b: JUMPDEST 0000061c: POP 0000061d: PUSH2 0x0624 00000620: PUSH2 0x14ae 00000623: JUMP 00000624: JUMPDEST 00000625: PUSH1 0x40 00000627: DUP1 00000628: MLOAD 00000629: SWAP2 0000062a: DUP3 0000062b: MSTORE 0000062c: MLOAD 0000062d: SWAP1 0000062e: DUP2 0000062f: SWAP1 00000630: SUB 00000631: PUSH1 0x20 00000633: ADD 00000634: SWAP1 00000635: RETURN 00000636: JUMPDEST 00000637: CALLVALUE 00000638: DUP1 00000639: ISZERO 0000063a: PUSH2 0x0642 0000063d: JUMPI 0000063e: PUSH1 0x00 00000640: DUP1 00000641: REVERT 00000642: JUMPDEST 00000643: POP 00000644: PUSH2 0x0437 00000647: PUSH1 0x04 00000649: DUP1 0000064a: CALLDATASIZE 0000064b: SUB 0000064c: PUSH1 0x60 0000064e: DUP2 0000064f: LT 00000650: ISZERO 00000651: PUSH2 0x0659 00000654: JUMPI 00000655: PUSH1 0x00 00000657: DUP1 00000658: REVERT 00000659: JUMPDEST 0000065a: POP 0000065b: PUSH1 0x01 0000065d: PUSH1 0x01 0000065f: PUSH1 0xa0 00000661: SHL 00000662: SUB 00000663: DUP2 00000664: CALLDATALOAD 00000665: DUP2 00000666: AND 00000667: SWAP2 00000668: PUSH1 0x20 0000066a: DUP2 0000066b: ADD 0000066c: CALLDATALOAD 0000066d: SWAP1 0000066e: SWAP2 0000066f: AND 00000670: SWAP1 00000671: PUSH1 0x40 00000673: ADD 00000674: CALLDATALOAD 00000675: PUSH2 0x14b4 00000678: JUMP 00000679: JUMPDEST 0000067a: CALLVALUE 0000067b: DUP1 0000067c: ISZERO 0000067d: PUSH2 0x0685 00000680: JUMPI 00000681: PUSH1 0x00 00000683: DUP1 00000684: REVERT 00000685: JUMPDEST 00000686: POP 00000687: PUSH2 0x0624 0000068a: PUSH2 0x153b 0000068d: JUMP 0000068e: JUMPDEST 0000068f: CALLVALUE 00000690: DUP1 00000691: ISZERO 00000692: PUSH2 0x069a 00000695: JUMPI 00000696: PUSH1 0x00 00000698: DUP1 00000699: REVERT 0000069a: JUMPDEST 0000069b: POP 0000069c: PUSH2 0x03c9 0000069f: PUSH1 0x04 000006a1: DUP1 000006a2: CALLDATASIZE 000006a3: SUB 000006a4: PUSH2 0x0140 000006a7: DUP2 000006a8: LT 000006a9: ISZERO 000006aa: PUSH2 0x06b2 000006ad: JUMPI 000006ae: PUSH1 0x00 000006b0: DUP1 000006b1: REVERT 000006b2: JUMPDEST 000006b3: DUP2 000006b4: CALLDATALOAD 000006b5: SWAP2 000006b6: PUSH1 0x20 000006b8: DUP2 000006b9: ADD 000006ba: CALLDATALOAD 000006bb: SWAP2 000006bc: PUSH1 0x40 000006be: DUP3 000006bf: ADD 000006c0: CALLDATALOAD 000006c1: SWAP2 000006c2: PUSH1 0x60 000006c4: DUP2 000006c5: ADD 000006c6: CALLDATALOAD 000006c7: SWAP2 000006c8: PUSH1 0x01 000006ca: PUSH1 0x01 000006cc: PUSH1 0xa0 000006ce: SHL 000006cf: SUB 000006d0: PUSH1 0x80 000006d2: DUP4 000006d3: ADD 000006d4: CALLDATALOAD 000006d5: DUP2 000006d6: AND 000006d7: SWAP3 000006d8: PUSH1 0xa0 000006da: DUP2 000006db: ADD 000006dc: CALLDATALOAD 000006dd: SWAP3 000006de: PUSH1 0xc0 000006e0: DUP3 000006e1: ADD 000006e2: CALLDATALOAD 000006e3: SWAP3 000006e4: PUSH1 0xe0 000006e6: DUP4 000006e7: ADD 000006e8: CALLDATALOAD 000006e9: DUP2 000006ea: AND 000006eb: SWAP3 000006ec: PUSH2 0x0100 000006ef: DUP2 000006f0: ADD 000006f1: CALLDATALOAD 000006f2: SWAP1 000006f3: SWAP2 000006f4: AND 000006f5: SWAP2 000006f6: DUP2 000006f7: ADD 000006f8: SWAP1 000006f9: PUSH2 0x0140 000006fc: DUP2 000006fd: ADD 000006fe: PUSH2 0x0120 00000701: DUP3 00000702: ADD 00000703: CALLDATALOAD 00000704: PUSH5 0x0100000000 0000070a: DUP2 0000070b: GT 0000070c: ISZERO 0000070d: PUSH2 0x0715 00000710: JUMPI 00000711: PUSH1 0x00 00000713: DUP1 00000714: REVERT 00000715: JUMPDEST 00000716: DUP3 00000717: ADD 00000718: DUP4 00000719: PUSH1 0x20 0000071b: DUP3 0000071c: ADD 0000071d: GT 0000071e: ISZERO 0000071f: PUSH2 0x0727 00000722: JUMPI 00000723: PUSH1 0x00 00000725: DUP1 00000726: REVERT 00000727: JUMPDEST 00000728: DUP1 00000729: CALLDATALOAD 0000072a: SWAP1 0000072b: PUSH1 0x20 0000072d: ADD 0000072e: SWAP2 0000072f: DUP5 00000730: PUSH1 0x01 00000732: DUP4 00000733: MUL 00000734: DUP5 00000735: ADD 00000736: GT 00000737: PUSH5 0x0100000000 0000073d: DUP4 0000073e: GT 0000073f: OR 00000740: ISZERO 00000741: PUSH2 0x0749 00000744: JUMPI 00000745: PUSH1 0x00 00000747: DUP1 00000748: REVERT 00000749: JUMPDEST 0000074a: SWAP2 0000074b: SWAP1 0000074c: DUP1 0000074d: DUP1 0000074e: PUSH1 0x1f 00000750: ADD 00000751: PUSH1 0x20 00000753: DUP1 00000754: SWAP2 00000755: DIV 00000756: MUL 00000757: PUSH1 0x20 00000759: ADD 0000075a: PUSH1 0x40 0000075c: MLOAD 0000075d: SWAP1 0000075e: DUP2 0000075f: ADD 00000760: PUSH1 0x40 00000762: MSTORE 00000763: DUP1 00000764: SWAP4 00000765: SWAP3 00000766: SWAP2 00000767: SWAP1 00000768: DUP2 00000769: DUP2 0000076a: MSTORE 0000076b: PUSH1 0x20 0000076d: ADD 0000076e: DUP4 0000076f: DUP4 00000770: DUP1 00000771: DUP3 00000772: DUP5 00000773: CALLDATACOPY 00000774: PUSH1 0x00 00000776: SWAP3 00000777: ADD 00000778: SWAP2 00000779: SWAP1 0000077a: SWAP2 0000077b: MSTORE 0000077c: POP 0000077d: SWAP3 0000077e: SWAP6 0000077f: POP 00000780: PUSH2 0x1541 00000783: SWAP5 00000784: POP 00000785: POP 00000786: POP 00000787: POP 00000788: POP 00000789: JUMP 0000078a: JUMPDEST 0000078b: CALLVALUE 0000078c: DUP1 0000078d: ISZERO 0000078e: PUSH2 0x0796 00000791: JUMPI 00000792: PUSH1 0x00 00000794: DUP1 00000795: REVERT 00000796: JUMPDEST 00000797: POP 00000798: PUSH2 0x0624 0000079b: PUSH2 0x16d8 0000079e: JUMP 0000079f: JUMPDEST 000007a0: CALLVALUE 000007a1: DUP1 000007a2: ISZERO 000007a3: PUSH2 0x07ab 000007a6: JUMPI 000007a7: PUSH1 0x00 000007a9: DUP1 000007aa: REVERT 000007ab: JUMPDEST 000007ac: POP 000007ad: PUSH2 0x07b4 000007b0: PUSH2 0x16de 000007b3: JUMP 000007b4: JUMPDEST 000007b5: PUSH1 0x40 000007b7: DUP1 000007b8: MLOAD 000007b9: PUSH1 0xff 000007bb: SWAP1 000007bc: SWAP3 000007bd: AND 000007be: DUP3 000007bf: MSTORE 000007c0: MLOAD 000007c1: SWAP1 000007c2: DUP2 000007c3: SWAP1 000007c4: SUB 000007c5: PUSH1 0x20 000007c7: ADD 000007c8: SWAP1 000007c9: RETURN 000007ca: JUMPDEST 000007cb: CALLVALUE 000007cc: DUP1 000007cd: ISZERO 000007ce: PUSH2 0x07d6 000007d1: JUMPI 000007d2: PUSH1 0x00 000007d4: DUP1 000007d5: REVERT 000007d6: JUMPDEST 000007d7: POP 000007d8: PUSH2 0x0624 000007db: PUSH2 0x16e7 000007de: JUMP 000007df: JUMPDEST 000007e0: CALLVALUE 000007e1: DUP1 000007e2: ISZERO 000007e3: PUSH2 0x07eb 000007e6: JUMPI 000007e7: PUSH1 0x00 000007e9: DUP1 000007ea: REVERT 000007eb: JUMPDEST 000007ec: POP 000007ed: PUSH2 0x0437 000007f0: PUSH1 0x04 000007f2: DUP1 000007f3: CALLDATASIZE 000007f4: SUB 000007f5: PUSH1 0x40 000007f7: DUP2 000007f8: LT 000007f9: ISZERO 000007fa: PUSH2 0x0802 000007fd: JUMPI 000007fe: PUSH1 0x00 00000800: DUP1 00000801: REVERT 00000802: JUMPDEST 00000803: POP 00000804: PUSH1 0x01 00000806: PUSH1 0x01 00000808: PUSH1 0xa0 0000080a: SHL 0000080b: SUB 0000080c: DUP2 0000080d: CALLDATALOAD 0000080e: AND 0000080f: SWAP1 00000810: PUSH1 0x20 00000812: ADD 00000813: CALLDATALOAD 00000814: PUSH2 0x16ed 00000817: JUMP 00000818: JUMPDEST 00000819: CALLVALUE 0000081a: DUP1 0000081b: ISZERO 0000081c: PUSH2 0x0824 0000081f: JUMPI 00000820: PUSH1 0x00 00000822: DUP1 00000823: REVERT 00000824: JUMPDEST 00000825: POP 00000826: PUSH2 0x0437 00000829: PUSH1 0x04 0000082b: DUP1 0000082c: CALLDATASIZE 0000082d: SUB 0000082e: PUSH1 0x20 00000830: DUP2 00000831: LT 00000832: ISZERO 00000833: PUSH2 0x083b 00000836: JUMPI 00000837: PUSH1 0x00 00000839: DUP1 0000083a: REVERT 0000083b: JUMPDEST 0000083c: POP 0000083d: CALLDATALOAD 0000083e: PUSH1 0x01 00000840: PUSH1 0x01 00000842: PUSH1 0xa0 00000844: SHL 00000845: SUB 00000846: AND 00000847: PUSH2 0x173b 0000084a: JUMP 0000084b: JUMPDEST 0000084c: CALLVALUE 0000084d: DUP1 0000084e: ISZERO 0000084f: PUSH2 0x0857 00000852: JUMPI 00000853: PUSH1 0x00 00000855: DUP1 00000856: REVERT 00000857: JUMPDEST 00000858: POP 00000859: PUSH2 0x0624 0000085c: PUSH2 0x1750 0000085f: JUMP 00000860: JUMPDEST 00000861: CALLVALUE 00000862: DUP1 00000863: ISZERO 00000864: PUSH2 0x086c 00000867: JUMPI 00000868: PUSH1 0x00 0000086a: DUP1 0000086b: REVERT 0000086c: JUMPDEST 0000086d: POP 0000086e: PUSH2 0x03c9 00000871: PUSH1 0x04 00000873: DUP1 00000874: CALLDATASIZE 00000875: SUB 00000876: PUSH1 0x20 00000878: DUP2 00000879: LT 0000087a: ISZERO 0000087b: PUSH2 0x0883 0000087e: JUMPI 0000087f: PUSH1 0x00 00000881: DUP1 00000882: REVERT 00000883: JUMPDEST 00000884: DUP2 00000885: ADD 00000886: SWAP1 00000887: PUSH1 0x20 00000889: DUP2 0000088a: ADD 0000088b: DUP2 0000088c: CALLDATALOAD 0000088d: PUSH5 0x0100000000 00000893: DUP2 00000894: GT 00000895: ISZERO 00000896: PUSH2 0x089e 00000899: JUMPI 0000089a: PUSH1 0x00 0000089c: DUP1 0000089d: REVERT 0000089e: JUMPDEST 0000089f: DUP3 000008a0: ADD 000008a1: DUP4 000008a2: PUSH1 0x20 000008a4: DUP3 000008a5: ADD 000008a6: GT 000008a7: ISZERO 000008a8: PUSH2 0x08b0 000008ab: JUMPI 000008ac: PUSH1 0x00 000008ae: DUP1 000008af: REVERT 000008b0: JUMPDEST 000008b1: DUP1 000008b2: CALLDATALOAD 000008b3: SWAP1 000008b4: PUSH1 0x20 000008b6: ADD 000008b7: SWAP2 000008b8: DUP5 000008b9: PUSH1 0x20 000008bb: DUP4 000008bc: MUL 000008bd: DUP5 000008be: ADD 000008bf: GT 000008c0: PUSH5 0x0100000000 000008c6: DUP4 000008c7: GT 000008c8: OR 000008c9: ISZERO 000008ca: PUSH2 0x08d2 000008cd: JUMPI 000008ce: PUSH1 0x00 000008d0: DUP1 000008d1: REVERT 000008d2: JUMPDEST 000008d3: POP 000008d4: SWAP1 000008d5: SWAP3 000008d6: POP 000008d7: SWAP1 000008d8: POP 000008d9: PUSH2 0x1756 000008dc: JUMP 000008dd: JUMPDEST 000008de: CALLVALUE 000008df: DUP1 000008e0: ISZERO 000008e1: PUSH2 0x08e9 000008e4: JUMPI 000008e5: PUSH1 0x00 000008e7: DUP1 000008e8: REVERT 000008e9: JUMPDEST 000008ea: POP 000008eb: PUSH2 0x0910 000008ee: PUSH1 0x04 000008f0: DUP1 000008f1: CALLDATASIZE 000008f2: SUB 000008f3: PUSH1 0x20 000008f5: DUP2 000008f6: LT 000008f7: ISZERO 000008f8: PUSH2 0x0900 000008fb: JUMPI 000008fc: PUSH1 0x00 000008fe: DUP1 000008ff: REVERT 00000900: JUMPDEST 00000901: POP 00000902: CALLDATALOAD 00000903: PUSH1 0x01 00000905: PUSH1 0x01 00000907: PUSH1 0xa0 00000909: SHL 0000090a: SUB 0000090b: AND 0000090c: PUSH2 0x1978 0000090f: JUMP 00000910: JUMPDEST 00000911: PUSH1 0x40 00000913: DUP1 00000914: MLOAD 00000915: SWAP10 00000916: DUP11 00000917: MSTORE 00000918: PUSH1 0x20 0000091a: DUP11 0000091b: ADD 0000091c: SWAP9 0000091d: SWAP1 0000091e: SWAP9 0000091f: MSTORE 00000920: DUP9 00000921: DUP9 00000922: ADD 00000923: SWAP7 00000924: SWAP1 00000925: SWAP7 00000926: MSTORE 00000927: PUSH1 0x60 00000929: DUP9 0000092a: ADD 0000092b: SWAP5 0000092c: SWAP1 0000092d: SWAP5 0000092e: MSTORE 0000092f: PUSH1 0x80 00000931: DUP8 00000932: ADD 00000933: SWAP3 00000934: SWAP1 00000935: SWAP3 00000936: MSTORE 00000937: PUSH1 0xa0 00000939: DUP7 0000093a: ADD 0000093b: MSTORE 0000093c: PUSH1 0xc0 0000093e: DUP6 0000093f: ADD 00000940: MSTORE 00000941: PUSH1 0xe0 00000943: DUP5 00000944: ADD 00000945: MSTORE 00000946: PUSH2 0x0100 00000949: DUP4 0000094a: ADD 0000094b: MSTORE 0000094c: MLOAD 0000094d: SWAP1 0000094e: DUP2 0000094f: SWAP1 00000950: SUB 00000951: PUSH2 0x0120 00000954: ADD 00000955: SWAP1 00000956: RETURN 00000957: JUMPDEST 00000958: CALLVALUE 00000959: DUP1 0000095a: ISZERO 0000095b: PUSH2 0x0963 0000095e: JUMPI 0000095f: PUSH1 0x00 00000961: DUP1 00000962: REVERT 00000963: JUMPDEST 00000964: POP 00000965: PUSH2 0x0624 00000968: PUSH2 0x1a10 0000096b: JUMP 0000096c: JUMPDEST 0000096d: CALLVALUE 0000096e: DUP1 0000096f: ISZERO 00000970: PUSH2 0x0978 00000973: JUMPI 00000974: PUSH1 0x00 00000976: DUP1 00000977: REVERT 00000978: JUMPDEST 00000979: POP 0000097a: PUSH2 0x03c9 0000097d: PUSH1 0x04 0000097f: DUP1 00000980: CALLDATASIZE 00000981: SUB 00000982: PUSH1 0x40 00000984: DUP2 00000985: LT 00000986: ISZERO 00000987: PUSH2 0x098f 0000098a: JUMPI 0000098b: PUSH1 0x00 0000098d: DUP1 0000098e: REVERT 0000098f: JUMPDEST 00000990: DUP2 00000991: CALLDATALOAD 00000992: SWAP2 00000993: SWAP1 00000994: DUP2 00000995: ADD 00000996: SWAP1 00000997: PUSH1 0x40 00000999: DUP2 0000099a: ADD 0000099b: PUSH1 0x20 0000099d: DUP3 0000099e: ADD 0000099f: CALLDATALOAD 000009a0: PUSH5 0x0100000000 000009a6: DUP2 000009a7: GT 000009a8: ISZERO 000009a9: PUSH2 0x09b1 000009ac: JUMPI 000009ad: PUSH1 0x00 000009af: DUP1 000009b0: REVERT 000009b1: JUMPDEST 000009b2: DUP3 000009b3: ADD 000009b4: DUP4 000009b5: PUSH1 0x20 000009b7: DUP3 000009b8: ADD 000009b9: GT 000009ba: ISZERO 000009bb: PUSH2 0x09c3 000009be: JUMPI 000009bf: PUSH1 0x00 000009c1: DUP1 000009c2: REVERT 000009c3: JUMPDEST 000009c4: DUP1 000009c5: CALLDATALOAD 000009c6: SWAP1 000009c7: PUSH1 0x20 000009c9: ADD 000009ca: SWAP2 000009cb: DUP5 000009cc: PUSH1 0x20 000009ce: DUP4 000009cf: MUL 000009d0: DUP5 000009d1: ADD 000009d2: GT 000009d3: PUSH5 0x0100000000 000009d9: DUP4 000009da: GT 000009db: OR 000009dc: ISZERO 000009dd: PUSH2 0x09e5 000009e0: JUMPI 000009e1: PUSH1 0x00 000009e3: DUP1 000009e4: REVERT 000009e5: JUMPDEST 000009e6: POP 000009e7: SWAP1 000009e8: SWAP3 000009e9: POP 000009ea: SWAP1 000009eb: POP 000009ec: PUSH2 0x1a16 000009ef: JUMP 000009f0: JUMPDEST 000009f1: CALLVALUE 000009f2: DUP1 000009f3: ISZERO 000009f4: PUSH2 0x09fc 000009f7: JUMPI 000009f8: PUSH1 0x00 000009fa: DUP1 000009fb: REVERT 000009fc: JUMPDEST 000009fd: POP 000009fe: PUSH2 0x0437 00000a01: PUSH2 0x1e3b 00000a04: JUMP 00000a05: JUMPDEST 00000a06: CALLVALUE 00000a07: DUP1 00000a08: ISZERO 00000a09: PUSH2 0x0a11 00000a0c: JUMPI 00000a0d: PUSH1 0x00 00000a0f: DUP1 00000a10: REVERT 00000a11: JUMPDEST 00000a12: POP 00000a13: PUSH2 0x0624 00000a16: PUSH1 0x04 00000a18: DUP1 00000a19: CALLDATASIZE 00000a1a: SUB 00000a1b: PUSH1 0x20 00000a1d: DUP2 00000a1e: LT 00000a1f: ISZERO 00000a20: PUSH2 0x0a28 00000a23: JUMPI 00000a24: PUSH1 0x00 00000a26: DUP1 00000a27: REVERT 00000a28: JUMPDEST 00000a29: POP 00000a2a: CALLDATALOAD 00000a2b: PUSH1 0x01 00000a2d: PUSH1 0x01 00000a2f: PUSH1 0xa0 00000a31: SHL 00000a32: SUB 00000a33: AND 00000a34: PUSH2 0x1e4b 00000a37: JUMP 00000a38: JUMPDEST 00000a39: CALLVALUE 00000a3a: DUP1 00000a3b: ISZERO 00000a3c: PUSH2 0x0a44 00000a3f: JUMPI 00000a40: PUSH1 0x00 00000a42: DUP1 00000a43: REVERT 00000a44: JUMPDEST 00000a45: POP 00000a46: PUSH2 0x03e8 00000a49: PUSH2 0x1e5d 00000a4c: JUMP 00000a4d: JUMPDEST 00000a4e: CALLVALUE 00000a4f: DUP1 00000a50: ISZERO 00000a51: PUSH2 0x0a59 00000a54: JUMPI 00000a55: PUSH1 0x00 00000a57: DUP1 00000a58: REVERT 00000a59: JUMPDEST 00000a5a: POP 00000a5b: PUSH2 0x0624 00000a5e: PUSH2 0x1e81 00000a61: JUMP 00000a62: JUMPDEST 00000a63: CALLVALUE 00000a64: DUP1 00000a65: ISZERO 00000a66: PUSH2 0x0a6e 00000a69: JUMPI 00000a6a: PUSH1 0x00 00000a6c: DUP1 00000a6d: REVERT 00000a6e: JUMPDEST 00000a6f: POP 00000a70: PUSH2 0x0624 00000a73: PUSH2 0x1e87 00000a76: JUMP 00000a77: JUMPDEST 00000a78: CALLVALUE 00000a79: DUP1 00000a7a: ISZERO 00000a7b: PUSH2 0x0a83 00000a7e: JUMPI 00000a7f: PUSH1 0x00 00000a81: DUP1 00000a82: REVERT 00000a83: JUMPDEST 00000a84: POP 00000a85: PUSH2 0x03e8 00000a88: PUSH1 0x04 00000a8a: DUP1 00000a8b: CALLDATASIZE 00000a8c: SUB 00000a8d: PUSH1 0x20 00000a8f: DUP2 00000a90: LT 00000a91: ISZERO 00000a92: PUSH2 0x0a9a 00000a95: JUMPI 00000a96: PUSH1 0x00 00000a98: DUP1 00000a99: REVERT 00000a9a: JUMPDEST 00000a9b: POP 00000a9c: CALLDATALOAD 00000a9d: PUSH2 0x1e8d 00000aa0: JUMP 00000aa1: JUMPDEST 00000aa2: CALLVALUE 00000aa3: DUP1 00000aa4: ISZERO 00000aa5: PUSH2 0x0aad 00000aa8: JUMPI 00000aa9: PUSH1 0x00 00000aab: DUP1 00000aac: REVERT 00000aad: JUMPDEST 00000aae: POP 00000aaf: PUSH2 0x03c9 00000ab2: PUSH2 0x1ead 00000ab5: JUMP 00000ab6: JUMPDEST 00000ab7: CALLVALUE 00000ab8: DUP1 00000ab9: ISZERO 00000aba: PUSH2 0x0ac2 00000abd: JUMPI 00000abe: PUSH1 0x00 00000ac0: DUP1 00000ac1: REVERT 00000ac2: JUMPDEST 00000ac3: POP 00000ac4: PUSH2 0x03c9 00000ac7: PUSH1 0x04 00000ac9: DUP1 00000aca: CALLDATASIZE 00000acb: SUB 00000acc: PUSH1 0x60 00000ace: DUP2 00000acf: LT 00000ad0: ISZERO 00000ad1: PUSH2 0x0ad9 00000ad4: JUMPI 00000ad5: PUSH1 0x00 00000ad7: DUP1 00000ad8: REVERT 00000ad9: JUMPDEST 00000ada: POP 00000adb: PUSH1 0x01 00000add: PUSH1 0x01 00000adf: PUSH1 0xa0 00000ae1: SHL 00000ae2: SUB 00000ae3: DUP2 00000ae4: CALLDATALOAD 00000ae5: AND 00000ae6: SWAP1 00000ae7: PUSH1 0x20 00000ae9: DUP2 00000aea: ADD 00000aeb: CALLDATALOAD 00000aec: SWAP1 00000aed: PUSH1 0x40 00000aef: ADD 00000af0: CALLDATALOAD 00000af1: PUSH2 0x200c 00000af4: JUMP 00000af5: JUMPDEST 00000af6: CALLVALUE 00000af7: DUP1 00000af8: ISZERO 00000af9: PUSH2 0x0b01 00000afc: JUMPI 00000afd: PUSH1 0x00 00000aff: DUP1 00000b00: REVERT 00000b01: JUMPDEST 00000b02: POP 00000b03: PUSH2 0x0624 00000b06: PUSH1 0x04 00000b08: DUP1 00000b09: CALLDATASIZE 00000b0a: SUB 00000b0b: PUSH1 0x20 00000b0d: DUP2 00000b0e: LT 00000b0f: ISZERO 00000b10: PUSH2 0x0b18 00000b13: JUMPI 00000b14: PUSH1 0x00 00000b16: DUP1 00000b17: REVERT 00000b18: JUMPDEST 00000b19: POP 00000b1a: CALLDATALOAD 00000b1b: PUSH1 0x01 00000b1d: PUSH1 0x01 00000b1f: PUSH1 0xa0 00000b21: SHL 00000b22: SUB 00000b23: AND 00000b24: PUSH2 0x2360 00000b27: JUMP 00000b28: JUMPDEST 00000b29: CALLVALUE 00000b2a: DUP1 00000b2b: ISZERO 00000b2c: PUSH2 0x0b34 00000b2f: JUMPI 00000b30: PUSH1 0x00 00000b32: DUP1 00000b33: REVERT 00000b34: JUMPDEST 00000b35: POP 00000b36: PUSH2 0x0624 00000b39: PUSH2 0x237f 00000b3c: JUMP 00000b3d: JUMPDEST 00000b3e: CALLVALUE 00000b3f: DUP1 00000b40: ISZERO 00000b41: PUSH2 0x0b49 00000b44: JUMPI 00000b45: PUSH1 0x00 00000b47: DUP1 00000b48: REVERT 00000b49: JUMPDEST 00000b4a: POP 00000b4b: PUSH2 0x0437 00000b4e: PUSH2 0x2385 00000b51: JUMP 00000b52: JUMPDEST 00000b53: CALLVALUE 00000b54: DUP1 00000b55: ISZERO 00000b56: PUSH2 0x0b5e 00000b59: JUMPI 00000b5a: PUSH1 0x00 00000b5c: DUP1 00000b5d: REVERT 00000b5e: JUMPDEST 00000b5f: POP 00000b60: PUSH2 0x0624 00000b63: PUSH2 0x2393 00000b66: JUMP 00000b67: JUMPDEST 00000b68: CALLVALUE 00000b69: DUP1 00000b6a: ISZERO 00000b6b: PUSH2 0x0b73 00000b6e: JUMPI 00000b6f: PUSH1 0x00 00000b71: DUP1 00000b72: REVERT 00000b73: JUMPDEST 00000b74: POP 00000b75: PUSH2 0x0624 00000b78: PUSH2 0x2399 00000b7b: JUMP 00000b7c: JUMPDEST 00000b7d: PUSH2 0x03c9 00000b80: PUSH1 0x04 00000b82: DUP1 00000b83: CALLDATASIZE 00000b84: SUB 00000b85: PUSH1 0x80 00000b87: DUP2 00000b88: LT 00000b89: ISZERO 00000b8a: PUSH2 0x0b92 00000b8d: JUMPI 00000b8e: PUSH1 0x00 00000b90: DUP1 00000b91: REVERT 00000b92: JUMPDEST 00000b93: POP 00000b94: DUP1 00000b95: CALLDATALOAD 00000b96: SWAP1 00000b97: PUSH1 0x20 00000b99: DUP2 00000b9a: ADD 00000b9b: CALLDATALOAD 00000b9c: SWAP1 00000b9d: PUSH1 0x01 00000b9f: PUSH1 0x01 00000ba1: PUSH1 0xa0 00000ba3: SHL 00000ba4: SUB 00000ba5: PUSH1 0x40 00000ba7: DUP3 00000ba8: ADD 00000ba9: CALLDATALOAD 00000baa: DUP2 00000bab: AND 00000bac: SWAP2 00000bad: PUSH1 0x60 00000baf: ADD 00000bb0: CALLDATALOAD 00000bb1: AND 00000bb2: PUSH2 0x239f 00000bb5: JUMP 00000bb6: JUMPDEST 00000bb7: CALLVALUE 00000bb8: DUP1 00000bb9: ISZERO 00000bba: PUSH2 0x0bc2 00000bbd: JUMPI 00000bbe: PUSH1 0x00 00000bc0: DUP1 00000bc1: REVERT 00000bc2: JUMPDEST 00000bc3: POP 00000bc4: PUSH2 0x0624 00000bc7: PUSH2 0x241f 00000bca: JUMP 00000bcb: JUMPDEST 00000bcc: CALLVALUE 00000bcd: DUP1 00000bce: ISZERO 00000bcf: PUSH2 0x0bd7 00000bd2: JUMPI 00000bd3: PUSH1 0x00 00000bd5: DUP1 00000bd6: REVERT 00000bd7: JUMPDEST 00000bd8: POP 00000bd9: PUSH2 0x0624 00000bdc: PUSH2 0x2425 00000bdf: JUMP 00000be0: JUMPDEST 00000be1: CALLVALUE 00000be2: DUP1 00000be3: ISZERO 00000be4: PUSH2 0x0bec 00000be7: JUMPI 00000be8: PUSH1 0x00 00000bea: DUP1 00000beb: REVERT 00000bec: JUMPDEST 00000bed: POP 00000bee: PUSH2 0x03c9 00000bf1: PUSH1 0x04 00000bf3: DUP1 00000bf4: CALLDATASIZE 00000bf5: SUB 00000bf6: PUSH1 0xe0 00000bf8: DUP2 00000bf9: LT 00000bfa: ISZERO 00000bfb: PUSH2 0x0c03 00000bfe: JUMPI 00000bff: PUSH1 0x00 00000c01: DUP1 00000c02: REVERT 00000c03: JUMPDEST 00000c04: DUP2 00000c05: CALLDATALOAD 00000c06: SWAP2 00000c07: PUSH1 0x20 00000c09: DUP2 00000c0a: ADD 00000c0b: CALLDATALOAD 00000c0c: SWAP2 00000c0d: PUSH1 0x40 00000c0f: DUP3 00000c10: ADD 00000c11: CALLDATALOAD 00000c12: SWAP2 00000c13: PUSH1 0x60 00000c15: DUP2 00000c16: ADD 00000c17: CALLDATALOAD 00000c18: SWAP2 00000c19: PUSH1 0x80 00000c1b: DUP3 00000c1c: ADD 00000c1d: CALLDATALOAD 00000c1e: SWAP2 00000c1f: PUSH1 0x01 00000c21: PUSH1 0x01 00000c23: PUSH1 0xa0 00000c25: SHL 00000c26: SUB 00000c27: PUSH1 0xa0 00000c29: DUP3 00000c2a: ADD 00000c2b: CALLDATALOAD 00000c2c: AND 00000c2d: SWAP2 00000c2e: DUP2 00000c2f: ADD 00000c30: SWAP1 00000c31: PUSH1 0xe0 00000c33: DUP2 00000c34: ADD 00000c35: PUSH1 0xc0 00000c37: DUP3 00000c38: ADD 00000c39: CALLDATALOAD 00000c3a: PUSH5 0x0100000000 00000c40: DUP2 00000c41: GT 00000c42: ISZERO 00000c43: PUSH2 0x0c4b 00000c46: JUMPI 00000c47: PUSH1 0x00 00000c49: DUP1 00000c4a: REVERT 00000c4b: JUMPDEST 00000c4c: DUP3 00000c4d: ADD 00000c4e: DUP4 00000c4f: PUSH1 0x20 00000c51: DUP3 00000c52: ADD 00000c53: GT 00000c54: ISZERO 00000c55: PUSH2 0x0c5d 00000c58: JUMPI 00000c59: PUSH1 0x00 00000c5b: DUP1 00000c5c: REVERT 00000c5d: JUMPDEST 00000c5e: DUP1 00000c5f: CALLDATALOAD 00000c60: SWAP1 00000c61: PUSH1 0x20 00000c63: ADD 00000c64: SWAP2 00000c65: DUP5 00000c66: PUSH1 0x01 00000c68: DUP4 00000c69: MUL 00000c6a: DUP5 00000c6b: ADD 00000c6c: GT 00000c6d: PUSH5 0x0100000000 00000c73: DUP4 00000c74: GT 00000c75: OR 00000c76: ISZERO 00000c77: PUSH2 0x0c7f 00000c7a: JUMPI 00000c7b: PUSH1 0x00 00000c7d: DUP1 00000c7e: REVERT 00000c7f: JUMPDEST 00000c80: SWAP2 00000c81: SWAP1 00000c82: DUP1 00000c83: DUP1 00000c84: PUSH1 0x1f 00000c86: ADD 00000c87: PUSH1 0x20 00000c89: DUP1 00000c8a: SWAP2 00000c8b: DIV 00000c8c: MUL 00000c8d: PUSH1 0x20 00000c8f: ADD 00000c90: PUSH1 0x40 00000c92: MLOAD 00000c93: SWAP1 00000c94: DUP2 00000c95: ADD 00000c96: PUSH1 0x40 00000c98: MSTORE 00000c99: DUP1 00000c9a: SWAP4 00000c9b: SWAP3 00000c9c: SWAP2 00000c9d: SWAP1 00000c9e: DUP2 00000c9f: DUP2 00000ca0: MSTORE 00000ca1: PUSH1 0x20 00000ca3: ADD 00000ca4: DUP4 00000ca5: DUP4 00000ca6: DUP1 00000ca7: DUP3 00000ca8: DUP5 00000ca9: CALLDATACOPY 00000caa: PUSH1 0x00 00000cac: SWAP3 00000cad: ADD 00000cae: SWAP2 00000caf: SWAP1 00000cb0: SWAP2 00000cb1: MSTORE 00000cb2: POP 00000cb3: SWAP3 00000cb4: SWAP6 00000cb5: POP 00000cb6: PUSH2 0x242b 00000cb9: SWAP5 00000cba: POP 00000cbb: POP 00000cbc: POP 00000cbd: POP 00000cbe: POP 00000cbf: JUMP 00000cc0: JUMPDEST 00000cc1: CALLVALUE 00000cc2: DUP1 00000cc3: ISZERO 00000cc4: PUSH2 0x0ccc 00000cc7: JUMPI 00000cc8: PUSH1 0x00 00000cca: DUP1 00000ccb: REVERT 00000ccc: JUMPDEST 00000ccd: POP 00000cce: PUSH2 0x03c9 00000cd1: PUSH1 0x04 00000cd3: DUP1 00000cd4: CALLDATASIZE 00000cd5: SUB 00000cd6: PUSH2 0x0140 00000cd9: DUP2 00000cda: LT 00000cdb: ISZERO 00000cdc: PUSH2 0x0ce4 00000cdf: JUMPI 00000ce0: PUSH1 0x00 00000ce2: DUP1 00000ce3: REVERT 00000ce4: JUMPDEST 00000ce5: DUP2 00000ce6: CALLDATALOAD 00000ce7: SWAP2 00000ce8: PUSH1 0x20 00000cea: DUP2 00000ceb: ADD 00000cec: CALLDATALOAD 00000ced: SWAP2 00000cee: PUSH1 0x40 00000cf0: DUP3 00000cf1: ADD 00000cf2: CALLDATALOAD 00000cf3: SWAP2 00000cf4: PUSH1 0x60 00000cf6: DUP2 00000cf7: ADD 00000cf8: CALLDATALOAD 00000cf9: SWAP2 00000cfa: PUSH1 0x80 00000cfc: DUP3 00000cfd: ADD 00000cfe: CALLDATALOAD 00000cff: SWAP2 00000d00: PUSH1 0xa0 00000d02: DUP2 00000d03: ADD 00000d04: CALLDATALOAD 00000d05: SWAP2 00000d06: PUSH1 0xc0 00000d08: DUP3 00000d09: ADD 00000d0a: CALLDATALOAD 00000d0b: SWAP2 00000d0c: PUSH1 0xe0 00000d0e: DUP2 00000d0f: ADD 00000d10: CALLDATALOAD 00000d11: SWAP2 00000d12: PUSH1 0x01 00000d14: PUSH1 0x01 00000d16: PUSH1 0xa0 00000d18: SHL 00000d19: SUB 00000d1a: PUSH2 0x0100 00000d1d: DUP4 00000d1e: ADD 00000d1f: CALLDATALOAD 00000d20: AND 00000d21: SWAP2 00000d22: SWAP1 00000d23: DUP2 00000d24: ADD 00000d25: SWAP1 00000d26: PUSH2 0x0140 00000d29: DUP2 00000d2a: ADD 00000d2b: PUSH2 0x0120 00000d2e: DUP3 00000d2f: ADD 00000d30: CALLDATALOAD 00000d31: PUSH5 0x0100000000 00000d37: DUP2 00000d38: GT 00000d39: ISZERO 00000d3a: PUSH2 0x0d42 00000d3d: JUMPI 00000d3e: PUSH1 0x00 00000d40: DUP1 00000d41: REVERT 00000d42: JUMPDEST 00000d43: DUP3 00000d44: ADD 00000d45: DUP4 00000d46: PUSH1 0x20 00000d48: DUP3 00000d49: ADD 00000d4a: GT 00000d4b: ISZERO 00000d4c: PUSH2 0x0d54 00000d4f: JUMPI 00000d50: PUSH1 0x00 00000d52: DUP1 00000d53: REVERT 00000d54: JUMPDEST 00000d55: DUP1 00000d56: CALLDATALOAD 00000d57: SWAP1 00000d58: PUSH1 0x20 00000d5a: ADD 00000d5b: SWAP2 00000d5c: DUP5 00000d5d: PUSH1 0x01 00000d5f: DUP4 00000d60: MUL 00000d61: DUP5 00000d62: ADD 00000d63: GT 00000d64: PUSH5 0x0100000000 00000d6a: DUP4 00000d6b: GT 00000d6c: OR 00000d6d: ISZERO 00000d6e: PUSH2 0x0d76 00000d71: JUMPI 00000d72: PUSH1 0x00 00000d74: DUP1 00000d75: REVERT 00000d76: JUMPDEST 00000d77: SWAP2 00000d78: SWAP1 00000d79: DUP1 00000d7a: DUP1 00000d7b: PUSH1 0x1f 00000d7d: ADD 00000d7e: PUSH1 0x20 00000d80: DUP1 00000d81: SWAP2 00000d82: DIV 00000d83: MUL 00000d84: PUSH1 0x20 00000d86: ADD 00000d87: PUSH1 0x40 00000d89: MLOAD 00000d8a: SWAP1 00000d8b: DUP2 00000d8c: ADD 00000d8d: PUSH1 0x40 00000d8f: MSTORE 00000d90: DUP1 00000d91: SWAP4 00000d92: SWAP3 00000d93: SWAP2 00000d94: SWAP1 00000d95: DUP2 00000d96: DUP2 00000d97: MSTORE 00000d98: PUSH1 0x20 00000d9a: ADD 00000d9b: DUP4 00000d9c: DUP4 00000d9d: DUP1 00000d9e: DUP3 00000d9f: DUP5 00000da0: CALLDATACOPY 00000da1: PUSH1 0x00 00000da3: SWAP3 00000da4: ADD 00000da5: SWAP2 00000da6: SWAP1 00000da7: SWAP2 00000da8: MSTORE 00000da9: POP 00000daa: SWAP3 00000dab: SWAP6 00000dac: POP 00000dad: PUSH2 0x256e 00000db0: SWAP5 00000db1: POP 00000db2: POP 00000db3: POP 00000db4: POP 00000db5: POP 00000db6: JUMP 00000db7: JUMPDEST 00000db8: CALLVALUE 00000db9: DUP1 00000dba: ISZERO 00000dbb: PUSH2 0x0dc3 00000dbe: JUMPI 00000dbf: PUSH1 0x00 00000dc1: DUP1 00000dc2: REVERT 00000dc3: JUMPDEST 00000dc4: POP 00000dc5: PUSH2 0x0624 00000dc8: PUSH2 0x2987 00000dcb: JUMP 00000dcc: JUMPDEST 00000dcd: CALLVALUE 00000dce: DUP1 00000dcf: ISZERO 00000dd0: PUSH2 0x0dd8 00000dd3: JUMPI 00000dd4: PUSH1 0x00 00000dd6: DUP1 00000dd7: REVERT 00000dd8: JUMPDEST 00000dd9: POP 00000dda: PUSH2 0x0460 00000ddd: PUSH2 0x298d 00000de0: JUMP 00000de1: JUMPDEST 00000de2: CALLVALUE 00000de3: DUP1 00000de4: ISZERO 00000de5: PUSH2 0x0ded 00000de8: JUMPI 00000de9: PUSH1 0x00 00000deb: DUP1 00000dec: REVERT 00000ded: JUMPDEST 00000dee: POP 00000def: PUSH2 0x0624 00000df2: PUSH2 0x29ee 00000df5: JUMP 00000df6: JUMPDEST 00000df7: CALLVALUE 00000df8: DUP1 00000df9: ISZERO 00000dfa: PUSH2 0x0e02 00000dfd: JUMPI 00000dfe: PUSH1 0x00 00000e00: DUP1 00000e01: REVERT 00000e02: JUMPDEST 00000e03: POP 00000e04: PUSH2 0x0437 00000e07: PUSH1 0x04 00000e09: DUP1 00000e0a: CALLDATASIZE 00000e0b: SUB 00000e0c: PUSH1 0x40 00000e0e: DUP2 00000e0f: LT 00000e10: ISZERO 00000e11: PUSH2 0x0e19 00000e14: JUMPI 00000e15: PUSH1 0x00 00000e17: DUP1 00000e18: REVERT 00000e19: JUMPDEST 00000e1a: POP 00000e1b: PUSH1 0x01 00000e1d: PUSH1 0x01 00000e1f: PUSH1 0xa0 00000e21: SHL 00000e22: SUB 00000e23: DUP2 00000e24: CALLDATALOAD 00000e25: AND 00000e26: SWAP1 00000e27: PUSH1 0x20 00000e29: ADD 00000e2a: CALLDATALOAD 00000e2b: PUSH2 0x29f4 00000e2e: JUMP 00000e2f: JUMPDEST 00000e30: CALLVALUE 00000e31: DUP1 00000e32: ISZERO 00000e33: PUSH2 0x0e3b 00000e36: JUMPI 00000e37: PUSH1 0x00 00000e39: DUP1 00000e3a: REVERT 00000e3b: JUMPDEST 00000e3c: POP 00000e3d: PUSH2 0x0624 00000e40: PUSH2 0x2a5c 00000e43: JUMP 00000e44: JUMPDEST 00000e45: CALLVALUE 00000e46: DUP1 00000e47: ISZERO 00000e48: PUSH2 0x0e50 00000e4b: JUMPI 00000e4c: PUSH1 0x00 00000e4e: DUP1 00000e4f: REVERT 00000e50: JUMPDEST 00000e51: POP 00000e52: PUSH2 0x0437 00000e55: PUSH1 0x04 00000e57: DUP1 00000e58: CALLDATASIZE 00000e59: SUB 00000e5a: PUSH1 0x40 00000e5c: DUP2 00000e5d: LT 00000e5e: ISZERO 00000e5f: PUSH2 0x0e67 00000e62: JUMPI 00000e63: PUSH1 0x00 00000e65: DUP1 00000e66: REVERT 00000e67: JUMPDEST 00000e68: POP 00000e69: PUSH1 0x01 00000e6b: PUSH1 0x01 00000e6d: PUSH1 0xa0 00000e6f: SHL 00000e70: SUB 00000e71: DUP2 00000e72: CALLDATALOAD 00000e73: AND 00000e74: SWAP1 00000e75: PUSH1 0x20 00000e77: ADD 00000e78: CALLDATALOAD 00000e79: PUSH2 0x2a62 00000e7c: JUMP 00000e7d: JUMPDEST 00000e7e: CALLVALUE 00000e7f: DUP1 00000e80: ISZERO 00000e81: PUSH2 0x0e89 00000e84: JUMPI 00000e85: PUSH1 0x00 00000e87: DUP1 00000e88: REVERT 00000e89: JUMPDEST 00000e8a: POP 00000e8b: PUSH2 0x0624 00000e8e: PUSH2 0x2a76 00000e91: JUMP 00000e92: JUMPDEST 00000e93: CALLVALUE 00000e94: DUP1 00000e95: ISZERO 00000e96: PUSH2 0x0e9e 00000e99: JUMPI 00000e9a: PUSH1 0x00 00000e9c: DUP1 00000e9d: REVERT 00000e9e: JUMPDEST 00000e9f: POP 00000ea0: PUSH2 0x0624 00000ea3: PUSH2 0x2a7c 00000ea6: JUMP 00000ea7: JUMPDEST 00000ea8: CALLVALUE 00000ea9: DUP1 00000eaa: ISZERO 00000eab: PUSH2 0x0eb3 00000eae: JUMPI 00000eaf: PUSH1 0x00 00000eb1: DUP1 00000eb2: REVERT 00000eb3: JUMPDEST 00000eb4: POP 00000eb5: PUSH2 0x0624 00000eb8: PUSH2 0x2a82 00000ebb: JUMP 00000ebc: JUMPDEST 00000ebd: CALLVALUE 00000ebe: DUP1 00000ebf: ISZERO 00000ec0: PUSH2 0x0ec8 00000ec3: JUMPI 00000ec4: PUSH1 0x00 00000ec6: DUP1 00000ec7: REVERT 00000ec8: JUMPDEST 00000ec9: POP 00000eca: PUSH2 0x03c9 00000ecd: PUSH1 0x04 00000ecf: DUP1 00000ed0: CALLDATASIZE 00000ed1: SUB 00000ed2: PUSH1 0x40 00000ed4: DUP2 00000ed5: LT 00000ed6: ISZERO 00000ed7: PUSH2 0x0edf 00000eda: JUMPI 00000edb: PUSH1 0x00 00000edd: DUP1 00000ede: REVERT 00000edf: JUMPDEST 00000ee0: DUP2 00000ee1: ADD 00000ee2: SWAP1 00000ee3: PUSH1 0x20 00000ee5: DUP2 00000ee6: ADD 00000ee7: DUP2 00000ee8: CALLDATALOAD 00000ee9: PUSH5 0x0100000000 00000eef: DUP2 00000ef0: GT 00000ef1: ISZERO 00000ef2: PUSH2 0x0efa 00000ef5: JUMPI 00000ef6: PUSH1 0x00 00000ef8: DUP1 00000ef9: REVERT 00000efa: JUMPDEST 00000efb: DUP3 00000efc: ADD 00000efd: DUP4 00000efe: PUSH1 0x20 00000f00: DUP3 00000f01: ADD 00000f02: GT 00000f03: ISZERO 00000f04: PUSH2 0x0f0c 00000f07: JUMPI 00000f08: PUSH1 0x00 00000f0a: DUP1 00000f0b: REVERT 00000f0c: JUMPDEST 00000f0d: DUP1 00000f0e: CALLDATALOAD 00000f0f: SWAP1 00000f10: PUSH1 0x20 00000f12: ADD 00000f13: SWAP2 00000f14: DUP5 00000f15: PUSH1 0x20 00000f17: DUP4 00000f18: MUL 00000f19: DUP5 00000f1a: ADD 00000f1b: GT 00000f1c: PUSH5 0x0100000000 00000f22: DUP4 00000f23: GT 00000f24: OR 00000f25: ISZERO 00000f26: PUSH2 0x0f2e 00000f29: JUMPI 00000f2a: PUSH1 0x00 00000f2c: DUP1 00000f2d: REVERT 00000f2e: JUMPDEST 00000f2f: SWAP2 00000f30: SWAP4 00000f31: SWAP1 00000f32: SWAP3 00000f33: SWAP1 00000f34: SWAP2 00000f35: PUSH1 0x20 00000f37: DUP2 00000f38: ADD 00000f39: SWAP1 00000f3a: CALLDATALOAD 00000f3b: PUSH5 0x0100000000 00000f41: DUP2 00000f42: GT 00000f43: ISZERO 00000f44: PUSH2 0x0f4c 00000f47: JUMPI 00000f48: PUSH1 0x00 00000f4a: DUP1 00000f4b: REVERT 00000f4c: JUMPDEST 00000f4d: DUP3 00000f4e: ADD 00000f4f: DUP4 00000f50: PUSH1 0x20 00000f52: DUP3 00000f53: ADD 00000f54: GT 00000f55: ISZERO 00000f56: PUSH2 0x0f5e 00000f59: JUMPI 00000f5a: PUSH1 0x00 00000f5c: DUP1 00000f5d: REVERT 00000f5e: JUMPDEST 00000f5f: DUP1 00000f60: CALLDATALOAD 00000f61: SWAP1 00000f62: PUSH1 0x20 00000f64: ADD 00000f65: SWAP2 00000f66: DUP5 00000f67: PUSH1 0x20 00000f69: DUP4 00000f6a: MUL 00000f6b: DUP5 00000f6c: ADD 00000f6d: GT 00000f6e: PUSH5 0x0100000000 00000f74: DUP4 00000f75: GT 00000f76: OR 00000f77: ISZERO 00000f78: PUSH2 0x0f80 00000f7b: JUMPI 00000f7c: PUSH1 0x00 00000f7e: DUP1 00000f7f: REVERT 00000f80: JUMPDEST 00000f81: POP 00000f82: SWAP1 00000f83: SWAP3 00000f84: POP 00000f85: SWAP1 00000f86: POP 00000f87: PUSH2 0x2a88 00000f8a: JUMP 00000f8b: JUMPDEST 00000f8c: CALLVALUE 00000f8d: DUP1 00000f8e: ISZERO 00000f8f: PUSH2 0x0f97 00000f92: JUMPI 00000f93: PUSH1 0x00 00000f95: DUP1 00000f96: REVERT 00000f97: JUMPDEST 00000f98: POP 00000f99: PUSH2 0x0fa0 00000f9c: PUSH2 0x2afb 00000f9f: JUMP 00000fa0: JUMPDEST 00000fa1: PUSH1 0x40 00000fa3: DUP1 00000fa4: MLOAD 00000fa5: PUSH1 0x20 00000fa7: DUP1 00000fa8: DUP3 00000fa9: MSTORE 00000faa: DUP4 00000fab: MLOAD 00000fac: DUP2 00000fad: DUP4 00000fae: ADD 00000faf: MSTORE 00000fb0: DUP4 00000fb1: MLOAD 00000fb2: SWAP2 00000fb3: SWAP3 00000fb4: DUP4 00000fb5: SWAP3 00000fb6: SWAP1 00000fb7: DUP4 00000fb8: ADD 00000fb9: SWAP2 00000fba: DUP6 00000fbb: DUP2 00000fbc: ADD 00000fbd: SWAP2 00000fbe: MUL 00000fbf: DUP1 00000fc0: DUP4 00000fc1: DUP4 00000fc2: PUSH1 0x00 00000fc4: JUMPDEST 00000fc5: DUP4 00000fc6: DUP2 00000fc7: LT 00000fc8: ISZERO 00000fc9: PUSH2 0x0fdc 00000fcc: JUMPI 00000fcd: DUP2 00000fce: DUP2 00000fcf: ADD 00000fd0: MLOAD 00000fd1: DUP4 00000fd2: DUP3 00000fd3: ADD 00000fd4: MSTORE 00000fd5: PUSH1 0x20 00000fd7: ADD 00000fd8: PUSH2 0x0fc4 00000fdb: JUMP 00000fdc: JUMPDEST 00000fdd: POP 00000fde: POP 00000fdf: POP 00000fe0: POP 00000fe1: SWAP1 00000fe2: POP 00000fe3: ADD 00000fe4: SWAP3 00000fe5: POP 00000fe6: POP 00000fe7: POP 00000fe8: PUSH1 0x40 00000fea: MLOAD 00000feb: DUP1 00000fec: SWAP2 00000fed: SUB 00000fee: SWAP1 00000fef: RETURN 00000ff0: JUMPDEST 00000ff1: CALLVALUE 00000ff2: DUP1 00000ff3: ISZERO 00000ff4: PUSH2 0x0ffc 00000ff7: JUMPI 00000ff8: PUSH1 0x00 00000ffa: DUP1 00000ffb: REVERT 00000ffc: JUMPDEST 00000ffd: POP 00000ffe: PUSH2 0x0fa0 00001001: PUSH2 0x2b5c 00001004: JUMP 00001005: JUMPDEST 00001006: CALLVALUE 00001007: DUP1 00001008: ISZERO 00001009: PUSH2 0x1011 0000100c: JUMPI 0000100d: PUSH1 0x00 0000100f: DUP1 00001010: REVERT 00001011: JUMPDEST 00001012: POP 00001013: PUSH2 0x0624 00001016: PUSH2 0x2bbc 00001019: JUMP 0000101a: JUMPDEST 0000101b: CALLVALUE 0000101c: DUP1 0000101d: ISZERO 0000101e: PUSH2 0x1026 00001021: JUMPI 00001022: PUSH1 0x00 00001024: DUP1 00001025: REVERT 00001026: JUMPDEST 00001027: POP 00001028: PUSH2 0x0624 0000102b: PUSH2 0x2bc2 0000102e: JUMP 0000102f: JUMPDEST 00001030: CALLVALUE 00001031: DUP1 00001032: ISZERO 00001033: PUSH2 0x103b 00001036: JUMPI 00001037: PUSH1 0x00 00001039: DUP1 0000103a: REVERT 0000103b: JUMPDEST 0000103c: POP 0000103d: PUSH2 0x0624 00001040: PUSH1 0x04 00001042: DUP1 00001043: CALLDATASIZE 00001044: SUB 00001045: PUSH1 0x20 00001047: DUP2 00001048: LT 00001049: ISZERO 0000104a: PUSH2 0x1052 0000104d: JUMPI 0000104e: PUSH1 0x00 00001050: DUP1 00001051: REVERT 00001052: JUMPDEST 00001053: POP 00001054: CALLDATALOAD 00001055: PUSH1 0x01 00001057: PUSH1 0x01 00001059: PUSH1 0xa0 0000105b: SHL 0000105c: SUB 0000105d: AND 0000105e: PUSH2 0x2bc8 00001061: JUMP 00001062: JUMPDEST 00001063: CALLVALUE 00001064: DUP1 00001065: ISZERO 00001066: PUSH2 0x106e 00001069: JUMPI 0000106a: PUSH1 0x00 0000106c: DUP1 0000106d: REVERT 0000106e: JUMPDEST 0000106f: POP 00001070: PUSH2 0x03c9 00001073: PUSH1 0x04 00001075: DUP1 00001076: CALLDATASIZE 00001077: SUB 00001078: PUSH2 0x0140 0000107b: DUP2 0000107c: LT 0000107d: ISZERO 0000107e: PUSH2 0x1086 00001081: JUMPI 00001082: PUSH1 0x00 00001084: DUP1 00001085: REVERT 00001086: JUMPDEST 00001087: DUP2 00001088: CALLDATALOAD 00001089: SWAP2 0000108a: PUSH1 0x20 0000108c: DUP2 0000108d: ADD 0000108e: CALLDATALOAD 0000108f: SWAP2 00001090: PUSH1 0x40 00001092: DUP3 00001093: ADD 00001094: CALLDATALOAD 00001095: SWAP2 00001096: PUSH1 0x60 00001098: DUP2 00001099: ADD 0000109a: CALLDATALOAD 0000109b: SWAP2 0000109c: PUSH1 0x80 0000109e: DUP3 0000109f: ADD 000010a0: CALLDATALOAD 000010a1: SWAP2 000010a2: PUSH1 0xa0 000010a4: DUP2 000010a5: ADD 000010a6: CALLDATALOAD 000010a7: SWAP2 000010a8: PUSH1 0x01 000010aa: PUSH1 0x01 000010ac: PUSH1 0xa0 000010ae: SHL 000010af: SUB 000010b0: PUSH1 0xc0 000010b2: DUP4 000010b3: ADD 000010b4: CALLDATALOAD 000010b5: DUP2 000010b6: AND 000010b7: SWAP3 000010b8: PUSH1 0xe0 000010ba: DUP2 000010bb: ADD 000010bc: CALLDATALOAD 000010bd: SWAP3 000010be: PUSH2 0x0100 000010c1: DUP3 000010c2: ADD 000010c3: CALLDATALOAD 000010c4: SWAP1 000010c5: SWAP3 000010c6: AND 000010c7: SWAP2 000010c8: DUP2 000010c9: ADD 000010ca: SWAP1 000010cb: PUSH2 0x0140 000010ce: DUP2 000010cf: ADD 000010d0: PUSH2 0x0120 000010d3: DUP3 000010d4: ADD 000010d5: CALLDATALOAD 000010d6: PUSH5 0x0100000000 000010dc: DUP2 000010dd: GT 000010de: ISZERO 000010df: PUSH2 0x10e7 000010e2: JUMPI 000010e3: PUSH1 0x00 000010e5: DUP1 000010e6: REVERT 000010e7: JUMPDEST 000010e8: DUP3 000010e9: ADD 000010ea: DUP4 000010eb: PUSH1 0x20 000010ed: DUP3 000010ee: ADD 000010ef: GT 000010f0: ISZERO 000010f1: PUSH2 0x10f9 000010f4: JUMPI 000010f5: PUSH1 0x00 000010f7: DUP1 000010f8: REVERT 000010f9: JUMPDEST 000010fa: DUP1 000010fb: CALLDATALOAD 000010fc: SWAP1 000010fd: PUSH1 0x20 000010ff: ADD 00001100: SWAP2 00001101: DUP5 00001102: PUSH1 0x01 00001104: DUP4 00001105: MUL 00001106: DUP5 00001107: ADD 00001108: GT 00001109: PUSH5 0x0100000000 0000110f: DUP4 00001110: GT 00001111: OR 00001112: ISZERO 00001113: PUSH2 0x111b 00001116: JUMPI 00001117: PUSH1 0x00 00001119: DUP1 0000111a: REVERT 0000111b: JUMPDEST 0000111c: SWAP2 0000111d: SWAP1 0000111e: DUP1 0000111f: DUP1 00001120: PUSH1 0x1f 00001122: ADD 00001123: PUSH1 0x20 00001125: DUP1 00001126: SWAP2 00001127: DIV 00001128: MUL 00001129: PUSH1 0x20 0000112b: ADD 0000112c: PUSH1 0x40 0000112e: MLOAD 0000112f: SWAP1 00001130: DUP2 00001131: ADD 00001132: PUSH1 0x40 00001134: MSTORE 00001135: DUP1 00001136: SWAP4 00001137: SWAP3 00001138: SWAP2 00001139: SWAP1 0000113a: DUP2 0000113b: DUP2 0000113c: MSTORE 0000113d: PUSH1 0x20 0000113f: ADD 00001140: DUP4 00001141: DUP4 00001142: DUP1 00001143: DUP3 00001144: DUP5 00001145: CALLDATACOPY 00001146: PUSH1 0x00 00001148: SWAP3 00001149: ADD 0000114a: SWAP2 0000114b: SWAP1 0000114c: SWAP2 0000114d: MSTORE 0000114e: POP 0000114f: SWAP3 00001150: SWAP6 00001151: POP 00001152: PUSH2 0x2d44 00001155: SWAP5 00001156: POP 00001157: POP 00001158: POP 00001159: POP 0000115a: POP 0000115b: JUMP 0000115c: JUMPDEST 0000115d: CALLVALUE 0000115e: DUP1 0000115f: ISZERO 00001160: PUSH2 0x1168 00001163: JUMPI 00001164: PUSH1 0x00 00001166: DUP1 00001167: REVERT 00001168: JUMPDEST 00001169: POP 0000116a: PUSH2 0x0624 0000116d: PUSH2 0x2eea 00001170: JUMP 00001171: JUMPDEST 00001172: CALLVALUE 00001173: DUP1 00001174: ISZERO 00001175: PUSH2 0x117d 00001178: JUMPI 00001179: PUSH1 0x00 0000117b: DUP1 0000117c: REVERT 0000117d: JUMPDEST 0000117e: POP 0000117f: PUSH2 0x03c9 00001182: PUSH1 0x04 00001184: DUP1 00001185: CALLDATASIZE 00001186: SUB 00001187: PUSH2 0x0160 0000118a: DUP2 0000118b: LT 0000118c: ISZERO 0000118d: PUSH2 0x1195 00001190: JUMPI 00001191: PUSH1 0x00 00001193: DUP1 00001194: REVERT 00001195: JUMPDEST 00001196: DUP2 00001197: CALLDATALOAD 00001198: SWAP2 00001199: PUSH1 0x20 0000119b: DUP2 0000119c: ADD 0000119d: CALLDATALOAD 0000119e: SWAP2 0000119f: PUSH1 0x40 000011a1: DUP3 000011a2: ADD 000011a3: CALLDATALOAD 000011a4: SWAP2 000011a5: PUSH1 0x60 000011a7: DUP2 000011a8: ADD 000011a9: CALLDATALOAD 000011aa: SWAP2 000011ab: PUSH1 0x80 000011ad: DUP3 000011ae: ADD 000011af: CALLDATALOAD 000011b0: ISZERO 000011b1: ISZERO 000011b2: SWAP2 000011b3: PUSH1 0x01 000011b5: PUSH1 0x01 000011b7: PUSH1 0xa0 000011b9: SHL 000011ba: SUB 000011bb: PUSH1 0xa0 000011bd: DUP3 000011be: ADD 000011bf: CALLDATALOAD 000011c0: DUP2 000011c1: AND 000011c2: SWAP3 000011c3: PUSH1 0xc0 000011c5: DUP4 000011c6: ADD 000011c7: CALLDATALOAD 000011c8: SWAP3 000011c9: PUSH1 0xe0 000011cb: DUP2 000011cc: ADD 000011cd: CALLDATALOAD 000011ce: SWAP3 000011cf: PUSH2 0x0100 000011d2: DUP3 000011d3: ADD 000011d4: CALLDATALOAD 000011d5: SWAP3 000011d6: PUSH2 0x0120 000011d9: DUP4 000011da: ADD 000011db: CALLDATALOAD 000011dc: SWAP1 000011dd: SWAP2 000011de: AND 000011df: SWAP2 000011e0: SWAP1 000011e1: DUP2 000011e2: ADD 000011e3: SWAP1 000011e4: PUSH2 0x0160 000011e7: DUP2 000011e8: ADD 000011e9: PUSH2 0x0140 000011ec: DUP3 000011ed: ADD 000011ee: CALLDATALOAD 000011ef: PUSH5 0x0100000000 000011f5: DUP2 000011f6: GT 000011f7: ISZERO 000011f8: PUSH2 0x1200 000011fb: JUMPI 000011fc: PUSH1 0x00 000011fe: DUP1 000011ff: REVERT 00001200: JUMPDEST 00001201: DUP3 00001202: ADD 00001203: DUP4 00001204: PUSH1 0x20 00001206: DUP3 00001207: ADD 00001208: GT 00001209: ISZERO 0000120a: PUSH2 0x1212 0000120d: JUMPI 0000120e: PUSH1 0x00 00001210: DUP1 00001211: REVERT 00001212: JUMPDEST 00001213: DUP1 00001214: CALLDATALOAD 00001215: SWAP1 00001216: PUSH1 0x20 00001218: ADD 00001219: SWAP2 0000121a: DUP5 0000121b: PUSH1 0x01 0000121d: DUP4 0000121e: MUL 0000121f: DUP5 00001220: ADD 00001221: GT 00001222: PUSH5 0x0100000000 00001228: DUP4 00001229: GT 0000122a: OR 0000122b: ISZERO 0000122c: PUSH2 0x1234 0000122f: JUMPI 00001230: PUSH1 0x00 00001232: DUP1 00001233: REVERT 00001234: JUMPDEST 00001235: SWAP2 00001236: SWAP1 00001237: DUP1 00001238: DUP1 00001239: PUSH1 0x1f 0000123b: ADD 0000123c: PUSH1 0x20 0000123e: DUP1 0000123f: SWAP2 00001240: DIV 00001241: MUL 00001242: PUSH1 0x20 00001244: ADD 00001245: PUSH1 0x40 00001247: MLOAD 00001248: SWAP1 00001249: DUP2 0000124a: ADD 0000124b: PUSH1 0x40 0000124d: MSTORE 0000124e: DUP1 0000124f: SWAP4 00001250: SWAP3 00001251: SWAP2 00001252: SWAP1 00001253: DUP2 00001254: DUP2 00001255: MSTORE 00001256: PUSH1 0x20 00001258: ADD 00001259: DUP4 0000125a: DUP4 0000125b: DUP1 0000125c: DUP3 0000125d: DUP5 0000125e: CALLDATACOPY 0000125f: PUSH1 0x00 00001261: SWAP3 00001262: ADD 00001263: SWAP2 00001264: SWAP1 00001265: SWAP2 00001266: MSTORE 00001267: POP 00001268: SWAP3 00001269: SWAP6 0000126a: POP 0000126b: PUSH2 0x2ef0 0000126e: SWAP5 0000126f: POP 00001270: POP 00001271: POP 00001272: POP 00001273: POP 00001274: JUMP 00001275: JUMPDEST 00001276: CALLVALUE 00001277: DUP1 00001278: ISZERO 00001279: PUSH2 0x1281 0000127c: JUMPI 0000127d: PUSH1 0x00 0000127f: DUP1 00001280: REVERT 00001281: JUMPDEST 00001282: POP 00001283: PUSH2 0x0624 00001286: PUSH2 0x3011 00001289: JUMP 0000128a: JUMPDEST 0000128b: CALLVALUE 0000128c: DUP1 0000128d: ISZERO 0000128e: PUSH2 0x1296 00001291: JUMPI 00001292: PUSH1 0x00 00001294: DUP1 00001295: REVERT 00001296: JUMPDEST 00001297: POP 00001298: PUSH2 0x03c9 0000129b: PUSH1 0x04 0000129d: DUP1 0000129e: CALLDATASIZE 0000129f: SUB 000012a0: PUSH1 0xa0 000012a2: DUP2 000012a3: LT 000012a4: ISZERO 000012a5: PUSH2 0x12ad 000012a8: JUMPI 000012a9: PUSH1 0x00 000012ab: DUP1 000012ac: REVERT 000012ad: JUMPDEST 000012ae: POP 000012af: DUP1 000012b0: CALLDATALOAD 000012b1: SWAP1 000012b2: PUSH1 0x20 000012b4: DUP2 000012b5: ADD 000012b6: CALLDATALOAD 000012b7: SWAP1 000012b8: PUSH1 0x01 000012ba: PUSH1 0x01 000012bc: PUSH1 0xa0 000012be: SHL 000012bf: SUB 000012c0: PUSH1 0x40 000012c2: DUP3 000012c3: ADD 000012c4: CALLDATALOAD 000012c5: DUP2 000012c6: AND 000012c7: SWAP2 000012c8: PUSH1 0x60 000012ca: DUP2 000012cb: ADD 000012cc: CALLDATALOAD 000012cd: ISZERO 000012ce: ISZERO 000012cf: SWAP2 000012d0: PUSH1 0x80 000012d2: SWAP1 000012d3: SWAP2 000012d4: ADD 000012d5: CALLDATALOAD 000012d6: AND 000012d7: PUSH2 0x3017 000012da: JUMP 000012db: JUMPDEST 000012dc: CALLVALUE 000012dd: DUP1 000012de: ISZERO 000012df: PUSH2 0x12e7 000012e2: JUMPI 000012e3: PUSH1 0x00 000012e5: DUP1 000012e6: REVERT 000012e7: JUMPDEST 000012e8: POP 000012e9: PUSH2 0x0624 000012ec: PUSH1 0x04 000012ee: DUP1 000012ef: CALLDATASIZE 000012f0: SUB 000012f1: PUSH1 0x40 000012f3: DUP2 000012f4: LT 000012f5: ISZERO 000012f6: PUSH2 0x12fe 000012f9: JUMPI 000012fa: PUSH1 0x00 000012fc: DUP1 000012fd: REVERT 000012fe: JUMPDEST 000012ff: POP 00001300: PUSH1 0x01 00001302: PUSH1 0x01 00001304: PUSH1 0xa0 00001306: SHL 00001307: SUB 00001308: DUP2 00001309: CALLDATALOAD 0000130a: DUP2 0000130b: AND 0000130c: SWAP2 0000130d: PUSH1 0x20 0000130f: ADD 00001310: CALLDATALOAD 00001311: AND 00001312: PUSH2 0x311f 00001315: JUMP 00001316: JUMPDEST 00001317: CALLVALUE 00001318: DUP1 00001319: ISZERO 0000131a: PUSH2 0x1322 0000131d: JUMPI 0000131e: PUSH1 0x00 00001320: DUP1 00001321: REVERT 00001322: JUMPDEST 00001323: POP 00001324: PUSH2 0x0624 00001327: PUSH2 0x314a 0000132a: JUMP 0000132b: JUMPDEST 0000132c: CALLVALUE 0000132d: DUP1 0000132e: ISZERO 0000132f: PUSH2 0x1337 00001332: JUMPI 00001333: PUSH1 0x00 00001335: DUP1 00001336: REVERT 00001337: JUMPDEST 00001338: POP 00001339: PUSH2 0x03e8 0000133c: PUSH2 0x3150 0000133f: JUMP 00001340: JUMPDEST 00001341: CALLVALUE 00001342: DUP1 00001343: ISZERO 00001344: PUSH2 0x134c 00001347: JUMPI 00001348: PUSH1 0x00 0000134a: DUP1 0000134b: REVERT 0000134c: JUMPDEST 0000134d: POP 0000134e: PUSH2 0x03e8 00001351: PUSH2 0x315f 00001354: JUMP 00001355: JUMPDEST 00001356: PUSH2 0x135d 00001359: PUSH2 0x136d 0000135c: JUMP 0000135d: JUMPDEST 0000135e: PUSH2 0x136d 00001361: PUSH2 0x1368 00001364: PUSH2 0x316e 00001367: JUMP 00001368: JUMPDEST 00001369: PUSH2 0x3236 0000136c: JUMP 0000136d: JUMPDEST 0000136e: JUMP 0000136f: JUMPDEST 00001370: PUSH1 0x69 00001372: SLOAD 00001373: PUSH1 0x01 00001375: PUSH1 0x01 00001377: PUSH1 0xa0 00001379: SHL 0000137a: SUB 0000137b: AND 0000137c: DUP2 0000137d: JUMP 0000137e: JUMPDEST 0000137f: PUSH1 0x82 00001381: PUSH1 0x20 00001383: MSTORE 00001384: PUSH1 0x00 00001386: SWAP1 00001387: DUP2 00001388: MSTORE 00001389: PUSH1 0x40 0000138b: SWAP1 0000138c: KECCAK256 0000138d: SLOAD 0000138e: PUSH1 0xff 00001390: AND 00001391: DUP2 00001392: JUMP 00001393: JUMPDEST 00001394: PUSH1 0x36 00001396: DUP1 00001397: SLOAD 00001398: PUSH1 0x40 0000139a: DUP1 0000139b: MLOAD 0000139c: PUSH1 0x20 0000139e: PUSH1 0x1f 000013a0: PUSH1 0x02 000013a2: PUSH1 0x00 000013a4: NOT 000013a5: PUSH2 0x0100 000013a8: PUSH1 0x01 000013aa: DUP9 000013ab: AND 000013ac: ISZERO 000013ad: MUL 000013ae: ADD 000013af: SWAP1 000013b0: SWAP6 000013b1: AND 000013b2: SWAP5 000013b3: SWAP1 000013b4: SWAP5 000013b5: DIV 000013b6: SWAP4 000013b7: DUP5 000013b8: ADD 000013b9: DUP2 000013ba: SWAP1 000013bb: DIV 000013bc: DUP2 000013bd: MUL 000013be: DUP3 000013bf: ADD 000013c0: DUP2 000013c1: ADD 000013c2: SWAP1 000013c3: SWAP3 000013c4: MSTORE 000013c5: DUP3 000013c6: DUP2 000013c7: MSTORE 000013c8: PUSH1 0x60 000013ca: SWAP4 000013cb: SWAP1 000013cc: SWAP3 000013cd: SWAP1 000013ce: SWAP2 000013cf: DUP4 000013d0: ADD 000013d1: DUP3 000013d2: DUP3 000013d3: DUP1 000013d4: ISZERO 000013d5: PUSH2 0x141f 000013d8: JUMPI 000013d9: DUP1 000013da: PUSH1 0x1f 000013dc: LT 000013dd: PUSH2 0x13f4 000013e0: JUMPI 000013e1: PUSH2 0x0100 000013e4: DUP1 000013e5: DUP4 000013e6: SLOAD 000013e7: DIV 000013e8: MUL 000013e9: DUP4 000013ea: MSTORE 000013eb: SWAP2 000013ec: PUSH1 0x20 000013ee: ADD 000013ef: SWAP2 000013f0: PUSH2 0x141f 000013f3: JUMP 000013f4: JUMPDEST 000013f5: DUP3 000013f6: ADD 000013f7: SWAP2 000013f8: SWAP1 000013f9: PUSH1 0x00 000013fb: MSTORE 000013fc: PUSH1 0x20 000013fe: PUSH1 0x00 00001400: KECCAK256 00001401: SWAP1 00001402: JUMPDEST 00001403: DUP2 00001404: SLOAD 00001405: DUP2 00001406: MSTORE 00001407: SWAP1 00001408: PUSH1 0x01 0000140a: ADD 0000140b: SWAP1 0000140c: PUSH1 0x20 0000140e: ADD 0000140f: DUP1 00001410: DUP4 00001411: GT 00001412: PUSH2 0x1402 00001415: JUMPI 00001416: DUP3 00001417: SWAP1 00001418: SUB 00001419: PUSH1 0x1f 0000141b: AND 0000141c: DUP3 0000141d: ADD 0000141e: SWAP2 0000141f: JUMPDEST 00001420: POP 00001421: POP 00001422: POP 00001423: POP 00001424: POP 00001425: SWAP1 00001426: POP 00001427: JUMPDEST 00001428: SWAP1 00001429: JUMP 0000142a: JUMPDEST 0000142b: PUSH1 0x00 0000142d: PUSH2 0x143e 00001430: PUSH2 0x1437 00001433: PUSH2 0x325a 00001436: JUMP 00001437: JUMPDEST 00001438: DUP5 00001439: DUP5 0000143a: PUSH2 0x325e 0000143d: JUMP 0000143e: JUMPDEST 0000143f: POP 00001440: PUSH1 0x01 00001442: JUMPDEST 00001443: SWAP3 00001444: SWAP2 00001445: POP 00001446: POP 00001447: JUMP 00001448: JUMPDEST 00001449: PUSH1 0x92 0000144b: SLOAD 0000144c: PUSH1 0xff 0000144e: AND 0000144f: DUP2 00001450: JUMP 00001451: JUMPDEST 00001452: PUSH1 0x90 00001454: SLOAD 00001455: PUSH1 0x00 00001457: SWAP1 00001458: PUSH1 0x01 0000145a: PUSH1 0x01 0000145c: PUSH1 0xa0 0000145e: SHL 0000145f: SUB 00001460: AND 00001461: PUSH2 0x146a 00001464: DUP5 00001465: DUP5 00001466: PUSH2 0x334a 00001469: JUMP 0000146a: JUMPDEST 0000146b: PUSH1 0x01 0000146d: PUSH1 0x01 0000146f: PUSH1 0xa0 00001471: SHL 00001472: SUB 00001473: AND 00001474: EQ 00001475: DUP1 00001476: ISZERO 00001477: PUSH2 0x148a 0000147a: JUMPI 0000147b: POP 0000147c: PUSH1 0x90 0000147e: SLOAD 0000147f: PUSH1 0x01 00001481: PUSH1 0x01 00001483: PUSH1 0xa0 00001485: SHL 00001486: SUB 00001487: AND 00001488: ISZERO 00001489: ISZERO 0000148a: JUMPDEST 0000148b: PUSH2 0x1495 0000148e: JUMPI 0000148f: PUSH1 0x00 00001491: PUSH2 0x149e 00001494: JUMP 00001495: JUMPDEST 00001496: PUSH4 0x0b135d3f 0000149b: PUSH1 0xe1 0000149d: SHL 0000149e: JUMPDEST 0000149f: SWAP4 000014a0: SWAP3 000014a1: POP 000014a2: POP 000014a3: POP 000014a4: JUMP 000014a5: JUMPDEST 000014a6: PUSH1 0x85 000014a8: SLOAD 000014a9: PUSH1 0xff 000014ab: AND 000014ac: DUP2 000014ad: JUMP 000014ae: JUMPDEST 000014af: PUSH1 0x35 000014b1: SLOAD 000014b2: SWAP1 000014b3: JUMP 000014b4: JUMPDEST 000014b5: PUSH1 0x00 000014b7: PUSH2 0x14c1 000014ba: DUP5 000014bb: DUP5 000014bc: DUP5 000014bd: PUSH2 0x33ca 000014c0: JUMP 000014c1: JUMPDEST 000014c2: PUSH2 0x1531 000014c5: DUP5 000014c6: PUSH2 0x14cd 000014c9: PUSH2 0x325a 000014cc: JUMP 000014cd: JUMPDEST 000014ce: PUSH2 0x152c 000014d1: DUP6 000014d2: PUSH1 0x40 000014d4: MLOAD 000014d5: DUP1 000014d6: PUSH1 0x60 000014d8: ADD 000014d9: PUSH1 0x40 000014db: MSTORE 000014dc: DUP1 000014dd: PUSH1 0x28 000014df: DUP2 000014e0: MSTORE 000014e1: PUSH1 0x20 000014e3: ADD 000014e4: PUSH2 0x5b13 000014e7: PUSH1 0x28 000014e9: SWAP2 000014ea: CODECOPY 000014eb: PUSH1 0x01 000014ed: PUSH1 0x01 000014ef: PUSH1 0xa0 000014f1: SHL 000014f2: SUB 000014f3: DUP11 000014f4: AND 000014f5: PUSH1 0x00 000014f7: SWAP1 000014f8: DUP2 000014f9: MSTORE 000014fa: PUSH1 0x34 000014fc: PUSH1 0x20 000014fe: MSTORE 000014ff: PUSH1 0x40 00001501: DUP2 00001502: KECCAK256 00001503: SWAP1 00001504: PUSH2 0x150b 00001507: PUSH2 0x325a 0000150a: JUMP 0000150b: JUMPDEST 0000150c: PUSH1 0x01 0000150e: PUSH1 0x01 00001510: PUSH1 0xa0 00001512: SHL 00001513: SUB 00001514: AND 00001515: DUP2 00001516: MSTORE 00001517: PUSH1 0x20 00001519: DUP2 0000151a: ADD 0000151b: SWAP2 0000151c: SWAP1 0000151d: SWAP2 0000151e: MSTORE 0000151f: PUSH1 0x40 00001521: ADD 00001522: PUSH1 0x00 00001524: KECCAK256 00001525: SLOAD 00001526: SWAP2 00001527: SWAP1 00001528: PUSH2 0x3527 0000152b: JUMP 0000152c: JUMPDEST 0000152d: PUSH2 0x325e 00001530: JUMP 00001531: JUMPDEST 00001532: POP 00001533: PUSH1 0x01 00001535: SWAP4 00001536: SWAP3 00001537: POP 00001538: POP 00001539: POP 0000153a: JUMP 0000153b: JUMPDEST 0000153c: PUSH1 0x7d 0000153e: SLOAD 0000153f: DUP2 00001540: JUMP 00001541: JUMPDEST 00001542: PUSH1 0x02 00001544: PUSH1 0x65 00001546: SLOAD 00001547: EQ 00001548: ISZERO 00001549: PUSH2 0x1599 0000154c: JUMPI 0000154d: PUSH1 0x40 0000154f: DUP1 00001550: MLOAD 00001551: PUSH3 0x461bcd 00001555: PUSH1 0xe5 00001557: SHL 00001558: DUP2 00001559: MSTORE 0000155a: PUSH1 0x20 0000155c: PUSH1 0x04 0000155e: DUP3 0000155f: ADD 00001560: MSTORE 00001561: PUSH1 0x1f 00001563: PUSH1 0x24 00001565: DUP3 00001566: ADD 00001567: MSTORE 00001568: PUSH32 0x5265656e7472616e637947756172643a207265656e7472616e742063616c6c00 00001589: PUSH1 0x44 0000158b: DUP3 0000158c: ADD 0000158d: MSTORE 0000158e: SWAP1 0000158f: MLOAD 00001590: SWAP1 00001591: DUP2 00001592: SWAP1 00001593: SUB 00001594: PUSH1 0x64 00001596: ADD 00001597: SWAP1 00001598: REVERT 00001599: JUMPDEST 0000159a: PUSH1 0x02 0000159c: PUSH1 0x65 0000159e: SSTORE 0000159f: PUSH2 0x15a8 000015a2: DUP5 000015a3: DUP9 000015a4: PUSH2 0x35be 000015a7: JUMP 000015a8: JUMPDEST 000015a9: PUSH1 0x40 000015ab: DUP1 000015ac: MLOAD 000015ad: PUSH32 0xd29d500304178a7a55901b6b67f2f14762edc14de19f872f4c0f68dd2ecdc136 000015ce: PUSH1 0x20 000015d0: DUP1 000015d1: DUP4 000015d2: ADD 000015d3: SWAP2 000015d4: SWAP1 000015d5: SWAP2 000015d6: MSTORE 000015d7: ADDRESS 000015d8: DUP3 000015d9: DUP5 000015da: ADD 000015db: MSTORE 000015dc: PUSH1 0x60 000015de: DUP3 000015df: ADD 000015e0: DUP14 000015e1: SWAP1 000015e2: MSTORE 000015e3: PUSH1 0x80 000015e5: DUP3 000015e6: ADD 000015e7: DUP13 000015e8: SWAP1 000015e9: MSTORE 000015ea: PUSH1 0xa0 000015ec: DUP3 000015ed: ADD 000015ee: DUP12 000015ef: SWAP1 000015f0: MSTORE 000015f1: PUSH1 0xc0 000015f3: DUP3 000015f4: ADD 000015f5: DUP11 000015f6: SWAP1 000015f7: MSTORE 000015f8: PUSH1 0x01 000015fa: PUSH1 0x01 000015fc: PUSH1 0xa0 000015fe: SHL 000015ff: SUB 00001600: DUP1 00001601: DUP11 00001602: AND 00001603: PUSH1 0xe0 00001605: DUP5 00001606: ADD 00001607: MSTORE 00001608: DUP6 00001609: AND 0000160a: PUSH2 0x0100 0000160d: DUP1 0000160e: DUP5 0000160f: ADD 00001610: SWAP2 00001611: SWAP1 00001612: SWAP2 00001613: MSTORE 00001614: DUP4 00001615: MLOAD 00001616: DUP1 00001617: DUP5 00001618: SUB 00001619: SWAP1 0000161a: SWAP2 0000161b: ADD 0000161c: DUP2 0000161d: MSTORE 0000161e: PUSH2 0x0120 00001621: SWAP1 00001622: SWAP3 00001623: ADD 00001624: SWAP1 00001625: SWAP3 00001626: MSTORE 00001627: DUP1 00001628: MLOAD 00001629: SWAP2 0000162a: ADD 0000162b: KECCAK256 0000162c: PUSH1 0x00 0000162e: SWAP1 0000162f: PUSH2 0x1637 00001632: SWAP1 00001633: PUSH2 0x3668 00001636: JUMP 00001637: JUMPDEST 00001638: SWAP1 00001639: POP 0000163a: PUSH2 0x1646 0000163d: DUP5 0000163e: DUP9 0000163f: DUP12 00001640: DUP5 00001641: DUP7 00001642: PUSH2 0x36b9 00001645: JUMP 00001646: JUMPDEST 00001647: DUP5 00001648: ISZERO 00001649: PUSH2 0x16b5 0000164c: JUMPI 0000164d: PUSH1 0x00 0000164f: PUSH2 0x1658 00001652: DUP7 00001653: DUP9 00001654: PUSH2 0x3700 00001657: JUMP 00001658: JUMPDEST 00001659: SWAP1 0000165a: POP 0000165b: PUSH2 0x1697 0000165e: PUSH2 0x1667 00001661: DUP14 00001662: DUP9 00001663: PUSH2 0x3796 00001666: JUMP 00001667: JUMPDEST 00001668: PUSH2 0x1671 0000166b: DUP14 0000166c: DUP5 0000166d: PUSH2 0x3796 00001670: JUMP 00001671: JUMPDEST 00001672: DUP11 00001673: DUP9 00001674: DUP12 00001675: DUP12 00001676: PUSH1 0x77 00001678: SLOAD 00001679: GT 0000167a: PUSH2 0x1684 0000167d: JUMPI 0000167e: PUSH1 0x00 00001680: PUSH2 0x1691 00001683: JUMP 00001684: JUMPDEST 00001685: PUSH1 0x77 00001687: SLOAD 00001688: PUSH2 0x1691 0000168b: SWAP1 0000168c: DUP14 0000168d: PUSH2 0x3796 00001690: JUMP 00001691: JUMPDEST 00001692: DUP11 00001693: PUSH2 0x37a6 00001696: JUMP 00001697: JUMPDEST 00001698: PUSH1 0x66 0000169a: SLOAD 0000169b: PUSH2 0x16af 0000169e: SWAP1 0000169f: PUSH1 0x01 000016a1: PUSH1 0x01 000016a3: PUSH1 0xa0 000016a5: SHL 000016a6: SUB 000016a7: AND 000016a8: DUP7 000016a9: CALLER 000016aa: DUP10 000016ab: PUSH2 0x3cc6 000016ae: JUMP 000016af: JUMPDEST 000016b0: POP 000016b1: PUSH2 0x16c6 000016b4: JUMP 000016b5: JUMPDEST 000016b6: PUSH2 0x16c6 000016b9: DUP12 000016ba: DUP12 000016bb: DUP10 000016bc: DUP8 000016bd: DUP11 000016be: PUSH1 0x77 000016c0: SLOAD 000016c1: DUP10 000016c2: PUSH2 0x37a6 000016c5: JUMP 000016c6: JUMPDEST 000016c7: POP 000016c8: POP 000016c9: PUSH1 0x01 000016cb: PUSH1 0x65 000016cd: SSTORE 000016ce: POP 000016cf: POP 000016d0: POP 000016d1: POP 000016d2: POP 000016d3: POP 000016d4: POP 000016d5: POP 000016d6: POP 000016d7: JUMP 000016d8: JUMPDEST 000016d9: PUSH1 0x8f 000016db: SLOAD 000016dc: DUP2 000016dd: JUMP 000016de: JUMPDEST 000016df: PUSH1 0x38 000016e1: SLOAD 000016e2: PUSH1 0xff 000016e4: AND 000016e5: SWAP1 000016e6: JUMP 000016e7: JUMPDEST 000016e8: PUSH1 0x91 000016ea: SLOAD 000016eb: DUP2 000016ec: JUMP 000016ed: JUMPDEST 000016ee: PUSH1 0x00 000016f0: PUSH2 0x143e 000016f3: PUSH2 0x16fa 000016f6: PUSH2 0x325a 000016f9: JUMP 000016fa: JUMPDEST 000016fb: DUP5 000016fc: PUSH2 0x152c 000016ff: DUP6 00001700: PUSH1 0x34 00001702: PUSH1 0x00 00001704: PUSH2 0x170b 00001707: PUSH2 0x325a 0000170a: JUMP 0000170b: JUMPDEST 0000170c: PUSH1 0x01 0000170e: PUSH1 0x01 00001710: PUSH1 0xa0 00001712: SHL 00001713: SUB 00001714: SWAP1 00001715: DUP2 00001716: AND 00001717: DUP3 00001718: MSTORE 00001719: PUSH1 0x20 0000171b: DUP1 0000171c: DUP4 0000171d: ADD 0000171e: SWAP4 0000171f: SWAP1 00001720: SWAP4 00001721: MSTORE 00001722: PUSH1 0x40 00001724: SWAP2 00001725: DUP3 00001726: ADD 00001727: PUSH1 0x00 00001729: SWAP1 0000172a: DUP2 0000172b: KECCAK256 0000172c: SWAP2 0000172d: DUP13 0000172e: AND 0000172f: DUP2 00001730: MSTORE 00001731: SWAP3 00001732: MSTORE 00001733: SWAP1 00001734: KECCAK256 00001735: SLOAD 00001736: SWAP1 00001737: PUSH2 0x3d3f 0000173a: JUMP 0000173b: JUMPDEST 0000173c: PUSH1 0x81 0000173e: PUSH1 0x20 00001740: MSTORE 00001741: PUSH1 0x00 00001743: SWAP1 00001744: DUP2 00001745: MSTORE 00001746: PUSH1 0x40 00001748: SWAP1 00001749: KECCAK256 0000174a: SLOAD 0000174b: PUSH1 0xff 0000174d: AND 0000174e: DUP2 0000174f: JUMP 00001750: JUMPDEST 00001751: PUSH1 0x8d 00001753: SLOAD 00001754: DUP2 00001755: JUMP 00001756: JUMPDEST 00001757: PUSH1 0x02 00001759: PUSH1 0x65 0000175b: SLOAD 0000175c: EQ 0000175d: ISZERO 0000175e: PUSH2 0x17ae 00001761: JUMPI 00001762: PUSH1 0x40 00001764: DUP1 00001765: MLOAD 00001766: PUSH3 0x461bcd 0000176a: PUSH1 0xe5 0000176c: SHL 0000176d: DUP2 0000176e: MSTORE 0000176f: PUSH1 0x20 00001771: PUSH1 0x04 00001773: DUP3 00001774: ADD 00001775: MSTORE 00001776: PUSH1 0x1f 00001778: PUSH1 0x24 0000177a: DUP3 0000177b: ADD 0000177c: MSTORE 0000177d: PUSH32 0x5265656e7472616e637947756172643a207265656e7472616e742063616c6c00 0000179e: PUSH1 0x44 000017a0: DUP3 000017a1: ADD 000017a2: MSTORE 000017a3: SWAP1 000017a4: MLOAD 000017a5: SWAP1 000017a6: DUP2 000017a7: SWAP1 000017a8: SUB 000017a9: PUSH1 0x64 000017ab: ADD 000017ac: SWAP1 000017ad: REVERT 000017ae: JUMPDEST 000017af: PUSH1 0x02 000017b1: PUSH1 0x65 000017b3: SSTORE 000017b4: PUSH2 0x17bd 000017b7: DUP3 000017b8: DUP3 000017b9: PUSH2 0x3d99 000017bc: JUMP 000017bd: JUMPDEST 000017be: PUSH1 0x40 000017c0: DUP1 000017c1: MLOAD 000017c2: PUSH1 0x08 000017c4: DUP1 000017c5: DUP3 000017c6: MSTORE 000017c7: PUSH2 0x0120 000017ca: DUP3 000017cb: ADD 000017cc: SWAP1 000017cd: SWAP3 000017ce: MSTORE 000017cf: PUSH1 0x00 000017d1: SWAP2 000017d2: PUSH1 0x20 000017d4: DUP3 000017d5: ADD 000017d6: PUSH2 0x0100 000017d9: DUP1 000017da: CALLDATASIZE 000017db: DUP4 000017dc: CALLDATACOPY 000017dd: POP 000017de: POP 000017df: PUSH1 0x68 000017e1: SLOAD 000017e2: PUSH1 0x40 000017e4: MLOAD 000017e5: PUSH4 0x69795e93 000017ea: PUSH1 0xe0 000017ec: SHL 000017ed: DUP2 000017ee: MSTORE 000017ef: ADDRESS 000017f0: PUSH1 0x04 000017f2: DUP3 000017f3: ADD 000017f4: DUP2 000017f5: DUP2 000017f6: MSTORE 000017f7: CALLER 000017f8: PUSH1 0x24 000017fa: DUP5 000017fb: ADD 000017fc: DUP2 000017fd: SWAP1 000017fe: MSTORE 000017ff: PUSH1 0x60 00001801: PUSH1 0x44 00001803: DUP6 00001804: ADD 00001805: SWAP1 00001806: DUP2 00001807: MSTORE 00001808: PUSH1 0x64 0000180a: DUP6 0000180b: ADD 0000180c: DUP11 0000180d: SWAP1 0000180e: MSTORE 0000180f: SWAP7 00001810: SWAP8 00001811: POP 00001812: PUSH1 0x01 00001814: PUSH1 0x01 00001816: PUSH1 0xa0 00001818: SHL 00001819: SUB 0000181a: SWAP1 0000181b: SWAP5 0000181c: AND 0000181d: SWAP6 0000181e: PUSH4 0x69795e93 00001823: SWAP6 00001824: POP 00001825: SWAP2 00001826: SWAP4 00001827: SWAP3 00001828: DUP10 00001829: SWAP3 0000182a: DUP10 0000182b: SWAP3 0000182c: SWAP2 0000182d: PUSH1 0x84 0000182f: ADD 00001830: DUP5 00001831: PUSH1 0x20 00001833: DUP6 00001834: MUL 00001835: DUP1 00001836: DUP3 00001837: DUP5 00001838: CALLDATACOPY 00001839: PUSH1 0x00 0000183b: DUP2 0000183c: DUP5 0000183d: ADD 0000183e: MSTORE 0000183f: PUSH1 0x1f 00001841: NOT 00001842: PUSH1 0x1f 00001844: DUP3 00001845: ADD 00001846: AND 00001847: SWAP1 00001848: POP 00001849: DUP1 0000184a: DUP4 0000184b: ADD 0000184c: SWAP3 0000184d: POP 0000184e: POP 0000184f: POP 00001850: SWAP6 00001851: POP 00001852: POP 00001853: POP 00001854: POP 00001855: POP 00001856: POP 00001857: PUSH1 0x00 00001859: PUSH1 0x40 0000185b: MLOAD 0000185c: DUP1 0000185d: DUP4 0000185e: SUB 0000185f: DUP2 00001860: DUP7 00001861: DUP1 00001862: EXTCODESIZE 00001863: ISZERO 00001864: DUP1 00001865: ISZERO 00001866: PUSH2 0x186e 00001869: JUMPI 0000186a: PUSH1 0x00 0000186c: DUP1 0000186d: REVERT 0000186e: JUMPDEST 0000186f: POP 00001870: GAS 00001871: STATICCALL 00001872: ISZERO 00001873: DUP1 00001874: ISZERO 00001875: PUSH2 0x1882 00001878: JUMPI 00001879: RETURNDATASIZE 0000187a: PUSH1 0x00 0000187c: DUP1 0000187d: RETURNDATACOPY 0000187e: RETURNDATASIZE 0000187f: PUSH1 0x00 00001881: REVERT 00001882: JUMPDEST 00001883: POP 00001884: POP 00001885: POP 00001886: POP 00001887: PUSH1 0x40 00001889: MLOAD 0000188a: RETURNDATASIZE 0000188b: PUSH1 0x00 0000188d: DUP3 0000188e: RETURNDATACOPY 0000188f: PUSH1 0x1f 00001891: RETURNDATASIZE 00001892: SWAP1 00001893: DUP2 00001894: ADD 00001895: PUSH1 0x1f 00001897: NOT 00001898: AND 00001899: DUP3 0000189a: ADD 0000189b: PUSH1 0x40 0000189d: MSTORE 0000189e: PUSH1 0x20 000018a0: DUP2 000018a1: LT 000018a2: ISZERO 000018a3: PUSH2 0x18ab 000018a6: JUMPI 000018a7: PUSH1 0x00 000018a9: DUP1 000018aa: REVERT 000018ab: JUMPDEST 000018ac: DUP2 000018ad: ADD 000018ae: SWAP1 000018af: DUP1 000018b0: DUP1 000018b1: MLOAD 000018b2: PUSH1 0x40 000018b4: MLOAD 000018b5: SWAP4 000018b6: SWAP3 000018b7: SWAP2 000018b8: SWAP1 000018b9: DUP5 000018ba: PUSH5 0x0100000000 000018c0: DUP3 000018c1: GT 000018c2: ISZERO 000018c3: PUSH2 0x18cb 000018c6: JUMPI 000018c7: PUSH1 0x00 000018c9: DUP1 000018ca: REVERT 000018cb: JUMPDEST 000018cc: SWAP1 000018cd: DUP4 000018ce: ADD 000018cf: SWAP1 000018d0: PUSH1 0x20 000018d2: DUP3 000018d3: ADD 000018d4: DUP6 000018d5: DUP2 000018d6: GT 000018d7: ISZERO 000018d8: PUSH2 0x18e0 000018db: JUMPI 000018dc: PUSH1 0x00 000018de: DUP1 000018df: REVERT 000018e0: JUMPDEST 000018e1: DUP3 000018e2: MLOAD 000018e3: DUP7 000018e4: PUSH1 0x20 000018e6: DUP3 000018e7: MUL 000018e8: DUP4 000018e9: ADD 000018ea: GT 000018eb: PUSH5 0x0100000000 000018f1: DUP3 000018f2: GT 000018f3: OR 000018f4: ISZERO 000018f5: PUSH2 0x18fd 000018f8: JUMPI 000018f9: PUSH1 0x00 000018fb: DUP1 000018fc: REVERT 000018fd: JUMPDEST 000018fe: DUP3 000018ff: MSTORE 00001900: POP 00001901: DUP2 00001902: MLOAD 00001903: PUSH1 0x20 00001905: SWAP2 00001906: DUP3 00001907: ADD 00001908: SWAP3 00001909: DUP3 0000190a: ADD 0000190b: SWAP2 0000190c: MUL 0000190d: DUP1 0000190e: DUP4 0000190f: DUP4 00001910: PUSH1 0x00 00001912: JUMPDEST 00001913: DUP4 00001914: DUP2 00001915: LT 00001916: ISZERO 00001917: PUSH2 0x192a 0000191a: JUMPI 0000191b: DUP2 0000191c: DUP2 0000191d: ADD 0000191e: MLOAD 0000191f: DUP4 00001920: DUP3 00001921: ADD 00001922: MSTORE 00001923: PUSH1 0x20 00001925: ADD 00001926: PUSH2 0x1912 00001929: JUMP 0000192a: JUMPDEST 0000192b: POP 0000192c: POP 0000192d: POP 0000192e: POP 0000192f: SWAP1 00001930: POP 00001931: ADD 00001932: PUSH1 0x40 00001934: MSTORE 00001935: POP 00001936: POP 00001937: POP 00001938: SWAP1 00001939: POP 0000193a: PUSH2 0x196e 0000193d: CALLER 0000193e: DUP3 0000193f: PUSH1 0x05 00001941: DUP2 00001942: MLOAD 00001943: DUP2 00001944: LT 00001945: PUSH2 0x194a 00001948: JUMPI 00001949: INVALID 0000194a: JUMPDEST 0000194b: PUSH1 0x20 0000194d: MUL 0000194e: PUSH1 0x20 00001950: ADD 00001951: ADD 00001952: MLOAD 00001953: DUP4 00001954: PUSH1 0x06 00001956: DUP2 00001957: MLOAD 00001958: DUP2 00001959: LT 0000195a: PUSH2 0x195f 0000195d: JUMPI 0000195e: INVALID 0000195f: JUMPDEST 00001960: PUSH1 0x20 00001962: MUL 00001963: PUSH1 0x20 00001965: ADD 00001966: ADD 00001967: MLOAD 00001968: PUSH1 0x00 0000196a: PUSH2 0x3e26 0000196d: JUMP 0000196e: JUMPDEST 0000196f: POP 00001970: POP 00001971: PUSH1 0x01 00001973: PUSH1 0x65 00001975: SSTORE 00001976: POP 00001977: JUMP 00001978: JUMPDEST 00001979: PUSH1 0x01 0000197b: PUSH1 0x01 0000197d: PUSH1 0xa0 0000197f: SHL 00001980: SUB 00001981: AND 00001982: PUSH1 0x00 00001984: SWAP1 00001985: DUP2 00001986: MSTORE 00001987: PUSH1 0x71 00001989: PUSH1 0x20 0000198b: SWAP1 0000198c: DUP2 0000198d: MSTORE 0000198e: PUSH1 0x40 00001990: SWAP2 00001991: DUP3 00001992: SWAP1 00001993: KECCAK256 00001994: DUP3 00001995: MLOAD 00001996: PUSH2 0x0120 00001999: DUP2 0000199a: ADD 0000199b: DUP5 0000199c: MSTORE 0000199d: DUP2 0000199e: SLOAD 0000199f: DUP1 000019a0: DUP3 000019a1: MSTORE 000019a2: PUSH1 0x01 000019a4: DUP4 000019a5: ADD 000019a6: SLOAD 000019a7: SWAP4 000019a8: DUP3 000019a9: ADD 000019aa: DUP5 000019ab: SWAP1 000019ac: MSTORE 000019ad: PUSH1 0x02 000019af: DUP4 000019b0: ADD 000019b1: SLOAD 000019b2: SWAP5 000019b3: DUP3 000019b4: ADD 000019b5: DUP6 000019b6: SWAP1 000019b7: MSTORE 000019b8: PUSH1 0x03 000019ba: DUP4 000019bb: ADD 000019bc: SLOAD 000019bd: PUSH1 0x60 000019bf: DUP4 000019c0: ADD 000019c1: DUP2 000019c2: SWAP1 000019c3: MSTORE 000019c4: PUSH1 0x04 000019c6: DUP5 000019c7: ADD 000019c8: SLOAD 000019c9: PUSH1 0x80 000019cb: DUP5 000019cc: ADD 000019cd: DUP2 000019ce: SWAP1 000019cf: MSTORE 000019d0: PUSH1 0x05 000019d2: DUP6 000019d3: ADD 000019d4: SLOAD 000019d5: PUSH1 0xa0 000019d7: DUP6 000019d8: ADD 000019d9: DUP2 000019da: SWAP1 000019db: MSTORE 000019dc: PUSH1 0x06 000019de: DUP7 000019df: ADD 000019e0: SLOAD 000019e1: PUSH1 0xc0 000019e3: DUP7 000019e4: ADD 000019e5: DUP2 000019e6: SWAP1 000019e7: MSTORE 000019e8: PUSH1 0x07 000019ea: DUP8 000019eb: ADD 000019ec: SLOAD 000019ed: PUSH1 0xe0 000019ef: DUP8 000019f0: ADD 000019f1: DUP2 000019f2: SWAP1 000019f3: MSTORE 000019f4: PUSH1 0x08 000019f6: SWAP1 000019f7: SWAP8 000019f8: ADD 000019f9: SLOAD 000019fa: PUSH2 0x0100 000019fd: SWAP1 000019fe: SWAP7 000019ff: ADD 00001a00: DUP7 00001a01: SWAP1 00001a02: MSTORE 00001a03: SWAP4 00001a04: SWAP9 00001a05: SWAP7 00001a06: SWAP8 00001a07: SWAP7 00001a08: SWAP3 00001a09: SWAP6 00001a0a: SWAP2 00001a0b: SWAP5 00001a0c: SWAP1 00001a0d: SWAP4 00001a0e: SWAP3 00001a0f: JUMP 00001a10: JUMPDEST 00001a11: PUSH1 0x7e 00001a13: SLOAD 00001a14: DUP2 00001a15: JUMP 00001a16: JUMPDEST 00001a17: PUSH1 0x02 00001a19: PUSH1 0x65 00001a1b: SLOAD 00001a1c: EQ 00001a1d: ISZERO 00001a1e: PUSH2 0x1a6e 00001a21: JUMPI 00001a22: PUSH1 0x40 00001a24: DUP1 00001a25: MLOAD 00001a26: PUSH3 0x461bcd 00001a2a: PUSH1 0xe5 00001a2c: SHL 00001a2d: DUP2 00001a2e: MSTORE 00001a2f: PUSH1 0x20 00001a31: PUSH1 0x04 00001a33: DUP3 00001a34: ADD 00001a35: MSTORE 00001a36: PUSH1 0x1f 00001a38: PUSH1 0x24 00001a3a: DUP3 00001a3b: ADD 00001a3c: MSTORE 00001a3d: PUSH32 0x5265656e7472616e637947756172643a207265656e7472616e742063616c6c00 00001a5e: PUSH1 0x44 00001a60: DUP3 00001a61: ADD 00001a62: MSTORE 00001a63: SWAP1 00001a64: MLOAD 00001a65: SWAP1 00001a66: DUP2 00001a67: SWAP1 00001a68: SUB 00001a69: PUSH1 0x64 00001a6b: ADD 00001a6c: SWAP1 00001a6d: REVERT 00001a6e: JUMPDEST 00001a6f: PUSH1 0x02 00001a71: PUSH1 0x65 00001a73: SSTORE 00001a74: PUSH2 0x1a7d 00001a77: DUP3 00001a78: DUP3 00001a79: PUSH2 0x3d99 00001a7c: JUMP 00001a7d: JUMPDEST 00001a7e: PUSH1 0x40 00001a80: DUP1 00001a81: MLOAD 00001a82: PUSH1 0x08 00001a84: DUP1 00001a85: DUP3 00001a86: MSTORE 00001a87: PUSH2 0x0120 00001a8a: DUP3 00001a8b: ADD 00001a8c: SWAP1 00001a8d: SWAP3 00001a8e: MSTORE 00001a8f: PUSH1 0x00 00001a91: SWAP2 00001a92: PUSH1 0x20 00001a94: DUP3 00001a95: ADD 00001a96: PUSH2 0x0100 00001a99: DUP1 00001a9a: CALLDATASIZE 00001a9b: DUP4 00001a9c: CALLDATACOPY 00001a9d: POP 00001a9e: POP 00001a9f: PUSH1 0x68 00001aa1: SLOAD 00001aa2: PUSH1 0x40 00001aa4: MLOAD 00001aa5: PUSH4 0x69795e93 00001aaa: PUSH1 0xe0 00001aac: SHL 00001aad: DUP2 00001aae: MSTORE 00001aaf: ADDRESS 00001ab0: PUSH1 0x04 00001ab2: DUP3 00001ab3: ADD 00001ab4: DUP2 00001ab5: DUP2 00001ab6: MSTORE 00001ab7: CALLER 00001ab8: PUSH1 0x24 00001aba: DUP5 00001abb: ADD 00001abc: DUP2 00001abd: SWAP1 00001abe: MSTORE 00001abf: PUSH1 0x60 00001ac1: PUSH1 0x44 00001ac3: DUP6 00001ac4: ADD 00001ac5: SWAP1 00001ac6: DUP2 00001ac7: MSTORE 00001ac8: PUSH1 0x64 00001aca: DUP6 00001acb: ADD 00001acc: DUP11 00001acd: SWAP1 00001ace: MSTORE 00001acf: SWAP7 00001ad0: SWAP8 00001ad1: POP 00001ad2: PUSH1 0x01 00001ad4: PUSH1 0x01 00001ad6: PUSH1 0xa0 00001ad8: SHL 00001ad9: SUB 00001ada: SWAP1 00001adb: SWAP5 00001adc: AND 00001add: SWAP6 00001ade: PUSH4 0x69795e93 00001ae3: SWAP6 00001ae4: POP 00001ae5: SWAP2 00001ae6: SWAP4 00001ae7: SWAP3 00001ae8: DUP10 00001ae9: SWAP3 00001aea: DUP10 00001aeb: SWAP3 00001aec: SWAP2 00001aed: PUSH1 0x84 00001aef: ADD 00001af0: DUP5 00001af1: PUSH1 0x20 00001af3: DUP6 00001af4: MUL 00001af5: DUP1 00001af6: DUP3 00001af7: DUP5 00001af8: CALLDATACOPY 00001af9: PUSH1 0x00 00001afb: DUP2 00001afc: DUP5 00001afd: ADD 00001afe: MSTORE 00001aff: PUSH1 0x1f 00001b01: NOT 00001b02: PUSH1 0x1f 00001b04: DUP3 00001b05: ADD 00001b06: AND 00001b07: SWAP1 00001b08: POP 00001b09: DUP1 00001b0a: DUP4 00001b0b: ADD 00001b0c: SWAP3 00001b0d: POP 00001b0e: POP 00001b0f: POP 00001b10: SWAP6 00001b11: POP 00001b12: POP 00001b13: POP 00001b14: POP 00001b15: POP 00001b16: POP 00001b17: PUSH1 0x00 00001b19: PUSH1 0x40 00001b1b: MLOAD 00001b1c: DUP1 00001b1d: DUP4 00001b1e: SUB 00001b1f: DUP2 00001b20: DUP7 00001b21: DUP1 00001b22: EXTCODESIZE 00001b23: ISZERO 00001b24: DUP1 00001b25: ISZERO 00001b26: PUSH2 0x1b2e 00001b29: JUMPI 00001b2a: PUSH1 0x00 00001b2c: DUP1 00001b2d: REVERT 00001b2e: JUMPDEST 00001b2f: POP 00001b30: GAS 00001b31: STATICCALL 00001b32: ISZERO 00001b33: DUP1 00001b34: ISZERO 00001b35: PUSH2 0x1b42 00001b38: JUMPI 00001b39: RETURNDATASIZE 00001b3a: PUSH1 0x00 00001b3c: DUP1 00001b3d: RETURNDATACOPY 00001b3e: RETURNDATASIZE 00001b3f: PUSH1 0x00 00001b41: REVERT 00001b42: JUMPDEST 00001b43: POP 00001b44: POP 00001b45: POP 00001b46: POP 00001b47: PUSH1 0x40 00001b49: MLOAD 00001b4a: RETURNDATASIZE 00001b4b: PUSH1 0x00 00001b4d: DUP3 00001b4e: RETURNDATACOPY 00001b4f: PUSH1 0x1f 00001b51: RETURNDATASIZE 00001b52: SWAP1 00001b53: DUP2 00001b54: ADD 00001b55: PUSH1 0x1f 00001b57: NOT 00001b58: AND 00001b59: DUP3 00001b5a: ADD 00001b5b: PUSH1 0x40 00001b5d: MSTORE 00001b5e: PUSH1 0x20 00001b60: DUP2 00001b61: LT 00001b62: ISZERO 00001b63: PUSH2 0x1b6b 00001b66: JUMPI 00001b67: PUSH1 0x00 00001b69: DUP1 00001b6a: REVERT 00001b6b: JUMPDEST 00001b6c: DUP2 00001b6d: ADD 00001b6e: SWAP1 00001b6f: DUP1 00001b70: DUP1 00001b71: MLOAD 00001b72: PUSH1 0x40 00001b74: MLOAD 00001b75: SWAP4 00001b76: SWAP3 00001b77: SWAP2 00001b78: SWAP1 00001b79: DUP5 00001b7a: PUSH5 0x0100000000 00001b80: DUP3 00001b81: GT 00001b82: ISZERO 00001b83: PUSH2 0x1b8b 00001b86: JUMPI 00001b87: PUSH1 0x00 00001b89: DUP1 00001b8a: REVERT 00001b8b: JUMPDEST 00001b8c: SWAP1 00001b8d: DUP4 00001b8e: ADD 00001b8f: SWAP1 00001b90: PUSH1 0x20 00001b92: DUP3 00001b93: ADD 00001b94: DUP6 00001b95: DUP2 00001b96: GT 00001b97: ISZERO 00001b98: PUSH2 0x1ba0 00001b9b: JUMPI 00001b9c: PUSH1 0x00 00001b9e: DUP1 00001b9f: REVERT 00001ba0: JUMPDEST 00001ba1: DUP3 00001ba2: MLOAD 00001ba3: DUP7 00001ba4: PUSH1 0x20 00001ba6: DUP3 00001ba7: MUL 00001ba8: DUP4 00001ba9: ADD 00001baa: GT 00001bab: PUSH5 0x0100000000 00001bb1: DUP3 00001bb2: GT 00001bb3: OR 00001bb4: ISZERO 00001bb5: PUSH2 0x1bbd 00001bb8: JUMPI 00001bb9: PUSH1 0x00 00001bbb: DUP1 00001bbc: REVERT 00001bbd: JUMPDEST 00001bbe: DUP3 00001bbf: MSTORE 00001bc0: POP 00001bc1: DUP2 00001bc2: MLOAD 00001bc3: PUSH1 0x20 00001bc5: SWAP2 00001bc6: DUP3 00001bc7: ADD 00001bc8: SWAP3 00001bc9: DUP3 00001bca: ADD 00001bcb: SWAP2 00001bcc: MUL 00001bcd: DUP1 00001bce: DUP4 00001bcf: DUP4 00001bd0: PUSH1 0x00 00001bd2: JUMPDEST 00001bd3: DUP4 00001bd4: DUP2 00001bd5: LT 00001bd6: ISZERO 00001bd7: PUSH2 0x1bea 00001bda: JUMPI 00001bdb: DUP2 00001bdc: DUP2 00001bdd: ADD 00001bde: MLOAD 00001bdf: DUP4 00001be0: DUP3 00001be1: ADD 00001be2: MSTORE 00001be3: PUSH1 0x20 00001be5: ADD 00001be6: PUSH2 0x1bd2 00001be9: JUMP 00001bea: JUMPDEST 00001beb: POP 00001bec: POP 00001bed: POP 00001bee: POP 00001bef: SWAP1 00001bf0: POP 00001bf1: ADD 00001bf2: PUSH1 0x40 00001bf4: MSTORE 00001bf5: POP 00001bf6: POP 00001bf7: POP 00001bf8: SWAP1 00001bf9: POP 00001bfa: PUSH1 0x00 00001bfc: PUSH1 0x67 00001bfe: PUSH1 0x00 00001c00: SWAP1 00001c01: SLOAD 00001c02: SWAP1 00001c03: PUSH2 0x0100 00001c06: EXP 00001c07: SWAP1 00001c08: DIV 00001c09: PUSH1 0x01 00001c0b: PUSH1 0x01 00001c0d: PUSH1 0xa0 00001c0f: SHL 00001c10: SUB 00001c11: AND 00001c12: PUSH1 0x01 00001c14: PUSH1 0x01 00001c16: PUSH1 0xa0 00001c18: SHL 00001c19: SUB 00001c1a: AND 00001c1b: PUSH4 0xf58d1c94 00001c20: PUSH1 0x40 00001c22: MLOAD 00001c23: DUP2 00001c24: PUSH4 0xffffffff 00001c29: AND 00001c2a: PUSH1 0xe0 00001c2c: SHL 00001c2d: DUP2 00001c2e: MSTORE 00001c2f: PUSH1 0x04 00001c31: ADD 00001c32: PUSH1 0x20 00001c34: PUSH1 0x40 00001c36: MLOAD 00001c37: DUP1 00001c38: DUP4 00001c39: SUB 00001c3a: DUP2 00001c3b: DUP7 00001c3c: DUP1 00001c3d: EXTCODESIZE 00001c3e: ISZERO 00001c3f: DUP1 00001c40: ISZERO 00001c41: PUSH2 0x1c49 00001c44: JUMPI 00001c45: PUSH1 0x00 00001c47: DUP1 00001c48: REVERT 00001c49: JUMPDEST 00001c4a: POP 00001c4b: GAS 00001c4c: STATICCALL 00001c4d: ISZERO 00001c4e: DUP1 00001c4f: ISZERO 00001c50: PUSH2 0x1c5d 00001c53: JUMPI 00001c54: RETURNDATASIZE 00001c55: PUSH1 0x00 00001c57: DUP1 00001c58: RETURNDATACOPY 00001c59: RETURNDATASIZE 00001c5a: PUSH1 0x00 00001c5c: REVERT 00001c5d: JUMPDEST 00001c5e: POP 00001c5f: POP 00001c60: POP 00001c61: POP 00001c62: PUSH1 0x40 00001c64: MLOAD 00001c65: RETURNDATASIZE 00001c66: PUSH1 0x20 00001c68: DUP2 00001c69: LT 00001c6a: ISZERO 00001c6b: PUSH2 0x1c73 00001c6e: JUMPI 00001c6f: PUSH1 0x00 00001c71: DUP1 00001c72: REVERT 00001c73: JUMPDEST 00001c74: POP 00001c75: MLOAD 00001c76: PUSH1 0x40 00001c78: DUP1 00001c79: MLOAD 00001c7a: PUSH4 0x0cbefec9 00001c7f: PUSH1 0xe3 00001c81: SHL 00001c82: DUP2 00001c83: MSTORE 00001c84: SWAP1 00001c85: MLOAD 00001c86: PUSH1 0x01 00001c88: PUSH1 0x01 00001c8a: PUSH1 0xa0 00001c8c: SHL 00001c8d: SUB 00001c8e: SWAP1 00001c8f: SWAP3 00001c90: AND 00001c91: SWAP2 00001c92: PUSH4 0x65f7f648 00001c97: SWAP2 00001c98: PUSH1 0x04 00001c9a: DUP1 00001c9b: DUP3 00001c9c: ADD 00001c9d: SWAP3 00001c9e: PUSH1 0x20 00001ca0: SWAP3 00001ca1: SWAP1 00001ca2: SWAP2 00001ca3: SWAP1 00001ca4: DUP3 00001ca5: SWAP1 00001ca6: SUB 00001ca7: ADD 00001ca8: DUP2 00001ca9: DUP7 00001caa: DUP1 00001cab: EXTCODESIZE 00001cac: ISZERO 00001cad: DUP1 00001cae: ISZERO 00001caf: PUSH2 0x1cb7 00001cb2: JUMPI 00001cb3: PUSH1 0x00 00001cb5: DUP1 00001cb6: REVERT 00001cb7: JUMPDEST 00001cb8: POP 00001cb9: GAS 00001cba: STATICCALL 00001cbb: ISZERO 00001cbc: DUP1 00001cbd: ISZERO 00001cbe: PUSH2 0x1ccb 00001cc1: JUMPI 00001cc2: RETURNDATASIZE 00001cc3: PUSH1 0x00 00001cc5: DUP1 00001cc6: RETURNDATACOPY 00001cc7: RETURNDATASIZE 00001cc8: PUSH1 0x00 00001cca: REVERT 00001ccb: JUMPDEST 00001ccc: POP 00001ccd: POP 00001cce: POP 00001ccf: POP 00001cd0: PUSH1 0x40 00001cd2: MLOAD 00001cd3: RETURNDATASIZE 00001cd4: PUSH1 0x20 00001cd6: DUP2 00001cd7: LT 00001cd8: ISZERO 00001cd9: PUSH2 0x1ce1 00001cdc: JUMPI 00001cdd: PUSH1 0x00 00001cdf: DUP1 00001ce0: REVERT 00001ce1: JUMPDEST 00001ce2: POP 00001ce3: MLOAD 00001ce4: DUP3 00001ce5: MLOAD 00001ce6: SWAP1 00001ce7: SWAP2 00001ce8: POP 00001ce9: PUSH2 0x1d1f 00001cec: SWAP1 00001ced: CALLER 00001cee: SWAP1 00001cef: DUP5 00001cf0: SWAP1 00001cf1: PUSH1 0x05 00001cf3: SWAP1 00001cf4: DUP2 00001cf5: LT 00001cf6: PUSH2 0x1cfb 00001cf9: JUMPI 00001cfa: INVALID 00001cfb: JUMPDEST 00001cfc: PUSH1 0x20 00001cfe: MUL 00001cff: PUSH1 0x20 00001d01: ADD 00001d02: ADD 00001d03: MLOAD 00001d04: DUP5 00001d05: PUSH1 0x06 00001d07: DUP2 00001d08: MLOAD 00001d09: DUP2 00001d0a: LT 00001d0b: PUSH2 0x1d10 00001d0e: JUMPI 00001d0f: INVALID 00001d10: JUMPDEST 00001d11: PUSH1 0x20 00001d13: MUL 00001d14: PUSH1 0x20 00001d16: ADD 00001d17: ADD 00001d18: MLOAD 00001d19: PUSH1 0x01 00001d1b: PUSH2 0x3e26 00001d1e: JUMP 00001d1f: JUMPDEST 00001d20: PUSH2 0x1d3d 00001d23: DUP2 00001d24: DUP4 00001d25: PUSH1 0x05 00001d27: DUP2 00001d28: MLOAD 00001d29: DUP2 00001d2a: LT 00001d2b: PUSH2 0x1d30 00001d2e: JUMPI 00001d2f: INVALID 00001d30: JUMPDEST 00001d31: PUSH1 0x20 00001d33: MUL 00001d34: PUSH1 0x20 00001d36: ADD 00001d37: ADD 00001d38: MLOAD 00001d39: PUSH2 0x4006 00001d3c: JUMP 00001d3d: JUMPDEST 00001d3e: DUP1 00001d3f: PUSH1 0x01 00001d41: PUSH1 0x01 00001d43: PUSH1 0xa0 00001d45: SHL 00001d46: SUB 00001d47: AND 00001d48: PUSH4 0x84715b11 00001d4d: DUP4 00001d4e: PUSH1 0x05 00001d50: DUP2 00001d51: MLOAD 00001d52: DUP2 00001d53: LT 00001d54: PUSH2 0x1d59 00001d57: JUMPI 00001d58: INVALID 00001d59: JUMPDEST 00001d5a: PUSH1 0x20 00001d5c: MUL 00001d5d: PUSH1 0x20 00001d5f: ADD 00001d60: ADD 00001d61: MLOAD 00001d62: DUP8 00001d63: CALLER 00001d64: PUSH1 0x00 00001d66: PUSH1 0x40 00001d68: MLOAD 00001d69: DUP6 00001d6a: PUSH4 0xffffffff 00001d6f: AND 00001d70: PUSH1 0xe0 00001d72: SHL 00001d73: DUP2 00001d74: MSTORE 00001d75: PUSH1 0x04 00001d77: ADD 00001d78: DUP1 00001d79: DUP6 00001d7a: DUP2 00001d7b: MSTORE 00001d7c: PUSH1 0x20 00001d7e: ADD 00001d7f: DUP5 00001d80: DUP2 00001d81: MSTORE 00001d82: PUSH1 0x20 00001d84: ADD 00001d85: DUP4 00001d86: PUSH1 0x01 00001d88: PUSH1 0x01 00001d8a: PUSH1 0xa0 00001d8c: SHL 00001d8d: SUB 00001d8e: AND 00001d8f: DUP2 00001d90: MSTORE 00001d91: PUSH1 0x20 00001d93: ADD 00001d94: DUP3 00001d95: PUSH1 0x01 00001d97: PUSH1 0x01 00001d99: PUSH1 0xa0 00001d9b: SHL 00001d9c: SUB 00001d9d: AND 00001d9e: DUP2 00001d9f: MSTORE 00001da0: PUSH1 0x20 00001da2: ADD 00001da3: SWAP5 00001da4: POP 00001da5: POP 00001da6: POP 00001da7: POP 00001da8: POP 00001da9: PUSH1 0x00 00001dab: PUSH1 0x40 00001dad: MLOAD 00001dae: DUP1 00001daf: DUP4 00001db0: SUB 00001db1: DUP2 00001db2: PUSH1 0x00 00001db4: DUP8 00001db5: DUP1 00001db6: EXTCODESIZE 00001db7: ISZERO 00001db8: DUP1 00001db9: ISZERO 00001dba: PUSH2 0x1dc2 00001dbd: JUMPI 00001dbe: PUSH1 0x00 00001dc0: DUP1 00001dc1: REVERT 00001dc2: JUMPDEST 00001dc3: POP 00001dc4: GAS 00001dc5: CALL 00001dc6: ISZERO 00001dc7: DUP1 00001dc8: ISZERO 00001dc9: PUSH2 0x1dd6 00001dcc: JUMPI 00001dcd: RETURNDATASIZE 00001dce: PUSH1 0x00 00001dd0: DUP1 00001dd1: RETURNDATACOPY 00001dd2: RETURNDATASIZE 00001dd3: PUSH1 0x00 00001dd5: REVERT 00001dd6: JUMPDEST 00001dd7: POP 00001dd8: POP 00001dd9: POP 00001dda: POP 00001ddb: CALLER 00001ddc: PUSH1 0x01 00001dde: PUSH1 0x01 00001de0: PUSH1 0xa0 00001de2: SHL 00001de3: SUB 00001de4: AND 00001de5: PUSH32 0x1886d3d8c9b71f99d9224bccca0588192d9d4428b2adab6cfcf70e8a07d4d2f2 00001e06: DUP4 00001e07: PUSH1 0x05 00001e09: DUP2 00001e0a: MLOAD 00001e0b: DUP2 00001e0c: LT 00001e0d: PUSH2 0x1e12 00001e10: JUMPI 00001e11: INVALID 00001e12: JUMPDEST 00001e13: PUSH1 0x20 00001e15: MUL 00001e16: PUSH1 0x20 00001e18: ADD 00001e19: ADD 00001e1a: MLOAD 00001e1b: PUSH1 0x40 00001e1d: MLOAD 00001e1e: DUP1 00001e1f: DUP3 00001e20: DUP2 00001e21: MSTORE 00001e22: PUSH1 0x20 00001e24: ADD 00001e25: SWAP2 00001e26: POP 00001e27: POP 00001e28: PUSH1 0x40 00001e2a: MLOAD 00001e2b: DUP1 00001e2c: SWAP2 00001e2d: SUB 00001e2e: SWAP1 00001e2f: LOG2 00001e30: POP 00001e31: POP 00001e32: PUSH1 0x01 00001e34: PUSH1 0x65 00001e36: SSTORE 00001e37: POP 00001e38: POP 00001e39: POP 00001e3a: JUMP 00001e3b: JUMPDEST 00001e3c: PUSH1 0x69 00001e3e: SLOAD 00001e3f: PUSH1 0x01 00001e41: PUSH1 0xa8 00001e43: SHL 00001e44: SWAP1 00001e45: DIV 00001e46: PUSH1 0xff 00001e48: AND 00001e49: DUP2 00001e4a: JUMP 00001e4b: JUMPDEST 00001e4c: PUSH1 0x93 00001e4e: PUSH1 0x20 00001e50: MSTORE 00001e51: PUSH1 0x00 00001e53: SWAP1 00001e54: DUP2 00001e55: MSTORE 00001e56: PUSH1 0x40 00001e58: SWAP1 00001e59: KECCAK256 00001e5a: SLOAD 00001e5b: DUP2 00001e5c: JUMP 00001e5d: JUMPDEST 00001e5e: PUSH32 0x000000000000000000000000aaacb63ab80969af93b811deb81ddeb4c8710591 00001e7f: DUP2 00001e80: JUMP 00001e81: JUMPDEST 00001e82: PUSH1 0x7b 00001e84: SLOAD 00001e85: DUP2 00001e86: JUMP 00001e87: JUMPDEST 00001e88: PUSH1 0x83 00001e8a: SLOAD 00001e8b: DUP2 00001e8c: JUMP 00001e8d: JUMPDEST 00001e8e: PUSH1 0x86 00001e90: DUP2 00001e91: PUSH1 0x04 00001e93: DUP2 00001e94: LT 00001e95: PUSH2 0x1e9d 00001e98: JUMPI 00001e99: PUSH1 0x00 00001e9b: DUP1 00001e9c: REVERT 00001e9d: JUMPDEST 00001e9e: ADD 00001e9f: SLOAD 00001ea0: PUSH1 0x01 00001ea2: PUSH1 0x01 00001ea4: PUSH1 0xa0 00001ea6: SHL 00001ea7: SUB 00001ea8: AND 00001ea9: SWAP1 00001eaa: POP 00001eab: DUP2 00001eac: JUMP 00001ead: JUMPDEST 00001eae: PUSH2 0x1ec5 00001eb1: PUSH1 0x77 00001eb3: SLOAD 00001eb4: PUSH2 0x1ebc 00001eb7: CALLER 00001eb8: PUSH2 0x2360 00001ebb: JUMP 00001ebc: JUMPDEST 00001ebd: LT 00001ebe: ISZERO 00001ebf: PUSH1 0x0f 00001ec1: PUSH2 0x403a 00001ec4: JUMP 00001ec5: JUMPDEST 00001ec6: CALLER 00001ec7: PUSH1 0x00 00001ec9: SWAP1 00001eca: DUP2 00001ecb: MSTORE 00001ecc: PUSH1 0x71 00001ece: PUSH1 0x20 00001ed0: MSTORE 00001ed1: PUSH1 0x40 00001ed3: SWAP1 00001ed4: KECCAK256 00001ed5: PUSH1 0x91 00001ed7: SLOAD 00001ed8: PUSH2 0x1f00 00001edb: SWAP1 00001edc: ISZERO 00001edd: DUP1 00001ede: ISZERO 00001edf: SWAP1 00001ee0: PUSH2 0x1ef9 00001ee3: JUMPI 00001ee4: POP 00001ee5: PUSH1 0x91 00001ee7: SLOAD 00001ee8: PUSH1 0x01 00001eea: DUP4 00001eeb: ADD 00001eec: SLOAD 00001eed: PUSH2 0x1ef7 00001ef0: SWAP1 00001ef1: TIMESTAMP 00001ef2: SWAP1 00001ef3: PUSH2 0x3796 00001ef6: JUMP 00001ef7: JUMPDEST 00001ef8: GT 00001ef9: JUMPDEST 00001efa: PUSH1 0x7d 00001efc: PUSH2 0x403a 00001eff: JUMP 00001f00: JUMPDEST 00001f01: PUSH1 0x67 00001f03: PUSH1 0x00 00001f05: SWAP1 00001f06: SLOAD 00001f07: SWAP1 00001f08: PUSH2 0x0100 00001f0b: EXP 00001f0c: SWAP1 00001f0d: DIV 00001f0e: PUSH1 0x01 00001f10: PUSH1 0x01 00001f12: PUSH1 0xa0 00001f14: SHL 00001f15: SUB 00001f16: AND 00001f17: PUSH1 0x01 00001f19: PUSH1 0x01 00001f1b: PUSH1 0xa0 00001f1d: SHL 00001f1e: SUB 00001f1f: AND 00001f20: PUSH4 0xead4c1cf 00001f25: PUSH1 0x40 00001f27: MLOAD 00001f28: DUP2 00001f29: PUSH4 0xffffffff 00001f2e: AND 00001f2f: PUSH1 0xe0 00001f31: SHL 00001f32: DUP2 00001f33: MSTORE 00001f34: PUSH1 0x04 00001f36: ADD 00001f37: PUSH1 0x20 00001f39: PUSH1 0x40 00001f3b: MLOAD 00001f3c: DUP1 00001f3d: DUP4 00001f3e: SUB 00001f3f: DUP2 00001f40: DUP7 00001f41: DUP1 00001f42: EXTCODESIZE 00001f43: ISZERO 00001f44: DUP1 00001f45: ISZERO 00001f46: PUSH2 0x1f4e 00001f49: JUMPI 00001f4a: PUSH1 0x00 00001f4c: DUP1 00001f4d: REVERT 00001f4e: JUMPDEST 00001f4f: POP 00001f50: GAS 00001f51: STATICCALL 00001f52: ISZERO 00001f53: DUP1 00001f54: ISZERO 00001f55: PUSH2 0x1f62 00001f58: JUMPI 00001f59: RETURNDATASIZE 00001f5a: PUSH1 0x00 00001f5c: DUP1 00001f5d: RETURNDATACOPY 00001f5e: RETURNDATASIZE 00001f5f: PUSH1 0x00 00001f61: REVERT 00001f62: JUMPDEST 00001f63: POP 00001f64: POP 00001f65: POP 00001f66: POP 00001f67: PUSH1 0x40 00001f69: MLOAD 00001f6a: RETURNDATASIZE 00001f6b: PUSH1 0x20 00001f6d: DUP2 00001f6e: LT 00001f6f: ISZERO 00001f70: PUSH2 0x1f78 00001f73: JUMPI 00001f74: PUSH1 0x00 00001f76: DUP1 00001f77: REVERT 00001f78: JUMPDEST 00001f79: POP 00001f7a: MLOAD 00001f7b: PUSH1 0x40 00001f7d: DUP1 00001f7e: MLOAD 00001f7f: PUSH32 0x45b4974700000000000000000000000000000000000000000000000000000000 00001fa0: DUP2 00001fa1: MSTORE 00001fa2: CALLER 00001fa3: PUSH1 0x04 00001fa5: DUP3 00001fa6: ADD 00001fa7: MSTORE 00001fa8: SWAP1 00001fa9: MLOAD 00001faa: PUSH1 0x01 00001fac: PUSH1 0x01 00001fae: PUSH1 0xa0 00001fb0: SHL 00001fb1: SUB 00001fb2: SWAP1 00001fb3: SWAP3 00001fb4: AND 00001fb5: SWAP2 00001fb6: PUSH4 0x45b49747 00001fbb: SWAP2 00001fbc: PUSH1 0x24 00001fbe: DUP1 00001fbf: DUP3 00001fc0: ADD 00001fc1: SWAP3 00001fc2: PUSH1 0x20 00001fc4: SWAP3 00001fc5: SWAP1 00001fc6: SWAP2 00001fc7: SWAP1 00001fc8: DUP3 00001fc9: SWAP1 00001fca: SUB 00001fcb: ADD 00001fcc: DUP2 00001fcd: PUSH1 0x00 00001fcf: DUP8 00001fd0: DUP1 00001fd1: EXTCODESIZE 00001fd2: ISZERO 00001fd3: DUP1 00001fd4: ISZERO 00001fd5: PUSH2 0x1fdd 00001fd8: JUMPI 00001fd9: PUSH1 0x00 00001fdb: DUP1 00001fdc: REVERT 00001fdd: JUMPDEST 00001fde: POP 00001fdf: GAS 00001fe0: CALL 00001fe1: ISZERO 00001fe2: DUP1 00001fe3: ISZERO 00001fe4: PUSH2 0x1ff1 00001fe7: JUMPI 00001fe8: RETURNDATASIZE 00001fe9: PUSH1 0x00 00001feb: DUP1 00001fec: RETURNDATACOPY 00001fed: RETURNDATASIZE 00001fee: PUSH1 0x00 00001ff0: REVERT 00001ff1: JUMPDEST 00001ff2: POP 00001ff3: POP 00001ff4: POP 00001ff5: POP 00001ff6: PUSH1 0x40 00001ff8: MLOAD 00001ff9: RETURNDATASIZE 00001ffa: PUSH1 0x20 00001ffc: DUP2 00001ffd: LT 00001ffe: ISZERO 00001fff: PUSH2 0x2007 00002002: JUMPI 00002003: PUSH1 0x00 00002005: DUP1 00002006: REVERT 00002007: JUMPDEST 00002008: POP 00002009: POP 0000200a: POP 0000200b: JUMP 0000200c: JUMPDEST 0000200d: PUSH1 0x67 0000200f: SLOAD 00002010: PUSH1 0x40 00002012: DUP1 00002013: MLOAD 00002014: PUSH4 0x364d1181 00002019: PUSH1 0xe0 0000201b: SHL 0000201c: DUP2 0000201d: MSTORE 0000201e: ADDRESS 0000201f: PUSH1 0x04 00002021: DUP3 00002022: ADD 00002023: MSTORE 00002024: SWAP1 00002025: MLOAD 00002026: PUSH2 0x208b 00002029: SWAP3 0000202a: PUSH1 0x01 0000202c: PUSH1 0x01 0000202e: PUSH1 0xa0 00002030: SHL 00002031: SUB 00002032: AND 00002033: SWAP2 00002034: PUSH4 0x364d1181 00002039: SWAP2 0000203a: PUSH1 0x24 0000203c: DUP1 0000203d: DUP4 0000203e: ADD 0000203f: SWAP3 00002040: PUSH1 0x20 00002042: SWAP3 00002043: SWAP2 00002044: SWAP1 00002045: DUP3 00002046: SWAP1 00002047: SUB 00002048: ADD 00002049: DUP2 0000204a: DUP7 0000204b: DUP1 0000204c: EXTCODESIZE 0000204d: ISZERO 0000204e: DUP1 0000204f: ISZERO 00002050: PUSH2 0x2058 00002053: JUMPI 00002054: PUSH1 0x00 00002056: DUP1 00002057: REVERT 00002058: JUMPDEST 00002059: POP 0000205a: GAS 0000205b: STATICCALL 0000205c: ISZERO 0000205d: DUP1 0000205e: ISZERO 0000205f: PUSH2 0x206c 00002062: JUMPI 00002063: RETURNDATASIZE 00002064: PUSH1 0x00 00002066: DUP1 00002067: RETURNDATACOPY 00002068: RETURNDATASIZE 00002069: PUSH1 0x00 0000206b: REVERT 0000206c: JUMPDEST 0000206d: POP 0000206e: POP 0000206f: POP 00002070: POP 00002071: PUSH1 0x40 00002073: MLOAD 00002074: RETURNDATASIZE 00002075: PUSH1 0x20 00002077: DUP2 00002078: LT 00002079: ISZERO 0000207a: PUSH2 0x2082 0000207d: JUMPI 0000207e: PUSH1 0x00 00002080: DUP1 00002081: REVERT 00002082: JUMPDEST 00002083: POP 00002084: MLOAD 00002085: PUSH1 0x23 00002087: PUSH2 0x403a 0000208a: JUMP 0000208b: JUMPDEST 0000208c: PUSH1 0x67 0000208e: SLOAD 0000208f: PUSH1 0x40 00002091: DUP1 00002092: MLOAD 00002093: PUSH4 0x3d634725 00002098: PUSH1 0xe2 0000209a: SHL 0000209b: DUP2 0000209c: MSTORE 0000209d: SWAP1 0000209e: MLOAD 0000209f: PUSH2 0x217d 000020a2: SWAP3 000020a3: PUSH1 0x01 000020a5: PUSH1 0x01 000020a7: PUSH1 0xa0 000020a9: SHL 000020aa: SUB 000020ab: AND 000020ac: SWAP2 000020ad: PUSH4 0xf58d1c94 000020b2: SWAP2 000020b3: PUSH1 0x04 000020b5: DUP1 000020b6: DUP4 000020b7: ADD 000020b8: SWAP3 000020b9: PUSH1 0x20 000020bb: SWAP3 000020bc: SWAP2 000020bd: SWAP1 000020be: DUP3 000020bf: SWAP1 000020c0: SUB 000020c1: ADD 000020c2: DUP2 000020c3: DUP7 000020c4: DUP1 000020c5: EXTCODESIZE 000020c6: ISZERO 000020c7: DUP1 000020c8: ISZERO 000020c9: PUSH2 0x20d1 000020cc: JUMPI 000020cd: PUSH1 0x00 000020cf: DUP1 000020d0: REVERT 000020d1: JUMPDEST 000020d2: POP 000020d3: GAS 000020d4: STATICCALL 000020d5: ISZERO 000020d6: DUP1 000020d7: ISZERO 000020d8: PUSH2 0x20e5 000020db: JUMPI 000020dc: RETURNDATASIZE 000020dd: PUSH1 0x00 000020df: DUP1 000020e0: RETURNDATACOPY 000020e1: RETURNDATASIZE 000020e2: PUSH1 0x00 000020e4: REVERT 000020e5: JUMPDEST 000020e6: POP 000020e7: POP 000020e8: POP 000020e9: POP 000020ea: PUSH1 0x40 000020ec: MLOAD 000020ed: RETURNDATASIZE 000020ee: PUSH1 0x20 000020f0: DUP2 000020f1: LT 000020f2: ISZERO 000020f3: PUSH2 0x20fb 000020f6: JUMPI 000020f7: PUSH1 0x00 000020f9: DUP1 000020fa: REVERT 000020fb: JUMPDEST 000020fc: POP 000020fd: MLOAD 000020fe: PUSH1 0x40 00002100: DUP1 00002101: MLOAD 00002102: PUSH4 0x0cbefec9 00002107: PUSH1 0xe3 00002109: SHL 0000210a: DUP2 0000210b: MSTORE 0000210c: SWAP1 0000210d: MLOAD 0000210e: PUSH1 0x01 00002110: PUSH1 0x01 00002112: PUSH1 0xa0 00002114: SHL 00002115: SUB 00002116: SWAP1 00002117: SWAP3 00002118: AND 00002119: SWAP2 0000211a: PUSH4 0x65f7f648 0000211f: SWAP2 00002120: PUSH1 0x04 00002122: DUP1 00002123: DUP3 00002124: ADD 00002125: SWAP3 00002126: PUSH1 0x20 00002128: SWAP3 00002129: SWAP1 0000212a: SWAP2 0000212b: SWAP1 0000212c: DUP3 0000212d: SWAP1 0000212e: SUB 0000212f: ADD 00002130: DUP2 00002131: DUP7 00002132: DUP1 00002133: EXTCODESIZE 00002134: ISZERO 00002135: DUP1 00002136: ISZERO 00002137: PUSH2 0x213f 0000213a: JUMPI 0000213b: PUSH1 0x00 0000213d: DUP1 0000213e: REVERT 0000213f: JUMPDEST 00002140: POP 00002141: GAS 00002142: STATICCALL 00002143: ISZERO 00002144: DUP1 00002145: ISZERO 00002146: PUSH2 0x2153 00002149: JUMPI 0000214a: RETURNDATASIZE 0000214b: PUSH1 0x00 0000214d: DUP1 0000214e: RETURNDATACOPY 0000214f: RETURNDATASIZE 00002150: PUSH1 0x00 00002152: REVERT 00002153: JUMPDEST 00002154: POP 00002155: POP 00002156: POP 00002157: POP 00002158: PUSH1 0x40 0000215a: MLOAD 0000215b: RETURNDATASIZE 0000215c: PUSH1 0x20 0000215e: DUP2 0000215f: LT 00002160: ISZERO 00002161: PUSH2 0x2169 00002164: JUMPI 00002165: PUSH1 0x00 00002167: DUP1 00002168: REVERT 00002169: JUMPDEST 0000216a: POP 0000216b: MLOAD 0000216c: PUSH1 0x01 0000216e: PUSH1 0x01 00002170: PUSH1 0xa0 00002172: SHL 00002173: SUB 00002174: AND 00002175: ADDRESS 00002176: EQ 00002177: PUSH1 0x7a 00002179: PUSH2 0x403a 0000217c: JUMP 0000217d: JUMPDEST 0000217e: PUSH2 0x219e 00002181: PUSH4 0x0784ce00 00002186: DUP4 00002187: GT 00002188: ISZERO 00002189: DUP1 0000218a: ISZERO 0000218b: PUSH2 0x2197 0000218e: JUMPI 0000218f: POP 00002190: PUSH3 0xf14280 00002194: DUP4 00002195: LT 00002196: ISZERO 00002197: JUMPDEST 00002198: PUSH1 0x86 0000219a: PUSH2 0x403a 0000219d: JUMP 0000219e: JUMPDEST 0000219f: PUSH2 0x2243 000021a2: PUSH1 0x77 000021a4: SLOAD 000021a5: PUSH2 0x21ad 000021a8: DUP6 000021a9: PUSH2 0x2360 000021ac: JUMP 000021ad: JUMPDEST 000021ae: LT 000021af: ISZERO 000021b0: DUP1 000021b1: ISZERO 000021b2: PUSH2 0x223c 000021b5: JUMPI 000021b6: POP 000021b7: PUSH1 0x67 000021b9: PUSH1 0x00 000021bb: SWAP1 000021bc: SLOAD 000021bd: SWAP1 000021be: PUSH2 0x0100 000021c1: EXP 000021c2: SWAP1 000021c3: DIV 000021c4: PUSH1 0x01 000021c6: PUSH1 0x01 000021c8: PUSH1 0xa0 000021ca: SHL 000021cb: SUB 000021cc: AND 000021cd: PUSH1 0x01 000021cf: PUSH1 0x01 000021d1: PUSH1 0xa0 000021d3: SHL 000021d4: SUB 000021d5: AND 000021d6: PUSH4 0xf58d1c94 000021db: PUSH1 0x40 000021dd: MLOAD 000021de: DUP2 000021df: PUSH4 0xffffffff 000021e4: AND 000021e5: PUSH1 0xe0 000021e7: SHL 000021e8: DUP2 000021e9: MSTORE 000021ea: PUSH1 0x04 000021ec: ADD 000021ed: PUSH1 0x20 000021ef: PUSH1 0x40 000021f1: MLOAD 000021f2: DUP1 000021f3: DUP4 000021f4: SUB 000021f5: DUP2 000021f6: DUP7 000021f7: DUP1 000021f8: EXTCODESIZE 000021f9: ISZERO 000021fa: DUP1 000021fb: ISZERO 000021fc: PUSH2 0x2204 000021ff: JUMPI 00002200: PUSH1 0x00 00002202: DUP1 00002203: REVERT 00002204: JUMPDEST 00002205: POP 00002206: GAS 00002207: STATICCALL 00002208: ISZERO 00002209: DUP1 0000220a: ISZERO 0000220b: PUSH2 0x2218 0000220e: JUMPI 0000220f: RETURNDATASIZE 00002210: PUSH1 0x00 00002212: DUP1 00002213: RETURNDATACOPY 00002214: RETURNDATASIZE 00002215: PUSH1 0x00 00002217: REVERT 00002218: JUMPDEST 00002219: POP 0000221a: POP 0000221b: POP 0000221c: POP 0000221d: PUSH1 0x40 0000221f: MLOAD 00002220: RETURNDATASIZE 00002221: PUSH1 0x20 00002223: DUP2 00002224: LT 00002225: ISZERO 00002226: PUSH2 0x222e 00002229: JUMPI 0000222a: PUSH1 0x00 0000222c: DUP1 0000222d: REVERT 0000222e: JUMPDEST 0000222f: POP 00002230: MLOAD 00002231: PUSH1 0x01 00002233: PUSH1 0x01 00002235: PUSH1 0xa0 00002237: SHL 00002238: SUB 00002239: AND 0000223a: CALLER 0000223b: EQ 0000223c: JUMPDEST 0000223d: PUSH1 0x0f 0000223f: PUSH2 0x403a 00002242: JUMP 00002243: JUMPDEST 00002244: PUSH1 0x01 00002246: PUSH1 0x01 00002248: PUSH1 0xa0 0000224a: SHL 0000224b: SUB 0000224c: DUP4 0000224d: AND 0000224e: PUSH1 0x00 00002250: SWAP1 00002251: DUP2 00002252: MSTORE 00002253: PUSH1 0x93 00002255: PUSH1 0x20 00002257: MSTORE 00002258: PUSH1 0x40 0000225a: SWAP1 0000225b: KECCAK256 0000225c: SLOAD 0000225d: PUSH2 0x228e 00002260: SWAP1 00002261: DUP4 00002262: LT 00002263: ISZERO 00002264: DUP1 00002265: PUSH2 0x2197 00002268: JUMPI 00002269: POP 0000226a: PUSH2 0x2272 0000226d: DUP5 0000226e: PUSH2 0x4048 00002271: JUMP 00002272: JUMPDEST 00002273: PUSH2 0x2285 00002276: PUSH2 0x227e 00002279: DUP7 0000227a: PUSH2 0x404f 0000227d: JUMP 0000227e: JUMPDEST 0000227f: TIMESTAMP 00002280: SWAP1 00002281: PUSH2 0x3796 00002284: JUMP 00002285: JUMPDEST 00002286: LT 00002287: ISZERO 00002288: PUSH1 0x86 0000228a: PUSH2 0x403a 0000228d: JUMP 0000228e: JUMPDEST 0000228f: PUSH1 0x01 00002291: PUSH1 0x01 00002293: PUSH1 0xa0 00002295: SHL 00002296: SUB 00002297: DUP4 00002298: AND 00002299: PUSH1 0x00 0000229b: SWAP1 0000229c: DUP2 0000229d: MSTORE 0000229e: PUSH1 0x93 000022a0: PUSH1 0x20 000022a2: MSTORE 000022a3: PUSH1 0x40 000022a5: SWAP1 000022a6: KECCAK256 000022a7: SLOAD 000022a8: DUP3 000022a9: GT 000022aa: ISZERO 000022ab: PUSH2 0x2007 000022ae: JUMPI 000022af: PUSH1 0x01 000022b1: PUSH1 0x01 000022b3: PUSH1 0xa0 000022b5: SHL 000022b6: SUB 000022b7: DUP4 000022b8: AND 000022b9: PUSH1 0x00 000022bb: SWAP1 000022bc: DUP2 000022bd: MSTORE 000022be: PUSH1 0x93 000022c0: PUSH1 0x20 000022c2: MSTORE 000022c3: PUSH1 0x40 000022c5: SWAP1 000022c6: KECCAK256 000022c7: SLOAD 000022c8: PUSH2 0x22eb 000022cb: JUMPI 000022cc: PUSH1 0x01 000022ce: PUSH1 0x01 000022d0: PUSH1 0xa0 000022d2: SHL 000022d3: SUB 000022d4: DUP4 000022d5: AND 000022d6: PUSH1 0x00 000022d8: SWAP1 000022d9: DUP2 000022da: MSTORE 000022db: PUSH1 0x93 000022dd: PUSH1 0x20 000022df: MSTORE 000022e0: PUSH1 0x40 000022e2: SWAP1 000022e3: KECCAK256 000022e4: DUP3 000022e5: SWAP1 000022e6: SSTORE 000022e7: PUSH2 0x2007 000022ea: JUMP 000022eb: JUMPDEST 000022ec: PUSH1 0x00 000022ee: PUSH2 0x22f6 000022f1: DUP5 000022f2: PUSH2 0x2360 000022f5: JUMP 000022f6: JUMPDEST 000022f7: SWAP1 000022f8: POP 000022f9: PUSH2 0x2341 000022fc: PUSH2 0x2305 000022ff: DUP3 00002300: DUP5 00002301: PUSH2 0x4096 00002304: JUMP 00002305: JUMPDEST 00002306: PUSH2 0x233b 00002309: PUSH2 0x2312 0000230c: DUP5 0000230d: DUP8 0000230e: PUSH2 0x40a6 00002311: JUMP 00002312: JUMPDEST 00002313: PUSH1 0x01 00002315: PUSH1 0x01 00002317: PUSH1 0xa0 00002319: SHL 0000231a: SUB 0000231b: DUP9 0000231c: AND 0000231d: PUSH1 0x00 0000231f: SWAP1 00002320: DUP2 00002321: MSTORE 00002322: PUSH1 0x93 00002324: PUSH1 0x20 00002326: MSTORE 00002327: PUSH1 0x40 00002329: SWAP1 0000232a: KECCAK256 0000232b: SLOAD 0000232c: PUSH2 0x2335 0000232f: SWAP1 00002330: DUP8 00002331: PUSH2 0x40a6 00002334: JUMP 00002335: JUMPDEST 00002336: SWAP1 00002337: PUSH2 0x4096 0000233a: JUMP 0000233b: JUMPDEST 0000233c: SWAP1 0000233d: PUSH2 0x40ca 00002340: JUMP 00002341: JUMPDEST 00002342: PUSH1 0x01 00002344: PUSH1 0x01 00002346: PUSH1 0xa0 00002348: SHL 00002349: SUB 0000234a: DUP6 0000234b: AND 0000234c: PUSH1 0x00 0000234e: SWAP1 0000234f: DUP2 00002350: MSTORE 00002351: PUSH1 0x93 00002353: PUSH1 0x20 00002355: MSTORE 00002356: PUSH1 0x40 00002358: SWAP1 00002359: KECCAK256 0000235a: SSTORE 0000235b: POP 0000235c: POP 0000235d: POP 0000235e: POP 0000235f: JUMP 00002360: JUMPDEST 00002361: PUSH1 0x01 00002363: PUSH1 0x01 00002365: PUSH1 0xa0 00002367: SHL 00002368: SUB 00002369: DUP2 0000236a: AND 0000236b: PUSH1 0x00 0000236d: SWAP1 0000236e: DUP2 0000236f: MSTORE 00002370: PUSH1 0x33 00002372: PUSH1 0x20 00002374: MSTORE 00002375: PUSH1 0x40 00002377: SWAP1 00002378: KECCAK256 00002379: SLOAD 0000237a: JUMPDEST 0000237b: SWAP2 0000237c: SWAP1 0000237d: POP 0000237e: JUMP 0000237f: JUMPDEST 00002380: PUSH1 0x6f 00002382: SLOAD 00002383: DUP2 00002384: JUMP 00002385: JUMPDEST 00002386: PUSH1 0x85 00002388: SLOAD 00002389: PUSH2 0x0100 0000238c: SWAP1 0000238d: DIV 0000238e: PUSH1 0xff 00002390: AND 00002391: DUP2 00002392: JUMP 00002393: JUMPDEST 00002394: PUSH1 0x6d 00002396: SLOAD 00002397: DUP2 00002398: JUMP 00002399: JUMPDEST 0000239a: PUSH1 0x8b 0000239c: SLOAD 0000239d: DUP2 0000239e: JUMP 0000239f: JUMPDEST 000023a0: PUSH1 0x02 000023a2: PUSH1 0x65 000023a4: SLOAD 000023a5: EQ 000023a6: ISZERO 000023a7: PUSH2 0x23f7 000023aa: JUMPI 000023ab: PUSH1 0x40 000023ad: DUP1 000023ae: MLOAD 000023af: PUSH3 0x461bcd 000023b3: PUSH1 0xe5 000023b5: SHL 000023b6: DUP2 000023b7: MSTORE 000023b8: PUSH1 0x20 000023ba: PUSH1 0x04 000023bc: DUP3 000023bd: ADD 000023be: MSTORE 000023bf: PUSH1 0x1f 000023c1: PUSH1 0x24 000023c3: DUP3 000023c4: ADD 000023c5: MSTORE 000023c6: PUSH32 0x5265656e7472616e637947756172643a207265656e7472616e742063616c6c00 000023e7: PUSH1 0x44 000023e9: DUP3 000023ea: ADD 000023eb: MSTORE 000023ec: SWAP1 000023ed: MLOAD 000023ee: SWAP1 000023ef: DUP2 000023f0: SWAP1 000023f1: SUB 000023f2: PUSH1 0x64 000023f4: ADD 000023f5: SWAP1 000023f6: REVERT 000023f7: JUMPDEST 000023f8: PUSH1 0x02 000023fa: PUSH1 0x65 000023fc: SSTORE 000023fd: PUSH2 0x2414 00002400: DUP5 00002401: DUP5 00002402: DUP5 00002403: CALLER 00002404: PUSH2 0x240b 00002407: PUSH2 0x4131 0000240a: JUMP 0000240b: JUMPDEST 0000240c: PUSH1 0x77 0000240e: SLOAD 0000240f: DUP8 00002410: PUSH2 0x37a6 00002413: JUMP 00002414: JUMPDEST 00002415: POP 00002416: POP 00002417: PUSH1 0x01 00002419: PUSH1 0x65 0000241b: SSTORE 0000241c: POP 0000241d: POP 0000241e: JUMP 0000241f: JUMPDEST 00002420: PUSH1 0x79 00002422: SLOAD 00002423: DUP2 00002424: JUMP 00002425: JUMPDEST 00002426: PUSH1 0x7a 00002428: SLOAD 00002429: DUP2 0000242a: JUMP 0000242b: JUMPDEST 0000242c: PUSH1 0x02 0000242e: PUSH1 0x65 00002430: SLOAD 00002431: EQ 00002432: ISZERO 00002433: PUSH2 0x2483 00002436: JUMPI 00002437: PUSH1 0x40 00002439: DUP1 0000243a: MLOAD 0000243b: PUSH3 0x461bcd 0000243f: PUSH1 0xe5 00002441: SHL 00002442: DUP2 00002443: MSTORE 00002444: PUSH1 0x20 00002446: PUSH1 0x04 00002448: DUP3 00002449: ADD 0000244a: MSTORE 0000244b: PUSH1 0x1f 0000244d: PUSH1 0x24 0000244f: DUP3 00002450: ADD 00002451: MSTORE 00002452: PUSH32 0x5265656e7472616e637947756172643a207265656e7472616e742063616c6c00 00002473: PUSH1 0x44 00002475: DUP3 00002476: ADD 00002477: MSTORE 00002478: SWAP1 00002479: MLOAD 0000247a: SWAP1 0000247b: DUP2 0000247c: SWAP1 0000247d: SUB 0000247e: PUSH1 0x64 00002480: ADD 00002481: SWAP1 00002482: REVERT 00002483: JUMPDEST 00002484: PUSH1 0x02 00002486: PUSH1 0x65 00002488: SSTORE 00002489: PUSH2 0x2492 0000248c: DUP4 0000248d: DUP6 0000248e: PUSH2 0x35be 00002491: JUMP 00002492: JUMPDEST 00002493: PUSH1 0x40 00002495: DUP1 00002496: MLOAD 00002497: PUSH32 0x4a667eb0782d5566daf0bdf399587241ea093b0424d78811ac44135dd7a8a45d 000024b8: PUSH1 0x20 000024ba: DUP1 000024bb: DUP4 000024bc: ADD 000024bd: SWAP2 000024be: SWAP1 000024bf: SWAP2 000024c0: MSTORE 000024c1: ADDRESS 000024c2: DUP3 000024c3: DUP5 000024c4: ADD 000024c5: MSTORE 000024c6: PUSH1 0x60 000024c8: DUP3 000024c9: ADD 000024ca: DUP11 000024cb: SWAP1 000024cc: MSTORE 000024cd: PUSH1 0x80 000024cf: DUP3 000024d0: ADD 000024d1: DUP10 000024d2: SWAP1 000024d3: MSTORE 000024d4: PUSH1 0xa0 000024d6: DUP3 000024d7: ADD 000024d8: DUP9 000024d9: SWAP1 000024da: MSTORE 000024db: PUSH1 0xc0 000024dd: DUP1 000024de: DUP4 000024df: ADD 000024e0: DUP9 000024e1: SWAP1 000024e2: MSTORE 000024e3: DUP4 000024e4: MLOAD 000024e5: DUP1 000024e6: DUP5 000024e7: SUB 000024e8: SWAP1 000024e9: SWAP2 000024ea: ADD 000024eb: DUP2 000024ec: MSTORE 000024ed: PUSH1 0xe0 000024ef: SWAP1 000024f0: SWAP3 000024f1: ADD 000024f2: SWAP1 000024f3: SWAP3 000024f4: MSTORE 000024f5: DUP1 000024f6: MLOAD 000024f7: SWAP2 000024f8: ADD 000024f9: KECCAK256 000024fa: PUSH1 0x00 000024fc: SWAP1 000024fd: PUSH2 0x2505 00002500: SWAP1 00002501: PUSH2 0x3668 00002504: JUMP 00002505: JUMPDEST 00002506: SWAP1 00002507: POP 00002508: PUSH2 0x2515 0000250b: PUSH1 0x00 0000250d: DUP6 0000250e: GT 0000250f: PUSH1 0x6a 00002511: PUSH2 0x403a 00002514: JUMP 00002515: JUMPDEST 00002516: PUSH2 0x2522 00002519: DUP4 0000251a: DUP5 0000251b: DUP9 0000251c: DUP5 0000251d: DUP7 0000251e: PUSH2 0x36b9 00002521: JUMP 00002522: JUMPDEST 00002523: PUSH2 0x253a 00002526: PUSH10 0x012a27d53bc048700000 00002531: DUP10 00002532: GT 00002533: ISZERO 00002534: PUSH1 0x7b 00002536: PUSH2 0x403a 00002539: JUMP 0000253a: JUMPDEST 0000253b: PUSH1 0x66 0000253d: SLOAD 0000253e: PUSH2 0x2552 00002541: SWAP1 00002542: PUSH1 0x01 00002544: PUSH1 0x01 00002546: PUSH1 0xa0 00002548: SHL 00002549: SUB 0000254a: AND 0000254b: DUP5 0000254c: CALLER 0000254d: DUP8 0000254e: PUSH2 0x3cc6 00002551: JUMP 00002552: JUMPDEST 00002553: PUSH2 0x255f 00002556: DUP4 00002557: DUP10 00002558: DUP10 00002559: PUSH1 0x00 0000255b: PUSH2 0x3e26 0000255e: JUMP 0000255f: JUMPDEST 00002560: POP 00002561: POP 00002562: PUSH1 0x01 00002564: PUSH1 0x65 00002566: SSTORE 00002567: POP 00002568: POP 00002569: POP 0000256a: POP 0000256b: POP 0000256c: POP 0000256d: JUMP 0000256e: JUMPDEST 0000256f: PUSH1 0x02 00002571: PUSH1 0x65 00002573: SLOAD 00002574: EQ 00002575: ISZERO 00002576: PUSH2 0x25c6 00002579: JUMPI 0000257a: PUSH1 0x40 0000257c: DUP1 0000257d: MLOAD 0000257e: PUSH3 0x461bcd 00002582: PUSH1 0xe5 00002584: SHL 00002585: DUP2 00002586: MSTORE 00002587: PUSH1 0x20 00002589: PUSH1 0x04 0000258b: DUP3 0000258c: ADD 0000258d: MSTORE 0000258e: PUSH1 0x1f 00002590: PUSH1 0x24 00002592: DUP3 00002593: ADD 00002594: MSTORE 00002595: PUSH32 0x5265656e7472616e637947756172643a207265656e7472616e742063616c6c00 000025b6: PUSH1 0x44 000025b8: DUP3 000025b9: ADD 000025ba: MSTORE 000025bb: SWAP1 000025bc: MLOAD 000025bd: SWAP1 000025be: DUP2 000025bf: SWAP1 000025c0: SUB 000025c1: PUSH1 0x64 000025c3: ADD 000025c4: SWAP1 000025c5: REVERT 000025c6: JUMPDEST 000025c7: PUSH1 0x02 000025c9: PUSH1 0x65 000025cb: SSTORE 000025cc: PUSH2 0x25d5 000025cf: DUP4 000025d0: DUP7 000025d1: PUSH2 0x35be 000025d4: JUMP 000025d5: JUMPDEST 000025d6: PUSH1 0x67 000025d8: SLOAD 000025d9: PUSH1 0x40 000025db: DUP1 000025dc: MLOAD 000025dd: PUSH4 0x3d634725 000025e2: PUSH1 0xe2 000025e4: SHL 000025e5: DUP2 000025e6: MSTORE 000025e7: SWAP1 000025e8: MLOAD 000025e9: PUSH1 0x00 000025eb: SWAP3 000025ec: PUSH1 0x01 000025ee: PUSH1 0x01 000025f0: PUSH1 0xa0 000025f2: SHL 000025f3: SUB 000025f4: AND 000025f5: SWAP2 000025f6: PUSH4 0xf58d1c94 000025fb: SWAP2 000025fc: PUSH1 0x04 000025fe: DUP1 000025ff: DUP4 00002600: ADD 00002601: SWAP3 00002602: PUSH1 0x20 00002604: SWAP3 00002605: SWAP2 00002606: SWAP1 00002607: DUP3 00002608: SWAP1 00002609: SUB 0000260a: ADD 0000260b: DUP2 0000260c: DUP7 0000260d: DUP1 0000260e: EXTCODESIZE 0000260f: ISZERO 00002610: DUP1 00002611: ISZERO 00002612: PUSH2 0x261a 00002615: JUMPI 00002616: PUSH1 0x00 00002618: DUP1 00002619: REVERT 0000261a: JUMPDEST 0000261b: POP 0000261c: GAS 0000261d: STATICCALL 0000261e: ISZERO 0000261f: DUP1 00002620: ISZERO 00002621: PUSH2 0x262e 00002624: JUMPI 00002625: RETURNDATASIZE 00002626: PUSH1 0x00 00002628: DUP1 00002629: RETURNDATACOPY 0000262a: RETURNDATASIZE 0000262b: PUSH1 0x00 0000262d: REVERT 0000262e: JUMPDEST 0000262f: POP 00002630: POP 00002631: POP 00002632: POP 00002633: PUSH1 0x40 00002635: MLOAD 00002636: RETURNDATASIZE 00002637: PUSH1 0x20 00002639: DUP2 0000263a: LT 0000263b: ISZERO 0000263c: PUSH2 0x2644 0000263f: JUMPI 00002640: PUSH1 0x00 00002642: DUP1 00002643: REVERT 00002644: JUMPDEST 00002645: POP 00002646: MLOAD 00002647: PUSH1 0x40 00002649: DUP1 0000264a: MLOAD 0000264b: PUSH4 0x0cbefec9 00002650: PUSH1 0xe3 00002652: SHL 00002653: DUP2 00002654: MSTORE 00002655: SWAP1 00002656: MLOAD 00002657: PUSH1 0x01 00002659: PUSH1 0x01 0000265b: PUSH1 0xa0 0000265d: SHL 0000265e: SUB 0000265f: SWAP1 00002660: SWAP3 00002661: AND 00002662: SWAP2 00002663: PUSH4 0x65f7f648 00002668: SWAP2 00002669: PUSH1 0x04 0000266b: DUP1 0000266c: DUP3 0000266d: ADD 0000266e: SWAP3 0000266f: PUSH1 0x20 00002671: SWAP3 00002672: SWAP1 00002673: SWAP2 00002674: SWAP1 00002675: DUP3 00002676: SWAP1 00002677: SUB 00002678: ADD 00002679: DUP2 0000267a: DUP7 0000267b: DUP1 0000267c: EXTCODESIZE 0000267d: ISZERO 0000267e: DUP1 0000267f: ISZERO 00002680: PUSH2 0x2688 00002683: JUMPI 00002684: PUSH1 0x00 00002686: DUP1 00002687: REVERT 00002688: JUMPDEST 00002689: POP 0000268a: GAS 0000268b: STATICCALL 0000268c: ISZERO 0000268d: DUP1 0000268e: ISZERO 0000268f: PUSH2 0x269c 00002692: JUMPI 00002693: RETURNDATASIZE 00002694: PUSH1 0x00 00002696: DUP1 00002697: RETURNDATACOPY 00002698: RETURNDATASIZE 00002699: PUSH1 0x00 0000269b: REVERT 0000269c: JUMPDEST 0000269d: POP 0000269e: POP 0000269f: POP 000026a0: POP 000026a1: PUSH1 0x40 000026a3: MLOAD 000026a4: RETURNDATASIZE 000026a5: PUSH1 0x20 000026a7: DUP2 000026a8: LT 000026a9: ISZERO 000026aa: PUSH2 0x26b2 000026ad: JUMPI 000026ae: PUSH1 0x00 000026b0: DUP1 000026b1: REVERT 000026b2: JUMPDEST 000026b3: DUP2 000026b4: ADD 000026b5: SWAP1 000026b6: DUP1 000026b7: DUP1 000026b8: MLOAD 000026b9: SWAP1 000026ba: PUSH1 0x20 000026bc: ADD 000026bd: SWAP1 000026be: SWAP3 000026bf: SWAP2 000026c0: SWAP1 000026c1: POP 000026c2: POP 000026c3: POP 000026c4: SWAP1 000026c5: POP 000026c6: PUSH1 0x00 000026c8: PUSH2 0x2768 000026cb: PUSH32 0x3b316a46c148535e4353962e052926fc1375db328a64d9bf0d8311a12095015f 000026ec: DUP4 000026ed: DUP15 000026ee: DUP15 000026ef: DUP15 000026f0: DUP15 000026f1: DUP15 000026f2: DUP15 000026f3: DUP13 000026f4: PUSH1 0x40 000026f6: MLOAD 000026f7: PUSH1 0x20 000026f9: ADD 000026fa: DUP1 000026fb: DUP11 000026fc: DUP2 000026fd: MSTORE 000026fe: PUSH1 0x20 00002700: ADD 00002701: DUP10 00002702: PUSH1 0x01 00002704: PUSH1 0x01 00002706: PUSH1 0xa0 00002708: SHL 00002709: SUB 0000270a: AND 0000270b: DUP2 0000270c: MSTORE 0000270d: PUSH1 0x20 0000270f: ADD 00002710: DUP9 00002711: DUP2 00002712: MSTORE 00002713: PUSH1 0x20 00002715: ADD 00002716: DUP8 00002717: DUP2 00002718: MSTORE 00002719: PUSH1 0x20 0000271b: ADD 0000271c: DUP7 0000271d: DUP2 0000271e: MSTORE 0000271f: PUSH1 0x20 00002721: ADD 00002722: DUP6 00002723: DUP2 00002724: MSTORE 00002725: PUSH1 0x20 00002727: ADD 00002728: DUP5 00002729: DUP2 0000272a: MSTORE 0000272b: PUSH1 0x20 0000272d: ADD 0000272e: DUP4 0000272f: DUP2 00002730: MSTORE 00002731: PUSH1 0x20 00002733: ADD 00002734: DUP3 00002735: PUSH1 0x01 00002737: PUSH1 0x01 00002739: PUSH1 0xa0 0000273b: SHL 0000273c: SUB 0000273d: AND 0000273e: DUP2 0000273f: MSTORE 00002740: PUSH1 0x20 00002742: ADD 00002743: SWAP10 00002744: POP 00002745: POP 00002746: POP 00002747: POP 00002748: POP 00002749: POP 0000274a: POP 0000274b: POP 0000274c: POP 0000274d: POP 0000274e: PUSH1 0x40 00002750: MLOAD 00002751: PUSH1 0x20 00002753: DUP2 00002754: DUP4 00002755: SUB 00002756: SUB 00002757: DUP2 00002758: MSTORE 00002759: SWAP1 0000275a: PUSH1 0x40 0000275c: MSTORE 0000275d: DUP1 0000275e: MLOAD 0000275f: SWAP1 00002760: PUSH1 0x20 00002762: ADD 00002763: KECCAK256 00002764: PUSH2 0x3668 00002767: JUMP 00002768: JUMPDEST 00002769: SWAP1 0000276a: POP 0000276b: PUSH2 0x2777 0000276e: DUP5 0000276f: DUP6 00002770: DUP12 00002771: DUP5 00002772: DUP8 00002773: PUSH2 0x36b9 00002776: JUMP 00002777: JUMPDEST 00002778: PUSH2 0x2785 0000277b: PUSH1 0x00 0000277d: DUP7 0000277e: GT 0000277f: PUSH1 0x6a 00002781: PUSH2 0x403a 00002784: JUMP 00002785: JUMPDEST 00002786: PUSH2 0x279d 00002789: PUSH10 0x012a27d53bc048700000 00002794: DUP14 00002795: GT 00002796: ISZERO 00002797: PUSH1 0x7b 00002799: PUSH2 0x403a 0000279c: JUMP 0000279d: JUMPDEST 0000279e: PUSH1 0x66 000027a0: SLOAD 000027a1: PUSH2 0x27b5 000027a4: SWAP1 000027a5: PUSH1 0x01 000027a7: PUSH1 0x01 000027a9: PUSH1 0xa0 000027ab: SHL 000027ac: SUB 000027ad: AND 000027ae: DUP6 000027af: CALLER 000027b0: DUP9 000027b1: PUSH2 0x3cc6 000027b4: JUMP 000027b5: JUMPDEST 000027b6: PUSH2 0x27c2 000027b9: DUP5 000027ba: DUP14 000027bb: DUP14 000027bc: PUSH1 0x01 000027be: PUSH2 0x3e26 000027c1: JUMP 000027c2: JUMPDEST 000027c3: PUSH2 0x27cc 000027c6: DUP3 000027c7: DUP14 000027c8: PUSH2 0x4006 000027cb: JUMP 000027cc: JUMPDEST 000027cd: DUP4 000027ce: PUSH1 0x90 000027d0: PUSH1 0x00 000027d2: PUSH2 0x0100 000027d5: EXP 000027d6: DUP2 000027d7: SLOAD 000027d8: DUP2 000027d9: PUSH1 0x01 000027db: PUSH1 0x01 000027dd: PUSH1 0xa0 000027df: SHL 000027e0: SUB 000027e1: MUL 000027e2: NOT 000027e3: AND 000027e4: SWAP1 000027e5: DUP4 000027e6: PUSH1 0x01 000027e8: PUSH1 0x01 000027ea: PUSH1 0xa0 000027ec: SHL 000027ed: SUB 000027ee: AND 000027ef: MUL 000027f0: OR 000027f1: SWAP1 000027f2: SSTORE 000027f3: POP 000027f4: DUP2 000027f5: PUSH1 0x01 000027f7: PUSH1 0x01 000027f9: PUSH1 0xa0 000027fb: SHL 000027fc: SUB 000027fd: AND 000027fe: PUSH4 0xbe546f5e 00002803: DUP14 00002804: DUP14 00002805: DUP14 00002806: DUP14 00002807: DUP14 00002808: DUP14 00002809: DUP12 0000280a: DUP15 0000280b: ADDRESS 0000280c: DUP14 0000280d: PUSH1 0x40 0000280f: MLOAD 00002810: DUP12 00002811: PUSH4 0xffffffff 00002816: AND 00002817: PUSH1 0xe0 00002819: SHL 0000281a: DUP2 0000281b: MSTORE 0000281c: PUSH1 0x04 0000281e: ADD 0000281f: DUP1 00002820: DUP12 00002821: DUP2 00002822: MSTORE 00002823: PUSH1 0x20 00002825: ADD 00002826: DUP11 00002827: DUP2 00002828: MSTORE 00002829: PUSH1 0x20 0000282b: ADD 0000282c: DUP10 0000282d: DUP2 0000282e: MSTORE 0000282f: PUSH1 0x20 00002831: ADD 00002832: DUP9 00002833: DUP2 00002834: MSTORE 00002835: PUSH1 0x20 00002837: ADD 00002838: DUP8 00002839: DUP2 0000283a: MSTORE 0000283b: PUSH1 0x20 0000283d: ADD 0000283e: DUP7 0000283f: DUP2 00002840: MSTORE 00002841: PUSH1 0x20 00002843: ADD 00002844: DUP6 00002845: PUSH1 0x01 00002847: PUSH1 0x01 00002849: PUSH1 0xa0 0000284b: SHL 0000284c: SUB 0000284d: AND 0000284e: DUP2 0000284f: MSTORE 00002850: PUSH1 0x20 00002852: ADD 00002853: DUP5 00002854: DUP2 00002855: MSTORE 00002856: PUSH1 0x20 00002858: ADD 00002859: DUP4 0000285a: PUSH1 0x01 0000285c: PUSH1 0x01 0000285e: PUSH1 0xa0 00002860: SHL 00002861: SUB 00002862: AND 00002863: DUP2 00002864: MSTORE 00002865: PUSH1 0x20 00002867: ADD 00002868: DUP1 00002869: PUSH1 0x20 0000286b: ADD 0000286c: DUP3 0000286d: DUP2 0000286e: SUB 0000286f: DUP3 00002870: MSTORE 00002871: DUP4 00002872: DUP2 00002873: DUP2 00002874: MLOAD 00002875: DUP2 00002876: MSTORE 00002877: PUSH1 0x20 00002879: ADD 0000287a: SWAP2 0000287b: POP 0000287c: DUP1 0000287d: MLOAD 0000287e: SWAP1 0000287f: PUSH1 0x20 00002881: ADD 00002882: SWAP1 00002883: DUP1 00002884: DUP4 00002885: DUP4 00002886: PUSH1 0x00 00002888: JUMPDEST 00002889: DUP4 0000288a: DUP2 0000288b: LT 0000288c: ISZERO 0000288d: PUSH2 0x28a0 00002890: JUMPI 00002891: DUP2 00002892: DUP2 00002893: ADD 00002894: MLOAD 00002895: DUP4 00002896: DUP3 00002897: ADD 00002898: MSTORE 00002899: PUSH1 0x20 0000289b: ADD 0000289c: PUSH2 0x2888 0000289f: JUMP 000028a0: JUMPDEST 000028a1: POP 000028a2: POP 000028a3: POP 000028a4: POP 000028a5: SWAP1 000028a6: POP 000028a7: SWAP1 000028a8: DUP2 000028a9: ADD 000028aa: SWAP1 000028ab: PUSH1 0x1f 000028ad: AND 000028ae: DUP1 000028af: ISZERO 000028b0: PUSH2 0x28cd 000028b3: JUMPI 000028b4: DUP1 000028b5: DUP3 000028b6: SUB 000028b7: DUP1 000028b8: MLOAD 000028b9: PUSH1 0x01 000028bb: DUP4 000028bc: PUSH1 0x20 000028be: SUB 000028bf: PUSH2 0x0100 000028c2: EXP 000028c3: SUB 000028c4: NOT 000028c5: AND 000028c6: DUP2 000028c7: MSTORE 000028c8: PUSH1 0x20 000028ca: ADD 000028cb: SWAP2 000028cc: POP 000028cd: JUMPDEST 000028ce: POP 000028cf: SWAP12 000028d0: POP 000028d1: POP 000028d2: POP 000028d3: POP 000028d4: POP 000028d5: POP 000028d6: POP 000028d7: POP 000028d8: POP 000028d9: POP 000028da: POP 000028db: POP 000028dc: PUSH1 0x00 000028de: PUSH1 0x40 000028e0: MLOAD 000028e1: DUP1 000028e2: DUP4 000028e3: SUB 000028e4: DUP2 000028e5: PUSH1 0x00 000028e7: DUP8 000028e8: DUP1 000028e9: EXTCODESIZE 000028ea: ISZERO 000028eb: DUP1 000028ec: ISZERO 000028ed: PUSH2 0x28f5 000028f0: JUMPI 000028f1: PUSH1 0x00 000028f3: DUP1 000028f4: REVERT 000028f5: JUMPDEST 000028f6: POP 000028f7: GAS 000028f8: CALL 000028f9: ISZERO 000028fa: DUP1 000028fb: ISZERO 000028fc: PUSH2 0x2909 000028ff: JUMPI 00002900: RETURNDATASIZE 00002901: PUSH1 0x00 00002903: DUP1 00002904: RETURNDATACOPY 00002905: RETURNDATASIZE 00002906: PUSH1 0x00 00002908: REVERT 00002909: JUMPDEST 0000290a: POP 0000290b: POP 0000290c: PUSH1 0x90 0000290e: DUP1 0000290f: SLOAD 00002910: PUSH32 0xffffffffffffffffffffffff0000000000000000000000000000000000000000 00002931: AND 00002932: SWAP1 00002933: SSTORE 00002934: POP 00002935: POP 00002936: PUSH1 0x40 00002938: DUP1 00002939: MLOAD 0000293a: DUP14 0000293b: DUP2 0000293c: MSTORE 0000293d: SWAP1 0000293e: MLOAD 0000293f: PUSH1 0x01 00002941: PUSH1 0x01 00002943: PUSH1 0xa0 00002945: SHL 00002946: SUB 00002947: DUP7 00002948: AND 00002949: SWAP2 0000294a: PUSH32 0x1886d3d8c9b71f99d9224bccca0588192d9d4428b2adab6cfcf70e8a07d4d2f2 0000296b: SWAP2 0000296c: SWAP1 0000296d: DUP2 0000296e: SWAP1 0000296f: SUB 00002970: PUSH1 0x20 00002972: ADD 00002973: SWAP1 00002974: LOG2 00002975: POP 00002976: POP 00002977: PUSH1 0x01 00002979: PUSH1 0x65 0000297b: SSTORE 0000297c: POP 0000297d: POP 0000297e: POP 0000297f: POP 00002980: POP 00002981: POP 00002982: POP 00002983: POP 00002984: POP 00002985: POP 00002986: JUMP 00002987: JUMPDEST 00002988: PUSH1 0x7c 0000298a: SLOAD 0000298b: DUP2 0000298c: JUMP 0000298d: JUMPDEST 0000298e: PUSH1 0x37 00002990: DUP1 00002991: SLOAD 00002992: PUSH1 0x40 00002994: DUP1 00002995: MLOAD 00002996: PUSH1 0x20 00002998: PUSH1 0x1f 0000299a: PUSH1 0x02 0000299c: PUSH1 0x00 0000299e: NOT 0000299f: PUSH2 0x0100 000029a2: PUSH1 0x01 000029a4: DUP9 000029a5: AND 000029a6: ISZERO 000029a7: MUL 000029a8: ADD 000029a9: SWAP1 000029aa: SWAP6 000029ab: AND 000029ac: SWAP5 000029ad: SWAP1 000029ae: SWAP5 000029af: DIV 000029b0: SWAP4 000029b1: DUP5 000029b2: ADD 000029b3: DUP2 000029b4: SWAP1 000029b5: DIV 000029b6: DUP2 000029b7: MUL 000029b8: DUP3 000029b9: ADD 000029ba: DUP2 000029bb: ADD 000029bc: SWAP1 000029bd: SWAP3 000029be: MSTORE 000029bf: DUP3 000029c0: DUP2 000029c1: MSTORE 000029c2: PUSH1 0x60 000029c4: SWAP4 000029c5: SWAP1 000029c6: SWAP3 000029c7: SWAP1 000029c8: SWAP2 000029c9: DUP4 000029ca: ADD 000029cb: DUP3 000029cc: DUP3 000029cd: DUP1 000029ce: ISZERO 000029cf: PUSH2 0x141f 000029d2: JUMPI 000029d3: DUP1 000029d4: PUSH1 0x1f 000029d6: LT 000029d7: PUSH2 0x13f4 000029da: JUMPI 000029db: PUSH2 0x0100 000029de: DUP1 000029df: DUP4 000029e0: SLOAD 000029e1: DIV 000029e2: MUL 000029e3: DUP4 000029e4: MSTORE 000029e5: SWAP2 000029e6: PUSH1 0x20 000029e8: ADD 000029e9: SWAP2 000029ea: PUSH2 0x141f 000029ed: JUMP 000029ee: JUMPDEST 000029ef: PUSH1 0x84 000029f1: SLOAD 000029f2: DUP2 000029f3: JUMP 000029f4: JUMPDEST 000029f5: PUSH1 0x00 000029f7: PUSH2 0x143e 000029fa: PUSH2 0x2a01 000029fd: PUSH2 0x325a 00002a00: JUMP 00002a01: JUMPDEST 00002a02: DUP5 00002a03: PUSH2 0x152c 00002a06: DUP6 00002a07: PUSH1 0x40 00002a09: MLOAD 00002a0a: DUP1 00002a0b: PUSH1 0x60 00002a0d: ADD 00002a0e: PUSH1 0x40 00002a10: MSTORE 00002a11: DUP1 00002a12: PUSH1 0x25 00002a14: DUP2 00002a15: MSTORE 00002a16: PUSH1 0x20 00002a18: ADD 00002a19: PUSH2 0x5c2f 00002a1c: PUSH1 0x25 00002a1e: SWAP2 00002a1f: CODECOPY 00002a20: PUSH1 0x34 00002a22: PUSH1 0x00 00002a24: PUSH2 0x2a2b 00002a27: PUSH2 0x325a 00002a2a: JUMP 00002a2b: JUMPDEST 00002a2c: PUSH1 0x01 00002a2e: PUSH1 0x01 00002a30: PUSH1 0xa0 00002a32: SHL 00002a33: SUB 00002a34: SWAP1 00002a35: DUP2 00002a36: AND 00002a37: DUP3 00002a38: MSTORE 00002a39: PUSH1 0x20 00002a3b: DUP1 00002a3c: DUP4 00002a3d: ADD 00002a3e: SWAP4 00002a3f: SWAP1 00002a40: SWAP4 00002a41: MSTORE 00002a42: PUSH1 0x40 00002a44: SWAP2 00002a45: DUP3 00002a46: ADD 00002a47: PUSH1 0x00 00002a49: SWAP1 00002a4a: DUP2 00002a4b: KECCAK256 00002a4c: SWAP2 00002a4d: DUP14 00002a4e: AND 00002a4f: DUP2 00002a50: MSTORE 00002a51: SWAP3 00002a52: MSTORE 00002a53: SWAP1 00002a54: KECCAK256 00002a55: SLOAD 00002a56: SWAP2 00002a57: SWAP1 00002a58: PUSH2 0x3527 00002a5b: JUMP 00002a5c: JUMPDEST 00002a5d: PUSH1 0x6e 00002a5f: SLOAD 00002a60: DUP2 00002a61: JUMP 00002a62: JUMPDEST 00002a63: PUSH1 0x00 00002a65: PUSH2 0x143e 00002a68: PUSH2 0x2a6f 00002a6b: PUSH2 0x325a 00002a6e: JUMP 00002a6f: JUMPDEST 00002a70: DUP5 00002a71: DUP5 00002a72: PUSH2 0x33ca 00002a75: JUMP 00002a76: JUMPDEST 00002a77: PUSH1 0x77 00002a79: SLOAD 00002a7a: DUP2 00002a7b: JUMP 00002a7c: JUMPDEST 00002a7d: PUSH1 0x8a 00002a7f: SLOAD 00002a80: DUP2 00002a81: JUMP 00002a82: JUMPDEST 00002a83: PUSH1 0x8e 00002a85: SLOAD 00002a86: DUP2 00002a87: JUMP 00002a88: JUMPDEST 00002a89: PUSH1 0x67 00002a8b: SLOAD 00002a8c: PUSH2 0x2a9d 00002a8f: SWAP1 00002a90: PUSH1 0x01 00002a92: PUSH1 0x01 00002a94: PUSH1 0xa0 00002a96: SHL 00002a97: SUB 00002a98: AND 00002a99: PUSH2 0x4319 00002a9c: JUMP 00002a9d: JUMPDEST 00002a9e: PUSH2 0x2aaa 00002aa1: DUP4 00002aa2: DUP3 00002aa3: EQ 00002aa4: PUSH1 0x6a 00002aa6: PUSH2 0x403a 00002aa9: JUMP 00002aaa: JUMPDEST 00002aab: PUSH1 0x00 00002aad: JUMPDEST 00002aae: DUP2 00002aaf: DUP2 00002ab0: LT 00002ab1: ISZERO 00002ab2: PUSH2 0x2af4 00002ab5: JUMPI 00002ab6: PUSH2 0x2aec 00002ab9: DUP6 00002aba: DUP6 00002abb: DUP4 00002abc: DUP2 00002abd: DUP2 00002abe: LT 00002abf: PUSH2 0x2ac4 00002ac2: JUMPI 00002ac3: INVALID 00002ac4: JUMPDEST 00002ac5: SWAP1 00002ac6: POP 00002ac7: PUSH1 0x20 00002ac9: MUL 00002aca: ADD 00002acb: CALLDATALOAD 00002acc: PUSH1 0x01 00002ace: PUSH1 0x01 00002ad0: PUSH1 0xa0 00002ad2: SHL 00002ad3: SUB 00002ad4: AND 00002ad5: DUP5 00002ad6: DUP5 00002ad7: DUP5 00002ad8: DUP2 00002ad9: DUP2 00002ada: LT 00002adb: PUSH2 0x2ae0 00002ade: JUMPI 00002adf: INVALID 00002ae0: JUMPDEST 00002ae1: SWAP1 00002ae2: POP 00002ae3: PUSH1 0x20 00002ae5: MUL 00002ae6: ADD 00002ae7: CALLDATALOAD 00002ae8: PUSH2 0x443e 00002aeb: JUMP 00002aec: JUMPDEST 00002aed: PUSH1 0x01 00002aef: ADD 00002af0: PUSH2 0x2aad 00002af3: JUMP 00002af4: JUMPDEST 00002af5: POP 00002af6: POP 00002af7: POP 00002af8: POP 00002af9: POP 00002afa: JUMP 00002afb: JUMPDEST 00002afc: PUSH1 0x60 00002afe: PUSH1 0x80 00002b00: DUP1 00002b01: SLOAD 00002b02: DUP1 00002b03: PUSH1 0x20 00002b05: MUL 00002b06: PUSH1 0x20 00002b08: ADD 00002b09: PUSH1 0x40 00002b0b: MLOAD 00002b0c: SWAP1 00002b0d: DUP2 00002b0e: ADD 00002b0f: PUSH1 0x40 00002b11: MSTORE 00002b12: DUP1 00002b13: SWAP3 00002b14: SWAP2 00002b15: SWAP1 00002b16: DUP2 00002b17: DUP2 00002b18: MSTORE 00002b19: PUSH1 0x20 00002b1b: ADD 00002b1c: DUP3 00002b1d: DUP1 00002b1e: SLOAD 00002b1f: DUP1 00002b20: ISZERO 00002b21: PUSH2 0x141f 00002b24: JUMPI 00002b25: PUSH1 0x20 00002b27: MUL 00002b28: DUP3 00002b29: ADD 00002b2a: SWAP2 00002b2b: SWAP1 00002b2c: PUSH1 0x00 00002b2e: MSTORE 00002b2f: PUSH1 0x20 00002b31: PUSH1 0x00 00002b33: KECCAK256 00002b34: SWAP1 00002b35: JUMPDEST 00002b36: DUP2 00002b37: SLOAD 00002b38: PUSH1 0x01 00002b3a: PUSH1 0x01 00002b3c: PUSH1 0xa0 00002b3e: SHL 00002b3f: SUB 00002b40: AND 00002b41: DUP2 00002b42: MSTORE 00002b43: PUSH1 0x01 00002b45: SWAP1 00002b46: SWAP2 00002b47: ADD 00002b48: SWAP1 00002b49: PUSH1 0x20 00002b4b: ADD 00002b4c: DUP1 00002b4d: DUP4 00002b4e: GT 00002b4f: PUSH2 0x2b35 00002b52: JUMPI 00002b53: POP 00002b54: POP 00002b55: POP 00002b56: POP 00002b57: POP 00002b58: SWAP1 00002b59: POP 00002b5a: SWAP1 00002b5b: JUMP 00002b5c: JUMPDEST 00002b5d: PUSH1 0x60 00002b5f: PUSH1 0x7f 00002b61: DUP1 00002b62: SLOAD 00002b63: DUP1 00002b64: PUSH1 0x20 00002b66: MUL 00002b67: PUSH1 0x20 00002b69: ADD 00002b6a: PUSH1 0x40 00002b6c: MLOAD 00002b6d: SWAP1 00002b6e: DUP2 00002b6f: ADD 00002b70: PUSH1 0x40 00002b72: MSTORE 00002b73: DUP1 00002b74: SWAP3 00002b75: SWAP2 00002b76: SWAP1 00002b77: DUP2 00002b78: DUP2 00002b79: MSTORE 00002b7a: PUSH1 0x20 00002b7c: ADD 00002b7d: DUP3 00002b7e: DUP1 00002b7f: SLOAD 00002b80: DUP1 00002b81: ISZERO 00002b82: PUSH2 0x141f 00002b85: JUMPI 00002b86: PUSH1 0x20 00002b88: MUL 00002b89: DUP3 00002b8a: ADD 00002b8b: SWAP2 00002b8c: SWAP1 00002b8d: PUSH1 0x00 00002b8f: MSTORE 00002b90: PUSH1 0x20 00002b92: PUSH1 0x00 00002b94: KECCAK256 00002b95: SWAP1 00002b96: DUP2 00002b97: SLOAD 00002b98: PUSH1 0x01 00002b9a: PUSH1 0x01 00002b9c: PUSH1 0xa0 00002b9e: SHL 00002b9f: SUB 00002ba0: AND 00002ba1: DUP2 00002ba2: MSTORE 00002ba3: PUSH1 0x01 00002ba5: SWAP1 00002ba6: SWAP2 00002ba7: ADD 00002ba8: SWAP1 00002ba9: PUSH1 0x20 00002bab: ADD 00002bac: DUP1 00002bad: DUP4 00002bae: GT 00002baf: PUSH2 0x2b35 00002bb2: JUMPI 00002bb3: POP 00002bb4: POP 00002bb5: POP 00002bb6: POP 00002bb7: POP 00002bb8: SWAP1 00002bb9: POP 00002bba: SWAP1 00002bbb: JUMP 00002bbc: JUMPDEST 00002bbd: PUSH1 0x74 00002bbf: SLOAD 00002bc0: DUP2 00002bc1: JUMP 00002bc2: JUMPDEST 00002bc3: PUSH1 0x6b 00002bc5: SLOAD 00002bc6: DUP2 00002bc7: JUMP 00002bc8: JUMPDEST 00002bc9: PUSH1 0x00 00002bcb: DUP1 00002bcc: PUSH1 0x67 00002bce: PUSH1 0x00 00002bd0: SWAP1 00002bd1: SLOAD 00002bd2: SWAP1 00002bd3: PUSH2 0x0100 00002bd6: EXP 00002bd7: SWAP1 00002bd8: DIV 00002bd9: PUSH1 0x01 00002bdb: PUSH1 0x01 00002bdd: PUSH1 0xa0 00002bdf: SHL 00002be0: SUB 00002be1: AND 00002be2: PUSH1 0x01 00002be4: PUSH1 0x01 00002be6: PUSH1 0xa0 00002be8: SHL 00002be9: SUB 00002bea: AND 00002beb: PUSH4 0xf58d1c94 00002bf0: PUSH1 0x40 00002bf2: MLOAD 00002bf3: DUP2 00002bf4: PUSH4 0xffffffff 00002bf9: AND 00002bfa: PUSH1 0xe0 00002bfc: SHL 00002bfd: DUP2 00002bfe: MSTORE 00002bff: PUSH1 0x04 00002c01: ADD 00002c02: PUSH1 0x20 00002c04: PUSH1 0x40 00002c06: MLOAD 00002c07: DUP1 00002c08: DUP4 00002c09: SUB 00002c0a: DUP2 00002c0b: DUP7 00002c0c: DUP1 00002c0d: EXTCODESIZE 00002c0e: ISZERO 00002c0f: DUP1 00002c10: ISZERO 00002c11: PUSH2 0x2c19 00002c14: JUMPI 00002c15: PUSH1 0x00 00002c17: DUP1 00002c18: REVERT 00002c19: JUMPDEST 00002c1a: POP 00002c1b: GAS 00002c1c: STATICCALL 00002c1d: ISZERO 00002c1e: DUP1 00002c1f: ISZERO 00002c20: PUSH2 0x2c2d 00002c23: JUMPI 00002c24: RETURNDATASIZE 00002c25: PUSH1 0x00 00002c27: DUP1 00002c28: RETURNDATACOPY 00002c29: RETURNDATASIZE 00002c2a: PUSH1 0x00 00002c2c: REVERT 00002c2d: JUMPDEST 00002c2e: POP 00002c2f: POP 00002c30: POP 00002c31: POP 00002c32: PUSH1 0x40 00002c34: MLOAD 00002c35: RETURNDATASIZE 00002c36: PUSH1 0x20 00002c38: DUP2 00002c39: LT 00002c3a: ISZERO 00002c3b: PUSH2 0x2c43 00002c3e: JUMPI 00002c3f: PUSH1 0x00 00002c41: DUP1 00002c42: REVERT 00002c43: JUMPDEST 00002c44: POP 00002c45: MLOAD 00002c46: PUSH1 0x40 00002c48: DUP1 00002c49: MLOAD 00002c4a: PUSH4 0x0cbefec9 00002c4f: PUSH1 0xe3 00002c51: SHL 00002c52: DUP2 00002c53: MSTORE 00002c54: SWAP1 00002c55: MLOAD 00002c56: PUSH1 0x01 00002c58: PUSH1 0x01 00002c5a: PUSH1 0xa0 00002c5c: SHL 00002c5d: SUB 00002c5e: SWAP1 00002c5f: SWAP3 00002c60: AND 00002c61: SWAP2 00002c62: PUSH4 0x65f7f648 00002c67: SWAP2 00002c68: PUSH1 0x04 00002c6a: DUP1 00002c6b: DUP3 00002c6c: ADD 00002c6d: SWAP3 00002c6e: PUSH1 0x20 00002c70: SWAP3 00002c71: SWAP1 00002c72: SWAP2 00002c73: SWAP1 00002c74: DUP3 00002c75: SWAP1 00002c76: SUB 00002c77: ADD 00002c78: DUP2 00002c79: DUP7 00002c7a: DUP1 00002c7b: EXTCODESIZE 00002c7c: ISZERO 00002c7d: DUP1 00002c7e: ISZERO 00002c7f: PUSH2 0x2c87 00002c82: JUMPI 00002c83: PUSH1 0x00 00002c85: DUP1 00002c86: REVERT 00002c87: JUMPDEST 00002c88: POP 00002c89: GAS 00002c8a: STATICCALL 00002c8b: ISZERO 00002c8c: DUP1 00002c8d: ISZERO 00002c8e: PUSH2 0x2c9b 00002c91: JUMPI 00002c92: RETURNDATASIZE 00002c93: PUSH1 0x00 00002c95: DUP1 00002c96: RETURNDATACOPY 00002c97: RETURNDATASIZE 00002c98: PUSH1 0x00 00002c9a: REVERT 00002c9b: JUMPDEST 00002c9c: POP 00002c9d: POP 00002c9e: POP 00002c9f: POP 00002ca0: PUSH1 0x40 00002ca2: MLOAD 00002ca3: RETURNDATASIZE 00002ca4: PUSH1 0x20 00002ca6: DUP2 00002ca7: LT 00002ca8: ISZERO 00002ca9: PUSH2 0x2cb1 00002cac: JUMPI 00002cad: PUSH1 0x00 00002caf: DUP1 00002cb0: REVERT 00002cb1: JUMPDEST 00002cb2: POP 00002cb3: MLOAD 00002cb4: SWAP1 00002cb5: POP 00002cb6: PUSH1 0x00 00002cb8: PUSH2 0x2cc0 00002cbb: DUP5 00002cbc: PUSH2 0x2360 00002cbf: JUMP 00002cc0: JUMPDEST 00002cc1: SWAP1 00002cc2: POP 00002cc3: ADDRESS 00002cc4: PUSH1 0x01 00002cc6: PUSH1 0x01 00002cc8: PUSH1 0xa0 00002cca: SHL 00002ccb: SUB 00002ccc: DUP4 00002ccd: AND 00002cce: EQ 00002ccf: PUSH2 0x2cdb 00002cd2: JUMPI 00002cd3: SWAP2 00002cd4: POP 00002cd5: PUSH2 0x237a 00002cd8: SWAP1 00002cd9: POP 00002cda: JUMP 00002cdb: JUMPDEST 00002cdc: PUSH1 0x01 00002cde: PUSH1 0x01 00002ce0: PUSH1 0xa0 00002ce2: SHL 00002ce3: SUB 00002ce4: DUP5 00002ce5: AND 00002ce6: PUSH1 0x00 00002ce8: SWAP1 00002ce9: DUP2 00002cea: MSTORE 00002ceb: PUSH1 0x93 00002ced: PUSH1 0x20 00002cef: MSTORE 00002cf0: PUSH1 0x40 00002cf2: SWAP1 00002cf3: KECCAK256 00002cf4: SLOAD 00002cf5: DUP1 00002cf6: PUSH2 0x2d0e 00002cf9: JUMPI 00002cfa: PUSH2 0x2d04 00002cfd: DUP3 00002cfe: PUSH1 0x08 00002d00: PUSH2 0x40ca 00002d03: JUMP 00002d04: JUMPDEST 00002d05: SWAP4 00002d06: POP 00002d07: POP 00002d08: POP 00002d09: POP 00002d0a: PUSH2 0x237a 00002d0d: JUMP 00002d0e: JUMPDEST 00002d0f: PUSH4 0x0784ce00 00002d14: DUP2 00002d15: LT 00002d16: PUSH2 0x2d23 00002d19: JUMPI 00002d1a: POP 00002d1b: SWAP2 00002d1c: POP 00002d1d: PUSH2 0x237a 00002d20: SWAP1 00002d21: POP 00002d22: JUMP 00002d23: JUMPDEST 00002d24: PUSH2 0x2d3b 00002d27: PUSH2 0x2d34 00002d2a: DUP3 00002d2b: PUSH4 0x0784ce00 00002d30: PUSH2 0x4530 00002d33: JUMP 00002d34: JUMPDEST 00002d35: DUP4 00002d36: SWAP1 00002d37: PUSH2 0x4548 00002d3a: JUMP 00002d3b: JUMPDEST 00002d3c: SWAP6 00002d3d: SWAP5 00002d3e: POP 00002d3f: POP 00002d40: POP 00002d41: POP 00002d42: POP 00002d43: JUMP 00002d44: JUMPDEST 00002d45: PUSH1 0x02 00002d47: PUSH1 0x65 00002d49: SLOAD 00002d4a: EQ 00002d4b: ISZERO 00002d4c: PUSH2 0x2d9c 00002d4f: JUMPI 00002d50: PUSH1 0x40 00002d52: DUP1 00002d53: MLOAD 00002d54: PUSH3 0x461bcd 00002d58: PUSH1 0xe5 00002d5a: SHL 00002d5b: DUP2 00002d5c: MSTORE 00002d5d: PUSH1 0x20 00002d5f: PUSH1 0x04 00002d61: DUP3 00002d62: ADD 00002d63: MSTORE 00002d64: PUSH1 0x1f 00002d66: PUSH1 0x24 00002d68: DUP3 00002d69: ADD 00002d6a: MSTORE 00002d6b: PUSH32 0x5265656e7472616e637947756172643a207265656e7472616e742063616c6c00 00002d8c: PUSH1 0x44 00002d8e: DUP3 00002d8f: ADD 00002d90: MSTORE 00002d91: SWAP1 00002d92: MLOAD 00002d93: SWAP1 00002d94: DUP2 00002d95: SWAP1 00002d96: SUB 00002d97: PUSH1 0x64 00002d99: ADD 00002d9a: SWAP1 00002d9b: REVERT 00002d9c: JUMPDEST 00002d9d: PUSH1 0x02 00002d9f: PUSH1 0x65 00002da1: SSTORE 00002da2: PUSH1 0x67 00002da4: SLOAD 00002da5: PUSH1 0x40 00002da7: DUP1 00002da8: MLOAD 00002da9: PUSH4 0x364d1181 00002dae: PUSH1 0xe0 00002db0: SHL 00002db1: DUP2 00002db2: MSTORE 00002db3: CALLER 00002db4: PUSH1 0x04 00002db6: DUP3 00002db7: ADD 00002db8: MSTORE 00002db9: SWAP1 00002dba: MLOAD 00002dbb: PUSH2 0x2ded 00002dbe: SWAP3 00002dbf: PUSH1 0x01 00002dc1: PUSH1 0x01 00002dc3: PUSH1 0xa0 00002dc5: SHL 00002dc6: SUB 00002dc7: AND 00002dc8: SWAP2 00002dc9: PUSH4 0x364d1181 00002dce: SWAP2 00002dcf: PUSH1 0x24 00002dd1: DUP1 00002dd2: DUP4 00002dd3: ADD 00002dd4: SWAP3 00002dd5: PUSH1 0x20 00002dd7: SWAP3 00002dd8: SWAP2 00002dd9: SWAP1 00002dda: DUP3 00002ddb: SWAP1 00002ddc: SUB 00002ddd: ADD 00002dde: DUP2 00002ddf: DUP7 00002de0: DUP1 00002de1: EXTCODESIZE 00002de2: ISZERO 00002de3: DUP1 00002de4: ISZERO 00002de5: PUSH2 0x2058 00002de8: JUMPI 00002de9: PUSH1 0x00 00002deb: DUP1 00002dec: REVERT 00002ded: JUMPDEST 00002dee: PUSH1 0x67 00002df0: SLOAD 00002df1: PUSH1 0x40 00002df3: DUP1 00002df4: MLOAD 00002df5: PUSH4 0x3d634725 00002dfa: PUSH1 0xe2 00002dfc: SHL 00002dfd: DUP2 00002dfe: MSTORE 00002dff: SWAP1 00002e00: MLOAD 00002e01: PUSH2 0x2e33 00002e04: SWAP3 00002e05: PUSH1 0x01 00002e07: PUSH1 0x01 00002e09: PUSH1 0xa0 00002e0b: SHL 00002e0c: SUB 00002e0d: AND 00002e0e: SWAP2 00002e0f: PUSH4 0xf58d1c94 00002e14: SWAP2 00002e15: PUSH1 0x04 00002e17: DUP1 00002e18: DUP4 00002e19: ADD 00002e1a: SWAP3 00002e1b: PUSH1 0x20 00002e1d: SWAP3 00002e1e: SWAP2 00002e1f: SWAP1 00002e20: DUP3 00002e21: SWAP1 00002e22: SUB 00002e23: ADD 00002e24: DUP2 00002e25: DUP7 00002e26: DUP1 00002e27: EXTCODESIZE 00002e28: ISZERO 00002e29: DUP1 00002e2a: ISZERO 00002e2b: PUSH2 0x20d1 00002e2e: JUMPI 00002e2f: PUSH1 0x00 00002e31: DUP1 00002e32: REVERT 00002e33: JUMPDEST 00002e34: PUSH1 0x40 00002e36: DUP1 00002e37: MLOAD 00002e38: PUSH32 0x3b316a46c148535e4353962e052926fc1375db328a64d9bf0d8311a12095015f 00002e59: PUSH1 0x20 00002e5b: DUP1 00002e5c: DUP4 00002e5d: ADD 00002e5e: SWAP2 00002e5f: SWAP1 00002e60: SWAP2 00002e61: MSTORE 00002e62: ADDRESS 00002e63: DUP3 00002e64: DUP5 00002e65: ADD 00002e66: MSTORE 00002e67: PUSH1 0x60 00002e69: DUP3 00002e6a: ADD 00002e6b: DUP14 00002e6c: SWAP1 00002e6d: MSTORE 00002e6e: PUSH1 0x80 00002e70: DUP3 00002e71: ADD 00002e72: DUP13 00002e73: SWAP1 00002e74: MSTORE 00002e75: PUSH1 0xa0 00002e77: DUP3 00002e78: ADD 00002e79: DUP12 00002e7a: SWAP1 00002e7b: MSTORE 00002e7c: PUSH1 0xc0 00002e7e: DUP3 00002e7f: ADD 00002e80: DUP11 00002e81: SWAP1 00002e82: MSTORE 00002e83: PUSH1 0xe0 00002e85: DUP3 00002e86: ADD 00002e87: DUP10 00002e88: SWAP1 00002e89: MSTORE 00002e8a: PUSH2 0x0100 00002e8d: DUP3 00002e8e: ADD 00002e8f: DUP9 00002e90: SWAP1 00002e91: MSTORE 00002e92: PUSH1 0x01 00002e94: PUSH1 0x01 00002e96: PUSH1 0xa0 00002e98: SHL 00002e99: SUB 00002e9a: DUP8 00002e9b: AND 00002e9c: PUSH2 0x0120 00002e9f: DUP1 00002ea0: DUP5 00002ea1: ADD 00002ea2: SWAP2 00002ea3: SWAP1 00002ea4: SWAP2 00002ea5: MSTORE 00002ea6: DUP4 00002ea7: MLOAD 00002ea8: DUP1 00002ea9: DUP5 00002eaa: SUB 00002eab: SWAP1 00002eac: SWAP2 00002ead: ADD 00002eae: DUP2 00002eaf: MSTORE 00002eb0: PUSH2 0x0140 00002eb3: SWAP1 00002eb4: SWAP3 00002eb5: ADD 00002eb6: SWAP1 00002eb7: SWAP3 00002eb8: MSTORE 00002eb9: DUP1 00002eba: MLOAD 00002ebb: SWAP2 00002ebc: ADD 00002ebd: KECCAK256 00002ebe: PUSH1 0x00 00002ec0: SWAP1 00002ec1: PUSH2 0x2ec9 00002ec4: SWAP1 00002ec5: PUSH2 0x3668 00002ec8: JUMP 00002ec9: JUMPDEST 00002eca: SWAP1 00002ecb: POP 00002ecc: PUSH2 0x2ed8 00002ecf: DUP4 00002ed0: DUP7 00002ed1: DUP10 00002ed2: DUP5 00002ed3: DUP7 00002ed4: PUSH2 0x36b9 00002ed7: JUMP 00002ed8: JUMPDEST 00002ed9: PUSH2 0x16c6 00002edc: DUP12 00002edd: DUP11 00002ede: DUP8 00002edf: DUP7 00002ee0: DUP9 00002ee1: PUSH1 0x77 00002ee3: SLOAD 00002ee4: PUSH1 0x00 00002ee6: PUSH2 0x37a6 00002ee9: JUMP 00002eea: JUMPDEST 00002eeb: PUSH1 0x75 00002eed: SLOAD 00002eee: DUP2 00002eef: JUMP 00002ef0: JUMPDEST 00002ef1: PUSH1 0x02 00002ef3: PUSH1 0x65 00002ef5: SLOAD 00002ef6: EQ 00002ef7: ISZERO 00002ef8: PUSH2 0x2f48 00002efb: JUMPI 00002efc: PUSH1 0x40 00002efe: DUP1 00002eff: MLOAD 00002f00: PUSH3 0x461bcd 00002f04: PUSH1 0xe5 00002f06: SHL 00002f07: DUP2 00002f08: MSTORE 00002f09: PUSH1 0x20 00002f0b: PUSH1 0x04 00002f0d: DUP3 00002f0e: ADD 00002f0f: MSTORE 00002f10: PUSH1 0x1f 00002f12: PUSH1 0x24 00002f14: DUP3 00002f15: ADD 00002f16: MSTORE 00002f17: PUSH32 0x5265656e7472616e637947756172643a207265656e7472616e742063616c6c00 00002f38: PUSH1 0x44 00002f3a: DUP3 00002f3b: ADD 00002f3c: MSTORE 00002f3d: SWAP1 00002f3e: MLOAD 00002f3f: SWAP1 00002f40: DUP2 00002f41: SWAP1 00002f42: SUB 00002f43: PUSH1 0x64 00002f45: ADD 00002f46: SWAP1 00002f47: REVERT 00002f48: JUMPDEST 00002f49: PUSH1 0x02 00002f4b: PUSH1 0x65 00002f4d: SSTORE 00002f4e: PUSH2 0x2f57 00002f51: DUP4 00002f52: DUP10 00002f53: PUSH2 0x35be 00002f56: JUMP 00002f57: JUMPDEST 00002f58: PUSH1 0x40 00002f5a: DUP1 00002f5b: MLOAD 00002f5c: PUSH32 0x48e615d8fee5c01aae8a4beb02057e459c71d65cdc5cf029e76a47019d54e5af 00002f7d: PUSH1 0x20 00002f7f: DUP1 00002f80: DUP4 00002f81: ADD 00002f82: SWAP2 00002f83: SWAP1 00002f84: SWAP2 00002f85: MSTORE 00002f86: ADDRESS 00002f87: DUP3 00002f88: DUP5 00002f89: ADD 00002f8a: MSTORE 00002f8b: PUSH1 0x60 00002f8d: DUP3 00002f8e: ADD 00002f8f: DUP15 00002f90: SWAP1 00002f91: MSTORE 00002f92: PUSH1 0x80 00002f94: DUP3 00002f95: ADD 00002f96: DUP14 00002f97: SWAP1 00002f98: MSTORE 00002f99: PUSH1 0xa0 00002f9b: DUP3 00002f9c: ADD 00002f9d: DUP13 00002f9e: SWAP1 00002f9f: MSTORE 00002fa0: PUSH1 0xc0 00002fa2: DUP3 00002fa3: ADD 00002fa4: DUP12 00002fa5: SWAP1 00002fa6: MSTORE 00002fa7: DUP10 00002fa8: ISZERO 00002fa9: ISZERO 00002faa: PUSH1 0xe0 00002fac: DUP1 00002fad: DUP5 00002fae: ADD 00002faf: SWAP2 00002fb0: SWAP1 00002fb1: SWAP2 00002fb2: MSTORE 00002fb3: DUP4 00002fb4: MLOAD 00002fb5: DUP1 00002fb6: DUP5 00002fb7: SUB 00002fb8: SWAP1 00002fb9: SWAP2 00002fba: ADD 00002fbb: DUP2 00002fbc: MSTORE 00002fbd: PUSH2 0x0100 00002fc0: SWAP1 00002fc1: SWAP3 00002fc2: ADD 00002fc3: SWAP1 00002fc4: SWAP3 00002fc5: MSTORE 00002fc6: DUP1 00002fc7: MLOAD 00002fc8: SWAP2 00002fc9: ADD 00002fca: KECCAK256 00002fcb: PUSH1 0x00 00002fcd: SWAP1 00002fce: PUSH2 0x2fd6 00002fd1: SWAP1 00002fd2: PUSH2 0x3668 00002fd5: JUMP 00002fd6: JUMPDEST 00002fd7: SWAP1 00002fd8: POP 00002fd9: PUSH2 0x2fe5 00002fdc: DUP4 00002fdd: DUP5 00002fde: DUP13 00002fdf: DUP5 00002fe0: DUP7 00002fe1: PUSH2 0x36b9 00002fe4: JUMP 00002fe5: JUMPDEST 00002fe6: PUSH2 0x2ffe 00002fe9: DUP13 00002fea: PUSH2 0x2ff3 00002fed: DUP14 00002fee: DUP13 00002fef: PUSH2 0x3796 00002ff2: JUMP 00002ff3: JUMPDEST 00002ff4: DUP6 00002ff5: DUP12 00002ff6: DUP12 00002ff7: DUP12 00002ff8: DUP12 00002ff9: DUP12 00002ffa: PUSH2 0x4560 00002ffd: JUMP 00002ffe: JUMPDEST 00002fff: POP 00003000: POP 00003001: PUSH1 0x01 00003003: PUSH1 0x65 00003005: SSTORE 00003006: POP 00003007: POP 00003008: POP 00003009: POP 0000300a: POP 0000300b: POP 0000300c: POP 0000300d: POP 0000300e: POP 0000300f: POP 00003010: JUMP 00003011: JUMPDEST 00003012: PUSH1 0x8c 00003014: SLOAD 00003015: DUP2 00003016: JUMP 00003017: JUMPDEST 00003018: PUSH1 0x02 0000301a: PUSH1 0x65 0000301c: SLOAD 0000301d: EQ 0000301e: ISZERO 0000301f: PUSH2 0x306f 00003022: JUMPI 00003023: PUSH1 0x40 00003025: DUP1 00003026: MLOAD 00003027: PUSH3 0x461bcd 0000302b: PUSH1 0xe5 0000302d: SHL 0000302e: DUP2 0000302f: MSTORE 00003030: PUSH1 0x20 00003032: PUSH1 0x04 00003034: DUP3 00003035: ADD 00003036: MSTORE 00003037: PUSH1 0x1f 00003039: PUSH1 0x24 0000303b: DUP3 0000303c: ADD 0000303d: MSTORE 0000303e: PUSH32 0x5265656e7472616e637947756172643a207265656e7472616e742063616c6c00 0000305f: PUSH1 0x44 00003061: DUP3 00003062: ADD 00003063: MSTORE 00003064: SWAP1 00003065: MLOAD 00003066: SWAP1 00003067: DUP2 00003068: SWAP1 00003069: SUB 0000306a: PUSH1 0x64 0000306c: ADD 0000306d: SWAP1 0000306e: REVERT 0000306f: JUMPDEST 00003070: PUSH1 0x02 00003072: PUSH1 0x65 00003074: SSTORE 00003075: PUSH2 0x308a 00003078: CALLER 00003079: PUSH1 0x01 0000307b: PUSH1 0x01 0000307d: PUSH1 0xa0 0000307f: SHL 00003080: SUB 00003081: DUP6 00003082: AND 00003083: EQ 00003084: PUSH1 0x0f 00003086: PUSH2 0x403a 00003089: JUMP 0000308a: JUMPDEST 0000308b: PUSH2 0x3113 0000308e: DUP6 0000308f: DUP6 00003090: DUP6 00003091: DUP6 00003092: DUP6 00003093: PUSH2 0x309a 00003096: PUSH2 0x4131 00003099: JUMP 0000309a: JUMPDEST 0000309b: DUP9 0000309c: PUSH2 0x30a6 0000309f: JUMPI 000030a0: PUSH1 0x00 000030a2: PUSH2 0x310c 000030a5: JUMP 000030a6: JUMPDEST 000030a7: DUP8 000030a8: PUSH1 0x01 000030aa: PUSH1 0x01 000030ac: PUSH1 0xa0 000030ae: SHL 000030af: SUB 000030b0: AND 000030b1: PUSH4 0x0126c606 000030b6: PUSH1 0x40 000030b8: MLOAD 000030b9: DUP2 000030ba: PUSH4 0xffffffff 000030bf: AND 000030c0: PUSH1 0xe0 000030c2: SHL 000030c3: DUP2 000030c4: MSTORE 000030c5: PUSH1 0x04 000030c7: ADD 000030c8: PUSH1 0x20 000030ca: PUSH1 0x40 000030cc: MLOAD 000030cd: DUP1 000030ce: DUP4 000030cf: SUB 000030d0: DUP2 000030d1: DUP7 000030d2: DUP1 000030d3: EXTCODESIZE 000030d4: ISZERO 000030d5: DUP1 000030d6: ISZERO 000030d7: PUSH2 0x30df 000030da: JUMPI 000030db: PUSH1 0x00 000030dd: DUP1 000030de: REVERT 000030df: JUMPDEST 000030e0: POP 000030e1: GAS 000030e2: STATICCALL 000030e3: ISZERO 000030e4: DUP1 000030e5: ISZERO 000030e6: PUSH2 0x30f3 000030e9: JUMPI 000030ea: RETURNDATASIZE 000030eb: PUSH1 0x00 000030ed: DUP1 000030ee: RETURNDATACOPY 000030ef: RETURNDATASIZE 000030f0: PUSH1 0x00 000030f2: REVERT 000030f3: JUMPDEST 000030f4: POP 000030f5: POP 000030f6: POP 000030f7: POP 000030f8: PUSH1 0x40 000030fa: MLOAD 000030fb: RETURNDATASIZE 000030fc: PUSH1 0x20 000030fe: DUP2 000030ff: LT 00003100: ISZERO 00003101: PUSH2 0x3109 00003104: JUMPI 00003105: PUSH1 0x00 00003107: DUP1 00003108: REVERT 00003109: JUMPDEST 0000310a: POP 0000310b: MLOAD 0000310c: JUMPDEST 0000310d: PUSH1 0x00 0000310f: PUSH2 0x4560 00003112: JUMP 00003113: JUMPDEST 00003114: POP 00003115: POP 00003116: PUSH1 0x01 00003118: PUSH1 0x65 0000311a: SSTORE 0000311b: POP 0000311c: POP 0000311d: POP 0000311e: JUMP 0000311f: JUMPDEST 00003120: PUSH1 0x01 00003122: PUSH1 0x01 00003124: PUSH1 0xa0 00003126: SHL 00003127: SUB 00003128: SWAP2 00003129: DUP3 0000312a: AND 0000312b: PUSH1 0x00 0000312d: SWAP1 0000312e: DUP2 0000312f: MSTORE 00003130: PUSH1 0x34 00003132: PUSH1 0x20 00003134: SWAP1 00003135: DUP2 00003136: MSTORE 00003137: PUSH1 0x40 00003139: DUP1 0000313a: DUP4 0000313b: KECCAK256 0000313c: SWAP4 0000313d: SWAP1 0000313e: SWAP5 0000313f: AND 00003140: DUP3 00003141: MSTORE 00003142: SWAP2 00003143: SWAP1 00003144: SWAP2 00003145: MSTORE 00003146: KECCAK256 00003147: SLOAD 00003148: SWAP1 00003149: JUMP 0000314a: JUMPDEST 0000314b: PUSH1 0x72 0000314d: SLOAD 0000314e: DUP2 0000314f: JUMP 00003150: JUMPDEST 00003151: PUSH1 0x67 00003153: SLOAD 00003154: PUSH1 0x01 00003156: PUSH1 0x01 00003158: PUSH1 0xa0 0000315a: SHL 0000315b: SUB 0000315c: AND 0000315d: DUP2 0000315e: JUMP 0000315f: JUMPDEST 00003160: PUSH1 0x66 00003162: SLOAD 00003163: PUSH1 0x01 00003165: PUSH1 0x01 00003167: PUSH1 0xa0 00003169: SHL 0000316a: SUB 0000316b: AND 0000316c: DUP2 0000316d: JUMP 0000316e: JUMPDEST 0000316f: PUSH1 0x40 00003171: MLOAD 00003172: PUSH32 0x0d74157700000000000000000000000000000000000000000000000000000000 00003193: DUP2 00003194: MSTORE 00003195: PUSH1 0x00 00003197: SWAP1 00003198: PUSH1 0x01 0000319a: PUSH1 0x01 0000319c: PUSH1 0xa0 0000319e: SHL 0000319f: SUB 000031a0: PUSH32 0x000000000000000000000000aaacb63ab80969af93b811deb81ddeb4c8710591 000031c1: AND 000031c2: SWAP1 000031c3: PUSH4 0x0d741577 000031c8: SWAP1 000031c9: PUSH2 0x31e1 000031cc: SWAP1 000031cd: PUSH1 0x01 000031cf: PUSH1 0x01 000031d1: PUSH1 0xe0 000031d3: SHL 000031d4: SUB 000031d5: NOT 000031d6: DUP6 000031d7: CALLDATALOAD 000031d8: AND 000031d9: SWAP1 000031da: PUSH1 0x04 000031dc: ADD 000031dd: PUSH2 0x59cc 000031e0: JUMP 000031e1: JUMPDEST 000031e2: PUSH1 0x20 000031e4: PUSH1 0x40 000031e6: MLOAD 000031e7: DUP1 000031e8: DUP4 000031e9: SUB 000031ea: DUP2 000031eb: DUP7 000031ec: DUP1 000031ed: EXTCODESIZE 000031ee: ISZERO 000031ef: DUP1 000031f0: ISZERO 000031f1: PUSH2 0x31f9 000031f4: JUMPI 000031f5: PUSH1 0x00 000031f7: DUP1 000031f8: REVERT 000031f9: JUMPDEST 000031fa: POP 000031fb: GAS 000031fc: STATICCALL 000031fd: ISZERO 000031fe: DUP1 000031ff: ISZERO 00003200: PUSH2 0x320d 00003203: JUMPI 00003204: RETURNDATASIZE 00003205: PUSH1 0x00 00003207: DUP1 00003208: RETURNDATACOPY 00003209: RETURNDATASIZE 0000320a: PUSH1 0x00 0000320c: REVERT 0000320d: JUMPDEST 0000320e: POP 0000320f: POP 00003210: POP 00003211: POP 00003212: PUSH1 0x40 00003214: MLOAD 00003215: RETURNDATASIZE 00003216: PUSH1 0x1f 00003218: NOT 00003219: PUSH1 0x1f 0000321b: DUP3 0000321c: ADD 0000321d: AND 0000321e: DUP3 0000321f: ADD 00003220: DUP1 00003221: PUSH1 0x40 00003223: MSTORE 00003224: POP 00003225: DUP2 00003226: ADD 00003227: SWAP1 00003228: PUSH2 0x3231 0000322b: SWAP2 0000322c: SWAP1 0000322d: PUSH2 0x59a5 00003230: JUMP 00003231: JUMPDEST 00003232: SWAP1 00003233: POP 00003234: SWAP1 00003235: JUMP 00003236: JUMPDEST 00003237: CALLDATASIZE 00003238: PUSH1 0x00 0000323a: DUP1 0000323b: CALLDATACOPY 0000323c: PUSH1 0x00 0000323e: DUP1 0000323f: CALLDATASIZE 00003240: PUSH1 0x00 00003242: DUP5 00003243: GAS 00003244: DELEGATECALL 00003245: RETURNDATASIZE 00003246: PUSH1 0x00 00003248: DUP1 00003249: RETURNDATACOPY 0000324a: DUP1 0000324b: DUP1 0000324c: ISZERO 0000324d: PUSH2 0x3255 00003250: JUMPI 00003251: RETURNDATASIZE 00003252: PUSH1 0x00 00003254: RETURN 00003255: JUMPDEST 00003256: RETURNDATASIZE 00003257: PUSH1 0x00 00003259: REVERT 0000325a: JUMPDEST 0000325b: CALLER 0000325c: SWAP1 0000325d: JUMP 0000325e: JUMPDEST 0000325f: PUSH1 0x01 00003261: PUSH1 0x01 00003263: PUSH1 0xa0 00003265: SHL 00003266: SUB 00003267: DUP4 00003268: AND 00003269: PUSH2 0x32a3 0000326c: JUMPI 0000326d: PUSH1 0x40 0000326f: MLOAD 00003270: PUSH3 0x461bcd 00003274: PUSH1 0xe5 00003276: SHL 00003277: DUP2 00003278: MSTORE 00003279: PUSH1 0x04 0000327b: ADD 0000327c: DUP1 0000327d: DUP1 0000327e: PUSH1 0x20 00003280: ADD 00003281: DUP3 00003282: DUP2 00003283: SUB 00003284: DUP3 00003285: MSTORE 00003286: PUSH1 0x24 00003288: DUP2 00003289: MSTORE 0000328a: PUSH1 0x20 0000328c: ADD 0000328d: DUP1 0000328e: PUSH2 0x5bab 00003291: PUSH1 0x24 00003293: SWAP2 00003294: CODECOPY 00003295: PUSH1 0x40 00003297: ADD 00003298: SWAP2 00003299: POP 0000329a: POP 0000329b: PUSH1 0x40 0000329d: MLOAD 0000329e: DUP1 0000329f: SWAP2 000032a0: SUB 000032a1: SWAP1 000032a2: REVERT 000032a3: JUMPDEST 000032a4: PUSH1 0x01 000032a6: PUSH1 0x01 000032a8: PUSH1 0xa0 000032aa: SHL 000032ab: SUB 000032ac: DUP3 000032ad: AND 000032ae: PUSH2 0x32e8 000032b1: JUMPI 000032b2: PUSH1 0x40 000032b4: MLOAD 000032b5: PUSH3 0x461bcd 000032b9: PUSH1 0xe5 000032bb: SHL 000032bc: DUP2 000032bd: MSTORE 000032be: PUSH1 0x04 000032c0: ADD 000032c1: DUP1 000032c2: DUP1 000032c3: PUSH1 0x20 000032c5: ADD 000032c6: DUP3 000032c7: DUP2 000032c8: SUB 000032c9: DUP3 000032ca: MSTORE 000032cb: PUSH1 0x22 000032cd: DUP2 000032ce: MSTORE 000032cf: PUSH1 0x20 000032d1: ADD 000032d2: DUP1 000032d3: PUSH2 0x5a27 000032d6: PUSH1 0x22 000032d8: SWAP2 000032d9: CODECOPY 000032da: PUSH1 0x40 000032dc: ADD 000032dd: SWAP2 000032de: POP 000032df: POP 000032e0: PUSH1 0x40 000032e2: MLOAD 000032e3: DUP1 000032e4: SWAP2 000032e5: SUB 000032e6: SWAP1 000032e7: REVERT 000032e8: JUMPDEST 000032e9: PUSH1 0x01 000032eb: PUSH1 0x01 000032ed: PUSH1 0xa0 000032ef: SHL 000032f0: SUB 000032f1: DUP1 000032f2: DUP5 000032f3: AND 000032f4: PUSH1 0x00 000032f6: DUP2 000032f7: DUP2 000032f8: MSTORE 000032f9: PUSH1 0x34 000032fb: PUSH1 0x20 000032fd: SWAP1 000032fe: DUP2 000032ff: MSTORE 00003300: PUSH1 0x40 00003302: DUP1 00003303: DUP4 00003304: KECCAK256 00003305: SWAP5 00003306: DUP8 00003307: AND 00003308: DUP1 00003309: DUP5 0000330a: MSTORE 0000330b: SWAP5 0000330c: DUP3 0000330d: MSTORE 0000330e: SWAP2 0000330f: DUP3 00003310: SWAP1 00003311: KECCAK256 00003312: DUP6 00003313: SWAP1 00003314: SSTORE 00003315: DUP2 00003316: MLOAD 00003317: DUP6 00003318: DUP2 00003319: MSTORE 0000331a: SWAP2 0000331b: MLOAD 0000331c: PUSH32 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925 0000333d: SWAP3 0000333e: DUP2 0000333f: SWAP1 00003340: SUB 00003341: SWAP1 00003342: SWAP2 00003343: ADD 00003344: SWAP1 00003345: LOG3 00003346: POP 00003347: POP 00003348: POP 00003349: JUMP 0000334a: JUMPDEST 0000334b: PUSH1 0x00 0000334d: DUP2 0000334e: MLOAD 0000334f: PUSH1 0x41 00003351: EQ 00003352: PUSH2 0x33a2 00003355: JUMPI 00003356: PUSH1 0x40 00003358: DUP1 00003359: MLOAD 0000335a: PUSH3 0x461bcd 0000335e: PUSH1 0xe5 00003360: SHL 00003361: DUP2 00003362: MSTORE 00003363: PUSH1 0x20 00003365: PUSH1 0x04 00003367: DUP3 00003368: ADD 00003369: MSTORE 0000336a: PUSH1 0x1f 0000336c: PUSH1 0x24 0000336e: DUP3 0000336f: ADD 00003370: MSTORE 00003371: PUSH32 0x45434453413a20696e76616c6964207369676e6174757265206c656e67746800 00003392: PUSH1 0x44 00003394: DUP3 00003395: ADD 00003396: MSTORE 00003397: SWAP1 00003398: MLOAD 00003399: SWAP1 0000339a: DUP2 0000339b: SWAP1 0000339c: SUB 0000339d: PUSH1 0x64 0000339f: ADD 000033a0: SWAP1 000033a1: REVERT 000033a2: JUMPDEST 000033a3: PUSH1 0x20 000033a5: DUP3 000033a6: ADD 000033a7: MLOAD 000033a8: PUSH1 0x40 000033aa: DUP4 000033ab: ADD 000033ac: MLOAD 000033ad: PUSH1 0x60 000033af: DUP5 000033b0: ADD 000033b1: MLOAD 000033b2: PUSH1 0x00 000033b4: BYTE 000033b5: PUSH2 0x33c0 000033b8: DUP7 000033b9: DUP3 000033ba: DUP6 000033bb: DUP6 000033bc: PUSH2 0x47c8 000033bf: JUMP 000033c0: JUMPDEST 000033c1: SWAP7 000033c2: SWAP6 000033c3: POP 000033c4: POP 000033c5: POP 000033c6: POP 000033c7: POP 000033c8: POP 000033c9: JUMP 000033ca: JUMPDEST 000033cb: PUSH1 0x01 000033cd: PUSH1 0x01 000033cf: PUSH1 0xa0 000033d1: SHL 000033d2: SUB 000033d3: DUP4 000033d4: AND 000033d5: PUSH2 0x340f 000033d8: JUMPI 000033d9: PUSH1 0x40 000033db: MLOAD 000033dc: PUSH3 0x461bcd 000033e0: PUSH1 0xe5 000033e2: SHL 000033e3: DUP2 000033e4: MSTORE 000033e5: PUSH1 0x04 000033e7: ADD 000033e8: DUP1 000033e9: DUP1 000033ea: PUSH1 0x20 000033ec: ADD 000033ed: DUP3 000033ee: DUP2 000033ef: SUB 000033f0: DUP3 000033f1: MSTORE 000033f2: PUSH1 0x25 000033f4: DUP2 000033f5: MSTORE 000033f6: PUSH1 0x20 000033f8: ADD 000033f9: DUP1 000033fa: PUSH2 0x5b86 000033fd: PUSH1 0x25 000033ff: SWAP2 00003400: CODECOPY 00003401: PUSH1 0x40 00003403: ADD 00003404: SWAP2 00003405: POP 00003406: POP 00003407: PUSH1 0x40 00003409: MLOAD 0000340a: DUP1 0000340b: SWAP2 0000340c: SUB 0000340d: SWAP1 0000340e: REVERT 0000340f: JUMPDEST 00003410: PUSH1 0x01 00003412: PUSH1 0x01 00003414: PUSH1 0xa0 00003416: SHL 00003417: SUB 00003418: DUP3 00003419: AND 0000341a: PUSH2 0x3454 0000341d: JUMPI 0000341e: PUSH1 0x40 00003420: MLOAD 00003421: PUSH3 0x461bcd 00003425: PUSH1 0xe5 00003427: SHL 00003428: DUP2 00003429: MSTORE 0000342a: PUSH1 0x04 0000342c: ADD 0000342d: DUP1 0000342e: DUP1 0000342f: PUSH1 0x20 00003431: ADD 00003432: DUP3 00003433: DUP2 00003434: SUB 00003435: DUP3 00003436: MSTORE 00003437: PUSH1 0x23 00003439: DUP2 0000343a: MSTORE 0000343b: PUSH1 0x20 0000343d: ADD 0000343e: DUP1 0000343f: PUSH2 0x59e2 00003442: PUSH1 0x23 00003444: SWAP2 00003445: CODECOPY 00003446: PUSH1 0x40 00003448: ADD 00003449: SWAP2 0000344a: POP 0000344b: POP 0000344c: PUSH1 0x40 0000344e: MLOAD 0000344f: DUP1 00003450: SWAP2 00003451: SUB 00003452: SWAP1 00003453: REVERT 00003454: JUMPDEST 00003455: PUSH2 0x345f 00003458: DUP4 00003459: DUP4 0000345a: DUP4 0000345b: PUSH2 0x493d 0000345e: JUMP 0000345f: JUMPDEST 00003460: PUSH2 0x349c 00003463: DUP2 00003464: PUSH1 0x40 00003466: MLOAD 00003467: DUP1 00003468: PUSH1 0x60 0000346a: ADD 0000346b: PUSH1 0x40 0000346d: MSTORE 0000346e: DUP1 0000346f: PUSH1 0x26 00003471: DUP2 00003472: MSTORE 00003473: PUSH1 0x20 00003475: ADD 00003476: PUSH2 0x5a49 00003479: PUSH1 0x26 0000347b: SWAP2 0000347c: CODECOPY 0000347d: PUSH1 0x01 0000347f: PUSH1 0x01 00003481: PUSH1 0xa0 00003483: SHL 00003484: SUB 00003485: DUP7 00003486: AND 00003487: PUSH1 0x00 00003489: SWAP1 0000348a: DUP2 0000348b: MSTORE 0000348c: PUSH1 0x33 0000348e: PUSH1 0x20 00003490: MSTORE 00003491: PUSH1 0x40 00003493: SWAP1 00003494: KECCAK256 00003495: SLOAD 00003496: SWAP2 00003497: SWAP1 00003498: PUSH2 0x3527 0000349b: JUMP 0000349c: JUMPDEST 0000349d: PUSH1 0x01 0000349f: PUSH1 0x01 000034a1: PUSH1 0xa0 000034a3: SHL 000034a4: SUB 000034a5: DUP1 000034a6: DUP6 000034a7: AND 000034a8: PUSH1 0x00 000034aa: SWAP1 000034ab: DUP2 000034ac: MSTORE 000034ad: PUSH1 0x33 000034af: PUSH1 0x20 000034b1: MSTORE 000034b2: PUSH1 0x40 000034b4: DUP1 000034b5: DUP3 000034b6: KECCAK256 000034b7: SWAP4 000034b8: SWAP1 000034b9: SWAP4 000034ba: SSTORE 000034bb: SWAP1 000034bc: DUP5 000034bd: AND 000034be: DUP2 000034bf: MSTORE 000034c0: KECCAK256 000034c1: SLOAD 000034c2: PUSH2 0x34cb 000034c5: SWAP1 000034c6: DUP3 000034c7: PUSH2 0x3d3f 000034ca: JUMP 000034cb: JUMPDEST 000034cc: PUSH1 0x01 000034ce: PUSH1 0x01 000034d0: PUSH1 0xa0 000034d2: SHL 000034d3: SUB 000034d4: DUP1 000034d5: DUP5 000034d6: AND 000034d7: PUSH1 0x00 000034d9: DUP2 000034da: DUP2 000034db: MSTORE 000034dc: PUSH1 0x33 000034de: PUSH1 0x20 000034e0: SWAP1 000034e1: DUP2 000034e2: MSTORE 000034e3: PUSH1 0x40 000034e5: SWAP2 000034e6: DUP3 000034e7: SWAP1 000034e8: KECCAK256 000034e9: SWAP5 000034ea: SWAP1 000034eb: SWAP5 000034ec: SSTORE 000034ed: DUP1 000034ee: MLOAD 000034ef: DUP6 000034f0: DUP2 000034f1: MSTORE 000034f2: SWAP1 000034f3: MLOAD 000034f4: SWAP2 000034f5: SWAP4 000034f6: SWAP3 000034f7: DUP8 000034f8: AND 000034f9: SWAP3 000034fa: PUSH32 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef 0000351b: SWAP3 0000351c: SWAP2 0000351d: DUP3 0000351e: SWAP1 0000351f: SUB 00003520: ADD 00003521: SWAP1 00003522: LOG3 00003523: POP 00003524: POP 00003525: POP 00003526: JUMP 00003527: JUMPDEST 00003528: PUSH1 0x00 0000352a: DUP2 0000352b: DUP5 0000352c: DUP5 0000352d: GT 0000352e: ISZERO 0000352f: PUSH2 0x35b6 00003532: JUMPI 00003533: PUSH1 0x40 00003535: MLOAD 00003536: PUSH3 0x461bcd 0000353a: PUSH1 0xe5 0000353c: SHL 0000353d: DUP2 0000353e: MSTORE 0000353f: PUSH1 0x04 00003541: ADD 00003542: DUP1 00003543: DUP1 00003544: PUSH1 0x20 00003546: ADD 00003547: DUP3 00003548: DUP2 00003549: SUB 0000354a: DUP3 0000354b: MSTORE 0000354c: DUP4 0000354d: DUP2 0000354e: DUP2 0000354f: MLOAD 00003550: DUP2 00003551: MSTORE 00003552: PUSH1 0x20 00003554: ADD 00003555: SWAP2 00003556: POP 00003557: DUP1 00003558: MLOAD 00003559: SWAP1 0000355a: PUSH1 0x20 0000355c: ADD 0000355d: SWAP1 0000355e: DUP1 0000355f: DUP4 00003560: DUP4 00003561: PUSH1 0x00 00003563: JUMPDEST 00003564: DUP4 00003565: DUP2 00003566: LT 00003567: ISZERO 00003568: PUSH2 0x357b 0000356b: JUMPI 0000356c: DUP2 0000356d: DUP2 0000356e: ADD 0000356f: MLOAD 00003570: DUP4 00003571: DUP3 00003572: ADD 00003573: MSTORE 00003574: PUSH1 0x20 00003576: ADD 00003577: PUSH2 0x3563 0000357a: JUMP 0000357b: JUMPDEST 0000357c: POP 0000357d: POP 0000357e: POP 0000357f: POP 00003580: SWAP1 00003581: POP 00003582: SWAP1 00003583: DUP2 00003584: ADD 00003585: SWAP1 00003586: PUSH1 0x1f 00003588: AND 00003589: DUP1 0000358a: ISZERO 0000358b: PUSH2 0x35a8 0000358e: JUMPI 0000358f: DUP1 00003590: DUP3 00003591: SUB 00003592: DUP1 00003593: MLOAD 00003594: PUSH1 0x01 00003596: DUP4 00003597: PUSH1 0x20 00003599: SUB 0000359a: PUSH2 0x0100 0000359d: EXP 0000359e: SUB 0000359f: NOT 000035a0: AND 000035a1: DUP2 000035a2: MSTORE 000035a3: PUSH1 0x20 000035a5: ADD 000035a6: SWAP2 000035a7: POP 000035a8: JUMPDEST 000035a9: POP 000035aa: SWAP3 000035ab: POP 000035ac: POP 000035ad: POP 000035ae: PUSH1 0x40 000035b0: MLOAD 000035b1: DUP1 000035b2: SWAP2 000035b3: SUB 000035b4: SWAP1 000035b5: REVERT 000035b6: JUMPDEST 000035b7: POP 000035b8: POP 000035b9: POP 000035ba: SWAP1 000035bb: SUB 000035bc: SWAP1 000035bd: JUMP 000035be: JUMPDEST 000035bf: PUSH1 0x67 000035c1: SLOAD 000035c2: PUSH1 0x40 000035c4: DUP1 000035c5: MLOAD 000035c6: PUSH32 0x411137c300000000000000000000000000000000000000000000000000000000 000035e7: DUP2 000035e8: MSTORE 000035e9: CALLER 000035ea: PUSH1 0x04 000035ec: DUP3 000035ed: ADD 000035ee: MSTORE 000035ef: SWAP1 000035f0: MLOAD 000035f1: PUSH2 0x3656 000035f4: SWAP3 000035f5: PUSH1 0x01 000035f7: PUSH1 0x01 000035f9: PUSH1 0xa0 000035fb: SHL 000035fc: SUB 000035fd: AND 000035fe: SWAP2 000035ff: PUSH4 0x411137c3 00003604: SWAP2 00003605: PUSH1 0x24 00003607: DUP1 00003608: DUP4 00003609: ADD 0000360a: SWAP3 0000360b: PUSH1 0x20 0000360d: SWAP3 0000360e: SWAP2 0000360f: SWAP1 00003610: DUP3 00003611: SWAP1 00003612: SUB 00003613: ADD 00003614: DUP2 00003615: DUP7 00003616: DUP1 00003617: EXTCODESIZE 00003618: ISZERO 00003619: DUP1 0000361a: ISZERO 0000361b: PUSH2 0x3623 0000361e: JUMPI 0000361f: PUSH1 0x00 00003621: DUP1 00003622: REVERT 00003623: JUMPDEST 00003624: POP 00003625: GAS 00003626: STATICCALL 00003627: ISZERO 00003628: DUP1 00003629: ISZERO 0000362a: PUSH2 0x3637 0000362d: JUMPI 0000362e: RETURNDATASIZE 0000362f: PUSH1 0x00 00003631: DUP1 00003632: RETURNDATACOPY 00003633: RETURNDATASIZE 00003634: PUSH1 0x00 00003636: REVERT 00003637: JUMPDEST 00003638: POP 00003639: POP 0000363a: POP 0000363b: POP 0000363c: PUSH1 0x40 0000363e: MLOAD 0000363f: RETURNDATASIZE 00003640: PUSH1 0x20 00003642: DUP2 00003643: LT 00003644: ISZERO 00003645: PUSH2 0x364d 00003648: JUMPI 00003649: PUSH1 0x00 0000364b: DUP1 0000364c: REVERT 0000364d: JUMPDEST 0000364e: POP 0000364f: MLOAD 00003650: PUSH1 0x12 00003652: PUSH2 0x403a 00003655: JUMP 00003656: JUMPDEST 00003657: PUSH2 0x3664 0000365a: DUP2 0000365b: DUP4 0000365c: GT 0000365d: ISZERO 0000365e: PUSH1 0x13 00003660: PUSH2 0x403a 00003663: JUMP 00003664: JUMPDEST 00003665: POP 00003666: POP 00003667: JUMP 00003668: JUMPDEST 00003669: PUSH1 0x40 0000366b: DUP1 0000366c: MLOAD 0000366d: PUSH32 0x19457468657265756d205369676e6564204d6573736167653a0a333200000000 0000368e: PUSH1 0x20 00003690: DUP1 00003691: DUP4 00003692: ADD 00003693: SWAP2 00003694: SWAP1 00003695: SWAP2 00003696: MSTORE 00003697: PUSH1 0x3c 00003699: DUP1 0000369a: DUP4 0000369b: ADD 0000369c: SWAP5 0000369d: SWAP1 0000369e: SWAP5 0000369f: MSTORE 000036a0: DUP3 000036a1: MLOAD 000036a2: DUP1 000036a3: DUP4 000036a4: SUB 000036a5: SWAP1 000036a6: SWAP5 000036a7: ADD 000036a8: DUP5 000036a9: MSTORE 000036aa: PUSH1 0x5c 000036ac: SWAP1 000036ad: SWAP2 000036ae: ADD 000036af: SWAP1 000036b0: SWAP2 000036b1: MSTORE 000036b2: DUP2 000036b3: MLOAD 000036b4: SWAP2 000036b5: ADD 000036b6: KECCAK256 000036b7: SWAP1 000036b8: JUMP 000036b9: JUMPDEST 000036ba: PUSH1 0x01 000036bc: PUSH1 0x01 000036be: PUSH1 0xa0 000036c0: SHL 000036c1: SUB 000036c2: DUP5 000036c3: AND 000036c4: PUSH1 0x00 000036c6: SWAP1 000036c7: DUP2 000036c8: MSTORE 000036c9: PUSH1 0x71 000036cb: PUSH1 0x20 000036cd: MSTORE 000036ce: PUSH1 0x40 000036d0: SWAP1 000036d1: KECCAK256 000036d2: PUSH1 0x07 000036d4: ADD 000036d5: SLOAD 000036d6: PUSH2 0x36e2 000036d9: SWAP1 000036da: DUP5 000036db: EQ 000036dc: PUSH1 0x59 000036de: PUSH2 0x403a 000036e1: JUMP 000036e2: JUMPDEST 000036e3: PUSH2 0x2af4 000036e6: PUSH2 0x36f9 000036e9: PUSH1 0x01 000036eb: PUSH1 0x01 000036ed: PUSH1 0xa0 000036ef: SHL 000036f0: SUB 000036f1: DUP8 000036f2: AND 000036f3: DUP5 000036f4: DUP5 000036f5: PUSH2 0x4b8e 000036f8: JUMP 000036f9: JUMPDEST 000036fa: PUSH1 0x58 000036fc: PUSH2 0x403a 000036ff: JUMP 00003700: JUMPDEST 00003701: PUSH1 0x00 00003703: PUSH2 0x149e 00003706: DUP3 00003707: PUSH2 0x3790 0000370a: PUSH1 0x66 0000370c: PUSH1 0x00 0000370e: SWAP1 0000370f: SLOAD 00003710: SWAP1 00003711: PUSH2 0x0100 00003714: EXP 00003715: SWAP1 00003716: DIV 00003717: PUSH1 0x01 00003719: PUSH1 0x01 0000371b: PUSH1 0xa0 0000371d: SHL 0000371e: SUB 0000371f: AND 00003720: PUSH1 0x01 00003722: PUSH1 0x01 00003724: PUSH1 0xa0 00003726: SHL 00003727: SUB 00003728: AND 00003729: PUSH4 0x313ce567 0000372e: PUSH1 0x40 00003730: MLOAD 00003731: DUP2 00003732: PUSH4 0xffffffff 00003737: AND 00003738: PUSH1 0xe0 0000373a: SHL 0000373b: DUP2 0000373c: MSTORE 0000373d: PUSH1 0x04 0000373f: ADD 00003740: PUSH1 0x20 00003742: PUSH1 0x40 00003744: MLOAD 00003745: DUP1 00003746: DUP4 00003747: SUB 00003748: DUP2 00003749: DUP7 0000374a: DUP1 0000374b: EXTCODESIZE 0000374c: ISZERO 0000374d: DUP1 0000374e: ISZERO 0000374f: PUSH2 0x3757 00003752: JUMPI 00003753: PUSH1 0x00 00003755: DUP1 00003756: REVERT 00003757: JUMPDEST 00003758: POP 00003759: GAS 0000375a: STATICCALL 0000375b: ISZERO 0000375c: DUP1 0000375d: ISZERO 0000375e: PUSH2 0x376b 00003761: JUMPI 00003762: RETURNDATASIZE 00003763: PUSH1 0x00 00003765: DUP1 00003766: RETURNDATACOPY 00003767: RETURNDATASIZE 00003768: PUSH1 0x00 0000376a: REVERT 0000376b: JUMPDEST 0000376c: POP 0000376d: POP 0000376e: POP 0000376f: POP 00003770: PUSH1 0x40 00003772: MLOAD 00003773: RETURNDATASIZE 00003774: PUSH1 0x20 00003776: DUP2 00003777: LT 00003778: ISZERO 00003779: PUSH2 0x3781 0000377c: JUMPI 0000377d: PUSH1 0x00 0000377f: DUP1 00003780: REVERT 00003781: JUMPDEST 00003782: POP 00003783: MLOAD 00003784: DUP7 00003785: SWAP1 00003786: PUSH1 0xff 00003788: AND 00003789: PUSH1 0x0a 0000378b: EXP 0000378c: PUSH2 0x4530 0000378f: JUMP 00003790: JUMPDEST 00003791: SWAP1 00003792: PUSH2 0x4530 00003795: JUMP 00003796: JUMPDEST 00003797: DUP1 00003798: DUP3 00003799: SUB 0000379a: DUP3 0000379b: DUP2 0000379c: GT 0000379d: ISZERO 0000379e: PUSH2 0x1442 000037a1: JUMPI 000037a2: PUSH1 0x00 000037a4: DUP1 000037a5: REVERT 000037a6: JUMPDEST 000037a7: PUSH2 0x37ae 000037aa: PUSH2 0x4cbd 000037ad: JUMP 000037ae: JUMPDEST 000037af: PUSH2 0x37b7 000037b2: DUP6 000037b3: PUSH2 0x4d56 000037b6: JUMP 000037b7: JUMPDEST 000037b8: PUSH2 0x37c0 000037bb: DUP4 000037bc: PUSH2 0x4d6c 000037bf: JUMP 000037c0: JUMPDEST 000037c1: PUSH1 0x69 000037c3: SLOAD 000037c4: PUSH1 0x00 000037c6: SWAP1 000037c7: PUSH1 0x01 000037c9: PUSH1 0xa8 000037cb: SHL 000037cc: SWAP1 000037cd: DIV 000037ce: PUSH1 0xff 000037d0: AND 000037d1: ISZERO 000037d2: DUP1 000037d3: PUSH2 0x38e7 000037d6: JUMPI 000037d7: POP 000037d8: PUSH1 0x67 000037da: PUSH1 0x00 000037dc: SWAP1 000037dd: SLOAD 000037de: SWAP1 000037df: PUSH2 0x0100 000037e2: EXP 000037e3: SWAP1 000037e4: DIV 000037e5: PUSH1 0x01 000037e7: PUSH1 0x01 000037e9: PUSH1 0xa0 000037eb: SHL 000037ec: SUB 000037ed: AND 000037ee: PUSH1 0x01 000037f0: PUSH1 0x01 000037f2: PUSH1 0xa0 000037f4: SHL 000037f5: SUB 000037f6: AND 000037f7: PUSH4 0x0ebdb9a2 000037fc: PUSH1 0x40 000037fe: MLOAD 000037ff: DUP2 00003800: PUSH4 0xffffffff 00003805: AND 00003806: PUSH1 0xe0 00003808: SHL 00003809: DUP2 0000380a: MSTORE 0000380b: PUSH1 0x04 0000380d: ADD 0000380e: PUSH1 0x20 00003810: PUSH1 0x40 00003812: MLOAD 00003813: DUP1 00003814: DUP4 00003815: SUB 00003816: DUP2 00003817: DUP7 00003818: DUP1 00003819: EXTCODESIZE 0000381a: ISZERO 0000381b: DUP1 0000381c: ISZERO 0000381d: PUSH2 0x3825 00003820: JUMPI 00003821: PUSH1 0x00 00003823: DUP1 00003824: REVERT 00003825: JUMPDEST 00003826: POP 00003827: GAS 00003828: STATICCALL 00003829: ISZERO 0000382a: DUP1 0000382b: ISZERO 0000382c: PUSH2 0x3839 0000382f: JUMPI 00003830: RETURNDATASIZE 00003831: PUSH1 0x00 00003833: DUP1 00003834: RETURNDATACOPY 00003835: RETURNDATASIZE 00003836: PUSH1 0x00 00003838: REVERT 00003839: JUMPDEST 0000383a: POP 0000383b: POP 0000383c: POP 0000383d: POP 0000383e: PUSH1 0x40 00003840: MLOAD 00003841: RETURNDATASIZE 00003842: PUSH1 0x20 00003844: DUP2 00003845: LT 00003846: ISZERO 00003847: PUSH2 0x384f 0000384a: JUMPI 0000384b: PUSH1 0x00 0000384d: DUP1 0000384e: REVERT 0000384f: JUMPDEST 00003850: POP 00003851: MLOAD 00003852: PUSH1 0x40 00003854: DUP1 00003855: MLOAD 00003856: PUSH32 0xc7ec5d5d00000000000000000000000000000000000000000000000000000000 00003877: DUP2 00003878: MSTORE 00003879: ADDRESS 0000387a: PUSH1 0x04 0000387c: DUP3 0000387d: ADD 0000387e: MSTORE 0000387f: PUSH1 0x01 00003881: PUSH1 0x01 00003883: PUSH1 0xa0 00003885: SHL 00003886: SUB 00003887: DUP10 00003888: DUP2 00003889: AND 0000388a: PUSH1 0x24 0000388c: DUP4 0000388d: ADD 0000388e: MSTORE 0000388f: SWAP2 00003890: MLOAD 00003891: SWAP2 00003892: SWAP1 00003893: SWAP3 00003894: AND 00003895: SWAP2 00003896: PUSH4 0xc7ec5d5d 0000389b: SWAP2 0000389c: PUSH1 0x44 0000389e: DUP1 0000389f: DUP4 000038a0: ADD 000038a1: SWAP3 000038a2: PUSH1 0x20 000038a4: SWAP3 000038a5: SWAP2 000038a6: SWAP1 000038a7: DUP3 000038a8: SWAP1 000038a9: SUB 000038aa: ADD 000038ab: DUP2 000038ac: DUP7 000038ad: DUP1 000038ae: EXTCODESIZE 000038af: ISZERO 000038b0: DUP1 000038b1: ISZERO 000038b2: PUSH2 0x38ba 000038b5: JUMPI 000038b6: PUSH1 0x00 000038b8: DUP1 000038b9: REVERT 000038ba: JUMPDEST 000038bb: POP 000038bc: GAS 000038bd: STATICCALL 000038be: ISZERO 000038bf: DUP1 000038c0: ISZERO 000038c1: PUSH2 0x38ce 000038c4: JUMPI 000038c5: RETURNDATASIZE 000038c6: PUSH1 0x00 000038c8: DUP1 000038c9: RETURNDATACOPY 000038ca: RETURNDATASIZE 000038cb: PUSH1 0x00 000038cd: REVERT 000038ce: JUMPDEST 000038cf: POP 000038d0: POP 000038d1: POP 000038d2: POP 000038d3: PUSH1 0x40 000038d5: MLOAD 000038d6: RETURNDATASIZE 000038d7: PUSH1 0x20 000038d9: DUP2 000038da: LT 000038db: ISZERO 000038dc: PUSH2 0x38e4 000038df: JUMPI 000038e0: PUSH1 0x00 000038e2: DUP1 000038e3: REVERT 000038e4: JUMPDEST 000038e5: POP 000038e6: MLOAD 000038e7: JUMPDEST 000038e8: SWAP1 000038e9: POP 000038ea: PUSH2 0x3904 000038ed: PUSH2 0x38f5 000038f0: DUP8 000038f1: PUSH2 0x4e63 000038f4: JUMP 000038f5: JUMPDEST 000038f6: DUP1 000038f7: PUSH2 0x38fd 000038fa: JUMPI 000038fb: POP 000038fc: DUP2 000038fd: JUMPDEST 000038fe: PUSH1 0x1d 00003900: PUSH2 0x403a 00003903: JUMP 00003904: JUMPDEST 00003905: PUSH1 0x74 00003907: SLOAD 00003908: ISZERO 00003909: PUSH2 0x3927 0000390c: JUMPI 0000390d: PUSH2 0x3927 00003910: PUSH1 0x74 00003912: SLOAD 00003913: PUSH2 0x391e 00003916: DUP11 00003917: PUSH2 0x2335 0000391a: PUSH2 0x4f10 0000391d: JUMP 0000391e: JUMPDEST 0000391f: GT 00003920: ISZERO 00003921: PUSH1 0x00 00003923: PUSH2 0x403a 00003926: JUMP 00003927: JUMPDEST 00003928: PUSH2 0x3935 0000392b: DUP4 0000392c: DUP10 0000392d: LT 0000392e: ISZERO 0000392f: PUSH1 0x01 00003931: PUSH2 0x403a 00003934: JUMP 00003935: JUMPDEST 00003936: PUSH1 0x66 00003938: SLOAD 00003939: PUSH1 0x40 0000393b: DUP1 0000393c: MLOAD 0000393d: PUSH4 0x70a08231 00003942: PUSH1 0xe0 00003944: SHL 00003945: DUP2 00003946: MSTORE 00003947: ADDRESS 00003948: PUSH1 0x04 0000394a: DUP3 0000394b: ADD 0000394c: MSTORE 0000394d: SWAP1 0000394e: MLOAD 0000394f: PUSH1 0x00 00003951: SWAP3 00003952: PUSH1 0x01 00003954: PUSH1 0x01 00003956: PUSH1 0xa0 00003958: SHL 00003959: SUB 0000395a: AND 0000395b: SWAP2 0000395c: PUSH4 0x70a08231 00003961: SWAP2 00003962: PUSH1 0x24 00003964: DUP1 00003965: DUP4 00003966: ADD 00003967: SWAP3 00003968: PUSH1 0x20 0000396a: SWAP3 0000396b: SWAP2 0000396c: SWAP1 0000396d: DUP3 0000396e: SWAP1 0000396f: SUB 00003970: ADD 00003971: DUP2 00003972: DUP7 00003973: DUP1 00003974: EXTCODESIZE 00003975: ISZERO 00003976: DUP1 00003977: ISZERO 00003978: PUSH2 0x3980 0000397b: JUMPI 0000397c: PUSH1 0x00 0000397e: DUP1 0000397f: REVERT 00003980: JUMPDEST 00003981: POP 00003982: GAS 00003983: STATICCALL 00003984: ISZERO 00003985: DUP1 00003986: ISZERO 00003987: PUSH2 0x3994 0000398a: JUMPI 0000398b: RETURNDATASIZE 0000398c: PUSH1 0x00 0000398e: DUP1 0000398f: RETURNDATACOPY 00003990: RETURNDATASIZE 00003991: PUSH1 0x00 00003993: REVERT 00003994: JUMPDEST 00003995: POP 00003996: POP 00003997: POP 00003998: POP 00003999: PUSH1 0x40 0000399b: MLOAD 0000399c: RETURNDATASIZE 0000399d: PUSH1 0x20 0000399f: DUP2 000039a0: LT 000039a1: ISZERO 000039a2: PUSH2 0x39aa 000039a5: JUMPI 000039a6: PUSH1 0x00 000039a8: DUP1 000039a9: REVERT 000039aa: JUMPDEST 000039ab: POP 000039ac: MLOAD 000039ad: PUSH1 0x66 000039af: SLOAD 000039b0: SWAP1 000039b1: SWAP2 000039b2: POP 000039b3: PUSH1 0x01 000039b5: PUSH1 0x01 000039b7: PUSH1 0xa0 000039b9: SHL 000039ba: SUB 000039bb: AND 000039bc: PUSH20 0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2 000039d1: EQ 000039d2: DUP1 000039d3: ISZERO 000039d4: PUSH2 0x39dd 000039d7: JUMPI 000039d8: POP 000039d9: PUSH1 0x00 000039db: CALLVALUE 000039dc: GT 000039dd: JUMPDEST 000039de: ISZERO 000039df: PUSH2 0x3a4f 000039e2: JUMPI 000039e3: PUSH20 0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2 000039f8: PUSH1 0x01 000039fa: PUSH1 0x01 000039fc: PUSH1 0xa0 000039fe: SHL 000039ff: SUB 00003a00: AND 00003a01: PUSH4 0xd0e30db0 00003a06: CALLVALUE 00003a07: PUSH1 0x40 00003a09: MLOAD 00003a0a: DUP3 00003a0b: PUSH4 0xffffffff 00003a10: AND 00003a11: PUSH1 0xe0 00003a13: SHL 00003a14: DUP2 00003a15: MSTORE 00003a16: PUSH1 0x04 00003a18: ADD 00003a19: PUSH1 0x00 00003a1b: PUSH1 0x40 00003a1d: MLOAD 00003a1e: DUP1 00003a1f: DUP4 00003a20: SUB 00003a21: DUP2 00003a22: DUP6 00003a23: DUP9 00003a24: DUP1 00003a25: EXTCODESIZE 00003a26: ISZERO 00003a27: DUP1 00003a28: ISZERO 00003a29: PUSH2 0x3a31 00003a2c: JUMPI 00003a2d: PUSH1 0x00 00003a2f: DUP1 00003a30: REVERT 00003a31: JUMPDEST 00003a32: POP 00003a33: GAS 00003a34: CALL 00003a35: ISZERO 00003a36: DUP1 00003a37: ISZERO 00003a38: PUSH2 0x3a45 00003a3b: JUMPI 00003a3c: RETURNDATASIZE 00003a3d: PUSH1 0x00 00003a3f: DUP1 00003a40: RETURNDATACOPY 00003a41: RETURNDATASIZE 00003a42: PUSH1 0x00 00003a44: REVERT 00003a45: JUMPDEST 00003a46: POP 00003a47: POP 00003a48: POP 00003a49: POP 00003a4a: POP 00003a4b: PUSH2 0x3a67 00003a4e: JUMP 00003a4f: JUMPDEST 00003a50: PUSH1 0x66 00003a52: SLOAD 00003a53: PUSH2 0x3a67 00003a56: SWAP1 00003a57: PUSH1 0x01 00003a59: PUSH1 0x01 00003a5b: PUSH1 0xa0 00003a5d: SHL 00003a5e: SUB 00003a5f: AND 00003a60: DUP8 00003a61: ADDRESS 00003a62: DUP13 00003a63: PUSH2 0x3cc6 00003a66: JUMP 00003a67: JUMPDEST 00003a68: PUSH1 0x66 00003a6a: SLOAD 00003a6b: PUSH1 0x40 00003a6d: DUP1 00003a6e: MLOAD 00003a6f: PUSH4 0x70a08231 00003a74: PUSH1 0xe0 00003a76: SHL 00003a77: DUP2 00003a78: MSTORE 00003a79: ADDRESS 00003a7a: PUSH1 0x04 00003a7c: DUP3 00003a7d: ADD 00003a7e: MSTORE 00003a7f: SWAP1 00003a80: MLOAD 00003a81: PUSH2 0x3af5 00003a84: SWAP3 00003a85: DUP13 00003a86: SWAP3 00003a87: PUSH2 0x3aed 00003a8a: SWAP3 00003a8b: DUP7 00003a8c: SWAP3 00003a8d: PUSH1 0x01 00003a8f: PUSH1 0x01 00003a91: PUSH1 0xa0 00003a93: SHL 00003a94: SUB 00003a95: AND 00003a96: SWAP2 00003a97: PUSH4 0x70a08231 00003a9c: SWAP2 00003a9d: PUSH1 0x24 00003a9f: DUP1 00003aa0: DUP4 00003aa1: ADD 00003aa2: SWAP3 00003aa3: PUSH1 0x20 00003aa5: SWAP3 00003aa6: SWAP2 00003aa7: SWAP1 00003aa8: DUP3 00003aa9: SWAP1 00003aaa: SUB 00003aab: ADD 00003aac: DUP2 00003aad: DUP7 00003aae: DUP1 00003aaf: EXTCODESIZE 00003ab0: ISZERO 00003ab1: DUP1 00003ab2: ISZERO 00003ab3: PUSH2 0x3abb 00003ab6: JUMPI 00003ab7: PUSH1 0x00 00003ab9: DUP1 00003aba: REVERT 00003abb: JUMPDEST 00003abc: POP 00003abd: GAS 00003abe: STATICCALL 00003abf: ISZERO 00003ac0: DUP1 00003ac1: ISZERO 00003ac2: PUSH2 0x3acf 00003ac5: JUMPI 00003ac6: RETURNDATASIZE 00003ac7: PUSH1 0x00 00003ac9: DUP1 00003aca: RETURNDATACOPY 00003acb: RETURNDATASIZE 00003acc: PUSH1 0x00 00003ace: REVERT 00003acf: JUMPDEST 00003ad0: POP 00003ad1: POP 00003ad2: POP 00003ad3: POP 00003ad4: PUSH1 0x40 00003ad6: MLOAD 00003ad7: RETURNDATASIZE 00003ad8: PUSH1 0x20 00003ada: DUP2 00003adb: LT 00003adc: ISZERO 00003add: PUSH2 0x3ae5 00003ae0: JUMPI 00003ae1: PUSH1 0x00 00003ae3: DUP1 00003ae4: REVERT 00003ae5: JUMPDEST 00003ae6: POP 00003ae7: MLOAD 00003ae8: SWAP1 00003ae9: PUSH2 0x3796 00003aec: JUMP 00003aed: JUMPDEST 00003aee: EQ 00003aef: PUSH1 0x05 00003af1: PUSH2 0x403a 00003af4: JUMP 00003af5: JUMPDEST 00003af6: PUSH1 0x00 00003af8: PUSH2 0x3b00 00003afb: DUP9 00003afc: PUSH2 0x2360 00003aff: JUMP 00003b00: JUMPDEST 00003b01: SWAP1 00003b02: POP 00003b03: PUSH1 0x00 00003b05: PUSH2 0x3b8e 00003b08: PUSH1 0x66 00003b0a: PUSH1 0x00 00003b0c: SWAP1 00003b0d: SLOAD 00003b0e: SWAP1 00003b0f: PUSH2 0x0100 00003b12: EXP 00003b13: SWAP1 00003b14: DIV 00003b15: PUSH1 0x01 00003b17: PUSH1 0x01 00003b19: PUSH1 0xa0 00003b1b: SHL 00003b1c: SUB 00003b1d: AND 00003b1e: PUSH1 0x01 00003b20: PUSH1 0x01 00003b22: PUSH1 0xa0 00003b24: SHL 00003b25: SUB 00003b26: AND 00003b27: PUSH4 0x313ce567 00003b2c: PUSH1 0x40 00003b2e: MLOAD 00003b2f: DUP2 00003b30: PUSH4 0xffffffff 00003b35: AND 00003b36: PUSH1 0xe0 00003b38: SHL 00003b39: DUP2 00003b3a: MSTORE 00003b3b: PUSH1 0x04 00003b3d: ADD 00003b3e: PUSH1 0x20 00003b40: PUSH1 0x40 00003b42: MLOAD 00003b43: DUP1 00003b44: DUP4 00003b45: SUB 00003b46: DUP2 00003b47: DUP7 00003b48: DUP1 00003b49: EXTCODESIZE 00003b4a: ISZERO 00003b4b: DUP1 00003b4c: ISZERO 00003b4d: PUSH2 0x3b55 00003b50: JUMPI 00003b51: PUSH1 0x00 00003b53: DUP1 00003b54: REVERT 00003b55: JUMPDEST 00003b56: POP 00003b57: GAS 00003b58: STATICCALL 00003b59: ISZERO 00003b5a: DUP1 00003b5b: ISZERO 00003b5c: PUSH2 0x3b69 00003b5f: JUMPI 00003b60: RETURNDATASIZE 00003b61: PUSH1 0x00 00003b63: DUP1 00003b64: RETURNDATACOPY 00003b65: RETURNDATASIZE 00003b66: PUSH1 0x00 00003b68: REVERT 00003b69: JUMPDEST 00003b6a: POP 00003b6b: POP 00003b6c: POP 00003b6d: POP 00003b6e: PUSH1 0x40 00003b70: MLOAD 00003b71: RETURNDATASIZE 00003b72: PUSH1 0x20 00003b74: DUP2 00003b75: LT 00003b76: ISZERO 00003b77: PUSH2 0x3b7f 00003b7a: JUMPI 00003b7b: PUSH1 0x00 00003b7d: DUP1 00003b7e: REVERT 00003b7f: JUMPDEST 00003b80: POP 00003b81: MLOAD 00003b82: DUP13 00003b83: SWAP1 00003b84: PUSH1 0xff 00003b86: AND 00003b87: PUSH1 0x0a 00003b89: EXP 00003b8a: PUSH2 0x4530 00003b8d: JUMP 00003b8e: JUMPDEST 00003b8f: SWAP1 00003b90: POP 00003b91: PUSH1 0x00 00003b93: PUSH2 0x3b9c 00003b96: DUP3 00003b97: DUP10 00003b98: PUSH2 0x4530 00003b9b: JUMP 00003b9c: JUMPDEST 00003b9d: SWAP1 00003b9e: POP 00003b9f: PUSH2 0x3bac 00003ba2: DUP12 00003ba3: DUP3 00003ba4: LT 00003ba5: ISZERO 00003ba6: PUSH1 0x56 00003ba8: PUSH2 0x403a 00003bab: JUMP 00003bac: JUMPDEST 00003bad: PUSH2 0x3bb6 00003bb0: DUP11 00003bb1: DUP3 00003bb2: PUSH2 0x443e 00003bb5: JUMP 00003bb6: JUMPDEST 00003bb7: PUSH1 0x67 00003bb9: SLOAD 00003bba: PUSH1 0x01 00003bbc: PUSH1 0x01 00003bbe: PUSH1 0xa0 00003bc0: SHL 00003bc1: SUB 00003bc2: SWAP1 00003bc3: DUP2 00003bc4: AND 00003bc5: SWAP1 00003bc6: PUSH4 0xc432ae45 00003bcb: SWAP1 00003bcc: DUP12 00003bcd: SWAP1 00003bce: DUP10 00003bcf: AND 00003bd0: PUSH2 0x3bd9 00003bd3: JUMPI 00003bd4: DUP12 00003bd5: PUSH2 0x3bdb 00003bd8: JUMP 00003bd9: JUMPDEST 00003bda: DUP9 00003bdb: JUMPDEST 00003bdc: DUP16 00003bdd: PUSH1 0x40 00003bdf: MLOAD 00003be0: DUP5 00003be1: PUSH4 0xffffffff 00003be6: AND 00003be7: PUSH1 0xe0 00003be9: SHL 00003bea: DUP2 00003beb: MSTORE 00003bec: PUSH1 0x04 00003bee: ADD 00003bef: DUP1 00003bf0: DUP5 00003bf1: PUSH1 0x01 00003bf3: PUSH1 0x01 00003bf5: PUSH1 0xa0 00003bf7: SHL 00003bf8: SUB 00003bf9: AND 00003bfa: DUP2 00003bfb: MSTORE 00003bfc: PUSH1 0x20 00003bfe: ADD 00003bff: DUP4 00003c00: PUSH1 0x01 00003c02: PUSH1 0x01 00003c04: PUSH1 0xa0 00003c06: SHL 00003c07: SUB 00003c08: AND 00003c09: DUP2 00003c0a: MSTORE 00003c0b: PUSH1 0x20 00003c0d: ADD 00003c0e: DUP3 00003c0f: DUP2 00003c10: MSTORE 00003c11: PUSH1 0x20 00003c13: ADD 00003c14: SWAP4 00003c15: POP 00003c16: POP 00003c17: POP 00003c18: POP 00003c19: PUSH1 0x00 00003c1b: PUSH1 0x40 00003c1d: MLOAD 00003c1e: DUP1 00003c1f: DUP4 00003c20: SUB 00003c21: DUP2 00003c22: PUSH1 0x00 00003c24: DUP8 00003c25: DUP1 00003c26: EXTCODESIZE 00003c27: ISZERO 00003c28: DUP1 00003c29: ISZERO 00003c2a: PUSH2 0x3c32 00003c2d: JUMPI 00003c2e: PUSH1 0x00 00003c30: DUP1 00003c31: REVERT 00003c32: JUMPDEST 00003c33: POP 00003c34: GAS 00003c35: CALL 00003c36: ISZERO 00003c37: DUP1 00003c38: ISZERO 00003c39: PUSH2 0x3c46 00003c3c: JUMPI 00003c3d: RETURNDATASIZE 00003c3e: PUSH1 0x00 00003c40: DUP1 00003c41: RETURNDATACOPY 00003c42: RETURNDATASIZE 00003c43: PUSH1 0x00 00003c45: REVERT 00003c46: JUMPDEST 00003c47: POP 00003c48: POP 00003c49: POP 00003c4a: POP 00003c4b: PUSH2 0x3c56 00003c4e: DUP11 00003c4f: DUP5 00003c50: DUP15 00003c51: DUP5 00003c52: PUSH2 0x4f8e 00003c55: JUMP 00003c56: JUMPDEST 00003c57: PUSH1 0x01 00003c59: PUSH1 0x01 00003c5b: PUSH1 0xa0 00003c5d: SHL 00003c5e: SUB 00003c5f: DUP11 00003c60: AND 00003c61: PUSH1 0x00 00003c63: DUP2 00003c64: DUP2 00003c65: MSTORE 00003c66: PUSH1 0x71 00003c68: PUSH1 0x20 00003c6a: SWAP1 00003c6b: DUP2 00003c6c: MSTORE 00003c6d: PUSH1 0x40 00003c6f: SWAP2 00003c70: DUP3 00003c71: SWAP1 00003c72: KECCAK256 00003c73: PUSH1 0x07 00003c75: ADD 00003c76: DUP1 00003c77: SLOAD 00003c78: PUSH1 0x01 00003c7a: ADD 00003c7b: SWAP1 00003c7c: SSTORE 00003c7d: DUP2 00003c7e: MLOAD 00003c7f: DUP15 00003c80: DUP2 00003c81: MSTORE 00003c82: SWAP1 00003c83: DUP2 00003c84: ADD 00003c85: DUP16 00003c86: SWAP1 00003c87: MSTORE 00003c88: TIMESTAMP 00003c89: DUP2 00003c8a: DUP4 00003c8b: ADD 00003c8c: MSTORE 00003c8d: SWAP1 00003c8e: MLOAD 00003c8f: PUSH32 0x8d878fd0c5092c0e518d34fa1f3d23c8b3a1b2b7f86174bdba0ceaabf68b5a53 00003cb0: SWAP2 00003cb1: DUP2 00003cb2: SWAP1 00003cb3: SUB 00003cb4: PUSH1 0x60 00003cb6: ADD 00003cb7: SWAP1 00003cb8: LOG2 00003cb9: POP 00003cba: POP 00003cbb: POP 00003cbc: POP 00003cbd: POP 00003cbe: POP 00003cbf: POP 00003cc0: POP 00003cc1: POP 00003cc2: POP 00003cc3: POP 00003cc4: POP 00003cc5: JUMP 00003cc6: JUMPDEST 00003cc7: PUSH1 0x40 00003cc9: DUP1 00003cca: MLOAD 00003ccb: PUSH1 0x01 00003ccd: PUSH1 0x01 00003ccf: PUSH1 0xa0 00003cd1: SHL 00003cd2: SUB 00003cd3: DUP1 00003cd4: DUP7 00003cd5: AND 00003cd6: PUSH1 0x24 00003cd8: DUP4 00003cd9: ADD 00003cda: MSTORE 00003cdb: DUP5 00003cdc: AND 00003cdd: PUSH1 0x44 00003cdf: DUP3 00003ce0: ADD 00003ce1: MSTORE 00003ce2: PUSH1 0x64 00003ce4: DUP1 00003ce5: DUP3 00003ce6: ADD 00003ce7: DUP5 00003ce8: SWAP1 00003ce9: MSTORE 00003cea: DUP3 00003ceb: MLOAD 00003cec: DUP1 00003ced: DUP4 00003cee: SUB 00003cef: SWAP1 00003cf0: SWAP2 00003cf1: ADD 00003cf2: DUP2 00003cf3: MSTORE 00003cf4: PUSH1 0x84 00003cf6: SWAP1 00003cf7: SWAP2 00003cf8: ADD 00003cf9: SWAP1 00003cfa: SWAP2 00003cfb: MSTORE 00003cfc: PUSH1 0x20 00003cfe: DUP2 00003cff: ADD 00003d00: DUP1 00003d01: MLOAD 00003d02: PUSH1 0x01 00003d04: PUSH1 0x01 00003d06: PUSH1 0xe0 00003d08: SHL 00003d09: SUB 00003d0a: AND 00003d0b: PUSH32 0x23b872dd00000000000000000000000000000000000000000000000000000000 00003d2c: OR 00003d2d: SWAP1 00003d2e: MSTORE 00003d2f: PUSH2 0x3d39 00003d32: SWAP1 00003d33: DUP6 00003d34: SWAP1 00003d35: PUSH2 0x5071 00003d38: JUMP 00003d39: JUMPDEST 00003d3a: POP 00003d3b: POP 00003d3c: POP 00003d3d: POP 00003d3e: JUMP 00003d3f: JUMPDEST 00003d40: PUSH1 0x00 00003d42: DUP3 00003d43: DUP3 00003d44: ADD 00003d45: DUP4 00003d46: DUP2 00003d47: LT 00003d48: ISZERO 00003d49: PUSH2 0x149e 00003d4c: JUMPI 00003d4d: PUSH1 0x40 00003d4f: DUP1 00003d50: MLOAD 00003d51: PUSH3 0x461bcd 00003d55: PUSH1 0xe5 00003d57: SHL 00003d58: DUP2 00003d59: MSTORE 00003d5a: PUSH1 0x20 00003d5c: PUSH1 0x04 00003d5e: DUP3 00003d5f: ADD 00003d60: MSTORE 00003d61: PUSH1 0x1b 00003d63: PUSH1 0x24 00003d65: DUP3 00003d66: ADD 00003d67: MSTORE 00003d68: PUSH32 0x536166654d6174683a206164646974696f6e206f766572666c6f770000000000 00003d89: PUSH1 0x44 00003d8b: DUP3 00003d8c: ADD 00003d8d: MSTORE 00003d8e: SWAP1 00003d8f: MLOAD 00003d90: SWAP1 00003d91: DUP2 00003d92: SWAP1 00003d93: SUB 00003d94: PUSH1 0x64 00003d96: ADD 00003d97: SWAP1 00003d98: REVERT 00003d99: JUMPDEST 00003d9a: PUSH2 0x3da7 00003d9d: PUSH1 0x14 00003d9f: DUP3 00003da0: LT 00003da1: PUSH1 0x28 00003da3: PUSH2 0x403a 00003da6: JUMP 00003da7: JUMPDEST 00003da8: PUSH1 0x00 00003daa: JUMPDEST 00003dab: DUP2 00003dac: DUP2 00003dad: LT 00003dae: ISZERO 00003daf: PUSH2 0x2007 00003db2: JUMPI 00003db3: PUSH1 0x01 00003db5: DUP2 00003db6: ADD 00003db7: JUMPDEST 00003db8: DUP3 00003db9: DUP2 00003dba: LT 00003dbb: ISZERO 00003dbc: PUSH2 0x3e1d 00003dbf: JUMPI 00003dc0: PUSH2 0x3e15 00003dc3: DUP5 00003dc4: DUP5 00003dc5: DUP4 00003dc6: DUP2 00003dc7: DUP2 00003dc8: LT 00003dc9: PUSH2 0x3dce 00003dcc: JUMPI 00003dcd: INVALID 00003dce: JUMPDEST 00003dcf: SWAP1 00003dd0: POP 00003dd1: PUSH1 0x20 00003dd3: MUL 00003dd4: ADD 00003dd5: CALLDATALOAD 00003dd6: PUSH1 0x01 00003dd8: PUSH1 0x01 00003dda: PUSH1 0xa0 00003ddc: SHL 00003ddd: SUB 00003dde: AND 00003ddf: PUSH1 0x01 00003de1: PUSH1 0x01 00003de3: PUSH1 0xa0 00003de5: SHL 00003de6: SUB 00003de7: AND 00003de8: DUP6 00003de9: DUP6 00003dea: DUP6 00003deb: DUP2 00003dec: DUP2 00003ded: LT 00003dee: PUSH2 0x3df3 00003df1: JUMPI 00003df2: INVALID 00003df3: JUMPDEST 00003df4: SWAP1 00003df5: POP 00003df6: PUSH1 0x20 00003df8: MUL 00003df9: ADD 00003dfa: CALLDATALOAD 00003dfb: PUSH1 0x01 00003dfd: PUSH1 0x01 00003dff: PUSH1 0xa0 00003e01: SHL 00003e02: SUB 00003e03: AND 00003e04: PUSH1 0x01 00003e06: PUSH1 0x01 00003e08: PUSH1 0xa0 00003e0a: SHL 00003e0b: SUB 00003e0c: AND 00003e0d: EQ 00003e0e: ISZERO 00003e0f: PUSH1 0x28 00003e11: PUSH2 0x403a 00003e14: JUMP 00003e15: JUMPDEST 00003e16: PUSH1 0x01 00003e18: ADD 00003e19: PUSH2 0x3db7 00003e1c: JUMP 00003e1d: JUMPDEST 00003e1e: POP 00003e1f: PUSH1 0x01 00003e21: ADD 00003e22: PUSH2 0x3daa 00003e25: JUMP 00003e26: JUMPDEST 00003e27: PUSH1 0x01 00003e29: PUSH1 0x01 00003e2b: PUSH1 0xa0 00003e2d: SHL 00003e2e: SUB 00003e2f: DUP5 00003e30: AND 00003e31: PUSH1 0x00 00003e33: SWAP1 00003e34: DUP2 00003e35: MSTORE 00003e36: PUSH1 0x71 00003e38: PUSH1 0x20 00003e3a: MSTORE 00003e3b: PUSH1 0x40 00003e3d: SWAP1 00003e3e: KECCAK256 00003e3f: PUSH2 0x3e46 00003e42: PUSH2 0x4cbd 00003e45: JUMP 00003e46: JUMPDEST 00003e47: PUSH2 0x3e58 00003e4a: PUSH1 0x00 00003e4c: DUP3 00003e4d: PUSH1 0x07 00003e4f: ADD 00003e50: SLOAD 00003e51: GT 00003e52: PUSH1 0x0f 00003e54: PUSH2 0x403a 00003e57: JUMP 00003e58: JUMPDEST 00003e59: PUSH2 0x3e71 00003e5c: PUSH1 0x00 00003e5e: DUP6 00003e5f: GT 00003e60: DUP1 00003e61: PUSH2 0x3e6a 00003e64: JUMPI 00003e65: POP 00003e66: PUSH1 0x00 00003e68: DUP5 00003e69: GT 00003e6a: JUMPDEST 00003e6b: PUSH1 0x52 00003e6d: PUSH2 0x403a 00003e70: JUMP 00003e71: JUMPDEST 00003e72: PUSH2 0x3e81 00003e75: DUP4 00003e76: PUSH1 0x6b 00003e78: SLOAD 00003e79: LT 00003e7a: ISZERO 00003e7b: PUSH1 0x56 00003e7d: PUSH2 0x403a 00003e80: JUMP 00003e81: JUMPDEST 00003e82: PUSH2 0x3e92 00003e85: DUP2 00003e86: PUSH1 0x02 00003e88: ADD 00003e89: SLOAD 00003e8a: TIMESTAMP 00003e8b: GT 00003e8c: PUSH1 0x0c 00003e8e: PUSH2 0x403a 00003e91: JUMP 00003e92: JUMPDEST 00003e93: PUSH1 0x07 00003e95: DUP2 00003e96: ADD 00003e97: DUP1 00003e98: SLOAD 00003e99: PUSH1 0x01 00003e9b: ADD 00003e9c: SWAP1 00003e9d: SSTORE 00003e9e: TIMESTAMP 00003e9f: PUSH1 0x02 00003ea1: DUP3 00003ea2: ADD 00003ea3: SSTORE 00003ea4: DUP3 00003ea5: ISZERO 00003ea6: PUSH2 0x3f0e 00003ea9: JUMPI 00003eaa: PUSH1 0x04 00003eac: DUP2 00003ead: ADD 00003eae: SLOAD 00003eaf: PUSH2 0x3eb8 00003eb2: SWAP1 00003eb3: DUP5 00003eb4: PUSH2 0x4096 00003eb7: JUMP 00003eb8: JUMPDEST 00003eb9: PUSH1 0x04 00003ebb: DUP3 00003ebc: ADD 00003ebd: SSTORE 00003ebe: PUSH1 0x6b 00003ec0: SLOAD 00003ec1: PUSH2 0x3eca 00003ec4: SWAP1 00003ec5: DUP5 00003ec6: PUSH2 0x3796 00003ec9: JUMP 00003eca: JUMPDEST 00003ecb: PUSH1 0x6b 00003ecd: SSTORE 00003ece: PUSH2 0x3ed7 00003ed1: DUP6 00003ed2: DUP5 00003ed3: PUSH2 0x5122 00003ed6: JUMP 00003ed7: JUMPDEST 00003ed8: PUSH1 0x40 00003eda: MLOAD 00003edb: DUP4 00003edc: SWAP1 00003edd: PUSH1 0x01 00003edf: PUSH1 0x01 00003ee1: PUSH1 0xa0 00003ee3: SHL 00003ee4: SUB 00003ee5: DUP8 00003ee6: AND 00003ee7: SWAP1 00003ee8: PUSH32 0x4dacaff8a707e7b54321fbdedb3b65d1f3316b59787949c034bae8946d6ff4e1 00003f09: SWAP1 00003f0a: PUSH1 0x00 00003f0c: SWAP1 00003f0d: LOG3 00003f0e: JUMPDEST 00003f0f: DUP4 00003f10: ISZERO 00003f11: PUSH2 0x2af4 00003f14: JUMPI 00003f15: PUSH1 0x68 00003f17: SLOAD 00003f18: PUSH1 0x00 00003f1a: SWAP1 00003f1b: PUSH1 0x01 00003f1d: PUSH1 0x01 00003f1f: PUSH1 0xa0 00003f21: SHL 00003f22: SUB 00003f23: AND 00003f24: PUSH4 0x8ce90e82 00003f29: DUP5 00003f2a: PUSH2 0x3f33 00003f2d: JUMPI 00003f2e: DUP8 00003f2f: PUSH2 0x3f35 00003f32: JUMP 00003f33: JUMPDEST 00003f34: ADDRESS 00003f35: JUMPDEST 00003f36: DUP8 00003f37: PUSH1 0x40 00003f39: MLOAD 00003f3a: DUP4 00003f3b: PUSH4 0xffffffff 00003f40: AND 00003f41: PUSH1 0xe0 00003f43: SHL 00003f44: DUP2 00003f45: MSTORE 00003f46: PUSH1 0x04 00003f48: ADD 00003f49: DUP1 00003f4a: DUP4 00003f4b: PUSH1 0x01 00003f4d: PUSH1 0x01 00003f4f: PUSH1 0xa0 00003f51: SHL 00003f52: SUB 00003f53: AND 00003f54: DUP2 00003f55: MSTORE 00003f56: PUSH1 0x20 00003f58: ADD 00003f59: DUP3 00003f5a: DUP2 00003f5b: MSTORE 00003f5c: PUSH1 0x20 00003f5e: ADD 00003f5f: SWAP3 00003f60: POP 00003f61: POP 00003f62: POP 00003f63: PUSH1 0x20 00003f65: PUSH1 0x40 00003f67: MLOAD 00003f68: DUP1 00003f69: DUP4 00003f6a: SUB 00003f6b: DUP2 00003f6c: PUSH1 0x00 00003f6e: DUP8 00003f6f: DUP1 00003f70: EXTCODESIZE 00003f71: ISZERO 00003f72: DUP1 00003f73: ISZERO 00003f74: PUSH2 0x3f7c 00003f77: JUMPI 00003f78: PUSH1 0x00 00003f7a: DUP1 00003f7b: REVERT 00003f7c: JUMPDEST 00003f7d: POP 00003f7e: GAS 00003f7f: CALL 00003f80: ISZERO 00003f81: DUP1 00003f82: ISZERO 00003f83: PUSH2 0x3f90 00003f86: JUMPI 00003f87: RETURNDATASIZE 00003f88: PUSH1 0x00 00003f8a: DUP1 00003f8b: RETURNDATACOPY 00003f8c: RETURNDATASIZE 00003f8d: PUSH1 0x00 00003f8f: REVERT 00003f90: JUMPDEST 00003f91: POP 00003f92: POP 00003f93: POP 00003f94: POP 00003f95: PUSH1 0x40 00003f97: MLOAD 00003f98: RETURNDATASIZE 00003f99: PUSH1 0x20 00003f9b: DUP2 00003f9c: LT 00003f9d: ISZERO 00003f9e: PUSH2 0x3fa6 00003fa1: JUMPI 00003fa2: PUSH1 0x00 00003fa4: DUP1 00003fa5: REVERT 00003fa6: JUMPDEST 00003fa7: POP 00003fa8: MLOAD 00003fa9: PUSH1 0x03 00003fab: DUP4 00003fac: ADD 00003fad: SLOAD 00003fae: SWAP1 00003faf: SWAP2 00003fb0: POP 00003fb1: PUSH2 0x3fba 00003fb4: SWAP1 00003fb5: DUP3 00003fb6: PUSH2 0x4096 00003fb9: JUMP 00003fba: JUMPDEST 00003fbb: PUSH1 0x03 00003fbd: DUP4 00003fbe: ADD 00003fbf: SSTORE 00003fc0: PUSH1 0x40 00003fc2: DUP1 00003fc3: MLOAD 00003fc4: DUP3 00003fc5: DUP2 00003fc6: MSTORE 00003fc7: SWAP1 00003fc8: MLOAD 00003fc9: PUSH1 0x01 00003fcb: PUSH1 0x01 00003fcd: PUSH1 0xa0 00003fcf: SHL 00003fd0: SUB 00003fd1: DUP9 00003fd2: AND 00003fd3: SWAP2 00003fd4: PUSH32 0x09703ae9c781fcf86e1d44c6d854c2684b3f5dcfe234dfc64f4d356d0e3cd73e 00003ff5: SWAP2 00003ff6: SWAP1 00003ff7: DUP2 00003ff8: SWAP1 00003ff9: SUB 00003ffa: PUSH1 0x20 00003ffc: ADD 00003ffd: SWAP1 00003ffe: LOG2 00003fff: POP 00004000: POP 00004001: POP 00004002: POP 00004003: POP 00004004: POP 00004005: JUMP 00004006: JUMPDEST 00004007: PUSH2 0x3664 0000400a: PUSH1 0x01 0000400c: PUSH1 0x01 0000400e: PUSH1 0xa0 00004010: SHL 00004011: SUB 00004012: PUSH32 0x000000000000000000000000f4dc48d260c93ad6a96c5ce563e70ca578987c74 00004033: AND 00004034: DUP4 00004035: DUP4 00004036: PUSH2 0x51ea 00004039: JUMP 0000403a: JUMPDEST 0000403b: DUP2 0000403c: PUSH2 0x3664 0000403f: JUMPI 00004040: PUSH2 0x3664 00004043: DUP2 00004044: PUSH2 0x532f 00004047: JUMP 00004048: JUMPDEST 00004049: POP 0000404a: PUSH1 0x6f 0000404c: SLOAD 0000404d: SWAP1 0000404e: JUMP 0000404f: JUMPDEST 00004050: PUSH1 0x01 00004052: PUSH1 0x01 00004054: PUSH1 0xa0 00004056: SHL 00004057: SUB 00004058: DUP2 00004059: AND 0000405a: PUSH1 0x00 0000405c: SWAP1 0000405d: DUP2 0000405e: MSTORE 0000405f: PUSH1 0x71 00004061: PUSH1 0x20 00004063: MSTORE 00004064: PUSH1 0x40 00004066: DUP2 00004067: KECCAK256 00004068: SLOAD 00004069: PUSH1 0x8f 0000406b: SLOAD 0000406c: GT 0000406d: PUSH2 0x408e 00004070: JUMPI 00004071: PUSH1 0x01 00004073: PUSH1 0x01 00004075: PUSH1 0xa0 00004077: SHL 00004078: SUB 00004079: DUP3 0000407a: AND 0000407b: PUSH1 0x00 0000407d: SWAP1 0000407e: DUP2 0000407f: MSTORE 00004080: PUSH1 0x71 00004082: PUSH1 0x20 00004084: MSTORE 00004085: PUSH1 0x40 00004087: SWAP1 00004088: KECCAK256 00004089: SLOAD 0000408a: PUSH2 0x1442 0000408d: JUMP 0000408e: JUMPDEST 0000408f: POP 00004090: POP 00004091: PUSH1 0x8f 00004093: SLOAD 00004094: SWAP1 00004095: JUMP 00004096: JUMPDEST 00004097: DUP1 00004098: DUP3 00004099: ADD 0000409a: DUP3 0000409b: DUP2 0000409c: LT 0000409d: ISZERO 0000409e: PUSH2 0x1442 000040a1: JUMPI 000040a2: PUSH1 0x00 000040a4: DUP1 000040a5: REVERT 000040a6: JUMPDEST 000040a7: PUSH1 0x00 000040a9: DUP3 000040aa: ISZERO 000040ab: DUP1 000040ac: PUSH2 0x40c1 000040af: JUMPI 000040b0: POP 000040b1: POP 000040b2: DUP2 000040b3: DUP2 000040b4: MUL 000040b5: DUP2 000040b6: DUP4 000040b7: DUP3 000040b8: DUP2 000040b9: PUSH2 0x40be 000040bc: JUMPI 000040bd: INVALID 000040be: JUMPDEST 000040bf: DIV 000040c0: EQ 000040c1: JUMPDEST 000040c2: PUSH2 0x1442 000040c5: JUMPI 000040c6: PUSH1 0x00 000040c8: DUP1 000040c9: REVERT 000040ca: JUMPDEST 000040cb: PUSH1 0x00 000040cd: DUP1 000040ce: DUP3 000040cf: GT 000040d0: PUSH2 0x4120 000040d3: JUMPI 000040d4: PUSH1 0x40 000040d6: DUP1 000040d7: MLOAD 000040d8: PUSH3 0x461bcd 000040dc: PUSH1 0xe5 000040de: SHL 000040df: DUP2 000040e0: MSTORE 000040e1: PUSH1 0x20 000040e3: PUSH1 0x04 000040e5: DUP3 000040e6: ADD 000040e7: MSTORE 000040e8: PUSH1 0x1a 000040ea: PUSH1 0x24 000040ec: DUP3 000040ed: ADD 000040ee: MSTORE 000040ef: PUSH32 0x536166654d6174683a206469766973696f6e206279207a65726f000000000000 00004110: PUSH1 0x44 00004112: DUP3 00004113: ADD 00004114: MSTORE 00004115: SWAP1 00004116: MLOAD 00004117: SWAP1 00004118: DUP2 00004119: SWAP1 0000411a: SUB 0000411b: PUSH1 0x64 0000411d: ADD 0000411e: SWAP1 0000411f: REVERT 00004120: JUMPDEST 00004121: DUP2 00004122: DUP4 00004123: DUP2 00004124: PUSH2 0x4129 00004127: JUMPI 00004128: INVALID 00004129: JUMPDEST 0000412a: DIV 0000412b: SWAP4 0000412c: SWAP3 0000412d: POP 0000412e: POP 0000412f: POP 00004130: JUMP 00004131: JUMPDEST 00004132: PUSH1 0x7f 00004134: SLOAD 00004135: PUSH1 0x00 00004137: SWAP1 00004138: PUSH2 0x4200 0000413b: JUMPI 0000413c: PUSH2 0x4143 0000413f: PUSH2 0x14ae 00004142: JUMP 00004143: JUMPDEST 00004144: ISZERO 00004145: PUSH2 0x41f1 00004148: JUMPI 00004149: PUSH2 0x41ec 0000414c: PUSH2 0x4153 0000414f: PUSH2 0x14ae 00004152: JUMP 00004153: JUMPDEST 00004154: PUSH1 0x66 00004156: SLOAD 00004157: PUSH1 0x40 00004159: DUP1 0000415a: MLOAD 0000415b: PUSH32 0x313ce56700000000000000000000000000000000000000000000000000000000 0000417c: DUP2 0000417d: MSTORE 0000417e: SWAP1 0000417f: MLOAD 00004180: PUSH2 0x3790 00004183: SWAP3 00004184: PUSH1 0x01 00004186: PUSH1 0x01 00004188: PUSH1 0xa0 0000418a: SHL 0000418b: SUB 0000418c: AND 0000418d: SWAP2 0000418e: PUSH4 0x313ce567 00004193: SWAP2 00004194: PUSH1 0x04 00004196: DUP1 00004197: DUP4 00004198: ADD 00004199: SWAP3 0000419a: PUSH1 0x20 0000419c: SWAP3 0000419d: SWAP2 0000419e: SWAP1 0000419f: DUP3 000041a0: SWAP1 000041a1: SUB 000041a2: ADD 000041a3: DUP2 000041a4: DUP7 000041a5: DUP1 000041a6: EXTCODESIZE 000041a7: ISZERO 000041a8: DUP1 000041a9: ISZERO 000041aa: PUSH2 0x41b2 000041ad: JUMPI 000041ae: PUSH1 0x00 000041b0: DUP1 000041b1: REVERT 000041b2: JUMPDEST 000041b3: POP 000041b4: GAS 000041b5: STATICCALL 000041b6: ISZERO 000041b7: DUP1 000041b8: ISZERO 000041b9: PUSH2 0x41c6 000041bc: JUMPI 000041bd: RETURNDATASIZE 000041be: PUSH1 0x00 000041c0: DUP1 000041c1: RETURNDATACOPY 000041c2: RETURNDATASIZE 000041c3: PUSH1 0x00 000041c5: REVERT 000041c6: JUMPDEST 000041c7: POP 000041c8: POP 000041c9: POP 000041ca: POP 000041cb: PUSH1 0x40 000041cd: MLOAD 000041ce: RETURNDATASIZE 000041cf: PUSH1 0x20 000041d1: DUP2 000041d2: LT 000041d3: ISZERO 000041d4: PUSH2 0x41dc 000041d7: JUMPI 000041d8: PUSH1 0x00 000041da: DUP1 000041db: REVERT 000041dc: JUMPDEST 000041dd: POP 000041de: MLOAD 000041df: PUSH1 0xff 000041e1: AND 000041e2: PUSH1 0x0a 000041e4: EXP 000041e5: PUSH2 0x3790 000041e8: PUSH2 0x4f10 000041eb: JUMP 000041ec: JUMPDEST 000041ed: PUSH2 0x41f9 000041f0: JUMP 000041f1: JUMPDEST 000041f2: PUSH2 0x41f9 000041f5: PUSH2 0x5382 000041f8: JUMP 000041f9: JUMPDEST 000041fa: SWAP1 000041fb: POP 000041fc: PUSH2 0x1427 000041ff: JUMP 00004200: JUMPDEST 00004201: PUSH1 0x67 00004203: PUSH1 0x00 00004205: SWAP1 00004206: SLOAD 00004207: SWAP1 00004208: PUSH2 0x0100 0000420b: EXP 0000420c: SWAP1 0000420d: DIV 0000420e: PUSH1 0x01 00004210: PUSH1 0x01 00004212: PUSH1 0xa0 00004214: SHL 00004215: SUB 00004216: AND 00004217: PUSH1 0x01 00004219: PUSH1 0x01 0000421b: PUSH1 0xa0 0000421d: SHL 0000421e: SUB 0000421f: AND 00004220: PUSH4 0x294d237c 00004225: PUSH1 0x40 00004227: MLOAD 00004228: DUP2 00004229: PUSH4 0xffffffff 0000422e: AND 0000422f: PUSH1 0xe0 00004231: SHL 00004232: DUP2 00004233: MSTORE 00004234: PUSH1 0x04 00004236: ADD 00004237: PUSH1 0x20 00004239: PUSH1 0x40 0000423b: MLOAD 0000423c: DUP1 0000423d: DUP4 0000423e: SUB 0000423f: DUP2 00004240: DUP7 00004241: DUP1 00004242: EXTCODESIZE 00004243: ISZERO 00004244: DUP1 00004245: ISZERO 00004246: PUSH2 0x424e 00004249: JUMPI 0000424a: PUSH1 0x00 0000424c: DUP1 0000424d: REVERT 0000424e: JUMPDEST 0000424f: POP 00004250: GAS 00004251: STATICCALL 00004252: ISZERO 00004253: DUP1 00004254: ISZERO 00004255: PUSH2 0x4262 00004258: JUMPI 00004259: RETURNDATASIZE 0000425a: PUSH1 0x00 0000425c: DUP1 0000425d: RETURNDATACOPY 0000425e: RETURNDATASIZE 0000425f: PUSH1 0x00 00004261: REVERT 00004262: JUMPDEST 00004263: POP 00004264: POP 00004265: POP 00004266: POP 00004267: PUSH1 0x40 00004269: MLOAD 0000426a: RETURNDATASIZE 0000426b: PUSH1 0x20 0000426d: DUP2 0000426e: LT 0000426f: ISZERO 00004270: PUSH2 0x4278 00004273: JUMPI 00004274: PUSH1 0x00 00004276: DUP1 00004277: REVERT 00004278: JUMPDEST 00004279: POP 0000427a: MLOAD 0000427b: PUSH1 0x66 0000427d: SLOAD 0000427e: PUSH1 0x40 00004280: DUP1 00004281: MLOAD 00004282: PUSH32 0xbc14773a00000000000000000000000000000000000000000000000000000000 000042a3: DUP2 000042a4: MSTORE 000042a5: ADDRESS 000042a6: PUSH1 0x04 000042a8: DUP3 000042a9: ADD 000042aa: MSTORE 000042ab: PUSH1 0x01 000042ad: PUSH1 0x01 000042af: PUSH1 0xa0 000042b1: SHL 000042b2: SUB 000042b3: SWAP3 000042b4: DUP4 000042b5: AND 000042b6: PUSH1 0x24 000042b8: DUP3 000042b9: ADD 000042ba: MSTORE 000042bb: SWAP1 000042bc: MLOAD 000042bd: SWAP2 000042be: SWAP1 000042bf: SWAP3 000042c0: AND 000042c1: SWAP2 000042c2: PUSH4 0xbc14773a 000042c7: SWAP2 000042c8: PUSH1 0x44 000042ca: DUP1 000042cb: DUP4 000042cc: ADD 000042cd: SWAP3 000042ce: PUSH1 0x20 000042d0: SWAP3 000042d1: SWAP2 000042d2: SWAP1 000042d3: DUP3 000042d4: SWAP1 000042d5: SUB 000042d6: ADD 000042d7: DUP2 000042d8: DUP7 000042d9: DUP1 000042da: EXTCODESIZE 000042db: ISZERO 000042dc: DUP1 000042dd: ISZERO 000042de: PUSH2 0x42e6 000042e1: JUMPI 000042e2: PUSH1 0x00 000042e4: DUP1 000042e5: REVERT 000042e6: JUMPDEST 000042e7: POP 000042e8: GAS 000042e9: STATICCALL 000042ea: ISZERO 000042eb: DUP1 000042ec: ISZERO 000042ed: PUSH2 0x42fa 000042f0: JUMPI 000042f1: RETURNDATASIZE 000042f2: PUSH1 0x00 000042f4: DUP1 000042f5: RETURNDATACOPY 000042f6: RETURNDATASIZE 000042f7: PUSH1 0x00 000042f9: REVERT 000042fa: JUMPDEST 000042fb: POP 000042fc: POP 000042fd: POP 000042fe: POP 000042ff: PUSH1 0x40 00004301: MLOAD 00004302: RETURNDATASIZE 00004303: PUSH1 0x20 00004305: DUP2 00004306: LT 00004307: ISZERO 00004308: PUSH2 0x4310 0000430b: JUMPI 0000430c: PUSH1 0x00 0000430e: DUP1 0000430f: REVERT 00004310: JUMPDEST 00004311: POP 00004312: MLOAD 00004313: SWAP1 00004314: POP 00004315: PUSH2 0x1427 00004318: JUMP 00004319: JUMPDEST 0000431a: DUP1 0000431b: PUSH1 0x01 0000431d: PUSH1 0x01 0000431f: PUSH1 0xa0 00004321: SHL 00004322: SUB 00004323: AND 00004324: PUSH4 0x8da5cb5b 00004329: PUSH1 0x40 0000432b: MLOAD 0000432c: DUP2 0000432d: PUSH4 0xffffffff 00004332: AND 00004333: PUSH1 0xe0 00004335: SHL 00004336: DUP2 00004337: MSTORE 00004338: PUSH1 0x04 0000433a: ADD 0000433b: PUSH1 0x20 0000433d: PUSH1 0x40 0000433f: MLOAD 00004340: DUP1 00004341: DUP4 00004342: SUB 00004343: DUP2 00004344: DUP7 00004345: DUP1 00004346: EXTCODESIZE 00004347: ISZERO 00004348: DUP1 00004349: ISZERO 0000434a: PUSH2 0x4352 0000434d: JUMPI 0000434e: PUSH1 0x00 00004350: DUP1 00004351: REVERT 00004352: JUMPDEST 00004353: POP 00004354: GAS 00004355: STATICCALL 00004356: ISZERO 00004357: DUP1 00004358: ISZERO 00004359: PUSH2 0x4366 0000435c: JUMPI 0000435d: RETURNDATASIZE 0000435e: PUSH1 0x00 00004360: DUP1 00004361: RETURNDATACOPY 00004362: RETURNDATASIZE 00004363: PUSH1 0x00 00004365: REVERT 00004366: JUMPDEST 00004367: POP 00004368: POP 00004369: POP 0000436a: POP 0000436b: PUSH1 0x40 0000436d: MLOAD 0000436e: RETURNDATASIZE 0000436f: PUSH1 0x20 00004371: DUP2 00004372: LT 00004373: ISZERO 00004374: PUSH2 0x437c 00004377: JUMPI 00004378: PUSH1 0x00 0000437a: DUP1 0000437b: REVERT 0000437c: JUMPDEST 0000437d: POP 0000437e: MLOAD 0000437f: PUSH1 0x01 00004381: PUSH1 0x01 00004383: PUSH1 0xa0 00004385: SHL 00004386: SUB 00004387: AND 00004388: CALLER 00004389: EQ 0000438a: DUP1 0000438b: PUSH2 0x4400 0000438e: JUMPI 0000438f: POP 00004390: DUP1 00004391: PUSH1 0x01 00004393: PUSH1 0x01 00004395: PUSH1 0xa0 00004397: SHL 00004398: SUB 00004399: AND 0000439a: PUSH4 0x8d97e043 0000439f: PUSH1 0x40 000043a1: MLOAD 000043a2: DUP2 000043a3: PUSH4 0xffffffff 000043a8: AND 000043a9: PUSH1 0xe0 000043ab: SHL 000043ac: DUP2 000043ad: MSTORE 000043ae: PUSH1 0x04 000043b0: ADD 000043b1: PUSH1 0x20 000043b3: PUSH1 0x40 000043b5: MLOAD 000043b6: DUP1 000043b7: DUP4 000043b8: SUB 000043b9: DUP2 000043ba: DUP7 000043bb: DUP1 000043bc: EXTCODESIZE 000043bd: ISZERO 000043be: DUP1 000043bf: ISZERO 000043c0: PUSH2 0x43c8 000043c3: JUMPI 000043c4: PUSH1 0x00 000043c6: DUP1 000043c7: REVERT 000043c8: JUMPDEST 000043c9: POP 000043ca: GAS 000043cb: STATICCALL 000043cc: ISZERO 000043cd: DUP1 000043ce: ISZERO 000043cf: PUSH2 0x43dc 000043d2: JUMPI 000043d3: RETURNDATASIZE 000043d4: PUSH1 0x00 000043d6: DUP1 000043d7: RETURNDATACOPY 000043d8: RETURNDATASIZE 000043d9: PUSH1 0x00 000043db: REVERT 000043dc: JUMPDEST 000043dd: POP 000043de: POP 000043df: POP 000043e0: POP 000043e1: PUSH1 0x40 000043e3: MLOAD 000043e4: RETURNDATASIZE 000043e5: PUSH1 0x20 000043e7: DUP2 000043e8: LT 000043e9: ISZERO 000043ea: PUSH2 0x43f2 000043ed: JUMPI 000043ee: PUSH1 0x00 000043f0: DUP1 000043f1: REVERT 000043f2: JUMPDEST 000043f3: POP 000043f4: MLOAD 000043f5: PUSH1 0x01 000043f7: PUSH1 0x01 000043f9: PUSH1 0xa0 000043fb: SHL 000043fc: SUB 000043fd: AND 000043fe: CALLER 000043ff: EQ 00004400: JUMPDEST 00004401: PUSH2 0x443b 00004404: JUMPI 00004405: PUSH1 0x40 00004407: MLOAD 00004408: PUSH3 0x461bcd 0000440c: PUSH1 0xe5 0000440e: SHL 0000440f: DUP2 00004410: MSTORE 00004411: PUSH1 0x04 00004413: ADD 00004414: DUP1 00004415: DUP1 00004416: PUSH1 0x20 00004418: ADD 00004419: DUP3 0000441a: DUP2 0000441b: SUB 0000441c: DUP3 0000441d: MSTORE 0000441e: PUSH1 0x2a 00004420: DUP2 00004421: MSTORE 00004422: PUSH1 0x20 00004424: ADD 00004425: DUP1 00004426: PUSH2 0x5b5c 00004429: PUSH1 0x2a 0000442b: SWAP2 0000442c: CODECOPY 0000442d: PUSH1 0x40 0000442f: ADD 00004430: SWAP2 00004431: POP 00004432: POP 00004433: PUSH1 0x40 00004435: MLOAD 00004436: DUP1 00004437: SWAP2 00004438: SUB 00004439: SWAP1 0000443a: REVERT 0000443b: JUMPDEST 0000443c: POP 0000443d: JUMP 0000443e: JUMPDEST 0000443f: PUSH1 0x01 00004441: PUSH1 0x01 00004443: PUSH1 0xa0 00004445: SHL 00004446: SUB 00004447: DUP3 00004448: AND 00004449: PUSH2 0x4499 0000444c: JUMPI 0000444d: PUSH1 0x40 0000444f: DUP1 00004450: MLOAD 00004451: PUSH3 0x461bcd 00004455: PUSH1 0xe5 00004457: SHL 00004458: DUP2 00004459: MSTORE 0000445a: PUSH1 0x20 0000445c: PUSH1 0x04 0000445e: DUP3 0000445f: ADD 00004460: MSTORE 00004461: PUSH1 0x1f 00004463: PUSH1 0x24 00004465: DUP3 00004466: ADD 00004467: MSTORE 00004468: PUSH32 0x45524332303a206d696e7420746f20746865207a65726f206164647265737300 00004489: PUSH1 0x44 0000448b: DUP3 0000448c: ADD 0000448d: MSTORE 0000448e: SWAP1 0000448f: MLOAD 00004490: SWAP1 00004491: DUP2 00004492: SWAP1 00004493: SUB 00004494: PUSH1 0x64 00004496: ADD 00004497: SWAP1 00004498: REVERT 00004499: JUMPDEST 0000449a: PUSH2 0x44a5 0000449d: PUSH1 0x00 0000449f: DUP4 000044a0: DUP4 000044a1: PUSH2 0x493d 000044a4: JUMP 000044a5: JUMPDEST 000044a6: PUSH1 0x35 000044a8: SLOAD 000044a9: PUSH2 0x44b2 000044ac: SWAP1 000044ad: DUP3 000044ae: PUSH2 0x3d3f 000044b1: JUMP 000044b2: JUMPDEST 000044b3: PUSH1 0x35 000044b5: SSTORE 000044b6: PUSH1 0x01 000044b8: PUSH1 0x01 000044ba: PUSH1 0xa0 000044bc: SHL 000044bd: SUB 000044be: DUP3 000044bf: AND 000044c0: PUSH1 0x00 000044c2: SWAP1 000044c3: DUP2 000044c4: MSTORE 000044c5: PUSH1 0x33 000044c7: PUSH1 0x20 000044c9: MSTORE 000044ca: PUSH1 0x40 000044cc: SWAP1 000044cd: KECCAK256 000044ce: SLOAD 000044cf: PUSH2 0x44d8 000044d2: SWAP1 000044d3: DUP3 000044d4: PUSH2 0x3d3f 000044d7: JUMP 000044d8: JUMPDEST 000044d9: PUSH1 0x01 000044db: PUSH1 0x01 000044dd: PUSH1 0xa0 000044df: SHL 000044e0: SUB 000044e1: DUP4 000044e2: AND 000044e3: PUSH1 0x00 000044e5: DUP2 000044e6: DUP2 000044e7: MSTORE 000044e8: PUSH1 0x33 000044ea: PUSH1 0x20 000044ec: SWAP1 000044ed: DUP2 000044ee: MSTORE 000044ef: PUSH1 0x40 000044f1: DUP1 000044f2: DUP4 000044f3: KECCAK256 000044f4: SWAP5 000044f5: SWAP1 000044f6: SWAP5 000044f7: SSTORE 000044f8: DUP4 000044f9: MLOAD 000044fa: DUP6 000044fb: DUP2 000044fc: MSTORE 000044fd: SWAP4 000044fe: MLOAD 000044ff: SWAP3 00004500: SWAP4 00004501: SWAP2 00004502: SWAP3 00004503: PUSH32 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef 00004524: SWAP3 00004525: DUP2 00004526: SWAP1 00004527: SUB 00004528: SWAP1 00004529: SWAP2 0000452a: ADD 0000452b: SWAP1 0000452c: LOG3 0000452d: POP 0000452e: POP 0000452f: JUMP 00004530: JUMPDEST 00004531: PUSH1 0x00 00004533: PUSH2 0x149e 00004536: DUP3 00004537: PUSH2 0x233b 0000453a: DUP6 0000453b: PUSH8 0x0de0b6b3a7640000 00004544: PUSH2 0x40a6 00004547: JUMP 00004548: JUMPDEST 00004549: PUSH1 0x00 0000454b: PUSH2 0x149e 0000454e: PUSH8 0x0de0b6b3a7640000 00004557: PUSH2 0x233b 0000455a: DUP6 0000455b: DUP6 0000455c: PUSH2 0x40a6 0000455f: JUMP 00004560: JUMPDEST 00004561: PUSH2 0x4568 00004564: PUSH2 0x4cbd 00004567: JUMP 00004568: JUMPDEST 00004569: PUSH2 0x4571 0000456c: DUP4 0000456d: PUSH2 0x4d6c 00004570: JUMP 00004571: JUMPDEST 00004572: PUSH1 0x00 00004574: PUSH2 0x457c 00004577: DUP8 00004578: PUSH2 0x2360 0000457b: JUMP 0000457c: JUMPDEST 0000457d: SWAP1 0000457e: POP 0000457f: PUSH2 0x458c 00004582: PUSH1 0x00 00004584: DUP3 00004585: GT 00004586: PUSH1 0x0f 00004588: PUSH2 0x403a 0000458b: JUMP 0000458c: JUMPDEST 0000458d: PUSH2 0x45ad 00004590: PUSH2 0x4598 00004593: DUP9 00004594: PUSH2 0x4048 00004597: JUMP 00004598: JUMPDEST 00004599: PUSH2 0x45a4 0000459c: PUSH2 0x227e 0000459f: DUP11 000045a0: PUSH2 0x404f 000045a3: JUMP 000045a4: JUMPDEST 000045a5: LT 000045a6: ISZERO 000045a7: PUSH1 0x03 000045a9: PUSH2 0x403a 000045ac: JUMP 000045ad: JUMPDEST 000045ae: PUSH1 0x01 000045b0: PUSH1 0x01 000045b2: PUSH1 0xa0 000045b4: SHL 000045b5: SUB 000045b6: DUP8 000045b7: AND 000045b8: PUSH1 0x00 000045ba: SWAP1 000045bb: DUP2 000045bc: MSTORE 000045bd: PUSH1 0x71 000045bf: PUSH1 0x20 000045c1: MSTORE 000045c2: PUSH1 0x40 000045c4: SWAP1 000045c5: KECCAK256 000045c6: PUSH1 0x08 000045c8: ADD 000045c9: SLOAD 000045ca: PUSH2 0x45d3 000045cd: DUP3 000045ce: DUP3 000045cf: PUSH2 0x3796 000045d2: JUMP 000045d3: JUMPDEST 000045d4: DUP11 000045d5: GT 000045d6: PUSH2 0x45df 000045d9: JUMPI 000045da: DUP10 000045db: PUSH2 0x45e9 000045de: JUMP 000045df: JUMPDEST 000045e0: PUSH2 0x45e9 000045e3: DUP3 000045e4: DUP3 000045e5: PUSH2 0x3796 000045e8: JUMP 000045e9: JUMPDEST 000045ea: SWAP10 000045eb: POP 000045ec: PUSH2 0x4602 000045ef: PUSH2 0x45f8 000045f2: DUP4 000045f3: DUP4 000045f4: PUSH2 0x3796 000045f7: JUMP 000045f8: JUMPDEST 000045f9: DUP12 000045fa: GT 000045fb: ISZERO 000045fc: PUSH1 0x07 000045fe: PUSH2 0x403a 00004601: JUMP 00004602: JUMPDEST 00004603: PUSH1 0x00 00004605: PUSH2 0x460e 00004608: DUP12 00004609: DUP8 0000460a: PUSH2 0x538e 0000460d: JUMP 0000460e: JUMPDEST 0000460f: SWAP1 00004610: POP 00004611: DUP8 00004612: DUP1 00004613: ISZERO 00004614: PUSH2 0x4623 00004617: JUMPI 00004618: POP 00004619: DUP1 0000461a: PUSH2 0x4621 0000461d: PUSH2 0x4f10 00004620: JUMP 00004621: JUMPDEST 00004622: LT 00004623: JUMPDEST 00004624: ISZERO 00004625: PUSH2 0x46cf 00004628: JUMPI 00004629: PUSH2 0x4643 0000462c: PUSH2 0x463c 0000462f: DUP3 00004630: PUSH7 0x58d15e17628000 00004638: PUSH2 0x4548 0000463b: JUMP 0000463c: JUMPDEST 0000463d: DUP3 0000463e: SWAP1 0000463f: PUSH2 0x3796 00004642: JUMP 00004643: JUMPDEST 00004644: SWAP1 00004645: POP 00004646: PUSH2 0x464e 00004649: DUP8 0000464a: PUSH2 0x4d56 0000464d: JUMP 0000464e: JUMPDEST 0000464f: PUSH1 0x01 00004651: PUSH1 0x01 00004653: PUSH1 0xa0 00004655: SHL 00004656: SUB 00004657: DUP8 00004658: AND 00004659: PUSH4 0xfa9bacac 0000465e: PUSH2 0x4678 00004661: PUSH2 0x4671 00004664: DUP5 00004665: PUSH7 0xb1a2bc2ec50000 0000466d: PUSH2 0x4548 00004670: JUMP 00004671: JUMPDEST 00004672: DUP5 00004673: SWAP1 00004674: PUSH2 0x4096 00004677: JUMP 00004678: JUMPDEST 00004679: DUP8 0000467a: PUSH1 0x40 0000467c: MLOAD 0000467d: DUP4 0000467e: PUSH4 0xffffffff 00004683: AND 00004684: PUSH1 0xe0 00004686: SHL 00004687: DUP2 00004688: MSTORE 00004689: PUSH1 0x04 0000468b: ADD 0000468c: DUP1 0000468d: DUP4 0000468e: DUP2 0000468f: MSTORE 00004690: PUSH1 0x20 00004692: ADD 00004693: DUP3 00004694: DUP2 00004695: MSTORE 00004696: PUSH1 0x20 00004698: ADD 00004699: SWAP3 0000469a: POP 0000469b: POP 0000469c: POP 0000469d: PUSH1 0x00 0000469f: PUSH1 0x40 000046a1: MLOAD 000046a2: DUP1 000046a3: DUP4 000046a4: SUB 000046a5: DUP2 000046a6: PUSH1 0x00 000046a8: DUP8 000046a9: DUP1 000046aa: EXTCODESIZE 000046ab: ISZERO 000046ac: DUP1 000046ad: ISZERO 000046ae: PUSH2 0x46b6 000046b1: JUMPI 000046b2: PUSH1 0x00 000046b4: DUP1 000046b5: REVERT 000046b6: JUMPDEST 000046b7: POP 000046b8: GAS 000046b9: CALL 000046ba: ISZERO 000046bb: DUP1 000046bc: ISZERO 000046bd: PUSH2 0x46ca 000046c0: JUMPI 000046c1: RETURNDATASIZE 000046c2: PUSH1 0x00 000046c4: DUP1 000046c5: RETURNDATACOPY 000046c6: RETURNDATASIZE 000046c7: PUSH1 0x00 000046c9: REVERT 000046ca: JUMPDEST 000046cb: POP 000046cc: POP 000046cd: POP 000046ce: POP 000046cf: JUMPDEST 000046d0: PUSH2 0x46e9 000046d3: DUP11 000046d4: DUP3 000046d5: LT 000046d6: ISZERO 000046d7: DUP1 000046d8: ISZERO 000046d9: PUSH2 0x46e2 000046dc: JUMPI 000046dd: POP 000046de: PUSH1 0x00 000046e0: DUP13 000046e1: GT 000046e2: JUMPDEST 000046e3: PUSH1 0x56 000046e5: PUSH2 0x403a 000046e8: JUMP 000046e9: JUMPDEST 000046ea: PUSH2 0x46fe 000046ed: DUP2 000046ee: PUSH2 0x46f5 000046f1: PUSH2 0x4f10 000046f4: JUMP 000046f5: JUMPDEST 000046f6: LT 000046f7: ISZERO 000046f8: PUSH1 0x04 000046fa: PUSH2 0x403a 000046fd: JUMP 000046fe: JUMPDEST 000046ff: PUSH2 0x4708 00004702: DUP10 00004703: DUP13 00004704: PUSH2 0x541d 00004707: JUMP 00004708: JUMPDEST 00004709: DUP4 0000470a: ISZERO 0000470b: PUSH2 0x4725 0000470e: JUMPI 0000470f: PUSH1 0x66 00004711: SLOAD 00004712: PUSH2 0x4725 00004715: SWAP1 00004716: PUSH1 0x01 00004718: PUSH1 0x01 0000471a: PUSH1 0xa0 0000471c: SHL 0000471d: SUB 0000471e: AND 0000471f: CALLER 00004720: DUP7 00004721: PUSH2 0x5519 00004724: JUMP 00004725: JUMPDEST 00004726: PUSH2 0x473a 00004729: DUP10 0000472a: DUP3 0000472b: DUP6 0000472c: PUSH2 0x4734 0000472f: DUP14 00004730: PUSH2 0x2360 00004733: JUMP 00004734: JUMPDEST 00004735: DUP16 00004736: PUSH2 0x5584 00004739: JUMP 0000473a: JUMPDEST 0000473b: PUSH1 0x01 0000473d: PUSH1 0x01 0000473f: PUSH1 0xa0 00004741: SHL 00004742: SUB 00004743: DUP10 00004744: AND 00004745: PUSH1 0x00 00004747: SWAP1 00004748: DUP2 00004749: MSTORE 0000474a: PUSH1 0x71 0000474c: PUSH1 0x20 0000474e: MSTORE 0000474f: PUSH1 0x40 00004751: SWAP1 00004752: KECCAK256 00004753: PUSH1 0x07 00004755: ADD 00004756: DUP1 00004757: SLOAD 00004758: PUSH1 0x01 0000475a: ADD 0000475b: SWAP1 0000475c: SSTORE 0000475d: PUSH2 0x476f 00004760: DUP10 00004761: PUSH2 0x476a 00004764: DUP4 00004765: DUP8 00004766: PUSH2 0x3796 00004769: JUMP 0000476a: JUMPDEST 0000476b: PUSH2 0x5122 0000476e: JUMP 0000476f: JUMPDEST 00004770: PUSH1 0x40 00004772: DUP1 00004773: MLOAD 00004774: DUP3 00004775: DUP2 00004776: MSTORE 00004777: PUSH1 0x20 00004779: DUP2 0000477a: ADD 0000477b: DUP14 0000477c: SWAP1 0000477d: MSTORE 0000477e: TIMESTAMP 0000477f: DUP2 00004780: DUP4 00004781: ADD 00004782: MSTORE 00004783: SWAP1 00004784: MLOAD 00004785: PUSH1 0x01 00004787: PUSH1 0x01 00004789: PUSH1 0xa0 0000478b: SHL 0000478c: SUB 0000478d: DUP12 0000478e: AND 0000478f: SWAP2 00004790: DUP3 00004791: SWAP2 00004792: PUSH32 0x32a44bf15c44dad7691e20191a033527995d56d46ebe5115756d9e2eec16d333 000047b3: SWAP2 000047b4: DUP2 000047b5: SWAP1 000047b6: SUB 000047b7: PUSH1 0x60 000047b9: ADD 000047ba: SWAP1 000047bb: LOG3 000047bc: POP 000047bd: POP 000047be: POP 000047bf: POP 000047c0: POP 000047c1: POP 000047c2: POP 000047c3: POP 000047c4: POP 000047c5: POP 000047c6: POP 000047c7: JUMP 000047c8: JUMPDEST 000047c9: PUSH1 0x00 000047cb: PUSH32 0x7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0 000047ec: DUP3 000047ed: GT 000047ee: ISZERO 000047ef: PUSH2 0x4829 000047f2: JUMPI 000047f3: PUSH1 0x40 000047f5: MLOAD 000047f6: PUSH3 0x461bcd 000047fa: PUSH1 0xe5 000047fc: SHL 000047fd: DUP2 000047fe: MSTORE 000047ff: PUSH1 0x04 00004801: ADD 00004802: DUP1 00004803: DUP1 00004804: PUSH1 0x20 00004806: ADD 00004807: DUP3 00004808: DUP2 00004809: SUB 0000480a: DUP3 0000480b: MSTORE 0000480c: PUSH1 0x22 0000480e: DUP2 0000480f: MSTORE 00004810: PUSH1 0x20 00004812: ADD 00004813: DUP1 00004814: PUSH2 0x5aa9 00004817: PUSH1 0x22 00004819: SWAP2 0000481a: CODECOPY 0000481b: PUSH1 0x40 0000481d: ADD 0000481e: SWAP2 0000481f: POP 00004820: POP 00004821: PUSH1 0x40 00004823: MLOAD 00004824: DUP1 00004825: SWAP2 00004826: SUB 00004827: SWAP1 00004828: REVERT 00004829: JUMPDEST 0000482a: DUP4 0000482b: PUSH1 0xff 0000482d: AND 0000482e: PUSH1 0x1b 00004830: EQ 00004831: DUP1 00004832: PUSH2 0x483e 00004835: JUMPI 00004836: POP 00004837: DUP4 00004838: PUSH1 0xff 0000483a: AND 0000483b: PUSH1 0x1c 0000483d: EQ 0000483e: JUMPDEST 0000483f: PUSH2 0x4879 00004842: JUMPI 00004843: PUSH1 0x40 00004845: MLOAD 00004846: PUSH3 0x461bcd 0000484a: PUSH1 0xe5 0000484c: SHL 0000484d: DUP2 0000484e: MSTORE 0000484f: PUSH1 0x04 00004851: ADD 00004852: DUP1 00004853: DUP1 00004854: PUSH1 0x20 00004856: ADD 00004857: DUP3 00004858: DUP2 00004859: SUB 0000485a: DUP3 0000485b: MSTORE 0000485c: PUSH1 0x22 0000485e: DUP2 0000485f: MSTORE 00004860: PUSH1 0x20 00004862: ADD 00004863: DUP1 00004864: PUSH2 0x5af1 00004867: PUSH1 0x22 00004869: SWAP2 0000486a: CODECOPY 0000486b: PUSH1 0x40 0000486d: ADD 0000486e: SWAP2 0000486f: POP 00004870: POP 00004871: PUSH1 0x40 00004873: MLOAD 00004874: DUP1 00004875: SWAP2 00004876: SUB 00004877: SWAP1 00004878: REVERT 00004879: JUMPDEST 0000487a: PUSH1 0x00 0000487c: PUSH1 0x01 0000487e: DUP7 0000487f: DUP7 00004880: DUP7 00004881: DUP7 00004882: PUSH1 0x40 00004884: MLOAD 00004885: PUSH1 0x00 00004887: DUP2 00004888: MSTORE 00004889: PUSH1 0x20 0000488b: ADD 0000488c: PUSH1 0x40 0000488e: MSTORE 0000488f: PUSH1 0x40 00004891: MLOAD 00004892: DUP1 00004893: DUP6 00004894: DUP2 00004895: MSTORE 00004896: PUSH1 0x20 00004898: ADD 00004899: DUP5 0000489a: PUSH1 0xff 0000489c: AND 0000489d: DUP2 0000489e: MSTORE 0000489f: PUSH1 0x20 000048a1: ADD 000048a2: DUP4 000048a3: DUP2 000048a4: MSTORE 000048a5: PUSH1 0x20 000048a7: ADD 000048a8: DUP3 000048a9: DUP2 000048aa: MSTORE 000048ab: PUSH1 0x20 000048ad: ADD 000048ae: SWAP5 000048af: POP 000048b0: POP 000048b1: POP 000048b2: POP 000048b3: POP 000048b4: PUSH1 0x20 000048b6: PUSH1 0x40 000048b8: MLOAD 000048b9: PUSH1 0x20 000048bb: DUP2 000048bc: SUB 000048bd: SWAP1 000048be: DUP1 000048bf: DUP5 000048c0: SUB 000048c1: SWAP1 000048c2: DUP6 000048c3: GAS 000048c4: STATICCALL 000048c5: ISZERO 000048c6: DUP1 000048c7: ISZERO 000048c8: PUSH2 0x48d5 000048cb: JUMPI 000048cc: RETURNDATASIZE 000048cd: PUSH1 0x00 000048cf: DUP1 000048d0: RETURNDATACOPY 000048d1: RETURNDATASIZE 000048d2: PUSH1 0x00 000048d4: REVERT 000048d5: JUMPDEST 000048d6: POP 000048d7: POP 000048d8: PUSH1 0x40 000048da: MLOAD 000048db: PUSH1 0x1f 000048dd: NOT 000048de: ADD 000048df: MLOAD 000048e0: SWAP2 000048e1: POP 000048e2: POP 000048e3: PUSH1 0x01 000048e5: PUSH1 0x01 000048e7: PUSH1 0xa0 000048e9: SHL 000048ea: SUB 000048eb: DUP2 000048ec: AND 000048ed: PUSH2 0x2d3b 000048f0: JUMPI 000048f1: PUSH1 0x40 000048f3: DUP1 000048f4: MLOAD 000048f5: PUSH3 0x461bcd 000048f9: PUSH1 0xe5 000048fb: SHL 000048fc: DUP2 000048fd: MSTORE 000048fe: PUSH1 0x20 00004900: PUSH1 0x04 00004902: DUP3 00004903: ADD 00004904: MSTORE 00004905: PUSH1 0x18 00004907: PUSH1 0x24 00004909: DUP3 0000490a: ADD 0000490b: MSTORE 0000490c: PUSH32 0x45434453413a20696e76616c6964207369676e61747572650000000000000000 0000492d: PUSH1 0x44 0000492f: DUP3 00004930: ADD 00004931: MSTORE 00004932: SWAP1 00004933: MLOAD 00004934: SWAP1 00004935: DUP2 00004936: SWAP1 00004937: SUB 00004938: PUSH1 0x64 0000493a: ADD 0000493b: SWAP1 0000493c: REVERT 0000493d: JUMPDEST 0000493e: PUSH2 0x4948 00004941: DUP4 00004942: DUP4 00004943: DUP4 00004944: PUSH2 0x2007 00004947: JUMP 00004948: JUMPDEST 00004949: PUSH2 0x4a05 0000494c: PUSH1 0x01 0000494e: PUSH1 0x01 00004950: PUSH1 0xa0 00004952: SHL 00004953: SUB 00004954: DUP5 00004955: AND 00004956: ISZERO 00004957: DUP1 00004958: PUSH2 0x4968 0000495b: JUMPI 0000495c: POP 0000495d: PUSH1 0x01 0000495f: PUSH1 0x01 00004961: PUSH1 0xa0 00004963: SHL 00004964: SUB 00004965: DUP4 00004966: AND 00004967: ISZERO 00004968: JUMPDEST 00004969: DUP1 0000496a: PUSH2 0x49fe 0000496d: JUMPI 0000496e: POP 0000496f: PUSH1 0x67 00004971: PUSH1 0x00 00004973: SWAP1 00004974: SLOAD 00004975: SWAP1 00004976: PUSH2 0x0100 00004979: EXP 0000497a: SWAP1 0000497b: DIV 0000497c: PUSH1 0x01 0000497e: PUSH1 0x01 00004980: PUSH1 0xa0 00004982: SHL 00004983: SUB 00004984: AND 00004985: PUSH1 0x01 00004987: PUSH1 0x01 00004989: PUSH1 0xa0 0000498b: SHL 0000498c: SUB 0000498d: AND 0000498e: PUSH4 0x393bfe49 00004993: PUSH1 0x40 00004995: MLOAD 00004996: DUP2 00004997: PUSH4 0xffffffff 0000499c: AND 0000499d: PUSH1 0xe0 0000499f: SHL 000049a0: DUP2 000049a1: MSTORE 000049a2: PUSH1 0x04 000049a4: ADD 000049a5: PUSH1 0x20 000049a7: PUSH1 0x40 000049a9: MLOAD 000049aa: DUP1 000049ab: DUP4 000049ac: SUB 000049ad: DUP2 000049ae: DUP7 000049af: DUP1 000049b0: EXTCODESIZE 000049b1: ISZERO 000049b2: DUP1 000049b3: ISZERO 000049b4: PUSH2 0x49bc 000049b7: JUMPI 000049b8: PUSH1 0x00 000049ba: DUP1 000049bb: REVERT 000049bc: JUMPDEST 000049bd: POP 000049be: GAS 000049bf: STATICCALL 000049c0: ISZERO 000049c1: DUP1 000049c2: ISZERO 000049c3: PUSH2 0x49d0 000049c6: JUMPI 000049c7: RETURNDATASIZE 000049c8: PUSH1 0x00 000049ca: DUP1 000049cb: RETURNDATACOPY 000049cc: RETURNDATASIZE 000049cd: PUSH1 0x00 000049cf: REVERT 000049d0: JUMPDEST 000049d1: POP 000049d2: POP 000049d3: POP 000049d4: POP 000049d5: PUSH1 0x40 000049d7: MLOAD 000049d8: RETURNDATASIZE 000049d9: PUSH1 0x20 000049db: DUP2 000049dc: LT 000049dd: ISZERO 000049de: PUSH2 0x49e6 000049e1: JUMPI 000049e2: PUSH1 0x00 000049e4: DUP1 000049e5: REVERT 000049e6: JUMPDEST 000049e7: POP 000049e8: MLOAD 000049e9: DUP1 000049ea: ISZERO 000049eb: PUSH2 0x49fe 000049ee: JUMPI 000049ef: POP 000049f0: PUSH1 0x69 000049f2: SLOAD 000049f3: PUSH1 0x01 000049f5: PUSH1 0xa8 000049f7: SHL 000049f8: SWAP1 000049f9: DIV 000049fa: PUSH1 0xff 000049fc: AND 000049fd: ISZERO 000049fe: JUMPDEST 000049ff: PUSH1 0x3b 00004a01: PUSH2 0x403a 00004a04: JUMP 00004a05: JUMPDEST 00004a06: PUSH1 0x01 00004a08: PUSH1 0x01 00004a0a: PUSH1 0xa0 00004a0c: SHL 00004a0d: SUB 00004a0e: DUP4 00004a0f: AND 00004a10: ISZERO 00004a11: DUP1 00004a12: ISZERO 00004a13: SWAP1 00004a14: PUSH2 0x4a25 00004a17: JUMPI 00004a18: POP 00004a19: PUSH1 0x01 00004a1b: PUSH1 0x01 00004a1d: PUSH1 0xa0 00004a1f: SHL 00004a20: SUB 00004a21: DUP3 00004a22: AND 00004a23: ISZERO 00004a24: ISZERO 00004a25: JUMPDEST 00004a26: DUP1 00004a27: ISZERO 00004a28: PUSH2 0x4a43 00004a2b: JUMPI 00004a2c: POP 00004a2d: DUP2 00004a2e: PUSH1 0x01 00004a30: PUSH1 0x01 00004a32: PUSH1 0xa0 00004a34: SHL 00004a35: SUB 00004a36: AND 00004a37: DUP4 00004a38: PUSH1 0x01 00004a3a: PUSH1 0x01 00004a3c: PUSH1 0xa0 00004a3e: SHL 00004a3f: SUB 00004a40: AND 00004a41: EQ 00004a42: ISZERO 00004a43: JUMPDEST 00004a44: ISZERO 00004a45: PUSH2 0x2007 00004a48: JUMPI 00004a49: PUSH1 0x00 00004a4b: PUSH2 0x4a53 00004a4e: DUP5 00004a4f: PUSH2 0x2360 00004a52: JUMP 00004a53: JUMPDEST 00004a54: PUSH1 0x01 00004a56: PUSH1 0x01 00004a58: PUSH1 0xa0 00004a5a: SHL 00004a5b: SUB 00004a5c: DUP6 00004a5d: AND 00004a5e: PUSH1 0x00 00004a60: SWAP1 00004a61: DUP2 00004a62: MSTORE 00004a63: PUSH1 0x71 00004a65: PUSH1 0x20 00004a67: MSTORE 00004a68: PUSH1 0x40 00004a6a: SWAP1 00004a6b: KECCAK256 00004a6c: PUSH1 0x08 00004a6e: ADD 00004a6f: SLOAD 00004a70: SWAP1 00004a71: SWAP2 00004a72: POP 00004a73: PUSH2 0x4a89 00004a76: DUP4 00004a77: PUSH2 0x4a80 00004a7a: DUP5 00004a7b: DUP5 00004a7c: PUSH2 0x3796 00004a7f: JUMP 00004a80: JUMPDEST 00004a81: LT 00004a82: ISZERO 00004a83: PUSH1 0x07 00004a85: PUSH2 0x403a 00004a88: JUMP 00004a89: JUMPDEST 00004a8a: PUSH1 0x01 00004a8c: PUSH1 0x01 00004a8e: PUSH1 0xa0 00004a90: SHL 00004a91: SUB 00004a92: DUP1 00004a93: DUP7 00004a94: AND 00004a95: PUSH1 0x00 00004a97: SWAP1 00004a98: DUP2 00004a99: MSTORE 00004a9a: PUSH1 0x93 00004a9c: PUSH1 0x20 00004a9e: MSTORE 00004a9f: PUSH1 0x40 00004aa1: DUP1 00004aa2: DUP3 00004aa3: KECCAK256 00004aa4: SLOAD 00004aa5: SWAP3 00004aa6: DUP8 00004aa7: AND 00004aa8: DUP3 00004aa9: MSTORE 00004aaa: SWAP1 00004aab: KECCAK256 00004aac: SLOAD 00004aad: PUSH2 0x4ab9 00004ab0: SWAP2 00004ab1: GT 00004ab2: ISZERO 00004ab3: PUSH1 0x86 00004ab5: PUSH2 0x403a 00004ab8: JUMP 00004ab9: JUMPDEST 00004aba: PUSH1 0x01 00004abc: PUSH1 0x01 00004abe: PUSH1 0xa0 00004ac0: SHL 00004ac1: SUB 00004ac2: DUP1 00004ac3: DUP6 00004ac4: AND 00004ac5: PUSH1 0x00 00004ac7: SWAP1 00004ac8: DUP2 00004ac9: MSTORE 00004aca: PUSH1 0x93 00004acc: PUSH1 0x20 00004ace: MSTORE 00004acf: PUSH1 0x40 00004ad1: DUP1 00004ad2: DUP3 00004ad3: KECCAK256 00004ad4: SLOAD 00004ad5: SWAP3 00004ad6: DUP9 00004ad7: AND 00004ad8: DUP3 00004ad9: MSTORE 00004ada: SWAP1 00004adb: KECCAK256 00004adc: SLOAD 00004add: LT 00004ade: ISZERO 00004adf: PUSH2 0x4b62 00004ae2: JUMPI 00004ae3: PUSH1 0x00 00004ae5: PUSH2 0x4aed 00004ae8: DUP6 00004ae9: PUSH2 0x2360 00004aec: JUMP 00004aed: JUMPDEST 00004aee: SWAP1 00004aef: POP 00004af0: PUSH2 0x4b47 00004af3: PUSH2 0x4afc 00004af6: DUP5 00004af7: DUP4 00004af8: PUSH2 0x4096 00004afb: JUMP 00004afc: JUMPDEST 00004afd: PUSH1 0x01 00004aff: PUSH1 0x01 00004b01: PUSH1 0xa0 00004b03: SHL 00004b04: SUB 00004b05: DUP8 00004b06: AND 00004b07: PUSH1 0x00 00004b09: SWAP1 00004b0a: DUP2 00004b0b: MSTORE 00004b0c: PUSH1 0x93 00004b0e: PUSH1 0x20 00004b10: MSTORE 00004b11: PUSH1 0x40 00004b13: SWAP1 00004b14: KECCAK256 00004b15: SLOAD 00004b16: PUSH2 0x233b 00004b19: SWAP1 00004b1a: PUSH2 0x4b24 00004b1d: SWAP1 00004b1e: DUP6 00004b1f: SWAP1 00004b20: PUSH2 0x40a6 00004b23: JUMP 00004b24: JUMPDEST 00004b25: PUSH1 0x01 00004b27: PUSH1 0x01 00004b29: PUSH1 0xa0 00004b2b: SHL 00004b2c: SUB 00004b2d: DUP11 00004b2e: AND 00004b2f: PUSH1 0x00 00004b31: SWAP1 00004b32: DUP2 00004b33: MSTORE 00004b34: PUSH1 0x93 00004b36: PUSH1 0x20 00004b38: MSTORE 00004b39: PUSH1 0x40 00004b3b: SWAP1 00004b3c: KECCAK256 00004b3d: SLOAD 00004b3e: PUSH2 0x2335 00004b41: SWAP1 00004b42: DUP9 00004b43: PUSH2 0x40a6 00004b46: JUMP 00004b47: JUMPDEST 00004b48: PUSH1 0x01 00004b4a: PUSH1 0x01 00004b4c: PUSH1 0xa0 00004b4e: SHL 00004b4f: SUB 00004b50: DUP7 00004b51: AND 00004b52: PUSH1 0x00 00004b54: SWAP1 00004b55: DUP2 00004b56: MSTORE 00004b57: PUSH1 0x93 00004b59: PUSH1 0x20 00004b5b: MSTORE 00004b5c: PUSH1 0x40 00004b5e: SWAP1 00004b5f: KECCAK256 00004b60: SSTORE 00004b61: POP 00004b62: JUMPDEST 00004b63: PUSH2 0x4b79 00004b66: DUP6 00004b67: PUSH1 0x00 00004b69: DUP5 00004b6a: PUSH2 0x4b73 00004b6d: DUP2 00004b6e: DUP9 00004b6f: PUSH2 0x3796 00004b72: JUMP 00004b73: JUMPDEST 00004b74: DUP8 00004b75: PUSH2 0x5584 00004b78: JUMP 00004b79: JUMPDEST 00004b7a: PUSH2 0x2af4 00004b7d: DUP5 00004b7e: PUSH2 0x4b86 00004b81: DUP7 00004b82: PUSH2 0x2360 00004b85: JUMP 00004b86: JUMPDEST 00004b87: PUSH1 0x00 00004b89: DUP7 00004b8a: PUSH2 0x4f8e 00004b8d: JUMP 00004b8e: JUMPDEST 00004b8f: PUSH1 0x00 00004b91: PUSH2 0x4b99 00004b94: DUP5 00004b95: PUSH2 0x5685 00004b98: JUMP 00004b99: JUMPDEST 00004b9a: ISZERO 00004b9b: PUSH2 0x4c98 00004b9e: JUMPI 00004b9f: PUSH1 0x40 00004ba1: DUP1 00004ba2: MLOAD 00004ba3: PUSH4 0x0b135d3f 00004ba8: PUSH1 0xe1 00004baa: SHL 00004bab: DUP2 00004bac: MSTORE 00004bad: PUSH1 0x04 00004baf: DUP2 00004bb0: ADD 00004bb1: DUP6 00004bb2: DUP2 00004bb3: MSTORE 00004bb4: PUSH1 0x24 00004bb6: DUP3 00004bb7: ADD 00004bb8: SWAP3 00004bb9: DUP4 00004bba: MSTORE 00004bbb: DUP5 00004bbc: MLOAD 00004bbd: PUSH1 0x44 00004bbf: DUP4 00004bc0: ADD 00004bc1: MSTORE 00004bc2: DUP5 00004bc3: MLOAD 00004bc4: PUSH1 0x01 00004bc6: PUSH1 0x01 00004bc8: PUSH1 0xa0 00004bca: SHL 00004bcb: SUB 00004bcc: DUP9 00004bcd: AND 00004bce: SWAP4 00004bcf: PUSH4 0x1626ba7e 00004bd4: SWAP4 00004bd5: DUP9 00004bd6: SWAP4 00004bd7: DUP9 00004bd8: SWAP4 00004bd9: SWAP1 00004bda: SWAP3 00004bdb: SWAP2 00004bdc: PUSH1 0x64 00004bde: ADD 00004bdf: SWAP1 00004be0: PUSH1 0x20 00004be2: DUP6 00004be3: ADD 00004be4: SWAP1 00004be5: DUP1 00004be6: DUP4 00004be7: DUP4 00004be8: PUSH1 0x00 00004bea: JUMPDEST 00004beb: DUP4 00004bec: DUP2 00004bed: LT 00004bee: ISZERO 00004bef: PUSH2 0x4c02 00004bf2: JUMPI 00004bf3: DUP2 00004bf4: DUP2 00004bf5: ADD 00004bf6: MLOAD 00004bf7: DUP4 00004bf8: DUP3 00004bf9: ADD 00004bfa: MSTORE 00004bfb: PUSH1 0x20 00004bfd: ADD 00004bfe: PUSH2 0x4bea 00004c01: JUMP 00004c02: JUMPDEST 00004c03: POP 00004c04: POP 00004c05: POP 00004c06: POP 00004c07: SWAP1 00004c08: POP 00004c09: SWAP1 00004c0a: DUP2 00004c0b: ADD 00004c0c: SWAP1 00004c0d: PUSH1 0x1f 00004c0f: AND 00004c10: DUP1 00004c11: ISZERO 00004c12: PUSH2 0x4c2f 00004c15: JUMPI 00004c16: DUP1 00004c17: DUP3 00004c18: SUB 00004c19: DUP1 00004c1a: MLOAD 00004c1b: PUSH1 0x01 00004c1d: DUP4 00004c1e: PUSH1 0x20 00004c20: SUB 00004c21: PUSH2 0x0100 00004c24: EXP 00004c25: SUB 00004c26: NOT 00004c27: AND 00004c28: DUP2 00004c29: MSTORE 00004c2a: PUSH1 0x20 00004c2c: ADD 00004c2d: SWAP2 00004c2e: POP 00004c2f: JUMPDEST 00004c30: POP 00004c31: SWAP4 00004c32: POP 00004c33: POP 00004c34: POP 00004c35: POP 00004c36: PUSH1 0x20 00004c38: PUSH1 0x40 00004c3a: MLOAD 00004c3b: DUP1 00004c3c: DUP4 00004c3d: SUB 00004c3e: DUP2 00004c3f: DUP7 00004c40: DUP1 00004c41: EXTCODESIZE 00004c42: ISZERO 00004c43: DUP1 00004c44: ISZERO 00004c45: PUSH2 0x4c4d 00004c48: JUMPI 00004c49: PUSH1 0x00 00004c4b: DUP1 00004c4c: REVERT 00004c4d: JUMPDEST 00004c4e: POP 00004c4f: GAS 00004c50: STATICCALL 00004c51: SWAP3 00004c52: POP 00004c53: POP 00004c54: POP 00004c55: DUP1 00004c56: ISZERO 00004c57: PUSH2 0x4c72 00004c5a: JUMPI 00004c5b: POP 00004c5c: PUSH1 0x40 00004c5e: MLOAD 00004c5f: RETURNDATASIZE 00004c60: PUSH1 0x20 00004c62: DUP2 00004c63: LT 00004c64: ISZERO 00004c65: PUSH2 0x4c6d 00004c68: JUMPI 00004c69: PUSH1 0x00 00004c6b: DUP1 00004c6c: REVERT 00004c6d: JUMPDEST 00004c6e: POP 00004c6f: MLOAD 00004c70: PUSH1 0x01 00004c72: JUMPDEST 00004c73: PUSH2 0x4c7e 00004c76: JUMPI 00004c77: POP 00004c78: PUSH1 0x00 00004c7a: PUSH2 0x149e 00004c7d: JUMP 00004c7e: JUMPDEST 00004c7f: PUSH1 0x01 00004c81: PUSH1 0x01 00004c83: PUSH1 0xe0 00004c85: SHL 00004c86: SUB 00004c87: NOT 00004c88: AND 00004c89: PUSH4 0x0b135d3f 00004c8e: PUSH1 0xe1 00004c90: SHL 00004c91: EQ 00004c92: SWAP1 00004c93: POP 00004c94: PUSH2 0x149e 00004c97: JUMP 00004c98: JUMPDEST 00004c99: DUP4 00004c9a: PUSH1 0x01 00004c9c: PUSH1 0x01 00004c9e: PUSH1 0xa0 00004ca0: SHL 00004ca1: SUB 00004ca2: AND 00004ca3: PUSH2 0x4cac 00004ca6: DUP5 00004ca7: DUP5 00004ca8: PUSH2 0x334a 00004cab: JUMP 00004cac: JUMPDEST 00004cad: PUSH1 0x01 00004caf: PUSH1 0x01 00004cb1: PUSH1 0xa0 00004cb3: SHL 00004cb4: SUB 00004cb5: AND 00004cb6: EQ 00004cb7: SWAP1 00004cb8: POP 00004cb9: PUSH2 0x149e 00004cbc: JUMP 00004cbd: JUMPDEST 00004cbe: PUSH1 0x67 00004cc0: SLOAD 00004cc1: PUSH1 0x40 00004cc3: DUP1 00004cc4: MLOAD 00004cc5: PUSH32 0x5b14f18300000000000000000000000000000000000000000000000000000000 00004ce6: DUP2 00004ce7: MSTORE 00004ce8: ADDRESS 00004ce9: PUSH1 0x04 00004ceb: DUP3 00004cec: ADD 00004ced: MSTORE 00004cee: SWAP1 00004cef: MLOAD 00004cf0: PUSH2 0x136d 00004cf3: SWAP3 00004cf4: PUSH1 0x01 00004cf6: PUSH1 0x01 00004cf8: PUSH1 0xa0 00004cfa: SHL 00004cfb: SUB 00004cfc: AND 00004cfd: SWAP2 00004cfe: PUSH4 0x5b14f183 00004d03: SWAP2 00004d04: PUSH1 0x24 00004d06: DUP1 00004d07: DUP4 00004d08: ADD 00004d09: SWAP3 00004d0a: PUSH1 0x20 00004d0c: SWAP3 00004d0d: SWAP2 00004d0e: SWAP1 00004d0f: DUP3 00004d10: SWAP1 00004d11: SUB 00004d12: ADD 00004d13: DUP2 00004d14: DUP7 00004d15: DUP1 00004d16: EXTCODESIZE 00004d17: ISZERO 00004d18: DUP1 00004d19: ISZERO 00004d1a: PUSH2 0x4d22 00004d1d: JUMPI 00004d1e: PUSH1 0x00 00004d20: DUP1 00004d21: REVERT 00004d22: JUMPDEST 00004d23: POP 00004d24: GAS 00004d25: STATICCALL 00004d26: ISZERO 00004d27: DUP1 00004d28: ISZERO 00004d29: PUSH2 0x4d36 00004d2c: JUMPI 00004d2d: RETURNDATASIZE 00004d2e: PUSH1 0x00 00004d30: DUP1 00004d31: RETURNDATACOPY 00004d32: RETURNDATASIZE 00004d33: PUSH1 0x00 00004d35: REVERT 00004d36: JUMPDEST 00004d37: POP 00004d38: POP 00004d39: POP 00004d3a: POP 00004d3b: PUSH1 0x40 00004d3d: MLOAD 00004d3e: RETURNDATASIZE 00004d3f: PUSH1 0x20 00004d41: DUP2 00004d42: LT 00004d43: ISZERO 00004d44: PUSH2 0x4d4c 00004d47: JUMPI 00004d48: PUSH1 0x00 00004d4a: DUP1 00004d4b: REVERT 00004d4c: JUMPDEST 00004d4d: POP 00004d4e: MLOAD 00004d4f: ISZERO 00004d50: PUSH1 0x53 00004d52: PUSH2 0x403a 00004d55: JUMP 00004d56: JUMPDEST 00004d57: PUSH2 0x443b 00004d5a: PUSH1 0x01 00004d5c: PUSH1 0x01 00004d5e: PUSH1 0xa0 00004d60: SHL 00004d61: SUB 00004d62: DUP3 00004d63: AND 00004d64: ISZERO 00004d65: ISZERO 00004d66: PUSH1 0x17 00004d68: PUSH2 0x403a 00004d6b: JUMP 00004d6c: JUMPDEST 00004d6d: PUSH1 0x00 00004d6f: DUP1 00004d70: PUSH1 0x8d 00004d72: SLOAD 00004d73: GT 00004d74: PUSH2 0x4d85 00004d77: JUMPI 00004d78: PUSH8 0x03782dace9d90000 00004d81: PUSH2 0x4d89 00004d84: JUMP 00004d85: JUMPDEST 00004d86: PUSH1 0x8d 00004d88: SLOAD 00004d89: JUMPDEST 00004d8a: SWAP1 00004d8b: POP 00004d8c: PUSH1 0x00 00004d8e: DUP1 00004d8f: PUSH1 0x8c 00004d91: SLOAD 00004d92: GT 00004d93: PUSH2 0x4da4 00004d96: JUMPI 00004d97: PUSH8 0x0de0b6b3a7640000 00004da0: PUSH2 0x4da8 00004da3: JUMP 00004da4: JUMPDEST 00004da5: PUSH1 0x8c 00004da7: SLOAD 00004da8: JUMPDEST 00004da9: SWAP1 00004daa: POP 00004dab: PUSH1 0x8a 00004dad: SLOAD 00004dae: PUSH1 0x00 00004db0: EQ 00004db1: PUSH2 0x4e58 00004db4: JUMPI 00004db5: PUSH2 0x4de5 00004db8: PUSH2 0x4dde 00004dbb: DUP3 00004dbc: PUSH2 0x4dd8 00004dbf: PUSH4 0x01e13380 00004dc4: PUSH2 0x3790 00004dc7: PUSH1 0x8b 00004dc9: SLOAD 00004dca: TIMESTAMP 00004dcb: PUSH2 0x3796 00004dce: SWAP1 00004dcf: SWAP2 00004dd0: SWAP1 00004dd1: PUSH4 0xffffffff 00004dd6: AND 00004dd7: JUMP 00004dd8: JUMPDEST 00004dd9: SWAP1 00004dda: PUSH2 0x4548 00004ddd: JUMP 00004dde: JUMPDEST 00004ddf: DUP4 00004de0: SWAP1 00004de1: PUSH2 0x4096 00004de4: JUMP 00004de5: JUMPDEST 00004de6: SWAP2 00004de7: POP 00004de8: PUSH1 0x8a 00004dea: SLOAD 00004deb: DUP4 00004dec: GT 00004ded: ISZERO 00004dee: PUSH2 0x4e1e 00004df1: JUMPI 00004df2: PUSH1 0x8a 00004df4: SLOAD 00004df5: PUSH2 0x4e19 00004df8: SWAP1 00004df9: PUSH2 0x4e02 00004dfc: SWAP1 00004dfd: DUP5 00004dfe: PUSH2 0x4548 00004e01: JUMP 00004e02: JUMPDEST 00004e03: PUSH1 0x8a 00004e05: SLOAD 00004e06: PUSH2 0x4e10 00004e09: SWAP1 00004e0a: DUP7 00004e0b: SWAP1 00004e0c: PUSH2 0x3796 00004e0f: JUMP 00004e10: JUMPDEST 00004e11: GT 00004e12: ISZERO 00004e13: PUSH1 0x76 00004e15: PUSH2 0x403a 00004e18: JUMP 00004e19: JUMPDEST 00004e1a: PUSH2 0x4e58 00004e1d: JUMP 00004e1e: JUMPDEST 00004e1f: PUSH2 0x4e58 00004e22: PUSH2 0x4e4b 00004e25: PUSH2 0x4e42 00004e28: PUSH2 0x4e39 00004e2b: DUP6 00004e2c: PUSH8 0x0de0b6b3a7640000 00004e35: PUSH2 0x4096 00004e38: JUMP 00004e39: JUMPDEST 00004e3a: PUSH1 0x8a 00004e3c: SLOAD 00004e3d: SWAP1 00004e3e: PUSH2 0x4530 00004e41: JUMP 00004e42: JUMPDEST 00004e43: PUSH1 0x8a 00004e45: SLOAD 00004e46: SWAP1 00004e47: PUSH2 0x3796 00004e4a: JUMP 00004e4b: JUMPDEST 00004e4c: PUSH1 0x8a 00004e4e: SLOAD 00004e4f: PUSH2 0x4e10 00004e52: SWAP1 00004e53: DUP7 00004e54: PUSH2 0x3796 00004e57: JUMP 00004e58: JUMPDEST 00004e59: POP 00004e5a: POP 00004e5b: PUSH1 0x8a 00004e5d: SSTORE 00004e5e: TIMESTAMP 00004e5f: PUSH1 0x8b 00004e61: SSTORE 00004e62: JUMP 00004e63: JUMPDEST 00004e64: PUSH1 0x00 00004e66: PUSH1 0x01 00004e68: PUSH1 0x01 00004e6a: PUSH1 0xa0 00004e6c: SHL 00004e6d: SUB 00004e6e: DUP3 00004e6f: AND 00004e70: ISZERO 00004e71: DUP1 00004e72: ISZERO 00004e73: SWAP1 00004e74: PUSH2 0x1442 00004e77: JUMPI 00004e78: POP 00004e79: PUSH1 0x01 00004e7b: PUSH1 0x01 00004e7d: PUSH1 0xa0 00004e7f: SHL 00004e80: SUB 00004e81: DUP3 00004e82: AND 00004e83: PUSH1 0x86 00004e85: PUSH1 0x00 00004e87: ADD 00004e88: SLOAD 00004e89: PUSH1 0x01 00004e8b: PUSH1 0x01 00004e8d: PUSH1 0xa0 00004e8f: SHL 00004e90: SUB 00004e91: AND 00004e92: EQ 00004e93: DUP1 00004e94: PUSH2 0x4eb3 00004e97: JUMPI 00004e98: POP 00004e99: PUSH1 0x01 00004e9b: PUSH1 0x01 00004e9d: PUSH1 0xa0 00004e9f: SHL 00004ea0: SUB 00004ea1: DUP3 00004ea2: AND 00004ea3: PUSH1 0x86 00004ea5: PUSH1 0x01 00004ea7: ADD 00004ea8: SLOAD 00004ea9: PUSH1 0x01 00004eab: PUSH1 0x01 00004ead: PUSH1 0xa0 00004eaf: SHL 00004eb0: SUB 00004eb1: AND 00004eb2: EQ 00004eb3: JUMPDEST 00004eb4: DUP1 00004eb5: PUSH2 0x4ed4 00004eb8: JUMPI 00004eb9: POP 00004eba: PUSH1 0x01 00004ebc: PUSH1 0x01 00004ebe: PUSH1 0xa0 00004ec0: SHL 00004ec1: SUB 00004ec2: DUP3 00004ec3: AND 00004ec4: PUSH1 0x86 00004ec6: PUSH1 0x02 00004ec8: ADD 00004ec9: SLOAD 00004eca: PUSH1 0x01 00004ecc: PUSH1 0x01 00004ece: PUSH1 0xa0 00004ed0: SHL 00004ed1: SUB 00004ed2: AND 00004ed3: EQ 00004ed4: JUMPDEST 00004ed5: DUP1 00004ed6: PUSH2 0x4ef5 00004ed9: JUMPI 00004eda: POP 00004edb: PUSH1 0x01 00004edd: PUSH1 0x01 00004edf: PUSH1 0xa0 00004ee1: SHL 00004ee2: SUB 00004ee3: DUP3 00004ee4: AND 00004ee5: PUSH1 0x86 00004ee7: PUSH1 0x03 00004ee9: ADD 00004eea: SLOAD 00004eeb: PUSH1 0x01 00004eed: PUSH1 0x01 00004eef: PUSH1 0xa0 00004ef1: SHL 00004ef2: SUB 00004ef3: AND 00004ef4: EQ 00004ef5: JUMPDEST 00004ef6: DUP1 00004ef7: PUSH2 0x1442 00004efa: JUMPI 00004efb: POP 00004efc: POP 00004efd: PUSH1 0x69 00004eff: SLOAD 00004f00: PUSH1 0x01 00004f02: PUSH1 0x01 00004f04: PUSH1 0xa0 00004f06: SHL 00004f07: SUB 00004f08: SWAP1 00004f09: DUP2 00004f0a: AND 00004f0b: SWAP2 00004f0c: AND 00004f0d: EQ 00004f0e: SWAP1 00004f0f: JUMP 00004f10: JUMPDEST 00004f11: PUSH1 0x6b 00004f13: SLOAD 00004f14: PUSH1 0x66 00004f16: SLOAD 00004f17: PUSH1 0x40 00004f19: DUP1 00004f1a: MLOAD 00004f1b: PUSH4 0x70a08231 00004f20: PUSH1 0xe0 00004f22: SHL 00004f23: DUP2 00004f24: MSTORE 00004f25: ADDRESS 00004f26: PUSH1 0x04 00004f28: DUP3 00004f29: ADD 00004f2a: MSTORE 00004f2b: SWAP1 00004f2c: MLOAD 00004f2d: PUSH1 0x00 00004f2f: SWAP4 00004f30: DUP5 00004f31: SWAP4 00004f32: PUSH2 0x4f68 00004f35: SWAP4 00004f36: SWAP2 00004f37: SWAP3 00004f38: PUSH1 0x01 00004f3a: PUSH1 0x01 00004f3c: PUSH1 0xa0 00004f3e: SHL 00004f3f: SUB 00004f40: SWAP1 00004f41: SWAP2 00004f42: AND 00004f43: SWAP2 00004f44: PUSH4 0x70a08231 00004f49: SWAP2 00004f4a: PUSH1 0x24 00004f4c: DUP1 00004f4d: DUP4 00004f4e: ADD 00004f4f: SWAP3 00004f50: PUSH1 0x20 00004f52: SWAP3 00004f53: SWAP2 00004f54: SWAP1 00004f55: DUP3 00004f56: SWAP1 00004f57: SUB 00004f58: ADD 00004f59: DUP2 00004f5a: DUP7 00004f5b: DUP1 00004f5c: EXTCODESIZE 00004f5d: ISZERO 00004f5e: DUP1 00004f5f: ISZERO 00004f60: PUSH2 0x3abb 00004f63: JUMPI 00004f64: PUSH1 0x00 00004f66: DUP1 00004f67: REVERT 00004f68: JUMPDEST 00004f69: SWAP1 00004f6a: POP 00004f6b: PUSH1 0x83 00004f6d: SLOAD 00004f6e: DUP2 00004f6f: GT 00004f70: PUSH2 0x4f7a 00004f73: JUMPI 00004f74: PUSH1 0x00 00004f76: PUSH2 0x4f88 00004f79: JUMP 00004f7a: JUMPDEST 00004f7b: PUSH1 0x83 00004f7d: SLOAD 00004f7e: PUSH2 0x4f88 00004f81: SWAP1 00004f82: DUP3 00004f83: SWAP1 00004f84: PUSH2 0x3796 00004f87: JUMP 00004f88: JUMPDEST 00004f89: SWAP2 00004f8a: POP 00004f8b: POP 00004f8c: SWAP1 00004f8d: JUMP 00004f8e: JUMPDEST 00004f8f: PUSH1 0x01 00004f91: PUSH1 0x01 00004f93: PUSH1 0xa0 00004f95: SHL 00004f96: SUB 00004f97: DUP5 00004f98: AND 00004f99: PUSH1 0x00 00004f9b: SWAP1 00004f9c: DUP2 00004f9d: MSTORE 00004f9e: PUSH1 0x71 00004fa0: PUSH1 0x20 00004fa2: MSTORE 00004fa3: PUSH1 0x40 00004fa5: SWAP1 00004fa6: KECCAK256 00004fa7: DUP4 00004fa8: ISZERO 00004fa9: DUP1 00004faa: PUSH2 0x4fb5 00004fad: JUMPI 00004fae: POP 00004faf: PUSH1 0x01 00004fb1: DUP2 00004fb2: ADD 00004fb3: SLOAD 00004fb4: ISZERO 00004fb5: JUMPDEST 00004fb6: ISZERO 00004fb7: PUSH2 0x4fd2 00004fba: JUMPI 00004fbb: PUSH1 0x72 00004fbd: SLOAD 00004fbe: PUSH2 0x4fc8 00004fc1: SWAP1 00004fc2: PUSH1 0x01 00004fc4: PUSH2 0x4096 00004fc7: JUMP 00004fc8: JUMPDEST 00004fc9: PUSH1 0x72 00004fcb: SSTORE 00004fcc: TIMESTAMP 00004fcd: PUSH1 0x01 00004fcf: DUP3 00004fd0: ADD 00004fd1: SSTORE 00004fd2: JUMPDEST 00004fd3: PUSH1 0x06 00004fd5: DUP2 00004fd6: ADD 00004fd7: SLOAD 00004fd8: PUSH2 0x4fe1 00004fdb: SWAP1 00004fdc: DUP5 00004fdd: PUSH2 0x4096 00004fe0: JUMP 00004fe1: JUMPDEST 00004fe2: PUSH1 0x06 00004fe4: DUP3 00004fe5: ADD 00004fe6: SSTORE 00004fe7: TIMESTAMP 00004fe8: DUP2 00004fe9: SSTORE 00004fea: PUSH1 0x68 00004fec: SLOAD 00004fed: PUSH1 0x40 00004fef: DUP1 00004ff0: MLOAD 00004ff1: PUSH4 0xdf8a4e45 00004ff6: PUSH1 0xe0 00004ff8: SHL 00004ff9: DUP2 00004ffa: MSTORE 00004ffb: ADDRESS 00004ffc: PUSH1 0x04 00004ffe: DUP3 00004fff: ADD 00005000: MSTORE 00005001: PUSH1 0x01 00005003: PUSH1 0x01 00005005: PUSH1 0xa0 00005007: SHL 00005008: SUB 00005009: DUP9 0000500a: DUP2 0000500b: AND 0000500c: PUSH1 0x24 0000500e: DUP4 0000500f: ADD 00005010: MSTORE 00005011: PUSH1 0x44 00005013: DUP3 00005014: ADD 00005015: DUP9 00005016: SWAP1 00005017: MSTORE 00005018: PUSH1 0x64 0000501a: DUP3 0000501b: ADD 0000501c: DUP7 0000501d: SWAP1 0000501e: MSTORE 0000501f: PUSH1 0x01 00005021: PUSH1 0x84 00005023: DUP4 00005024: ADD 00005025: MSTORE 00005026: SWAP2 00005027: MLOAD 00005028: SWAP2 00005029: SWAP1 0000502a: SWAP3 0000502b: AND 0000502c: SWAP2 0000502d: PUSH4 0xdf8a4e45 00005032: SWAP2 00005033: PUSH1 0xa4 00005035: DUP1 00005036: DUP4 00005037: ADD 00005038: SWAP3 00005039: PUSH1 0x00 0000503b: SWAP3 0000503c: SWAP2 0000503d: SWAP1 0000503e: DUP3 0000503f: SWAP1 00005040: SUB 00005041: ADD 00005042: DUP2 00005043: DUP4 00005044: DUP8 00005045: DUP1 00005046: EXTCODESIZE 00005047: ISZERO 00005048: DUP1 00005049: ISZERO 0000504a: PUSH2 0x5052 0000504d: JUMPI 0000504e: PUSH1 0x00 00005050: DUP1 00005051: REVERT 00005052: JUMPDEST 00005053: POP 00005054: GAS 00005055: CALL 00005056: ISZERO 00005057: DUP1 00005058: ISZERO 00005059: PUSH2 0x5066 0000505c: JUMPI 0000505d: RETURNDATASIZE 0000505e: PUSH1 0x00 00005060: DUP1 00005061: RETURNDATACOPY 00005062: RETURNDATASIZE 00005063: PUSH1 0x00 00005065: REVERT 00005066: JUMPDEST 00005067: POP 00005068: POP 00005069: POP 0000506a: POP 0000506b: POP 0000506c: POP 0000506d: POP 0000506e: POP 0000506f: POP 00005070: JUMP 00005071: JUMPDEST 00005072: PUSH1 0x00 00005074: PUSH2 0x50c6 00005077: DUP3 00005078: PUSH1 0x40 0000507a: MLOAD 0000507b: DUP1 0000507c: PUSH1 0x40 0000507e: ADD 0000507f: PUSH1 0x40 00005081: MSTORE 00005082: DUP1 00005083: PUSH1 0x20 00005085: DUP2 00005086: MSTORE 00005087: PUSH1 0x20 00005089: ADD 0000508a: PUSH32 0x5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564 000050ab: DUP2 000050ac: MSTORE 000050ad: POP 000050ae: DUP6 000050af: PUSH1 0x01 000050b1: PUSH1 0x01 000050b3: PUSH1 0xa0 000050b5: SHL 000050b6: SUB 000050b7: AND 000050b8: PUSH2 0x568b 000050bb: SWAP1 000050bc: SWAP3 000050bd: SWAP2 000050be: SWAP1 000050bf: PUSH4 0xffffffff 000050c4: AND 000050c5: JUMP 000050c6: JUMPDEST 000050c7: DUP1 000050c8: MLOAD 000050c9: SWAP1 000050ca: SWAP2 000050cb: POP 000050cc: ISZERO 000050cd: PUSH2 0x2007 000050d0: JUMPI 000050d1: DUP1 000050d2: DUP1 000050d3: PUSH1 0x20 000050d5: ADD 000050d6: SWAP1 000050d7: MLOAD 000050d8: PUSH1 0x20 000050da: DUP2 000050db: LT 000050dc: ISZERO 000050dd: PUSH2 0x50e5 000050e0: JUMPI 000050e1: PUSH1 0x00 000050e3: DUP1 000050e4: REVERT 000050e5: JUMPDEST 000050e6: POP 000050e7: MLOAD 000050e8: PUSH2 0x2007 000050eb: JUMPI 000050ec: PUSH1 0x40 000050ee: MLOAD 000050ef: PUSH3 0x461bcd 000050f3: PUSH1 0xe5 000050f5: SHL 000050f6: DUP2 000050f7: MSTORE 000050f8: PUSH1 0x04 000050fa: ADD 000050fb: DUP1 000050fc: DUP1 000050fd: PUSH1 0x20 000050ff: ADD 00005100: DUP3 00005101: DUP2 00005102: SUB 00005103: DUP3 00005104: MSTORE 00005105: PUSH1 0x2a 00005107: DUP2 00005108: MSTORE 00005109: PUSH1 0x20 0000510b: ADD 0000510c: DUP1 0000510d: PUSH2 0x5bcf 00005110: PUSH1 0x2a 00005112: SWAP2 00005113: CODECOPY 00005114: PUSH1 0x40 00005116: ADD 00005117: SWAP2 00005118: POP 00005119: POP 0000511a: PUSH1 0x40 0000511c: MLOAD 0000511d: DUP1 0000511e: SWAP2 0000511f: SUB 00005120: SWAP1 00005121: REVERT 00005122: JUMPDEST 00005123: PUSH1 0x66 00005125: SLOAD 00005126: PUSH1 0x01 00005128: PUSH1 0x01 0000512a: PUSH1 0xa0 0000512c: SHL 0000512d: SUB 0000512e: AND 0000512f: PUSH20 0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2 00005144: EQ 00005145: ISZERO 00005146: PUSH2 0x51d3 00005149: JUMPI 0000514a: DUP1 0000514b: SELFBALANCE 0000514c: LT 0000514d: ISZERO 0000514e: PUSH2 0x51c4 00005151: JUMPI 00005152: PUSH20 0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2 00005167: PUSH4 0x2e1a7d4d 0000516c: PUSH2 0x5175 0000516f: DUP4 00005170: SELFBALANCE 00005171: PUSH2 0x3796 00005174: JUMP 00005175: JUMPDEST 00005176: PUSH1 0x40 00005178: MLOAD 00005179: DUP3 0000517a: PUSH4 0xffffffff 0000517f: AND 00005180: PUSH1 0xe0 00005182: SHL 00005183: DUP2 00005184: MSTORE 00005185: PUSH1 0x04 00005187: ADD 00005188: DUP1 00005189: DUP3 0000518a: DUP2 0000518b: MSTORE 0000518c: PUSH1 0x20 0000518e: ADD 0000518f: SWAP2 00005190: POP 00005191: POP 00005192: PUSH1 0x00 00005194: PUSH1 0x40 00005196: MLOAD 00005197: DUP1 00005198: DUP4 00005199: SUB 0000519a: DUP2 0000519b: PUSH1 0x00 0000519d: DUP8 0000519e: DUP1 0000519f: EXTCODESIZE 000051a0: ISZERO 000051a1: DUP1 000051a2: ISZERO 000051a3: PUSH2 0x51ab 000051a6: JUMPI 000051a7: PUSH1 0x00 000051a9: DUP1 000051aa: REVERT 000051ab: JUMPDEST 000051ac: POP 000051ad: GAS 000051ae: CALL 000051af: ISZERO 000051b0: DUP1 000051b1: ISZERO 000051b2: PUSH2 0x51bf 000051b5: JUMPI 000051b6: RETURNDATASIZE 000051b7: PUSH1 0x00 000051b9: DUP1 000051ba: RETURNDATACOPY 000051bb: RETURNDATASIZE 000051bc: PUSH1 0x00 000051be: REVERT 000051bf: JUMPDEST 000051c0: POP 000051c1: POP 000051c2: POP 000051c3: POP 000051c4: JUMPDEST 000051c5: PUSH2 0x51ce 000051c8: DUP3 000051c9: DUP3 000051ca: PUSH2 0x56a2 000051cd: JUMP 000051ce: JUMPDEST 000051cf: PUSH2 0x3664 000051d2: JUMP 000051d3: JUMPDEST 000051d4: PUSH1 0x66 000051d6: SLOAD 000051d7: PUSH2 0x3664 000051da: SWAP1 000051db: PUSH1 0x01 000051dd: PUSH1 0x01 000051df: PUSH1 0xa0 000051e1: SHL 000051e2: SUB 000051e3: AND 000051e4: DUP4 000051e5: DUP4 000051e6: PUSH2 0x5519 000051e9: JUMP 000051ea: JUMPDEST 000051eb: DUP1 000051ec: ISZERO 000051ed: DUP1 000051ee: PUSH2 0x5289 000051f1: JUMPI 000051f2: POP 000051f3: PUSH1 0x40 000051f5: DUP1 000051f6: MLOAD 000051f7: PUSH32 0xdd62ed3e00000000000000000000000000000000000000000000000000000000 00005218: DUP2 00005219: MSTORE 0000521a: ADDRESS 0000521b: PUSH1 0x04 0000521d: DUP3 0000521e: ADD 0000521f: MSTORE 00005220: PUSH1 0x01 00005222: PUSH1 0x01 00005224: PUSH1 0xa0 00005226: SHL 00005227: SUB 00005228: DUP5 00005229: DUP2 0000522a: AND 0000522b: PUSH1 0x24 0000522d: DUP4 0000522e: ADD 0000522f: MSTORE 00005230: SWAP2 00005231: MLOAD 00005232: SWAP2 00005233: DUP6 00005234: AND 00005235: SWAP2 00005236: PUSH4 0xdd62ed3e 0000523b: SWAP2 0000523c: PUSH1 0x44 0000523e: DUP1 0000523f: DUP3 00005240: ADD 00005241: SWAP3 00005242: PUSH1 0x20 00005244: SWAP3 00005245: SWAP1 00005246: SWAP2 00005247: SWAP1 00005248: DUP3 00005249: SWAP1 0000524a: SUB 0000524b: ADD 0000524c: DUP2 0000524d: DUP7 0000524e: DUP1 0000524f: EXTCODESIZE 00005250: ISZERO 00005251: DUP1 00005252: ISZERO 00005253: PUSH2 0x525b 00005256: JUMPI 00005257: PUSH1 0x00 00005259: DUP1 0000525a: REVERT 0000525b: JUMPDEST 0000525c: POP 0000525d: GAS 0000525e: STATICCALL 0000525f: ISZERO 00005260: DUP1 00005261: ISZERO 00005262: PUSH2 0x526f 00005265: JUMPI 00005266: RETURNDATASIZE 00005267: PUSH1 0x00 00005269: DUP1 0000526a: RETURNDATACOPY 0000526b: RETURNDATASIZE 0000526c: PUSH1 0x00 0000526e: REVERT 0000526f: JUMPDEST 00005270: POP 00005271: POP 00005272: POP 00005273: POP 00005274: PUSH1 0x40 00005276: MLOAD 00005277: RETURNDATASIZE 00005278: PUSH1 0x20 0000527a: DUP2 0000527b: LT 0000527c: ISZERO 0000527d: PUSH2 0x5285 00005280: JUMPI 00005281: PUSH1 0x00 00005283: DUP1 00005284: REVERT 00005285: JUMPDEST 00005286: POP 00005287: MLOAD 00005288: ISZERO 00005289: JUMPDEST 0000528a: PUSH2 0x52c4 0000528d: JUMPI 0000528e: PUSH1 0x40 00005290: MLOAD 00005291: PUSH3 0x461bcd 00005295: PUSH1 0xe5 00005297: SHL 00005298: DUP2 00005299: MSTORE 0000529a: PUSH1 0x04 0000529c: ADD 0000529d: DUP1 0000529e: DUP1 0000529f: PUSH1 0x20 000052a1: ADD 000052a2: DUP3 000052a3: DUP2 000052a4: SUB 000052a5: DUP3 000052a6: MSTORE 000052a7: PUSH1 0x36 000052a9: DUP2 000052aa: MSTORE 000052ab: PUSH1 0x20 000052ad: ADD 000052ae: DUP1 000052af: PUSH2 0x5bf9 000052b2: PUSH1 0x36 000052b4: SWAP2 000052b5: CODECOPY 000052b6: PUSH1 0x40 000052b8: ADD 000052b9: SWAP2 000052ba: POP 000052bb: POP 000052bc: PUSH1 0x40 000052be: MLOAD 000052bf: DUP1 000052c0: SWAP2 000052c1: SUB 000052c2: SWAP1 000052c3: REVERT 000052c4: JUMPDEST 000052c5: PUSH1 0x40 000052c7: DUP1 000052c8: MLOAD 000052c9: PUSH1 0x01 000052cb: PUSH1 0x01 000052cd: PUSH1 0xa0 000052cf: SHL 000052d0: SUB 000052d1: DUP5 000052d2: AND 000052d3: PUSH1 0x24 000052d5: DUP3 000052d6: ADD 000052d7: MSTORE 000052d8: PUSH1 0x44 000052da: DUP1 000052db: DUP3 000052dc: ADD 000052dd: DUP5 000052de: SWAP1 000052df: MSTORE 000052e0: DUP3 000052e1: MLOAD 000052e2: DUP1 000052e3: DUP4 000052e4: SUB 000052e5: SWAP1 000052e6: SWAP2 000052e7: ADD 000052e8: DUP2 000052e9: MSTORE 000052ea: PUSH1 0x64 000052ec: SWAP1 000052ed: SWAP2 000052ee: ADD 000052ef: SWAP1 000052f0: SWAP2 000052f1: MSTORE 000052f2: PUSH1 0x20 000052f4: DUP2 000052f5: ADD 000052f6: DUP1 000052f7: MLOAD 000052f8: PUSH1 0x01 000052fa: PUSH1 0x01 000052fc: PUSH1 0xe0 000052fe: SHL 000052ff: SUB 00005300: AND 00005301: PUSH32 0x095ea7b300000000000000000000000000000000000000000000000000000000 00005322: OR 00005323: SWAP1 00005324: MSTORE 00005325: PUSH2 0x2007 00005328: SWAP1 00005329: DUP5 0000532a: SWAP1 0000532b: PUSH2 0x5071 0000532e: JUMP 0000532f: JUMPDEST 00005330: PUSH3 0x461bcd 00005334: PUSH1 0xe5 00005336: SHL 00005337: PUSH1 0x00 00005339: SWAP1 0000533a: DUP2 0000533b: MSTORE 0000533c: PUSH1 0x20 0000533e: PUSH1 0x04 00005340: MSTORE 00005341: PUSH1 0x07 00005343: PUSH1 0x24 00005345: MSTORE 00005346: PUSH7 0x42414223000030 0000534e: PUSH1 0x0a 00005350: DUP1 00005351: DUP5 00005352: DIV 00005353: DUP2 00005354: DUP2 00005355: MOD 00005356: PUSH1 0x30 00005358: SWAP1 00005359: DUP2 0000535a: ADD 0000535b: PUSH1 0x08 0000535d: SHL 0000535e: SWAP6 0000535f: DUP4 00005360: SWAP1 00005361: MOD 00005362: SWAP6 00005363: SWAP1 00005364: SWAP6 00005365: ADD 00005366: SWAP1 00005367: DUP3 00005368: SWAP1 00005369: DIV 0000536a: SWAP2 0000536b: DUP3 0000536c: MOD 0000536d: SWAP1 0000536e: SWAP5 0000536f: ADD 00005370: PUSH1 0x10 00005372: SHL 00005373: SWAP4 00005374: SWAP1 00005375: SWAP4 00005376: ADD 00005377: ADD 00005378: PUSH1 0xc8 0000537a: SHL 0000537b: PUSH1 0x44 0000537d: MSTORE 0000537e: PUSH1 0x64 00005380: SWAP1 00005381: REVERT 00005382: JUMPDEST 00005383: PUSH8 0x0de0b6b3a7640000 0000538c: SWAP1 0000538d: JUMP 0000538e: JUMPDEST 0000538f: PUSH1 0x00 00005391: PUSH2 0x149e 00005394: PUSH1 0x66 00005396: PUSH1 0x00 00005398: SWAP1 00005399: SLOAD 0000539a: SWAP1 0000539b: PUSH2 0x0100 0000539e: EXP 0000539f: SWAP1 000053a0: DIV 000053a1: PUSH1 0x01 000053a3: PUSH1 0x01 000053a5: PUSH1 0xa0 000053a7: SHL 000053a8: SUB 000053a9: AND 000053aa: PUSH1 0x01 000053ac: PUSH1 0x01 000053ae: PUSH1 0xa0 000053b0: SHL 000053b1: SUB 000053b2: AND 000053b3: PUSH4 0x313ce567 000053b8: PUSH1 0x40 000053ba: MLOAD 000053bb: DUP2 000053bc: PUSH4 0xffffffff 000053c1: AND 000053c2: PUSH1 0xe0 000053c4: SHL 000053c5: DUP2 000053c6: MSTORE 000053c7: PUSH1 0x04 000053c9: ADD 000053ca: PUSH1 0x20 000053cc: PUSH1 0x40 000053ce: MLOAD 000053cf: DUP1 000053d0: DUP4 000053d1: SUB 000053d2: DUP2 000053d3: DUP7 000053d4: DUP1 000053d5: EXTCODESIZE 000053d6: ISZERO 000053d7: DUP1 000053d8: ISZERO 000053d9: PUSH2 0x53e1 000053dc: JUMPI 000053dd: PUSH1 0x00 000053df: DUP1 000053e0: REVERT 000053e1: JUMPDEST 000053e2: POP 000053e3: GAS 000053e4: STATICCALL 000053e5: ISZERO 000053e6: DUP1 000053e7: ISZERO 000053e8: PUSH2 0x53f5 000053eb: JUMPI 000053ec: RETURNDATASIZE 000053ed: PUSH1 0x00 000053ef: DUP1 000053f0: RETURNDATACOPY 000053f1: RETURNDATASIZE 000053f2: PUSH1 0x00 000053f4: REVERT 000053f5: JUMPDEST 000053f6: POP 000053f7: POP 000053f8: POP 000053f9: POP 000053fa: PUSH1 0x40 000053fc: MLOAD 000053fd: RETURNDATASIZE 000053fe: PUSH1 0x20 00005400: DUP2 00005401: LT 00005402: ISZERO 00005403: PUSH2 0x540b 00005406: JUMPI 00005407: PUSH1 0x00 00005409: DUP1 0000540a: REVERT 0000540b: JUMPDEST 0000540c: POP 0000540d: MLOAD 0000540e: PUSH1 0xff 00005410: AND 00005411: PUSH1 0x0a 00005413: EXP 00005414: PUSH2 0x4dd8 00005417: DUP6 00005418: DUP6 00005419: PUSH2 0x4548 0000541c: JUMP 0000541d: JUMPDEST 0000541e: PUSH1 0x01 00005420: PUSH1 0x01 00005422: PUSH1 0xa0 00005424: SHL 00005425: SUB 00005426: DUP3 00005427: AND 00005428: PUSH2 0x5462 0000542b: JUMPI 0000542c: PUSH1 0x40 0000542e: MLOAD 0000542f: PUSH3 0x461bcd 00005433: PUSH1 0xe5 00005435: SHL 00005436: DUP2 00005437: MSTORE 00005438: PUSH1 0x04 0000543a: ADD 0000543b: DUP1 0000543c: DUP1 0000543d: PUSH1 0x20 0000543f: ADD 00005440: DUP3 00005441: DUP2 00005442: SUB 00005443: DUP3 00005444: MSTORE 00005445: PUSH1 0x21 00005447: DUP2 00005448: MSTORE 00005449: PUSH1 0x20 0000544b: ADD 0000544c: DUP1 0000544d: PUSH2 0x5b3b 00005450: PUSH1 0x21 00005452: SWAP2 00005453: CODECOPY 00005454: PUSH1 0x40 00005456: ADD 00005457: SWAP2 00005458: POP 00005459: POP 0000545a: PUSH1 0x40 0000545c: MLOAD 0000545d: DUP1 0000545e: SWAP2 0000545f: SUB 00005460: SWAP1 00005461: REVERT 00005462: JUMPDEST 00005463: PUSH2 0x546e 00005466: DUP3 00005467: PUSH1 0x00 00005469: DUP4 0000546a: PUSH2 0x493d 0000546d: JUMP 0000546e: JUMPDEST 0000546f: PUSH2 0x54ab 00005472: DUP2 00005473: PUSH1 0x40 00005475: MLOAD 00005476: DUP1 00005477: PUSH1 0x60 00005479: ADD 0000547a: PUSH1 0x40 0000547c: MSTORE 0000547d: DUP1 0000547e: PUSH1 0x22 00005480: DUP2 00005481: MSTORE 00005482: PUSH1 0x20 00005484: ADD 00005485: PUSH2 0x5a05 00005488: PUSH1 0x22 0000548a: SWAP2 0000548b: CODECOPY 0000548c: PUSH1 0x01 0000548e: PUSH1 0x01 00005490: PUSH1 0xa0 00005492: SHL 00005493: SUB 00005494: DUP6 00005495: AND 00005496: PUSH1 0x00 00005498: SWAP1 00005499: DUP2 0000549a: MSTORE 0000549b: PUSH1 0x33 0000549d: PUSH1 0x20 0000549f: MSTORE 000054a0: PUSH1 0x40 000054a2: SWAP1 000054a3: KECCAK256 000054a4: SLOAD 000054a5: SWAP2 000054a6: SWAP1 000054a7: PUSH2 0x3527 000054aa: JUMP 000054ab: JUMPDEST 000054ac: PUSH1 0x01 000054ae: PUSH1 0x01 000054b0: PUSH1 0xa0 000054b2: SHL 000054b3: SUB 000054b4: DUP4 000054b5: AND 000054b6: PUSH1 0x00 000054b8: SWAP1 000054b9: DUP2 000054ba: MSTORE 000054bb: PUSH1 0x33 000054bd: PUSH1 0x20 000054bf: MSTORE 000054c0: PUSH1 0x40 000054c2: SWAP1 000054c3: KECCAK256 000054c4: SSTORE 000054c5: PUSH1 0x35 000054c7: SLOAD 000054c8: PUSH2 0x54d1 000054cb: SWAP1 000054cc: DUP3 000054cd: PUSH2 0x5787 000054d0: JUMP 000054d1: JUMPDEST 000054d2: PUSH1 0x35 000054d4: SSTORE 000054d5: PUSH1 0x40 000054d7: DUP1 000054d8: MLOAD 000054d9: DUP3 000054da: DUP2 000054db: MSTORE 000054dc: SWAP1 000054dd: MLOAD 000054de: PUSH1 0x00 000054e0: SWAP2 000054e1: PUSH1 0x01 000054e3: PUSH1 0x01 000054e5: PUSH1 0xa0 000054e7: SHL 000054e8: SUB 000054e9: DUP6 000054ea: AND 000054eb: SWAP2 000054ec: PUSH32 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef 0000550d: SWAP2 0000550e: DUP2 0000550f: SWAP1 00005510: SUB 00005511: PUSH1 0x20 00005513: ADD 00005514: SWAP1 00005515: LOG3 00005516: POP 00005517: POP 00005518: JUMP 00005519: JUMPDEST 0000551a: PUSH1 0x40 0000551c: DUP1 0000551d: MLOAD 0000551e: PUSH1 0x01 00005520: PUSH1 0x01 00005522: PUSH1 0xa0 00005524: SHL 00005525: SUB 00005526: DUP5 00005527: AND 00005528: PUSH1 0x24 0000552a: DUP3 0000552b: ADD 0000552c: MSTORE 0000552d: PUSH1 0x44 0000552f: DUP1 00005530: DUP3 00005531: ADD 00005532: DUP5 00005533: SWAP1 00005534: MSTORE 00005535: DUP3 00005536: MLOAD 00005537: DUP1 00005538: DUP4 00005539: SUB 0000553a: SWAP1 0000553b: SWAP2 0000553c: ADD 0000553d: DUP2 0000553e: MSTORE 0000553f: PUSH1 0x64 00005541: SWAP1 00005542: SWAP2 00005543: ADD 00005544: SWAP1 00005545: SWAP2 00005546: MSTORE 00005547: PUSH1 0x20 00005549: DUP2 0000554a: ADD 0000554b: DUP1 0000554c: MLOAD 0000554d: PUSH1 0x01 0000554f: PUSH1 0x01 00005551: PUSH1 0xe0 00005553: SHL 00005554: SUB 00005555: AND 00005556: PUSH32 0xa9059cbb00000000000000000000000000000000000000000000000000000000 00005577: OR 00005578: SWAP1 00005579: MSTORE 0000557a: PUSH2 0x2007 0000557d: SWAP1 0000557e: DUP5 0000557f: SWAP1 00005580: PUSH2 0x5071 00005583: JUMP 00005584: JUMPDEST 00005585: PUSH1 0x01 00005587: PUSH1 0x01 00005589: PUSH1 0xa0 0000558b: SHL 0000558c: SUB 0000558d: DUP6 0000558e: AND 0000558f: PUSH1 0x00 00005591: SWAP1 00005592: DUP2 00005593: MSTORE 00005594: PUSH1 0x71 00005596: PUSH1 0x20 00005598: MSTORE 00005599: PUSH1 0x40 0000559b: SWAP1 0000559c: KECCAK256 0000559d: DUP3 0000559e: PUSH2 0x55e9 000055a1: JUMPI 000055a2: PUSH1 0x00 000055a4: DUP1 000055a5: DUP3 000055a6: SSTORE 000055a7: PUSH1 0x01 000055a9: DUP1 000055aa: DUP4 000055ab: ADD 000055ac: DUP3 000055ad: SWAP1 000055ae: SSTORE 000055af: PUSH1 0x05 000055b1: DUP4 000055b2: ADD 000055b3: DUP3 000055b4: SWAP1 000055b5: SSTORE 000055b6: PUSH1 0x06 000055b8: DUP4 000055b9: ADD 000055ba: DUP3 000055bb: SWAP1 000055bc: SSTORE 000055bd: PUSH1 0x01 000055bf: PUSH1 0x01 000055c1: PUSH1 0xa0 000055c3: SHL 000055c4: SUB 000055c5: DUP9 000055c6: AND 000055c7: DUP3 000055c8: MSTORE 000055c9: PUSH1 0x93 000055cb: PUSH1 0x20 000055cd: MSTORE 000055ce: PUSH1 0x40 000055d0: DUP3 000055d1: KECCAK256 000055d2: SWAP2 000055d3: SWAP1 000055d4: SWAP2 000055d5: SSTORE 000055d6: PUSH1 0x72 000055d8: SLOAD 000055d9: PUSH2 0x55e1 000055dc: SWAP2 000055dd: PUSH2 0x3796 000055e0: JUMP 000055e1: JUMPDEST 000055e2: PUSH1 0x72 000055e4: SSTORE 000055e5: PUSH2 0x55fe 000055e8: JUMP 000055e9: JUMPDEST 000055ea: PUSH1 0x05 000055ec: DUP2 000055ed: ADD 000055ee: SLOAD 000055ef: PUSH2 0x55f8 000055f2: SWAP1 000055f3: DUP7 000055f4: PUSH2 0x4096 000055f7: JUMP 000055f8: JUMPDEST 000055f9: PUSH1 0x05 000055fb: DUP3 000055fc: ADD 000055fd: SSTORE 000055fe: JUMPDEST 000055ff: PUSH1 0x68 00005601: SLOAD 00005602: PUSH1 0x40 00005604: DUP1 00005605: MLOAD 00005606: PUSH4 0xdf8a4e45 0000560b: PUSH1 0xe0 0000560d: SHL 0000560e: DUP2 0000560f: MSTORE 00005610: ADDRESS 00005611: PUSH1 0x04 00005613: DUP3 00005614: ADD 00005615: MSTORE 00005616: PUSH1 0x01 00005618: PUSH1 0x01 0000561a: PUSH1 0xa0 0000561c: SHL 0000561d: SUB 0000561e: DUP10 0000561f: DUP2 00005620: AND 00005621: PUSH1 0x24 00005623: DUP4 00005624: ADD 00005625: MSTORE 00005626: PUSH1 0x44 00005628: DUP3 00005629: ADD 0000562a: DUP9 0000562b: SWAP1 0000562c: MSTORE 0000562d: PUSH1 0x64 0000562f: DUP3 00005630: ADD 00005631: DUP7 00005632: SWAP1 00005633: MSTORE 00005634: PUSH1 0x00 00005636: PUSH1 0x84 00005638: DUP4 00005639: ADD 0000563a: DUP2 0000563b: SWAP1 0000563c: MSTORE 0000563d: SWAP3 0000563e: MLOAD 0000563f: SWAP4 00005640: AND 00005641: SWAP3 00005642: PUSH4 0xdf8a4e45 00005647: SWAP3 00005648: PUSH1 0xa4 0000564a: DUP1 0000564b: DUP5 0000564c: ADD 0000564d: SWAP4 0000564e: SWAP2 0000564f: SWAP3 00005650: SWAP2 00005651: DUP3 00005652: SWAP1 00005653: SUB 00005654: ADD 00005655: DUP2 00005656: DUP4 00005657: DUP8 00005658: DUP1 00005659: EXTCODESIZE 0000565a: ISZERO 0000565b: DUP1 0000565c: ISZERO 0000565d: PUSH2 0x5665 00005660: JUMPI 00005661: PUSH1 0x00 00005663: DUP1 00005664: REVERT 00005665: JUMPDEST 00005666: POP 00005667: GAS 00005668: CALL 00005669: ISZERO 0000566a: DUP1 0000566b: ISZERO 0000566c: PUSH2 0x5679 0000566f: JUMPI 00005670: RETURNDATASIZE 00005671: PUSH1 0x00 00005673: DUP1 00005674: RETURNDATACOPY 00005675: RETURNDATASIZE 00005676: PUSH1 0x00 00005678: REVERT 00005679: JUMPDEST 0000567a: POP 0000567b: POP 0000567c: POP 0000567d: POP 0000567e: POP 0000567f: POP 00005680: POP 00005681: POP 00005682: POP 00005683: POP 00005684: JUMP 00005685: JUMPDEST 00005686: EXTCODESIZE 00005687: ISZERO 00005688: ISZERO 00005689: SWAP1 0000568a: JUMP 0000568b: JUMPDEST 0000568c: PUSH1 0x60 0000568e: PUSH2 0x569a 00005691: DUP5 00005692: DUP5 00005693: PUSH1 0x00 00005695: DUP6 00005696: PUSH2 0x57e4 00005699: JUMP 0000569a: JUMPDEST 0000569b: SWAP5 0000569c: SWAP4 0000569d: POP 0000569e: POP 0000569f: POP 000056a0: POP 000056a1: JUMP 000056a2: JUMPDEST 000056a3: DUP1 000056a4: SELFBALANCE 000056a5: LT 000056a6: ISZERO 000056a7: PUSH2 0x56f7 000056aa: JUMPI 000056ab: PUSH1 0x40 000056ad: DUP1 000056ae: MLOAD 000056af: PUSH3 0x461bcd 000056b3: PUSH1 0xe5 000056b5: SHL 000056b6: DUP2 000056b7: MSTORE 000056b8: PUSH1 0x20 000056ba: PUSH1 0x04 000056bc: DUP3 000056bd: ADD 000056be: MSTORE 000056bf: PUSH1 0x1d 000056c1: PUSH1 0x24 000056c3: DUP3 000056c4: ADD 000056c5: MSTORE 000056c6: PUSH32 0x416464726573733a20696e73756666696369656e742062616c616e6365000000 000056e7: PUSH1 0x44 000056e9: DUP3 000056ea: ADD 000056eb: MSTORE 000056ec: SWAP1 000056ed: MLOAD 000056ee: SWAP1 000056ef: DUP2 000056f0: SWAP1 000056f1: SUB 000056f2: PUSH1 0x64 000056f4: ADD 000056f5: SWAP1 000056f6: REVERT 000056f7: JUMPDEST 000056f8: PUSH1 0x40 000056fa: MLOAD 000056fb: PUSH1 0x00 000056fd: SWAP1 000056fe: PUSH1 0x01 00005700: PUSH1 0x01 00005702: PUSH1 0xa0 00005704: SHL 00005705: SUB 00005706: DUP5 00005707: AND 00005708: SWAP1 00005709: DUP4 0000570a: SWAP1 0000570b: DUP4 0000570c: DUP2 0000570d: DUP2 0000570e: DUP2 0000570f: DUP6 00005710: DUP8 00005711: GAS 00005712: CALL 00005713: SWAP3 00005714: POP 00005715: POP 00005716: POP 00005717: RETURNDATASIZE 00005718: DUP1 00005719: PUSH1 0x00 0000571b: DUP2 0000571c: EQ 0000571d: PUSH2 0x5742 00005720: JUMPI 00005721: PUSH1 0x40 00005723: MLOAD 00005724: SWAP2 00005725: POP 00005726: PUSH1 0x1f 00005728: NOT 00005729: PUSH1 0x3f 0000572b: RETURNDATASIZE 0000572c: ADD 0000572d: AND 0000572e: DUP3 0000572f: ADD 00005730: PUSH1 0x40 00005732: MSTORE 00005733: RETURNDATASIZE 00005734: DUP3 00005735: MSTORE 00005736: RETURNDATASIZE 00005737: PUSH1 0x00 00005739: PUSH1 0x20 0000573b: DUP5 0000573c: ADD 0000573d: RETURNDATACOPY 0000573e: PUSH2 0x5747 00005741: JUMP 00005742: JUMPDEST 00005743: PUSH1 0x60 00005745: SWAP2 00005746: POP 00005747: JUMPDEST 00005748: POP 00005749: POP 0000574a: SWAP1 0000574b: POP 0000574c: DUP1 0000574d: PUSH2 0x2007 00005750: JUMPI 00005751: PUSH1 0x40 00005753: MLOAD 00005754: PUSH3 0x461bcd 00005758: PUSH1 0xe5 0000575a: SHL 0000575b: DUP2 0000575c: MSTORE 0000575d: PUSH1 0x04 0000575f: ADD 00005760: DUP1 00005761: DUP1 00005762: PUSH1 0x20 00005764: ADD 00005765: DUP3 00005766: DUP2 00005767: SUB 00005768: DUP3 00005769: MSTORE 0000576a: PUSH1 0x3a 0000576c: DUP2 0000576d: MSTORE 0000576e: PUSH1 0x20 00005770: ADD 00005771: DUP1 00005772: PUSH2 0x5a6f 00005775: PUSH1 0x3a 00005777: SWAP2 00005778: CODECOPY 00005779: PUSH1 0x40 0000577b: ADD 0000577c: SWAP2 0000577d: POP 0000577e: POP 0000577f: PUSH1 0x40 00005781: MLOAD 00005782: DUP1 00005783: SWAP2 00005784: SUB 00005785: SWAP1 00005786: REVERT 00005787: JUMPDEST 00005788: PUSH1 0x00 0000578a: DUP3 0000578b: DUP3 0000578c: GT 0000578d: ISZERO 0000578e: PUSH2 0x57de 00005791: JUMPI 00005792: PUSH1 0x40 00005794: DUP1 00005795: MLOAD 00005796: PUSH3 0x461bcd 0000579a: PUSH1 0xe5 0000579c: SHL 0000579d: DUP2 0000579e: MSTORE 0000579f: PUSH1 0x20 000057a1: PUSH1 0x04 000057a3: DUP3 000057a4: ADD 000057a5: MSTORE 000057a6: PUSH1 0x1e 000057a8: PUSH1 0x24 000057aa: DUP3 000057ab: ADD 000057ac: MSTORE 000057ad: PUSH32 0x536166654d6174683a207375627472616374696f6e206f766572666c6f770000 000057ce: PUSH1 0x44 000057d0: DUP3 000057d1: ADD 000057d2: MSTORE 000057d3: SWAP1 000057d4: MLOAD 000057d5: SWAP1 000057d6: DUP2 000057d7: SWAP1 000057d8: SUB 000057d9: PUSH1 0x64 000057db: ADD 000057dc: SWAP1 000057dd: REVERT 000057de: JUMPDEST 000057df: POP 000057e0: SWAP1 000057e1: SUB 000057e2: SWAP1 000057e3: JUMP 000057e4: JUMPDEST 000057e5: PUSH1 0x60 000057e7: DUP3 000057e8: SELFBALANCE 000057e9: LT 000057ea: ISZERO 000057eb: PUSH2 0x5825 000057ee: JUMPI 000057ef: PUSH1 0x40 000057f1: MLOAD 000057f2: PUSH3 0x461bcd 000057f6: PUSH1 0xe5 000057f8: SHL 000057f9: DUP2 000057fa: MSTORE 000057fb: PUSH1 0x04 000057fd: ADD 000057fe: DUP1 000057ff: DUP1 00005800: PUSH1 0x20 00005802: ADD 00005803: DUP3 00005804: DUP2 00005805: SUB 00005806: DUP3 00005807: MSTORE 00005808: PUSH1 0x26 0000580a: DUP2 0000580b: MSTORE 0000580c: PUSH1 0x20 0000580e: ADD 0000580f: DUP1 00005810: PUSH2 0x5acb 00005813: PUSH1 0x26 00005815: SWAP2 00005816: CODECOPY 00005817: PUSH1 0x40 00005819: ADD 0000581a: SWAP2 0000581b: POP 0000581c: POP 0000581d: PUSH1 0x40 0000581f: MLOAD 00005820: DUP1 00005821: SWAP2 00005822: SUB 00005823: SWAP1 00005824: REVERT 00005825: JUMPDEST 00005826: PUSH2 0x582e 00005829: DUP6 0000582a: PUSH2 0x5685 0000582d: JUMP 0000582e: JUMPDEST 0000582f: PUSH2 0x587f 00005832: JUMPI 00005833: PUSH1 0x40 00005835: DUP1 00005836: MLOAD 00005837: PUSH3 0x461bcd 0000583b: PUSH1 0xe5 0000583d: SHL 0000583e: DUP2 0000583f: MSTORE 00005840: PUSH1 0x20 00005842: PUSH1 0x04 00005844: DUP3 00005845: ADD 00005846: MSTORE 00005847: PUSH1 0x1d 00005849: PUSH1 0x24 0000584b: DUP3 0000584c: ADD 0000584d: MSTORE 0000584e: PUSH32 0x416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000 0000586f: PUSH1 0x44 00005871: DUP3 00005872: ADD 00005873: MSTORE 00005874: SWAP1 00005875: MLOAD 00005876: SWAP1 00005877: DUP2 00005878: SWAP1 00005879: SUB 0000587a: PUSH1 0x64 0000587c: ADD 0000587d: SWAP1 0000587e: REVERT 0000587f: JUMPDEST 00005880: PUSH1 0x00 00005882: DUP1 00005883: DUP7 00005884: PUSH1 0x01 00005886: PUSH1 0x01 00005888: PUSH1 0xa0 0000588a: SHL 0000588b: SUB 0000588c: AND 0000588d: DUP6 0000588e: DUP8 0000588f: PUSH1 0x40 00005891: MLOAD 00005892: DUP1 00005893: DUP3 00005894: DUP1 00005895: MLOAD 00005896: SWAP1 00005897: PUSH1 0x20 00005899: ADD 0000589a: SWAP1 0000589b: DUP1 0000589c: DUP4 0000589d: DUP4 0000589e: JUMPDEST 0000589f: PUSH1 0x20 000058a1: DUP4 000058a2: LT 000058a3: PUSH2 0x58bd 000058a6: JUMPI 000058a7: DUP1 000058a8: MLOAD 000058a9: DUP3 000058aa: MSTORE 000058ab: PUSH1 0x1f 000058ad: NOT 000058ae: SWAP1 000058af: SWAP3 000058b0: ADD 000058b1: SWAP2 000058b2: PUSH1 0x20 000058b4: SWAP2 000058b5: DUP3 000058b6: ADD 000058b7: SWAP2 000058b8: ADD 000058b9: PUSH2 0x589e 000058bc: JUMP 000058bd: JUMPDEST 000058be: PUSH1 0x01 000058c0: DUP4 000058c1: PUSH1 0x20 000058c3: SUB 000058c4: PUSH2 0x0100 000058c7: EXP 000058c8: SUB 000058c9: DUP1 000058ca: NOT 000058cb: DUP3 000058cc: MLOAD 000058cd: AND 000058ce: DUP2 000058cf: DUP5 000058d0: MLOAD 000058d1: AND 000058d2: DUP1 000058d3: DUP3 000058d4: OR 000058d5: DUP6 000058d6: MSTORE 000058d7: POP 000058d8: POP 000058d9: POP 000058da: POP 000058db: POP 000058dc: POP 000058dd: SWAP1 000058de: POP 000058df: ADD 000058e0: SWAP2 000058e1: POP 000058e2: POP 000058e3: PUSH1 0x00 000058e5: PUSH1 0x40 000058e7: MLOAD 000058e8: DUP1 000058e9: DUP4 000058ea: SUB 000058eb: DUP2 000058ec: DUP6 000058ed: DUP8 000058ee: GAS 000058ef: CALL 000058f0: SWAP3 000058f1: POP 000058f2: POP 000058f3: POP 000058f4: RETURNDATASIZE 000058f5: DUP1 000058f6: PUSH1 0x00 000058f8: DUP2 000058f9: EQ 000058fa: PUSH2 0x591f 000058fd: JUMPI 000058fe: PUSH1 0x40 00005900: MLOAD 00005901: SWAP2 00005902: POP 00005903: PUSH1 0x1f 00005905: NOT 00005906: PUSH1 0x3f 00005908: RETURNDATASIZE 00005909: ADD 0000590a: AND 0000590b: DUP3 0000590c: ADD 0000590d: PUSH1 0x40 0000590f: MSTORE 00005910: RETURNDATASIZE 00005911: DUP3 00005912: MSTORE 00005913: RETURNDATASIZE 00005914: PUSH1 0x00 00005916: PUSH1 0x20 00005918: DUP5 00005919: ADD 0000591a: RETURNDATACOPY 0000591b: PUSH2 0x5924 0000591e: JUMP 0000591f: JUMPDEST 00005920: PUSH1 0x60 00005922: SWAP2 00005923: POP 00005924: JUMPDEST 00005925: POP 00005926: SWAP2 00005927: POP 00005928: SWAP2 00005929: POP 0000592a: PUSH2 0x5934 0000592d: DUP3 0000592e: DUP3 0000592f: DUP7 00005930: PUSH2 0x593f 00005933: JUMP 00005934: JUMPDEST 00005935: SWAP8 00005936: SWAP7 00005937: POP 00005938: POP 00005939: POP 0000593a: POP 0000593b: POP 0000593c: POP 0000593d: POP 0000593e: JUMP 0000593f: JUMPDEST 00005940: PUSH1 0x60 00005942: DUP4 00005943: ISZERO 00005944: PUSH2 0x594e 00005947: JUMPI 00005948: POP 00005949: DUP2 0000594a: PUSH2 0x149e 0000594d: JUMP 0000594e: JUMPDEST 0000594f: DUP3 00005950: MLOAD 00005951: ISZERO 00005952: PUSH2 0x595e 00005955: JUMPI 00005956: DUP3 00005957: MLOAD 00005958: DUP1 00005959: DUP5 0000595a: PUSH1 0x20 0000595c: ADD 0000595d: REVERT 0000595e: JUMPDEST 0000595f: PUSH1 0x40 00005961: MLOAD 00005962: PUSH3 0x461bcd 00005966: PUSH1 0xe5 00005968: SHL 00005969: DUP2 0000596a: MSTORE 0000596b: PUSH1 0x20 0000596d: PUSH1 0x04 0000596f: DUP3 00005970: ADD 00005971: DUP2 00005972: DUP2 00005973: MSTORE 00005974: DUP5 00005975: MLOAD 00005976: PUSH1 0x24 00005978: DUP5 00005979: ADD 0000597a: MSTORE 0000597b: DUP5 0000597c: MLOAD 0000597d: DUP6 0000597e: SWAP4 0000597f: SWAP2 00005980: SWAP3 00005981: DUP4 00005982: SWAP3 00005983: PUSH1 0x44 00005985: ADD 00005986: SWAP2 00005987: SWAP1 00005988: DUP6 00005989: ADD 0000598a: SWAP1 0000598b: DUP1 0000598c: DUP4 0000598d: DUP4 0000598e: PUSH1 0x00 00005990: DUP4 00005991: ISZERO 00005992: PUSH2 0x357b 00005995: JUMPI 00005996: DUP2 00005997: DUP2 00005998: ADD 00005999: MLOAD 0000599a: DUP4 0000599b: DUP3 0000599c: ADD 0000599d: MSTORE 0000599e: PUSH1 0x20 000059a0: ADD 000059a1: PUSH2 0x3563 000059a4: JUMP 000059a5: JUMPDEST 000059a6: PUSH1 0x00 000059a8: PUSH1 0x20 000059aa: DUP3 000059ab: DUP5 000059ac: SUB 000059ad: SLT 000059ae: ISZERO 000059af: PUSH2 0x59b6 000059b2: JUMPI 000059b3: DUP1 000059b4: DUP2 000059b5: REVERT 000059b6: JUMPDEST 000059b7: DUP2 000059b8: MLOAD 000059b9: PUSH1 0x01 000059bb: PUSH1 0x01 000059bd: PUSH1 0xa0 000059bf: SHL 000059c0: SUB 000059c1: DUP2 000059c2: AND 000059c3: DUP2 000059c4: EQ 000059c5: PUSH2 0x149e 000059c8: JUMPI 000059c9: DUP2 000059ca: DUP3 000059cb: REVERT 000059cc: JUMPDEST 000059cd: PUSH1 0x01 000059cf: PUSH1 0x01 000059d1: PUSH1 0xe0 000059d3: SHL 000059d4: SUB 000059d5: NOT 000059d6: SWAP2 000059d7: SWAP1 000059d8: SWAP2 000059d9: AND 000059da: DUP2 000059db: MSTORE 000059dc: PUSH1 0x20 000059de: ADD 000059df: SWAP1 000059e0: JUMP 000059e1: INVALID 000059e2: GASLIMIT 000059e3: MSTORE 000059e4: NUMBER 000059e5: ORIGIN 000059e6: ADDRESS 000059e7: GASPRICE 000059e8: KECCAK256 000059e9: PUSH21 0x72616e7366657220746f20746865207a65726f2061 000059ff: PUSH5 0x6472657373 00005a05: GASLIMIT 00005a06: MSTORE 00005a07: NUMBER 00005a08: ORIGIN 00005a09: ADDRESS 00005a0a: GASPRICE 00005a0b: KECCAK256 00005a0c: PUSH3 0x75726e 00005a10: KECCAK256 00005a11: PUSH2 0x6d6f 00005a14: PUSH22 0x6e7420657863656564732062616c616e636545524332 00005a2b: ADDRESS 00005a2c: GASPRICE 00005a2d: KECCAK256 00005a2e: PUSH2 0x7070 00005a31: PUSH19 0x6f766520746f20746865207a65726f20616464 00005a45: PUSH19 0x65737345524332303a207472616e7366657220 00005a59: PUSH2 0x6d6f 00005a5c: PUSH22 0x6e7420657863656564732062616c616e636541646472 00005a73: PUSH6 0x73733a20756e 00005a7a: PUSH2 0x626c 00005a7d: PUSH6 0x20746f207365 00005a84: PUSH15 0x642076616c75652c20726563697069 00005a94: PUSH6 0x6e74206d6179 00005a9b: KECCAK256 00005a9c: PUSH9 0x617665207265766572 00005aa6: PUSH21 0x656445434453413a20696e76616c6964207369676e 00005abc: PUSH2 0x7475 00005abf: PUSH19 0x65202773272076616c7565416464726573733a 00005ad3: KECCAK256 00005ad4: PUSH10 0x6e73756666696369656e 00005adf: PUSH21 0x2062616c616e636520666f722063616c6c45434453 00005af5: COINBASE 00005af6: GASPRICE 00005af7: KECCAK256 00005af8: PUSH10 0x6e76616c696420736967 00005b03: PUSH15 0x6174757265202776272076616c7565 00005b13: GASLIMIT 00005b14: MSTORE 00005b15: NUMBER 00005b16: ORIGIN 00005b17: ADDRESS 00005b18: GASPRICE 00005b19: KECCAK256 00005b1a: PUSH21 0x72616e7366657220616d6f756e7420657863656564 00005b30: PUSH20 0x20616c6c6f77616e636545524332303a20627572 00005b45: PUSH15 0x2066726f6d20746865207a65726f20 00005b55: PUSH2 0x6464 00005b58: PUSH19 0x6573734f6e6c7920676f7665726e616e636520 00005b6c: PUSH16 0x7220656d657267656e63792063616e20 00005b7d: PUSH4 0x616c6c20 00005b82: PUSH21 0x68697345524332303a207472616e73666572206672 00005b98: PUSH16 0x6d20746865207a65726f206164647265 00005ba9: PUSH20 0x7345524332303a20617070726f76652066726f6d 00005bbe: KECCAK256 00005bbf: PUSH21 0x6865207a65726f2061646472657373536166654552 00005bd5: NUMBER 00005bd6: ORIGIN 00005bd7: ADDRESS 00005bd8: GASPRICE 00005bd9: KECCAK256 00005bda: GASLIMIT 00005bdb: MSTORE 00005bdc: NUMBER 00005bdd: ORIGIN 00005bde: ADDRESS 00005bdf: KECCAK256 00005be0: PUSH16 0x7065726174696f6e20646964206e6f74 00005bf1: KECCAK256 00005bf2: PUSH20 0x7563636565645361666545524332303a20617070 00005c07: PUSH19 0x6f76652066726f6d206e6f6e2d7a65726f2074 00005c1b: PUSH16 0x206e6f6e2d7a65726f20616c6c6f7761 00005c2c: PUSH15 0x636545524332303a20646563726561 00005c3c: PUSH20 0x656420616c6c6f77616e63652062656c6f77207a 00005c51: PUSH6 0x726fa2646970 00005c58: PUSH7 0x73582212202700 00005c60: UNKNOWN(0xC7) 00005c61: UNKNOWN(0xEB) 00005c62: UNKNOWN(0xAB) 00005c63: DELEGATECALL 00005c64: UNKNOWN(0x22) 00005c65: SWAP6 00005c66: SHR 00005c67: UNKNOWN(0xE4) 00005c68: UNKNOWN(0xE3) 00005c69: SAR 00005c6a: MLOAD 00005c6b: SWAP6 00005c6c: DUP10 00005c6d: UNKNOWN(0xD9) 00005c6e: UNKNOWN(0xB9) 00005c6f: UNKNOWN(0xEA) 00005c70: PUSH24 0x36e4ddefbcb3ac3fcee969aec964736f6c63430007060033
| Severity | Category | Tool | Title | Confidence | Validated | Confirmed | Details |
|---|---|---|---|---|---|---|---|
| high | auth | detector | Authorization based on tx.origin | 70 | no | — |
viewvalidation_json{
"reason": "missing sink mapping",
"status": "no_sink"
}
witness_json{
"notes": "heuristic witness; entrypoints are best-effort selectors with zeroed calldata",
"constraints": [],
"entrypoints": [
{
"calldata": "0xdd62ed3e",
"selector": "0xdd62ed3e",
"calldata_variants": [
"0xdd62ed3e",
"0xdd62ed3e0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xf251fc8c",
"selector": "0xf251fc8c",
"calldata_variants": [
"0xf251fc8c",
"0xf251fc8c0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xf77c4791",
"selector": "0xf77c4791",
"calldata_variants": [
"0xf77c4791",
"0xf77c47910000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xf85cb5c8",
"selector": "0xf85cb5c8",
"calldata_variants": [
"0xf85cb5c8",
"0xf85cb5c80000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xcb12233b",
"selector": "0xcb12233b",
"calldata_variants": [
"0xcb12233b",
"0xcb12233b0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xd360386c",
"selector": "0xd360386c",
"calldata_variants": [
"0xd360386c",
"0xd360386c0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xd6888eab",
"selector": "0xd6888eab",
"calldata_variants": [
"0xd6888eab",
"0xd6888eab0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xdaeffcca",
"selector": "0xdaeffcca",
"calldata_variants": [
"0xdaeffcca",
"0xdaeffcca0000000000000000000000000000000000000000000000000000000000000000"
]
}
]
}
evidence_json{
"guards_detected": [
{
"pc": 23013,
"type": "tx_origin_used"
},
{
"pc": 23048,
"type": "tx_origin_used"
},
{
"pc": 23318,
"type": "tx_origin_used"
},
{
"pc": 23510,
"type": "tx_origin_used"
},
{
"pc": 23517,
"type": "tx_origin_used"
}
]
}
|
| high | auth | codex | `claimAndStakeRewardsBySig` signatures are replayable across different gardens | 85 | no | — |
viewevidence_json{
"evidence": "The signed type for staking rewards does not include a source garden field, and `claimAndStakeRewardsBySig` hashes `address(heartGarden)` instead of `address(this)`. Verification then checks only the contributor nonce of whichever garden executes the call, so the same signature is valid in any garden where that nonce matches.",
"locations": [
"contracts/gardens/Garden.sol:107",
"contracts/gardens/Garden.sol:576",
"contracts/gardens/Garden.sol:590",
"contracts/gardens/Garden.sol:605"
],
"recommendation": "Bind the source garden into the signed payload and verification path. `claimAndStakeRewardsBySig` should hash `address(this)` (and ideally `chainid`) in addition to the Heart-garden context, or use separate signatures for source-garden reward claims and Heart staking.",
"exploit_scenario": "A contributor who is in multiple gardens signs a stake-and-claim message for Garden A. A malicious keeper instead submits that same signature to Garden B where the contributor's garden nonce matches. Garden B accepts it because the signed hash is bound to `heartGarden` rather than `address(this)`, then `_sendRewardsInternal` pays out Garden B's reserve-asset rewards and BABL allocation. The attacker can choose whichever matching garden has the largest rewards set aside, draining funds from an unintended garden with a signature that was never scoped to it."
}
|
| high | oracle | codex | Keeper-controlled pricePerShare can be stair-stepped away from real NAV and used to overmint/overwithdraw | 85 | no | — |
viewevidence_json{
"evidence": "`depositBySig`, `withdrawBySig`, and `stakeBySig` all accept an external `_pricePerShare`. `_checkLastPricePerShare` only bounds the new price against `lastPricePerShare` plus a decay-based slippage window, then overwrites the stored reference unconditionally; it never compares against the garden's actual current valuation.",
"locations": [
"contracts/gardens/Garden.sol:315",
"contracts/gardens/Garden.sol:427",
"contracts/gardens/Garden.sol:655",
"contracts/gardens/Garden.sol:1232"
],
"recommendation": "Do not trust keeper-supplied share prices. Recompute price per share on-chain for by-signature flows, or at minimum validate the supplied value against the current on-chain valuation within a tight per-transaction tolerance. Do not let historical user-supplied prices become the sole anchor for future pricing.",
"exploit_scenario": "A malicious keeper collaborates with an attacker contributor and submits a series of tiny `depositBySig` calls that each move `_pricePerShare` by the allowed 25% band. Because the contract only compares the new value to the last recorded value, the keeper can walk `lastPricePerShare` far below real NAV. The attacker then makes a large by-signature deposit at the fake low price, receives far too many garden shares, and later exits against the garden's real valuation, diluting and stealing reserve assets from existing contributors. The same weak check also affects by-signature withdrawals and Heart staking."
}
|
| high | upgradeability | detector | Untrusted DELEGATECALL target reachable | 55 | no | no |
viewtrace_id: 0xa0b1a964dc8797e60ce6bcfb7bf8a8a8b69b1a5506a0d60c6990e9fde83eb866
validation_json{
"sink": "DELEGATECALL",
"errors": 0,
"status": "unknown",
"attempts": 192,
"trace_id": "0xa0b1a964dc8797e60ce6bcfb7bf8a8a8b69b1a5506a0d60c6990e9fde83eb866",
"confirmed": false,
"trace_mode": "callTracer",
"call_targets": null,
"matched_probe": null,
"target_varies": null,
"classification": "no_sink"
}
witness_json{
"notes": "heuristic witness; entrypoints are best-effort selectors with zeroed calldata",
"constraints": [],
"entrypoints": [
{
"calldata": "0xdd62ed3e",
"selector": "0xdd62ed3e",
"calldata_variants": [
"0xdd62ed3e",
"0xdd62ed3e0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xf251fc8c",
"selector": "0xf251fc8c",
"calldata_variants": [
"0xf251fc8c",
"0xf251fc8c0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xf77c4791",
"selector": "0xf77c4791",
"calldata_variants": [
"0xf77c4791",
"0xf77c47910000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xf85cb5c8",
"selector": "0xf85cb5c8",
"calldata_variants": [
"0xf85cb5c8",
"0xf85cb5c80000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xcb12233b",
"selector": "0xcb12233b",
"calldata_variants": [
"0xcb12233b",
"0xcb12233b0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xd360386c",
"selector": "0xd360386c",
"calldata_variants": [
"0xd360386c",
"0xd360386c0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xd6888eab",
"selector": "0xd6888eab",
"calldata_variants": [
"0xd6888eab",
"0xd6888eab0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xdaeffcca",
"selector": "0xdaeffcca",
"calldata_variants": [
"0xdaeffcca",
"0xdaeffcca0000000000000000000000000000000000000000000000000000000000000000"
]
}
]
}
evidence_json{
"examples": [
{
"pc": 12868,
"opcode": "DELEGATECALL",
"returndata_checked": null,
"value_expression_category": "n/a",
"target_expression_category": "computed"
}
],
"guards_detected": [
{
"pc": 23013,
"type": "tx_origin_used"
},
{
"pc": 23048,
"type": "tx_origin_used"
},
{
"pc": 23318,
"type": "tx_origin_used"
},
{
"pc": 23510,
"type": "tx_origin_used"
},
{
"pc": 23517,
"type": "tx_origin_used"
}
],
"delegatecall_count": 2,
"untrusted_delegatecall_count": 1
}
|
| medium | access_control | codex | First `setTimeLockRegistry` call is permissionless, enabling vesting-registry takeover | 75 | no | — |
viewevidence_json{
"evidence": "`onlyTimeLockOwner` performs no authorization when `timeLockRegistry` is still zero. `setTimeLockRegistry` uses that modifier directly, so the initial registry assignment is unrestricted.",
"locations": [
"contracts/token/TimeLockedToken.sol:69",
"contracts/token/TimeLockedToken.sol:155",
"contracts/token/TimeLockedToken.sol:161"
],
"recommendation": "Make the registry immutable at deployment, or gate the first assignment with `onlyOwner`/a one-time initializer. Do not allow the zero-state registry check to bypass access control.",
"exploit_scenario": "After deployment, if `timeLockRegistry` has not already been initialized in a constructor/initializer, any external account can call `setTimeLockRegistry` first and point it to an attacker-controlled contract. That attacker then becomes the permanent registry authority because future rotations are gated by `Ownable(timeLockRegistry).owner()`. With control of the registry, the attacker can disrupt claims and claw back still-locked team/advisor balances through the token's `onlyTimeLockRegistry` paths."
}
|
| medium | other | detector | Untrusted CALL target/value reachable | 45 | no | no |
viewtrace_id: 0x30a94614436ce6b18dbce4ef6ef9fc11ac96ed81390e3eaa29858585073d29d5
call_targets:
0x04393e5c6701237d7ee836d644f8dbdd122afebc
target_varies:
no
classification:
constant_target
validation_json{
"sink": "CALL",
"errors": 0,
"status": "sink_reached",
"attempts": 1,
"trace_id": "0x30a94614436ce6b18dbce4ef6ef9fc11ac96ed81390e3eaa29858585073d29d5",
"confirmed": false,
"trace_mode": "callTracer",
"call_targets": [
"0x04393e5c6701237d7ee836d644f8dbdd122afebc"
],
"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": "0xdd62ed3e",
"selector": "0xdd62ed3e",
"calldata_variants": [
"0xdd62ed3e",
"0xdd62ed3e0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xf251fc8c",
"selector": "0xf251fc8c",
"calldata_variants": [
"0xf251fc8c",
"0xf251fc8c0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xf77c4791",
"selector": "0xf77c4791",
"calldata_variants": [
"0xf77c4791",
"0xf77c47910000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xf85cb5c8",
"selector": "0xf85cb5c8",
"calldata_variants": [
"0xf85cb5c8",
"0xf85cb5c80000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xcb12233b",
"selector": "0xcb12233b",
"calldata_variants": [
"0xcb12233b",
"0xcb12233b0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xd360386c",
"selector": "0xd360386c",
"calldata_variants": [
"0xd360386c",
"0xd360386c0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xd6888eab",
"selector": "0xd6888eab",
"calldata_variants": [
"0xd6888eab",
"0xd6888eab0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xdaeffcca",
"selector": "0xdaeffcca",
"calldata_variants": [
"0xdaeffcca",
"0xdaeffcca0000000000000000000000000000000000000000000000000000000000000000"
]
}
]
}
evidence_json{
"examples": [
{
"pc": 7621,
"opcode": "CALL",
"returndata_checked": null,
"value_expression_category": "computed",
"target_expression_category": "computed"
},
{
"pc": 8160,
"opcode": "CALL",
"returndata_checked": null,
"value_expression_category": "computed",
"target_expression_category": "computed"
},
{
"pc": 10488,
"opcode": "CALL",
"returndata_checked": null,
"value_expression_category": "computed",
"target_expression_category": "computed"
}
],
"call_count": 12,
"guards_detected": [
{
"pc": 23013,
"type": "tx_origin_used"
},
{
"pc": 23048,
"type": "tx_origin_used"
},
{
"pc": 23318,
"type": "tx_origin_used"
},
{
"pc": 23510,
"type": "tx_origin_used"
},
{
"pc": 23517,
"type": "tx_origin_used"
}
],
"untrusted_call_count": 12
}
|
| medium | other | detector | ETH value transfer possible | 40 | no | no |
viewtrace_id: 0x30a94614436ce6b18dbce4ef6ef9fc11ac96ed81390e3eaa29858585073d29d5
call_targets:
0x04393e5c6701237d7ee836d644f8dbdd122afebc
target_varies:
no
classification:
constant_target
validation_json{
"sink": "CALL",
"errors": 0,
"status": "sink_reached",
"attempts": 1,
"trace_id": "0x30a94614436ce6b18dbce4ef6ef9fc11ac96ed81390e3eaa29858585073d29d5",
"confirmed": false,
"trace_mode": "callTracer",
"call_targets": [
"0x04393e5c6701237d7ee836d644f8dbdd122afebc"
],
"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": "0xdd62ed3e",
"selector": "0xdd62ed3e",
"calldata_variants": [
"0xdd62ed3e",
"0xdd62ed3e0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xf251fc8c",
"selector": "0xf251fc8c",
"calldata_variants": [
"0xf251fc8c",
"0xf251fc8c0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xf77c4791",
"selector": "0xf77c4791",
"calldata_variants": [
"0xf77c4791",
"0xf77c47910000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xf85cb5c8",
"selector": "0xf85cb5c8",
"calldata_variants": [
"0xf85cb5c8",
"0xf85cb5c80000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xcb12233b",
"selector": "0xcb12233b",
"calldata_variants": [
"0xcb12233b",
"0xcb12233b0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xd360386c",
"selector": "0xd360386c",
"calldata_variants": [
"0xd360386c",
"0xd360386c0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xd6888eab",
"selector": "0xd6888eab",
"calldata_variants": [
"0xd6888eab",
"0xd6888eab0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xdaeffcca",
"selector": "0xdaeffcca",
"calldata_variants": [
"0xdaeffcca",
"0xdaeffcca0000000000000000000000000000000000000000000000000000000000000000"
]
}
]
}
evidence_json{
"examples": [
{
"pc": 7621,
"opcode": "CALL",
"returndata_checked": null,
"value_expression_category": "computed",
"target_expression_category": "computed"
},
{
"pc": 8160,
"opcode": "CALL",
"returndata_checked": null,
"value_expression_category": "computed",
"target_expression_category": "computed"
},
{
"pc": 10488,
"opcode": "CALL",
"returndata_checked": null,
"value_expression_category": "computed",
"target_expression_category": "computed"
}
],
"eth_value_calls": 12,
"guards_detected": [
{
"pc": 23013,
"type": "tx_origin_used"
},
{
"pc": 23048,
"type": "tx_origin_used"
},
{
"pc": 23318,
"type": "tx_origin_used"
},
{
"pc": 23510,
"type": "tx_origin_used"
},
{
"pc": 23517,
"type": "tx_origin_used"
}
]
}
|
| medium | upgradeability | cast | DELEGATECALL present | 80 | no | — |
viewevidence_json{
"notes": "delegatecall enables execution in caller context; common in proxies/upgradeable patterns",
"delegatecall_count": 2
}
|
| info | other | cast | Heavy EXTCODE*/BALANCE usage | 55 | no | — |
viewevidence_json{
"notes": "frequent external code or balance checks; may indicate introspection or validation logic",
"ext_balance_count": 46
}
|
| 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": 45
}
|