SmoothLovePotion
Deploy on AlchemyContract Information
The following smart contract is called SmoothLovePotion. It is an ERC20 token that inherits from three other contracts: ERC20Detailed, ERC20Mintable, and ERC20GatewayWhitelist. The purpose of this contract is to create a new token called "Smooth Love Potion" with the symbol "SLP" and 0 decimal places. It also sets the mainchain gateway address and adds it as a minter.
More Info
// File: math/SafeMath.sol
pragma solidity 0.5.17;
library SafeMath {
function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
c = a + b;
require(c >= a, "SafeMath: addition overflow");
}
function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {
require(b <= a, "SafeMath: subtraction overflow");
return a - b;
}
function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
if (a == 0) {
return 0;
}
c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
}
function div(uint256 a, uint256 b) internal pure returns (uint256 c) {
// Since Solidity automatically asserts when dividing by 0,
// but we only need it to revert.
require(b > 0, "SafeMath: division by zero");
return a / b;
}
function mod(uint256 a, uint256 b) internal pure returns (uint256 c) {
// Same reason as `div`.
require(b > 0, "SafeMath: modulo by zero");
return a % b;
}
}
// File: token/erc20/IERC20.sol
pragma solidity 0.5.17;
interface IERC20 {
event Transfer(address indexed _from, address indexed _to, uint256 _value);
event Approval(address indexed _owner, address indexed _spender, uint256 _value);
function totalSupply() external view returns (uint256 _supply);
function balanceOf(address _owner) external view returns (uint256 _balance);
function approve(address _spender, uint256 _value) external returns (bool _success);
function allowance(address _owner, address _spender) external view returns (uint256 _value);
function transfer(address _to, uint256 _value) external returns (bool _success);
function transferFrom(address _from, address _to, uint256 _value) external returns (bool _success);
}
// File: token/erc20/ERC20.sol
pragma solidity 0.5.17;
contract ERC20 is IERC20 {
using SafeMath for uint256;
uint256 public totalSupply;
mapping (address => uint256) public balanceOf;
mapping (address => mapping (address => uint256)) internal _allowance;
function approve(address _spender, uint256 _value) public returns (bool) {
_approve(msg.sender, _spender, _value);
return true;
}
function allowance(address _owner, address _spender) public view returns (uint256) {
return _allowance[_owner][_spender];
}
function increaseAllowance(address _spender, uint256 _value) public returns (bool) {
_approve(msg.sender, _spender, _allowance[msg.sender][_spender].add(_value));
return true;
}
function decreaseAllowance(address _spender, uint256 _value) public returns (bool) {
_approve(msg.sender, _spender, _allowance[msg.sender][_spender].sub(_value));
return true;
}
function transfer(address _to, uint256 _value) public returns (bool _success) {
_transfer(msg.sender, _to, _value);
return true;
}
function transferFrom(address _from, address _to, uint256 _value) public returns (bool _success) {
_transfer(_from, _to, _value);
_approve(_from, msg.sender, _allowance[_from][msg.sender].sub(_value));
return true;
}
function _approve(address _owner, address _spender, uint256 _amount) internal {
require(_owner != address(0), "ERC20: approve from the zero address");
require(_spender != address(0), "ERC20: approve to the zero address");
_allowance[_owner][_spender] = _amount;
emit Approval(_owner, _spender, _amount);
}
function _transfer(address _from, address _to, uint256 _value) internal {
require(_from != address(0), "ERC20: transfer from the zero address");
require(_to != address(0), "ERC20: transfer to the zero address");
require(_to != address(this), "ERC20: transfer to this contract address");
balanceOf[_from] = balanceOf[_from].sub(_value);
balanceOf[_to] = balanceOf[_to].add(_value);
emit Transfer(_from, _to, _value);
}
}
// File: token/erc20/IERC20Detailed.sol
pragma solidity 0.5.17;
interface IERC20Detailed {
function name() external view returns (string memory _name);
function symbol() external view returns (string memory _symbol);
function decimals() external view returns (uint8 _decimals);
}
// File: token/erc20/ERC20Detailed.sol
pragma solidity 0.5.17;
contract ERC20Detailed is ERC20, IERC20Detailed {
string public name;
string public symbol;
uint8 public decimals;
constructor(string memory _name, string memory _symbol, uint8 _decimals) public {
name = _name;
symbol = _symbol;
decimals = _decimals;
}
}
// File: token/erc20/ERC20GatewayWhitelist.sol
pragma solidity 0.5.17;
contract ERC20GatewayWhitelist is ERC20 {
address public mainchainGateway;
function allowance(address _owner, address _spender)
public
view
returns (uint256 _value)
{
if (_spender == mainchainGateway) return uint256(-1);
return _allowance[_owner][_spender];
}
function transferFrom(
address _from,
address _to,
uint256 _value
)
public
returns (bool _success)
{
if (allowance(_from, msg.sender) != uint256(-1)) {
super._approve(_from, msg.sender, _allowance[_from][msg.sender].sub(_value));
}
_transfer(_from, _to, _value);
return true;
}
function _setGateway(address _mainchainGateway) internal {
require(
_mainchainGateway != address(0),
"ERC20GatewayWhitelist: setting gateway to the zero address"
);
mainchainGateway = _mainchainGateway;
}
}
// File: access/HasAdmin.sol
pragma solidity 0.5.17;
contract HasAdmin {
event AdminChanged(address indexed _oldAdmin, address indexed _newAdmin);
event AdminRemoved(address indexed _oldAdmin);
address public admin;
modifier onlyAdmin {
require(msg.sender == admin, "HasAdmin: not admin");
_;
}
constructor() internal {
admin = msg.sender;
emit AdminChanged(address(0), admin);
}
function changeAdmin(address _newAdmin) external onlyAdmin {
require(_newAdmin != address(0), "HasAdmin: new admin is the zero address");
emit AdminChanged(admin, _newAdmin);
admin = _newAdmin;
}
function removeAdmin() external onlyAdmin {
emit AdminRemoved(admin);
admin = address(0);
}
}
// File: access/HasMinters.sol
pragma solidity 0.5.17;
contract HasMinters is HasAdmin {
event MinterAdded(address indexed _minter);
event MinterRemoved(address indexed _minter);
address[] public minters;
mapping (address => bool) public minter;
modifier onlyMinter {
require(minter[msg.sender]);
_;
}
function addMinters(address[] memory _addedMinters) public onlyAdmin {
address _minter;
for (uint256 i = 0; i < _addedMinters.length; i++) {
_minter = _addedMinters[i];
if (!minter[_minter]) {
minters.push(_minter);
minter[_minter] = true;
emit MinterAdded(_minter);
}
}
}
function removeMinters(address[] memory _removedMinters) public onlyAdmin {
address _minter;
for (uint256 i = 0; i < _removedMinters.length; i++) {
_minter = _removedMinters[i];
if (minter[_minter]) {
minter[_minter] = false;
emit MinterRemoved(_minter);
}
}
uint256 i = 0;
while (i < minters.length) {
_minter = minters[i];
if (!minter[_minter]) {
minters[i] = minters[minters.length - 1];
delete minters[minters.length - 1];
minters.length--;
} else {
i++;
}
}
}
function isMinter(address _addr) public view returns (bool) {
return minter[_addr];
}
}
// File: token/erc20/ERC20Mintable.sol
pragma solidity 0.5.17;
contract ERC20Mintable is HasMinters, ERC20 {
function mint(address _to, uint256 _value) public onlyMinter returns (bool _success) {
return _mint(_to, _value);
}
function _mint(address _to, uint256 _value) internal returns (bool success) {
totalSupply = totalSupply.add(_value);
balanceOf[_to] = balanceOf[_to].add(_value);
emit Transfer(address(0), _to, _value);
return true;
}
}
// File: SmoothLovePotion.sol
pragma solidity 0.5.17;
contract SmoothLovePotion is ERC20Detailed, ERC20Mintable, ERC20GatewayWhitelist {
constructor(address _mainchainGateway)
public
ERC20Detailed("Smooth Love Potion", "SLP", 0)
{
_setGateway(_mainchainGateway);
address[] memory _minters = new address[](1);
_minters[0] = _mainchainGateway;
addMinters(_minters);
}
}
[{"inputs":[{"internalType":"address","name":"_mainchainGateway","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_oldAdmin","type":"address"},{"indexed":true,"internalType":"address","name":"_newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_oldAdmin","type":"address"}],"name":"AdminRemoved","type":"event"},{"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":"_minter","type":"address"}],"name":"MinterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"}],"name":"MinterRemoved","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"},{"constant":false,"inputs":[{"internalType":"address[]","name":"_addedMinters","type":"address[]"}],"name":"addMinters","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_newAdmin","type":"address"}],"name":"changeAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"isMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"mainchainGateway","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"_success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"minters","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"removeAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"_removedMinters","type":"address[]"}],"name":"removeMinters","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"_success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"_success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]
[{"inputs":[{"internalType":"address","name":"_mainchainGateway","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_oldAdmin","type":"address"},{"indexed":true,"internalType":"address","name":"_newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_oldAdmin","type":"address"}],"name":"AdminRemoved","type":"event"},{"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":"_minter","type":"address"}],"name":"MinterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"}],"name":"MinterRemoved","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"},{"constant":false,"inputs":[{"internalType":"address[]","name":"_addedMinters","type":"address[]"}],"name":"addMinters","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_newAdmin","type":"address"}],"name":"changeAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"isMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"mainchainGateway","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"_success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"minters","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"removeAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"_removedMinters","type":"address[]"}],"name":"removeMinters","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"_success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"_success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]
60806040523480156200001157600080fd5b506040516200167438038062001674833981810160405260208110156200003757600080fd5b5051604080518082018252601281527129b6b7b7ba34102637bb32902837ba34b7b760711b6020828101919091528251808401845260038152620534c560ec1b91810191909152600080546001600160a01b031916331780825593519293919290916001600160a01b03169082907f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f908290a38251620000df90600690602086019062000330565b508151620000f590600790602085019062000330565b506008805460ff191660ff9290921691909117905550620001189050816200017d565b6040805160018082528183019092526060916020808301908038833901905050905081816000815181106200014957fe5b6001600160a01b039092166020928302919091019091015262000175816001600160e01b03620001ec16565b5050620003d5565b6001600160a01b038116620001c45760405162461bcd60e51b815260040180806020018281038252603a8152602001806200163a603a913960400191505060405180910390fd5b600880546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6000546001600160a01b031633146200024c576040805162461bcd60e51b815260206004820152601360248201527f48617341646d696e3a206e6f742061646d696e00000000000000000000000000604482015290519081900360640190fd5b6000805b82518110156200032b578281815181106200026757fe5b6020908102919091018101516001600160a01b0381166000908152600290925260409091205490925060ff1662000322576001805480820182557fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60180546001600160a01b0319166001600160a01b038516908117909155600081815260026020526040808220805460ff1916909417909355915190917f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f691a25b60010162000250565b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200037357805160ff1916838001178555620003a3565b82800160010185558215620003a3579182015b82811115620003a357825182559160200191906001019062000386565b50620003b1929150620003b5565b5090565b620003d291905b80821115620003b15760008155600101620003bc565b90565b61125580620003e56000396000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c806370a08231116100b85780639a202d471161007c5780639a202d47146104c2578063a457c2d7146104ca578063a9059cbb146104f6578063aa271e1a14610522578063dd62ed3e14610548578063f851a4401461057657610137565b806370a08231146103ae57806371e2a657146103d45780638623ec7b146104775780638f2839701461049457806395d89b41146104ba57610137565b806339509351116100ff57806339509351146102675780633dd08c381461029357806340c10f19146102b95780635a4ccad8146102e55780635fc1964f1461030957610137565b806306fdde031461013c578063095ea7b3146101b957806318160ddd146101f957806323b872dd14610213578063313ce56714610249575b600080fd5b61014461057e565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561017e578181015183820152602001610166565b50505050905090810190601f1680156101ab5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101e5600480360360408110156101cf57600080fd5b506001600160a01b03813516906020013561060c565b604080519115158252519081900360200190f35b610201610623565b60408051918252519081900360200190f35b6101e56004803603606081101561022957600080fd5b506001600160a01b03813581169160208101359091169060400135610629565b610251610692565b6040805160ff9092168252519081900360200190f35b6101e56004803603604081101561027d57600080fd5b506001600160a01b03813516906020013561069b565b6101e5600480360360208110156102a957600080fd5b50356001600160a01b03166106d7565b6101e5600480360360408110156102cf57600080fd5b506001600160a01b0381351690602001356106ec565b6102ed610719565b604080516001600160a01b039092168252519081900360200190f35b6103ac6004803603602081101561031f57600080fd5b81019060208101813564010000000081111561033a57600080fd5b82018360208201111561034c57600080fd5b8035906020019184602083028401116401000000008311171561036e57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061072d945050505050565b005b610201600480360360208110156103c457600080fd5b50356001600160a01b0316610918565b6103ac600480360360208110156103ea57600080fd5b81019060208101813564010000000081111561040557600080fd5b82018360208201111561041757600080fd5b8035906020019184602083028401116401000000008311171561043957600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061092a945050505050565b6102ed6004803603602081101561048d57600080fd5b5035610a5a565b6103ac600480360360208110156104aa57600080fd5b50356001600160a01b0316610a81565b610144610b76565b6103ac610bd1565b6101e5600480360360408110156104e057600080fd5b506001600160a01b038135169060200135610c6e565b6101e56004803603604081101561050c57600080fd5b506001600160a01b038135169060200135610caa565b6101e56004803603602081101561053857600080fd5b50356001600160a01b0316610cb7565b6102016004803603604081101561055e57600080fd5b506001600160a01b0381358116916020013516610cd5565b6102ed610d28565b6006805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156106045780601f106105d957610100808354040283529160200191610604565b820191906000526020600020905b8154815290600101906020018083116105e757829003601f168201915b505050505081565b6000610619338484610d37565b5060015b92915050565b60035481565b60006000196106388533610cd5565b1461067d576001600160a01b03841660009081526005602090815260408083203380855292529091205461067d918691610678908663ffffffff610e2316565b610d37565b610688848484610e80565b5060019392505050565b60085460ff1681565b3360008181526005602090815260408083206001600160a01b03871684529091528120549091610619918590610678908663ffffffff61100c16565b60026020526000908152604090205460ff1681565b3360009081526002602052604081205460ff1661070857600080fd5b6107128383611064565b9392505050565b60085461010090046001600160a01b031681565b6000546001600160a01b03163314610782576040805162461bcd60e51b81526020600482015260136024820152722430b9a0b236b4b71d103737ba1030b236b4b760691b604482015290519081900360640190fd5b6000805b825181101561081b5782818151811061079b57fe5b6020908102919091018101516001600160a01b0381166000908152600290925260409091205490925060ff1615610813576001600160a01b038216600081815260026020526040808220805460ff19169055517fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb666929190a25b600101610786565b5060005b600154811015610913576001818154811061083657fe5b60009182526020808320909101546001600160a01b0316808352600290915260409091205490925060ff1661090a5760018054600019810190811061087757fe5b600091825260209091200154600180546001600160a01b03909216918390811061089d57fe5b600091825260209091200180546001600160a01b0319166001600160a01b03929092169190911790556001805460001981019081106108d857fe5b600091825260209091200180546001600160a01b03191690556001805490610904906000198301611103565b5061090e565b6001015b61081f565b505050565b60046020526000908152604090205481565b6000546001600160a01b0316331461097f576040805162461bcd60e51b81526020600482015260136024820152722430b9a0b236b4b71d103737ba1030b236b4b760691b604482015290519081900360640190fd5b6000805b82518110156109135782818151811061099857fe5b6020908102919091018101516001600160a01b0381166000908152600290925260409091205490925060ff16610a52576001805480820182557fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60180546001600160a01b0319166001600160a01b038516908117909155600081815260026020526040808220805460ff1916909417909355915190917f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f691a25b600101610983565b60018181548110610a6757fe5b6000918252602090912001546001600160a01b0316905081565b6000546001600160a01b03163314610ad6576040805162461bcd60e51b81526020600482015260136024820152722430b9a0b236b4b71d103737ba1030b236b4b760691b604482015290519081900360640190fd5b6001600160a01b038116610b1b5760405162461bcd60e51b81526004018080602001828103825260278152602001806111fa6027913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f91a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6007805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156106045780601f106105d957610100808354040283529160200191610604565b6000546001600160a01b03163314610c26576040805162461bcd60e51b81526020600482015260136024820152722430b9a0b236b4b71d103737ba1030b236b4b760691b604482015290519081900360640190fd5b600080546040516001600160a01b03909116917fa3b62bc36326052d97ea62d63c3d60308ed4c3ea8ac079dd8499f1e9c4f80c0f91a2600080546001600160a01b0319169055565b3360008181526005602090815260408083206001600160a01b03871684529091528120549091610619918590610678908663ffffffff610e2316565b6000610619338484610e80565b6001600160a01b031660009081526002602052604090205460ff1690565b6008546000906001600160a01b03838116610100909204161415610cfc575060001961061d565b506001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b6000546001600160a01b031681565b6001600160a01b038316610d7c5760405162461bcd60e51b81526004018080602001828103825260248152602001806111d66024913960400191505060405180910390fd5b6001600160a01b038216610dc15760405162461bcd60e51b81526004018080602001828103825260228152602001806111676022913960400191505060405180910390fd5b6001600160a01b03808416600081815260056020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b600082821115610e7a576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6001600160a01b038316610ec55760405162461bcd60e51b81526004018080602001828103825260258152602001806111b16025913960400191505060405180910390fd5b6001600160a01b038216610f0a5760405162461bcd60e51b81526004018080602001828103825260238152602001806111446023913960400191505060405180910390fd5b6001600160a01b038216301415610f525760405162461bcd60e51b81526004018080602001828103825260288152602001806111896028913960400191505060405180910390fd5b6001600160a01b038316600090815260046020526040902054610f7b908263ffffffff610e2316565b6001600160a01b038085166000908152600460205260408082209390935590841681522054610fb0908263ffffffff61100c16565b6001600160a01b0380841660008181526004602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b8181018281101561061d576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60035460009061107a908363ffffffff61100c16565b6003556001600160a01b0383166000908152600460205260409020546110a6908363ffffffff61100c16565b6001600160a01b03841660008181526004602090815260408083209490945583518681529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a350600192915050565b8154818355818111156109135760008381526020902061091391810190830161114091905b8082111561113c5760008155600101611128565b5090565b9056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220746f207468697320636f6e7472616374206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737348617341646d696e3a206e65772061646d696e20697320746865207a65726f2061646472657373a265627a7a72315820421285222a2aa99fd21611026104aa4615ad63a03f985d5f265e9c60a270dd9264736f6c6343000511003245524332304761746577617957686974656c6973743a2073657474696e67206761746577617920746f20746865207a65726f20616464726573730000000000000000000000001a2a1c938ce3ec39b6d47113c7955baa9dd454f2
60806040523480156200001157600080fd5b506040516200167438038062001674833981810160405260208110156200003757600080fd5b5051604080518082018252601281527129b6b7b7ba34102637bb32902837ba34b7b760711b6020828101919091528251808401845260038152620534c560ec1b91810191909152600080546001600160a01b031916331780825593519293919290916001600160a01b03169082907f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f908290a38251620000df90600690602086019062000330565b508151620000f590600790602085019062000330565b506008805460ff191660ff9290921691909117905550620001189050816200017d565b6040805160018082528183019092526060916020808301908038833901905050905081816000815181106200014957fe5b6001600160a01b039092166020928302919091019091015262000175816001600160e01b03620001ec16565b5050620003d5565b6001600160a01b038116620001c45760405162461bcd60e51b815260040180806020018281038252603a8152602001806200163a603a913960400191505060405180910390fd5b600880546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6000546001600160a01b031633146200024c576040805162461bcd60e51b815260206004820152601360248201527f48617341646d696e3a206e6f742061646d696e00000000000000000000000000604482015290519081900360640190fd5b6000805b82518110156200032b578281815181106200026757fe5b6020908102919091018101516001600160a01b0381166000908152600290925260409091205490925060ff1662000322576001805480820182557fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60180546001600160a01b0319166001600160a01b038516908117909155600081815260026020526040808220805460ff1916909417909355915190917f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f691a25b60010162000250565b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200037357805160ff1916838001178555620003a3565b82800160010185558215620003a3579182015b82811115620003a357825182559160200191906001019062000386565b50620003b1929150620003b5565b5090565b620003d291905b80821115620003b15760008155600101620003bc565b90565b61125580620003e56000396000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c806370a08231116100b85780639a202d471161007c5780639a202d47146104c2578063a457c2d7146104ca578063a9059cbb146104f6578063aa271e1a14610522578063dd62ed3e14610548578063f851a4401461057657610137565b806370a08231146103ae57806371e2a657146103d45780638623ec7b146104775780638f2839701461049457806395d89b41146104ba57610137565b806339509351116100ff57806339509351146102675780633dd08c381461029357806340c10f19146102b95780635a4ccad8146102e55780635fc1964f1461030957610137565b806306fdde031461013c578063095ea7b3146101b957806318160ddd146101f957806323b872dd14610213578063313ce56714610249575b600080fd5b61014461057e565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561017e578181015183820152602001610166565b50505050905090810190601f1680156101ab5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101e5600480360360408110156101cf57600080fd5b506001600160a01b03813516906020013561060c565b604080519115158252519081900360200190f35b610201610623565b60408051918252519081900360200190f35b6101e56004803603606081101561022957600080fd5b506001600160a01b03813581169160208101359091169060400135610629565b610251610692565b6040805160ff9092168252519081900360200190f35b6101e56004803603604081101561027d57600080fd5b506001600160a01b03813516906020013561069b565b6101e5600480360360208110156102a957600080fd5b50356001600160a01b03166106d7565b6101e5600480360360408110156102cf57600080fd5b506001600160a01b0381351690602001356106ec565b6102ed610719565b604080516001600160a01b039092168252519081900360200190f35b6103ac6004803603602081101561031f57600080fd5b81019060208101813564010000000081111561033a57600080fd5b82018360208201111561034c57600080fd5b8035906020019184602083028401116401000000008311171561036e57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061072d945050505050565b005b610201600480360360208110156103c457600080fd5b50356001600160a01b0316610918565b6103ac600480360360208110156103ea57600080fd5b81019060208101813564010000000081111561040557600080fd5b82018360208201111561041757600080fd5b8035906020019184602083028401116401000000008311171561043957600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061092a945050505050565b6102ed6004803603602081101561048d57600080fd5b5035610a5a565b6103ac600480360360208110156104aa57600080fd5b50356001600160a01b0316610a81565b610144610b76565b6103ac610bd1565b6101e5600480360360408110156104e057600080fd5b506001600160a01b038135169060200135610c6e565b6101e56004803603604081101561050c57600080fd5b506001600160a01b038135169060200135610caa565b6101e56004803603602081101561053857600080fd5b50356001600160a01b0316610cb7565b6102016004803603604081101561055e57600080fd5b506001600160a01b0381358116916020013516610cd5565b6102ed610d28565b6006805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156106045780601f106105d957610100808354040283529160200191610604565b820191906000526020600020905b8154815290600101906020018083116105e757829003601f168201915b505050505081565b6000610619338484610d37565b5060015b92915050565b60035481565b60006000196106388533610cd5565b1461067d576001600160a01b03841660009081526005602090815260408083203380855292529091205461067d918691610678908663ffffffff610e2316565b610d37565b610688848484610e80565b5060019392505050565b60085460ff1681565b3360008181526005602090815260408083206001600160a01b03871684529091528120549091610619918590610678908663ffffffff61100c16565b60026020526000908152604090205460ff1681565b3360009081526002602052604081205460ff1661070857600080fd5b6107128383611064565b9392505050565b60085461010090046001600160a01b031681565b6000546001600160a01b03163314610782576040805162461bcd60e51b81526020600482015260136024820152722430b9a0b236b4b71d103737ba1030b236b4b760691b604482015290519081900360640190fd5b6000805b825181101561081b5782818151811061079b57fe5b6020908102919091018101516001600160a01b0381166000908152600290925260409091205490925060ff1615610813576001600160a01b038216600081815260026020526040808220805460ff19169055517fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb666929190a25b600101610786565b5060005b600154811015610913576001818154811061083657fe5b60009182526020808320909101546001600160a01b0316808352600290915260409091205490925060ff1661090a5760018054600019810190811061087757fe5b600091825260209091200154600180546001600160a01b03909216918390811061089d57fe5b600091825260209091200180546001600160a01b0319166001600160a01b03929092169190911790556001805460001981019081106108d857fe5b600091825260209091200180546001600160a01b03191690556001805490610904906000198301611103565b5061090e565b6001015b61081f565b505050565b60046020526000908152604090205481565b6000546001600160a01b0316331461097f576040805162461bcd60e51b81526020600482015260136024820152722430b9a0b236b4b71d103737ba1030b236b4b760691b604482015290519081900360640190fd5b6000805b82518110156109135782818151811061099857fe5b6020908102919091018101516001600160a01b0381166000908152600290925260409091205490925060ff16610a52576001805480820182557fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60180546001600160a01b0319166001600160a01b038516908117909155600081815260026020526040808220805460ff1916909417909355915190917f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f691a25b600101610983565b60018181548110610a6757fe5b6000918252602090912001546001600160a01b0316905081565b6000546001600160a01b03163314610ad6576040805162461bcd60e51b81526020600482015260136024820152722430b9a0b236b4b71d103737ba1030b236b4b760691b604482015290519081900360640190fd5b6001600160a01b038116610b1b5760405162461bcd60e51b81526004018080602001828103825260278152602001806111fa6027913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f91a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6007805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156106045780601f106105d957610100808354040283529160200191610604565b6000546001600160a01b03163314610c26576040805162461bcd60e51b81526020600482015260136024820152722430b9a0b236b4b71d103737ba1030b236b4b760691b604482015290519081900360640190fd5b600080546040516001600160a01b03909116917fa3b62bc36326052d97ea62d63c3d60308ed4c3ea8ac079dd8499f1e9c4f80c0f91a2600080546001600160a01b0319169055565b3360008181526005602090815260408083206001600160a01b03871684529091528120549091610619918590610678908663ffffffff610e2316565b6000610619338484610e80565b6001600160a01b031660009081526002602052604090205460ff1690565b6008546000906001600160a01b03838116610100909204161415610cfc575060001961061d565b506001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b6000546001600160a01b031681565b6001600160a01b038316610d7c5760405162461bcd60e51b81526004018080602001828103825260248152602001806111d66024913960400191505060405180910390fd5b6001600160a01b038216610dc15760405162461bcd60e51b81526004018080602001828103825260228152602001806111676022913960400191505060405180910390fd5b6001600160a01b03808416600081815260056020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b600082821115610e7a576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6001600160a01b038316610ec55760405162461bcd60e51b81526004018080602001828103825260258152602001806111b16025913960400191505060405180910390fd5b6001600160a01b038216610f0a5760405162461bcd60e51b81526004018080602001828103825260238152602001806111446023913960400191505060405180910390fd5b6001600160a01b038216301415610f525760405162461bcd60e51b81526004018080602001828103825260288152602001806111896028913960400191505060405180910390fd5b6001600160a01b038316600090815260046020526040902054610f7b908263ffffffff610e2316565b6001600160a01b038085166000908152600460205260408082209390935590841681522054610fb0908263ffffffff61100c16565b6001600160a01b0380841660008181526004602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b8181018281101561061d576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60035460009061107a908363ffffffff61100c16565b6003556001600160a01b0383166000908152600460205260409020546110a6908363ffffffff61100c16565b6001600160a01b03841660008181526004602090815260408083209490945583518681529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a350600192915050565b8154818355818111156109135760008381526020902061091391810190830161114091905b8082111561113c5760008155600101611128565b5090565b9056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220746f207468697320636f6e7472616374206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737348617341646d696e3a206e65772061646d696e20697320746865207a65726f2061646472657373a265627a7a72315820421285222a2aa99fd21611026104aa4615ad63a03f985d5f265e9c60a270dd9264736f6c6343000511003245524332304761746577617957686974656c6973743a2073657474696e67206761746577617920746f20746865207a65726f20616464726573730000000000000000000000001a2a1c938ce3ec39b6d47113c7955baa9dd454f2