Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
TransferHandler01
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-12-04 */ // Sources flattened with hardhat v2.0.1 https://hardhat.org // File @openzeppelin/contracts-ethereum-package/contracts/[email protected] pragma solidity >=0.4.24 <0.7.0; /** * @title Initializable * * @dev Helper contract to support initializer functions. To use it, replace * the constructor with a function that has the `initializer` modifier. * WARNING: Unlike constructors, initializer functions must be manually * invoked. This applies both to deploying an Initializable contract, as well * as extending an Initializable contract via inheritance. * WARNING: When used with inheritance, manual care must be taken to not invoke * a parent initializer twice, or ensure that all initializers are idempotent, * because this is not dealt with automatically as with constructors. */ contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private initializing; /** * @dev Modifier to use in the initializer function of a contract. */ modifier initializer() { require(initializing || isConstructor() || !initialized, "Contract instance has already been initialized"); bool isTopLevelCall = !initializing; if (isTopLevelCall) { initializing = true; initialized = true; } _; if (isTopLevelCall) { initializing = false; } } /// @dev Returns true if and only if the function is running in the constructor function isConstructor() private view returns (bool) { // extcodesize checks the size of the code stored in an address, and // address returns the current address. Since the code is still not // deployed when running a constructor, any checks on its code size will // yield zero, making it an effective way to detect if a contract is // under construction or not. address self = address(this); uint256 cs; assembly { cs := extcodesize(self) } return cs == 0; } // Reserved storage space to allow for layout changes in the future. uint256[50] private ______gap; } // File @openzeppelin/contracts-ethereum-package/contracts/GSN/[email protected] pragma solidity ^0.6.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ contract ContextUpgradeSafe is Initializable { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. function __Context_init() internal initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer { } function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } uint256[50] private __gap; } // File @openzeppelin/contracts-ethereum-package/contracts/access/[email protected] pragma solidity ^0.6.0; /** * @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. */ contract OwnableUpgradeSafe is Initializable, ContextUpgradeSafe { 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 initializer { __Context_init_unchained(); __Ownable_init_unchained(); } function __Ownable_init_unchained() internal initializer { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view 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 { emit OwnershipTransferred(_owner, address(0)); _owner = 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"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } uint256[49] private __gap; } // File @openzeppelin/contracts-ethereum-package/contracts/math/[email protected] pragma solidity ^0.6.0; /** * @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) { // Solidity only automatically asserts when dividing by 0 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; } } // File @openzeppelin/contracts-ethereum-package/contracts/token/ERC20/[email protected] pragma solidity ^0.6.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ 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 @uniswap/v2-core/contracts/interfaces/[email protected] pragma solidity >=0.5.0; interface IUniswapV2Factory { event PairCreated(address indexed token0, address indexed token1, address pair, uint); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint) external view returns (address pair); function allPairsLength() external view returns (uint); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } // File contracts/v612/ICOREGlobals.sol // SPDX-License-Identifier: MIT // COPYRIGHT cVault.finance TEAM // NO COPY // COPY = BAD // This code is provided with no assurances or guarantees of any kind. Use at your own responsibility. interface ICOREGlobals { function CORETokenAddress() external view returns (address); function COREGlobalsAddress() external view returns (address); function COREDelegatorAddress() external view returns (address); function COREVaultAddress() external returns (address); function COREWETHUniPair() external view returns (address); function UniswapFactory() external view returns (address); function TransferHandler() external view returns (address); function addDelegatorStateChangePermission(address that, bool status) external; function isStateChangeApprovedContract(address that) external view returns (bool); function FannyTokenAddress() external view returns (address); function FannyVaultAddress() external view returns (address); function isContract(address) external view returns (bool); } // File contracts/v612/TransferHandler01.sol /// Transfer handler v0.15c // The basic needed for double coins to work // While we wait for TransferHandler 1.0 to be properly tested. pragma solidity ^0.6.0; interface Uniswap { function token0() external returns (address); function token1() external returns (address); } contract TransferHandler01 is OwnableUpgradeSafe { using SafeMath for uint256; ICOREGlobals coreGlobals; address tokenUniswapPairCORE; address[] public trackedPairs; uint8 public feePercentX100; // max 255 = 25.5% artificial clamp bool public transfersPaused; mapping (address => bool) public noFeeList; mapping (address => bool) public isPair; mapping(address => uint256) private lpSupplyOfPair; // Upgrade 1 mapping (address => bool) public noFeeRecipent; // Upgrade 1 end function initialize( address _coreGlobals ) public initializer { require(tx.origin == address(0x5A16552f59ea34E44ec81E58b3817833E9fD5436)); OwnableUpgradeSafe.__Ownable_init(); coreGlobals = ICOREGlobals(_coreGlobals); feePercentX100 = 10; //1% transfersPaused = true; // pause transfers until we change the contract address to this one // Then unpause will sync all pairs tokenUniswapPairCORE = coreGlobals.COREWETHUniPair(); _editNoFeeList(coreGlobals.COREVaultAddress(), true); // corevault proxy needs to have no sender fee _addPairToTrack(coreGlobals.COREWETHUniPair()); // minFinney = 5000; } // No need to remove pairs function addPairToTrack(address pair) onlyOwner public { _addPairToTrack(pair); } function _addPairToTrack(address pair) internal { uint256 length = trackedPairs.length; for (uint256 i = 0; i < length; i++) { require(trackedPairs[i] != pair, "Pair already tracked"); } // we sync sync(pair); // we add to array so we can loop over it trackedPairs.push(pair); // we add pair to no fee sender list _editNoFeeList(pair, true); // we add it to pair mapping to lookups isPair[pair] = true; } // CORE token is pausable function setPaused(bool _pause) public onlyOwner { transfersPaused = _pause; // Sync all tracked pairs uint256 length = trackedPairs.length; for (uint256 i = 0; i < length; i++) { sync(trackedPairs[i]); } } function setFeeMultiplier(uint8 _feeMultiplier) public onlyOwner { feePercentX100 = _feeMultiplier; } function editNoFeeList(address _address, bool noFee) public onlyOwner { _editNoFeeList(_address,noFee); } function _editNoFeeList(address _address, bool noFee) internal{ noFeeList[_address] = noFee; } // uint minFinney; // 2x for $ liq amount // function setMinimumLiquidityToTriggerStop(uint finneyAmnt) public onlyOwner{ // 1000 = 1eth // minFinney = finneyAmnt; // } // Old sync for backwards compatibility - syncs COREtokenEthPair function sync() public returns (bool lastIsMint, bool lpTokenBurn) { (lastIsMint, lpTokenBurn) = sync(tokenUniswapPairCORE); // This will update the state of lastIsMint, when called publically // So we have to sync it before to the last LP token value. // uint256 _balanceWETH = IERC20(WETHAddress).balanceOf(tokenUniswapPair); // uint256 _balanceCORE = IERC20(coreTokenAddress).balanceOf(tokenUniswapPair); // Do not block after small liq additions // you can only withdraw 350$ now with front running // And cant front run buys with liq add ( adversary drain ) // lastIsMint = _balanceCORE > lastSupplyOfCoreInPair && _balanceWETH > lastSupplyOfWETHInPair.add(minFinney.mul(1 finney)); // lastSupplyOfCoreInPair = _balanceCORE; // lastSupplyOfWETHInPair = _balanceWETH; } function sync(address pair) public returns (bool lastIsMint, bool lpTokenBurn) { // This will update the state of lastIsMint, when called publically // So we have to sync it before to the last LP token value. uint256 _LPSupplyOfPairNow = IERC20(pair).totalSupply(); lpTokenBurn = lpSupplyOfPair[pair] > _LPSupplyOfPairNow; lpSupplyOfPair[pair] = _LPSupplyOfPairNow; lastIsMint = false; } // Called by ERC95 // They are not pausable // or have a fee // at least right now // Note ERC95 will make it impossible to withdraw liq at all // Because CORE will sync, or it will sync while the transfer is happening // and revert // Note 2 : it would be cool to have own WETH but that woudnt be supported by uniswap function handleTransfer (address sender, address recipient, uint256 amount ) public { // If the pair is sender it might be a burn // So we sync and then check if(isPair[sender]) { (bool lastIsMint, bool lpTokenBurn) = sync(sender); require(lastIsMint == false, "CORE TransferHandler v0.1 : Liquidity withdrawals forbidden"); require(lpTokenBurn == false, "CORE TransferHandler v0.1 : Liquidity withdrawals forbidden"); } // If recipent is pair we just sync else if(isPair[recipient]) { sync(recipient); } } function calculateAmountsAfterFee( address sender, address recipient, uint256 amount ) public returns (uint256 transferToAmount, uint256 transferToFeeDistributorAmount) { require(transfersPaused == false, "CORE TransferHandler v0.1 : Transfers Paused"); // If the sender is pair // We sync and check for a burn happening if(isPair[sender]) { (bool lastIsMint, bool lpTokenBurn) = sync(sender); require(lastIsMint == false, "CORE TransferHandler v0.1 : Liquidity withdrawals forbidden"); require(lpTokenBurn == false, "CORE TransferHandler v0.1 : Liquidity withdrawals forbidden"); } // If recipient is pair we just sync else if(isPair[recipient]) { sync(recipient); } // Because CORE isn't double controlled we should sync it on normal transfers as well if(!isPair[recipient] && !isPair[sender]) sync(); if(noFeeList[sender]) { // Dont have a fee when corevault is sending, or infinite loop // And when pair is sending ( buys are happening, no tax on it) transferToFeeDistributorAmount = 0; transferToAmount = amount; } else { transferToFeeDistributorAmount = amount.mul(feePercentX100).div(1000); transferToAmount = amount.sub(transferToFeeDistributorAmount); } /// Upgrade1 if(noFeeRecipent[recipient]) { transferToFeeDistributorAmount = 0; transferToAmount = amount; } // Upgrade 1 end } /// UPGRADE START 01 function editNoFeeRecipentList(address _address, bool noFee) public onlyOwner { _editNoFeeRecipentList(_address,noFee); } function _editNoFeeRecipentList(address _address, bool noFee) internal{ noFeeRecipent[_address] = noFee; } function handleRestrictedTokenTransfer(address _from, address _to, uint256 _amount) public { // Exceptions include fanny vault and when claiming the token itself // this will fail ungracefully if its any other contract if(coreGlobals.isContract(_to)) { try Uniswap(_to).token0() { address token0 = Uniswap(_to).token0(); address token1 = Uniswap(_to).token1(); require(token1 == coreGlobals.CORETokenAddress() || token0 == coreGlobals.CORETokenAddress() , "Pairs only against CORE allowed."); } catch {} } } /// UPGRADE START 01 }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"address","name":"pair","type":"address"}],"name":"addPairToTrack","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"calculateAmountsAfterFee","outputs":[{"internalType":"uint256","name":"transferToAmount","type":"uint256"},{"internalType":"uint256","name":"transferToFeeDistributorAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"noFee","type":"bool"}],"name":"editNoFeeList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"noFee","type":"bool"}],"name":"editNoFeeRecipentList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feePercentX100","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"handleRestrictedTokenTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"handleTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_coreGlobals","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"noFeeList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"noFeeRecipent","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_feeMultiplier","type":"uint8"}],"name":"setFeeMultiplier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_pause","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"}],"name":"sync","outputs":[{"internalType":"bool","name":"lastIsMint","type":"bool"},{"internalType":"bool","name":"lpTokenBurn","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sync","outputs":[{"internalType":"bool","name":"lastIsMint","type":"bool"},{"internalType":"bool","name":"lpTokenBurn","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"trackedPairs","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transfersPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b506118bd806100206000396000f3fe608060405234801561001057600080fd5b506004361061012c5760003560e01c8063715018a6116100ad578063c4d66de811610071578063c4d66de814610389578063d0573a41146103af578063e5e31b13146103e5578063f2fde38b1461040b578063fff6cae9146104315761012c565b8063715018a6146102f25780638aa1ff70146102fa5780638aee4cfe146103205780638da5cb5b14610340578063a5841194146103485761012c565b80634563f30a116100f45780634563f30a1461021357806346197c9a1461022f57806351d271be1461026557806355a60381146102935780635df25bda146102cc5761012c565b8063012061131461013157806316c38b3c14610161578063301a5801146101805780633b4e71ad146101cf5780633fd80006146101ed575b600080fd5b61015f6004803603604081101561014757600080fd5b506001600160a01b0381351690602001351515610439565b005b61015f6004803603602081101561017757600080fd5b5035151561049f565b6101b66004803603606081101561019657600080fd5b506001600160a01b03813581169160208101359091169060400135610551565b6040805192835260208301919091528051918290030190f35b6101d7610759565b6040805160ff9092168252519081900360200190f35b61015f6004803603602081101561020357600080fd5b50356001600160a01b0316610762565b61021b6107c6565b604080519115158252519081900360200190f35b61015f6004803603606081101561024557600080fd5b506001600160a01b038135811691602081013590911690604001356107d4565b61015f6004803603604081101561027b57600080fd5b506001600160a01b03813516906020013515156108b8565b6102b0600480360360208110156102a957600080fd5b503561091a565b604080516001600160a01b039092168252519081900360200190f35b61021b600480360360208110156102e257600080fd5b50356001600160a01b0316610941565b61015f610956565b61021b6004803603602081101561031057600080fd5b50356001600160a01b03166109f8565b61015f6004803603602081101561033657600080fd5b503560ff16610a0d565b6102b0610a7b565b61036e6004803603602081101561035e57600080fd5b50356001600160a01b0316610a8a565b60408051921515835290151560208301528051918290030190f35b61015f6004803603602081101561039f57600080fd5b50356001600160a01b0316610b1e565b61015f600480360360608110156103c557600080fd5b506001600160a01b03813581169160208101359091169060400135610d94565b61021b600480360360208110156103fb57600080fd5b50356001600160a01b03166110ba565b61015f6004803603602081101561042157600080fd5b50356001600160a01b03166110cf565b61036e6111c8565b6104416111eb565b6065546001600160a01b03908116911614610491576040805162461bcd60e51b815260206004820181905260248201526000805160206117d3833981519152604482015290519081900360640190fd5b61049b82826111ef565b5050565b6104a76111eb565b6065546001600160a01b039081169116146104f7576040805162461bcd60e51b815260206004820181905260248201526000805160206117d3833981519152604482015290519081900360640190fd5b609a805461ff0019166101008315150217905560995460005b8181101561054c576105426099828154811061052857fe5b6000918252602090912001546001600160a01b0316610a8a565b5050600101610510565b505050565b609a546000908190610100900460ff161561059d5760405162461bcd60e51b815260040180806020018281038252602c81526020018061185c602c913960400191505060405180910390fd5b6001600160a01b0385166000908152609c602052604090205460ff1615610650576000806105ca87610a8a565b9092509050811561060c5760405162461bcd60e51b815260040180806020018281038252603b815260200180611821603b913960400191505060405180910390fd5b80156106495760405162461bcd60e51b815260040180806020018281038252603b815260200180611821603b913960400191505060405180910390fd5b505061067d565b6001600160a01b0384166000908152609c602052604090205460ff161561067d5761067a84610a8a565b50505b6001600160a01b0384166000908152609c602052604090205460ff161580156106bf57506001600160a01b0385166000908152609c602052604090205460ff16155b156106cf576106cc6111c8565b50505b6001600160a01b0385166000908152609b602052604090205460ff16156106fb57508190506000610729565b609a5461071a906103e89061071490869060ff1661121a565b9061127c565b905061072683826112be565b91505b6001600160a01b0384166000908152609e602052604090205460ff1615610751575081905060005b935093915050565b609a5460ff1681565b61076a6111eb565b6065546001600160a01b039081169116146107ba576040805162461bcd60e51b815260206004820181905260248201526000805160206117d3833981519152604482015290519081900360640190fd5b6107c381611300565b50565b609a54610100900460ff1681565b6001600160a01b0383166000908152609c602052604090205460ff16156108875760008061080185610a8a565b909250905081156108435760405162461bcd60e51b815260040180806020018281038252603b815260200180611821603b913960400191505060405180910390fd5b80156108805760405162461bcd60e51b815260040180806020018281038252603b815260200180611821603b913960400191505060405180910390fd5b505061054c565b6001600160a01b0382166000908152609c602052604090205460ff161561054c576108b182610a8a565b5050505050565b6108c06111eb565b6065546001600160a01b03908116911614610910576040805162461bcd60e51b815260206004820181905260248201526000805160206117d3833981519152604482015290519081900360640190fd5b61049b8282611414565b6099818154811061092757fe5b6000918252602090912001546001600160a01b0316905081565b609e6020526000908152604090205460ff1681565b61095e6111eb565b6065546001600160a01b039081169116146109ae576040805162461bcd60e51b815260206004820181905260248201526000805160206117d3833981519152604482015290519081900360640190fd5b6065546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3606580546001600160a01b0319169055565b609b6020526000908152604090205460ff1681565b610a156111eb565b6065546001600160a01b03908116911614610a65576040805162461bcd60e51b815260206004820181905260248201526000805160206117d3833981519152604482015290519081900360640190fd5b609a805460ff191660ff92909216919091179055565b6065546001600160a01b031690565b6000806000836001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610ac857600080fd5b505afa158015610adc573d6000803e3d6000fd5b505050506040513d6020811015610af257600080fd5b50516001600160a01b039094166000908152609d60205260408120805490869055909594109392505050565b600054610100900460ff1680610b375750610b3761143f565b80610b45575060005460ff16155b610b805760405162461bcd60e51b815260040180806020018281038252602e8152602001806117f3602e913960400191505060405180910390fd5b600054610100900460ff16158015610bab576000805460ff1961ff0019909116610100171660011790555b32735a16552f59ea34e44ec81e58b3817833e9fd543614610bcb57600080fd5b610bd3611445565b609780546001600160a01b038085166001600160a01b03199092169190911791829055609a805461ff001960ff19909116600a17166101001790556040805163161d5a0360e11b815290519290911691632c3ab40691600480820192602092909190829003018186803b158015610c4957600080fd5b505afa158015610c5d573d6000803e3d6000fd5b505050506040513d6020811015610c7357600080fd5b5051609880546001600160a01b0319166001600160a01b0392831617905560975460408051637bb53c2d60e11b81529051610d0893929092169163f76a785a916004808201926020929091908290030181600087803b158015610cd557600080fd5b505af1158015610ce9573d6000803e3d6000fd5b505050506040513d6020811015610cff57600080fd5b50516001611414565b6097546040805163161d5a0360e11b81529051610d7f926001600160a01b031691632c3ab406916004808301926020929190829003018186803b158015610d4e57600080fd5b505afa158015610d62573d6000803e3d6000fd5b505050506040513d6020811015610d7857600080fd5b5051611300565b801561049b576000805461ff00191690555050565b60975460408051631627905560e01b81526001600160a01b038581166004830152915191909216916316279055916024808301926020929190829003018186803b158015610de157600080fd5b505afa158015610df5573d6000803e3d6000fd5b505050506040513d6020811015610e0b57600080fd5b50511561054c57816001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610e4d57600080fd5b505af1925050508015610e7257506040513d6020811015610e6d57600080fd5b505160015b610e7b5761054c565b506000826001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610eb957600080fd5b505af1158015610ecd573d6000803e3d6000fd5b505050506040513d6020811015610ee357600080fd5b50516040805163d21220a760e01b815290519192506000916001600160a01b0386169163d21220a791600480830192602092919082900301818787803b158015610f2c57600080fd5b505af1158015610f40573d6000803e3d6000fd5b505050506040513d6020811015610f5657600080fd5b50516097546040805163061be4cb60e11b815290519293506001600160a01b0390911691630c37c99691600480820192602092909190829003018186803b158015610fa057600080fd5b505afa158015610fb4573d6000803e3d6000fd5b505050506040513d6020811015610fca57600080fd5b50516001600160a01b03828116911614806110695750609760009054906101000a90046001600160a01b03166001600160a01b0316630c37c9966040518163ffffffff1660e01b815260040160206040518083038186803b15801561102e57600080fd5b505afa158015611042573d6000803e3d6000fd5b505050506040513d602081101561105857600080fd5b50516001600160a01b038381169116145b6108b1576040805162461bcd60e51b815260206004820181905260248201527f5061697273206f6e6c7920616761696e737420434f524520616c6c6f7765642e604482015290519081900360640190fd5b609c6020526000908152604090205460ff1681565b6110d76111eb565b6065546001600160a01b03908116911614611127576040805162461bcd60e51b815260206004820181905260248201526000805160206117d3833981519152604482015290519081900360640190fd5b6001600160a01b03811661116c5760405162461bcd60e51b815260040180806020018281038252602681526020018061178c6026913960400191505060405180910390fd5b6065546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3606580546001600160a01b0319166001600160a01b0392909216919091179055565b60985460009081906111e2906001600160a01b0316610a8a565b90939092509050565b3390565b6001600160a01b03919091166000908152609e60205260409020805460ff1916911515919091179055565b60008261122957506000611276565b8282028284828161123657fe5b04146112735760405162461bcd60e51b81526004018080602001828103825260218152602001806117b26021913960400191505060405180910390fd5b90505b92915050565b600061127383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506114f6565b600061127383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611598565b60995460005b8181101561138c57826001600160a01b03166099828154811061132557fe5b6000918252602090912001546001600160a01b03161415611384576040805162461bcd60e51b815260206004820152601460248201527314185a5c88185b1c9958591e481d1c9858dad95960621b604482015290519081900360640190fd5b600101611306565b5061139682610a8a565b505060998054600180820183556000929092527f72a152ddfb8e864297c917af52ea6c1c68aead0fee1a62673fcc7e0c94979d000180546001600160a01b0319166001600160a01b0385161790556113ef908390611414565b506001600160a01b03166000908152609c60205260409020805460ff19166001179055565b6001600160a01b03919091166000908152609b60205260409020805460ff1916911515919091179055565b303b1590565b600054610100900460ff168061145e575061145e61143f565b8061146c575060005460ff16155b6114a75760405162461bcd60e51b815260040180806020018281038252602e8152602001806117f3602e913960400191505060405180910390fd5b600054610100900460ff161580156114d2576000805460ff1961ff0019909116610100171660011790555b6114da6115f2565b6114e2611692565b80156107c3576000805461ff001916905550565b600081836115825760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561154757818101518382015260200161152f565b50505050905090810190601f1680156115745780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161158e57fe5b0495945050505050565b600081848411156115ea5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561154757818101518382015260200161152f565b505050900390565b600054610100900460ff168061160b575061160b61143f565b80611619575060005460ff16155b6116545760405162461bcd60e51b815260040180806020018281038252602e8152602001806117f3602e913960400191505060405180910390fd5b600054610100900460ff161580156114e2576000805460ff1961ff00199091166101001716600117905580156107c3576000805461ff001916905550565b600054610100900460ff16806116ab57506116ab61143f565b806116b9575060005460ff16155b6116f45760405162461bcd60e51b815260040180806020018281038252602e8152602001806117f3602e913960400191505060405180910390fd5b600054610100900460ff1615801561171f576000805460ff1961ff0019909116610100171660011790555b60006117296111eb565b606580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35080156107c3576000805461ff00191690555056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a6564434f5245205472616e7366657248616e646c65722076302e31203a204c6971756964697479207769746864726177616c7320666f7262696464656e434f5245205472616e7366657248616e646c65722076302e31203a205472616e736665727320506175736564a26469706673582212209f63e64b556d9c8b753015b41e5c67cc4954d7c067c265b406cf279597dc176064736f6c634300060c0033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061012c5760003560e01c8063715018a6116100ad578063c4d66de811610071578063c4d66de814610389578063d0573a41146103af578063e5e31b13146103e5578063f2fde38b1461040b578063fff6cae9146104315761012c565b8063715018a6146102f25780638aa1ff70146102fa5780638aee4cfe146103205780638da5cb5b14610340578063a5841194146103485761012c565b80634563f30a116100f45780634563f30a1461021357806346197c9a1461022f57806351d271be1461026557806355a60381146102935780635df25bda146102cc5761012c565b8063012061131461013157806316c38b3c14610161578063301a5801146101805780633b4e71ad146101cf5780633fd80006146101ed575b600080fd5b61015f6004803603604081101561014757600080fd5b506001600160a01b0381351690602001351515610439565b005b61015f6004803603602081101561017757600080fd5b5035151561049f565b6101b66004803603606081101561019657600080fd5b506001600160a01b03813581169160208101359091169060400135610551565b6040805192835260208301919091528051918290030190f35b6101d7610759565b6040805160ff9092168252519081900360200190f35b61015f6004803603602081101561020357600080fd5b50356001600160a01b0316610762565b61021b6107c6565b604080519115158252519081900360200190f35b61015f6004803603606081101561024557600080fd5b506001600160a01b038135811691602081013590911690604001356107d4565b61015f6004803603604081101561027b57600080fd5b506001600160a01b03813516906020013515156108b8565b6102b0600480360360208110156102a957600080fd5b503561091a565b604080516001600160a01b039092168252519081900360200190f35b61021b600480360360208110156102e257600080fd5b50356001600160a01b0316610941565b61015f610956565b61021b6004803603602081101561031057600080fd5b50356001600160a01b03166109f8565b61015f6004803603602081101561033657600080fd5b503560ff16610a0d565b6102b0610a7b565b61036e6004803603602081101561035e57600080fd5b50356001600160a01b0316610a8a565b60408051921515835290151560208301528051918290030190f35b61015f6004803603602081101561039f57600080fd5b50356001600160a01b0316610b1e565b61015f600480360360608110156103c557600080fd5b506001600160a01b03813581169160208101359091169060400135610d94565b61021b600480360360208110156103fb57600080fd5b50356001600160a01b03166110ba565b61015f6004803603602081101561042157600080fd5b50356001600160a01b03166110cf565b61036e6111c8565b6104416111eb565b6065546001600160a01b03908116911614610491576040805162461bcd60e51b815260206004820181905260248201526000805160206117d3833981519152604482015290519081900360640190fd5b61049b82826111ef565b5050565b6104a76111eb565b6065546001600160a01b039081169116146104f7576040805162461bcd60e51b815260206004820181905260248201526000805160206117d3833981519152604482015290519081900360640190fd5b609a805461ff0019166101008315150217905560995460005b8181101561054c576105426099828154811061052857fe5b6000918252602090912001546001600160a01b0316610a8a565b5050600101610510565b505050565b609a546000908190610100900460ff161561059d5760405162461bcd60e51b815260040180806020018281038252602c81526020018061185c602c913960400191505060405180910390fd5b6001600160a01b0385166000908152609c602052604090205460ff1615610650576000806105ca87610a8a565b9092509050811561060c5760405162461bcd60e51b815260040180806020018281038252603b815260200180611821603b913960400191505060405180910390fd5b80156106495760405162461bcd60e51b815260040180806020018281038252603b815260200180611821603b913960400191505060405180910390fd5b505061067d565b6001600160a01b0384166000908152609c602052604090205460ff161561067d5761067a84610a8a565b50505b6001600160a01b0384166000908152609c602052604090205460ff161580156106bf57506001600160a01b0385166000908152609c602052604090205460ff16155b156106cf576106cc6111c8565b50505b6001600160a01b0385166000908152609b602052604090205460ff16156106fb57508190506000610729565b609a5461071a906103e89061071490869060ff1661121a565b9061127c565b905061072683826112be565b91505b6001600160a01b0384166000908152609e602052604090205460ff1615610751575081905060005b935093915050565b609a5460ff1681565b61076a6111eb565b6065546001600160a01b039081169116146107ba576040805162461bcd60e51b815260206004820181905260248201526000805160206117d3833981519152604482015290519081900360640190fd5b6107c381611300565b50565b609a54610100900460ff1681565b6001600160a01b0383166000908152609c602052604090205460ff16156108875760008061080185610a8a565b909250905081156108435760405162461bcd60e51b815260040180806020018281038252603b815260200180611821603b913960400191505060405180910390fd5b80156108805760405162461bcd60e51b815260040180806020018281038252603b815260200180611821603b913960400191505060405180910390fd5b505061054c565b6001600160a01b0382166000908152609c602052604090205460ff161561054c576108b182610a8a565b5050505050565b6108c06111eb565b6065546001600160a01b03908116911614610910576040805162461bcd60e51b815260206004820181905260248201526000805160206117d3833981519152604482015290519081900360640190fd5b61049b8282611414565b6099818154811061092757fe5b6000918252602090912001546001600160a01b0316905081565b609e6020526000908152604090205460ff1681565b61095e6111eb565b6065546001600160a01b039081169116146109ae576040805162461bcd60e51b815260206004820181905260248201526000805160206117d3833981519152604482015290519081900360640190fd5b6065546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3606580546001600160a01b0319169055565b609b6020526000908152604090205460ff1681565b610a156111eb565b6065546001600160a01b03908116911614610a65576040805162461bcd60e51b815260206004820181905260248201526000805160206117d3833981519152604482015290519081900360640190fd5b609a805460ff191660ff92909216919091179055565b6065546001600160a01b031690565b6000806000836001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610ac857600080fd5b505afa158015610adc573d6000803e3d6000fd5b505050506040513d6020811015610af257600080fd5b50516001600160a01b039094166000908152609d60205260408120805490869055909594109392505050565b600054610100900460ff1680610b375750610b3761143f565b80610b45575060005460ff16155b610b805760405162461bcd60e51b815260040180806020018281038252602e8152602001806117f3602e913960400191505060405180910390fd5b600054610100900460ff16158015610bab576000805460ff1961ff0019909116610100171660011790555b32735a16552f59ea34e44ec81e58b3817833e9fd543614610bcb57600080fd5b610bd3611445565b609780546001600160a01b038085166001600160a01b03199092169190911791829055609a805461ff001960ff19909116600a17166101001790556040805163161d5a0360e11b815290519290911691632c3ab40691600480820192602092909190829003018186803b158015610c4957600080fd5b505afa158015610c5d573d6000803e3d6000fd5b505050506040513d6020811015610c7357600080fd5b5051609880546001600160a01b0319166001600160a01b0392831617905560975460408051637bb53c2d60e11b81529051610d0893929092169163f76a785a916004808201926020929091908290030181600087803b158015610cd557600080fd5b505af1158015610ce9573d6000803e3d6000fd5b505050506040513d6020811015610cff57600080fd5b50516001611414565b6097546040805163161d5a0360e11b81529051610d7f926001600160a01b031691632c3ab406916004808301926020929190829003018186803b158015610d4e57600080fd5b505afa158015610d62573d6000803e3d6000fd5b505050506040513d6020811015610d7857600080fd5b5051611300565b801561049b576000805461ff00191690555050565b60975460408051631627905560e01b81526001600160a01b038581166004830152915191909216916316279055916024808301926020929190829003018186803b158015610de157600080fd5b505afa158015610df5573d6000803e3d6000fd5b505050506040513d6020811015610e0b57600080fd5b50511561054c57816001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610e4d57600080fd5b505af1925050508015610e7257506040513d6020811015610e6d57600080fd5b505160015b610e7b5761054c565b506000826001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610eb957600080fd5b505af1158015610ecd573d6000803e3d6000fd5b505050506040513d6020811015610ee357600080fd5b50516040805163d21220a760e01b815290519192506000916001600160a01b0386169163d21220a791600480830192602092919082900301818787803b158015610f2c57600080fd5b505af1158015610f40573d6000803e3d6000fd5b505050506040513d6020811015610f5657600080fd5b50516097546040805163061be4cb60e11b815290519293506001600160a01b0390911691630c37c99691600480820192602092909190829003018186803b158015610fa057600080fd5b505afa158015610fb4573d6000803e3d6000fd5b505050506040513d6020811015610fca57600080fd5b50516001600160a01b03828116911614806110695750609760009054906101000a90046001600160a01b03166001600160a01b0316630c37c9966040518163ffffffff1660e01b815260040160206040518083038186803b15801561102e57600080fd5b505afa158015611042573d6000803e3d6000fd5b505050506040513d602081101561105857600080fd5b50516001600160a01b038381169116145b6108b1576040805162461bcd60e51b815260206004820181905260248201527f5061697273206f6e6c7920616761696e737420434f524520616c6c6f7765642e604482015290519081900360640190fd5b609c6020526000908152604090205460ff1681565b6110d76111eb565b6065546001600160a01b03908116911614611127576040805162461bcd60e51b815260206004820181905260248201526000805160206117d3833981519152604482015290519081900360640190fd5b6001600160a01b03811661116c5760405162461bcd60e51b815260040180806020018281038252602681526020018061178c6026913960400191505060405180910390fd5b6065546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3606580546001600160a01b0319166001600160a01b0392909216919091179055565b60985460009081906111e2906001600160a01b0316610a8a565b90939092509050565b3390565b6001600160a01b03919091166000908152609e60205260409020805460ff1916911515919091179055565b60008261122957506000611276565b8282028284828161123657fe5b04146112735760405162461bcd60e51b81526004018080602001828103825260218152602001806117b26021913960400191505060405180910390fd5b90505b92915050565b600061127383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506114f6565b600061127383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611598565b60995460005b8181101561138c57826001600160a01b03166099828154811061132557fe5b6000918252602090912001546001600160a01b03161415611384576040805162461bcd60e51b815260206004820152601460248201527314185a5c88185b1c9958591e481d1c9858dad95960621b604482015290519081900360640190fd5b600101611306565b5061139682610a8a565b505060998054600180820183556000929092527f72a152ddfb8e864297c917af52ea6c1c68aead0fee1a62673fcc7e0c94979d000180546001600160a01b0319166001600160a01b0385161790556113ef908390611414565b506001600160a01b03166000908152609c60205260409020805460ff19166001179055565b6001600160a01b03919091166000908152609b60205260409020805460ff1916911515919091179055565b303b1590565b600054610100900460ff168061145e575061145e61143f565b8061146c575060005460ff16155b6114a75760405162461bcd60e51b815260040180806020018281038252602e8152602001806117f3602e913960400191505060405180910390fd5b600054610100900460ff161580156114d2576000805460ff1961ff0019909116610100171660011790555b6114da6115f2565b6114e2611692565b80156107c3576000805461ff001916905550565b600081836115825760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561154757818101518382015260200161152f565b50505050905090810190601f1680156115745780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161158e57fe5b0495945050505050565b600081848411156115ea5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561154757818101518382015260200161152f565b505050900390565b600054610100900460ff168061160b575061160b61143f565b80611619575060005460ff16155b6116545760405162461bcd60e51b815260040180806020018281038252602e8152602001806117f3602e913960400191505060405180910390fd5b600054610100900460ff161580156114e2576000805460ff1961ff00199091166101001716600117905580156107c3576000805461ff001916905550565b600054610100900460ff16806116ab57506116ab61143f565b806116b9575060005460ff16155b6116f45760405162461bcd60e51b815260040180806020018281038252602e8152602001806117f3602e913960400191505060405180910390fd5b600054610100900460ff1615801561171f576000805460ff1961ff0019909116610100171660011790555b60006117296111eb565b606580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35080156107c3576000805461ff00191690555056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a6564434f5245205472616e7366657248616e646c65722076302e31203a204c6971756964697479207769746864726177616c7320666f7262696464656e434f5245205472616e7366657248616e646c65722076302e31203a205472616e736665727320506175736564a26469706673582212209f63e64b556d9c8b753015b41e5c67cc4954d7c067c265b406cf279597dc176064736f6c634300060c0033
Deployed Bytecode Sourcemap
16682:8186:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23907:135;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;23907:135:0;;;;;;;;;;:::i;:::-;;18673:279;;;;;;;;;;;;;;;;-1:-1:-1;18673:279:0;;;;:::i;22067:1802::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;22067:1802:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;16875:27;;;:::i;:::-;;;;;;;;;;;;;;;;;;;18003:95;;;;;;;;;;;;;;;;-1:-1:-1;18003:95:0;-1:-1:-1;;;;;18003:95:0;;:::i;16946:27::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;21322:737;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21322:737:0;;;;;;;;;;;;;;;;;:::i;19083:119::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;19083:119:0;;;;;;;;;;:::i;16839:29::-;;;;;;;;;;;;;;;;-1:-1:-1;16839:29:0;;:::i;:::-;;;;-1:-1:-1;;;;;16839:29:0;;;;;;;;;;;;;;17150:46;;;;;;;;;;;;;;;;-1:-1:-1;17150:46:0;-1:-1:-1;;;;;17150:46:0;;:::i;5617:148::-;;;:::i;16980:42::-;;;;;;;;;;;;;;;;-1:-1:-1;16980:42:0;-1:-1:-1;;;;;16980:42:0;;:::i;18960:115::-;;;;;;;;;;;;;;;;-1:-1:-1;18960:115:0;;;;:::i;4975:79::-;;;:::i;20501:450::-;;;;;;;;;;;;;;;;-1:-1:-1;20501:450:0;-1:-1:-1;;;;;20501:450:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;17227:736;;;;;;;;;;;;;;;;-1:-1:-1;17227:736:0;-1:-1:-1;;;;;17227:736:0;;:::i;24176:659::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;24176:659:0;;;;;;;;;;;;;;;;;:::i;17029:39::-;;;;;;;;;;;;;;;;-1:-1:-1;17029:39:0;-1:-1:-1;;;;;17029:39:0;;:::i;5920:244::-;;;;;;;;;;;;;;;;-1:-1:-1;5920:244:0;-1:-1:-1;;;;;5920:244:0;;:::i;19597:892::-;;;:::i;23907:135::-;5197:12;:10;:12::i;:::-;5187:6;;-1:-1:-1;;;;;5187:6:0;;;:22;;;5179:67;;;;;-1:-1:-1;;;5179:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;5179:67:0;;;;;;;;;;;;;;;23996:38:::1;24019:8;24028:5;23996:22;:38::i;:::-;23907:135:::0;;:::o;18673:279::-;5197:12;:10;:12::i;:::-;5187:6;;-1:-1:-1;;;;;5187:6:0;;;:22;;;5179:67;;;;;-1:-1:-1;;;5179:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;5179:67:0;;;;;;;;;;;;;;;18735:15:::1;:24:::0;;-1:-1:-1;;18735:24:0::1;;::::0;::::1;;;;::::0;;18824:12:::1;:19:::0;-1:-1:-1;18854:85:0::1;18878:6;18874:1;:10;18854:85;;;18906:21;18911:12;18924:1;18911:15;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;18911:15:0::1;18906:4;:21::i;:::-;-1:-1:-1::0;;18886:3:0::1;;18854:85;;;;5257:1;18673:279:::0;:::o;22067:1802::-;22316:15;;22217:24;;;;22316:15;;;;;:24;22308:81;;;;-1:-1:-1;;;22308:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22504:14:0;;;;;;:6;:14;;;;;;;;22501:465;;;22540:15;22557:16;22577:12;22582:6;22577:4;:12::i;:::-;22539:50;;-1:-1:-1;22539:50:0;-1:-1:-1;22616:19:0;;22608:91;;;;-1:-1:-1;;;22608:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22726:20;;22718:92;;;;-1:-1:-1;;;22718:92:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22501:465;;;;;-1:-1:-1;;;;;22898:17:0;;;;;;:6;:17;;;;;;;;22895:71;;;22935:15;22940:9;22935:4;:15::i;:::-;;;22895:71;-1:-1:-1;;;;;23097:17:0;;;;;;:6;:17;;;;;;;;23096:18;:37;;;;-1:-1:-1;;;;;;23119:14:0;;;;;;:6;:14;;;;;;;;23118:15;23096:37;23093:65;;;23152:6;:4;:6::i;:::-;;;23093:65;-1:-1:-1;;;;;23180:17:0;;;;;;:9;:17;;;;;;;;23177:467;;;-1:-1:-1;23418:6:0;;-1:-1:-1;23379:1:0;23177:467;;;23523:14;;23512:36;;23543:4;;23512:26;;:6;;23523:14;;23512:10;:26::i;:::-;:30;;:36::i;:::-;23479:69;-1:-1:-1;23586:42:0;:6;23479:69;23586:10;:42::i;:::-;23567:61;;23177:467;-1:-1:-1;;;;;23689:24:0;;;;;;:13;:24;;;;;;;;23686:142;;;-1:-1:-1;23806:6:0;;-1:-1:-1;23767:1:0;23686:142;22067:1802;;;;;;:::o;16875:27::-;;;;;;:::o;18003:95::-;5197:12;:10;:12::i;:::-;5187:6;;-1:-1:-1;;;;;5187:6:0;;;:22;;;5179:67;;;;;-1:-1:-1;;;5179:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;5179:67:0;;;;;;;;;;;;;;;18069:21:::1;18085:4;18069:15;:21::i;:::-;18003:95:::0;:::o;16946:27::-;;;;;;;;;:::o;21322:737::-;-1:-1:-1;;;;;21585:14:0;;;;;;:6;:14;;;;;;;;21582:464;;;21621:15;21638:16;21658:12;21663:6;21658:4;:12::i;:::-;21620:50;;-1:-1:-1;21620:50:0;-1:-1:-1;21697:19:0;;21689:91;;;;-1:-1:-1;;;21689:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21807:20;;21799:92;;;;-1:-1:-1;;;21799:92:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21582:464;;;;;-1:-1:-1;;;;;21978:17:0;;;;;;:6;:17;;;;;;;;21975:71;;;22015:15;22020:9;22015:4;:15::i;:::-;;;21322:737;;;:::o;19083:119::-;5197:12;:10;:12::i;:::-;5187:6;;-1:-1:-1;;;;;5187:6:0;;;:22;;;5179:67;;;;;-1:-1:-1;;;5179:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;5179:67:0;;;;;;;;;;;;;;;19164:30:::1;19179:8;19188:5;19164:14;:30::i;16839:29::-:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16839:29:0;;-1:-1:-1;16839:29:0;:::o;17150:46::-;;;;;;;;;;;;;;;:::o;5617:148::-;5197:12;:10;:12::i;:::-;5187:6;;-1:-1:-1;;;;;5187:6:0;;;:22;;;5179:67;;;;;-1:-1:-1;;;5179:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;5179:67:0;;;;;;;;;;;;;;;5708:6:::1;::::0;5687:40:::1;::::0;5724:1:::1;::::0;-1:-1:-1;;;;;5708:6:0::1;::::0;5687:40:::1;::::0;5724:1;;5687:40:::1;5738:6;:19:::0;;-1:-1:-1;;;;;;5738:19:0::1;::::0;;5617:148::o;16980:42::-;;;;;;;;;;;;;;;:::o;18960:115::-;5197:12;:10;:12::i;:::-;5187:6;;-1:-1:-1;;;;;5187:6:0;;;:22;;;5179:67;;;;;-1:-1:-1;;;5179:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;5179:67:0;;;;;;;;;;;;;;;19036:14:::1;:31:::0;;-1:-1:-1;;19036:31:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;18960:115::o;4975:79::-;5040:6;;-1:-1:-1;;;;;5040:6:0;4975:79;:::o;20501:450::-;20545:15;20562:16;20737:26;20773:4;-1:-1:-1;;;;;20766:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20766:26:0;-1:-1:-1;;;;;20819:20:0;;;;;;;:14;20766:26;20819:20;;;;;;20871:41;;;;20819:20;;:41;-1:-1:-1;20819:41:0;20501:450;-1:-1:-1;;;20501:450:0:o;17227:736::-;1206:12;;;;;;;;:31;;;1222:15;:13;:15::i;:::-;1206:47;;;-1:-1:-1;1242:11:0;;;;1241:12;1206:47;1198:106;;;;-1:-1:-1;;;1198:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1313:19;1336:12;;;;;;1335:13;1355:83;;;;1384:12;:19;;-1:-1:-1;;;;1384:19:0;;;;;1412:18;1399:4;1412:18;;;1355:83;17323:9:::1;17344:42;17323:64;17315:73;;;::::0;::::1;;17399:35;:33;:35::i;:::-;17445:11;:40:::0;;-1:-1:-1;;;;;17445:40:0;;::::1;-1:-1:-1::0;;;;;;17445:40:0;;::::1;::::0;;;::::1;::::0;;;;17498:14:::1;:19:::0;;-1:-1:-1;;;;17498:19:0;;::::1;17515:2;17498:19;17533:22;17445:40;17533:22;::::0;;17727:29:::1;::::0;;-1:-1:-1;;;17727:29:0;;;;:11;;;::::1;::::0;:27:::1;::::0;:29:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;:11;:29;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;17727:29:0;17704:20:::1;:52:::0;;-1:-1:-1;;;;;;17704:52:0::1;-1:-1:-1::0;;;;;17704:52:0;;::::1;;::::0;;17782:11:::1;::::0;:30:::1;::::0;;-1:-1:-1;;;17782:30:0;;;;17767:52:::1;::::0;17782:11;;;::::1;::::0;:28:::1;::::0;:30:::1;::::0;;::::1;::::0;17727:29:::1;::::0;17782:30;;;;;;;;-1:-1:-1;17782:11:0;:30;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;17782:30:0;17814:4:::1;17767:14;:52::i;:::-;17893:11;::::0;:29:::1;::::0;;-1:-1:-1;;;17893:29:0;;;;17877:46:::1;::::0;-1:-1:-1;;;;;17893:11:0::1;::::0;:27:::1;::::0;:29:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:11;:29;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;17893:29:0;17877:15:::1;:46::i;:::-;1460:14:::0;1456:57;;;1500:5;1485:20;;-1:-1:-1;;1485:20:0;;;17227:736;;:::o;24176:659::-;24425:11;;:27;;;-1:-1:-1;;;24425:27:0;;-1:-1:-1;;;;;24425:27:0;;;;;;;;;:11;;;;;:22;;:27;;;;;;;;;;;;;;:11;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24425:27:0;24422:406;;;24481:3;-1:-1:-1;;;;;24473:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24473:21:0;;;24469:348;;;;;;24514:14;24539:3;-1:-1:-1;;;;;24531:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24531:21:0;24589;;;-1:-1:-1;;;24589:21:0;;;;24531;;-1:-1:-1;24572:14:0;;-1:-1:-1;;;;;24589:19:0;;;;;:21;;;;;24531;;24589;;;;;;;24572:14;24589:19;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24589:21:0;24649:11;;:30;;;-1:-1:-1;;;24649:30:0;;;;24589:21;;-1:-1:-1;;;;;;24649:11:0;;;;:28;;:30;;;;;24589:21;;24649:30;;;;;;;;:11;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24649:30:0;-1:-1:-1;;;;;24639:40:0;;;;;;;:101;;;24710:11;;;;;;;;;-1:-1:-1;;;;;24710:11:0;-1:-1:-1;;;;;24710:28:0;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24710:30:0;-1:-1:-1;;;;;24700:40:0;;;;;;24639:101;24631:147;;;;;-1:-1:-1;;;24631:147:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;17029:39;;;;;;;;;;;;;;;:::o;5920:244::-;5197:12;:10;:12::i;:::-;5187:6;;-1:-1:-1;;;;;5187:6:0;;;:22;;;5179:67;;;;;-1:-1:-1;;;5179:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;5179:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;6009:22:0;::::1;6001:73;;;;-1:-1:-1::0;;;6001:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6111:6;::::0;6090:38:::1;::::0;-1:-1:-1;;;;;6090:38:0;;::::1;::::0;6111:6:::1;::::0;6090:38:::1;::::0;6111:6:::1;::::0;6090:38:::1;6139:6;:17:::0;;-1:-1:-1;;;;;;6139:17:0::1;-1:-1:-1::0;;;;;6139:17:0;;;::::1;::::0;;;::::1;::::0;;5920:244::o;19597:892::-;19711:20;;19629:15;;;;19706:26;;-1:-1:-1;;;;;19711:20:0;19706:4;:26::i;:::-;19677:55;;;;-1:-1:-1;19597:892:0;-1:-1:-1;19597:892:0:o;3243:106::-;3331:10;3243:106;:::o;24048:120::-;-1:-1:-1;;;;;24129:23:0;;;;;;;;:13;:23;;;;;:31;;-1:-1:-1;;24129:31:0;;;;;;;;;;24048:120::o;8483:471::-;8541:7;8786:6;8782:47;;-1:-1:-1;8816:1:0;8809:8;;8782:47;8853:5;;;8857:1;8853;:5;:1;8877:5;;;;;:10;8869:56;;;;-1:-1:-1;;;8869:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8945:1;-1:-1:-1;8483:471:0;;;;;:::o;9422:132::-;9480:7;9507:39;9511:1;9514;9507:39;;;;;;;;;;;;;;;;;:3;:39::i;7609:136::-;7667:7;7694:43;7698:1;7701;7694:43;;;;;;;;;;;;;;;;;:3;:43::i;18106:525::-;18184:12;:19;18167:14;18214:120;18238:6;18234:1;:10;18214:120;;;18293:4;-1:-1:-1;;;;;18274:23:0;:12;18287:1;18274:15;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18274:15:0;:23;;18266:56;;;;;-1:-1:-1;;;18266:56:0;;;;;;;;;;;;-1:-1:-1;;;18266:56:0;;;;;;;;;;;;;;;18246:3;;18214:120;;;;18364:10;18369:4;18364;:10::i;:::-;-1:-1:-1;;18436:12:0;:23;;;;;;;;-1:-1:-1;18436:23:0;;;;;;;;-1:-1:-1;;;;;;18436:23:0;-1:-1:-1;;;;;18436:23:0;;;;;18516:26;;18436:23;;18516:14;:26::i;:::-;-1:-1:-1;;;;;;18602:12:0;;;;;:6;:12;;;;;:19;;-1:-1:-1;;18602:19:0;18617:4;18602:19;;;18106:525::o;19208:108::-;-1:-1:-1;;;;;19281:19:0;;;;;;;;:9;:19;;;;;:27;;-1:-1:-1;;19281:27:0;;;;;;;;;;19208:108::o;1607:508::-;2024:4;2070:17;2102:7;1607:508;:::o;4553:129::-;1206:12;;;;;;;;:31;;;1222:15;:13;:15::i;:::-;1206:47;;;-1:-1:-1;1242:11:0;;;;1241:12;1206:47;1198:106;;;;-1:-1:-1;;;1198:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1313:19;1336:12;;;;;;1335:13;1355:83;;;;1384:12;:19;;-1:-1:-1;;;;1384:19:0;;;;;1412:18;1399:4;1412:18;;;1355:83;4611:26:::1;:24;:26::i;:::-;4648;:24;:26::i;:::-;1460:14:::0;1456:57;;;1500:5;1485:20;;-1:-1:-1;;1485:20:0;;;4553:129;:::o;10042:345::-;10128:7;10230:12;10223:5;10215:28;;;;-1:-1:-1;;;10215:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10254:9;10270:1;10266;:5;;;;;;;10042:345;-1:-1:-1;;;;;10042:345:0:o;8040:192::-;8126:7;8162:12;8154:6;;;;8146:29;;;;-1:-1:-1;;;8146:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8198:5:0;;;8040:192::o;3164:69::-;1206:12;;;;;;;;:31;;;1222:15;:13;:15::i;:::-;1206:47;;;-1:-1:-1;1242:11:0;;;;1241:12;1206:47;1198:106;;;;-1:-1:-1;;;1198:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1313:19;1336:12;;;;;;1335:13;1355:83;;;;1384:12;:19;;-1:-1:-1;;;;1384:19:0;;;;;1412:18;1399:4;1412:18;;;1460:14;1456:57;;;1500:5;1485:20;;-1:-1:-1;;1485:20:0;;;3164:69;:::o;4690:202::-;1206:12;;;;;;;;:31;;;1222:15;:13;:15::i;:::-;1206:47;;;-1:-1:-1;1242:11:0;;;;1241:12;1206:47;1198:106;;;;-1:-1:-1;;;1198:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1313:19;1336:12;;;;;;1335:13;1355:83;;;;1384:12;:19;;-1:-1:-1;;;;1384:19:0;;;;;1412:18;1399:4;1412:18;;;1355:83;4762:17:::1;4782:12;:10;:12::i;:::-;4805:6;:18:::0;;-1:-1:-1;;;;;;4805:18:0::1;-1:-1:-1::0;;;;;4805:18:0;::::1;::::0;;::::1;::::0;;;4839:43:::1;::::0;4805:18;;-1:-1:-1;4805:18:0;-1:-1:-1;;4839:43:0::1;::::0;-1:-1:-1;;4839:43:0::1;1446:1;1460:14:::0;1456:57;;;1500:5;1485:20;;-1:-1:-1;;1485:20:0;;;4690:202;:::o
Swarm Source
ipfs://9f63e64b556d9c8b753015b41e5c67cc4954d7c067c265b406cf279597dc1760
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
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.