Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
This contract has been partially verified via Sourcify.
View contract in Sourcify repository
- Contract name:
- CoverERC20
- Optimization enabled
- true
- Compiler version
- v0.7.3+commit.9bfce1f6
- Optimization runs
- 200
- EVM Version
- istanbul
- Verified at
- 2026-04-22T20:40:02.528142Z
CoverERC20.sol
// SPDX-License-Identifier
pragma solidity ^0.7.3;
/**
* @title Interface of Ownable
*/
interface IOwnable {
function owner() external view returns (address);
}
// SPDX-License-Identifier
pragma solidity ^0.7.3;
/**
* @title Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
function symbol() external view returns (string memory);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
function approve(address spender, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
function totalSupply() external view returns (uint256);
function increaseAllowance(address spender, uint256 addedValue) external returns (bool);
function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool);
}
// SPDX-License-Identifier
pragma solidity ^0.7.3;
/**
* @title CoverERC20 contract interface, implements {IERC20}. See {CoverERC20}.
* @author crypto-pumpkin@github
*/
interface ICoverERC20 is IERC20 {
function burn(uint256 _amount) external returns (bool);
/// @notice access restriction - owner (Cover)
function mint(address _account, uint256 _amount) external returns (bool);
function setSymbol(string calldata _symbol) external returns (bool);
function burnByCover(address _account, uint256 _amount) external returns (bool);
}
// SPDX-License-Identifier
pragma solidity ^0.7.3;
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts with custom message when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
// SPDX-License-Identifier
// solhint-disable-next-line compiler-version
pragma solidity ^0.7.3;
/**
* @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
* behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an
* external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
* function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
*
* TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
* possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.
*
* CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
* that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
*/
abstract contract Initializable {
/**
* @dev Indicates that the contract has been initialized.
*/
bool private _initialized;
/**
* @dev Indicates that the contract is in the process of being initialized.
*/
bool private _initializing;
/**
* @dev Modifier to protect an initializer function from being invoked twice.
*/
modifier initializer() {
require(_initializing || _isConstructor() || !_initialized, "Initializable: contract is already initialized");
bool isTopLevelCall = !_initializing;
if (isTopLevelCall) {
_initializing = true;
_initialized = true;
}
_;
if (isTopLevelCall) {
_initializing = false;
}
}
/// @dev Returns true if and only if the function is running in the constructor
function _isConstructor() private view returns (bool) {
// extcodesize checks the size of the code stored in an address, and
// address returns the current address. Since the code is still not
// deployed when running a constructor, any checks on its code size will
// yield zero, making it an effective way to detect if a contract is
// under construction or not.
address self = address(this);
uint256 cs;
// solhint-disable-next-line no-inline-assembly
assembly { cs := extcodesize(self) }
return cs == 0;
}
}
// SPDX-License-Identifier
pragma solidity ^0.7.3;
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
* @author crypto-pumpkin@github
*
* By initialization, the owner account will be the one that called initializeOwner. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
contract Ownable is Initializable {
address private _owner;
address private _newOwner;
event OwnershipTransferInitiated(address indexed previousOwner, address indexed newOwner);
event OwnershipTransferCompleted(address indexed previousOwner, address indexed newOwner);
/**
* @dev COVER: Initializes the contract setting the deployer as the initial owner.
*/
function initializeOwner() internal initializer {
_owner = msg.sender;
emit OwnershipTransferCompleted(address(0), _owner);
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(_owner == msg.sender, "Ownable: caller is not the owner");
_;
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
emit OwnershipTransferInitiated(_owner, newOwner);
_newOwner = newOwner;
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function claimOwnership() public virtual {
require(_newOwner == msg.sender, "Ownable: caller is not the owner");
emit OwnershipTransferCompleted(_owner, _newOwner);
_owner = _newOwner;
}
}
// SPDX-License-Identifier
pragma solidity ^0.7.3;
/**
* @title CoverERC20 implements {ERC20} standards with expended features for COVER
* @author crypto-pumpkin@github
*
* COVER's covToken Features:
* - Has mint and burn by owner (Cover contract) only feature.
* - No limit on the totalSupply.
* - Should only be created from Cover contract. See {Cover}
*/
contract CoverERC20 is ICoverERC20, Initializable, Ownable {
using SafeMath for uint256;
uint8 public constant decimals = 18;
string public constant name = "covToken";
// The symbol of the contract
string public override symbol;
uint256 private _totalSupply;
mapping(address => uint256) private balances;
mapping(address => mapping (address => uint256)) private allowances;
/// @notice Initialize, called once
function initialize (string calldata _symbol) external initializer {
symbol = _symbol;
initializeOwner();
}
/// @notice Standard ERC20 function
function balanceOf(address account) external view override returns (uint256) {
return balances[account];
}
/// @notice Standard ERC20 function
function totalSupply() external view override returns (uint256) {
return _totalSupply;
}
/// @notice Standard ERC20 function
function transfer(address recipient, uint256 amount) external virtual override returns (bool) {
_transfer(msg.sender, recipient, amount);
return true;
}
/// @notice Standard ERC20 function
function allowance(address owner, address spender) external view virtual override returns (uint256) {
return allowances[owner][spender];
}
/// @notice Standard ERC20 function
function approve(address spender, uint256 amount) external virtual override returns (bool) {
_approve(msg.sender, spender, amount);
return true;
}
/// @notice Standard ERC20 function
function transferFrom(address sender, address recipient, uint256 amount)
external virtual override returns (bool)
{
_transfer(sender, recipient, amount);
_approve(sender, msg.sender, allowances[sender][msg.sender].sub(amount, "CoverERC20: transfer amount exceeds allowance"));
return true;
}
/// @notice New ERC20 function
function increaseAllowance(address spender, uint256 addedValue) public virtual override returns (bool) {
_approve(msg.sender, spender, allowances[msg.sender][spender].add(addedValue));
return true;
}
/// @notice New ERC20 function
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual override returns (bool) {
_approve(msg.sender, spender, allowances[msg.sender][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
return true;
}
/// @notice COVER specific function
function mint(address _account, uint256 _amount)
external override onlyOwner returns (bool)
{
require(_account != address(0), "CoverERC20: mint to the zero address");
_totalSupply = _totalSupply.add(_amount);
balances[_account] = balances[_account].add(_amount);
emit Transfer(address(0), _account, _amount);
return true;
}
/// @notice COVER specific function
function setSymbol(string calldata _symbol)
external override onlyOwner returns (bool)
{
symbol = _symbol;
return true;
}
/// @notice COVER specific function
function burnByCover(address _account, uint256 _amount) external override onlyOwner returns (bool) {
_burn(_account, _amount);
return true;
}
/// @notice COVER specific function
function burn(uint256 _amount) external override returns (bool) {
_burn(msg.sender, _amount);
return true;
}
function _transfer(address sender, address recipient, uint256 amount) internal {
require(sender != address(0), "CoverERC20: transfer from the zero address");
require(recipient != address(0), "CoverERC20: transfer to the zero address");
balances[sender] = balances[sender].sub(amount, "CoverERC20: transfer amount exceeds balance");
balances[recipient] = balances[recipient].add(amount);
emit Transfer(sender, recipient, amount);
}
function _burn(address account, uint256 amount) internal {
require(account != address(0), "CoverERC20: burn from the zero address");
balances[account] = balances[account].sub(amount, "CoverERC20: burn amount exceeds balance");
_totalSupply = _totalSupply.sub(amount);
emit Transfer(account, address(0), amount);
}
function _approve(address owner, address spender, uint256 amount) internal {
require(owner != address(0), "CoverERC20: approve from the zero address");
require(spender != address(0), "CoverERC20: approve to the zero address");
allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
}
Compiler Settings
{"remappings":[],"optimizer":{"runs":200,"enabled":true},"metadata":{"bytecodeHash":"ipfs"},"libraries":{},"evmVersion":"istanbul","compilationTarget":{"CoverERC20.sol":"CoverERC20"}}
Contract ABI
[{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"spender","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferCompleted","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"OwnershipTransferInitiated","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"address","name":"spender","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"burn","inputs":[{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"burnByCover","inputs":[{"type":"address","name":"_account","internalType":"address"},{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"claimOwnership","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"decreaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"subtractedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"increaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"addedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"initialize","inputs":[{"type":"string","name":"_symbol","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"mint","inputs":[{"type":"address","name":"_account","internalType":"address"},{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"setSymbol","inputs":[{"type":"string","name":"_symbol","internalType":"string"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"sender","internalType":"address"},{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]}]
Contract Creation Code
0x608060405234801561001057600080fd5b5061139c806100206000396000f3fe608060405234801561001057600080fd5b50600436106101215760003560e01c806370a08231116100ad578063b84c824611610071578063b84c82461461037a578063dd62ed3e146103ea578063f2fde38b14610418578063f62d18881461043e578063f8cc02df146104ae57610121565b806370a08231146102d05780638da5cb5b146102f657806395d89b411461031a578063a457c2d714610322578063a9059cbb1461034e57610121565b8063313ce567116100f4578063313ce56714610233578063395093511461025157806340c10f191461027d57806342966c68146102a95780634e71e0c8146102c657610121565b806306fdde0314610126578063095ea7b3146101a357806318160ddd146101e357806323b872dd146101fd575b600080fd5b61012e6104da565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610168578181015183820152602001610150565b50505050905090810190601f1680156101955780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101cf600480360360408110156101b957600080fd5b506001600160a01b0381351690602001356104fe565b604080519115158252519081900360200190f35b6101eb610514565b60408051918252519081900360200190f35b6101cf6004803603606081101561021357600080fd5b506001600160a01b0381358116916020810135909116906040013561051a565b61023b610583565b6040805160ff9092168252519081900360200190f35b6101cf6004803603604081101561026757600080fd5b506001600160a01b038135169060200135610588565b6101cf6004803603604081101561029357600080fd5b506001600160a01b0381351690602001356105be565b6101cf600480360360208110156102bf57600080fd5b50356106e7565b6102ce6106fb565b005b6101eb600480360360208110156102e657600080fd5b50356001600160a01b03166107b7565b6102fe6107d2565b604080516001600160a01b039092168252519081900360200190f35b61012e6107e7565b6101cf6004803603604081101561033857600080fd5b506001600160a01b038135169060200135610872565b6101cf6004803603604081101561036457600080fd5b506001600160a01b0381351690602001356108c1565b6101cf6004803603602081101561039057600080fd5b8101906020810181356401000000008111156103ab57600080fd5b8201836020820111156103bd57600080fd5b803590602001918460018302840111640100000000831117156103df57600080fd5b5090925090506108ce565b6101eb6004803603604081101561040057600080fd5b506001600160a01b038135811691602001351661092e565b6102ce6004803603602081101561042e57600080fd5b50356001600160a01b0316610959565b6102ce6004803603602081101561045457600080fd5b81019060208101813564010000000081111561046f57600080fd5b82018360208201111561048157600080fd5b803590602001918460018302840111640100000000831117156104a357600080fd5b509092509050610a52565b6101cf600480360360408110156104c457600080fd5b506001600160a01b038135169060200135610b0b565b6040518060400160405280600881526020016731b7bb2a37b5b2b760c11b81525081565b600061050b338484610b69565b50600192915050565b60035490565b6000610527848484610c55565b6105798433610574856040518060600160405280602d81526020016112ca602d91396001600160a01b038a1660009081526005602090815260408083203384529091529020549190610da7565b610b69565b5060019392505050565b601281565b3360008181526005602090815260408083206001600160a01b0387168452909152812054909161050b9185906105749086610e3e565b600080546201000090046001600160a01b03163314610612576040805162461bcd60e51b815260206004820181905260248201526000805160206112f7833981519152604482015290519081900360640190fd5b6001600160a01b0383166106575760405162461bcd60e51b81526004018080602001828103825260248152602001806112256024913960400191505060405180910390fd5b6003546106649083610e3e565b6003556001600160a01b03831660009081526004602052604090205461068a9083610e3e565b6001600160a01b03841660008181526004602090815260408083209490945583518681529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a350600192915050565b60006106f33383610e9f565b506001919050565b6001546001600160a01b03163314610748576040805162461bcd60e51b815260206004820181905260248201526000805160206112f7833981519152604482015290519081900360640190fd5b600154600080546040516001600160a01b039384169362010000909204909116917fe9a5158ac7353c7c7322ececc080bc8e89334efa5795b6e21e40eb266b0003d691a36001546000805462010000600160b01b0319166001600160a01b039092166201000002919091179055565b6001600160a01b031660009081526004602052604090205490565b6000546201000090046001600160a01b031690565b6002805460408051602060018416156101000260001901909316849004601f8101849004840282018401909252818152929183018282801561086a5780601f1061083f5761010080835404028352916020019161086a565b820191906000526020600020905b81548152906001019060200180831161084d57829003601f168201915b505050505081565b600061050b338461057485604051806060016040528060258152602001611342602591393360009081526005602090815260408083206001600160a01b038d1684529091529020549190610da7565b600061050b338484610c55565b600080546201000090046001600160a01b03163314610922576040805162461bcd60e51b815260206004820181905260248201526000805160206112f7833981519152604482015290519081900360640190fd5b610579600284846110cf565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b6000546201000090046001600160a01b031633146109ac576040805162461bcd60e51b815260206004820181905260248201526000805160206112f7833981519152604482015290519081900360640190fd5b6001600160a01b0381166109f15760405162461bcd60e51b81526004018080602001828103825260268152602001806111d86026913960400191505060405180910390fd5b600080546040516001600160a01b03808516936201000090930416917fb150023a879fd806e3599b6ca8ee3b60f0e360ab3846d128d67ebce1a391639a91a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b600054610100900460ff1680610a6b5750610a6b610f8f565b80610a79575060005460ff16155b610ab45760405162461bcd60e51b815260040180806020018281038252602e815260200180611273602e913960400191505060405180910390fd5b600054610100900460ff16158015610adf576000805460ff1961ff0019909116610100171660011790555b610aeb600284846110cf565b50610af4610f95565b8015610b06576000805461ff00191690555b505050565b600080546201000090046001600160a01b03163314610b5f576040805162461bcd60e51b815260206004820181905260248201526000805160206112f7833981519152604482015290519081900360640190fd5b61050b8383610e9f565b6001600160a01b038316610bae5760405162461bcd60e51b81526004018080602001828103825260298152602001806112a16029913960400191505060405180910390fd5b6001600160a01b038216610bf35760405162461bcd60e51b81526004018080602001828103825260278152602001806111fe6027913960400191505060405180910390fd5b6001600160a01b03808416600081815260056020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b038316610c9a5760405162461bcd60e51b815260040180806020018281038252602a815260200180611249602a913960400191505060405180910390fd5b6001600160a01b038216610cdf5760405162461bcd60e51b81526004018080602001828103825260288152602001806111b06028913960400191505060405180910390fd5b610d1c816040518060600160405280602b8152602001611317602b91396001600160a01b0386166000908152600460205260409020549190610da7565b6001600160a01b038085166000908152600460205260408082209390935590841681522054610d4b9082610e3e565b6001600160a01b0380841660008181526004602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008184841115610e365760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610dfb578181015183820152602001610de3565b50505050905090810190601f168015610e285780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600082820183811015610e98576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6001600160a01b038216610ee45760405162461bcd60e51b81526004018080602001828103825260268152602001806111636026913960400191505060405180910390fd5b610f2181604051806060016040528060278152602001611189602791396001600160a01b0385166000908152600460205260409020549190610da7565b6001600160a01b038316600090815260046020526040902055600354610f47908261108d565b6003556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b303b1590565b600054610100900460ff1680610fae5750610fae610f8f565b80610fbc575060005460ff16155b610ff75760405162461bcd60e51b815260040180806020018281038252602e815260200180611273602e913960400191505060405180910390fd5b600054610100900460ff16158015611022576000805460ff1961ff0019909116610100171660011790555b600080546201000033810262010000600160b01b0319909216919091178083556040519190046001600160a01b031691907fe9a5158ac7353c7c7322ececc080bc8e89334efa5795b6e21e40eb266b0003d6908290a3801561108a576000805461ff00191690555b50565b6000610e9883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610da7565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106111105782800160ff1982351617855561113d565b8280016001018555821561113d579182015b8281111561113d578235825591602001919060010190611122565b5061114992915061114d565b5090565b5b80821115611149576000815560010161114e56fe436f76657245524332303a206275726e2066726f6d20746865207a65726f2061646472657373436f76657245524332303a206275726e20616d6f756e7420657863656564732062616c616e6365436f76657245524332303a207472616e7366657220746f20746865207a65726f20616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373436f76657245524332303a20617070726f766520746f20746865207a65726f2061646472657373436f76657245524332303a206d696e7420746f20746865207a65726f2061646472657373436f76657245524332303a207472616e736665722066726f6d20746865207a65726f2061646472657373496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564436f76657245524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373436f76657245524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572436f76657245524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212205a1b85bd186bbccf0aea5142b0b82eef6ce2029412a61fc78cfa1ba33c68c9a864736f6c63430007030033
Deployed ByteCode
0x608060405234801561001057600080fd5b50600436106101215760003560e01c806370a08231116100ad578063b84c824611610071578063b84c82461461037a578063dd62ed3e146103ea578063f2fde38b14610418578063f62d18881461043e578063f8cc02df146104ae57610121565b806370a08231146102d05780638da5cb5b146102f657806395d89b411461031a578063a457c2d714610322578063a9059cbb1461034e57610121565b8063313ce567116100f4578063313ce56714610233578063395093511461025157806340c10f191461027d57806342966c68146102a95780634e71e0c8146102c657610121565b806306fdde0314610126578063095ea7b3146101a357806318160ddd146101e357806323b872dd146101fd575b600080fd5b61012e6104da565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610168578181015183820152602001610150565b50505050905090810190601f1680156101955780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101cf600480360360408110156101b957600080fd5b506001600160a01b0381351690602001356104fe565b604080519115158252519081900360200190f35b6101eb610514565b60408051918252519081900360200190f35b6101cf6004803603606081101561021357600080fd5b506001600160a01b0381358116916020810135909116906040013561051a565b61023b610583565b6040805160ff9092168252519081900360200190f35b6101cf6004803603604081101561026757600080fd5b506001600160a01b038135169060200135610588565b6101cf6004803603604081101561029357600080fd5b506001600160a01b0381351690602001356105be565b6101cf600480360360208110156102bf57600080fd5b50356106e7565b6102ce6106fb565b005b6101eb600480360360208110156102e657600080fd5b50356001600160a01b03166107b7565b6102fe6107d2565b604080516001600160a01b039092168252519081900360200190f35b61012e6107e7565b6101cf6004803603604081101561033857600080fd5b506001600160a01b038135169060200135610872565b6101cf6004803603604081101561036457600080fd5b506001600160a01b0381351690602001356108c1565b6101cf6004803603602081101561039057600080fd5b8101906020810181356401000000008111156103ab57600080fd5b8201836020820111156103bd57600080fd5b803590602001918460018302840111640100000000831117156103df57600080fd5b5090925090506108ce565b6101eb6004803603604081101561040057600080fd5b506001600160a01b038135811691602001351661092e565b6102ce6004803603602081101561042e57600080fd5b50356001600160a01b0316610959565b6102ce6004803603602081101561045457600080fd5b81019060208101813564010000000081111561046f57600080fd5b82018360208201111561048157600080fd5b803590602001918460018302840111640100000000831117156104a357600080fd5b509092509050610a52565b6101cf600480360360408110156104c457600080fd5b506001600160a01b038135169060200135610b0b565b6040518060400160405280600881526020016731b7bb2a37b5b2b760c11b81525081565b600061050b338484610b69565b50600192915050565b60035490565b6000610527848484610c55565b6105798433610574856040518060600160405280602d81526020016112ca602d91396001600160a01b038a1660009081526005602090815260408083203384529091529020549190610da7565b610b69565b5060019392505050565b601281565b3360008181526005602090815260408083206001600160a01b0387168452909152812054909161050b9185906105749086610e3e565b600080546201000090046001600160a01b03163314610612576040805162461bcd60e51b815260206004820181905260248201526000805160206112f7833981519152604482015290519081900360640190fd5b6001600160a01b0383166106575760405162461bcd60e51b81526004018080602001828103825260248152602001806112256024913960400191505060405180910390fd5b6003546106649083610e3e565b6003556001600160a01b03831660009081526004602052604090205461068a9083610e3e565b6001600160a01b03841660008181526004602090815260408083209490945583518681529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a350600192915050565b60006106f33383610e9f565b506001919050565b6001546001600160a01b03163314610748576040805162461bcd60e51b815260206004820181905260248201526000805160206112f7833981519152604482015290519081900360640190fd5b600154600080546040516001600160a01b039384169362010000909204909116917fe9a5158ac7353c7c7322ececc080bc8e89334efa5795b6e21e40eb266b0003d691a36001546000805462010000600160b01b0319166001600160a01b039092166201000002919091179055565b6001600160a01b031660009081526004602052604090205490565b6000546201000090046001600160a01b031690565b6002805460408051602060018416156101000260001901909316849004601f8101849004840282018401909252818152929183018282801561086a5780601f1061083f5761010080835404028352916020019161086a565b820191906000526020600020905b81548152906001019060200180831161084d57829003601f168201915b505050505081565b600061050b338461057485604051806060016040528060258152602001611342602591393360009081526005602090815260408083206001600160a01b038d1684529091529020549190610da7565b600061050b338484610c55565b600080546201000090046001600160a01b03163314610922576040805162461bcd60e51b815260206004820181905260248201526000805160206112f7833981519152604482015290519081900360640190fd5b610579600284846110cf565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b6000546201000090046001600160a01b031633146109ac576040805162461bcd60e51b815260206004820181905260248201526000805160206112f7833981519152604482015290519081900360640190fd5b6001600160a01b0381166109f15760405162461bcd60e51b81526004018080602001828103825260268152602001806111d86026913960400191505060405180910390fd5b600080546040516001600160a01b03808516936201000090930416917fb150023a879fd806e3599b6ca8ee3b60f0e360ab3846d128d67ebce1a391639a91a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b600054610100900460ff1680610a6b5750610a6b610f8f565b80610a79575060005460ff16155b610ab45760405162461bcd60e51b815260040180806020018281038252602e815260200180611273602e913960400191505060405180910390fd5b600054610100900460ff16158015610adf576000805460ff1961ff0019909116610100171660011790555b610aeb600284846110cf565b50610af4610f95565b8015610b06576000805461ff00191690555b505050565b600080546201000090046001600160a01b03163314610b5f576040805162461bcd60e51b815260206004820181905260248201526000805160206112f7833981519152604482015290519081900360640190fd5b61050b8383610e9f565b6001600160a01b038316610bae5760405162461bcd60e51b81526004018080602001828103825260298152602001806112a16029913960400191505060405180910390fd5b6001600160a01b038216610bf35760405162461bcd60e51b81526004018080602001828103825260278152602001806111fe6027913960400191505060405180910390fd5b6001600160a01b03808416600081815260056020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b038316610c9a5760405162461bcd60e51b815260040180806020018281038252602a815260200180611249602a913960400191505060405180910390fd5b6001600160a01b038216610cdf5760405162461bcd60e51b81526004018080602001828103825260288152602001806111b06028913960400191505060405180910390fd5b610d1c816040518060600160405280602b8152602001611317602b91396001600160a01b0386166000908152600460205260409020549190610da7565b6001600160a01b038085166000908152600460205260408082209390935590841681522054610d4b9082610e3e565b6001600160a01b0380841660008181526004602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008184841115610e365760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610dfb578181015183820152602001610de3565b50505050905090810190601f168015610e285780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600082820183811015610e98576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6001600160a01b038216610ee45760405162461bcd60e51b81526004018080602001828103825260268152602001806111636026913960400191505060405180910390fd5b610f2181604051806060016040528060278152602001611189602791396001600160a01b0385166000908152600460205260409020549190610da7565b6001600160a01b038316600090815260046020526040902055600354610f47908261108d565b6003556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b303b1590565b600054610100900460ff1680610fae5750610fae610f8f565b80610fbc575060005460ff16155b610ff75760405162461bcd60e51b815260040180806020018281038252602e815260200180611273602e913960400191505060405180910390fd5b600054610100900460ff16158015611022576000805460ff1961ff0019909116610100171660011790555b600080546201000033810262010000600160b01b0319909216919091178083556040519190046001600160a01b031691907fe9a5158ac7353c7c7322ececc080bc8e89334efa5795b6e21e40eb266b0003d6908290a3801561108a576000805461ff00191690555b50565b6000610e9883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610da7565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106111105782800160ff1982351617855561113d565b8280016001018555821561113d579182015b8281111561113d578235825591602001919060010190611122565b5061114992915061114d565b5090565b5b80821115611149576000815560010161114e56fe436f76657245524332303a206275726e2066726f6d20746865207a65726f2061646472657373436f76657245524332303a206275726e20616d6f756e7420657863656564732062616c616e6365436f76657245524332303a207472616e7366657220746f20746865207a65726f20616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373436f76657245524332303a20617070726f766520746f20746865207a65726f2061646472657373436f76657245524332303a206d696e7420746f20746865207a65726f2061646472657373436f76657245524332303a207472616e736665722066726f6d20746865207a65726f2061646472657373496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564436f76657245524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373436f76657245524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572436f76657245524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212205a1b85bd186bbccf0aea5142b0b82eef6ce2029412a61fc78cfa1ba33c68c9a864736f6c63430007030033