Overview
ETH Balance
0 ETH
Eth Value
$0.00Token Holdings
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 101,871 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Unstake | 20176767 | 3 hrs ago | IN | 0 ETH | 0.00110039 | ||||
Wrap | 20176747 | 3 hrs ago | IN | 0 ETH | 0.00156328 | ||||
Wrap | 20176280 | 4 hrs ago | IN | 0 ETH | 0.00023571 | ||||
Wrap | 20176280 | 4 hrs ago | IN | 0 ETH | 0.00059595 | ||||
Wrap | 20175801 | 6 hrs ago | IN | 0 ETH | 0.00071945 | ||||
Wrap | 20172386 | 17 hrs ago | IN | 0 ETH | 0.0002612 | ||||
Unstake | 20171271 | 21 hrs ago | IN | 0 ETH | 0.00034303 | ||||
Unstake | 20171268 | 21 hrs ago | IN | 0 ETH | 0.00039758 | ||||
Unstake | 20171168 | 21 hrs ago | IN | 0 ETH | 0.00041228 | ||||
Unstake | 20170560 | 24 hrs ago | IN | 0 ETH | 0.00065652 | ||||
Wrap | 20170107 | 25 hrs ago | IN | 0 ETH | 0.00116793 | ||||
Unstake | 20170090 | 25 hrs ago | IN | 0 ETH | 0.00063752 | ||||
Wrap | 20168299 | 31 hrs ago | IN | 0 ETH | 0.00036589 | ||||
Unstake | 20167853 | 33 hrs ago | IN | 0 ETH | 0.00036704 | ||||
Wrap | 20163765 | 46 hrs ago | IN | 0 ETH | 0.00069032 | ||||
Wrap | 20159117 | 2 days ago | IN | 0 ETH | 0.00025738 | ||||
Unstake | 20159109 | 2 days ago | IN | 0 ETH | 0.00044713 | ||||
Unstake | 20158485 | 2 days ago | IN | 0 ETH | 0.00015031 | ||||
Unstake | 20157199 | 2 days ago | IN | 0 ETH | 0.00013843 | ||||
Stake | 20156989 | 2 days ago | IN | 0 ETH | 0.00030888 | ||||
Stake | 20155990 | 3 days ago | IN | 0 ETH | 0.00029089 | ||||
Wrap | 20155716 | 3 days ago | IN | 0 ETH | 0.00041304 | ||||
Unstake | 20155597 | 3 days ago | IN | 0 ETH | 0.00059876 | ||||
Unstake | 20155526 | 3 days ago | IN | 0 ETH | 0.00050191 | ||||
Wrap | 20155520 | 3 days ago | IN | 0 ETH | 0.00073454 |
Loading...
Loading
Contract Name:
OlympusStaking
Compiler Version
v0.7.5+commit.eb77ed08
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-12-14 */ // SPDX-License-Identifier: AGPL-3.0-or-later // File: interfaces/IOlympusAuthority.sol pragma solidity =0.7.5; interface IOlympusAuthority { /* ========== EVENTS ========== */ event GovernorPushed(address indexed from, address indexed to, bool _effectiveImmediately); event GuardianPushed(address indexed from, address indexed to, bool _effectiveImmediately); event PolicyPushed(address indexed from, address indexed to, bool _effectiveImmediately); event VaultPushed(address indexed from, address indexed to, bool _effectiveImmediately); event GovernorPulled(address indexed from, address indexed to); event GuardianPulled(address indexed from, address indexed to); event PolicyPulled(address indexed from, address indexed to); event VaultPulled(address indexed from, address indexed to); /* ========== VIEW ========== */ function governor() external view returns (address); function guardian() external view returns (address); function policy() external view returns (address); function vault() external view returns (address); } // File: types/OlympusAccessControlled.sol pragma solidity >=0.7.5; abstract contract OlympusAccessControlled { /* ========== EVENTS ========== */ event AuthorityUpdated(IOlympusAuthority indexed authority); string UNAUTHORIZED = "UNAUTHORIZED"; // save gas /* ========== STATE VARIABLES ========== */ IOlympusAuthority public authority; /* ========== Constructor ========== */ constructor(IOlympusAuthority _authority) { authority = _authority; emit AuthorityUpdated(_authority); } /* ========== MODIFIERS ========== */ modifier onlyGovernor() { require(msg.sender == authority.governor(), UNAUTHORIZED); _; } modifier onlyGuardian() { require(msg.sender == authority.guardian(), UNAUTHORIZED); _; } modifier onlyPolicy() { require(msg.sender == authority.policy(), UNAUTHORIZED); _; } modifier onlyVault() { require(msg.sender == authority.vault(), UNAUTHORIZED); _; } /* ========== GOV ONLY ========== */ function setAuthority(IOlympusAuthority _newAuthority) external onlyGovernor { authority = _newAuthority; emit AuthorityUpdated(_newAuthority); } } // File: interfaces/IDistributor.sol pragma solidity >=0.7.5; interface IDistributor { function distribute() external; function bounty() external view returns (uint256); function retrieveBounty() external returns (uint256); function nextRewardAt(uint256 _rate) external view returns (uint256); function nextRewardFor(address _recipient) external view returns (uint256); function setBounty(uint256 _bounty) external; function addRecipient(address _recipient, uint256 _rewardRate) external; function removeRecipient(uint256 _index) external; function setAdjustment( uint256 _index, bool _add, uint256 _rate, uint256 _target ) external; } // File: interfaces/IERC20.sol pragma solidity >=0.7.5; interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: interfaces/IgOHM.sol pragma solidity >=0.7.5; interface IgOHM is IERC20 { function mint(address _to, uint256 _amount) external; function burn(address _from, uint256 _amount) external; function index() external view returns (uint256); function balanceFrom(uint256 _amount) external view returns (uint256); function balanceTo(uint256 _amount) external view returns (uint256); function migrate( address _staking, address _sOHM ) external; } // File: interfaces/IsOHM.sol pragma solidity >=0.7.5; interface IsOHM is IERC20 { function rebase( uint256 ohmProfit_, uint epoch_) external returns (uint256); function circulatingSupply() external view returns (uint256); function gonsForBalance( uint amount ) external view returns ( uint ); function balanceForGons( uint gons ) external view returns ( uint ); function index() external view returns ( uint ); function toG(uint amount) external view returns (uint); function fromG(uint amount) external view returns (uint); function changeDebt( uint256 amount, address debtor, bool add ) external; function debtBalances(address _address) external view returns (uint256); } // File: libraries/SafeERC20.sol pragma solidity >=0.7.5; /// @notice Safe IERC20 and ETH transfer library that safely handles missing return values. /// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v3-periphery/blob/main/contracts/libraries/TransferHelper.sol) /// Taken from Solmate library SafeERC20 { function safeTransferFrom( IERC20 token, address from, address to, uint256 amount ) internal { (bool success, bytes memory data) = address(token).call( abi.encodeWithSelector(IERC20.transferFrom.selector, from, to, amount) ); require(success && (data.length == 0 || abi.decode(data, (bool))), "TRANSFER_FROM_FAILED"); } function safeTransfer( IERC20 token, address to, uint256 amount ) internal { (bool success, bytes memory data) = address(token).call( abi.encodeWithSelector(IERC20.transfer.selector, to, amount) ); require(success && (data.length == 0 || abi.decode(data, (bool))), "TRANSFER_FAILED"); } function safeApprove( IERC20 token, address to, uint256 amount ) internal { (bool success, bytes memory data) = address(token).call( abi.encodeWithSelector(IERC20.approve.selector, to, amount) ); require(success && (data.length == 0 || abi.decode(data, (bool))), "APPROVE_FAILED"); } function safeTransferETH(address to, uint256 amount) internal { (bool success, ) = to.call{value: amount}(new bytes(0)); require(success, "ETH_TRANSFER_FAILED"); } } // File: libraries/SafeMath.sol pragma solidity ^0.7.5; // TODO(zx): Replace all instances of SafeMath with OZ implementation library SafeMath { function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by 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; } // Only used in the BondingCalculator.sol function sqrrt(uint256 a) internal pure returns (uint c) { if (a > 3) { c = a; uint b = add( div( a, 2), 1 ); while (b < c) { c = b; b = div( add( div( a, b ), b), 2 ); } } else if (a != 0) { c = 1; } } } // File: Staking.sol pragma solidity ^0.7.5; contract OlympusStaking is OlympusAccessControlled { /* ========== DEPENDENCIES ========== */ using SafeMath for uint256; using SafeERC20 for IERC20; using SafeERC20 for IsOHM; using SafeERC20 for IgOHM; /* ========== 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 OHM; IsOHM public immutable sOHM; IgOHM public immutable gOHM; Epoch public epoch; IDistributor public distributor; mapping(address => Claim) public warmupInfo; uint256 public warmupPeriod; uint256 private gonsInWarmup; /* ========== CONSTRUCTOR ========== */ constructor( address _ohm, address _sOHM, address _gOHM, uint256 _epochLength, uint256 _firstEpochNumber, uint256 _firstEpochTime, address _authority ) OlympusAccessControlled(IOlympusAuthority(_authority)) { require(_ohm != address(0), "Zero address: OHM"); OHM = IERC20(_ohm); require(_sOHM != address(0), "Zero address: sOHM"); sOHM = IsOHM(_sOHM); require(_gOHM != address(0), "Zero address: gOHM"); gOHM = IgOHM(_gOHM); epoch = Epoch({length: _epochLength, number: _firstEpochNumber, end: _firstEpochTime, distribute: 0}); } /* ========== MUTATIVE FUNCTIONS ========== */ /** * @notice stake OHM 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) { OHM.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(sOHM.gonsForBalance(_amount)), expiry: epoch.number.add(warmupPeriod), lock: info.lock }); gonsInWarmup = gonsInWarmup.add(sOHM.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, sOHM.balanceForGons(info.gons), _rebasing); } return 0; } /** * @notice forfeit stake and retrieve OHM * @return uint */ function forfeit() external returns (uint256) { Claim memory info = warmupInfo[msg.sender]; delete warmupInfo[msg.sender]; gonsInWarmup = gonsInWarmup.sub(info.gons); OHM.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 sOHM for OHMs * @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) { sOHM.safeTransferFrom(msg.sender, address(this), _amount); amount_ = amount_.add(bounty); } else { gOHM.burn(msg.sender, _amount); // amount was given in gOHM terms amount_ = gOHM.balanceFrom(amount_).add(bounty); // convert amount to OHM terms & add bounty } require(amount_ <= OHM.balanceOf(address(this)), "Insufficient OHM balance in contract"); OHM.safeTransfer(_to, amount_); } /** * @notice convert _amount sOHM into gBalance_ gOHM * @param _to address * @param _amount uint * @return gBalance_ uint */ function wrap(address _to, uint256 _amount) external returns (uint256 gBalance_) { sOHM.safeTransferFrom(msg.sender, address(this), _amount); gBalance_ = gOHM.balanceTo(_amount); gOHM.mint(_to, gBalance_); } /** * @notice convert _amount gOHM into sBalance_ sOHM * @param _to address * @param _amount uint * @return sBalance_ uint */ function unwrap(address _to, uint256 _amount) external returns (uint256 sBalance_) { gOHM.burn(msg.sender, _amount); sBalance_ = gOHM.balanceFrom(_amount); sOHM.safeTransfer(_to, sBalance_); } /** * @notice trigger rebase if epoch over * @return uint256 */ function rebase() public returns (uint256) { uint256 bounty; if (epoch.end <= block.timestamp) { sOHM.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 ohm for this contract if there exists a bounty } uint256 balance = OHM.balanceOf(address(this)); uint256 staked = sOHM.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 sOHM or gOHM * @param _to address * @param _amount uint * @param _rebasing bool */ function _send( address _to, uint256 _amount, bool _rebasing ) internal returns (uint256) { if (_rebasing) { sOHM.safeTransfer(_to, _amount); // send as sOHM (equal unit as OHM) return _amount; } else { gOHM.mint(_to, gOHM.balanceTo(_amount)); // send as gOHM (convert units from OHM) return gOHM.balanceTo(_amount); } } /* ========== VIEW FUNCTIONS ========== */ /** * @notice returns the sOHM index, which tracks rebase growth * @return uint */ function index() public view returns (uint256) { return sOHM.index(); } /** * @notice total supply in warmup */ function supplyInWarmup() public view returns (uint256) { return sOHM.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); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_ohm","type":"address"},{"internalType":"address","name":"_sOHM","type":"address"},{"internalType":"address","name":"_gOHM","type":"address"},{"internalType":"uint256","name":"_epochLength","type":"uint256"},{"internalType":"uint256","name":"_firstEpochNumber","type":"uint256"},{"internalType":"uint256","name":"_firstEpochTime","type":"uint256"},{"internalType":"address","name":"_authority","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IOlympusAuthority","name":"authority","type":"address"}],"name":"AuthorityUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"distributor","type":"address"}],"name":"DistributorSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"warmup","type":"uint256"}],"name":"WarmupSet","type":"event"},{"inputs":[],"name":"OHM","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"authority","outputs":[{"internalType":"contract IOlympusAuthority","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"bool","name":"_rebasing","type":"bool"}],"name":"claim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distributor","outputs":[{"internalType":"contract IDistributor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"epoch","outputs":[{"internalType":"uint256","name":"length","type":"uint256"},{"internalType":"uint256","name":"number","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"},{"internalType":"uint256","name":"distribute","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"forfeit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gOHM","outputs":[{"internalType":"contract IgOHM","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"index","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rebase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sOHM","outputs":[{"internalType":"contract IsOHM","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"secondsToNextEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IOlympusAuthority","name":"_newAuthority","type":"address"}],"name":"setAuthority","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_distributor","type":"address"}],"name":"setDistributor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_warmupPeriod","type":"uint256"}],"name":"setWarmupLength","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bool","name":"_rebasing","type":"bool"},{"internalType":"bool","name":"_claim","type":"bool"}],"name":"stake","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"supplyInWarmup","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bool","name":"_trigger","type":"bool"},{"internalType":"bool","name":"_rebasing","type":"bool"}],"name":"unstake","outputs":[{"internalType":"uint256","name":"amount_","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"unwrap","outputs":[{"internalType":"uint256","name":"sBalance_","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"warmupInfo","outputs":[{"internalType":"uint256","name":"deposit","type":"uint256"},{"internalType":"uint256","name":"gons","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"bool","name":"lock","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"warmupPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"wrap","outputs":[{"internalType":"uint256","name":"gBalance_","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60e06040526040518060400160405280600c81526020017f554e415554484f52495a45440000000000000000000000000000000000000000815250600090805190602001906200005192919062000445565b503480156200005f57600080fd5b50604051620031a4380380620031a4833981810160405260e08110156200008557600080fd5b81019080805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291905050508080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167f2f658b440c35314f52658ea8a740e05b284cdc84dc9ae01e891f21b8933e7cad60405160405180910390a250600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161415620001fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f5a65726f20616464726573733a204f484d00000000000000000000000000000081525060200191505060405180910390fd5b8673ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415620002d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f5a65726f20616464726573733a20734f484d000000000000000000000000000081525060200191505060405180910390fd5b8573ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415620003b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f5a65726f20616464726573733a20674f484d000000000000000000000000000081525060200191505060405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1660601b815250506040518060800160405280858152602001848152602001838152602001600081525060026000820151816000015560208201518160010155604082015181600201556060820151816003015590505050505050505050620004fb565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826200047d5760008555620004c9565b82601f106200049857805160ff1916838001178555620004c9565b82800160010185558215620004c9579182015b82811115620004c8578251825591602001919060010190620004ab565b5b509050620004d89190620004dc565b5090565b5b80821115620004f7576000816000905550600101620004dd565b5090565b60805160601c60a05160601c60c05160601c612bf6620005ae6000398061067f528061082652806108cf528061138552806114325280611b255280611bd352806125b352806125f052806127075250806106a352806106c9528061077e528061098252806112185280611324528061168f52806119d15280611ade5280611ea4528061201452806125655250806114ef528061160e528061165d528061190b5280611cd6528061220f5250612bf66000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c80639483c1d7116100b8578063bf7e214f1161007c578063bf7e214f14610555578063bfe1092814610589578063d866c9d8146105bd578063deac361a14610637578063f3d86e4a14610655578063ff9413d81461067357610142565b80639483c1d714610409578063990966d514610427578063a6c41fec146104a1578063af14052c146104d5578063bf376c7a146104f357610142565b80636746f4c21161010a5780636746f4c21461024d57806375619ab5146102bc5780637a9e5e4b14610300578063900cf0cf146103445780639238d5921461037757806392fd2daf146103a557610142565b80630cd3058514610147578063150799251461017b57806320138641146101af5780632986c0e5146101cd57806339f47693146101eb575b600080fd5b61014f61067d565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6101836106a1565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6101b76106c5565b6040518082815260200191505060405180910390f35b6101d561077a565b6040518082815260200191505060405180910390f35b6102376004803603604081101561020157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610822565b6040518082815260200191505060405180910390f35b61028f6004803603602081101561026357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506109cc565b60405180858152602001848152602001838152602001821515815260200194505050505060405180910390f35b6102fe600480360360208110156102d257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610a09565b005b6103426004803603602081101561031657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c31565b005b61034c610e4f565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b6103a36004803603602081101561038d57600080fd5b8101908080359060200190929190505050610e6d565b005b6103f3600480360360408110156103bb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050611045565b6040518082815260200191505060405180910390f35b6104116112e0565b6040518082815260200191505060405180910390f35b61048b6004803603608081101561043d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035151590602001909291908035151590602001909291905050506112fe565b6040518082815260200191505060405180910390f35b6104a961165b565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104dd61167f565b6040518082815260200191505060405180910390f35b61053f6004803603604081101561050957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611ad4565b6040518082815260200191505060405180910390f35b61055d611c80565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610591611ca6565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610621600480360360808110156105d357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803515159060200190929190803515159060200190929190505050611ccc565b6040518082815260200191505060405180910390f35b61063f6120e2565b6040518082815260200191505060405180910390f35b61065d6120e8565b6040518082815260200191505060405180910390f35b61067b61225e565b005b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637965d56d6009546040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561073a57600080fd5b505afa15801561074e573d6000803e3d6000fd5b505050506040513d602081101561076457600080fd5b8101908080519060200190929190505050905090565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632986c0e56040518163ffffffff1660e01b815260040160206040518083038186803b1580156107e257600080fd5b505afa1580156107f6573d6000803e3d6000fd5b505050506040513d602081101561080c57600080fd5b8101908080519060200190929190505050905090565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16639dc29fac33846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1580156108b557600080fd5b505af11580156108c9573d6000803e3d6000fd5b505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a8248768836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561093e57600080fd5b505afa158015610952573d6000803e3d6000fd5b505050506040513d602081101561096857600080fd5b810190808051906020019092919050505090506109c683827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1661230a9092919063ffffffff16565b92915050565b60076020528060005260406000206000915090508060000154908060010154908060020154908060030160009054906101000a900460ff16905084565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b158015610a7157600080fd5b505afa158015610a85573d6000803e3d6000fd5b505050506040513d6020811015610a9b57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614600090610b9f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818154600181600116156101000203166002900481526020019150805460018160011615610100020316600290048015610b905780601f10610b6557610100808354040283529160200191610b90565b820191906000526020600020905b815481529060010190602001808311610b7357829003601f168201915b50509250505060405180910390fd5b5080600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f86719c518c7d99ac94b3d405d462ea876ba5cd0a978461dc9a7c9862a948588681604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b158015610c9957600080fd5b505afa158015610cad573d6000803e3d6000fd5b505050506040513d6020811015610cc357600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614600090610dc7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818154600181600116156101000203166002900481526020019150805460018160011615610100020316600290048015610db85780601f10610d8d57610100808354040283529160200191610db8565b820191906000526020600020905b815481529060010190602001808311610d9b57829003601f168201915b50509250505060405180910390fd5b5080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167f2f658b440c35314f52658ea8a740e05b284cdc84dc9ae01e891f21b8933e7cad60405160405180910390a250565b60028060000154908060010154908060020154908060030154905084565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b158015610ed557600080fd5b505afa158015610ee9573d6000803e3d6000fd5b505050506040513d6020811015610eff57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614600090611003576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818154600181600116156101000203166002900481526020019150805460018160011615610100020316600290048015610ff45780601f10610fc957610100808354040283529160200191610ff4565b820191906000526020600020905b815481529060010190602001808311610fd757829003601f168201915b50509250505060405180910390fd5b50806008819055507fac17d51c35ac71d3eddc155985908430e88946d51e2f6093e93c1c0aba08f6c4816040518082815260200191505060405180910390a150565b600061104f612b24565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060800160405290816000820154815260200160018201548152602001600282015481526020016003820160009054906101000a900460ff16151515158152505090508060600151611162573373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614611161576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180612b776026913960400191505060405180910390fd5b5b80604001516002600101541015801561118057506000816040015114155b156112d457600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600080820160009055600182016000905560028201600090556003820160006101000a81549060ff0219169055505061120c816020015160095461250c90919063ffffffff16565b6009819055506112cc847f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637965d56d84602001516040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561128b57600080fd5b505afa15801561129f573d6000803e3d6000fd5b505050506040513d60208110156112b557600080fd5b810190808051906020019092919050505085612556565b9150506112da565b60009150505b92915050565b60006112f942600280015461250c90919063ffffffff16565b905090565b6000839050600083156113165761131361167f565b90505b8215611383576113693330877f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166127bb909392919063ffffffff16565b61137c81836129dc90919063ffffffff16565b91506114ed565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16639dc29fac33876040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561141457600080fd5b505af1158015611428573d6000803e3d6000fd5b505050506114ea817f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a8248768856040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156114a157600080fd5b505afa1580156114b5573d6000803e3d6000fd5b505050506040513d60208110156114cb57600080fd5b81019080805190602001909291905050506129dc90919063ffffffff16565b91505b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561157457600080fd5b505afa158015611588573d6000803e3d6000fd5b505050506040513d602081101561159e57600080fd5b8101908080519060200190929190505050821115611607576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180612b9d6024913960400191505060405180910390fd5b61165286837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1661230a9092919063ffffffff16565b50949350505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008042600280015411611acd577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663058ecdb46002600301546002600101546040518363ffffffff1660e01b81526004018083815260200182815260200192505050602060405180830381600087803b15801561171257600080fd5b505af1158015611726573d6000803e3d6000fd5b505050506040513d602081101561173c57600080fd5b81019080805190602001909291905050505061176a60026000015460028001546129dc90919063ffffffff16565b6002800181905550600260010160008154809291906001019190505550600073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461190757600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e4fc6b6d6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561184757600080fd5b505af115801561185b573d6000803e3d6000fd5b50505050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e7187e8a6040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156118c957600080fd5b505af11580156118dd573d6000803e3d6000fd5b505050506040513d60208110156118f357600080fd5b810190808051906020019092919050505090505b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561199057600080fd5b505afa1580156119a4573d6000803e3d6000fd5b505050506040513d60208110156119ba57600080fd5b8101908080519060200190929190505050905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16639358928b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611a3557600080fd5b505afa158015611a49573d6000803e3d6000fd5b505050506040513d6020811015611a5f57600080fd5b81019080805190602001909291905050509050611a8583826129dc90919063ffffffff16565b8211611a9b576000600260030181905550611aca565b611ac083611ab2838561250c90919063ffffffff16565b61250c90919063ffffffff16565b6002600301819055505b50505b8091505090565b6000611b233330847f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166127bb909392919063ffffffff16565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166366a5236c836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015611b9457600080fd5b505afa158015611ba8573d6000803e3d6000fd5b505050506040513d6020811015611bbe57600080fd5b810190808051906020019092919050505090507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166340c10f1984836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b158015611c6257600080fd5b505af1158015611c76573d6000803e3d6000fd5b5050505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000611d1b3330867f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166127bb909392919063ffffffff16565b611d35611d2661167f565b856129dc90919063ffffffff16565b9350818015611d4657506000600854145b15611d5d57611d56858585612556565b90506120da565b611d65612b24565b600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060800160405290816000820154815260200160018201548152602001600282015481526020016003820160009054906101000a900460ff16151515158152505090508060600151611e78573373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614611e77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180612b4f6028913960400191505060405180910390fd5b5b6040518060800160405280611e9a8784600001516129dc90919063ffffffff16565b8152602001611f617f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16631bd39674896040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015611f1357600080fd5b505afa158015611f27573d6000803e3d6000fd5b505050506040513d6020811015611f3d57600080fd5b810190808051906020019092919050505084602001516129dc90919063ffffffff16565b8152602001611f806008546002600101546129dc90919063ffffffff16565b815260200182606001511515815250600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030160006101000a81548160ff0219169083151502179055509050506120cf7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16631bd39674876040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561208357600080fd5b505afa158015612097573d6000803e3d6000fd5b505050506040513d60208110156120ad57600080fd5b81019080805190602001909291905050506009546129dc90919063ffffffff16565b600981905550849150505b949350505050565b60085481565b60006120f2612b24565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060800160405290816000820154815260200160018201548152602001600282015481526020016003820160009054906101000a900460ff1615151515815250509050600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600080820160009055600182016000905560028201600090556003820160006101000a81549060ff021916905550506121fe816020015160095461250c90919063ffffffff16565b6009819055506122533382600001517f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1661230a9092919063ffffffff16565b806000015191505090565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160009054906101000a900460ff1615600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160006101000a81548160ff021916908315150217905550565b600060608473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b8585604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b602083106123ec57805182526020820191506020810190506020830392506123c9565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461244e576040519150601f19603f3d011682016040523d82523d6000602084013e612453565b606091505b50915091508180156124935750600081511480612492575080806020019051602081101561248057600080fd5b81019080805190602001909291905050505b5b612505576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f5452414e534645525f4641494c4544000000000000000000000000000000000081525060200191505060405180910390fd5b5050505050565b600061254e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612a64565b905092915050565b600081156125b1576125a984847f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1661230a9092919063ffffffff16565b8290506127b4565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166340c10f19857f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166366a5236c876040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561265f57600080fd5b505afa158015612673573d6000803e3d6000fd5b505050506040513d602081101561268957600080fd5b81019080805190602001909291905050506040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1580156126ed57600080fd5b505af1158015612701573d6000803e3d6000fd5b505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166366a5236c846040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561277657600080fd5b505afa15801561278a573d6000803e3d6000fd5b505050506040513d60208110156127a057600080fd5b810190808051906020019092919050505090505b9392505050565b600060608573ffffffffffffffffffffffffffffffffffffffff166323b872dd60e01b868686604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b602083106128bb5780518252602082019150602081019050602083039250612898565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461291d576040519150601f19603f3d011682016040523d82523d6000602084013e612922565b606091505b50915091508180156129625750600081511480612961575080806020019051602081101561294f57600080fd5b81019080805190602001909291905050505b5b6129d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5452414e534645525f46524f4d5f4641494c454400000000000000000000000081525060200191505060405180910390fd5b505050505050565b600080828401905083811015612a5a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000838311158290612b11576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612ad6578082015181840152602081019050612abb565b50505050905090810190601f168015612b035780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6040518060800160405280600081526020016000815260200160008152602001600015158152509056fe45787465726e616c206465706f7369747320666f72206163636f756e7420617265206c6f636b656445787465726e616c20636c61696d7320666f72206163636f756e7420617265206c6f636b6564496e73756666696369656e74204f484d2062616c616e636520696e20636f6e7472616374a2646970667358221220939fb5d2fc16bb2d83af9e08025d8b6c177278433ef1affba457ac759d925bf164736f6c6343000705003300000000000000000000000064aa3364f17a4d01c6f1751fd97c2bd3d7e7f1d500000000000000000000000004906695d6d12cf5459975d7c3c03356e4ccd4600000000000000000000000000ab87046fbb341d058f17cbc4c1133f25a20a52f000000000000000000000000000000000000000000000000000000000000708000000000000000000000000000000000000000000000000000000000000003010000000000000000000000000000000000000000000000000000000061b8f7c00000000000000000000000001c21f8ea7e39e2ba00bc12d2968d63f4acb38b7a
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101425760003560e01c80639483c1d7116100b8578063bf7e214f1161007c578063bf7e214f14610555578063bfe1092814610589578063d866c9d8146105bd578063deac361a14610637578063f3d86e4a14610655578063ff9413d81461067357610142565b80639483c1d714610409578063990966d514610427578063a6c41fec146104a1578063af14052c146104d5578063bf376c7a146104f357610142565b80636746f4c21161010a5780636746f4c21461024d57806375619ab5146102bc5780637a9e5e4b14610300578063900cf0cf146103445780639238d5921461037757806392fd2daf146103a557610142565b80630cd3058514610147578063150799251461017b57806320138641146101af5780632986c0e5146101cd57806339f47693146101eb575b600080fd5b61014f61067d565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6101836106a1565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6101b76106c5565b6040518082815260200191505060405180910390f35b6101d561077a565b6040518082815260200191505060405180910390f35b6102376004803603604081101561020157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610822565b6040518082815260200191505060405180910390f35b61028f6004803603602081101561026357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506109cc565b60405180858152602001848152602001838152602001821515815260200194505050505060405180910390f35b6102fe600480360360208110156102d257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610a09565b005b6103426004803603602081101561031657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c31565b005b61034c610e4f565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b6103a36004803603602081101561038d57600080fd5b8101908080359060200190929190505050610e6d565b005b6103f3600480360360408110156103bb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050611045565b6040518082815260200191505060405180910390f35b6104116112e0565b6040518082815260200191505060405180910390f35b61048b6004803603608081101561043d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035151590602001909291908035151590602001909291905050506112fe565b6040518082815260200191505060405180910390f35b6104a961165b565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104dd61167f565b6040518082815260200191505060405180910390f35b61053f6004803603604081101561050957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611ad4565b6040518082815260200191505060405180910390f35b61055d611c80565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610591611ca6565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610621600480360360808110156105d357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803515159060200190929190803515159060200190929190505050611ccc565b6040518082815260200191505060405180910390f35b61063f6120e2565b6040518082815260200191505060405180910390f35b61065d6120e8565b6040518082815260200191505060405180910390f35b61067b61225e565b005b7f0000000000000000000000000ab87046fbb341d058f17cbc4c1133f25a20a52f81565b7f00000000000000000000000004906695d6d12cf5459975d7c3c03356e4ccd46081565b60007f00000000000000000000000004906695d6d12cf5459975d7c3c03356e4ccd46073ffffffffffffffffffffffffffffffffffffffff16637965d56d6009546040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561073a57600080fd5b505afa15801561074e573d6000803e3d6000fd5b505050506040513d602081101561076457600080fd5b8101908080519060200190929190505050905090565b60007f00000000000000000000000004906695d6d12cf5459975d7c3c03356e4ccd46073ffffffffffffffffffffffffffffffffffffffff16632986c0e56040518163ffffffff1660e01b815260040160206040518083038186803b1580156107e257600080fd5b505afa1580156107f6573d6000803e3d6000fd5b505050506040513d602081101561080c57600080fd5b8101908080519060200190929190505050905090565b60007f0000000000000000000000000ab87046fbb341d058f17cbc4c1133f25a20a52f73ffffffffffffffffffffffffffffffffffffffff16639dc29fac33846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1580156108b557600080fd5b505af11580156108c9573d6000803e3d6000fd5b505050507f0000000000000000000000000ab87046fbb341d058f17cbc4c1133f25a20a52f73ffffffffffffffffffffffffffffffffffffffff1663a8248768836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561093e57600080fd5b505afa158015610952573d6000803e3d6000fd5b505050506040513d602081101561096857600080fd5b810190808051906020019092919050505090506109c683827f00000000000000000000000004906695d6d12cf5459975d7c3c03356e4ccd46073ffffffffffffffffffffffffffffffffffffffff1661230a9092919063ffffffff16565b92915050565b60076020528060005260406000206000915090508060000154908060010154908060020154908060030160009054906101000a900460ff16905084565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b158015610a7157600080fd5b505afa158015610a85573d6000803e3d6000fd5b505050506040513d6020811015610a9b57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614600090610b9f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818154600181600116156101000203166002900481526020019150805460018160011615610100020316600290048015610b905780601f10610b6557610100808354040283529160200191610b90565b820191906000526020600020905b815481529060010190602001808311610b7357829003601f168201915b50509250505060405180910390fd5b5080600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f86719c518c7d99ac94b3d405d462ea876ba5cd0a978461dc9a7c9862a948588681604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b158015610c9957600080fd5b505afa158015610cad573d6000803e3d6000fd5b505050506040513d6020811015610cc357600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614600090610dc7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818154600181600116156101000203166002900481526020019150805460018160011615610100020316600290048015610db85780601f10610d8d57610100808354040283529160200191610db8565b820191906000526020600020905b815481529060010190602001808311610d9b57829003601f168201915b50509250505060405180910390fd5b5080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167f2f658b440c35314f52658ea8a740e05b284cdc84dc9ae01e891f21b8933e7cad60405160405180910390a250565b60028060000154908060010154908060020154908060030154905084565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b158015610ed557600080fd5b505afa158015610ee9573d6000803e3d6000fd5b505050506040513d6020811015610eff57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614600090611003576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818154600181600116156101000203166002900481526020019150805460018160011615610100020316600290048015610ff45780601f10610fc957610100808354040283529160200191610ff4565b820191906000526020600020905b815481529060010190602001808311610fd757829003601f168201915b50509250505060405180910390fd5b50806008819055507fac17d51c35ac71d3eddc155985908430e88946d51e2f6093e93c1c0aba08f6c4816040518082815260200191505060405180910390a150565b600061104f612b24565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060800160405290816000820154815260200160018201548152602001600282015481526020016003820160009054906101000a900460ff16151515158152505090508060600151611162573373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614611161576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180612b776026913960400191505060405180910390fd5b5b80604001516002600101541015801561118057506000816040015114155b156112d457600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600080820160009055600182016000905560028201600090556003820160006101000a81549060ff0219169055505061120c816020015160095461250c90919063ffffffff16565b6009819055506112cc847f00000000000000000000000004906695d6d12cf5459975d7c3c03356e4ccd46073ffffffffffffffffffffffffffffffffffffffff16637965d56d84602001516040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561128b57600080fd5b505afa15801561129f573d6000803e3d6000fd5b505050506040513d60208110156112b557600080fd5b810190808051906020019092919050505085612556565b9150506112da565b60009150505b92915050565b60006112f942600280015461250c90919063ffffffff16565b905090565b6000839050600083156113165761131361167f565b90505b8215611383576113693330877f00000000000000000000000004906695d6d12cf5459975d7c3c03356e4ccd46073ffffffffffffffffffffffffffffffffffffffff166127bb909392919063ffffffff16565b61137c81836129dc90919063ffffffff16565b91506114ed565b7f0000000000000000000000000ab87046fbb341d058f17cbc4c1133f25a20a52f73ffffffffffffffffffffffffffffffffffffffff16639dc29fac33876040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561141457600080fd5b505af1158015611428573d6000803e3d6000fd5b505050506114ea817f0000000000000000000000000ab87046fbb341d058f17cbc4c1133f25a20a52f73ffffffffffffffffffffffffffffffffffffffff1663a8248768856040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156114a157600080fd5b505afa1580156114b5573d6000803e3d6000fd5b505050506040513d60208110156114cb57600080fd5b81019080805190602001909291905050506129dc90919063ffffffff16565b91505b7f00000000000000000000000064aa3364f17a4d01c6f1751fd97c2bd3d7e7f1d573ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561157457600080fd5b505afa158015611588573d6000803e3d6000fd5b505050506040513d602081101561159e57600080fd5b8101908080519060200190929190505050821115611607576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180612b9d6024913960400191505060405180910390fd5b61165286837f00000000000000000000000064aa3364f17a4d01c6f1751fd97c2bd3d7e7f1d573ffffffffffffffffffffffffffffffffffffffff1661230a9092919063ffffffff16565b50949350505050565b7f00000000000000000000000064aa3364f17a4d01c6f1751fd97c2bd3d7e7f1d581565b60008042600280015411611acd577f00000000000000000000000004906695d6d12cf5459975d7c3c03356e4ccd46073ffffffffffffffffffffffffffffffffffffffff1663058ecdb46002600301546002600101546040518363ffffffff1660e01b81526004018083815260200182815260200192505050602060405180830381600087803b15801561171257600080fd5b505af1158015611726573d6000803e3d6000fd5b505050506040513d602081101561173c57600080fd5b81019080805190602001909291905050505061176a60026000015460028001546129dc90919063ffffffff16565b6002800181905550600260010160008154809291906001019190505550600073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461190757600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e4fc6b6d6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561184757600080fd5b505af115801561185b573d6000803e3d6000fd5b50505050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e7187e8a6040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156118c957600080fd5b505af11580156118dd573d6000803e3d6000fd5b505050506040513d60208110156118f357600080fd5b810190808051906020019092919050505090505b60007f00000000000000000000000064aa3364f17a4d01c6f1751fd97c2bd3d7e7f1d573ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561199057600080fd5b505afa1580156119a4573d6000803e3d6000fd5b505050506040513d60208110156119ba57600080fd5b8101908080519060200190929190505050905060007f00000000000000000000000004906695d6d12cf5459975d7c3c03356e4ccd46073ffffffffffffffffffffffffffffffffffffffff16639358928b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611a3557600080fd5b505afa158015611a49573d6000803e3d6000fd5b505050506040513d6020811015611a5f57600080fd5b81019080805190602001909291905050509050611a8583826129dc90919063ffffffff16565b8211611a9b576000600260030181905550611aca565b611ac083611ab2838561250c90919063ffffffff16565b61250c90919063ffffffff16565b6002600301819055505b50505b8091505090565b6000611b233330847f00000000000000000000000004906695d6d12cf5459975d7c3c03356e4ccd46073ffffffffffffffffffffffffffffffffffffffff166127bb909392919063ffffffff16565b7f0000000000000000000000000ab87046fbb341d058f17cbc4c1133f25a20a52f73ffffffffffffffffffffffffffffffffffffffff166366a5236c836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015611b9457600080fd5b505afa158015611ba8573d6000803e3d6000fd5b505050506040513d6020811015611bbe57600080fd5b810190808051906020019092919050505090507f0000000000000000000000000ab87046fbb341d058f17cbc4c1133f25a20a52f73ffffffffffffffffffffffffffffffffffffffff166340c10f1984836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b158015611c6257600080fd5b505af1158015611c76573d6000803e3d6000fd5b5050505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000611d1b3330867f00000000000000000000000064aa3364f17a4d01c6f1751fd97c2bd3d7e7f1d573ffffffffffffffffffffffffffffffffffffffff166127bb909392919063ffffffff16565b611d35611d2661167f565b856129dc90919063ffffffff16565b9350818015611d4657506000600854145b15611d5d57611d56858585612556565b90506120da565b611d65612b24565b600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060800160405290816000820154815260200160018201548152602001600282015481526020016003820160009054906101000a900460ff16151515158152505090508060600151611e78573373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614611e77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180612b4f6028913960400191505060405180910390fd5b5b6040518060800160405280611e9a8784600001516129dc90919063ffffffff16565b8152602001611f617f00000000000000000000000004906695d6d12cf5459975d7c3c03356e4ccd46073ffffffffffffffffffffffffffffffffffffffff16631bd39674896040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015611f1357600080fd5b505afa158015611f27573d6000803e3d6000fd5b505050506040513d6020811015611f3d57600080fd5b810190808051906020019092919050505084602001516129dc90919063ffffffff16565b8152602001611f806008546002600101546129dc90919063ffffffff16565b815260200182606001511515815250600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030160006101000a81548160ff0219169083151502179055509050506120cf7f00000000000000000000000004906695d6d12cf5459975d7c3c03356e4ccd46073ffffffffffffffffffffffffffffffffffffffff16631bd39674876040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561208357600080fd5b505afa158015612097573d6000803e3d6000fd5b505050506040513d60208110156120ad57600080fd5b81019080805190602001909291905050506009546129dc90919063ffffffff16565b600981905550849150505b949350505050565b60085481565b60006120f2612b24565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060800160405290816000820154815260200160018201548152602001600282015481526020016003820160009054906101000a900460ff1615151515815250509050600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600080820160009055600182016000905560028201600090556003820160006101000a81549060ff021916905550506121fe816020015160095461250c90919063ffffffff16565b6009819055506122533382600001517f00000000000000000000000064aa3364f17a4d01c6f1751fd97c2bd3d7e7f1d573ffffffffffffffffffffffffffffffffffffffff1661230a9092919063ffffffff16565b806000015191505090565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160009054906101000a900460ff1615600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160006101000a81548160ff021916908315150217905550565b600060608473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b8585604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b602083106123ec57805182526020820191506020810190506020830392506123c9565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461244e576040519150601f19603f3d011682016040523d82523d6000602084013e612453565b606091505b50915091508180156124935750600081511480612492575080806020019051602081101561248057600080fd5b81019080805190602001909291905050505b5b612505576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f5452414e534645525f4641494c4544000000000000000000000000000000000081525060200191505060405180910390fd5b5050505050565b600061254e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612a64565b905092915050565b600081156125b1576125a984847f00000000000000000000000004906695d6d12cf5459975d7c3c03356e4ccd46073ffffffffffffffffffffffffffffffffffffffff1661230a9092919063ffffffff16565b8290506127b4565b7f0000000000000000000000000ab87046fbb341d058f17cbc4c1133f25a20a52f73ffffffffffffffffffffffffffffffffffffffff166340c10f19857f0000000000000000000000000ab87046fbb341d058f17cbc4c1133f25a20a52f73ffffffffffffffffffffffffffffffffffffffff166366a5236c876040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561265f57600080fd5b505afa158015612673573d6000803e3d6000fd5b505050506040513d602081101561268957600080fd5b81019080805190602001909291905050506040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1580156126ed57600080fd5b505af1158015612701573d6000803e3d6000fd5b505050507f0000000000000000000000000ab87046fbb341d058f17cbc4c1133f25a20a52f73ffffffffffffffffffffffffffffffffffffffff166366a5236c846040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561277657600080fd5b505afa15801561278a573d6000803e3d6000fd5b505050506040513d60208110156127a057600080fd5b810190808051906020019092919050505090505b9392505050565b600060608573ffffffffffffffffffffffffffffffffffffffff166323b872dd60e01b868686604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b602083106128bb5780518252602082019150602081019050602083039250612898565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461291d576040519150601f19603f3d011682016040523d82523d6000602084013e612922565b606091505b50915091508180156129625750600081511480612961575080806020019051602081101561294f57600080fd5b81019080805190602001909291905050505b5b6129d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5452414e534645525f46524f4d5f4641494c454400000000000000000000000081525060200191505060405180910390fd5b505050505050565b600080828401905083811015612a5a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000838311158290612b11576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612ad6578082015181840152602081019050612abb565b50505050905090810190601f168015612b035780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6040518060800160405280600081526020016000815260200160008152602001600015158152509056fe45787465726e616c206465706f7369747320666f72206163636f756e7420617265206c6f636b656445787465726e616c20636c61696d7320666f72206163636f756e7420617265206c6f636b6564496e73756666696369656e74204f484d2062616c616e636520696e20636f6e7472616374a2646970667358221220939fb5d2fc16bb2d83af9e08025d8b6c177278433ef1affba457ac759d925bf164736f6c63430007050033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000064aa3364f17a4d01c6f1751fd97c2bd3d7e7f1d500000000000000000000000004906695d6d12cf5459975d7c3c03356e4ccd4600000000000000000000000000ab87046fbb341d058f17cbc4c1133f25a20a52f000000000000000000000000000000000000000000000000000000000000708000000000000000000000000000000000000000000000000000000000000003010000000000000000000000000000000000000000000000000000000061b8f7c00000000000000000000000001c21f8ea7e39e2ba00bc12d2968d63f4acb38b7a
-----Decoded View---------------
Arg [0] : _ohm (address): 0x64aa3364F17a4D01c6f1751Fd97C2BD3D7e7f1D5
Arg [1] : _sOHM (address): 0x04906695D6D12CF5459975d7C3C03356E4Ccd460
Arg [2] : _gOHM (address): 0x0ab87046fBb341D058F17CBC4c1133F25a20a52f
Arg [3] : _epochLength (uint256): 28800
Arg [4] : _firstEpochNumber (uint256): 769
Arg [5] : _firstEpochTime (uint256): 1639512000
Arg [6] : _authority (address): 0x1c21F8EA7e39E2BA00BC12d2968D63F4acb38b7A
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 00000000000000000000000064aa3364f17a4d01c6f1751fd97c2bd3d7e7f1d5
Arg [1] : 00000000000000000000000004906695d6d12cf5459975d7c3c03356e4ccd460
Arg [2] : 0000000000000000000000000ab87046fbb341d058f17cbc4c1133f25a20a52f
Arg [3] : 0000000000000000000000000000000000000000000000000000000000007080
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000301
Arg [5] : 0000000000000000000000000000000000000000000000000000000061b8f7c0
Arg [6] : 0000000000000000000000001c21f8ea7e39e2ba00bc12d2968d63f4acb38b7a
Deployed Bytecode Sourcemap
10610:9027:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11555:27;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;11521;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;18710:115;;;:::i;:::-;;;;;;;;;;;;;;;;;;;18560:85;;;:::i;:::-;;;;;;;;;;;;;;;;;;;16577:224;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;11658:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19196:171;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;2303:168;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;11591:18;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19477:157;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;13877:515;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;18903:118;;;:::i;:::-;;;;;;;;;;;;;;;;;;;15217:783;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;11487:27;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;16896:842;;;:::i;:::-;;;;;;;;;;;;;;;;;;;16169:239;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1491:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;11618:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;12748:982;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;11708:27;;;:::i;:::-;;;;;;;;;;;;;;;;;;;14486:289;;;:::i;:::-;;;;;;;;;;;;;;;;;;;14903:108;;;:::i;:::-;;11555:27;;;:::o;11521:::-;;;:::o;18710:115::-;18757:7;18784:4;:19;;;18804:12;;18784:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18777:40;;18710:115;:::o;18560:85::-;18598:7;18625:4;:10;;;:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18618:19;;18560:85;:::o;16577:224::-;16641:17;16671:4;:9;;;16681:10;16693:7;16671:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16724:4;:16;;;16741:7;16724:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16712:37;;16760:33;16778:3;16783:9;16760:4;:17;;;;:33;;;;;:::i;:::-;16577:224;;;;:::o;11658:43::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;19196:171::-;1830:9;;;;;;;;;;;:18;;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1816:34;;:10;:34;;;1852:12;1808:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19302:12:::1;19275:11;;:40;;;;;;;;;;;;;;;;;;19331:28;19346:12;19331:28;;;;;;;;;;;;;;;;;;;;19196:171:::0;:::o;2303:168::-;1830:9;;;;;;;;;;;:18;;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1816:34;;:10;:34;;;1852:12;1808:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2403:13:::1;2391:9;;:25;;;;;;;;;;;;;;;;;;2449:13;2432:31;;;;;;;;;;;;2303:168:::0;:::o;11591:18::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;19477:157::-;1830:9;;;;;;;;;;;:18;;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1816:34;;:10;:34;;;1852:12;1808:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19573:13:::1;19558:12;:28;;;;19602:24;19612:13;19602:24;;;;;;;;;;;;;;;;;;19477:157:::0;:::o;13877:515::-;13937:7;13957:17;;:::i;:::-;13977:10;:15;13988:3;13977:15;;;;;;;;;;;;;;;13957:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14010:4;:9;;;14005:111;;14051:10;14044:17;;:3;:17;;;14036:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14005:111;14148:4;:11;;;14132:5;:12;;;:27;;:47;;;;;14178:1;14163:4;:11;;;:16;;14132:47;14128:238;;;14203:10;:15;14214:3;14203:15;;;;;;;;;;;;;;;;14196:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14250:27;14267:4;:9;;;14250:12;;:16;;:27;;;;:::i;:::-;14235:12;:42;;;;14301:53;14307:3;14312:4;:19;;;14332:4;:9;;;14312:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14344:9;14301:5;:53::i;:::-;14294:60;;;;;14128:238;14383:1;14376:8;;;13877:515;;;;;:::o;18903:118::-;18956:7;18983:30;18997:15;18983:5;:9;;;:13;;:30;;;;:::i;:::-;18976:37;;18903:118;:::o;15217:783::-;15356:15;15394:7;15384:17;;15412:14;15441:8;15437:58;;;15475:8;:6;:8::i;:::-;15466:17;;15437:58;15509:9;15505:346;;;15535:57;15557:10;15577:4;15584:7;15535:4;:21;;;;:57;;;;;;:::i;:::-;15617:19;15629:6;15617:7;:11;;:19;;;;:::i;:::-;15607:29;;15505:346;;;15669:4;:9;;;15679:10;15691:7;15669:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15758:37;15788:6;15758:4;:16;;;15775:7;15758:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:29;;:37;;;;:::i;:::-;15748:47;;15505:346;15882:3;:13;;;15904:4;15882:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15871:7;:39;;15863:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15962:30;15979:3;15984:7;15962:3;:16;;;;:30;;;;;:::i;:::-;15217:783;;;;;;;:::o;11487:27::-;;;:::o;16896:842::-;16930:7;16950:14;16992:15;16979:5;:9;;;:28;16975:732;;17024:4;:11;;;17036:5;:16;;;17054:5;:12;;;17024:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17096:27;17110:5;:12;;;17096:5;:9;;;:13;;:27;;;;:::i;:::-;17084:5;:9;;:39;;;;17138:5;:12;;;:14;;;;;;;;;;;;;17205:1;17173:34;;17181:11;;;;;;;;;;;17173:34;;;17169:215;;17228:11;;;;;;;;;;;:22;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17280:11;;;;;;;;;;;:26;;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17271:37;;17169:215;17398:15;17416:3;:13;;;17438:4;17416:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17398:46;;17459:14;17476:4;:22;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17459:41;;17530:18;17541:6;17530;:10;;:18;;;;:::i;:::-;17519:7;:29;17515:181;;17588:1;17569:5;:16;;:20;;;;17515:181;;;17649:31;17673:6;17649:19;17661:6;17649:7;:11;;:19;;;;:::i;:::-;:23;;:31;;;;:::i;:::-;17630:5;:16;;:50;;;;17515:181;16975:732;;;17724:6;17717:13;;;16896:842;:::o;16169:239::-;16231:17;16261:57;16283:10;16303:4;16310:7;16261:4;:21;;;;:57;;;;;;:::i;:::-;16341:4;:14;;;16356:7;16341:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16329:35;;16375:4;:9;;;16385:3;16390:9;16375:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16169:239;;;;:::o;1491:34::-;;;;;;;;;;;;;:::o;11618:31::-;;;;;;;;;;;;;:::o;12748:982::-;12883:7;12903:56;12924:10;12944:4;12951:7;12903:3;:20;;;;:56;;;;;;:::i;:::-;12980:21;12992:8;:6;:8::i;:::-;12980:7;:11;;:21;;;;:::i;:::-;12970:31;;13049:6;:27;;;;;13075:1;13059:12;;:17;13049:27;13045:678;;;13100:30;13106:3;13111:7;13120:9;13100:5;:30::i;:::-;13093:37;;;;13045:678;13163:17;;:::i;:::-;13183:10;:15;13194:3;13183:15;;;;;;;;;;;;;;;13163:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13218:4;:9;;;13213:121;;13263:10;13256:17;;:3;:17;;;13248:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13213:121;13368:234;;;;;;;;13402:25;13419:7;13402:4;:12;;;:16;;:25;;;;:::i;:::-;13368:234;;;;13452:43;13466:4;:19;;;13486:7;13466:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13452:4;:9;;;:13;;:43;;;;:::i;:::-;13368:234;;;;13522:30;13539:12;;13522:5;:12;;;:16;;:30;;;;:::i;:::-;13368:234;;;;13577:4;:9;;;13368:234;;;;;13350:10;:15;13361:3;13350:15;;;;;;;;;;;;;;;:252;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13634:46;13651:4;:19;;;13671:7;13651:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13634:12;;:16;;:46;;;;:::i;:::-;13619:12;:61;;;;13704:7;13697:14;;;12748:982;;;;;;;:::o;11708:27::-;;;;:::o;14486:289::-;14523:7;14543:17;;:::i;:::-;14563:10;:22;14574:10;14563:22;;;;;;;;;;;;;;;14543:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14603:10;:22;14614:10;14603:22;;;;;;;;;;;;;;;;14596:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14653:27;14670:4;:9;;;14653:12;;:16;;:27;;;;:::i;:::-;14638:12;:42;;;;14693;14710:10;14722:4;:12;;;14693:3;:16;;;;:42;;;;;:::i;:::-;14755:4;:12;;;14748:19;;;14486:289;:::o;14903:108::-;14976:10;:22;14987:10;14976:22;;;;;;;;;;;;;;;:27;;;;;;;;;;;;14975:28;14945:10;:22;14956:10;14945:22;;;;;;;;;;;;;;;:27;;;:58;;;;;;;;;;;;;;;;;;14903:108::o;7842:365::-;7961:12;7975:17;8004:5;7996:19;;8053:24;;;8079:2;8083:6;8030:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7996:105;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7960:141;;;;8122:7;:57;;;;;8149:1;8134:4;:11;:16;:44;;;;8165:4;8154:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8134:44;8122:57;8114:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7842:365;;;;;:::o;9130:136::-;9188:7;9215:43;9219:1;9222;9215:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;9208:50;;9130:136;;;;:::o;17960:436::-;18073:7;18097:9;18093:296;;;18123:31;18141:3;18146:7;18123:4;:17;;;;:31;;;;;:::i;:::-;18212:7;18205:14;;;;18093:296;18252:4;:9;;;18262:3;18267:4;:14;;;18282:7;18267:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18252:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18354:4;:14;;;18369:7;18354:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18347:30;;17960:436;;;;;;:::o;7427:407::-;7573:12;7587:17;7616:5;7608:19;;7665:28;;;7695:4;7701:2;7705:6;7642:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7608:115;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7572:151;;;;7744:7;:57;;;;;7771:1;7756:4;:11;:16;:44;;;;7787:4;7776:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7756:44;7744:57;7736:90;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7427:407;;;;;;:::o;8941:181::-;8999:7;9019:9;9035:1;9031;:5;9019:17;;9060:1;9055;:6;;9047:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9113:1;9106:8;;;8941:181;;;;:::o;9274:192::-;9360:7;9393:1;9388;:6;;9396:12;9380:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9420:9;9436:1;9432;:5;9420:17;;9457:1;9450:8;;;9274:192;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://939fb5d2fc16bb2d83af9e08025d8b6c177278433ef1affba457ac759d925bf1
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.