Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- MintableBurnableERC20
- Optimization enabled
- true
- Compiler version
- v0.8.20+commit.a1b79de6
- Optimization runs
- 800
- EVM Version
- default
- Verified at
- 2023-07-13T19:07:02.580722Z
Constructor Arguments
0x000000000000000000000000fb3485c2e209a5cfbdc1447674256578f1a80ee3000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000144d6167696320496e7465726e6574204d6f6e657900000000000000000000000000000000000000000000000000000000000000000000000000000000000000034d494d0000000000000000000000000000000000000000000000000000000000
Arg [0] (address) : 0xfb3485c2e209a5cfbdc1447674256578f1a80ee3
Arg [1] (string) : Magic Internet Money
Arg [2] (string) : MIM
Arg [3] (uint8) : 18
Contract source code
// SPDX-License-Identifier: MIT pragma solidity >=0.8.0; /// @notice Modern and gas efficient ERC20 + EIP-2612 implementation. /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol) /// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol) /// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it. abstract contract ERC20 { /*////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ event Transfer(address indexed from, address indexed to, uint256 amount); event Approval(address indexed owner, address indexed spender, uint256 amount); /*////////////////////////////////////////////////////////////// METADATA STORAGE //////////////////////////////////////////////////////////////*/ string public name; string public symbol; uint8 public immutable decimals; /*////////////////////////////////////////////////////////////// ERC20 STORAGE //////////////////////////////////////////////////////////////*/ uint256 public totalSupply; mapping(address => uint256) public balanceOf; mapping(address => mapping(address => uint256)) public allowance; /*////////////////////////////////////////////////////////////// EIP-2612 STORAGE //////////////////////////////////////////////////////////////*/ uint256 internal immutable INITIAL_CHAIN_ID; bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR; mapping(address => uint256) public nonces; /*////////////////////////////////////////////////////////////// CONSTRUCTOR //////////////////////////////////////////////////////////////*/ constructor( string memory _name, string memory _symbol, uint8 _decimals ) { name = _name; symbol = _symbol; decimals = _decimals; INITIAL_CHAIN_ID = block.chainid; INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator(); } /*////////////////////////////////////////////////////////////// ERC20 LOGIC //////////////////////////////////////////////////////////////*/ function approve(address spender, uint256 amount) public virtual returns (bool) { allowance[msg.sender][spender] = amount; emit Approval(msg.sender, spender, amount); return true; } function transfer(address to, uint256 amount) public virtual returns (bool) { balanceOf[msg.sender] -= amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(msg.sender, to, amount); return true; } function transferFrom( address from, address to, uint256 amount ) public virtual returns (bool) { uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals. if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount; balanceOf[from] -= amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(from, to, amount); return true; } /*////////////////////////////////////////////////////////////// EIP-2612 LOGIC //////////////////////////////////////////////////////////////*/ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) public virtual { require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED"); // Unchecked because the only math done is incrementing // the owner's nonce which cannot realistically overflow. unchecked { address recoveredAddress = ecrecover( keccak256( abi.encodePacked( "\x19\x01", DOMAIN_SEPARATOR(), keccak256( abi.encode( keccak256( "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)" ), owner, spender, value, nonces[owner]++, deadline ) ) ) ), v, r, s ); require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER"); allowance[recoveredAddress][spender] = value; } emit Approval(owner, spender, value); } function DOMAIN_SEPARATOR() public view virtual returns (bytes32) { return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator(); } function computeDomainSeparator() internal view virtual returns (bytes32) { return keccak256( abi.encode( keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), keccak256(bytes(name)), keccak256("1"), block.chainid, address(this) ) ); } /*////////////////////////////////////////////////////////////// INTERNAL MINT/BURN LOGIC //////////////////////////////////////////////////////////////*/ function _mint(address to, uint256 amount) internal virtual { totalSupply += amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(address(0), to, amount); } function _burn(address from, uint256 amount) internal virtual { balanceOf[from] -= amount; // Cannot underflow because a user's balance // will never be larger than the total supply. unchecked { totalSupply -= amount; } emit Transfer(from, address(0), amount); } } /// @notice Simple single owner authorization mixin. /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/auth/Owned.sol) abstract contract Owned { /*////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ event OwnershipTransferred(address indexed user, address indexed newOwner); /*////////////////////////////////////////////////////////////// OWNERSHIP STORAGE //////////////////////////////////////////////////////////////*/ address public owner; modifier onlyOwner() virtual { require(msg.sender == owner, "UNAUTHORIZED"); _; } /*////////////////////////////////////////////////////////////// CONSTRUCTOR //////////////////////////////////////////////////////////////*/ constructor(address _owner) { owner = _owner; emit OwnershipTransferred(address(0), _owner); } /*////////////////////////////////////////////////////////////// OWNERSHIP LOGIC //////////////////////////////////////////////////////////////*/ function transferOwnership(address newOwner) public virtual onlyOwner { owner = newOwner; emit OwnershipTransferred(msg.sender, newOwner); } } /// @title OperatableV2 /// @notice OperatableV2 is a contract that allows operator management. /// The difference with OperatableV1 apart from using solmate `Owned` vs `BoringOwnable` is that /// the constructor is taking in the owner except of using msg.sender. /// This allows ensuring that the owner is right one. /// For example, when deploying from a CREATE2 factory, the msg.sender would the factory address /// which is usually not what we want. contract OperatableV2 is Owned { event OperatorChanged(address indexed, bool); error NotAllowedOperator(); mapping(address => bool) public operators; constructor(address _owner) Owned(_owner) { operators[_owner] = true; } modifier onlyOperators() { if (!operators[msg.sender]) { revert NotAllowedOperator(); } _; } function setOperator(address operator, bool status) external onlyOwner { operators[operator] = status; emit OperatorChanged(operator, status); } } interface IMintableBurnable { function burn(address from, uint256 amount) external returns (bool); function mint(address to, uint256 amount) external returns (bool); } /// @title MintableBurnableERC20 /// @notice MintableBurnableERC20 is an ERC20 token with mint, burn functions. /// In this context, operators are allowed minters and burners. contract MintableBurnableERC20 is ERC20, OperatableV2, IMintableBurnable { constructor( address _owner, string memory name_, string memory symbol_, uint8 decimals_ ) ERC20(name_, symbol_, decimals_) OperatableV2(_owner) {} function burn(address from, uint256 amount) external onlyOperators returns (bool) { _burn(from, amount); return true; } function mint(address to, uint256 amount) external onlyOperators returns (bool) { _mint(to, amount); return true; } }
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_owner","internalType":"address"},{"type":"string","name":"name_","internalType":"string"},{"type":"string","name":"symbol_","internalType":"string"},{"type":"uint8","name":"decimals_","internalType":"uint8"}]},{"type":"error","name":"NotAllowedOperator","inputs":[]},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"spender","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OperatorChanged","inputs":[{"type":"address","name":"","internalType":"address","indexed":true},{"type":"bool","name":"","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"user","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":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"DOMAIN_SEPARATOR","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"","internalType":"address"},{"type":"address","name":"","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":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"burn","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"mint","inputs":[{"type":"address","name":"to","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":"uint256","name":"","internalType":"uint256"}],"name":"nonces","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"operators","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"permit","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"},{"type":"uint256","name":"deadline","internalType":"uint256"},{"type":"uint8","name":"v","internalType":"uint8"},{"type":"bytes32","name":"r","internalType":"bytes32"},{"type":"bytes32","name":"s","internalType":"bytes32"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setOperator","inputs":[{"type":"address","name":"operator","internalType":"address"},{"type":"bool","name":"status","internalType":"bool"}]},{"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":"to","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","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
0x60e06040523480156200001157600080fd5b50604051620013a5380380620013a583398101604081905262000034916200024c565b838084848460006200004784826200037f565b5060016200005683826200037f565b5060ff81166080524660a0526200006c620000eb565b60c0525050600680546001600160a01b0319166001600160a01b0384169081179091556040519091506000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001600160a01b03166000908152600760205260409020805460ff1916600117905550620004c992505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60006040516200011f91906200044b565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001af57600080fd5b81516001600160401b0380821115620001cc57620001cc62000187565b604051601f8301601f19908116603f01168101908282118183101715620001f757620001f762000187565b816040528381526020925086838588010111156200021457600080fd5b600091505b8382101562000238578582018301518183018401529082019062000219565b600093810190920192909252949350505050565b600080600080608085870312156200026357600080fd5b84516001600160a01b03811681146200027b57600080fd5b60208601519094506001600160401b03808211156200029957600080fd5b620002a7888389016200019d565b94506040870151915080821115620002be57600080fd5b50620002cd878288016200019d565b925050606085015160ff81168114620002e557600080fd5b939692955090935050565b600181811c908216806200030557607f821691505b6020821081036200032657634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200037a57600081815260208120601f850160051c81016020861015620003555750805b601f850160051c820191505b81811015620003765782815560010162000361565b5050505b505050565b81516001600160401b038111156200039b576200039b62000187565b620003b381620003ac8454620002f0565b846200032c565b602080601f831160018114620003eb5760008415620003d25750858301515b600019600386901b1c1916600185901b17855562000376565b600085815260208120601f198616915b828110156200041c57888601518255948401946001909101908401620003fb565b50858210156200043b5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008083546200045b81620002f0565b600182811680156200047657600181146200048c57620004bd565b60ff1984168752821515830287019450620004bd565b8760005260208060002060005b85811015620004b45781548a82015290840190820162000499565b50505082870194505b50929695505050505050565b60805160a05160c051610eac620004f960003960006105420152600061050d015260006101ce0152610eac6000f3fe608060405234801561001057600080fd5b50600436106101365760003560e01c806370a08231116100b25780639dc29fac11610081578063d505accf11610066578063d505accf146102cb578063dd62ed3e146102de578063f2fde38b1461030957600080fd5b80639dc29fac146102a5578063a9059cbb146102b857600080fd5b806370a08231146102325780637ecebe00146102525780638da5cb5b1461027257806395d89b411461029d57600080fd5b806323b872dd116101095780633644e515116100ee5780633644e5151461020257806340c10f191461020a578063558a72971461021d57600080fd5b806323b872dd146101b6578063313ce567146101c957600080fd5b806306fdde031461013b578063095ea7b31461015957806313e7c9d81461017c57806318160ddd1461019f575b600080fd5b61014361031c565b6040516101509190610b8d565b60405180910390f35b61016c610167366004610bf7565b6103aa565b6040519015158152602001610150565b61016c61018a366004610c21565b60076020526000908152604090205460ff1681565b6101a860025481565b604051908152602001610150565b61016c6101c4366004610c43565b610417565b6101f07f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff9091168152602001610150565b6101a8610509565b61016c610218366004610bf7565b610564565b61023061022b366004610c7f565b6105a7565b005b6101a8610240366004610c21565b60036020526000908152604090205481565b6101a8610260366004610c21565b60056020526000908152604090205481565b600654610285906001600160a01b031681565b6040516001600160a01b039091168152602001610150565b610143610654565b61016c6102b3366004610bf7565b610661565b61016c6102c6366004610bf7565b61069b565b6102306102d9366004610cbb565b610713565b6101a86102ec366004610d2e565b600460209081526000928352604080842090915290825290205481565b610230610317366004610c21565b610966565b6000805461032990610d61565b80601f016020809104026020016040519081016040528092919081815260200182805461035590610d61565b80156103a25780601f10610377576101008083540402835291602001916103a2565b820191906000526020600020905b81548152906001019060200180831161038557829003601f168201915b505050505081565b3360008181526004602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906104059086815260200190565b60405180910390a35060015b92915050565b6001600160a01b038316600090815260046020908152604080832033845290915281205460001981146104735761044e8382610db1565b6001600160a01b03861660009081526004602090815260408083203384529091529020555b6001600160a01b0385166000908152600360205260408120805485929061049b908490610db1565b90915550506001600160a01b03808516600081815260036020526040908190208054870190555190918716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906104f69087815260200190565b60405180910390a3506001949350505050565b60007f0000000000000000000000000000000000000000000000000000000000000000461461053f5761053a610a13565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b3360009081526007602052604081205460ff166105945760405163de19c8b360e01b815260040160405180910390fd5b61059e8383610aad565b50600192915050565b6006546001600160a01b031633146105f55760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064015b60405180910390fd5b6001600160a01b038216600081815260076020908152604091829020805460ff191685151590811790915591519182527f193de8d500b5cb7b720089b258a39e9c1d0b840019a73ae7c51c3f9101732b02910160405180910390a25050565b6001805461032990610d61565b3360009081526007602052604081205460ff166106915760405163de19c8b360e01b815260040160405180910390fd5b61059e8383610b19565b336000908152600360205260408120805483919083906106bc908490610db1565b90915550506001600160a01b038316600081815260036020526040908190208054850190555133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906104059086815260200190565b428410156107635760405162461bcd60e51b815260206004820152601760248201527f5045524d49545f444541444c494e455f4558504952454400000000000000000060448201526064016105ec565b6000600161076f610509565b6001600160a01b038a811660008181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e08301909152805192019190912061190160f01b6101008301526101028201929092526101228101919091526101420160408051601f198184030181528282528051602091820120600084529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa15801561087b573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906108b15750876001600160a01b0316816001600160a01b0316145b6108fd5760405162461bcd60e51b815260206004820152600e60248201527f494e56414c49445f5349474e455200000000000000000000000000000000000060448201526064016105ec565b6001600160a01b0390811660009081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b6006546001600160a01b031633146109af5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016105ec565b600680547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03831690811790915560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6000604051610a459190610dc4565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b8060026000828254610abf9190610e63565b90915550506001600160a01b0382166000818152600360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b6001600160a01b03821660009081526003602052604081208054839290610b41908490610db1565b90915550506002805482900390556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610b0d565b600060208083528351808285015260005b81811015610bba57858101830151858201604001528201610b9e565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610bf257600080fd5b919050565b60008060408385031215610c0a57600080fd5b610c1383610bdb565b946020939093013593505050565b600060208284031215610c3357600080fd5b610c3c82610bdb565b9392505050565b600080600060608486031215610c5857600080fd5b610c6184610bdb565b9250610c6f60208501610bdb565b9150604084013590509250925092565b60008060408385031215610c9257600080fd5b610c9b83610bdb565b915060208301358015158114610cb057600080fd5b809150509250929050565b600080600080600080600060e0888a031215610cd657600080fd5b610cdf88610bdb565b9650610ced60208901610bdb565b95506040880135945060608801359350608088013560ff81168114610d1157600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215610d4157600080fd5b610d4a83610bdb565b9150610d5860208401610bdb565b90509250929050565b600181811c90821680610d7557607f821691505b602082108103610d9557634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561041157610411610d9b565b600080835481600182811c915080831680610de057607f831692505b60208084108203610dff57634e487b7160e01b86526022600452602486fd5b818015610e135760018114610e2857610e55565b60ff1986168952841515850289019650610e55565b60008a81526020902060005b86811015610e4d5781548b820152908501908301610e34565b505084890196505b509498975050505050505050565b8082018082111561041157610411610d9b56fea264697066735822122043ef96d833673df97b1401c2afb81b369cf17c52f386417e33a981b4a0d1b7d464736f6c63430008140033000000000000000000000000fb3485c2e209a5cfbdc1447674256578f1a80ee3000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000144d6167696320496e7465726e6574204d6f6e657900000000000000000000000000000000000000000000000000000000000000000000000000000000000000034d494d0000000000000000000000000000000000000000000000000000000000
Deployed ByteCode
0x608060405234801561001057600080fd5b50600436106101365760003560e01c806370a08231116100b25780639dc29fac11610081578063d505accf11610066578063d505accf146102cb578063dd62ed3e146102de578063f2fde38b1461030957600080fd5b80639dc29fac146102a5578063a9059cbb146102b857600080fd5b806370a08231146102325780637ecebe00146102525780638da5cb5b1461027257806395d89b411461029d57600080fd5b806323b872dd116101095780633644e515116100ee5780633644e5151461020257806340c10f191461020a578063558a72971461021d57600080fd5b806323b872dd146101b6578063313ce567146101c957600080fd5b806306fdde031461013b578063095ea7b31461015957806313e7c9d81461017c57806318160ddd1461019f575b600080fd5b61014361031c565b6040516101509190610b8d565b60405180910390f35b61016c610167366004610bf7565b6103aa565b6040519015158152602001610150565b61016c61018a366004610c21565b60076020526000908152604090205460ff1681565b6101a860025481565b604051908152602001610150565b61016c6101c4366004610c43565b610417565b6101f07f000000000000000000000000000000000000000000000000000000000000001281565b60405160ff9091168152602001610150565b6101a8610509565b61016c610218366004610bf7565b610564565b61023061022b366004610c7f565b6105a7565b005b6101a8610240366004610c21565b60036020526000908152604090205481565b6101a8610260366004610c21565b60056020526000908152604090205481565b600654610285906001600160a01b031681565b6040516001600160a01b039091168152602001610150565b610143610654565b61016c6102b3366004610bf7565b610661565b61016c6102c6366004610bf7565b61069b565b6102306102d9366004610cbb565b610713565b6101a86102ec366004610d2e565b600460209081526000928352604080842090915290825290205481565b610230610317366004610c21565b610966565b6000805461032990610d61565b80601f016020809104026020016040519081016040528092919081815260200182805461035590610d61565b80156103a25780601f10610377576101008083540402835291602001916103a2565b820191906000526020600020905b81548152906001019060200180831161038557829003601f168201915b505050505081565b3360008181526004602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906104059086815260200190565b60405180910390a35060015b92915050565b6001600160a01b038316600090815260046020908152604080832033845290915281205460001981146104735761044e8382610db1565b6001600160a01b03861660009081526004602090815260408083203384529091529020555b6001600160a01b0385166000908152600360205260408120805485929061049b908490610db1565b90915550506001600160a01b03808516600081815260036020526040908190208054870190555190918716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906104f69087815260200190565b60405180910390a3506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000008ae461461053f5761053a610a13565b905090565b507f06279bcad1555071df1cbc5de8f819fbe860a072f580a5d5573ccecf12d6963e90565b3360009081526007602052604081205460ff166105945760405163de19c8b360e01b815260040160405180910390fd5b61059e8383610aad565b50600192915050565b6006546001600160a01b031633146105f55760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064015b60405180910390fd5b6001600160a01b038216600081815260076020908152604091829020805460ff191685151590811790915591519182527f193de8d500b5cb7b720089b258a39e9c1d0b840019a73ae7c51c3f9101732b02910160405180910390a25050565b6001805461032990610d61565b3360009081526007602052604081205460ff166106915760405163de19c8b360e01b815260040160405180910390fd5b61059e8383610b19565b336000908152600360205260408120805483919083906106bc908490610db1565b90915550506001600160a01b038316600081815260036020526040908190208054850190555133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906104059086815260200190565b428410156107635760405162461bcd60e51b815260206004820152601760248201527f5045524d49545f444541444c494e455f4558504952454400000000000000000060448201526064016105ec565b6000600161076f610509565b6001600160a01b038a811660008181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e08301909152805192019190912061190160f01b6101008301526101028201929092526101228101919091526101420160408051601f198184030181528282528051602091820120600084529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa15801561087b573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906108b15750876001600160a01b0316816001600160a01b0316145b6108fd5760405162461bcd60e51b815260206004820152600e60248201527f494e56414c49445f5349474e455200000000000000000000000000000000000060448201526064016105ec565b6001600160a01b0390811660009081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b6006546001600160a01b031633146109af5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016105ec565b600680547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03831690811790915560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6000604051610a459190610dc4565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b8060026000828254610abf9190610e63565b90915550506001600160a01b0382166000818152600360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b6001600160a01b03821660009081526003602052604081208054839290610b41908490610db1565b90915550506002805482900390556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610b0d565b600060208083528351808285015260005b81811015610bba57858101830151858201604001528201610b9e565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610bf257600080fd5b919050565b60008060408385031215610c0a57600080fd5b610c1383610bdb565b946020939093013593505050565b600060208284031215610c3357600080fd5b610c3c82610bdb565b9392505050565b600080600060608486031215610c5857600080fd5b610c6184610bdb565b9250610c6f60208501610bdb565b9150604084013590509250925092565b60008060408385031215610c9257600080fd5b610c9b83610bdb565b915060208301358015158114610cb057600080fd5b809150509250929050565b600080600080600080600060e0888a031215610cd657600080fd5b610cdf88610bdb565b9650610ced60208901610bdb565b95506040880135945060608801359350608088013560ff81168114610d1157600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215610d4157600080fd5b610d4a83610bdb565b9150610d5860208401610bdb565b90509250929050565b600181811c90821680610d7557607f821691505b602082108103610d9557634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561041157610411610d9b565b600080835481600182811c915080831680610de057607f831692505b60208084108203610dff57634e487b7160e01b86526022600452602486fd5b818015610e135760018114610e2857610e55565b60ff1986168952841515850289019650610e55565b60008a81526020902060005b86811015610e4d5781548b820152908501908301610e34565b505084890196505b509498975050505050505050565b8082018082111561041157610411610d9b56fea264697066735822122043ef96d833673df97b1401c2afb81b369cf17c52f386417e33a981b4a0d1b7d464736f6c63430008140033