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
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