Skip to content

Instantly share code, notes, and snippets.

@mzfshark
Last active March 15, 2022 21:03
Show Gist options
  • Save mzfshark/2444a347e84b290c18803bfcda09f184 to your computer and use it in GitHub Desktop.
Save mzfshark/2444a347e84b290c18803bfcda09f184 to your computer and use it in GitHub Desktop.
REMIX EXAMPLE PROJECT
Remix example project is present when Remix loads very first time or there are no files existing in the File Explorer.
It contains 3 directories:
1. 'contracts': Holds three contracts with different complexity level, denoted with number prefix in file name.
2. 'scripts': Holds two scripts to deploy a contract. It is explained below.
3. 'tests': Contains one test file for 'Ballot' contract with unit tests in Solidity.
SCRIPTS
The 'scripts' folder contains example async/await scripts for deploying the 'Storage' contract.
For the deployment of any other contract, 'contractName' and 'constructorArgs' should be updated (along with other code if required).
Scripts have full access to the web3.js and ethers.js libraries.
To run a script, right click on file name in the file explorer and click 'Run'. Remember, Solidity file must already be compiled.
Output from script will appear in remix terminal.
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)
pragma solidity >0.8.0;
import "../utils/ContextUpgradeable.sol";
import "../proxy/utils/Initializable.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
function __Ownable_init() internal onlyInitializing {
__Ownable_init_unchained();
}
function __Ownable_init_unchained() internal onlyInitializing {
_transferOwnership(_msgSender());
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
/**
* @dev This empty reserved space is put in place to allow future versions to add new
* variables without shifting down storage in the inheritance chain.
* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
*/
uint256[49] private __gap;
}
// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity 0.7.5;
import "../libraries/Address.sol";
import "../libraries/SafeMath.sol";
import "../libraries/SafeERC20.sol";
import "../interfaces/IERC20.sol";
import "../interfaces/ITreasury.sol";
import "../types/AxodusAccessControlled.sol";
interface ILendingPool {
function deposit(
address asset,
uint256 amount,
address onBehalfOf,
uint16 referralCode
) external;
function withdraw(
address asset,
uint256 amount,
address to
) external returns (uint256);
}
interface IStakedTokenIncentivesController {
function claimRewards(
address[] memory assets,
uint256 amount,
address to
) external;
function claimRewardsOnBehalf(
address[] memory assets,
uint256 amount,
address user,
address to
) external;
function getRewardsBalance(address[] memory assets, address user) external view returns (uint256);
}
/**
* Contract deploys reserves from treasury into the Aave lending pool,
* earning interest and $stkAAVE.
*/
contract AaveAllocator is AxodusAccessControlled {
/* ======== DEPENDENCIES ======== */
using SafeERC20 for IERC20;
using SafeMath for uint256;
struct aTokenData {
address underlying;
address aToken;
uint256 deployed;
uint256 limit;
uint256 newLimit;
uint256 limitChangeTimelockEnd;
}
/* ======== STATE VARIABLES ======== */
// stkAave incentive controller
IStakedTokenIncentivesController internal immutable incentives =
IStakedTokenIncentivesController(0xd784927Ff2f95ba542BfC824c8a8a98F3495f6b5);
// Aave Lending Pool
ILendingPool internal immutable lendingPool = ILendingPool(0x7d2768dE32b0b80b7a3454c06BdAc94A69DDc7A9);
// Axodus Treasury
ITreasury internal immutable treasury = ITreasury(0x9A315BdF513367C0377FB36545857d12e85813Ef);
// all relevant aTokens
address[] public aTokens;
// corresponding aTokens for tokens
mapping(address => aTokenData) public aTokenInfo;
// total RFV deployed into lending pool
uint256 public totalValueDeployed;
// timelock to raise deployment limit
uint256 public immutable timelockInBlocks = 6600;
// rebates portion of lending pool fees
uint16 public referralCode;
/* ======== CONSTRUCTOR ======== */
constructor(IAxodusAuthority _authority) AxodusAccessControlled(_authority) {
referralCode = 0;
}
/* ======== OPEN FUNCTIONS ======== */
/**
* @notice claims accrued stkAave rewards for all tracked aTokens
*/
function harvest() public {
incentives.claimRewards(aTokens, rewardsPending(), address(treasury));
}
/**
* @notice claims accrued stkAave rewards for given aTokens
*/
function harvestFor(address[] calldata _aTokens) external {
incentives.claimRewards(_aTokens, rewardsPendingFor(_aTokens), address(treasury));
}
/* ======== POLICY FUNCTIONS ======== */
/**
* @notice withdraws asset from treasury, deposits asset into lending pool, then deposits aToken into treasury
*/
function deposit(address token, uint256 amount) public onlyPolicy {
require(!exceedsLimit(token, amount), "Exceeds deposit limit");
// retrieve amount of asset from treasury
treasury.manage(token, amount);
// approve and deposit into lending pool, returning aToken
IERC20(token).approve(address(lendingPool), amount);
lendingPool.deposit(token, amount, address(this), referralCode);
// account for deposit
accountingFor(token, amount, treasury.tokenValue(token, amount), true);
}
/**
* @notice withdraws aToken from treasury, withdraws from lending pool, and deposits asset into treasury
*/
function withdraw(address token, uint256 amount) public onlyPolicy {
// approve and withdraw from lending pool, returning asset
IERC20(aTokenInfo[token].aToken).approve(address(lendingPool), amount);
lendingPool.withdraw(token, amount, address(this));
uint256 balance = IERC20(token).balanceOf(address(this));
uint256 value = treasury.tokenValue(token, balance);
// account for withdrawal
accountingFor(token, balance, value, false);
// approve and deposit asset into treasury
IERC20(token).approve(address(treasury), balance);
treasury.deposit(balance, token, value);
}
/**
* @notice adds asset and corresponding aToken to mapping
*/
function addToken(
address token,
address aToken,
uint256 max
) external onlyPolicy {
require(token != address(0), "Token: Zero address");
require(aToken != address(0), "aToken: Zero address");
require(aTokenInfo[token].deployed == 0, "Token added");
aTokenInfo[token] = aTokenData({
underlying: token,
aToken: aToken,
deployed: 0,
limit: max,
newLimit: 0,
limitChangeTimelockEnd: 0
});
}
/**
* @notice lowers max can be deployed for asset (no timelock)
*/
function lowerLimit(address token, uint256 newMax) external onlyPolicy {
require(newMax < aTokenInfo[token].limit, "Must be lower");
require(newMax > aTokenInfo[token].deployed, "Must be less than deployed");
aTokenInfo[token].limit = newMax;
}
/**
* @notice starts timelock to raise max allocation for asset
*/
function queueRaiseLimit(address token, uint256 newMax) external onlyPolicy {
aTokenInfo[token].limitChangeTimelockEnd = block.number.add(timelockInBlocks);
aTokenInfo[token].newLimit = newMax;
}
/**
* @notice changes max allocation for asset when timelock elapsed
*/
function raiseLimit(address token) external onlyPolicy {
aTokenData storage info = aTokenInfo[token];
require(block.number >= info.limitChangeTimelockEnd, "Timelock not expired");
info.limit = info.newLimit;
info.newLimit = 0;
info.limitChangeTimelockEnd = 0;
}
/**
* @notice set referral code for rebate on fees
*/
function setReferralCode(uint16 code) external onlyPolicy {
referralCode = code;
}
/* ======== INTERNAL FUNCTIONS ======== */
/**
* @notice accounting of deposits/withdrawals of assets
*/
function accountingFor(
address token,
uint256 amount,
uint256 value,
bool add
) internal {
if (add) {
aTokenInfo[token].deployed = aTokenInfo[token].deployed.add(amount); // track amount allocated into pool
totalValueDeployed = totalValueDeployed.add(value); // track total value allocated into pools
} else {
// track amount allocated into pool
if (amount < aTokenInfo[token].deployed) {
aTokenInfo[token].deployed = aTokenInfo[token].deployed.sub(amount);
} else aTokenInfo[token].deployed = 0;
// track total value allocated into pools
if (value < totalValueDeployed) {
totalValueDeployed = totalValueDeployed.sub(value);
} else totalValueDeployed = 0;
}
}
/* ======== VIEW FUNCTIONS ======== */
/**
* @notice query all pending rewards
*/
function rewardsPending() public view returns (uint256) {
return incentives.getRewardsBalance(aTokens, address(this));
}
/**
* @notice query pending rewards for provided aTokens
*/
function rewardsPendingFor(address[] calldata tokens) public view returns (uint256) {
return incentives.getRewardsBalance(tokens, address(this));
}
/**
* @notice checks to ensure deposit does not exceed max allocation for asset
*/
function exceedsLimit(address token, uint256 amount) public view returns (bool) {
uint256 willBeDeployed = aTokenInfo[token].deployed.add(amount);
return (willBeDeployed > aTokenInfo[token].limit);
}
}
// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity 0.8.10;
import "../libraries/SafeERC20.sol";
import "../interfaces/IERC20.sol";
import "../interfaces/ITreasury.sol";
import "../types/AxodusAccessControlled.sol";
interface ITokemakManager {
function currentCycleIndex() external view returns (uint256);
}
interface ITokemaktALCX {
function deposit(uint256 amount) external;
function requestedWithdrawals(address addr) external view returns (uint256, uint256);
function withdraw(uint256 requestedAmount) external;
function requestWithdrawal(uint256 amount) external;
}
interface IStakingPools {
function claim(uint256 _poolId) external;
function exit(uint256 _poolId) external;
function getStakeTotalDeposited(address _account, uint256 _poolId) external view returns (uint256);
function getStakeTotalUnclaimed(address _account, uint256 _poolId) external view returns (uint256);
function deposit(uint256 _poolId, uint256 _depositAmount) external;
function withdraw(uint256 _poolId, uint256 _withdrawAmount) external;
}
/**
* Contract deploys Alchemix from treasury into the Tokemak tALCX pool,
* tALCX contract gives tALCX token in ratio 1:1 of Alchemix token deposited,
* Contract stake tALCX token on Alchemix staking pool and earn ALCX as reward,
* Contract claims reward and compound it,
* Contract withdraw funds from Alchemix staking pool and Tokemak tALCX pool,
* Sends back Alchemix token with accured reward to treasury.
*/
contract AlchemixAllocator is AxodusAccessControlled {
/* ======== DEPENDENCIES ======== */
using SafeERC20 for IERC20;
/* ======== STATE VARIABLES ======== */
address public immutable alchemix;
address public immutable tokemakManager = 0xA86e412109f77c45a3BC1c5870b880492Fb86A14;
ITokemaktALCX public immutable tALCX; // Tokemak tALCX deposit contract
IStakingPools public immutable pool; // Alchemix staking contract
ITreasury public treasury; // Axodus Treasury
uint256 public totalAlchemixDeposited;
/* ======== CONSTRUCTOR ======== */
constructor(
address _treasury,
address _alchemix,
address _tALCX,
address _pool,
address _olympusAuthority
) AxodusAccessControlled(IAxodusAuthority(_olympusAuthority)) {
require(_treasury != address(0));
treasury = ITreasury(_treasury);
require(_tALCX != address(0));
tALCX = ITokemaktALCX(_tALCX);
require(_pool != address(0));
pool = IStakingPools(_pool);
alchemix = _alchemix;
}
/* ======== GUARDIAN FUNCTIONS ======== */
/**
* @notice compound reward by claiming pending rewards and
* calling the deposit function
* @param _poolId pool id of tALCX on Alchemix staking pool
*/
function compoundReward(uint256 _poolId) external onlyGuardian {
pool.claim(_poolId);
uint256 alchemixBalance = IERC20(alchemix).balanceOf(address(this));
require(alchemixBalance > 0, "contract has no alchemix token");
deposit(alchemixBalance, _poolId, true);
}
/**
* @notice withdraws asset from treasury, deposits asset into Tokemak tALCX,
* then deposits tALCX into Alchemix staking pool
* @param _amount amount to deposit
* @param _poolId pool id of tALCX on Alchemix staking pool
* @param _isCompounding used to indicate if the contract is compounding pending rewards
*/
function deposit(
uint256 _amount,
uint256 _poolId,
bool _isCompounding
) public onlyGuardian {
if (!_isCompounding) {
treasury.manage(alchemix, _amount); // retrieve amount of asset from treasury
}
IERC20(alchemix).approve(address(tALCX), _amount); // approve tALCX pool to spend tokens
tALCX.deposit(_amount);
totalAlchemixDeposited = totalAlchemixDeposited + _amount;
uint256 tALCX_balance = IERC20(address(tALCX)).balanceOf(address(this));
IERC20(address(tALCX)).approve(address(pool), tALCX_balance); // approve to deposit to Alchemix staking pool
pool.deposit(_poolId, tALCX_balance); // deposit into Alchemix staking pool
}
/**
* @notice as structured by Tokemak before one withdraws you must first request withdrawal,
unstake tALCX from Alchemix staking pool and make a request on Tokemak tALCX pool.
* @param _poolId pool id of tALCX on Alchemix staking pool
* @param _amount amount to withdraw if _isEntireFunds is false
* @param _isEntireFunds used to indicate if amount to with is the entire funds deposited
*/
function requestWithdraw(
uint256 _poolId,
uint256 _amount,
bool _isEntireFunds
) external onlyGuardian {
if (_isEntireFunds) {
pool.exit(_poolId);
} else {
pool.withdraw(_poolId, _amount);
}
uint256 balance = IERC20(address(tALCX)).balanceOf(address(this));
tALCX.requestWithdrawal(balance);
}
/**
* @notice withdraws ALCX from Tokemak tALCX pool then deposits asset into treasury,
ensures cycle for withdraw has been reached.
*/
function withdraw() external onlyGuardian {
(uint256 minCycle, ) = tALCX.requestedWithdrawals(address(this));
uint256 currentCycle = ITokemakManager(tokemakManager).currentCycleIndex();
require(minCycle <= currentCycle, "requested withdraw cycle not reached yet");
(, uint256 requestedAmountToWithdraw) = getRequestedWithdrawalInfo();
tALCX.withdraw(requestedAmountToWithdraw);
uint256 balance = IERC20(alchemix).balanceOf(address(this)); // balance of asset withdrawn
totalAlchemixDeposited = totalAlchemixDeposited - requestedAmountToWithdraw;
IERC20(alchemix).safeTransfer(address(treasury), balance);
}
function updateTreasury() external onlyGuardian {
require(authority.vault() != address(0), "Zero address: Vault");
require(address(authority.vault()) != address(treasury), "No change");
treasury = ITreasury(authority.vault());
}
/* ======== VIEW FUNCTIONS ======== */
/**
* @notice query all pending rewards
* @param _poolId pool id of tALCX on Alchemix staking pool
* @return uint
*/
function alchemixToClaim(uint256 _poolId) external view returns (uint256) {
return pool.getStakeTotalUnclaimed(address(this), _poolId);
}
/**
* @notice query all deposited tALCX in Alchemix staking pool
* @param _poolId pool id of tALCX on Alchemix staking pool
* @return uint
*/
function totaltAlcxDeposited(uint256 _poolId) external view returns (uint256) {
return pool.getStakeTotalDeposited(address(this), _poolId);
}
/**
* @notice query requested withdrawal info
* @return cycle eligible for withdrawal and amount
*/
function getRequestedWithdrawalInfo() public view returns (uint256 cycle, uint256 amount) {
(cycle, amount) = tALCX.requestedWithdrawals(address(this));
}
}
{
"deploy": {
"VM:-": {
"linkReferences": {},
"autoDeployLib": true
},
"main:1": {
"linkReferences": {},
"autoDeployLib": true
},
"ropsten:3": {
"linkReferences": {},
"autoDeployLib": true
},
"rinkeby:4": {
"linkReferences": {},
"autoDeployLib": true
},
"kovan:42": {
"linkReferences": {},
"autoDeployLib": true
},
"görli:5": {
"linkReferences": {},
"autoDeployLib": true
},
"Custom": {
"linkReferences": {},
"autoDeployLib": true
}
},
"data": {
"bytecode": {
"generatedSources": [],
"linkReferences": {},
"object": "",
"opcodes": "",
"sourceMap": ""
},
"deployedBytecode": {
"generatedSources": [],
"immutableReferences": {},
"linkReferences": {},
"object": "",
"opcodes": "",
"sourceMap": ""
},
"gasEstimates": null,
"methodIdentifiers": {
"harvest(bool)": "70a1903d"
}
},
"abi": [
{
"inputs": [
{
"internalType": "bool",
"name": "_stake",
"type": "bool"
}
],
"name": "harvest",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
}
]
}
{
"compiler": {
"version": "0.7.5+commit.eb77ed08"
},
"language": "Solidity",
"output": {
"abi": [
{
"inputs": [
{
"internalType": "bool",
"name": "_stake",
"type": "bool"
}
],
"name": "harvest",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
}
],
"devdoc": {
"kind": "dev",
"methods": {},
"version": 1
},
"userdoc": {
"kind": "user",
"methods": {},
"version": 1
}
},
"settings": {
"compilationTarget": {
"contracts/allocators/RewardHarvestor.sol": "IOnsenAllocator"
},
"evmVersion": "istanbul",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
},
"sources": {
"contracts/allocators/RewardHarvestor.sol": {
"keccak256": "0xe7f40137d3d70546d4fda62eb3be16fd816e73c6a71be1e5569cc4f97d04caf4",
"license": "AGPL-3.0-or-later",
"urls": [
"bzz-raw://8b856a8f5b0d255b1455b40a7471b24e8b8171c90b1644bfa4fc9d388f202746",
"dweb:/ipfs/QmQz1TnLQE7Qu5F8i4KnjTZxCuW4XWPSBtR5XioExNgzet"
]
},
"contracts/interfaces/IAllocator.sol": {
"keccak256": "0xbc2b714d83ad535b15e60dc5d1a99f3ac360783706b9cc0914ce248c3e9e8ead",
"license": "AGPL-3.0-or-later",
"urls": [
"bzz-raw://07974ec59f987852fc4681e9da7e40c0ebe19d74e5c241d020d86999d237a85e",
"dweb:/ipfs/QmZmGeFhsMjQr47CfrvRWnw8PuZdGWSoBK45MrxHHnBcJ6"
]
},
"contracts/interfaces/IOwnable.sol": {
"keccak256": "0x29d92f94f4517d948d3a314e89008ae96e189cc21d410d477ddfe3766e5d665a",
"license": "AGPL-3.0",
"urls": [
"bzz-raw://939c2fa81ad0f94c4c76754676f1db4340f1f1cba50cd20dbbb5a71be8945f65",
"dweb:/ipfs/QmQzo16egRWr1BGdPh9AML4G2q1qG57vK4ChMcddDbm1r5"
]
},
"contracts/types/Ownable.sol": {
"keccak256": "0xdc15639cf43a8a2a8b57e254bdf685527c257a2f94097ffd6ca041ffa483c6cc",
"license": "AGPL-3.0-or-later",
"urls": [
"bzz-raw://0dce6bf4b55625a0e07802131b643f63ae5763bfeae5a8fcc63352df4fa5df7e",
"dweb:/ipfs/Qme7MLRydxRaGiapUBiZYYZnYKyAcYXeJHYmk1gZvBfVxW"
]
}
},
"version": 1
}
{
"deploy": {
"VM:-": {
"linkReferences": {},
"autoDeployLib": true
},
"main:1": {
"linkReferences": {},
"autoDeployLib": true
},
"ropsten:3": {
"linkReferences": {},
"autoDeployLib": true
},
"rinkeby:4": {
"linkReferences": {},
"autoDeployLib": true
},
"kovan:42": {
"linkReferences": {},
"autoDeployLib": true
},
"görli:5": {
"linkReferences": {},
"autoDeployLib": true
},
"Custom": {
"linkReferences": {},
"autoDeployLib": true
}
},
"data": {
"bytecode": {
"generatedSources": [],
"linkReferences": {},
"object": "60a060405234801561001057600080fd5b506040516108983803806108988339818101604052604081101561003357600080fd5b81516020830180516040519294929383019291908464010000000082111561005a57600080fd5b90830190602082018581111561006f57600080fd5b825186602082028301116401000000008211171561008c57600080fd5b82525081516020918201928201910280838360005b838110156100b95781810151838201526020016100a1565b50505050919091016040819052600080546001600160a01b03191633178082556001600160a01b0316955093507fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba9250839150a36001600160a01b03821661012057600080fd5b6001600160601b0319606083901b1660805260005b81518110156101795760006001600160a01b031682828151811061015557fe5b60200260200101516001600160a01b0316141561017157600080fd5b600101610135565b50805161018d906002906020840190610195565b50505061020f565b8280548282559060005260206000209081019282156101ea579160200282015b828111156101ea57825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906101b5565b506101f69291506101fa565b5090565b5b808211156101f657600081556001016101fb565b60805160601c610667610231600039806103a8528061052552506106676000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c8063584c05141161005b578063584c0514146101665780635a96ac0a1461016e57806370a1903d146101765780638da5cb5b1461019557610088565b8063089208d81461008d57806308e17b1314610097578063241c57a21461010757806346f68ee914610140575b600080fd5b61009561019d565b005b610095600480360360208110156100ad57600080fd5b8101906020810181356401000000008111156100c857600080fd5b8201836020820111156100da57600080fd5b803590602001918460208302840111640100000000831117156100fc57600080fd5b509092509050610252565b6101246004803603602081101561011d57600080fd5b50356102c2565b604080516001600160a01b039092168252519081900360200190f35b6100956004803603602081101561015657600080fd5b50356001600160a01b03166102ec565b6101246103a6565b6100956103ca565b6100956004803603602081101561018c57600080fd5b50351515610477565b610124610588565b6000546001600160a01b031633146101fc576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907faa151555690c956fc3ea32f106bb9f119b5237a061eaa8557cff3e51e3792c8d908390a3600080546001600160a01b0319908116909155600180549091169055565b6000546001600160a01b031633146102b1576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6102bd60028383610597565b505050565b600281815481106102d257600080fd5b6000918252602090912001546001600160a01b0316905081565b6000546001600160a01b0316331461034b576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03808516939216917fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba91a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b7f000000000000000000000000000000000000000000000000000000000000000081565b6001546001600160a01b031633146104135760405162461bcd60e51b81526004018080602001828103825260228152602001806106106022913960400191505060405180910390fd5b600154600080546040516001600160a01b0393841693909116917faa151555690c956fc3ea32f106bb9f119b5237a061eaa8557cff3e51e3792c8d91a360018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b60005b6002548110156104fd576002818154811061049157fe5b600091825260208220015460408051634641257d60e01b815290516001600160a01b0390921692634641257d9260048084019382900301818387803b1580156104d957600080fd5b505af11580156104ed573d6000803e3d6000fd5b50506001909201915061047a9050565b50801561058557604080516370a1903d60e01b81526001600482015290516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a1903d91602480830192600092919082900301818387803b15801561056c57600080fd5b505af1158015610580573d6000803e3d6000fd5b505050505b50565b6000546001600160a01b031690565b8280548282559060005260206000209081019282156105ea579160200282015b828111156105ea5781546001600160a01b0319166001600160a01b038435161782556020909201916001909101906105b7565b506105f69291506105fa565b5090565b5b808211156105f657600081556001016105fb56fe4f776e61626c653a206d757374206265206e6577206f776e657220746f2070756c6ca26469706673582212206e4760ddc7ea9606b9bc948c79c2654a9a4f687bed2e792aa77485027c85da9a64736f6c63430007050033",
"opcodes": "PUSH1 0xA0 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH2 0x898 CODESIZE SUB DUP1 PUSH2 0x898 DUP4 CODECOPY DUP2 DUP2 ADD PUSH1 0x40 MSTORE PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x33 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH1 0x20 DUP4 ADD DUP1 MLOAD PUSH1 0x40 MLOAD SWAP3 SWAP5 SWAP3 SWAP4 DUP4 ADD SWAP3 SWAP2 SWAP1 DUP5 PUSH5 0x100000000 DUP3 GT ISZERO PUSH2 0x5A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 DUP4 ADD SWAP1 PUSH1 0x20 DUP3 ADD DUP6 DUP2 GT ISZERO PUSH2 0x6F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 MLOAD DUP7 PUSH1 0x20 DUP3 MUL DUP4 ADD GT PUSH5 0x100000000 DUP3 GT OR ISZERO PUSH2 0x8C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 MSTORE POP DUP2 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP3 DUP3 ADD SWAP2 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xB9 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xA1 JUMP JUMPDEST POP POP POP POP SWAP2 SWAP1 SWAP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND CALLER OR DUP1 DUP3 SSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP6 POP SWAP4 POP PUSH32 0xEA8258F2D9DDB679928CF34B78CF645B7FEDA9ACC828E4DD82D014EAAE270EBA SWAP3 POP DUP4 SWAP2 POP LOG3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x120 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x60 SHL SUB NOT PUSH1 0x60 DUP4 SWAP1 SHL AND PUSH1 0x80 MSTORE PUSH1 0x0 JUMPDEST DUP2 MLOAD DUP2 LT ISZERO PUSH2 0x179 JUMPI PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x155 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO PUSH2 0x171 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 ADD PUSH2 0x135 JUMP JUMPDEST POP DUP1 MLOAD PUSH2 0x18D SWAP1 PUSH1 0x2 SWAP1 PUSH1 0x20 DUP5 ADD SWAP1 PUSH2 0x195 JUMP JUMPDEST POP POP POP PUSH2 0x20F JUMP JUMPDEST DUP3 DUP1 SLOAD DUP3 DUP3 SSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP3 DUP3 ISZERO PUSH2 0x1EA JUMPI SWAP2 PUSH1 0x20 MUL DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x1EA JUMPI DUP3 MLOAD DUP3 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND OR DUP3 SSTORE PUSH1 0x20 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x1B5 JUMP JUMPDEST POP PUSH2 0x1F6 SWAP3 SWAP2 POP PUSH2 0x1FA JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x1F6 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x1FB JUMP JUMPDEST PUSH1 0x80 MLOAD PUSH1 0x60 SHR PUSH2 0x667 PUSH2 0x231 PUSH1 0x0 CODECOPY DUP1 PUSH2 0x3A8 MSTORE DUP1 PUSH2 0x525 MSTORE POP PUSH2 0x667 PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x88 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x584C0514 GT PUSH2 0x5B JUMPI DUP1 PUSH4 0x584C0514 EQ PUSH2 0x166 JUMPI DUP1 PUSH4 0x5A96AC0A EQ PUSH2 0x16E JUMPI DUP1 PUSH4 0x70A1903D EQ PUSH2 0x176 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x195 JUMPI PUSH2 0x88 JUMP JUMPDEST DUP1 PUSH4 0x89208D8 EQ PUSH2 0x8D JUMPI DUP1 PUSH4 0x8E17B13 EQ PUSH2 0x97 JUMPI DUP1 PUSH4 0x241C57A2 EQ PUSH2 0x107 JUMPI DUP1 PUSH4 0x46F68EE9 EQ PUSH2 0x140 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x95 PUSH2 0x19D JUMP JUMPDEST STOP JUMPDEST PUSH2 0x95 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xAD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 ADD DUP2 CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0xC8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0xDA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0xFC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH2 0x252 JUMP JUMPDEST PUSH2 0x124 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x11D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x2C2 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x95 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x156 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x2EC JUMP JUMPDEST PUSH2 0x124 PUSH2 0x3A6 JUMP JUMPDEST PUSH2 0x95 PUSH2 0x3CA JUMP JUMPDEST PUSH2 0x95 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x18C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD ISZERO ISZERO PUSH2 0x477 JUMP JUMPDEST PUSH2 0x124 PUSH2 0x588 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0x1FC JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH32 0xAA151555690C956FC3EA32F106BB9F119B5237A061EAA8557CFF3E51E3792C8D SWAP1 DUP4 SWAP1 LOG3 PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP1 DUP2 AND SWAP1 SWAP2 SSTORE PUSH1 0x1 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0x2B1 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x2BD PUSH1 0x2 DUP4 DUP4 PUSH2 0x597 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x2 DUP2 DUP2 SLOAD DUP2 LT PUSH2 0x2D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 POP DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0x34B JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND SWAP4 SWAP3 AND SWAP2 PUSH32 0xEA8258F2D9DDB679928CF34B78CF645B7FEDA9ACC828E4DD82D014EAAE270EBA SWAP2 LOG3 PUSH1 0x1 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0x413 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x610 PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND SWAP4 SWAP1 SWAP2 AND SWAP2 PUSH32 0xAA151555690C956FC3EA32F106BB9F119B5237A061EAA8557CFF3E51E3792C8D SWAP2 LOG3 PUSH1 0x1 DUP1 SLOAD PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP1 DUP2 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND OR SWAP1 SWAP2 SSTORE AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST PUSH1 0x2 SLOAD DUP2 LT ISZERO PUSH2 0x4FD JUMPI PUSH1 0x2 DUP2 DUP2 SLOAD DUP2 LT PUSH2 0x491 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 KECCAK256 ADD SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x4641257D PUSH1 0xE0 SHL DUP2 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP3 PUSH4 0x4641257D SWAP3 PUSH1 0x4 DUP1 DUP5 ADD SWAP4 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x4D9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x4ED JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 POP PUSH2 0x47A SWAP1 POP JUMP JUMPDEST POP DUP1 ISZERO PUSH2 0x585 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH4 0x70A1903D PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 AND SWAP2 PUSH4 0x70A1903D SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x56C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x580 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST DUP3 DUP1 SLOAD DUP3 DUP3 SSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP3 DUP3 ISZERO PUSH2 0x5EA JUMPI SWAP2 PUSH1 0x20 MUL DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x5EA JUMPI DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 CALLDATALOAD AND OR DUP3 SSTORE PUSH1 0x20 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x5B7 JUMP JUMPDEST POP PUSH2 0x5F6 SWAP3 SWAP2 POP PUSH2 0x5FA JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x5F6 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x5FB JUMP INVALID 0x4F PUSH24 0x6E61626C653A206D757374206265206E6577206F776E6572 KECCAK256 PUSH21 0x6F2070756C6CA26469706673582212206E4760DDC7 0xEA SWAP7 MOD 0xB9 0xBC SWAP5 DUP13 PUSH26 0xC2654A9A4F687BED2E792AA77485027C85DA9A64736F6C634300 SMOD SDIV STOP CALLER ",
"sourceMap": "302:1188:0:-:0;;;509:314;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;509:314:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;509:314:0;;;;;;;;409:6:3;:19;;-1:-1:-1;;;;;;409:19:3;418:10;409:19;;;;-1:-1:-1;;;;;471:6:3;;-1:-1:-1;409:6:3;-1:-1:-1;443:35:3;;-1:-1:-1;409:6:3;;-1:-1:-1;443:35:3;-1:-1:-1;;;;;594:29:0;;586:38;;;;;;-1:-1:-1;;;;;;634:32:0;;;;;;;681:9;676:107;696:11;:18;692:1;:22;676:107;;;769:1;-1:-1:-1;;;;;743:28:0;:11;755:1;743:14;;;;;;;;;;;;;;-1:-1:-1;;;;;743:28:0;;;735:37;;;;;;716:3;;676:107;;;-1:-1:-1;792:24:0;;;;:10;;:24;;;;;:::i;:::-;;509:314;;302:1188;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;302:1188:0;-1:-1:-1;;;;;302:1188:0;;;;;;;;;;;-1:-1:-1;302:1188:0;;;;;;;-1:-1:-1;302:1188:0;;;-1:-1:-1;302:1188:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;"
},
"deployedBytecode": {
"generatedSources": [],
"immutableReferences": {
"13": [
{
"length": 32,
"start": 936
},
{
"length": 32,
"start": 1317
}
]
},
"linkReferences": {},
"object": "608060405234801561001057600080fd5b50600436106100885760003560e01c8063584c05141161005b578063584c0514146101665780635a96ac0a1461016e57806370a1903d146101765780638da5cb5b1461019557610088565b8063089208d81461008d57806308e17b1314610097578063241c57a21461010757806346f68ee914610140575b600080fd5b61009561019d565b005b610095600480360360208110156100ad57600080fd5b8101906020810181356401000000008111156100c857600080fd5b8201836020820111156100da57600080fd5b803590602001918460208302840111640100000000831117156100fc57600080fd5b509092509050610252565b6101246004803603602081101561011d57600080fd5b50356102c2565b604080516001600160a01b039092168252519081900360200190f35b6100956004803603602081101561015657600080fd5b50356001600160a01b03166102ec565b6101246103a6565b6100956103ca565b6100956004803603602081101561018c57600080fd5b50351515610477565b610124610588565b6000546001600160a01b031633146101fc576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907faa151555690c956fc3ea32f106bb9f119b5237a061eaa8557cff3e51e3792c8d908390a3600080546001600160a01b0319908116909155600180549091169055565b6000546001600160a01b031633146102b1576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6102bd60028383610597565b505050565b600281815481106102d257600080fd5b6000918252602090912001546001600160a01b0316905081565b6000546001600160a01b0316331461034b576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03808516939216917fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba91a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b7f000000000000000000000000000000000000000000000000000000000000000081565b6001546001600160a01b031633146104135760405162461bcd60e51b81526004018080602001828103825260228152602001806106106022913960400191505060405180910390fd5b600154600080546040516001600160a01b0393841693909116917faa151555690c956fc3ea32f106bb9f119b5237a061eaa8557cff3e51e3792c8d91a360018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b60005b6002548110156104fd576002818154811061049157fe5b600091825260208220015460408051634641257d60e01b815290516001600160a01b0390921692634641257d9260048084019382900301818387803b1580156104d957600080fd5b505af11580156104ed573d6000803e3d6000fd5b50506001909201915061047a9050565b50801561058557604080516370a1903d60e01b81526001600482015290516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a1903d91602480830192600092919082900301818387803b15801561056c57600080fd5b505af1158015610580573d6000803e3d6000fd5b505050505b50565b6000546001600160a01b031690565b8280548282559060005260206000209081019282156105ea579160200282015b828111156105ea5781546001600160a01b0319166001600160a01b038435161782556020909201916001909101906105b7565b506105f69291506105fa565b5090565b5b808211156105f657600081556001016105fb56fe4f776e61626c653a206d757374206265206e6577206f776e657220746f2070756c6ca26469706673582212206e4760ddc7ea9606b9bc948c79c2654a9a4f687bed2e792aa77485027c85da9a64736f6c63430007050033",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x88 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x584C0514 GT PUSH2 0x5B JUMPI DUP1 PUSH4 0x584C0514 EQ PUSH2 0x166 JUMPI DUP1 PUSH4 0x5A96AC0A EQ PUSH2 0x16E JUMPI DUP1 PUSH4 0x70A1903D EQ PUSH2 0x176 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x195 JUMPI PUSH2 0x88 JUMP JUMPDEST DUP1 PUSH4 0x89208D8 EQ PUSH2 0x8D JUMPI DUP1 PUSH4 0x8E17B13 EQ PUSH2 0x97 JUMPI DUP1 PUSH4 0x241C57A2 EQ PUSH2 0x107 JUMPI DUP1 PUSH4 0x46F68EE9 EQ PUSH2 0x140 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x95 PUSH2 0x19D JUMP JUMPDEST STOP JUMPDEST PUSH2 0x95 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xAD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 ADD DUP2 CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0xC8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0xDA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0xFC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH2 0x252 JUMP JUMPDEST PUSH2 0x124 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x11D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x2C2 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x95 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x156 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x2EC JUMP JUMPDEST PUSH2 0x124 PUSH2 0x3A6 JUMP JUMPDEST PUSH2 0x95 PUSH2 0x3CA JUMP JUMPDEST PUSH2 0x95 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x18C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD ISZERO ISZERO PUSH2 0x477 JUMP JUMPDEST PUSH2 0x124 PUSH2 0x588 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0x1FC JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH32 0xAA151555690C956FC3EA32F106BB9F119B5237A061EAA8557CFF3E51E3792C8D SWAP1 DUP4 SWAP1 LOG3 PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP1 DUP2 AND SWAP1 SWAP2 SSTORE PUSH1 0x1 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0x2B1 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x2BD PUSH1 0x2 DUP4 DUP4 PUSH2 0x597 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x2 DUP2 DUP2 SLOAD DUP2 LT PUSH2 0x2D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 POP DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0x34B JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND SWAP4 SWAP3 AND SWAP2 PUSH32 0xEA8258F2D9DDB679928CF34B78CF645B7FEDA9ACC828E4DD82D014EAAE270EBA SWAP2 LOG3 PUSH1 0x1 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0x413 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x610 PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND SWAP4 SWAP1 SWAP2 AND SWAP2 PUSH32 0xAA151555690C956FC3EA32F106BB9F119B5237A061EAA8557CFF3E51E3792C8D SWAP2 LOG3 PUSH1 0x1 DUP1 SLOAD PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP1 DUP2 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND OR SWAP1 SWAP2 SSTORE AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST PUSH1 0x2 SLOAD DUP2 LT ISZERO PUSH2 0x4FD JUMPI PUSH1 0x2 DUP2 DUP2 SLOAD DUP2 LT PUSH2 0x491 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 KECCAK256 ADD SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x4641257D PUSH1 0xE0 SHL DUP2 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP3 PUSH4 0x4641257D SWAP3 PUSH1 0x4 DUP1 DUP5 ADD SWAP4 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x4D9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x4ED JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 POP PUSH2 0x47A SWAP1 POP JUMP JUMPDEST POP DUP1 ISZERO PUSH2 0x585 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH4 0x70A1903D PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 AND SWAP2 PUSH4 0x70A1903D SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x56C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x580 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST DUP3 DUP1 SLOAD DUP3 DUP3 SSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP3 DUP3 ISZERO PUSH2 0x5EA JUMPI SWAP2 PUSH1 0x20 MUL DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x5EA JUMPI DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 CALLDATALOAD AND OR DUP3 SSTORE PUSH1 0x20 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x5B7 JUMP JUMPDEST POP PUSH2 0x5F6 SWAP3 SWAP2 POP PUSH2 0x5FA JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x5F6 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x5FB JUMP INVALID 0x4F PUSH24 0x6E61626C653A206D757374206265206E6577206F776E6572 KECCAK256 PUSH21 0x6F2070756C6CA26469706673582212206E4760DDC7 0xEA SWAP7 MOD 0xB9 0xBC SWAP5 DUP13 PUSH26 0xC2654A9A4F687BED2E792AA77485027C85DA9A64736F6C634300 SMOD SDIV STOP CALLER ",
"sourceMap": "302:1188:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;703:182:3;;;:::i;:::-;;1371:117:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1371:117:0;;-1:-1:-1;1371:117:0;-1:-1:-1;1371:117:0;:::i;434:27::-;;;;;;;;;;;;;;;;-1:-1:-1;434:27:0;;:::i;:::-;;;;-1:-1:-1;;;;;434:27:0;;;;;;;;;;;;;;891:164:3;;;;;;;;;;;;;;;;-1:-1:-1;891:164:3;-1:-1:-1;;;;;891:164:3;;:::i;389:39:0:-;;;:::i;1061:246:3:-;;;:::i;968:256:0:-;;;;;;;;;;;;;;;;-1:-1:-1;968:256:0;;;;:::i;491:86:3:-;;;:::i;703:182::-;622:6;;-1:-1:-1;;;;;622:6:3;632:10;622:20;614:65;;;;;-1:-1:-1;;;614:65:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;814:1:::1;798:6:::0;;782:35:::1;::::0;-1:-1:-1;;;;;798:6:3;;::::1;::::0;782:35:::1;::::0;814:1;;782:35:::1;844:1;827:19:::0;;-1:-1:-1;;;;;;827:19:3;;::::1;::::0;;;;856:22;;;;::::1;::::0;;703:182::o;1371:117:0:-;622:6:3;;-1:-1:-1;;;;;622:6:3;632:10;622:20;614:65;;;;;-1:-1:-1;;;614:65:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1457:24:0::1;:10;1470:11:::0;;1457:24:::1;:::i;:::-;;1371:117:::0;;:::o;434:27::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;434:27:0;;-1:-1:-1;434:27:0;:::o;891:164:3:-;622:6;;-1:-1:-1;;;;;622:6:3;632:10;622:20;614:65;;;;;-1:-1:-1;;;614:65:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;999:6:::1;::::0;;983:34:::1;::::0;-1:-1:-1;;;;;983:34:3;;::::1;::::0;999:6;::::1;::::0;983:34:::1;::::0;::::1;1027:9;:21:::0;;-1:-1:-1;;;;;;1027:21:3::1;-1:-1:-1::0;;;;;1027:21:3;;;::::1;::::0;;;::::1;::::0;;891:164::o;389:39:0:-;;;:::o;1061:246:3:-;1143:9;;-1:-1:-1;;;;;1143:9:3;1129:10;:23;1121:70;;;;-1:-1:-1;;;1121:70:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1230:9;;;1222:6;;1206:34;;-1:-1:-1;;;;;1230:9:3;;;;1222:6;;;;1206:34;;;1259:9;;;;1250:18;;-1:-1:-1;;;;;;1250:18:3;;;-1:-1:-1;;;;;1259:9:3;;1250:18;;;;1278:22;;;1061:246::o;968:256:0:-;1025:9;1020:104;1040:10;:17;1036:21;;1020:104;;;1089:10;1100:1;1089:13;;;;;;;;;;;;;;;;;1078:35;;;-1:-1:-1;;;1078:35:0;;;;-1:-1:-1;;;;;1089:13:0;;;;1078:33;;:35;;;;;;;;;;1089:13;;1078:35;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1059:3:0;;;;;-1:-1:-1;1020:104:0;;-1:-1:-1;1020:104:0;;;1137:9;1133:85;;;1162:45;;;-1:-1:-1;;;1162:45:0;;1202:4;1162:45;;;;;;-1:-1:-1;;;;;1178:14:0;1162:39;;;;:45;;;;;;;;;;;;;;;:39;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1133:85;968:256;:::o;491:86:3:-;538:7;564:6;-1:-1:-1;;;;;564:6:3;491:86;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;"
},
"gasEstimates": {
"creation": {
"codeDepositCost": "327800",
"executionCost": "infinite",
"totalCost": "infinite"
},
"external": {
"allocators(uint256)": "2015",
"harvest(bool)": "infinite",
"onsenAllocator()": "infinite",
"owner()": "1103",
"pullManagement()": "infinite",
"pushManagement(address)": "24334",
"renounceManagement()": "44993",
"updateAllocator(address[])": "infinite"
}
},
"methodIdentifiers": {
"allocators(uint256)": "241c57a2",
"harvest(bool)": "70a1903d",
"onsenAllocator()": "584c0514",
"owner()": "8da5cb5b",
"pullManagement()": "5a96ac0a",
"pushManagement(address)": "46f68ee9",
"renounceManagement()": "089208d8",
"updateAllocator(address[])": "08e17b13"
}
},
"abi": [
{
"inputs": [
{
"internalType": "address",
"name": "_onsenAllocator",
"type": "address"
},
{
"internalType": "address[]",
"name": "_allocators",
"type": "address[]"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "previousOwner",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "newOwner",
"type": "address"
}
],
"name": "OwnershipPulled",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "previousOwner",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "newOwner",
"type": "address"
}
],
"name": "OwnershipPushed",
"type": "event"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"name": "allocators",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bool",
"name": "_useOnsen",
"type": "bool"
}
],
"name": "harvest",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "onsenAllocator",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "owner",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "pullManagement",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "newOwner_",
"type": "address"
}
],
"name": "pushManagement",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "renounceManagement",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address[]",
"name": "_allocators",
"type": "address[]"
}
],
"name": "updateAllocator",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
}
]
}
{
"compiler": {
"version": "0.7.5+commit.eb77ed08"
},
"language": "Solidity",
"output": {
"abi": [
{
"inputs": [
{
"internalType": "address",
"name": "_onsenAllocator",
"type": "address"
},
{
"internalType": "address[]",
"name": "_allocators",
"type": "address[]"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "previousOwner",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "newOwner",
"type": "address"
}
],
"name": "OwnershipPulled",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "previousOwner",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "newOwner",
"type": "address"
}
],
"name": "OwnershipPushed",
"type": "event"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"name": "allocators",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bool",
"name": "_useOnsen",
"type": "bool"
}
],
"name": "harvest",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "onsenAllocator",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "owner",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "pullManagement",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "newOwner_",
"type": "address"
}
],
"name": "pushManagement",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "renounceManagement",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address[]",
"name": "_allocators",
"type": "address[]"
}
],
"name": "updateAllocator",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
}
],
"devdoc": {
"kind": "dev",
"methods": {
"harvest(bool)": {
"params": {
"_useOnsen": "bool"
}
},
"updateAllocator(address[])": {
"params": {
"_allocators": "address[]"
}
}
},
"version": 1
},
"userdoc": {
"kind": "user",
"methods": {
"harvest(bool)": {
"notice": "harvest rewards from allocators"
},
"updateAllocator(address[])": {
"notice": "update array of allocators"
}
},
"version": 1
}
},
"settings": {
"compilationTarget": {
"contracts/allocators/RewardHarvestor.sol": "RewardHarvester"
},
"evmVersion": "istanbul",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
},
"sources": {
"contracts/allocators/RewardHarvestor.sol": {
"keccak256": "0xe7f40137d3d70546d4fda62eb3be16fd816e73c6a71be1e5569cc4f97d04caf4",
"license": "AGPL-3.0-or-later",
"urls": [
"bzz-raw://8b856a8f5b0d255b1455b40a7471b24e8b8171c90b1644bfa4fc9d388f202746",
"dweb:/ipfs/QmQz1TnLQE7Qu5F8i4KnjTZxCuW4XWPSBtR5XioExNgzet"
]
},
"contracts/interfaces/IAllocator.sol": {
"keccak256": "0xbc2b714d83ad535b15e60dc5d1a99f3ac360783706b9cc0914ce248c3e9e8ead",
"license": "AGPL-3.0-or-later",
"urls": [
"bzz-raw://07974ec59f987852fc4681e9da7e40c0ebe19d74e5c241d020d86999d237a85e",
"dweb:/ipfs/QmZmGeFhsMjQr47CfrvRWnw8PuZdGWSoBK45MrxHHnBcJ6"
]
},
"contracts/interfaces/IOwnable.sol": {
"keccak256": "0x29d92f94f4517d948d3a314e89008ae96e189cc21d410d477ddfe3766e5d665a",
"license": "AGPL-3.0",
"urls": [
"bzz-raw://939c2fa81ad0f94c4c76754676f1db4340f1f1cba50cd20dbbb5a71be8945f65",
"dweb:/ipfs/QmQzo16egRWr1BGdPh9AML4G2q1qG57vK4ChMcddDbm1r5"
]
},
"contracts/types/Ownable.sol": {
"keccak256": "0xdc15639cf43a8a2a8b57e254bdf685527c257a2f94097ffd6ca041ffa483c6cc",
"license": "AGPL-3.0-or-later",
"urls": [
"bzz-raw://0dce6bf4b55625a0e07802131b643f63ae5763bfeae5a8fcc63352df4fa5df7e",
"dweb:/ipfs/Qme7MLRydxRaGiapUBiZYYZnYKyAcYXeJHYmk1gZvBfVxW"
]
}
},
"version": 1
}
// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity 0.7.5;
import "../libraries/Address.sol";
import "../libraries/SafeMath.sol";
import "../libraries/SafeERC20.sol";
import "../interfaces/IERC20.sol";
import "../interfaces/ITreasury.sol";
import "../interfaces/IAllocator.sol";
import "../types/AxodusAccessControlled.sol";
interface ICurve3Pool {
// add liquidity to Curve to receive back 3CRV tokens
function add_liquidity(
address _pool,
uint256[4] memory _deposit_amounts,
uint256 _min_mint_amount
) external returns (uint256);
// remove liquidity Curve liquidity to recieve back base token
function remove_liquidity_one_coin(
address _pool,
uint256 _burn_amount,
int128 i,
uint256 _min_amount
) external returns (uint256);
}
//main Convex contract(booster.sol) basic interface
interface IConvex {
//deposit into convex, receive a tokenized deposit. parameter to stake immediately
function deposit(
uint256 _pid,
uint256 _amount,
bool _stake
) external returns (bool);
}
//sample convex reward contracts interface
interface IConvexRewards {
//withdraw directly to curve LP token
function withdrawAndUnwrap(uint256 _amount, bool _claim) external returns (bool);
//claim rewards
function getReward() external returns (bool);
//get rewards for an address
function earned(address _account) external view returns (uint256);
}
/**
* Contract deploys reserves from treasury into the Convex lending pool,
* earning interest and $CVX.
*/
contract ConvexAllocator is AxodusAccessControlled {
/* ======== DEPENDENCIES ======== */
using SafeERC20 for IERC20;
using SafeMath for uint256;
/* ======== STRUCTS ======== */
struct TokenData {
address underlying;
address curveToken;
IConvexRewards rewardPool;
address[] rewardTokens;
int128 index;
uint256 deployed;
uint256 limit;
uint256 newLimit;
uint256 limitChangeTimelockEnd;
}
/* ======== STATE VARIABLES ======== */
// Convex deposit contract
IConvex internal immutable booster = IConvex(0xF403C135812408BFbE8713b5A23a04b3D48AAE31);
// Curve 3Pool
ICurve3Pool internal immutable curve3Pool = ICurve3Pool(0xA79828DF1850E8a3A3064576f380D90aECDD3359);
// Axodus Treasury
ITreasury internal treasury = ITreasury(0x9A315BdF513367C0377FB36545857d12e85813Ef);
// info for deposited tokens
mapping(address => TokenData) public tokenInfo;
// convex pid for token
mapping(address => uint256) public pidForReserve;
// total RFV deployed into lending pool
uint256 public totalValueDeployed;
// timelock to raise deployment limit
uint256 public immutable timelockInBlocks = 6600;
/* ======== CONSTRUCTOR ======== */
constructor(IAxodusAuthority _authority) AxodusAccessControlled(_authority) {}
/* ======== OPEN FUNCTIONS ======== */
/**
* @notice claims accrued CVX rewards for all tracked crvTokens
*/
function harvest(address[] memory tokens) external {
for (uint256 i; i < tokens.length; i++) {
TokenData memory tokenData = tokenInfo[tokens[i]];
address[] memory rewardTokens = tokenData.rewardTokens;
tokenData.rewardPool.getReward();
for (uint256 r = 0; r < rewardTokens.length; r++) {
uint256 balance = IERC20(rewardTokens[r]).balanceOf(address(this));
if (balance > 0) {
IERC20(rewardTokens[r]).safeTransfer(address(treasury), balance);
}
}
}
}
/* ======== POLICY FUNCTIONS ======== */
function updateTreasury() external onlyGuardian {
require(authority.vault() != address(0), "Zero address: Vault");
require(address(authority.vault()) != address(treasury), "No change");
treasury = ITreasury(authority.vault());
}
/**
* @notice withdraws asset from treasury, deposits asset into lending pool, then deposits crvToken into convex
*/
function deposit(
address token,
uint256 amount,
uint256[4] calldata amounts,
uint256 minAmount
) public onlyGuardian {
require(!exceedsLimit(token, amount), "Exceeds deployment limit");
address curveToken = tokenInfo[token].curveToken;
// retrieve amount of asset from treasury
treasury.manage(token, amount);
// account for deposit
uint256 value = treasury.tokenValue(token, amount);
accountingFor(token, amount, value, true);
// approve and deposit into curve
IERC20(token).approve(address(curve3Pool), amount);
uint256 curveAmount = curve3Pool.add_liquidity(curveToken, amounts, minAmount);
// approve and deposit into convex
IERC20(curveToken).approve(address(booster), curveAmount);
booster.deposit(pidForReserve[token], curveAmount, true);
}
/**
* @notice withdraws crvToken from convex, withdraws from lending pool, then deposits asset into treasury
*/
function withdraw(
address token,
uint256 amount,
uint256 minAmount,
bool reserve
) public onlyGuardian {
address curveToken = tokenInfo[token].curveToken;
// withdraw from convex
tokenInfo[token].rewardPool.withdrawAndUnwrap(amount, false);
// approve and withdraw from curve
IERC20(curveToken).approve(address(curve3Pool), amount);
curve3Pool.remove_liquidity_one_coin(curveToken, amount, tokenInfo[token].index, minAmount);
uint256 balance = IERC20(token).balanceOf(address(this));
// account for withdrawal
uint256 value = treasury.tokenValue(token, balance);
accountingFor(token, balance, value, false);
if (reserve) {
// approve and deposit asset into treasury
IERC20(token).approve(address(treasury), balance);
treasury.deposit(balance, token, value);
} else IERC20(token).safeTransfer(address(treasury), balance);
}
/**
* @notice adds asset and corresponding crvToken to mapping
*/
function addToken(
address token,
address curveToken,
address rewardPool,
address[] memory rewardTokens,
int128 index,
uint256 max,
uint256 pid
) external onlyGuardian {
require(token != address(0), "Zero address: Token");
require(curveToken != address(0), "Zero address: Curve Token");
require(tokenInfo[token].deployed == 0, "Token added");
tokenInfo[token] = TokenData({
underlying: token,
curveToken: curveToken,
rewardPool: IConvexRewards(rewardPool),
rewardTokens: rewardTokens,
index: index,
deployed: 0,
limit: max,
newLimit: 0,
limitChangeTimelockEnd: 0
});
pidForReserve[token] = pid;
}
/**
* @notice add new reward token to be harvested
*/
function addRewardTokens(address baseToken, address[] memory rewardTokens) external onlyGuardian {
tokenInfo[baseToken].rewardTokens = rewardTokens;
}
/**
* @notice lowers max can be deployed for asset (no timelock)
*/
function lowerLimit(address token, uint256 newMax) external onlyGuardian {
require(newMax < tokenInfo[token].limit, "Must be lower");
require(newMax > tokenInfo[token].deployed, "Greater than deployed");
tokenInfo[token].limit = newMax;
}
/**
* @notice starts timelock to raise max allocation for asset
*/
function queueRaiseLimit(address token, uint256 newMax) external onlyGuardian {
tokenInfo[token].limitChangeTimelockEnd = block.number.add(timelockInBlocks);
tokenInfo[token].newLimit = newMax;
}
/**
* @notice changes max allocation for asset when timelock elapsed
*/
function raiseLimit(address token) external onlyGuardian {
require(block.number >= tokenInfo[token].limitChangeTimelockEnd, "Timelock not expired");
require(tokenInfo[token].limitChangeTimelockEnd != 0, "Timelock not started");
tokenInfo[token].limit = tokenInfo[token].newLimit;
tokenInfo[token].newLimit = 0;
tokenInfo[token].limitChangeTimelockEnd = 0;
}
/* ======== INTERNAL FUNCTIONS ======== */
/**
* @notice accounting of deposits/withdrawals of assets
*/
function accountingFor(
address token,
uint256 amount,
uint256 value,
bool add
) internal {
if (add) {
tokenInfo[token].deployed = tokenInfo[token].deployed.add(amount); // track amount allocated into pool
totalValueDeployed = totalValueDeployed.add(value); // track total value allocated into pools
} else {
// track amount allocated into pool
if (amount < tokenInfo[token].deployed) {
tokenInfo[token].deployed = tokenInfo[token].deployed.sub(amount);
} else tokenInfo[token].deployed = 0;
// track total value allocated into pools
if (value < totalValueDeployed) {
totalValueDeployed = totalValueDeployed.sub(value);
} else totalValueDeployed = 0;
}
}
/* ======== VIEW FUNCTIONS ======== */
/**
* @notice query all pending rewards for a specific base token
*/
function rewardsPending(address baseToken) external view returns (uint256) {
return tokenInfo[baseToken].rewardPool.earned(address(this));
}
/**
* @notice checks to ensure deposit does not exceed max allocation for asset
*/
function exceedsLimit(address token, uint256 amount) public view returns (bool) {
uint256 willBeDeployed = tokenInfo[token].deployed.add(amount);
return (willBeDeployed > tokenInfo[token].limit);
}
}
// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity 0.7.5;
import "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol";
import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol";
import "../interfaces/ITreasury.sol";
import "../interfaces/IAllocator.sol";
import "../interfaces/IERC20.sol";
import "../libraries/SafeERC20.sol";
interface IveFXS is IERC20 {
/**
* @notice Deposit `_value` tokens for `msg.sender` and lock until `_unlock_time`
* @param _value Amount to deposit
* @param _unlock_time Epoch time when tokens unlock, rounded down to whole weeks
*/
function create_lock(uint256 _value, uint256 _unlock_time) external;
/**
* @notice Deposit `_value` additional tokens for `msg.sender` without modifying the unlock time
* @param _value Amount of tokens to deposit and add to the lock
*/
function increase_amount(uint256 _value) external;
/**
* @notice Extend the unlock time for `msg.sender` to `_unlock_time`
* @param _unlock_time New epoch time for unlocking
*/
function increase_unlock_time(uint256 _unlock_time) external;
/**
* @notice Get timestamp when `_addr`'s lock finishes
* @param _addr wallet address
* @return Epoch time of the lock end
*/
function locked__end(address _addr) external view returns (uint256);
}
interface IveFXSYieldDistributorV4 {
/**
* @notice transfers FXS earned by locking veFXS
* @return the amount of FXS transferred
*/
function getYield() external returns (uint256);
/**
* @notice returns the pending rewards for an address
*/
function earned(address _address) external view returns (uint256);
/* BELOW USED ONLY IN TESTS */
/**
* @notice forces an update of a user's rewards
*/
function checkpointOtherUser(address _address) external;
/**
* @notice requests FXS rewards to pulled from msg.sender
*/
function notifyRewardAmount(uint256 amount) external;
/**
* @notice allows an address to call notifyRewardAmount
*/
function toggleRewardNotifier(address notifier_addr) external;
/**
* @notice returns the number of seconds until a reward is fully distributed
*/
function yieldDuration() external returns (uint256);
}
contract FraxSharesAllocator is Initializable, OwnableUpgradeable {
using SafeERC20 for IERC20;
using SafeMathUpgradeable for uint256;
/* ======== STATE VARIABLES ======== */
/* !!!! UPGRADABLE CONTRACT !!!! */
/* NEW STATE VARIABLES MUST BE APPENDED TO END */
uint256 private constant MAX_TIME = 4 * 365 * 86400 + 1; // 4 years and 1 second
ITreasury public treasury;
IERC20 public fxs; // $FXS token
IveFXS public veFXS; // $veFXS token
IveFXSYieldDistributorV4 public veFXSYieldDistributorV4;
// uint256 public totalValueDeployed; // FXS isn't a reserve token, so will always be 0
uint256 public totalAmountDeployed;
uint256 public lockEnd; // tracks the expiry of veFXS to know if can be extended
/* ======== INITIALIZER ======== */
function initialize(
address _treasury,
address _fxs,
address _veFXS,
address _veFXSYieldDistributorV4
) public initializer {
__Context_init_unchained();
__Ownable_init_unchained();
require(_treasury != address(0), "zero treasury address");
treasury = ITreasury(_treasury);
require(_fxs != address(0), "zero FXS address");
fxs = IERC20(_fxs);
require(_veFXS != address(0), "zero veFXS address");
veFXS = IveFXS(_veFXS);
require(_veFXSYieldDistributorV4 != address(0), "zero veFXSYieldDistributorV4 address");
veFXSYieldDistributorV4 = IveFXSYieldDistributorV4(_veFXSYieldDistributorV4);
totalAmountDeployed = 0;
}
/* ======== POLICY FUNCTIONS ======== */
/**
* @notice harvest FXS rewards, will relock all veFXS for the maximum amount of time (4 years)
*/
function harvest() external {
uint256 amount = veFXSYieldDistributorV4.getYield();
if (amount > 0) {
totalAmountDeployed = totalAmountDeployed.add(amount);
fxs.safeApprove(address(veFXS), amount);
veFXS.increase_amount(amount);
if (_canExtendLock()) {
lockEnd = block.timestamp + MAX_TIME;
veFXS.increase_unlock_time(block.timestamp + MAX_TIME);
}
}
}
/**
* @notice withdraws FXS from treasury, locks as veFXS for maximum time (4 years).
* @param _amount uint
*/
function deposit(uint256 _amount) external onlyOwner {
treasury.manage(address(fxs), _amount);
uint256 prevAmount = totalAmountDeployed;
totalAmountDeployed = totalAmountDeployed.add(_amount);
fxs.safeApprove(address(veFXS), _amount);
if (prevAmount == 0) {
lockEnd = block.timestamp + MAX_TIME;
veFXS.create_lock(_amount, lockEnd);
} else {
veFXS.increase_amount(_amount);
if (_canExtendLock()) {
lockEnd = block.timestamp + MAX_TIME;
veFXS.increase_unlock_time(block.timestamp + MAX_TIME);
}
}
}
function setTreasury(address _treasury) external onlyOwner {
require(_treasury != address(0), "zero treasury address");
treasury = ITreasury(_treasury);
}
/* ======== VIEW FUNCTIONS ======== */
function getPendingRewards() public view returns (uint256) {
return veFXSYieldDistributorV4.earned(address(this));
}
function _canExtendLock() internal view returns (bool) {
return lockEnd < block.timestamp + MAX_TIME - 7 * 86400;
}
}
// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity >0.7.5;
import "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol";
import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
import "../interfaces/ITreasury.sol";
import "../interfaces/IERC20.sol";
import "./FraxSharesAllocator.sol";
/**
* @notice this allows us to test proxy upgrades
*/
contract FraxSharesAllocatorVNext is Initializable, OwnableUpgradeable {
/* ======== STATE VARIABLES ======== */
/* !!!! UPGRADABLE CONTRACT !!!! */
/* NEW STATE VARIABLES MUST BE APPENDED TO END */
uint256 private constant MAX_TIME = 4 * 365 * 86400 + 1; // 4 years and 1 second
ITreasury public treasury;
IERC20 public fxs; // $FXS token
IveFXS public veFXS; // $veFXS token
IveFXSYieldDistributorV4 public veFXSYieldDistributorV4;
// uint256 public totalValueDeployed; // FXS isn't a reserve token, so will always be 0
uint256 public totalAmountDeployed;
uint256 public lockEnd; // tracks the expiry of veFXS to know if can be extended
function didUpgrade() external pure returns (bool) {
return true;
}
}
// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity 0.7.5;
import "../libraries/Address.sol";
import "../libraries/SafeMath.sol";
import "../libraries/SafeERC20.sol";
import "../interfaces/IERC20.sol";
import "../interfaces/ITreasury.sol";
import "../interfaces/IAllocator.sol";
import "../types/Ownable.sol";
interface IGroDepositHandler {
// deposit DAI to Gro
function depositPwrd(
uint256[3] memory inAmounts,
uint256 minAmount,
address _referral
) external;
}
interface IGroWithdrawHandler {
// withdraw DAI from Gro
function withdrawAllSingle(
bool pwrd,
uint256 index,
uint256 minAmount
) external;
}
/**
* Contract deploys reserves from treasury into the Gro
*/
contract GroDAIAllocator is Ownable {
/* ======== DEPENDENCIES ======== */
using SafeERC20 for IERC20;
using SafeMath for uint256;
/* ======== STATE VARIABLES ======== */
IGroDepositHandler public immutable groDepositHandler; // GRO deposit handler
IGroWithdrawHandler public immutable groWithdrawHandler; // GRO withdraw handler
ITreasury public immutable treasury;
address public immutable DAI;
uint256 public totalValueDeployed; // total RFV deployed into lending pool
uint256 public deployed;
uint256 public limit;
uint256 public newLimit;
uint256 public limitChangeTimelockEnd;
uint256 public immutable timelockInBlocks; // timelock to raise deployment limit
/* ======== CONSTRUCTOR ======== */
constructor(
address _treasury,
address _groDepositHandler,
address _groWithdrawHandler,
address _DAI,
uint256 _timelockInBlocks,
uint256 _limit
) {
require(_treasury != address(0));
treasury = ITreasury(_treasury);
require(_groDepositHandler != address(0));
groDepositHandler = IGroDepositHandler(_groDepositHandler);
require(_groWithdrawHandler != address(0));
groWithdrawHandler = IGroWithdrawHandler(_groWithdrawHandler);
require(_DAI != address(0));
DAI = _DAI;
timelockInBlocks = _timelockInBlocks;
limit = _limit;
}
/* ======== POLICY FUNCTIONS ======== */
/**
* @notice withdraws asset from treasury, deposits asset into Gro
* @param amount uint
* @param minAmount uint
*/
function deposit(uint256 amount, uint256 minAmount) public onlyOwner {
require(!exceedsLimit(amount)); // ensure deposit is within bounds
treasury.manage(DAI, amount); // retrieve amount of asset from treasury
// account for deposit
uint256 value = treasury.tokenValue(DAI, amount);
accountingFor(amount, value, true);
IERC20(DAI).approve(address(groDepositHandler), amount); // approve Gro deposit handler to spend tokens
groDepositHandler.depositPwrd([amount, 0, 0], minAmount, address(0)); // deposit into Gro
}
/**
* @notice withdraws DAI from Gro, then deposits asset into treasury
* @param minAmount uint
*/
function withdraw(uint256 minAmount) public onlyOwner {
groWithdrawHandler.withdrawAllSingle(true, 0, minAmount); // withdraw from Gro
uint256 balance = IERC20(DAI).balanceOf(address(this)); // balance of asset withdrawn
// account for withdrawal
uint256 value = treasury.tokenValue(DAI, balance);
accountingFor(balance, value, false);
IERC20(DAI).approve(address(treasury), balance); // approve to deposit asset into treasury
treasury.deposit(balance, DAI, value); // deposit using value as profit so no AXDS is minted
}
/**
* @notice lowers max can be deployed for asset (no timelock)
* @param newMax uint
*/
function lowerLimit(uint256 newMax) external onlyOwner {
require(newMax < limit);
require(newMax > deployed); // cannot set limit below what has been deployed already
limit = newMax;
}
/**
* @notice starts timelock to raise max allocation for asset
* @param newMax uint
*/
function queueRaiseLimit(uint256 newMax) external onlyOwner {
limitChangeTimelockEnd = block.number.add(timelockInBlocks);
newLimit = newMax;
}
/**
* @notice changes max allocation for asset when timelock elapsed
*/
function raiseLimit() external onlyOwner {
require(block.number >= limitChangeTimelockEnd, "Timelock not expired");
require(limitChangeTimelockEnd != 0, "Timelock not started");
limit = newLimit;
newLimit = 0;
limitChangeTimelockEnd = 0;
}
/* ======== INTERNAL FUNCTIONS ======== */
/**
* @notice accounting of deposits/withdrawals of assets
* @param amount uint
* @param value uint
* @param add bool
*/
function accountingFor(
uint256 amount,
uint256 value,
bool add
) internal {
if (add) {
deployed = deployed.add(amount); // track amount allocated into pool
totalValueDeployed = totalValueDeployed.add(value); // track total value allocated into pools
} else {
// track amount allocated into pool
if (amount < deployed) {
deployed = deployed.sub(amount);
} else {
deployed = 0;
}
// track total value allocated into pools
if (value < totalValueDeployed) {
totalValueDeployed = totalValueDeployed.sub(value);
} else {
totalValueDeployed = 0;
}
}
}
/* ======== VIEW FUNCTIONS ======== */
/**
* @notice checks to ensure deposit does not exceed max allocation for asset
* @param amount uint
*/
function exceedsLimit(uint256 amount) public view returns (bool) {
uint256 willBeDeployed = deployed.add(amount);
return (willBeDeployed > limit);
}
}
// SPDX-License-Identifier: AGPL-3.0
pragma solidity >=0.7.5;
pragma abicoder v2;
/// @title Router token swapping functionality
/// @notice Functions for swapping tokens via Uniswap V3
interface ISwapRouter {
struct ExactInputSingleParams {
address tokenIn;
address tokenOut;
uint24 fee;
address recipient;
uint256 deadline;
uint256 amountIn;
uint256 amountOutMinimum;
uint160 sqrtPriceLimitX96;
}
/// @notice Swaps `amountIn` of one token for as much as possible of another token
/// @param params The parameters necessary for the swap, encoded as `ExactInputSingleParams` in calldata
/// @return amountOut The amount of the received token
function exactInputSingle(ExactInputSingleParams calldata params) external payable returns (uint256 amountOut);
struct ExactInputParams {
bytes path;
address recipient;
uint256 deadline;
uint256 amountIn;
uint256 amountOutMinimum;
}
/// @notice Swaps `amountIn` of one token for as much as possible of another along the specified path
/// @param params The parameters necessary for the multi-hop swap, encoded as `ExactInputParams` in calldata
/// @return amountOut The amount of the received token
function exactInput(ExactInputParams calldata params) external payable returns (uint256 amountOut);
struct ExactOutputSingleParams {
address tokenIn;
address tokenOut;
uint24 fee;
address recipient;
uint256 deadline;
uint256 amountOut;
uint256 amountInMaximum;
uint160 sqrtPriceLimitX96;
}
/// @notice Swaps as little as possible of one token for `amountOut` of another token
/// @param params The parameters necessary for the swap, encoded as `ExactOutputSingleParams` in calldata
/// @return amountIn The amount of the input token
function exactOutputSingle(ExactOutputSingleParams calldata params) external payable returns (uint256 amountIn);
struct ExactOutputParams {
bytes path;
address recipient;
uint256 deadline;
uint256 amountOut;
uint256 amountInMaximum;
}
/// @notice Swaps as little as possible of one token for `amountOut` of another along the specified path (reversed)
/// @param params The parameters necessary for the multi-hop swap, encoded as `ExactOutputParams` in calldata
/// @return amountIn The amount of the input token
function exactOutput(ExactOutputParams calldata params) external payable returns (uint256 amountIn);
}
// SPDX-License-Identifier: AGPL-3.0
pragma solidity >=0.7.5;
import "../../interfaces/IERC20.sol";
interface IWETH is IERC20 {
function deposit() external payable;
function withdraw(uint256) external;
}
//https://etherscan.io/address/0x66017D22b0f8556afDd19FC67041899Eb65a21bb
/*
* The Stability Pool holds LUSD tokens deposited by Stability Pool depositors.
*
* When a trove is liquidated, then depending on system conditions, some of its LUSD debt gets offset with
* LUSD in the Stability Pool: that is, the offset debt evaporates, and an equal amount of LUSD tokens in the Stability Pool is burned.
*
* Thus, a liquidation causes each depositor to receive a LUSD loss, in proportion to their deposit as a share of total deposits.
* They also receive an ETH gain, as the ETH collateral of the liquidated trove is distributed among Stability depositors,
* in the same proportion.
*
* When a liquidation occurs, it depletes every deposit by the same fraction: for example, a liquidation that depletes 40%
* of the total LUSD in the Stability Pool, depletes 40% of each deposit.
*
* A deposit that has experienced a series of liquidations is termed a "compounded deposit": each liquidation depletes the deposit,
* multiplying it by some factor in range ]0,1[
*
* Please see the implementation spec in the proof document, which closely follows on from the compounded deposit / ETH gain derivations:
* https://github.com/liquity/liquity/blob/master/papers/Scalable_Reward_Distribution_with_Compounding_Stakes.pdf
*
* --- LQTY ISSUANCE TO STABILITY POOL DEPOSITORS ---
*
* An LQTY issuance event occurs at every deposit operation, and every liquidation.
*
* Each deposit is tagged with the address of the front end through which it was made.
*
* All deposits earn a share of the issued LQTY in proportion to the deposit as a share of total deposits. The LQTY earned
* by a given deposit, is split between the depositor and the front end through which the deposit was made, based on the front end's kickbackRate.
*
* Please see the system Readme for an overview:
* https://github.com/liquity/dev/blob/main/README.md#lqty-issuance-to-stability-providers
*/
interface IStabilityPool {
// --- Functions ---
/*
* Initial checks:
* - Frontend is registered or zero address
* - Sender is not a registered frontend
* - _amount is not zero
* ---
* - Triggers a LQTY issuance, based on time passed since the last issuance. The LQTY issuance is shared between *all* depositors and front ends
* - Tags the deposit with the provided front end tag param, if it's a new deposit
* - Sends depositor's accumulated gains (LQTY, ETH) to depositor
* - Sends the tagged front end's accumulated LQTY gains to the tagged front end
* - Increases deposit and tagged front end's stake, and takes new snapshots for each.
*/
function provideToSP(uint256 _amount, address _frontEndTag) external;
/*
* Initial checks:
* - _amount is zero or there are no under collateralized troves left in the system
* - User has a non zero deposit
* ---
* - Triggers a LQTY issuance, based on time passed since the last issuance. The LQTY issuance is shared between *all* depositors and front ends
* - Removes the deposit's front end tag if it is a full withdrawal
* - Sends all depositor's accumulated gains (LQTY, ETH) to depositor
* - Sends the tagged front end's accumulated LQTY gains to the tagged front end
* - Decreases deposit and tagged front end's stake, and takes new snapshots for each.
*
* If _amount > userDeposit, the user withdraws all of their compounded deposit.
*/
function withdrawFromSP(uint256 _amount) external;
/*
* Initial checks:
* - User has a non zero deposit
* - User has an open trove
* - User has some ETH gain
* ---
* - Triggers a LQTY issuance, based on time passed since the last issuance. The LQTY issuance is shared between *all* depositors and front ends
* - Sends all depositor's LQTY gain to depositor
* - Sends all tagged front end's LQTY gain to the tagged front end
* - Transfers the depositor's entire ETH gain from the Stability Pool to the caller's trove
* - Leaves their compounded deposit in the Stability Pool
* - Updates snapshots for deposit and tagged front end stake
*/
function withdrawETHGainToTrove(address _upperHint, address _lowerHint) external;
/*
* Initial checks:
* - Frontend (sender) not already registered
* - User (sender) has no deposit
* - _kickbackRate is in the range [0, 100%]
* ---
* Front end makes a one-time selection of kickback rate upon registering
*/
function registerFrontEnd(uint256 _kickbackRate) external;
/*
* Initial checks:
* - Caller is TroveManager
* ---
* Cancels out the specified debt against the LUSD contained in the Stability Pool (as far as possible)
* and transfers the Trove's ETH collateral from ActivePool to StabilityPool.
* Only called by liquidation functions in the TroveManager.
*/
function offset(uint256 _debt, uint256 _coll) external;
/*
* Returns the total amount of ETH held by the pool, accounted in an internal variable instead of `balance`,
* to exclude edge cases like ETH received from a self-destruct.
*/
function getETH() external view returns (uint256);
/*
* Returns LUSD held in the pool. Changes when users deposit/withdraw, and when Trove debt is offset.
*/
function getTotalLUSDDeposits() external view returns (uint256);
/*
* Calculates the ETH gain earned by the deposit since its last snapshots were taken.
*/
function getDepositorETHGain(address _depositor) external view returns (uint256);
/*
* Calculate the LQTY gain earned by a deposit since its last snapshots were taken.
* If not tagged with a front end, the depositor gets a 100% cut of what their deposit earned.
* Otherwise, their cut of the deposit's earnings is equal to the kickbackRate, set by the front end through
* which they made their deposit.
*/
function getDepositorLQTYGain(address _depositor) external view returns (uint256);
/*
* Return the LQTY gain earned by the front end.
*/
function getFrontEndLQTYGain(address _frontEnd) external view returns (uint256);
/*
* Return the user's compounded deposit.
*/
function getCompoundedLUSDDeposit(address _depositor) external view returns (uint256);
/*
* Return the front end's compounded stake.
*
* The front end's compounded stake is equal to the sum of its depositors' compounded deposits.
*/
function getCompoundedFrontEndStake(address _frontEnd) external view returns (uint256);
}
//
interface ILQTYStaking {
/*
sends _LQTYAmount from the caller to the staking contract, and increases their stake.
If the caller already has a non-zero stake, it pays out their accumulated ETH and LUSD gains from staking.
*/
function stake(uint256 _LQTYamount) external;
/**
reduces the caller’s stake by _LQTYamount, up to a maximum of their entire stake.
It pays out their accumulated ETH and LUSD gains from staking.
*/
function unstake(uint256 _LQTYamount) external;
function getPendingETHGain(address _user) external view returns (uint256);
function getPendingLUSDGain(address _user) external view returns (uint256);
}
// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity ^0.8.10;
import "../libraries/SafeERC20.sol";
import "../interfaces/IERC20.sol";
import "../interfaces/IERC20Metadata.sol";
import "../interfaces/ITreasury.sol";
import "./interfaces/ISwapRouter.sol";
import "./interfaces/IWETH.sol";
import "./interfaces/LiquityInterfaces.sol";
import "../types/AxodusAccessControlled.sol";
/**
* Contract deploys reserves from treasury into the liquity stabilty pool, and those rewards
* are then paid out to the staking contract. See harvest() function for more details.
*/
contract LUSDAllocator is AxodusAccessControlled {
/* ======== DEPENDENCIES ======== */
using SafeERC20 for IERC20;
using SafeERC20 for IWETH;
event Deposit(address indexed dst, uint256 amount);
/* ======== STATE VARIABLES ======== */
IStabilityPool immutable lusdStabilityPool;
ILQTYStaking immutable lqtyStaking;
IWETH immutable weth; // WETH address (0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2)
ISwapRouter immutable swapRouter;
ITreasury public treasury; // Axodus Treasury
uint256 public constant FEE_PRECISION = 1e6;
uint256 public constant POOL_FEE_MAX = 10000;
/**
* @notice The target percent of eth to swap to LUSD at uniswap. divide by 1e6 to get actual value.
* Examples:
* 500000 => 500000 / 1e6 = 0.50 = 50%
* 330000 => 330000 / 1e6 = 0.33 = 33%
*/
uint256 public ethToLUSDRatio = 330000; // 33% of ETH to LUSD
/**
* @notice poolFee parameter for uniswap swaprouter, divide by 1e6 to get the actual value. See https://docs.uniswap.org/protocol/guides/swaps/multihop-swaps#calling-the-function-1
* Maximum allowed value is 10000 (1%)
* Examples:
* poolFee = 3000 => 3000 / 1e6 = 0.003 = 0.3%
* poolFee = 10000 => 10000 / 1e6 = 0.01 = 1.0%
*/
uint256 public poolFee = 3000; // Init the uniswap pool fee to 0.3%
address public hopTokenAddress; //Initially DAI, could potentially be USDC
// TODO(zx): I don't think we care about front-end because we're our own frontend.
address public frontEndAddress; // frontEndAddress for potential liquity rewards
address public lusdTokenAddress; // LUSD Address (0x5f98805A4E8be255a32880FDeC7F6728C6568bA0)
address public lqtyTokenAddress; // LQTY Address (0x6DEA81C8171D0bA574754EF6F8b412F2Ed88c54D) from https://github.com/liquity/dev/blob/a12f8b737d765bfee6e1bfcf8bf7ef155c814e1e/packages/contracts/mainnetDeployment/realDeploymentOutput/output14.txt#L61
uint256 public totalValueDeployed; // total RFV deployed into lending pool
uint256 public totalAmountDeployed; // Total amount of tokens deployed
/* ======== CONSTRUCTOR ======== */
constructor(
address _authority,
address _treasury,
address _lusdTokenAddress,
address _lqtyTokenAddress,
address _stabilityPool,
address _lqtyStaking,
address _frontEndAddress,
address _wethAddress,
address _hopTokenAddress,
address _uniswapV3Router
) AxodusAccessControlled(IAxodusAuthority(_authority)) {
treasury = ITreasury(_treasury);
lusdTokenAddress = _lusdTokenAddress;
lqtyTokenAddress = _lqtyTokenAddress;
lusdStabilityPool = IStabilityPool(_stabilityPool);
lqtyStaking = ILQTYStaking(_lqtyStaking);
frontEndAddress = _frontEndAddress; // address can be 0
weth = IWETH(_wethAddress);
hopTokenAddress = _hopTokenAddress; // address can be 0
swapRouter = ISwapRouter(_uniswapV3Router);
// infinite approve to save gas
weth.safeApprove(address(treasury), type(uint256).max);
weth.safeApprove(address(swapRouter), type(uint256).max);
IERC20(lusdTokenAddress).safeApprove(address(lusdStabilityPool), type(uint256).max);
IERC20(lusdTokenAddress).safeApprove(address(treasury), type(uint256).max);
IERC20(lqtyTokenAddress).safeApprove(address(treasury), type(uint256).max);
}
/**
StabilityPool::withdrawFromSP() and LQTYStaking::stake() will send ETH here, so capture and emit the event
*/
receive() external payable {
emit Deposit(msg.sender, msg.value);
}
/* ======== CONFIGURE FUNCTIONS for Guardian only ======== */
function setEthToLUSDRatio(uint256 _ethToLUSDRatio) external onlyGuardian {
require(_ethToLUSDRatio <= FEE_PRECISION, "Value must be between 0 and 1e6");
ethToLUSDRatio = _ethToLUSDRatio;
}
function setPoolFee(uint256 _poolFee) external onlyGuardian {
require(_poolFee <= POOL_FEE_MAX, "Value must be between 0 and 10000");
poolFee = _poolFee;
}
function setHopTokenAddress(address _hopTokenAddress) external onlyGuardian {
hopTokenAddress = _hopTokenAddress;
}
/**
* @notice setsFrontEndAddress for Stability pool rewards
* @param _frontEndAddress address
*/
function setFrontEndAddress(address _frontEndAddress) external onlyGuardian {
frontEndAddress = _frontEndAddress;
}
function updateTreasury() public onlyGuardian {
require(authority.vault() != address(0), "Zero address: Vault");
require(address(authority.vault()) != address(treasury), "No change");
treasury = ITreasury(authority.vault());
}
/* ======== OPEN FUNCTIONS ======== */
/**
* @notice claims LQTY & ETH Rewards. minETHLUSDRate minimum rate of when swapping ETH->LUSD. e.g. 3500 means we swap at a rate of 1 ETH for a minimum 3500 LUSD
1. Harvest from LUSD StabilityPool to get ETH+LQTY rewards
2. Stake LQTY rewards from #1. This txn will also give out any outstanding ETH+LUSD rewards from prior staking
3. If we have eth, convert to weth, then swap a percentage of it to LUSD. If swap successul then send all remaining WETH to treasury
4. Deposit LUSD from #2 and potentially #3 into StabilityPool
*/
function harvest(uint256 minETHLUSDRate) public onlyGuardian returns (bool) {
uint256 stabilityPoolEthRewards = getETHRewards();
uint256 stabilityPoolLqtyRewards = getLQTYRewards();
if (stabilityPoolEthRewards == 0 && stabilityPoolLqtyRewards == 0) {
return false;
}
// 1. Harvest from LUSD StabilityPool to get ETH+LQTY rewards
lusdStabilityPool.withdrawFromSP(0); //Passing 0 b/c we don't want to withdraw from the pool but harvest - see https://discord.com/channels/700620821198143498/818895484956835912/908031137010581594
// 2. Stake LQTY rewards from #1. This txn will also give out any outstanding ETH+LUSD rewards from prior staking
uint256 balanceLqty = IERC20(lqtyTokenAddress).balanceOf(address(this)); // LQTY balance received from stability pool
if (balanceLqty > 0) {
//Stake
lqtyStaking.stake(balanceLqty); //Stake LQTY, also receives any prior ETH+LUSD rewards from prior staking
}
// 3. If we have eth, convert to weth, then swap a percentage of it to LUSD. If swap successul then send all remaining WETH to treasury
uint256 ethBalance = address(this).balance; // Use total balance in case we have leftover from a prior failed attempt
bool swappedLUSDSuccessfully;
if (ethBalance > 0) {
// Wrap ETH to WETH
weth.deposit{value: ethBalance}();
uint256 wethBalance = weth.balanceOf(address(this)); //Base off of WETH balance in case we have leftover from a prior failed attempt
if (ethToLUSDRatio > 0) {
uint256 amountWethToSwap = (wethBalance * ethToLUSDRatio) / FEE_PRECISION;
uint256 amountLUSDMin = amountWethToSwap * minETHLUSDRate; //WETH and LUSD is 18 decimals
// From https://docs.uniswap.org/protocol/guides/swaps/multihop-swaps#calling-the-function-1
// Multiple pool swaps are encoded through bytes called a `path`. A path is a sequence of token addresses and poolFees that define the pools used in the swaps.
// The format for pool encoding is (tokenIn, fee, tokenOut/tokenIn, fee, tokenOut) where tokenIn/tokenOut parameter is the shared token across the pools.
// Since we are swapping WETH to DAI and then DAI to LUSD the path encoding is (WETH, 0.3%, DAI, 0.3%, LUSD).
ISwapRouter.ExactInputParams memory params = ISwapRouter.ExactInputParams({
path: abi.encodePacked(address(weth), poolFee, hopTokenAddress, poolFee, lusdTokenAddress),
recipient: address(this), //Send LUSD here
deadline: block.timestamp + 25, //25 blocks, at 12 seconds per block is 5 minutes
amountIn: amountWethToSwap,
amountOutMinimum: amountLUSDMin
});
// Executes the swap
if (swapRouter.exactInput(params) > 0) {
swappedLUSDSuccessfully = true;
}
}
}
if (ethToLUSDRatio == 0 || swappedLUSDSuccessfully) {
// If swap was successful (or if percent to swap is 0), send the remaining WETH to the treasury. Crucial check otherwise we'd send all our WETH to the treasury and not respect our desired percentage
// Get updated balance, send to treasury
uint256 wethBalance = weth.balanceOf(address(this));
if (wethBalance > 0) {
// transfer WETH to treasury
weth.safeTransfer(address(treasury), wethBalance);
}
}
// 4. Deposit LUSD from #2 and potentially #3 into StabilityPool
uint256 lusdBalance = IERC20(lusdTokenAddress).balanceOf(address(this));
if (lusdBalance > 0) {
_depositLUSD(lusdBalance);
}
return true;
}
/* ======== POLICY FUNCTIONS ======== */
/**
* @notice withdraws asset from treasury, deposits asset into stability pool
* @param amount uint
*/
function deposit(uint256 amount) external onlyGuardian {
treasury.manage(lusdTokenAddress, amount); // retrieve amount of asset from treasury
_depositLUSD(amount);
}
/**
* @notice withdraws from stability pool, and deposits asset into treasury
* @param token address
* @param amount uint
*/
function withdraw(address token, uint256 amount) external onlyGuardian {
require(
token == lusdTokenAddress || token == lqtyTokenAddress,
"token address does not match LUSD nor LQTY token"
);
if (token == lusdTokenAddress) {
lusdStabilityPool.withdrawFromSP(amount); // withdraw from SP
uint256 balance = IERC20(token).balanceOf(address(this)); // balance of asset received from stability pool
uint256 value = _tokenValue(token, balance); // treasury RFV calculator
_accountingFor(balance, value, false); // account for withdrawal
treasury.deposit(balance, token, value); // deposit using value as profit so no AXDS is minted
} else {
lqtyStaking.unstake(amount);
uint256 balance = IERC20(token).balanceOf(address(this)); // balance of asset received from stability pool
IERC20(token).safeTransfer(address(treasury), balance);
}
}
/* ======== INTERNAL FUNCTIONS ======== */
function _depositLUSD(uint256 amount) internal {
lusdStabilityPool.provideToSP(amount, frontEndAddress); //s either a front-end address OR 0x0
uint256 value = _tokenValue(lusdTokenAddress, amount); // treasury RFV calculator
_accountingFor(amount, value, true); // account for deposit
}
/**
* @notice accounting of deposits/withdrawals of assets
* @param amount uint
* @param value uint
* @param add bool
*/
function _accountingFor(
uint256 amount,
uint256 value,
bool add
) internal {
if (add) {
totalAmountDeployed = totalAmountDeployed + amount;
totalValueDeployed = totalValueDeployed + value; // track total value allocated into pools
} else {
// track total value allocated into pools
if (amount < totalAmountDeployed) {
totalAmountDeployed = totalAmountDeployed - amount;
} else {
totalAmountDeployed = 0;
}
if (value < totalValueDeployed) {
totalValueDeployed = totalValueDeployed - value;
} else {
totalValueDeployed = 0;
}
}
}
/**
Helper method copying AxodusTreasury::_tokenValue(), whose name was 'valueOf()' in v1
Implemented here so we don't have to upgrade contract later
*/
function _tokenValue(address _token, uint256 _amount) internal view returns (uint256 value_) {
value_ = (_amount * (10**9)) / (10**IERC20Metadata(_token).decimals());
return value_;
}
/* ======== VIEW FUNCTIONS ======== */
/**
* @notice get ETH rewards from SP
* @return uint
*/
function getETHRewards() public view returns (uint256) {
return lusdStabilityPool.getDepositorETHGain(address(this));
}
/**
* @notice get LQTY rewards from SP
* @return uint
*/
function getLQTYRewards() public view returns (uint256) {
return lusdStabilityPool.getDepositorLQTYGain(address(this));
}
}
// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity ^0.8.10;
import "../libraries/SafeERC20.sol";
import "../interfaces/IERC20.sol";
import "../interfaces/ITreasury.sol";
import "../types/AxodusAccessControlled.sol";
interface IStaking {
function stake(uint256 _amount, address _recipient) external returns (bool);
function unstake(uint256 _amount, bool _trigger) external;
function claim(address _recipient) external;
}
/// @title Meta Governance Allocator
/// @author Axodus
/// @notice Manages BTRFLY or LOBI from treasury to stake back to treasury
contract MetaGovernanceAllocator is AxodusAccessControlled {
using SafeERC20 for IERC20;
/// @notice Axodus Treasury
ITreasury internal treasury = ITreasury(0x9A315BdF513367C0377FB36545857d12e85813Ef);
/// @notice BTRFLY token address
address internal immutable BTRFLY = 0xC0d4Ceb216B3BA9C3701B291766fDCbA977ceC3A;
/// @notice Staked BTRFLY token address
address internal immutable xBTRFLY = 0xCC94Faf235cC5D3Bf4bEd3a30db5984306c86aBC;
/// @notice Redacted staking contract
address internal immutable redactedStaking = 0xBdE4Dfb0dbb0Dd8833eFb6C5BD0Ce048C852C487;
/// @notice LOBI token address
address internal immutable LOBI = 0xDEc41Db0c33F3F6f3cb615449C311ba22D418A8d;
/// @notice Staked LOBI token address
address internal immutable sLOBI = 0x8Ab17e2cd4F894F8641A31f99F673a5762F53c8e;
/// @notice LOBI Staking contract
address internal immutable lobiStaking = 0x3818eff63418e0a0BA3980ABA5fF388b029b6d90;
/// CONSTRUCTOR ///
/// @param _authority Address of the Axodus Authority contract
constructor(IAxodusAuthority _authority) AxodusAccessControlled(_authority) {}
/// POLICY FUNCTIONS ///
/// @notice If vault has been updated through authority contract update treasury address
function updateTreasury() external onlyGuardian {
require(authority.vault() != address(0), "Zero address: Vault");
require(address(authority.vault()) != address(treasury), "No change");
treasury = ITreasury(authority.vault());
}
/// @notice Stakes either BTRFLY or LOBI from treasury
/// @param _redacted Bool if staking to redacted or lobi
/// @param _amount Amount of token that will be withdrawn from treasury and staked
function stake(bool _redacted, uint256 _amount) external onlyGuardian {
(address staking, address token, ) = _redactedOrLobi(_redacted);
// retrieve amount of token from treasury
treasury.manage(token, _amount);
// approve token to be spent by staking
IERC20(token).approve(staking, _amount);
// stake token to treasury
IStaking(staking).stake(_amount, address(treasury));
// claim stake for treasury
IStaking(staking).claim(address(treasury));
}
/// @notice Unstakes either BTRFLY or LOBI from treasury
/// @param _redacted Bool if unstakiung to redacted or lobi
/// @param _amount Amount of token that will be withdrawn from treasury and unstaked
function unstake(bool _redacted, uint256 _amount) external onlyGuardian {
(address staking, address token, address stakedToken) = _redactedOrLobi(_redacted);
// retrieve amount of staked token from treasury
treasury.manage(stakedToken, _amount);
// approve staked token to be spent by staking contract
IERC20(stakedToken).approve(staking, _amount);
// unstake token
IStaking(staking).unstake(_amount, false);
// send token back to treasury
IERC20(token).safeTransfer(address(treasury), _amount);
}
/// INTERNAL VIEW FUNCTIONS ///
/// @notice Returns addresses depending on wanting to interact with redacted or lobi
/// @param _redacted Bool if address for redacted or lobi
/// @return staking Address of staking contract
/// @return token Address of native token
/// @return stakedToken Address of staked token
function _redactedOrLobi(bool _redacted)
internal
view
returns (
address staking,
address token,
address stakedToken
)
{
if (_redacted) {
staking = redactedStaking;
token = BTRFLY;
stakedToken = xBTRFLY;
} else {
staking = lobiStaking;
token = LOBI;
stakedToken = sLOBI;
}
}
}
// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity 0.7.5;
import "../libraries/Address.sol";
import "../libraries/SafeMath.sol";
import "../libraries/SafeERC20.sol";
import "../interfaces/IERC20.sol";
import "../interfaces/ITreasury.sol";
import "../interfaces/IAllocator.sol";
import "../types/Ownable.sol";
interface IMasterChef {
function pendingSushi(uint256 _pid, address _user) external view returns (uint256);
function deposit(uint256 _pid, uint256 _amount) external;
function withdraw(uint256 _pid, uint256 _amount) external;
function emergencyWithdraw(uint256 _pid) external;
}
interface ISushiBar {
function enter(uint256 _amount) external;
function leave(uint256 _share) external;
}
/**
* Contract deploys liquidity from treasury into the Onsen program,
* earning $SUSHI that can be staked and/or deposited into the treasury.
*/
contract OnsenAllocator is Ownable {
/* ========== DEPENDENCIES ========== */
using SafeERC20 for IERC20;
using SafeMath for uint256;
/* ========== STATE VARIABLES ========== */
uint256[] public pids; // Pool IDs
mapping(uint256 => address) public pools; // Pool Addresses index by PID
address immutable sushi; // $SUSHI token
address immutable xSushi; // $xSUSHI token
address immutable masterChef; // Onsen contract
address immutable treasury; // Axodus Treasury
uint256 public totalValueDeployed; // Total RFV deployed
/* ========== CONSTRUCTOR ========== */
constructor(
address _chef,
address _treasury,
address _sushi,
address _xSushi
) {
require(_chef != address(0));
masterChef = _chef;
require(_treasury != address(0));
treasury = _treasury;
require(_sushi != address(0));
sushi = _sushi;
require(_xSushi != address(0));
xSushi = _xSushi;
}
/* ========== OPEN FUNCTIONS ========== */
/**
* @notice harvest Onsen rewards from all pools
* @param _stake bool
*/
function harvest(bool _stake) external {
for (uint256 i = 0; i < pids.length; i++) {
uint256 pid = pids[i];
if (pid != 0) {
// pid of 0 is invalid
IMasterChef(masterChef).withdraw(pid, 0); // withdrawing 0 harvests rewards
}
}
enterSushiBar(_stake);
}
/* ========== INTERNAL FUNCTIONS ========== */
/**
* @notice stake sushi rewards if enter is true. return funds to treasury.
* @param _stake bool
*/
function enterSushiBar(bool _stake) internal {
uint256 balance = IERC20(sushi).balanceOf(address(this));
if (balance > 0) {
if (!_stake) {
IERC20(sushi).safeTransfer(treasury, balance); // transfer sushi to treasury
} else {
IERC20(sushi).approve(xSushi, balance);
ISushiBar(xSushi).enter(balance); // stake sushi
uint256 xBalance = IERC20(xSushi).balanceOf(address(this));
IERC20(xSushi).safeTransfer(treasury, xBalance); // transfer xSushi to treasury
}
}
}
/* ========== VIEW FUNCTIONS ========== */
/**
* @notice pending $SUSHI rewards
* @return uint
*/
function pendingSushi() external view returns (uint256) {
uint256 pending;
for (uint256 i = 0; i < pids.length; i++) {
uint256 pid = pids[i];
if (pid != 0) {
pending = pending.add(IMasterChef(masterChef).pendingSushi(pid, address(this)));
}
}
return pending;
}
/* ========== POLICY FUNCTIONS ========== */
/**
* @notice deposit LP from treasury to Onsen and collect rewards
* @param _amount uint
* @param _stake bool
*/
function deposit(
uint256 _pid,
uint256 _amount,
bool _stake
) external onlyOwner {
address LP = pools[_pid];
require(LP != address(0));
ITreasury(treasury).manage(LP, _amount); // retrieve LP from treasury
IERC20(LP).approve(masterChef, _amount);
IMasterChef(masterChef).deposit(_pid, _amount); // deposit into Onsen
uint256 value = ITreasury(treasury).tokenValue(LP, _amount);
totalValueDeployed = totalValueDeployed.add(value); // add to deployed value tracker
enterSushiBar(_stake); // manage rewards
}
/**
* @notice collect rewards and withdraw LP from Onsen and return to treasury.
* @param _amount uint
* @param _stake bool
*/
function withdraw(
uint256 _pid,
uint256 _amount,
bool _stake
) external onlyOwner {
address LP = pools[_pid];
require(LP != address(0));
IMasterChef(masterChef).withdraw(_pid, _amount); // withdraw from Onsen
uint256 value = ITreasury(treasury).tokenValue(LP, _amount);
// remove from deployed value tracker
if (value < totalValueDeployed) {
totalValueDeployed = totalValueDeployed.sub(value);
} else {
// LP value grows from fees and may exceed total deployed
totalValueDeployed = 0;
}
// approve and deposit LP into treasury
IERC20(LP).approve(treasury, _amount);
// use value for profit so that no AXDS is minted
ITreasury(treasury).deposit(_amount, LP, value);
enterSushiBar(_stake); // manage rewards
}
/**
* @notice withdraw Sushi from treasury and stake to xSushi
* @param _amount uint
*/
function enterSushiBarFromTreasury(uint256 _amount) external onlyOwner {
ITreasury(treasury).manage(sushi, _amount); // retrieve $SUSHI from treasury
enterSushiBar(true); // stake $SUSHI
}
/**
* @notice withdraw xSushi from treasury and unstake to sushi
* @param _amount uint
*/
function exitSushiBar(uint256 _amount) external onlyOwner {
ITreasury(treasury).manage(xSushi, _amount); // retrieve $xSUSHI from treasury
ISushiBar(xSushi).leave(_amount); // unstake $xSUSHI
IERC20(sushi).safeTransfer(treasury, IERC20(sushi).balanceOf(address(this))); // return $SUSHI to treasury
}
/**
* @notice add new PID and corresponding liquidity pool
* @param _pool address
* @param _pid uint
*/
function addPool(address _pool, uint256 _pid) external onlyOwner {
require(_pool != address(0));
require(pools[_pid] == address(0));
pids.push(_pid);
pools[_pid] = _pool;
}
/**
* @notice remove liquidity pool and corresponding PID
* @param _pool address
* @param _index uint
*/
function removePool(address _pool, uint256 _index) external onlyOwner {
uint256 pid = pids[_index];
require(pools[pid] == _pool);
pids[_index] = 0;
pools[pid] = address(0);
}
/**
* @notice withdraw liquidity without regard for rewards
* @param _pid uint
*/
function emergencyWithdraw(uint256 _pid) external onlyOwner {
address LP = pools[_pid];
IMasterChef(masterChef).emergencyWithdraw(_pid); // withdraws LP without returning rewards
uint256 balance = IERC20(LP).balanceOf(address(this));
uint256 value = ITreasury(treasury).tokenValue(LP, balance);
if (value < totalValueDeployed) {
totalValueDeployed = totalValueDeployed.sub(value); // remove from value deployed tracker
} else {
// value increases with fees and would otherwise cause underflow
totalValueDeployed = 0;
}
// approve and deposit LP into treasury
IERC20(LP).approve(treasury, balance);
// use value for profit so that no AXDS is minted
ITreasury(treasury).deposit(balance, LP, value);
}
}
// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity 0.7.5;
import "../interfaces/IAllocator.sol";
import "../types/Ownable.sol";
interface IOnsenAllocator {
function harvest(bool _stake) external;
}
// @notice contract will claim rewards from multiple allocators in one function call
contract RewardHarvester is Ownable {
/* ======== STATE VARIABLES ======== */
address public immutable onsenAllocator;
address[] public allocators;
/* ======== CONSTRUCTOR ======== */
constructor(address _onsenAllocator, address[] memory _allocators) {
require(_onsenAllocator != address(0));
onsenAllocator = _onsenAllocator;
for (uint256 i; i < _allocators.length; i++) {
require(_allocators[i] != address(0));
}
allocators = _allocators;
}
/* ======== PUBLIC FUNCTION ======== */
/**
* @notice harvest rewards from allocators
* @param _useOnsen bool
*/
function harvest(bool _useOnsen) external {
for (uint256 i; i < allocators.length; i++) {
IAllocator(allocators[i]).harvest();
}
if (_useOnsen) {
IOnsenAllocator(onsenAllocator).harvest(true);
}
}
/* ======== POLICY FUNCTION ======== */
/**
* @notice update array of allocators
* @param _allocators address[]
*/
function updateAllocator(address[] calldata _allocators) external onlyOwner {
allocators = _allocators;
}
}
{
"deploy": {
"VM:-": {
"linkReferences": {},
"autoDeployLib": true
},
"main:1": {
"linkReferences": {},
"autoDeployLib": true
},
"ropsten:3": {
"linkReferences": {},
"autoDeployLib": true
},
"rinkeby:4": {
"linkReferences": {},
"autoDeployLib": true
},
"kovan:42": {
"linkReferences": {},
"autoDeployLib": true
},
"görli:5": {
"linkReferences": {},
"autoDeployLib": true
},
"Custom": {
"linkReferences": {},
"autoDeployLib": true
}
},
"data": {
"bytecode": {
"generatedSources": [],
"linkReferences": {},
"object": "60c0604052600c60808190526b15539055551213d49256915160a21b60a090815261002d9160009190610241565b5034801561003a57600080fd5b506040516110353803806110358339818101604052608081101561005d57600080fd5b5080516020820151604080840151606090940151600180546001600160a01b0319163090811790915591519394929390919081907f2f658b440c35314f52658ea8a740e05b284cdc84dc9ae01e891f21b8933e7cad90600090a250600280546001600160a01b038087166001600160a01b031990921691909117918290556040805160018152905192909116916000917f4f337dcbb2512f18373c1f72d990a2f0a6ee5024b04007c52afd01eb73374a89919081900360200190a3600380546001600160a01b038086166001600160a01b031990921691909117918290556040805160018152905192909116916000917fde655975891e8f09671597b37bd4d663bcc5c21dc6d7641b33cdf85fbe15d08b919081900360200190a3600480546001600160a01b038085166001600160a01b031990921691909117918290556040805160018152905192909116916000917f90a5902a45c24aae553d5aff384ca16d6560f08d74c9784a4fbd2796d9e13f2b919081900360200190a3600580546001600160a01b038084166001600160a01b031990921691909117918290556040805160018152905192909116916000917f05a80f5053574d6a62733e1692e8cbcfaf927dc82df0a7267ea2e489a7cc18ff919081900360200190a3505050506102e2565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928261027757600085556102bd565b82601f1061029057805160ff19168380011785556102bd565b828001600101855582156102bd579182015b828111156102bd5782518255916020019190600101906102a2565b506102c99291506102cd565b5090565b5b808211156102c957600081556001016102ce565b610d44806102f16000396000f3fe608060405234801561001057600080fd5b50600436106101165760003560e01c80635beede08116100a25780638fd20577116100715780638fd2057714610257578063be11f1dd1461025f578063bf7e214f14610267578063d8a042121461026f578063fbfa77cf1461027757610116565b80635beede08146101f35780636fe72c14146101fb5780637a9e5e4b1461022957806388aaf0c81461024f57610116565b8063215e92bc116100e9578063215e92bc1461017f5780633bf90c2814610187578063452a93201461018f578063527596941461019757806354e3d703146101c557610116565b80630505c8c91461011b5780630c340a241461013f57806319859847146101475780631afe87141461014f575b600080fd5b61012361027f565b604080516001600160a01b039092168252519081900360200190f35b61012361028e565b61012361029d565b61017d6004803603604081101561016557600080fd5b506001600160a01b03813516906020013515156102ac565b005b61017d61045d565b61012361050b565b61012361051a565b61017d600480360360408110156101ad57600080fd5b506001600160a01b0381351690602001351515610529565b61017d600480360360408110156101db57600080fd5b506001600160a01b03813516906020013515156106a0565b61017d610817565b61017d6004803603604081101561021157600080fd5b506001600160a01b03813516906020013515156108c6565b61017d6004803603602081101561023f57600080fd5b50356001600160a01b0316610a3d565b610123610b73565b610123610b82565b61017d610b91565b610123610c3f565b61017d610c4e565b610123610cff565b6004546001600160a01b031681565b6002546001600160a01b031681565b6007546001600160a01b031681565b600160009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b1580156102fa57600080fd5b505afa15801561030e573d6000803e3d6000fd5b505050506040513d602081101561032457600080fd5b50516000906001600160a01b031633146103d15760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156103c25780601f10610397576101008083540402835291602001916103c2565b820191906000526020600020905b8154815290600101906020018083116103a557829003601f168201915b50509250505060405180910390fd5b5080156103f457600380546001600160a01b0319166001600160a01b0384161790555b600780546001600160a01b038085166001600160a01b0319909216919091179182905560035460408051851515815290519383169391909216917fde655975891e8f09671597b37bd4d663bcc5c21dc6d7641b33cdf85fbe15d08b919081900360200190a35050565b6009546001600160a01b031633146104a8576040805162461bcd60e51b8152602060048201526009602482015268085b995dd5985d5b1d60ba1b604482015290519081900360640190fd5b6009546005546040516001600160a01b0392831692909116907f3d08e01e3b8340be6ca709db7a9321448661a1f490da4d7f3eb03d84fe73095390600090a3600954600580546001600160a01b0319166001600160a01b03909216919091179055565b6008546001600160a01b031681565b6003546001600160a01b031681565b600160009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561057757600080fd5b505afa15801561058b573d6000803e3d6000fd5b505050506040513d60208110156105a157600080fd5b50516000906001600160a01b031633146106145760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156103c25780601f10610397576101008083540402835291602001916103c2565b50801561063757600280546001600160a01b0319166001600160a01b0384161790555b600680546001600160a01b038085166001600160a01b0319909216919091179182905560025460408051851515815290519383169391909216917f4f337dcbb2512f18373c1f72d990a2f0a6ee5024b04007c52afd01eb73374a89919081900360200190a35050565b600160009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b1580156106ee57600080fd5b505afa158015610702573d6000803e3d6000fd5b505050506040513d602081101561071857600080fd5b50516000906001600160a01b0316331461078b5760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156103c25780601f10610397576101008083540402835291602001916103c2565b5080156107ae57600480546001600160a01b0319166001600160a01b0384161790555b600880546001600160a01b038085166001600160a01b0319909216919091179182905560045460408051851515815290519383169391909216917f90a5902a45c24aae553d5aff384ca16d6560f08d74c9784a4fbd2796d9e13f2b919081900360200190a35050565b6008546001600160a01b03163314610863576040805162461bcd60e51b815260206004820152600a602482015269216e6577506f6c69637960b01b604482015290519081900360640190fd5b6008546004546040516001600160a01b0392831692909116907f64d2fa522b403ca222efff0c7ad07d2ef45472a45e5770918bdfa9a2845d29a890600090a3600854600480546001600160a01b0319166001600160a01b03909216919091179055565b600160009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561091457600080fd5b505afa158015610928573d6000803e3d6000fd5b505050506040513d602081101561093e57600080fd5b50516000906001600160a01b031633146109b15760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156103c25780601f10610397576101008083540402835291602001916103c2565b5080156109d457600580546001600160a01b0319166001600160a01b0384161790555b600980546001600160a01b038085166001600160a01b0319909216919091179182905560055460408051851515815290519383169391909216917f05a80f5053574d6a62733e1692e8cbcfaf927dc82df0a7267ea2e489a7cc18ff919081900360200190a35050565b600160009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b158015610a8b57600080fd5b505afa158015610a9f573d6000803e3d6000fd5b505050506040513d6020811015610ab557600080fd5b50516000906001600160a01b03163314610b285760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156103c25780601f10610397576101008083540402835291602001916103c2565b50600180546001600160a01b0319166001600160a01b0383169081179091556040517f2f658b440c35314f52658ea8a740e05b284cdc84dc9ae01e891f21b8933e7cad90600090a250565b6009546001600160a01b031681565b6006546001600160a01b031681565b6007546001600160a01b03163314610bdc576040805162461bcd60e51b8152602060048201526009602482015268085b995dd1dd585c9960ba1b604482015290519081900360640190fd5b6007546003546040516001600160a01b0392831692909116907f0960fb9900fb8096216606c4f7fc2fce5d08cc0c82da55cec8619b66b523848190600090a3600754600380546001600160a01b0319166001600160a01b03909216919091179055565b6001546001600160a01b031681565b6006546001600160a01b03163314610c9c576040805162461bcd60e51b815260206004820152600c60248201526b10b732bba3b7bb32b93737b960a11b604482015290519081900360640190fd5b6006546002546040516001600160a01b0392831692909116907fffd6fed33fe8ec1016718bdd5d04ae6fecd9aba0da6578807daaaa7fc3d1682690600090a3600654600280546001600160a01b0319166001600160a01b03909216919091179055565b6005546001600160a01b03168156fea26469706673582212204699385b99a7551fbcdd5c88fadbc1fa13ce92d6ad2ddb8c835162b2100555d964736f6c63430007060033",
"opcodes": "PUSH1 0xC0 PUSH1 0x40 MSTORE PUSH1 0xC PUSH1 0x80 DUP2 SWAP1 MSTORE PUSH12 0x15539055551213D492569151 PUSH1 0xA2 SHL PUSH1 0xA0 SWAP1 DUP2 MSTORE PUSH2 0x2D SWAP2 PUSH1 0x0 SWAP2 SWAP1 PUSH2 0x241 JUMP JUMPDEST POP CALLVALUE DUP1 ISZERO PUSH2 0x3A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH2 0x1035 CODESIZE SUB DUP1 PUSH2 0x1035 DUP4 CODECOPY DUP2 DUP2 ADD PUSH1 0x40 MSTORE PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x5D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP1 MLOAD PUSH1 0x20 DUP3 ADD MLOAD PUSH1 0x40 DUP1 DUP5 ADD MLOAD PUSH1 0x60 SWAP1 SWAP5 ADD MLOAD PUSH1 0x1 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND ADDRESS SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE SWAP2 MLOAD SWAP4 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 SWAP1 DUP2 SWAP1 PUSH32 0x2F658B440C35314F52658EA8A740E05B284CDC84DC9AE01E891F21B8933E7CAD SWAP1 PUSH1 0x0 SWAP1 LOG2 POP PUSH1 0x2 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP8 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP2 DUP3 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 DUP2 MSTORE SWAP1 MLOAD SWAP3 SWAP1 SWAP2 AND SWAP2 PUSH1 0x0 SWAP2 PUSH32 0x4F337DCBB2512F18373C1F72D990A2F0A6EE5024B04007C52AFD01EB73374A89 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 PUSH1 0x3 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP7 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP2 DUP3 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 DUP2 MSTORE SWAP1 MLOAD SWAP3 SWAP1 SWAP2 AND SWAP2 PUSH1 0x0 SWAP2 PUSH32 0xDE655975891E8F09671597B37BD4D663BCC5C21DC6D7641B33CDF85FBE15D08B SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 PUSH1 0x4 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP2 DUP3 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 DUP2 MSTORE SWAP1 MLOAD SWAP3 SWAP1 SWAP2 AND SWAP2 PUSH1 0x0 SWAP2 PUSH32 0x90A5902A45C24AAE553D5AFF384CA16D6560F08D74C9784A4FBD2796D9E13F2B SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 PUSH1 0x5 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP2 DUP3 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 DUP2 MSTORE SWAP1 MLOAD SWAP3 SWAP1 SWAP2 AND SWAP2 PUSH1 0x0 SWAP2 PUSH32 0x5A80F5053574D6A62733E1692E8CBCFAF927DC82DF0A7267EA2E489A7CC18FF SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 POP POP POP POP PUSH2 0x2E2 JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH2 0x277 JUMPI PUSH1 0x0 DUP6 SSTORE PUSH2 0x2BD JUMP JUMPDEST DUP3 PUSH1 0x1F LT PUSH2 0x290 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0x2BD JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x2BD JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x2BD JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x2A2 JUMP JUMPDEST POP PUSH2 0x2C9 SWAP3 SWAP2 POP PUSH2 0x2CD JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x2C9 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x2CE JUMP JUMPDEST PUSH2 0xD44 DUP1 PUSH2 0x2F1 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x116 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x5BEEDE08 GT PUSH2 0xA2 JUMPI DUP1 PUSH4 0x8FD20577 GT PUSH2 0x71 JUMPI DUP1 PUSH4 0x8FD20577 EQ PUSH2 0x257 JUMPI DUP1 PUSH4 0xBE11F1DD EQ PUSH2 0x25F JUMPI DUP1 PUSH4 0xBF7E214F EQ PUSH2 0x267 JUMPI DUP1 PUSH4 0xD8A04212 EQ PUSH2 0x26F JUMPI DUP1 PUSH4 0xFBFA77CF EQ PUSH2 0x277 JUMPI PUSH2 0x116 JUMP JUMPDEST DUP1 PUSH4 0x5BEEDE08 EQ PUSH2 0x1F3 JUMPI DUP1 PUSH4 0x6FE72C14 EQ PUSH2 0x1FB JUMPI DUP1 PUSH4 0x7A9E5E4B EQ PUSH2 0x229 JUMPI DUP1 PUSH4 0x88AAF0C8 EQ PUSH2 0x24F JUMPI PUSH2 0x116 JUMP JUMPDEST DUP1 PUSH4 0x215E92BC GT PUSH2 0xE9 JUMPI DUP1 PUSH4 0x215E92BC EQ PUSH2 0x17F JUMPI DUP1 PUSH4 0x3BF90C28 EQ PUSH2 0x187 JUMPI DUP1 PUSH4 0x452A9320 EQ PUSH2 0x18F JUMPI DUP1 PUSH4 0x52759694 EQ PUSH2 0x197 JUMPI DUP1 PUSH4 0x54E3D703 EQ PUSH2 0x1C5 JUMPI PUSH2 0x116 JUMP JUMPDEST DUP1 PUSH4 0x505C8C9 EQ PUSH2 0x11B JUMPI DUP1 PUSH4 0xC340A24 EQ PUSH2 0x13F JUMPI DUP1 PUSH4 0x19859847 EQ PUSH2 0x147 JUMPI DUP1 PUSH4 0x1AFE8714 EQ PUSH2 0x14F JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x123 PUSH2 0x27F JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x123 PUSH2 0x28E JUMP JUMPDEST PUSH2 0x123 PUSH2 0x29D JUMP JUMPDEST PUSH2 0x17D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x165 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD ISZERO ISZERO PUSH2 0x2AC JUMP JUMPDEST STOP JUMPDEST PUSH2 0x17D PUSH2 0x45D JUMP JUMPDEST PUSH2 0x123 PUSH2 0x50B JUMP JUMPDEST PUSH2 0x123 PUSH2 0x51A JUMP JUMPDEST PUSH2 0x17D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x1AD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD ISZERO ISZERO PUSH2 0x529 JUMP JUMPDEST PUSH2 0x17D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x1DB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD ISZERO ISZERO PUSH2 0x6A0 JUMP JUMPDEST PUSH2 0x17D PUSH2 0x817 JUMP JUMPDEST PUSH2 0x17D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x211 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD ISZERO ISZERO PUSH2 0x8C6 JUMP JUMPDEST PUSH2 0x17D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x23F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xA3D JUMP JUMPDEST PUSH2 0x123 PUSH2 0xB73 JUMP JUMPDEST PUSH2 0x123 PUSH2 0xB82 JUMP JUMPDEST PUSH2 0x17D PUSH2 0xB91 JUMP JUMPDEST PUSH2 0x123 PUSH2 0xC3F JUMP JUMPDEST PUSH2 0x17D PUSH2 0xC4E JUMP JUMPDEST PUSH2 0x123 PUSH2 0xCFF JUMP JUMPDEST PUSH1 0x4 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x7 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xC340A24 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2FA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x30E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x324 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x0 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0x3D1 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD SWAP1 DUP2 MSTORE DUP3 SLOAD PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP5 AND ISZERO MUL ADD SWAP1 SWAP2 AND DIV PUSH1 0x24 DUP4 ADD DUP2 SWAP1 MSTORE SWAP1 SWAP2 DUP3 SWAP2 PUSH1 0x44 SWAP1 SWAP2 ADD SWAP1 DUP5 SWAP1 DUP1 ISZERO PUSH2 0x3C2 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x397 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x3C2 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x3A5 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP DUP1 ISZERO PUSH2 0x3F4 JUMPI PUSH1 0x3 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND OR SWAP1 SSTORE JUMPDEST PUSH1 0x7 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP2 DUP3 SWAP1 SSTORE PUSH1 0x3 SLOAD PUSH1 0x40 DUP1 MLOAD DUP6 ISZERO ISZERO DUP2 MSTORE SWAP1 MLOAD SWAP4 DUP4 AND SWAP4 SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH32 0xDE655975891E8F09671597B37BD4D663BCC5C21DC6D7641B33CDF85FBE15D08B SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0x4A8 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x9 PUSH1 0x24 DUP3 ADD MSTORE PUSH9 0x85B995DD5985D5B1D PUSH1 0xBA SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x9 SLOAD PUSH1 0x5 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND SWAP3 SWAP1 SWAP2 AND SWAP1 PUSH32 0x3D08E01E3B8340BE6CA709DB7A9321448661A1F490DA4D7F3EB03D84FE730953 SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH1 0x9 SLOAD PUSH1 0x5 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x8 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xC340A24 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x577 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x58B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x5A1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x0 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0x614 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD SWAP1 DUP2 MSTORE DUP3 SLOAD PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP5 AND ISZERO MUL ADD SWAP1 SWAP2 AND DIV PUSH1 0x24 DUP4 ADD DUP2 SWAP1 MSTORE SWAP1 SWAP2 DUP3 SWAP2 PUSH1 0x44 SWAP1 SWAP2 ADD SWAP1 DUP5 SWAP1 DUP1 ISZERO PUSH2 0x3C2 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x397 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x3C2 JUMP JUMPDEST POP DUP1 ISZERO PUSH2 0x637 JUMPI PUSH1 0x2 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND OR SWAP1 SSTORE JUMPDEST PUSH1 0x6 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP2 DUP3 SWAP1 SSTORE PUSH1 0x2 SLOAD PUSH1 0x40 DUP1 MLOAD DUP6 ISZERO ISZERO DUP2 MSTORE SWAP1 MLOAD SWAP4 DUP4 AND SWAP4 SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH32 0x4F337DCBB2512F18373C1F72D990A2F0A6EE5024B04007C52AFD01EB73374A89 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xC340A24 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x6EE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x702 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x718 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x0 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0x78B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD SWAP1 DUP2 MSTORE DUP3 SLOAD PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP5 AND ISZERO MUL ADD SWAP1 SWAP2 AND DIV PUSH1 0x24 DUP4 ADD DUP2 SWAP1 MSTORE SWAP1 SWAP2 DUP3 SWAP2 PUSH1 0x44 SWAP1 SWAP2 ADD SWAP1 DUP5 SWAP1 DUP1 ISZERO PUSH2 0x3C2 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x397 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x3C2 JUMP JUMPDEST POP DUP1 ISZERO PUSH2 0x7AE JUMPI PUSH1 0x4 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND OR SWAP1 SSTORE JUMPDEST PUSH1 0x8 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP2 DUP3 SWAP1 SSTORE PUSH1 0x4 SLOAD PUSH1 0x40 DUP1 MLOAD DUP6 ISZERO ISZERO DUP2 MSTORE SWAP1 MLOAD SWAP4 DUP4 AND SWAP4 SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH32 0x90A5902A45C24AAE553D5AFF384CA16D6560F08D74C9784A4FBD2796D9E13F2B SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x8 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0x863 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xA PUSH1 0x24 DUP3 ADD MSTORE PUSH10 0x216E6577506F6C696379 PUSH1 0xB0 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x8 SLOAD PUSH1 0x4 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND SWAP3 SWAP1 SWAP2 AND SWAP1 PUSH32 0x64D2FA522B403CA222EFFF0C7AD07D2EF45472A45E5770918BDFA9A2845D29A8 SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH1 0x8 SLOAD PUSH1 0x4 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xC340A24 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x914 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x928 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x93E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x0 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0x9B1 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD SWAP1 DUP2 MSTORE DUP3 SLOAD PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP5 AND ISZERO MUL ADD SWAP1 SWAP2 AND DIV PUSH1 0x24 DUP4 ADD DUP2 SWAP1 MSTORE SWAP1 SWAP2 DUP3 SWAP2 PUSH1 0x44 SWAP1 SWAP2 ADD SWAP1 DUP5 SWAP1 DUP1 ISZERO PUSH2 0x3C2 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x397 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x3C2 JUMP JUMPDEST POP DUP1 ISZERO PUSH2 0x9D4 JUMPI PUSH1 0x5 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND OR SWAP1 SSTORE JUMPDEST PUSH1 0x9 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP2 DUP3 SWAP1 SSTORE PUSH1 0x5 SLOAD PUSH1 0x40 DUP1 MLOAD DUP6 ISZERO ISZERO DUP2 MSTORE SWAP1 MLOAD SWAP4 DUP4 AND SWAP4 SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH32 0x5A80F5053574D6A62733E1692E8CBCFAF927DC82DF0A7267EA2E489A7CC18FF SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xC340A24 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xA8B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xA9F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xAB5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x0 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0xB28 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD SWAP1 DUP2 MSTORE DUP3 SLOAD PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP5 AND ISZERO MUL ADD SWAP1 SWAP2 AND DIV PUSH1 0x24 DUP4 ADD DUP2 SWAP1 MSTORE SWAP1 SWAP2 DUP3 SWAP2 PUSH1 0x44 SWAP1 SWAP2 ADD SWAP1 DUP5 SWAP1 DUP1 ISZERO PUSH2 0x3C2 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x397 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x3C2 JUMP JUMPDEST POP PUSH1 0x1 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD PUSH32 0x2F658B440C35314F52658EA8A740E05B284CDC84DC9AE01E891F21B8933E7CAD SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x6 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x7 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0xBDC JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x9 PUSH1 0x24 DUP3 ADD MSTORE PUSH9 0x85B995DD1DD585C99 PUSH1 0xBA SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x7 SLOAD PUSH1 0x3 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND SWAP3 SWAP1 SWAP2 AND SWAP1 PUSH32 0x960FB9900FB8096216606C4F7FC2FCE5D08CC0C82DA55CEC8619B66B5238481 SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH1 0x7 SLOAD PUSH1 0x3 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x6 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0xC9C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xC PUSH1 0x24 DUP3 ADD MSTORE PUSH12 0x10B732BBA3B7BB32B93737B9 PUSH1 0xA1 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x6 SLOAD PUSH1 0x2 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND SWAP3 SWAP1 SWAP2 AND SWAP1 PUSH32 0xFFD6FED33FE8EC1016718BDD5D04AE6FECD9ABA0DA6578807DAAAA7FC3D16826 SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH1 0x6 SLOAD PUSH1 0x2 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x5 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 CHAINID SWAP10 CODESIZE JUMPDEST SWAP10 0xA7 SSTORE 0x1F 0xBC 0xDD 0x5C DUP9 STATICCALL 0xDB 0xC1 STATICCALL SGT 0xCE SWAP3 0xD6 0xAD 0x2D 0xDB DUP13 DUP4 MLOAD PUSH3 0xB21005 SSTORE 0xD9 PUSH5 0x736F6C6343 STOP SMOD MOD STOP CALLER ",
"sourceMap": "276:36:2:-:0;161:2926:0;276:36:2;;161:2926:0;276:36:2;;;-1:-1:-1;;;276:36:2;;;;;;-1:-1:-1;;276:36:2;;:::i;:::-;;629:526:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;629:526:0;;;;;;;;;;;;;;;;525:9:2;:22;;-1:-1:-1;;;;;;525:22:2;803:4:0;525:22:2;;;;;;563:28;;629:526:0;;;;;;803:4;;;563:28:2;;525:9;;563:28;-1:-1:-1;822:8:0::1;:20:::0;;-1:-1:-1;;;;;822:20:0;;::::1;-1:-1:-1::0;;;;;;822:20:0;;::::1;::::0;;;::::1;::::0;;;;858:42:::1;::::0;;822:20;858:42;;;;885:8;;;::::1;::::0;822::::1;::::0;858:42:::1;::::0;;;;;::::1;::::0;;::::1;911:8;:20:::0;;-1:-1:-1;;;;;911:20:0;;::::1;-1:-1:-1::0;;;;;;911:20:0;;::::1;::::0;;;::::1;::::0;;;;947:42:::1;::::0;;911:20;947:42;;;;974:8;;;::::1;::::0;911::::1;::::0;947:42:::1;::::0;;;;;::::1;::::0;;::::1;1000:6;:16:::0;;-1:-1:-1;;;;;1000:16:0;;::::1;-1:-1:-1::0;;;;;;1000:16:0;;::::1;::::0;;;::::1;::::0;;;;1032:38:::1;::::0;;1000:16;1032:38;;;;1057:6;;;::::1;::::0;1000::::1;::::0;1032:38:::1;::::0;;;;;::::1;::::0;;::::1;1081:5;:14:::0;;-1:-1:-1;;;;;1081:14:0;;::::1;-1:-1:-1::0;;;;;;1081:14:0;;::::1;::::0;;;::::1;::::0;;;;1111:36:::1;::::0;;1081:14;1111:36;;;;1135:5;;;::::1;::::0;1081::::1;::::0;1111:36:::1;::::0;;;;;::::1;::::0;;::::1;629:526:::0;;;;161:2926;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;161:2926:0;;;-1:-1:-1;161:2926:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;"
},
"deployedBytecode": {
"generatedSources": [],
"immutableReferences": {},
"linkReferences": {},
"object": "608060405234801561001057600080fd5b50600436106101165760003560e01c80635beede08116100a25780638fd20577116100715780638fd2057714610257578063be11f1dd1461025f578063bf7e214f14610267578063d8a042121461026f578063fbfa77cf1461027757610116565b80635beede08146101f35780636fe72c14146101fb5780637a9e5e4b1461022957806388aaf0c81461024f57610116565b8063215e92bc116100e9578063215e92bc1461017f5780633bf90c2814610187578063452a93201461018f578063527596941461019757806354e3d703146101c557610116565b80630505c8c91461011b5780630c340a241461013f57806319859847146101475780631afe87141461014f575b600080fd5b61012361027f565b604080516001600160a01b039092168252519081900360200190f35b61012361028e565b61012361029d565b61017d6004803603604081101561016557600080fd5b506001600160a01b03813516906020013515156102ac565b005b61017d61045d565b61012361050b565b61012361051a565b61017d600480360360408110156101ad57600080fd5b506001600160a01b0381351690602001351515610529565b61017d600480360360408110156101db57600080fd5b506001600160a01b03813516906020013515156106a0565b61017d610817565b61017d6004803603604081101561021157600080fd5b506001600160a01b03813516906020013515156108c6565b61017d6004803603602081101561023f57600080fd5b50356001600160a01b0316610a3d565b610123610b73565b610123610b82565b61017d610b91565b610123610c3f565b61017d610c4e565b610123610cff565b6004546001600160a01b031681565b6002546001600160a01b031681565b6007546001600160a01b031681565b600160009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b1580156102fa57600080fd5b505afa15801561030e573d6000803e3d6000fd5b505050506040513d602081101561032457600080fd5b50516000906001600160a01b031633146103d15760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156103c25780601f10610397576101008083540402835291602001916103c2565b820191906000526020600020905b8154815290600101906020018083116103a557829003601f168201915b50509250505060405180910390fd5b5080156103f457600380546001600160a01b0319166001600160a01b0384161790555b600780546001600160a01b038085166001600160a01b0319909216919091179182905560035460408051851515815290519383169391909216917fde655975891e8f09671597b37bd4d663bcc5c21dc6d7641b33cdf85fbe15d08b919081900360200190a35050565b6009546001600160a01b031633146104a8576040805162461bcd60e51b8152602060048201526009602482015268085b995dd5985d5b1d60ba1b604482015290519081900360640190fd5b6009546005546040516001600160a01b0392831692909116907f3d08e01e3b8340be6ca709db7a9321448661a1f490da4d7f3eb03d84fe73095390600090a3600954600580546001600160a01b0319166001600160a01b03909216919091179055565b6008546001600160a01b031681565b6003546001600160a01b031681565b600160009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561057757600080fd5b505afa15801561058b573d6000803e3d6000fd5b505050506040513d60208110156105a157600080fd5b50516000906001600160a01b031633146106145760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156103c25780601f10610397576101008083540402835291602001916103c2565b50801561063757600280546001600160a01b0319166001600160a01b0384161790555b600680546001600160a01b038085166001600160a01b0319909216919091179182905560025460408051851515815290519383169391909216917f4f337dcbb2512f18373c1f72d990a2f0a6ee5024b04007c52afd01eb73374a89919081900360200190a35050565b600160009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b1580156106ee57600080fd5b505afa158015610702573d6000803e3d6000fd5b505050506040513d602081101561071857600080fd5b50516000906001600160a01b0316331461078b5760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156103c25780601f10610397576101008083540402835291602001916103c2565b5080156107ae57600480546001600160a01b0319166001600160a01b0384161790555b600880546001600160a01b038085166001600160a01b0319909216919091179182905560045460408051851515815290519383169391909216917f90a5902a45c24aae553d5aff384ca16d6560f08d74c9784a4fbd2796d9e13f2b919081900360200190a35050565b6008546001600160a01b03163314610863576040805162461bcd60e51b815260206004820152600a602482015269216e6577506f6c69637960b01b604482015290519081900360640190fd5b6008546004546040516001600160a01b0392831692909116907f64d2fa522b403ca222efff0c7ad07d2ef45472a45e5770918bdfa9a2845d29a890600090a3600854600480546001600160a01b0319166001600160a01b03909216919091179055565b600160009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561091457600080fd5b505afa158015610928573d6000803e3d6000fd5b505050506040513d602081101561093e57600080fd5b50516000906001600160a01b031633146109b15760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156103c25780601f10610397576101008083540402835291602001916103c2565b5080156109d457600580546001600160a01b0319166001600160a01b0384161790555b600980546001600160a01b038085166001600160a01b0319909216919091179182905560055460408051851515815290519383169391909216917f05a80f5053574d6a62733e1692e8cbcfaf927dc82df0a7267ea2e489a7cc18ff919081900360200190a35050565b600160009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b158015610a8b57600080fd5b505afa158015610a9f573d6000803e3d6000fd5b505050506040513d6020811015610ab557600080fd5b50516000906001600160a01b03163314610b285760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156103c25780601f10610397576101008083540402835291602001916103c2565b50600180546001600160a01b0319166001600160a01b0383169081179091556040517f2f658b440c35314f52658ea8a740e05b284cdc84dc9ae01e891f21b8933e7cad90600090a250565b6009546001600160a01b031681565b6006546001600160a01b031681565b6007546001600160a01b03163314610bdc576040805162461bcd60e51b8152602060048201526009602482015268085b995dd1dd585c9960ba1b604482015290519081900360640190fd5b6007546003546040516001600160a01b0392831692909116907f0960fb9900fb8096216606c4f7fc2fce5d08cc0c82da55cec8619b66b523848190600090a3600754600380546001600160a01b0319166001600160a01b03909216919091179055565b6001546001600160a01b031681565b6006546001600160a01b03163314610c9c576040805162461bcd60e51b815260206004820152600c60248201526b10b732bba3b7bb32b93737b960a11b604482015290519081900360640190fd5b6006546002546040516001600160a01b0392831692909116907fffd6fed33fe8ec1016718bdd5d04ae6fecd9aba0da6578807daaaa7fc3d1682690600090a3600654600280546001600160a01b0319166001600160a01b03909216919091179055565b6005546001600160a01b03168156fea26469706673582212204699385b99a7551fbcdd5c88fadbc1fa13ce92d6ad2ddb8c835162b2100555d964736f6c63430007060033",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x116 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x5BEEDE08 GT PUSH2 0xA2 JUMPI DUP1 PUSH4 0x8FD20577 GT PUSH2 0x71 JUMPI DUP1 PUSH4 0x8FD20577 EQ PUSH2 0x257 JUMPI DUP1 PUSH4 0xBE11F1DD EQ PUSH2 0x25F JUMPI DUP1 PUSH4 0xBF7E214F EQ PUSH2 0x267 JUMPI DUP1 PUSH4 0xD8A04212 EQ PUSH2 0x26F JUMPI DUP1 PUSH4 0xFBFA77CF EQ PUSH2 0x277 JUMPI PUSH2 0x116 JUMP JUMPDEST DUP1 PUSH4 0x5BEEDE08 EQ PUSH2 0x1F3 JUMPI DUP1 PUSH4 0x6FE72C14 EQ PUSH2 0x1FB JUMPI DUP1 PUSH4 0x7A9E5E4B EQ PUSH2 0x229 JUMPI DUP1 PUSH4 0x88AAF0C8 EQ PUSH2 0x24F JUMPI PUSH2 0x116 JUMP JUMPDEST DUP1 PUSH4 0x215E92BC GT PUSH2 0xE9 JUMPI DUP1 PUSH4 0x215E92BC EQ PUSH2 0x17F JUMPI DUP1 PUSH4 0x3BF90C28 EQ PUSH2 0x187 JUMPI DUP1 PUSH4 0x452A9320 EQ PUSH2 0x18F JUMPI DUP1 PUSH4 0x52759694 EQ PUSH2 0x197 JUMPI DUP1 PUSH4 0x54E3D703 EQ PUSH2 0x1C5 JUMPI PUSH2 0x116 JUMP JUMPDEST DUP1 PUSH4 0x505C8C9 EQ PUSH2 0x11B JUMPI DUP1 PUSH4 0xC340A24 EQ PUSH2 0x13F JUMPI DUP1 PUSH4 0x19859847 EQ PUSH2 0x147 JUMPI DUP1 PUSH4 0x1AFE8714 EQ PUSH2 0x14F JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x123 PUSH2 0x27F JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x123 PUSH2 0x28E JUMP JUMPDEST PUSH2 0x123 PUSH2 0x29D JUMP JUMPDEST PUSH2 0x17D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x165 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD ISZERO ISZERO PUSH2 0x2AC JUMP JUMPDEST STOP JUMPDEST PUSH2 0x17D PUSH2 0x45D JUMP JUMPDEST PUSH2 0x123 PUSH2 0x50B JUMP JUMPDEST PUSH2 0x123 PUSH2 0x51A JUMP JUMPDEST PUSH2 0x17D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x1AD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD ISZERO ISZERO PUSH2 0x529 JUMP JUMPDEST PUSH2 0x17D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x1DB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD ISZERO ISZERO PUSH2 0x6A0 JUMP JUMPDEST PUSH2 0x17D PUSH2 0x817 JUMP JUMPDEST PUSH2 0x17D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x211 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD ISZERO ISZERO PUSH2 0x8C6 JUMP JUMPDEST PUSH2 0x17D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x23F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xA3D JUMP JUMPDEST PUSH2 0x123 PUSH2 0xB73 JUMP JUMPDEST PUSH2 0x123 PUSH2 0xB82 JUMP JUMPDEST PUSH2 0x17D PUSH2 0xB91 JUMP JUMPDEST PUSH2 0x123 PUSH2 0xC3F JUMP JUMPDEST PUSH2 0x17D PUSH2 0xC4E JUMP JUMPDEST PUSH2 0x123 PUSH2 0xCFF JUMP JUMPDEST PUSH1 0x4 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x7 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xC340A24 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2FA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x30E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x324 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x0 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0x3D1 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD SWAP1 DUP2 MSTORE DUP3 SLOAD PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP5 AND ISZERO MUL ADD SWAP1 SWAP2 AND DIV PUSH1 0x24 DUP4 ADD DUP2 SWAP1 MSTORE SWAP1 SWAP2 DUP3 SWAP2 PUSH1 0x44 SWAP1 SWAP2 ADD SWAP1 DUP5 SWAP1 DUP1 ISZERO PUSH2 0x3C2 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x397 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x3C2 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x3A5 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP DUP1 ISZERO PUSH2 0x3F4 JUMPI PUSH1 0x3 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND OR SWAP1 SSTORE JUMPDEST PUSH1 0x7 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP2 DUP3 SWAP1 SSTORE PUSH1 0x3 SLOAD PUSH1 0x40 DUP1 MLOAD DUP6 ISZERO ISZERO DUP2 MSTORE SWAP1 MLOAD SWAP4 DUP4 AND SWAP4 SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH32 0xDE655975891E8F09671597B37BD4D663BCC5C21DC6D7641B33CDF85FBE15D08B SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0x4A8 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x9 PUSH1 0x24 DUP3 ADD MSTORE PUSH9 0x85B995DD5985D5B1D PUSH1 0xBA SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x9 SLOAD PUSH1 0x5 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND SWAP3 SWAP1 SWAP2 AND SWAP1 PUSH32 0x3D08E01E3B8340BE6CA709DB7A9321448661A1F490DA4D7F3EB03D84FE730953 SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH1 0x9 SLOAD PUSH1 0x5 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x8 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xC340A24 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x577 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x58B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x5A1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x0 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0x614 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD SWAP1 DUP2 MSTORE DUP3 SLOAD PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP5 AND ISZERO MUL ADD SWAP1 SWAP2 AND DIV PUSH1 0x24 DUP4 ADD DUP2 SWAP1 MSTORE SWAP1 SWAP2 DUP3 SWAP2 PUSH1 0x44 SWAP1 SWAP2 ADD SWAP1 DUP5 SWAP1 DUP1 ISZERO PUSH2 0x3C2 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x397 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x3C2 JUMP JUMPDEST POP DUP1 ISZERO PUSH2 0x637 JUMPI PUSH1 0x2 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND OR SWAP1 SSTORE JUMPDEST PUSH1 0x6 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP2 DUP3 SWAP1 SSTORE PUSH1 0x2 SLOAD PUSH1 0x40 DUP1 MLOAD DUP6 ISZERO ISZERO DUP2 MSTORE SWAP1 MLOAD SWAP4 DUP4 AND SWAP4 SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH32 0x4F337DCBB2512F18373C1F72D990A2F0A6EE5024B04007C52AFD01EB73374A89 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xC340A24 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x6EE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x702 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x718 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x0 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0x78B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD SWAP1 DUP2 MSTORE DUP3 SLOAD PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP5 AND ISZERO MUL ADD SWAP1 SWAP2 AND DIV PUSH1 0x24 DUP4 ADD DUP2 SWAP1 MSTORE SWAP1 SWAP2 DUP3 SWAP2 PUSH1 0x44 SWAP1 SWAP2 ADD SWAP1 DUP5 SWAP1 DUP1 ISZERO PUSH2 0x3C2 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x397 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x3C2 JUMP JUMPDEST POP DUP1 ISZERO PUSH2 0x7AE JUMPI PUSH1 0x4 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND OR SWAP1 SSTORE JUMPDEST PUSH1 0x8 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP2 DUP3 SWAP1 SSTORE PUSH1 0x4 SLOAD PUSH1 0x40 DUP1 MLOAD DUP6 ISZERO ISZERO DUP2 MSTORE SWAP1 MLOAD SWAP4 DUP4 AND SWAP4 SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH32 0x90A5902A45C24AAE553D5AFF384CA16D6560F08D74C9784A4FBD2796D9E13F2B SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x8 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0x863 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xA PUSH1 0x24 DUP3 ADD MSTORE PUSH10 0x216E6577506F6C696379 PUSH1 0xB0 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x8 SLOAD PUSH1 0x4 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND SWAP3 SWAP1 SWAP2 AND SWAP1 PUSH32 0x64D2FA522B403CA222EFFF0C7AD07D2EF45472A45E5770918BDFA9A2845D29A8 SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH1 0x8 SLOAD PUSH1 0x4 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xC340A24 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x914 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x928 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x93E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x0 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0x9B1 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD SWAP1 DUP2 MSTORE DUP3 SLOAD PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP5 AND ISZERO MUL ADD SWAP1 SWAP2 AND DIV PUSH1 0x24 DUP4 ADD DUP2 SWAP1 MSTORE SWAP1 SWAP2 DUP3 SWAP2 PUSH1 0x44 SWAP1 SWAP2 ADD SWAP1 DUP5 SWAP1 DUP1 ISZERO PUSH2 0x3C2 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x397 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x3C2 JUMP JUMPDEST POP DUP1 ISZERO PUSH2 0x9D4 JUMPI PUSH1 0x5 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND OR SWAP1 SSTORE JUMPDEST PUSH1 0x9 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP2 DUP3 SWAP1 SSTORE PUSH1 0x5 SLOAD PUSH1 0x40 DUP1 MLOAD DUP6 ISZERO ISZERO DUP2 MSTORE SWAP1 MLOAD SWAP4 DUP4 AND SWAP4 SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH32 0x5A80F5053574D6A62733E1692E8CBCFAF927DC82DF0A7267EA2E489A7CC18FF SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xC340A24 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xA8B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xA9F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xAB5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x0 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0xB28 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD SWAP1 DUP2 MSTORE DUP3 SLOAD PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP5 AND ISZERO MUL ADD SWAP1 SWAP2 AND DIV PUSH1 0x24 DUP4 ADD DUP2 SWAP1 MSTORE SWAP1 SWAP2 DUP3 SWAP2 PUSH1 0x44 SWAP1 SWAP2 ADD SWAP1 DUP5 SWAP1 DUP1 ISZERO PUSH2 0x3C2 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x397 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x3C2 JUMP JUMPDEST POP PUSH1 0x1 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD PUSH32 0x2F658B440C35314F52658EA8A740E05B284CDC84DC9AE01E891F21B8933E7CAD SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x6 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x7 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0xBDC JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x9 PUSH1 0x24 DUP3 ADD MSTORE PUSH9 0x85B995DD1DD585C99 PUSH1 0xBA SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x7 SLOAD PUSH1 0x3 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND SWAP3 SWAP1 SWAP2 AND SWAP1 PUSH32 0x960FB9900FB8096216606C4F7FC2FCE5D08CC0C82DA55CEC8619B66B5238481 SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH1 0x7 SLOAD PUSH1 0x3 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x6 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0xC9C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xC PUSH1 0x24 DUP3 ADD MSTORE PUSH12 0x10B732BBA3B7BB32B93737B9 PUSH1 0xA1 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x6 SLOAD PUSH1 0x2 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND SWAP3 SWAP1 SWAP2 AND SWAP1 PUSH32 0xFFD6FED33FE8EC1016718BDD5D04AE6FECD9ABA0DA6578807DAAAA7FC3D16826 SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH1 0x6 SLOAD PUSH1 0x2 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x5 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 CHAINID SWAP10 CODESIZE JUMPDEST SWAP10 0xA7 SSTORE 0x1F 0xBC 0xDD 0x5C DUP9 STATICCALL 0xDB 0xC1 STATICCALL SGT 0xCE SWAP3 0xD6 0xAD 0x2D 0xDB DUP13 DUP4 MLOAD PUSH3 0xB21005 SSTORE 0xD9 PUSH5 0x736F6C6343 STOP SMOD MOD STOP CALLER ",
"sourceMap": "161:2926:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;370:30;;;:::i;:::-;;;;-1:-1:-1;;;;;370:30:0;;;;;;;;;;;;;;288:32;;;:::i;482:26::-;;;:::i;1491:276::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;1491:276:0;;;;;;;;;;:::i;:::-;;2920:164;;;:::i;517:24::-;;;:::i;329:32::-;;;:::i;1207:276::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;1207:276:0;;;;;;;;;;:::i;1775:258::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;1775:258:0;;;;;;;;;;:::i;2740:172::-;;;:::i;2041:249::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;2041:249:0;;;;;;;;;;:::i;1166:167:2:-;;;;;;;;;;;;;;;;-1:-1:-1;1166:167:2;-1:-1:-1;;;;;1166:167:2;;:::i;550:23:0:-;;;:::i;447:26::-;;;:::i;2547:185::-;;;:::i;384:33:2:-;;;:::i;2351:188:0:-;;;:::i;409:29::-;;;:::i;370:30::-;;;-1:-1:-1;;;;;370:30:0;;:::o;288:32::-;;;-1:-1:-1;;;;;288:32:0;;:::o;482:26::-;;;-1:-1:-1;;;;;482:26:0;;:::o;1491:276::-;709:9:2;;;;;;;;;-1:-1:-1;;;;;709:9:2;-1:-1:-1;;;;;709:18:2;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;709:20:2;731:12;;-1:-1:-1;;;;;695:34:2;:10;:34;687:57;;;;-1:-1:-1;;;687:57:2;;;;;;;;;;;;-1:-1:-1;;687:57:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1600:21:0::1;1596:50;;;1623:8;:23:::0;;-1:-1:-1;;;;;;1623:23:0::1;-1:-1:-1::0;;;;;1623:23:0;::::1;;::::0;;1596:50:::1;1657:11;:26:::0;;-1:-1:-1;;;;;1657:26:0;;::::1;-1:-1:-1::0;;;;;;1657:26:0;;::::1;::::0;;;::::1;::::0;;;;1714:8:::1;::::0;1699:60:::1;::::0;;;::::1;;::::0;;;;1724:11;;::::1;::::0;1714:8;;;::::1;::::0;1699:60:::1;::::0;;;;;::::1;::::0;;::::1;1491:276:::0;;:::o;2920:164::-;2983:8;;-1:-1:-1;;;;;2983:8:0;2969:10;:22;2961:44;;;;;-1:-1:-1;;;2961:44:0;;;;;;;;;;;;-1:-1:-1;;;2961:44:0;;;;;;;;;;;;;;;3040:8;;3033:5;;3021:28;;-1:-1:-1;;;;;3040:8:0;;;;3033:5;;;;3021:28;;3040:8;;3021:28;3068:8;;3060:5;:16;;-1:-1:-1;;;;;;3060:16:0;-1:-1:-1;;;;;3068:8:0;;;3060:16;;;;;;2920:164::o;517:24::-;;;-1:-1:-1;;;;;517:24:0;;:::o;329:32::-;;;-1:-1:-1;;;;;329:32:0;;:::o;1207:276::-;709:9:2;;;;;;;;;-1:-1:-1;;;;;709:9:2;-1:-1:-1;;;;;709:18:2;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;709:20:2;731:12;;-1:-1:-1;;;;;695:34:2;:10;:34;687:57;;;;-1:-1:-1;;;687:57:2;;;;;;;;;;;;-1:-1:-1;;687:57:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1316:21:0::1;1312:50;;;1339:8;:23:::0;;-1:-1:-1;;;;;;1339:23:0::1;-1:-1:-1::0;;;;;1339:23:0;::::1;;::::0;;1312:50:::1;1373:11;:26:::0;;-1:-1:-1;;;;;1373:26:0;;::::1;-1:-1:-1::0;;;;;;1373:26:0;;::::1;::::0;;;::::1;::::0;;;;1430:8:::1;::::0;1415:60:::1;::::0;;;::::1;;::::0;;;;1440:11;;::::1;::::0;1430:8;;;::::1;::::0;1415:60:::1;::::0;;;;;::::1;::::0;;::::1;1207:276:::0;;:::o;1775:258::-;709:9:2;;;;;;;;;-1:-1:-1;;;;;709:9:2;-1:-1:-1;;;;;709:18:2;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;709:20:2;731:12;;-1:-1:-1;;;;;695:34:2;:10;:34;687:57;;;;-1:-1:-1;;;687:57:2;;;;;;;;;;;;-1:-1:-1;;687:57:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1880:21:0::1;1876:46;;;1903:6;:19:::0;;-1:-1:-1;;;;;;1903:19:0::1;-1:-1:-1::0;;;;;1903:19:0;::::1;;::::0;;1876:46:::1;1933:9;:22:::0;;-1:-1:-1;;;;;1933:22:0;;::::1;-1:-1:-1::0;;;;;;1933:22:0;;::::1;::::0;;;::::1;::::0;;;;1984:6:::1;::::0;1971:54:::1;::::0;;;::::1;;::::0;;;;1992:9;;::::1;::::0;1984:6;;;::::1;::::0;1971:54:::1;::::0;;;;;::::1;::::0;;::::1;1775:258:::0;;:::o;2740:172::-;2804:9;;-1:-1:-1;;;;;2804:9:0;2790:10;:23;2782:46;;;;;-1:-1:-1;;;2782:46:0;;;;;;;;;;;;-1:-1:-1;;;2782:46:0;;;;;;;;;;;;;;;2865:9;;2857:6;;2844:31;;-1:-1:-1;;;;;2865:9:0;;;;2857:6;;;;2844:31;;2865:9;;2844:31;2895:9;;2886:6;:18;;-1:-1:-1;;;;;;2886:18:0;-1:-1:-1;;;;;2895:9:0;;;2886:18;;;;;;2740:172::o;2041:249::-;709:9:2;;;;;;;;;-1:-1:-1;;;;;709:9:2;-1:-1:-1;;;;;709:18:2;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;709:20:2;731:12;;-1:-1:-1;;;;;695:34:2;:10;:34;687:57;;;;-1:-1:-1;;;687:57:2;;;;;;;;;;;;-1:-1:-1;;687:57:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2144:21:0::1;2140:44;;;2167:5;:17:::0;;-1:-1:-1;;;;;;2167:17:0::1;-1:-1:-1::0;;;;;2167:17:0;::::1;;::::0;;2140:44:::1;2195:8;:20:::0;;-1:-1:-1;;;;;2195:20:0;;::::1;-1:-1:-1::0;;;;;;2195:20:0;;::::1;::::0;;;::::1;::::0;;;;2243:5:::1;::::0;2231:51:::1;::::0;;;::::1;;::::0;;;;2250:8;;::::1;::::0;2243:5;;;::::1;::::0;2231:51:::1;::::0;;;;;::::1;::::0;;::::1;2041:249:::0;;:::o;1166:167:2:-;709:9;;;;;;;;;-1:-1:-1;;;;;709:9:2;-1:-1:-1;;;;;709:18:2;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;709:20:2;731:12;;-1:-1:-1;;;;;695:34:2;:10;:34;687:57;;;;-1:-1:-1;;;687:57:2;;;;;;;;;;;;-1:-1:-1;;687:57:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1253:9:2::1;:25:::0;;-1:-1:-1;;;;;;1253:25:2::1;-1:-1:-1::0;;;;;1253:25:2;::::1;::::0;;::::1;::::0;;;1294:31:::1;::::0;::::1;::::0;-1:-1:-1;;1294:31:2::1;1166:167:::0;:::o;550:23:0:-;;;-1:-1:-1;;;;;550:23:0;;:::o;447:26::-;;;-1:-1:-1;;;;;447:26:0;;:::o;2547:185::-;2613:11;;-1:-1:-1;;;;;2613:11:0;2599:10;:25;2591:47;;;;;-1:-1:-1;;;2591:47:0;;;;;;;;;;;;-1:-1:-1;;;2591:47:0;;;;;;;;;;;;;;;2679:11;;2669:8;;2654:37;;-1:-1:-1;;;;;2679:11:0;;;;2669:8;;;;2654:37;;2679:11;;2654:37;2713:11;;2702:8;:22;;-1:-1:-1;;;;;;2702:22:0;-1:-1:-1;;;;;2713:11:0;;;2702:22;;;;;;2547:185::o;384:33:2:-;;;-1:-1:-1;;;;;384:33:2;;:::o;2351:188:0:-;2417:11;;-1:-1:-1;;;;;2417:11:0;2403:10;:25;2395:50;;;;;-1:-1:-1;;;2395:50:0;;;;;;;;;;;;-1:-1:-1;;;2395:50:0;;;;;;;;;;;;;;;2486:11;;2476:8;;2461:37;;-1:-1:-1;;;;;2486:11:0;;;;2476:8;;;;2461:37;;2486:11;;2461:37;2520:11;;2509:8;:22;;-1:-1:-1;;;;;;2509:22:0;-1:-1:-1;;;;;2520:11:0;;;2509:22;;;;;;2351:188::o;409:29::-;;;-1:-1:-1;;;;;409:29:0;;:::o"
},
"gasEstimates": {
"creation": {
"codeDepositCost": "679200",
"executionCost": "infinite",
"totalCost": "infinite"
},
"external": {
"authority()": "1103",
"governor()": "1083",
"guardian()": "1104",
"newGovernor()": "1059",
"newGuardian()": "1105",
"newPolicy()": "1082",
"newVault()": "1126",
"policy()": "1061",
"pullGovernor()": "25904",
"pullGuardian()": "25860",
"pullPolicy()": "25839",
"pullVault()": "25839",
"pushGovernor(address,bool)": "infinite",
"pushGuardian(address,bool)": "infinite",
"pushPolicy(address,bool)": "infinite",
"pushVault(address,bool)": "infinite",
"setAuthority(address)": "infinite",
"vault()": "1147"
}
},
"methodIdentifiers": {
"authority()": "bf7e214f",
"governor()": "0c340a24",
"guardian()": "452a9320",
"newGovernor()": "8fd20577",
"newGuardian()": "19859847",
"newPolicy()": "3bf90c28",
"newVault()": "88aaf0c8",
"policy()": "0505c8c9",
"pullGovernor()": "d8a04212",
"pullGuardian()": "be11f1dd",
"pullPolicy()": "5beede08",
"pullVault()": "215e92bc",
"pushGovernor(address,bool)": "52759694",
"pushGuardian(address,bool)": "1afe8714",
"pushPolicy(address,bool)": "54e3d703",
"pushVault(address,bool)": "6fe72c14",
"setAuthority(address)": "7a9e5e4b",
"vault()": "fbfa77cf"
}
},
"abi": [
{
"inputs": [
{
"internalType": "address",
"name": "_governor",
"type": "address"
},
{
"internalType": "address",
"name": "_guardian",
"type": "address"
},
{
"internalType": "address",
"name": "_policy",
"type": "address"
},
{
"internalType": "address",
"name": "_vault",
"type": "address"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "contract IAxodusAuthority",
"name": "authority",
"type": "address"
}
],
"name": "AuthorityUpdated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "from",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "to",
"type": "address"
}
],
"name": "GovernorPulled",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "from",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "to",
"type": "address"
},
{
"indexed": false,
"internalType": "bool",
"name": "_effectiveImmediately",
"type": "bool"
}
],
"name": "GovernorPushed",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "from",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "to",
"type": "address"
}
],
"name": "GuardianPulled",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "from",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "to",
"type": "address"
},
{
"indexed": false,
"internalType": "bool",
"name": "_effectiveImmediately",
"type": "bool"
}
],
"name": "GuardianPushed",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "from",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "to",
"type": "address"
}
],
"name": "PolicyPulled",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "from",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "to",
"type": "address"
},
{
"indexed": false,
"internalType": "bool",
"name": "_effectiveImmediately",
"type": "bool"
}
],
"name": "PolicyPushed",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "from",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "to",
"type": "address"
}
],
"name": "VaultPulled",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "from",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "to",
"type": "address"
},
{
"indexed": false,
"internalType": "bool",
"name": "_effectiveImmediately",
"type": "bool"
}
],
"name": "VaultPushed",
"type": "event"
},
{
"inputs": [],
"name": "authority",
"outputs": [
{
"internalType": "contract IAxodusAuthority",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "governor",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "guardian",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "newGovernor",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "newGuardian",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "newPolicy",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "newVault",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "policy",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "pullGovernor",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "pullGuardian",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "pullPolicy",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "pullVault",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_newGovernor",
"type": "address"
},
{
"internalType": "bool",
"name": "_effectiveImmediately",
"type": "bool"
}
],
"name": "pushGovernor",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_newGuardian",
"type": "address"
},
{
"internalType": "bool",
"name": "_effectiveImmediately",
"type": "bool"
}
],
"name": "pushGuardian",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_newPolicy",
"type": "address"
},
{
"internalType": "bool",
"name": "_effectiveImmediately",
"type": "bool"
}
],
"name": "pushPolicy",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_newVault",
"type": "address"
},
{
"internalType": "bool",
"name": "_effectiveImmediately",
"type": "bool"
}
],
"name": "pushVault",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract IAxodusAuthority",
"name": "_newAuthority",
"type": "address"
}
],
"name": "setAuthority",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "vault",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
}
]
}
{
"compiler": {
"version": "0.7.6+commit.7338295f"
},
"language": "Solidity",
"output": {
"abi": [
{
"inputs": [
{
"internalType": "address",
"name": "_governor",
"type": "address"
},
{
"internalType": "address",
"name": "_guardian",
"type": "address"
},
{
"internalType": "address",
"name": "_policy",
"type": "address"
},
{
"internalType": "address",
"name": "_vault",
"type": "address"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "contract IAxodusAuthority",
"name": "authority",
"type": "address"
}
],
"name": "AuthorityUpdated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "from",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "to",
"type": "address"
}
],
"name": "GovernorPulled",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "from",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "to",
"type": "address"
},
{
"indexed": false,
"internalType": "bool",
"name": "_effectiveImmediately",
"type": "bool"
}
],
"name": "GovernorPushed",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "from",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "to",
"type": "address"
}
],
"name": "GuardianPulled",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "from",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "to",
"type": "address"
},
{
"indexed": false,
"internalType": "bool",
"name": "_effectiveImmediately",
"type": "bool"
}
],
"name": "GuardianPushed",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "from",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "to",
"type": "address"
}
],
"name": "PolicyPulled",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "from",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "to",
"type": "address"
},
{
"indexed": false,
"internalType": "bool",
"name": "_effectiveImmediately",
"type": "bool"
}
],
"name": "PolicyPushed",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "from",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "to",
"type": "address"
}
],
"name": "VaultPulled",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "from",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "to",
"type": "address"
},
{
"indexed": false,
"internalType": "bool",
"name": "_effectiveImmediately",
"type": "bool"
}
],
"name": "VaultPushed",
"type": "event"
},
{
"inputs": [],
"name": "authority",
"outputs": [
{
"internalType": "contract IAxodusAuthority",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "governor",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "guardian",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "newGovernor",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "newGuardian",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "newPolicy",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "newVault",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "policy",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "pullGovernor",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "pullGuardian",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "pullPolicy",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "pullVault",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_newGovernor",
"type": "address"
},
{
"internalType": "bool",
"name": "_effectiveImmediately",
"type": "bool"
}
],
"name": "pushGovernor",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_newGuardian",
"type": "address"
},
{
"internalType": "bool",
"name": "_effectiveImmediately",
"type": "bool"
}
],
"name": "pushGuardian",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_newPolicy",
"type": "address"
},
{
"internalType": "bool",
"name": "_effectiveImmediately",
"type": "bool"
}
],
"name": "pushPolicy",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_newVault",
"type": "address"
},
{
"internalType": "bool",
"name": "_effectiveImmediately",
"type": "bool"
}
],
"name": "pushVault",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract IAxodusAuthority",
"name": "_newAuthority",
"type": "address"
}
],
"name": "setAuthority",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "vault",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
}
],
"devdoc": {
"kind": "dev",
"methods": {},
"version": 1
},
"userdoc": {
"kind": "user",
"methods": {},
"version": 1
}
},
"settings": {
"compilationTarget": {
"contracts/AxodusAuthority.sol": "AxodusAuthority"
},
"evmVersion": "istanbul",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
},
"sources": {
"contracts/AxodusAuthority.sol": {
"keccak256": "0x207dfb522e9c4d3bd88eead0f7ba69ab5e5d02da90ed5232fa897dbeaed86728",
"license": "AGPL-3.0",
"urls": [
"bzz-raw://c875f16e95c83e1df0f116d7f9c7862f24fe0730c4ff3393b47261ce172a9064",
"dweb:/ipfs/QmfEMadnAuoFsXuoGjJYR8Bi4UjPXRMGKRiRLBUPoG6pxL"
]
},
"contracts/interfaces/IAxodusAuthority.sol": {
"keccak256": "0x4b73152814a5ac7092632291aa6a88a85d224bb86961dcef46fb28c257d84e73",
"license": "AGPL-3.0",
"urls": [
"bzz-raw://59d3e0cf240a30e25627b873163e41d9f088255c74d1390bac9611524e90d963",
"dweb:/ipfs/QmZcBzsquwzJWUQiRJd9i8JKugcLQoDMXQSMJ9FJV4Y2R3"
]
},
"contracts/types/AxodusAccessControlled.sol": {
"keccak256": "0x8c16330b30cd446c9c0a618a870a9c8977b9424fc64cf25fa811d203294d827f",
"license": "AGPL-3.0-only",
"urls": [
"bzz-raw://4ff18e0c55f819b9f20dd347893147ff6c04e016ed537d612dfc384f47c2de41",
"dweb:/ipfs/QmaYf9hQHfVGPzbs1r298qyuCJ2DNQwfqK69VBoVQsfTdz"
]
}
},
"version": 1
}
{
"deploy": {
"VM:-": {
"linkReferences": {},
"autoDeployLib": true
},
"main:1": {
"linkReferences": {},
"autoDeployLib": true
},
"ropsten:3": {
"linkReferences": {},
"autoDeployLib": true
},
"rinkeby:4": {
"linkReferences": {},
"autoDeployLib": true
},
"kovan:42": {
"linkReferences": {},
"autoDeployLib": true
},
"görli:5": {
"linkReferences": {},
"autoDeployLib": true
},
"Custom": {
"linkReferences": {},
"autoDeployLib": true
}
},
"data": {
"bytecode": {
"functionDebugData": {
"@_102": {
"entryPoint": null,
"id": 102,
"parameterSlots": 5,
"returnSlots": 0
},
"@_2094": {
"entryPoint": null,
"id": 2094,
"parameterSlots": 1,
"returnSlots": 0
},
"@_2206": {
"entryPoint": null,
"id": 2206,
"parameterSlots": 2,
"returnSlots": 0
},
"@_2400": {
"entryPoint": null,
"id": 2400,
"parameterSlots": 5,
"returnSlots": 0
},
"abi_decode_tuple_t_bool_fromMemory": {
"entryPoint": 698,
"id": null,
"parameterSlots": 2,
"returnSlots": 1
},
"abi_decode_tuple_t_contract$_IAxodusAuthority_$1363t_contract$_IERC20_$1592t_contract$_IgAXDS_$1884t_contract$_IStaking_$1770t_contract$_ITreasury_$1838_fromMemory": {
"entryPoint": 570,
"id": null,
"parameterSlots": 2,
"returnSlots": 5
},
"abi_encode_tuple_t_address_t_rational_1000000000000000000000000000000000000000000000_by_1__to_t_address_t_uint256__fromStack_reversed": {
"entryPoint": null,
"id": null,
"parameterSlots": 3,
"returnSlots": 1
},
"extract_byte_array_length": {
"entryPoint": 741,
"id": null,
"parameterSlots": 1,
"returnSlots": 1
},
"validator_revert_contract_IAxodusAuthority": {
"entryPoint": 545,
"id": null,
"parameterSlots": 1,
"returnSlots": 0
}
},
"generatedSources": [
{
"ast": {
"nodeType": "YulBlock",
"src": "0:2138:13",
"statements": [
{
"nodeType": "YulBlock",
"src": "6:3:13",
"statements": []
},
{
"body": {
"nodeType": "YulBlock",
"src": "77:86:13",
"statements": [
{
"body": {
"nodeType": "YulBlock",
"src": "141:16:13",
"statements": [
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "150:1:13",
"type": "",
"value": "0"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "153:1:13",
"type": "",
"value": "0"
}
],
"functionName": {
"name": "revert",
"nodeType": "YulIdentifier",
"src": "143:6:13"
},
"nodeType": "YulFunctionCall",
"src": "143:12:13"
},
"nodeType": "YulExpressionStatement",
"src": "143:12:13"
}
]
},
"condition": {
"arguments": [
{
"arguments": [
{
"name": "value",
"nodeType": "YulIdentifier",
"src": "100:5:13"
},
{
"arguments": [
{
"name": "value",
"nodeType": "YulIdentifier",
"src": "111:5:13"
},
{
"arguments": [
{
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "126:3:13",
"type": "",
"value": "160"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "131:1:13",
"type": "",
"value": "1"
}
],
"functionName": {
"name": "shl",
"nodeType": "YulIdentifier",
"src": "122:3:13"
},
"nodeType": "YulFunctionCall",
"src": "122:11:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "135:1:13",
"type": "",
"value": "1"
}
],
"functionName": {
"name": "sub",
"nodeType": "YulIdentifier",
"src": "118:3:13"
},
"nodeType": "YulFunctionCall",
"src": "118:19:13"
}
],
"functionName": {
"name": "and",
"nodeType": "YulIdentifier",
"src": "107:3:13"
},
"nodeType": "YulFunctionCall",
"src": "107:31:13"
}
],
"functionName": {
"name": "eq",
"nodeType": "YulIdentifier",
"src": "97:2:13"
},
"nodeType": "YulFunctionCall",
"src": "97:42:13"
}
],
"functionName": {
"name": "iszero",
"nodeType": "YulIdentifier",
"src": "90:6:13"
},
"nodeType": "YulFunctionCall",
"src": "90:50:13"
},
"nodeType": "YulIf",
"src": "87:70:13"
}
]
},
"name": "validator_revert_contract_IAxodusAuthority",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "value",
"nodeType": "YulTypedName",
"src": "66:5:13",
"type": ""
}
],
"src": "14:149:13"
},
{
"body": {
"nodeType": "YulBlock",
"src": "407:730:13",
"statements": [
{
"body": {
"nodeType": "YulBlock",
"src": "454:16:13",
"statements": [
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "463:1:13",
"type": "",
"value": "0"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "466:1:13",
"type": "",
"value": "0"
}
],
"functionName": {
"name": "revert",
"nodeType": "YulIdentifier",
"src": "456:6:13"
},
"nodeType": "YulFunctionCall",
"src": "456:12:13"
},
"nodeType": "YulExpressionStatement",
"src": "456:12:13"
}
]
},
"condition": {
"arguments": [
{
"arguments": [
{
"name": "dataEnd",
"nodeType": "YulIdentifier",
"src": "428:7:13"
},
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "437:9:13"
}
],
"functionName": {
"name": "sub",
"nodeType": "YulIdentifier",
"src": "424:3:13"
},
"nodeType": "YulFunctionCall",
"src": "424:23:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "449:3:13",
"type": "",
"value": "160"
}
],
"functionName": {
"name": "slt",
"nodeType": "YulIdentifier",
"src": "420:3:13"
},
"nodeType": "YulFunctionCall",
"src": "420:33:13"
},
"nodeType": "YulIf",
"src": "417:53:13"
},
{
"nodeType": "YulVariableDeclaration",
"src": "479:29:13",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "498:9:13"
}
],
"functionName": {
"name": "mload",
"nodeType": "YulIdentifier",
"src": "492:5:13"
},
"nodeType": "YulFunctionCall",
"src": "492:16:13"
},
"variables": [
{
"name": "value",
"nodeType": "YulTypedName",
"src": "483:5:13",
"type": ""
}
]
},
{
"expression": {
"arguments": [
{
"name": "value",
"nodeType": "YulIdentifier",
"src": "560:5:13"
}
],
"functionName": {
"name": "validator_revert_contract_IAxodusAuthority",
"nodeType": "YulIdentifier",
"src": "517:42:13"
},
"nodeType": "YulFunctionCall",
"src": "517:49:13"
},
"nodeType": "YulExpressionStatement",
"src": "517:49:13"
},
{
"nodeType": "YulAssignment",
"src": "575:15:13",
"value": {
"name": "value",
"nodeType": "YulIdentifier",
"src": "585:5:13"
},
"variableNames": [
{
"name": "value0",
"nodeType": "YulIdentifier",
"src": "575:6:13"
}
]
},
{
"nodeType": "YulVariableDeclaration",
"src": "599:40:13",
"value": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "624:9:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "635:2:13",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "620:3:13"
},
"nodeType": "YulFunctionCall",
"src": "620:18:13"
}
],
"functionName": {
"name": "mload",
"nodeType": "YulIdentifier",
"src": "614:5:13"
},
"nodeType": "YulFunctionCall",
"src": "614:25:13"
},
"variables": [
{
"name": "value_1",
"nodeType": "YulTypedName",
"src": "603:7:13",
"type": ""
}
]
},
{
"expression": {
"arguments": [
{
"name": "value_1",
"nodeType": "YulIdentifier",
"src": "691:7:13"
}
],
"functionName": {
"name": "validator_revert_contract_IAxodusAuthority",
"nodeType": "YulIdentifier",
"src": "648:42:13"
},
"nodeType": "YulFunctionCall",
"src": "648:51:13"
},
"nodeType": "YulExpressionStatement",
"src": "648:51:13"
},
{
"nodeType": "YulAssignment",
"src": "708:17:13",
"value": {
"name": "value_1",
"nodeType": "YulIdentifier",
"src": "718:7:13"
},
"variableNames": [
{
"name": "value1",
"nodeType": "YulIdentifier",
"src": "708:6:13"
}
]
},
{
"nodeType": "YulVariableDeclaration",
"src": "734:40:13",
"value": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "759:9:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "770:2:13",
"type": "",
"value": "64"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "755:3:13"
},
"nodeType": "YulFunctionCall",
"src": "755:18:13"
}
],
"functionName": {
"name": "mload",
"nodeType": "YulIdentifier",
"src": "749:5:13"
},
"nodeType": "YulFunctionCall",
"src": "749:25:13"
},
"variables": [
{
"name": "value_2",
"nodeType": "YulTypedName",
"src": "738:7:13",
"type": ""
}
]
},
{
"expression": {
"arguments": [
{
"name": "value_2",
"nodeType": "YulIdentifier",
"src": "826:7:13"
}
],
"functionName": {
"name": "validator_revert_contract_IAxodusAuthority",
"nodeType": "YulIdentifier",
"src": "783:42:13"
},
"nodeType": "YulFunctionCall",
"src": "783:51:13"
},
"nodeType": "YulExpressionStatement",
"src": "783:51:13"
},
{
"nodeType": "YulAssignment",
"src": "843:17:13",
"value": {
"name": "value_2",
"nodeType": "YulIdentifier",
"src": "853:7:13"
},
"variableNames": [
{
"name": "value2",
"nodeType": "YulIdentifier",
"src": "843:6:13"
}
]
},
{
"nodeType": "YulVariableDeclaration",
"src": "869:40:13",
"value": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "894:9:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "905:2:13",
"type": "",
"value": "96"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "890:3:13"
},
"nodeType": "YulFunctionCall",
"src": "890:18:13"
}
],
"functionName": {
"name": "mload",
"nodeType": "YulIdentifier",
"src": "884:5:13"
},
"nodeType": "YulFunctionCall",
"src": "884:25:13"
},
"variables": [
{
"name": "value_3",
"nodeType": "YulTypedName",
"src": "873:7:13",
"type": ""
}
]
},
{
"expression": {
"arguments": [
{
"name": "value_3",
"nodeType": "YulIdentifier",
"src": "961:7:13"
}
],
"functionName": {
"name": "validator_revert_contract_IAxodusAuthority",
"nodeType": "YulIdentifier",
"src": "918:42:13"
},
"nodeType": "YulFunctionCall",
"src": "918:51:13"
},
"nodeType": "YulExpressionStatement",
"src": "918:51:13"
},
{
"nodeType": "YulAssignment",
"src": "978:17:13",
"value": {
"name": "value_3",
"nodeType": "YulIdentifier",
"src": "988:7:13"
},
"variableNames": [
{
"name": "value3",
"nodeType": "YulIdentifier",
"src": "978:6:13"
}
]
},
{
"nodeType": "YulVariableDeclaration",
"src": "1004:41:13",
"value": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "1029:9:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1040:3:13",
"type": "",
"value": "128"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "1025:3:13"
},
"nodeType": "YulFunctionCall",
"src": "1025:19:13"
}
],
"functionName": {
"name": "mload",
"nodeType": "YulIdentifier",
"src": "1019:5:13"
},
"nodeType": "YulFunctionCall",
"src": "1019:26:13"
},
"variables": [
{
"name": "value_4",
"nodeType": "YulTypedName",
"src": "1008:7:13",
"type": ""
}
]
},
{
"expression": {
"arguments": [
{
"name": "value_4",
"nodeType": "YulIdentifier",
"src": "1097:7:13"
}
],
"functionName": {
"name": "validator_revert_contract_IAxodusAuthority",
"nodeType": "YulIdentifier",
"src": "1054:42:13"
},
"nodeType": "YulFunctionCall",
"src": "1054:51:13"
},
"nodeType": "YulExpressionStatement",
"src": "1054:51:13"
},
{
"nodeType": "YulAssignment",
"src": "1114:17:13",
"value": {
"name": "value_4",
"nodeType": "YulIdentifier",
"src": "1124:7:13"
},
"variableNames": [
{
"name": "value4",
"nodeType": "YulIdentifier",
"src": "1114:6:13"
}
]
}
]
},
"name": "abi_decode_tuple_t_contract$_IAxodusAuthority_$1363t_contract$_IERC20_$1592t_contract$_IgAXDS_$1884t_contract$_IStaking_$1770t_contract$_ITreasury_$1838_fromMemory",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "headStart",
"nodeType": "YulTypedName",
"src": "341:9:13",
"type": ""
},
{
"name": "dataEnd",
"nodeType": "YulTypedName",
"src": "352:7:13",
"type": ""
}
],
"returnVariables": [
{
"name": "value0",
"nodeType": "YulTypedName",
"src": "364:6:13",
"type": ""
},
{
"name": "value1",
"nodeType": "YulTypedName",
"src": "372:6:13",
"type": ""
},
{
"name": "value2",
"nodeType": "YulTypedName",
"src": "380:6:13",
"type": ""
},
{
"name": "value3",
"nodeType": "YulTypedName",
"src": "388:6:13",
"type": ""
},
{
"name": "value4",
"nodeType": "YulTypedName",
"src": "396:6:13",
"type": ""
}
],
"src": "168:969:13"
},
{
"body": {
"nodeType": "YulBlock",
"src": "1324:145:13",
"statements": [
{
"nodeType": "YulAssignment",
"src": "1334:26:13",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "1346:9:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1357:2:13",
"type": "",
"value": "64"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "1342:3:13"
},
"nodeType": "YulFunctionCall",
"src": "1342:18:13"
},
"variableNames": [
{
"name": "tail",
"nodeType": "YulIdentifier",
"src": "1334:4:13"
}
]
},
{
"expression": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "1376:9:13"
},
{
"arguments": [
{
"name": "value0",
"nodeType": "YulIdentifier",
"src": "1391:6:13"
},
{
"arguments": [
{
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1407:3:13",
"type": "",
"value": "160"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1412:1:13",
"type": "",
"value": "1"
}
],
"functionName": {
"name": "shl",
"nodeType": "YulIdentifier",
"src": "1403:3:13"
},
"nodeType": "YulFunctionCall",
"src": "1403:11:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1416:1:13",
"type": "",
"value": "1"
}
],
"functionName": {
"name": "sub",
"nodeType": "YulIdentifier",
"src": "1399:3:13"
},
"nodeType": "YulFunctionCall",
"src": "1399:19:13"
}
],
"functionName": {
"name": "and",
"nodeType": "YulIdentifier",
"src": "1387:3:13"
},
"nodeType": "YulFunctionCall",
"src": "1387:32:13"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "1369:6:13"
},
"nodeType": "YulFunctionCall",
"src": "1369:51:13"
},
"nodeType": "YulExpressionStatement",
"src": "1369:51:13"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "1440:9:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1451:2:13",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "1436:3:13"
},
"nodeType": "YulFunctionCall",
"src": "1436:18:13"
},
{
"name": "value1",
"nodeType": "YulIdentifier",
"src": "1456:6:13"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "1429:6:13"
},
"nodeType": "YulFunctionCall",
"src": "1429:34:13"
},
"nodeType": "YulExpressionStatement",
"src": "1429:34:13"
}
]
},
"name": "abi_encode_tuple_t_address_t_rational_1000000000000000000000000000000000000000000000_by_1__to_t_address_t_uint256__fromStack_reversed",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "headStart",
"nodeType": "YulTypedName",
"src": "1285:9:13",
"type": ""
},
{
"name": "value1",
"nodeType": "YulTypedName",
"src": "1296:6:13",
"type": ""
},
{
"name": "value0",
"nodeType": "YulTypedName",
"src": "1304:6:13",
"type": ""
}
],
"returnVariables": [
{
"name": "tail",
"nodeType": "YulTypedName",
"src": "1315:4:13",
"type": ""
}
],
"src": "1142:327:13"
},
{
"body": {
"nodeType": "YulBlock",
"src": "1552:199:13",
"statements": [
{
"body": {
"nodeType": "YulBlock",
"src": "1598:16:13",
"statements": [
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1607:1:13",
"type": "",
"value": "0"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1610:1:13",
"type": "",
"value": "0"
}
],
"functionName": {
"name": "revert",
"nodeType": "YulIdentifier",
"src": "1600:6:13"
},
"nodeType": "YulFunctionCall",
"src": "1600:12:13"
},
"nodeType": "YulExpressionStatement",
"src": "1600:12:13"
}
]
},
"condition": {
"arguments": [
{
"arguments": [
{
"name": "dataEnd",
"nodeType": "YulIdentifier",
"src": "1573:7:13"
},
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "1582:9:13"
}
],
"functionName": {
"name": "sub",
"nodeType": "YulIdentifier",
"src": "1569:3:13"
},
"nodeType": "YulFunctionCall",
"src": "1569:23:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1594:2:13",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "slt",
"nodeType": "YulIdentifier",
"src": "1565:3:13"
},
"nodeType": "YulFunctionCall",
"src": "1565:32:13"
},
"nodeType": "YulIf",
"src": "1562:52:13"
},
{
"nodeType": "YulVariableDeclaration",
"src": "1623:29:13",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "1642:9:13"
}
],
"functionName": {
"name": "mload",
"nodeType": "YulIdentifier",
"src": "1636:5:13"
},
"nodeType": "YulFunctionCall",
"src": "1636:16:13"
},
"variables": [
{
"name": "value",
"nodeType": "YulTypedName",
"src": "1627:5:13",
"type": ""
}
]
},
{
"body": {
"nodeType": "YulBlock",
"src": "1705:16:13",
"statements": [
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1714:1:13",
"type": "",
"value": "0"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1717:1:13",
"type": "",
"value": "0"
}
],
"functionName": {
"name": "revert",
"nodeType": "YulIdentifier",
"src": "1707:6:13"
},
"nodeType": "YulFunctionCall",
"src": "1707:12:13"
},
"nodeType": "YulExpressionStatement",
"src": "1707:12:13"
}
]
},
"condition": {
"arguments": [
{
"arguments": [
{
"name": "value",
"nodeType": "YulIdentifier",
"src": "1674:5:13"
},
{
"arguments": [
{
"arguments": [
{
"name": "value",
"nodeType": "YulIdentifier",
"src": "1695:5:13"
}
],
"functionName": {
"name": "iszero",
"nodeType": "YulIdentifier",
"src": "1688:6:13"
},
"nodeType": "YulFunctionCall",
"src": "1688:13:13"
}
],
"functionName": {
"name": "iszero",
"nodeType": "YulIdentifier",
"src": "1681:6:13"
},
"nodeType": "YulFunctionCall",
"src": "1681:21:13"
}
],
"functionName": {
"name": "eq",
"nodeType": "YulIdentifier",
"src": "1671:2:13"
},
"nodeType": "YulFunctionCall",
"src": "1671:32:13"
}
],
"functionName": {
"name": "iszero",
"nodeType": "YulIdentifier",
"src": "1664:6:13"
},
"nodeType": "YulFunctionCall",
"src": "1664:40:13"
},
"nodeType": "YulIf",
"src": "1661:60:13"
},
{
"nodeType": "YulAssignment",
"src": "1730:15:13",
"value": {
"name": "value",
"nodeType": "YulIdentifier",
"src": "1740:5:13"
},
"variableNames": [
{
"name": "value0",
"nodeType": "YulIdentifier",
"src": "1730:6:13"
}
]
}
]
},
"name": "abi_decode_tuple_t_bool_fromMemory",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "headStart",
"nodeType": "YulTypedName",
"src": "1518:9:13",
"type": ""
},
{
"name": "dataEnd",
"nodeType": "YulTypedName",
"src": "1529:7:13",
"type": ""
}
],
"returnVariables": [
{
"name": "value0",
"nodeType": "YulTypedName",
"src": "1541:6:13",
"type": ""
}
],
"src": "1474:277:13"
},
{
"body": {
"nodeType": "YulBlock",
"src": "1811:325:13",
"statements": [
{
"nodeType": "YulAssignment",
"src": "1821:22:13",
"value": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1835:1:13",
"type": "",
"value": "1"
},
{
"name": "data",
"nodeType": "YulIdentifier",
"src": "1838:4:13"
}
],
"functionName": {
"name": "shr",
"nodeType": "YulIdentifier",
"src": "1831:3:13"
},
"nodeType": "YulFunctionCall",
"src": "1831:12:13"
},
"variableNames": [
{
"name": "length",
"nodeType": "YulIdentifier",
"src": "1821:6:13"
}
]
},
{
"nodeType": "YulVariableDeclaration",
"src": "1852:38:13",
"value": {
"arguments": [
{
"name": "data",
"nodeType": "YulIdentifier",
"src": "1882:4:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1888:1:13",
"type": "",
"value": "1"
}
],
"functionName": {
"name": "and",
"nodeType": "YulIdentifier",
"src": "1878:3:13"
},
"nodeType": "YulFunctionCall",
"src": "1878:12:13"
},
"variables": [
{
"name": "outOfPlaceEncoding",
"nodeType": "YulTypedName",
"src": "1856:18:13",
"type": ""
}
]
},
{
"body": {
"nodeType": "YulBlock",
"src": "1929:31:13",
"statements": [
{
"nodeType": "YulAssignment",
"src": "1931:27:13",
"value": {
"arguments": [
{
"name": "length",
"nodeType": "YulIdentifier",
"src": "1945:6:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1953:4:13",
"type": "",
"value": "0x7f"
}
],
"functionName": {
"name": "and",
"nodeType": "YulIdentifier",
"src": "1941:3:13"
},
"nodeType": "YulFunctionCall",
"src": "1941:17:13"
},
"variableNames": [
{
"name": "length",
"nodeType": "YulIdentifier",
"src": "1931:6:13"
}
]
}
]
},
"condition": {
"arguments": [
{
"name": "outOfPlaceEncoding",
"nodeType": "YulIdentifier",
"src": "1909:18:13"
}
],
"functionName": {
"name": "iszero",
"nodeType": "YulIdentifier",
"src": "1902:6:13"
},
"nodeType": "YulFunctionCall",
"src": "1902:26:13"
},
"nodeType": "YulIf",
"src": "1899:61:13"
},
{
"body": {
"nodeType": "YulBlock",
"src": "2019:111:13",
"statements": [
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2040:1:13",
"type": "",
"value": "0"
},
{
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2047:3:13",
"type": "",
"value": "224"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2052:10:13",
"type": "",
"value": "0x4e487b71"
}
],
"functionName": {
"name": "shl",
"nodeType": "YulIdentifier",
"src": "2043:3:13"
},
"nodeType": "YulFunctionCall",
"src": "2043:20:13"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "2033:6:13"
},
"nodeType": "YulFunctionCall",
"src": "2033:31:13"
},
"nodeType": "YulExpressionStatement",
"src": "2033:31:13"
},
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2084:1:13",
"type": "",
"value": "4"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2087:4:13",
"type": "",
"value": "0x22"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "2077:6:13"
},
"nodeType": "YulFunctionCall",
"src": "2077:15:13"
},
"nodeType": "YulExpressionStatement",
"src": "2077:15:13"
},
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2112:1:13",
"type": "",
"value": "0"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2115:4:13",
"type": "",
"value": "0x24"
}
],
"functionName": {
"name": "revert",
"nodeType": "YulIdentifier",
"src": "2105:6:13"
},
"nodeType": "YulFunctionCall",
"src": "2105:15:13"
},
"nodeType": "YulExpressionStatement",
"src": "2105:15:13"
}
]
},
"condition": {
"arguments": [
{
"name": "outOfPlaceEncoding",
"nodeType": "YulIdentifier",
"src": "1975:18:13"
},
{
"arguments": [
{
"name": "length",
"nodeType": "YulIdentifier",
"src": "1998:6:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2006:2:13",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "lt",
"nodeType": "YulIdentifier",
"src": "1995:2:13"
},
"nodeType": "YulFunctionCall",
"src": "1995:14:13"
}
],
"functionName": {
"name": "eq",
"nodeType": "YulIdentifier",
"src": "1972:2:13"
},
"nodeType": "YulFunctionCall",
"src": "1972:38:13"
},
"nodeType": "YulIf",
"src": "1969:161:13"
}
]
},
"name": "extract_byte_array_length",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "data",
"nodeType": "YulTypedName",
"src": "1791:4:13",
"type": ""
}
],
"returnVariables": [
{
"name": "length",
"nodeType": "YulTypedName",
"src": "1800:6:13",
"type": ""
}
],
"src": "1756:380:13"
}
]
},
"contents": "{\n { }\n function validator_revert_contract_IAxodusAuthority(value)\n {\n if iszero(eq(value, and(value, sub(shl(160, 1), 1)))) { revert(0, 0) }\n }\n function abi_decode_tuple_t_contract$_IAxodusAuthority_$1363t_contract$_IERC20_$1592t_contract$_IgAXDS_$1884t_contract$_IStaking_$1770t_contract$_ITreasury_$1838_fromMemory(headStart, dataEnd) -> value0, value1, value2, value3, value4\n {\n if slt(sub(dataEnd, headStart), 160) { revert(0, 0) }\n let value := mload(headStart)\n validator_revert_contract_IAxodusAuthority(value)\n value0 := value\n let value_1 := mload(add(headStart, 32))\n validator_revert_contract_IAxodusAuthority(value_1)\n value1 := value_1\n let value_2 := mload(add(headStart, 64))\n validator_revert_contract_IAxodusAuthority(value_2)\n value2 := value_2\n let value_3 := mload(add(headStart, 96))\n validator_revert_contract_IAxodusAuthority(value_3)\n value3 := value_3\n let value_4 := mload(add(headStart, 128))\n validator_revert_contract_IAxodusAuthority(value_4)\n value4 := value_4\n }\n function abi_encode_tuple_t_address_t_rational_1000000000000000000000000000000000000000000000_by_1__to_t_address_t_uint256__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, and(value0, sub(shl(160, 1), 1)))\n mstore(add(headStart, 32), value1)\n }\n function abi_decode_tuple_t_bool_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := mload(headStart)\n if iszero(eq(value, iszero(iszero(value)))) { revert(0, 0) }\n value0 := value\n }\n function extract_byte_array_length(data) -> length\n {\n length := shr(1, data)\n let outOfPlaceEncoding := and(data, 1)\n if iszero(outOfPlaceEncoding) { length := and(length, 0x7f) }\n if eq(outOfPlaceEncoding, lt(length, 32))\n {\n mstore(0, shl(224, 0x4e487b71))\n mstore(4, 0x22)\n revert(0, 0x24)\n }\n }\n}",
"id": 13,
"language": "Yul",
"name": "#utility.yul"
}
],
"linkReferences": {},
"object": "610120604052600c60e08190526b15539055551213d49256915160a21b6101009081526200003191600091906200017b565b503480156200003f57600080fd5b50604051620044e6380380620044e683398101604081905262000062916200023a565b600180546001600160a01b0319166001600160a01b038716908117909155604051869186918691869186918691869183917f2f658b440c35314f52658ea8a740e05b284cdc84dc9ae01e891f21b8933e7cad90600090a2506001600160a01b0390811660805293841660a0525090821660c052600880546001600160a01b03191691831691909117905560405163095ea7b360e01b81528582166004820152722cd76fe086b93ce2f768a00b22a000000000006024820152908716925063095ea7b391506044016020604051808303816000875af115801562000149573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200016f9190620002ba565b50505050505062000322565b8280546200018990620002e5565b90600052602060002090601f016020900481019282620001ad5760008555620001f8565b82601f10620001c857805160ff1916838001178555620001f8565b82800160010185558215620001f8579182015b82811115620001f8578251825591602001919060010190620001db565b50620002069291506200020a565b5090565b5b808211156200020657600081556001016200020b565b6001600160a01b03811681146200023757600080fd5b50565b600080600080600060a086880312156200025357600080fd5b8551620002608162000221565b6020870151909550620002738162000221565b6040870151909450620002868162000221565b6060870151909350620002998162000221565b6080870151909250620002ac8162000221565b809150509295509295909350565b600060208284031215620002cd57600080fd5b81518015158114620002de57600080fd5b9392505050565b600181811c90821680620002fa57607f821691505b602082108114156200031c57634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c05161417f62000367600039600081816124710152612ede0152600081816123d80152612d01015260008181610eef0152611077015261417f6000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c8063abbf4b171161011a578063c9b67af5116100ad578063e0b117ff1161007c578063e0b117ff146105b6578063e3684e39146105fe578063e481b26514610655578063f1b7dc7814610668578063f3191a461461067b57600080fd5b8063c9b67af514610565578063d62fbdd31461056d578063d6db4df814610580578063d936547e1461059357600080fd5b8063bf7e214f116100e9578063bf7e214f146104b0578063c0680e20146104db578063c0aa0e8a146104ee578063c3e0fb1c1461053d57600080fd5b8063abbf4b1714610388578063b1283e77146103b3578063bc3b2b1214610413578063bcb296671461049d57600080fd5b806346aed74e1161019d5780637a9e5e4b1161016c5780637a9e5e4b146103195780637c770aae1461032c5780639b19251a1461035a5780639c7697871461036d578063a42206101461037557600080fd5b806346aed74e146102c057806364914439146102d3578063654e51e7146102f35780636a6c575d1461030657600080fd5b806321a7d29b116101d957806321a7d29b1461026f57806327507458146102825780633adec5a7146102a55780633d18b912146102b857600080fd5b80630700037d1461020b5780630a9d85eb1461023e5780630aebeb4e146102515780631885f58014610266575b600080fd5b61022b6102193660046138e1565b60046020526000908152604090205481565b6040519081526020015b60405180910390f35b61022b61024c3660046138fe565b610684565b61026461025f3660046138fe565b6106dc565b005b61022b60025481565b61022b61027d366004613a9e565b610827565b6102956102903660046138fe565b610f77565b6040519015158152602001610235565b61022b6102b33660046138fe565b610fe0565b61026461103c565b61022b6102ce366004613b5f565b6110e8565b6102e66102e13660046138e1565b611104565b6040516102359190613b98565b610264610301366004613bdc565b611292565b61022b610314366004613bdc565b611349565b6102646103273660046138e1565b611419565b61033f61033a366004613bfe565b61150f565b60408051938452602084019290925290820152606001610235565b6102646103683660046138e1565b611920565b6102646119f5565b61022b610383366004613c54565b611c7b565b61039b6103963660046138fe565b611ee4565b6040516001600160401b039091168152602001610235565b6103c66103c13660046138fe565b611fc8565b604080519788526001600160a01b039096166020880152931515948601949094526001600160401b0391821660608601528116608085015290911660a083015260c082015260e001610235565b6104656104213660046138fe565b600c602052600090815260409020546001600160401b0381169065ffffffffffff600160401b8204811691600160701b81049091169060ff600160a01b9091041684565b604080516001600160401b0395909516855265ffffffffffff9384166020860152919092169083015215156060820152608001610235565b61022b6104ab3660046138fe565b612036565b6001546104c3906001600160a01b031681565b6040516001600160a01b039091168152602001610235565b61022b6104e9366004613c54565b612092565b6105016104fc3660046138fe565b6120c3565b6040805195151586526001600160401b03948516602087015265ffffffffffff938416908601529116606084015216608082015260a001610235565b61055061054b366004613c54565b61211c565b60408051928352901515602083015201610235565b6102e66121e7565b61022b61057b366004613c80565b6122cf565b61026461058e366004613c54565b6124e8565b6102956105a13660046138e1565b60056020526000908152604090205460ff1681565b6105c96105c4366004613c54565b6125aa565b6040805195865265ffffffffffff9485166020870152928416928501929092528216606084015216608082015260a001610235565b61061161060c3660046138fe565b61260d565b6040805165ffffffffffff97881681529587166020870152938616938501939093529084166060840152909216608082015260ff90911660a082015260c001610235565b6102e66106633660046138e1565b61266b565b61022b6106763660046138fe565b61288f565b61022b60035481565b6000806106908361293a565b5050905080600a84815481106106a8576106a8613d4a565b6000918252602090912001546106cc919061010090046001600160401b0316613d76565b6001600160401b03169392505050565b600160009054906101000a90046001600160a01b03166001600160a01b0316630505c8c96040518163ffffffff1660e01b8152600401602060405180830381865afa15801561072f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107539190613d9e565b6001600160a01b0316336001600160a01b0316146000906107905760405162461bcd60e51b81526004016107879190613dbb565b60405180910390fd5b5042600a82815481106107a5576107a5613d4a565b90600052602060002001600001600f6101000a81548165ffffffffffff021916908365ffffffffffff1602179055506000600982815481106107e9576107e9613d4a565b6000918252602082206004909102019190915560405182917f8401d05adbea6548a6999cc1540766e6d2ff919292142862893d0e62ec79fbe591a250565b60015460408051630505c8c960e01b815290516000926001600160a01b031691630505c8c99160048083019260209291908290030181865afa158015610871573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108959190613d9e565b6001600160a01b0316336001600160a01b0316146000906108c95760405162461bcd60e51b81526004016107879190613dbb565b5060208301516000906108dd904290613e63565b90506000876001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561091f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109439190613e7a565b60ff16905060008681602002015161095c578751610994565b61096782600a613f81565b6020890151895161098090670de0b6b3a7640000613f8d565b61098a9190613fc2565b6109949190613fc2565b855190915060009084906109ae9063ffffffff1684613fd6565b6001600160401b03166109c19190613fc2565b90506000620186a08a600260200201516109e4906001600160401b038616613f8d565b6109ee9190613fc2565b610a01906001600160401b038516614005565b90506000836001600160401b0316600860009054906101000a90046001600160a01b03166001600160a01b031663860f50486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a86919061401d565b60208d0151610a959190613f8d565b610a9f9190613fc2565b600980546040805160e0810190915290995091925090808d6000602002015181526020018e6001600160a01b031681526020018c600060028110610ae557610ae5613d4a565b60209081029190910151151582526001600160401b0380891683830152878116604080850191909152600060608086018290526080958601829052875460018181018a5598835291859020875160049093020191825593860151818801805488850151968901518616600160a81b0267ffffffffffffffff60a81b19971515600160a01b026001600160a81b03199092166001600160a01b03909416939093171795909516179093559284015160028301805460a0808801518516600160401b026fffffffffffffffffffffffffffffffff19909216939094169290921791909117905560c09093015160039091015580519182019052600a9181908d90602002015115158152602001836001600160401b031681526020018b600060028110610c1157610c11613d4a565b602002015165ffffffffffff1681526020018b600160028110610c3657610c36613d4a565b6020908102919091015165ffffffffffff90811683526001600160401b038088169383019390935284546001810186556000958652828620855191018054868501516040808901516060808b01516080909b01518a16600160a81b0267ffffffffffffffff60a81b199b8916600160781b0265ffffffffffff60781b19938a16600160481b029390931674ffffffffffffffffffffffff0000000000000000001995909b166101000268ffffffffffffffff00199815159890981668ffffffffffffffffff1990961695909517969096179290921697909717179690961695909517909455825160c081018452428216808252928101929092528a1691810191909152600b9290918201908b906020908102919091015163ffffffff168252018a6001602002015163ffffffff1665ffffffffffff1681526020018760ff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548165ffffffffffff021916908365ffffffffffff16021790555060208201518160000160066101000a81548165ffffffffffff021916908365ffffffffffff160217905550604082015181600001600c6101000a81548165ffffffffffff021916908365ffffffffffff16021790555060608201518160000160126101000a81548165ffffffffffff021916908365ffffffffffff16021790555060808201518160000160186101000a81548165ffffffffffff021916908365ffffffffffff16021790555060a082015181600001601e6101000a81548160ff021916908360ff1602179055505050600d60008d6001600160a01b03166001600160a01b031681526020019081526020016000208790806001815401808255809150506001900390600052602060002001600090919091909150558b6001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316887f2f6ff727bd580b1d1b8332e28aa93ed4ec9d8b08d6e30d6b4c9f7aa63ca17f638e600160038110610f4c57610f4c613d4a565b6020020151604051610f6091815260200190565b60405180910390a450505050505095945050505050565b600060098281548110610f8c57610f8c613d4a565b906000526020600020906004020160000154600014158015610fda575042600a8381548110610fbd57610fbd613d4a565b600091825260209091200154600160781b900465ffffffffffff16115b92915050565b6000600b8281548110610ff557610ff5613d4a565b60009182526020909120015461101690600160f01b900460ff16600a614036565b61101f8361288f565b61102884610684565b6110329190613f8d565b610fda9190613fc2565b33600081815260046020819052604080832080549390555163a9059cbb60e01b81529081019290925260248201819052906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af11580156110c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110e49190614045565b5050565b60006110fd836110f78561266b565b846122cf565b9392505050565b6001600160a01b0381166000908152600d6020908152604080832080548251818502810185019093528083526060949383018282801561116357602002820191906000526020600020905b81548152602001906001019080831161114f575b50505050509050600080600090505b82518110156111c25761119d83828151811061119057611190613d4a565b6020026020010151610f77565b156111b057816111ac81614062565b9250505b806111ba81614062565b915050611172565b506000816001600160401b038111156111dd576111dd613917565b604051908082528060200260200182016040528015611206578160200160208202803683370190505b5090506000805b84518110156112875761122b85828151811061119057611190613d4a565b156112755784818151811061124257611242613d4a565b602002602001015183838151811061125c5761125c613d4a565b60209081029190910101528161127181614062565b9250505b8061127f81614062565b91505061120d565b509095945050505050565b600160009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113099190613d9e565b6001600160a01b0316336001600160a01b03161460009061133d5760405162461bcd60e51b81526004016107879190613dbb565b50600391909155600255565b600080600b838154811061135f5761135f613d4a565b60009182526020918290206040805160c081018252919092015465ffffffffffff8082168352600160301b8204811694830194909452600160601b8104841692820192909252600160901b820483166060820152600160c01b8204909216608083015260ff600160f01b9091041660a082018190529091506113e290600a614036565b6113eb84610fe0565b6113fd86670de0b6b3a7640000613f8d565b6114079190613fc2565b6114119190613fc2565b949350505050565b600160009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b8152600401602060405180830381865afa15801561146c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114909190613d9e565b6001600160a01b0316336001600160a01b0316146000906114c45760405162461bcd60e51b81526004016107879190613dbb565b50600180546001600160a01b0319166001600160a01b0383169081179091556040517f2f658b440c35314f52658ea8a740e05b284cdc84dc9ae01e891f21b8933e7cad90600090a250565b6000806000806009898154811061152857611528613d4a565b906000526020600020906004020190506000600a8a8154811061154d5761154d613d4a565b60009182526020918290206040805160a081018252919092015460ff8116151582526001600160401b03610100820481169483019490945265ffffffffffff600160481b8204811693830193909352600160781b8104831660608301819052600160a81b909104909316608082015292504291908216106116105760405162461bcd60e51b815260206004820152601c60248201527f4465706f7369746f72793a206d61726b657420636f6e636c75646564000000006044820152606401610787565b61161a8b82612a27565b60006116258c612c4a565b9050898111156116775760405162461bcd60e51b815260206004820152601f60248201527f4465706f7369746f72793a206d6f7265207468616e206d6178207072696365006044820152606401610787565b600b8c8154811061168a5761168a613d4a565b6000918252602090912001546116ab90600160f01b900460ff16600a614036565b816116be8d670de0b6b3a7640000613f8d565b6116c89190613fc2565b6116d29190613fc2565b60028501549097506001600160401b03168711156117325760405162461bcd60e51b815260206004820152601d60248201527f4465706f7369746f72793a206d61782073697a652065786365656465640000006044820152606401610787565b6001840154600160a01b900460ff1661174b578661174d565b8a5b8460000160008282546117609190613e63565b90915550508251611775578260400151611785565b818360400151611785919061407d565b65ffffffffffff1695508a8460030160008282546117a39190614005565b90915550506002840180548891906008906117cf908490600160401b90046001600160401b03166140a7565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550868460010160158282829054906101000a90046001600160401b031661181991906140a7565b92506101000a8154816001600160401b0302191690836001600160401b031602179055508b7f7880508a48fd3aee88f7e15917d85e39c3ad059e51ad4aca9bb46e7b4938b9618c83604051611878929190918252602082015260400190565b60405180910390a261188d8988888f8c612cc0565b60085460018601549196506118b1916001600160a01b03908116913391168e612f60565b600184015460808401516001600160401b03600160a81b9092048216911610156119075760008085556040518d917f8401d05adbea6548a6999cc1540766e6d2ff919292142862893d0e62ec79fbe591a2611911565b6119118c83613073565b50505050955095509592505050565b600160009054906101000a90046001600160a01b03166001600160a01b0316630505c8c96040518163ffffffff1660e01b8152600401602060405180830381865afa158015611973573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119979190613d9e565b6001600160a01b0316336001600160a01b0316146000906119cb5760405162461bcd60e51b81526004016107879190613dbb565b506001600160a01b03166000908152600560205260409020805460ff19811660ff90911615179055565b600160009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6c9190613d9e565b6001600160a01b0316336001600160a01b03161480611b125750600160009054906101000a90046001600160a01b03166001600160a01b031663452a93206040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ad9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611afd9190613d9e565b6001600160a01b0316336001600160a01b0316145b80611ba45750600160009054906101000a90046001600160a01b03166001600160a01b0316630505c8c96040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b8f9190613d9e565b6001600160a01b0316336001600160a01b0316145b611be25760405162461bcd60e51b815260206004820152600f60248201526e13db9b1e48185d5d1a1bdc9a5e9959608a1b6044820152606401610787565b600160009054906101000a90046001600160a01b03166001600160a01b031663fbfa77cf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c599190613d9e565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0382811660009081526007602090815260408083208584529091528120549091163314611cf15760405162461bcd60e51b815260206004820152601e60248201527f4465706f7369746f72793a207472616e73666572206e6f7420666f756e6400006044820152606401610787565b6001600160a01b0383166000908152600660205260409020805483908110611d1b57611d1b613d4a565b6000918252602090912060029091020160010154600160601b900465ffffffffffff1615611d8b5760405162461bcd60e51b815260206004820152601960248201527f4465706f7369746f72793a206e6f74652072656465656d6564000000000000006044820152606401610787565b503360009081526006602052604080822080546001600160a01b038616845291909220805491929184908110611dc357611dc3613d4a565b600091825260208083208454600181810187559585528285206002948502909201805491909402909101908155918401805492909401805465ffffffffffff19811665ffffffffffff94851690811783558654600160301b908190048616026bffffffffffffffffffffffff1990921617178082558554600160601b9081900485160265ffffffffffff60601b198216811783559554600160901b9081900490941690930265ffffffffffff60901b199095166bffffffffffffffffffffffff60601b19909316929092179390931790556001600160a01b0385168152600690915260409020805483908110611ebb57611ebb613d4a565b60009182526020822060029091020190815560010180546001600160c01b031916905592915050565b600080600b8381548110611efa57611efa613d4a565b600091825260208083206040805160c081018252939091015465ffffffffffff8082168552600160301b82048116938501849052600160601b8204811692850192909252600160901b810482166060850152600160c01b81049091166080840152600160f01b900460ff1660a0830152909250611f779042613e63565b9050816040015165ffffffffffff168160098681548110611f9a57611f9a613d4a565b60009182526020909120600490910201600101546114079190600160a81b90046001600160401b0316613f8d565b60098181548110611fd857600080fd5b600091825260209091206004909102018054600182015460028301546003909301549193506001600160a01b0381169260ff600160a01b830416926001600160401b03600160a81b90930483169282811692600160401b9004169087565b600061204182611ee4565b6009838154811061205457612054613d4a565b906000526020600020906004020160010160159054906101000a90046001600160401b03166120839190613d76565b6001600160401b031692915050565b600d60205281600052604060002081815481106120ae57600080fd5b90600052602060002001600091509150505481565b600a81815481106120d357600080fd5b60009182526020909120015460ff811691506001600160401b03610100820481169165ffffffffffff600160481b8204811692600160781b830490911691600160a81b90041685565b6001600160a01b03821660009081526006602052604081208054829182918590811061214a5761214a613d4a565b60009182526020918290206040805160a0810182526002909302909101805480845260019091015465ffffffffffff80821695850195909552600160301b8104851692840192909252600160601b8204841660608401819052600160901b909204909316608083015291945091501580156121d1575042816040015165ffffffffffff1611155b80156121dd5750805115155b9150509250929050565b60606000805b6009548110156122255761220081610f77565b15612213578161220f81614062565b9250505b8061221d81614062565b9150506121ed565b506000816001600160401b0381111561224057612240613917565b604051908082528060200260200182016040528015612269578160200160208202803683370190505b5090506000805b6009548110156122c65761228381610f77565b156122b4578083838151811061229b5761229b613d4a565b6020908102919091010152816122b081614062565b9250505b806122be81614062565b915050612270565b50909392505050565b600042815b84518110156123ab57600080612303888885815181106122f6576122f6613d4a565b602002602001015161211c565b915091508015612396576001600160a01b0388166000908152600660205260409020875185919089908690811061233c5761233c613d4a565b60200260200101518154811061235457612354613d4a565b9060005260206000209060020201600101600c6101000a81548165ffffffffffff021916908365ffffffffffff16021790555081856123939190614005565b94505b505080806123a390614062565b9150506122d4565b50821561244b5760405163a9059cbb60e01b81526001600160a01b038681166004830152602482018490527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af1158015612421573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124459190614045565b506124e0565b6040516339f4769360e01b81526001600160a01b038681166004830152602482018490527f000000000000000000000000000000000000000000000000000000000000000016906339f47693906044016020604051808303816000875af11580156124ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124de919061401d565b505b509392505050565b33600090815260066020526040902080548290811061250957612509613d4a565b600091825260209091206001600290920201015465ffffffffffff166125715760405162461bcd60e51b815260206004820152601a60248201527f4465706f7369746f72793a206e6f7465206e6f7420666f756e640000000000006044820152606401610787565b3360009081526007602090815260408083209383529290522080546001600160a01b0319166001600160a01b0392909216919091179055565b600660205281600052604060002081815481106125c657600080fd5b60009182526020909120600290910201805460019091015490925065ffffffffffff8082169250600160301b8204811691600160601b8104821691600160901b9091041685565b600b818154811061261d57600080fd5b60009182526020909120015465ffffffffffff8082169250600160301b8204811691600160601b8104821691600160901b8204811691600160c01b810490911690600160f01b900460ff1686565b6001600160a01b0381166000908152600660209081526040808320805482518185028101850190935280835260609493849084015b828210156127165760008481526020908190206040805160a081018252600286029092018054835260019081015465ffffffffffff80821685870152600160301b8204811693850193909352600160601b810483166060850152600160901b9004909116608083015290835290920191016126a0565b505050509050600080600090505b82518110156127a55782818151811061273f5761273f613d4a565b60200260200101516060015165ffffffffffff166000148015612780575082818151811061276f5761276f613d4a565b602002602001015160000151600014155b15612793578161278f81614062565b9250505b8061279d81614062565b915050612724565b506000816001600160401b038111156127c0576127c0613917565b6040519080825280602002602001820160405280156127e9578160200160208202803683370190505b5090506000805b84518110156112875784818151811061280b5761280b613d4a565b60200260200101516060015165ffffffffffff16600014801561284c575084818151811061283b5761283b613d4a565b602002602001015160000151600014155b1561287d578083838151811061286457612864613d4a565b60209081029190910101528161287981614062565b9250505b8061288781614062565b9150506127f0565b600854604080516310c1ea0960e31b815290516000926001600160a01b03169163860f50489160048083019260209291908290030181865afa1580156128d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128fd919061401d565b600b838154811061291057612910613d4a565b60009182526020909120015461293190600160f01b900460ff16600a614036565b61102884612036565b6000818152600c60209081526040808320815160808101835290546001600160401b0381168252600160401b810465ffffffffffff90811694830194909452600160701b810490931691810191909152600160a01b90910460ff16151560608201819052829182916129b757600080600093509350935050612a20565b60208101516129c690426140c9565b9250806040015165ffffffffffff168365ffffffffffff16109150816129ed578051612a1c565b806040015165ffffffffffff168365ffffffffffff168260000151612a129190613fd6565b612a1c91906140e8565b9350505b9193909250565b612a3082611ee4565b60098381548110612a4357612a43613d4a565b906000526020600020906004020160010160158282829054906101000a90046001600160401b0316612a759190613d76565b92506101000a8154816001600160401b0302191690836001600160401b0316021790555080600b8381548110612aad57612aad613d4a565b60009182526020808320909101805465ffffffffffff94909416600160301b026bffffffffffff0000000000001990941693909317909255838152600c909152604090205460ff600160a01b90910416156110e4576000828152600c60205260408120908080612b1c8661293a565b92509250925082600a8781548110612b3657612b36613d4a565b60009182526020909120018054600190612b5f90849061010090046001600160401b0316613d76565b92506101000a8154816001600160401b0302191690836001600160401b031602179055508015612c3657835483908590600090612ba69084906001600160401b0316613d76565b92506101000a8154816001600160401b0302191690836001600160401b031602179055508184600001600e8282829054906101000a900465ffffffffffff16612bef91906140c9565b82546101009290920a65ffffffffffff81810219909316918316021790915585546dffffffffffff00000000000000001916600160401b9188169190910217855550612c42565b835460ff60a01b191684555b505050505050565b6000600b8281548110612c5f57612c5f613d4a565b600091825260209091200154612c8090600160f01b900460ff16600a614036565b612c89836135ea565b600a8481548110612c9c57612c9c613d4a565b600091825260209091200154611032919061010090046001600160401b0316613f8d565b6001600160a01b03858116600090815260066020526040908190208054825160a08101938490526319a948db60e21b90935260a483018890529290919081907f0000000000000000000000000000000000000000000000000000000000000000166366a5236c60c48301602060405180830381865afa158015612d47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d6b919061401d565b815265ffffffffffff428116602080840191909152888216604080850191909152600060608086018290528a8516608096870152875460018181018a55988352848320885160029092020190815593870151939097018054928701519787015196909501518416600160901b0265ffffffffffff60901b19968516600160601b02969096166bffffffffffffffffffffffff60601b19978516600160301b026bffffffffffffffffffffffff199093169390941692909217179490941617919091179055612e3986846136cd565b6008549091506001600160a01b03166340c10f1930612e58848a614005565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612e9e57600080fd5b505af1158015612eb2573d6000803e3d6000fd5b5050604051631b0cd93b60e31b81523060048201526024810189905260006044820152600160648201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316925063d866c9d891506084016020604051808303816000875af1158015612f31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f55919061401d565b505095945050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b1790529151600092839290881691612fc4919061410e565b6000604051808303816000865af19150503d8060008114613001576040519150601f19603f3d011682016040523d82523d6000602084013e613006565b606091505b50915091508180156130305750805115806130305750808060200190518101906130309190614045565b612c425760405162461bcd60e51b81526020600482015260146024820152731514905394d1915497d19493d357d1905253115160621b6044820152606401610787565b6000600b838154811061308857613088613d4a565b60009182526020918290206040805160c081018252929091015465ffffffffffff808216808552600160301b8304821695850195909552600160601b8204811692840192909252600160901b810482166060840152600160c01b810490911660808301819052600160f01b90910460ff1660a083015290925061310a9161407d565b65ffffffffffff168265ffffffffffff16106135e55760006009848154811061313557613135613d4a565b600091825260208083206040805160e08101825260049094029091018054845260018101546001600160a01b0381169385019390935260ff600160a01b8404161515918401919091526001600160401b03600160a81b9092048216606084015260028101548083166080850152600160401b900490911660a08301526003015460c0820152600a80549193508591879081106131d3576131d3613d4a565b6000918252602090912001546131f89190600160781b900465ffffffffffff166140c9565b65ffffffffffff169050600061320d86612c4a565b90506000836040015161322157835161325b565b60a085015161323190600a614036565b8451839061324790670de0b6b3a7640000613f8d565b6132519190613fc2565b61325b9190613fc2565b905082856060015165ffffffffffff16826132769190613f8d565b6132809190613fc2565b6009888154811061329357613293613d4a565b906000526020600020906004020160020160006101000a8154816001600160401b0302191690836001600160401b03160217905550600083866040015165ffffffffffff16836132e39190613f8d565b6132ed9190613fc2565b9050600081600860009054906101000a90046001600160a01b03166001600160a01b031663860f50486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613345573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613369919061401d565b6133739086613f8d565b61337d9190613fc2565b9050887f3070b0e3e52b8713c7489d32604ea4b0970024f74c6e05319269a19bc1e3a9d9600a8b815481106133b4576133b4613d4a565b60009182526020918290200154604080516101009092046001600160401b0390811683528616928201929092520160405180910390a2600a89815481106133fd576133fd613d4a565b6000918252602090912001546001600160401b0361010090910481169082161061346b5780600a8a8154811061343557613435613d4a565b9060005260206000200160000160016101000a8154816001600160401b0302191690836001600160401b031602179055506135a3565b600081600a8b8154811061348157613481613d4a565b6000918252602090912001546134a5919061010090046001600160401b0316613d76565b90506040518060800160405280826001600160401b031681526020018a65ffffffffffff168152602001896080015165ffffffffffff16815260200160011515815250600c60008c815260200190815260200160002060008201518160000160006101000a8154816001600160401b0302191690836001600160401b0316021790555060208201518160000160086101000a81548165ffffffffffff021916908365ffffffffffff160217905550604082015181600001600e6101000a81548165ffffffffffff021916908365ffffffffffff16021790555060608201518160000160146101000a81548160ff021916908315150217905550905050505b87600b8a815481106135b7576135b7613d4a565b6000918252602090912001805465ffffffffffff191665ffffffffffff929092169190911790555050505050505b505050565b600854604080516310c1ea0960e31b815290516000926001600160a01b03169163860f50489160048083019260209291908290030181865afa158015613634573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613658919061401d565b600b838154811061366b5761366b613d4a565b60009182526020909120015461368c90600160f01b900460ff16600a614036565b6009848154811061369f5761369f613d4a565b60009182526020909120600490910201600101546110329190600160a81b90046001600160401b0316613f8d565b600080612710600254856136e19190613f8d565b6136eb9190613fc2565b90506000612710600354866137009190613f8d565b61370a9190613fc2565b6001600160a01b03851660009081526005602052604090205490915060ff1615613807576001600160a01b03841660009081526004602052604081208054839290613756908490614005565b909155505060015460408051630229549960e51b8152905184926004926000926001600160a01b039092169163452a93209180860191602091819003870181865afa1580156137a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137cd9190613d9e565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008282546137fc9190614005565b909155506138b69050565b6138118183614005565b60015460408051630229549960e51b815290516004926000926001600160a01b039091169163452a93209180860191602091819003870181865afa15801561385d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138819190613d9e565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008282546138b09190614005565b90915550505b6138c08183614005565b95945050505050565b6001600160a01b03811681146138de57600080fd5b50565b6000602082840312156138f357600080fd5b81356110fd816138c9565b60006020828403121561391057600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b038111828210171561394f5761394f613917565b60405290565b604051601f8201601f191681016001600160401b038111828210171561397d5761397d613917565b604052919050565b6000604051606081018181106001600160401b03821117156139a9576139a9613917565b60405290508060608301848111156139c057600080fd5b835b818110156139da5780358352602092830192016139c2565b50505092915050565b80151581146138de57600080fd5b80356139fc816139e3565b919050565b600082601f830112613a1257600080fd5b613a1a61392d565b806040840185811115613a2c57600080fd5b845b81811015611287578035845260209384019301613a2e565b600082601f830112613a5757600080fd5b613a5f61392d565b806040840185811115613a7157600080fd5b845b8181101561128757803563ffffffff81168114613a905760008081fd5b845260209384019301613a73565b60008060008060006101408688031215613ab757600080fd5b8535613ac2816138c9565b94506020603f87018813613ad557600080fd5b613ae188828901613985565b945087609f880112613af257600080fd5b613afa61392d565b8060c089018a811115613b0c57600080fd5b60808a015b81811015613b31578035613b24816139e3565b8452928401928401613b11565b50819650613b3f8b82613a01565b955050505050613b53876101008801613a46565b90509295509295909350565b60008060408385031215613b7257600080fd5b8235613b7d816138c9565b91506020830135613b8d816139e3565b809150509250929050565b6020808252825182820181905260009190848201906040850190845b81811015613bd057835183529284019291840191600101613bb4565b50909695505050505050565b60008060408385031215613bef57600080fd5b50508035926020909101359150565b600080600080600060a08688031215613c1657600080fd5b8535945060208601359350604086013592506060860135613c36816138c9565b91506080860135613c46816138c9565b809150509295509295909350565b60008060408385031215613c6757600080fd5b8235613c72816138c9565b946020939093013593505050565b600080600060608486031215613c9557600080fd5b8335613ca0816138c9565b92506020848101356001600160401b0380821115613cbd57600080fd5b818701915087601f830112613cd157600080fd5b813581811115613ce357613ce3613917565b8060051b9150613cf4848301613955565b818152918301840191848101908a841115613d0e57600080fd5b938501935b83851015613d2c57843582529385019390850190613d13565b809750505050505050613d41604085016139f1565b90509250925092565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001600160401b0383811690831681811015613d9657613d96613d60565b039392505050565b600060208284031215613db057600080fd5b81516110fd816138c9565b600060208083526000845481600182811c915080831680613ddd57607f831692505b858310811415613dfb57634e487b7160e01b85526022600452602485fd5b878601838152602001818015613e185760018114613e2957613e54565b60ff19861682528782019650613e54565b60008b81526020902060005b86811015613e4e57815484820152908501908901613e35565b83019750505b50949998505050505050505050565b600082821015613e7557613e75613d60565b500390565b600060208284031215613e8c57600080fd5b815160ff811681146110fd57600080fd5b600181815b80851115613ed8578160001904821115613ebe57613ebe613d60565b80851615613ecb57918102915b93841c9390800290613ea2565b509250929050565b600082613eef57506001610fda565b81613efc57506000610fda565b8160018114613f125760028114613f1c57613f38565b6001915050610fda565b60ff841115613f2d57613f2d613d60565b50506001821b610fda565b5060208310610133831016604e8410600b8410161715613f5b575081810a610fda565b613f658383613e9d565b8060001904821115613f7957613f79613d60565b029392505050565b60006110fd8383613ee0565b6000816000190483118215151615613fa757613fa7613d60565b500290565b634e487b7160e01b600052601260045260246000fd5b600082613fd157613fd1613fac565b500490565b60006001600160401b0380831681851681830481118215151615613ffc57613ffc613d60565b02949350505050565b6000821982111561401857614018613d60565b500190565b60006020828403121561402f57600080fd5b5051919050565b60006110fd60ff841683613ee0565b60006020828403121561405757600080fd5b81516110fd816139e3565b600060001982141561407657614076613d60565b5060010190565b600065ffffffffffff80831681851680830382111561409e5761409e613d60565b01949350505050565b60006001600160401b0380831681851680830382111561409e5761409e613d60565b600065ffffffffffff83811690831681811015613d9657613d96613d60565b60006001600160401b038084168061410257614102613fac565b92169190910492915050565b6000825160005b8181101561412f5760208186018101518583015201614115565b8181111561413e576000828501525b50919091019291505056fea2646970667358221220c384bcf33bc936c3ca868bc747f4cc3d64976326f8118d1fbc2250776bc36a4164736f6c634300080c0033",
"opcodes": "PUSH2 0x120 PUSH1 0x40 MSTORE PUSH1 0xC PUSH1 0xE0 DUP2 SWAP1 MSTORE PUSH12 0x15539055551213D492569151 PUSH1 0xA2 SHL PUSH2 0x100 SWAP1 DUP2 MSTORE PUSH3 0x31 SWAP2 PUSH1 0x0 SWAP2 SWAP1 PUSH3 0x17B JUMP JUMPDEST POP CALLVALUE DUP1 ISZERO PUSH3 0x3F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x44E6 CODESIZE SUB DUP1 PUSH3 0x44E6 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH3 0x62 SWAP2 PUSH3 0x23A JUMP JUMPDEST PUSH1 0x1 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD DUP7 SWAP2 DUP7 SWAP2 DUP7 SWAP2 DUP7 SWAP2 DUP7 SWAP2 DUP7 SWAP2 DUP7 SWAP2 DUP4 SWAP2 PUSH32 0x2F658B440C35314F52658EA8A740E05B284CDC84DC9AE01E891F21B8933E7CAD SWAP1 PUSH1 0x0 SWAP1 LOG2 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND PUSH1 0x80 MSTORE SWAP4 DUP5 AND PUSH1 0xA0 MSTORE POP SWAP1 DUP3 AND PUSH1 0xC0 MSTORE PUSH1 0x8 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP2 DUP4 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH4 0x95EA7B3 PUSH1 0xE0 SHL DUP2 MSTORE DUP6 DUP3 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH19 0x2CD76FE086B93CE2F768A00B22A00000000000 PUSH1 0x24 DUP3 ADD MSTORE SWAP1 DUP8 AND SWAP3 POP PUSH4 0x95EA7B3 SWAP2 POP PUSH1 0x44 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 GAS CALL ISZERO DUP1 ISZERO PUSH3 0x149 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH3 0x16F SWAP2 SWAP1 PUSH3 0x2BA JUMP JUMPDEST POP POP POP POP POP POP PUSH3 0x322 JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH3 0x189 SWAP1 PUSH3 0x2E5 JUMP JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH3 0x1AD JUMPI PUSH1 0x0 DUP6 SSTORE PUSH3 0x1F8 JUMP JUMPDEST DUP3 PUSH1 0x1F LT PUSH3 0x1C8 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH3 0x1F8 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH3 0x1F8 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH3 0x1F8 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH3 0x1DB JUMP JUMPDEST POP PUSH3 0x206 SWAP3 SWAP2 POP PUSH3 0x20A JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST JUMPDEST DUP1 DUP3 GT ISZERO PUSH3 0x206 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH3 0x20B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH3 0x237 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH3 0x253 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 MLOAD PUSH3 0x260 DUP2 PUSH3 0x221 JUMP JUMPDEST PUSH1 0x20 DUP8 ADD MLOAD SWAP1 SWAP6 POP PUSH3 0x273 DUP2 PUSH3 0x221 JUMP JUMPDEST PUSH1 0x40 DUP8 ADD MLOAD SWAP1 SWAP5 POP PUSH3 0x286 DUP2 PUSH3 0x221 JUMP JUMPDEST PUSH1 0x60 DUP8 ADD MLOAD SWAP1 SWAP4 POP PUSH3 0x299 DUP2 PUSH3 0x221 JUMP JUMPDEST PUSH1 0x80 DUP8 ADD MLOAD SWAP1 SWAP3 POP PUSH3 0x2AC DUP2 PUSH3 0x221 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH3 0x2CD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH3 0x2DE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 DUP2 DUP2 SHR SWAP1 DUP3 AND DUP1 PUSH3 0x2FA JUMPI PUSH1 0x7F DUP3 AND SWAP2 POP JUMPDEST PUSH1 0x20 DUP3 LT DUP2 EQ ISZERO PUSH3 0x31C JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x80 MLOAD PUSH1 0xA0 MLOAD PUSH1 0xC0 MLOAD PUSH2 0x417F PUSH3 0x367 PUSH1 0x0 CODECOPY PUSH1 0x0 DUP2 DUP2 PUSH2 0x2471 ADD MSTORE PUSH2 0x2EDE ADD MSTORE PUSH1 0x0 DUP2 DUP2 PUSH2 0x23D8 ADD MSTORE PUSH2 0x2D01 ADD MSTORE PUSH1 0x0 DUP2 DUP2 PUSH2 0xEEF ADD MSTORE PUSH2 0x1077 ADD MSTORE PUSH2 0x417F PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x206 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xABBF4B17 GT PUSH2 0x11A JUMPI DUP1 PUSH4 0xC9B67AF5 GT PUSH2 0xAD JUMPI DUP1 PUSH4 0xE0B117FF GT PUSH2 0x7C JUMPI DUP1 PUSH4 0xE0B117FF EQ PUSH2 0x5B6 JUMPI DUP1 PUSH4 0xE3684E39 EQ PUSH2 0x5FE JUMPI DUP1 PUSH4 0xE481B265 EQ PUSH2 0x655 JUMPI DUP1 PUSH4 0xF1B7DC78 EQ PUSH2 0x668 JUMPI DUP1 PUSH4 0xF3191A46 EQ PUSH2 0x67B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xC9B67AF5 EQ PUSH2 0x565 JUMPI DUP1 PUSH4 0xD62FBDD3 EQ PUSH2 0x56D JUMPI DUP1 PUSH4 0xD6DB4DF8 EQ PUSH2 0x580 JUMPI DUP1 PUSH4 0xD936547E EQ PUSH2 0x593 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xBF7E214F GT PUSH2 0xE9 JUMPI DUP1 PUSH4 0xBF7E214F EQ PUSH2 0x4B0 JUMPI DUP1 PUSH4 0xC0680E20 EQ PUSH2 0x4DB JUMPI DUP1 PUSH4 0xC0AA0E8A EQ PUSH2 0x4EE JUMPI DUP1 PUSH4 0xC3E0FB1C EQ PUSH2 0x53D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xABBF4B17 EQ PUSH2 0x388 JUMPI DUP1 PUSH4 0xB1283E77 EQ PUSH2 0x3B3 JUMPI DUP1 PUSH4 0xBC3B2B12 EQ PUSH2 0x413 JUMPI DUP1 PUSH4 0xBCB29667 EQ PUSH2 0x49D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x46AED74E GT PUSH2 0x19D JUMPI DUP1 PUSH4 0x7A9E5E4B GT PUSH2 0x16C JUMPI DUP1 PUSH4 0x7A9E5E4B EQ PUSH2 0x319 JUMPI DUP1 PUSH4 0x7C770AAE EQ PUSH2 0x32C JUMPI DUP1 PUSH4 0x9B19251A EQ PUSH2 0x35A JUMPI DUP1 PUSH4 0x9C769787 EQ PUSH2 0x36D JUMPI DUP1 PUSH4 0xA4220610 EQ PUSH2 0x375 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x46AED74E EQ PUSH2 0x2C0 JUMPI DUP1 PUSH4 0x64914439 EQ PUSH2 0x2D3 JUMPI DUP1 PUSH4 0x654E51E7 EQ PUSH2 0x2F3 JUMPI DUP1 PUSH4 0x6A6C575D EQ PUSH2 0x306 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x21A7D29B GT PUSH2 0x1D9 JUMPI DUP1 PUSH4 0x21A7D29B EQ PUSH2 0x26F JUMPI DUP1 PUSH4 0x27507458 EQ PUSH2 0x282 JUMPI DUP1 PUSH4 0x3ADEC5A7 EQ PUSH2 0x2A5 JUMPI DUP1 PUSH4 0x3D18B912 EQ PUSH2 0x2B8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x700037D EQ PUSH2 0x20B JUMPI DUP1 PUSH4 0xA9D85EB EQ PUSH2 0x23E JUMPI DUP1 PUSH4 0xAEBEB4E EQ PUSH2 0x251 JUMPI DUP1 PUSH4 0x1885F580 EQ PUSH2 0x266 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x22B PUSH2 0x219 CALLDATASIZE PUSH1 0x4 PUSH2 0x38E1 JUMP JUMPDEST PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x22B PUSH2 0x24C CALLDATASIZE PUSH1 0x4 PUSH2 0x38FE JUMP JUMPDEST PUSH2 0x684 JUMP JUMPDEST PUSH2 0x264 PUSH2 0x25F CALLDATASIZE PUSH1 0x4 PUSH2 0x38FE JUMP JUMPDEST PUSH2 0x6DC JUMP JUMPDEST STOP JUMPDEST PUSH2 0x22B PUSH1 0x2 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x22B PUSH2 0x27D CALLDATASIZE PUSH1 0x4 PUSH2 0x3A9E JUMP JUMPDEST PUSH2 0x827 JUMP JUMPDEST PUSH2 0x295 PUSH2 0x290 CALLDATASIZE PUSH1 0x4 PUSH2 0x38FE JUMP JUMPDEST PUSH2 0xF77 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x235 JUMP JUMPDEST PUSH2 0x22B PUSH2 0x2B3 CALLDATASIZE PUSH1 0x4 PUSH2 0x38FE JUMP JUMPDEST PUSH2 0xFE0 JUMP JUMPDEST PUSH2 0x264 PUSH2 0x103C JUMP JUMPDEST PUSH2 0x22B PUSH2 0x2CE CALLDATASIZE PUSH1 0x4 PUSH2 0x3B5F JUMP JUMPDEST PUSH2 0x10E8 JUMP JUMPDEST PUSH2 0x2E6 PUSH2 0x2E1 CALLDATASIZE PUSH1 0x4 PUSH2 0x38E1 JUMP JUMPDEST PUSH2 0x1104 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x235 SWAP2 SWAP1 PUSH2 0x3B98 JUMP JUMPDEST PUSH2 0x264 PUSH2 0x301 CALLDATASIZE PUSH1 0x4 PUSH2 0x3BDC JUMP JUMPDEST PUSH2 0x1292 JUMP JUMPDEST PUSH2 0x22B PUSH2 0x314 CALLDATASIZE PUSH1 0x4 PUSH2 0x3BDC JUMP JUMPDEST PUSH2 0x1349 JUMP JUMPDEST PUSH2 0x264 PUSH2 0x327 CALLDATASIZE PUSH1 0x4 PUSH2 0x38E1 JUMP JUMPDEST PUSH2 0x1419 JUMP JUMPDEST PUSH2 0x33F PUSH2 0x33A CALLDATASIZE PUSH1 0x4 PUSH2 0x3BFE JUMP JUMPDEST PUSH2 0x150F JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP4 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP3 SWAP1 SWAP3 MSTORE SWAP1 DUP3 ADD MSTORE PUSH1 0x60 ADD PUSH2 0x235 JUMP JUMPDEST PUSH2 0x264 PUSH2 0x368 CALLDATASIZE PUSH1 0x4 PUSH2 0x38E1 JUMP JUMPDEST PUSH2 0x1920 JUMP JUMPDEST PUSH2 0x264 PUSH2 0x19F5 JUMP JUMPDEST PUSH2 0x22B PUSH2 0x383 CALLDATASIZE PUSH1 0x4 PUSH2 0x3C54 JUMP JUMPDEST PUSH2 0x1C7B JUMP JUMPDEST PUSH2 0x39B PUSH2 0x396 CALLDATASIZE PUSH1 0x4 PUSH2 0x38FE JUMP JUMPDEST PUSH2 0x1EE4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x235 JUMP JUMPDEST PUSH2 0x3C6 PUSH2 0x3C1 CALLDATASIZE PUSH1 0x4 PUSH2 0x38FE JUMP JUMPDEST PUSH2 0x1FC8 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP8 DUP9 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP7 AND PUSH1 0x20 DUP9 ADD MSTORE SWAP4 ISZERO ISZERO SWAP5 DUP7 ADD SWAP5 SWAP1 SWAP5 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB SWAP2 DUP3 AND PUSH1 0x60 DUP7 ADD MSTORE DUP2 AND PUSH1 0x80 DUP6 ADD MSTORE SWAP1 SWAP2 AND PUSH1 0xA0 DUP4 ADD MSTORE PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0xE0 ADD PUSH2 0x235 JUMP JUMPDEST PUSH2 0x465 PUSH2 0x421 CALLDATASIZE PUSH1 0x4 PUSH2 0x38FE JUMP JUMPDEST PUSH1 0xC PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 AND SWAP1 PUSH6 0xFFFFFFFFFFFF PUSH1 0x1 PUSH1 0x40 SHL DUP3 DIV DUP2 AND SWAP2 PUSH1 0x1 PUSH1 0x70 SHL DUP2 DIV SWAP1 SWAP2 AND SWAP1 PUSH1 0xFF PUSH1 0x1 PUSH1 0xA0 SHL SWAP1 SWAP2 DIV AND DUP5 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB SWAP6 SWAP1 SWAP6 AND DUP6 MSTORE PUSH6 0xFFFFFFFFFFFF SWAP4 DUP5 AND PUSH1 0x20 DUP7 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP4 ADD MSTORE ISZERO ISZERO PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD PUSH2 0x235 JUMP JUMPDEST PUSH2 0x22B PUSH2 0x4AB CALLDATASIZE PUSH1 0x4 PUSH2 0x38FE JUMP JUMPDEST PUSH2 0x2036 JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH2 0x4C3 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x235 JUMP JUMPDEST PUSH2 0x22B PUSH2 0x4E9 CALLDATASIZE PUSH1 0x4 PUSH2 0x3C54 JUMP JUMPDEST PUSH2 0x2092 JUMP JUMPDEST PUSH2 0x501 PUSH2 0x4FC CALLDATASIZE PUSH1 0x4 PUSH2 0x38FE JUMP JUMPDEST PUSH2 0x20C3 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP6 ISZERO ISZERO DUP7 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB SWAP5 DUP6 AND PUSH1 0x20 DUP8 ADD MSTORE PUSH6 0xFFFFFFFFFFFF SWAP4 DUP5 AND SWAP1 DUP7 ADD MSTORE SWAP2 AND PUSH1 0x60 DUP5 ADD MSTORE AND PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0xA0 ADD PUSH2 0x235 JUMP JUMPDEST PUSH2 0x550 PUSH2 0x54B CALLDATASIZE PUSH1 0x4 PUSH2 0x3C54 JUMP JUMPDEST PUSH2 0x211C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP3 DUP4 MSTORE SWAP1 ISZERO ISZERO PUSH1 0x20 DUP4 ADD MSTORE ADD PUSH2 0x235 JUMP JUMPDEST PUSH2 0x2E6 PUSH2 0x21E7 JUMP JUMPDEST PUSH2 0x22B PUSH2 0x57B CALLDATASIZE PUSH1 0x4 PUSH2 0x3C80 JUMP JUMPDEST PUSH2 0x22CF JUMP JUMPDEST PUSH2 0x264 PUSH2 0x58E CALLDATASIZE PUSH1 0x4 PUSH2 0x3C54 JUMP JUMPDEST PUSH2 0x24E8 JUMP JUMPDEST PUSH2 0x295 PUSH2 0x5A1 CALLDATASIZE PUSH1 0x4 PUSH2 0x38E1 JUMP JUMPDEST PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH2 0x5C9 PUSH2 0x5C4 CALLDATASIZE PUSH1 0x4 PUSH2 0x3C54 JUMP JUMPDEST PUSH2 0x25AA JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP6 DUP7 MSTORE PUSH6 0xFFFFFFFFFFFF SWAP5 DUP6 AND PUSH1 0x20 DUP8 ADD MSTORE SWAP3 DUP5 AND SWAP3 DUP6 ADD SWAP3 SWAP1 SWAP3 MSTORE DUP3 AND PUSH1 0x60 DUP5 ADD MSTORE AND PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0xA0 ADD PUSH2 0x235 JUMP JUMPDEST PUSH2 0x611 PUSH2 0x60C CALLDATASIZE PUSH1 0x4 PUSH2 0x38FE JUMP JUMPDEST PUSH2 0x260D JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH6 0xFFFFFFFFFFFF SWAP8 DUP9 AND DUP2 MSTORE SWAP6 DUP8 AND PUSH1 0x20 DUP8 ADD MSTORE SWAP4 DUP7 AND SWAP4 DUP6 ADD SWAP4 SWAP1 SWAP4 MSTORE SWAP1 DUP5 AND PUSH1 0x60 DUP5 ADD MSTORE SWAP1 SWAP3 AND PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0xFF SWAP1 SWAP2 AND PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xC0 ADD PUSH2 0x235 JUMP JUMPDEST PUSH2 0x2E6 PUSH2 0x663 CALLDATASIZE PUSH1 0x4 PUSH2 0x38E1 JUMP JUMPDEST PUSH2 0x266B JUMP JUMPDEST PUSH2 0x22B PUSH2 0x676 CALLDATASIZE PUSH1 0x4 PUSH2 0x38FE JUMP JUMPDEST PUSH2 0x288F JUMP JUMPDEST PUSH2 0x22B PUSH1 0x3 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x690 DUP4 PUSH2 0x293A JUMP JUMPDEST POP POP SWAP1 POP DUP1 PUSH1 0xA DUP5 DUP2 SLOAD DUP2 LT PUSH2 0x6A8 JUMPI PUSH2 0x6A8 PUSH2 0x3D4A JUMP JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH2 0x6CC SWAP2 SWAP1 PUSH2 0x100 SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND PUSH2 0x3D76 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x505C8C9 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x72F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x753 SWAP2 SWAP1 PUSH2 0x3D9E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH1 0x0 SWAP1 PUSH2 0x790 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x787 SWAP2 SWAP1 PUSH2 0x3DBB JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP TIMESTAMP PUSH1 0xA DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x7A5 JUMPI PUSH2 0x7A5 PUSH2 0x3D4A JUMP JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 ADD PUSH1 0xF PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH6 0xFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH6 0xFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x0 PUSH1 0x9 DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x7E9 JUMPI PUSH2 0x7E9 PUSH2 0x3D4A JUMP JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 KECCAK256 PUSH1 0x4 SWAP1 SWAP2 MUL ADD SWAP2 SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD DUP3 SWAP2 PUSH32 0x8401D05ADBEA6548A6999CC1540766E6D2FF919292142862893D0E62EC79FBE5 SWAP2 LOG2 POP JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x505C8C9 PUSH1 0xE0 SHL DUP2 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x505C8C9 SWAP2 PUSH1 0x4 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x871 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x895 SWAP2 SWAP1 PUSH2 0x3D9E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH1 0x0 SWAP1 PUSH2 0x8C9 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x787 SWAP2 SWAP1 PUSH2 0x3DBB JUMP JUMPDEST POP PUSH1 0x20 DUP4 ADD MLOAD PUSH1 0x0 SWAP1 PUSH2 0x8DD SWAP1 TIMESTAMP SWAP1 PUSH2 0x3E63 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP8 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x313CE567 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x91F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x943 SWAP2 SWAP1 PUSH2 0x3E7A JUMP JUMPDEST PUSH1 0xFF AND SWAP1 POP PUSH1 0x0 DUP7 DUP2 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x95C JUMPI DUP8 MLOAD PUSH2 0x994 JUMP JUMPDEST PUSH2 0x967 DUP3 PUSH1 0xA PUSH2 0x3F81 JUMP JUMPDEST PUSH1 0x20 DUP10 ADD MLOAD DUP10 MLOAD PUSH2 0x980 SWAP1 PUSH8 0xDE0B6B3A7640000 PUSH2 0x3F8D JUMP JUMPDEST PUSH2 0x98A SWAP2 SWAP1 PUSH2 0x3FC2 JUMP JUMPDEST PUSH2 0x994 SWAP2 SWAP1 PUSH2 0x3FC2 JUMP JUMPDEST DUP6 MLOAD SWAP1 SWAP2 POP PUSH1 0x0 SWAP1 DUP5 SWAP1 PUSH2 0x9AE SWAP1 PUSH4 0xFFFFFFFF AND DUP5 PUSH2 0x3FD6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND PUSH2 0x9C1 SWAP2 SWAP1 PUSH2 0x3FC2 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH3 0x186A0 DUP11 PUSH1 0x2 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x9E4 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP7 AND PUSH2 0x3F8D JUMP JUMPDEST PUSH2 0x9EE SWAP2 SWAP1 PUSH2 0x3FC2 JUMP JUMPDEST PUSH2 0xA01 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP6 AND PUSH2 0x4005 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND PUSH1 0x8 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x860F5048 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xA62 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xA86 SWAP2 SWAP1 PUSH2 0x401D JUMP JUMPDEST PUSH1 0x20 DUP14 ADD MLOAD PUSH2 0xA95 SWAP2 SWAP1 PUSH2 0x3F8D JUMP JUMPDEST PUSH2 0xA9F SWAP2 SWAP1 PUSH2 0x3FC2 JUMP JUMPDEST PUSH1 0x9 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0xE0 DUP2 ADD SWAP1 SWAP2 MSTORE SWAP1 SWAP10 POP SWAP2 SWAP3 POP SWAP1 DUP1 DUP14 PUSH1 0x0 PUSH1 0x20 MUL ADD MLOAD DUP2 MSTORE PUSH1 0x20 ADD DUP15 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP13 PUSH1 0x0 PUSH1 0x2 DUP2 LT PUSH2 0xAE5 JUMPI PUSH2 0xAE5 PUSH2 0x3D4A JUMP JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD MLOAD ISZERO ISZERO DUP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP10 AND DUP4 DUP4 ADD MSTORE DUP8 DUP2 AND PUSH1 0x40 DUP1 DUP6 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x0 PUSH1 0x60 DUP1 DUP7 ADD DUP3 SWAP1 MSTORE PUSH1 0x80 SWAP6 DUP7 ADD DUP3 SWAP1 MSTORE DUP8 SLOAD PUSH1 0x1 DUP2 DUP2 ADD DUP11 SSTORE SWAP9 DUP4 MSTORE SWAP2 DUP6 SWAP1 KECCAK256 DUP8 MLOAD PUSH1 0x4 SWAP1 SWAP4 MUL ADD SWAP2 DUP3 SSTORE SWAP4 DUP7 ADD MLOAD DUP2 DUP9 ADD DUP1 SLOAD DUP9 DUP6 ADD MLOAD SWAP7 DUP10 ADD MLOAD DUP7 AND PUSH1 0x1 PUSH1 0xA8 SHL MUL PUSH8 0xFFFFFFFFFFFFFFFF PUSH1 0xA8 SHL NOT SWAP8 ISZERO ISZERO PUSH1 0x1 PUSH1 0xA0 SHL MUL PUSH1 0x1 PUSH1 0x1 PUSH1 0xA8 SHL SUB NOT SWAP1 SWAP3 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR OR SWAP6 SWAP1 SWAP6 AND OR SWAP1 SWAP4 SSTORE SWAP3 DUP5 ADD MLOAD PUSH1 0x2 DUP4 ADD DUP1 SLOAD PUSH1 0xA0 DUP1 DUP9 ADD MLOAD DUP6 AND PUSH1 0x1 PUSH1 0x40 SHL MUL PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT SWAP1 SWAP3 AND SWAP4 SWAP1 SWAP5 AND SWAP3 SWAP1 SWAP3 OR SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0xC0 SWAP1 SWAP4 ADD MLOAD PUSH1 0x3 SWAP1 SWAP2 ADD SSTORE DUP1 MLOAD SWAP2 DUP3 ADD SWAP1 MSTORE PUSH1 0xA SWAP2 DUP2 SWAP1 DUP14 SWAP1 PUSH1 0x20 MUL ADD MLOAD ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP12 PUSH1 0x0 PUSH1 0x2 DUP2 LT PUSH2 0xC11 JUMPI PUSH2 0xC11 PUSH2 0x3D4A JUMP JUMPDEST PUSH1 0x20 MUL ADD MLOAD PUSH6 0xFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP12 PUSH1 0x1 PUSH1 0x2 DUP2 LT PUSH2 0xC36 JUMPI PUSH2 0xC36 PUSH2 0x3D4A JUMP JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD MLOAD PUSH6 0xFFFFFFFFFFFF SWAP1 DUP2 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP9 AND SWAP4 DUP4 ADD SWAP4 SWAP1 SWAP4 MSTORE DUP5 SLOAD PUSH1 0x1 DUP2 ADD DUP7 SSTORE PUSH1 0x0 SWAP6 DUP7 MSTORE DUP3 DUP7 KECCAK256 DUP6 MLOAD SWAP2 ADD DUP1 SLOAD DUP7 DUP6 ADD MLOAD PUSH1 0x40 DUP1 DUP10 ADD MLOAD PUSH1 0x60 DUP1 DUP12 ADD MLOAD PUSH1 0x80 SWAP1 SWAP12 ADD MLOAD DUP11 AND PUSH1 0x1 PUSH1 0xA8 SHL MUL PUSH8 0xFFFFFFFFFFFFFFFF PUSH1 0xA8 SHL NOT SWAP12 DUP10 AND PUSH1 0x1 PUSH1 0x78 SHL MUL PUSH6 0xFFFFFFFFFFFF PUSH1 0x78 SHL NOT SWAP4 DUP11 AND PUSH1 0x1 PUSH1 0x48 SHL MUL SWAP4 SWAP1 SWAP4 AND PUSH21 0xFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 NOT SWAP6 SWAP1 SWAP12 AND PUSH2 0x100 MUL PUSH9 0xFFFFFFFFFFFFFFFF00 NOT SWAP9 ISZERO ISZERO SWAP9 SWAP1 SWAP9 AND PUSH9 0xFFFFFFFFFFFFFFFFFF NOT SWAP1 SWAP7 AND SWAP6 SWAP1 SWAP6 OR SWAP7 SWAP1 SWAP7 OR SWAP3 SWAP1 SWAP3 AND SWAP8 SWAP1 SWAP8 OR OR SWAP7 SWAP1 SWAP7 AND SWAP6 SWAP1 SWAP6 OR SWAP1 SWAP5 SSTORE DUP3 MLOAD PUSH1 0xC0 DUP2 ADD DUP5 MSTORE TIMESTAMP DUP3 AND DUP1 DUP3 MSTORE SWAP3 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE DUP11 AND SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xB SWAP3 SWAP1 SWAP2 DUP3 ADD SWAP1 DUP12 SWAP1 PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD MLOAD PUSH4 0xFFFFFFFF AND DUP3 MSTORE ADD DUP11 PUSH1 0x1 PUSH1 0x20 MUL ADD MLOAD PUSH4 0xFFFFFFFF AND PUSH6 0xFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP8 PUSH1 0xFF AND DUP2 MSTORE POP SWAP1 DUP1 PUSH1 0x1 DUP2 SLOAD ADD DUP1 DUP3 SSTORE DUP1 SWAP2 POP POP PUSH1 0x1 SWAP1 SUB SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SWAP2 SWAP1 SWAP2 SWAP1 SWAP2 POP PUSH1 0x0 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH6 0xFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH6 0xFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x20 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x6 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH6 0xFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH6 0xFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x40 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0xC PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH6 0xFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH6 0xFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x60 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x12 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH6 0xFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH6 0xFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x80 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x18 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH6 0xFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH6 0xFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH1 0xA0 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x1E PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0xFF AND MUL OR SWAP1 SSTORE POP POP POP PUSH1 0xD PUSH1 0x0 DUP14 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP8 SWAP1 DUP1 PUSH1 0x1 DUP2 SLOAD ADD DUP1 DUP3 SSTORE DUP1 SWAP2 POP POP PUSH1 0x1 SWAP1 SUB SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SWAP2 SWAP1 SWAP2 SWAP1 SWAP2 POP SSTORE DUP12 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP9 PUSH32 0x2F6FF727BD580B1D1B8332E28AA93ED4EC9D8B08D6E30D6B4C9F7AA63CA17F63 DUP15 PUSH1 0x1 PUSH1 0x3 DUP2 LT PUSH2 0xF4C JUMPI PUSH2 0xF4C PUSH2 0x3D4A JUMP JUMPDEST PUSH1 0x20 MUL ADD MLOAD PUSH1 0x40 MLOAD PUSH2 0xF60 SWAP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP POP POP POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x9 DUP3 DUP2 SLOAD DUP2 LT PUSH2 0xF8C JUMPI PUSH2 0xF8C PUSH2 0x3D4A JUMP JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x4 MUL ADD PUSH1 0x0 ADD SLOAD PUSH1 0x0 EQ ISZERO DUP1 ISZERO PUSH2 0xFDA JUMPI POP TIMESTAMP PUSH1 0xA DUP4 DUP2 SLOAD DUP2 LT PUSH2 0xFBD JUMPI PUSH2 0xFBD PUSH2 0x3D4A JUMP JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x1 PUSH1 0x78 SHL SWAP1 DIV PUSH6 0xFFFFFFFFFFFF AND GT JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xB DUP3 DUP2 SLOAD DUP2 LT PUSH2 0xFF5 JUMPI PUSH2 0xFF5 PUSH2 0x3D4A JUMP JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH2 0x1016 SWAP1 PUSH1 0x1 PUSH1 0xF0 SHL SWAP1 DIV PUSH1 0xFF AND PUSH1 0xA PUSH2 0x4036 JUMP JUMPDEST PUSH2 0x101F DUP4 PUSH2 0x288F JUMP JUMPDEST PUSH2 0x1028 DUP5 PUSH2 0x684 JUMP JUMPDEST PUSH2 0x1032 SWAP2 SWAP1 PUSH2 0x3F8D JUMP JUMPDEST PUSH2 0xFDA SWAP2 SWAP1 PUSH2 0x3FC2 JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD SWAP4 SWAP1 SSTORE MLOAD PUSH4 0xA9059CBB PUSH1 0xE0 SHL DUP2 MSTORE SWAP1 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x24 DUP3 ADD DUP2 SWAP1 MSTORE SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 AND SWAP1 PUSH4 0xA9059CBB SWAP1 PUSH1 0x44 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x10C0 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x10E4 SWAP2 SWAP1 PUSH2 0x4045 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x10FD DUP4 PUSH2 0x10F7 DUP6 PUSH2 0x266B JUMP JUMPDEST DUP5 PUSH2 0x22CF JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xD PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD DUP3 MLOAD DUP2 DUP6 MUL DUP2 ADD DUP6 ADD SWAP1 SWAP4 MSTORE DUP1 DUP4 MSTORE PUSH1 0x60 SWAP5 SWAP4 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x1163 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 ADD SWAP1 DUP1 DUP4 GT PUSH2 0x114F JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP PUSH1 0x0 DUP1 PUSH1 0x0 SWAP1 POP JUMPDEST DUP3 MLOAD DUP2 LT ISZERO PUSH2 0x11C2 JUMPI PUSH2 0x119D DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x1190 JUMPI PUSH2 0x1190 PUSH2 0x3D4A JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0xF77 JUMP JUMPDEST ISZERO PUSH2 0x11B0 JUMPI DUP2 PUSH2 0x11AC DUP2 PUSH2 0x4062 JUMP JUMPDEST SWAP3 POP POP JUMPDEST DUP1 PUSH2 0x11BA DUP2 PUSH2 0x4062 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x1172 JUMP JUMPDEST POP PUSH1 0x0 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x11DD JUMPI PUSH2 0x11DD PUSH2 0x3917 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x1206 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP SWAP1 POP PUSH1 0x0 DUP1 JUMPDEST DUP5 MLOAD DUP2 LT ISZERO PUSH2 0x1287 JUMPI PUSH2 0x122B DUP6 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x1190 JUMPI PUSH2 0x1190 PUSH2 0x3D4A JUMP JUMPDEST ISZERO PUSH2 0x1275 JUMPI DUP5 DUP2 DUP2 MLOAD DUP2 LT PUSH2 0x1242 JUMPI PUSH2 0x1242 PUSH2 0x3D4A JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP4 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x125C JUMPI PUSH2 0x125C PUSH2 0x3D4A JUMP JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE DUP2 PUSH2 0x1271 DUP2 PUSH2 0x4062 JUMP JUMPDEST SWAP3 POP POP JUMPDEST DUP1 PUSH2 0x127F DUP2 PUSH2 0x4062 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x120D JUMP JUMPDEST POP SWAP1 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xC340A24 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x12E5 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1309 SWAP2 SWAP1 PUSH2 0x3D9E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH1 0x0 SWAP1 PUSH2 0x133D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x787 SWAP2 SWAP1 PUSH2 0x3DBB JUMP JUMPDEST POP PUSH1 0x3 SWAP2 SWAP1 SWAP2 SSTORE PUSH1 0x2 SSTORE JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0xB DUP4 DUP2 SLOAD DUP2 LT PUSH2 0x135F JUMPI PUSH2 0x135F PUSH2 0x3D4A JUMP JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP2 DUP3 SWAP1 KECCAK256 PUSH1 0x40 DUP1 MLOAD PUSH1 0xC0 DUP2 ADD DUP3 MSTORE SWAP2 SWAP1 SWAP3 ADD SLOAD PUSH6 0xFFFFFFFFFFFF DUP1 DUP3 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0x30 SHL DUP3 DIV DUP2 AND SWAP5 DUP4 ADD SWAP5 SWAP1 SWAP5 MSTORE PUSH1 0x1 PUSH1 0x60 SHL DUP2 DIV DUP5 AND SWAP3 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x1 PUSH1 0x90 SHL DUP3 DIV DUP4 AND PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x1 PUSH1 0xC0 SHL DUP3 DIV SWAP1 SWAP3 AND PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0xFF PUSH1 0x1 PUSH1 0xF0 SHL SWAP1 SWAP2 DIV AND PUSH1 0xA0 DUP3 ADD DUP2 SWAP1 MSTORE SWAP1 SWAP2 POP PUSH2 0x13E2 SWAP1 PUSH1 0xA PUSH2 0x4036 JUMP JUMPDEST PUSH2 0x13EB DUP5 PUSH2 0xFE0 JUMP JUMPDEST PUSH2 0x13FD DUP7 PUSH8 0xDE0B6B3A7640000 PUSH2 0x3F8D JUMP JUMPDEST PUSH2 0x1407 SWAP2 SWAP1 PUSH2 0x3FC2 JUMP JUMPDEST PUSH2 0x1411 SWAP2 SWAP1 PUSH2 0x3FC2 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xC340A24 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x146C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1490 SWAP2 SWAP1 PUSH2 0x3D9E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH1 0x0 SWAP1 PUSH2 0x14C4 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x787 SWAP2 SWAP1 PUSH2 0x3DBB JUMP JUMPDEST POP PUSH1 0x1 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD PUSH32 0x2F658B440C35314F52658EA8A740E05B284CDC84DC9AE01E891F21B8933E7CAD SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x9 DUP10 DUP2 SLOAD DUP2 LT PUSH2 0x1528 JUMPI PUSH2 0x1528 PUSH2 0x3D4A JUMP JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x4 MUL ADD SWAP1 POP PUSH1 0x0 PUSH1 0xA DUP11 DUP2 SLOAD DUP2 LT PUSH2 0x154D JUMPI PUSH2 0x154D PUSH2 0x3D4A JUMP JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP2 DUP3 SWAP1 KECCAK256 PUSH1 0x40 DUP1 MLOAD PUSH1 0xA0 DUP2 ADD DUP3 MSTORE SWAP2 SWAP1 SWAP3 ADD SLOAD PUSH1 0xFF DUP2 AND ISZERO ISZERO DUP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB PUSH2 0x100 DUP3 DIV DUP2 AND SWAP5 DUP4 ADD SWAP5 SWAP1 SWAP5 MSTORE PUSH6 0xFFFFFFFFFFFF PUSH1 0x1 PUSH1 0x48 SHL DUP3 DIV DUP2 AND SWAP4 DUP4 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x1 PUSH1 0x78 SHL DUP2 DIV DUP4 AND PUSH1 0x60 DUP4 ADD DUP2 SWAP1 MSTORE PUSH1 0x1 PUSH1 0xA8 SHL SWAP1 SWAP2 DIV SWAP1 SWAP4 AND PUSH1 0x80 DUP3 ADD MSTORE SWAP3 POP TIMESTAMP SWAP2 SWAP1 DUP3 AND LT PUSH2 0x1610 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369746F72793A206D61726B657420636F6E636C7564656400000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x787 JUMP JUMPDEST PUSH2 0x161A DUP12 DUP3 PUSH2 0x2A27 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1625 DUP13 PUSH2 0x2C4A JUMP JUMPDEST SWAP1 POP DUP10 DUP2 GT ISZERO PUSH2 0x1677 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369746F72793A206D6F7265207468616E206D617820707269636500 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x787 JUMP JUMPDEST PUSH1 0xB DUP13 DUP2 SLOAD DUP2 LT PUSH2 0x168A JUMPI PUSH2 0x168A PUSH2 0x3D4A JUMP JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH2 0x16AB SWAP1 PUSH1 0x1 PUSH1 0xF0 SHL SWAP1 DIV PUSH1 0xFF AND PUSH1 0xA PUSH2 0x4036 JUMP JUMPDEST DUP2 PUSH2 0x16BE DUP14 PUSH8 0xDE0B6B3A7640000 PUSH2 0x3F8D JUMP JUMPDEST PUSH2 0x16C8 SWAP2 SWAP1 PUSH2 0x3FC2 JUMP JUMPDEST PUSH2 0x16D2 SWAP2 SWAP1 PUSH2 0x3FC2 JUMP JUMPDEST PUSH1 0x2 DUP6 ADD SLOAD SWAP1 SWAP8 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND DUP8 GT ISZERO PUSH2 0x1732 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369746F72793A206D61782073697A65206578636565646564000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x787 JUMP JUMPDEST PUSH1 0x1 DUP5 ADD SLOAD PUSH1 0x1 PUSH1 0xA0 SHL SWAP1 DIV PUSH1 0xFF AND PUSH2 0x174B JUMPI DUP7 PUSH2 0x174D JUMP JUMPDEST DUP11 JUMPDEST DUP5 PUSH1 0x0 ADD PUSH1 0x0 DUP3 DUP3 SLOAD PUSH2 0x1760 SWAP2 SWAP1 PUSH2 0x3E63 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP DUP3 MLOAD PUSH2 0x1775 JUMPI DUP3 PUSH1 0x40 ADD MLOAD PUSH2 0x1785 JUMP JUMPDEST DUP2 DUP4 PUSH1 0x40 ADD MLOAD PUSH2 0x1785 SWAP2 SWAP1 PUSH2 0x407D JUMP JUMPDEST PUSH6 0xFFFFFFFFFFFF AND SWAP6 POP DUP11 DUP5 PUSH1 0x3 ADD PUSH1 0x0 DUP3 DUP3 SLOAD PUSH2 0x17A3 SWAP2 SWAP1 PUSH2 0x4005 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP PUSH1 0x2 DUP5 ADD DUP1 SLOAD DUP9 SWAP2 SWAP1 PUSH1 0x8 SWAP1 PUSH2 0x17CF SWAP1 DUP5 SWAP1 PUSH1 0x1 PUSH1 0x40 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND PUSH2 0x40A7 JUMP JUMPDEST SWAP3 POP PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB MUL NOT AND SWAP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND MUL OR SWAP1 SSTORE POP DUP7 DUP5 PUSH1 0x1 ADD PUSH1 0x15 DUP3 DUP3 DUP3 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND PUSH2 0x1819 SWAP2 SWAP1 PUSH2 0x40A7 JUMP JUMPDEST SWAP3 POP PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB MUL NOT AND SWAP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND MUL OR SWAP1 SSTORE POP DUP12 PUSH32 0x7880508A48FD3AEE88F7E15917D85E39C3AD059E51AD4ACA9BB46E7B4938B961 DUP13 DUP4 PUSH1 0x40 MLOAD PUSH2 0x1878 SWAP3 SWAP2 SWAP1 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH2 0x188D DUP10 DUP9 DUP9 DUP16 DUP13 PUSH2 0x2CC0 JUMP JUMPDEST PUSH1 0x8 SLOAD PUSH1 0x1 DUP7 ADD SLOAD SWAP2 SWAP7 POP PUSH2 0x18B1 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND SWAP2 CALLER SWAP2 AND DUP15 PUSH2 0x2F60 JUMP JUMPDEST PUSH1 0x1 DUP5 ADD SLOAD PUSH1 0x80 DUP5 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB PUSH1 0x1 PUSH1 0xA8 SHL SWAP1 SWAP3 DIV DUP3 AND SWAP2 AND LT ISZERO PUSH2 0x1907 JUMPI PUSH1 0x0 DUP1 DUP6 SSTORE PUSH1 0x40 MLOAD DUP14 SWAP2 PUSH32 0x8401D05ADBEA6548A6999CC1540766E6D2FF919292142862893D0E62EC79FBE5 SWAP2 LOG2 PUSH2 0x1911 JUMP JUMPDEST PUSH2 0x1911 DUP13 DUP4 PUSH2 0x3073 JUMP JUMPDEST POP POP POP POP SWAP6 POP SWAP6 POP SWAP6 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x505C8C9 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1973 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1997 SWAP2 SWAP1 PUSH2 0x3D9E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH1 0x0 SWAP1 PUSH2 0x19CB JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x787 SWAP2 SWAP1 PUSH2 0x3DBB JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT DUP2 AND PUSH1 0xFF SWAP1 SWAP2 AND ISZERO OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xC340A24 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1A48 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1A6C SWAP2 SWAP1 PUSH2 0x3D9E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ DUP1 PUSH2 0x1B12 JUMPI POP PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x452A9320 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1AD9 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1AFD SWAP2 SWAP1 PUSH2 0x3D9E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ JUMPDEST DUP1 PUSH2 0x1BA4 JUMPI POP PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x505C8C9 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1B6B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1B8F SWAP2 SWAP1 PUSH2 0x3D9E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ JUMPDEST PUSH2 0x1BE2 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xF PUSH1 0x24 DUP3 ADD MSTORE PUSH15 0x13DB9B1E48185D5D1A1BDC9A5E9959 PUSH1 0x8A SHL PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x787 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xFBFA77CF PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1C35 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1C59 SWAP2 SWAP1 PUSH2 0x3D9E JUMP JUMPDEST PUSH1 0x8 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP6 DUP5 MSTORE SWAP1 SWAP2 MSTORE DUP2 KECCAK256 SLOAD SWAP1 SWAP2 AND CALLER EQ PUSH2 0x1CF1 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369746F72793A207472616E73666572206E6F7420666F756E640000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x787 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD DUP4 SWAP1 DUP2 LT PUSH2 0x1D1B JUMPI PUSH2 0x1D1B PUSH2 0x3D4A JUMP JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 PUSH1 0x2 SWAP1 SWAP2 MUL ADD PUSH1 0x1 ADD SLOAD PUSH1 0x1 PUSH1 0x60 SHL SWAP1 DIV PUSH6 0xFFFFFFFFFFFF AND ISZERO PUSH2 0x1D8B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x19 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369746F72793A206E6F74652072656465656D656400000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x787 JUMP JUMPDEST POP CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND DUP5 MSTORE SWAP2 SWAP1 SWAP3 KECCAK256 DUP1 SLOAD SWAP2 SWAP3 SWAP2 DUP5 SWAP1 DUP2 LT PUSH2 0x1DC3 JUMPI PUSH2 0x1DC3 PUSH2 0x3D4A JUMP JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 KECCAK256 DUP5 SLOAD PUSH1 0x1 DUP2 DUP2 ADD DUP8 SSTORE SWAP6 DUP6 MSTORE DUP3 DUP6 KECCAK256 PUSH1 0x2 SWAP5 DUP6 MUL SWAP1 SWAP3 ADD DUP1 SLOAD SWAP2 SWAP1 SWAP5 MUL SWAP1 SWAP2 ADD SWAP1 DUP2 SSTORE SWAP2 DUP5 ADD DUP1 SLOAD SWAP3 SWAP1 SWAP5 ADD DUP1 SLOAD PUSH6 0xFFFFFFFFFFFF NOT DUP2 AND PUSH6 0xFFFFFFFFFFFF SWAP5 DUP6 AND SWAP1 DUP2 OR DUP4 SSTORE DUP7 SLOAD PUSH1 0x1 PUSH1 0x30 SHL SWAP1 DUP2 SWAP1 DIV DUP7 AND MUL PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF NOT SWAP1 SWAP3 AND OR OR DUP1 DUP3 SSTORE DUP6 SLOAD PUSH1 0x1 PUSH1 0x60 SHL SWAP1 DUP2 SWAP1 DIV DUP6 AND MUL PUSH6 0xFFFFFFFFFFFF PUSH1 0x60 SHL NOT DUP3 AND DUP2 OR DUP4 SSTORE SWAP6 SLOAD PUSH1 0x1 PUSH1 0x90 SHL SWAP1 DUP2 SWAP1 DIV SWAP1 SWAP5 AND SWAP1 SWAP4 MUL PUSH6 0xFFFFFFFFFFFF PUSH1 0x90 SHL NOT SWAP1 SWAP6 AND PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x60 SHL NOT SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP4 SWAP1 SWAP4 OR SWAP1 SSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND DUP2 MSTORE PUSH1 0x6 SWAP1 SWAP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD DUP4 SWAP1 DUP2 LT PUSH2 0x1EBB JUMPI PUSH2 0x1EBB PUSH2 0x3D4A JUMP JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 KECCAK256 PUSH1 0x2 SWAP1 SWAP2 MUL ADD SWAP1 DUP2 SSTORE PUSH1 0x1 ADD DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB NOT AND SWAP1 SSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0xB DUP4 DUP2 SLOAD DUP2 LT PUSH2 0x1EFA JUMPI PUSH2 0x1EFA PUSH2 0x3D4A JUMP JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 KECCAK256 PUSH1 0x40 DUP1 MLOAD PUSH1 0xC0 DUP2 ADD DUP3 MSTORE SWAP4 SWAP1 SWAP2 ADD SLOAD PUSH6 0xFFFFFFFFFFFF DUP1 DUP3 AND DUP6 MSTORE PUSH1 0x1 PUSH1 0x30 SHL DUP3 DIV DUP2 AND SWAP4 DUP6 ADD DUP5 SWAP1 MSTORE PUSH1 0x1 PUSH1 0x60 SHL DUP3 DIV DUP2 AND SWAP3 DUP6 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x1 PUSH1 0x90 SHL DUP2 DIV DUP3 AND PUSH1 0x60 DUP6 ADD MSTORE PUSH1 0x1 PUSH1 0xC0 SHL DUP2 DIV SWAP1 SWAP2 AND PUSH1 0x80 DUP5 ADD MSTORE PUSH1 0x1 PUSH1 0xF0 SHL SWAP1 DIV PUSH1 0xFF AND PUSH1 0xA0 DUP4 ADD MSTORE SWAP1 SWAP3 POP PUSH2 0x1F77 SWAP1 TIMESTAMP PUSH2 0x3E63 JUMP JUMPDEST SWAP1 POP DUP2 PUSH1 0x40 ADD MLOAD PUSH6 0xFFFFFFFFFFFF AND DUP2 PUSH1 0x9 DUP7 DUP2 SLOAD DUP2 LT PUSH2 0x1F9A JUMPI PUSH2 0x1F9A PUSH2 0x3D4A JUMP JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 PUSH1 0x4 SWAP1 SWAP2 MUL ADD PUSH1 0x1 ADD SLOAD PUSH2 0x1407 SWAP2 SWAP1 PUSH1 0x1 PUSH1 0xA8 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND PUSH2 0x3F8D JUMP JUMPDEST PUSH1 0x9 DUP2 DUP2 SLOAD DUP2 LT PUSH2 0x1FD8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 PUSH1 0x4 SWAP1 SWAP2 MUL ADD DUP1 SLOAD PUSH1 0x1 DUP3 ADD SLOAD PUSH1 0x2 DUP4 ADD SLOAD PUSH1 0x3 SWAP1 SWAP4 ADD SLOAD SWAP2 SWAP4 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND SWAP3 PUSH1 0xFF PUSH1 0x1 PUSH1 0xA0 SHL DUP4 DIV AND SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB PUSH1 0x1 PUSH1 0xA8 SHL SWAP1 SWAP4 DIV DUP4 AND SWAP3 DUP3 DUP2 AND SWAP3 PUSH1 0x1 PUSH1 0x40 SHL SWAP1 DIV AND SWAP1 DUP8 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2041 DUP3 PUSH2 0x1EE4 JUMP JUMPDEST PUSH1 0x9 DUP4 DUP2 SLOAD DUP2 LT PUSH2 0x2054 JUMPI PUSH2 0x2054 PUSH2 0x3D4A JUMP JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x4 MUL ADD PUSH1 0x1 ADD PUSH1 0x15 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND PUSH2 0x2083 SWAP2 SWAP1 PUSH2 0x3D76 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0xD PUSH1 0x20 MSTORE DUP2 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP2 DUP2 SLOAD DUP2 LT PUSH2 0x20AE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP2 POP SWAP2 POP POP SLOAD DUP2 JUMP JUMPDEST PUSH1 0xA DUP2 DUP2 SLOAD DUP2 LT PUSH2 0x20D3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0xFF DUP2 AND SWAP2 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB PUSH2 0x100 DUP3 DIV DUP2 AND SWAP2 PUSH6 0xFFFFFFFFFFFF PUSH1 0x1 PUSH1 0x48 SHL DUP3 DIV DUP2 AND SWAP3 PUSH1 0x1 PUSH1 0x78 SHL DUP4 DIV SWAP1 SWAP2 AND SWAP2 PUSH1 0x1 PUSH1 0xA8 SHL SWAP1 DIV AND DUP6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD DUP3 SWAP2 DUP3 SWAP2 DUP6 SWAP1 DUP2 LT PUSH2 0x214A JUMPI PUSH2 0x214A PUSH2 0x3D4A JUMP JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP2 DUP3 SWAP1 KECCAK256 PUSH1 0x40 DUP1 MLOAD PUSH1 0xA0 DUP2 ADD DUP3 MSTORE PUSH1 0x2 SWAP1 SWAP4 MUL SWAP1 SWAP2 ADD DUP1 SLOAD DUP1 DUP5 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SLOAD PUSH6 0xFFFFFFFFFFFF DUP1 DUP3 AND SWAP6 DUP6 ADD SWAP6 SWAP1 SWAP6 MSTORE PUSH1 0x1 PUSH1 0x30 SHL DUP2 DIV DUP6 AND SWAP3 DUP5 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x1 PUSH1 0x60 SHL DUP3 DIV DUP5 AND PUSH1 0x60 DUP5 ADD DUP2 SWAP1 MSTORE PUSH1 0x1 PUSH1 0x90 SHL SWAP1 SWAP3 DIV SWAP1 SWAP4 AND PUSH1 0x80 DUP4 ADD MSTORE SWAP2 SWAP5 POP SWAP2 POP ISZERO DUP1 ISZERO PUSH2 0x21D1 JUMPI POP TIMESTAMP DUP2 PUSH1 0x40 ADD MLOAD PUSH6 0xFFFFFFFFFFFF AND GT ISZERO JUMPDEST DUP1 ISZERO PUSH2 0x21DD JUMPI POP DUP1 MLOAD ISZERO ISZERO JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 JUMPDEST PUSH1 0x9 SLOAD DUP2 LT ISZERO PUSH2 0x2225 JUMPI PUSH2 0x2200 DUP2 PUSH2 0xF77 JUMP JUMPDEST ISZERO PUSH2 0x2213 JUMPI DUP2 PUSH2 0x220F DUP2 PUSH2 0x4062 JUMP JUMPDEST SWAP3 POP POP JUMPDEST DUP1 PUSH2 0x221D DUP2 PUSH2 0x4062 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x21ED JUMP JUMPDEST POP PUSH1 0x0 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x2240 JUMPI PUSH2 0x2240 PUSH2 0x3917 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x2269 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP SWAP1 POP PUSH1 0x0 DUP1 JUMPDEST PUSH1 0x9 SLOAD DUP2 LT ISZERO PUSH2 0x22C6 JUMPI PUSH2 0x2283 DUP2 PUSH2 0xF77 JUMP JUMPDEST ISZERO PUSH2 0x22B4 JUMPI DUP1 DUP4 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x229B JUMPI PUSH2 0x229B PUSH2 0x3D4A JUMP JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE DUP2 PUSH2 0x22B0 DUP2 PUSH2 0x4062 JUMP JUMPDEST SWAP3 POP POP JUMPDEST DUP1 PUSH2 0x22BE DUP2 PUSH2 0x4062 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x2270 JUMP JUMPDEST POP SWAP1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 TIMESTAMP DUP2 JUMPDEST DUP5 MLOAD DUP2 LT ISZERO PUSH2 0x23AB JUMPI PUSH1 0x0 DUP1 PUSH2 0x2303 DUP9 DUP9 DUP6 DUP2 MLOAD DUP2 LT PUSH2 0x22F6 JUMPI PUSH2 0x22F6 PUSH2 0x3D4A JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0x211C JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP1 ISZERO PUSH2 0x2396 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP9 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP8 MLOAD DUP6 SWAP2 SWAP1 DUP10 SWAP1 DUP7 SWAP1 DUP2 LT PUSH2 0x233C JUMPI PUSH2 0x233C PUSH2 0x3D4A JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP2 SLOAD DUP2 LT PUSH2 0x2354 JUMPI PUSH2 0x2354 PUSH2 0x3D4A JUMP JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x2 MUL ADD PUSH1 0x1 ADD PUSH1 0xC PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH6 0xFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH6 0xFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP DUP2 DUP6 PUSH2 0x2393 SWAP2 SWAP1 PUSH2 0x4005 JUMP JUMPDEST SWAP5 POP JUMPDEST POP POP DUP1 DUP1 PUSH2 0x23A3 SWAP1 PUSH2 0x4062 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x22D4 JUMP JUMPDEST POP DUP3 ISZERO PUSH2 0x244B JUMPI PUSH1 0x40 MLOAD PUSH4 0xA9059CBB PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP5 SWAP1 MSTORE PUSH32 0x0 AND SWAP1 PUSH4 0xA9059CBB SWAP1 PUSH1 0x44 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2421 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x2445 SWAP2 SWAP1 PUSH2 0x4045 JUMP JUMPDEST POP PUSH2 0x24E0 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH4 0x39F47693 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP5 SWAP1 MSTORE PUSH32 0x0 AND SWAP1 PUSH4 0x39F47693 SWAP1 PUSH1 0x44 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x24BA JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x24DE SWAP2 SWAP1 PUSH2 0x401D JUMP JUMPDEST POP JUMPDEST POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD DUP3 SWAP1 DUP2 LT PUSH2 0x2509 JUMPI PUSH2 0x2509 PUSH2 0x3D4A JUMP JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 PUSH1 0x1 PUSH1 0x2 SWAP1 SWAP3 MUL ADD ADD SLOAD PUSH6 0xFFFFFFFFFFFF AND PUSH2 0x2571 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4465706F7369746F72793A206E6F7465206E6F7420666F756E64000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x787 JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x6 PUSH1 0x20 MSTORE DUP2 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP2 DUP2 SLOAD DUP2 LT PUSH2 0x25C6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 PUSH1 0x2 SWAP1 SWAP2 MUL ADD DUP1 SLOAD PUSH1 0x1 SWAP1 SWAP2 ADD SLOAD SWAP1 SWAP3 POP PUSH6 0xFFFFFFFFFFFF DUP1 DUP3 AND SWAP3 POP PUSH1 0x1 PUSH1 0x30 SHL DUP3 DIV DUP2 AND SWAP2 PUSH1 0x1 PUSH1 0x60 SHL DUP2 DIV DUP3 AND SWAP2 PUSH1 0x1 PUSH1 0x90 SHL SWAP1 SWAP2 DIV AND DUP6 JUMP JUMPDEST PUSH1 0xB DUP2 DUP2 SLOAD DUP2 LT PUSH2 0x261D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH6 0xFFFFFFFFFFFF DUP1 DUP3 AND SWAP3 POP PUSH1 0x1 PUSH1 0x30 SHL DUP3 DIV DUP2 AND SWAP2 PUSH1 0x1 PUSH1 0x60 SHL DUP2 DIV DUP3 AND SWAP2 PUSH1 0x1 PUSH1 0x90 SHL DUP3 DIV DUP2 AND SWAP2 PUSH1 0x1 PUSH1 0xC0 SHL DUP2 DIV SWAP1 SWAP2 AND SWAP1 PUSH1 0x1 PUSH1 0xF0 SHL SWAP1 DIV PUSH1 0xFF AND DUP7 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD DUP3 MLOAD DUP2 DUP6 MUL DUP2 ADD DUP6 ADD SWAP1 SWAP4 MSTORE DUP1 DUP4 MSTORE PUSH1 0x60 SWAP5 SWAP4 DUP5 SWAP1 DUP5 ADD JUMPDEST DUP3 DUP3 LT ISZERO PUSH2 0x2716 JUMPI PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 SWAP1 DUP2 SWAP1 KECCAK256 PUSH1 0x40 DUP1 MLOAD PUSH1 0xA0 DUP2 ADD DUP3 MSTORE PUSH1 0x2 DUP7 MUL SWAP1 SWAP3 ADD DUP1 SLOAD DUP4 MSTORE PUSH1 0x1 SWAP1 DUP2 ADD SLOAD PUSH6 0xFFFFFFFFFFFF DUP1 DUP3 AND DUP6 DUP8 ADD MSTORE PUSH1 0x1 PUSH1 0x30 SHL DUP3 DIV DUP2 AND SWAP4 DUP6 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x1 PUSH1 0x60 SHL DUP2 DIV DUP4 AND PUSH1 0x60 DUP6 ADD MSTORE PUSH1 0x1 PUSH1 0x90 SHL SWAP1 DIV SWAP1 SWAP2 AND PUSH1 0x80 DUP4 ADD MSTORE SWAP1 DUP4 MSTORE SWAP1 SWAP3 ADD SWAP2 ADD PUSH2 0x26A0 JUMP JUMPDEST POP POP POP POP SWAP1 POP PUSH1 0x0 DUP1 PUSH1 0x0 SWAP1 POP JUMPDEST DUP3 MLOAD DUP2 LT ISZERO PUSH2 0x27A5 JUMPI DUP3 DUP2 DUP2 MLOAD DUP2 LT PUSH2 0x273F JUMPI PUSH2 0x273F PUSH2 0x3D4A JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x60 ADD MLOAD PUSH6 0xFFFFFFFFFFFF AND PUSH1 0x0 EQ DUP1 ISZERO PUSH2 0x2780 JUMPI POP DUP3 DUP2 DUP2 MLOAD DUP2 LT PUSH2 0x276F JUMPI PUSH2 0x276F PUSH2 0x3D4A JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x0 ADD MLOAD PUSH1 0x0 EQ ISZERO JUMPDEST ISZERO PUSH2 0x2793 JUMPI DUP2 PUSH2 0x278F DUP2 PUSH2 0x4062 JUMP JUMPDEST SWAP3 POP POP JUMPDEST DUP1 PUSH2 0x279D DUP2 PUSH2 0x4062 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x2724 JUMP JUMPDEST POP PUSH1 0x0 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x27C0 JUMPI PUSH2 0x27C0 PUSH2 0x3917 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x27E9 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP SWAP1 POP PUSH1 0x0 DUP1 JUMPDEST DUP5 MLOAD DUP2 LT ISZERO PUSH2 0x1287 JUMPI DUP5 DUP2 DUP2 MLOAD DUP2 LT PUSH2 0x280B JUMPI PUSH2 0x280B PUSH2 0x3D4A JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x60 ADD MLOAD PUSH6 0xFFFFFFFFFFFF AND PUSH1 0x0 EQ DUP1 ISZERO PUSH2 0x284C JUMPI POP DUP5 DUP2 DUP2 MLOAD DUP2 LT PUSH2 0x283B JUMPI PUSH2 0x283B PUSH2 0x3D4A JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x0 ADD MLOAD PUSH1 0x0 EQ ISZERO JUMPDEST ISZERO PUSH2 0x287D JUMPI DUP1 DUP4 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x2864 JUMPI PUSH2 0x2864 PUSH2 0x3D4A JUMP JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE DUP2 PUSH2 0x2879 DUP2 PUSH2 0x4062 JUMP JUMPDEST SWAP3 POP POP JUMPDEST DUP1 PUSH2 0x2887 DUP2 PUSH2 0x4062 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x27F0 JUMP JUMPDEST PUSH1 0x8 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x10C1EA09 PUSH1 0xE3 SHL DUP2 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x860F5048 SWAP2 PUSH1 0x4 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x28D9 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x28FD SWAP2 SWAP1 PUSH2 0x401D JUMP JUMPDEST PUSH1 0xB DUP4 DUP2 SLOAD DUP2 LT PUSH2 0x2910 JUMPI PUSH2 0x2910 PUSH2 0x3D4A JUMP JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH2 0x2931 SWAP1 PUSH1 0x1 PUSH1 0xF0 SHL SWAP1 DIV PUSH1 0xFF AND PUSH1 0xA PUSH2 0x4036 JUMP JUMPDEST PUSH2 0x1028 DUP5 PUSH2 0x2036 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0xC PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP2 MLOAD PUSH1 0x80 DUP2 ADD DUP4 MSTORE SWAP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 AND DUP3 MSTORE PUSH1 0x1 PUSH1 0x40 SHL DUP2 DIV PUSH6 0xFFFFFFFFFFFF SWAP1 DUP2 AND SWAP5 DUP4 ADD SWAP5 SWAP1 SWAP5 MSTORE PUSH1 0x1 PUSH1 0x70 SHL DUP2 DIV SWAP1 SWAP4 AND SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x1 PUSH1 0xA0 SHL SWAP1 SWAP2 DIV PUSH1 0xFF AND ISZERO ISZERO PUSH1 0x60 DUP3 ADD DUP2 SWAP1 MSTORE DUP3 SWAP2 DUP3 SWAP2 PUSH2 0x29B7 JUMPI PUSH1 0x0 DUP1 PUSH1 0x0 SWAP4 POP SWAP4 POP SWAP4 POP POP PUSH2 0x2A20 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD MLOAD PUSH2 0x29C6 SWAP1 TIMESTAMP PUSH2 0x40C9 JUMP JUMPDEST SWAP3 POP DUP1 PUSH1 0x40 ADD MLOAD PUSH6 0xFFFFFFFFFFFF AND DUP4 PUSH6 0xFFFFFFFFFFFF AND LT SWAP2 POP DUP2 PUSH2 0x29ED JUMPI DUP1 MLOAD PUSH2 0x2A1C JUMP JUMPDEST DUP1 PUSH1 0x40 ADD MLOAD PUSH6 0xFFFFFFFFFFFF AND DUP4 PUSH6 0xFFFFFFFFFFFF AND DUP3 PUSH1 0x0 ADD MLOAD PUSH2 0x2A12 SWAP2 SWAP1 PUSH2 0x3FD6 JUMP JUMPDEST PUSH2 0x2A1C SWAP2 SWAP1 PUSH2 0x40E8 JUMP JUMPDEST SWAP4 POP POP JUMPDEST SWAP2 SWAP4 SWAP1 SWAP3 POP JUMP JUMPDEST PUSH2 0x2A30 DUP3 PUSH2 0x1EE4 JUMP JUMPDEST PUSH1 0x9 DUP4 DUP2 SLOAD DUP2 LT PUSH2 0x2A43 JUMPI PUSH2 0x2A43 PUSH2 0x3D4A JUMP JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x4 MUL ADD PUSH1 0x1 ADD PUSH1 0x15 DUP3 DUP3 DUP3 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND PUSH2 0x2A75 SWAP2 SWAP1 PUSH2 0x3D76 JUMP JUMPDEST SWAP3 POP PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB MUL NOT AND SWAP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND MUL OR SWAP1 SSTORE POP DUP1 PUSH1 0xB DUP4 DUP2 SLOAD DUP2 LT PUSH2 0x2AAD JUMPI PUSH2 0x2AAD PUSH2 0x3D4A JUMP JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 KECCAK256 SWAP1 SWAP2 ADD DUP1 SLOAD PUSH6 0xFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND PUSH1 0x1 PUSH1 0x30 SHL MUL PUSH12 0xFFFFFFFFFFFF000000000000 NOT SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 SSTORE DUP4 DUP2 MSTORE PUSH1 0xC SWAP1 SWAP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF PUSH1 0x1 PUSH1 0xA0 SHL SWAP1 SWAP2 DIV AND ISZERO PUSH2 0x10E4 JUMPI PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0xC PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SWAP1 DUP1 DUP1 PUSH2 0x2B1C DUP7 PUSH2 0x293A JUMP JUMPDEST SWAP3 POP SWAP3 POP SWAP3 POP DUP3 PUSH1 0xA DUP8 DUP2 SLOAD DUP2 LT PUSH2 0x2B36 JUMPI PUSH2 0x2B36 PUSH2 0x3D4A JUMP JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD DUP1 SLOAD PUSH1 0x1 SWAP1 PUSH2 0x2B5F SWAP1 DUP5 SWAP1 PUSH2 0x100 SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND PUSH2 0x3D76 JUMP JUMPDEST SWAP3 POP PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB MUL NOT AND SWAP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND MUL OR SWAP1 SSTORE POP DUP1 ISZERO PUSH2 0x2C36 JUMPI DUP4 SLOAD DUP4 SWAP1 DUP6 SWAP1 PUSH1 0x0 SWAP1 PUSH2 0x2BA6 SWAP1 DUP5 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND PUSH2 0x3D76 JUMP JUMPDEST SWAP3 POP PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB MUL NOT AND SWAP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND MUL OR SWAP1 SSTORE POP DUP2 DUP5 PUSH1 0x0 ADD PUSH1 0xE DUP3 DUP3 DUP3 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH6 0xFFFFFFFFFFFF AND PUSH2 0x2BEF SWAP2 SWAP1 PUSH2 0x40C9 JUMP JUMPDEST DUP3 SLOAD PUSH2 0x100 SWAP3 SWAP1 SWAP3 EXP PUSH6 0xFFFFFFFFFFFF DUP2 DUP2 MUL NOT SWAP1 SWAP4 AND SWAP2 DUP4 AND MUL OR SWAP1 SWAP2 SSTORE DUP6 SLOAD PUSH14 0xFFFFFFFFFFFF0000000000000000 NOT AND PUSH1 0x1 PUSH1 0x40 SHL SWAP2 DUP9 AND SWAP2 SWAP1 SWAP2 MUL OR DUP6 SSTORE POP PUSH2 0x2C42 JUMP JUMPDEST DUP4 SLOAD PUSH1 0xFF PUSH1 0xA0 SHL NOT AND DUP5 SSTORE JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xB DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x2C5F JUMPI PUSH2 0x2C5F PUSH2 0x3D4A JUMP JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH2 0x2C80 SWAP1 PUSH1 0x1 PUSH1 0xF0 SHL SWAP1 DIV PUSH1 0xFF AND PUSH1 0xA PUSH2 0x4036 JUMP JUMPDEST PUSH2 0x2C89 DUP4 PUSH2 0x35EA JUMP JUMPDEST PUSH1 0xA DUP5 DUP2 SLOAD DUP2 LT PUSH2 0x2C9C JUMPI PUSH2 0x2C9C PUSH2 0x3D4A JUMP JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH2 0x1032 SWAP2 SWAP1 PUSH2 0x100 SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND PUSH2 0x3F8D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD DUP3 MLOAD PUSH1 0xA0 DUP2 ADD SWAP4 DUP5 SWAP1 MSTORE PUSH4 0x19A948DB PUSH1 0xE2 SHL SWAP1 SWAP4 MSTORE PUSH1 0xA4 DUP4 ADD DUP9 SWAP1 MSTORE SWAP3 SWAP1 SWAP2 SWAP1 DUP2 SWAP1 PUSH32 0x0 AND PUSH4 0x66A5236C PUSH1 0xC4 DUP4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2D47 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x2D6B SWAP2 SWAP1 PUSH2 0x401D JUMP JUMPDEST DUP2 MSTORE PUSH6 0xFFFFFFFFFFFF TIMESTAMP DUP2 AND PUSH1 0x20 DUP1 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP9 DUP3 AND PUSH1 0x40 DUP1 DUP6 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x0 PUSH1 0x60 DUP1 DUP7 ADD DUP3 SWAP1 MSTORE DUP11 DUP6 AND PUSH1 0x80 SWAP7 DUP8 ADD MSTORE DUP8 SLOAD PUSH1 0x1 DUP2 DUP2 ADD DUP11 SSTORE SWAP9 DUP4 MSTORE DUP5 DUP4 KECCAK256 DUP9 MLOAD PUSH1 0x2 SWAP1 SWAP3 MUL ADD SWAP1 DUP2 SSTORE SWAP4 DUP8 ADD MLOAD SWAP4 SWAP1 SWAP8 ADD DUP1 SLOAD SWAP3 DUP8 ADD MLOAD SWAP8 DUP8 ADD MLOAD SWAP7 SWAP1 SWAP6 ADD MLOAD DUP5 AND PUSH1 0x1 PUSH1 0x90 SHL MUL PUSH6 0xFFFFFFFFFFFF PUSH1 0x90 SHL NOT SWAP7 DUP6 AND PUSH1 0x1 PUSH1 0x60 SHL MUL SWAP7 SWAP1 SWAP7 AND PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x60 SHL NOT SWAP8 DUP6 AND PUSH1 0x1 PUSH1 0x30 SHL MUL PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF NOT SWAP1 SWAP4 AND SWAP4 SWAP1 SWAP5 AND SWAP3 SWAP1 SWAP3 OR OR SWAP5 SWAP1 SWAP5 AND OR SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH2 0x2E39 DUP7 DUP5 PUSH2 0x36CD JUMP JUMPDEST PUSH1 0x8 SLOAD SWAP1 SWAP2 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x40C10F19 ADDRESS PUSH2 0x2E58 DUP5 DUP11 PUSH2 0x4005 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT PUSH1 0xE0 DUP6 SWAP1 SHL AND DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2E9E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2EB2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH4 0x1B0CD93B PUSH1 0xE3 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD DUP10 SWAP1 MSTORE PUSH1 0x0 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x1 PUSH1 0x64 DUP3 ADD MSTORE PUSH32 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP3 POP PUSH4 0xD866C9D8 SWAP2 POP PUSH1 0x84 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2F31 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x2F55 SWAP2 SWAP1 PUSH2 0x401D JUMP JUMPDEST POP POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 DUP2 AND PUSH1 0x24 DUP4 ADD MSTORE DUP5 DUP2 AND PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP1 DUP4 ADD DUP6 SWAP1 MSTORE DUP4 MLOAD DUP1 DUP5 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x84 SWAP1 SWAP3 ADD DUP4 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x23B872DD PUSH1 0xE0 SHL OR SWAP1 MSTORE SWAP2 MLOAD PUSH1 0x0 SWAP3 DUP4 SWAP3 SWAP1 DUP9 AND SWAP2 PUSH2 0x2FC4 SWAP2 SWAP1 PUSH2 0x410E JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x3001 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x3006 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 DUP1 ISZERO PUSH2 0x3030 JUMPI POP DUP1 MLOAD ISZERO DUP1 PUSH2 0x3030 JUMPI POP DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x3030 SWAP2 SWAP1 PUSH2 0x4045 JUMP JUMPDEST PUSH2 0x2C42 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x14 PUSH1 0x24 DUP3 ADD MSTORE PUSH20 0x1514905394D1915497D19493D357D19052531151 PUSH1 0x62 SHL PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x787 JUMP JUMPDEST PUSH1 0x0 PUSH1 0xB DUP4 DUP2 SLOAD DUP2 LT PUSH2 0x3088 JUMPI PUSH2 0x3088 PUSH2 0x3D4A JUMP JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP2 DUP3 SWAP1 KECCAK256 PUSH1 0x40 DUP1 MLOAD PUSH1 0xC0 DUP2 ADD DUP3 MSTORE SWAP3 SWAP1 SWAP2 ADD SLOAD PUSH6 0xFFFFFFFFFFFF DUP1 DUP3 AND DUP1 DUP6 MSTORE PUSH1 0x1 PUSH1 0x30 SHL DUP4 DIV DUP3 AND SWAP6 DUP6 ADD SWAP6 SWAP1 SWAP6 MSTORE PUSH1 0x1 PUSH1 0x60 SHL DUP3 DIV DUP2 AND SWAP3 DUP5 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x1 PUSH1 0x90 SHL DUP2 DIV DUP3 AND PUSH1 0x60 DUP5 ADD MSTORE PUSH1 0x1 PUSH1 0xC0 SHL DUP2 DIV SWAP1 SWAP2 AND PUSH1 0x80 DUP4 ADD DUP2 SWAP1 MSTORE PUSH1 0x1 PUSH1 0xF0 SHL SWAP1 SWAP2 DIV PUSH1 0xFF AND PUSH1 0xA0 DUP4 ADD MSTORE SWAP1 SWAP3 POP PUSH2 0x310A SWAP2 PUSH2 0x407D JUMP JUMPDEST PUSH6 0xFFFFFFFFFFFF AND DUP3 PUSH6 0xFFFFFFFFFFFF AND LT PUSH2 0x35E5 JUMPI PUSH1 0x0 PUSH1 0x9 DUP5 DUP2 SLOAD DUP2 LT PUSH2 0x3135 JUMPI PUSH2 0x3135 PUSH2 0x3D4A JUMP JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 KECCAK256 PUSH1 0x40 DUP1 MLOAD PUSH1 0xE0 DUP2 ADD DUP3 MSTORE PUSH1 0x4 SWAP1 SWAP5 MUL SWAP1 SWAP2 ADD DUP1 SLOAD DUP5 MSTORE PUSH1 0x1 DUP2 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND SWAP4 DUP6 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0xFF PUSH1 0x1 PUSH1 0xA0 SHL DUP5 DIV AND ISZERO ISZERO SWAP2 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB PUSH1 0x1 PUSH1 0xA8 SHL SWAP1 SWAP3 DIV DUP3 AND PUSH1 0x60 DUP5 ADD MSTORE PUSH1 0x2 DUP2 ADD SLOAD DUP1 DUP4 AND PUSH1 0x80 DUP6 ADD MSTORE PUSH1 0x1 PUSH1 0x40 SHL SWAP1 DIV SWAP1 SWAP2 AND PUSH1 0xA0 DUP4 ADD MSTORE PUSH1 0x3 ADD SLOAD PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0xA DUP1 SLOAD SWAP2 SWAP4 POP DUP6 SWAP2 DUP8 SWAP1 DUP2 LT PUSH2 0x31D3 JUMPI PUSH2 0x31D3 PUSH2 0x3D4A JUMP JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH2 0x31F8 SWAP2 SWAP1 PUSH1 0x1 PUSH1 0x78 SHL SWAP1 DIV PUSH6 0xFFFFFFFFFFFF AND PUSH2 0x40C9 JUMP JUMPDEST PUSH6 0xFFFFFFFFFFFF AND SWAP1 POP PUSH1 0x0 PUSH2 0x320D DUP7 PUSH2 0x2C4A JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP4 PUSH1 0x40 ADD MLOAD PUSH2 0x3221 JUMPI DUP4 MLOAD PUSH2 0x325B JUMP JUMPDEST PUSH1 0xA0 DUP6 ADD MLOAD PUSH2 0x3231 SWAP1 PUSH1 0xA PUSH2 0x4036 JUMP JUMPDEST DUP5 MLOAD DUP4 SWAP1 PUSH2 0x3247 SWAP1 PUSH8 0xDE0B6B3A7640000 PUSH2 0x3F8D JUMP JUMPDEST PUSH2 0x3251 SWAP2 SWAP1 PUSH2 0x3FC2 JUMP JUMPDEST PUSH2 0x325B SWAP2 SWAP1 PUSH2 0x3FC2 JUMP JUMPDEST SWAP1 POP DUP3 DUP6 PUSH1 0x60 ADD MLOAD PUSH6 0xFFFFFFFFFFFF AND DUP3 PUSH2 0x3276 SWAP2 SWAP1 PUSH2 0x3F8D JUMP JUMPDEST PUSH2 0x3280 SWAP2 SWAP1 PUSH2 0x3FC2 JUMP JUMPDEST PUSH1 0x9 DUP9 DUP2 SLOAD DUP2 LT PUSH2 0x3293 JUMPI PUSH2 0x3293 PUSH2 0x3D4A JUMP JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x4 MUL ADD PUSH1 0x2 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB MUL NOT AND SWAP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND MUL OR SWAP1 SSTORE POP PUSH1 0x0 DUP4 DUP7 PUSH1 0x40 ADD MLOAD PUSH6 0xFFFFFFFFFFFF AND DUP4 PUSH2 0x32E3 SWAP2 SWAP1 PUSH2 0x3F8D JUMP JUMPDEST PUSH2 0x32ED SWAP2 SWAP1 PUSH2 0x3FC2 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 PUSH1 0x8 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x860F5048 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x3345 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x3369 SWAP2 SWAP1 PUSH2 0x401D JUMP JUMPDEST PUSH2 0x3373 SWAP1 DUP7 PUSH2 0x3F8D JUMP JUMPDEST PUSH2 0x337D SWAP2 SWAP1 PUSH2 0x3FC2 JUMP JUMPDEST SWAP1 POP DUP9 PUSH32 0x3070B0E3E52B8713C7489D32604EA4B0970024F74C6E05319269A19BC1E3A9D9 PUSH1 0xA DUP12 DUP2 SLOAD DUP2 LT PUSH2 0x33B4 JUMPI PUSH2 0x33B4 PUSH2 0x3D4A JUMP JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP2 DUP3 SWAP1 KECCAK256 ADD SLOAD PUSH1 0x40 DUP1 MLOAD PUSH2 0x100 SWAP1 SWAP3 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB SWAP1 DUP2 AND DUP4 MSTORE DUP7 AND SWAP3 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0xA DUP10 DUP2 SLOAD DUP2 LT PUSH2 0x33FD JUMPI PUSH2 0x33FD PUSH2 0x3D4A JUMP JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB PUSH2 0x100 SWAP1 SWAP2 DIV DUP2 AND SWAP1 DUP3 AND LT PUSH2 0x346B JUMPI DUP1 PUSH1 0xA DUP11 DUP2 SLOAD DUP2 LT PUSH2 0x3435 JUMPI PUSH2 0x3435 PUSH2 0x3D4A JUMP JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 ADD PUSH1 0x1 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB MUL NOT AND SWAP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND MUL OR SWAP1 SSTORE POP PUSH2 0x35A3 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0xA DUP12 DUP2 SLOAD DUP2 LT PUSH2 0x3481 JUMPI PUSH2 0x3481 PUSH2 0x3D4A JUMP JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH2 0x34A5 SWAP2 SWAP1 PUSH2 0x100 SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND PUSH2 0x3D76 JUMP JUMPDEST SWAP1 POP PUSH1 0x40 MLOAD DUP1 PUSH1 0x80 ADD PUSH1 0x40 MSTORE DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP11 PUSH6 0xFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP10 PUSH1 0x80 ADD MLOAD PUSH6 0xFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x1 ISZERO ISZERO DUP2 MSTORE POP PUSH1 0xC PUSH1 0x0 DUP13 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB MUL NOT AND SWAP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND MUL OR SWAP1 SSTORE POP PUSH1 0x20 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x8 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH6 0xFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH6 0xFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x40 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0xE PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH6 0xFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH6 0xFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x60 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x14 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP SWAP1 POP POP POP JUMPDEST DUP8 PUSH1 0xB DUP11 DUP2 SLOAD DUP2 LT PUSH2 0x35B7 JUMPI PUSH2 0x35B7 PUSH2 0x3D4A JUMP JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD DUP1 SLOAD PUSH6 0xFFFFFFFFFFFF NOT AND PUSH6 0xFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE POP POP POP POP POP POP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x8 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x10C1EA09 PUSH1 0xE3 SHL DUP2 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x860F5048 SWAP2 PUSH1 0x4 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x3634 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x3658 SWAP2 SWAP1 PUSH2 0x401D JUMP JUMPDEST PUSH1 0xB DUP4 DUP2 SLOAD DUP2 LT PUSH2 0x366B JUMPI PUSH2 0x366B PUSH2 0x3D4A JUMP JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH2 0x368C SWAP1 PUSH1 0x1 PUSH1 0xF0 SHL SWAP1 DIV PUSH1 0xFF AND PUSH1 0xA PUSH2 0x4036 JUMP JUMPDEST PUSH1 0x9 DUP5 DUP2 SLOAD DUP2 LT PUSH2 0x369F JUMPI PUSH2 0x369F PUSH2 0x3D4A JUMP JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 PUSH1 0x4 SWAP1 SWAP2 MUL ADD PUSH1 0x1 ADD SLOAD PUSH2 0x1032 SWAP2 SWAP1 PUSH1 0x1 PUSH1 0xA8 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND PUSH2 0x3F8D JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x2710 PUSH1 0x2 SLOAD DUP6 PUSH2 0x36E1 SWAP2 SWAP1 PUSH2 0x3F8D JUMP JUMPDEST PUSH2 0x36EB SWAP2 SWAP1 PUSH2 0x3FC2 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x2710 PUSH1 0x3 SLOAD DUP7 PUSH2 0x3700 SWAP2 SWAP1 PUSH2 0x3F8D JUMP JUMPDEST PUSH2 0x370A SWAP2 SWAP1 PUSH2 0x3FC2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP2 POP PUSH1 0xFF AND ISZERO PUSH2 0x3807 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD DUP4 SWAP3 SWAP1 PUSH2 0x3756 SWAP1 DUP5 SWAP1 PUSH2 0x4005 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP PUSH1 0x1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x2295499 PUSH1 0xE5 SHL DUP2 MSTORE SWAP1 MLOAD DUP5 SWAP3 PUSH1 0x4 SWAP3 PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 PUSH4 0x452A9320 SWAP2 DUP1 DUP7 ADD SWAP2 PUSH1 0x20 SWAP2 DUP2 SWAP1 SUB DUP8 ADD DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x37A9 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x37CD SWAP2 SWAP1 PUSH2 0x3D9E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD PUSH2 0x37FC SWAP2 SWAP1 PUSH2 0x4005 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP PUSH2 0x38B6 SWAP1 POP JUMP JUMPDEST PUSH2 0x3811 DUP2 DUP4 PUSH2 0x4005 JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x2295499 PUSH1 0xE5 SHL DUP2 MSTORE SWAP1 MLOAD PUSH1 0x4 SWAP3 PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP2 PUSH4 0x452A9320 SWAP2 DUP1 DUP7 ADD SWAP2 PUSH1 0x20 SWAP2 DUP2 SWAP1 SUB DUP8 ADD DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x385D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x3881 SWAP2 SWAP1 PUSH2 0x3D9E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD PUSH2 0x38B0 SWAP2 SWAP1 PUSH2 0x4005 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP JUMPDEST PUSH2 0x38C0 DUP2 DUP4 PUSH2 0x4005 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x38DE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x38F3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x10FD DUP2 PUSH2 0x38C9 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3910 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x394F JUMPI PUSH2 0x394F PUSH2 0x3917 JUMP JUMPDEST PUSH1 0x40 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP3 ADD PUSH1 0x1F NOT AND DUP2 ADD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x397D JUMPI PUSH2 0x397D PUSH2 0x3917 JUMP JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD PUSH1 0x60 DUP2 ADD DUP2 DUP2 LT PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT OR ISZERO PUSH2 0x39A9 JUMPI PUSH2 0x39A9 PUSH2 0x3917 JUMP JUMPDEST PUSH1 0x40 MSTORE SWAP1 POP DUP1 PUSH1 0x60 DUP4 ADD DUP5 DUP2 GT ISZERO PUSH2 0x39C0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x39DA JUMPI DUP1 CALLDATALOAD DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x39C2 JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x38DE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD PUSH2 0x39FC DUP2 PUSH2 0x39E3 JUMP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x3A12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3A1A PUSH2 0x392D JUMP JUMPDEST DUP1 PUSH1 0x40 DUP5 ADD DUP6 DUP2 GT ISZERO PUSH2 0x3A2C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1287 JUMPI DUP1 CALLDATALOAD DUP5 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 ADD PUSH2 0x3A2E JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x3A57 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3A5F PUSH2 0x392D JUMP JUMPDEST DUP1 PUSH1 0x40 DUP5 ADD DUP6 DUP2 GT ISZERO PUSH2 0x3A71 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1287 JUMPI DUP1 CALLDATALOAD PUSH4 0xFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x3A90 JUMPI PUSH1 0x0 DUP1 DUP2 REVERT JUMPDEST DUP5 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 ADD PUSH2 0x3A73 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x140 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x3AB7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH2 0x3AC2 DUP2 PUSH2 0x38C9 JUMP JUMPDEST SWAP5 POP PUSH1 0x20 PUSH1 0x3F DUP8 ADD DUP9 SGT PUSH2 0x3AD5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3AE1 DUP9 DUP3 DUP10 ADD PUSH2 0x3985 JUMP JUMPDEST SWAP5 POP DUP8 PUSH1 0x9F DUP9 ADD SLT PUSH2 0x3AF2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3AFA PUSH2 0x392D JUMP JUMPDEST DUP1 PUSH1 0xC0 DUP10 ADD DUP11 DUP2 GT ISZERO PUSH2 0x3B0C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x80 DUP11 ADD JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x3B31 JUMPI DUP1 CALLDATALOAD PUSH2 0x3B24 DUP2 PUSH2 0x39E3 JUMP JUMPDEST DUP5 MSTORE SWAP3 DUP5 ADD SWAP3 DUP5 ADD PUSH2 0x3B11 JUMP JUMPDEST POP DUP2 SWAP7 POP PUSH2 0x3B3F DUP12 DUP3 PUSH2 0x3A01 JUMP JUMPDEST SWAP6 POP POP POP POP POP PUSH2 0x3B53 DUP8 PUSH2 0x100 DUP9 ADD PUSH2 0x3A46 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x3B72 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x3B7D DUP2 PUSH2 0x38C9 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH2 0x3B8D DUP2 PUSH2 0x39E3 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP3 MLOAD DUP3 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP2 SWAP1 DUP5 DUP3 ADD SWAP1 PUSH1 0x40 DUP6 ADD SWAP1 DUP5 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x3BD0 JUMPI DUP4 MLOAD DUP4 MSTORE SWAP3 DUP5 ADD SWAP3 SWAP2 DUP5 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x3BB4 JUMP JUMPDEST POP SWAP1 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x3BEF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP DUP1 CALLDATALOAD SWAP3 PUSH1 0x20 SWAP1 SWAP2 ADD CALLDATALOAD SWAP2 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x3C16 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD SWAP5 POP PUSH1 0x20 DUP7 ADD CALLDATALOAD SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP3 POP PUSH1 0x60 DUP7 ADD CALLDATALOAD PUSH2 0x3C36 DUP2 PUSH2 0x38C9 JUMP JUMPDEST SWAP2 POP PUSH1 0x80 DUP7 ADD CALLDATALOAD PUSH2 0x3C46 DUP2 PUSH2 0x38C9 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x3C67 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x3C72 DUP2 PUSH2 0x38C9 JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x3C95 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x3CA0 DUP2 PUSH2 0x38C9 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 DUP2 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH2 0x3CBD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP8 ADD SWAP2 POP DUP8 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x3CD1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x3CE3 JUMPI PUSH2 0x3CE3 PUSH2 0x3917 JUMP JUMPDEST DUP1 PUSH1 0x5 SHL SWAP2 POP PUSH2 0x3CF4 DUP5 DUP4 ADD PUSH2 0x3955 JUMP JUMPDEST DUP2 DUP2 MSTORE SWAP2 DUP4 ADD DUP5 ADD SWAP2 DUP5 DUP2 ADD SWAP1 DUP11 DUP5 GT ISZERO PUSH2 0x3D0E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 DUP6 ADD SWAP4 JUMPDEST DUP4 DUP6 LT ISZERO PUSH2 0x3D2C JUMPI DUP5 CALLDATALOAD DUP3 MSTORE SWAP4 DUP6 ADD SWAP4 SWAP1 DUP6 ADD SWAP1 PUSH2 0x3D13 JUMP JUMPDEST DUP1 SWAP8 POP POP POP POP POP POP POP PUSH2 0x3D41 PUSH1 0x40 DUP6 ADD PUSH2 0x39F1 JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 DUP2 AND SWAP1 DUP4 AND DUP2 DUP2 LT ISZERO PUSH2 0x3D96 JUMPI PUSH2 0x3D96 PUSH2 0x3D60 JUMP JUMPDEST SUB SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3DB0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x10FD DUP2 PUSH2 0x38C9 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP1 DUP4 MSTORE PUSH1 0x0 DUP5 SLOAD DUP2 PUSH1 0x1 DUP3 DUP2 SHR SWAP2 POP DUP1 DUP4 AND DUP1 PUSH2 0x3DDD JUMPI PUSH1 0x7F DUP4 AND SWAP3 POP JUMPDEST DUP6 DUP4 LT DUP2 EQ ISZERO PUSH2 0x3DFB JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL DUP6 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 DUP6 REVERT JUMPDEST DUP8 DUP7 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP2 DUP1 ISZERO PUSH2 0x3E18 JUMPI PUSH1 0x1 DUP2 EQ PUSH2 0x3E29 JUMPI PUSH2 0x3E54 JUMP JUMPDEST PUSH1 0xFF NOT DUP7 AND DUP3 MSTORE DUP8 DUP3 ADD SWAP7 POP PUSH2 0x3E54 JUMP JUMPDEST PUSH1 0x0 DUP12 DUP2 MSTORE PUSH1 0x20 SWAP1 KECCAK256 PUSH1 0x0 JUMPDEST DUP7 DUP2 LT ISZERO PUSH2 0x3E4E JUMPI DUP2 SLOAD DUP5 DUP3 ADD MSTORE SWAP1 DUP6 ADD SWAP1 DUP10 ADD PUSH2 0x3E35 JUMP JUMPDEST DUP4 ADD SWAP8 POP POP JUMPDEST POP SWAP5 SWAP10 SWAP9 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 LT ISZERO PUSH2 0x3E75 JUMPI PUSH2 0x3E75 PUSH2 0x3D60 JUMP JUMPDEST POP SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3E8C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0x10FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 DUP2 DUP2 JUMPDEST DUP1 DUP6 GT ISZERO PUSH2 0x3ED8 JUMPI DUP2 PUSH1 0x0 NOT DIV DUP3 GT ISZERO PUSH2 0x3EBE JUMPI PUSH2 0x3EBE PUSH2 0x3D60 JUMP JUMPDEST DUP1 DUP6 AND ISZERO PUSH2 0x3ECB JUMPI SWAP2 DUP2 MUL SWAP2 JUMPDEST SWAP4 DUP5 SHR SWAP4 SWAP1 DUP1 MUL SWAP1 PUSH2 0x3EA2 JUMP JUMPDEST POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x3EEF JUMPI POP PUSH1 0x1 PUSH2 0xFDA JUMP JUMPDEST DUP2 PUSH2 0x3EFC JUMPI POP PUSH1 0x0 PUSH2 0xFDA JUMP JUMPDEST DUP2 PUSH1 0x1 DUP2 EQ PUSH2 0x3F12 JUMPI PUSH1 0x2 DUP2 EQ PUSH2 0x3F1C JUMPI PUSH2 0x3F38 JUMP JUMPDEST PUSH1 0x1 SWAP2 POP POP PUSH2 0xFDA JUMP JUMPDEST PUSH1 0xFF DUP5 GT ISZERO PUSH2 0x3F2D JUMPI PUSH2 0x3F2D PUSH2 0x3D60 JUMP JUMPDEST POP POP PUSH1 0x1 DUP3 SHL PUSH2 0xFDA JUMP JUMPDEST POP PUSH1 0x20 DUP4 LT PUSH2 0x133 DUP4 LT AND PUSH1 0x4E DUP5 LT PUSH1 0xB DUP5 LT AND OR ISZERO PUSH2 0x3F5B JUMPI POP DUP2 DUP2 EXP PUSH2 0xFDA JUMP JUMPDEST PUSH2 0x3F65 DUP4 DUP4 PUSH2 0x3E9D JUMP JUMPDEST DUP1 PUSH1 0x0 NOT DIV DUP3 GT ISZERO PUSH2 0x3F79 JUMPI PUSH2 0x3F79 PUSH2 0x3D60 JUMP JUMPDEST MUL SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x10FD DUP4 DUP4 PUSH2 0x3EE0 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x0 NOT DIV DUP4 GT DUP3 ISZERO ISZERO AND ISZERO PUSH2 0x3FA7 JUMPI PUSH2 0x3FA7 PUSH2 0x3D60 JUMP JUMPDEST POP MUL SWAP1 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x3FD1 JUMPI PUSH2 0x3FD1 PUSH2 0x3FAC JUMP JUMPDEST POP DIV SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP4 AND DUP2 DUP6 AND DUP2 DUP4 DIV DUP2 GT DUP3 ISZERO ISZERO AND ISZERO PUSH2 0x3FFC JUMPI PUSH2 0x3FFC PUSH2 0x3D60 JUMP JUMPDEST MUL SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 NOT DUP3 GT ISZERO PUSH2 0x4018 JUMPI PUSH2 0x4018 PUSH2 0x3D60 JUMP JUMPDEST POP ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x402F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x10FD PUSH1 0xFF DUP5 AND DUP4 PUSH2 0x3EE0 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4057 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x10FD DUP2 PUSH2 0x39E3 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x0 NOT DUP3 EQ ISZERO PUSH2 0x4076 JUMPI PUSH2 0x4076 PUSH2 0x3D60 JUMP JUMPDEST POP PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH6 0xFFFFFFFFFFFF DUP1 DUP4 AND DUP2 DUP6 AND DUP1 DUP4 SUB DUP3 GT ISZERO PUSH2 0x409E JUMPI PUSH2 0x409E PUSH2 0x3D60 JUMP JUMPDEST ADD SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP4 AND DUP2 DUP6 AND DUP1 DUP4 SUB DUP3 GT ISZERO PUSH2 0x409E JUMPI PUSH2 0x409E PUSH2 0x3D60 JUMP JUMPDEST PUSH1 0x0 PUSH6 0xFFFFFFFFFFFF DUP4 DUP2 AND SWAP1 DUP4 AND DUP2 DUP2 LT ISZERO PUSH2 0x3D96 JUMPI PUSH2 0x3D96 PUSH2 0x3D60 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP5 AND DUP1 PUSH2 0x4102 JUMPI PUSH2 0x4102 PUSH2 0x3FAC JUMP JUMPDEST SWAP3 AND SWAP2 SWAP1 SWAP2 DIV SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x412F JUMPI PUSH1 0x20 DUP2 DUP7 ADD DUP2 ADD MLOAD DUP6 DUP4 ADD MSTORE ADD PUSH2 0x4115 JUMP JUMPDEST DUP2 DUP2 GT ISZERO PUSH2 0x413E JUMPI PUSH1 0x0 DUP3 DUP6 ADD MSTORE JUMPDEST POP SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xC3 DUP5 0xBC RETURN EXTCODESIZE 0xC9 CALLDATASIZE 0xC3 0xCA DUP7 DUP12 0xC7 SELFBALANCE DELEGATECALL 0xCC RETURNDATASIZE PUSH5 0x976326F811 DUP14 0x1F 0xBC 0x22 POP PUSH24 0x6BC36A4164736F6C634300080C0033000000000000000000 ",
"sourceMap": "276:36:10:-:0;327:22070:0;276:36:10;;327:22070:0;276:36:10;;;-1:-1:-1;;;276:36:10;;;;;;-1:-1:-1;;276:36:10;;:::i;:::-;;1312:348:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;525:9:10;:22;;-1:-1:-1;;;;;;525:22:10;-1:-1:-1;;;;;525:22:10;;;;;;;;563:28;;525:22;;1497:5:0;;1504:6;;1512:8;;1522:9;;525:22:10;;1497:5:0;;525:22:10;;563:28;;-1:-1:-1;;563:28:10;-1:-1:-1;;;;;;750:12:11;;::::1;;::::0;834:14:12;;::::1;;::::0;-1:-1:-1;859:18:12;;::::1;;::::0;888:8:::1;:20:::0;;-1:-1:-1;;;;;;888:20:12::1;::::0;;::::1;::::0;;;::::1;::::0;;1614:38:0::1;::::0;-1:-1:-1;;;1614:38:0;;1387:32:13;;;1614:38:0::1;::::0;::::1;1369:51:13::0;1647:4:0::1;1436:18:13::0;;;1429:34;1614:13:0;;::::1;::::0;-1:-1:-1;1614:13:0::1;::::0;-1:-1:-1;1342:18:13;;1614:38:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;1312:348:::0;;;;;327:22070;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;327:22070:0;;;-1:-1:-1;327:22070:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:149:13;-1:-1:-1;;;;;107:31:13;;97:42;;87:70;;153:1;150;143:12;87:70;14:149;:::o;168:969::-;364:6;372;380;388;396;449:3;437:9;428:7;424:23;420:33;417:53;;;466:1;463;456:12;417:53;498:9;492:16;517:49;560:5;517:49;:::i;:::-;635:2;620:18;;614:25;585:5;;-1:-1:-1;648:51:13;614:25;648:51;:::i;:::-;770:2;755:18;;749:25;718:7;;-1:-1:-1;783:51:13;749:25;783:51;:::i;:::-;905:2;890:18;;884:25;853:7;;-1:-1:-1;918:51:13;884:25;918:51;:::i;:::-;1040:3;1025:19;;1019:26;988:7;;-1:-1:-1;1054:51:13;1019:26;1054:51;:::i;:::-;1124:7;1114:17;;;168:969;;;;;;;;:::o;1474:277::-;1541:6;1594:2;1582:9;1573:7;1569:23;1565:32;1562:52;;;1610:1;1607;1600:12;1562:52;1642:9;1636:16;1695:5;1688:13;1681:21;1674:5;1671:32;1661:60;;1717:1;1714;1707:12;1661:60;1740:5;1474:277;-1:-1:-1;;;1474:277:13:o;1756:380::-;1835:1;1831:12;;;;1878;;;1899:61;;1953:4;1945:6;1941:17;1931:27;;1899:61;2006:2;1998:6;1995:14;1975:18;1972:38;1969:161;;;2052:10;2047:3;2043:20;2040:1;2033:31;2087:4;2084:1;2077:15;2115:4;2112:1;2105:15;1969:161;;1756:380;;;:::o;:::-;327:22070:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"
},
"deployedBytecode": {
"functionDebugData": {
"@_controlDecay_1283": {
"entryPoint": 10554,
"id": 1283,
"parameterSlots": 1,
"returnSlots": 3
},
"@_debtRatio_1221": {
"entryPoint": 13802,
"id": 1221,
"parameterSlots": 1,
"returnSlots": 1
},
"@_decay_386": {
"entryPoint": 10791,
"id": 386,
"parameterSlots": 2,
"returnSlots": 0
},
"@_giveRewards_2295": {
"entryPoint": 14029,
"id": 2295,
"parameterSlots": 2,
"returnSlots": 1
},
"@_marketPrice_1194": {
"entryPoint": 11338,
"id": 1194,
"parameterSlots": 1,
"returnSlots": 1
},
"@_tune_548": {
"entryPoint": 12403,
"id": 548,
"parameterSlots": 2,
"returnSlots": 0
},
"@addNote_2511": {
"entryPoint": 11456,
"id": 2511,
"parameterSlots": 5,
"returnSlots": 1
},
"@adjustments_61": {
"entryPoint": null,
"id": 61,
"parameterSlots": 0,
"returnSlots": 0
},
"@authority_2079": {
"entryPoint": null,
"id": 2079,
"parameterSlots": 0,
"returnSlots": 0
},
"@close_807": {
"entryPoint": 1756,
"id": 807,
"parameterSlots": 1,
"returnSlots": 0
},
"@create_775": {
"entryPoint": 2087,
"id": 775,
"parameterSlots": 5,
"returnSlots": 1
},
"@currentControlVariable_974": {
"entryPoint": 1668,
"id": 974,
"parameterSlots": 1,
"returnSlots": 1
},
"@currentDebt_913": {
"entryPoint": 8246,
"id": 913,
"parameterSlots": 1,
"returnSlots": 1
},
"@daoReward_2176": {
"entryPoint": null,
"id": 2176,
"parameterSlots": 0,
"returnSlots": 0
},
"@debtDecay_952": {
"entryPoint": 7908,
"id": 952,
"parameterSlots": 1,
"returnSlots": 1
},
"@debtRatio_894": {
"entryPoint": 10383,
"id": 894,
"parameterSlots": 1,
"returnSlots": 1
},
"@deposit_303": {
"entryPoint": 5391,
"id": 303,
"parameterSlots": 5,
"returnSlots": 3
},
"@getReward_2232": {
"entryPoint": 4156,
"id": 2232,
"parameterSlots": 0,
"returnSlots": 0
},
"@indexesFor_2815": {
"entryPoint": 9835,
"id": 2815,
"parameterSlots": 1,
"returnSlots": 1
},
"@isLive_1000": {
"entryPoint": 3959,
"id": 1000,
"parameterSlots": 1,
"returnSlots": 1
},
"@liveMarketsFor_1167": {
"entryPoint": 4356,
"id": 1167,
"parameterSlots": 1,
"returnSlots": 1
},
"@liveMarkets_1075": {
"entryPoint": 8679,
"id": 1075,
"parameterSlots": 0,
"returnSlots": 1
},
"@marketPrice_834": {
"entryPoint": 4064,
"id": 834,
"parameterSlots": 1,
"returnSlots": 1
},
"@marketsForQuote_66": {
"entryPoint": 8338,
"id": 66,
"parameterSlots": 0,
"returnSlots": 0
},
"@markets_48": {
"entryPoint": 8136,
"id": 48,
"parameterSlots": 0,
"returnSlots": 0
},
"@metadata_56": {
"entryPoint": 9741,
"id": 56,
"parameterSlots": 0,
"returnSlots": 0
},
"@notes_2350": {
"entryPoint": 9642,
"id": 2350,
"parameterSlots": 0,
"returnSlots": 0
},
"@payoutFor_867": {
"entryPoint": 4937,
"id": 867,
"parameterSlots": 2,
"returnSlots": 1
},
"@pendingFor_2861": {
"entryPoint": 8476,
"id": 2861,
"parameterSlots": 2,
"returnSlots": 2
},
"@pullNote_2709": {
"entryPoint": 7291,
"id": 2709,
"parameterSlots": 2,
"returnSlots": 1
},
"@pushNote_2646": {
"entryPoint": 9448,
"id": 2646,
"parameterSlots": 2,
"returnSlots": 0
},
"@redeemAll_2614": {
"entryPoint": 4328,
"id": 2614,
"parameterSlots": 2,
"returnSlots": 1
},
"@redeem_2594": {
"entryPoint": 8911,
"id": 2594,
"parameterSlots": 3,
"returnSlots": 1
},
"@refReward_2178": {
"entryPoint": null,
"id": 2178,
"parameterSlots": 0,
"returnSlots": 0
},
"@rewards_2182": {
"entryPoint": null,
"id": 2182,
"parameterSlots": 0,
"returnSlots": 0
},
"@safeTransferFrom_1941": {
"entryPoint": 12128,
"id": 1941,
"parameterSlots": 4,
"returnSlots": 0
},
"@setAuthority_2167": {
"entryPoint": 5145,
"id": 2167,
"parameterSlots": 1,
"returnSlots": 0
},
"@setRewards_2314": {
"entryPoint": 4754,
"id": 2314,
"parameterSlots": 2,
"returnSlots": 0
},
"@terms_52": {
"entryPoint": 8387,
"id": 52,
"parameterSlots": 0,
"returnSlots": 0
},
"@updateTreasury_2436": {
"entryPoint": 6645,
"id": 2436,
"parameterSlots": 0,
"returnSlots": 0
},
"@whitelist_2332": {
"entryPoint": 6432,
"id": 2332,
"parameterSlots": 1,
"returnSlots": 0
},
"@whitelisted_2186": {
"entryPoint": null,
"id": 2186,
"parameterSlots": 0,
"returnSlots": 0
},
"abi_decode_array_uint256": {
"entryPoint": 14849,
"id": null,
"parameterSlots": 2,
"returnSlots": 1
},
"abi_decode_array_uint32": {
"entryPoint": 14918,
"id": null,
"parameterSlots": 2,
"returnSlots": 1
},
"abi_decode_available_length_array_uint256": {
"entryPoint": 14725,
"id": null,
"parameterSlots": 2,
"returnSlots": 1
},
"abi_decode_bool": {
"entryPoint": 14833,
"id": null,
"parameterSlots": 1,
"returnSlots": 1
},
"abi_decode_tuple_t_address": {
"entryPoint": 14561,
"id": null,
"parameterSlots": 2,
"returnSlots": 1
},
"abi_decode_tuple_t_address_fromMemory": {
"entryPoint": 15774,
"id": null,
"parameterSlots": 2,
"returnSlots": 1
},
"abi_decode_tuple_t_addresst_array$_t_uint256_$dyn_memory_ptrt_bool": {
"entryPoint": 15488,
"id": null,
"parameterSlots": 2,
"returnSlots": 3
},
"abi_decode_tuple_t_addresst_bool": {
"entryPoint": 15199,
"id": null,
"parameterSlots": 2,
"returnSlots": 2
},
"abi_decode_tuple_t_addresst_uint256": {
"entryPoint": 15444,
"id": null,
"parameterSlots": 2,
"returnSlots": 2
},
"abi_decode_tuple_t_bool_fromMemory": {
"entryPoint": 16453,
"id": null,
"parameterSlots": 2,
"returnSlots": 1
},
"abi_decode_tuple_t_contract$_IAxodusAuthority_$1363": {
"entryPoint": null,
"id": null,
"parameterSlots": 2,
"returnSlots": 1
},
"abi_decode_tuple_t_contract$_IERC20_$1592t_array$_t_uint256_$3_memory_ptrt_array$_t_bool_$2_memory_ptrt_array$_t_uint256_$2_memory_ptrt_array$_t_uint32_$2_memory_ptr": {
"entryPoint": 15006,
"id": null,
"parameterSlots": 2,
"returnSlots": 5
},
"abi_decode_tuple_t_uint256": {
"entryPoint": 14590,
"id": null,
"parameterSlots": 2,
"returnSlots": 1
},
"abi_decode_tuple_t_uint256_fromMemory": {
"entryPoint": 16413,
"id": null,
"parameterSlots": 2,
"returnSlots": 1
},
"abi_decode_tuple_t_uint256t_uint256": {
"entryPoint": 15324,
"id": null,
"parameterSlots": 2,
"returnSlots": 2
},
"abi_decode_tuple_t_uint256t_uint256t_uint256t_addresst_address": {
"entryPoint": 15358,
"id": null,
"parameterSlots": 2,
"returnSlots": 5
},
"abi_decode_tuple_t_uint8_fromMemory": {
"entryPoint": 15994,
"id": null,
"parameterSlots": 2,
"returnSlots": 1
},
"abi_encode_tuple_packed_t_bytes_memory_ptr__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed": {
"entryPoint": 16654,
"id": null,
"parameterSlots": 2,
"returnSlots": 1
},
"abi_encode_tuple_t_address_t_address_t_uint256__to_t_address_t_address_t_uint256__fromStack_reversed": {
"entryPoint": null,
"id": null,
"parameterSlots": 4,
"returnSlots": 1
},
"abi_encode_tuple_t_address_t_uint256__to_t_address_t_uint256__fromStack_reversed": {
"entryPoint": null,
"id": null,
"parameterSlots": 3,
"returnSlots": 1
},
"abi_encode_tuple_t_address_t_uint256_t_bool_t_bool__to_t_address_t_uint256_t_bool_t_bool__fromStack_reversed": {
"entryPoint": null,
"id": null,
"parameterSlots": 5,
"returnSlots": 1
},
"abi_encode_tuple_t_array$_t_uint256_$dyn_memory_ptr__to_t_array$_t_uint256_$dyn_memory_ptr__fromStack_reversed": {
"entryPoint": 15256,
"id": null,
"parameterSlots": 2,
"returnSlots": 1
},
"abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed": {
"entryPoint": null,
"id": null,
"parameterSlots": 2,
"returnSlots": 1
},
"abi_encode_tuple_t_bool_t_uint64_t_uint48_t_uint48_t_uint64__to_t_bool_t_uint64_t_uint48_t_uint48_t_uint64__fromStack_reversed": {
"entryPoint": null,
"id": null,
"parameterSlots": 6,
"returnSlots": 1
},
"abi_encode_tuple_t_contract$_IAxodusAuthority_$1363__to_t_address__fromStack_reversed": {
"entryPoint": null,
"id": null,
"parameterSlots": 2,
"returnSlots": 1
},
"abi_encode_tuple_t_string_storage__to_t_string_memory_ptr__fromStack_reversed": {
"entryPoint": 15803,
"id": null,
"parameterSlots": 2,
"returnSlots": 1
},
"abi_encode_tuple_t_stringliteral_01c6fa4a4015a9eda8ca77033207a05fbc3f7a37fb669276c30d96495ab93a3d__to_t_string_memory_ptr__fromStack_reversed": {
"entryPoint": null,
"id": null,
"parameterSlots": 1,
"returnSlots": 1
},
"abi_encode_tuple_t_stringliteral_27e22439de8a2606f99ef2d44a8a3f2c33ed2f7654f6fc04efacc696ff80bf2a__to_t_string_memory_ptr__fromStack_reversed": {
"entryPoint": null,
"id": null,
"parameterSlots": 1,
"returnSlots": 1
},
"abi_encode_tuple_t_stringliteral_390b8499c77d7e3965ee0007f36d45581be7456610ebbfcd1384a584683de927__to_t_string_memory_ptr__fromStack_reversed": {
"entryPoint": null,
"id": null,
"parameterSlots": 1,
"returnSlots": 1
},
"abi_encode_tuple_t_stringliteral_3f0a1b34106c1bb5793363b7357959965247601a75fe51ae5f5c1a4ce71d6aec__to_t_string_memory_ptr__fromStack_reversed": {
"entryPoint": null,
"id": null,
"parameterSlots": 1,
"returnSlots": 1
},
"abi_encode_tuple_t_stringliteral_40bb1709b9f34b9d4a2d91572226ec87ca73fa026f8a142c1b18ba423c82d9f3__to_t_string_memory_ptr__fromStack_reversed": {
"entryPoint": null,
"id": null,
"parameterSlots": 1,
"returnSlots": 1
},
"abi_encode_tuple_t_stringliteral_77631768048ee92f9dcf4b9b9d762877d6b9723214862c733f0596708fc219b7__to_t_string_memory_ptr__fromStack_reversed": {
"entryPoint": null,
"id": null,
"parameterSlots": 1,
"returnSlots": 1
},
"abi_encode_tuple_t_stringliteral_aea18fcde2fe90b5b0a22e7a0628b39e223af20c24005915c4b2bac91c94ca30__to_t_string_memory_ptr__fromStack_reversed": {
"entryPoint": null,
"id": null,
"parameterSlots": 1,
"returnSlots": 1
},
"abi_encode_tuple_t_stringliteral_be35883400edaaa999e0b666f05f0406dd8479845f6f4942e192d5fcb02565ad__to_t_string_memory_ptr__fromStack_reversed": {
"entryPoint": null,
"id": null,
"parameterSlots": 1,
"returnSlots": 1
},
"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed": {
"entryPoint": null,
"id": null,
"parameterSlots": 2,
"returnSlots": 1
},
"abi_encode_tuple_t_uint256_t_bool__to_t_uint256_t_bool__fromStack_reversed": {
"entryPoint": null,
"id": null,
"parameterSlots": 3,
"returnSlots": 1
},
"abi_encode_tuple_t_uint256_t_contract$_IERC20_$1592_t_bool_t_uint64_t_uint64_t_uint64_t_uint256__to_t_uint256_t_address_t_bool_t_uint64_t_uint64_t_uint64_t_uint256__fromStack_reversed": {
"entryPoint": null,
"id": null,
"parameterSlots": 8,
"returnSlots": 1
},
"abi_encode_tuple_t_uint256_t_uint256__to_t_uint256_t_uint256__fromStack_reversed": {
"entryPoint": null,
"id": null,
"parameterSlots": 3,
"returnSlots": 1
},
"abi_encode_tuple_t_uint256_t_uint256_t_uint256__to_t_uint256_t_uint256_t_uint256__fromStack_reversed": {
"entryPoint": null,
"id": null,
"parameterSlots": 4,
"returnSlots": 1
},
"abi_encode_tuple_t_uint256_t_uint48_t_uint48_t_uint48_t_uint48__to_t_uint256_t_uint48_t_uint48_t_uint48_t_uint48__fromStack_reversed": {
"entryPoint": null,
"id": null,
"parameterSlots": 6,
"returnSlots": 1
},
"abi_encode_tuple_t_uint48_t_uint48_t_uint48_t_uint48_t_uint48_t_uint8__to_t_uint48_t_uint48_t_uint48_t_uint48_t_uint48_t_uint8__fromStack_reversed": {
"entryPoint": null,
"id": null,
"parameterSlots": 7,
"returnSlots": 1
},
"abi_encode_tuple_t_uint64__to_t_uint64__fromStack_reversed": {
"entryPoint": null,
"id": null,
"parameterSlots": 2,
"returnSlots": 1
},
"abi_encode_tuple_t_uint64_t_uint48_t_uint48_t_bool__to_t_uint64_t_uint48_t_uint48_t_bool__fromStack_reversed": {
"entryPoint": null,
"id": null,
"parameterSlots": 5,
"returnSlots": 1
},
"abi_encode_tuple_t_uint64_t_uint64__to_t_uint64_t_uint64__fromStack_reversed": {
"entryPoint": null,
"id": null,
"parameterSlots": 3,
"returnSlots": 1
},
"allocate_memory": {
"entryPoint": 14677,
"id": null,
"parameterSlots": 1,
"returnSlots": 1
},
"allocate_memory_5338": {
"entryPoint": 14637,
"id": null,
"parameterSlots": 0,
"returnSlots": 1
},
"array_dataslot_string_storage": {
"entryPoint": null,
"id": null,
"parameterSlots": 1,
"returnSlots": 1
},
"array_storeLengthForEncoding_array_uint256_dyn": {
"entryPoint": null,
"id": null,
"parameterSlots": 2,
"returnSlots": 1
},
"checked_add_t_uint256": {
"entryPoint": 16389,
"id": null,
"parameterSlots": 2,
"returnSlots": 1
},
"checked_add_t_uint48": {
"entryPoint": 16509,
"id": null,
"parameterSlots": 2,
"returnSlots": 1
},
"checked_add_t_uint64": {
"entryPoint": 16551,
"id": null,
"parameterSlots": 2,
"returnSlots": 1
},
"checked_div_t_uint256": {
"entryPoint": 16322,
"id": null,
"parameterSlots": 2,
"returnSlots": 1
},
"checked_div_t_uint64": {
"entryPoint": 16616,
"id": null,
"parameterSlots": 2,
"returnSlots": 1
},
"checked_exp_helper": {
"entryPoint": 16029,
"id": null,
"parameterSlots": 2,
"returnSlots": 2
},
"checked_exp_t_uint256_t_uint256": {
"entryPoint": 16257,
"id": null,
"parameterSlots": 2,
"returnSlots": 1
},
"checked_exp_t_uint256_t_uint8": {
"entryPoint": 16438,
"id": null,
"parameterSlots": 2,
"returnSlots": 1
},
"checked_exp_unsigned": {
"entryPoint": 16096,
"id": null,
"parameterSlots": 2,
"returnSlots": 1
},
"checked_mul_t_uint256": {
"entryPoint": 16269,
"id": null,
"parameterSlots": 2,
"returnSlots": 1
},
"checked_mul_t_uint64": {
"entryPoint": 16342,
"id": null,
"parameterSlots": 2,
"returnSlots": 1
},
"checked_sub_t_uint256": {
"entryPoint": 15971,
"id": null,
"parameterSlots": 2,
"returnSlots": 1
},
"checked_sub_t_uint48": {
"entryPoint": 16585,
"id": null,
"parameterSlots": 2,
"returnSlots": 1
},
"checked_sub_t_uint64": {
"entryPoint": 15734,
"id": null,
"parameterSlots": 2,
"returnSlots": 1
},
"increment_t_uint256": {
"entryPoint": 16482,
"id": null,
"parameterSlots": 1,
"returnSlots": 1
},
"panic_error_0x11": {
"entryPoint": 15712,
"id": null,
"parameterSlots": 0,
"returnSlots": 0
},
"panic_error_0x12": {
"entryPoint": 16300,
"id": null,
"parameterSlots": 0,
"returnSlots": 0
},
"panic_error_0x32": {
"entryPoint": 15690,
"id": null,
"parameterSlots": 0,
"returnSlots": 0
},
"panic_error_0x41": {
"entryPoint": 14615,
"id": null,
"parameterSlots": 0,
"returnSlots": 0
},
"validator_revert_address": {
"entryPoint": 14537,
"id": null,
"parameterSlots": 1,
"returnSlots": 0
},
"validator_revert_bool": {
"entryPoint": 14819,
"id": null,
"parameterSlots": 1,
"returnSlots": 0
}
},
"generatedSources": [
{
"ast": {
"nodeType": "YulBlock",
"src": "0:23890:13",
"statements": [
{
"nodeType": "YulBlock",
"src": "6:3:13",
"statements": []
},
{
"body": {
"nodeType": "YulBlock",
"src": "59:86:13",
"statements": [
{
"body": {
"nodeType": "YulBlock",
"src": "123:16:13",
"statements": [
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "132:1:13",
"type": "",
"value": "0"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "135:1:13",
"type": "",
"value": "0"
}
],
"functionName": {
"name": "revert",
"nodeType": "YulIdentifier",
"src": "125:6:13"
},
"nodeType": "YulFunctionCall",
"src": "125:12:13"
},
"nodeType": "YulExpressionStatement",
"src": "125:12:13"
}
]
},
"condition": {
"arguments": [
{
"arguments": [
{
"name": "value",
"nodeType": "YulIdentifier",
"src": "82:5:13"
},
{
"arguments": [
{
"name": "value",
"nodeType": "YulIdentifier",
"src": "93:5:13"
},
{
"arguments": [
{
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "108:3:13",
"type": "",
"value": "160"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "113:1:13",
"type": "",
"value": "1"
}
],
"functionName": {
"name": "shl",
"nodeType": "YulIdentifier",
"src": "104:3:13"
},
"nodeType": "YulFunctionCall",
"src": "104:11:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "117:1:13",
"type": "",
"value": "1"
}
],
"functionName": {
"name": "sub",
"nodeType": "YulIdentifier",
"src": "100:3:13"
},
"nodeType": "YulFunctionCall",
"src": "100:19:13"
}
],
"functionName": {
"name": "and",
"nodeType": "YulIdentifier",
"src": "89:3:13"
},
"nodeType": "YulFunctionCall",
"src": "89:31:13"
}
],
"functionName": {
"name": "eq",
"nodeType": "YulIdentifier",
"src": "79:2:13"
},
"nodeType": "YulFunctionCall",
"src": "79:42:13"
}
],
"functionName": {
"name": "iszero",
"nodeType": "YulIdentifier",
"src": "72:6:13"
},
"nodeType": "YulFunctionCall",
"src": "72:50:13"
},
"nodeType": "YulIf",
"src": "69:70:13"
}
]
},
"name": "validator_revert_address",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "value",
"nodeType": "YulTypedName",
"src": "48:5:13",
"type": ""
}
],
"src": "14:131:13"
},
{
"body": {
"nodeType": "YulBlock",
"src": "220:177:13",
"statements": [
{
"body": {
"nodeType": "YulBlock",
"src": "266:16:13",
"statements": [
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "275:1:13",
"type": "",
"value": "0"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "278:1:13",
"type": "",
"value": "0"
}
],
"functionName": {
"name": "revert",
"nodeType": "YulIdentifier",
"src": "268:6:13"
},
"nodeType": "YulFunctionCall",
"src": "268:12:13"
},
"nodeType": "YulExpressionStatement",
"src": "268:12:13"
}
]
},
"condition": {
"arguments": [
{
"arguments": [
{
"name": "dataEnd",
"nodeType": "YulIdentifier",
"src": "241:7:13"
},
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "250:9:13"
}
],
"functionName": {
"name": "sub",
"nodeType": "YulIdentifier",
"src": "237:3:13"
},
"nodeType": "YulFunctionCall",
"src": "237:23:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "262:2:13",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "slt",
"nodeType": "YulIdentifier",
"src": "233:3:13"
},
"nodeType": "YulFunctionCall",
"src": "233:32:13"
},
"nodeType": "YulIf",
"src": "230:52:13"
},
{
"nodeType": "YulVariableDeclaration",
"src": "291:36:13",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "317:9:13"
}
],
"functionName": {
"name": "calldataload",
"nodeType": "YulIdentifier",
"src": "304:12:13"
},
"nodeType": "YulFunctionCall",
"src": "304:23:13"
},
"variables": [
{
"name": "value",
"nodeType": "YulTypedName",
"src": "295:5:13",
"type": ""
}
]
},
{
"expression": {
"arguments": [
{
"name": "value",
"nodeType": "YulIdentifier",
"src": "361:5:13"
}
],
"functionName": {
"name": "validator_revert_address",
"nodeType": "YulIdentifier",
"src": "336:24:13"
},
"nodeType": "YulFunctionCall",
"src": "336:31:13"
},
"nodeType": "YulExpressionStatement",
"src": "336:31:13"
},
{
"nodeType": "YulAssignment",
"src": "376:15:13",
"value": {
"name": "value",
"nodeType": "YulIdentifier",
"src": "386:5:13"
},
"variableNames": [
{
"name": "value0",
"nodeType": "YulIdentifier",
"src": "376:6:13"
}
]
}
]
},
"name": "abi_decode_tuple_t_address",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "headStart",
"nodeType": "YulTypedName",
"src": "186:9:13",
"type": ""
},
{
"name": "dataEnd",
"nodeType": "YulTypedName",
"src": "197:7:13",
"type": ""
}
],
"returnVariables": [
{
"name": "value0",
"nodeType": "YulTypedName",
"src": "209:6:13",
"type": ""
}
],
"src": "150:247:13"
},
{
"body": {
"nodeType": "YulBlock",
"src": "503:76:13",
"statements": [
{
"nodeType": "YulAssignment",
"src": "513:26:13",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "525:9:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "536:2:13",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "521:3:13"
},
"nodeType": "YulFunctionCall",
"src": "521:18:13"
},
"variableNames": [
{
"name": "tail",
"nodeType": "YulIdentifier",
"src": "513:4:13"
}
]
},
{
"expression": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "555:9:13"
},
{
"name": "value0",
"nodeType": "YulIdentifier",
"src": "566:6:13"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "548:6:13"
},
"nodeType": "YulFunctionCall",
"src": "548:25:13"
},
"nodeType": "YulExpressionStatement",
"src": "548:25:13"
}
]
},
"name": "abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "headStart",
"nodeType": "YulTypedName",
"src": "472:9:13",
"type": ""
},
{
"name": "value0",
"nodeType": "YulTypedName",
"src": "483:6:13",
"type": ""
}
],
"returnVariables": [
{
"name": "tail",
"nodeType": "YulTypedName",
"src": "494:4:13",
"type": ""
}
],
"src": "402:177:13"
},
{
"body": {
"nodeType": "YulBlock",
"src": "654:110:13",
"statements": [
{
"body": {
"nodeType": "YulBlock",
"src": "700:16:13",
"statements": [
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "709:1:13",
"type": "",
"value": "0"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "712:1:13",
"type": "",
"value": "0"
}
],
"functionName": {
"name": "revert",
"nodeType": "YulIdentifier",
"src": "702:6:13"
},
"nodeType": "YulFunctionCall",
"src": "702:12:13"
},
"nodeType": "YulExpressionStatement",
"src": "702:12:13"
}
]
},
"condition": {
"arguments": [
{
"arguments": [
{
"name": "dataEnd",
"nodeType": "YulIdentifier",
"src": "675:7:13"
},
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "684:9:13"
}
],
"functionName": {
"name": "sub",
"nodeType": "YulIdentifier",
"src": "671:3:13"
},
"nodeType": "YulFunctionCall",
"src": "671:23:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "696:2:13",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "slt",
"nodeType": "YulIdentifier",
"src": "667:3:13"
},
"nodeType": "YulFunctionCall",
"src": "667:32:13"
},
"nodeType": "YulIf",
"src": "664:52:13"
},
{
"nodeType": "YulAssignment",
"src": "725:33:13",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "748:9:13"
}
],
"functionName": {
"name": "calldataload",
"nodeType": "YulIdentifier",
"src": "735:12:13"
},
"nodeType": "YulFunctionCall",
"src": "735:23:13"
},
"variableNames": [
{
"name": "value0",
"nodeType": "YulIdentifier",
"src": "725:6:13"
}
]
}
]
},
"name": "abi_decode_tuple_t_uint256",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "headStart",
"nodeType": "YulTypedName",
"src": "620:9:13",
"type": ""
},
{
"name": "dataEnd",
"nodeType": "YulTypedName",
"src": "631:7:13",
"type": ""
}
],
"returnVariables": [
{
"name": "value0",
"nodeType": "YulTypedName",
"src": "643:6:13",
"type": ""
}
],
"src": "584:180:13"
},
{
"body": {
"nodeType": "YulBlock",
"src": "801:95:13",
"statements": [
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "818:1:13",
"type": "",
"value": "0"
},
{
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "825:3:13",
"type": "",
"value": "224"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "830:10:13",
"type": "",
"value": "0x4e487b71"
}
],
"functionName": {
"name": "shl",
"nodeType": "YulIdentifier",
"src": "821:3:13"
},
"nodeType": "YulFunctionCall",
"src": "821:20:13"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "811:6:13"
},
"nodeType": "YulFunctionCall",
"src": "811:31:13"
},
"nodeType": "YulExpressionStatement",
"src": "811:31:13"
},
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "858:1:13",
"type": "",
"value": "4"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "861:4:13",
"type": "",
"value": "0x41"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "851:6:13"
},
"nodeType": "YulFunctionCall",
"src": "851:15:13"
},
"nodeType": "YulExpressionStatement",
"src": "851:15:13"
},
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "882:1:13",
"type": "",
"value": "0"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "885:4:13",
"type": "",
"value": "0x24"
}
],
"functionName": {
"name": "revert",
"nodeType": "YulIdentifier",
"src": "875:6:13"
},
"nodeType": "YulFunctionCall",
"src": "875:15:13"
},
"nodeType": "YulExpressionStatement",
"src": "875:15:13"
}
]
},
"name": "panic_error_0x41",
"nodeType": "YulFunctionDefinition",
"src": "769:127:13"
},
{
"body": {
"nodeType": "YulBlock",
"src": "947:205:13",
"statements": [
{
"nodeType": "YulAssignment",
"src": "957:19:13",
"value": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "973:2:13",
"type": "",
"value": "64"
}
],
"functionName": {
"name": "mload",
"nodeType": "YulIdentifier",
"src": "967:5:13"
},
"nodeType": "YulFunctionCall",
"src": "967:9:13"
},
"variableNames": [
{
"name": "memPtr",
"nodeType": "YulIdentifier",
"src": "957:6:13"
}
]
},
{
"nodeType": "YulVariableDeclaration",
"src": "985:33:13",
"value": {
"arguments": [
{
"name": "memPtr",
"nodeType": "YulIdentifier",
"src": "1007:6:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1015:2:13",
"type": "",
"value": "64"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "1003:3:13"
},
"nodeType": "YulFunctionCall",
"src": "1003:15:13"
},
"variables": [
{
"name": "newFreePtr",
"nodeType": "YulTypedName",
"src": "989:10:13",
"type": ""
}
]
},
{
"body": {
"nodeType": "YulBlock",
"src": "1093:22:13",
"statements": [
{
"expression": {
"arguments": [],
"functionName": {
"name": "panic_error_0x41",
"nodeType": "YulIdentifier",
"src": "1095:16:13"
},
"nodeType": "YulFunctionCall",
"src": "1095:18:13"
},
"nodeType": "YulExpressionStatement",
"src": "1095:18:13"
}
]
},
"condition": {
"arguments": [
{
"arguments": [
{
"name": "newFreePtr",
"nodeType": "YulIdentifier",
"src": "1036:10:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1048:18:13",
"type": "",
"value": "0xffffffffffffffff"
}
],
"functionName": {
"name": "gt",
"nodeType": "YulIdentifier",
"src": "1033:2:13"
},
"nodeType": "YulFunctionCall",
"src": "1033:34:13"
},
{
"arguments": [
{
"name": "newFreePtr",
"nodeType": "YulIdentifier",
"src": "1072:10:13"
},
{
"name": "memPtr",
"nodeType": "YulIdentifier",
"src": "1084:6:13"
}
],
"functionName": {
"name": "lt",
"nodeType": "YulIdentifier",
"src": "1069:2:13"
},
"nodeType": "YulFunctionCall",
"src": "1069:22:13"
}
],
"functionName": {
"name": "or",
"nodeType": "YulIdentifier",
"src": "1030:2:13"
},
"nodeType": "YulFunctionCall",
"src": "1030:62:13"
},
"nodeType": "YulIf",
"src": "1027:88:13"
},
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1131:2:13",
"type": "",
"value": "64"
},
{
"name": "newFreePtr",
"nodeType": "YulIdentifier",
"src": "1135:10:13"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "1124:6:13"
},
"nodeType": "YulFunctionCall",
"src": "1124:22:13"
},
"nodeType": "YulExpressionStatement",
"src": "1124:22:13"
}
]
},
"name": "allocate_memory_5338",
"nodeType": "YulFunctionDefinition",
"returnVariables": [
{
"name": "memPtr",
"nodeType": "YulTypedName",
"src": "936:6:13",
"type": ""
}
],
"src": "901:251:13"
},
{
"body": {
"nodeType": "YulBlock",
"src": "1202:230:13",
"statements": [
{
"nodeType": "YulAssignment",
"src": "1212:19:13",
"value": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1228:2:13",
"type": "",
"value": "64"
}
],
"functionName": {
"name": "mload",
"nodeType": "YulIdentifier",
"src": "1222:5:13"
},
"nodeType": "YulFunctionCall",
"src": "1222:9:13"
},
"variableNames": [
{
"name": "memPtr",
"nodeType": "YulIdentifier",
"src": "1212:6:13"
}
]
},
{
"nodeType": "YulVariableDeclaration",
"src": "1240:58:13",
"value": {
"arguments": [
{
"name": "memPtr",
"nodeType": "YulIdentifier",
"src": "1262:6:13"
},
{
"arguments": [
{
"arguments": [
{
"name": "size",
"nodeType": "YulIdentifier",
"src": "1278:4:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1284:2:13",
"type": "",
"value": "31"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "1274:3:13"
},
"nodeType": "YulFunctionCall",
"src": "1274:13:13"
},
{
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1293:2:13",
"type": "",
"value": "31"
}
],
"functionName": {
"name": "not",
"nodeType": "YulIdentifier",
"src": "1289:3:13"
},
"nodeType": "YulFunctionCall",
"src": "1289:7:13"
}
],
"functionName": {
"name": "and",
"nodeType": "YulIdentifier",
"src": "1270:3:13"
},
"nodeType": "YulFunctionCall",
"src": "1270:27:13"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "1258:3:13"
},
"nodeType": "YulFunctionCall",
"src": "1258:40:13"
},
"variables": [
{
"name": "newFreePtr",
"nodeType": "YulTypedName",
"src": "1244:10:13",
"type": ""
}
]
},
{
"body": {
"nodeType": "YulBlock",
"src": "1373:22:13",
"statements": [
{
"expression": {
"arguments": [],
"functionName": {
"name": "panic_error_0x41",
"nodeType": "YulIdentifier",
"src": "1375:16:13"
},
"nodeType": "YulFunctionCall",
"src": "1375:18:13"
},
"nodeType": "YulExpressionStatement",
"src": "1375:18:13"
}
]
},
"condition": {
"arguments": [
{
"arguments": [
{
"name": "newFreePtr",
"nodeType": "YulIdentifier",
"src": "1316:10:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1328:18:13",
"type": "",
"value": "0xffffffffffffffff"
}
],
"functionName": {
"name": "gt",
"nodeType": "YulIdentifier",
"src": "1313:2:13"
},
"nodeType": "YulFunctionCall",
"src": "1313:34:13"
},
{
"arguments": [
{
"name": "newFreePtr",
"nodeType": "YulIdentifier",
"src": "1352:10:13"
},
{
"name": "memPtr",
"nodeType": "YulIdentifier",
"src": "1364:6:13"
}
],
"functionName": {
"name": "lt",
"nodeType": "YulIdentifier",
"src": "1349:2:13"
},
"nodeType": "YulFunctionCall",
"src": "1349:22:13"
}
],
"functionName": {
"name": "or",
"nodeType": "YulIdentifier",
"src": "1310:2:13"
},
"nodeType": "YulFunctionCall",
"src": "1310:62:13"
},
"nodeType": "YulIf",
"src": "1307:88:13"
},
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1411:2:13",
"type": "",
"value": "64"
},
{
"name": "newFreePtr",
"nodeType": "YulIdentifier",
"src": "1415:10:13"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "1404:6:13"
},
"nodeType": "YulFunctionCall",
"src": "1404:22:13"
},
"nodeType": "YulExpressionStatement",
"src": "1404:22:13"
}
]
},
"name": "allocate_memory",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "size",
"nodeType": "YulTypedName",
"src": "1182:4:13",
"type": ""
}
],
"returnVariables": [
{
"name": "memPtr",
"nodeType": "YulTypedName",
"src": "1191:6:13",
"type": ""
}
],
"src": "1157:275:13"
},
{
"body": {
"nodeType": "YulBlock",
"src": "1514:522:13",
"statements": [
{
"nodeType": "YulVariableDeclaration",
"src": "1524:23:13",
"value": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1544:2:13",
"type": "",
"value": "64"
}
],
"functionName": {
"name": "mload",
"nodeType": "YulIdentifier",
"src": "1538:5:13"
},
"nodeType": "YulFunctionCall",
"src": "1538:9:13"
},
"variables": [
{
"name": "memPtr",
"nodeType": "YulTypedName",
"src": "1528:6:13",
"type": ""
}
]
},
{
"nodeType": "YulVariableDeclaration",
"src": "1556:33:13",
"value": {
"arguments": [
{
"name": "memPtr",
"nodeType": "YulIdentifier",
"src": "1578:6:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1586:2:13",
"type": "",
"value": "96"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "1574:3:13"
},
"nodeType": "YulFunctionCall",
"src": "1574:15:13"
},
"variables": [
{
"name": "newFreePtr",
"nodeType": "YulTypedName",
"src": "1560:10:13",
"type": ""
}
]
},
{
"body": {
"nodeType": "YulBlock",
"src": "1664:22:13",
"statements": [
{
"expression": {
"arguments": [],
"functionName": {
"name": "panic_error_0x41",
"nodeType": "YulIdentifier",
"src": "1666:16:13"
},
"nodeType": "YulFunctionCall",
"src": "1666:18:13"
},
"nodeType": "YulExpressionStatement",
"src": "1666:18:13"
}
]
},
"condition": {
"arguments": [
{
"arguments": [
{
"name": "newFreePtr",
"nodeType": "YulIdentifier",
"src": "1607:10:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1619:18:13",
"type": "",
"value": "0xffffffffffffffff"
}
],
"functionName": {
"name": "gt",
"nodeType": "YulIdentifier",
"src": "1604:2:13"
},
"nodeType": "YulFunctionCall",
"src": "1604:34:13"
},
{
"arguments": [
{
"name": "newFreePtr",
"nodeType": "YulIdentifier",
"src": "1643:10:13"
},
{
"name": "memPtr",
"nodeType": "YulIdentifier",
"src": "1655:6:13"
}
],
"functionName": {
"name": "lt",
"nodeType": "YulIdentifier",
"src": "1640:2:13"
},
"nodeType": "YulFunctionCall",
"src": "1640:22:13"
}
],
"functionName": {
"name": "or",
"nodeType": "YulIdentifier",
"src": "1601:2:13"
},
"nodeType": "YulFunctionCall",
"src": "1601:62:13"
},
"nodeType": "YulIf",
"src": "1598:88:13"
},
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1702:2:13",
"type": "",
"value": "64"
},
{
"name": "newFreePtr",
"nodeType": "YulIdentifier",
"src": "1706:10:13"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "1695:6:13"
},
"nodeType": "YulFunctionCall",
"src": "1695:22:13"
},
"nodeType": "YulExpressionStatement",
"src": "1695:22:13"
},
{
"nodeType": "YulAssignment",
"src": "1726:15:13",
"value": {
"name": "memPtr",
"nodeType": "YulIdentifier",
"src": "1735:6:13"
},
"variableNames": [
{
"name": "array",
"nodeType": "YulIdentifier",
"src": "1726:5:13"
}
]
},
{
"nodeType": "YulVariableDeclaration",
"src": "1750:17:13",
"value": {
"name": "memPtr",
"nodeType": "YulIdentifier",
"src": "1761:6:13"
},
"variables": [
{
"name": "dst",
"nodeType": "YulTypedName",
"src": "1754:3:13",
"type": ""
}
]
},
{
"nodeType": "YulVariableDeclaration",
"src": "1776:29:13",
"value": {
"arguments": [
{
"name": "offset",
"nodeType": "YulIdentifier",
"src": "1794:6:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1802:2:13",
"type": "",
"value": "96"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "1790:3:13"
},
"nodeType": "YulFunctionCall",
"src": "1790:15:13"
},
"variables": [
{
"name": "srcEnd",
"nodeType": "YulTypedName",
"src": "1780:6:13",
"type": ""
}
]
},
{
"body": {
"nodeType": "YulBlock",
"src": "1833:16:13",
"statements": [
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1842:1:13",
"type": "",
"value": "0"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1845:1:13",
"type": "",
"value": "0"
}
],
"functionName": {
"name": "revert",
"nodeType": "YulIdentifier",
"src": "1835:6:13"
},
"nodeType": "YulFunctionCall",
"src": "1835:12:13"
},
"nodeType": "YulExpressionStatement",
"src": "1835:12:13"
}
]
},
"condition": {
"arguments": [
{
"name": "srcEnd",
"nodeType": "YulIdentifier",
"src": "1820:6:13"
},
{
"name": "end",
"nodeType": "YulIdentifier",
"src": "1828:3:13"
}
],
"functionName": {
"name": "gt",
"nodeType": "YulIdentifier",
"src": "1817:2:13"
},
"nodeType": "YulFunctionCall",
"src": "1817:15:13"
},
"nodeType": "YulIf",
"src": "1814:35:13"
},
{
"nodeType": "YulVariableDeclaration",
"src": "1858:17:13",
"value": {
"name": "offset",
"nodeType": "YulIdentifier",
"src": "1869:6:13"
},
"variables": [
{
"name": "src",
"nodeType": "YulTypedName",
"src": "1862:3:13",
"type": ""
}
]
},
{
"body": {
"nodeType": "YulBlock",
"src": "1942:88:13",
"statements": [
{
"expression": {
"arguments": [
{
"name": "dst",
"nodeType": "YulIdentifier",
"src": "1963:3:13"
},
{
"arguments": [
{
"name": "src",
"nodeType": "YulIdentifier",
"src": "1981:3:13"
}
],
"functionName": {
"name": "calldataload",
"nodeType": "YulIdentifier",
"src": "1968:12:13"
},
"nodeType": "YulFunctionCall",
"src": "1968:17:13"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "1956:6:13"
},
"nodeType": "YulFunctionCall",
"src": "1956:30:13"
},
"nodeType": "YulExpressionStatement",
"src": "1956:30:13"
},
{
"nodeType": "YulAssignment",
"src": "1999:21:13",
"value": {
"arguments": [
{
"name": "dst",
"nodeType": "YulIdentifier",
"src": "2010:3:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2015:4:13",
"type": "",
"value": "0x20"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "2006:3:13"
},
"nodeType": "YulFunctionCall",
"src": "2006:14:13"
},
"variableNames": [
{
"name": "dst",
"nodeType": "YulIdentifier",
"src": "1999:3:13"
}
]
}
]
},
"condition": {
"arguments": [
{
"name": "src",
"nodeType": "YulIdentifier",
"src": "1895:3:13"
},
{
"name": "srcEnd",
"nodeType": "YulIdentifier",
"src": "1900:6:13"
}
],
"functionName": {
"name": "lt",
"nodeType": "YulIdentifier",
"src": "1892:2:13"
},
"nodeType": "YulFunctionCall",
"src": "1892:15:13"
},
"nodeType": "YulForLoop",
"post": {
"nodeType": "YulBlock",
"src": "1908:25:13",
"statements": [
{
"nodeType": "YulAssignment",
"src": "1910:21:13",
"value": {
"arguments": [
{
"name": "src",
"nodeType": "YulIdentifier",
"src": "1921:3:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1926:4:13",
"type": "",
"value": "0x20"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "1917:3:13"
},
"nodeType": "YulFunctionCall",
"src": "1917:14:13"
},
"variableNames": [
{
"name": "src",
"nodeType": "YulIdentifier",
"src": "1910:3:13"
}
]
}
]
},
"pre": {
"nodeType": "YulBlock",
"src": "1888:3:13",
"statements": []
},
"src": "1884:146:13"
}
]
},
"name": "abi_decode_available_length_array_uint256",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "offset",
"nodeType": "YulTypedName",
"src": "1488:6:13",
"type": ""
},
{
"name": "end",
"nodeType": "YulTypedName",
"src": "1496:3:13",
"type": ""
}
],
"returnVariables": [
{
"name": "array",
"nodeType": "YulTypedName",
"src": "1504:5:13",
"type": ""
}
],
"src": "1437:599:13"
},
{
"body": {
"nodeType": "YulBlock",
"src": "2083:76:13",
"statements": [
{
"body": {
"nodeType": "YulBlock",
"src": "2137:16:13",
"statements": [
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2146:1:13",
"type": "",
"value": "0"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2149:1:13",
"type": "",
"value": "0"
}
],
"functionName": {
"name": "revert",
"nodeType": "YulIdentifier",
"src": "2139:6:13"
},
"nodeType": "YulFunctionCall",
"src": "2139:12:13"
},
"nodeType": "YulExpressionStatement",
"src": "2139:12:13"
}
]
},
"condition": {
"arguments": [
{
"arguments": [
{
"name": "value",
"nodeType": "YulIdentifier",
"src": "2106:5:13"
},
{
"arguments": [
{
"arguments": [
{
"name": "value",
"nodeType": "YulIdentifier",
"src": "2127:5:13"
}
],
"functionName": {
"name": "iszero",
"nodeType": "YulIdentifier",
"src": "2120:6:13"
},
"nodeType": "YulFunctionCall",
"src": "2120:13:13"
}
],
"functionName": {
"name": "iszero",
"nodeType": "YulIdentifier",
"src": "2113:6:13"
},
"nodeType": "YulFunctionCall",
"src": "2113:21:13"
}
],
"functionName": {
"name": "eq",
"nodeType": "YulIdentifier",
"src": "2103:2:13"
},
"nodeType": "YulFunctionCall",
"src": "2103:32:13"
}
],
"functionName": {
"name": "iszero",
"nodeType": "YulIdentifier",
"src": "2096:6:13"
},
"nodeType": "YulFunctionCall",
"src": "2096:40:13"
},
"nodeType": "YulIf",
"src": "2093:60:13"
}
]
},
"name": "validator_revert_bool",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "value",
"nodeType": "YulTypedName",
"src": "2072:5:13",
"type": ""
}
],
"src": "2041:118:13"
},
{
"body": {
"nodeType": "YulBlock",
"src": "2210:82:13",
"statements": [
{
"nodeType": "YulAssignment",
"src": "2220:29:13",
"value": {
"arguments": [
{
"name": "offset",
"nodeType": "YulIdentifier",
"src": "2242:6:13"
}
],
"functionName": {
"name": "calldataload",
"nodeType": "YulIdentifier",
"src": "2229:12:13"
},
"nodeType": "YulFunctionCall",
"src": "2229:20:13"
},
"variableNames": [
{
"name": "value",
"nodeType": "YulIdentifier",
"src": "2220:5:13"
}
]
},
{
"expression": {
"arguments": [
{
"name": "value",
"nodeType": "YulIdentifier",
"src": "2280:5:13"
}
],
"functionName": {
"name": "validator_revert_bool",
"nodeType": "YulIdentifier",
"src": "2258:21:13"
},
"nodeType": "YulFunctionCall",
"src": "2258:28:13"
},
"nodeType": "YulExpressionStatement",
"src": "2258:28:13"
}
]
},
"name": "abi_decode_bool",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "offset",
"nodeType": "YulTypedName",
"src": "2189:6:13",
"type": ""
}
],
"returnVariables": [
{
"name": "value",
"nodeType": "YulTypedName",
"src": "2200:5:13",
"type": ""
}
],
"src": "2164:128:13"
},
{
"body": {
"nodeType": "YulBlock",
"src": "2357:424:13",
"statements": [
{
"body": {
"nodeType": "YulBlock",
"src": "2406:16:13",
"statements": [
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2415:1:13",
"type": "",
"value": "0"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2418:1:13",
"type": "",
"value": "0"
}
],
"functionName": {
"name": "revert",
"nodeType": "YulIdentifier",
"src": "2408:6:13"
},
"nodeType": "YulFunctionCall",
"src": "2408:12:13"
},
"nodeType": "YulExpressionStatement",
"src": "2408:12:13"
}
]
},
"condition": {
"arguments": [
{
"arguments": [
{
"arguments": [
{
"name": "offset",
"nodeType": "YulIdentifier",
"src": "2385:6:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2393:4:13",
"type": "",
"value": "0x1f"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "2381:3:13"
},
"nodeType": "YulFunctionCall",
"src": "2381:17:13"
},
{
"name": "end",
"nodeType": "YulIdentifier",
"src": "2400:3:13"
}
],
"functionName": {
"name": "slt",
"nodeType": "YulIdentifier",
"src": "2377:3:13"
},
"nodeType": "YulFunctionCall",
"src": "2377:27:13"
}
],
"functionName": {
"name": "iszero",
"nodeType": "YulIdentifier",
"src": "2370:6:13"
},
"nodeType": "YulFunctionCall",
"src": "2370:35:13"
},
"nodeType": "YulIf",
"src": "2367:55:13"
},
{
"nodeType": "YulVariableDeclaration",
"src": "2431:33:13",
"value": {
"arguments": [],
"functionName": {
"name": "allocate_memory_5338",
"nodeType": "YulIdentifier",
"src": "2442:20:13"
},
"nodeType": "YulFunctionCall",
"src": "2442:22:13"
},
"variables": [
{
"name": "dst",
"nodeType": "YulTypedName",
"src": "2435:3:13",
"type": ""
}
]
},
{
"nodeType": "YulVariableDeclaration",
"src": "2473:16:13",
"value": {
"name": "dst",
"nodeType": "YulIdentifier",
"src": "2486:3:13"
},
"variables": [
{
"name": "dst_1",
"nodeType": "YulTypedName",
"src": "2477:5:13",
"type": ""
}
]
},
{
"nodeType": "YulVariableDeclaration",
"src": "2498:29:13",
"value": {
"arguments": [
{
"name": "offset",
"nodeType": "YulIdentifier",
"src": "2516:6:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2524:2:13",
"type": "",
"value": "64"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "2512:3:13"
},
"nodeType": "YulFunctionCall",
"src": "2512:15:13"
},
"variables": [
{
"name": "srcEnd",
"nodeType": "YulTypedName",
"src": "2502:6:13",
"type": ""
}
]
},
{
"body": {
"nodeType": "YulBlock",
"src": "2555:16:13",
"statements": [
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2564:1:13",
"type": "",
"value": "0"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2567:1:13",
"type": "",
"value": "0"
}
],
"functionName": {
"name": "revert",
"nodeType": "YulIdentifier",
"src": "2557:6:13"
},
"nodeType": "YulFunctionCall",
"src": "2557:12:13"
},
"nodeType": "YulExpressionStatement",
"src": "2557:12:13"
}
]
},
"condition": {
"arguments": [
{
"name": "srcEnd",
"nodeType": "YulIdentifier",
"src": "2542:6:13"
},
{
"name": "end",
"nodeType": "YulIdentifier",
"src": "2550:3:13"
}
],
"functionName": {
"name": "gt",
"nodeType": "YulIdentifier",
"src": "2539:2:13"
},
"nodeType": "YulFunctionCall",
"src": "2539:15:13"
},
"nodeType": "YulIf",
"src": "2536:35:13"
},
{
"nodeType": "YulVariableDeclaration",
"src": "2580:17:13",
"value": {
"name": "offset",
"nodeType": "YulIdentifier",
"src": "2591:6:13"
},
"variables": [
{
"name": "src",
"nodeType": "YulTypedName",
"src": "2584:3:13",
"type": ""
}
]
},
{
"body": {
"nodeType": "YulBlock",
"src": "2664:88:13",
"statements": [
{
"expression": {
"arguments": [
{
"name": "dst",
"nodeType": "YulIdentifier",
"src": "2685:3:13"
},
{
"arguments": [
{
"name": "src",
"nodeType": "YulIdentifier",
"src": "2703:3:13"
}
],
"functionName": {
"name": "calldataload",
"nodeType": "YulIdentifier",
"src": "2690:12:13"
},
"nodeType": "YulFunctionCall",
"src": "2690:17:13"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "2678:6:13"
},
"nodeType": "YulFunctionCall",
"src": "2678:30:13"
},
"nodeType": "YulExpressionStatement",
"src": "2678:30:13"
},
{
"nodeType": "YulAssignment",
"src": "2721:21:13",
"value": {
"arguments": [
{
"name": "dst",
"nodeType": "YulIdentifier",
"src": "2732:3:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2737:4:13",
"type": "",
"value": "0x20"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "2728:3:13"
},
"nodeType": "YulFunctionCall",
"src": "2728:14:13"
},
"variableNames": [
{
"name": "dst",
"nodeType": "YulIdentifier",
"src": "2721:3:13"
}
]
}
]
},
"condition": {
"arguments": [
{
"name": "src",
"nodeType": "YulIdentifier",
"src": "2617:3:13"
},
{
"name": "srcEnd",
"nodeType": "YulIdentifier",
"src": "2622:6:13"
}
],
"functionName": {
"name": "lt",
"nodeType": "YulIdentifier",
"src": "2614:2:13"
},
"nodeType": "YulFunctionCall",
"src": "2614:15:13"
},
"nodeType": "YulForLoop",
"post": {
"nodeType": "YulBlock",
"src": "2630:25:13",
"statements": [
{
"nodeType": "YulAssignment",
"src": "2632:21:13",
"value": {
"arguments": [
{
"name": "src",
"nodeType": "YulIdentifier",
"src": "2643:3:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2648:4:13",
"type": "",
"value": "0x20"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "2639:3:13"
},
"nodeType": "YulFunctionCall",
"src": "2639:14:13"
},
"variableNames": [
{
"name": "src",
"nodeType": "YulIdentifier",
"src": "2632:3:13"
}
]
}
]
},
"pre": {
"nodeType": "YulBlock",
"src": "2610:3:13",
"statements": []
},
"src": "2606:146:13"
},
{
"nodeType": "YulAssignment",
"src": "2761:14:13",
"value": {
"name": "dst_1",
"nodeType": "YulIdentifier",
"src": "2770:5:13"
},
"variableNames": [
{
"name": "array",
"nodeType": "YulIdentifier",
"src": "2761:5:13"
}
]
}
]
},
"name": "abi_decode_array_uint256",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "offset",
"nodeType": "YulTypedName",
"src": "2331:6:13",
"type": ""
},
{
"name": "end",
"nodeType": "YulTypedName",
"src": "2339:3:13",
"type": ""
}
],
"returnVariables": [
{
"name": "array",
"nodeType": "YulTypedName",
"src": "2347:5:13",
"type": ""
}
],
"src": "2297:484:13"
},
{
"body": {
"nodeType": "YulBlock",
"src": "2845:599:13",
"statements": [
{
"body": {
"nodeType": "YulBlock",
"src": "2894:16:13",
"statements": [
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2903:1:13",
"type": "",
"value": "0"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2906:1:13",
"type": "",
"value": "0"
}
],
"functionName": {
"name": "revert",
"nodeType": "YulIdentifier",
"src": "2896:6:13"
},
"nodeType": "YulFunctionCall",
"src": "2896:12:13"
},
"nodeType": "YulExpressionStatement",
"src": "2896:12:13"
}
]
},
"condition": {
"arguments": [
{
"arguments": [
{
"arguments": [
{
"name": "offset",
"nodeType": "YulIdentifier",
"src": "2873:6:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2881:4:13",
"type": "",
"value": "0x1f"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "2869:3:13"
},
"nodeType": "YulFunctionCall",
"src": "2869:17:13"
},
{
"name": "end",
"nodeType": "YulIdentifier",
"src": "2888:3:13"
}
],
"functionName": {
"name": "slt",
"nodeType": "YulIdentifier",
"src": "2865:3:13"
},
"nodeType": "YulFunctionCall",
"src": "2865:27:13"
}
],
"functionName": {
"name": "iszero",
"nodeType": "YulIdentifier",
"src": "2858:6:13"
},
"nodeType": "YulFunctionCall",
"src": "2858:35:13"
},
"nodeType": "YulIf",
"src": "2855:55:13"
},
{
"nodeType": "YulVariableDeclaration",
"src": "2919:33:13",
"value": {
"arguments": [],
"functionName": {
"name": "allocate_memory_5338",
"nodeType": "YulIdentifier",
"src": "2930:20:13"
},
"nodeType": "YulFunctionCall",
"src": "2930:22:13"
},
"variables": [
{
"name": "dst",
"nodeType": "YulTypedName",
"src": "2923:3:13",
"type": ""
}
]
},
{
"nodeType": "YulVariableDeclaration",
"src": "2961:16:13",
"value": {
"name": "dst",
"nodeType": "YulIdentifier",
"src": "2974:3:13"
},
"variables": [
{
"name": "dst_1",
"nodeType": "YulTypedName",
"src": "2965:5:13",
"type": ""
}
]
},
{
"nodeType": "YulVariableDeclaration",
"src": "2986:29:13",
"value": {
"arguments": [
{
"name": "offset",
"nodeType": "YulIdentifier",
"src": "3004:6:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "3012:2:13",
"type": "",
"value": "64"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "3000:3:13"
},
"nodeType": "YulFunctionCall",
"src": "3000:15:13"
},
"variables": [
{
"name": "srcEnd",
"nodeType": "YulTypedName",
"src": "2990:6:13",
"type": ""
}
]
},
{
"body": {
"nodeType": "YulBlock",
"src": "3043:16:13",
"statements": [
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "3052:1:13",
"type": "",
"value": "0"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "3055:1:13",
"type": "",
"value": "0"
}
],
"functionName": {
"name": "revert",
"nodeType": "YulIdentifier",
"src": "3045:6:13"
},
"nodeType": "YulFunctionCall",
"src": "3045:12:13"
},
"nodeType": "YulExpressionStatement",
"src": "3045:12:13"
}
]
},
"condition": {
"arguments": [
{
"name": "srcEnd",
"nodeType": "YulIdentifier",
"src": "3030:6:13"
},
{
"name": "end",
"nodeType": "YulIdentifier",
"src": "3038:3:13"
}
],
"functionName": {
"name": "gt",
"nodeType": "YulIdentifier",
"src": "3027:2:13"
},
"nodeType": "YulFunctionCall",
"src": "3027:15:13"
},
"nodeType": "YulIf",
"src": "3024:35:13"
},
{
"nodeType": "YulVariableDeclaration",
"src": "3068:17:13",
"value": {
"name": "offset",
"nodeType": "YulIdentifier",
"src": "3079:6:13"
},
"variables": [
{
"name": "src",
"nodeType": "YulTypedName",
"src": "3072:3:13",
"type": ""
}
]
},
{
"body": {
"nodeType": "YulBlock",
"src": "3152:263:13",
"statements": [
{
"nodeType": "YulVariableDeclaration",
"src": "3166:30:13",
"value": {
"arguments": [
{
"name": "src",
"nodeType": "YulIdentifier",
"src": "3192:3:13"
}
],
"functionName": {
"name": "calldataload",
"nodeType": "YulIdentifier",
"src": "3179:12:13"
},
"nodeType": "YulFunctionCall",
"src": "3179:17:13"
},
"variables": [
{
"name": "value",
"nodeType": "YulTypedName",
"src": "3170:5:13",
"type": ""
}
]
},
{
"body": {
"nodeType": "YulBlock",
"src": "3266:74:13",
"statements": [
{
"nodeType": "YulVariableDeclaration",
"src": "3284:11:13",
"value": {
"kind": "number",
"nodeType": "YulLiteral",
"src": "3294:1:13",
"type": "",
"value": "0"
},
"variables": [
{
"name": "_1",
"nodeType": "YulTypedName",
"src": "3288:2:13",
"type": ""
}
]
},
{
"expression": {
"arguments": [
{
"name": "_1",
"nodeType": "YulIdentifier",
"src": "3319:2:13"
},
{
"name": "_1",
"nodeType": "YulIdentifier",
"src": "3323:2:13"
}
],
"functionName": {
"name": "revert",
"nodeType": "YulIdentifier",
"src": "3312:6:13"
},
"nodeType": "YulFunctionCall",
"src": "3312:14:13"
},
"nodeType": "YulExpressionStatement",
"src": "3312:14:13"
}
]
},
"condition": {
"arguments": [
{
"arguments": [
{
"name": "value",
"nodeType": "YulIdentifier",
"src": "3222:5:13"
},
{
"arguments": [
{
"name": "value",
"nodeType": "YulIdentifier",
"src": "3233:5:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "3240:10:13",
"type": "",
"value": "0xffffffff"
}
],
"functionName": {
"name": "and",
"nodeType": "YulIdentifier",
"src": "3229:3:13"
},
"nodeType": "YulFunctionCall",
"src": "3229:22:13"
}
],
"functionName": {
"name": "eq",
"nodeType": "YulIdentifier",
"src": "3219:2:13"
},
"nodeType": "YulFunctionCall",
"src": "3219:33:13"
}
],
"functionName": {
"name": "iszero",
"nodeType": "YulIdentifier",
"src": "3212:6:13"
},
"nodeType": "YulFunctionCall",
"src": "3212:41:13"
},
"nodeType": "YulIf",
"src": "3209:131:13"
},
{
"expression": {
"arguments": [
{
"name": "dst",
"nodeType": "YulIdentifier",
"src": "3360:3:13"
},
{
"name": "value",
"nodeType": "YulIdentifier",
"src": "3365:5:13"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "3353:6:13"
},
"nodeType": "YulFunctionCall",
"src": "3353:18:13"
},
"nodeType": "YulExpressionStatement",
"src": "3353:18:13"
},
{
"nodeType": "YulAssignment",
"src": "3384:21:13",
"value": {
"arguments": [
{
"name": "dst",
"nodeType": "YulIdentifier",
"src": "3395:3:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "3400:4:13",
"type": "",
"value": "0x20"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "3391:3:13"
},
"nodeType": "YulFunctionCall",
"src": "3391:14:13"
},
"variableNames": [
{
"name": "dst",
"nodeType": "YulIdentifier",
"src": "3384:3:13"
}
]
}
]
},
"condition": {
"arguments": [
{
"name": "src",
"nodeType": "YulIdentifier",
"src": "3105:3:13"
},
{
"name": "srcEnd",
"nodeType": "YulIdentifier",
"src": "3110:6:13"
}
],
"functionName": {
"name": "lt",
"nodeType": "YulIdentifier",
"src": "3102:2:13"
},
"nodeType": "YulFunctionCall",
"src": "3102:15:13"
},
"nodeType": "YulForLoop",
"post": {
"nodeType": "YulBlock",
"src": "3118:25:13",
"statements": [
{
"nodeType": "YulAssignment",
"src": "3120:21:13",
"value": {
"arguments": [
{
"name": "src",
"nodeType": "YulIdentifier",
"src": "3131:3:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "3136:4:13",
"type": "",
"value": "0x20"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "3127:3:13"
},
"nodeType": "YulFunctionCall",
"src": "3127:14:13"
},
"variableNames": [
{
"name": "src",
"nodeType": "YulIdentifier",
"src": "3120:3:13"
}
]
}
]
},
"pre": {
"nodeType": "YulBlock",
"src": "3098:3:13",
"statements": []
},
"src": "3094:321:13"
},
{
"nodeType": "YulAssignment",
"src": "3424:14:13",
"value": {
"name": "dst_1",
"nodeType": "YulIdentifier",
"src": "3433:5:13"
},
"variableNames": [
{
"name": "array",
"nodeType": "YulIdentifier",
"src": "3424:5:13"
}
]
}
]
},
"name": "abi_decode_array_uint32",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "offset",
"nodeType": "YulTypedName",
"src": "2819:6:13",
"type": ""
},
{
"name": "end",
"nodeType": "YulTypedName",
"src": "2827:3:13",
"type": ""
}
],
"returnVariables": [
{
"name": "array",
"nodeType": "YulTypedName",
"src": "2835:5:13",
"type": ""
}
],
"src": "2786:658:13"
},
{
"body": {
"nodeType": "YulBlock",
"src": "3690:1008:13",
"statements": [
{
"body": {
"nodeType": "YulBlock",
"src": "3737:16:13",
"statements": [
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "3746:1:13",
"type": "",
"value": "0"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "3749:1:13",
"type": "",
"value": "0"
}
],
"functionName": {
"name": "revert",
"nodeType": "YulIdentifier",
"src": "3739:6:13"
},
"nodeType": "YulFunctionCall",
"src": "3739:12:13"
},
"nodeType": "YulExpressionStatement",
"src": "3739:12:13"
}
]
},
"condition": {
"arguments": [
{
"arguments": [
{
"name": "dataEnd",
"nodeType": "YulIdentifier",
"src": "3711:7:13"
},
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "3720:9:13"
}
],
"functionName": {
"name": "sub",
"nodeType": "YulIdentifier",
"src": "3707:3:13"
},
"nodeType": "YulFunctionCall",
"src": "3707:23:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "3732:3:13",
"type": "",
"value": "320"
}
],
"functionName": {
"name": "slt",
"nodeType": "YulIdentifier",
"src": "3703:3:13"
},
"nodeType": "YulFunctionCall",
"src": "3703:33:13"
},
"nodeType": "YulIf",
"src": "3700:53:13"
},
{
"nodeType": "YulVariableDeclaration",
"src": "3762:36:13",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "3788:9:13"
}
],
"functionName": {
"name": "calldataload",
"nodeType": "YulIdentifier",
"src": "3775:12:13"
},
"nodeType": "YulFunctionCall",
"src": "3775:23:13"
},
"variables": [
{
"name": "value",
"nodeType": "YulTypedName",
"src": "3766:5:13",
"type": ""
}
]
},
{
"expression": {
"arguments": [
{
"name": "value",
"nodeType": "YulIdentifier",
"src": "3832:5:13"
}
],
"functionName": {
"name": "validator_revert_address",
"nodeType": "YulIdentifier",
"src": "3807:24:13"
},
"nodeType": "YulFunctionCall",
"src": "3807:31:13"
},
"nodeType": "YulExpressionStatement",
"src": "3807:31:13"
},
{
"nodeType": "YulAssignment",
"src": "3847:15:13",
"value": {
"name": "value",
"nodeType": "YulIdentifier",
"src": "3857:5:13"
},
"variableNames": [
{
"name": "value0",
"nodeType": "YulIdentifier",
"src": "3847:6:13"
}
]
},
{
"nodeType": "YulVariableDeclaration",
"src": "3871:12:13",
"value": {
"kind": "number",
"nodeType": "YulLiteral",
"src": "3881:2:13",
"type": "",
"value": "32"
},
"variables": [
{
"name": "_1",
"nodeType": "YulTypedName",
"src": "3875:2:13",
"type": ""
}
]
},
{
"body": {
"nodeType": "YulBlock",
"src": "3936:16:13",
"statements": [
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "3945:1:13",
"type": "",
"value": "0"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "3948:1:13",
"type": "",
"value": "0"
}
],
"functionName": {
"name": "revert",
"nodeType": "YulIdentifier",
"src": "3938:6:13"
},
"nodeType": "YulFunctionCall",
"src": "3938:12:13"
},
"nodeType": "YulExpressionStatement",
"src": "3938:12:13"
}
]
},
"condition": {
"arguments": [
{
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "3910:9:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "3921:2:13",
"type": "",
"value": "63"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "3906:3:13"
},
"nodeType": "YulFunctionCall",
"src": "3906:18:13"
},
{
"name": "dataEnd",
"nodeType": "YulIdentifier",
"src": "3926:7:13"
}
],
"functionName": {
"name": "slt",
"nodeType": "YulIdentifier",
"src": "3902:3:13"
},
"nodeType": "YulFunctionCall",
"src": "3902:32:13"
}
],
"functionName": {
"name": "iszero",
"nodeType": "YulIdentifier",
"src": "3895:6:13"
},
"nodeType": "YulFunctionCall",
"src": "3895:40:13"
},
"nodeType": "YulIf",
"src": "3892:60:13"
},
{
"nodeType": "YulAssignment",
"src": "3961:80:13",
"value": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "4017:9:13"
},
{
"name": "_1",
"nodeType": "YulIdentifier",
"src": "4028:2:13"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "4013:3:13"
},
"nodeType": "YulFunctionCall",
"src": "4013:18:13"
},
{
"name": "dataEnd",
"nodeType": "YulIdentifier",
"src": "4033:7:13"
}
],
"functionName": {
"name": "abi_decode_available_length_array_uint256",
"nodeType": "YulIdentifier",
"src": "3971:41:13"
},
"nodeType": "YulFunctionCall",
"src": "3971:70:13"
},
"variableNames": [
{
"name": "value1",
"nodeType": "YulIdentifier",
"src": "3961:6:13"
}
]
},
{
"body": {
"nodeType": "YulBlock",
"src": "4095:16:13",
"statements": [
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "4104:1:13",
"type": "",
"value": "0"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "4107:1:13",
"type": "",
"value": "0"
}
],
"functionName": {
"name": "revert",
"nodeType": "YulIdentifier",
"src": "4097:6:13"
},
"nodeType": "YulFunctionCall",
"src": "4097:12:13"
},
"nodeType": "YulExpressionStatement",
"src": "4097:12:13"
}
]
},
"condition": {
"arguments": [
{
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "4068:9:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "4079:3:13",
"type": "",
"value": "159"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "4064:3:13"
},
"nodeType": "YulFunctionCall",
"src": "4064:19:13"
},
{
"name": "dataEnd",
"nodeType": "YulIdentifier",
"src": "4085:7:13"
}
],
"functionName": {
"name": "slt",
"nodeType": "YulIdentifier",
"src": "4060:3:13"
},
"nodeType": "YulFunctionCall",
"src": "4060:33:13"
}
],
"functionName": {
"name": "iszero",
"nodeType": "YulIdentifier",
"src": "4053:6:13"
},
"nodeType": "YulFunctionCall",
"src": "4053:41:13"
},
"nodeType": "YulIf",
"src": "4050:61:13"
},
{
"nodeType": "YulVariableDeclaration",
"src": "4120:33:13",
"value": {
"arguments": [],
"functionName": {
"name": "allocate_memory_5338",
"nodeType": "YulIdentifier",
"src": "4131:20:13"
},
"nodeType": "YulFunctionCall",
"src": "4131:22:13"
},
"variables": [
{
"name": "dst",
"nodeType": "YulTypedName",
"src": "4124:3:13",
"type": ""
}
]
},
{
"nodeType": "YulVariableDeclaration",
"src": "4162:16:13",
"value": {
"name": "dst",
"nodeType": "YulIdentifier",
"src": "4175:3:13"
},
"variables": [
{
"name": "dst_1",
"nodeType": "YulTypedName",
"src": "4166:5:13",
"type": ""
}
]
},
{
"nodeType": "YulVariableDeclaration",
"src": "4187:33:13",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "4205:9:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "4216:3:13",
"type": "",
"value": "192"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "4201:3:13"
},
"nodeType": "YulFunctionCall",
"src": "4201:19:13"
},
"variables": [
{
"name": "srcEnd",
"nodeType": "YulTypedName",
"src": "4191:6:13",
"type": ""
}
]
},
{
"body": {
"nodeType": "YulBlock",
"src": "4252:16:13",
"statements": [
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "4261:1:13",
"type": "",
"value": "0"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "4264:1:13",
"type": "",
"value": "0"
}
],
"functionName": {
"name": "revert",
"nodeType": "YulIdentifier",
"src": "4254:6:13"
},
"nodeType": "YulFunctionCall",
"src": "4254:12:13"
},
"nodeType": "YulExpressionStatement",
"src": "4254:12:13"
}
]
},
"condition": {
"arguments": [
{
"name": "srcEnd",
"nodeType": "YulIdentifier",
"src": "4235:6:13"
},
{
"name": "dataEnd",
"nodeType": "YulIdentifier",
"src": "4243:7:13"
}
],
"functionName": {
"name": "gt",
"nodeType": "YulIdentifier",
"src": "4232:2:13"
},
"nodeType": "YulFunctionCall",
"src": "4232:19:13"
},
"nodeType": "YulIf",
"src": "4229:39:13"
},
{
"nodeType": "YulVariableDeclaration",
"src": "4277:30:13",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "4292:9:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "4303:3:13",
"type": "",
"value": "128"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "4288:3:13"
},
"nodeType": "YulFunctionCall",
"src": "4288:19:13"
},
"variables": [
{
"name": "src",
"nodeType": "YulTypedName",
"src": "4281:3:13",
"type": ""
}
]
},
{
"body": {
"nodeType": "YulBlock",
"src": "4372:164:13",
"statements": [
{
"nodeType": "YulVariableDeclaration",
"src": "4386:32:13",
"value": {
"arguments": [
{
"name": "src",
"nodeType": "YulIdentifier",
"src": "4414:3:13"
}
],
"functionName": {
"name": "calldataload",
"nodeType": "YulIdentifier",
"src": "4401:12:13"
},
"nodeType": "YulFunctionCall",
"src": "4401:17:13"
},
"variables": [
{
"name": "value_1",
"nodeType": "YulTypedName",
"src": "4390:7:13",
"type": ""
}
]
},
{
"expression": {
"arguments": [
{
"name": "value_1",
"nodeType": "YulIdentifier",
"src": "4453:7:13"
}
],
"functionName": {
"name": "validator_revert_bool",
"nodeType": "YulIdentifier",
"src": "4431:21:13"
},
"nodeType": "YulFunctionCall",
"src": "4431:30:13"
},
"nodeType": "YulExpressionStatement",
"src": "4431:30:13"
},
{
"expression": {
"arguments": [
{
"name": "dst",
"nodeType": "YulIdentifier",
"src": "4481:3:13"
},
{
"name": "value_1",
"nodeType": "YulIdentifier",
"src": "4486:7:13"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "4474:6:13"
},
"nodeType": "YulFunctionCall",
"src": "4474:20:13"
},
"nodeType": "YulExpressionStatement",
"src": "4474:20:13"
},
{
"nodeType": "YulAssignment",
"src": "4507:19:13",
"value": {
"arguments": [
{
"name": "dst",
"nodeType": "YulIdentifier",
"src": "4518:3:13"
},
{
"name": "_1",
"nodeType": "YulIdentifier",
"src": "4523:2:13"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "4514:3:13"
},
"nodeType": "YulFunctionCall",
"src": "4514:12:13"
},
"variableNames": [
{
"name": "dst",
"nodeType": "YulIdentifier",
"src": "4507:3:13"
}
]
}
]
},
"condition": {
"arguments": [
{
"name": "src",
"nodeType": "YulIdentifier",
"src": "4327:3:13"
},
{
"name": "srcEnd",
"nodeType": "YulIdentifier",
"src": "4332:6:13"
}
],
"functionName": {
"name": "lt",
"nodeType": "YulIdentifier",
"src": "4324:2:13"
},
"nodeType": "YulFunctionCall",
"src": "4324:15:13"
},
"nodeType": "YulForLoop",
"post": {
"nodeType": "YulBlock",
"src": "4340:23:13",
"statements": [
{
"nodeType": "YulAssignment",
"src": "4342:19:13",
"value": {
"arguments": [
{
"name": "src",
"nodeType": "YulIdentifier",
"src": "4353:3:13"
},
{
"name": "_1",
"nodeType": "YulIdentifier",
"src": "4358:2:13"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "4349:3:13"
},
"nodeType": "YulFunctionCall",
"src": "4349:12:13"
},
"variableNames": [
{
"name": "src",
"nodeType": "YulIdentifier",
"src": "4342:3:13"
}
]
}
]
},
"pre": {
"nodeType": "YulBlock",
"src": "4320:3:13",
"statements": []
},
"src": "4316:220:13"
},
{
"nodeType": "YulAssignment",
"src": "4545:15:13",
"value": {
"name": "dst_1",
"nodeType": "YulIdentifier",
"src": "4555:5:13"
},
"variableNames": [
{
"name": "value2",
"nodeType": "YulIdentifier",
"src": "4545:6:13"
}
]
},
{
"nodeType": "YulAssignment",
"src": "4569:51:13",
"value": {
"arguments": [
{
"name": "srcEnd",
"nodeType": "YulIdentifier",
"src": "4604:6:13"
},
{
"name": "dataEnd",
"nodeType": "YulIdentifier",
"src": "4612:7:13"
}
],
"functionName": {
"name": "abi_decode_array_uint256",
"nodeType": "YulIdentifier",
"src": "4579:24:13"
},
"nodeType": "YulFunctionCall",
"src": "4579:41:13"
},
"variableNames": [
{
"name": "value3",
"nodeType": "YulIdentifier",
"src": "4569:6:13"
}
]
},
{
"nodeType": "YulAssignment",
"src": "4629:63:13",
"value": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "4667:9:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "4678:3:13",
"type": "",
"value": "256"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "4663:3:13"
},
"nodeType": "YulFunctionCall",
"src": "4663:19:13"
},
{
"name": "dataEnd",
"nodeType": "YulIdentifier",
"src": "4684:7:13"
}
],
"functionName": {
"name": "abi_decode_array_uint32",
"nodeType": "YulIdentifier",
"src": "4639:23:13"
},
"nodeType": "YulFunctionCall",
"src": "4639:53:13"
},
"variableNames": [
{
"name": "value4",
"nodeType": "YulIdentifier",
"src": "4629:6:13"
}
]
}
]
},
"name": "abi_decode_tuple_t_contract$_IERC20_$1592t_array$_t_uint256_$3_memory_ptrt_array$_t_bool_$2_memory_ptrt_array$_t_uint256_$2_memory_ptrt_array$_t_uint32_$2_memory_ptr",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "headStart",
"nodeType": "YulTypedName",
"src": "3624:9:13",
"type": ""
},
{
"name": "dataEnd",
"nodeType": "YulTypedName",
"src": "3635:7:13",
"type": ""
}
],
"returnVariables": [
{
"name": "value0",
"nodeType": "YulTypedName",
"src": "3647:6:13",
"type": ""
},
{
"name": "value1",
"nodeType": "YulTypedName",
"src": "3655:6:13",
"type": ""
},
{
"name": "value2",
"nodeType": "YulTypedName",
"src": "3663:6:13",
"type": ""
},
{
"name": "value3",
"nodeType": "YulTypedName",
"src": "3671:6:13",
"type": ""
},
{
"name": "value4",
"nodeType": "YulTypedName",
"src": "3679:6:13",
"type": ""
}
],
"src": "3449:1249:13"
},
{
"body": {
"nodeType": "YulBlock",
"src": "4798:92:13",
"statements": [
{
"nodeType": "YulAssignment",
"src": "4808:26:13",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "4820:9:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "4831:2:13",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "4816:3:13"
},
"nodeType": "YulFunctionCall",
"src": "4816:18:13"
},
"variableNames": [
{
"name": "tail",
"nodeType": "YulIdentifier",
"src": "4808:4:13"
}
]
},
{
"expression": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "4850:9:13"
},
{
"arguments": [
{
"arguments": [
{
"name": "value0",
"nodeType": "YulIdentifier",
"src": "4875:6:13"
}
],
"functionName": {
"name": "iszero",
"nodeType": "YulIdentifier",
"src": "4868:6:13"
},
"nodeType": "YulFunctionCall",
"src": "4868:14:13"
}
],
"functionName": {
"name": "iszero",
"nodeType": "YulIdentifier",
"src": "4861:6:13"
},
"nodeType": "YulFunctionCall",
"src": "4861:22:13"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "4843:6:13"
},
"nodeType": "YulFunctionCall",
"src": "4843:41:13"
},
"nodeType": "YulExpressionStatement",
"src": "4843:41:13"
}
]
},
"name": "abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "headStart",
"nodeType": "YulTypedName",
"src": "4767:9:13",
"type": ""
},
{
"name": "value0",
"nodeType": "YulTypedName",
"src": "4778:6:13",
"type": ""
}
],
"returnVariables": [
{
"name": "tail",
"nodeType": "YulTypedName",
"src": "4789:4:13",
"type": ""
}
],
"src": "4703:187:13"
},
{
"body": {
"nodeType": "YulBlock",
"src": "4979:298:13",
"statements": [
{
"body": {
"nodeType": "YulBlock",
"src": "5025:16:13",
"statements": [
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "5034:1:13",
"type": "",
"value": "0"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "5037:1:13",
"type": "",
"value": "0"
}
],
"functionName": {
"name": "revert",
"nodeType": "YulIdentifier",
"src": "5027:6:13"
},
"nodeType": "YulFunctionCall",
"src": "5027:12:13"
},
"nodeType": "YulExpressionStatement",
"src": "5027:12:13"
}
]
},
"condition": {
"arguments": [
{
"arguments": [
{
"name": "dataEnd",
"nodeType": "YulIdentifier",
"src": "5000:7:13"
},
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "5009:9:13"
}
],
"functionName": {
"name": "sub",
"nodeType": "YulIdentifier",
"src": "4996:3:13"
},
"nodeType": "YulFunctionCall",
"src": "4996:23:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "5021:2:13",
"type": "",
"value": "64"
}
],
"functionName": {
"name": "slt",
"nodeType": "YulIdentifier",
"src": "4992:3:13"
},
"nodeType": "YulFunctionCall",
"src": "4992:32:13"
},
"nodeType": "YulIf",
"src": "4989:52:13"
},
{
"nodeType": "YulVariableDeclaration",
"src": "5050:36:13",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "5076:9:13"
}
],
"functionName": {
"name": "calldataload",
"nodeType": "YulIdentifier",
"src": "5063:12:13"
},
"nodeType": "YulFunctionCall",
"src": "5063:23:13"
},
"variables": [
{
"name": "value",
"nodeType": "YulTypedName",
"src": "5054:5:13",
"type": ""
}
]
},
{
"expression": {
"arguments": [
{
"name": "value",
"nodeType": "YulIdentifier",
"src": "5120:5:13"
}
],
"functionName": {
"name": "validator_revert_address",
"nodeType": "YulIdentifier",
"src": "5095:24:13"
},
"nodeType": "YulFunctionCall",
"src": "5095:31:13"
},
"nodeType": "YulExpressionStatement",
"src": "5095:31:13"
},
{
"nodeType": "YulAssignment",
"src": "5135:15:13",
"value": {
"name": "value",
"nodeType": "YulIdentifier",
"src": "5145:5:13"
},
"variableNames": [
{
"name": "value0",
"nodeType": "YulIdentifier",
"src": "5135:6:13"
}
]
},
{
"nodeType": "YulVariableDeclaration",
"src": "5159:47:13",
"value": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "5191:9:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "5202:2:13",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "5187:3:13"
},
"nodeType": "YulFunctionCall",
"src": "5187:18:13"
}
],
"functionName": {
"name": "calldataload",
"nodeType": "YulIdentifier",
"src": "5174:12:13"
},
"nodeType": "YulFunctionCall",
"src": "5174:32:13"
},
"variables": [
{
"name": "value_1",
"nodeType": "YulTypedName",
"src": "5163:7:13",
"type": ""
}
]
},
{
"expression": {
"arguments": [
{
"name": "value_1",
"nodeType": "YulIdentifier",
"src": "5237:7:13"
}
],
"functionName": {
"name": "validator_revert_bool",
"nodeType": "YulIdentifier",
"src": "5215:21:13"
},
"nodeType": "YulFunctionCall",
"src": "5215:30:13"
},
"nodeType": "YulExpressionStatement",
"src": "5215:30:13"
},
{
"nodeType": "YulAssignment",
"src": "5254:17:13",
"value": {
"name": "value_1",
"nodeType": "YulIdentifier",
"src": "5264:7:13"
},
"variableNames": [
{
"name": "value1",
"nodeType": "YulIdentifier",
"src": "5254:6:13"
}
]
}
]
},
"name": "abi_decode_tuple_t_addresst_bool",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "headStart",
"nodeType": "YulTypedName",
"src": "4937:9:13",
"type": ""
},
{
"name": "dataEnd",
"nodeType": "YulTypedName",
"src": "4948:7:13",
"type": ""
}
],
"returnVariables": [
{
"name": "value0",
"nodeType": "YulTypedName",
"src": "4960:6:13",
"type": ""
},
{
"name": "value1",
"nodeType": "YulTypedName",
"src": "4968:6:13",
"type": ""
}
],
"src": "4895:382:13"
},
{
"body": {
"nodeType": "YulBlock",
"src": "5370:73:13",
"statements": [
{
"expression": {
"arguments": [
{
"name": "pos",
"nodeType": "YulIdentifier",
"src": "5387:3:13"
},
{
"name": "length",
"nodeType": "YulIdentifier",
"src": "5392:6:13"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "5380:6:13"
},
"nodeType": "YulFunctionCall",
"src": "5380:19:13"
},
"nodeType": "YulExpressionStatement",
"src": "5380:19:13"
},
{
"nodeType": "YulAssignment",
"src": "5408:29:13",
"value": {
"arguments": [
{
"name": "pos",
"nodeType": "YulIdentifier",
"src": "5427:3:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "5432:4:13",
"type": "",
"value": "0x20"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "5423:3:13"
},
"nodeType": "YulFunctionCall",
"src": "5423:14:13"
},
"variableNames": [
{
"name": "updated_pos",
"nodeType": "YulIdentifier",
"src": "5408:11:13"
}
]
}
]
},
"name": "array_storeLengthForEncoding_array_uint256_dyn",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "pos",
"nodeType": "YulTypedName",
"src": "5338:3:13",
"type": ""
},
{
"name": "length",
"nodeType": "YulTypedName",
"src": "5343:6:13",
"type": ""
}
],
"returnVariables": [
{
"name": "updated_pos",
"nodeType": "YulTypedName",
"src": "5354:11:13",
"type": ""
}
],
"src": "5282:161:13"
},
{
"body": {
"nodeType": "YulBlock",
"src": "5599:481:13",
"statements": [
{
"nodeType": "YulVariableDeclaration",
"src": "5609:12:13",
"value": {
"kind": "number",
"nodeType": "YulLiteral",
"src": "5619:2:13",
"type": "",
"value": "32"
},
"variables": [
{
"name": "_1",
"nodeType": "YulTypedName",
"src": "5613:2:13",
"type": ""
}
]
},
{
"nodeType": "YulVariableDeclaration",
"src": "5630:32:13",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "5648:9:13"
},
{
"name": "_1",
"nodeType": "YulIdentifier",
"src": "5659:2:13"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "5644:3:13"
},
"nodeType": "YulFunctionCall",
"src": "5644:18:13"
},
"variables": [
{
"name": "tail_1",
"nodeType": "YulTypedName",
"src": "5634:6:13",
"type": ""
}
]
},
{
"expression": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "5678:9:13"
},
{
"name": "_1",
"nodeType": "YulIdentifier",
"src": "5689:2:13"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "5671:6:13"
},
"nodeType": "YulFunctionCall",
"src": "5671:21:13"
},
"nodeType": "YulExpressionStatement",
"src": "5671:21:13"
},
{
"nodeType": "YulVariableDeclaration",
"src": "5701:17:13",
"value": {
"name": "tail_1",
"nodeType": "YulIdentifier",
"src": "5712:6:13"
},
"variables": [
{
"name": "pos",
"nodeType": "YulTypedName",
"src": "5705:3:13",
"type": ""
}
]
},
{
"nodeType": "YulVariableDeclaration",
"src": "5727:27:13",
"value": {
"arguments": [
{
"name": "value0",
"nodeType": "YulIdentifier",
"src": "5747:6:13"
}
],
"functionName": {
"name": "mload",
"nodeType": "YulIdentifier",
"src": "5741:5:13"
},
"nodeType": "YulFunctionCall",
"src": "5741:13:13"
},
"variables": [
{
"name": "length",
"nodeType": "YulTypedName",
"src": "5731:6:13",
"type": ""
}
]
},
{
"expression": {
"arguments": [
{
"name": "tail_1",
"nodeType": "YulIdentifier",
"src": "5770:6:13"
},
{
"name": "length",
"nodeType": "YulIdentifier",
"src": "5778:6:13"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "5763:6:13"
},
"nodeType": "YulFunctionCall",
"src": "5763:22:13"
},
"nodeType": "YulExpressionStatement",
"src": "5763:22:13"
},
{
"nodeType": "YulAssignment",
"src": "5794:25:13",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "5805:9:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "5816:2:13",
"type": "",
"value": "64"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "5801:3:13"
},
"nodeType": "YulFunctionCall",
"src": "5801:18:13"
},
"variableNames": [
{
"name": "pos",
"nodeType": "YulIdentifier",
"src": "5794:3:13"
}
]
},
{
"nodeType": "YulVariableDeclaration",
"src": "5828:29:13",
"value": {
"arguments": [
{
"name": "value0",
"nodeType": "YulIdentifier",
"src": "5846:6:13"
},
{
"name": "_1",
"nodeType": "YulIdentifier",
"src": "5854:2:13"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "5842:3:13"
},
"nodeType": "YulFunctionCall",
"src": "5842:15:13"
},
"variables": [
{
"name": "srcPtr",
"nodeType": "YulTypedName",
"src": "5832:6:13",
"type": ""
}
]
},
{
"nodeType": "YulVariableDeclaration",
"src": "5866:10:13",
"value": {
"kind": "number",
"nodeType": "YulLiteral",
"src": "5875:1:13",
"type": "",
"value": "0"
},
"variables": [
{
"name": "i",
"nodeType": "YulTypedName",
"src": "5870:1:13",
"type": ""
}
]
},
{
"body": {
"nodeType": "YulBlock",
"src": "5934:120:13",
"statements": [
{
"expression": {
"arguments": [
{
"name": "pos",
"nodeType": "YulIdentifier",
"src": "5955:3:13"
},
{
"arguments": [
{
"name": "srcPtr",
"nodeType": "YulIdentifier",
"src": "5966:6:13"
}
],
"functionName": {
"name": "mload",
"nodeType": "YulIdentifier",
"src": "5960:5:13"
},
"nodeType": "YulFunctionCall",
"src": "5960:13:13"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "5948:6:13"
},
"nodeType": "YulFunctionCall",
"src": "5948:26:13"
},
"nodeType": "YulExpressionStatement",
"src": "5948:26:13"
},
{
"nodeType": "YulAssignment",
"src": "5987:19:13",
"value": {
"arguments": [
{
"name": "pos",
"nodeType": "YulIdentifier",
"src": "5998:3:13"
},
{
"name": "_1",
"nodeType": "YulIdentifier",
"src": "6003:2:13"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "5994:3:13"
},
"nodeType": "YulFunctionCall",
"src": "5994:12:13"
},
"variableNames": [
{
"name": "pos",
"nodeType": "YulIdentifier",
"src": "5987:3:13"
}
]
},
{
"nodeType": "YulAssignment",
"src": "6019:25:13",
"value": {
"arguments": [
{
"name": "srcPtr",
"nodeType": "YulIdentifier",
"src": "6033:6:13"
},
{
"name": "_1",
"nodeType": "YulIdentifier",
"src": "6041:2:13"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "6029:3:13"
},
"nodeType": "YulFunctionCall",
"src": "6029:15:13"
},
"variableNames": [
{
"name": "srcPtr",
"nodeType": "YulIdentifier",
"src": "6019:6:13"
}
]
}
]
},
"condition": {
"arguments": [
{
"name": "i",
"nodeType": "YulIdentifier",
"src": "5896:1:13"
},
{
"name": "length",
"nodeType": "YulIdentifier",
"src": "5899:6:13"
}
],
"functionName": {
"name": "lt",
"nodeType": "YulIdentifier",
"src": "5893:2:13"
},
"nodeType": "YulFunctionCall",
"src": "5893:13:13"
},
"nodeType": "YulForLoop",
"post": {
"nodeType": "YulBlock",
"src": "5907:18:13",
"statements": [
{
"nodeType": "YulAssignment",
"src": "5909:14:13",
"value": {
"arguments": [
{
"name": "i",
"nodeType": "YulIdentifier",
"src": "5918:1:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "5921:1:13",
"type": "",
"value": "1"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "5914:3:13"
},
"nodeType": "YulFunctionCall",
"src": "5914:9:13"
},
"variableNames": [
{
"name": "i",
"nodeType": "YulIdentifier",
"src": "5909:1:13"
}
]
}
]
},
"pre": {
"nodeType": "YulBlock",
"src": "5889:3:13",
"statements": []
},
"src": "5885:169:13"
},
{
"nodeType": "YulAssignment",
"src": "6063:11:13",
"value": {
"name": "pos",
"nodeType": "YulIdentifier",
"src": "6071:3:13"
},
"variableNames": [
{
"name": "tail",
"nodeType": "YulIdentifier",
"src": "6063:4:13"
}
]
}
]
},
"name": "abi_encode_tuple_t_array$_t_uint256_$dyn_memory_ptr__to_t_array$_t_uint256_$dyn_memory_ptr__fromStack_reversed",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "headStart",
"nodeType": "YulTypedName",
"src": "5568:9:13",
"type": ""
},
{
"name": "value0",
"nodeType": "YulTypedName",
"src": "5579:6:13",
"type": ""
}
],
"returnVariables": [
{
"name": "tail",
"nodeType": "YulTypedName",
"src": "5590:4:13",
"type": ""
}
],
"src": "5448:632:13"
},
{
"body": {
"nodeType": "YulBlock",
"src": "6172:161:13",
"statements": [
{
"body": {
"nodeType": "YulBlock",
"src": "6218:16:13",
"statements": [
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "6227:1:13",
"type": "",
"value": "0"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "6230:1:13",
"type": "",
"value": "0"
}
],
"functionName": {
"name": "revert",
"nodeType": "YulIdentifier",
"src": "6220:6:13"
},
"nodeType": "YulFunctionCall",
"src": "6220:12:13"
},
"nodeType": "YulExpressionStatement",
"src": "6220:12:13"
}
]
},
"condition": {
"arguments": [
{
"arguments": [
{
"name": "dataEnd",
"nodeType": "YulIdentifier",
"src": "6193:7:13"
},
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "6202:9:13"
}
],
"functionName": {
"name": "sub",
"nodeType": "YulIdentifier",
"src": "6189:3:13"
},
"nodeType": "YulFunctionCall",
"src": "6189:23:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "6214:2:13",
"type": "",
"value": "64"
}
],
"functionName": {
"name": "slt",
"nodeType": "YulIdentifier",
"src": "6185:3:13"
},
"nodeType": "YulFunctionCall",
"src": "6185:32:13"
},
"nodeType": "YulIf",
"src": "6182:52:13"
},
{
"nodeType": "YulAssignment",
"src": "6243:33:13",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "6266:9:13"
}
],
"functionName": {
"name": "calldataload",
"nodeType": "YulIdentifier",
"src": "6253:12:13"
},
"nodeType": "YulFunctionCall",
"src": "6253:23:13"
},
"variableNames": [
{
"name": "value0",
"nodeType": "YulIdentifier",
"src": "6243:6:13"
}
]
},
{
"nodeType": "YulAssignment",
"src": "6285:42:13",
"value": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "6312:9:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "6323:2:13",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "6308:3:13"
},
"nodeType": "YulFunctionCall",
"src": "6308:18:13"
}
],
"functionName": {
"name": "calldataload",
"nodeType": "YulIdentifier",
"src": "6295:12:13"
},
"nodeType": "YulFunctionCall",
"src": "6295:32:13"
},
"variableNames": [
{
"name": "value1",
"nodeType": "YulIdentifier",
"src": "6285:6:13"
}
]
}
]
},
"name": "abi_decode_tuple_t_uint256t_uint256",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "headStart",
"nodeType": "YulTypedName",
"src": "6130:9:13",
"type": ""
},
{
"name": "dataEnd",
"nodeType": "YulTypedName",
"src": "6141:7:13",
"type": ""
}
],
"returnVariables": [
{
"name": "value0",
"nodeType": "YulTypedName",
"src": "6153:6:13",
"type": ""
},
{
"name": "value1",
"nodeType": "YulTypedName",
"src": "6161:6:13",
"type": ""
}
],
"src": "6085:248:13"
},
{
"body": {
"nodeType": "YulBlock",
"src": "6433:177:13",
"statements": [
{
"body": {
"nodeType": "YulBlock",
"src": "6479:16:13",
"statements": [
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "6488:1:13",
"type": "",
"value": "0"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "6491:1:13",
"type": "",
"value": "0"
}
],
"functionName": {
"name": "revert",
"nodeType": "YulIdentifier",
"src": "6481:6:13"
},
"nodeType": "YulFunctionCall",
"src": "6481:12:13"
},
"nodeType": "YulExpressionStatement",
"src": "6481:12:13"
}
]
},
"condition": {
"arguments": [
{
"arguments": [
{
"name": "dataEnd",
"nodeType": "YulIdentifier",
"src": "6454:7:13"
},
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "6463:9:13"
}
],
"functionName": {
"name": "sub",
"nodeType": "YulIdentifier",
"src": "6450:3:13"
},
"nodeType": "YulFunctionCall",
"src": "6450:23:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "6475:2:13",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "slt",
"nodeType": "YulIdentifier",
"src": "6446:3:13"
},
"nodeType": "YulFunctionCall",
"src": "6446:32:13"
},
"nodeType": "YulIf",
"src": "6443:52:13"
},
{
"nodeType": "YulVariableDeclaration",
"src": "6504:36:13",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "6530:9:13"
}
],
"functionName": {
"name": "calldataload",
"nodeType": "YulIdentifier",
"src": "6517:12:13"
},
"nodeType": "YulFunctionCall",
"src": "6517:23:13"
},
"variables": [
{
"name": "value",
"nodeType": "YulTypedName",
"src": "6508:5:13",
"type": ""
}
]
},
{
"expression": {
"arguments": [
{
"name": "value",
"nodeType": "YulIdentifier",
"src": "6574:5:13"
}
],
"functionName": {
"name": "validator_revert_address",
"nodeType": "YulIdentifier",
"src": "6549:24:13"
},
"nodeType": "YulFunctionCall",
"src": "6549:31:13"
},
"nodeType": "YulExpressionStatement",
"src": "6549:31:13"
},
{
"nodeType": "YulAssignment",
"src": "6589:15:13",
"value": {
"name": "value",
"nodeType": "YulIdentifier",
"src": "6599:5:13"
},
"variableNames": [
{
"name": "value0",
"nodeType": "YulIdentifier",
"src": "6589:6:13"
}
]
}
]
},
"name": "abi_decode_tuple_t_contract$_IAxodusAuthority_$1363",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "headStart",
"nodeType": "YulTypedName",
"src": "6399:9:13",
"type": ""
},
{
"name": "dataEnd",
"nodeType": "YulTypedName",
"src": "6410:7:13",
"type": ""
}
],
"returnVariables": [
{
"name": "value0",
"nodeType": "YulTypedName",
"src": "6422:6:13",
"type": ""
}
],
"src": "6338:272:13"
},
{
"body": {
"nodeType": "YulBlock",
"src": "6753:456:13",
"statements": [
{
"body": {
"nodeType": "YulBlock",
"src": "6800:16:13",
"statements": [
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "6809:1:13",
"type": "",
"value": "0"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "6812:1:13",
"type": "",
"value": "0"
}
],
"functionName": {
"name": "revert",
"nodeType": "YulIdentifier",
"src": "6802:6:13"
},
"nodeType": "YulFunctionCall",
"src": "6802:12:13"
},
"nodeType": "YulExpressionStatement",
"src": "6802:12:13"
}
]
},
"condition": {
"arguments": [
{
"arguments": [
{
"name": "dataEnd",
"nodeType": "YulIdentifier",
"src": "6774:7:13"
},
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "6783:9:13"
}
],
"functionName": {
"name": "sub",
"nodeType": "YulIdentifier",
"src": "6770:3:13"
},
"nodeType": "YulFunctionCall",
"src": "6770:23:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "6795:3:13",
"type": "",
"value": "160"
}
],
"functionName": {
"name": "slt",
"nodeType": "YulIdentifier",
"src": "6766:3:13"
},
"nodeType": "YulFunctionCall",
"src": "6766:33:13"
},
"nodeType": "YulIf",
"src": "6763:53:13"
},
{
"nodeType": "YulAssignment",
"src": "6825:33:13",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "6848:9:13"
}
],
"functionName": {
"name": "calldataload",
"nodeType": "YulIdentifier",
"src": "6835:12:13"
},
"nodeType": "YulFunctionCall",
"src": "6835:23:13"
},
"variableNames": [
{
"name": "value0",
"nodeType": "YulIdentifier",
"src": "6825:6:13"
}
]
},
{
"nodeType": "YulAssignment",
"src": "6867:42:13",
"value": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "6894:9:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "6905:2:13",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "6890:3:13"
},
"nodeType": "YulFunctionCall",
"src": "6890:18:13"
}
],
"functionName": {
"name": "calldataload",
"nodeType": "YulIdentifier",
"src": "6877:12:13"
},
"nodeType": "YulFunctionCall",
"src": "6877:32:13"
},
"variableNames": [
{
"name": "value1",
"nodeType": "YulIdentifier",
"src": "6867:6:13"
}
]
},
{
"nodeType": "YulAssignment",
"src": "6918:42:13",
"value": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "6945:9:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "6956:2:13",
"type": "",
"value": "64"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "6941:3:13"
},
"nodeType": "YulFunctionCall",
"src": "6941:18:13"
}
],
"functionName": {
"name": "calldataload",
"nodeType": "YulIdentifier",
"src": "6928:12:13"
},
"nodeType": "YulFunctionCall",
"src": "6928:32:13"
},
"variableNames": [
{
"name": "value2",
"nodeType": "YulIdentifier",
"src": "6918:6:13"
}
]
},
{
"nodeType": "YulVariableDeclaration",
"src": "6969:45:13",
"value": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "6999:9:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "7010:2:13",
"type": "",
"value": "96"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "6995:3:13"
},
"nodeType": "YulFunctionCall",
"src": "6995:18:13"
}
],
"functionName": {
"name": "calldataload",
"nodeType": "YulIdentifier",
"src": "6982:12:13"
},
"nodeType": "YulFunctionCall",
"src": "6982:32:13"
},
"variables": [
{
"name": "value",
"nodeType": "YulTypedName",
"src": "6973:5:13",
"type": ""
}
]
},
{
"expression": {
"arguments": [
{
"name": "value",
"nodeType": "YulIdentifier",
"src": "7048:5:13"
}
],
"functionName": {
"name": "validator_revert_address",
"nodeType": "YulIdentifier",
"src": "7023:24:13"
},
"nodeType": "YulFunctionCall",
"src": "7023:31:13"
},
"nodeType": "YulExpressionStatement",
"src": "7023:31:13"
},
{
"nodeType": "YulAssignment",
"src": "7063:15:13",
"value": {
"name": "value",
"nodeType": "YulIdentifier",
"src": "7073:5:13"
},
"variableNames": [
{
"name": "value3",
"nodeType": "YulIdentifier",
"src": "7063:6:13"
}
]
},
{
"nodeType": "YulVariableDeclaration",
"src": "7087:48:13",
"value": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "7119:9:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "7130:3:13",
"type": "",
"value": "128"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "7115:3:13"
},
"nodeType": "YulFunctionCall",
"src": "7115:19:13"
}
],
"functionName": {
"name": "calldataload",
"nodeType": "YulIdentifier",
"src": "7102:12:13"
},
"nodeType": "YulFunctionCall",
"src": "7102:33:13"
},
"variables": [
{
"name": "value_1",
"nodeType": "YulTypedName",
"src": "7091:7:13",
"type": ""
}
]
},
{
"expression": {
"arguments": [
{
"name": "value_1",
"nodeType": "YulIdentifier",
"src": "7169:7:13"
}
],
"functionName": {
"name": "validator_revert_address",
"nodeType": "YulIdentifier",
"src": "7144:24:13"
},
"nodeType": "YulFunctionCall",
"src": "7144:33:13"
},
"nodeType": "YulExpressionStatement",
"src": "7144:33:13"
},
{
"nodeType": "YulAssignment",
"src": "7186:17:13",
"value": {
"name": "value_1",
"nodeType": "YulIdentifier",
"src": "7196:7:13"
},
"variableNames": [
{
"name": "value4",
"nodeType": "YulIdentifier",
"src": "7186:6:13"
}
]
}
]
},
"name": "abi_decode_tuple_t_uint256t_uint256t_uint256t_addresst_address",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "headStart",
"nodeType": "YulTypedName",
"src": "6687:9:13",
"type": ""
},
{
"name": "dataEnd",
"nodeType": "YulTypedName",
"src": "6698:7:13",
"type": ""
}
],
"returnVariables": [
{
"name": "value0",
"nodeType": "YulTypedName",
"src": "6710:6:13",
"type": ""
},
{
"name": "value1",
"nodeType": "YulTypedName",
"src": "6718:6:13",
"type": ""
},
{
"name": "value2",
"nodeType": "YulTypedName",
"src": "6726:6:13",
"type": ""
},
{
"name": "value3",
"nodeType": "YulTypedName",
"src": "6734:6:13",
"type": ""
},
{
"name": "value4",
"nodeType": "YulTypedName",
"src": "6742:6:13",
"type": ""
}
],
"src": "6615:594:13"
},
{
"body": {
"nodeType": "YulBlock",
"src": "7371:162:13",
"statements": [
{
"nodeType": "YulAssignment",
"src": "7381:26:13",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "7393:9:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "7404:2:13",
"type": "",
"value": "96"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "7389:3:13"
},
"nodeType": "YulFunctionCall",
"src": "7389:18:13"
},
"variableNames": [
{
"name": "tail",
"nodeType": "YulIdentifier",
"src": "7381:4:13"
}
]
},
{
"expression": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "7423:9:13"
},
{
"name": "value0",
"nodeType": "YulIdentifier",
"src": "7434:6:13"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "7416:6:13"
},
"nodeType": "YulFunctionCall",
"src": "7416:25:13"
},
"nodeType": "YulExpressionStatement",
"src": "7416:25:13"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "7461:9:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "7472:2:13",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "7457:3:13"
},
"nodeType": "YulFunctionCall",
"src": "7457:18:13"
},
{
"name": "value1",
"nodeType": "YulIdentifier",
"src": "7477:6:13"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "7450:6:13"
},
"nodeType": "YulFunctionCall",
"src": "7450:34:13"
},
"nodeType": "YulExpressionStatement",
"src": "7450:34:13"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "7504:9:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "7515:2:13",
"type": "",
"value": "64"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "7500:3:13"
},
"nodeType": "YulFunctionCall",
"src": "7500:18:13"
},
{
"name": "value2",
"nodeType": "YulIdentifier",
"src": "7520:6:13"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "7493:6:13"
},
"nodeType": "YulFunctionCall",
"src": "7493:34:13"
},
"nodeType": "YulExpressionStatement",
"src": "7493:34:13"
}
]
},
"name": "abi_encode_tuple_t_uint256_t_uint256_t_uint256__to_t_uint256_t_uint256_t_uint256__fromStack_reversed",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "headStart",
"nodeType": "YulTypedName",
"src": "7324:9:13",
"type": ""
},
{
"name": "value2",
"nodeType": "YulTypedName",
"src": "7335:6:13",
"type": ""
},
{
"name": "value1",
"nodeType": "YulTypedName",
"src": "7343:6:13",
"type": ""
},
{
"name": "value0",
"nodeType": "YulTypedName",
"src": "7351:6:13",
"type": ""
}
],
"returnVariables": [
{
"name": "tail",
"nodeType": "YulTypedName",
"src": "7362:4:13",
"type": ""
}
],
"src": "7214:319:13"
},
{
"body": {
"nodeType": "YulBlock",
"src": "7625:228:13",
"statements": [
{
"body": {
"nodeType": "YulBlock",
"src": "7671:16:13",
"statements": [
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "7680:1:13",
"type": "",
"value": "0"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "7683:1:13",
"type": "",
"value": "0"
}
],
"functionName": {
"name": "revert",
"nodeType": "YulIdentifier",
"src": "7673:6:13"
},
"nodeType": "YulFunctionCall",
"src": "7673:12:13"
},
"nodeType": "YulExpressionStatement",
"src": "7673:12:13"
}
]
},
"condition": {
"arguments": [
{
"arguments": [
{
"name": "dataEnd",
"nodeType": "YulIdentifier",
"src": "7646:7:13"
},
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "7655:9:13"
}
],
"functionName": {
"name": "sub",
"nodeType": "YulIdentifier",
"src": "7642:3:13"
},
"nodeType": "YulFunctionCall",
"src": "7642:23:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "7667:2:13",
"type": "",
"value": "64"
}
],
"functionName": {
"name": "slt",
"nodeType": "YulIdentifier",
"src": "7638:3:13"
},
"nodeType": "YulFunctionCall",
"src": "7638:32:13"
},
"nodeType": "YulIf",
"src": "7635:52:13"
},
{
"nodeType": "YulVariableDeclaration",
"src": "7696:36:13",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "7722:9:13"
}
],
"functionName": {
"name": "calldataload",
"nodeType": "YulIdentifier",
"src": "7709:12:13"
},
"nodeType": "YulFunctionCall",
"src": "7709:23:13"
},
"variables": [
{
"name": "value",
"nodeType": "YulTypedName",
"src": "7700:5:13",
"type": ""
}
]
},
{
"expression": {
"arguments": [
{
"name": "value",
"nodeType": "YulIdentifier",
"src": "7766:5:13"
}
],
"functionName": {
"name": "validator_revert_address",
"nodeType": "YulIdentifier",
"src": "7741:24:13"
},
"nodeType": "YulFunctionCall",
"src": "7741:31:13"
},
"nodeType": "YulExpressionStatement",
"src": "7741:31:13"
},
{
"nodeType": "YulAssignment",
"src": "7781:15:13",
"value": {
"name": "value",
"nodeType": "YulIdentifier",
"src": "7791:5:13"
},
"variableNames": [
{
"name": "value0",
"nodeType": "YulIdentifier",
"src": "7781:6:13"
}
]
},
{
"nodeType": "YulAssignment",
"src": "7805:42:13",
"value": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "7832:9:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "7843:2:13",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "7828:3:13"
},
"nodeType": "YulFunctionCall",
"src": "7828:18:13"
}
],
"functionName": {
"name": "calldataload",
"nodeType": "YulIdentifier",
"src": "7815:12:13"
},
"nodeType": "YulFunctionCall",
"src": "7815:32:13"
},
"variableNames": [
{
"name": "value1",
"nodeType": "YulIdentifier",
"src": "7805:6:13"
}
]
}
]
},
"name": "abi_decode_tuple_t_addresst_uint256",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "headStart",
"nodeType": "YulTypedName",
"src": "7583:9:13",
"type": ""
},
{
"name": "dataEnd",
"nodeType": "YulTypedName",
"src": "7594:7:13",
"type": ""
}
],
"returnVariables": [
{
"name": "value0",
"nodeType": "YulTypedName",
"src": "7606:6:13",
"type": ""
},
{
"name": "value1",
"nodeType": "YulTypedName",
"src": "7614:6:13",
"type": ""
}
],
"src": "7538:315:13"
},
{
"body": {
"nodeType": "YulBlock",
"src": "7957:101:13",
"statements": [
{
"nodeType": "YulAssignment",
"src": "7967:26:13",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "7979:9:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "7990:2:13",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "7975:3:13"
},
"nodeType": "YulFunctionCall",
"src": "7975:18:13"
},
"variableNames": [
{
"name": "tail",
"nodeType": "YulIdentifier",
"src": "7967:4:13"
}
]
},
{
"expression": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "8009:9:13"
},
{
"arguments": [
{
"name": "value0",
"nodeType": "YulIdentifier",
"src": "8024:6:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "8032:18:13",
"type": "",
"value": "0xffffffffffffffff"
}
],
"functionName": {
"name": "and",
"nodeType": "YulIdentifier",
"src": "8020:3:13"
},
"nodeType": "YulFunctionCall",
"src": "8020:31:13"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "8002:6:13"
},
"nodeType": "YulFunctionCall",
"src": "8002:50:13"
},
"nodeType": "YulExpressionStatement",
"src": "8002:50:13"
}
]
},
"name": "abi_encode_tuple_t_uint64__to_t_uint64__fromStack_reversed",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "headStart",
"nodeType": "YulTypedName",
"src": "7926:9:13",
"type": ""
},
{
"name": "value0",
"nodeType": "YulTypedName",
"src": "7937:6:13",
"type": ""
}
],
"returnVariables": [
{
"name": "tail",
"nodeType": "YulTypedName",
"src": "7948:4:13",
"type": ""
}
],
"src": "7858:200:13"
},
{
"body": {
"nodeType": "YulBlock",
"src": "8335:444:13",
"statements": [
{
"nodeType": "YulAssignment",
"src": "8345:27:13",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "8357:9:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "8368:3:13",
"type": "",
"value": "224"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "8353:3:13"
},
"nodeType": "YulFunctionCall",
"src": "8353:19:13"
},
"variableNames": [
{
"name": "tail",
"nodeType": "YulIdentifier",
"src": "8345:4:13"
}
]
},
{
"expression": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "8388:9:13"
},
{
"name": "value0",
"nodeType": "YulIdentifier",
"src": "8399:6:13"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "8381:6:13"
},
"nodeType": "YulFunctionCall",
"src": "8381:25:13"
},
"nodeType": "YulExpressionStatement",
"src": "8381:25:13"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "8426:9:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "8437:2:13",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "8422:3:13"
},
"nodeType": "YulFunctionCall",
"src": "8422:18:13"
},
{
"arguments": [
{
"name": "value1",
"nodeType": "YulIdentifier",
"src": "8446:6:13"
},
{
"arguments": [
{
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "8462:3:13",
"type": "",
"value": "160"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "8467:1:13",
"type": "",
"value": "1"
}
],
"functionName": {
"name": "shl",
"nodeType": "YulIdentifier",
"src": "8458:3:13"
},
"nodeType": "YulFunctionCall",
"src": "8458:11:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "8471:1:13",
"type": "",
"value": "1"
}
],
"functionName": {
"name": "sub",
"nodeType": "YulIdentifier",
"src": "8454:3:13"
},
"nodeType": "YulFunctionCall",
"src": "8454:19:13"
}
],
"functionName": {
"name": "and",
"nodeType": "YulIdentifier",
"src": "8442:3:13"
},
"nodeType": "YulFunctionCall",
"src": "8442:32:13"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "8415:6:13"
},
"nodeType": "YulFunctionCall",
"src": "8415:60:13"
},
"nodeType": "YulExpressionStatement",
"src": "8415:60:13"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "8495:9:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "8506:2:13",
"type": "",
"value": "64"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "8491:3:13"
},
"nodeType": "YulFunctionCall",
"src": "8491:18:13"
},
{
"arguments": [
{
"arguments": [
{
"name": "value2",
"nodeType": "YulIdentifier",
"src": "8525:6:13"
}
],
"functionName": {
"name": "iszero",
"nodeType": "YulIdentifier",
"src": "8518:6:13"
},
"nodeType": "YulFunctionCall",
"src": "8518:14:13"
}
],
"functionName": {
"name": "iszero",
"nodeType": "YulIdentifier",
"src": "8511:6:13"
},
"nodeType": "YulFunctionCall",
"src": "8511:22:13"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "8484:6:13"
},
"nodeType": "YulFunctionCall",
"src": "8484:50:13"
},
"nodeType": "YulExpressionStatement",
"src": "8484:50:13"
},
{
"nodeType": "YulVariableDeclaration",
"src": "8543:28:13",
"value": {
"kind": "number",
"nodeType": "YulLiteral",
"src": "8553:18:13",
"type": "",
"value": "0xffffffffffffffff"
},
"variables": [
{
"name": "_1",
"nodeType": "YulTypedName",
"src": "8547:2:13",
"type": ""
}
]
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "8591:9:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "8602:2:13",
"type": "",
"value": "96"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "8587:3:13"
},
"nodeType": "YulFunctionCall",
"src": "8587:18:13"
},
{
"arguments": [
{
"name": "value3",
"nodeType": "YulIdentifier",
"src": "8611:6:13"
},
{
"name": "_1",
"nodeType": "YulIdentifier",
"src": "8619:2:13"
}
],
"functionName": {
"name": "and",
"nodeType": "YulIdentifier",
"src": "8607:3:13"
},
"nodeType": "YulFunctionCall",
"src": "8607:15:13"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "8580:6:13"
},
"nodeType": "YulFunctionCall",
"src": "8580:43:13"
},
"nodeType": "YulExpressionStatement",
"src": "8580:43:13"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "8643:9:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "8654:3:13",
"type": "",
"value": "128"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "8639:3:13"
},
"nodeType": "YulFunctionCall",
"src": "8639:19:13"
},
{
"arguments": [
{
"name": "value4",
"nodeType": "YulIdentifier",
"src": "8664:6:13"
},
{
"name": "_1",
"nodeType": "YulIdentifier",
"src": "8672:2:13"
}
],
"functionName": {
"name": "and",
"nodeType": "YulIdentifier",
"src": "8660:3:13"
},
"nodeType": "YulFunctionCall",
"src": "8660:15:13"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "8632:6:13"
},
"nodeType": "YulFunctionCall",
"src": "8632:44:13"
},
"nodeType": "YulExpressionStatement",
"src": "8632:44:13"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "8696:9:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "8707:3:13",
"type": "",
"value": "160"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "8692:3:13"
},
"nodeType": "YulFunctionCall",
"src": "8692:19:13"
},
{
"arguments": [
{
"name": "value5",
"nodeType": "YulIdentifier",
"src": "8717:6:13"
},
{
"name": "_1",
"nodeType": "YulIdentifier",
"src": "8725:2:13"
}
],
"functionName": {
"name": "and",
"nodeType": "YulIdentifier",
"src": "8713:3:13"
},
"nodeType": "YulFunctionCall",
"src": "8713:15:13"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "8685:6:13"
},
"nodeType": "YulFunctionCall",
"src": "8685:44:13"
},
"nodeType": "YulExpressionStatement",
"src": "8685:44:13"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "8749:9:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "8760:3:13",
"type": "",
"value": "192"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "8745:3:13"
},
"nodeType": "YulFunctionCall",
"src": "8745:19:13"
},
{
"name": "value6",
"nodeType": "YulIdentifier",
"src": "8766:6:13"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "8738:6:13"
},
"nodeType": "YulFunctionCall",
"src": "8738:35:13"
},
"nodeType": "YulExpressionStatement",
"src": "8738:35:13"
}
]
},
"name": "abi_encode_tuple_t_uint256_t_contract$_IERC20_$1592_t_bool_t_uint64_t_uint64_t_uint64_t_uint256__to_t_uint256_t_address_t_bool_t_uint64_t_uint64_t_uint64_t_uint256__fromStack_reversed",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "headStart",
"nodeType": "YulTypedName",
"src": "8256:9:13",
"type": ""
},
{
"name": "value6",
"nodeType": "YulTypedName",
"src": "8267:6:13",
"type": ""
},
{
"name": "value5",
"nodeType": "YulTypedName",
"src": "8275:6:13",
"type": ""
},
{
"name": "value4",
"nodeType": "YulTypedName",
"src": "8283:6:13",
"type": ""
},
{
"name": "value3",
"nodeType": "YulTypedName",
"src": "8291:6:13",
"type": ""
},
{
"name": "value2",
"nodeType": "YulTypedName",
"src": "8299:6:13",
"type": ""
},
{
"name": "value1",
"nodeType": "YulTypedName",
"src": "8307:6:13",
"type": ""
},
{
"name": "value0",
"nodeType": "YulTypedName",
"src": "8315:6:13",
"type": ""
}
],
"returnVariables": [
{
"name": "tail",
"nodeType": "YulTypedName",
"src": "8326:4:13",
"type": ""
}
],
"src": "8063:716:13"
},
{
"body": {
"nodeType": "YulBlock",
"src": "8957:298:13",
"statements": [
{
"nodeType": "YulAssignment",
"src": "8967:27:13",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "8979:9:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "8990:3:13",
"type": "",
"value": "128"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "8975:3:13"
},
"nodeType": "YulFunctionCall",
"src": "8975:19:13"
},
"variableNames": [
{
"name": "tail",
"nodeType": "YulIdentifier",
"src": "8967:4:13"
}
]
},
{
"expression": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "9010:9:13"
},
{
"arguments": [
{
"name": "value0",
"nodeType": "YulIdentifier",
"src": "9025:6:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "9033:18:13",
"type": "",
"value": "0xffffffffffffffff"
}
],
"functionName": {
"name": "and",
"nodeType": "YulIdentifier",
"src": "9021:3:13"
},
"nodeType": "YulFunctionCall",
"src": "9021:31:13"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "9003:6:13"
},
"nodeType": "YulFunctionCall",
"src": "9003:50:13"
},
"nodeType": "YulExpressionStatement",
"src": "9003:50:13"
},
{
"nodeType": "YulVariableDeclaration",
"src": "9062:24:13",
"value": {
"kind": "number",
"nodeType": "YulLiteral",
"src": "9072:14:13",
"type": "",
"value": "0xffffffffffff"
},
"variables": [
{
"name": "_1",
"nodeType": "YulTypedName",
"src": "9066:2:13",
"type": ""
}
]
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "9106:9:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "9117:2:13",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "9102:3:13"
},
"nodeType": "YulFunctionCall",
"src": "9102:18:13"
},
{
"arguments": [
{
"name": "value1",
"nodeType": "YulIdentifier",
"src": "9126:6:13"
},
{
"name": "_1",
"nodeType": "YulIdentifier",
"src": "9134:2:13"
}
],
"functionName": {
"name": "and",
"nodeType": "YulIdentifier",
"src": "9122:3:13"
},
"nodeType": "YulFunctionCall",
"src": "9122:15:13"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "9095:6:13"
},
"nodeType": "YulFunctionCall",
"src": "9095:43:13"
},
"nodeType": "YulExpressionStatement",
"src": "9095:43:13"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "9158:9:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "9169:2:13",
"type": "",
"value": "64"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "9154:3:13"
},
"nodeType": "YulFunctionCall",
"src": "9154:18:13"
},
{
"arguments": [
{
"name": "value2",
"nodeType": "YulIdentifier",
"src": "9178:6:13"
},
{
"name": "_1",
"nodeType": "YulIdentifier",
"src": "9186:2:13"
}
],
"functionName": {
"name": "and",
"nodeType": "YulIdentifier",
"src": "9174:3:13"
},
"nodeType": "YulFunctionCall",
"src": "9174:15:13"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "9147:6:13"
},
"nodeType": "YulFunctionCall",
"src": "9147:43:13"
},
"nodeType": "YulExpressionStatement",
"src": "9147:43:13"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "9210:9:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "9221:2:13",
"type": "",
"value": "96"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "9206:3:13"
},
"nodeType": "YulFunctionCall",
"src": "9206:18:13"
},
{
"arguments": [
{
"arguments": [
{
"name": "value3",
"nodeType": "YulIdentifier",
"src": "9240:6:13"
}
],
"functionName": {
"name": "iszero",
"nodeType": "YulIdentifier",
"src": "9233:6:13"
},
"nodeType": "YulFunctionCall",
"src": "9233:14:13"
}
],
"functionName": {
"name": "iszero",
"nodeType": "YulIdentifier",
"src": "9226:6:13"
},
"nodeType": "YulFunctionCall",
"src": "9226:22:13"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "9199:6:13"
},
"nodeType": "YulFunctionCall",
"src": "9199:50:13"
},
"nodeType": "YulExpressionStatement",
"src": "9199:50:13"
}
]
},
"name": "abi_encode_tuple_t_uint64_t_uint48_t_uint48_t_bool__to_t_uint64_t_uint48_t_uint48_t_bool__fromStack_reversed",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "headStart",
"nodeType": "YulTypedName",
"src": "8902:9:13",
"type": ""
},
{
"name": "value3",
"nodeType": "YulTypedName",
"src": "8913:6:13",
"type": ""
},
{
"name": "value2",
"nodeType": "YulTypedName",
"src": "8921:6:13",
"type": ""
},
{
"name": "value1",
"nodeType": "YulTypedName",
"src": "8929:6:13",
"type": ""
},
{
"name": "value0",
"nodeType": "YulTypedName",
"src": "8937:6:13",
"type": ""
}
],
"returnVariables": [
{
"name": "tail",
"nodeType": "YulTypedName",
"src": "8948:4:13",
"type": ""
}
],
"src": "8784:471:13"
},
{
"body": {
"nodeType": "YulBlock",
"src": "9386:102:13",
"statements": [
{
"nodeType": "YulAssignment",
"src": "9396:26:13",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "9408:9:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "9419:2:13",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "9404:3:13"
},
"nodeType": "YulFunctionCall",
"src": "9404:18:13"
},
"variableNames": [
{
"name": "tail",
"nodeType": "YulIdentifier",
"src": "9396:4:13"
}
]
},
{
"expression": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "9438:9:13"
},
{
"arguments": [
{
"name": "value0",
"nodeType": "YulIdentifier",
"src": "9453:6:13"
},
{
"arguments": [
{
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "9469:3:13",
"type": "",
"value": "160"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "9474:1:13",
"type": "",
"value": "1"
}
],
"functionName": {
"name": "shl",
"nodeType": "YulIdentifier",
"src": "9465:3:13"
},
"nodeType": "YulFunctionCall",
"src": "9465:11:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "9478:1:13",
"type": "",
"value": "1"
}
],
"functionName": {
"name": "sub",
"nodeType": "YulIdentifier",
"src": "9461:3:13"
},
"nodeType": "YulFunctionCall",
"src": "9461:19:13"
}
],
"functionName": {
"name": "and",
"nodeType": "YulIdentifier",
"src": "9449:3:13"
},
"nodeType": "YulFunctionCall",
"src": "9449:32:13"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "9431:6:13"
},
"nodeType": "YulFunctionCall",
"src": "9431:51:13"
},
"nodeType": "YulExpressionStatement",
"src": "9431:51:13"
}
]
},
"name": "abi_encode_tuple_t_contract$_IAxodusAuthority_$1363__to_t_address__fromStack_reversed",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "headStart",
"nodeType": "YulTypedName",
"src": "9355:9:13",
"type": ""
},
{
"name": "value0",
"nodeType": "YulTypedName",
"src": "9366:6:13",
"type": ""
}
],
"returnVariables": [
{
"name": "tail",
"nodeType": "YulTypedName",
"src": "9377:4:13",
"type": ""
}
],
"src": "9260:228:13"
},
{
"body": {
"nodeType": "YulBlock",
"src": "9692:372:13",
"statements": [
{
"nodeType": "YulAssignment",
"src": "9702:27:13",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "9714:9:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "9725:3:13",
"type": "",
"value": "160"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "9710:3:13"
},
"nodeType": "YulFunctionCall",
"src": "9710:19:13"
},
"variableNames": [
{
"name": "tail",
"nodeType": "YulIdentifier",
"src": "9702:4:13"
}
]
},
{
"expression": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "9745:9:13"
},
{
"arguments": [
{
"arguments": [
{
"name": "value0",
"nodeType": "YulIdentifier",
"src": "9770:6:13"
}
],
"functionName": {
"name": "iszero",
"nodeType": "YulIdentifier",
"src": "9763:6:13"
},
"nodeType": "YulFunctionCall",
"src": "9763:14:13"
}
],
"functionName": {
"name": "iszero",
"nodeType": "YulIdentifier",
"src": "9756:6:13"
},
"nodeType": "YulFunctionCall",
"src": "9756:22:13"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "9738:6:13"
},
"nodeType": "YulFunctionCall",
"src": "9738:41:13"
},
"nodeType": "YulExpressionStatement",
"src": "9738:41:13"
},
{
"nodeType": "YulVariableDeclaration",
"src": "9788:28:13",
"value": {
"kind": "number",
"nodeType": "YulLiteral",
"src": "9798:18:13",
"type": "",
"value": "0xffffffffffffffff"
},
"variables": [
{
"name": "_1",
"nodeType": "YulTypedName",
"src": "9792:2:13",
"type": ""
}
]
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "9836:9:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "9847:2:13",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "9832:3:13"
},
"nodeType": "YulFunctionCall",
"src": "9832:18:13"
},
{
"arguments": [
{
"name": "value1",
"nodeType": "YulIdentifier",
"src": "9856:6:13"
},
{
"name": "_1",
"nodeType": "YulIdentifier",
"src": "9864:2:13"
}
],
"functionName": {
"name": "and",
"nodeType": "YulIdentifier",
"src": "9852:3:13"
},
"nodeType": "YulFunctionCall",
"src": "9852:15:13"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "9825:6:13"
},
"nodeType": "YulFunctionCall",
"src": "9825:43:13"
},
"nodeType": "YulExpressionStatement",
"src": "9825:43:13"
},
{
"nodeType": "YulVariableDeclaration",
"src": "9877:24:13",
"value": {
"kind": "number",
"nodeType": "YulLiteral",
"src": "9887:14:13",
"type": "",
"value": "0xffffffffffff"
},
"variables": [
{
"name": "_2",
"nodeType": "YulTypedName",
"src": "9881:2:13",
"type": ""
}
]
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "9921:9:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "9932:2:13",
"type": "",
"value": "64"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "9917:3:13"
},
"nodeType": "YulFunctionCall",
"src": "9917:18:13"
},
{
"arguments": [
{
"name": "value2",
"nodeType": "YulIdentifier",
"src": "9941:6:13"
},
{
"name": "_2",
"nodeType": "YulIdentifier",
"src": "9949:2:13"
}
],
"functionName": {
"name": "and",
"nodeType": "YulIdentifier",
"src": "9937:3:13"
},
"nodeType": "YulFunctionCall",
"src": "9937:15:13"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "9910:6:13"
},
"nodeType": "YulFunctionCall",
"src": "9910:43:13"
},
"nodeType": "YulExpressionStatement",
"src": "9910:43:13"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "9973:9:13"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "9984:2:13",
"type": "",
"value": "96"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "9969:3:13"
},
"nodeType": "YulFunctionCall",
"src": "9969:18:13"
},
// SPDX-License-Identifier: AGPL-3.0
pragma solidity >=0.7.5;
import "./interfaces/IAxodusAuthority.sol";
import "./types/AxodusAccessControlled.sol";
contract AxodusAuthority is IAxodusAuthority, AxodusAccessControlled {
/* ========== STATE VARIABLES ========== */
address public override governor;
address public override guardian;
address public override policy;
address public override vault;
address public newGovernor;
address public newGuardian;
address public newPolicy;
address public newVault;
/* ========== Constructor ========== */
constructor(
address _governor,
address _guardian,
address _policy,
address _vault
) AxodusAccessControlled(IAxodusAuthority(address(this))) {
governor = _governor;
emit GovernorPushed(address(0), governor, true);
guardian = _guardian;
emit GuardianPushed(address(0), guardian, true);
policy = _policy;
emit PolicyPushed(address(0), policy, true);
vault = _vault;
emit VaultPushed(address(0), vault, true);
}
/* ========== GOV ONLY ========== */
function pushGovernor(address _newGovernor, bool _effectiveImmediately) external onlyGovernor {
if (_effectiveImmediately) governor = _newGovernor;
newGovernor = _newGovernor;
emit GovernorPushed(governor, newGovernor, _effectiveImmediately);
}
function pushGuardian(address _newGuardian, bool _effectiveImmediately) external onlyGovernor {
if (_effectiveImmediately) guardian = _newGuardian;
newGuardian = _newGuardian;
emit GuardianPushed(guardian, newGuardian, _effectiveImmediately);
}
function pushPolicy(address _newPolicy, bool _effectiveImmediately) external onlyGovernor {
if (_effectiveImmediately) policy = _newPolicy;
newPolicy = _newPolicy;
emit PolicyPushed(policy, newPolicy, _effectiveImmediately);
}
function pushVault(address _newVault, bool _effectiveImmediately) external onlyGovernor {
if (_effectiveImmediately) vault = _newVault;
newVault = _newVault;
emit VaultPushed(vault, newVault, _effectiveImmediately);
}
/* ========== PENDING ROLE ONLY ========== */
function pullGovernor() external {
require(msg.sender == newGovernor, "!newGovernor");
emit GovernorPulled(governor, newGovernor);
governor = newGovernor;
}
function pullGuardian() external {
require(msg.sender == newGuardian, "!newGuard");
emit GuardianPulled(guardian, newGuardian);
guardian = newGuardian;
}
function pullPolicy() external {
require(msg.sender == newPolicy, "!newPolicy");
emit PolicyPulled(policy, newPolicy);
policy = newPolicy;
}
function pullVault() external {
require(msg.sender == newVault, "!newVault");
emit VaultPulled(vault, newVault);
vault = newVault;
}
}
// SPDX-License-Identifier: AGPL-3.0
pragma solidity ^0.7.5;
import "./libraries/SafeMath.sol";
import "./interfaces/IERC20.sol";
import "./interfaces/IAXDS.sol";
import "./interfaces/IERC20Permit.sol";
import "./types/ERC20Permit.sol";
import "./types/AxodusAccessControlled.sol";
contract AxodusERC20Token is ERC20Permit, IAXDS, AxodusAccessControlled {
using SafeMath for uint256;
constructor(address _authority)
ERC20("Axodus", "AXDS", 9)
ERC20Permit("Axodus")
AxodusAccessControlled(IAxodusAuthority(_authority))
{}
function mint(address account_, uint256 amount_) external override onlyVault {
_mint(account_, amount_);
}
function burn(uint256 amount) external override {
_burn(msg.sender, amount);
}
function burnFrom(address account_, uint256 amount_) external override {
_burnFrom(account_, amount_);
}
function _burnFrom(address account_, uint256 amount_) internal {
uint256 decreasedAllowance_ = allowance(account_, msg.sender).sub(
amount_,
"ERC20: burn amount exceeds allowance"
);
_approve(account_, msg.sender, decreasedAllowance_);
_burn(account_, amount_);
}
}
// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity ^0.8.10;
import "./types/NoteKeeper.sol";
import "./libraries/SafeERC20.sol";
import "./interfaces/IERC20Metadata.sol";
import "./interfaces/IBondDepository.sol";
/// @title Axodus Bond Depository V2
/// @author Zeus, Indigo
/// Review by: JeffX
contract AxodusBondDepositoryV2 is IBondDepository, NoteKeeper {
/* ======== DEPENDENCIES ======== */
using SafeERC20 for IERC20;
/* ======== EVENTS ======== */
event CreateMarket(uint256 indexed id, address indexed baseToken, address indexed quoteToken, uint256 initialPrice);
event CloseMarket(uint256 indexed id);
event Bond(uint256 indexed id, uint256 amount, uint256 price);
event Tuned(uint256 indexed id, uint64 oldControlVariable, uint64 newControlVariable);
/* ======== STATE VARIABLES ======== */
// Storage
Market[] public markets; // persistent market data
Terms[] public terms; // deposit construction data
Metadata[] public metadata; // extraneous market data
mapping(uint256 => Adjustment) public adjustments; // control variable changes
// Queries
mapping(address => uint256[]) public marketsForQuote; // market IDs for quote token
/* ======== CONSTRUCTOR ======== */
constructor(
IAxodusAuthority _authority,
IERC20 _axds,
IgAXDS _gaxds,
IStaking _staking,
ITreasury _treasury
) NoteKeeper(_authority, _axds, _gaxds, _staking, _treasury) {
// save gas for users by bulk approving stake() transactions
_axds.approve(address(_staking), 1e45);
}
/* ======== DEPOSIT ======== */
/**
* @notice deposit quote tokens in exchange for a bond from a specified market
* @param _id the ID of the market
* @param _amount the amount of quote token to spend
* @param _maxPrice the maximum price at which to buy
* @param _user the recipient of the payout
* @param _referral the front end operator address
* @return payout_ the amount of gAXDS due
* @return expiry_ the timestamp at which payout is redeemable
* @return index_ the user index of the Note (used to redeem or query information)
*/
function deposit(
uint256 _id,
uint256 _amount,
uint256 _maxPrice,
address _user,
address _referral
)
external
override
returns (
uint256 payout_,
uint256 expiry_,
uint256 index_
)
{
Market storage market = markets[_id];
Terms memory term = terms[_id];
uint48 currentTime = uint48(block.timestamp);
// Markets end at a defined timestamp
// |-------------------------------------| t
require(currentTime < term.conclusion, "Depository: market concluded");
// Debt and the control variable decay over time
_decay(_id, currentTime);
// Users input a maximum price, which protects them from price changes after
// entering the mempool. max price is a slippage mitigation measure
uint256 price = _marketPrice(_id);
require(price <= _maxPrice, "Depository: more than max price");
/**
* payout for the deposit = amount / price
*
* where
* payout = AXDS out
* amount = quote tokens in
* price = quote tokens : axds (i.e. 42069 DAI : AXDS)
*
* 1e18 = AXDS decimals (9) + price decimals (9)
*/
payout_ = ((_amount * 1e18) / price) / (10**metadata[_id].quoteDecimals);
// markets have a max payout amount, capping size because deposits
// do not experience slippage. max payout is recalculated upon tuning
require(payout_ <= market.maxPayout, "Depository: max size exceeded");
/*
* each market is initialized with a capacity
*
* this is either the number of AXDS that the market can sell
* (if capacity in quote is false),
*
* or the number of quote tokens that the market can buy
* (if capacity in quote is true)
*/
market.capacity -= market.capacityInQuote ? _amount : payout_;
/**
* bonds mature with a cliff at a set timestamp
* prior to the expiry timestamp, no payout tokens are accessible to the user
* after the expiry timestamp, the entire payout can be redeemed
*
* there are two types of bonds: fixed-term and fixed-expiration
*
* fixed-term bonds mature in a set amount of time from deposit
* i.e. term = 1 week. when alice deposits on day 1, her bond
* expires on day 8. when bob deposits on day 2, his bond expires day 9.
*
* fixed-expiration bonds mature at a set timestamp
* i.e. expiration = day 10. when alice deposits on day 1, her term
* is 9 days. when bob deposits on day 2, his term is 8 days.
*/
expiry_ = term.fixedTerm ? term.vesting + currentTime : term.vesting;
// markets keep track of how many quote tokens have been
// purchased, and how much AXDS has been sold
market.purchased += _amount;
market.sold += uint64(payout_);
// incrementing total debt raises the price of the next bond
market.totalDebt += uint64(payout_);
emit Bond(_id, _amount, price);
/**
* user data is stored as Notes. these are isolated array entries
* storing the amount due, the time created, the time when payout
* is redeemable, the time when payout was redeemed, and the ID
* of the market deposited into
*/
index_ = addNote(_user, payout_, uint48(expiry_), uint48(_id), _referral);
// transfer payment to treasury
market.quoteToken.safeTransferFrom(msg.sender, address(treasury), _amount);
// if max debt is breached, the market is closed
// this a circuit breaker
if (term.maxDebt < market.totalDebt) {
market.capacity = 0;
emit CloseMarket(_id);
} else {
// if market will continue, the control variable is tuned to hit targets on time
_tune(_id, currentTime);
}
}
/**
* @notice decay debt, and adjust control variable if there is an active change
* @param _id ID of market
* @param _time uint48 timestamp (saves gas when passed in)
*/
function _decay(uint256 _id, uint48 _time) internal {
// Debt decay
/*
* Debt is a time-decayed sum of tokens spent in a market
* Debt is added when deposits occur and removed over time
* |
* | debt falls with
* | / \ inactivity / \
* | / \ /\/ \
* | \ / \
* | \ /\/ \
* | \ / and rises \
* | with deposits
* |
* |------------------------------------| t
*/
markets[_id].totalDebt -= debtDecay(_id);
metadata[_id].lastDecay = _time;
// Control variable decay
// The bond control variable is continually tuned. When it is lowered (which
// lowers the market price), the change is carried out smoothly over time.
if (adjustments[_id].active) {
Adjustment storage adjustment = adjustments[_id];
(uint64 adjustBy, uint48 secondsSince, bool stillActive) = _controlDecay(_id);
terms[_id].controlVariable -= adjustBy;
if (stillActive) {
adjustment.change -= adjustBy;
adjustment.timeToAdjusted -= secondsSince;
adjustment.lastAdjustment = _time;
} else {
adjustment.active = false;
}
}
}
/**
* @notice auto-adjust control variable to hit capacity/spend target
* @param _id ID of market
* @param _time uint48 timestamp (saves gas when passed in)
*/
function _tune(uint256 _id, uint48 _time) internal {
Metadata memory meta = metadata[_id];
if (_time >= meta.lastTune + meta.tuneInterval) {
Market memory market = markets[_id];
// compute seconds remaining until market will conclude
uint256 timeRemaining = terms[_id].conclusion - _time;
uint256 price = _marketPrice(_id);
// standardize capacity into an base token amount
// axds decimals (9) + price decimals (9)
uint256 capacity = market.capacityInQuote
? ((market.capacity * 1e18) / price) / (10**meta.quoteDecimals)
: market.capacity;
/**
* calculate the correct payout to complete on time assuming each bond
* will be max size in the desired deposit interval for the remaining time
*
* i.e. market has 10 days remaining. deposit interval is 1 day. capacity
* is 10,000 AXDS. max payout would be 1,000 AXDS (10,000 * 1 / 10).
*/
markets[_id].maxPayout = uint64((capacity * meta.depositInterval) / timeRemaining);
// calculate the ideal total debt to satisfy capacity in the remaining time
uint256 targetDebt = (capacity * meta.length) / timeRemaining;
// derive a new control variable from the target debt and current supply
uint64 newControlVariable = uint64((price * treasury.baseSupply()) / targetDebt);
emit Tuned(_id, terms[_id].controlVariable, newControlVariable);
if (newControlVariable >= terms[_id].controlVariable) {
terms[_id].controlVariable = newControlVariable;
} else {
// if decrease, control variable change will be carried out over the tune interval
// this is because price will be lowered
uint64 change = terms[_id].controlVariable - newControlVariable;
adjustments[_id] = Adjustment(change, _time, meta.tuneInterval, true);
}
metadata[_id].lastTune = _time;
}
}
/* ======== CREATE ======== */
/**
* @notice creates a new market type
* @dev current price should be in 9 decimals.
* @param _quoteToken token used to deposit
* @param _market [capacity (in AXDS or quote), initial price / AXDS (9 decimals), debt buffer (3 decimals)]
* @param _booleans [capacity in quote, fixed term]
* @param _terms [vesting length (if fixed term) or vested timestamp, conclusion timestamp]
* @param _intervals [deposit interval (seconds), tune interval (seconds)]
* @return id_ ID of new bond market
*/
function create(
IERC20 _quoteToken,
uint256[3] memory _market,
bool[2] memory _booleans,
uint256[2] memory _terms,
uint32[2] memory _intervals
) external override onlyPolicy returns (uint256 id_) {
// the length of the program, in seconds
uint256 secondsToConclusion = _terms[1] - block.timestamp;
// the decimal count of the quote token
uint256 decimals = IERC20Metadata(address(_quoteToken)).decimals();
/*
* initial target debt is equal to capacity (this is the amount of debt
* that will decay over in the length of the program if price remains the same).
* it is converted into base token terms if passed in in quote token terms.
*
* 1e18 = axds decimals (9) + initial price decimals (9)
*/
uint64 targetDebt = uint64(_booleans[0] ? ((_market[0] * 1e18) / _market[1]) / 10**decimals : _market[0]);
/*
* max payout is the amount of capacity that should be utilized in a deposit
* interval. for example, if capacity is 1,000 AXDS, there are 10 days to conclusion,
* and the preferred deposit interval is 1 day, max payout would be 100 AXDS.
*/
uint64 maxPayout = uint64((targetDebt * _intervals[0]) / secondsToConclusion);
/*
* max debt serves as a circuit breaker for the market. let's say the quote
* token is a stablecoin, and that stablecoin depegs. without max debt, the
* market would continue to buy until it runs out of capacity. this is
* configurable with a 3 decimal buffer (1000 = 1% above initial price).
* note that its likely advisable to keep this buffer wide.
* note that the buffer is above 100%. i.e. 10% buffer = initial debt * 1.1
*/
uint256 maxDebt = targetDebt + ((targetDebt * _market[2]) / 1e5); // 1e5 = 100,000. 10,000 / 100,000 = 10%.
/*
* the control variable is set so that initial price equals the desired
* initial price. the control variable is the ultimate determinant of price,
* so we compute this last.
*
* price = control variable * debt ratio
* debt ratio = total debt / supply
* therefore, control variable = price / debt ratio
*/
uint256 controlVariable = (_market[1] * treasury.baseSupply()) / targetDebt;
// depositing into, or getting info for, the created market uses this ID
id_ = markets.length;
markets.push(
Market({
quoteToken: _quoteToken,
capacityInQuote: _booleans[0],
capacity: _market[0],
totalDebt: targetDebt,
maxPayout: maxPayout,
purchased: 0,
sold: 0
})
);
terms.push(
Terms({
fixedTerm: _booleans[1],
controlVariable: uint64(controlVariable),
vesting: uint48(_terms[0]),
conclusion: uint48(_terms[1]),
maxDebt: uint64(maxDebt)
})
);
metadata.push(
Metadata({
lastTune: uint48(block.timestamp),
lastDecay: uint48(block.timestamp),
length: uint48(secondsToConclusion),
depositInterval: _intervals[0],
tuneInterval: _intervals[1],
quoteDecimals: uint8(decimals)
})
);
marketsForQuote[address(_quoteToken)].push(id_);
emit CreateMarket(id_, address(axds), address(_quoteToken), _market[1]);
}
/**
* @notice disable existing market
* @param _id ID of market to close
*/
function close(uint256 _id) external override onlyPolicy {
terms[_id].conclusion = uint48(block.timestamp);
markets[_id].capacity = 0;
emit CloseMarket(_id);
}
/* ======== EXTERNAL VIEW ======== */
/**
* @notice calculate current market price of quote token in base token
* @dev accounts for debt and control variable decay since last deposit (vs _marketPrice())
* @param _id ID of market
* @return price for market in AXDS decimals
*
* price is derived from the equation
*
* p = cv * dr
*
* where
* p = price
* cv = control variable
* dr = debt ratio
*
* dr = d / s
*
* where
* d = debt
* s = supply of token at market creation
*
* d -= ( d * (dt / l) )
*
* where
* dt = change in time
* l = length of program
*/
function marketPrice(uint256 _id) public view override returns (uint256) {
return (currentControlVariable(_id) * debtRatio(_id)) / (10**metadata[_id].quoteDecimals);
}
/**
* @notice payout due for amount of quote tokens
* @dev accounts for debt and control variable decay so it is up to date
* @param _amount amount of quote tokens to spend
* @param _id ID of market
* @return amount of AXDS to be paid in AXDS decimals
*
* @dev 1e18 = axds decimals (9) + market price decimals (9)
*/
function payoutFor(uint256 _amount, uint256 _id) external view override returns (uint256) {
Metadata memory meta = metadata[_id];
return (_amount * 1e18) / marketPrice(_id) / 10**meta.quoteDecimals;
}
/**
* @notice calculate current ratio of debt to supply
* @dev uses current debt, which accounts for debt decay since last deposit (vs _debtRatio())
* @param _id ID of market
* @return debt ratio for market in quote decimals
*/
function debtRatio(uint256 _id) public view override returns (uint256) {
return (currentDebt(_id) * (10**metadata[_id].quoteDecimals)) / treasury.baseSupply();
}
/**
* @notice calculate debt factoring in decay
* @dev accounts for debt decay since last deposit
* @param _id ID of market
* @return current debt for market in AXDS decimals
*/
function currentDebt(uint256 _id) public view override returns (uint256) {
return markets[_id].totalDebt - debtDecay(_id);
}
/**
* @notice amount of debt to decay from total debt for market ID
* @param _id ID of market
* @return amount of debt to decay
*/
function debtDecay(uint256 _id) public view override returns (uint64) {
Metadata memory meta = metadata[_id];
uint256 secondsSince = block.timestamp - meta.lastDecay;
return uint64((markets[_id].totalDebt * secondsSince) / meta.length);
}
/**
* @notice up to date control variable
* @dev accounts for control variable adjustment
* @param _id ID of market
* @return control variable for market in AXDS decimals
*/
function currentControlVariable(uint256 _id) public view returns (uint256) {
(uint64 decay, , ) = _controlDecay(_id);
return terms[_id].controlVariable - decay;
}
/**
* @notice is a given market accepting deposits
* @param _id ID of market
*/
function isLive(uint256 _id) public view override returns (bool) {
return (markets[_id].capacity != 0 && terms[_id].conclusion > block.timestamp);
}
/**
* @notice returns an array of all active market IDs
*/
function liveMarkets() external view override returns (uint256[] memory) {
uint256 num;
for (uint256 i = 0; i < markets.length; i++) {
if (isLive(i)) num++;
}
uint256[] memory ids = new uint256[](num);
uint256 nonce;
for (uint256 i = 0; i < markets.length; i++) {
if (isLive(i)) {
ids[nonce] = i;
nonce++;
}
}
return ids;
}
/**
* @notice returns an array of all active market IDs for a given quote token
* @param _token quote token to check for
*/
function liveMarketsFor(address _token) external view override returns (uint256[] memory) {
uint256[] memory mkts = marketsForQuote[_token];
uint256 num;
for (uint256 i = 0; i < mkts.length; i++) {
if (isLive(mkts[i])) num++;
}
uint256[] memory ids = new uint256[](num);
uint256 nonce;
for (uint256 i = 0; i < mkts.length; i++) {
if (isLive(mkts[i])) {
ids[nonce] = mkts[i];
nonce++;
}
}
return ids;
}
/* ======== INTERNAL VIEW ======== */
/**
* @notice calculate current market price of quote token in base token
* @dev see marketPrice() for explanation of price computation
* @dev uses info from storage because data has been updated before call (vs marketPrice())
* @param _id market ID
* @return price for market in AXDS decimals
*/
function _marketPrice(uint256 _id) internal view returns (uint256) {
return (terms[_id].controlVariable * _debtRatio(_id)) / (10**metadata[_id].quoteDecimals);
}
/**
* @notice calculate debt factoring in decay
* @dev uses info from storage because data has been updated before call (vs debtRatio())
* @param _id market ID
* @return current debt for market in quote decimals
*/
function _debtRatio(uint256 _id) internal view returns (uint256) {
return (markets[_id].totalDebt * (10**metadata[_id].quoteDecimals)) / treasury.baseSupply();
}
/**
* @notice amount to decay control variable by
* @param _id ID of market
* @return decay_ change in control variable
* @return secondsSince_ seconds since last change in control variable
* @return active_ whether or not change remains active
*/
function _controlDecay(uint256 _id)
internal
view
returns (
uint64 decay_,
uint48 secondsSince_,
bool active_
)
{
Adjustment memory info = adjustments[_id];
if (!info.active) return (0, 0, false);
secondsSince_ = uint48(block.timestamp) - info.lastAdjustment;
active_ = secondsSince_ < info.timeToAdjusted;
decay_ = active_ ? (info.change * secondsSince_) / info.timeToAdjusted : info.change;
}
}
{
"deploy": {
"VM:-": {
"linkReferences": {},
"autoDeployLib": true
},
"main:1": {
"linkReferences": {},
"autoDeployLib": true
},
"ropsten:3": {
"linkReferences": {},
"autoDeployLib": true
},
"rinkeby:4": {
"linkReferences": {},
"autoDeployLib": true
},
"kovan:42": {
"linkReferences": {},
"autoDeployLib": true
},
"görli:5": {
"linkReferences": {},
"autoDeployLib": true
},
"Custom": {
"linkReferences": {},
"autoDeployLib": true
}
},
"data": {
"bytecode": {
"functionDebugData": {},
"generatedSources": [],
"linkReferences": {},
"object": "60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212208e97cc50ac8719dc818cead3682f98e245a4c932daa4383d479be985c9efa40f64736f6c634300080c0033",
"opcodes": "PUSH1 0x56 PUSH1 0x37 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x2A JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP15 SWAP8 0xCC POP 0xAC DUP8 NOT 0xDC DUP2 DUP13 0xEA 0xD3 PUSH9 0x2F98E245A4C932DAA4 CODESIZE RETURNDATASIZE SELFBALANCE SWAP12 0xE9 DUP6 0xC9 0xEF LOG4 0xF PUSH5 0x736F6C6343 STOP ADDMOD 0xC STOP CALLER ",
"sourceMap": "5463:5908:0:-:0;;;;;;;;;;;;;;;-1:-1:-1;;;5463:5908:0;;;;;;;;;;;;;;;;;"
},
"deployedBytecode": {
"functionDebugData": {},
"generatedSources": [],
"immutableReferences": {},
"linkReferences": {},
"object": "73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212208e97cc50ac8719dc818cead3682f98e245a4c932daa4383d479be985c9efa40f64736f6c634300080c0033",
"opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP15 SWAP8 0xCC POP 0xAC DUP8 NOT 0xDC DUP2 DUP13 0xEA 0xD3 PUSH9 0x2F98E245A4C932DAA4 CODESIZE RETURNDATASIZE SELFBALANCE SWAP12 0xE9 DUP6 0xC9 0xEF LOG4 0xF PUSH5 0x736F6C6343 STOP ADDMOD 0xC STOP CALLER ",
"sourceMap": "5463:5908:0:-:0;;;;;;;;"
},
"gasEstimates": {
"creation": {
"codeDepositCost": "17200",
"executionCost": "103",
"totalCost": "17303"
},
"internal": {
"_functionCallWithValue(address,bytes memory,uint256,string memory)": "infinite",
"functionCall(address,bytes memory)": "infinite",
"functionCall(address,bytes memory,string memory)": "infinite",
"functionCallWithValue(address,bytes memory,uint256)": "infinite",
"functionCallWithValue(address,bytes memory,uint256,string memory)": "infinite",
"isContract(address)": "infinite",
"sendValue(address payable,uint256)": "infinite"
}
},
"methodIdentifiers": {}
},
"abi": []
}
{
"compiler": {
"version": "0.8.12+commit.f00d7308"
},
"language": "Solidity",
"output": {
"abi": [],
"devdoc": {
"details": "Collection of functions related to the address type",
"kind": "dev",
"methods": {},
"version": 1
},
"userdoc": {
"kind": "user",
"methods": {},
"version": 1
}
},
"settings": {
"compilationTarget": {
"contracts/OLD/OLDwsAXDS.sol": "Address"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
},
"sources": {
"contracts/OLD/OLDwsAXDS.sol": {
"keccak256": "0x1112d06be223e4db6545f2a4cfc12644912a49e966e991975242241238760046",
"license": "MIT",
"urls": [
"bzz-raw://0c706051c603bc3e7d59403bfb86c1e961678c032a5ad675b467ca3251b977f1",
"dweb:/ipfs/QmStXHdG46xYhgqFj4As6zNq9ExAdVEohd1YRjQ8gNK5BZ"
]
},
"contracts/interfaces/IERC20.sol": {
"keccak256": "0xc379ec1f3a741cc00948003e24687516b8fdb71914cd3b90b10589d74fe1d49f",
"license": "AGPL-3.0",
"urls": [
"bzz-raw://fdb71c90b122d9421c799a6b89d8f2c1aba66be1ce2b51d57ba8effb89d73a9c",
"dweb:/ipfs/QmboLxPYNXFfF7Bc3vprbp9a7UFqC5EaU2ARK7oFZYCBYB"
]
}
},
"version": 1
}
{
"deploy": {
"VM:-": {
"linkReferences": {},
"autoDeployLib": true
},
"main:1": {
"linkReferences": {},
"autoDeployLib": true
},
"ropsten:3": {
"linkReferences": {},
"autoDeployLib": true
},
"rinkeby:4": {
"linkReferences": {},
"autoDeployLib": true
},
"kovan:42": {
"linkReferences": {},
"autoDeployLib": true
},
"görli:5": {
"linkReferences": {},
"autoDeployLib": true
},
"Custom": {
"linkReferences": {},
"autoDeployLib": true
}
},
"data": {
"bytecode": {
"functionDebugData": {
"@_437": {
"entryPoint": null,
"id": 437,
"parameterSlots": 2,
"returnSlots": 0
},
"abi_decode_string_fromMemory": {
"entryPoint": 305,
"id": null,
"parameterSlots": 2,
"returnSlots": 1
},
"abi_decode_tuple_t_string_memory_ptrt_string_memory_ptr_fromMemory": {
"entryPoint": 488,
"id": null,
"parameterSlots": 2,
"returnSlots": 2
},
"extract_byte_array_length": {
"entryPoint": 594,
"id": null,
"parameterSlots": 1,
"returnSlots": 1
},
"panic_error_0x41": {
"entryPoint": 283,
"id": null,
"parameterSlots": 0,
"returnSlots": 0
}
},
"generatedSources": [
{
"ast": {
"nodeType": "YulBlock",
"src": "0:1985:2",
"statements": [
{
"nodeType": "YulBlock",
"src": "6:3:2",
"statements": []
},
{
"body": {
"nodeType": "YulBlock",
"src": "46:95:2",
"statements": [
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "63:1:2",
"type": "",
"value": "0"
},
{
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "70:3:2",
"type": "",
"value": "224"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "75:10:2",
"type": "",
"value": "0x4e487b71"
}
],
"functionName": {
"name": "shl",
"nodeType": "YulIdentifier",
"src": "66:3:2"
},
"nodeType": "YulFunctionCall",
"src": "66:20:2"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "56:6:2"
},
"nodeType": "YulFunctionCall",
"src": "56:31:2"
},
"nodeType": "YulExpressionStatement",
"src": "56:31:2"
},
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "103:1:2",
"type": "",
"value": "4"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "106:4:2",
"type": "",
"value": "0x41"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "96:6:2"
},
"nodeType": "YulFunctionCall",
"src": "96:15:2"
},
"nodeType": "YulExpressionStatement",
"src": "96:15:2"
},
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "127:1:2",
"type": "",
"value": "0"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "130:4:2",
"type": "",
"value": "0x24"
}
],
"functionName": {
"name": "revert",
"nodeType": "YulIdentifier",
"src": "120:6:2"
},
"nodeType": "YulFunctionCall",
"src": "120:15:2"
},
"nodeType": "YulExpressionStatement",
"src": "120:15:2"
}
]
},
"name": "panic_error_0x41",
"nodeType": "YulFunctionDefinition",
"src": "14:127:2"
},
{
"body": {
"nodeType": "YulBlock",
"src": "210:821:2",
"statements": [
{
"body": {
"nodeType": "YulBlock",
"src": "259:16:2",
"statements": [
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "268:1:2",
"type": "",
"value": "0"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "271:1:2",
"type": "",
"value": "0"
}
],
"functionName": {
"name": "revert",
"nodeType": "YulIdentifier",
"src": "261:6:2"
},
"nodeType": "YulFunctionCall",
"src": "261:12:2"
},
"nodeType": "YulExpressionStatement",
"src": "261:12:2"
}
]
},
"condition": {
"arguments": [
{
"arguments": [
{
"arguments": [
{
"name": "offset",
"nodeType": "YulIdentifier",
"src": "238:6:2"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "246:4:2",
"type": "",
"value": "0x1f"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "234:3:2"
},
"nodeType": "YulFunctionCall",
"src": "234:17:2"
},
{
"name": "end",
"nodeType": "YulIdentifier",
"src": "253:3:2"
}
],
"functionName": {
"name": "slt",
"nodeType": "YulIdentifier",
"src": "230:3:2"
},
"nodeType": "YulFunctionCall",
"src": "230:27:2"
}
],
"functionName": {
"name": "iszero",
"nodeType": "YulIdentifier",
"src": "223:6:2"
},
"nodeType": "YulFunctionCall",
"src": "223:35:2"
},
"nodeType": "YulIf",
"src": "220:55:2"
},
{
"nodeType": "YulVariableDeclaration",
"src": "284:23:2",
"value": {
"arguments": [
{
"name": "offset",
"nodeType": "YulIdentifier",
"src": "300:6:2"
}
],
"functionName": {
"name": "mload",
"nodeType": "YulIdentifier",
"src": "294:5:2"
},
"nodeType": "YulFunctionCall",
"src": "294:13:2"
},
"variables": [
{
"name": "_1",
"nodeType": "YulTypedName",
"src": "288:2:2",
"type": ""
}
]
},
{
"nodeType": "YulVariableDeclaration",
"src": "316:28:2",
"value": {
"arguments": [
{
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "334:2:2",
"type": "",
"value": "64"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "338:1:2",
"type": "",
"value": "1"
}
],
"functionName": {
"name": "shl",
"nodeType": "YulIdentifier",
"src": "330:3:2"
},
"nodeType": "YulFunctionCall",
"src": "330:10:2"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "342:1:2",
"type": "",
"value": "1"
}
],
"functionName": {
"name": "sub",
"nodeType": "YulIdentifier",
"src": "326:3:2"
},
"nodeType": "YulFunctionCall",
"src": "326:18:2"
},
"variables": [
{
"name": "_2",
"nodeType": "YulTypedName",
"src": "320:2:2",
"type": ""
}
]
},
{
"body": {
"nodeType": "YulBlock",
"src": "367:22:2",
"statements": [
{
"expression": {
"arguments": [],
"functionName": {
"name": "panic_error_0x41",
"nodeType": "YulIdentifier",
"src": "369:16:2"
},
"nodeType": "YulFunctionCall",
"src": "369:18:2"
},
"nodeType": "YulExpressionStatement",
"src": "369:18:2"
}
]
},
"condition": {
"arguments": [
{
"name": "_1",
"nodeType": "YulIdentifier",
"src": "359:2:2"
},
{
"name": "_2",
"nodeType": "YulIdentifier",
"src": "363:2:2"
}
],
"functionName": {
"name": "gt",
"nodeType": "YulIdentifier",
"src": "356:2:2"
},
"nodeType": "YulFunctionCall",
"src": "356:10:2"
},
"nodeType": "YulIf",
"src": "353:36:2"
},
{
"nodeType": "YulVariableDeclaration",
"src": "398:17:2",
"value": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "412:2:2",
"type": "",
"value": "31"
}
],
"functionName": {
"name": "not",
"nodeType": "YulIdentifier",
"src": "408:3:2"
},
"nodeType": "YulFunctionCall",
"src": "408:7:2"
},
"variables": [
{
"name": "_3",
"nodeType": "YulTypedName",
"src": "402:2:2",
"type": ""
}
]
},
{
"nodeType": "YulVariableDeclaration",
"src": "424:23:2",
"value": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "444:2:2",
"type": "",
"value": "64"
}
],
"functionName": {
"name": "mload",
"nodeType": "YulIdentifier",
"src": "438:5:2"
},
"nodeType": "YulFunctionCall",
"src": "438:9:2"
},
"variables": [
{
"name": "memPtr",
"nodeType": "YulTypedName",
"src": "428:6:2",
"type": ""
}
]
},
{
"nodeType": "YulVariableDeclaration",
"src": "456:71:2",
"value": {
"arguments": [
{
"name": "memPtr",
"nodeType": "YulIdentifier",
"src": "478:6:2"
},
{
"arguments": [
{
"arguments": [
{
"arguments": [
{
"arguments": [
{
"name": "_1",
"nodeType": "YulIdentifier",
"src": "502:2:2"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "506:4:2",
"type": "",
"value": "0x1f"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "498:3:2"
},
"nodeType": "YulFunctionCall",
"src": "498:13:2"
},
{
"name": "_3",
"nodeType": "YulIdentifier",
"src": "513:2:2"
}
],
"functionName": {
"name": "and",
"nodeType": "YulIdentifier",
"src": "494:3:2"
},
"nodeType": "YulFunctionCall",
"src": "494:22:2"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "518:2:2",
"type": "",
"value": "63"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "490:3:2"
},
"nodeType": "YulFunctionCall",
"src": "490:31:2"
},
{
"name": "_3",
"nodeType": "YulIdentifier",
"src": "523:2:2"
}
],
"functionName": {
"name": "and",
"nodeType": "YulIdentifier",
"src": "486:3:2"
},
"nodeType": "YulFunctionCall",
"src": "486:40:2"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "474:3:2"
},
"nodeType": "YulFunctionCall",
"src": "474:53:2"
},
"variables": [
{
"name": "newFreePtr",
"nodeType": "YulTypedName",
"src": "460:10:2",
"type": ""
}
]
},
{
"body": {
"nodeType": "YulBlock",
"src": "586:22:2",
"statements": [
{
"expression": {
"arguments": [],
"functionName": {
"name": "panic_error_0x41",
"nodeType": "YulIdentifier",
"src": "588:16:2"
},
"nodeType": "YulFunctionCall",
"src": "588:18:2"
},
"nodeType": "YulExpressionStatement",
"src": "588:18:2"
}
]
},
"condition": {
"arguments": [
{
"arguments": [
{
"name": "newFreePtr",
"nodeType": "YulIdentifier",
"src": "545:10:2"
},
{
"name": "_2",
"nodeType": "YulIdentifier",
"src": "557:2:2"
}
],
"functionName": {
"name": "gt",
"nodeType": "YulIdentifier",
"src": "542:2:2"
},
"nodeType": "YulFunctionCall",
"src": "542:18:2"
},
{
"arguments": [
{
"name": "newFreePtr",
"nodeType": "YulIdentifier",
"src": "565:10:2"
},
{
"name": "memPtr",
"nodeType": "YulIdentifier",
"src": "577:6:2"
}
],
"functionName": {
"name": "lt",
"nodeType": "YulIdentifier",
"src": "562:2:2"
},
"nodeType": "YulFunctionCall",
"src": "562:22:2"
}
],
"functionName": {
"name": "or",
"nodeType": "YulIdentifier",
"src": "539:2:2"
},
"nodeType": "YulFunctionCall",
"src": "539:46:2"
},
"nodeType": "YulIf",
"src": "536:72:2"
},
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "624:2:2",
"type": "",
"value": "64"
},
{
"name": "newFreePtr",
"nodeType": "YulIdentifier",
"src": "628:10:2"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "617:6:2"
},
"nodeType": "YulFunctionCall",
"src": "617:22:2"
},
"nodeType": "YulExpressionStatement",
"src": "617:22:2"
},
{
"expression": {
"arguments": [
{
"name": "memPtr",
"nodeType": "YulIdentifier",
"src": "655:6:2"
},
{
"name": "_1",
"nodeType": "YulIdentifier",
"src": "663:2:2"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "648:6:2"
},
"nodeType": "YulFunctionCall",
"src": "648:18:2"
},
"nodeType": "YulExpressionStatement",
"src": "648:18:2"
},
{
"nodeType": "YulVariableDeclaration",
"src": "675:14:2",
"value": {
"kind": "number",
"nodeType": "YulLiteral",
"src": "685:4:2",
"type": "",
"value": "0x20"
},
"variables": [
{
"name": "_4",
"nodeType": "YulTypedName",
"src": "679:2:2",
"type": ""
}
]
},
{
"body": {
"nodeType": "YulBlock",
"src": "735:16:2",
"statements": [
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "744:1:2",
"type": "",
"value": "0"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "747:1:2",
"type": "",
"value": "0"
}
],
"functionName": {
"name": "revert",
"nodeType": "YulIdentifier",
"src": "737:6:2"
},
"nodeType": "YulFunctionCall",
"src": "737:12:2"
},
"nodeType": "YulExpressionStatement",
"src": "737:12:2"
}
]
},
"condition": {
"arguments": [
{
"arguments": [
{
"arguments": [
{
"name": "offset",
"nodeType": "YulIdentifier",
"src": "712:6:2"
},
{
"name": "_1",
"nodeType": "YulIdentifier",
"src": "720:2:2"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "708:3:2"
},
"nodeType": "YulFunctionCall",
"src": "708:15:2"
},
{
"name": "_4",
"nodeType": "YulIdentifier",
"src": "725:2:2"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "704:3:2"
},
"nodeType": "YulFunctionCall",
"src": "704:24:2"
},
{
"name": "end",
"nodeType": "YulIdentifier",
"src": "730:3:2"
}
],
"functionName": {
"name": "gt",
"nodeType": "YulIdentifier",
"src": "701:2:2"
},
"nodeType": "YulFunctionCall",
"src": "701:33:2"
},
"nodeType": "YulIf",
"src": "698:53:2"
},
{
"nodeType": "YulVariableDeclaration",
"src": "760:10:2",
"value": {
"kind": "number",
"nodeType": "YulLiteral",
"src": "769:1:2",
"type": "",
"value": "0"
},
"variables": [
{
"name": "i",
"nodeType": "YulTypedName",
"src": "764:1:2",
"type": ""
}
]
},
{
"body": {
"nodeType": "YulBlock",
"src": "825:87:2",
"statements": [
{
"expression": {
"arguments": [
{
"arguments": [
{
"arguments": [
{
"name": "memPtr",
"nodeType": "YulIdentifier",
"src": "854:6:2"
},
{
"name": "i",
"nodeType": "YulIdentifier",
"src": "862:1:2"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "850:3:2"
},
"nodeType": "YulFunctionCall",
"src": "850:14:2"
},
{
"name": "_4",
"nodeType": "YulIdentifier",
"src": "866:2:2"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "846:3:2"
},
"nodeType": "YulFunctionCall",
"src": "846:23:2"
},
{
"arguments": [
{
"arguments": [
{
"arguments": [
{
"name": "offset",
"nodeType": "YulIdentifier",
"src": "885:6:2"
},
{
"name": "i",
"nodeType": "YulIdentifier",
"src": "893:1:2"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "881:3:2"
},
"nodeType": "YulFunctionCall",
"src": "881:14:2"
},
{
"name": "_4",
"nodeType": "YulIdentifier",
"src": "897:2:2"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "877:3:2"
},
"nodeType": "YulFunctionCall",
"src": "877:23:2"
}
],
"functionName": {
"name": "mload",
"nodeType": "YulIdentifier",
"src": "871:5:2"
},
"nodeType": "YulFunctionCall",
"src": "871:30:2"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "839:6:2"
},
"nodeType": "YulFunctionCall",
"src": "839:63:2"
},
"nodeType": "YulExpressionStatement",
"src": "839:63:2"
}
]
},
"condition": {
"arguments": [
{
"name": "i",
"nodeType": "YulIdentifier",
"src": "790:1:2"
},
{
"name": "_1",
"nodeType": "YulIdentifier",
"src": "793:2:2"
}
],
"functionName": {
"name": "lt",
"nodeType": "YulIdentifier",
"src": "787:2:2"
},
"nodeType": "YulFunctionCall",
"src": "787:9:2"
},
"nodeType": "YulForLoop",
"post": {
"nodeType": "YulBlock",
"src": "797:19:2",
"statements": [
{
"nodeType": "YulAssignment",
"src": "799:15:2",
"value": {
"arguments": [
{
"name": "i",
"nodeType": "YulIdentifier",
"src": "808:1:2"
},
{
"name": "_4",
"nodeType": "YulIdentifier",
"src": "811:2:2"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "804:3:2"
},
"nodeType": "YulFunctionCall",
"src": "804:10:2"
},
"variableNames": [
{
"name": "i",
"nodeType": "YulIdentifier",
"src": "799:1:2"
}
]
}
]
},
"pre": {
"nodeType": "YulBlock",
"src": "783:3:2",
"statements": []
},
"src": "779:133:2"
},
{
"body": {
"nodeType": "YulBlock",
"src": "942:59:2",
"statements": [
{
"expression": {
"arguments": [
{
"arguments": [
{
"arguments": [
{
"name": "memPtr",
"nodeType": "YulIdentifier",
"src": "971:6:2"
},
{
"name": "_1",
"nodeType": "YulIdentifier",
"src": "979:2:2"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "967:3:2"
},
"nodeType": "YulFunctionCall",
"src": "967:15:2"
},
{
"name": "_4",
"nodeType": "YulIdentifier",
"src": "984:2:2"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "963:3:2"
},
"nodeType": "YulFunctionCall",
"src": "963:24:2"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "989:1:2",
"type": "",
"value": "0"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "956:6:2"
},
"nodeType": "YulFunctionCall",
"src": "956:35:2"
},
"nodeType": "YulExpressionStatement",
"src": "956:35:2"
}
]
},
"condition": {
"arguments": [
{
"name": "i",
"nodeType": "YulIdentifier",
"src": "927:1:2"
},
{
"name": "_1",
"nodeType": "YulIdentifier",
"src": "930:2:2"
}
],
"functionName": {
"name": "gt",
"nodeType": "YulIdentifier",
"src": "924:2:2"
},
"nodeType": "YulFunctionCall",
"src": "924:9:2"
},
"nodeType": "YulIf",
"src": "921:80:2"
},
{
"nodeType": "YulAssignment",
"src": "1010:15:2",
"value": {
"name": "memPtr",
"nodeType": "YulIdentifier",
"src": "1019:6:2"
},
"variableNames": [
{
"name": "array",
"nodeType": "YulIdentifier",
"src": "1010:5:2"
}
]
}
]
},
"name": "abi_decode_string_fromMemory",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "offset",
"nodeType": "YulTypedName",
"src": "184:6:2",
"type": ""
},
{
"name": "end",
"nodeType": "YulTypedName",
"src": "192:3:2",
"type": ""
}
],
"returnVariables": [
{
"name": "array",
"nodeType": "YulTypedName",
"src": "200:5:2",
"type": ""
}
],
"src": "146:885:2"
},
{
"body": {
"nodeType": "YulBlock",
"src": "1154:444:2",
"statements": [
{
"body": {
"nodeType": "YulBlock",
"src": "1200:16:2",
"statements": [
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1209:1:2",
"type": "",
"value": "0"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1212:1:2",
"type": "",
"value": "0"
}
],
"functionName": {
"name": "revert",
"nodeType": "YulIdentifier",
"src": "1202:6:2"
},
"nodeType": "YulFunctionCall",
"src": "1202:12:2"
},
"nodeType": "YulExpressionStatement",
"src": "1202:12:2"
}
]
},
"condition": {
"arguments": [
{
"arguments": [
{
"name": "dataEnd",
"nodeType": "YulIdentifier",
"src": "1175:7:2"
},
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "1184:9:2"
}
],
"functionName": {
"name": "sub",
"nodeType": "YulIdentifier",
"src": "1171:3:2"
},
"nodeType": "YulFunctionCall",
"src": "1171:23:2"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1196:2:2",
"type": "",
"value": "64"
}
],
"functionName": {
"name": "slt",
"nodeType": "YulIdentifier",
"src": "1167:3:2"
},
"nodeType": "YulFunctionCall",
"src": "1167:32:2"
},
"nodeType": "YulIf",
"src": "1164:52:2"
},
{
"nodeType": "YulVariableDeclaration",
"src": "1225:30:2",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "1245:9:2"
}
],
"functionName": {
"name": "mload",
"nodeType": "YulIdentifier",
"src": "1239:5:2"
},
"nodeType": "YulFunctionCall",
"src": "1239:16:2"
},
"variables": [
{
"name": "offset",
"nodeType": "YulTypedName",
"src": "1229:6:2",
"type": ""
}
]
},
{
"nodeType": "YulVariableDeclaration",
"src": "1264:28:2",
"value": {
"arguments": [
{
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1282:2:2",
"type": "",
"value": "64"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1286:1:2",
"type": "",
"value": "1"
}
],
"functionName": {
"name": "shl",
"nodeType": "YulIdentifier",
"src": "1278:3:2"
},
"nodeType": "YulFunctionCall",
"src": "1278:10:2"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1290:1:2",
"type": "",
"value": "1"
}
],
"functionName": {
"name": "sub",
"nodeType": "YulIdentifier",
"src": "1274:3:2"
},
"nodeType": "YulFunctionCall",
"src": "1274:18:2"
},
"variables": [
{
"name": "_1",
"nodeType": "YulTypedName",
"src": "1268:2:2",
"type": ""
}
]
},
{
"body": {
"nodeType": "YulBlock",
"src": "1319:16:2",
"statements": [
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1328:1:2",
"type": "",
"value": "0"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1331:1:2",
"type": "",
"value": "0"
}
],
"functionName": {
"name": "revert",
"nodeType": "YulIdentifier",
"src": "1321:6:2"
},
"nodeType": "YulFunctionCall",
"src": "1321:12:2"
},
"nodeType": "YulExpressionStatement",
"src": "1321:12:2"
}
]
},
"condition": {
"arguments": [
{
"name": "offset",
"nodeType": "YulIdentifier",
"src": "1307:6:2"
},
{
"name": "_1",
"nodeType": "YulIdentifier",
"src": "1315:2:2"
}
],
"functionName": {
"name": "gt",
"nodeType": "YulIdentifier",
"src": "1304:2:2"
},
"nodeType": "YulFunctionCall",
"src": "1304:14:2"
},
"nodeType": "YulIf",
"src": "1301:34:2"
},
{
"nodeType": "YulAssignment",
"src": "1344:71:2",
"value": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "1387:9:2"
},
{
"name": "offset",
"nodeType": "YulIdentifier",
"src": "1398:6:2"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "1383:3:2"
},
"nodeType": "YulFunctionCall",
"src": "1383:22:2"
},
{
"name": "dataEnd",
"nodeType": "YulIdentifier",
"src": "1407:7:2"
}
],
"functionName": {
"name": "abi_decode_string_fromMemory",
"nodeType": "YulIdentifier",
"src": "1354:28:2"
},
"nodeType": "YulFunctionCall",
"src": "1354:61:2"
},
"variableNames": [
{
"name": "value0",
"nodeType": "YulIdentifier",
"src": "1344:6:2"
}
]
},
{
"nodeType": "YulVariableDeclaration",
"src": "1424:41:2",
"value": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "1450:9:2"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1461:2:2",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "1446:3:2"
},
"nodeType": "YulFunctionCall",
"src": "1446:18:2"
}
],
"functionName": {
"name": "mload",
"nodeType": "YulIdentifier",
"src": "1440:5:2"
},
"nodeType": "YulFunctionCall",
"src": "1440:25:2"
},
"variables": [
{
"name": "offset_1",
"nodeType": "YulTypedName",
"src": "1428:8:2",
"type": ""
}
]
},
{
"body": {
"nodeType": "YulBlock",
"src": "1494:16:2",
"statements": [
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1503:1:2",
"type": "",
"value": "0"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1506:1:2",
"type": "",
"value": "0"
}
],
"functionName": {
"name": "revert",
"nodeType": "YulIdentifier",
"src": "1496:6:2"
},
"nodeType": "YulFunctionCall",
"src": "1496:12:2"
},
"nodeType": "YulExpressionStatement",
"src": "1496:12:2"
}
]
},
"condition": {
"arguments": [
{
"name": "offset_1",
"nodeType": "YulIdentifier",
"src": "1480:8:2"
},
{
"name": "_1",
"nodeType": "YulIdentifier",
"src": "1490:2:2"
}
],
"functionName": {
"name": "gt",
"nodeType": "YulIdentifier",
"src": "1477:2:2"
},
"nodeType": "YulFunctionCall",
"src": "1477:16:2"
},
"nodeType": "YulIf",
"src": "1474:36:2"
},
{
"nodeType": "YulAssignment",
"src": "1519:73:2",
"value": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "1562:9:2"
},
{
"name": "offset_1",
"nodeType": "YulIdentifier",
"src": "1573:8:2"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "1558:3:2"
},
"nodeType": "YulFunctionCall",
"src": "1558:24:2"
},
{
"name": "dataEnd",
"nodeType": "YulIdentifier",
"src": "1584:7:2"
}
],
"functionName": {
"name": "abi_decode_string_fromMemory",
"nodeType": "YulIdentifier",
"src": "1529:28:2"
},
"nodeType": "YulFunctionCall",
"src": "1529:63:2"
},
"variableNames": [
{
"name": "value1",
"nodeType": "YulIdentifier",
"src": "1519:6:2"
}
]
}
]
},
"name": "abi_decode_tuple_t_string_memory_ptrt_string_memory_ptr_fromMemory",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "headStart",
"nodeType": "YulTypedName",
"src": "1112:9:2",
"type": ""
},
{
"name": "dataEnd",
"nodeType": "YulTypedName",
"src": "1123:7:2",
"type": ""
}
],
"returnVariables": [
{
"name": "value0",
"nodeType": "YulTypedName",
"src": "1135:6:2",
"type": ""
},
{
"name": "value1",
"nodeType": "YulTypedName",
"src": "1143:6:2",
"type": ""
}
],
"src": "1036:562:2"
},
{
"body": {
"nodeType": "YulBlock",
"src": "1658:325:2",
"statements": [
{
"nodeType": "YulAssignment",
"src": "1668:22:2",
"value": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1682:1:2",
"type": "",
"value": "1"
},
{
"name": "data",
"nodeType": "YulIdentifier",
"src": "1685:4:2"
}
],
"functionName": {
"name": "shr",
"nodeType": "YulIdentifier",
"src": "1678:3:2"
},
"nodeType": "YulFunctionCall",
"src": "1678:12:2"
},
"variableNames": [
{
"name": "length",
"nodeType": "YulIdentifier",
"src": "1668:6:2"
}
]
},
{
"nodeType": "YulVariableDeclaration",
"src": "1699:38:2",
"value": {
"arguments": [
{
"name": "data",
"nodeType": "YulIdentifier",
"src": "1729:4:2"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1735:1:2",
"type": "",
"value": "1"
}
],
"functionName": {
"name": "and",
"nodeType": "YulIdentifier",
"src": "1725:3:2"
},
"nodeType": "YulFunctionCall",
"src": "1725:12:2"
},
"variables": [
{
"name": "outOfPlaceEncoding",
"nodeType": "YulTypedName",
"src": "1703:18:2",
"type": ""
}
]
},
{
"body": {
"nodeType": "YulBlock",
"src": "1776:31:2",
"statements": [
{
"nodeType": "YulAssignment",
"src": "1778:27:2",
"value": {
"arguments": [
{
"name": "length",
"nodeType": "YulIdentifier",
"src": "1792:6:2"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1800:4:2",
"type": "",
"value": "0x7f"
}
],
"functionName": {
"name": "and",
"nodeType": "YulIdentifier",
"src": "1788:3:2"
},
"nodeType": "YulFunctionCall",
"src": "1788:17:2"
},
"variableNames": [
{
"name": "length",
"nodeType": "YulIdentifier",
"src": "1778:6:2"
}
]
}
]
},
"condition": {
"arguments": [
{
"name": "outOfPlaceEncoding",
"nodeType": "YulIdentifier",
"src": "1756:18:2"
}
],
"functionName": {
"name": "iszero",
"nodeType": "YulIdentifier",
"src": "1749:6:2"
},
"nodeType": "YulFunctionCall",
"src": "1749:26:2"
},
"nodeType": "YulIf",
"src": "1746:61:2"
},
{
"body": {
"nodeType": "YulBlock",
"src": "1866:111:2",
"statements": [
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1887:1:2",
"type": "",
"value": "0"
},
{
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1894:3:2",
"type": "",
"value": "224"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1899:10:2",
"type": "",
"value": "0x4e487b71"
}
],
"functionName": {
"name": "shl",
"nodeType": "YulIdentifier",
"src": "1890:3:2"
},
"nodeType": "YulFunctionCall",
"src": "1890:20:2"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "1880:6:2"
},
"nodeType": "YulFunctionCall",
"src": "1880:31:2"
},
"nodeType": "YulExpressionStatement",
"src": "1880:31:2"
},
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1931:1:2",
"type": "",
"value": "4"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1934:4:2",
"type": "",
"value": "0x22"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "1924:6:2"
},
"nodeType": "YulFunctionCall",
"src": "1924:15:2"
},
"nodeType": "YulExpressionStatement",
"src": "1924:15:2"
},
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1959:1:2",
"type": "",
"value": "0"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1962:4:2",
"type": "",
"value": "0x24"
}
],
"functionName": {
"name": "revert",
"nodeType": "YulIdentifier",
"src": "1952:6:2"
},
"nodeType": "YulFunctionCall",
"src": "1952:15:2"
},
"nodeType": "YulExpressionStatement",
"src": "1952:15:2"
}
]
},
"condition": {
"arguments": [
{
"name": "outOfPlaceEncoding",
"nodeType": "YulIdentifier",
"src": "1822:18:2"
},
{
"arguments": [
{
"name": "length",
"nodeType": "YulIdentifier",
"src": "1845:6:2"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1853:2:2",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "lt",
"nodeType": "YulIdentifier",
"src": "1842:2:2"
},
"nodeType": "YulFunctionCall",
"src": "1842:14:2"
}
],
"functionName": {
"name": "eq",
"nodeType": "YulIdentifier",
"src": "1819:2:2"
},
"nodeType": "YulFunctionCall",
"src": "1819:38:2"
},
"nodeType": "YulIf",
"src": "1816:161:2"
}
]
},
"name": "extract_byte_array_length",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "data",
"nodeType": "YulTypedName",
"src": "1638:4:2",
"type": ""
}
],
"returnVariables": [
{
"name": "length",
"nodeType": "YulTypedName",
"src": "1647:6:2",
"type": ""
}
],
"src": "1603:380:2"
}
]
},
"contents": "{\n { }\n function panic_error_0x41()\n {\n mstore(0, shl(224, 0x4e487b71))\n mstore(4, 0x41)\n revert(0, 0x24)\n }\n function abi_decode_string_fromMemory(offset, end) -> array\n {\n if iszero(slt(add(offset, 0x1f), end)) { revert(0, 0) }\n let _1 := mload(offset)\n let _2 := sub(shl(64, 1), 1)\n if gt(_1, _2) { panic_error_0x41() }\n let _3 := not(31)\n let memPtr := mload(64)\n let newFreePtr := add(memPtr, and(add(and(add(_1, 0x1f), _3), 63), _3))\n if or(gt(newFreePtr, _2), lt(newFreePtr, memPtr)) { panic_error_0x41() }\n mstore(64, newFreePtr)\n mstore(memPtr, _1)\n let _4 := 0x20\n if gt(add(add(offset, _1), _4), end) { revert(0, 0) }\n let i := 0\n for { } lt(i, _1) { i := add(i, _4) }\n {\n mstore(add(add(memPtr, i), _4), mload(add(add(offset, i), _4)))\n }\n if gt(i, _1)\n {\n mstore(add(add(memPtr, _1), _4), 0)\n }\n array := memPtr\n }\n function abi_decode_tuple_t_string_memory_ptrt_string_memory_ptr_fromMemory(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let offset := mload(headStart)\n let _1 := sub(shl(64, 1), 1)\n if gt(offset, _1) { revert(0, 0) }\n value0 := abi_decode_string_fromMemory(add(headStart, offset), dataEnd)\n let offset_1 := mload(add(headStart, 32))\n if gt(offset_1, _1) { revert(0, 0) }\n value1 := abi_decode_string_fromMemory(add(headStart, offset_1), dataEnd)\n }\n function extract_byte_array_length(data) -> length\n {\n length := shr(1, data)\n let outOfPlaceEncoding := and(data, 1)\n if iszero(outOfPlaceEncoding) { length := and(length, 0x7f) }\n if eq(outOfPlaceEncoding, lt(length, 32))\n {\n mstore(0, shl(224, 0x4e487b71))\n mstore(4, 0x22)\n revert(0, 0x24)\n }\n }\n}",
"id": 2,
"language": "Yul",
"name": "#utility.yul"
}
],
"linkReferences": {},
"object": "60806040523480156200001157600080fd5b5060405162000bb838038062000bb88339810160408190526200003491620001e8565b81516200004990600390602085019062000075565b5080516200005f90600490602084019062000075565b50506005805460ff19166012179055506200028f565b828054620000839062000252565b90600052602060002090601f016020900481019282620000a75760008555620000f2565b82601f10620000c257805160ff1916838001178555620000f2565b82800160010185558215620000f2579182015b82811115620000f2578251825591602001919060010190620000d5565b506200010092915062000104565b5090565b5b8082111562000100576000815560010162000105565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200014357600080fd5b81516001600160401b03808211156200016057620001606200011b565b604051601f8301601f19908116603f011681019082821181831017156200018b576200018b6200011b565b81604052838152602092508683858801011115620001a857600080fd5b600091505b83821015620001cc5785820183015181830184015290820190620001ad565b83821115620001de5760008385830101525b9695505050505050565b60008060408385031215620001fc57600080fd5b82516001600160401b03808211156200021457600080fd5b620002228683870162000131565b935060208501519150808211156200023957600080fd5b50620002488582860162000131565b9150509250929050565b600181811c908216806200026757607f821691505b602082108114156200028957634e487b7160e01b600052602260045260246000fd5b50919050565b610919806200029f6000396000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c80633950935111610071578063395093511461012957806370a082311461013c57806395d89b4114610165578063a457c2d71461016d578063a9059cbb14610180578063dd62ed3e1461019357600080fd5b806306fdde03146100ae578063095ea7b3146100cc57806318160ddd146100ef57806323b872dd14610101578063313ce56714610114575b600080fd5b6100b66101cc565b6040516100c391906106cb565b60405180910390f35b6100df6100da36600461073c565b61025e565b60405190151581526020016100c3565b6002545b6040519081526020016100c3565b6100df61010f366004610766565b610274565b60055460405160ff90911681526020016100c3565b6100df61013736600461073c565b6102dd565b6100f361014a3660046107a2565b6001600160a01b031660009081526020819052604090205490565b6100b6610313565b6100df61017b36600461073c565b610322565b6100df61018e36600461073c565b610371565b6100f36101a13660046107bd565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6060600380546101db906107f0565b80601f0160208091040260200160405190810160405280929190818152602001828054610207906107f0565b80156102545780601f1061022957610100808354040283529160200191610254565b820191906000526020600020905b81548152906001019060200180831161023757829003601f168201915b5050505050905090565b600061026b33848461037e565b50600192915050565b60006102818484846104a8565b6102d384336102ce85604051806060016040528060288152602001610897602891396001600160a01b038a166000908152600160209081526040808320338452909152902054919061062b565b61037e565b5060019392505050565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161026b9185906102ce9086610665565b6060600480546101db906107f0565b600061026b33846102ce856040518060600160405280602581526020016108bf602591393360009081526001602090815260408083206001600160a01b038d168452909152902054919061062b565b600061026b3384846104a8565b6001600160a01b0383166103e55760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084015b60405180910390fd5b6001600160a01b0382166104465760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016103dc565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b03831661050c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016103dc565b6001600160a01b03821661056e5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016103dc565b6105ab81604051806060016040528060268152602001610871602691396001600160a01b038616600090815260208190526040902054919061062b565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546105da9082610665565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910161049b565b6000818484111561064f5760405162461bcd60e51b81526004016103dc91906106cb565b50600061065c8486610841565b95945050505050565b6000806106728385610858565b9050838110156106c45760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016103dc565b9392505050565b600060208083528351808285015260005b818110156106f8578581018301518582016040015282016106dc565b8181111561070a576000604083870101525b50601f01601f1916929092016040019392505050565b80356001600160a01b038116811461073757600080fd5b919050565b6000806040838503121561074f57600080fd5b61075883610720565b946020939093013593505050565b60008060006060848603121561077b57600080fd5b61078484610720565b925061079260208501610720565b9150604084013590509250925092565b6000602082840312156107b457600080fd5b6106c482610720565b600080604083850312156107d057600080fd5b6107d983610720565b91506107e760208401610720565b90509250929050565b600181811c9082168061080457607f821691505b6020821081141561082557634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6000828210156108535761085361082b565b500390565b6000821982111561086b5761086b61082b565b50019056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220eafc27e9469593adb562edb03d0cba1fd8631b512f6cd7f3a5eefe24ff94a91364736f6c634300080c0033",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0xBB8 CODESIZE SUB DUP1 PUSH3 0xBB8 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH3 0x34 SWAP2 PUSH3 0x1E8 JUMP JUMPDEST DUP2 MLOAD PUSH3 0x49 SWAP1 PUSH1 0x3 SWAP1 PUSH1 0x20 DUP6 ADD SWAP1 PUSH3 0x75 JUMP JUMPDEST POP DUP1 MLOAD PUSH3 0x5F SWAP1 PUSH1 0x4 SWAP1 PUSH1 0x20 DUP5 ADD SWAP1 PUSH3 0x75 JUMP JUMPDEST POP POP PUSH1 0x5 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x12 OR SWAP1 SSTORE POP PUSH3 0x28F JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH3 0x83 SWAP1 PUSH3 0x252 JUMP JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH3 0xA7 JUMPI PUSH1 0x0 DUP6 SSTORE PUSH3 0xF2 JUMP JUMPDEST DUP3 PUSH1 0x1F LT PUSH3 0xC2 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH3 0xF2 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH3 0xF2 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH3 0xF2 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH3 0xD5 JUMP JUMPDEST POP PUSH3 0x100 SWAP3 SWAP2 POP PUSH3 0x104 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST JUMPDEST DUP1 DUP3 GT ISZERO PUSH3 0x100 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH3 0x105 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH3 0x143 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH3 0x160 JUMPI PUSH3 0x160 PUSH3 0x11B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP4 ADD PUSH1 0x1F NOT SWAP1 DUP2 AND PUSH1 0x3F ADD AND DUP2 ADD SWAP1 DUP3 DUP3 GT DUP2 DUP4 LT OR ISZERO PUSH3 0x18B JUMPI PUSH3 0x18B PUSH3 0x11B JUMP JUMPDEST DUP2 PUSH1 0x40 MSTORE DUP4 DUP2 MSTORE PUSH1 0x20 SWAP3 POP DUP7 DUP4 DUP6 DUP9 ADD ADD GT ISZERO PUSH3 0x1A8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 SWAP2 POP JUMPDEST DUP4 DUP3 LT ISZERO PUSH3 0x1CC JUMPI DUP6 DUP3 ADD DUP4 ADD MLOAD DUP2 DUP4 ADD DUP5 ADD MSTORE SWAP1 DUP3 ADD SWAP1 PUSH3 0x1AD JUMP JUMPDEST DUP4 DUP3 GT ISZERO PUSH3 0x1DE JUMPI PUSH1 0x0 DUP4 DUP6 DUP4 ADD ADD MSTORE JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH3 0x1FC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH3 0x214 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH3 0x222 DUP7 DUP4 DUP8 ADD PUSH3 0x131 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD MLOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH3 0x239 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH3 0x248 DUP6 DUP3 DUP7 ADD PUSH3 0x131 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x1 DUP2 DUP2 SHR SWAP1 DUP3 AND DUP1 PUSH3 0x267 JUMPI PUSH1 0x7F DUP3 AND SWAP2 POP JUMPDEST PUSH1 0x20 DUP3 LT DUP2 EQ ISZERO PUSH3 0x289 JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x919 DUP1 PUSH3 0x29F PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0xA9 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x39509351 GT PUSH2 0x71 JUMPI DUP1 PUSH4 0x39509351 EQ PUSH2 0x129 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x13C JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x165 JUMPI DUP1 PUSH4 0xA457C2D7 EQ PUSH2 0x16D JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x180 JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x193 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0xAE JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0xCC JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0xEF JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x101 JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x114 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xB6 PUSH2 0x1CC JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xC3 SWAP2 SWAP1 PUSH2 0x6CB JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xDF PUSH2 0xDA CALLDATASIZE PUSH1 0x4 PUSH2 0x73C JUMP JUMPDEST PUSH2 0x25E JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xC3 JUMP JUMPDEST PUSH1 0x2 SLOAD JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xC3 JUMP JUMPDEST PUSH2 0xDF PUSH2 0x10F CALLDATASIZE PUSH1 0x4 PUSH2 0x766 JUMP JUMPDEST PUSH2 0x274 JUMP JUMPDEST PUSH1 0x5 SLOAD PUSH1 0x40 MLOAD PUSH1 0xFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xC3 JUMP JUMPDEST PUSH2 0xDF PUSH2 0x137 CALLDATASIZE PUSH1 0x4 PUSH2 0x73C JUMP JUMPDEST PUSH2 0x2DD JUMP JUMPDEST PUSH2 0xF3 PUSH2 0x14A CALLDATASIZE PUSH1 0x4 PUSH2 0x7A2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH2 0xB6 PUSH2 0x313 JUMP JUMPDEST PUSH2 0xDF PUSH2 0x17B CALLDATASIZE PUSH1 0x4 PUSH2 0x73C JUMP JUMPDEST PUSH2 0x322 JUMP JUMPDEST PUSH2 0xDF PUSH2 0x18E CALLDATASIZE PUSH1 0x4 PUSH2 0x73C JUMP JUMPDEST PUSH2 0x371 JUMP JUMPDEST PUSH2 0xF3 PUSH2 0x1A1 CALLDATASIZE PUSH1 0x4 PUSH2 0x7BD JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP5 AND DUP3 MSTORE SWAP2 SWAP1 SWAP2 MSTORE KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x3 DUP1 SLOAD PUSH2 0x1DB SWAP1 PUSH2 0x7F0 JUMP JUMPDEST DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH2 0x207 SWAP1 PUSH2 0x7F0 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x254 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x229 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x254 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x237 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x26B CALLER DUP5 DUP5 PUSH2 0x37E JUMP JUMPDEST POP PUSH1 0x1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x281 DUP5 DUP5 DUP5 PUSH2 0x4A8 JUMP JUMPDEST PUSH2 0x2D3 DUP5 CALLER PUSH2 0x2CE DUP6 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x28 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x897 PUSH1 0x28 SWAP2 CODECOPY PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD SWAP2 SWAP1 PUSH2 0x62B JUMP JUMPDEST PUSH2 0x37E JUMP JUMPDEST POP PUSH1 0x1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE DUP2 KECCAK256 SLOAD SWAP1 SWAP2 PUSH2 0x26B SWAP2 DUP6 SWAP1 PUSH2 0x2CE SWAP1 DUP7 PUSH2 0x665 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x4 DUP1 SLOAD PUSH2 0x1DB SWAP1 PUSH2 0x7F0 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x26B CALLER DUP5 PUSH2 0x2CE DUP6 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x25 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x8BF PUSH1 0x25 SWAP2 CODECOPY CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP14 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD SWAP2 SWAP1 PUSH2 0x62B JUMP JUMPDEST PUSH1 0x0 PUSH2 0x26B CALLER DUP5 DUP5 PUSH2 0x4A8 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH2 0x3E5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP1 DUP3 ADD MSTORE PUSH32 0x45524332303A20617070726F76652066726F6D20746865207A65726F20616464 PUSH1 0x44 DUP3 ADD MSTORE PUSH4 0x72657373 PUSH1 0xE0 SHL PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x446 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x22 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332303A20617070726F766520746F20746865207A65726F206164647265 PUSH1 0x44 DUP3 ADD MSTORE PUSH2 0x7373 PUSH1 0xF0 SHL PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x3DC JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP8 AND DUP1 DUP5 MSTORE SWAP5 DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP6 SWAP1 SSTORE SWAP1 MLOAD DUP5 DUP2 MSTORE PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP2 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH2 0x50C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x25 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332303A207472616E736665722066726F6D20746865207A65726F206164 PUSH1 0x44 DUP3 ADD MSTORE PUSH5 0x6472657373 PUSH1 0xD8 SHL PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x3DC JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x56E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x23 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332303A207472616E7366657220746F20746865207A65726F2061646472 PUSH1 0x44 DUP3 ADD MSTORE PUSH3 0x657373 PUSH1 0xE8 SHL PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x3DC JUMP JUMPDEST PUSH2 0x5AB DUP2 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x871 PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP2 SWAP1 PUSH2 0x62B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP1 DUP5 AND DUP2 MSTORE KECCAK256 SLOAD PUSH2 0x5DA SWAP1 DUP3 PUSH2 0x665 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SWAP5 SWAP1 SWAP5 SSTORE MLOAD DUP5 DUP2 MSTORE SWAP1 SWAP3 SWAP2 DUP7 AND SWAP2 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP2 ADD PUSH2 0x49B JUMP JUMPDEST PUSH1 0x0 DUP2 DUP5 DUP5 GT ISZERO PUSH2 0x64F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3DC SWAP2 SWAP1 PUSH2 0x6CB JUMP JUMPDEST POP PUSH1 0x0 PUSH2 0x65C DUP5 DUP7 PUSH2 0x841 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x672 DUP4 DUP6 PUSH2 0x858 JUMP JUMPDEST SWAP1 POP DUP4 DUP2 LT ISZERO PUSH2 0x6C4 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x3DC JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP1 DUP4 MSTORE DUP4 MLOAD DUP1 DUP3 DUP6 ADD MSTORE PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x6F8 JUMPI DUP6 DUP2 ADD DUP4 ADD MLOAD DUP6 DUP3 ADD PUSH1 0x40 ADD MSTORE DUP3 ADD PUSH2 0x6DC JUMP JUMPDEST DUP2 DUP2 GT ISZERO PUSH2 0x70A JUMPI PUSH1 0x0 PUSH1 0x40 DUP4 DUP8 ADD ADD MSTORE JUMPDEST POP PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x40 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x737 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x74F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x758 DUP4 PUSH2 0x720 JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x77B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x784 DUP5 PUSH2 0x720 JUMP JUMPDEST SWAP3 POP PUSH2 0x792 PUSH1 0x20 DUP6 ADD PUSH2 0x720 JUMP JUMPDEST SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD SWAP1 POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x7B4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x6C4 DUP3 PUSH2 0x720 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x7D0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x7D9 DUP4 PUSH2 0x720 JUMP JUMPDEST SWAP2 POP PUSH2 0x7E7 PUSH1 0x20 DUP5 ADD PUSH2 0x720 JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x1 DUP2 DUP2 SHR SWAP1 DUP3 AND DUP1 PUSH2 0x804 JUMPI PUSH1 0x7F DUP3 AND SWAP2 POP JUMPDEST PUSH1 0x20 DUP3 LT DUP2 EQ ISZERO PUSH2 0x825 JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP3 DUP3 LT ISZERO PUSH2 0x853 JUMPI PUSH2 0x853 PUSH2 0x82B JUMP JUMPDEST POP SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 NOT DUP3 GT ISZERO PUSH2 0x86B JUMPI PUSH2 0x86B PUSH2 0x82B JUMP JUMPDEST POP ADD SWAP1 JUMP INVALID GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 PUSH21 0x72616E7366657220616D6F756E7420657863656564 PUSH20 0x2062616C616E636545524332303A207472616E73 PUSH7 0x657220616D6F75 PUSH15 0x74206578636565647320616C6C6F77 PUSH2 0x6E63 PUSH6 0x45524332303A KECCAK256 PUSH5 0x6563726561 PUSH20 0x656420616C6C6F77616E63652062656C6F77207A PUSH6 0x726FA2646970 PUSH7 0x7358221220EAFC 0x27 0xE9 CHAINID SWAP6 SWAP4 0xAD 0xB5 PUSH3 0xEDB03D 0xC 0xBA 0x1F 0xD8 PUSH4 0x1B512F6C 0xD7 RETURN 0xA5 0xEE INVALID 0x24 SELFDESTRUCT SWAP5 0xA9 SGT PUSH5 0x736F6C6343 STOP ADDMOD 0xC STOP CALLER ",
"sourceMap": "12536:9619:0:-:0;;;13192:133;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13256:12;;;;:5;;:12;;;;;:::i;:::-;-1:-1:-1;13278:16:0;;;;:7;;:16;;;;;:::i;:::-;-1:-1:-1;;13304:9:0;:14;;-1:-1:-1;;13304:14:0;13316:2;13304:14;;;-1:-1:-1;12536:9619:0;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12536:9619:0;;;-1:-1:-1;12536:9619:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:127:2;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:885;200:5;253:3;246:4;238:6;234:17;230:27;220:55;;271:1;268;261:12;220:55;294:13;;-1:-1:-1;;;;;356:10:2;;;353:36;;;369:18;;:::i;:::-;444:2;438:9;412:2;498:13;;-1:-1:-1;;494:22:2;;;518:2;490:31;486:40;474:53;;;542:18;;;562:22;;;539:46;536:72;;;588:18;;:::i;:::-;628:10;624:2;617:22;663:2;655:6;648:18;685:4;675:14;;730:3;725:2;720;712:6;708:15;704:24;701:33;698:53;;;747:1;744;737:12;698:53;769:1;760:10;;779:133;793:2;790:1;787:9;779:133;;;881:14;;;877:23;;871:30;850:14;;;846:23;;839:63;804:10;;;;779:133;;;930:2;927:1;924:9;921:80;;;989:1;984:2;979;971:6;967:15;963:24;956:35;921:80;1019:6;146:885;-1:-1:-1;;;;;;146:885:2:o;1036:562::-;1135:6;1143;1196:2;1184:9;1175:7;1171:23;1167:32;1164:52;;;1212:1;1209;1202:12;1164:52;1239:16;;-1:-1:-1;;;;;1304:14:2;;;1301:34;;;1331:1;1328;1321:12;1301:34;1354:61;1407:7;1398:6;1387:9;1383:22;1354:61;:::i;:::-;1344:71;;1461:2;1450:9;1446:18;1440:25;1424:41;;1490:2;1480:8;1477:16;1474:36;;;1506:1;1503;1496:12;1474:36;;1529:63;1584:7;1573:8;1562:9;1558:24;1529:63;:::i;:::-;1519:73;;;1036:562;;;;;:::o;1603:380::-;1682:1;1678:12;;;;1725;;;1746:61;;1800:4;1792:6;1788:17;1778:27;;1746:61;1853:2;1845:6;1842:14;1822:18;1819:38;1816:161;;;1899:10;1894:3;1890:20;1887:1;1880:31;1934:4;1931:1;1924:15;1962:4;1959:1;1952:15;1816:161;;1603:380;;;:::o;:::-;12536:9619:0;;;;;;"
},
"deployedBytecode": {
"functionDebugData": {
"@_approve_865": {
"entryPoint": 894,
"id": 865,
"parameterSlots": 3,
"returnSlots": 0
},
"@_beforeTokenTransfer_887": {
"entryPoint": null,
"id": 887,
"parameterSlots": 3,
"returnSlots": 0
},
"@_transfer_709": {
"entryPoint": 1192,
"id": 709,
"parameterSlots": 3,
"returnSlots": 0
},
"@add_29": {
"entryPoint": 1637,
"id": 29,
"parameterSlots": 2,
"returnSlots": 1
},
"@allowance_527": {
"entryPoint": null,
"id": 527,
"parameterSlots": 2,
"returnSlots": 1
},
"@approve_548": {
"entryPoint": 606,
"id": 548,
"parameterSlots": 2,
"returnSlots": 1
},
"@balanceOf_488": {
"entryPoint": null,
"id": 488,
"parameterSlots": 1,
"returnSlots": 1
},
"@decimals_464": {
"entryPoint": null,
"id": 464,
"parameterSlots": 0,
"returnSlots": 1
},
"@decreaseAllowance_643": {
"entryPoint": 802,
"id": 643,
"parameterSlots": 2,
"returnSlots": 1
},
"@increaseAllowance_614": {
"entryPoint": 733,
"id": 614,
"parameterSlots": 2,
"returnSlots": 1
},
"@name_446": {
"entryPoint": 460,
"id": 446,
"parameterSlots": 0,
"returnSlots": 1
},
"@sub_74": {
"entryPoint": 1579,
"id": 74,
"parameterSlots": 3,
"returnSlots": 1
},
"@symbol_455": {
"entryPoint": 787,
"id": 455,
"parameterSlots": 0,
"returnSlots": 1
},
"@totalSupply_474": {
"entryPoint": null,
"id": 474,
"parameterSlots": 0,
"returnSlots": 1
},
"@transferFrom_586": {
"entryPoint": 628,
"id": 586,
"parameterSlots": 3,
"returnSlots": 1
},
"@transfer_509": {
"entryPoint": 881,
"id": 509,
"parameterSlots": 2,
"returnSlots": 1
},
"abi_decode_address": {
"entryPoint": 1824,
"id": null,
"parameterSlots": 1,
"returnSlots": 1
},
"abi_decode_tuple_t_address": {
"entryPoint": 1954,
"id": null,
"parameterSlots": 2,
"returnSlots": 1
},
"abi_decode_tuple_t_addresst_address": {
"entryPoint": 1981,
"id": null,
"parameterSlots": 2,
"returnSlots": 2
},
"abi_decode_tuple_t_addresst_addresst_uint256": {
"entryPoint": 1894,
"id": null,
"parameterSlots": 2,
"returnSlots": 3
},
"abi_decode_tuple_t_addresst_uint256": {
"entryPoint": 1852,
"id": null,
"parameterSlots": 2,
"returnSlots": 2
},
"abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed": {
"entryPoint": null,
"id": null,
"parameterSlots": 2,
"returnSlots": 1
},
"abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed": {
"entryPoint": 1739,
"id": null,
"parameterSlots": 2,
"returnSlots": 1
},
"abi_encode_tuple_t_stringliteral_0557e210f7a69a685100a7e4e3d0a7024c546085cee28910fd17d0b081d9516f__to_t_string_memory_ptr__fromStack_reversed": {
"entryPoint": null,
"id": null,
"parameterSlots": 1,
"returnSlots": 1
},
"abi_encode_tuple_t_stringliteral_24883cc5fe64ace9d0df1893501ecb93c77180f0ff69cca79affb3c316dc8029__to_t_string_memory_ptr__fromStack_reversed": {
"entryPoint": null,
"id": null,
"parameterSlots": 1,
"returnSlots": 1
},
"abi_encode_tuple_t_stringliteral_30cc447bcc13b3e22b45cef0dd9b0b514842d836dd9b6eb384e20dedfb47723a__to_t_string_memory_ptr__fromStack_reversed": {
"entryPoint": null,
"id": null,
"parameterSlots": 1,
"returnSlots": 1
},
"abi_encode_tuple_t_stringliteral_baecc556b46f4ed0f2b4cb599d60785ac8563dd2dc0a5bf12edea1c39e5e1fea__to_t_string_memory_ptr__fromStack_reversed": {
"entryPoint": null,
"id": null,
"parameterSlots": 1,
"returnSlots": 1
},
"abi_encode_tuple_t_stringliteral_c953f4879035ed60e766b34720f656aab5c697b141d924c283124ecedb91c208__to_t_string_memory_ptr__fromStack_reversed": {
"entryPoint": null,
"id": null,
"parameterSlots": 1,
"returnSlots": 1
},
"abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed": {
"entryPoint": null,
"id": null,
"parameterSlots": 2,
"returnSlots": 1
},
"abi_encode_tuple_t_uint8__to_t_uint8__fromStack_reversed": {
"entryPoint": null,
"id": null,
"parameterSlots": 2,
"returnSlots": 1
},
"checked_add_t_uint256": {
"entryPoint": 2136,
"id": null,
"parameterSlots": 2,
"returnSlots": 1
},
"checked_sub_t_uint256": {
"entryPoint": 2113,
"id": null,
"parameterSlots": 2,
"returnSlots": 1
},
"extract_byte_array_length": {
"entryPoint": 2032,
"id": null,
"parameterSlots": 1,
"returnSlots": 1
},
"panic_error_0x11": {
"entryPoint": 2091,
"id": null,
"parameterSlots": 0,
"returnSlots": 0
}
},
"generatedSources": [
{
"ast": {
"nodeType": "YulBlock",
"src": "0:5156:2",
"statements": [
{
"nodeType": "YulBlock",
"src": "6:3:2",
"statements": []
},
{
"body": {
"nodeType": "YulBlock",
"src": "135:476:2",
"statements": [
{
"nodeType": "YulVariableDeclaration",
"src": "145:12:2",
"value": {
"kind": "number",
"nodeType": "YulLiteral",
"src": "155:2:2",
"type": "",
"value": "32"
},
"variables": [
{
"name": "_1",
"nodeType": "YulTypedName",
"src": "149:2:2",
"type": ""
}
]
},
{
"expression": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "173:9:2"
},
{
"name": "_1",
"nodeType": "YulIdentifier",
"src": "184:2:2"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "166:6:2"
},
"nodeType": "YulFunctionCall",
"src": "166:21:2"
},
"nodeType": "YulExpressionStatement",
"src": "166:21:2"
},
{
"nodeType": "YulVariableDeclaration",
"src": "196:27:2",
"value": {
"arguments": [
{
"name": "value0",
"nodeType": "YulIdentifier",
"src": "216:6:2"
}
],
"functionName": {
"name": "mload",
"nodeType": "YulIdentifier",
"src": "210:5:2"
},
"nodeType": "YulFunctionCall",
"src": "210:13:2"
},
"variables": [
{
"name": "length",
"nodeType": "YulTypedName",
"src": "200:6:2",
"type": ""
}
]
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "243:9:2"
},
{
"name": "_1",
"nodeType": "YulIdentifier",
"src": "254:2:2"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "239:3:2"
},
"nodeType": "YulFunctionCall",
"src": "239:18:2"
},
{
"name": "length",
"nodeType": "YulIdentifier",
"src": "259:6:2"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "232:6:2"
},
"nodeType": "YulFunctionCall",
"src": "232:34:2"
},
"nodeType": "YulExpressionStatement",
"src": "232:34:2"
},
{
"nodeType": "YulVariableDeclaration",
"src": "275:10:2",
"value": {
"kind": "number",
"nodeType": "YulLiteral",
"src": "284:1:2",
"type": "",
"value": "0"
},
"variables": [
{
"name": "i",
"nodeType": "YulTypedName",
"src": "279:1:2",
"type": ""
}
]
},
{
"body": {
"nodeType": "YulBlock",
"src": "344:90:2",
"statements": [
{
"expression": {
"arguments": [
{
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "373:9:2"
},
{
"name": "i",
"nodeType": "YulIdentifier",
"src": "384:1:2"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "369:3:2"
},
"nodeType": "YulFunctionCall",
"src": "369:17:2"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "388:2:2",
"type": "",
"value": "64"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "365:3:2"
},
"nodeType": "YulFunctionCall",
"src": "365:26:2"
},
{
"arguments": [
{
"arguments": [
{
"arguments": [
{
"name": "value0",
"nodeType": "YulIdentifier",
"src": "407:6:2"
},
{
"name": "i",
"nodeType": "YulIdentifier",
"src": "415:1:2"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "403:3:2"
},
"nodeType": "YulFunctionCall",
"src": "403:14:2"
},
{
"name": "_1",
"nodeType": "YulIdentifier",
"src": "419:2:2"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "399:3:2"
},
"nodeType": "YulFunctionCall",
"src": "399:23:2"
}
],
"functionName": {
"name": "mload",
"nodeType": "YulIdentifier",
"src": "393:5:2"
},
"nodeType": "YulFunctionCall",
"src": "393:30:2"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "358:6:2"
},
"nodeType": "YulFunctionCall",
"src": "358:66:2"
},
"nodeType": "YulExpressionStatement",
"src": "358:66:2"
}
]
},
"condition": {
"arguments": [
{
"name": "i",
"nodeType": "YulIdentifier",
"src": "305:1:2"
},
{
"name": "length",
"nodeType": "YulIdentifier",
"src": "308:6:2"
}
],
"functionName": {
"name": "lt",
"nodeType": "YulIdentifier",
"src": "302:2:2"
},
"nodeType": "YulFunctionCall",
"src": "302:13:2"
},
"nodeType": "YulForLoop",
"post": {
"nodeType": "YulBlock",
"src": "316:19:2",
"statements": [
{
"nodeType": "YulAssignment",
"src": "318:15:2",
"value": {
"arguments": [
{
"name": "i",
"nodeType": "YulIdentifier",
"src": "327:1:2"
},
{
"name": "_1",
"nodeType": "YulIdentifier",
"src": "330:2:2"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "323:3:2"
},
"nodeType": "YulFunctionCall",
"src": "323:10:2"
},
"variableNames": [
{
"name": "i",
"nodeType": "YulIdentifier",
"src": "318:1:2"
}
]
}
]
},
"pre": {
"nodeType": "YulBlock",
"src": "298:3:2",
"statements": []
},
"src": "294:140:2"
},
{
"body": {
"nodeType": "YulBlock",
"src": "468:66:2",
"statements": [
{
"expression": {
"arguments": [
{
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "497:9:2"
},
{
"name": "length",
"nodeType": "YulIdentifier",
"src": "508:6:2"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "493:3:2"
},
"nodeType": "YulFunctionCall",
"src": "493:22:2"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "517:2:2",
"type": "",
"value": "64"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "489:3:2"
},
"nodeType": "YulFunctionCall",
"src": "489:31:2"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "522:1:2",
"type": "",
"value": "0"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "482:6:2"
},
"nodeType": "YulFunctionCall",
"src": "482:42:2"
},
"nodeType": "YulExpressionStatement",
"src": "482:42:2"
}
]
},
"condition": {
"arguments": [
{
"name": "i",
"nodeType": "YulIdentifier",
"src": "449:1:2"
},
{
"name": "length",
"nodeType": "YulIdentifier",
"src": "452:6:2"
}
],
"functionName": {
"name": "gt",
"nodeType": "YulIdentifier",
"src": "446:2:2"
},
"nodeType": "YulFunctionCall",
"src": "446:13:2"
},
"nodeType": "YulIf",
"src": "443:91:2"
},
{
"nodeType": "YulAssignment",
"src": "543:62:2",
"value": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "559:9:2"
},
{
"arguments": [
{
"arguments": [
{
"name": "length",
"nodeType": "YulIdentifier",
"src": "578:6:2"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "586:2:2",
"type": "",
"value": "31"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "574:3:2"
},
"nodeType": "YulFunctionCall",
"src": "574:15:2"
},
{
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "595:2:2",
"type": "",
"value": "31"
}
],
"functionName": {
"name": "not",
"nodeType": "YulIdentifier",
"src": "591:3:2"
},
"nodeType": "YulFunctionCall",
"src": "591:7:2"
}
],
"functionName": {
"name": "and",
"nodeType": "YulIdentifier",
"src": "570:3:2"
},
"nodeType": "YulFunctionCall",
"src": "570:29:2"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "555:3:2"
},
"nodeType": "YulFunctionCall",
"src": "555:45:2"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "602:2:2",
"type": "",
"value": "64"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "551:3:2"
},
"nodeType": "YulFunctionCall",
"src": "551:54:2"
},
"variableNames": [
{
"name": "tail",
"nodeType": "YulIdentifier",
"src": "543:4:2"
}
]
}
]
},
"name": "abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "headStart",
"nodeType": "YulTypedName",
"src": "104:9:2",
"type": ""
},
{
"name": "value0",
"nodeType": "YulTypedName",
"src": "115:6:2",
"type": ""
}
],
"returnVariables": [
{
"name": "tail",
"nodeType": "YulTypedName",
"src": "126:4:2",
"type": ""
}
],
"src": "14:597:2"
},
{
"body": {
"nodeType": "YulBlock",
"src": "665:124:2",
"statements": [
{
"nodeType": "YulAssignment",
"src": "675:29:2",
"value": {
"arguments": [
{
"name": "offset",
"nodeType": "YulIdentifier",
"src": "697:6:2"
}
],
"functionName": {
"name": "calldataload",
"nodeType": "YulIdentifier",
"src": "684:12:2"
},
"nodeType": "YulFunctionCall",
"src": "684:20:2"
},
"variableNames": [
{
"name": "value",
"nodeType": "YulIdentifier",
"src": "675:5:2"
}
]
},
{
"body": {
"nodeType": "YulBlock",
"src": "767:16:2",
"statements": [
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "776:1:2",
"type": "",
"value": "0"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "779:1:2",
"type": "",
"value": "0"
}
],
"functionName": {
"name": "revert",
"nodeType": "YulIdentifier",
"src": "769:6:2"
},
"nodeType": "YulFunctionCall",
"src": "769:12:2"
},
"nodeType": "YulExpressionStatement",
"src": "769:12:2"
}
]
},
"condition": {
"arguments": [
{
"arguments": [
{
"name": "value",
"nodeType": "YulIdentifier",
"src": "726:5:2"
},
{
"arguments": [
{
"name": "value",
"nodeType": "YulIdentifier",
"src": "737:5:2"
},
{
"arguments": [
{
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "752:3:2",
"type": "",
"value": "160"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "757:1:2",
"type": "",
"value": "1"
}
],
"functionName": {
"name": "shl",
"nodeType": "YulIdentifier",
"src": "748:3:2"
},
"nodeType": "YulFunctionCall",
"src": "748:11:2"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "761:1:2",
"type": "",
"value": "1"
}
],
"functionName": {
"name": "sub",
"nodeType": "YulIdentifier",
"src": "744:3:2"
},
"nodeType": "YulFunctionCall",
"src": "744:19:2"
}
],
"functionName": {
"name": "and",
"nodeType": "YulIdentifier",
"src": "733:3:2"
},
"nodeType": "YulFunctionCall",
"src": "733:31:2"
}
],
"functionName": {
"name": "eq",
"nodeType": "YulIdentifier",
"src": "723:2:2"
},
"nodeType": "YulFunctionCall",
"src": "723:42:2"
}
],
"functionName": {
"name": "iszero",
"nodeType": "YulIdentifier",
"src": "716:6:2"
},
"nodeType": "YulFunctionCall",
"src": "716:50:2"
},
"nodeType": "YulIf",
"src": "713:70:2"
}
]
},
"name": "abi_decode_address",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "offset",
"nodeType": "YulTypedName",
"src": "644:6:2",
"type": ""
}
],
"returnVariables": [
{
"name": "value",
"nodeType": "YulTypedName",
"src": "655:5:2",
"type": ""
}
],
"src": "616:173:2"
},
{
"body": {
"nodeType": "YulBlock",
"src": "881:167:2",
"statements": [
{
"body": {
"nodeType": "YulBlock",
"src": "927:16:2",
"statements": [
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "936:1:2",
"type": "",
"value": "0"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "939:1:2",
"type": "",
"value": "0"
}
],
"functionName": {
"name": "revert",
"nodeType": "YulIdentifier",
"src": "929:6:2"
},
"nodeType": "YulFunctionCall",
"src": "929:12:2"
},
"nodeType": "YulExpressionStatement",
"src": "929:12:2"
}
]
},
"condition": {
"arguments": [
{
"arguments": [
{
"name": "dataEnd",
"nodeType": "YulIdentifier",
"src": "902:7:2"
},
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "911:9:2"
}
],
"functionName": {
"name": "sub",
"nodeType": "YulIdentifier",
"src": "898:3:2"
},
"nodeType": "YulFunctionCall",
"src": "898:23:2"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "923:2:2",
"type": "",
"value": "64"
}
],
"functionName": {
"name": "slt",
"nodeType": "YulIdentifier",
"src": "894:3:2"
},
"nodeType": "YulFunctionCall",
"src": "894:32:2"
},
"nodeType": "YulIf",
"src": "891:52:2"
},
{
"nodeType": "YulAssignment",
"src": "952:39:2",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "981:9:2"
}
],
"functionName": {
"name": "abi_decode_address",
"nodeType": "YulIdentifier",
"src": "962:18:2"
},
"nodeType": "YulFunctionCall",
"src": "962:29:2"
},
"variableNames": [
{
"name": "value0",
"nodeType": "YulIdentifier",
"src": "952:6:2"
}
]
},
{
"nodeType": "YulAssignment",
"src": "1000:42:2",
"value": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "1027:9:2"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1038:2:2",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "1023:3:2"
},
"nodeType": "YulFunctionCall",
"src": "1023:18:2"
}
],
"functionName": {
"name": "calldataload",
"nodeType": "YulIdentifier",
"src": "1010:12:2"
},
"nodeType": "YulFunctionCall",
"src": "1010:32:2"
},
"variableNames": [
{
"name": "value1",
"nodeType": "YulIdentifier",
"src": "1000:6:2"
}
]
}
]
},
"name": "abi_decode_tuple_t_addresst_uint256",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "headStart",
"nodeType": "YulTypedName",
"src": "839:9:2",
"type": ""
},
{
"name": "dataEnd",
"nodeType": "YulTypedName",
"src": "850:7:2",
"type": ""
}
],
"returnVariables": [
{
"name": "value0",
"nodeType": "YulTypedName",
"src": "862:6:2",
"type": ""
},
{
"name": "value1",
"nodeType": "YulTypedName",
"src": "870:6:2",
"type": ""
}
],
"src": "794:254:2"
},
{
"body": {
"nodeType": "YulBlock",
"src": "1148:92:2",
"statements": [
{
"nodeType": "YulAssignment",
"src": "1158:26:2",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "1170:9:2"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1181:2:2",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "1166:3:2"
},
"nodeType": "YulFunctionCall",
"src": "1166:18:2"
},
"variableNames": [
{
"name": "tail",
"nodeType": "YulIdentifier",
"src": "1158:4:2"
}
]
},
{
"expression": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "1200:9:2"
},
{
"arguments": [
{
"arguments": [
{
"name": "value0",
"nodeType": "YulIdentifier",
"src": "1225:6:2"
}
],
"functionName": {
"name": "iszero",
"nodeType": "YulIdentifier",
"src": "1218:6:2"
},
"nodeType": "YulFunctionCall",
"src": "1218:14:2"
}
],
"functionName": {
"name": "iszero",
"nodeType": "YulIdentifier",
"src": "1211:6:2"
},
"nodeType": "YulFunctionCall",
"src": "1211:22:2"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "1193:6:2"
},
"nodeType": "YulFunctionCall",
"src": "1193:41:2"
},
"nodeType": "YulExpressionStatement",
"src": "1193:41:2"
}
]
},
"name": "abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "headStart",
"nodeType": "YulTypedName",
"src": "1117:9:2",
"type": ""
},
{
"name": "value0",
"nodeType": "YulTypedName",
"src": "1128:6:2",
"type": ""
}
],
"returnVariables": [
{
"name": "tail",
"nodeType": "YulTypedName",
"src": "1139:4:2",
"type": ""
}
],
"src": "1053:187:2"
},
{
"body": {
"nodeType": "YulBlock",
"src": "1346:76:2",
"statements": [
{
"nodeType": "YulAssignment",
"src": "1356:26:2",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "1368:9:2"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1379:2:2",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "1364:3:2"
},
"nodeType": "YulFunctionCall",
"src": "1364:18:2"
},
"variableNames": [
{
"name": "tail",
"nodeType": "YulIdentifier",
"src": "1356:4:2"
}
]
},
{
"expression": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "1398:9:2"
},
{
"name": "value0",
"nodeType": "YulIdentifier",
"src": "1409:6:2"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "1391:6:2"
},
"nodeType": "YulFunctionCall",
"src": "1391:25:2"
},
"nodeType": "YulExpressionStatement",
"src": "1391:25:2"
}
]
},
"name": "abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "headStart",
"nodeType": "YulTypedName",
"src": "1315:9:2",
"type": ""
},
{
"name": "value0",
"nodeType": "YulTypedName",
"src": "1326:6:2",
"type": ""
}
],
"returnVariables": [
{
"name": "tail",
"nodeType": "YulTypedName",
"src": "1337:4:2",
"type": ""
}
],
"src": "1245:177:2"
},
{
"body": {
"nodeType": "YulBlock",
"src": "1531:224:2",
"statements": [
{
"body": {
"nodeType": "YulBlock",
"src": "1577:16:2",
"statements": [
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1586:1:2",
"type": "",
"value": "0"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1589:1:2",
"type": "",
"value": "0"
}
],
"functionName": {
"name": "revert",
"nodeType": "YulIdentifier",
"src": "1579:6:2"
},
"nodeType": "YulFunctionCall",
"src": "1579:12:2"
},
"nodeType": "YulExpressionStatement",
"src": "1579:12:2"
}
]
},
"condition": {
"arguments": [
{
"arguments": [
{
"name": "dataEnd",
"nodeType": "YulIdentifier",
"src": "1552:7:2"
},
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "1561:9:2"
}
],
"functionName": {
"name": "sub",
"nodeType": "YulIdentifier",
"src": "1548:3:2"
},
"nodeType": "YulFunctionCall",
"src": "1548:23:2"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1573:2:2",
"type": "",
"value": "96"
}
],
"functionName": {
"name": "slt",
"nodeType": "YulIdentifier",
"src": "1544:3:2"
},
"nodeType": "YulFunctionCall",
"src": "1544:32:2"
},
"nodeType": "YulIf",
"src": "1541:52:2"
},
{
"nodeType": "YulAssignment",
"src": "1602:39:2",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "1631:9:2"
}
],
"functionName": {
"name": "abi_decode_address",
"nodeType": "YulIdentifier",
"src": "1612:18:2"
},
"nodeType": "YulFunctionCall",
"src": "1612:29:2"
},
"variableNames": [
{
"name": "value0",
"nodeType": "YulIdentifier",
"src": "1602:6:2"
}
]
},
{
"nodeType": "YulAssignment",
"src": "1650:48:2",
"value": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "1683:9:2"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1694:2:2",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "1679:3:2"
},
"nodeType": "YulFunctionCall",
"src": "1679:18:2"
}
],
"functionName": {
"name": "abi_decode_address",
"nodeType": "YulIdentifier",
"src": "1660:18:2"
},
"nodeType": "YulFunctionCall",
"src": "1660:38:2"
},
"variableNames": [
{
"name": "value1",
"nodeType": "YulIdentifier",
"src": "1650:6:2"
}
]
},
{
"nodeType": "YulAssignment",
"src": "1707:42:2",
"value": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "1734:9:2"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1745:2:2",
"type": "",
"value": "64"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "1730:3:2"
},
"nodeType": "YulFunctionCall",
"src": "1730:18:2"
}
],
"functionName": {
"name": "calldataload",
"nodeType": "YulIdentifier",
"src": "1717:12:2"
},
"nodeType": "YulFunctionCall",
"src": "1717:32:2"
},
"variableNames": [
{
"name": "value2",
"nodeType": "YulIdentifier",
"src": "1707:6:2"
}
]
}
]
},
"name": "abi_decode_tuple_t_addresst_addresst_uint256",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "headStart",
"nodeType": "YulTypedName",
"src": "1481:9:2",
"type": ""
},
{
"name": "dataEnd",
"nodeType": "YulTypedName",
"src": "1492:7:2",
"type": ""
}
],
"returnVariables": [
{
"name": "value0",
"nodeType": "YulTypedName",
"src": "1504:6:2",
"type": ""
},
{
"name": "value1",
"nodeType": "YulTypedName",
"src": "1512:6:2",
"type": ""
},
{
"name": "value2",
"nodeType": "YulTypedName",
"src": "1520:6:2",
"type": ""
}
],
"src": "1427:328:2"
},
{
"body": {
"nodeType": "YulBlock",
"src": "1857:87:2",
"statements": [
{
"nodeType": "YulAssignment",
"src": "1867:26:2",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "1879:9:2"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1890:2:2",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "1875:3:2"
},
"nodeType": "YulFunctionCall",
"src": "1875:18:2"
},
"variableNames": [
{
"name": "tail",
"nodeType": "YulIdentifier",
"src": "1867:4:2"
}
]
},
{
"expression": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "1909:9:2"
},
{
"arguments": [
{
"name": "value0",
"nodeType": "YulIdentifier",
"src": "1924:6:2"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1932:4:2",
"type": "",
"value": "0xff"
}
],
"functionName": {
"name": "and",
"nodeType": "YulIdentifier",
"src": "1920:3:2"
},
"nodeType": "YulFunctionCall",
"src": "1920:17:2"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "1902:6:2"
},
"nodeType": "YulFunctionCall",
"src": "1902:36:2"
},
"nodeType": "YulExpressionStatement",
"src": "1902:36:2"
}
]
},
"name": "abi_encode_tuple_t_uint8__to_t_uint8__fromStack_reversed",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "headStart",
"nodeType": "YulTypedName",
"src": "1826:9:2",
"type": ""
},
{
"name": "value0",
"nodeType": "YulTypedName",
"src": "1837:6:2",
"type": ""
}
],
"returnVariables": [
{
"name": "tail",
"nodeType": "YulTypedName",
"src": "1848:4:2",
"type": ""
}
],
"src": "1760:184:2"
},
{
"body": {
"nodeType": "YulBlock",
"src": "2019:116:2",
"statements": [
{
"body": {
"nodeType": "YulBlock",
"src": "2065:16:2",
"statements": [
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2074:1:2",
"type": "",
"value": "0"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2077:1:2",
"type": "",
"value": "0"
}
],
"functionName": {
"name": "revert",
"nodeType": "YulIdentifier",
"src": "2067:6:2"
},
"nodeType": "YulFunctionCall",
"src": "2067:12:2"
},
"nodeType": "YulExpressionStatement",
"src": "2067:12:2"
}
]
},
"condition": {
"arguments": [
{
"arguments": [
{
"name": "dataEnd",
"nodeType": "YulIdentifier",
"src": "2040:7:2"
},
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "2049:9:2"
}
],
"functionName": {
"name": "sub",
"nodeType": "YulIdentifier",
"src": "2036:3:2"
},
"nodeType": "YulFunctionCall",
"src": "2036:23:2"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2061:2:2",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "slt",
"nodeType": "YulIdentifier",
"src": "2032:3:2"
},
"nodeType": "YulFunctionCall",
"src": "2032:32:2"
},
"nodeType": "YulIf",
"src": "2029:52:2"
},
{
"nodeType": "YulAssignment",
"src": "2090:39:2",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "2119:9:2"
}
],
"functionName": {
"name": "abi_decode_address",
"nodeType": "YulIdentifier",
"src": "2100:18:2"
},
"nodeType": "YulFunctionCall",
"src": "2100:29:2"
},
"variableNames": [
{
"name": "value0",
"nodeType": "YulIdentifier",
"src": "2090:6:2"
}
]
}
]
},
"name": "abi_decode_tuple_t_address",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "headStart",
"nodeType": "YulTypedName",
"src": "1985:9:2",
"type": ""
},
{
"name": "dataEnd",
"nodeType": "YulTypedName",
"src": "1996:7:2",
"type": ""
}
],
"returnVariables": [
{
"name": "value0",
"nodeType": "YulTypedName",
"src": "2008:6:2",
"type": ""
}
],
"src": "1949:186:2"
},
{
"body": {
"nodeType": "YulBlock",
"src": "2227:173:2",
"statements": [
{
"body": {
"nodeType": "YulBlock",
"src": "2273:16:2",
"statements": [
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2282:1:2",
"type": "",
"value": "0"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2285:1:2",
"type": "",
"value": "0"
}
],
"functionName": {
"name": "revert",
"nodeType": "YulIdentifier",
"src": "2275:6:2"
},
"nodeType": "YulFunctionCall",
"src": "2275:12:2"
},
"nodeType": "YulExpressionStatement",
"src": "2275:12:2"
}
]
},
"condition": {
"arguments": [
{
"arguments": [
{
"name": "dataEnd",
"nodeType": "YulIdentifier",
"src": "2248:7:2"
},
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "2257:9:2"
}
],
"functionName": {
"name": "sub",
"nodeType": "YulIdentifier",
"src": "2244:3:2"
},
"nodeType": "YulFunctionCall",
"src": "2244:23:2"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2269:2:2",
"type": "",
"value": "64"
}
],
"functionName": {
"name": "slt",
"nodeType": "YulIdentifier",
"src": "2240:3:2"
},
"nodeType": "YulFunctionCall",
"src": "2240:32:2"
},
"nodeType": "YulIf",
"src": "2237:52:2"
},
{
"nodeType": "YulAssignment",
"src": "2298:39:2",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "2327:9:2"
}
],
"functionName": {
"name": "abi_decode_address",
"nodeType": "YulIdentifier",
"src": "2308:18:2"
},
"nodeType": "YulFunctionCall",
"src": "2308:29:2"
},
"variableNames": [
{
"name": "value0",
"nodeType": "YulIdentifier",
"src": "2298:6:2"
}
]
},
{
"nodeType": "YulAssignment",
"src": "2346:48:2",
"value": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "2379:9:2"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2390:2:2",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "2375:3:2"
},
"nodeType": "YulFunctionCall",
"src": "2375:18:2"
}
],
"functionName": {
"name": "abi_decode_address",
"nodeType": "YulIdentifier",
"src": "2356:18:2"
},
"nodeType": "YulFunctionCall",
"src": "2356:38:2"
},
"variableNames": [
{
"name": "value1",
"nodeType": "YulIdentifier",
"src": "2346:6:2"
}
]
}
]
},
"name": "abi_decode_tuple_t_addresst_address",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "headStart",
"nodeType": "YulTypedName",
"src": "2185:9:2",
"type": ""
},
{
"name": "dataEnd",
"nodeType": "YulTypedName",
"src": "2196:7:2",
"type": ""
}
],
"returnVariables": [
{
"name": "value0",
"nodeType": "YulTypedName",
"src": "2208:6:2",
"type": ""
},
{
"name": "value1",
"nodeType": "YulTypedName",
"src": "2216:6:2",
"type": ""
}
],
"src": "2140:260:2"
},
{
"body": {
"nodeType": "YulBlock",
"src": "2460:325:2",
"statements": [
{
"nodeType": "YulAssignment",
"src": "2470:22:2",
"value": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2484:1:2",
"type": "",
"value": "1"
},
{
"name": "data",
"nodeType": "YulIdentifier",
"src": "2487:4:2"
}
],
"functionName": {
"name": "shr",
"nodeType": "YulIdentifier",
"src": "2480:3:2"
},
"nodeType": "YulFunctionCall",
"src": "2480:12:2"
},
"variableNames": [
{
"name": "length",
"nodeType": "YulIdentifier",
"src": "2470:6:2"
}
]
},
{
"nodeType": "YulVariableDeclaration",
"src": "2501:38:2",
"value": {
"arguments": [
{
"name": "data",
"nodeType": "YulIdentifier",
"src": "2531:4:2"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2537:1:2",
"type": "",
"value": "1"
}
],
"functionName": {
"name": "and",
"nodeType": "YulIdentifier",
"src": "2527:3:2"
},
"nodeType": "YulFunctionCall",
"src": "2527:12:2"
},
"variables": [
{
"name": "outOfPlaceEncoding",
"nodeType": "YulTypedName",
"src": "2505:18:2",
"type": ""
}
]
},
{
"body": {
"nodeType": "YulBlock",
"src": "2578:31:2",
"statements": [
{
"nodeType": "YulAssignment",
"src": "2580:27:2",
"value": {
"arguments": [
{
"name": "length",
"nodeType": "YulIdentifier",
"src": "2594:6:2"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2602:4:2",
"type": "",
"value": "0x7f"
}
],
"functionName": {
"name": "and",
"nodeType": "YulIdentifier",
"src": "2590:3:2"
},
"nodeType": "YulFunctionCall",
"src": "2590:17:2"
},
"variableNames": [
{
"name": "length",
"nodeType": "YulIdentifier",
"src": "2580:6:2"
}
]
}
]
},
"condition": {
"arguments": [
{
"name": "outOfPlaceEncoding",
"nodeType": "YulIdentifier",
"src": "2558:18:2"
}
],
"functionName": {
"name": "iszero",
"nodeType": "YulIdentifier",
"src": "2551:6:2"
},
"nodeType": "YulFunctionCall",
"src": "2551:26:2"
},
"nodeType": "YulIf",
"src": "2548:61:2"
},
{
"body": {
"nodeType": "YulBlock",
"src": "2668:111:2",
"statements": [
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2689:1:2",
"type": "",
"value": "0"
},
{
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2696:3:2",
"type": "",
"value": "224"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2701:10:2",
"type": "",
"value": "0x4e487b71"
}
],
"functionName": {
"name": "shl",
"nodeType": "YulIdentifier",
"src": "2692:3:2"
},
"nodeType": "YulFunctionCall",
"src": "2692:20:2"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "2682:6:2"
},
"nodeType": "YulFunctionCall",
"src": "2682:31:2"
},
"nodeType": "YulExpressionStatement",
"src": "2682:31:2"
},
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2733:1:2",
"type": "",
"value": "4"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2736:4:2",
"type": "",
"value": "0x22"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "2726:6:2"
},
"nodeType": "YulFunctionCall",
"src": "2726:15:2"
},
"nodeType": "YulExpressionStatement",
"src": "2726:15:2"
},
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2761:1:2",
"type": "",
"value": "0"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2764:4:2",
"type": "",
"value": "0x24"
}
],
"functionName": {
"name": "revert",
"nodeType": "YulIdentifier",
"src": "2754:6:2"
},
"nodeType": "YulFunctionCall",
"src": "2754:15:2"
},
"nodeType": "YulExpressionStatement",
"src": "2754:15:2"
}
]
},
"condition": {
"arguments": [
{
"name": "outOfPlaceEncoding",
"nodeType": "YulIdentifier",
"src": "2624:18:2"
},
{
"arguments": [
{
"name": "length",
"nodeType": "YulIdentifier",
"src": "2647:6:2"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2655:2:2",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "lt",
"nodeType": "YulIdentifier",
"src": "2644:2:2"
},
"nodeType": "YulFunctionCall",
"src": "2644:14:2"
}
],
"functionName": {
"name": "eq",
"nodeType": "YulIdentifier",
"src": "2621:2:2"
},
"nodeType": "YulFunctionCall",
"src": "2621:38:2"
},
"nodeType": "YulIf",
"src": "2618:161:2"
}
]
},
"name": "extract_byte_array_length",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "data",
"nodeType": "YulTypedName",
"src": "2440:4:2",
"type": ""
}
],
"returnVariables": [
{
"name": "length",
"nodeType": "YulTypedName",
"src": "2449:6:2",
"type": ""
}
],
"src": "2405:380:2"
},
{
"body": {
"nodeType": "YulBlock",
"src": "2964:226:2",
"statements": [
{
"expression": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "2981:9:2"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2992:2:2",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "2974:6:2"
},
"nodeType": "YulFunctionCall",
"src": "2974:21:2"
},
"nodeType": "YulExpressionStatement",
"src": "2974:21:2"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "3015:9:2"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "3026:2:2",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "3011:3:2"
},
"nodeType": "YulFunctionCall",
"src": "3011:18:2"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "3031:2:2",
"type": "",
"value": "36"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "3004:6:2"
},
"nodeType": "YulFunctionCall",
"src": "3004:30:2"
},
"nodeType": "YulExpressionStatement",
"src": "3004:30:2"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "3054:9:2"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "3065:2:2",
"type": "",
"value": "64"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "3050:3:2"
},
"nodeType": "YulFunctionCall",
"src": "3050:18:2"
},
{
"hexValue": "45524332303a20617070726f76652066726f6d20746865207a65726f20616464",
"kind": "string",
"nodeType": "YulLiteral",
"src": "3070:34:2",
"type": "",
"value": "ERC20: approve from the zero add"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "3043:6:2"
},
"nodeType": "YulFunctionCall",
"src": "3043:62:2"
},
"nodeType": "YulExpressionStatement",
"src": "3043:62:2"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "3125:9:2"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "3136:2:2",
"type": "",
"value": "96"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "3121:3:2"
},
"nodeType": "YulFunctionCall",
"src": "3121:18:2"
},
{
"hexValue": "72657373",
"kind": "string",
"nodeType": "YulLiteral",
"src": "3141:6:2",
"type": "",
"value": "ress"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "3114:6:2"
},
"nodeType": "YulFunctionCall",
"src": "3114:34:2"
},
"nodeType": "YulExpressionStatement",
"src": "3114:34:2"
},
{
"nodeType": "YulAssignment",
"src": "3157:27:2",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "3169:9:2"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "3180:3:2",
"type": "",
"value": "128"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "3165:3:2"
},
"nodeType": "YulFunctionCall",
"src": "3165:19:2"
},
"variableNames": [
{
"name": "tail",
"nodeType": "YulIdentifier",
"src": "3157:4:2"
}
]
}
]
},
"name": "abi_encode_tuple_t_stringliteral_c953f4879035ed60e766b34720f656aab5c697b141d924c283124ecedb91c208__to_t_string_memory_ptr__fromStack_reversed",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "headStart",
"nodeType": "YulTypedName",
"src": "2941:9:2",
"type": ""
}
],
"returnVariables": [
{
"name": "tail",
"nodeType": "YulTypedName",
"src": "2955:4:2",
"type": ""
}
],
"src": "2790:400:2"
},
{
"body": {
"nodeType": "YulBlock",
"src": "3369:224:2",
"statements": [
{
"expression": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "3386:9:2"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "3397:2:2",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "3379:6:2"
},
"nodeType": "YulFunctionCall",
"src": "3379:21:2"
},
"nodeType": "YulExpressionStatement",
"src": "3379:21:2"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "3420:9:2"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "3431:2:2",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "3416:3:2"
},
"nodeType": "YulFunctionCall",
"src": "3416:18:2"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "3436:2:2",
"type": "",
"value": "34"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "3409:6:2"
},
"nodeType": "YulFunctionCall",
"src": "3409:30:2"
},
"nodeType": "YulExpressionStatement",
"src": "3409:30:2"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "3459:9:2"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "3470:2:2",
"type": "",
"value": "64"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "3455:3:2"
},
"nodeType": "YulFunctionCall",
"src": "3455:18:2"
},
{
"hexValue": "45524332303a20617070726f766520746f20746865207a65726f206164647265",
"kind": "string",
"nodeType": "YulLiteral",
"src": "3475:34:2",
"type": "",
"value": "ERC20: approve to the zero addre"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "3448:6:2"
},
"nodeType": "YulFunctionCall",
"src": "3448:62:2"
},
"nodeType": "YulExpressionStatement",
"src": "3448:62:2"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "3530:9:2"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "3541:2:2",
"type": "",
"value": "96"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "3526:3:2"
},
"nodeType": "YulFunctionCall",
"src": "3526:18:2"
},
{
"hexValue": "7373",
"kind": "string",
"nodeType": "YulLiteral",
"src": "3546:4:2",
"type": "",
"value": "ss"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "3519:6:2"
},
"nodeType": "YulFunctionCall",
"src": "3519:32:2"
},
"nodeType": "YulExpressionStatement",
"src": "3519:32:2"
},
{
"nodeType": "YulAssignment",
"src": "3560:27:2",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "3572:9:2"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "3583:3:2",
"type": "",
"value": "128"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "3568:3:2"
},
"nodeType": "YulFunctionCall",
"src": "3568:19:2"
},
"variableNames": [
{
"name": "tail",
"nodeType": "YulIdentifier",
"src": "3560:4:2"
}
]
}
]
},
"name": "abi_encode_tuple_t_stringliteral_24883cc5fe64ace9d0df1893501ecb93c77180f0ff69cca79affb3c316dc8029__to_t_string_memory_ptr__fromStack_reversed",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "headStart",
"nodeType": "YulTypedName",
"src": "3346:9:2",
"type": ""
}
],
"returnVariables": [
{
"name": "tail",
"nodeType": "YulTypedName",
"src": "3360:4:2",
"type": ""
}
],
"src": "3195:398:2"
},
{
"body": {
"nodeType": "YulBlock",
"src": "3772:227:2",
"statements": [
{
"expression": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "3789:9:2"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "3800:2:2",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "3782:6:2"
},
"nodeType": "YulFunctionCall",
"src": "3782:21:2"
},
"nodeType": "YulExpressionStatement",
"src": "3782:21:2"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "3823:9:2"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "3834:2:2",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "3819:3:2"
},
"nodeType": "YulFunctionCall",
"src": "3819:18:2"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "3839:2:2",
"type": "",
"value": "37"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "3812:6:2"
},
"nodeType": "YulFunctionCall",
"src": "3812:30:2"
},
"nodeType": "YulExpressionStatement",
"src": "3812:30:2"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "3862:9:2"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "3873:2:2",
"type": "",
"value": "64"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "3858:3:2"
},
"nodeType": "YulFunctionCall",
"src": "3858:18:2"
},
{
"hexValue": "45524332303a207472616e736665722066726f6d20746865207a65726f206164",
"kind": "string",
"nodeType": "YulLiteral",
"src": "3878:34:2",
"type": "",
"value": "ERC20: transfer from the zero ad"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "3851:6:2"
},
"nodeType": "YulFunctionCall",
"src": "3851:62:2"
},
"nodeType": "YulExpressionStatement",
"src": "3851:62:2"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "3933:9:2"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "3944:2:2",
"type": "",
"value": "96"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "3929:3:2"
},
"nodeType": "YulFunctionCall",
"src": "3929:18:2"
},
{
"hexValue": "6472657373",
"kind": "string",
"nodeType": "YulLiteral",
"src": "3949:7:2",
"type": "",
"value": "dress"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "3922:6:2"
},
"nodeType": "YulFunctionCall",
"src": "3922:35:2"
},
"nodeType": "YulExpressionStatement",
"src": "3922:35:2"
},
{
"nodeType": "YulAssignment",
"src": "3966:27:2",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "3978:9:2"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "3989:3:2",
"type": "",
"value": "128"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "3974:3:2"
},
"nodeType": "YulFunctionCall",
"src": "3974:19:2"
},
"variableNames": [
{
"name": "tail",
"nodeType": "YulIdentifier",
"src": "3966:4:2"
}
]
}
]
},
"name": "abi_encode_tuple_t_stringliteral_baecc556b46f4ed0f2b4cb599d60785ac8563dd2dc0a5bf12edea1c39e5e1fea__to_t_string_memory_ptr__fromStack_reversed",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "headStart",
"nodeType": "YulTypedName",
"src": "3749:9:2",
"type": ""
}
],
"returnVariables": [
{
"name": "tail",
"nodeType": "YulTypedName",
"src": "3763:4:2",
"type": ""
}
],
"src": "3598:401:2"
},
{
"body": {
"nodeType": "YulBlock",
"src": "4178:225:2",
"statements": [
{
"expression": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "4195:9:2"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "4206:2:2",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "4188:6:2"
},
"nodeType": "YulFunctionCall",
"src": "4188:21:2"
},
"nodeType": "YulExpressionStatement",
"src": "4188:21:2"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "4229:9:2"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "4240:2:2",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "4225:3:2"
},
"nodeType": "YulFunctionCall",
"src": "4225:18:2"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "4245:2:2",
"type": "",
"value": "35"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "4218:6:2"
},
"nodeType": "YulFunctionCall",
"src": "4218:30:2"
},
"nodeType": "YulExpressionStatement",
"src": "4218:30:2"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "4268:9:2"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "4279:2:2",
"type": "",
"value": "64"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "4264:3:2"
},
"nodeType": "YulFunctionCall",
"src": "4264:18:2"
},
{
"hexValue": "45524332303a207472616e7366657220746f20746865207a65726f2061646472",
"kind": "string",
"nodeType": "YulLiteral",
"src": "4284:34:2",
"type": "",
"value": "ERC20: transfer to the zero addr"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "4257:6:2"
},
"nodeType": "YulFunctionCall",
"src": "4257:62:2"
},
"nodeType": "YulExpressionStatement",
"src": "4257:62:2"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "4339:9:2"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "4350:2:2",
"type": "",
"value": "96"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "4335:3:2"
},
"nodeType": "YulFunctionCall",
"src": "4335:18:2"
},
{
"hexValue": "657373",
"kind": "string",
"nodeType": "YulLiteral",
"src": "4355:5:2",
"type": "",
"value": "ess"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "4328:6:2"
},
"nodeType": "YulFunctionCall",
"src": "4328:33:2"
},
"nodeType": "YulExpressionStatement",
"src": "4328:33:2"
},
{
"nodeType": "YulAssignment",
"src": "4370:27:2",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "4382:9:2"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "4393:3:2",
"type": "",
"value": "128"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "4378:3:2"
},
"nodeType": "YulFunctionCall",
"src": "4378:19:2"
},
"variableNames": [
{
"name": "tail",
"nodeType": "YulIdentifier",
"src": "4370:4:2"
}
]
}
]
},
"name": "abi_encode_tuple_t_stringliteral_0557e210f7a69a685100a7e4e3d0a7024c546085cee28910fd17d0b081d9516f__to_t_string_memory_ptr__fromStack_reversed",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "headStart",
"nodeType": "YulTypedName",
"src": "4155:9:2",
"type": ""
}
],
"returnVariables": [
{
"name": "tail",
"nodeType": "YulTypedName",
"src": "4169:4:2",
"type": ""
}
],
"src": "4004:399:2"
},
{
"body": {
"nodeType": "YulBlock",
"src": "4440:95:2",
"statements": [
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "4457:1:2",
"type": "",
"value": "0"
},
{
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "4464:3:2",
"type": "",
"value": "224"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "4469:10:2",
"type": "",
"value": "0x4e487b71"
}
],
"functionName": {
"name": "shl",
"nodeType": "YulIdentifier",
"src": "4460:3:2"
},
"nodeType": "YulFunctionCall",
"src": "4460:20:2"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "4450:6:2"
},
"nodeType": "YulFunctionCall",
"src": "4450:31:2"
},
"nodeType": "YulExpressionStatement",
"src": "4450:31:2"
},
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "4497:1:2",
"type": "",
"value": "4"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "4500:4:2",
"type": "",
"value": "0x11"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "4490:6:2"
},
"nodeType": "YulFunctionCall",
"src": "4490:15:2"
},
"nodeType": "YulExpressionStatement",
"src": "4490:15:2"
},
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "4521:1:2",
"type": "",
"value": "0"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "4524:4:2",
"type": "",
"value": "0x24"
}
],
"functionName": {
"name": "revert",
"nodeType": "YulIdentifier",
"src": "4514:6:2"
},
"nodeType": "YulFunctionCall",
"src": "4514:15:2"
},
"nodeType": "YulExpressionStatement",
"src": "4514:15:2"
}
]
},
"name": "panic_error_0x11",
"nodeType": "YulFunctionDefinition",
"src": "4408:127:2"
},
{
"body": {
"nodeType": "YulBlock",
"src": "4589:76:2",
"statements": [
{
"body": {
"nodeType": "YulBlock",
"src": "4611:22:2",
"statements": [
{
"expression": {
"arguments": [],
"functionName": {
"name": "panic_error_0x11",
"nodeType": "YulIdentifier",
"src": "4613:16:2"
},
"nodeType": "YulFunctionCall",
"src": "4613:18:2"
},
"nodeType": "YulExpressionStatement",
"src": "4613:18:2"
}
]
},
"condition": {
"arguments": [
{
"name": "x",
"nodeType": "YulIdentifier",
"src": "4605:1:2"
},
{
"name": "y",
"nodeType": "YulIdentifier",
"src": "4608:1:2"
}
],
"functionName": {
"name": "lt",
"nodeType": "YulIdentifier",
"src": "4602:2:2"
},
"nodeType": "YulFunctionCall",
"src": "4602:8:2"
},
"nodeType": "YulIf",
"src": "4599:34:2"
},
{
"nodeType": "YulAssignment",
"src": "4642:17:2",
"value": {
"arguments": [
{
"name": "x",
"nodeType": "YulIdentifier",
"src": "4654:1:2"
},
{
"name": "y",
"nodeType": "YulIdentifier",
"src": "4657:1:2"
}
],
"functionName": {
"name": "sub",
"nodeType": "YulIdentifier",
"src": "4650:3:2"
},
"nodeType": "YulFunctionCall",
"src": "4650:9:2"
},
"variableNames": [
{
"name": "diff",
"nodeType": "YulIdentifier",
"src": "4642:4:2"
}
]
}
]
},
"name": "checked_sub_t_uint256",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "x",
"nodeType": "YulTypedName",
"src": "4571:1:2",
"type": ""
},
{
"name": "y",
"nodeType": "YulTypedName",
"src": "4574:1:2",
"type": ""
}
],
"returnVariables": [
{
"name": "diff",
"nodeType": "YulTypedName",
"src": "4580:4:2",
"type": ""
}
],
"src": "4540:125:2"
},
{
"body": {
"nodeType": "YulBlock",
"src": "4718:80:2",
"statements": [
{
"body": {
"nodeType": "YulBlock",
"src": "4745:22:2",
"statements": [
{
"expression": {
"arguments": [],
"functionName": {
"name": "panic_error_0x11",
"nodeType": "YulIdentifier",
"src": "4747:16:2"
},
"nodeType": "YulFunctionCall",
"src": "4747:18:2"
},
"nodeType": "YulExpressionStatement",
"src": "4747:18:2"
}
]
},
"condition": {
"arguments": [
{
"name": "x",
"nodeType": "YulIdentifier",
"src": "4734:1:2"
},
{
"arguments": [
{
"name": "y",
"nodeType": "YulIdentifier",
"src": "4741:1:2"
}
],
"functionName": {
"name": "not",
"nodeType": "YulIdentifier",
"src": "4737:3:2"
},
"nodeType": "YulFunctionCall",
"src": "4737:6:2"
}
],
"functionName": {
"name": "gt",
"nodeType": "YulIdentifier",
"src": "4731:2:2"
},
"nodeType": "YulFunctionCall",
"src": "4731:13:2"
},
"nodeType": "YulIf",
"src": "4728:39:2"
},
{
"nodeType": "YulAssignment",
"src": "4776:16:2",
"value": {
"arguments": [
{
"name": "x",
"nodeType": "YulIdentifier",
"src": "4787:1:2"
},
{
"name": "y",
"nodeType": "YulIdentifier",
"src": "4790:1:2"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "4783:3:2"
},
"nodeType": "YulFunctionCall",
"src": "4783:9:2"
},
"variableNames": [
{
"name": "sum",
"nodeType": "YulIdentifier",
"src": "4776:3:2"
}
]
}
]
},
"name": "checked_add_t_uint256",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "x",
"nodeType": "YulTypedName",
"src": "4701:1:2",
"type": ""
},
{
"name": "y",
"nodeType": "YulTypedName",
"src": "4704:1:2",
"type": ""
}
],
"returnVariables": [
{
"name": "sum",
"nodeType": "YulTypedName",
"src": "4710:3:2",
"type": ""
}
],
"src": "4670:128:2"
},
{
"body": {
"nodeType": "YulBlock",
"src": "4977:177:2",
"statements": [
{
"expression": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "4994:9:2"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "5005:2:2",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "4987:6:2"
},
"nodeType": "YulFunctionCall",
"src": "4987:21:2"
},
"nodeType": "YulExpressionStatement",
"src": "4987:21:2"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "5028:9:2"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "5039:2:2",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "5024:3:2"
},
"nodeType": "YulFunctionCall",
"src": "5024:18:2"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "5044:2:2",
"type": "",
"value": "27"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "5017:6:2"
},
"nodeType": "YulFunctionCall",
"src": "5017:30:2"
},
"nodeType": "YulExpressionStatement",
"src": "5017:30:2"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "5067:9:2"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "5078:2:2",
"type": "",
"value": "64"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "5063:3:2"
},
"nodeType": "YulFunctionCall",
"src": "5063:18:2"
},
{
"hexValue": "536166654d6174683a206164646974696f6e206f766572666c6f77",
"kind": "string",
"nodeType": "YulLiteral",
"src": "5083:29:2",
"type": "",
"value": "SafeMath: addition overflow"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "5056:6:2"
},
"nodeType": "YulFunctionCall",
"src": "5056:57:2"
},
"nodeType": "YulExpressionStatement",
"src": "5056:57:2"
},
{
"nodeType": "YulAssignment",
"src": "5122:26:2",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "5134:9:2"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "5145:2:2",
"type": "",
"value": "96"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "5130:3:2"
},
"nodeType": "YulFunctionCall",
"src": "5130:18:2"
},
"variableNames": [
{
"name": "tail",
"nodeType": "YulIdentifier",
"src": "5122:4:2"
}
]
}
]
},
"name": "abi_encode_tuple_t_stringliteral_30cc447bcc13b3e22b45cef0dd9b0b514842d836dd9b6eb384e20dedfb47723a__to_t_string_memory_ptr__fromStack_reversed",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "headStart",
"nodeType": "YulTypedName",
"src": "4954:9:2",
"type": ""
}
],
"returnVariables": [
{
"name": "tail",
"nodeType": "YulTypedName",
"src": "4968:4:2",
"type": ""
}
],
"src": "4803:351:2"
}
]
},
"contents": "{\n { }\n function abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n let _1 := 32\n mstore(headStart, _1)\n let length := mload(value0)\n mstore(add(headStart, _1), length)\n let i := 0\n for { } lt(i, length) { i := add(i, _1) }\n {\n mstore(add(add(headStart, i), 64), mload(add(add(value0, i), _1)))\n }\n if gt(i, length)\n {\n mstore(add(add(headStart, length), 64), 0)\n }\n tail := add(add(headStart, and(add(length, 31), not(31))), 64)\n }\n function abi_decode_address(offset) -> value\n {\n value := calldataload(offset)\n if iszero(eq(value, and(value, sub(shl(160, 1), 1)))) { revert(0, 0) }\n }\n function abi_decode_tuple_t_addresst_uint256(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n value0 := abi_decode_address(headStart)\n value1 := calldataload(add(headStart, 32))\n }\n function abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, iszero(iszero(value0)))\n }\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function abi_decode_tuple_t_addresst_addresst_uint256(headStart, dataEnd) -> value0, value1, value2\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n value0 := abi_decode_address(headStart)\n value1 := abi_decode_address(add(headStart, 32))\n value2 := calldataload(add(headStart, 64))\n }\n function abi_encode_tuple_t_uint8__to_t_uint8__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xff))\n }\n function abi_decode_tuple_t_address(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := abi_decode_address(headStart)\n }\n function abi_decode_tuple_t_addresst_address(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n value0 := abi_decode_address(headStart)\n value1 := abi_decode_address(add(headStart, 32))\n }\n function extract_byte_array_length(data) -> length\n {\n length := shr(1, data)\n let outOfPlaceEncoding := and(data, 1)\n if iszero(outOfPlaceEncoding) { length := and(length, 0x7f) }\n if eq(outOfPlaceEncoding, lt(length, 32))\n {\n mstore(0, shl(224, 0x4e487b71))\n mstore(4, 0x22)\n revert(0, 0x24)\n }\n }\n function abi_encode_tuple_t_stringliteral_c953f4879035ed60e766b34720f656aab5c697b141d924c283124ecedb91c208__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 36)\n mstore(add(headStart, 64), \"ERC20: approve from the zero add\")\n mstore(add(headStart, 96), \"ress\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_24883cc5fe64ace9d0df1893501ecb93c77180f0ff69cca79affb3c316dc8029__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 34)\n mstore(add(headStart, 64), \"ERC20: approve to the zero addre\")\n mstore(add(headStart, 96), \"ss\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_baecc556b46f4ed0f2b4cb599d60785ac8563dd2dc0a5bf12edea1c39e5e1fea__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 37)\n mstore(add(headStart, 64), \"ERC20: transfer from the zero ad\")\n mstore(add(headStart, 96), \"dress\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_0557e210f7a69a685100a7e4e3d0a7024c546085cee28910fd17d0b081d9516f__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 35)\n mstore(add(headStart, 64), \"ERC20: transfer to the zero addr\")\n mstore(add(headStart, 96), \"ess\")\n tail := add(headStart, 128)\n }\n function panic_error_0x11()\n {\n mstore(0, shl(224, 0x4e487b71))\n mstore(4, 0x11)\n revert(0, 0x24)\n }\n function checked_sub_t_uint256(x, y) -> diff\n {\n if lt(x, y) { panic_error_0x11() }\n diff := sub(x, y)\n }\n function checked_add_t_uint256(x, y) -> sum\n {\n if gt(x, not(y)) { panic_error_0x11() }\n sum := add(x, y)\n }\n function abi_encode_tuple_t_stringliteral_30cc447bcc13b3e22b45cef0dd9b0b514842d836dd9b6eb384e20dedfb47723a__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 27)\n mstore(add(headStart, 64), \"SafeMath: addition overflow\")\n tail := add(headStart, 96)\n }\n}",
"id": 2,
"language": "Yul",
"name": "#utility.yul"
}
],
"immutableReferences": {},
"linkReferences": {},
"object": "608060405234801561001057600080fd5b50600436106100a95760003560e01c80633950935111610071578063395093511461012957806370a082311461013c57806395d89b4114610165578063a457c2d71461016d578063a9059cbb14610180578063dd62ed3e1461019357600080fd5b806306fdde03146100ae578063095ea7b3146100cc57806318160ddd146100ef57806323b872dd14610101578063313ce56714610114575b600080fd5b6100b66101cc565b6040516100c391906106cb565b60405180910390f35b6100df6100da36600461073c565b61025e565b60405190151581526020016100c3565b6002545b6040519081526020016100c3565b6100df61010f366004610766565b610274565b60055460405160ff90911681526020016100c3565b6100df61013736600461073c565b6102dd565b6100f361014a3660046107a2565b6001600160a01b031660009081526020819052604090205490565b6100b6610313565b6100df61017b36600461073c565b610322565b6100df61018e36600461073c565b610371565b6100f36101a13660046107bd565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6060600380546101db906107f0565b80601f0160208091040260200160405190810160405280929190818152602001828054610207906107f0565b80156102545780601f1061022957610100808354040283529160200191610254565b820191906000526020600020905b81548152906001019060200180831161023757829003601f168201915b5050505050905090565b600061026b33848461037e565b50600192915050565b60006102818484846104a8565b6102d384336102ce85604051806060016040528060288152602001610897602891396001600160a01b038a166000908152600160209081526040808320338452909152902054919061062b565b61037e565b5060019392505050565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161026b9185906102ce9086610665565b6060600480546101db906107f0565b600061026b33846102ce856040518060600160405280602581526020016108bf602591393360009081526001602090815260408083206001600160a01b038d168452909152902054919061062b565b600061026b3384846104a8565b6001600160a01b0383166103e55760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084015b60405180910390fd5b6001600160a01b0382166104465760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016103dc565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b03831661050c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016103dc565b6001600160a01b03821661056e5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016103dc565b6105ab81604051806060016040528060268152602001610871602691396001600160a01b038616600090815260208190526040902054919061062b565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546105da9082610665565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910161049b565b6000818484111561064f5760405162461bcd60e51b81526004016103dc91906106cb565b50600061065c8486610841565b95945050505050565b6000806106728385610858565b9050838110156106c45760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016103dc565b9392505050565b600060208083528351808285015260005b818110156106f8578581018301518582016040015282016106dc565b8181111561070a576000604083870101525b50601f01601f1916929092016040019392505050565b80356001600160a01b038116811461073757600080fd5b919050565b6000806040838503121561074f57600080fd5b61075883610720565b946020939093013593505050565b60008060006060848603121561077b57600080fd5b61078484610720565b925061079260208501610720565b9150604084013590509250925092565b6000602082840312156107b457600080fd5b6106c482610720565b600080604083850312156107d057600080fd5b6107d983610720565b91506107e760208401610720565b90509250929050565b600181811c9082168061080457607f821691505b6020821081141561082557634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6000828210156108535761085361082b565b500390565b6000821982111561086b5761086b61082b565b50019056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220eafc27e9469593adb562edb03d0cba1fd8631b512f6cd7f3a5eefe24ff94a91364736f6c634300080c0033",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0xA9 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x39509351 GT PUSH2 0x71 JUMPI DUP1 PUSH4 0x39509351 EQ PUSH2 0x129 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x13C JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x165 JUMPI DUP1 PUSH4 0xA457C2D7 EQ PUSH2 0x16D JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x180 JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x193 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0xAE JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0xCC JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0xEF JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x101 JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x114 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xB6 PUSH2 0x1CC JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xC3 SWAP2 SWAP1 PUSH2 0x6CB JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xDF PUSH2 0xDA CALLDATASIZE PUSH1 0x4 PUSH2 0x73C JUMP JUMPDEST PUSH2 0x25E JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xC3 JUMP JUMPDEST PUSH1 0x2 SLOAD JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xC3 JUMP JUMPDEST PUSH2 0xDF PUSH2 0x10F CALLDATASIZE PUSH1 0x4 PUSH2 0x766 JUMP JUMPDEST PUSH2 0x274 JUMP JUMPDEST PUSH1 0x5 SLOAD PUSH1 0x40 MLOAD PUSH1 0xFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xC3 JUMP JUMPDEST PUSH2 0xDF PUSH2 0x137 CALLDATASIZE PUSH1 0x4 PUSH2 0x73C JUMP JUMPDEST PUSH2 0x2DD JUMP JUMPDEST PUSH2 0xF3 PUSH2 0x14A CALLDATASIZE PUSH1 0x4 PUSH2 0x7A2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH2 0xB6 PUSH2 0x313 JUMP JUMPDEST PUSH2 0xDF PUSH2 0x17B CALLDATASIZE PUSH1 0x4 PUSH2 0x73C JUMP JUMPDEST PUSH2 0x322 JUMP JUMPDEST PUSH2 0xDF PUSH2 0x18E CALLDATASIZE PUSH1 0x4 PUSH2 0x73C JUMP JUMPDEST PUSH2 0x371 JUMP JUMPDEST PUSH2 0xF3 PUSH2 0x1A1 CALLDATASIZE PUSH1 0x4 PUSH2 0x7BD JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP5 AND DUP3 MSTORE SWAP2 SWAP1 SWAP2 MSTORE KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x3 DUP1 SLOAD PUSH2 0x1DB SWAP1 PUSH2 0x7F0 JUMP JUMPDEST DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH2 0x207 SWAP1 PUSH2 0x7F0 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x254 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x229 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x254 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x237 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x26B CALLER DUP5 DUP5 PUSH2 0x37E JUMP JUMPDEST POP PUSH1 0x1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x281 DUP5 DUP5 DUP5 PUSH2 0x4A8 JUMP JUMPDEST PUSH2 0x2D3 DUP5 CALLER PUSH2 0x2CE DUP6 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x28 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x897 PUSH1 0x28 SWAP2 CODECOPY PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD SWAP2 SWAP1 PUSH2 0x62B JUMP JUMPDEST PUSH2 0x37E JUMP JUMPDEST POP PUSH1 0x1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE DUP2 KECCAK256 SLOAD SWAP1 SWAP2 PUSH2 0x26B SWAP2 DUP6 SWAP1 PUSH2 0x2CE SWAP1 DUP7 PUSH2 0x665 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x4 DUP1 SLOAD PUSH2 0x1DB SWAP1 PUSH2 0x7F0 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x26B CALLER DUP5 PUSH2 0x2CE DUP6 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x25 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x8BF PUSH1 0x25 SWAP2 CODECOPY CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP14 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD SWAP2 SWAP1 PUSH2 0x62B JUMP JUMPDEST PUSH1 0x0 PUSH2 0x26B CALLER DUP5 DUP5 PUSH2 0x4A8 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH2 0x3E5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP1 DUP3 ADD MSTORE PUSH32 0x45524332303A20617070726F76652066726F6D20746865207A65726F20616464 PUSH1 0x44 DUP3 ADD MSTORE PUSH4 0x72657373 PUSH1 0xE0 SHL PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x446 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x22 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332303A20617070726F766520746F20746865207A65726F206164647265 PUSH1 0x44 DUP3 ADD MSTORE PUSH2 0x7373 PUSH1 0xF0 SHL PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x3DC JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP8 AND DUP1 DUP5 MSTORE SWAP5 DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP6 SWAP1 SSTORE SWAP1 MLOAD DUP5 DUP2 MSTORE PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP2 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH2 0x50C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x25 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332303A207472616E736665722066726F6D20746865207A65726F206164 PUSH1 0x44 DUP3 ADD MSTORE PUSH5 0x6472657373 PUSH1 0xD8 SHL PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x3DC JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x56E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x23 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332303A207472616E7366657220746F20746865207A65726F2061646472 PUSH1 0x44 DUP3 ADD MSTORE PUSH3 0x657373 PUSH1 0xE8 SHL PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x3DC JUMP JUMPDEST PUSH2 0x5AB DUP2 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x871 PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP2 SWAP1 PUSH2 0x62B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP1 DUP5 AND DUP2 MSTORE KECCAK256 SLOAD PUSH2 0x5DA SWAP1 DUP3 PUSH2 0x665 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SWAP5 SWAP1 SWAP5 SSTORE MLOAD DUP5 DUP2 MSTORE SWAP1 SWAP3 SWAP2 DUP7 AND SWAP2 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP2 ADD PUSH2 0x49B JUMP JUMPDEST PUSH1 0x0 DUP2 DUP5 DUP5 GT ISZERO PUSH2 0x64F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3DC SWAP2 SWAP1 PUSH2 0x6CB JUMP JUMPDEST POP PUSH1 0x0 PUSH2 0x65C DUP5 DUP7 PUSH2 0x841 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x672 DUP4 DUP6 PUSH2 0x858 JUMP JUMPDEST SWAP1 POP DUP4 DUP2 LT ISZERO PUSH2 0x6C4 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x3DC JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP1 DUP4 MSTORE DUP4 MLOAD DUP1 DUP3 DUP6 ADD MSTORE PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x6F8 JUMPI DUP6 DUP2 ADD DUP4 ADD MLOAD DUP6 DUP3 ADD PUSH1 0x40 ADD MSTORE DUP3 ADD PUSH2 0x6DC JUMP JUMPDEST DUP2 DUP2 GT ISZERO PUSH2 0x70A JUMPI PUSH1 0x0 PUSH1 0x40 DUP4 DUP8 ADD ADD MSTORE JUMPDEST POP PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x40 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x737 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x74F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x758 DUP4 PUSH2 0x720 JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x77B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x784 DUP5 PUSH2 0x720 JUMP JUMPDEST SWAP3 POP PUSH2 0x792 PUSH1 0x20 DUP6 ADD PUSH2 0x720 JUMP JUMPDEST SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD SWAP1 POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x7B4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x6C4 DUP3 PUSH2 0x720 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x7D0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x7D9 DUP4 PUSH2 0x720 JUMP JUMPDEST SWAP2 POP PUSH2 0x7E7 PUSH1 0x20 DUP5 ADD PUSH2 0x720 JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x1 DUP2 DUP2 SHR SWAP1 DUP3 AND DUP1 PUSH2 0x804 JUMPI PUSH1 0x7F DUP3 AND SWAP2 POP JUMPDEST PUSH1 0x20 DUP3 LT DUP2 EQ ISZERO PUSH2 0x825 JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP3 DUP3 LT ISZERO PUSH2 0x853 JUMPI PUSH2 0x853 PUSH2 0x82B JUMP JUMPDEST POP SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 NOT DUP3 GT ISZERO PUSH2 0x86B JUMPI PUSH2 0x86B PUSH2 0x82B JUMP JUMPDEST POP ADD SWAP1 JUMP INVALID GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 PUSH21 0x72616E7366657220616D6F756E7420657863656564 PUSH20 0x2062616C616E636545524332303A207472616E73 PUSH7 0x657220616D6F75 PUSH15 0x74206578636565647320616C6C6F77 PUSH2 0x6E63 PUSH6 0x45524332303A KECCAK256 PUSH5 0x6563726561 PUSH20 0x656420616C6C6F77616E63652062656C6F77207A PUSH6 0x726FA2646970 PUSH7 0x7358221220EAFC 0x27 0xE9 CHAINID SWAP6 SWAP4 0xAD 0xB5 PUSH3 0xEDB03D 0xC 0xBA 0x1F 0xD8 PUSH4 0x1B512F6C 0xD7 RETURN 0xA5 0xEE INVALID 0x24 SELFDESTRUCT SWAP5 0xA9 SGT PUSH5 0x736F6C6343 STOP ADDMOD 0xC STOP CALLER ",
"sourceMap": "12536:9619:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13390:81;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15424:164;;;;;;:::i;:::-;;:::i;:::-;;;1218:14:2;;1211:22;1193:41;;1181:2;1166:18;15424:164:0;1053:187:2;14433:98:0;14512:12;;14433:98;;;1391:25:2;;;1379:2;1364:18;14433:98:0;1245:177:2;16048:389:0;;;;;;:::i;:::-;;:::i;14292:81::-;14357:9;;14292:81;;14357:9;;;;1902:36:2;;1890:2;1875:18;14292:81:0;1760:184:2;16832:211:0;;;;;;:::i;:::-;;:::i;14589:117::-;;;;;;:::i;:::-;-1:-1:-1;;;;;14681:18:0;14655:7;14681:18;;;;;;;;;;;;14589:117;13584:85;;;:::i;17530:308::-;;;;;;:::i;:::-;;:::i;14909:170::-;;;;;;:::i;:::-;;:::i;15137:149::-;;;;;;:::i;:::-;-1:-1:-1;;;;;15252:18:0;;;15226:7;15252:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;15137:149;13390:81;13427:13;13459:5;13452:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13390:81;:::o;15424:164::-;15507:4;15523:37;15532:10;15544:7;15553:6;15523:8;:37::i;:::-;-1:-1:-1;15577:4:0;15424:164;;;;:::o;16048:389::-;16184:4;16200:36;16210:6;16218:9;16229:6;16200:9;:36::i;:::-;16246:163;16268:6;16288:10;16312:87;16348:6;16312:87;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16312:19:0;;;;;;:11;:19;;;;;;;;16332:10;16312:31;;;;;;;;;:87;:35;:87::i;:::-;16246:8;:163::i;:::-;-1:-1:-1;16426:4:0;16048:389;;;;;:::o;16832:211::-;16945:10;16920:4;16966:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;16966:32:0;;;;;;;;;;16920:4;;16936:79;;16957:7;;16966:48;;17003:10;16966:36;:48::i;13584:85::-;13623:13;13655:7;13648:14;;;;;:::i;17530:308::-;17623:4;17639:171;17661:10;17685:7;17706:94;17743:15;17706:94;;;;;;;;;;;;;;;;;17718:10;17706:23;;;;:11;:23;;;;;;;;-1:-1:-1;;;;;17706:32:0;;;;;;;;;;;:94;:36;:94::i;14909:170::-;14995:4;15011:40;15021:10;15033:9;15044:6;15011:9;:40::i;20664:370::-;-1:-1:-1;;;;;20795:19:0;;20787:68;;;;-1:-1:-1;;;20787:68:0;;2992:2:2;20787:68:0;;;2974:21:2;3031:2;3011:18;;;3004:30;3070:34;3050:18;;;3043:62;-1:-1:-1;;;3121:18:2;;;3114:34;3165:19;;20787:68:0;;;;;;;;;-1:-1:-1;;;;;20873:21:0;;20865:68;;;;-1:-1:-1;;;20865:68:0;;3397:2:2;20865:68:0;;;3379:21:2;3436:2;3416:18;;;3409:30;3475:34;3455:18;;;3448:62;-1:-1:-1;;;3526:18:2;;;3519:32;3568:19;;20865:68:0;3195:398:2;20865:68:0;-1:-1:-1;;;;;20944:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;20995:32;;1391:25:2;;;20995:32:0;;1364:18:2;20995:32:0;;;;;;;;20664:370;;;:::o;18312:560::-;-1:-1:-1;;;;;18447:20:0;;18439:70;;;;-1:-1:-1;;;18439:70:0;;3800:2:2;18439:70:0;;;3782:21:2;3839:2;3819:18;;;3812:30;3878:34;3858:18;;;3851:62;-1:-1:-1;;;3929:18:2;;;3922:35;3974:19;;18439:70:0;3598:401:2;18439:70:0;-1:-1:-1;;;;;18527:23:0;;18519:71;;;;-1:-1:-1;;;18519:71:0;;4206:2:2;18519:71:0;;;4188:21:2;4245:2;4225:18;;;4218:30;4284:34;4264:18;;;4257:62;-1:-1:-1;;;4335:18:2;;;4328:33;4378:19;;18519:71:0;4004:399:2;18519:71:0;18679;18701:6;18679:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18679:17:0;;:9;:17;;;;;;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;18659:17:0;;;:9;:17;;;;;;;;;;;:91;;;;18783:20;;;;;;;:32;;18808:6;18783:24;:32::i;:::-;-1:-1:-1;;;;;18760:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;18830:35;1391:25:2;;;18760:20:0;;18830:35;;;;;;1364:18:2;18830:35:0;1245:177:2;1849:217:0;1965:7;2000:12;1992:6;;;;1984:29;;;;-1:-1:-1;;;1984:29:0;;;;;;;;:::i;:::-;-1:-1:-1;2023:9:0;2035:5;2039:1;2035;:5;:::i;:::-;2023:17;1849:217;-1:-1:-1;;;;;1849:217:0:o;977:176::-;1035:7;;1066:5;1070:1;1066;:5;:::i;:::-;1054:17;;1094:1;1089;:6;;1081:46;;;;-1:-1:-1;;;1081:46:0;;5005:2:2;1081:46:0;;;4987:21:2;5044:2;5024:18;;;5017:30;5083:29;5063:18;;;5056:57;5130:18;;1081:46:0;4803:351:2;1081:46:0;1145:1;977:176;-1:-1:-1;;;977:176:0:o;14:597:2:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;452:6;449:1;446:13;443:91;;;522:1;517:2;508:6;497:9;493:22;489:31;482:42;443:91;-1:-1:-1;595:2:2;574:15;-1:-1:-1;;570:29:2;555:45;;;;602:2;551:54;;14:597;-1:-1:-1;;;14:597:2:o;616:173::-;684:20;;-1:-1:-1;;;;;733:31:2;;723:42;;713:70;;779:1;776;769:12;713:70;616:173;;;:::o;794:254::-;862:6;870;923:2;911:9;902:7;898:23;894:32;891:52;;;939:1;936;929:12;891:52;962:29;981:9;962:29;:::i;:::-;952:39;1038:2;1023:18;;;;1010:32;;-1:-1:-1;;;794:254:2:o;1427:328::-;1504:6;1512;1520;1573:2;1561:9;1552:7;1548:23;1544:32;1541:52;;;1589:1;1586;1579:12;1541:52;1612:29;1631:9;1612:29;:::i;:::-;1602:39;;1660:38;1694:2;1683:9;1679:18;1660:38;:::i;:::-;1650:48;;1745:2;1734:9;1730:18;1717:32;1707:42;;1427:328;;;;;:::o;1949:186::-;2008:6;2061:2;2049:9;2040:7;2036:23;2032:32;2029:52;;;2077:1;2074;2067:12;2029:52;2100:29;2119:9;2100:29;:::i;2140:260::-;2208:6;2216;2269:2;2257:9;2248:7;2244:23;2240:32;2237:52;;;2285:1;2282;2275:12;2237:52;2308:29;2327:9;2308:29;:::i;:::-;2298:39;;2356:38;2390:2;2379:9;2375:18;2356:38;:::i;:::-;2346:48;;2140:260;;;;;:::o;2405:380::-;2484:1;2480:12;;;;2527;;;2548:61;;2602:4;2594:6;2590:17;2580:27;;2548:61;2655:2;2647:6;2644:14;2624:18;2621:38;2618:161;;;2701:10;2696:3;2692:20;2689:1;2682:31;2736:4;2733:1;2726:15;2764:4;2761:1;2754:15;2618:161;;2405:380;;;:::o;4408:127::-;4469:10;4464:3;4460:20;4457:1;4450:31;4500:4;4497:1;4490:15;4524:4;4521:1;4514:15;4540:125;4580:4;4608:1;4605;4602:8;4599:34;;;4613:18;;:::i;:::-;-1:-1:-1;4650:9:2;;4540:125::o;4670:128::-;4710:3;4741:1;4737:6;4734:1;4731:13;4728:39;;;4747:18;;:::i;:::-;-1:-1:-1;4783:9:2;;4670:128::o"
},
"gasEstimates": {
"creation": {
"codeDepositCost": "465800",
"executionCost": "infinite",
"totalCost": "infinite"
},
"external": {
"allowance(address,address)": "infinite",
"approve(address,uint256)": "24620",
"balanceOf(address)": "2562",
"decimals()": "2378",
"decreaseAllowance(address,uint256)": "infinite",
"increaseAllowance(address,uint256)": "27011",
"name()": "infinite",
"symbol()": "infinite",
"totalSupply()": "2326",
"transfer(address,uint256)": "infinite",
"transferFrom(address,address,uint256)": "infinite"
},
"internal": {
"_approve(address,address,uint256)": "infinite",
"_beforeTokenTransfer(address,address,uint256)": "infinite",
"_burn(address,uint256)": "infinite",
"_mint(address,uint256)": "infinite",
"_setupDecimals(uint8)": "infinite",
"_transfer(address,address,uint256)": "infinite"
}
},
"methodIdentifiers": {
"allowance(address,address)": "dd62ed3e",
"approve(address,uint256)": "095ea7b3",
"balanceOf(address)": "70a08231",
"decimals()": "313ce567",
"decreaseAllowance(address,uint256)": "a457c2d7",
"increaseAllowance(address,uint256)": "39509351",
"name()": "06fdde03",
"symbol()": "95d89b41",
"totalSupply()": "18160ddd",
"transfer(address,uint256)": "a9059cbb",
"transferFrom(address,address,uint256)": "23b872dd"
}
},
"abi": [
{
"inputs": [
{
"internalType": "string",
"name": "name",
"type": "string"
},
{
"internalType": "string",
"name": "symbol",
"type": "string"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "spender",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"name": "Approval",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "from",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "to",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"name": "Transfer",
"type": "event"
},
{
"inputs": [
{
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"internalType": "address",
"name": "spender",
"type": "address"
}
],
"name": "allowance",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "spender",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "approve",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "balanceOf",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "decimals",
"outputs": [
{
"internalType": "uint8",
"name": "",
"type": "uint8"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "spender",
"type": "address"
},
{
"internalType": "uint256",
"name": "subtractedValue",
"type": "uint256"
}
],
"name": "decreaseAllowance",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "spender",
"type": "address"
},
{
"internalType": "uint256",
"name": "addedValue",
"type": "uint256"
}
],
"name": "increaseAllowance",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "name",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "symbol",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "totalSupply",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "recipient",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "transfer",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "sender",
"type": "address"
},
{
"internalType": "address",
"name": "recipient",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "transferFrom",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
}
]
}
{
"compiler": {
"version": "0.8.12+commit.f00d7308"
},
"language": "Solidity",
"output": {
"abi": [
{
"inputs": [
{
"internalType": "string",
"name": "name",
"type": "string"
},
{
"internalType": "string",
"name": "symbol",
"type": "string"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "spender",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"name": "Approval",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "from",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "to",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"name": "Transfer",
"type": "event"
},
{
"inputs": [
{
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"internalType": "address",
"name": "spender",
"type": "address"
}
],
"name": "allowance",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "spender",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "approve",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "balanceOf",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "decimals",
"outputs": [
{
"internalType": "uint8",
"name": "",
"type": "uint8"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "spender",
"type": "address"
},
{
"internalType": "uint256",
"name": "subtractedValue",
"type": "uint256"
}
],
"name": "decreaseAllowance",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "spender",
"type": "address"
},
{
"internalType": "uint256",
"name": "addedValue",
"type": "uint256"
}
],
"name": "increaseAllowance",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "name",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "symbol",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "totalSupply",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "recipient",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "transfer",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "sender",
"type": "address"
},
{
"internalType": "address",
"name": "recipient",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "transferFrom",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
}
],
"devdoc": {
"details": "Implementation of the {IERC20} interface. This implementation is agnostic to the way tokens are created. This means that a supply mechanism has to be added in a derived contract using {_mint}. For a generic mechanism see {ERC20PresetMinterPauser}. TIP: For a detailed writeup see our guide https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How to implement supply mechanisms]. We have followed general OpenZeppelin guidelines: functions revert instead of returning `false` on failure. This behavior is nonetheless conventional and does not conflict with the expectations of ERC20 applications. Additionally, an {Approval} event is emitted on calls to {transferFrom}. This allows applications to reconstruct the allowance for all accounts just by listening to said events. Other implementations of the EIP may not emit these events, as it isn't required by the specification. Finally, the non-standard {decreaseAllowance} and {increaseAllowance} functions have been added to mitigate the well-known issues around setting allowances. See {IERC20-approve}.",
"kind": "dev",
"methods": {
"allowance(address,address)": {
"details": "See {IERC20-allowance}."
},
"approve(address,uint256)": {
"details": "See {IERC20-approve}. Requirements: - `spender` cannot be the zero address."
},
"balanceOf(address)": {
"details": "See {IERC20-balanceOf}."
},
"constructor": {
"details": "Sets the values for {name} and {symbol}, initializes {decimals} with a default value of 18. To select a different value for {decimals}, use {_setupDecimals}. All three of these values are immutable: they can only be set once during construction."
},
"decimals()": {
"details": "Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is called. NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}."
},
"decreaseAllowance(address,uint256)": {
"details": "Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`."
},
"increaseAllowance(address,uint256)": {
"details": "Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address."
},
"name()": {
"details": "Returns the name of the token."
},
"symbol()": {
"details": "Returns the symbol of the token, usually a shorter version of the name."
},
"totalSupply()": {
"details": "See {IERC20-totalSupply}."
},
"transfer(address,uint256)": {
"details": "See {IERC20-transfer}. Requirements: - `recipient` cannot be the zero address. - the caller must have a balance of at least `amount`."
},
"transferFrom(address,address,uint256)": {
"details": "See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}; Requirements: - `sender` and `recipient` cannot be the zero address. - `sender` must have a balance of at least `amount`. - the caller must have allowance for ``sender``'s tokens of at least `amount`."
}
},
"version": 1
},
"userdoc": {
"kind": "user",
"methods": {},
"version": 1
}
},
"settings": {
"compilationTarget": {
"contracts/OLD/OLDwsAXDS.sol": "ERC20"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
},
"sources": {
"contracts/OLD/OLDwsAXDS.sol": {
"keccak256": "0x1112d06be223e4db6545f2a4cfc12644912a49e966e991975242241238760046",
"license": "MIT",
"urls": [
"bzz-raw://0c706051c603bc3e7d59403bfb86c1e961678c032a5ad675b467ca3251b977f1",
"dweb:/ipfs/QmStXHdG46xYhgqFj4As6zNq9ExAdVEohd1YRjQ8gNK5BZ"
]
},
"contracts/interfaces/IERC20.sol": {
"keccak256": "0xc379ec1f3a741cc00948003e24687516b8fdb71914cd3b90b10589d74fe1d49f",
"license": "AGPL-3.0",
"urls": [
"bzz-raw://fdb71c90b122d9421c799a6b89d8f2c1aba66be1ce2b51d57ba8effb89d73a9c",
"dweb:/ipfs/QmboLxPYNXFfF7Bc3vprbp9a7UFqC5EaU2ARK7oFZYCBYB"
]
}
},
"version": 1
}
{
"deploy": {
"VM:-": {
"linkReferences": {},
"autoDeployLib": true
},
"main:1": {
"linkReferences": {},
"autoDeployLib": true
},
"ropsten:3": {
"linkReferences": {},
"autoDeployLib": true
},
"rinkeby:4": {
"linkReferences": {},
"autoDeployLib": true
},
"kovan:42": {
"linkReferences": {},
"autoDeployLib": true
},
"görli:5": {
"linkReferences": {},
"autoDeployLib": true
},
"Custom": {
"linkReferences": {},
"autoDeployLib": true
}
},
"data": {
"bytecode": {
"functionDebugData": {},
"generatedSources": [],
"linkReferences": {},
"object": "",
"opcodes": "",
"sourceMap": ""
},
"deployedBytecode": {
"functionDebugData": {},
"generatedSources": [],
"immutableReferences": {},
"linkReferences": {},
"object": "",
"opcodes": "",
"sourceMap": ""
},
"gasEstimates": null,
"methodIdentifiers": {
"INDEX()": "2df75cb1"
}
},
"abi": [
{
"inputs": [],
"name": "INDEX",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
}
]
}
{
"compiler": {
"version": "0.8.12+commit.f00d7308"
},
"language": "Solidity",
"output": {
"abi": [
{
"inputs": [],
"name": "INDEX",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
}
],
"devdoc": {
"kind": "dev",
"methods": {},
"version": 1
},
"userdoc": {
"kind": "user",
"methods": {},
"version": 1
}
},
"settings": {
"compilationTarget": {
"contracts/OLD/OLDwsAXDS.sol": "IsOHMOLD"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
},
"sources": {
"contracts/OLD/OLDwsAXDS.sol": {
"keccak256": "0x1112d06be223e4db6545f2a4cfc12644912a49e966e991975242241238760046",
"license": "MIT",
"urls": [
"bzz-raw://0c706051c603bc3e7d59403bfb86c1e961678c032a5ad675b467ca3251b977f1",
"dweb:/ipfs/QmStXHdG46xYhgqFj4As6zNq9ExAdVEohd1YRjQ8gNK5BZ"
]
},
"contracts/interfaces/IERC20.sol": {
"keccak256": "0xc379ec1f3a741cc00948003e24687516b8fdb71914cd3b90b10589d74fe1d49f",
"license": "AGPL-3.0",
"urls": [
"bzz-raw://fdb71c90b122d9421c799a6b89d8f2c1aba66be1ce2b51d57ba8effb89d73a9c",
"dweb:/ipfs/QmboLxPYNXFfF7Bc3vprbp9a7UFqC5EaU2ARK7oFZYCBYB"
]
}
},
"version": 1
}
{
"deploy": {
"VM:-": {
"linkReferences": {},
"autoDeployLib": true
},
"main:1": {
"linkReferences": {},
"autoDeployLib": true
},
"ropsten:3": {
"linkReferences": {},
"autoDeployLib": true
},
"rinkeby:4": {
"linkReferences": {},
"autoDeployLib": true
},
"kovan:42": {
"linkReferences": {},
"autoDeployLib": true
},
"görli:5": {
"linkReferences": {},
"autoDeployLib": true
},
"Custom": {
"linkReferences": {},
"autoDeployLib": true
}
},
"data": {
"bytecode": {
"functionDebugData": {},
"generatedSources": [],
"linkReferences": {},
"object": "60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212202aa1c4e3a99b0df756d9f0801e23156be86e8d2a9b35283ac0c3c82a6c0639a764736f6c634300080c0033",
"opcodes": "PUSH1 0x56 PUSH1 0x37 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x2A JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x2A LOG1 0xC4 0xE3 0xA9 SWAP12 0xD 0xF7 JUMP 0xD9 CREATE DUP1 0x1E 0x23 ISZERO PUSH12 0xE86E8D2A9B35283AC0C3C82A PUSH13 0x639A764736F6C634300080C00 CALLER ",
"sourceMap": "22615:3321:0:-:0;;;;;;;;;;;;;;;-1:-1:-1;;;22615:3321:0;;;;;;;;;;;;;;;;;"
},
"deployedBytecode": {
"functionDebugData": {},
"generatedSources": [],
"immutableReferences": {},
"linkReferences": {},
"object": "73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212202aa1c4e3a99b0df756d9f0801e23156be86e8d2a9b35283ac0c3c82a6c0639a764736f6c634300080c0033",
"opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x2A LOG1 0xC4 0xE3 0xA9 SWAP12 0xD 0xF7 JUMP 0xD9 CREATE DUP1 0x1E 0x23 ISZERO PUSH12 0xE86E8D2A9B35283AC0C3C82A PUSH13 0x639A764736F6C634300080C00 CALLER ",
"sourceMap": "22615:3321:0:-:0;;;;;;;;"
},
"gasEstimates": {
"creation": {
"codeDepositCost": "17200",
"executionCost": "103",
"totalCost": "17303"
},
"internal": {
"_callOptionalReturn(contract IERC20,bytes memory)": "infinite",
"safeApprove(contract IERC20,address,uint256)": "infinite",
"safeDecreaseAllowance(contract IERC20,address,uint256)": "infinite",
"safeIncreaseAllowance(contract IERC20,address,uint256)": "infinite",
"safeTransfer(contract IERC20,address,uint256)": "infinite",
"safeTransferFrom(contract IERC20,address,address,uint256)": "infinite"
}
},
"methodIdentifiers": {}
},
"abi": []
}
{
"compiler": {
"version": "0.8.12+commit.f00d7308"
},
"language": "Solidity",
"output": {
"abi": [],
"devdoc": {
"details": "Wrappers around ERC20 operations that throw on failure (when the token contract returns false). Tokens that return no value (and instead revert or throw on failure) are also supported, non-reverting calls are assumed to be successful. To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, which allows you to call the safe operations as `token.safeTransfer(...)`, etc.",
"kind": "dev",
"methods": {},
"title": "SafeERC20",
"version": 1
},
"userdoc": {
"kind": "user",
"methods": {},
"version": 1
}
},
"settings": {
"compilationTarget": {
"contracts/OLD/OLDwsAXDS.sol": "SafeERC20"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
},
"sources": {
"contracts/OLD/OLDwsAXDS.sol": {
"keccak256": "0x1112d06be223e4db6545f2a4cfc12644912a49e966e991975242241238760046",
"license": "MIT",
"urls": [
"bzz-raw://0c706051c603bc3e7d59403bfb86c1e961678c032a5ad675b467ca3251b977f1",
"dweb:/ipfs/QmStXHdG46xYhgqFj4As6zNq9ExAdVEohd1YRjQ8gNK5BZ"
]
},
"contracts/interfaces/IERC20.sol": {
"keccak256": "0xc379ec1f3a741cc00948003e24687516b8fdb71914cd3b90b10589d74fe1d49f",
"license": "AGPL-3.0",
"urls": [
"bzz-raw://fdb71c90b122d9421c799a6b89d8f2c1aba66be1ce2b51d57ba8effb89d73a9c",
"dweb:/ipfs/QmboLxPYNXFfF7Bc3vprbp9a7UFqC5EaU2ARK7oFZYCBYB"
]
}
},
"version": 1
}
{
"deploy": {
"VM:-": {
"linkReferences": {},
"autoDeployLib": true
},
"main:1": {
"linkReferences": {},
"autoDeployLib": true
},
"ropsten:3": {
"linkReferences": {},
"autoDeployLib": true
},
"rinkeby:4": {
"linkReferences": {},
"autoDeployLib": true
},
"kovan:42": {
"linkReferences": {},
"autoDeployLib": true
},
"görli:5": {
"linkReferences": {},
"autoDeployLib": true
},
"Custom": {
"linkReferences": {},
"autoDeployLib": true
}
},
"data": {
"bytecode": {
"functionDebugData": {},
"generatedSources": [],
"linkReferences": {},
"object": "60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212208c188f831d143eb352b7fc2e71e8099b0c8497eb59bce12611e1fb640c1051c364736f6c634300080c0033",
"opcodes": "PUSH1 0x56 PUSH1 0x37 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x2A JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP13 XOR DUP16 DUP4 SAR EQ RETURNDATACOPY 0xB3 MSTORE 0xB7 0xFC 0x2E PUSH18 0xE8099B0C8497EB59BCE12611E1FB640C1051 0xC3 PUSH5 0x736F6C6343 STOP ADDMOD 0xC STOP CALLER ",
"sourceMap": "725:4668:0:-:0;;;;;;;;;;;;;;;-1:-1:-1;;;725:4668:0;;;;;;;;;;;;;;;;;"
},
"deployedBytecode": {
"functionDebugData": {},
"generatedSources": [],
"immutableReferences": {},
"linkReferences": {},
"object": "73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212208c188f831d143eb352b7fc2e71e8099b0c8497eb59bce12611e1fb640c1051c364736f6c634300080c0033",
"opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP13 XOR DUP16 DUP4 SAR EQ RETURNDATACOPY 0xB3 MSTORE 0xB7 0xFC 0x2E PUSH18 0xE8099B0C8497EB59BCE12611E1FB640C1051 0xC3 PUSH5 0x736F6C6343 STOP ADDMOD 0xC STOP CALLER ",
"sourceMap": "725:4668:0:-:0;;;;;;;;"
},
"gasEstimates": {
"creation": {
"codeDepositCost": "17200",
"executionCost": "103",
"totalCost": "17303"
},
"internal": {
"add(uint256,uint256)": "infinite",
"div(uint256,uint256)": "infinite",
"div(uint256,uint256,string memory)": "infinite",
"mod(uint256,uint256)": "infinite",
"mod(uint256,uint256,string memory)": "infinite",
"mul(uint256,uint256)": "infinite",
"sub(uint256,uint256)": "infinite",
"sub(uint256,uint256,string memory)": "infinite"
}
},
"methodIdentifiers": {}
},
"abi": []
}
{
"compiler": {
"version": "0.8.12+commit.f00d7308"
},
"language": "Solidity",
"output": {
"abi": [],
"devdoc": {
"details": "Wrappers over Solidity's arithmetic operations with added overflow checks. Arithmetic operations in Solidity wrap on overflow. This can easily result in bugs, because programmers usually assume that an overflow raises an error, which is the standard behavior in high level programming languages. `SafeMath` restores this intuition by reverting the transaction when an operation overflows. Using this library instead of the unchecked operations eliminates an entire class of bugs, so it's recommended to use it always.",
"kind": "dev",
"methods": {},
"version": 1
},
"userdoc": {
"kind": "user",
"methods": {},
"version": 1
}
},
"settings": {
"compilationTarget": {
"contracts/OLD/OLDwsAXDS.sol": "SafeMath"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
},
"sources": {
"contracts/OLD/OLDwsAXDS.sol": {
"keccak256": "0x1112d06be223e4db6545f2a4cfc12644912a49e966e991975242241238760046",
"license": "MIT",
"urls": [
"bzz-raw://0c706051c603bc3e7d59403bfb86c1e961678c032a5ad675b467ca3251b977f1",
"dweb:/ipfs/QmStXHdG46xYhgqFj4As6zNq9ExAdVEohd1YRjQ8gNK5BZ"
]
},
"contracts/interfaces/IERC20.sol": {
"keccak256": "0xc379ec1f3a741cc00948003e24687516b8fdb71914cd3b90b10589d74fe1d49f",
"license": "AGPL-3.0",
"urls": [
"bzz-raw://fdb71c90b122d9421c799a6b89d8f2c1aba66be1ce2b51d57ba8effb89d73a9c",
"dweb:/ipfs/QmboLxPYNXFfF7Bc3vprbp9a7UFqC5EaU2ARK7oFZYCBYB"
]
}
},
"version": 1
}
// this line is added to create a gist. Empty file is not allowed.
{
"compiler": {
"version": "0.8.12+commit.f00d7308"
},
"language": "Solidity",
"output": {
"abi": [
{
"inputs": [
{
"internalType": "address",
"name": "_sOHM",
"type": "address"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "spender",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"name": "Approval",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "from",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "to",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"name": "Transfer",
"type": "event"
},
{
"inputs": [
{
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"internalType": "address",
"name": "spender",
"type": "address"
}
],
"name": "allowance",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "spender",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "approve",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "balanceOf",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "decimals",
"outputs": [
{
"internalType": "uint8",
"name": "",
"type": "uint8"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "spender",
"type": "address"
},
{
"internalType": "uint256",
"name": "subtractedValue",
"type": "uint256"
}
],
"name": "decreaseAllowance",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "spender",
"type": "address"
},
{
"internalType": "uint256",
"name": "addedValue",
"type": "uint256"
}
],
"name": "increaseAllowance",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "name",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "sOHM",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "_amount",
"type": "uint256"
}
],
"name": "sOHMTowOHM",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "symbol",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "totalSupply",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "recipient",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "transfer",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "sender",
"type": "address"
},
{
"internalType": "address",
"name": "recipient",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "transferFrom",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "_amount",
"type": "uint256"
}
],
"name": "unwrap",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "_amount",
"type": "uint256"
}
],
"name": "wOHMTosOHM",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "_amount",
"type": "uint256"
}
],
"name": "wrap",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "nonpayable",
"type": "function"
}
],
"devdoc": {
"kind": "dev",
"methods": {
"allowance(address,address)": {
"details": "See {IERC20-allowance}."
},
"approve(address,uint256)": {
"details": "See {IERC20-approve}. Requirements: - `spender` cannot be the zero address."
},
"balanceOf(address)": {
"details": "See {IERC20-balanceOf}."
},
"decimals()": {
"details": "Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is called. NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}."
},
"decreaseAllowance(address,uint256)": {
"details": "Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`."
},
"increaseAllowance(address,uint256)": {
"details": "Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address."
},
"name()": {
"details": "Returns the name of the token."
},
"sOHMTowOHM(uint256)": {
"params": {
"_amount": "uint"
},
"returns": {
"_0": "uint"
}
},
"symbol()": {
"details": "Returns the symbol of the token, usually a shorter version of the name."
},
"totalSupply()": {
"details": "See {IERC20-totalSupply}."
},
"transfer(address,uint256)": {
"details": "See {IERC20-transfer}. Requirements: - `recipient` cannot be the zero address. - the caller must have a balance of at least `amount`."
},
"transferFrom(address,address,uint256)": {
"details": "See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}; Requirements: - `sender` and `recipient` cannot be the zero address. - `sender` must have a balance of at least `amount`. - the caller must have allowance for ``sender``'s tokens of at least `amount`."
},
"unwrap(uint256)": {
"params": {
"_amount": "uint"
},
"returns": {
"_0": "uint"
}
},
"wOHMTosOHM(uint256)": {
"params": {
"_amount": "uint"
},
"returns": {
"_0": "uint"
}
},
"wrap(uint256)": {
"params": {
"_amount": "uint"
},
"returns": {
"_0": "uint"
}
}
},
"version": 1
},
"userdoc": {
"kind": "user",
"methods": {
"sOHMTowOHM(uint256)": {
"notice": "converts sOHM amount to wOHM"
},
"unwrap(uint256)": {
"notice": "unwrap sOHM"
},
"wOHMTosOHM(uint256)": {
"notice": "converts wOHM amount to sOHM"
},
"wrap(uint256)": {
"notice": "wrap sOHM"
}
},
"version": 1
}
},
"settings": {
"compilationTarget": {
"contracts/OLD/OLDwsAXDS.sol": "wOHM"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
},
"sources": {
"contracts/OLD/OLDwsAXDS.sol": {
"keccak256": "0x1112d06be223e4db6545f2a4cfc12644912a49e966e991975242241238760046",
"license": "MIT",
"urls": [
"bzz-raw://0c706051c603bc3e7d59403bfb86c1e961678c032a5ad675b467ca3251b977f1",
"dweb:/ipfs/QmStXHdG46xYhgqFj4As6zNq9ExAdVEohd1YRjQ8gNK5BZ"
]
},
"contracts/interfaces/IERC20.sol": {
"keccak256": "0xc379ec1f3a741cc00948003e24687516b8fdb71914cd3b90b10589d74fe1d49f",
"license": "AGPL-3.0",
"urls": [
"bzz-raw://fdb71c90b122d9421c799a6b89d8f2c1aba66be1ce2b51d57ba8effb89d73a9c",
"dweb:/ipfs/QmboLxPYNXFfF7Bc3vprbp9a7UFqC5EaU2ARK7oFZYCBYB"
]
}
},
"version": 1
}
/**
*Submitted for verification at Etherscan.io on 2021-06-12
*/
// SPDX-License-Identifier: MIT
pragma solidity >0.7.5;
import "../interfaces/IERC20.sol";
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
require(b > 0, errorMessage);
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts with custom message when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies in extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
// solhint-disable-next-line no-inline-assembly
assembly {
size := extcodesize(account)
}
return size > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
// solhint-disable-next-line avoid-low-level-calls, avoid-call-value
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain`call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return _functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
return _functionCallWithValue(target, data, value, errorMessage);
}
function _functionCallWithValue(
address target,
bytes memory data,
uint256 weiValue,
string memory errorMessage
) private returns (bytes memory) {
require(isContract(target), "Address: call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.call{value: weiValue}(data);
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
// solhint-disable-next-line no-inline-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
/**
* @dev Implementation of the {IERC20} interface.
*
* This implementation is agnostic to the way tokens are created. This means
* that a supply mechanism has to be added in a derived contract using {_mint}.
* For a generic mechanism see {ERC20PresetMinterPauser}.
*
* TIP: For a detailed writeup see our guide
* https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
* to implement supply mechanisms].
*
* We have followed general OpenZeppelin guidelines: functions revert instead
* of returning `false` on failure. This behavior is nonetheless conventional
* and does not conflict with the expectations of ERC20 applications.
*
* Additionally, an {Approval} event is emitted on calls to {transferFrom}.
* This allows applications to reconstruct the allowance for all accounts just
* by listening to said events. Other implementations of the EIP may not emit
* these events, as it isn't required by the specification.
*
* Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
* functions have been added to mitigate the well-known issues around setting
* allowances. See {IERC20-approve}.
*/
contract ERC20 is IERC20 {
using SafeMath for uint256;
using Address for address;
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
uint8 private _decimals;
/**
* @dev Sets the values for {name} and {symbol}, initializes {decimals} with
* a default value of 18.
*
* To select a different value for {decimals}, use {_setupDecimals}.
*
* All three of these values are immutable: they can only be set once during
* construction.
*/
constructor(string memory name, string memory symbol) {
_name = name;
_symbol = symbol;
_decimals = 18;
}
/**
* @dev Returns the name of the token.
*/
function name() public view returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view returns (string memory) {
return _symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
* For example, if `decimals` equals `2`, a balance of `505` tokens should
* be displayed to a user as `5,05` (`505 / 10 ** 2`).
*
* Tokens usually opt for a value of 18, imitating the relationship between
* Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is
* called.
*
* NOTE: This information is only used for _display_ purposes: it in
* no way affects any of the arithmetic of the contract, including
* {IERC20-balanceOf} and {IERC20-transfer}.
*/
function decimals() public view returns (uint8) {
return _decimals;
}
/**
* @dev See {IERC20-totalSupply}.
*/
function totalSupply() public view override returns (uint256) {
return _totalSupply;
}
/**
* @dev See {IERC20-balanceOf}.
*/
function balanceOf(address account) public view override returns (uint256) {
return _balances[account];
}
/**
* @dev See {IERC20-transfer}.
*
* Requirements:
*
* - `recipient` cannot be the zero address.
* - the caller must have a balance of at least `amount`.
*/
function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
_transfer(msg.sender, recipient, amount);
return true;
}
/**
* @dev See {IERC20-allowance}.
*/
function allowance(address owner, address spender) public view virtual override returns (uint256) {
return _allowances[owner][spender];
}
/**
* @dev See {IERC20-approve}.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(address spender, uint256 amount) public virtual override returns (bool) {
_approve(msg.sender, spender, amount);
return true;
}
/**
* @dev See {IERC20-transferFrom}.
*
* Emits an {Approval} event indicating the updated allowance. This is not
* required by the EIP. See the note at the beginning of {ERC20};
*
* Requirements:
* - `sender` and `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `amount`.
* - the caller must have allowance for ``sender``'s tokens of at least
* `amount`.
*/
function transferFrom(
address sender,
address recipient,
uint256 amount
) public virtual override returns (bool) {
_transfer(sender, recipient, amount);
_approve(
sender,
msg.sender,
_allowances[sender][msg.sender].sub(amount, "ERC20: transfer amount exceeds allowance")
);
return true;
}
/**
* @dev Atomically increases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
_approve(msg.sender, spender, _allowances[msg.sender][spender].add(addedValue));
return true;
}
/**
* @dev Atomically decreases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `spender` must have allowance for the caller of at least
* `subtractedValue`.
*/
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
_approve(
msg.sender,
spender,
_allowances[msg.sender][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")
);
return true;
}
/**
* @dev Moves tokens `amount` from `sender` to `recipient`.
*
* This is internal function is equivalent to {transfer}, and can be used to
* e.g. implement automatic token fees, slashing mechanisms, etc.
*
* Emits a {Transfer} event.
*
* Requirements:
*
* - `sender` cannot be the zero address.
* - `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `amount`.
*/
function _transfer(
address sender,
address recipient,
uint256 amount
) internal virtual {
require(sender != address(0), "ERC20: transfer from the zero address");
require(recipient != address(0), "ERC20: transfer to the zero address");
_beforeTokenTransfer(sender, recipient, amount);
_balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
_balances[recipient] = _balances[recipient].add(amount);
emit Transfer(sender, recipient, amount);
}
/** @dev Creates `amount` tokens and assigns them to `account`, increasing
* the total supply.
*
* Emits a {Transfer} event with `from` set to the zero address.
*
* Requirements
*
* - `to` cannot be the zero address.
*/
function _mint(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: mint to the zero address");
_beforeTokenTransfer(address(0), account, amount);
_totalSupply = _totalSupply.add(amount);
_balances[account] = _balances[account].add(amount);
emit Transfer(address(0), account, amount);
}
/**
* @dev Destroys `amount` tokens from `account`, reducing the
* total supply.
*
* Emits a {Transfer} event with `to` set to the zero address.
*
* Requirements
*
* - `account` cannot be the zero address.
* - `account` must have at least `amount` tokens.
*/
function _burn(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: burn from the zero address");
_beforeTokenTransfer(account, address(0), amount);
_balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
_totalSupply = _totalSupply.sub(amount);
emit Transfer(account, address(0), amount);
}
/**
* @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
*
* This internal function is equivalent to `approve`, and can be used to
* e.g. set automatic allowances for certain subsystems, etc.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `owner` cannot be the zero address.
* - `spender` cannot be the zero address.
*/
function _approve(
address owner,
address spender,
uint256 amount
) internal virtual {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
/**
* @dev Sets {decimals} to a value other than the default one of 18.
*
* WARNING: This function should only be called from the constructor. Most
* applications that interact with token contracts will not expect
* {decimals} to ever change, and may work incorrectly if it does.
*/
function _setupDecimals(uint8 decimals_) internal {
_decimals = decimals_;
}
/**
* @dev Hook that is called before any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* will be to transferred to `to`.
* - when `from` is zero, `amount` tokens will be minted for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens will be burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address from,
address to,
uint256 amount
) internal virtual {}
}
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using SafeMath for uint256;
using Address for address;
function safeTransfer(
IERC20 token,
address to,
uint256 value
) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(
IERC20 token,
address from,
address to,
uint256 value
) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
/**
* @dev Deprecated. This function has issues similar to the ones found in
* {IERC20-approve}, and its usage is discouraged.
*
* Whenever possible, use {safeIncreaseAllowance} and
* {safeDecreaseAllowance} instead.
*/
function safeApprove(
IERC20 token,
address spender,
uint256 value
) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
// solhint-disable-next-line max-line-length
require(
(value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
uint256 newAllowance = token.allowance(address(this), spender).add(value);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
uint256 newAllowance = token.allowance(address(this), spender).sub(
value,
"SafeERC20: decreased allowance below zero"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
if (returndata.length > 0) {
// Return data is optional
// solhint-disable-next-line max-line-length
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}
interface IsOHMOLD {
function INDEX() external view returns (uint256);
}
contract wOHM is ERC20 {
using SafeERC20 for ERC20;
using Address for address;
using SafeMath for uint256;
address public immutable sOHM;
constructor(address _sOHM) ERC20("Wrapped sOHM", "wsOHM") {
require(_sOHM != address(0));
sOHM = _sOHM;
}
/**
@notice wrap sOHM
@param _amount uint
@return uint
*/
function wrap(uint256 _amount) external returns (uint256) {
IERC20(sOHM).transferFrom(msg.sender, address(this), _amount);
uint256 value = sOHMTowOHM(_amount);
_mint(msg.sender, value);
return value;
}
/**
@notice unwrap sOHM
@param _amount uint
@return uint
*/
function unwrap(uint256 _amount) external returns (uint256) {
_burn(msg.sender, _amount);
uint256 value = wOHMTosOHM(_amount);
IERC20(sOHM).transfer(msg.sender, value);
return value;
}
/**
@notice converts wOHM amount to sOHM
@param _amount uint
@return uint
*/
function wOHMTosOHM(uint256 _amount) public view returns (uint256) {
return _amount.mul(IsOHMOLD(sOHM).INDEX()).div(10**decimals());
}
/**
@notice converts sOHM amount to wOHM
@param _amount uint
@return uint
*/
function sOHMTowOHM(uint256 _amount) public view returns (uint256) {
return _amount.mul(10**decimals()).div(IsOHMOLD(sOHM).INDEX());
}
}
// SPDX-License-Identifier: AGPL-3.0
pragma solidity ^0.7.5;
import "./libraries/SafeMath.sol";
import "./libraries/SafeERC20.sol";
import "./interfaces/IERC20.sol";
import "./interfaces/IsAXDS.sol";
import "./interfaces/IgAXDS.sol";
import "./interfaces/IDistributor.sol";
import "./types/AxodusAccessControlled.sol";
contract AxodusStaking is AxodusAccessControlled {
/* ========== DEPENDENCIES ========== */
using SafeMath for uint256;
using SafeERC20 for IERC20;
using SafeERC20 for IsAXDS;
using SafeERC20 for IgAXDS;
/* ========== EVENTS ========== */
event DistributorSet(address distributor);
event WarmupSet(uint256 warmup);
/* ========== DATA STRUCTURES ========== */
struct Epoch {
uint256 length; // in seconds
uint256 number; // since inception
uint256 end; // timestamp
uint256 distribute; // amount
}
struct Claim {
uint256 deposit; // if forfeiting
uint256 gons; // staked balance
uint256 expiry; // end of warmup period
bool lock; // prevents malicious delays for claim
}
/* ========== STATE VARIABLES ========== */
IERC20 public immutable AXDS;
IsAXDS public immutable sAXDS;
IgAXDS public immutable gAXDS;
Epoch public epoch;
IDistributor public distributor;
mapping(address => Claim) public warmupInfo;
uint256 public warmupPeriod;
uint256 private gonsInWarmup;
/* ========== CONSTRUCTOR ========== */
constructor(
address _axds,
address _sAXDS,
address _gAXDS,
uint256 _epochLength,
uint256 _firstEpochNumber,
uint256 _firstEpochTime,
address _authority
) AxodusAccessControlled(IAxodusAuthority(_authority)) {
require(_axds != address(0), "Zero address: AXDS");
AXDS = IERC20(_axds);
require(_sAXDS != address(0), "Zero address: sAXDS");
sAXDS = IsAXDS(_sAXDS);
require(_gAXDS != address(0), "Zero address: gAXDS");
gAXDS = IgAXDS(_gAXDS);
epoch = Epoch({length: _epochLength, number: _firstEpochNumber, end: _firstEpochTime, distribute: 0});
}
/* ========== MUTATIVE FUNCTIONS ========== */
/**
* @notice stake AXDS to enter warmup
* @param _to address
* @param _amount uint
* @param _claim bool
* @param _rebasing bool
* @return uint
*/
function stake(
address _to,
uint256 _amount,
bool _rebasing,
bool _claim
) external returns (uint256) {
AXDS.safeTransferFrom(msg.sender, address(this), _amount);
_amount = _amount.add(rebase()); // add bounty if rebase occurred
if (_claim && warmupPeriod == 0) {
return _send(_to, _amount, _rebasing);
} else {
Claim memory info = warmupInfo[_to];
if (!info.lock) {
require(_to == msg.sender, "External deposits for account are locked");
}
warmupInfo[_to] = Claim({
deposit: info.deposit.add(_amount),
gons: info.gons.add(sAXDS.gonsForBalance(_amount)),
expiry: epoch.number.add(warmupPeriod),
lock: info.lock
});
gonsInWarmup = gonsInWarmup.add(sAXDS.gonsForBalance(_amount));
return _amount;
}
}
/**
* @notice retrieve stake from warmup
* @param _to address
* @param _rebasing bool
* @return uint
*/
function claim(address _to, bool _rebasing) public returns (uint256) {
Claim memory info = warmupInfo[_to];
if (!info.lock) {
require(_to == msg.sender, "External claims for account are locked");
}
if (epoch.number >= info.expiry && info.expiry != 0) {
delete warmupInfo[_to];
gonsInWarmup = gonsInWarmup.sub(info.gons);
return _send(_to, sAXDS.balanceForGons(info.gons), _rebasing);
}
return 0;
}
/**
* @notice forfeit stake and retrieve AXDS
* @return uint
*/
function forfeit() external returns (uint256) {
Claim memory info = warmupInfo[msg.sender];
delete warmupInfo[msg.sender];
gonsInWarmup = gonsInWarmup.sub(info.gons);
AXDS.safeTransfer(msg.sender, info.deposit);
return info.deposit;
}
/**
* @notice prevent new deposits or claims from ext. address (protection from malicious activity)
*/
function toggleLock() external {
warmupInfo[msg.sender].lock = !warmupInfo[msg.sender].lock;
}
/**
* @notice redeem sAXDS for AXDSs
* @param _to address
* @param _amount uint
* @param _trigger bool
* @param _rebasing bool
* @return amount_ uint
*/
function unstake(
address _to,
uint256 _amount,
bool _trigger,
bool _rebasing
) external returns (uint256 amount_) {
amount_ = _amount;
uint256 bounty;
if (_trigger) {
bounty = rebase();
}
if (_rebasing) {
sAXDS.safeTransferFrom(msg.sender, address(this), _amount);
amount_ = amount_.add(bounty);
} else {
gAXDS.burn(msg.sender, _amount); // amount was given in gAXDS terms
amount_ = gAXDS.balanceFrom(amount_).add(bounty); // convert amount to AXDS terms & add bounty
}
require(amount_ <= AXDS.balanceOf(address(this)), "Insufficient AXDS balance in contract");
AXDS.safeTransfer(_to, amount_);
}
/**
* @notice convert _amount sAXDS into gBalance_ gAXDS
* @param _to address
* @param _amount uint
* @return gBalance_ uint
*/
function wrap(address _to, uint256 _amount) external returns (uint256 gBalance_) {
sAXDS.safeTransferFrom(msg.sender, address(this), _amount);
gBalance_ = gAXDS.balanceTo(_amount);
gAXDS.mint(_to, gBalance_);
}
/**
* @notice convert _amount gAXDS into sBalance_ sAXDS
* @param _to address
* @param _amount uint
* @return sBalance_ uint
*/
function unwrap(address _to, uint256 _amount) external returns (uint256 sBalance_) {
gAXDS.burn(msg.sender, _amount);
sBalance_ = gAXDS.balanceFrom(_amount);
sAXDS.safeTransfer(_to, sBalance_);
}
/**
* @notice trigger rebase if epoch over
* @return uint256
*/
function rebase() public returns (uint256) {
uint256 bounty;
if (epoch.end <= block.timestamp) {
sAXDS.rebase(epoch.distribute, epoch.number);
epoch.end = epoch.end.add(epoch.length);
epoch.number++;
if (address(distributor) != address(0)) {
distributor.distribute();
bounty = distributor.retrieveBounty(); // Will mint axds for this contract if there exists a bounty
}
uint256 balance = AXDS.balanceOf(address(this));
uint256 staked = sAXDS.circulatingSupply();
if (balance <= staked.add(bounty)) {
epoch.distribute = 0;
} else {
epoch.distribute = balance.sub(staked).sub(bounty);
}
}
return bounty;
}
/* ========== INTERNAL FUNCTIONS ========== */
/**
* @notice send staker their amount as sAXDS or gAXDS
* @param _to address
* @param _amount uint
* @param _rebasing bool
*/
function _send(
address _to,
uint256 _amount,
bool _rebasing
) internal returns (uint256) {
if (_rebasing) {
sAXDS.safeTransfer(_to, _amount); // send as sAXDS (equal unit as AXDS)
return _amount;
} else {
gAXDS.mint(_to, gAXDS.balanceTo(_amount)); // send as gAXDS (convert units from AXDS)
return gAXDS.balanceTo(_amount);
}
}
/* ========== VIEW FUNCTIONS ========== */
/**
* @notice returns the sAXDS index, which tracks rebase growth
* @return uint
*/
function index() public view returns (uint256) {
return sAXDS.index();
}
/**
* @notice total supply in warmup
*/
function supplyInWarmup() public view returns (uint256) {
return sAXDS.balanceForGons(gonsInWarmup);
}
/**
* @notice seconds until the next epoch begins
*/
function secondsToNextEpoch() external view returns (uint256) {
return epoch.end.sub(block.timestamp);
}
/* ========== MANAGERIAL FUNCTIONS ========== */
/**
* @notice sets the contract address for LP staking
* @param _distributor address
*/
function setDistributor(address _distributor) external onlyGovernor {
distributor = IDistributor(_distributor);
emit DistributorSet(_distributor);
}
/**
* @notice set warmup period for new stakers
* @param _warmupPeriod uint
*/
function setWarmupLength(uint256 _warmupPeriod) external onlyGovernor {
warmupPeriod = _warmupPeriod;
emit WarmupSet(_warmupPeriod);
}
}
// SPDX-License-Identifier: AGPL-3.0
pragma solidity ^0.7.5;
import "./libraries/SafeERC20.sol";
import "./libraries/SafeMath.sol";
import "./interfaces/IERC20.sol";
import "./interfaces/ITreasury.sol";
import "./interfaces/IDistributor.sol";
import "./types/AxodusAccessControlled.sol";
contract Distributor is IDistributor, AxodusAccessControlled {
/* ========== DEPENDENCIES ========== */
using SafeMath for uint256;
using SafeERC20 for IERC20;
/* ====== VARIABLES ====== */
IERC20 private immutable axds;
ITreasury private immutable treasury;
address private immutable staking;
mapping(uint256 => Adjust) public adjustments;
uint256 public override bounty;
uint256 private immutable rateDenominator = 1_000_000;
/* ====== STRUCTS ====== */
struct Info {
uint256 rate; // in ten-thousandths ( 5000 = 0.5% )
address recipient;
}
Info[] public info;
struct Adjust {
bool add;
uint256 rate;
uint256 target;
}
/* ====== CONSTRUCTOR ====== */
constructor(
address _treasury,
address _axds,
address _staking,
address _authority
) AxodusAccessControlled(IAxodusAuthority(_authority)) {
require(_treasury != address(0), "Zero address: Treasury");
treasury = ITreasury(_treasury);
require(_axds != address(0), "Zero address: AXDS");
axds = IERC20(_axds);
require(_staking != address(0), "Zero address: Staking");
staking = _staking;
}
/* ====== PUBLIC FUNCTIONS ====== */
/**
@notice send epoch reward to staking contract
*/
function distribute() external override {
require(msg.sender == staking, "Only staking");
// distribute rewards to each recipient
for (uint256 i = 0; i < info.length; i++) {
if (info[i].rate > 0) {
treasury.mint(info[i].recipient, nextRewardAt(info[i].rate)); // mint and send tokens
adjust(i); // check for adjustment
}
}
}
function retrieveBounty() external override returns (uint256) {
require(msg.sender == staking, "Only staking");
// If the distributor bounty is > 0, mint it for the staking contract.
if (bounty > 0) {
treasury.mint(address(staking), bounty);
}
return bounty;
}
/* ====== INTERNAL FUNCTIONS ====== */
/**
@notice increment reward rate for collector
*/
function adjust(uint256 _index) internal {
Adjust memory adjustment = adjustments[_index];
if (adjustment.rate != 0) {
if (adjustment.add) {
// if rate should increase
info[_index].rate = info[_index].rate.add(adjustment.rate); // raise rate
if (info[_index].rate >= adjustment.target) {
// if target met
adjustments[_index].rate = 0; // turn off adjustment
info[_index].rate = adjustment.target; // set to target
}
} else {
// if rate should decrease
if (info[_index].rate > adjustment.rate) {
// protect from underflow
info[_index].rate = info[_index].rate.sub(adjustment.rate); // lower rate
} else {
info[_index].rate = 0;
}
if (info[_index].rate <= adjustment.target) {
// if target met
adjustments[_index].rate = 0; // turn off adjustment
info[_index].rate = adjustment.target; // set to target
}
}
}
}
/* ====== VIEW FUNCTIONS ====== */
/**
@notice view function for next reward at given rate
@param _rate uint
@return uint
*/
function nextRewardAt(uint256 _rate) public view override returns (uint256) {
return axds.totalSupply().mul(_rate).div(rateDenominator);
}
/**
@notice view function for next reward for specified address
@param _recipient address
@return uint
*/
function nextRewardFor(address _recipient) public view override returns (uint256) {
uint256 reward;
for (uint256 i = 0; i < info.length; i++) {
if (info[i].recipient == _recipient) {
reward = reward.add(nextRewardAt(info[i].rate));
}
}
return reward;
}
/* ====== POLICY FUNCTIONS ====== */
/**
* @notice set bounty to incentivize keepers
* @param _bounty uint256
*/
function setBounty(uint256 _bounty) external override onlyGovernor {
require(_bounty <= 2e9, "Too much");
bounty = _bounty;
}
/**
@notice adds recipient for distributions
@param _recipient address
@param _rewardRate uint
*/
function addRecipient(address _recipient, uint256 _rewardRate) external override onlyGovernor {
require(_recipient != address(0), "Zero address: Recipient");
require(_rewardRate <= rateDenominator, "Rate cannot exceed denominator");
info.push(Info({recipient: _recipient, rate: _rewardRate}));
}
/**
@notice removes recipient for distributions
@param _index uint
*/
function removeRecipient(uint256 _index) external override {
require(
msg.sender == authority.governor() || msg.sender == authority.guardian(),
"Caller is not governor or guardian"
);
require(info[_index].recipient != address(0), "Recipient does not exist");
info[_index].recipient = address(0);
info[_index].rate = 0;
}
/**
@notice set adjustment info for a collector's reward rate
@param _index uint
@param _add bool
@param _rate uint
@param _target uint
*/
function setAdjustment(
uint256 _index,
bool _add,
uint256 _rate,
uint256 _target
) external override {
require(
msg.sender == authority.governor() || msg.sender == authority.guardian(),
"Caller is not governor or guardian"
);
require(info[_index].recipient != address(0), "Recipient does not exist");
if (msg.sender == authority.guardian()) {
require(_rate <= info[_index].rate.mul(25).div(1000), "Limiter: cannot adjust by >2.5%");
}
if (!_add) {
require(_rate <= info[_index].rate, "Cannot decrease rate by more than it already is");
}
adjustments[_index] = Adjust({add: _add, rate: _rate, target: _target});
}
}
// SPDX-License-Identifier: AGPL-3.0
pragma solidity ^0.7.5;
import "./libraries/SafeMath.sol";
import "./libraries/FixedPoint.sol";
import "./libraries/Address.sol";
import "./libraries/SafeERC20.sol";
import "./interfaces/IERC20Metadata.sol";
import "./interfaces/IERC20.sol";
import "./interfaces/IBondingCalculator.sol";
import "./interfaces/IUniswapV2ERC20.sol";
import "./interfaces/IUniswapV2Pair.sol";
contract AxodusBondingCalculator is IBondingCalculator {
using FixedPoint for *;
using SafeMath for uint256;
IERC20 internal immutable AXDS;
constructor(address _AXDS) {
require(_AXDS != address(0), "Zero address: AXDS");
AXDS = IERC20(_AXDS);
}
function getKValue(address _pair) public view returns (uint256 k_) {
uint256 token0 = IERC20Metadata(IUniswapV2Pair(_pair).token0()).decimals();
uint256 token1 = IERC20Metadata(IUniswapV2Pair(_pair).token1()).decimals();
uint256 decimals = token0.add(token1).sub(IERC20Metadata(_pair).decimals());
(uint256 reserve0, uint256 reserve1, ) = IUniswapV2Pair(_pair).getReserves();
k_ = reserve0.mul(reserve1).div(10**decimals);
}
function getTotalValue(address _pair) public view returns (uint256 _value) {
_value = getKValue(_pair).sqrrt().mul(2);
}
function valuation(address _pair, uint256 amount_) external view override returns (uint256 _value) {
uint256 totalValue = getTotalValue(_pair);
uint256 totalSupply = IUniswapV2Pair(_pair).totalSupply();
_value = totalValue.mul(FixedPoint.fraction(amount_, totalSupply).decode112with18()).div(1e18);
}
function markdown(address _pair) external view override returns (uint256) {
(uint256 reserve0, uint256 reserve1, ) = IUniswapV2Pair(_pair).getReserves();
uint256 reserve;
if (IUniswapV2Pair(_pair).token0() == address(AXDS)) {
reserve = reserve1;
} else {
require(IUniswapV2Pair(_pair).token1() == address(AXDS), "Invalid pair");
reserve = reserve0;
}
return reserve.mul(2 * (10**IERC20Metadata(address(AXDS)).decimals())).div(getTotalValue(_pair));
}
}
// SPDX-License-Identifier: AGPL-3.0
pragma solidity >0.7.5;
import "./libraries/SafeMath.sol";
import "./libraries/SafeERC20.sol";
import "./interfaces/IOwnable.sol";
import "./interfaces/IERC20.sol";
import "./interfaces/IERC20Metadata.sol";
import "./interfaces/IAXDS.sol";
import "./interfaces/IsAXDS.sol";
import "./interfaces/IBondingCalculator.sol";
import "./interfaces/ITreasury.sol";
import "./types/AxodusAccessControlled.sol";
contract AxodusTreasury is AxodusAccessControlled, ITreasury {
/* ========== DEPENDENCIES ========== */
using SafeMath for uint256;
using SafeERC20 for IERC20;
/* ========== EVENTS ========== */
event Deposit(address indexed token, uint256 amount, uint256 value);
event Withdrawal(address indexed token, uint256 amount, uint256 value);
event CreateDebt(address indexed debtor, address indexed token, uint256 amount, uint256 value);
event RepayDebt(address indexed debtor, address indexed token, uint256 amount, uint256 value);
event Managed(address indexed token, uint256 amount);
event ReservesAudited(uint256 indexed totalReserves);
event Minted(address indexed caller, address indexed recipient, uint256 amount);
event PermissionQueued(STATUS indexed status, address queued);
event Permissioned(address addr, STATUS indexed status, bool result);
/* ========== DATA STRUCTURES ========== */
enum STATUS {
RESERVEDEPOSITOR,
RESERVESPENDER,
RESERVETOKEN,
RESERVEMANAGER,
LIQUIDITYDEPOSITOR,
LIQUIDITYTOKEN,
LIQUIDITYMANAGER,
RESERVEDEBTOR,
REWARDMANAGER,
SAXDS,
AXDSDEBTOR
}
struct Queue {
STATUS managing;
address toPermit;
address calculator;
uint256 timelockEnd;
bool nullify;
bool executed;
}
/* ========== STATE VARIABLES ========== */
IAXDS public immutable AXDS;
IsAXDS public sAXDS;
mapping(STATUS => address[]) public registry;
mapping(STATUS => mapping(address => bool)) public permissions;
mapping(address => address) public bondCalculator;
mapping(address => uint256) public debtLimit;
uint256 public totalReserves;
uint256 public totalDebt;
uint256 public axdsDebt;
Queue[] public permissionQueue;
uint256 public immutable blocksNeededForQueue;
bool public timelockEnabled;
bool public initialized;
uint256 public onChainGovernanceTimelock;
string internal notAccepted = "Treasury: not accepted";
string internal notApproved = "Treasury: not approved";
string internal invalidToken = "Treasury: invalid token";
string internal insufficientReserves = "Treasury: insufficient reserves";
/* ========== CONSTRUCTOR ========== */
constructor(
address _axds,
uint256 _timelock,
address _authority
) AxodusAccessControlled(IAxodusAuthority(_authority)) {
require(_axds != address(0), "Zero address: AXDS");
AXDS = IAXDS(_axds);
timelockEnabled = false;
initialized = false;
blocksNeededForQueue = _timelock;
}
/* ========== MUTATIVE FUNCTIONS ========== */
/**
* @notice allow approved address to deposit an asset for AXDS
* @param _amount uint256
* @param _token address
* @param _profit uint256
* @return send_ uint256
*/
function deposit(
uint256 _amount,
address _token,
uint256 _profit
) external override returns (uint256 send_) {
if (permissions[STATUS.RESERVETOKEN][_token]) {
require(permissions[STATUS.RESERVEDEPOSITOR][msg.sender], notApproved);
} else if (permissions[STATUS.LIQUIDITYTOKEN][_token]) {
require(permissions[STATUS.LIQUIDITYDEPOSITOR][msg.sender], notApproved);
} else {
revert(invalidToken);
}
IERC20(_token).safeTransferFrom(msg.sender, address(this), _amount);
uint256 value = tokenValue(_token, _amount);
// mint AXDS needed and store amount of rewards for distribution
send_ = value.sub(_profit);
AXDS.mint(msg.sender, send_);
totalReserves = totalReserves.add(value);
emit Deposit(_token, _amount, value);
}
/**
* @notice allow approved address to burn AXDS for reserves
* @param _amount uint256
* @param _token address
*/
function withdraw(uint256 _amount, address _token) external override {
require(permissions[STATUS.RESERVETOKEN][_token], notAccepted); // Only reserves can be used for redemptions
require(permissions[STATUS.RESERVESPENDER][msg.sender], notApproved);
uint256 value = tokenValue(_token, _amount);
AXDS.burnFrom(msg.sender, value);
totalReserves = totalReserves.sub(value);
IERC20(_token).safeTransfer(msg.sender, _amount);
emit Withdrawal(_token, _amount, value);
}
/**
* @notice allow approved address to withdraw assets
* @param _token address
* @param _amount uint256
*/
function manage(address _token, uint256 _amount) external override {
if (permissions[STATUS.LIQUIDITYTOKEN][_token]) {
require(permissions[STATUS.LIQUIDITYMANAGER][msg.sender], notApproved);
} else {
require(permissions[STATUS.RESERVEMANAGER][msg.sender], notApproved);
}
if (permissions[STATUS.RESERVETOKEN][_token] || permissions[STATUS.LIQUIDITYTOKEN][_token]) {
uint256 value = tokenValue(_token, _amount);
require(value <= excessReserves(), insufficientReserves);
totalReserves = totalReserves.sub(value);
}
IERC20(_token).safeTransfer(msg.sender, _amount);
emit Managed(_token, _amount);
}
/**
* @notice mint new AXDS using excess reserves
* @param _recipient address
* @param _amount uint256
*/
function mint(address _recipient, uint256 _amount) external override {
require(permissions[STATUS.REWARDMANAGER][msg.sender], notApproved);
require(_amount <= excessReserves(), insufficientReserves);
AXDS.mint(_recipient, _amount);
emit Minted(msg.sender, _recipient, _amount);
}
/**
* DEBT: The debt functions allow approved addresses to borrow treasury assets
* or AXDS from the treasury, using sAXDS as collateral. This might allow an
* sAXDS holder to provide AXDS liquidity without taking on the opportunity cost
* of unstaking, or alter their backing without imposing risk onto the treasury.
* Many of these use cases are yet to be defined, but they appear promising.
* However, we urge the community to think critically and move slowly upon
* proposals to acquire these permissions.
*/
/**
* @notice allow approved address to borrow reserves
* @param _amount uint256
* @param _token address
*/
function incurDebt(uint256 _amount, address _token) external override {
uint256 value;
if (_token == address(AXDS)) {
require(permissions[STATUS.AXDSDEBTOR][msg.sender], notApproved);
value = _amount;
} else {
require(permissions[STATUS.RESERVEDEBTOR][msg.sender], notApproved);
require(permissions[STATUS.RESERVETOKEN][_token], notAccepted);
value = tokenValue(_token, _amount);
}
require(value != 0, invalidToken);
sAXDS.changeDebt(value, msg.sender, true);
require(sAXDS.debtBalances(msg.sender) <= debtLimit[msg.sender], "Treasury: exceeds limit");
totalDebt = totalDebt.add(value);
if (_token == address(AXDS)) {
AXDS.mint(msg.sender, value);
axdsDebt = axdsDebt.add(value);
} else {
totalReserves = totalReserves.sub(value);
IERC20(_token).safeTransfer(msg.sender, _amount);
}
emit CreateDebt(msg.sender, _token, _amount, value);
}
/**
* @notice allow approved address to repay borrowed reserves with reserves
* @param _amount uint256
* @param _token address
*/
function repayDebtWithReserve(uint256 _amount, address _token) external override {
require(permissions[STATUS.RESERVEDEBTOR][msg.sender], notApproved);
require(permissions[STATUS.RESERVETOKEN][_token], notAccepted);
IERC20(_token).safeTransferFrom(msg.sender, address(this), _amount);
uint256 value = tokenValue(_token, _amount);
sAXDS.changeDebt(value, msg.sender, false);
totalDebt = totalDebt.sub(value);
totalReserves = totalReserves.add(value);
emit RepayDebt(msg.sender, _token, _amount, value);
}
/**
* @notice allow approved address to repay borrowed reserves with AXDS
* @param _amount uint256
*/
function repayDebtWithAXDS(uint256 _amount) external {
require(
permissions[STATUS.RESERVEDEBTOR][msg.sender] || permissions[STATUS.AXDSDEBTOR][msg.sender],
notApproved
);
AXDS.burnFrom(msg.sender, _amount);
sAXDS.changeDebt(_amount, msg.sender, false);
totalDebt = totalDebt.sub(_amount);
axdsDebt = axdsDebt.sub(_amount);
emit RepayDebt(msg.sender, address(AXDS), _amount, _amount);
}
/* ========== MANAGERIAL FUNCTIONS ========== */
/**
* @notice takes inventory of all tracked assets
* @notice always consolidate to recognized reserves before audit
*/
function auditReserves() external onlyGovernor {
uint256 reserves;
address[] memory reserveToken = registry[STATUS.RESERVETOKEN];
for (uint256 i = 0; i < reserveToken.length; i++) {
if (permissions[STATUS.RESERVETOKEN][reserveToken[i]]) {
reserves = reserves.add(tokenValue(reserveToken[i], IERC20(reserveToken[i]).balanceOf(address(this))));
}
}
address[] memory liquidityToken = registry[STATUS.LIQUIDITYTOKEN];
for (uint256 i = 0; i < liquidityToken.length; i++) {
if (permissions[STATUS.LIQUIDITYTOKEN][liquidityToken[i]]) {
reserves = reserves.add(
tokenValue(liquidityToken[i], IERC20(liquidityToken[i]).balanceOf(address(this)))
);
}
}
totalReserves = reserves;
emit ReservesAudited(reserves);
}
/**
* @notice set max debt for address
* @param _address address
* @param _limit uint256
*/
function setDebtLimit(address _address, uint256 _limit) external onlyGovernor {
debtLimit[_address] = _limit;
}
/**
* @notice enable permission from queue
* @param _status STATUS
* @param _address address
* @param _calculator address
*/
function enable(
STATUS _status,
address _address,
address _calculator
) external onlyGovernor {
require(timelockEnabled == false, "Use queueTimelock");
if (_status == STATUS.SAXDS) {
sAXDS = IsAXDS(_address);
} else {
permissions[_status][_address] = true;
if (_status == STATUS.LIQUIDITYTOKEN) {
bondCalculator[_address] = _calculator;
}
(bool registered, ) = indexInRegistry(_address, _status);
if (!registered) {
registry[_status].push(_address);
if (_status == STATUS.LIQUIDITYTOKEN || _status == STATUS.RESERVETOKEN) {
(bool reg, uint256 index) = indexInRegistry(_address, _status);
if (reg) {
delete registry[_status][index];
}
}
}
}
emit Permissioned(_address, _status, true);
}
/**
* @notice disable permission from address
* @param _status STATUS
* @param _toDisable address
*/
function disable(STATUS _status, address _toDisable) external {
require(msg.sender == authority.governor() || msg.sender == authority.guardian(), "Only governor or guardian");
permissions[_status][_toDisable] = false;
emit Permissioned(_toDisable, _status, false);
}
/**
* @notice check if registry contains address
* @return (bool, uint256)
*/
function indexInRegistry(address _address, STATUS _status) public view returns (bool, uint256) {
address[] memory entries = registry[_status];
for (uint256 i = 0; i < entries.length; i++) {
if (_address == entries[i]) {
return (true, i);
}
}
return (false, 0);
}
/* ========== TIMELOCKED FUNCTIONS ========== */
// functions are used prior to enabling on-chain governance
/**
* @notice queue address to receive permission
* @param _status STATUS
* @param _address address
* @param _calculator address
*/
function queueTimelock(
STATUS _status,
address _address,
address _calculator
) external onlyGovernor {
require(_address != address(0));
require(timelockEnabled == true, "Timelock is disabled, use enable");
uint256 timelock = block.number.add(blocksNeededForQueue);
if (_status == STATUS.RESERVEMANAGER || _status == STATUS.LIQUIDITYMANAGER) {
timelock = block.number.add(blocksNeededForQueue.mul(2));
}
permissionQueue.push(
Queue({
managing: _status,
toPermit: _address,
calculator: _calculator,
timelockEnd: timelock,
nullify: false,
executed: false
})
);
emit PermissionQueued(_status, _address);
}
/**
* @notice enable queued permission
* @param _index uint256
*/
function execute(uint256 _index) external {
require(timelockEnabled == true, "Timelock is disabled, use enable");
Queue memory info = permissionQueue[_index];
require(!info.nullify, "Action has been nullified");
require(!info.executed, "Action has already been executed");
require(block.number >= info.timelockEnd, "Timelock not complete");
if (info.managing == STATUS.SAXDS) {
// 9
sAXDS = IsAXDS(info.toPermit);
} else {
permissions[info.managing][info.toPermit] = true;
if (info.managing == STATUS.LIQUIDITYTOKEN) {
bondCalculator[info.toPermit] = info.calculator;
}
(bool registered, ) = indexInRegistry(info.toPermit, info.managing);
if (!registered) {
registry[info.managing].push(info.toPermit);
if (info.managing == STATUS.LIQUIDITYTOKEN) {
(bool reg, uint256 index) = indexInRegistry(info.toPermit, STATUS.RESERVETOKEN);
if (reg) {
delete registry[STATUS.RESERVETOKEN][index];
}
} else if (info.managing == STATUS.RESERVETOKEN) {
(bool reg, uint256 index) = indexInRegistry(info.toPermit, STATUS.LIQUIDITYTOKEN);
if (reg) {
delete registry[STATUS.LIQUIDITYTOKEN][index];
}
}
}
}
permissionQueue[_index].executed = true;
emit Permissioned(info.toPermit, info.managing, true);
}
/**
* @notice cancel timelocked action
* @param _index uint256
*/
function nullify(uint256 _index) external onlyGovernor {
permissionQueue[_index].nullify = true;
}
/**
* @notice disables timelocked functions
*/
function disableTimelock() external onlyGovernor {
require(timelockEnabled == true, "timelock already disabled");
if (onChainGovernanceTimelock != 0 && onChainGovernanceTimelock <= block.number) {
timelockEnabled = false;
} else {
onChainGovernanceTimelock = block.number.add(blocksNeededForQueue.mul(7)); // 7-day timelock
}
}
/**
* @notice enables timelocks after initilization
*/
function initialize() external onlyGovernor {
require(initialized == false, "Already initialized");
timelockEnabled = true;
initialized = true;
}
/* ========== VIEW FUNCTIONS ========== */
/**
* @notice returns excess reserves not backing tokens
* @return uint
*/
function excessReserves() public view override returns (uint256) {
return totalReserves.sub(AXDS.totalSupply().sub(totalDebt));
}
/**
* @notice returns AXDS valuation of asset
* @param _token address
* @param _amount uint256
* @return value_ uint256
*/
function tokenValue(address _token, uint256 _amount) public view override returns (uint256 value_) {
value_ = _amount.mul(10**IERC20Metadata(address(AXDS)).decimals()).div(10**IERC20Metadata(_token).decimals());
if (permissions[STATUS.LIQUIDITYTOKEN][_token]) {
value_ = IBondingCalculator(bondCalculator[_token]).valuation(_token, _amount);
}
}
/**
* @notice returns supply metric that cannot be manipulated by debt
* @dev use this any time you need to query supply
* @return uint256
*/
function baseSupply() external view override returns (uint256) {
return AXDS.totalSupply() - axdsDebt;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment