Contract Address Details

0x73a210637f6F6B7005512677Ba6B3C96bb4AA44B

Token
Mobius DAO Token (MOBI)
Creator
0x6c0d6f–b55850 at 0xafb650–a3c83f
Balance
0 CELO ( )
Tokens
Fetching tokens...
Transactions
Transfers
Gas Used
Last Balance Update
14615797
Contract name:
ERC20MOBI




Optimization enabled
N/A
Compiler version
v0.2.8




Verified at
2022-02-23 18: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}]
            

Deployed ByteCode

0x341561000a57600080fd5b600436101561001857610f4b565b600035601c52600015610171575b61014052600a5461016052600b5461018052600980546301e1338081818301101561005057600080fd5b808201905090508155506008805460018082018080600081121561007057195b607f1c1561007d57600080fd5b9050905090508155506101605115156100a25767435456d57d5aa3a761016052610128565b6101808051610160516301e1338080820282158284830414176100c457600080fd5b809050905090508181830110156100da57600080fd5b8082019050905081525061018051600b5561016051670de0b6b3a7640000808202821582848304141761010c57600080fd5b8090509050905067193b7abb01cd174680820490509050610160525b61016051600a55426101a052610160516101c052610180516101e0527f27e46362a1e6129b6dd539c984ce739291a97128dfcaeca1255e8ac83abd944160606101a0a161014051565b63d43b40fa60005114156101b7576009546301e1338081818301101561019657600080fd5b808201905090504210156101a957600080fd5b60065801610026565b600050005b63adc4cf4360005114156102285760095461014052610140516301e133808181830110156101e457600080fd5b8082019050905042101515610218576101405160065801610026565b6101405260005060095460005260206000f350610226565b6101405160005260206000f3505b005b63b26b238e60005114156102cf5760095461014052610140516301e1338081818301101561025557600080fd5b80820190509050421015156102a4576101405160065801610026565b610140526000506009546301e1338081818301101561028f57600080fd5b8082019050905060005260206000f3506102cd565b610140516301e133808181830110156102bc57600080fd5b8082019050905060005260206000f3505b005b600015610338575b61014052600b5442600954808210156102ef57600080fd5b80820390509050600a54808202821582848304141761030d57600080fd5b8090509050905081818301101561032357600080fd5b80820190509050600052600051610140515650005b6324f92a25600051141561036257600658016102d7565b610140526101405160005260206000f350005b63d725a9ca600051141561060f57602435600435111561038157600080fd5b60006101405260095461016052600a5461018052610160516301e133808181830110156103ad57600080fd5b80820190509050602435111561041d5761016080516301e133808181830110156103d657600080fd5b8082019050905081525061018051670de0b6b3a7640000808202821582848304141761040157600080fd5b8090509050905067193b7abb01cd174680820490509050610180525b610160516301e1338081818301101561043557600080fd5b80820190509050602435111561044a57600080fd5b6101a060006103e7818352015b61016051602435101515610578576024356101c052610160516301e1338081818301101561048457600080fd5b808201905090506101c05111156104b957610160516301e133808181830110156104ad57600080fd5b808201905090506101c0525b6004356101e052610160516301e133808181830110156104d857600080fd5b808201905090506101e0511015156104f3576105fe5661050b565b610160516101e051101561050a57610160516101e0525b5b6101408051610180516101c0516101e0518082101561052957600080fd5b80820390509050808202821582848304141761054457600080fd5b8090509050905081818301101561055a57600080fd5b8082019050905081525061016051600435101515610577576105fe565b5b61016080516301e133808082101561058f57600080fd5b808203905090508152506101805167193b7abb01cd174680820282158284830414176105ba57600080fd5b80905090509050670de0b6b3a7640000808204905090506101805267435456d57d5aa3a76101805111156105ed57600080fd5b5b8151600101808352811415610457575b50506101405160005260206000f350005b631652e9fc600051141561067e5760043560a01c1561062d57600080fd5b600754331461063b57600080fd5b6006541561064857600080fd5b600435600655600435610140527fcec52196e972044edde8689a1b608e459c5946b7f3e5c8cd3d6d8e126d422e1c6020610140a1005b63e9333fab60005114156106e05760043560a01c1561069c57600080fd5b60075433146106aa57600080fd5b600435600755600435610140527f5a272403b402d892977df56625f4164ccaf70ca3863991c43ecfe76a6905b0a16020610140a1005b6318160ddd60005114156106fc5760055460005260206000f350005b63dd62ed3e60005114156107545760043560a01c1561071a57600080fd5b60243560a01c1561072a57600080fd5b600460043560e05260c052604060c02060243560e05260c052604060c0205460005260206000f350005b63a9059cbb60005114156108185760043560a01c1561077257600080fd5b60006004351861078157600080fd5b60033360e05260c052604060c0208054602435808210156107a157600080fd5b80820390509050815550600360043560e05260c052604060c02080546024358181830110156107cf57600080fd5b8082019050905081555060243561014052600435337fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020610140a3600160005260206000f350005b6323b872dd60005114156109285760043560a01c1561083657600080fd5b60243560a01c1561084657600080fd5b60006024351861085557600080fd5b600360043560e05260c052604060c02080546044358082101561087757600080fd5b80820390509050815550600360243560e05260c052604060c02080546044358181830110156108a557600080fd5b80820190509050815550600460043560e05260c052604060c0203360e05260c052604060c0208054604435808210156108dd57600080fd5b80820390509050815550604435610140526024356004357fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020610140a3600160005260206000f350005b63095ea7b360005114156109de5760043560a01c1561094657600080fd5b6024351515610956576001610975565b60043360e05260c052604060c02060043560e05260c052604060c02054155b5b61097f57600080fd5b60243560043360e05260c052604060c02060043560e05260c052604060c0205560243561014052600435337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9256020610140a3600160005260206000f350005b6340c10f196000511415610b095760043560a01c156109fc57600080fd5b6006543314610a0a57600080fd5b600060043518610a1957600080fd5b6009546301e13380818183011015610a3057600080fd5b8082019050905042101515610a4c5760065801610026565b6000505b600554602435818183011015610a6157600080fd5b808201905090506101405261014051600658016102d7565b610160526101405261016051610140511115610a9457600080fd5b61014051600555600360043560e05260c052604060c0208054602435818183011015610abf57600080fd5b808201905090508155506024356101605260043560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020610160a3600160005260206000f350005b6342966c686000511415610b9d5760033360e05260c052604060c020805460043580821015610b3757600080fd5b808203905090508155506005805460043580821015610b5557600080fd5b80820390509050815550600435610140526000337fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020610140a3600160005260206000f350005b63e1430e066000511415610d16576060600435600401610140376040600435600401351115610bcb57600080fd5b60406024356004016101c0376020602435600401351115610beb57600080fd5b60075433141515610c60576308c379a0610220526020610240526024610260527f4f6e6c792061646d696e20697320616c6c6f77656420746f206368616e676520610280527f6e616d65000000000000000000000000000000000000000000000000000000006102a05261026050608461023cfd5b61014080600060c052602060c020602082510161012060006003818352015b82610120516020021115610c9257610cb4565b61012051602002850151610120518501555b8151600101808352811415610c7f575b5050505050506101c080600160c052602060c020602082510161012060006002818352015b82610120516020021115610cec57610d0e565b61012051602002850151610120518501555b8151600101808352811415610cd9575b505050505050005b6306fdde036000511415610dbf5760008060c052602060c020610180602082540161012060006003818352015b82610120516020021115610d5657610d78565b61012051850154610120516020028501525b8151600101808352811415610d43575b50505050505061018051806101a001818260206001820306601f82010390500336823750506020610160526040610180510160206001820306601f8201039050610160f350005b6395d89b416000511415610e685760018060c052602060c020610180602082540161012060006002818352015b82610120516020021115610dff57610e21565b61012051850154610120516020028501525b8151600101808352811415610dec575b50505050505061018051806101a001818260206001820306601f82010390500336823750506020610160526040610180510160206001820306601f8201039050610160f350005b63313ce5676000511415610e845760025460005260206000f350005b6370a082316000511415610ebe5760043560a01c15610ea257600080fd5b600360043560e05260c052604060c0205460005260206000f350005b63075461726000511415610eda5760065460005260206000f350005b63f851a4406000511415610ef65760075460005260206000f350005b63f9a40bf66000511415610f125760085460005260206000f350005b637375be266000511415610f2e5760095460005260206000f350005b632c4e722e6000511415610f4a57600a5460005260206000f350005b5b60006000fd