Contract Information
The following smart contract is called MNW and it is an ERC20 token contract. It includes functionalities such as transferring tokens, approving token transfers, checking token balances, and burning tokens. The contract also has the ability to freeze accounts and transfer other ERC20 tokens. The initial supply of the token is set to 47,897,218 MNW tokens with 18 decimal places.
More Info
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;
interface iERC20 {
function balanceOf(address who) external view returns (uint256 balance);
function allowance(address owner, address spender) external view returns (uint256 remaining);
function transfer(address to, uint256 value) external returns (bool success);
function approve(address spender, uint256 value) external returns (bool success);
function transferFrom(address from, address to, uint256 value) external returns (bool success);
event Transfer(address indexed _from, address indexed _to, uint256 _value);
event Approval(address indexed _owner, address indexed _spender, uint256 _value);
}
contract Context {
function _msgSender() internal view returns (address) {
return msg.sender;
}
function _msgData() internal view returns (bytes memory) {
this;
return msg.data;
}
}
library SafeMath {
function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {
c = a - b;
assert(b <= a && c <= a);
return c;
}
function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
c = a + b;
assert(c >= a && c>=b);
return c;
}
}
library SafeERC20 {
function safeTransfer(iERC20 _token, address _to, uint256 _value) internal {
require(_token.transfer(_to, _value));
}
}
contract Controllable is Context {
mapping (address => bool) public controllers;
constructor () {
address msgSender = _msgSender();
controllers[msgSender] = true;
}
modifier onlyController() {
require(controllers[_msgSender()], "Controllable: caller is not a controller");
_;
}
function addController(address _address) public onlyController {
controllers[_address] = true;
}
function removeController(address _address) public onlyController {
delete controllers[_address];
}
}
contract Pausable is Controllable {
event Pause();
event Unpause();
bool public paused = false;
modifier whenNotPaused() {
require(!paused);
_;
}
modifier whenPaused() {
require(paused);
_;
}
function pause() public onlyController whenNotPaused {
paused = true;
emit Pause();
}
function unpause() public onlyController whenPaused {
paused = false;
emit Unpause();
}
}
contract MNW is Controllable, Pausable, iERC20 {
using SafeMath for uint256;
using SafeERC20 for iERC20;
mapping (address => uint256) public balances;
mapping (address => mapping (address => uint256)) public allowed;
mapping (address => bool) public frozenAccount;
uint256 public totalSupply;
string public constant name = "Morpheus.Network";
uint8 public constant decimals = 18;
string public constant symbol = "MNW";
uint256 public constant initialSupply = 47897218 * 10 ** uint(decimals);
constructor() {
totalSupply = initialSupply;
balances[msg.sender] = totalSupply;
controllers[msg.sender] = true;
emit Transfer(address(0),msg.sender,initialSupply);
}
function receiveEther() public payable {
revert();
}
function transfer(address _to, uint256 _value) external override whenNotPaused returns (bool success) {
require(_to != msg.sender,"T1- Recipient can not be the same as sender");
require(_to != address(0),"T2- Please check the recipient address");
require(balances[msg.sender] >= _value,"T3- The balance of sender is too low");
require(!frozenAccount[msg.sender],"T4- The wallet of sender is frozen");
require(!frozenAccount[_to],"T5- The wallet of recipient is frozen");
balances[msg.sender] = balances[msg.sender].sub(_value);
balances[_to] = balances[_to].add(_value);
emit Transfer(msg.sender, _to, _value);
return true;
}
function transferFrom(address _from, address _to, uint256 _value) external override whenNotPaused returns (bool success) {
require(_to != address(0),"TF1- Please check the recipient address");
require(balances[_from] >= _value,"TF2- The balance of sender is too low");
require(allowed[_from][msg.sender] >= _value,"TF3- The allowance of sender is too low");
require(!frozenAccount[_from],"TF4- The wallet of sender is frozen");
require(!frozenAccount[_to],"TF5- The wallet of recipient is frozen");
balances[_from] = balances[_from].sub(_value);
balances[_to] = balances[_to].add(_value);
allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
emit Transfer(_from, _to, _value);
return true;
}
function balanceOf(address _owner) public override view returns (uint256 balance) {
return balances[_owner];
}
function approve(address _spender, uint256 _value) external override whenNotPaused returns (bool success) {
require((_value == 0) || (allowed[msg.sender][_spender] == 0),"A1- Reset allowance to 0 first");
allowed[msg.sender][_spender] = _value;
emit Approval(msg.sender, _spender, _value);
return true;
}
function increaseApproval(address _spender, uint256 _addedValue) external whenNotPaused returns (bool) {
allowed[msg.sender][_spender] = allowed[msg.sender][_spender].add(_addedValue);
emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
return true;
}
function decreaseApproval(address _spender, uint256 _subtractedValue) external whenNotPaused returns (bool) {
allowed[msg.sender][_spender] = allowed[msg.sender][_spender].sub(_subtractedValue);
emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
return true;
}
function allowance(address _owner, address _spender) public override view returns (uint256 remaining) {
return allowed[_owner][_spender];
}
function transferToken(address tokenAddress, uint256 amount) external onlyController {
iERC20(tokenAddress).safeTransfer(msg.sender,amount);
}
function flushToken(address tokenAddress) external onlyController {
uint256 amount = iERC20(tokenAddress).balanceOf(address(this));
iERC20(tokenAddress).safeTransfer(msg.sender,amount);
}
function burn(uint256 _value) external onlyController returns (bool) {
require(_value <= balances[msg.sender],"B1- The balance of burner is too low");
balances[msg.sender] = balances[msg.sender].sub(_value);
totalSupply = totalSupply.sub(_value);
emit Burn(msg.sender, _value);
emit Transfer(msg.sender, address(0), _value);
return true;
}
function freeze(address _address, bool _state) external onlyController returns (bool) {
frozenAccount[_address] = _state;
emit Freeze(_address, _state);
return true;
}
event Burn(address indexed burner, uint256 value);
event Freeze(address target, bool frozen);
}
[{"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":"burner","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"bool","name":"frozen","type":"bool"}],"name":"Freeze","type":"event"},{"anonymous":false,"inputs":[],"name":"Pause","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"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"addController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"remaining","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"controllers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"decreaseApproval","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"flushToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_state","type":"bool"}],"name":"freeze","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"frozenAccount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_addedValue","type":"uint256"}],"name":"increaseApproval","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"receiveEther","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"removeController","outputs":[],"stateMutability":"nonpayable","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":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"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"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]
[{"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":"burner","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"bool","name":"frozen","type":"bool"}],"name":"Freeze","type":"event"},{"anonymous":false,"inputs":[],"name":"Pause","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"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"addController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"remaining","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"controllers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"decreaseApproval","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"flushToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_state","type":"bool"}],"name":"freeze","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"frozenAccount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_addedValue","type":"uint256"}],"name":"increaseApproval","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"receiveEther","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"removeController","outputs":[],"stateMutability":"nonpayable","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":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"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"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]
60806040526001805460ff191690553480156200001b57600080fd5b50600062000028620000f2565b6001600160a01b03166000908152602081905260409020805460ff1916600117905550620000596012600a6200014c565b62000069906302dada8262000241565b600581905533600081815260026020908152604080832094909455819052918220805460ff19166001179055907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef620000c56012600a6200014c565b620000d5906302dada8262000241565b604051620000e49190620000f6565b60405180910390a362000279565b3390565b90815260200190565b80825b600180861162000113575062000143565b81870482111562000128576200012862000263565b808616156200013657918102915b9490941c93800262000102565b94509492505050565b60006200015d600019848462000164565b9392505050565b60008262000175575060016200015d565b8162000184575060006200015d565b81600181146200019d5760028114620001a857620001dc565b60019150506200015d565b60ff841115620001bc57620001bc62000263565b6001841b915084821115620001d557620001d562000263565b506200015d565b5060208310610133831016604e8410600b841016171562000214575081810a838111156200020e576200020e62000263565b6200015d565b620002238484846001620000ff565b80860482111562000238576200023862000263565b02949350505050565b60008160001904831182151516156200025e576200025e62000263565b500290565b634e487b7160e01b600052601160045260246000fd5b61184480620002896000396000f3fe6080604052600436106101815760003560e01c806370a08231116100d1578063a9059cbb1161008a578063d73dd62311610064578063d73dd62314610415578063da8c229e14610435578063dd62ed3e14610455578063f6a74ed71461047557610181565b8063a9059cbb146103b5578063b414d4b6146103d5578063bf120ae5146103f557610181565b806370a08231146103235780638456cb591461034357806395d89b41146103585780639cee789f1461036d578063a3912ec81461038d578063a7fc7a071461039557610181565b8063313ce5671161013e57806342966c681161011857806342966c68146102ae5780635c658165146102ce5780635c975abb146102ee578063661884631461030357610181565b8063313ce56714610262578063378dc3dc146102845780633f4ba83a1461029957610181565b806306fdde0314610186578063095ea7b3146101b15780631072cbea146101de57806318160ddd1461020057806323b872dd1461022257806327e235e314610242575b600080fd5b34801561019257600080fd5b5061019b610495565b6040516101a891906112a0565b60405180910390f35b3480156101bd57600080fd5b506101d16101cc3660046111d8565b6104c1565b6040516101a89190611295565b3480156101ea57600080fd5b506101fe6101f93660046111d8565b610593565b005b34801561020c57600080fd5b506102156105ef565b6040516101a8919061166e565b34801561022e57600080fd5b506101d161023d366004611167565b6105f5565b34801561024e57600080fd5b5061021561025d36600461111b565b61081c565b34801561026e57600080fd5b5061027761082e565b6040516101a89190611677565b34801561029057600080fd5b50610215610833565b3480156102a557600080fd5b506101fe610850565b3480156102ba57600080fd5b506101d16102c936600461121d565b6108d8565b3480156102da57600080fd5b506102156102e9366004611135565b610a07565b3480156102fa57600080fd5b506101d1610a24565b34801561030f57600080fd5b506101d161031e3660046111d8565b610a2d565b34801561032f57600080fd5b5061021561033e36600461111b565b610ac6565b34801561034f57600080fd5b506101fe610ae1565b34801561036457600080fd5b5061019b610b6c565b34801561037957600080fd5b506101fe61038836600461111b565b610b8b565b6101fe610181565b3480156103a157600080fd5b506101fe6103b036600461111b565b610c64565b3480156103c157600080fd5b506101d16103d03660046111d8565b610ccc565b3480156103e157600080fd5b506101d16103f036600461111b565b610e5b565b34801561040157600080fd5b506101d16104103660046111a2565b610e70565b34801561042157600080fd5b506101d16104303660046111d8565b610f1d565b34801561044157600080fd5b506101d161045036600461111b565b610f5e565b34801561046157600080fd5b50610215610470366004611135565b610f73565b34801561048157600080fd5b506101fe61049036600461111b565b610f9e565b6040518060400160405280601081526020016f4d6f7270686575732e4e6574776f726b60801b81525081565b60015460009060ff16156104d457600080fd5b81158061050257503360009081526003602090815260408083206001600160a01b0387168452909152902054155b6105275760405162461bcd60e51b815260040161051e90611637565b60405180910390fd5b3360008181526003602090815260408083206001600160a01b03881680855292529182902085905590519091907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061058190869061166e565b60405180910390a35060015b92915050565b60008061059e611003565b6001600160a01b0316815260208101919091526040016000205460ff166105d75760405162461bcd60e51b815260040161051e90611567565b6105eb6001600160a01b0383163383611007565b5050565b60055481565b60015460009060ff161561060857600080fd5b6001600160a01b03831661062e5760405162461bcd60e51b815260040161051e906112f3565b6001600160a01b0384166000908152600260205260409020548211156106665760405162461bcd60e51b815260040161051e906115f2565b6001600160a01b03841660009081526003602090815260408083203384529091529020548211156106a95760405162461bcd60e51b815260040161051e90611410565b6001600160a01b03841660009081526004602052604090205460ff16156106e25760405162461bcd60e51b815260040161051e906115af565b6001600160a01b03831660009081526004602052604090205460ff161561071b5760405162461bcd60e51b815260040161051e90611385565b6001600160a01b03841660009081526002602052604090205461073e9083611095565b6001600160a01b03808616600090815260026020526040808220939093559085168152205461076d90836110cd565b6001600160a01b0380851660009081526002602090815260408083209490945591871681526003825282812033825290915220546107ab9083611095565b6001600160a01b0380861660008181526003602090815260408083203384529091529081902093909355915190851691907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061080990869061166e565b60405180910390a35060015b9392505050565b60026020526000908152604090205481565b601281565b61083f6012600a6116e3565b61084d906302dada826117b1565b81565b60008061085b611003565b6001600160a01b0316815260208101919091526040016000205460ff166108945760405162461bcd60e51b815260040161051e90611567565b60015460ff166108a357600080fd5b6001805460ff191690556040517f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3390600090a1565b60008060006108e5611003565b6001600160a01b0316815260208101919091526040016000205460ff1661091e5760405162461bcd60e51b815260040161051e90611567565b3360009081526002602052604090205482111561094d5760405162461bcd60e51b815260040161051e90611457565b336000908152600260205260409020546109679083611095565b336000908152600260205260409020556005546109849083611095565b60055560405133907fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5906109b990859061166e565b60405180910390a260405160009033907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906109f690869061166e565b60405180910390a35060015b919050565b600360209081526000928352604080842090915290825290205481565b60015460ff1681565b60015460009060ff1615610a4057600080fd5b3360009081526003602090815260408083206001600160a01b0387168452909152902054610a6e9083611095565b3360008181526003602090815260408083206001600160a01b038916808552925291829020849055905190927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591610581919061166e565b6001600160a01b031660009081526002602052604090205490565b600080610aec611003565b6001600160a01b0316815260208101919091526040016000205460ff16610b255760405162461bcd60e51b815260040161051e90611567565b60015460ff1615610b3557600080fd5b6001805460ff1916811790556040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62590600090a1565b604051806040016040528060038152602001624d4e5760e81b81525081565b600080610b96611003565b6001600160a01b0316815260208101919091526040016000205460ff16610bcf5760405162461bcd60e51b815260040161051e90611567565b6040516370a0823160e01b81526000906001600160a01b038316906370a0823190610bfe90309060040161124d565b60206040518083038186803b158015610c1657600080fd5b505afa158015610c2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c4e9190611235565b90506105eb6001600160a01b0383163383611007565b600080610c6f611003565b6001600160a01b0316815260208101919091526040016000205460ff16610ca85760405162461bcd60e51b815260040161051e90611567565b6001600160a01b03166000908152602081905260409020805460ff19166001179055565b60015460009060ff1615610cdf57600080fd5b6001600160a01b038316331415610d085760405162461bcd60e51b815260040161051e9061133a565b6001600160a01b038316610d2e5760405162461bcd60e51b815260040161051e906114dd565b33600090815260026020526040902054821115610d5d5760405162461bcd60e51b815260040161051e90611523565b3360009081526004602052604090205460ff1615610d8d5760405162461bcd60e51b815260040161051e9061149b565b6001600160a01b03831660009081526004602052604090205460ff1615610dc65760405162461bcd60e51b815260040161051e906113cb565b33600090815260026020526040902054610de09083611095565b33600090815260026020526040808220929092556001600160a01b03851681522054610e0c90836110cd565b6001600160a01b0384166000818152600260205260409081902092909255905133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061058190869061166e565b60046020526000908152604090205460ff1681565b6000806000610e7d611003565b6001600160a01b0316815260208101919091526040016000205460ff16610eb65760405162461bcd60e51b815260040161051e90611567565b6001600160a01b03831660009081526004602052604090819020805460ff1916841515179055517ff022c1fbc00daf4d2e6cdc62e0338b967bd3be38ccc3d7f8e0168bd668c7bcfe90610f0c9085908590611261565b60405180910390a150600192915050565b60015460009060ff1615610f3057600080fd5b3360009081526003602090815260408083206001600160a01b0387168452909152902054610a6e90836110cd565b60006020819052908152604090205460ff1681565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b600080610fa9611003565b6001600160a01b0316815260208101919091526040016000205460ff16610fe25760405162461bcd60e51b815260040161051e90611567565b6001600160a01b03166000908152602081905260409020805460ff19169055565b3390565b60405163a9059cbb60e01b81526001600160a01b0384169063a9059cbb90611035908590859060040161127c565b602060405180830381600087803b15801561104f57600080fd5b505af1158015611063573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110879190611201565b61109057600080fd5b505050565b60006110a182846117d0565b90508282111580156110b35750828111155b61058d57634e487b7160e01b600052600160045260246000fd5b60006110d98284611685565b90508281101580156110b357508181101561058d57634e487b7160e01b600052600160045260246000fd5b80356001600160a01b0381168114610a0257600080fd5b60006020828403121561112c578081fd5b61081582611104565b60008060408385031215611147578081fd5b61115083611104565b915061115e60208401611104565b90509250929050565b60008060006060848603121561117b578081fd5b61118484611104565b925061119260208501611104565b9150604084013590509250925092565b600080604083850312156111b4578182fd5b6111bd83611104565b915060208301356111cd816117fd565b809150509250929050565b600080604083850312156111ea578182fd5b6111f383611104565b946020939093013593505050565b600060208284031215611212578081fd5b8151610815816117fd565b60006020828403121561122e578081fd5b5035919050565b600060208284031215611246578081fd5b5051919050565b6001600160a01b0391909116815260200190565b6001600160a01b039290921682521515602082015260400190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b6000602080835283518082850152825b818110156112cc578581018301518582016040015282016112b0565b818111156112dd5783604083870101525b50601f01601f1916929092016040019392505050565b60208082526027908201527f5446312d20506c6561736520636865636b2074686520726563697069656e74206040820152666164647265737360c81b606082015260800190565b6020808252602b908201527f54312d20526563697069656e742063616e206e6f74206265207468652073616d60408201526a329030b99039b2b73232b960a91b606082015260800190565b60208082526026908201527f5446352d205468652077616c6c6574206f6620726563697069656e7420697320604082015265333937bd32b760d11b606082015260800190565b60208082526025908201527f54352d205468652077616c6c6574206f6620726563697069656e7420697320666040820152643937bd32b760d91b606082015260800190565b60208082526027908201527f5446332d2054686520616c6c6f77616e6365206f662073656e64657220697320604082015266746f6f206c6f7760c81b606082015260800190565b60208082526024908201527f42312d205468652062616c616e6365206f66206275726e657220697320746f6f604082015263206c6f7760e01b606082015260800190565b60208082526022908201527f54342d205468652077616c6c6574206f662073656e6465722069732066726f7a60408201526132b760f11b606082015260800190565b60208082526026908201527f54322d20506c6561736520636865636b2074686520726563697069656e74206160408201526564647265737360d01b606082015260800190565b60208082526024908201527f54332d205468652062616c616e6365206f662073656e64657220697320746f6f604082015263206c6f7760e01b606082015260800190565b60208082526028908201527f436f6e74726f6c6c61626c653a2063616c6c6572206973206e6f74206120636f604082015267373a3937b63632b960c11b606082015260800190565b60208082526023908201527f5446342d205468652077616c6c6574206f662073656e6465722069732066726f6040820152623d32b760e91b606082015260800190565b60208082526025908201527f5446322d205468652062616c616e6365206f662073656e64657220697320746f6040820152646f206c6f7760d81b606082015260800190565b6020808252601e908201527f41312d20526573657420616c6c6f77616e636520746f20302066697273740000604082015260600190565b90815260200190565b60ff91909116815260200190565b60008219821115611698576116986117e7565b500190565b80825b60018086116116af57506116da565b8187048211156116c1576116c16117e7565b808616156116ce57918102915b9490941c9380026116a0565b94509492505050565b600061081560001984846000826116fc57506001610815565b8161170957506000610815565b816001811461171f576002811461172957611756565b6001915050610815565b60ff84111561173a5761173a6117e7565b6001841b915084821115611750576117506117e7565b50610815565b5060208310610133831016604e8410600b8410161715611789575081810a83811115611784576117846117e7565b610815565b611796848484600161169d565b8086048211156117a8576117a86117e7565b02949350505050565b60008160001904831182151516156117cb576117cb6117e7565b500290565b6000828210156117e2576117e26117e7565b500390565b634e487b7160e01b600052601160045260246000fd5b801515811461180b57600080fd5b5056fea26469706673582212205f3fd6ea2e81230d926201494cd4b047640da202fa4a088a3d1abc3b0aafbac264736f6c63430008000033
60806040526001805460ff191690553480156200001b57600080fd5b50600062000028620000f2565b6001600160a01b03166000908152602081905260409020805460ff1916600117905550620000596012600a6200014c565b62000069906302dada8262000241565b600581905533600081815260026020908152604080832094909455819052918220805460ff19166001179055907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef620000c56012600a6200014c565b620000d5906302dada8262000241565b604051620000e49190620000f6565b60405180910390a362000279565b3390565b90815260200190565b80825b600180861162000113575062000143565b81870482111562000128576200012862000263565b808616156200013657918102915b9490941c93800262000102565b94509492505050565b60006200015d600019848462000164565b9392505050565b60008262000175575060016200015d565b8162000184575060006200015d565b81600181146200019d5760028114620001a857620001dc565b60019150506200015d565b60ff841115620001bc57620001bc62000263565b6001841b915084821115620001d557620001d562000263565b506200015d565b5060208310610133831016604e8410600b841016171562000214575081810a838111156200020e576200020e62000263565b6200015d565b620002238484846001620000ff565b80860482111562000238576200023862000263565b02949350505050565b60008160001904831182151516156200025e576200025e62000263565b500290565b634e487b7160e01b600052601160045260246000fd5b61184480620002896000396000f3fe6080604052600436106101815760003560e01c806370a08231116100d1578063a9059cbb1161008a578063d73dd62311610064578063d73dd62314610415578063da8c229e14610435578063dd62ed3e14610455578063f6a74ed71461047557610181565b8063a9059cbb146103b5578063b414d4b6146103d5578063bf120ae5146103f557610181565b806370a08231146103235780638456cb591461034357806395d89b41146103585780639cee789f1461036d578063a3912ec81461038d578063a7fc7a071461039557610181565b8063313ce5671161013e57806342966c681161011857806342966c68146102ae5780635c658165146102ce5780635c975abb146102ee578063661884631461030357610181565b8063313ce56714610262578063378dc3dc146102845780633f4ba83a1461029957610181565b806306fdde0314610186578063095ea7b3146101b15780631072cbea146101de57806318160ddd1461020057806323b872dd1461022257806327e235e314610242575b600080fd5b34801561019257600080fd5b5061019b610495565b6040516101a891906112a0565b60405180910390f35b3480156101bd57600080fd5b506101d16101cc3660046111d8565b6104c1565b6040516101a89190611295565b3480156101ea57600080fd5b506101fe6101f93660046111d8565b610593565b005b34801561020c57600080fd5b506102156105ef565b6040516101a8919061166e565b34801561022e57600080fd5b506101d161023d366004611167565b6105f5565b34801561024e57600080fd5b5061021561025d36600461111b565b61081c565b34801561026e57600080fd5b5061027761082e565b6040516101a89190611677565b34801561029057600080fd5b50610215610833565b3480156102a557600080fd5b506101fe610850565b3480156102ba57600080fd5b506101d16102c936600461121d565b6108d8565b3480156102da57600080fd5b506102156102e9366004611135565b610a07565b3480156102fa57600080fd5b506101d1610a24565b34801561030f57600080fd5b506101d161031e3660046111d8565b610a2d565b34801561032f57600080fd5b5061021561033e36600461111b565b610ac6565b34801561034f57600080fd5b506101fe610ae1565b34801561036457600080fd5b5061019b610b6c565b34801561037957600080fd5b506101fe61038836600461111b565b610b8b565b6101fe610181565b3480156103a157600080fd5b506101fe6103b036600461111b565b610c64565b3480156103c157600080fd5b506101d16103d03660046111d8565b610ccc565b3480156103e157600080fd5b506101d16103f036600461111b565b610e5b565b34801561040157600080fd5b506101d16104103660046111a2565b610e70565b34801561042157600080fd5b506101d16104303660046111d8565b610f1d565b34801561044157600080fd5b506101d161045036600461111b565b610f5e565b34801561046157600080fd5b50610215610470366004611135565b610f73565b34801561048157600080fd5b506101fe61049036600461111b565b610f9e565b6040518060400160405280601081526020016f4d6f7270686575732e4e6574776f726b60801b81525081565b60015460009060ff16156104d457600080fd5b81158061050257503360009081526003602090815260408083206001600160a01b0387168452909152902054155b6105275760405162461bcd60e51b815260040161051e90611637565b60405180910390fd5b3360008181526003602090815260408083206001600160a01b03881680855292529182902085905590519091907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061058190869061166e565b60405180910390a35060015b92915050565b60008061059e611003565b6001600160a01b0316815260208101919091526040016000205460ff166105d75760405162461bcd60e51b815260040161051e90611567565b6105eb6001600160a01b0383163383611007565b5050565b60055481565b60015460009060ff161561060857600080fd5b6001600160a01b03831661062e5760405162461bcd60e51b815260040161051e906112f3565b6001600160a01b0384166000908152600260205260409020548211156106665760405162461bcd60e51b815260040161051e906115f2565b6001600160a01b03841660009081526003602090815260408083203384529091529020548211156106a95760405162461bcd60e51b815260040161051e90611410565b6001600160a01b03841660009081526004602052604090205460ff16156106e25760405162461bcd60e51b815260040161051e906115af565b6001600160a01b03831660009081526004602052604090205460ff161561071b5760405162461bcd60e51b815260040161051e90611385565b6001600160a01b03841660009081526002602052604090205461073e9083611095565b6001600160a01b03808616600090815260026020526040808220939093559085168152205461076d90836110cd565b6001600160a01b0380851660009081526002602090815260408083209490945591871681526003825282812033825290915220546107ab9083611095565b6001600160a01b0380861660008181526003602090815260408083203384529091529081902093909355915190851691907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061080990869061166e565b60405180910390a35060015b9392505050565b60026020526000908152604090205481565b601281565b61083f6012600a6116e3565b61084d906302dada826117b1565b81565b60008061085b611003565b6001600160a01b0316815260208101919091526040016000205460ff166108945760405162461bcd60e51b815260040161051e90611567565b60015460ff166108a357600080fd5b6001805460ff191690556040517f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3390600090a1565b60008060006108e5611003565b6001600160a01b0316815260208101919091526040016000205460ff1661091e5760405162461bcd60e51b815260040161051e90611567565b3360009081526002602052604090205482111561094d5760405162461bcd60e51b815260040161051e90611457565b336000908152600260205260409020546109679083611095565b336000908152600260205260409020556005546109849083611095565b60055560405133907fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5906109b990859061166e565b60405180910390a260405160009033907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906109f690869061166e565b60405180910390a35060015b919050565b600360209081526000928352604080842090915290825290205481565b60015460ff1681565b60015460009060ff1615610a4057600080fd5b3360009081526003602090815260408083206001600160a01b0387168452909152902054610a6e9083611095565b3360008181526003602090815260408083206001600160a01b038916808552925291829020849055905190927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591610581919061166e565b6001600160a01b031660009081526002602052604090205490565b600080610aec611003565b6001600160a01b0316815260208101919091526040016000205460ff16610b255760405162461bcd60e51b815260040161051e90611567565b60015460ff1615610b3557600080fd5b6001805460ff1916811790556040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62590600090a1565b604051806040016040528060038152602001624d4e5760e81b81525081565b600080610b96611003565b6001600160a01b0316815260208101919091526040016000205460ff16610bcf5760405162461bcd60e51b815260040161051e90611567565b6040516370a0823160e01b81526000906001600160a01b038316906370a0823190610bfe90309060040161124d565b60206040518083038186803b158015610c1657600080fd5b505afa158015610c2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c4e9190611235565b90506105eb6001600160a01b0383163383611007565b600080610c6f611003565b6001600160a01b0316815260208101919091526040016000205460ff16610ca85760405162461bcd60e51b815260040161051e90611567565b6001600160a01b03166000908152602081905260409020805460ff19166001179055565b60015460009060ff1615610cdf57600080fd5b6001600160a01b038316331415610d085760405162461bcd60e51b815260040161051e9061133a565b6001600160a01b038316610d2e5760405162461bcd60e51b815260040161051e906114dd565b33600090815260026020526040902054821115610d5d5760405162461bcd60e51b815260040161051e90611523565b3360009081526004602052604090205460ff1615610d8d5760405162461bcd60e51b815260040161051e9061149b565b6001600160a01b03831660009081526004602052604090205460ff1615610dc65760405162461bcd60e51b815260040161051e906113cb565b33600090815260026020526040902054610de09083611095565b33600090815260026020526040808220929092556001600160a01b03851681522054610e0c90836110cd565b6001600160a01b0384166000818152600260205260409081902092909255905133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061058190869061166e565b60046020526000908152604090205460ff1681565b6000806000610e7d611003565b6001600160a01b0316815260208101919091526040016000205460ff16610eb65760405162461bcd60e51b815260040161051e90611567565b6001600160a01b03831660009081526004602052604090819020805460ff1916841515179055517ff022c1fbc00daf4d2e6cdc62e0338b967bd3be38ccc3d7f8e0168bd668c7bcfe90610f0c9085908590611261565b60405180910390a150600192915050565b60015460009060ff1615610f3057600080fd5b3360009081526003602090815260408083206001600160a01b0387168452909152902054610a6e90836110cd565b60006020819052908152604090205460ff1681565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b600080610fa9611003565b6001600160a01b0316815260208101919091526040016000205460ff16610fe25760405162461bcd60e51b815260040161051e90611567565b6001600160a01b03166000908152602081905260409020805460ff19169055565b3390565b60405163a9059cbb60e01b81526001600160a01b0384169063a9059cbb90611035908590859060040161127c565b602060405180830381600087803b15801561104f57600080fd5b505af1158015611063573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110879190611201565b61109057600080fd5b505050565b60006110a182846117d0565b90508282111580156110b35750828111155b61058d57634e487b7160e01b600052600160045260246000fd5b60006110d98284611685565b90508281101580156110b357508181101561058d57634e487b7160e01b600052600160045260246000fd5b80356001600160a01b0381168114610a0257600080fd5b60006020828403121561112c578081fd5b61081582611104565b60008060408385031215611147578081fd5b61115083611104565b915061115e60208401611104565b90509250929050565b60008060006060848603121561117b578081fd5b61118484611104565b925061119260208501611104565b9150604084013590509250925092565b600080604083850312156111b4578182fd5b6111bd83611104565b915060208301356111cd816117fd565b809150509250929050565b600080604083850312156111ea578182fd5b6111f383611104565b946020939093013593505050565b600060208284031215611212578081fd5b8151610815816117fd565b60006020828403121561122e578081fd5b5035919050565b600060208284031215611246578081fd5b5051919050565b6001600160a01b0391909116815260200190565b6001600160a01b039290921682521515602082015260400190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b6000602080835283518082850152825b818110156112cc578581018301518582016040015282016112b0565b818111156112dd5783604083870101525b50601f01601f1916929092016040019392505050565b60208082526027908201527f5446312d20506c6561736520636865636b2074686520726563697069656e74206040820152666164647265737360c81b606082015260800190565b6020808252602b908201527f54312d20526563697069656e742063616e206e6f74206265207468652073616d60408201526a329030b99039b2b73232b960a91b606082015260800190565b60208082526026908201527f5446352d205468652077616c6c6574206f6620726563697069656e7420697320604082015265333937bd32b760d11b606082015260800190565b60208082526025908201527f54352d205468652077616c6c6574206f6620726563697069656e7420697320666040820152643937bd32b760d91b606082015260800190565b60208082526027908201527f5446332d2054686520616c6c6f77616e6365206f662073656e64657220697320604082015266746f6f206c6f7760c81b606082015260800190565b60208082526024908201527f42312d205468652062616c616e6365206f66206275726e657220697320746f6f604082015263206c6f7760e01b606082015260800190565b60208082526022908201527f54342d205468652077616c6c6574206f662073656e6465722069732066726f7a60408201526132b760f11b606082015260800190565b60208082526026908201527f54322d20506c6561736520636865636b2074686520726563697069656e74206160408201526564647265737360d01b606082015260800190565b60208082526024908201527f54332d205468652062616c616e6365206f662073656e64657220697320746f6f604082015263206c6f7760e01b606082015260800190565b60208082526028908201527f436f6e74726f6c6c61626c653a2063616c6c6572206973206e6f74206120636f604082015267373a3937b63632b960c11b606082015260800190565b60208082526023908201527f5446342d205468652077616c6c6574206f662073656e6465722069732066726f6040820152623d32b760e91b606082015260800190565b60208082526025908201527f5446322d205468652062616c616e6365206f662073656e64657220697320746f6040820152646f206c6f7760d81b606082015260800190565b6020808252601e908201527f41312d20526573657420616c6c6f77616e636520746f20302066697273740000604082015260600190565b90815260200190565b60ff91909116815260200190565b60008219821115611698576116986117e7565b500190565b80825b60018086116116af57506116da565b8187048211156116c1576116c16117e7565b808616156116ce57918102915b9490941c9380026116a0565b94509492505050565b600061081560001984846000826116fc57506001610815565b8161170957506000610815565b816001811461171f576002811461172957611756565b6001915050610815565b60ff84111561173a5761173a6117e7565b6001841b915084821115611750576117506117e7565b50610815565b5060208310610133831016604e8410600b8410161715611789575081810a83811115611784576117846117e7565b610815565b611796848484600161169d565b8086048211156117a8576117a86117e7565b02949350505050565b60008160001904831182151516156117cb576117cb6117e7565b500290565b6000828210156117e2576117e26117e7565b500390565b634e487b7160e01b600052601160045260246000fd5b801515811461180b57600080fd5b5056fea26469706673582212205f3fd6ea2e81230d926201494cd4b047640da202fa4a088a3d1abc3b0aafbac264736f6c63430008000033