Address Details
contract
token
0x73a210637f6F6B7005512677Ba6B3C96bb4AA44B
- Token
- Mobius DAO Token (MOBI)
- Creator
- 0x6c0d6f–b55850 at 0xafb650–a3c83f
- Balance
- 0 CELO ( )
- Locked CELO Balance
- 0.00 CELO
- Voting CELO Balance
- 0.00 CELO
- Pending Unlocked Gold
- 0.00 CELO
- Tokens
-
Fetching tokens...
- Transactions
- 23,524 Transactions
- Transfers
- 12 Transfers
- Gas Used
- 783,908,096
- Last Balance Update
- 28940305
Transactions
Token Transfers
Tokens
Internal Transactions
Coin Balance History
Logs
Code
Read Contract
Write Contract
- Contract name:
- ERC20MOBI
- Optimization enabled
- N/A
- Compiler version
- v0.2.8
- Verified at
- 2022-02-23T18:18:28.094855Z
Constructor Arguments
000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000104d6f626975732044414f20546f6b656e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d4f424900000000000000000000000000000000000000000000000000000000
Arg [0] (string) : Mobius DAO Token
Arg [1] (string) : MOBI
Arg [2] (uint256) : 18
Contract source code
# @version 0.2.8 """ @title Mobius DAO Token @author Mobius Finance @license MIT @notice ERC20 with piecewise-linear mining supply. @dev Based on the ERC-20 token standard as defined at https://eips.ethereum.org/EIPS/eip-20 """ from vyper.interfaces import ERC20 implements: ERC20 event Transfer: _from: indexed(address) _to: indexed(address) _value: uint256 event Approval: _owner: indexed(address) _spender: indexed(address) _value: uint256 event UpdateMiningParameters: time: uint256 rate: uint256 supply: uint256 event SetMinter: minter: address event SetAdmin: admin: address name: public(String[64]) symbol: public(String[32]) decimals: public(uint256) balanceOf: public(HashMap[address, uint256]) allowances: HashMap[address, HashMap[address, uint256]] total_supply: uint256 minter: public(address) admin: public(address) # General constants YEAR: constant(uint256) = 86400 * 365 # Allocation: # ========= # * founders - 20% # * DAO-controlled reserve - 30% # * Celo Reserve - 5% # * Investors - 3% # * Ubeswap Incentives - 7.5% # * Early users - .5% # == 66% == # left for inflation: 34% # Supply parameters INITIAL_SUPPLY: constant(uint256) = 660_000_000 INITIAL_RATE: constant(uint256) = 153_000_000 * 10 ** 18 / YEAR # thanks RATE_REDUCTION_TIME: constant(uint256) = YEAR RATE_REDUCTION_COEFFICIENT: constant(uint256) = 1818181818181818182 # 100 / 55 = 1.818... RATE_DENOMINATOR: constant(uint256) = 10 ** 18 INFLATION_DELAY: constant(uint256) = 0 #86400 # Supply variables mining_epoch: public(int128) start_epoch_time: public(uint256) rate: public(uint256) start_epoch_supply: uint256 @external def __init__(_name: String[64], _symbol: String[32], _decimals: uint256): """ @notice Contract constructor @param _name Token full name @param _symbol Token symbol @param _decimals Number of decimals for token """ init_supply: uint256 = INITIAL_SUPPLY * 10 ** _decimals self.name = _name self.symbol = _symbol self.decimals = _decimals self.balanceOf[msg.sender] = init_supply self.total_supply = init_supply self.admin = msg.sender log Transfer(ZERO_ADDRESS, msg.sender, init_supply) self.start_epoch_time = block.timestamp + INFLATION_DELAY - RATE_REDUCTION_TIME self.mining_epoch = -1 self.rate = 0 self.start_epoch_supply = init_supply @internal def _update_mining_parameters(): """ @dev Update mining rate and supply at the start of the epoch Any modifying mining call must also call this """ _rate: uint256 = self.rate _start_epoch_supply: uint256 = self.start_epoch_supply self.start_epoch_time += RATE_REDUCTION_TIME self.mining_epoch += 1 if _rate == 0: _rate = INITIAL_RATE else: _start_epoch_supply += _rate * RATE_REDUCTION_TIME self.start_epoch_supply = _start_epoch_supply _rate = _rate * RATE_DENOMINATOR / RATE_REDUCTION_COEFFICIENT self.rate = _rate log UpdateMiningParameters(block.timestamp, _rate, _start_epoch_supply) @external def update_mining_parameters(): """ @notice Update mining rate and supply at the start of the epoch @dev Callable by any address, but only once per epoch Total supply becomes slightly larger if this function is called late """ assert block.timestamp >= self.start_epoch_time + RATE_REDUCTION_TIME # dev: too soon! self._update_mining_parameters() @external def start_epoch_time_write() -> uint256: """ @notice Get timestamp of the current mining epoch start while simultaneously updating mining parameters @return Timestamp of the epoch """ _start_epoch_time: uint256 = self.start_epoch_time if block.timestamp >= _start_epoch_time + RATE_REDUCTION_TIME: self._update_mining_parameters() return self.start_epoch_time else: return _start_epoch_time @external def future_epoch_time_write() -> uint256: """ @notice Get timestamp of the next mining epoch start while simultaneously updating mining parameters @return Timestamp of the next epoch """ _start_epoch_time: uint256 = self.start_epoch_time if block.timestamp >= _start_epoch_time + RATE_REDUCTION_TIME: self._update_mining_parameters() return self.start_epoch_time + RATE_REDUCTION_TIME else: return _start_epoch_time + RATE_REDUCTION_TIME @internal @view def _available_supply() -> uint256: return self.start_epoch_supply + (block.timestamp - self.start_epoch_time) * self.rate @external @view def available_supply() -> uint256: """ @notice Current number of tokens in existence (claimed or unclaimed) """ return self._available_supply() @external @view def mintable_in_timeframe(start: uint256, end: uint256) -> uint256: """ @notice How much supply is mintable from start timestamp till end timestamp @param start Start of the time interval (timestamp) @param end End of the time interval (timestamp) @return Tokens mintable from `start` till `end` """ assert start <= end # dev: start > end to_mint: uint256 = 0 current_epoch_time: uint256 = self.start_epoch_time current_rate: uint256 = self.rate # Special case if end is in future (not yet minted) epoch if end > current_epoch_time + RATE_REDUCTION_TIME: current_epoch_time += RATE_REDUCTION_TIME current_rate = current_rate * RATE_DENOMINATOR / RATE_REDUCTION_COEFFICIENT assert end <= current_epoch_time + RATE_REDUCTION_TIME # dev: too far in future for i in range(999): # Mobius will not work in 1000 years. Darn! if end >= current_epoch_time: current_end: uint256 = end if current_end > current_epoch_time + RATE_REDUCTION_TIME: current_end = current_epoch_time + RATE_REDUCTION_TIME current_start: uint256 = start if current_start >= current_epoch_time + RATE_REDUCTION_TIME: break # We should never get here but what if... elif current_start < current_epoch_time: current_start = current_epoch_time to_mint += current_rate * (current_end - current_start) if start >= current_epoch_time: break current_epoch_time -= RATE_REDUCTION_TIME current_rate = current_rate * RATE_REDUCTION_COEFFICIENT / RATE_DENOMINATOR # double-division with rounding made rate a bit less => good assert current_rate <= INITIAL_RATE # This should never happen return to_mint @external def set_minter(_minter: address): """ @notice Set the minter address @dev Only callable once, when minter has not yet been set @param _minter Address of the minter """ assert msg.sender == self.admin # dev: admin only assert self.minter == ZERO_ADDRESS # dev: can set the minter only once, at creation self.minter = _minter log SetMinter(_minter) @external def set_admin(_admin: address): """ @notice Set the new admin. @dev After all is set up, admin only can change the token name @param _admin New admin address """ assert msg.sender == self.admin # dev: admin only self.admin = _admin log SetAdmin(_admin) @external @view def totalSupply() -> uint256: """ @notice Total number of tokens in existence. """ return self.total_supply @external @view def allowance(_owner : address, _spender : address) -> uint256: """ @notice Check the amount of tokens that an owner allowed to a spender @param _owner The address which owns the funds @param _spender The address which will spend the funds @return uint256 specifying the amount of tokens still available for the spender """ return self.allowances[_owner][_spender] @external def transfer(_to : address, _value : uint256) -> bool: """ @notice Transfer `_value` tokens from `msg.sender` to `_to` @dev Vyper does not allow underflows, so the subtraction in this function will revert on an insufficient balance @param _to The address to transfer to @param _value The amount to be transferred @return bool success """ assert _to != ZERO_ADDRESS # dev: transfers to 0x0 are not allowed self.balanceOf[msg.sender] -= _value self.balanceOf[_to] += _value log Transfer(msg.sender, _to, _value) return True @external def transferFrom(_from : address, _to : address, _value : uint256) -> bool: """ @notice Transfer `_value` tokens from `_from` to `_to` @param _from address The address which you want to send tokens from @param _to address The address which you want to transfer to @param _value uint256 the amount of tokens to be transferred @return bool success """ assert _to != ZERO_ADDRESS # dev: transfers to 0x0 are not allowed # NOTE: vyper does not allow underflows # so the following subtraction would revert on insufficient balance self.balanceOf[_from] -= _value self.balanceOf[_to] += _value self.allowances[_from][msg.sender] -= _value log Transfer(_from, _to, _value) return True @external def approve(_spender : address, _value : uint256) -> bool: """ @notice Approve `_spender` to transfer `_value` tokens on behalf of `msg.sender` @dev Approval may only be from zero -> nonzero or from nonzero -> zero in order to mitigate the potential race condition described here: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 @param _spender The address which will spend the funds @param _value The amount of tokens to be spent @return bool success """ assert _value == 0 or self.allowances[msg.sender][_spender] == 0 self.allowances[msg.sender][_spender] = _value log Approval(msg.sender, _spender, _value) return True @external def mint(_to: address, _value: uint256) -> bool: """ @notice Mint `_value` tokens and assign them to `_to` @dev Emits a Transfer event originating from 0x00 @param _to The account that will receive the created tokens @param _value The amount that will be created @return bool success """ assert msg.sender == self.minter # dev: minter only assert _to != ZERO_ADDRESS # dev: zero address if block.timestamp >= self.start_epoch_time + RATE_REDUCTION_TIME: self._update_mining_parameters() _total_supply: uint256 = self.total_supply + _value assert _total_supply <= self._available_supply() # dev: exceeds allowable mint amount self.total_supply = _total_supply self.balanceOf[_to] += _value log Transfer(ZERO_ADDRESS, _to, _value) return True @external def burn(_value: uint256) -> bool: """ @notice Burn `_value` tokens belonging to `msg.sender` @dev Emits a Transfer event with a destination of 0x00 @param _value The amount that will be burned @return bool success """ self.balanceOf[msg.sender] -= _value self.total_supply -= _value log Transfer(msg.sender, ZERO_ADDRESS, _value) return True @external def set_name(_name: String[64], _symbol: String[32]): """ @notice Change the token name and symbol to `_name` and `_symbol` @dev Only callable by the admin account @param _name New token name @param _symbol New token symbol """ assert msg.sender == self.admin, "Only admin is allowed to change name" self.name = _name self.symbol = _symbol
Contract ABI
[{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"_from","indexed":true},{"type":"address","name":"_to","indexed":true},{"type":"uint256","name":"_value","indexed":false}],"anonymous":false},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"_owner","indexed":true},{"type":"address","name":"_spender","indexed":true},{"type":"uint256","name":"_value","indexed":false}],"anonymous":false},{"type":"event","name":"UpdateMiningParameters","inputs":[{"type":"uint256","name":"time","indexed":false},{"type":"uint256","name":"rate","indexed":false},{"type":"uint256","name":"supply","indexed":false}],"anonymous":false},{"type":"event","name":"SetMinter","inputs":[{"type":"address","name":"minter","indexed":false}],"anonymous":false},{"type":"event","name":"SetAdmin","inputs":[{"type":"address","name":"admin","indexed":false}],"anonymous":false},{"type":"constructor","stateMutability":"nonpayable","outputs":[],"inputs":[{"type":"string","name":"_name"},{"type":"string","name":"_symbol"},{"type":"uint256","name":"_decimals"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"update_mining_parameters","inputs":[],"gas":148730},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":""}],"name":"start_epoch_time_write","inputs":[],"gas":149582},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":""}],"name":"future_epoch_time_write","inputs":[],"gas":149785},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":""}],"name":"available_supply","inputs":[],"gas":3928},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":""}],"name":"mintable_in_timeframe","inputs":[{"type":"uint256","name":"start"},{"type":"uint256","name":"end"}],"gas":2197051},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"set_minter","inputs":[{"type":"address","name":"_minter"}],"gas":38669},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"set_admin","inputs":[{"type":"address","name":"_admin"}],"gas":37808},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":""}],"name":"totalSupply","inputs":[],"gas":1331},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":""}],"name":"allowance","inputs":[{"type":"address","name":"_owner"},{"type":"address","name":"_spender"}],"gas":1791},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":""}],"name":"transfer","inputs":[{"type":"address","name":"_to"},{"type":"uint256","name":"_value"}],"gas":75110},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":""}],"name":"transferFrom","inputs":[{"type":"address","name":"_from"},{"type":"address","name":"_to"},{"type":"uint256","name":"_value"}],"gas":111465},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":""}],"name":"approve","inputs":[{"type":"address","name":"_spender"},{"type":"uint256","name":"_value"}],"gas":39259},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":""}],"name":"mint","inputs":[{"type":"address","name":"_to"},{"type":"uint256","name":"_value"}],"gas":228067},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":""}],"name":"burn","inputs":[{"type":"uint256","name":"_value"}],"gas":74909},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"set_name","inputs":[{"type":"string","name":"_name"},{"type":"string","name":"_symbol"}],"gas":178147},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":""}],"name":"name","inputs":[],"gas":7973},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":""}],"name":"symbol","inputs":[],"gas":7026},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":""}],"name":"decimals","inputs":[],"gas":1631},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":""}],"name":"balanceOf","inputs":[{"type":"address","name":"arg0"}],"gas":1876},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":""}],"name":"minter","inputs":[],"gas":1691},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":""}],"name":"admin","inputs":[],"gas":1721},{"type":"function","stateMutability":"view","outputs":[{"type":"int128","name":""}],"name":"mining_epoch","inputs":[],"gas":1751},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":""}],"name":"start_epoch_time","inputs":[],"gas":1781},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":""}],"name":"rate","inputs":[],"gas":1811}]
Contract Creation Code
0x6060611189610140396060602061118960c03960c051611189016101a0396040602061118960c03960c05160040135111561003957600080fd5b6040602060206111890160c03960c05161118901610220396020602060206111890160c03960c05160040135111561007057600080fd5b632756cd00604e610180511061008557600080fd5b61018051600a0a80820282158284830414176100a057600080fd5b80905090509050610280526101a080600060c052602060c020602082510161012060006003818352015b826101205160200211156100dd576100ff565b61012051602002850151610120518501555b81516001018083528114156100ca575b50505050505061022080600160c052602060c020602082510161012060006002818352015b8261012051602002111561013757610159565b61012051602002850151610120518501555b8151600101808352811415610124575b505050505050610180516002556102805160033360e05260c052604060c020556102805160055533600755610280516102a0523360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60206102a0a34260008181830110156101c857600080fd5b808201905090506301e13380808210156101e157600080fd5b808203905090506009557fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6008556000600a5561028051600b5561117156341561000a57600080fd5b600436101561001857610f4b565b600035601c52600015610171575b61014052600a5461016052600b5461018052600980546301e1338081818301101561005057600080fd5b808201905090508155506008805460018082018080600081121561007057195b607f1c1561007d57600080fd5b9050905090508155506101605115156100a25767435456d57d5aa3a761016052610128565b6101808051610160516301e1338080820282158284830414176100c457600080fd5b809050905090508181830110156100da57600080fd5b8082019050905081525061018051600b5561016051670de0b6b3a7640000808202821582848304141761010c57600080fd5b8090509050905067193b7abb01cd174680820490509050610160525b61016051600a55426101a052610160516101c052610180516101e0527f27e46362a1e6129b6dd539c984ce739291a97128dfcaeca1255e8ac83abd944160606101a0a161014051565b63d43b40fa60005114156101b7576009546301e1338081818301101561019657600080fd5b808201905090504210156101a957600080fd5b60065801610026565b600050005b63adc4cf4360005114156102285760095461014052610140516301e133808181830110156101e457600080fd5b8082019050905042101515610218576101405160065801610026565b6101405260005060095460005260206000f350610226565b6101405160005260206000f3505b005b63b26b238e60005114156102cf5760095461014052610140516301e1338081818301101561025557600080fd5b80820190509050421015156102a4576101405160065801610026565b610140526000506009546301e1338081818301101561028f57600080fd5b8082019050905060005260206000f3506102cd565b610140516301e133808181830110156102bc57600080fd5b8082019050905060005260206000f3505b005b600015610338575b61014052600b5442600954808210156102ef57600080fd5b80820390509050600a54808202821582848304141761030d57600080fd5b8090509050905081818301101561032357600080fd5b80820190509050600052600051610140515650005b6324f92a25600051141561036257600658016102d7565b610140526101405160005260206000f350005b63d725a9ca600051141561060f57602435600435111561038157600080fd5b60006101405260095461016052600a5461018052610160516301e133808181830110156103ad57600080fd5b80820190509050602435111561041d5761016080516301e133808181830110156103d657600080fd5b8082019050905081525061018051670de0b6b3a7640000808202821582848304141761040157600080fd5b8090509050905067193b7abb01cd174680820490509050610180525b610160516301e1338081818301101561043557600080fd5b80820190509050602435111561044a57600080fd5b6101a060006103e7818352015b61016051602435101515610578576024356101c052610160516301e1338081818301101561048457600080fd5b808201905090506101c05111156104b957610160516301e133808181830110156104ad57600080fd5b808201905090506101c0525b6004356101e052610160516301e133808181830110156104d857600080fd5b808201905090506101e0511015156104f3576105fe5661050b565b610160516101e051101561050a57610160516101e0525b5b6101408051610180516101c0516101e0518082101561052957600080fd5b80820390509050808202821582848304141761054457600080fd5b8090509050905081818301101561055a57600080fd5b8082019050905081525061016051600435101515610577576105fe565b5b61016080516301e133808082101561058f57600080fd5b808203905090508152506101805167193b7abb01cd174680820282158284830414176105ba57600080fd5b80905090509050670de0b6b3a7640000808204905090506101805267435456d57d5aa3a76101805111156105ed57600080fd5b5b8151600101808352811415610457575b50506101405160005260206000f350005b631652e9fc600051141561067e5760043560a01c1561062d57600080fd5b600754331461063b57600080fd5b6006541561064857600080fd5b600435600655600435610140527fcec52196e972044edde8689a1b608e459c5946b7f3e5c8cd3d6d8e126d422e1c6020610140a1005b63e9333fab60005114156106e05760043560a01c1561069c57600080fd5b60075433146106aa57600080fd5b600435600755600435610140527f5a272403b402d892977df56625f4164ccaf70ca3863991c43ecfe76a6905b0a16020610140a1005b6318160ddd60005114156106fc5760055460005260206000f350005b63dd62ed3e60005114156107545760043560a01c1561071a57600080fd5b60243560a01c1561072a57600080fd5b600460043560e05260c052604060c02060243560e05260c052604060c0205460005260206000f350005b63a9059cbb60005114156108185760043560a01c1561077257600080fd5b60006004351861078157600080fd5b60033360e05260c052604060c0208054602435808210156107a157600080fd5b80820390509050815550600360043560e05260c052604060c02080546024358181830110156107cf57600080fd5b8082019050905081555060243561014052600435337fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020610140a3600160005260206000f350005b6323b872dd60005114156109285760043560a01c1561083657600080fd5b60243560a01c1561084657600080fd5b60006024351861085557600080fd5b600360043560e05260c052604060c02080546044358082101561087757600080fd5b80820390509050815550600360243560e05260c052604060c02080546044358181830110156108a557600080fd5b80820190509050815550600460043560e05260c052604060c0203360e05260c052604060c0208054604435808210156108dd57600080fd5b80820390509050815550604435610140526024356004357fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020610140a3600160005260206000f350005b63095ea7b360005114156109de5760043560a01c1561094657600080fd5b6024351515610956576001610975565b60043360e05260c052604060c02060043560e05260c052604060c02054155b5b61097f57600080fd5b60243560043360e05260c052604060c02060043560e05260c052604060c0205560243561014052600435337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9256020610140a3600160005260206000f350005b6340c10f196000511415610b095760043560a01c156109fc57600080fd5b6006543314610a0a57600080fd5b600060043518610a1957600080fd5b6009546301e13380818183011015610a3057600080fd5b8082019050905042101515610a4c5760065801610026565b6000505b600554602435818183011015610a6157600080fd5b808201905090506101405261014051600658016102d7565b610160526101405261016051610140511115610a9457600080fd5b61014051600555600360043560e05260c052604060c0208054602435818183011015610abf57600080fd5b808201905090508155506024356101605260043560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020610160a3600160005260206000f350005b6342966c686000511415610b9d5760033360e05260c052604060c020805460043580821015610b3757600080fd5b808203905090508155506005805460043580821015610b5557600080fd5b80820390509050815550600435610140526000337fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020610140a3600160005260206000f350005b63e1430e066000511415610d16576060600435600401610140376040600435600401351115610bcb57600080fd5b60406024356004016101c0376020602435600401351115610beb57600080fd5b60075433141515610c60576308c379a0610220526020610240526024610260527f4f6e6c792061646d696e20697320616c6c6f77656420746f206368616e676520610280527f6e616d65000000000000000000000000000000000000000000000000000000006102a05261026050608461023cfd5b61014080600060c052602060c020602082510161012060006003818352015b82610120516020021115610c9257610cb4565b61012051602002850151610120518501555b8151600101808352811415610c7f575b5050505050506101c080600160c052602060c020602082510161012060006002818352015b82610120516020021115610cec57610d0e565b61012051602002850151610120518501555b8151600101808352811415610cd9575b505050505050005b6306fdde036000511415610dbf5760008060c052602060c020610180602082540161012060006003818352015b82610120516020021115610d5657610d78565b61012051850154610120516020028501525b8151600101808352811415610d43575b50505050505061018051806101a001818260206001820306601f82010390500336823750506020610160526040610180510160206001820306601f8201039050610160f350005b6395d89b416000511415610e685760018060c052602060c020610180602082540161012060006002818352015b82610120516020021115610dff57610e21565b61012051850154610120516020028501525b8151600101808352811415610dec575b50505050505061018051806101a001818260206001820306601f82010390500336823750506020610160526040610180510160206001820306601f8201039050610160f350005b63313ce5676000511415610e845760025460005260206000f350005b6370a082316000511415610ebe5760043560a01c15610ea257600080fd5b600360043560e05260c052604060c0205460005260206000f350005b63075461726000511415610eda5760065460005260206000f350005b63f851a4406000511415610ef65760075460005260206000f350005b63f9a40bf66000511415610f125760085460005260206000f350005b637375be266000511415610f2e5760095460005260206000f350005b632c4e722e6000511415610f4a57600a5460005260206000f350005b5b60006000fd5b61022061117103610220600039610220611171036000f3000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000104d6f626975732044414f20546f6b656e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d4f424900000000000000000000000000000000000000000000000000000000
Deployed ByteCode
0x341561000a57600080fd5b600436101561001857610f4b565b600035601c52600015610171575b61014052600a5461016052600b5461018052600980546301e1338081818301101561005057600080fd5b808201905090508155506008805460018082018080600081121561007057195b607f1c1561007d57600080fd5b9050905090508155506101605115156100a25767435456d57d5aa3a761016052610128565b6101808051610160516301e1338080820282158284830414176100c457600080fd5b809050905090508181830110156100da57600080fd5b8082019050905081525061018051600b5561016051670de0b6b3a7640000808202821582848304141761010c57600080fd5b8090509050905067193b7abb01cd174680820490509050610160525b61016051600a55426101a052610160516101c052610180516101e0527f27e46362a1e6129b6dd539c984ce739291a97128dfcaeca1255e8ac83abd944160606101a0a161014051565b63d43b40fa60005114156101b7576009546301e1338081818301101561019657600080fd5b808201905090504210156101a957600080fd5b60065801610026565b600050005b63adc4cf4360005114156102285760095461014052610140516301e133808181830110156101e457600080fd5b8082019050905042101515610218576101405160065801610026565b6101405260005060095460005260206000f350610226565b6101405160005260206000f3505b005b63b26b238e60005114156102cf5760095461014052610140516301e1338081818301101561025557600080fd5b80820190509050421015156102a4576101405160065801610026565b610140526000506009546301e1338081818301101561028f57600080fd5b8082019050905060005260206000f3506102cd565b610140516301e133808181830110156102bc57600080fd5b8082019050905060005260206000f3505b005b600015610338575b61014052600b5442600954808210156102ef57600080fd5b80820390509050600a54808202821582848304141761030d57600080fd5b8090509050905081818301101561032357600080fd5b80820190509050600052600051610140515650005b6324f92a25600051141561036257600658016102d7565b610140526101405160005260206000f350005b63d725a9ca600051141561060f57602435600435111561038157600080fd5b60006101405260095461016052600a5461018052610160516301e133808181830110156103ad57600080fd5b80820190509050602435111561041d5761016080516301e133808181830110156103d657600080fd5b8082019050905081525061018051670de0b6b3a7640000808202821582848304141761040157600080fd5b8090509050905067193b7abb01cd174680820490509050610180525b610160516301e1338081818301101561043557600080fd5b80820190509050602435111561044a57600080fd5b6101a060006103e7818352015b61016051602435101515610578576024356101c052610160516301e1338081818301101561048457600080fd5b808201905090506101c05111156104b957610160516301e133808181830110156104ad57600080fd5b808201905090506101c0525b6004356101e052610160516301e133808181830110156104d857600080fd5b808201905090506101e0511015156104f3576105fe5661050b565b610160516101e051101561050a57610160516101e0525b5b6101408051610180516101c0516101e0518082101561052957600080fd5b80820390509050808202821582848304141761054457600080fd5b8090509050905081818301101561055a57600080fd5b8082019050905081525061016051600435101515610577576105fe565b5b61016080516301e133808082101561058f57600080fd5b808203905090508152506101805167193b7abb01cd174680820282158284830414176105ba57600080fd5b80905090509050670de0b6b3a7640000808204905090506101805267435456d57d5aa3a76101805111156105ed57600080fd5b5b8151600101808352811415610457575b50506101405160005260206000f350005b631652e9fc600051141561067e5760043560a01c1561062d57600080fd5b600754331461063b57600080fd5b6006541561064857600080fd5b600435600655600435610140527fcec52196e972044edde8689a1b608e459c5946b7f3e5c8cd3d6d8e126d422e1c6020610140a1005b63e9333fab60005114156106e05760043560a01c1561069c57600080fd5b60075433146106aa57600080fd5b600435600755600435610140527f5a272403b402d892977df56625f4164ccaf70ca3863991c43ecfe76a6905b0a16020610140a1005b6318160ddd60005114156106fc5760055460005260206000f350005b63dd62ed3e60005114156107545760043560a01c1561071a57600080fd5b60243560a01c1561072a57600080fd5b600460043560e05260c052604060c02060243560e05260c052604060c0205460005260206000f350005b63a9059cbb60005114156108185760043560a01c1561077257600080fd5b60006004351861078157600080fd5b60033360e05260c052604060c0208054602435808210156107a157600080fd5b80820390509050815550600360043560e05260c052604060c02080546024358181830110156107cf57600080fd5b8082019050905081555060243561014052600435337fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020610140a3600160005260206000f350005b6323b872dd60005114156109285760043560a01c1561083657600080fd5b60243560a01c1561084657600080fd5b60006024351861085557600080fd5b600360043560e05260c052604060c02080546044358082101561087757600080fd5b80820390509050815550600360243560e05260c052604060c02080546044358181830110156108a557600080fd5b80820190509050815550600460043560e05260c052604060c0203360e05260c052604060c0208054604435808210156108dd57600080fd5b80820390509050815550604435610140526024356004357fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020610140a3600160005260206000f350005b63095ea7b360005114156109de5760043560a01c1561094657600080fd5b6024351515610956576001610975565b60043360e05260c052604060c02060043560e05260c052604060c02054155b5b61097f57600080fd5b60243560043360e05260c052604060c02060043560e05260c052604060c0205560243561014052600435337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9256020610140a3600160005260206000f350005b6340c10f196000511415610b095760043560a01c156109fc57600080fd5b6006543314610a0a57600080fd5b600060043518610a1957600080fd5b6009546301e13380818183011015610a3057600080fd5b8082019050905042101515610a4c5760065801610026565b6000505b600554602435818183011015610a6157600080fd5b808201905090506101405261014051600658016102d7565b610160526101405261016051610140511115610a9457600080fd5b61014051600555600360043560e05260c052604060c0208054602435818183011015610abf57600080fd5b808201905090508155506024356101605260043560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020610160a3600160005260206000f350005b6342966c686000511415610b9d5760033360e05260c052604060c020805460043580821015610b3757600080fd5b808203905090508155506005805460043580821015610b5557600080fd5b80820390509050815550600435610140526000337fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020610140a3600160005260206000f350005b63e1430e066000511415610d16576060600435600401610140376040600435600401351115610bcb57600080fd5b60406024356004016101c0376020602435600401351115610beb57600080fd5b60075433141515610c60576308c379a0610220526020610240526024610260527f4f6e6c792061646d696e20697320616c6c6f77656420746f206368616e676520610280527f6e616d65000000000000000000000000000000000000000000000000000000006102a05261026050608461023cfd5b61014080600060c052602060c020602082510161012060006003818352015b82610120516020021115610c9257610cb4565b61012051602002850151610120518501555b8151600101808352811415610c7f575b5050505050506101c080600160c052602060c020602082510161012060006002818352015b82610120516020021115610cec57610d0e565b61012051602002850151610120518501555b8151600101808352811415610cd9575b505050505050005b6306fdde036000511415610dbf5760008060c052602060c020610180602082540161012060006003818352015b82610120516020021115610d5657610d78565b61012051850154610120516020028501525b8151600101808352811415610d43575b50505050505061018051806101a001818260206001820306601f82010390500336823750506020610160526040610180510160206001820306601f8201039050610160f350005b6395d89b416000511415610e685760018060c052602060c020610180602082540161012060006002818352015b82610120516020021115610dff57610e21565b61012051850154610120516020028501525b8151600101808352811415610dec575b50505050505061018051806101a001818260206001820306601f82010390500336823750506020610160526040610180510160206001820306601f8201039050610160f350005b63313ce5676000511415610e845760025460005260206000f350005b6370a082316000511415610ebe5760043560a01c15610ea257600080fd5b600360043560e05260c052604060c0205460005260206000f350005b63075461726000511415610eda5760065460005260206000f350005b63f851a4406000511415610ef65760075460005260206000f350005b63f9a40bf66000511415610f125760085460005260206000f350005b637375be266000511415610f2e5760095460005260206000f350005b632c4e722e6000511415610f4a57600a5460005260206000f350005b5b60006000fd