More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 27,502 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Approve | 60451123 | 5 days ago | IN | 0 AVAX | 0.00000353 | ||||
Approve | 59621898 | 20 days ago | IN | 0 AVAX | 0.0000787 | ||||
Approve | 58691106 | 40 days ago | IN | 0 AVAX | 0.0000726 | ||||
Approve | 58691106 | 40 days ago | IN | 0 AVAX | 0.0000726 | ||||
Approve | 58189850 | 50 days ago | IN | 0 AVAX | 0.00011471 | ||||
Approve | 58189503 | 50 days ago | IN | 0 AVAX | 0.0000363 | ||||
Approve | 58097368 | 52 days ago | IN | 0 AVAX | 0.00002886 | ||||
Approve | 58097356 | 52 days ago | IN | 0 AVAX | 0.00003194 | ||||
Approve | 57636837 | 61 days ago | IN | 0 AVAX | 0.0000363 | ||||
Approve | 57636834 | 61 days ago | IN | 0 AVAX | 0.0000363 | ||||
Approve | 57636831 | 61 days ago | IN | 0 AVAX | 0.0000363 | ||||
Approve | 57636723 | 61 days ago | IN | 0 AVAX | 0.0000363 | ||||
Approve | 55970595 | 95 days ago | IN | 0 AVAX | 0.0000363 | ||||
Approve | 55273616 | 109 days ago | IN | 0 AVAX | 0.00002904 | ||||
Approve | 55272953 | 109 days ago | IN | 0 AVAX | 0.00002904 | ||||
Approve | 55039130 | 115 days ago | IN | 0 AVAX | 0.00005024 | ||||
Approve | 55039013 | 115 days ago | IN | 0 AVAX | 0.00003804 | ||||
Approve | 55039011 | 115 days ago | IN | 0 AVAX | 0.00002962 | ||||
Approve | 55022360 | 115 days ago | IN | 0 AVAX | 0.00003666 | ||||
Approve | 54483912 | 126 days ago | IN | 0 AVAX | 0.0000726 | ||||
Approve | 54483906 | 126 days ago | IN | 0 AVAX | 0.0000726 | ||||
Approve | 54413791 | 128 days ago | IN | 0 AVAX | 0.00087994 | ||||
Approve | 54231713 | 132 days ago | IN | 0 AVAX | 0.00079891 | ||||
Approve | 54153766 | 134 days ago | IN | 0 AVAX | 0.00087326 | ||||
Approve | 54153763 | 134 days ago | IN | 0 AVAX | 0.00076958 |
Latest 1 internal transaction
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
9437844 | 1197 days ago | Contract Creation | 0 AVAX |
Loading...
Loading
Contract Name:
TimeERC20Token
Compiler Version
v0.7.5+commit.eb77ed08
Contract Source Code (Solidity)
/** *Submitted for verification at snowscan.xyz on 2022-01-11 */ // SPDX-License-Identifier: AGPL-3.0-or-later pragma solidity 0.7.5; library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping (bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { require(set._values.length > index, "EnumerableSet: index out of bounds"); return set._values[index]; } function _getValues( Set storage set_ ) private view returns ( bytes32[] storage ) { return set_._values; } // TODO needs insert function that maintains order. // TODO needs NatSpec documentation comment. /** * Inserts new value by moving existing value at provided index to end * of array and setting provided value at provided index */ function _insert(Set storage set_, uint256 index_, bytes32 valueToInsert_ ) private returns ( bool ) { require( set_._values.length > index_ ); require( !_contains( set_, valueToInsert_ ), "Remove value you wish to insert if you wish to reorder array." ); bytes32 existingValue_ = _at( set_, index_ ); set_._values[index_] = valueToInsert_; return _add( set_, existingValue_); } struct Bytes4Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes4Set storage set, bytes4 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes4Set storage set, bytes4 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes4Set storage set, bytes4 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values on the set. O(1). */ function length(Bytes4Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes4Set storage set, uint256 index) internal view returns ( bytes4 ) { return bytes4( _at( set._inner, index ) ); } function getValues( Bytes4Set storage set_ ) internal view returns ( bytes4[] memory ) { bytes4[] memory bytes4Array_; for( uint256 iteration_ = 0; _length( set_._inner ) > iteration_; iteration_++ ) { bytes4Array_[iteration_] = bytes4( _at( set_._inner, iteration_ ) ); } return bytes4Array_; } function insert( Bytes4Set storage set_, uint256 index_, bytes4 valueToInsert_ ) internal returns ( bool ) { return _insert( set_._inner, index_, valueToInsert_ ); } struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values on the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns ( bytes32 ) { return _at(set._inner, index); } function getValues( Bytes32Set storage set_ ) internal view returns ( bytes4[] memory ) { bytes4[] memory bytes4Array_; for( uint256 iteration_ = 0; _length( set_._inner ) >= iteration_; iteration_++ ){ bytes4Array_[iteration_] = bytes4( at( set_, iteration_ ) ); } return bytes4Array_; } function insert( Bytes32Set storage set_, uint256 index_, bytes32 valueToInsert_ ) internal returns ( bool ) { return _insert( set_._inner, index_, valueToInsert_ ); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(value))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(value))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(value))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint256(_at(set._inner, index))); } /** * TODO Might require explicit conversion of bytes32[] to address[]. * Might require iteration. */ function getValues( AddressSet storage set_ ) internal view returns ( address[] memory ) { address[] memory addressArray; for( uint256 iteration_ = 0; _length(set_._inner) >= iteration_; iteration_++ ){ addressArray[iteration_] = at( set_, iteration_ ); } return addressArray; } function insert(AddressSet storage set_, uint256 index_, address valueToInsert_ ) internal returns ( bool ) { return _insert( set_._inner, index_, bytes32(uint256(valueToInsert_)) ); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } struct UInt256Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UInt256Set storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UInt256Set storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UInt256Set storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UInt256Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UInt256Set storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } } 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); } 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; } function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } 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; } } function percentageAmount( uint256 total_, uint8 percentage_ ) internal pure returns ( uint256 percentAmount_ ) { return div( mul( total_, percentage_ ), 1000 ); } function substractPercentage( uint256 total_, uint8 percentageToSub_ ) internal pure returns ( uint256 result_ ) { return sub( total_, div( mul( total_, percentageToSub_ ), 1000 ) ); } function percentageOfTotal( uint256 part_, uint256 total_ ) internal pure returns ( uint256 percent_ ) { return div( mul(part_, 100) , total_ ); } function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow, so we distribute return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2); } function quadraticPricing( uint256 payment_, uint256 multiplier_ ) internal pure returns (uint256) { return sqrrt( mul( multiplier_, payment_ ) ); } function bondingCurve( uint256 supply_, uint256 multiplier_ ) internal pure returns (uint256) { return mul( multiplier_, supply_ ); } } abstract contract ERC20 is IERC20 { using SafeMath for uint256; // TODO comment actual hash value. bytes32 constant private ERC20TOKEN_ERC1820_INTERFACE_ID = keccak256( "ERC20Token" ); // Present in ERC777 mapping (address => uint256) internal _balances; // Present in ERC777 mapping (address => mapping (address => uint256)) internal _allowances; // Present in ERC777 uint256 internal _totalSupply; // Present in ERC777 string internal _name; // Present in ERC777 string internal _symbol; // Present in ERC777 uint8 internal _decimals; constructor (string memory name_, string memory symbol_, uint8 decimals_) { _name = name_; _symbol = symbol_; _decimals = decimals_; } function name() public view returns (string memory) { return _name; } function symbol() public view returns (string memory) { return _symbol; } function decimals() public view returns (uint8) { return _decimals; } function totalSupply() public view override returns (uint256) { return _totalSupply; } function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(msg.sender, spender, amount); return true; } function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(msg.sender, spender, _allowances[msg.sender][spender].add(addedValue)); return true; } function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(msg.sender, spender, _allowances[msg.sender][spender] .sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } function _mint(address account_, uint256 amount_) internal virtual { require(account_ != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address( this ), account_, amount_); _totalSupply = _totalSupply.add(amount_); _balances[account_] = _balances[account_].add(amount_); emit Transfer(address( this ), account_, amount_); } function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } function _beforeTokenTransfer( address from_, address to_, uint256 amount_ ) internal virtual { } } library Counters { using SafeMath for uint256; struct Counter { uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { counter._value += 1; } function decrement(Counter storage counter) internal { counter._value = counter._value.sub(1); } } interface IERC2612Permit { function permit( address owner, address spender, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; function nonces(address owner) external view returns (uint256); } interface IFactory { function createPair(address tokenA, address tokenB) external returns (address pair); } interface ITreasury { function transferFromAutoLiquidify( uint _amount, address _token ) external; function is_reserve_token( address _token ) external returns ( bool ); function is_liquidity_token( address _token ) external returns ( bool ); } interface IRouter { function factory() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; } abstract contract ERC20Permit is ERC20, IERC2612Permit { using Counters for Counters.Counter; mapping(address => Counters.Counter) private _nonces; // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9; bytes32 public DOMAIN_SEPARATOR; constructor() { uint256 chainID; assembly { chainID := chainid() } DOMAIN_SEPARATOR = keccak256( abi.encode( keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), keccak256(bytes(name())), keccak256(bytes("1")), // Version chainID, address(this) ) ); } function permit( address owner, address spender, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) public virtual override { require(block.timestamp <= deadline, "Permit: expired deadline"); bytes32 hashStruct = keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, amount, _nonces[owner].current(), deadline)); bytes32 _hash = keccak256(abi.encodePacked(uint16(0x1901), DOMAIN_SEPARATOR, hashStruct)); address signer = ecrecover(_hash, v, r, s); require(signer != address(0) && signer == owner, "ZeroSwapPermit: Invalid signature"); _nonces[owner].increment(); _approve(owner, spender, amount); } function nonces(address owner) public view override returns (uint256) { return _nonces[owner].current(); } } interface IOwnable { function owner() external view returns (address); function renounceOwnership() external; function transferOwnership( address newOwner_ ) external; } contract Ownable is IOwnable { address internal _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); constructor () { _owner = msg.sender; emit OwnershipTransferred( address(0), _owner ); } function owner() public view override returns (address) { return _owner; } modifier onlyOwner() { require( _owner == msg.sender, "Ownable: caller is not the owner" ); _; } function renounceOwnership() public virtual override onlyOwner() { emit OwnershipTransferred( _owner, address(0) ); _owner = address(0); } function transferOwnership( address newOwner_ ) public virtual override onlyOwner() { require( newOwner_ != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred( _owner, newOwner_ ); _owner = newOwner_; } } contract VaultOwned is Ownable { mapping (address => bool) internal _vault; function setVault( address vault_ ) external onlyOwner() returns ( bool ) { _vault[vault_] = true; return true; } function rmVault( address vault_ ) external onlyOwner() returns ( bool ) { _vault[vault_] = false; return true; } modifier onlyVault() { require( _vault[msg.sender], "VaultOwned: caller is not the Vault" ); _; } } contract TimeERC20Token is ERC20Permit, VaultOwned { using SafeMath for uint256; mapping (address => bool) isFeeExempt; address public routerAddress = 0x60aE616a2155Ee3d9A68541Ba4544862310933d4; address public factoryAddress; address public MIM = 0x130966628846BFd36ff31a822705796e8cb8C18D; IRouter public router; address public pair; address public treasuryWallet = address(0); uint256 public sellFeePercentage = 10000; // 10000 == 1% uint256 public buyFeePercentage = 10000; // 10000 == 1% uint256 public burnAmount = 0; uint256 public swapThreshold = 10 ** 9; uint256 public buildTimestamp = 0; uint256 public constant MAX = ~uint256(0); bool public swapEnabled = true; AutoLiquify public _autoliquify; constructor() ERC20("MidasDAO", "CROWN", 9) { router = IRouter(routerAddress); factoryAddress = router.factory(); pair = IFactory(factoryAddress).createPair(MIM, address(this)); isFeeExempt[msg.sender] = true; isFeeExempt[address(this)] = true; buildTimestamp = block.timestamp; _autoliquify = new AutoLiquify(address(this), routerAddress, MIM, pair); _allowances[address(_autoliquify)][address(routerAddress)] = MAX; _allowances[msg.sender][address(routerAddress)] = MAX; _mint(msg.sender, 900000 * 10 ** 9); } function mint(address account_, uint256 amount_) external onlyVault() { _mint(account_, amount_); } function burn(uint256 amount) public virtual { if(msg.sender == owner() ){ burnAmount = burnAmount.add(amount); } _burn(msg.sender, amount); } function transfer(address recipient, uint256 amount) external override returns (bool) { return _transferFrom(msg.sender, recipient, amount); } function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) { if(_allowances[sender][msg.sender] != _totalSupply){ _allowances[sender][msg.sender] = _allowances[sender][msg.sender].sub(amount, "Insufficient Allowance"); } return _transferFrom(sender, recipient, amount); } function _basicTransfer(address sender, address recipient, uint256 amount) internal returns (bool) { _balances[sender] = _balances[sender].sub(amount, "Insufficient Balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); return true; } function _transferFrom(address sender, address recipient, uint256 amount) internal returns (bool) { if(sender == address(_autoliquify) || recipient == address(_autoliquify)){ return _basicTransfer(sender, recipient, amount); } if(shouldTakeFee(sender)){ bool isBuy = sender == pair || sender == routerAddress; bool isSell = recipient == pair || recipient == routerAddress; uint256 fee = 0; fee = (isSell) ? amount.mul(sellFeePercentage).div(1000000) : fee; fee = (isBuy) ? amount.mul(buyFeePercentage).div(1000000) : fee; if(fee > 0){ _basicTransfer(sender, address(_autoliquify), fee); amount = amount.sub(fee); if (isSell && shouldSwapBack(fee)) { try _autoliquify.swapBack(fee) {} catch {} } } _basicTransfer(sender, recipient, amount); }else{ return _basicTransfer(sender, recipient, amount); } return true; } function shouldSwapBack(uint256 fee) internal view returns (bool) { return msg.sender != pair && swapEnabled && fee >= swapThreshold && treasuryWallet != address(0); } function setFee ( uint _parameter, uint256 _input ) external onlyOwner() { if ( _parameter == 1 ) { // buy require( _input <= 300000, "buy fee above 30%" ); buyFeePercentage = _input; } else if ( _parameter == 2 ) { // sell require( _input <= 300000, "sell fee above 30%" ); sellFeePercentage = _input; } else if ( _parameter == 3 ) { // swapEnabled swapEnabled = (_input > 0) ? true : false; } else if ( _parameter == 4 ) { // swapThreshold swapThreshold = _input; } } function setWallets(address _treasuryWallet) external onlyOwner() { _setWallets(_treasuryWallet); } function _setWallets(address _treasuryWallet) internal{ treasuryWallet = _treasuryWallet; _autoliquify.refreshApprove(treasuryWallet); } function shouldTakeFee(address sender) internal view returns (bool) { return !isFeeExempt[sender]; } function burnFrom(address account_, uint256 amount_) public virtual { _burnFrom(account_, amount_); } function _burnFrom(address account_, uint256 amount_) public virtual { uint256 decreasedAllowance_ = allowance(account_, msg.sender).sub( amount_, "ERC20: burn amount exceeds allowance" ); _approve(account_, msg.sender, decreasedAllowance_); _burn(account_, amount_); } function swapBack() external onlyOwner() { uint256 _swapamount = _balances[address(_autoliquify)]; _autoliquify.swapBack(_swapamount); } } contract AutoLiquify { using SafeMath for uint256; IERC20 private token; IRouter private router; IERC20 private MIM; IERC20 private LP; ITreasury private TREASURY;// = address(0); uint256 constant MAX = ~uint256(0); uint256 public swapThreshold = 10 ** 9; event AutoLiquify(uint256 amountMIM, uint256 amountToken); constructor (address _token, address _router, address _MIM, address _LP) public { token = IERC20(_token); router = IRouter(_router); MIM = IERC20(_MIM); LP = IERC20(_LP); MIM.approve(_router, MAX); } function refreshApprove( address _treasury) external { require(address(_treasury) != address(0), "_treasury not set"); MIM.approve(address(router), MAX); MIM.approve(address(_treasury), MAX); LP.approve(address(_treasury), MAX); TREASURY = ITreasury(_treasury); } function swapBack(uint256 _amount ) external { require(msg.sender == address(token), "only contract"); if(_amount >= swapThreshold ){ uint256 _balance = token.balanceOf(address(this)); if(_amount > _balance){ _amount = _balance; } uint256 swap_amount = _amount.mul(4).div(10); address[] memory pair = new address[](2); pair[0] = address(token); pair[1] = address(MIM); router.swapExactTokensForTokensSupportingFeeOnTransferTokens( swap_amount.div(2).mul(3), 0, pair, address(this), block.timestamp.add(1 minutes) ); uint256[] memory desiredamount = router.getAmountsOut(swap_amount.mul(95).div(100), pair); router.addLiquidity( address(token), address(MIM), desiredamount[0], desiredamount[1], 0, 0, address(this), block.timestamp.add(1 minutes) ); emit AutoLiquify(desiredamount[0], desiredamount[1]); } if(address(TREASURY) != address(0)){ mimtransfer(); lptransfer(); } } function mimtransfer() internal { if(TREASURY.is_reserve_token(address(MIM))){ uint _mim_balance = MIM.balanceOf(address(this)); TREASURY.transferFromAutoLiquidify(_mim_balance, address(MIM)); } } function lptransfer() internal { if(TREASURY.is_liquidity_token(address(LP))){ uint _lp_balance = LP.balanceOf(address(this)); TREASURY.transferFromAutoLiquidify(_lp_balance, address(LP)); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIM","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_autoliquify","outputs":[{"internalType":"contract AutoLiquify","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"_burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buildTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyFeePercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"factoryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"vault_","type":"address"}],"name":"rmVault","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"routerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellFeePercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_parameter","type":"uint256"},{"internalType":"uint256","name":"_input","type":"uint256"}],"name":"setFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"vault_","type":"address"}],"name":"setVault","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasuryWallet","type":"address"}],"name":"setWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapBack","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner_","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6080604052600b80546001600160a01b03199081167360ae616a2155ee3d9a68541ba4544862310933d417909155600d8054821673130966628846bfd36ff31a822705796e8cb8c18d179055601080549091169055612710601181905560125560006013819055633b9aca006014556015556016805460ff191660011790553480156200008b57600080fd5b5060408051808201825260088152674d6964617344414f60c01b60208083019182528351808501909452600584526421a927aba760d91b908401528151919291600991620000dd916003919062000672565b508151620000f390600490602085019062000672565b506005805460ff191660ff92909216919091179055504690507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6200013762000462565b805160209182012060408051808201825260018152603160f81b90840152805180840194909452838101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606084015260808301939093523060a0808401919091528351808403909101815260c0909201928390528151910120600755600880546001600160a01b0319163317908190556001600160a01b0316906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3600b54600e80546001600160a01b0319166001600160a01b0392831617908190556040805163c45a015560e01b81529051919092169163c45a0155916004808301926020929190829003018186803b1580156200025a57600080fd5b505afa1580156200026f573d6000803e3d6000fd5b505050506040513d60208110156200028657600080fd5b5051600c80546001600160a01b0319166001600160a01b039283161790819055600d54604080516364e329cb60e11b8152918416600483015230602483015251919092169163c9c653969160448083019260209291908290030181600087803b158015620002f357600080fd5b505af115801562000308573d6000803e3d6000fd5b505050506040513d60208110156200031f57600080fd5b5051600f80546001600160a01b0319166001600160a01b03928316178155336000908152600a6020526040808220805460ff19908116600190811790925530808552938390208054909116909117905542601555600b54600d5493549151929490811693811692911690620003949062000707565b6001600160a01b039485168152928416602084015290831660408084019190915292166060820152905190819003608001906000f080158015620003dc573d6000803e3d6000fd5b5060168054610100600160a81b0319166101006001600160a01b0393841681029190911791829055900481166000908152600160208181526040808420600b805487168652908352818520600019908190553380875294845282862091549096168552909152909120919091556200045c906603328b944c4000620004fc565b6200072c565b60038054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015620004f25780601f10620004c657610100808354040283529160200191620004f2565b820191906000526020600020905b815481529060010190602001808311620004d457829003601f168201915b5050505050905090565b6001600160a01b03821662000558576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b620005653083836200060b565b62000581816002546200061060201b620012951790919060201c565b6002556001600160a01b03821660009081526020818152604090912054620005b49183906200129562000610821b17901c565b6001600160a01b038316600081815260208181526040918290209390935580518481529051919230927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b505050565b6000828201838110156200066b576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620006aa5760008555620006f5565b82601f10620006c557805160ff1916838001178555620006f5565b82800160010185558215620006f5579182015b82811115620006f5578251825591602001919060010190620006d8565b506200070392915062000715565b5090565b610dea806200243c83390190565b5b8082111562000703576000815560010162000716565b611d00806200073c6000396000f3fe608060405234801561001057600080fd5b50600436106102535760003560e01c8063715018a611610146578063a9059cbb116100c3578063daec383d11610087578063daec383d1461065a578063dd62ed3e14610662578063e208a93914610690578063eb50e70e14610698578063f2fde38b146106be578063f887ea40146106e457610253565b8063a9059cbb146105a7578063aa09581d146105d3578063d44545e7146105f9578063d49d518114610601578063d505accf1461060957610253565b8063966dae0e1161010a578063966dae0e14610537578063a0281f041461053f578063a22b35ce14610547578063a457c2d714610573578063a8aa1b311461059f57610253565b8063715018a6146104cd57806379cc6790146104d55780637ecebe00146105015780638da5cb5b1461052757806395d89b411461052f57610253565b806339509351116101d457806352f7c9881161019857806352f7c9881461044e5780636817031b146104715780636ac5eeee146104975780636ddd17131461049f57806370a08231146104a757610253565b806339509351146103c757806340c10f19146103f357806342966c68146104215780634626402b1461043e578063486a7e6b1461044657610253565b806323b872dd1161021b57806323b872dd1461033f57806330adf81f14610375578063313ce5671461037d5780633268cc561461039b5780633644e515146103bf57610253565b80630445b6671461025857806306fdde0314610272578063095ea7b3146102ef57806313af79431461032f57806318160ddd14610337575b600080fd5b6102606106ec565b60408051918252519081900360200190f35b61027a6106f2565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102b457818101518382015260200161029c565b50505050905090810190601f1680156102e15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61031b6004803603604081101561030557600080fd5b506001600160a01b038135169060200135610788565b604080519115158252519081900360200190f35b61026061079f565b6102606107a5565b61031b6004803603606081101561035557600080fd5b506001600160a01b038135811691602081013590911690604001356107ab565b61026061086f565b610385610893565b6040805160ff9092168252519081900360200190f35b6103a361089c565b604080516001600160a01b039092168252519081900360200190f35b6102606108ab565b61031b600480360360408110156103dd57600080fd5b506001600160a01b0381351690602001356108b1565b61041f6004803603604081101561040957600080fd5b506001600160a01b0381351690602001356108ec565b005b61041f6004803603602081101561043757600080fd5b5035610948565b6103a3610987565b610260610996565b61041f6004803603604081101561046457600080fd5b508035906020013561099c565b61031b6004803603602081101561048757600080fd5b50356001600160a01b0316610ae8565b61041f610b61565b61031b610c24565b610260600480360360208110156104bd57600080fd5b50356001600160a01b0316610c2d565b61041f610c48565b61041f600480360360408110156104eb57600080fd5b506001600160a01b038135169060200135610cdf565b6102606004803603602081101561051757600080fd5b50356001600160a01b0316610ce9565b6103a3610d0a565b61027a610d19565b6103a3610d7a565b6103a3610d89565b61041f6004803603604081101561055d57600080fd5b506001600160a01b038135169060200135610d9d565b61031b6004803603604081101561058957600080fd5b506001600160a01b038135169060200135610de9565b6103a3610e38565b61031b600480360360408110156105bd57600080fd5b506001600160a01b038135169060200135610e47565b61031b600480360360208110156105e957600080fd5b50356001600160a01b0316610e54565b610260610ec9565b610260610ecf565b61041f600480360360e081101561061f57600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c00135610ed5565b6103a3611102565b6102606004803603604081101561067857600080fd5b506001600160a01b0381358116916020013516611111565b61026061113c565b61041f600480360360208110156106ae57600080fd5b50356001600160a01b0316611142565b61041f600480360360208110156106d457600080fd5b50356001600160a01b0316611198565b6103a3611286565b60145481565b60038054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561077e5780601f106107535761010080835404028352916020019161077e565b820191906000526020600020905b81548152906001019060200180831161076157829003601f168201915b5050505050905090565b60006107953384846112ef565b5060015b92915050565b60155481565b60025490565b6002546001600160a01b038416600090815260016020908152604080832033845290915281205490911461085a576040805180820182526016815275496e73756666696369656e7420416c6c6f77616e636560501b6020808301919091526001600160a01b03871660009081526001825283812033825290915291909120546108359184906113db565b6001600160a01b03851660009081526001602090815260408083203384529091529020555b610865848484611472565b90505b9392505050565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60055460ff1690565b600b546001600160a01b031681565b60075481565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916107959185906108e79086611295565b6112ef565b3360009081526009602052604090205460ff1661093a5760405162461bcd60e51b8152600401808060200182810382526023815260200180611bfa6023913960400191505060405180910390fd5b6109448282611661565b5050565b610950610d0a565b6001600160a01b0316336001600160a01b0316141561097a576013546109769082611295565b6013555b6109843382611751565b50565b6010546001600160a01b031681565b60135481565b6008546001600160a01b031633146109e9576040805162461bcd60e51b81526020600482018190526024820152600080516020611c1d833981519152604482015290519081900360640190fd5b8160011415610a4857620493e0811115610a3e576040805162461bcd60e51b8152602060048201526011602482015270627579206665652061626f76652033302560781b604482015290519081900360640190fd5b6012819055610944565b8160021415610aa857620493e0811115610a9e576040805162461bcd60e51b815260206004820152601260248201527173656c6c206665652061626f76652033302560701b604482015290519081900360640190fd5b6011819055610944565b8160031415610ad95760008111610ac0576000610ac3565b60015b6016805460ff1916911515919091179055610944565b81600414156109445760145550565b6008546000906001600160a01b03163314610b38576040805162461bcd60e51b81526020600482018190526024820152600080516020611c1d833981519152604482015290519081900360640190fd5b506001600160a01b03166000908152600960205260409020805460ff1916600190811790915590565b6008546001600160a01b03163314610bae576040805162461bcd60e51b81526020600482018190526024820152600080516020611c1d833981519152604482015290519081900360640190fd5b60165461010090046001600160a01b031660008181526020819052604080822054815163c1ebb47b60e01b815260048101829052915190939263c1ebb47b926024808201939182900301818387803b158015610c0957600080fd5b505af1158015610c1d573d6000803e3d6000fd5b5050505050565b60165460ff1681565b6001600160a01b031660009081526020819052604090205490565b6008546001600160a01b03163314610c95576040805162461bcd60e51b81526020600482018190526024820152600080516020611c1d833981519152604482015290519081900360640190fd5b6008546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600880546001600160a01b0319169055565b6109448282610d9d565b6001600160a01b03811660009081526006602052604081206107999061184d565b6008546001600160a01b031690565b60048054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561077e5780601f106107535761010080835404028352916020019161077e565b600c546001600160a01b031681565b60165461010090046001600160a01b031681565b6000610dcd82604051806060016040528060248152602001611c3d60249139610dc68633611111565b91906113db565b9050610dda8333836112ef565b610de48383611751565b505050565b600061079533846108e785604051806060016040528060258152602001611ca6602591393360009081526001602090815260408083206001600160a01b038d16845290915290205491906113db565b600f546001600160a01b031681565b6000610868338484611472565b6008546000906001600160a01b03163314610ea4576040805162461bcd60e51b81526020600482018190526024820152600080516020611c1d833981519152604482015290519081900360640190fd5b506001600160a01b03166000908152600960205260409020805460ff19169055600190565b60125481565b60001981565b83421115610f2a576040805162461bcd60e51b815260206004820152601860248201527f5065726d69743a206578706972656420646561646c696e650000000000000000604482015290519081900360640190fd5b6001600160a01b03871660009081526006602052604081207f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c990899089908990610f739061184d565b604080516020808201979097526001600160a01b0395861681830152939094166060840152608083019190915260a082015260c08082018990528251808303909101815260e08201835280519084012060075461190160f01b610100840152610102830152610122808301829052835180840390910181526101428301808552815191860191909120600091829052610162840180865281905260ff8a166101828501526101a284018990526101c28401889052935191955092936001926101e280820193601f1981019281900390910190855afa158015611059573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381161580159061108f5750896001600160a01b0316816001600160a01b0316145b6110ca5760405162461bcd60e51b8152600401808060200182810382526021815260200180611bb86021913960400191505060405180910390fd5b6001600160a01b038a1660009081526006602052604090206110eb90611851565b6110f68a8a8a6112ef565b50505050505050505050565b600d546001600160a01b031681565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60115481565b6008546001600160a01b0316331461118f576040805162461bcd60e51b81526020600482018190526024820152600080516020611c1d833981519152604482015290519081900360640190fd5b6109848161185a565b6008546001600160a01b031633146111e5576040805162461bcd60e51b81526020600482018190526024820152600080516020611c1d833981519152604482015290519081900360640190fd5b6001600160a01b03811661122a5760405162461bcd60e51b8152600401808060200182810382526026815260200180611b706026913960400191505060405180910390fd5b6008546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600880546001600160a01b0319166001600160a01b0392909216919091179055565b600e546001600160a01b031681565b600082820183811015610868576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6001600160a01b0383166113345760405162461bcd60e51b8152600401808060200182810382526024815260200180611c826024913960400191505060405180910390fd5b6001600160a01b0382166113795760405162461bcd60e51b8152600401808060200182810382526022815260200180611b966022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6000818484111561146a5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561142f578181015183820152602001611417565b50505050905090810190601f16801561145c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6016546000906001600160a01b038581166101009092041614806114a857506016546001600160a01b0384811661010090920416145b156114bf576114b88484846118c5565b9050610868565b6114c8846119a3565b1561164c57600f546000906001600160a01b03868116911614806114f95750600b546001600160a01b038681169116145b600f549091506000906001600160a01b03868116911614806115285750600b546001600160a01b038681169116145b90506000816115375780611559565b611559620f4240611553601154886119c290919063ffffffff16565b90611a1b565b9050826115665780611582565b611582620f4240611553601254886119c290919063ffffffff16565b90508015611638576016546115a790889061010090046001600160a01b0316836118c5565b506115b28582611a5d565b94508180156115c557506115c581611a9f565b1561163857601660019054906101000a90046001600160a01b03166001600160a01b031663c1ebb47b826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561162557600080fd5b505af1925050508015611636575060015b505b6116438787876118c5565b50505050611657565b6114b88484846118c5565b5060019392505050565b6001600160a01b0382166116bc576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b6116c7308383610de4565b6002546116d49082611295565b6002556001600160a01b0382166000908152602081905260409020546116fa9082611295565b6001600160a01b038316600081815260208181526040918290209390935580518481529051919230927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6001600160a01b0382166117965760405162461bcd60e51b8152600401808060200182810382526021815260200180611c616021913960400191505060405180910390fd5b6117a282600083610de4565b6117df81604051806060016040528060228152602001611b4e602291396001600160a01b03851660009081526020819052604090205491906113db565b6001600160a01b0383166000908152602081905260409020556002546118059082611a5d565b6002556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b5490565b80546001019055565b601080546001600160a01b0319166001600160a01b03838116919091179182905560165460408051633eeec77760e01b815293831660048501525161010090910490911691633eeec77791602480830192600092919082900301818387803b158015610c0957600080fd5b6040805180820182526014815273496e73756666696369656e742042616c616e636560601b6020808301919091526001600160a01b038616600090815290819052918220546119159184906113db565b6001600160a01b0380861660009081526020819052604080822093909355908516815220546119449083611295565b6001600160a01b038085166000818152602081815260409182902094909455805186815290519193928816927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a35060019392505050565b6001600160a01b03166000908152600a602052604090205460ff161590565b6000826119d157506000610799565b828202828482816119de57fe5b04146108685760405162461bcd60e51b8152600401808060200182810382526021815260200180611bd96021913960400191505060405180910390fd5b600061086883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611ae8565b600061086883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506113db565b600f546000906001600160a01b03163314801590611abf575060165460ff165b8015611acd57506014548210155b80156107995750506010546001600160a01b03161515919050565b60008183611b375760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561142f578181015183820152602001611417565b506000838581611b4357fe5b049594505050505056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f20616464726573735a65726f537761705065726d69743a20496e76616c6964207369676e6174757265536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775661756c744f776e65643a2063616c6c6572206973206e6f7420746865205661756c744f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657245524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220b976ad7182c2292b6af483197c79439b227cbbafb36b9338f428f78a9b5205e164736f6c634300070500336080604052633b9aca0060055534801561001857600080fd5b50604051610dea380380610dea8339818101604052608081101561003b57600080fd5b508051602080830151604080850151606090950151600080546001600160a01b038088166001600160a01b031992831617835560018054828816908416811790915560028054838c16908516179081905560038054848816951694909417909355855163095ea7b360e01b8152600481019190915260001960248201529451979895979596939591169363095ea7b3936044808301949193928390030190829087803b1580156100ea57600080fd5b505af11580156100fe573d6000803e3d6000fd5b505050506040513d602081101561011457600080fd5b505050505050610cc1806101296000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80630445b667146100465780633eeec77714610060578063c1ebb47b14610088575b600080fd5b61004e6100a5565b60408051918252519081900360200190f35b6100866004803603602081101561007657600080fd5b50356001600160a01b03166100ab565b005b6100866004803603602081101561009e57600080fd5b50356102a8565b60055481565b6001600160a01b0381166100fa576040805162461bcd60e51b815260206004820152601160248201527017dd1c99585cdd5c9e481b9bdd081cd95d607a1b604482015290519081900360640190fd5b6002546001546040805163095ea7b360e01b81526001600160a01b03928316600482015260001960248201529051919092169163095ea7b39160448083019260209291908290030181600087803b15801561015457600080fd5b505af1158015610168573d6000803e3d6000fd5b505050506040513d602081101561017e57600080fd5b50506002546040805163095ea7b360e01b81526001600160a01b03848116600483015260001960248301529151919092169163095ea7b39160448083019260209291908290030181600087803b1580156101d757600080fd5b505af11580156101eb573d6000803e3d6000fd5b505050506040513d602081101561020157600080fd5b50506003546040805163095ea7b360e01b81526001600160a01b03848116600483015260001960248301529151919092169163095ea7b39160448083019260209291908290030181600087803b15801561025a57600080fd5b505af115801561026e573d6000803e3d6000fd5b505050506040513d602081101561028457600080fd5b5050600480546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146102f7576040805162461bcd60e51b815260206004820152600d60248201526c1bdb9b1e4818dbdb9d1c9858dd609a1b604482015290519081900360640190fd5b60055481106107e65760008054604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561034c57600080fd5b505afa158015610360573d6000803e3d6000fd5b505050506040513d602081101561037657600080fd5b5051905080821115610386578091505b600061039e600a61039885600461080a565b9061086c565b60408051600280825260608083018452939450909160208301908036833750506000805483519394506001600160a01b0316928492506103da57fe5b6001600160a01b03928316602091820292909201015260025482519116908290600190811061040557fe5b6001600160a01b03928316602091820292909201015260015416635c11d79561043a600361043486600261086c565b9061080a565b6000843061044942603c6108ae565b6040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b838110156104b95781810151838201526020016104a1565b505050509050019650505050505050600060405180830381600087803b1580156104e257600080fd5b505af11580156104f6573d6000803e3d6000fd5b5050600154606092506001600160a01b0316905063d06ca61f61051f606461039887605f61080a565b846040518363ffffffff1660e01b81526004018083815260200180602001828103825283818151815260200191508051906020019060200280838360005b8381101561057557818101518382015260200161055d565b50505050905001935050505060006040518083038186803b15801561059957600080fd5b505afa1580156105ad573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156105d657600080fd5b81019080805160405193929190846401000000008211156105f657600080fd5b90830190602082018581111561060b57600080fd5b825186602082028301116401000000008211171561062857600080fd5b82525081516020918201928201910280838360005b8381101561065557818101518382015260200161063d565b505050509190910160405250506001546000805460025486519697506001600160a01b039384169663e8e33700965091841694509092169186919061069657fe5b6020026020010151856001815181106106ab57fe5b6020026020010151600080306106cb603c426108ae90919063ffffffff16565b6040518963ffffffff1660e01b815260040180896001600160a01b03168152602001886001600160a01b03168152602001878152602001868152602001858152602001848152602001836001600160a01b0316815260200182815260200198505050505050505050606060405180830381600087803b15801561074d57600080fd5b505af1158015610761573d6000803e3d6000fd5b505050506040513d606081101561077757600080fd5b505080517f424db2872186fa7e7afa7a5e902ed3b49a2ef19c2f5431e672462495dd6b45069082906000906107a857fe5b6020026020010151826001815181106107bd57fe5b6020026020010151604051808381526020018281526020019250505060405180910390a1505050505b6004546001600160a01b031615610807576107ff610908565b610807610a76565b50565b60008261081957506000610866565b8282028284828161082657fe5b04146108635760405162461bcd60e51b8152600401808060200182810382526021815260200180610c6b6021913960400191505060405180910390fd5b90505b92915050565b600061086383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250610bc8565b600082820183811015610863576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6004805460025460408051631d386ecb60e21b81526001600160a01b0392831694810194909452519116916374e1bb2c9160248083019260209291908290030181600087803b15801561095a57600080fd5b505af115801561096e573d6000803e3d6000fd5b505050506040513d602081101561098457600080fd5b505115610a7457600254604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156109d657600080fd5b505afa1580156109ea573d6000803e3d6000fd5b505050506040513d6020811015610a0057600080fd5b5051600480546002546040805163c66bc92760e01b81529384018590526001600160a01b03918216602485015251939450169163c66bc9279160448082019260009290919082900301818387803b158015610a5a57600080fd5b505af1158015610a6e573d6000803e3d6000fd5b50505050505b565b60048054600354604080516353a6f55f60e11b81526001600160a01b03928316948101949094525191169163a74deabe9160248083019260209291908290030181600087803b158015610ac857600080fd5b505af1158015610adc573d6000803e3d6000fd5b505050506040513d6020811015610af257600080fd5b505115610a7457600354604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015610b4457600080fd5b505afa158015610b58573d6000803e3d6000fd5b505050506040513d6020811015610b6e57600080fd5b5051600480546003546040805163c66bc92760e01b81529384018590526001600160a01b03918216602485015251939450169163c66bc9279160448082019260009290919082900301818387803b158015610a5a57600080fd5b60008183610c545760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610c19578181015183820152602001610c01565b50505050905090810190601f168015610c465780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581610c6057fe5b049594505050505056fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a264697066735822122069e2c7b898d09b7c0a5c5ccdc03e022a0d429b2be60409f8d9cc1929a671cbd764736f6c63430007050033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102535760003560e01c8063715018a611610146578063a9059cbb116100c3578063daec383d11610087578063daec383d1461065a578063dd62ed3e14610662578063e208a93914610690578063eb50e70e14610698578063f2fde38b146106be578063f887ea40146106e457610253565b8063a9059cbb146105a7578063aa09581d146105d3578063d44545e7146105f9578063d49d518114610601578063d505accf1461060957610253565b8063966dae0e1161010a578063966dae0e14610537578063a0281f041461053f578063a22b35ce14610547578063a457c2d714610573578063a8aa1b311461059f57610253565b8063715018a6146104cd57806379cc6790146104d55780637ecebe00146105015780638da5cb5b1461052757806395d89b411461052f57610253565b806339509351116101d457806352f7c9881161019857806352f7c9881461044e5780636817031b146104715780636ac5eeee146104975780636ddd17131461049f57806370a08231146104a757610253565b806339509351146103c757806340c10f19146103f357806342966c68146104215780634626402b1461043e578063486a7e6b1461044657610253565b806323b872dd1161021b57806323b872dd1461033f57806330adf81f14610375578063313ce5671461037d5780633268cc561461039b5780633644e515146103bf57610253565b80630445b6671461025857806306fdde0314610272578063095ea7b3146102ef57806313af79431461032f57806318160ddd14610337575b600080fd5b6102606106ec565b60408051918252519081900360200190f35b61027a6106f2565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102b457818101518382015260200161029c565b50505050905090810190601f1680156102e15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61031b6004803603604081101561030557600080fd5b506001600160a01b038135169060200135610788565b604080519115158252519081900360200190f35b61026061079f565b6102606107a5565b61031b6004803603606081101561035557600080fd5b506001600160a01b038135811691602081013590911690604001356107ab565b61026061086f565b610385610893565b6040805160ff9092168252519081900360200190f35b6103a361089c565b604080516001600160a01b039092168252519081900360200190f35b6102606108ab565b61031b600480360360408110156103dd57600080fd5b506001600160a01b0381351690602001356108b1565b61041f6004803603604081101561040957600080fd5b506001600160a01b0381351690602001356108ec565b005b61041f6004803603602081101561043757600080fd5b5035610948565b6103a3610987565b610260610996565b61041f6004803603604081101561046457600080fd5b508035906020013561099c565b61031b6004803603602081101561048757600080fd5b50356001600160a01b0316610ae8565b61041f610b61565b61031b610c24565b610260600480360360208110156104bd57600080fd5b50356001600160a01b0316610c2d565b61041f610c48565b61041f600480360360408110156104eb57600080fd5b506001600160a01b038135169060200135610cdf565b6102606004803603602081101561051757600080fd5b50356001600160a01b0316610ce9565b6103a3610d0a565b61027a610d19565b6103a3610d7a565b6103a3610d89565b61041f6004803603604081101561055d57600080fd5b506001600160a01b038135169060200135610d9d565b61031b6004803603604081101561058957600080fd5b506001600160a01b038135169060200135610de9565b6103a3610e38565b61031b600480360360408110156105bd57600080fd5b506001600160a01b038135169060200135610e47565b61031b600480360360208110156105e957600080fd5b50356001600160a01b0316610e54565b610260610ec9565b610260610ecf565b61041f600480360360e081101561061f57600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c00135610ed5565b6103a3611102565b6102606004803603604081101561067857600080fd5b506001600160a01b0381358116916020013516611111565b61026061113c565b61041f600480360360208110156106ae57600080fd5b50356001600160a01b0316611142565b61041f600480360360208110156106d457600080fd5b50356001600160a01b0316611198565b6103a3611286565b60145481565b60038054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561077e5780601f106107535761010080835404028352916020019161077e565b820191906000526020600020905b81548152906001019060200180831161076157829003601f168201915b5050505050905090565b60006107953384846112ef565b5060015b92915050565b60155481565b60025490565b6002546001600160a01b038416600090815260016020908152604080832033845290915281205490911461085a576040805180820182526016815275496e73756666696369656e7420416c6c6f77616e636560501b6020808301919091526001600160a01b03871660009081526001825283812033825290915291909120546108359184906113db565b6001600160a01b03851660009081526001602090815260408083203384529091529020555b610865848484611472565b90505b9392505050565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60055460ff1690565b600b546001600160a01b031681565b60075481565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916107959185906108e79086611295565b6112ef565b3360009081526009602052604090205460ff1661093a5760405162461bcd60e51b8152600401808060200182810382526023815260200180611bfa6023913960400191505060405180910390fd5b6109448282611661565b5050565b610950610d0a565b6001600160a01b0316336001600160a01b0316141561097a576013546109769082611295565b6013555b6109843382611751565b50565b6010546001600160a01b031681565b60135481565b6008546001600160a01b031633146109e9576040805162461bcd60e51b81526020600482018190526024820152600080516020611c1d833981519152604482015290519081900360640190fd5b8160011415610a4857620493e0811115610a3e576040805162461bcd60e51b8152602060048201526011602482015270627579206665652061626f76652033302560781b604482015290519081900360640190fd5b6012819055610944565b8160021415610aa857620493e0811115610a9e576040805162461bcd60e51b815260206004820152601260248201527173656c6c206665652061626f76652033302560701b604482015290519081900360640190fd5b6011819055610944565b8160031415610ad95760008111610ac0576000610ac3565b60015b6016805460ff1916911515919091179055610944565b81600414156109445760145550565b6008546000906001600160a01b03163314610b38576040805162461bcd60e51b81526020600482018190526024820152600080516020611c1d833981519152604482015290519081900360640190fd5b506001600160a01b03166000908152600960205260409020805460ff1916600190811790915590565b6008546001600160a01b03163314610bae576040805162461bcd60e51b81526020600482018190526024820152600080516020611c1d833981519152604482015290519081900360640190fd5b60165461010090046001600160a01b031660008181526020819052604080822054815163c1ebb47b60e01b815260048101829052915190939263c1ebb47b926024808201939182900301818387803b158015610c0957600080fd5b505af1158015610c1d573d6000803e3d6000fd5b5050505050565b60165460ff1681565b6001600160a01b031660009081526020819052604090205490565b6008546001600160a01b03163314610c95576040805162461bcd60e51b81526020600482018190526024820152600080516020611c1d833981519152604482015290519081900360640190fd5b6008546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600880546001600160a01b0319169055565b6109448282610d9d565b6001600160a01b03811660009081526006602052604081206107999061184d565b6008546001600160a01b031690565b60048054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561077e5780601f106107535761010080835404028352916020019161077e565b600c546001600160a01b031681565b60165461010090046001600160a01b031681565b6000610dcd82604051806060016040528060248152602001611c3d60249139610dc68633611111565b91906113db565b9050610dda8333836112ef565b610de48383611751565b505050565b600061079533846108e785604051806060016040528060258152602001611ca6602591393360009081526001602090815260408083206001600160a01b038d16845290915290205491906113db565b600f546001600160a01b031681565b6000610868338484611472565b6008546000906001600160a01b03163314610ea4576040805162461bcd60e51b81526020600482018190526024820152600080516020611c1d833981519152604482015290519081900360640190fd5b506001600160a01b03166000908152600960205260409020805460ff19169055600190565b60125481565b60001981565b83421115610f2a576040805162461bcd60e51b815260206004820152601860248201527f5065726d69743a206578706972656420646561646c696e650000000000000000604482015290519081900360640190fd5b6001600160a01b03871660009081526006602052604081207f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c990899089908990610f739061184d565b604080516020808201979097526001600160a01b0395861681830152939094166060840152608083019190915260a082015260c08082018990528251808303909101815260e08201835280519084012060075461190160f01b610100840152610102830152610122808301829052835180840390910181526101428301808552815191860191909120600091829052610162840180865281905260ff8a166101828501526101a284018990526101c28401889052935191955092936001926101e280820193601f1981019281900390910190855afa158015611059573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381161580159061108f5750896001600160a01b0316816001600160a01b0316145b6110ca5760405162461bcd60e51b8152600401808060200182810382526021815260200180611bb86021913960400191505060405180910390fd5b6001600160a01b038a1660009081526006602052604090206110eb90611851565b6110f68a8a8a6112ef565b50505050505050505050565b600d546001600160a01b031681565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60115481565b6008546001600160a01b0316331461118f576040805162461bcd60e51b81526020600482018190526024820152600080516020611c1d833981519152604482015290519081900360640190fd5b6109848161185a565b6008546001600160a01b031633146111e5576040805162461bcd60e51b81526020600482018190526024820152600080516020611c1d833981519152604482015290519081900360640190fd5b6001600160a01b03811661122a5760405162461bcd60e51b8152600401808060200182810382526026815260200180611b706026913960400191505060405180910390fd5b6008546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600880546001600160a01b0319166001600160a01b0392909216919091179055565b600e546001600160a01b031681565b600082820183811015610868576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6001600160a01b0383166113345760405162461bcd60e51b8152600401808060200182810382526024815260200180611c826024913960400191505060405180910390fd5b6001600160a01b0382166113795760405162461bcd60e51b8152600401808060200182810382526022815260200180611b966022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6000818484111561146a5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561142f578181015183820152602001611417565b50505050905090810190601f16801561145c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6016546000906001600160a01b038581166101009092041614806114a857506016546001600160a01b0384811661010090920416145b156114bf576114b88484846118c5565b9050610868565b6114c8846119a3565b1561164c57600f546000906001600160a01b03868116911614806114f95750600b546001600160a01b038681169116145b600f549091506000906001600160a01b03868116911614806115285750600b546001600160a01b038681169116145b90506000816115375780611559565b611559620f4240611553601154886119c290919063ffffffff16565b90611a1b565b9050826115665780611582565b611582620f4240611553601254886119c290919063ffffffff16565b90508015611638576016546115a790889061010090046001600160a01b0316836118c5565b506115b28582611a5d565b94508180156115c557506115c581611a9f565b1561163857601660019054906101000a90046001600160a01b03166001600160a01b031663c1ebb47b826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561162557600080fd5b505af1925050508015611636575060015b505b6116438787876118c5565b50505050611657565b6114b88484846118c5565b5060019392505050565b6001600160a01b0382166116bc576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b6116c7308383610de4565b6002546116d49082611295565b6002556001600160a01b0382166000908152602081905260409020546116fa9082611295565b6001600160a01b038316600081815260208181526040918290209390935580518481529051919230927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6001600160a01b0382166117965760405162461bcd60e51b8152600401808060200182810382526021815260200180611c616021913960400191505060405180910390fd5b6117a282600083610de4565b6117df81604051806060016040528060228152602001611b4e602291396001600160a01b03851660009081526020819052604090205491906113db565b6001600160a01b0383166000908152602081905260409020556002546118059082611a5d565b6002556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b5490565b80546001019055565b601080546001600160a01b0319166001600160a01b03838116919091179182905560165460408051633eeec77760e01b815293831660048501525161010090910490911691633eeec77791602480830192600092919082900301818387803b158015610c0957600080fd5b6040805180820182526014815273496e73756666696369656e742042616c616e636560601b6020808301919091526001600160a01b038616600090815290819052918220546119159184906113db565b6001600160a01b0380861660009081526020819052604080822093909355908516815220546119449083611295565b6001600160a01b038085166000818152602081815260409182902094909455805186815290519193928816927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a35060019392505050565b6001600160a01b03166000908152600a602052604090205460ff161590565b6000826119d157506000610799565b828202828482816119de57fe5b04146108685760405162461bcd60e51b8152600401808060200182810382526021815260200180611bd96021913960400191505060405180910390fd5b600061086883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611ae8565b600061086883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506113db565b600f546000906001600160a01b03163314801590611abf575060165460ff165b8015611acd57506014548210155b80156107995750506010546001600160a01b03161515919050565b60008183611b375760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561142f578181015183820152602001611417565b506000838581611b4357fe5b049594505050505056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f20616464726573735a65726f537761705065726d69743a20496e76616c6964207369676e6174757265536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775661756c744f776e65643a2063616c6c6572206973206e6f7420746865205661756c744f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657245524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220b976ad7182c2292b6af483197c79439b227cbbafb36b9338f428f78a9b5205e164736f6c63430007050033
Deployed Bytecode Sourcemap
28251:5607:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28851:38;;;:::i;:::-;;;;;;;;;;;;;;;;20386:81;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21055:167;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21055:167:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;28898:33;;;:::i;20657:98::-;;;:::i;30177:365::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;30177:365:0;;;;;;;;;;;;;;;;;:::i;25176:108::-;;;:::i;20568:81::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;28392:73;;;:::i;:::-;;;;-1:-1:-1;;;;;28392:73:0;;;;;;;;;;;;;;25293:31;;;:::i;21230:214::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21230:214:0;;;;;;;;:::i;29697:113::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;29697:113:0;;;;;;;;:::i;:::-;;29818:187;;;;;;;;;;;;;;;;-1:-1:-1;29818:187:0;;:::i;28638:42::-;;;:::i;28815:29::-;;;:::i;32181:603::-;;;;;;;;;;;;;;;;-1:-1:-1;32181:603:0;;;;;;;:::i;27868:126::-;;;;;;;;;;;;;;;;-1:-1:-1;27868:126:0;-1:-1:-1;;;;;27868:126:0;;:::i;33694:159::-;;;:::i;28990:30::-;;;:::i;20763:125::-;;;;;;;;;;;;;;;;-1:-1:-1;20763:125:0;-1:-1:-1;;;;;20763:125:0;;:::i;27370:151::-;;;:::i;33200:115::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;33200:115:0;;;;;;;;:::i;26590:120::-;;;;;;;;;;;;;;;;-1:-1:-1;26590:120:0;-1:-1:-1;;;;;26590:120:0;;:::i;27167:82::-;;;:::i;20475:85::-;;;:::i;28472:29::-;;;:::i;29029:31::-;;;:::i;33323:363::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;33323:363:0;;;;;;;;:::i;21452:277::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21452:277:0;;;;;;;;:::i;28610:19::-;;;:::i;30013:156::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;30013:156:0;;;;;;;;:::i;28000:126::-;;;;;;;;;;;;;;;;-1:-1:-1;28000:126:0;-1:-1:-1;;;;;28000:126:0;;:::i;28751:39::-;;;:::i;28940:41::-;;;:::i;25812:770::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;25812:770:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;28510:63::-;;;:::i;20896:151::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;20896:151:0;;;;;;;;;;:::i;28689:40::-;;;:::i;32792:113::-;;;;;;;;;;;;;;;;-1:-1:-1;32792:113:0;-1:-1:-1;;;;;32792:113:0;;:::i;27527:250::-;;;;;;;;;;;;;;;;-1:-1:-1;27527:250:0;-1:-1:-1;;;;;27527:250:0;;:::i;28582:21::-;;;:::i;28851:38::-;;;;:::o;20386:81::-;20454:5;20447:12;;;;;;;;-1:-1:-1;;20447:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20423:13;;20447:12;;20454:5;;20447:12;;20454:5;20447:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20386:81;:::o;21055:167::-;21138:4;21155:37;21164:10;21176:7;21185:6;21155:8;:37::i;:::-;-1:-1:-1;21210:4:0;21055:167;;;;;:::o;28898:33::-;;;;:::o;20657:98::-;20735:12;;20657:98;:::o;30177:365::-;30332:12;;-1:-1:-1;;;;;30297:19:0;;30277:4;30297:19;;;:11;:19;;;;;;;;30317:10;30297:31;;;;;;;;30277:4;;30297:47;30294:181;;30394:69;;;;;;;;;;;-1:-1:-1;;;30394:69:0;;;;;;;;-1:-1:-1;;;;;30394:19:0;;-1:-1:-1;30394:19:0;;;:11;:19;;;;;30414:10;30394:31;;;;;;;;;;:69;;30430:6;;30394:35;:69::i;:::-;-1:-1:-1;;;;;30360:19:0;;;;;;:11;:19;;;;;;;;30380:10;30360:31;;;;;;;:103;30294:181;30494:40;30508:6;30516:9;30527:6;30494:13;:40::i;:::-;30487:47;;30177:365;;;;;;:::o;25176:108::-;25218:66;25176:108;:::o;20568:81::-;20632:9;;;;20568:81;:::o;28392:73::-;;;-1:-1:-1;;;;;28392:73:0;;:::o;25293:31::-;;;;:::o;21230:214::-;21344:10;21318:4;21365:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;21365:32:0;;;;;;;;;;21318:4;;21335:79;;21356:7;;21365:48;;21402:10;21365:36;:48::i;:::-;21335:8;:79::i;29697:113::-;28176:10;28169:18;;;;:6;:18;;;;;;;;28160:68;;;;-1:-1:-1;;;28160:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29778:24:::1;29784:8;29794:7;29778:5;:24::i;:::-;29697:113:::0;;:::o;29818:187::-;29891:7;:5;:7::i;:::-;-1:-1:-1;;;;;29877:21:0;:10;-1:-1:-1;;;;;29877:21:0;;29874:88;;;29928:10;;:22;;29943:6;29928:14;:22::i;:::-;29915:10;:35;29874:88;29972:25;29978:10;29990:6;29972:5;:25::i;:::-;29818:187;:::o;28638:42::-;;;-1:-1:-1;;;;;28638:42:0;;:::o;28815:29::-;;;;:::o;32181:603::-;27292:6;;-1:-1:-1;;;;;27292:6:0;27302:10;27292:20;27283:67;;;;;-1:-1:-1;;;27283:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;27283:67:0;;;;;;;;;;;;;;;32270:10:::1;32284:1;32270:15;32265:512;;;32329:6;32319;:16;;32310:48;;;::::0;;-1:-1:-1;;;32310:48:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;32310:48:0;;;;;;;;;;;;;::::1;;32373:16;:25:::0;;;32265:512:::1;;;32423:10;32437:1;32423:15;32418:359;;;32483:6;32473;:16;;32464:49;;;::::0;;-1:-1:-1;;;32464:49:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;32464:49:0;;;;;;;;;;;;;::::1;;32528:17;:26:::0;;;32418:359:::1;;;32579:10;32593:1;32579:15;32574:203;;;32651:1;32642:6;:10;32641:27;;32663:5;32641:27;;;32656:4;32641:27;32627:11;:41:::0;;-1:-1:-1;;32627:41:0::1;::::0;::::1;;::::0;;;::::1;::::0;;32574:203:::1;;;32693:10;32707:1;32693:15;32688:89;;;32743:13;:22:::0;-1:-1:-1;32181:603:0:o;27868:126::-;27292:6;;27935:4;;-1:-1:-1;;;;;27292:6:0;27302:10;27292:20;27283:67;;;;;-1:-1:-1;;;27283:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;27283:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;;27949:14:0::1;;::::0;;;:6:::1;:14;::::0;;;;:21;;-1:-1:-1;;27949:21:0::1;27966:4;27949:21:::0;;::::1;::::0;;;27966:4;27868:126::o;33694:159::-;27292:6;;-1:-1:-1;;;;;27292:6:0;27302:10;27292:20;27283:67;;;;;-1:-1:-1;;;27283:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;27283:67:0;;;;;;;;;;;;;;;33786:12:::1;::::0;::::1;::::0;::::1;-1:-1:-1::0;;;;;33786:12:0::1;33746:19;33768:32:::0;;;::::1;::::0;;;;;;;;33811:34;;-1:-1:-1;;;33811:34:0;;::::1;::::0;::::1;::::0;;;;;33768:32;;33786:12;33811:21:::1;::::0;:34;;;;;;;;;;;33746:19;33786:12;33811:34;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;27357:1;33694:159::o:0;28990:30::-;;;;;;:::o;20763:125::-;-1:-1:-1;;;;;20862:18:0;20837:7;20862:18;;;;;;;;;;;;20763:125::o;27370:151::-;27292:6;;-1:-1:-1;;;;;27292:6:0;27302:10;27292:20;27283:67;;;;;-1:-1:-1;;;27283:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;27283:67:0;;;;;;;;;;;;;;;27469:6:::1;::::0;27447:42:::1;::::0;27485:1:::1;::::0;-1:-1:-1;;;;;27469:6:0::1;::::0;27447:42:::1;::::0;27485:1;;27447:42:::1;27496:6;:19:::0;;-1:-1:-1;;;;;;27496:19:0::1;::::0;;27370:151::o;33200:115::-;33279:28;33289:8;33299:7;33279:9;:28::i;26590:120::-;-1:-1:-1;;;;;26678:14:0;;26651:7;26678:14;;;:7;:14;;;;;:24;;:22;:24::i;27167:82::-;27237:6;;-1:-1:-1;;;;;27237:6:0;27167:82;:::o;20475:85::-;20545:7;20538:14;;;;;;;;-1:-1:-1;;20538:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20514:13;;20538:14;;20545:7;;20538:14;;20545:7;20538:14;;;;;;;;;;;;;;;;;;;;;;;;28472:29;;;-1:-1:-1;;;;;28472:29:0;;:::o;29029:31::-;;;;;;-1:-1:-1;;;;;29029:31:0;;:::o;33323:363::-;33403:27;33446:133;33500:7;33446:133;;;;;;;;;;;;;;;;;:31;33456:8;33466:10;33446:9;:31::i;:::-;:35;:133;:35;:133::i;:::-;33403:176;;33592:51;33601:8;33611:10;33623:19;33592:8;:51::i;:::-;33654:24;33660:8;33670:7;33654:5;:24::i;:::-;33323:363;;;:::o;21452:277::-;21545:4;21562:137;21571:10;21583:7;21592:106;21641:15;21592:106;;;;;;;;;;;;;;;;;21604:10;21592:23;;;;:11;:23;;;;;;;;-1:-1:-1;;;;;21592:32:0;;;;;;;;;;;:106;:48;:106::i;28610:19::-;;;-1:-1:-1;;;;;28610:19:0;;:::o;30013:156::-;30093:4;30117:44;30131:10;30143:9;30154:6;30117:13;:44::i;28000:126::-;27292:6;;28066:4;;-1:-1:-1;;;;;27292:6:0;27302:10;27292:20;27283:67;;;;;-1:-1:-1;;;27283:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;27283:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;;28080:14:0::1;28097:5;28080:14:::0;;;:6:::1;:14;::::0;;;;:22;;-1:-1:-1;;28080:22:0::1;::::0;;-1:-1:-1;;28000:126:0:o;28751:39::-;;;;:::o;28940:41::-;-1:-1:-1;;28940:41:0;:::o;25812:770::-;26057:8;26038:15;:27;;26030:64;;;;;-1:-1:-1;;;26030:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26203:14:0;;26107:18;26203:14;;;:7;:14;;;;;25218:66;;26179:5;;26186:7;;26195:6;;26203:24;;:22;:24::i;:::-;26151:87;;;;;;;;;;;-1:-1:-1;;;;;26151:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26141:98;;;;;;26311:16;;-1:-1:-1;;;26278:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26268:73;;;;;;;;;-1:-1:-1;26371:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26141:98;;-1:-1:-1;26268:73:0;;26371:25;;;;;;;-1:-1:-1;;26371:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;26371:25:0;;-1:-1:-1;;26371:25:0;;;-1:-1:-1;;;;;;;26415:20:0;;;;;;:39;;;26449:5;-1:-1:-1;;;;;26439:15:0;:6;-1:-1:-1;;;;;26439:15:0;;26415:39;26407:85;;;;-1:-1:-1;;;26407:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26505:14:0;;;;;;:7;:14;;;;;:26;;:24;:26::i;:::-;26542:32;26551:5;26558:7;26567:6;26542:8;:32::i;:::-;25812:770;;;;;;;;;;:::o;28510:63::-;;;-1:-1:-1;;;;;28510:63:0;;:::o;20896:151::-;-1:-1:-1;;;;;21012:18:0;;;20985:7;21012:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;20896:151::o;28689:40::-;;;;:::o;32792:113::-;27292:6;;-1:-1:-1;;;;;27292:6:0;27302:10;27292:20;27283:67;;;;;-1:-1:-1;;;27283:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;27283:67:0;;;;;;;;;;;;;;;32869:28:::1;32881:15;32869:11;:28::i;27527:250::-:0;27292:6;;-1:-1:-1;;;;;27292:6:0;27302:10;27292:20;27283:67;;;;;-1:-1:-1;;;27283:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;27283:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;27627:23:0;::::1;27618:75;;;;-1:-1:-1::0;;;27618:75:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27727:6;::::0;27705:41:::1;::::0;-1:-1:-1;;;;;27705:41:0;;::::1;::::0;27727:6:::1;::::0;27705:41:::1;::::0;27727:6:::1;::::0;27705:41:::1;27753:6;:18:::0;;-1:-1:-1;;;;;;27753:18:0::1;-1:-1:-1::0;;;;;27753:18:0;;;::::1;::::0;;;::::1;::::0;;27527:250::o;28582:21::-;;;-1:-1:-1;;;;;28582:21:0;;:::o;16633:181::-;16691:7;16723:5;;;16747:6;;;;16739:46;;;;;-1:-1:-1;;;16739:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;22566:346;-1:-1:-1;;;;;22668:19:0;;22660:68;;;;-1:-1:-1;;;22660:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22747:21:0;;22739:68;;;;-1:-1:-1;;;22739:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22820:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;22872:32;;;;;;;;;;;;;;;;;22566:346;;;:::o;16966:192::-;17052:7;17088:12;17080:6;;;;17072:29;;;;-1:-1:-1;;;17072:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;17124:5:0;;;16966:192::o;30890:1061::-;31020:12;;30982:4;;-1:-1:-1;;;;;31002:31:0;;;31020:12;;;;;31002:31;;:69;;-1:-1:-1;31058:12:0;;-1:-1:-1;;;;;31037:34:0;;;31058:12;;;;;31037:34;31002:69;30999:148;;;31094:41;31109:6;31117:9;31128:6;31094:14;:41::i;:::-;31087:48;;;;30999:148;31160:21;31174:6;31160:13;:21::i;:::-;31157:765;;;31218:4;;31195:10;;-1:-1:-1;;;;;31208:14:0;;;31218:4;;31208:14;;:41;;-1:-1:-1;31236:13:0;;-1:-1:-1;;;;;31226:23:0;;;31236:13;;31226:23;31208:41;31289:4;;31195:54;;-1:-1:-1;31262:11:0;;-1:-1:-1;;;;;31276:17:0;;;31289:4;;31276:17;;:47;;-1:-1:-1;31310:13:0;;-1:-1:-1;;;;;31297:26:0;;;31310:13;;31297:26;31276:47;31262:61;;31336:11;31373:6;31372:59;;31428:3;31372:59;;;31383:42;31417:7;31383:29;31394:17;;31383:6;:10;;:29;;;;:::i;:::-;:33;;:42::i;:::-;31366:65;;31451:5;31450:57;;31504:3;31450:57;;;31460:41;31493:7;31460:28;31471:16;;31460:6;:10;;:28;;;;:::i;:41::-;31444:63;-1:-1:-1;31525:7:0;;31522:252;;31579:12;;31548:50;;31563:6;;31579:12;;;-1:-1:-1;;;;;31579:12:0;31594:3;31548:14;:50::i;:::-;-1:-1:-1;31622:15:0;:6;31633:3;31622:10;:15::i;:::-;31613:24;;31656:6;:29;;;;;31666:19;31681:3;31666:14;:19::i;:::-;31652:109;;;31708:12;;;;;;;;;-1:-1:-1;;;;;31708:12:0;-1:-1:-1;;;;;31708:21:0;;31730:3;31708:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31704:42;;31788:41;31803:6;31811:9;31822:6;31788:14;:41::i;:::-;;31157:765;;;;;;31869:41;31884:6;31892:9;31903:6;31869:14;:41::i;31157:765::-;-1:-1:-1;31939:4:0;30890:1061;;;;;:::o;21737:395::-;-1:-1:-1;;;;;21823:22:0;;21815:66;;;;;-1:-1:-1;;;21815:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;21892:56;21922:4;21930:8;21940:7;21892:20;:56::i;:::-;21974:12;;:25;;21991:7;21974:16;:25::i;:::-;21959:12;:40;-1:-1:-1;;;;;22032:19:0;;:9;:19;;;;;;;;;;;:32;;22056:7;22032:23;:32::i;:::-;-1:-1:-1;;;;;22010:19:0;;:9;:19;;;;;;;;;;;;:54;;;;22080:44;;;;;;;22010:19;;22098:4;;22080:44;;;;;;;;;;21737:395;;:::o;22140:418::-;-1:-1:-1;;;;;22224:21:0;;22216:67;;;;-1:-1:-1;;;22216:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22296:49;22317:7;22334:1;22338:6;22296:20;:49::i;:::-;22379:68;22402:6;22379:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22379:18:0;;:9;:18;;;;;;;;;;;;:68;:22;:68::i;:::-;-1:-1:-1;;;;;22358:18:0;;:9;:18;;;;;;;;;;:89;22473:12;;:24;;22490:6;22473:16;:24::i;:::-;22458:12;:39;22513:37;;;;;;;;22539:1;;-1:-1:-1;;;;;22513:37:0;;;;;;;;;;;;22140:418;;:::o;23151:114::-;23243:14;;23151:114::o;23273:91::-;23337:19;;23355:1;23337:19;;;23273:91::o;32911:159::-;32976:14;:32;;-1:-1:-1;;;;;;32976:32:0;-1:-1:-1;;;;;32976:32:0;;;;;;;;;;;33019:12;;:43;;;-1:-1:-1;;;33019:43:0;;33047:14;;;33019:43;;;;;32976:32;33019:12;;;;;;;:27;;:43;;;;;-1:-1:-1;;33019:43:0;;;;;;;-1:-1:-1;33019:12:0;:43;;;;;;;;;;30550:332;30680:53;;;;;;;;;;;-1:-1:-1;;;30680:53:0;;;;;;;;-1:-1:-1;;;;;30680:17:0;;30643:4;30680:17;;;;;;;;;;;:53;;30702:6;;30680:21;:53::i;:::-;-1:-1:-1;;;;;30660:17:0;;;:9;:17;;;;;;;;;;;:73;;;;30767:20;;;;;;;:32;;30792:6;30767:24;:32::i;:::-;-1:-1:-1;;;;;30744:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;30815:35;;;;;;;30744:20;;30815:35;;;;;;;;;;;;;-1:-1:-1;30870:4:0;30550:332;;;;;:::o;33078:114::-;-1:-1:-1;;;;;33165:19:0;33140:4;33165:19;;;:11;:19;;;;;;;;33164:20;;33078:114::o;17166:252::-;17224:7;17250:6;17246:47;;-1:-1:-1;17280:1:0;17273:8;;17246:47;17317:5;;;17321:1;17317;:5;:1;17341:5;;;;;:10;17333:56;;;;-1:-1:-1;;;17333:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17426:132;17484:7;17511:39;17515:1;17518;17511:39;;;;;;;;;;;;;;;;;:3;:39::i;16822:136::-;16880:7;16907:43;16911:1;16914;16907:43;;;;;;;;;;;;;;;;;:3;:43::i;31959:214::-;32057:4;;32019;;-1:-1:-1;;;;;32057:4:0;32043:10;:18;;;;:44;;-1:-1:-1;32076:11:0;;;;32043:44;:79;;;;;32109:13;;32102:3;:20;;32043:79;:122;;;;-1:-1:-1;;32137:14:0;;-1:-1:-1;;;;;32137:14:0;:28;;;31959:214;-1:-1:-1;31959:214:0:o;17566:278::-;17652:7;17687:12;17680:5;17672:28;;;;-1:-1:-1;;;17672:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17711:9;17727:1;17723;:5;;;;;;;17566:278;-1:-1:-1;;;;;17566:278:0:o
Swarm Source
ipfs://69e2c7b898d09b7c0a5c5ccdc03e022a0d429b2be60409f8d9cc1929a671cbd7
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.