ETH Price: $1,975.51 (+0.74%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

More Info

Private Name Tags

Multichain Info

No addresses found
Amount:Between 1-10k
Reset Filter

Transaction Hash
Method
Block
From
To

There are no matching entries

Please try again later

Amount:Between 1-10k
Reset Filter

Advanced mode:
Parent Transaction Hash Method Block
From
To

There are no matching entries

Update your filters to view other transactions

View All Internal Transactions
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0x9fC47920...63d98F0A9
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
Gauge Controller

Compiler Version
vyper:0.4.3

Optimization Enabled:
Yes

Other Settings:
default evmVersion, None license

Contract Source Code (Vyper Json-Input format)

File 1 of 2 : GaugeController.vy
# @version 0.4.3
"""
@title Gauge Controller
@author Yield Basis
@license GNU Affero General Public License v3.0
@notice Controls liquidity gauges and the issuance of coins through the gauges
"""
from snekmate.auth import ownable


initializes: ownable


exports: (
    ownable.transfer_ownership,
    ownable.owner
)


# All future times are rounded by week
WEEK: constant(uint256) = 7 * 86400

# Cannot change weight votes more often than once in 10 days
WEIGHT_VOTE_DELAY: constant(uint256) = 10 * 86400


struct Point:
    bias: uint256
    slope: uint256

struct VotedSlope:
    slope: uint256
    bias: uint256  # Only used if slope == 0
    power: uint256
    end: uint256


interface VotingEscrow:
    def get_last_user_slope(addr: address) -> int256: view
    def get_last_user_point(addr: address) -> Point: view
    def locked__end(addr: address) -> uint256: view
    def transfer_clearance_checker() -> address: view

interface Gauge:
    def get_adjustment() -> uint256: view

interface GovernanceToken:
    def emit(owner: address, rate_factor: uint256) -> uint256: nonpayable
    def preview_emissions(t: uint256, rate_factor: uint256) -> uint256: view
    def transfer(_to: address, _amount: uint256) -> bool: nonpayable


event VoteForGauge:
    time: uint256
    user: address
    gauge_addr: address
    weight: uint256

event NewGauge:
    addr: address

event SetKilled:
    gauge: address
    is_killed: bool


TOKEN: public(immutable(GovernanceToken))
VOTING_ESCROW: public(immutable(VotingEscrow))

# Gauge parameters
# All numbers are "fixed point" on the basis of 1e18
n_gauges: public(uint256)

# Needed for enumeration
gauges: public(address[1000000000])
is_killed: public(HashMap[address, bool])

vote_user_slopes: public(HashMap[address, HashMap[address, VotedSlope]])  # user -> gauge_addr -> VotedSlope
vote_user_power: public(HashMap[address, uint256])  # Total vote power used by user
last_user_vote: public(HashMap[address, HashMap[address, uint256]])  # Last user vote's timestamp for each gauge address

# Past and scheduled points for gauge weight, sum of weights per type, total weight
# Point is for bias+slope
# changes_* are for changes in slope
# time_* are for the last change timestamp
# timestamps for changes_ are rounded to whole weeks

# Variables for raw weights of gauges
point_weight: public(HashMap[address, Point])  # gauge_addr -> Point
changes_weight: HashMap[address, HashMap[uint256, uint256]]  # gauge_addr -> weektime -> slope
time_weight: public(HashMap[address, uint256])  # gauge_addr -> last time

gauge_weight: public(HashMap[address, uint256])
gauge_weight_sum: public(uint256)
adjusted_gauge_weight: public(HashMap[address, uint256])
adjusted_gauge_weight_sum: public(uint256)

specific_emissions: public(uint256)
specific_emissions_per_gauge: public(HashMap[address, uint256])
weighted_emissions_per_gauge: public(HashMap[address, uint256])
sent_emissions_per_gauge: public(HashMap[address, uint256])


@deploy
def __init__(token: GovernanceToken, voting_escrow: VotingEscrow):
    """
    @notice Contract constructor
    @param token `ERC20CRV` contract address
    @param voting_escrow `VotingEscrow` contract address
    """
    ownable.__init__()

    assert token.address != empty(address)
    assert voting_escrow.address != empty(address)

    TOKEN = token
    VOTING_ESCROW = voting_escrow


@internal
@view
def _get_weight(gauge: address) -> Point:
    """
    @notice Fill historic gauge weights week-over-week for missed checkins
            and return the total for the future week
    @param gauge Address of the gauge
    @return Gauge weight
    """
    t: uint256 = self.time_weight[gauge]
    current_week: uint256 = block.timestamp // WEEK * WEEK
    dt: uint256 = 0
    if t > 0:
        pt: Point = self.point_weight[gauge]
        for i: uint256 in range(500):
            if t >= current_week:
                dt = block.timestamp - t
                if dt == 0:
                    break
            else:
                dt = (t + WEEK) // WEEK * WEEK - t
            t += dt
            pt.bias -= min(pt.slope * dt, pt.bias)  # Correctly handles even slope=0
            pt.slope -= min(self.changes_weight[gauge][t], pt.slope)  # Value from non-week-boundary is 0
            if pt.bias == 0:
                pt.slope = 0
        return pt
    else:
        return empty(Point)


@internal
def _checkpoint_gauge(gauge: address) -> Point:
    assert self.time_weight[gauge] > 0, "Gauge not alive"

    adjustment: uint256 = min(staticcall Gauge(gauge).get_adjustment(), 10**18)
    t: uint256 = self.time_weight[gauge]

    w: uint256 = self.gauge_weight[gauge]
    aw: uint256 = self.adjusted_gauge_weight[gauge]
    w_sum: uint256 = self.gauge_weight_sum
    aw_sum: uint256 = self.adjusted_gauge_weight_sum

    pt: Point = self._get_weight(gauge)
    self.point_weight[gauge] = pt
    w_new: uint256 = pt.bias
    aw_new: uint256 = w_new * adjustment // 10**18

    self.gauge_weight[gauge] = w_new
    self.gauge_weight_sum = w_sum + w_new - w
    self.adjusted_gauge_weight[gauge] = aw_new
    self.adjusted_gauge_weight_sum = aw_sum + aw_new - aw

    d_emissions: uint256 = extcall TOKEN.emit(self, unsafe_div(aw_sum * 10**18, w_sum))
    self.time_weight[gauge] = block.timestamp

    specific_emissions: uint256 = self.specific_emissions + unsafe_div(d_emissions * 10**18, aw_sum)
    if d_emissions > 0:
        self.specific_emissions = specific_emissions

    if block.timestamp > t:  # Guaranteed to have no new emissions if same time
        self.weighted_emissions_per_gauge[gauge] += (specific_emissions - self.specific_emissions_per_gauge[gauge]) * aw // 10**18
        self.specific_emissions_per_gauge[gauge] = specific_emissions

    return pt


@external
def add_gauge(gauge: address):
    """
    @notice Add gauge `gauge`
    @param gauge Gauge address
    """
    ownable._check_owner()
    assert self.time_weight[gauge] == 0, "Gauge already added"

    n: uint256 = self.n_gauges
    self.n_gauges = n + 1
    self.gauges[n] = gauge
    self.time_weight[gauge] = block.timestamp
    self.specific_emissions_per_gauge[gauge] = self.specific_emissions

    log NewGauge(addr=gauge)


@external
def vote_for_gauge_weights(_gauge_addrs: DynArray[address, 50], _user_weights: DynArray[uint256, 50]):
    """
    @notice Allocate voting power for changing pool weights
    @param _gauge_addrs Gauges which `msg.sender` votes for
    @param _user_weights Weights for a gauge in bps (units of 0.01%). Minimal is 0.01%. Ignored if 0
    """
    # Check if transfer_clearance_checker is set to GC
    assert staticcall VOTING_ESCROW.transfer_clearance_checker() == self, "Vote checker not set"

    n: uint256 = len(_gauge_addrs)
    assert len(_user_weights) == n, "Mismatch in lengths"
    pt: Point = staticcall VOTING_ESCROW.get_last_user_point(msg.sender)
    slope: uint256 = pt.slope
    bias: uint256 = pt.bias  # <- we only use it if locked until max_value(uint256)
    lock_end: uint256 = staticcall VOTING_ESCROW.locked__end(msg.sender)
    assert lock_end > block.timestamp, "Expired"

    power_used: uint256 = self.vote_user_power[msg.sender]

    for i: uint256 in range(50):
        if i >= n:
            break
        _user_weight: uint256 = _user_weights[i]
        _gauge_addr: address = _gauge_addrs[i]
        assert _user_weight <= 10000, "Weight too large"
        if _user_weight != 0:
            assert not self.is_killed[_gauge_addr], "Killed"
        assert self.time_weight[_gauge_addr] > 0, "Gauge not added"
        assert block.timestamp >= self.last_user_vote[msg.sender][_gauge_addr] + WEIGHT_VOTE_DELAY, "Cannot vote so often"

        # Prepare slopes and biases in memory
        old_slope: VotedSlope = self.vote_user_slopes[msg.sender][_gauge_addr]
        old_bias: uint256 = 0
        if old_slope.end == max_value(uint256):
            old_bias = old_slope.bias
        else:
            old_dt: uint256 = max(old_slope.end, block.timestamp) - block.timestamp
            old_bias = old_slope.slope * old_dt
        new_slope: VotedSlope = VotedSlope(
            slope = slope * _user_weight // 10000,
            bias = 0,
            power = _user_weight,
            end = lock_end
        )
        new_bias: uint256 = 0
        if lock_end == max_value(uint256):
            new_bias = bias * _user_weight // 10000
        else:
            new_bias = new_slope.slope * (lock_end - block.timestamp)  # dev: raises when expired
        new_slope.bias = new_bias

        power_used = power_used + new_slope.power - old_slope.power

        pt = self._checkpoint_gauge(_gauge_addr)  # Contains old_weight_bias and old_weight_slope

        ## Remove old and schedule new slope changes
        # Remove slope changes for old slopes
        # Schedule recording of initial slope for next_time
        self.point_weight[_gauge_addr].bias = max(pt.bias + new_bias, old_bias) - old_bias
        if old_slope.end > block.timestamp:
            self.point_weight[_gauge_addr].slope = max(pt.slope + new_slope.slope, old_slope.slope) - old_slope.slope
        else:
            self.point_weight[_gauge_addr].slope += new_slope.slope
        if old_slope.end > block.timestamp:
            # Cancel old slope changes if they still didn't happen
            self.changes_weight[_gauge_addr][old_slope.end] -= old_slope.slope
        # Add slope changes for new slopes
        self.changes_weight[_gauge_addr][new_slope.end] += new_slope.slope

        self.vote_user_slopes[msg.sender][_gauge_addr] = new_slope

        # point_weight has changed, so we are doing another checkpoint to enact the vote
        self._checkpoint_gauge(_gauge_addr)

        # Record last action time
        self.last_user_vote[msg.sender][_gauge_addr] = block.timestamp

        log VoteForGauge(time=block.timestamp, user=msg.sender, gauge_addr=_gauge_addr, weight=_user_weight)

    # Check and update powers (weights) used
    assert power_used <= 10000, 'Used too much power'
    self.vote_user_power[msg.sender] = power_used


@external
@view
def get_gauge_weight(addr: address) -> uint256:
    """
    @notice Get current gauge weight
    @param addr Gauge address
    @return Gauge weight
    """
    return self._get_weight(addr).bias


@external
@view
def gauge_relative_weight(gauge: address) -> uint256:
    """
    @notice Get Gauge relative weight (not more than 1.0) normalized to 1e18
            (e.g. 1.0 == 1e18). Inflation which will be received by it is
            inflation_rate * relative_weight / 1e18
    @param gauge Gauge address
    @return Value of relative weight normalized to 1e18
    """
    return unsafe_div(self.adjusted_gauge_weight[gauge] * 10**18, self.adjusted_gauge_weight_sum)


@external
@view
def ve_transfer_allowed(user: address) -> bool:
    return self.vote_user_power[user] == 0


@external
def checkpoint(gauge: address):
    """
    @notice Checkpoint a gauge
    """
    self._checkpoint_gauge(gauge)


@external
@view
def preview_emissions(gauge: address, at_time: uint256) -> uint256:
    """
    @notice Checkpoint logic is re-done here without causing writes
    """
    if self.time_weight[gauge] == 0:
        return 0

    w: uint256 = self.gauge_weight[gauge]
    aw: uint256 = self.adjusted_gauge_weight[gauge]
    w_sum: uint256 = self.gauge_weight_sum
    aw_sum: uint256 = self.adjusted_gauge_weight_sum

    d_emissions: uint256 = 0
    if at_time > self.time_weight[gauge]:
        d_emissions = staticcall TOKEN.preview_emissions(at_time, unsafe_div(aw_sum * 10**18, w_sum))
    specific_emissions: uint256 = self.specific_emissions + unsafe_div(d_emissions * 10**18, aw_sum)
    weighted_emissions_per_gauge: uint256 = self.weighted_emissions_per_gauge[gauge] + (specific_emissions - self.specific_emissions_per_gauge[gauge]) * aw // 10**18

    return weighted_emissions_per_gauge - self.sent_emissions_per_gauge[gauge]


@external
def emit() -> uint256:
    self._checkpoint_gauge(msg.sender)
    emissions: uint256 = self.weighted_emissions_per_gauge[msg.sender]
    to_send: uint256 = emissions - self.sent_emissions_per_gauge[msg.sender]
    self.sent_emissions_per_gauge[msg.sender] = emissions
    if to_send > 0:
        extcall TOKEN.transfer(msg.sender, to_send)
    return to_send


@external
def set_killed(gauge: address, is_killed: bool):
    ownable._check_owner()
    assert self.time_weight[gauge] > 0, "Gauge not added"
    self.is_killed[gauge] = is_killed
    log SetKilled(gauge=gauge, is_killed=is_killed)

File 2 of 2 : ownable.vy
# pragma version ~=0.4.3
# pragma nonreentrancy off
"""
@title Owner-Based Access Control Functions
@custom:contract-name ownable
@license GNU Affero General Public License v3.0 only
@author pcaversaccio
@notice These functions can be used to implement a basic access
        control mechanism, where there is an account (an owner)
        that can be granted exclusive access to specific functions.
        By default, the owner account will be the one that deploys
        the contract. This can later be changed with `transfer_ownership`.
        An exemplary integration can be found in the ERC-20 implementation here:
        https://github.com/pcaversaccio/snekmate/blob/main/src/snekmate/tokens/erc20.vy.
        The implementation is inspired by OpenZeppelin's implementation here:
        https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol.
"""


# @dev Returns the address of the current owner.
# @notice If you declare a variable as `public`,
# Vyper automatically generates an `external`
# getter function for the variable.
owner: public(address)


# @dev Emitted when the ownership is transferred
# from `previous_owner` to `new_owner`.
event OwnershipTransferred:
    previous_owner: indexed(address)
    new_owner: indexed(address)


@deploy
@payable
def __init__():
    """
    @dev To omit the opcodes for checking the `msg.value`
         in the creation-time EVM bytecode, the constructor
         is declared as `payable`.
    @notice The `owner` role will be assigned to
            the `msg.sender`.
    """
    self._transfer_ownership(msg.sender)


@external
def transfer_ownership(new_owner: address):
    """
    @dev Transfers the ownership of the contract
         to a new account `new_owner`.
    @notice Note that this function can only be
            called by the current `owner`. Also,
            the `new_owner` cannot be the zero address.
    @param new_owner The 20-byte address of the new owner.
    """
    self._check_owner()
    assert new_owner != empty(address), "ownable: new owner is the zero address"
    self._transfer_ownership(new_owner)


@external
def renounce_ownership():
    """
    @dev Leaves the contract without an owner.
    @notice Renouncing ownership will leave the
            contract without an owner, thereby
            removing any functionality that is
            only available to the owner.
    """
    self._check_owner()
    self._transfer_ownership(empty(address))


@internal
def _check_owner():
    """
    @dev Throws if the sender is not the owner.
    """
    assert msg.sender == self.owner, "ownable: caller is not the owner"


@internal
def _transfer_ownership(new_owner: address):
    """
    @dev Transfers the ownership of the contract
         to a new account `new_owner`.
    @notice This is an `internal` function without
            access restriction.
    @param new_owner The 20-byte address of the new owner.
    """
    old_owner: address = self.owner
    self.owner = new_owner
    log OwnershipTransferred(previous_owner=old_owner, new_owner=new_owner)

Settings
{
  "outputSelection": {
    "contracts/dao/GaugeController.vy": [
      "evm.bytecode",
      "evm.deployedBytecode",
      "abi"
    ]
  },
  "search_paths": [
    ".venv/lib/pypy3.11/site-packages",
    "."
  ]
}

Contract Security Audit

Contract ABI

API
[{"anonymous":false,"inputs":[{"indexed":false,"name":"time","type":"uint256"},{"indexed":false,"name":"user","type":"address"},{"indexed":false,"name":"gauge_addr","type":"address"},{"indexed":false,"name":"weight","type":"uint256"}],"name":"VoteForGauge","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"addr","type":"address"}],"name":"NewGauge","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"gauge","type":"address"},{"indexed":false,"name":"is_killed","type":"bool"}],"name":"SetKilled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previous_owner","type":"address"},{"indexed":true,"name":"new_owner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"name":"new_owner","type":"address"}],"name":"transfer_ownership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"name":"gauge","type":"address"}],"name":"add_gauge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_gauge_addrs","type":"address[]"},{"name":"_user_weights","type":"uint256[]"}],"name":"vote_for_gauge_weights","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"addr","type":"address"}],"name":"get_gauge_weight","outputs":[{"name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"name":"gauge","type":"address"}],"name":"gauge_relative_weight","outputs":[{"name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"name":"user","type":"address"}],"name":"ve_transfer_allowed","outputs":[{"name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"name":"gauge","type":"address"}],"name":"checkpoint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"gauge","type":"address"},{"name":"at_time","type":"uint256"}],"name":"preview_emissions","outputs":[{"name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emit","outputs":[{"name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"gauge","type":"address"},{"name":"is_killed","type":"bool"}],"name":"set_killed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TOKEN","outputs":[{"name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VOTING_ESCROW","outputs":[{"name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"n_gauges","outputs":[{"name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"name":"arg0","type":"uint256"}],"name":"gauges","outputs":[{"name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"name":"arg0","type":"address"}],"name":"is_killed","outputs":[{"name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"name":"arg0","type":"address"},{"name":"arg1","type":"address"}],"name":"vote_user_slopes","outputs":[{"components":[{"name":"slope","type":"uint256"},{"name":"bias","type":"uint256"},{"name":"power","type":"uint256"},{"name":"end","type":"uint256"}],"name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"name":"arg0","type":"address"}],"name":"vote_user_power","outputs":[{"name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"name":"arg0","type":"address"},{"name":"arg1","type":"address"}],"name":"last_user_vote","outputs":[{"name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"name":"arg0","type":"address"}],"name":"point_weight","outputs":[{"components":[{"name":"bias","type":"uint256"},{"name":"slope","type":"uint256"}],"name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"name":"arg0","type":"address"}],"name":"time_weight","outputs":[{"name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"name":"arg0","type":"address"}],"name":"gauge_weight","outputs":[{"name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gauge_weight_sum","outputs":[{"name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"name":"arg0","type":"address"}],"name":"adjusted_gauge_weight","outputs":[{"name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"adjusted_gauge_weight_sum","outputs":[{"name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"specific_emissions","outputs":[{"name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"name":"arg0","type":"address"}],"name":"specific_emissions_per_gauge","outputs":[{"name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"name":"arg0","type":"address"}],"name":"weighted_emissions_per_gauge","outputs":[{"name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"name":"arg0","type":"address"}],"name":"sent_emissions_per_gauge","outputs":[{"name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"name":"token","type":"address"},{"name":"voting_escrow","type":"address"}],"outputs":[],"stateMutability":"nonpayable","type":"constructor"}]

0x611bce5150346100ae576020611c985f395f518060a01c6100ae576080526020611cb85f395f518060a01c6100ae5760a0526100396100a0565b608051156100ae5760a051156100ae57608051611bae5260a051611bce52611bae6100b261000039611bee610000f35b5f546060526040515f556040516060517f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f6080a3565b336040526100ac610069565b565b5f80fd5f3560e01c60026018820660011b611b7e01601e395f51565b63f0350c0481186100fa57602436103417611b7a576004358060a01c611b7a5761010052610044611579565b610100516100e9576020806101a0526026610120527f6f776e61626c653a206e6577206f776e657220697320746865207a65726f2061610140527f646472657373000000000000000000000000000000000000000000000000000061016052610120816101a001604682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610180528060040161019cfd5b610100516040526100f86115f5565b005b635f1a104c811861157557602436103417611b7a576004358060a01c611b7a57604052633b9aca046040516020525f5260405f20541560605260206060f35b638da5cb5b81186115755734611b7a575f5460405260206040f35b6352f9d92e81186102a157602436103417611b7a576004358060a01c611b7a5761010052610180611579565b633b9aca08610100516020525f5260405f20541561021057602080610180526013610120527f476175676520616c726561647920616464656400000000000000000000000000610140526101208161018001603382825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610160528060040161017cfd5b600154610120526101205160018101818110611b7a5790506001556101005161012051633b9aca00811015611b7a576002015542633b9aca08610100516020525f5260405f2055633b9aca0d54633b9aca0e610100516020525f5260405f20557f88b3a3dcf49d2c2bc73de47dc84b60f3b9179d60d97b8ba43a1d3aa726c818b961010051610140526020610140a1005b636207d866811861030457602436103417611b7a576004358060a01c611b7a57604052633b9aca0c54633b9aca0b6040516020525f5260405f2054670de0b6b3a7640000810281670de0b6b3a7640000820418611b7a5790500460605260206060f35b639d9e8ee6811861157557602436103417611b7a576004358060a01c611b7a57604052633b9aca106040516020525f5260405f205460605260206060f35b63f1443a91811861157557604436103417611b7a576004356004016032813511611b7a5780355f8160328111611b7a5780156103a057905b8060051b6020850101358060a01c611b7a578160051b610320015260010181811861037a575b5050806103005250506024356004016032813511611b7a57803560208160051b01808361096037505050306020611bce5f395f5163cada3682610fc0526020610fc06004610fdc845afa6103f6573d5f5f3e3d5ffd5b3d602081183d602010021880610fc001610fe011611b7a57610fc0518060a01c611b7a57611000525061100090505118156104a357602080611080526014611020527f566f746520636865636b6572206e6f7420736574000000000000000000000000611040526110208161108001603482825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0611060528060040161107cfd5b61030051610fc052610fc05161096051181561053157602080611040526013610fe0527f4d69736d6174636820696e206c656e677468730000000000000000000000000061100052610fe08161104001603382825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0611020528060040161103cfd5b6020611bce5f395f5163a7afdcae6110205233611040526040611020602461103c845afa610561573d5f5f3e3d5ffd5b60403d10611b7a576110209050604081610fe05e506110005161102052610fe051611040526020611bce5f395f5163adc6358961108052336110a0526020611080602461109c845afa6105b6573d5f5f3e3d5ffd5b60203d10611b7a576110809050516110605242611060511161064a576020806110e0526007611080527f45787069726564000000000000000000000000000000000000000000000000006110a052611080816110e001602782825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06110c052806004016110dcfd5b633b9aca04336020525f5260405f2054611080525f6032905b806110a052610fc0516110a0511015610cca576110a05161096051811015611b7a5760051b61098001516110c0526110a05161030051811015611b7a5760051b61032001516110e0526127106110c051111561073157602080611160526010611100527f57656967687420746f6f206c6172676500000000000000000000000000000000611120526111008161116001603082825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0611140528060040161115cfd5b6110c051156107ca57633b9aca026110e0516020525f5260405f2054156107ca57602080611160526006611100527f4b696c6c65640000000000000000000000000000000000000000000000000000611120526111008161116001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0611140528060040161115cfd5b633b9aca086110e0516020525f5260405f20546108595760208061116052600f611100527f4761756765206e6f742061646465640000000000000000000000000000000000611120526111008161116001602f82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0611140528060040161115cfd5b633b9aca05336020525f5260405f20806110e0516020525f5260405f20905054620d2f008101818110611b7a57905042101561090757602080611160526014611100527f43616e6e6f7420766f746520736f206f6674656e000000000000000000000000611120526111008161116001603482825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0611140528060040161115cfd5b633b9aca03336020525f5260405f20806110e0516020525f5260405f209050805461110052600181015461112052600281015461114052600381015461116052505f6111805261116051196109635761112051611180526109a9565b61116051428082811882841102189050905042808203828111611b7a57905090506111a052611100516111a051808202811583838304141715611b7a5790509050611180525b611020516110c051808202811583838304141715611b7a5790509050612710810490506111a0525f6111c0526110c0516111e05261106051611200525f611220526110605119610a1f57611040516110c051808202811583838304141715611b7a57905090506127108104905061122052610a4f565b6111a0516110605142808203828111611b7a5790509050808202811583838304141715611b7a5790509050611220525b611220516111c052611080516111e051808201828110611b7a579050905061114051808203828111611b7a5790509050611080526110e05161012052610a966112406117d0565b6112406040816112805e506040611280610fe05e610fe05161122051808201828110611b7a5790509050611180518082811882841102189050905061118051808203828111611b7a5790509050633b9aca066110e0516020525f5260405f2055426111605111610b3457633b9aca066110e0516020525f5260405f2060018101905080546111a051808201828110611b7a5790509050815550610b87565b611000516111a051808201828110611b7a5790509050611100518082811882841102189050905061110051808203828111611b7a5790509050633b9aca066110e0516020525f5260405f20600181019050555b42611160511115610bcc57633b9aca076110e0516020525f5260405f2080611160516020525f5260405f209050805461110051808203828111611b7a57905090508155505b633b9aca076110e0516020525f5260405f2080611200516020525f5260405f20905080546111a051808201828110611b7a5790509050815550633b9aca03336020525f5260405f20806110e0516020525f5260405f2090506111a05181556111c05160018201556111e0516002820155611200516003820155506110e05161012052610c596112406117d0565b6112405042633b9aca05336020525f5260405f20806110e0516020525f5260405f209050557f45ca9a4c8d0119eb329e580d28fe689e484e1be230da8037ade9547d2d25cc91426112405233611260526110e051611280526110c0516112a0526080611240a1600101818118610663575b5050612710611080511115610d51576020806111005260136110a0527f5573656420746f6f206d75636820706f776572000000000000000000000000006110c0526110a08161110001603382825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06110e052806004016110fcfd5b61108051633b9aca04336020525f5260405f2055005b634e791a3a8118610da457602436103417611b7a576004358060a01c611b7a5761012052602061012051604052610d9f61014061162c565b610140f35b6386b5c66a811861157557602436103417611b7a576004358060a01c611b7a57604052633b9aca096040516020525f5260405f205460605260206060f35b63a972985e811861157557602436103417611b7a576004358060a01c611b7a57610300526103005161012052610e196103206117d0565b61032050005b63e3a8d98a811861157557604436103417611b7a576004358060a01c611b7a57604052633b9aca086040516020525f5260405f2054610e65575f60605260206060611004565b633b9aca096040516020525f5260405f2054606052633b9aca0b6040516020525f5260405f2054608052633b9aca0a5460a052633b9aca0c5460c0525f60e052633b9aca086040516020525f5260405f20546024351115610f2d576020611bae5f395f51636ccb253b610100526024356101205260a05160c051670de0b6b3a7640000810281670de0b6b3a7640000820418611b7a57905004610140526020610100604461011c845afa610f1b573d5f5f3e3d5ffd5b60203d10611b7a5761010090505160e0525b633b9aca0d5460c05160e051670de0b6b3a7640000810281670de0b6b3a7640000820418611b7a57905004808201828110611b7a579050905061010052633b9aca0f6040516020525f5260405f205461010051633b9aca0e6040516020525f5260405f2054808203828111611b7a5790509050608051808202811583838304141715611b7a5790509050670de0b6b3a764000081049050808201828110611b7a57905090506101205261012051633b9aca106040516020525f5260405f2054808203828111611b7a57905090506101405260206101405bf35b633bdab8bf81186115755734611b7a5733610120526110266103006117d0565b61030050633b9aca0f336020525f5260405f20546103005261030051633b9aca10336020525f5260405f2054808203828111611b7a57905090506103205261030051633b9aca10336020525f5260405f205561032051156110e9576020611bae5f395f5163a9059cbb61034052336103605261032051610380526020610340604461035c5f855af16110ba573d5f5f3e3d5ffd5b3d602081183d6020100218806103400161036011611b7a57610340518060011c611b7a576103a052506103a050505b6020610320f35b634344ce71811861157557604436103417611b7a576004358060a01c611b7a57610100526024358060011c611b7a576101205261112b611579565b633b9aca08610100516020525f5260405f20546111ba576020806101a052600f610140527f4761756765206e6f74206164646564000000000000000000000000000000000061016052610140816101a001602f82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610180528060040161019cfd5b61012051633b9aca02610100516020525f5260405f20557f6f287c58034b39b1a4c2b7eb84d0bfceccc7984f19675343742bb94f114a46c660406101006101405e6040610140a1005b6382bfefc881186112215734611b7a576020611bae60403960206040f35b63e93841d0811861123d5734611b7a5760015460405260206040f35b630f467f98811861157557604436103417611b7a576004358060a01c611b7a576040526024358060a01c611b7a57606052633b9aca036040516020525f5260405f20806060516020525f5260405f2090508054608052600181015460a052600281015460c052600381015460e0525060806080f35b631f87f33381186115755734611b7a576020611bce60403960206040f35b63b0539187811861157557602436103417611b7a57600435633b9aca00811015611b7a576002015460405260206040f35b6359e63166811861133f57602436103417611b7a576004358060a01c611b7a57604052633b9aca026040516020525f5260405f205460605260206060f35b63f9b48876811861138757602436103417611b7a576004358060a01c611b7a57604052633b9aca066040516020525f5260405f20805460605260018101546080525060406060f35b63e2a18e8e81186115755734611b7a57633b9aca0c5460405260206040f35b63411e74b5811861157557602436103417611b7a576004358060a01c611b7a57604052633b9aca046040516020525f5260405f205460605260206060f35b637e418fa0811861143f57604436103417611b7a576004358060a01c611b7a576040526024358060a01c611b7a57606052633b9aca056040516020525f5260405f20806060516020525f5260405f2090505460805260206080f35b63d3e89bd0811861157557602436103417611b7a576004358060a01c611b7a57604052633b9aca0f6040516020525f5260405f205460605260206060f35b63a4d7a25081186114bb57602436103417611b7a576004358060a01c611b7a57604052633b9aca086040516020525f5260405f205460605260206060f35b63e0b51e78811861157557602436103417611b7a576004358060a01c611b7a57604052633b9aca0e6040516020525f5260405f205460605260206060f35b6394c8598581186115755734611b7a57633b9aca0a5460405260206040f35b63924809ad811861157557602436103417611b7a576004358060a01c611b7a57604052633b9aca0b6040516020525f5260405f205460605260206060f35b638a00d11b81186115755734611b7a57633b9aca0d5460405260206040f35b5f5ffd5b5f543318156115f35760208060a05260206040527f6f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260605260408160a001604082825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060805280600401609cfd5b565b5f546060526040515f556040516060517f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f6080a3565b633b9aca086040516020525f5260405f20546060524262093a808104905062093a8081028162093a80820418611b7a5790506080525f60a052606051156117c757633b9aca066040516020525f5260405f20805460c052600181015460e052505f6101f4905b806101005260805160605110156116ea5760605162093a808101818110611b7a57905062093a808104905062093a8081028162093a80820418611b7a579050606051808203828111611b7a579050905060a052611708565b42606051808203828111611b7a579050905060a05260a051156117b9575b60605160a051808201828110611b7a579050905060605260c05160e05160a051808202811583838304141715611b7a579050905060c05180828118828410021890509050808203828111611b7a579050905060c05260e051633b9aca076040516020525f5260405f20806060516020525f5260405f2090505460e05180828118828410021890509050808203828111611b7a579050905060e05260c0516117ae575f60e0525b600101818118611692575b5050604060c0825e506117ce565b6040368237505b565b633b9aca08610120516020525f5260405f205461185f576020806101a052600f610140527f4761756765206e6f7420616c697665000000000000000000000000000000000061016052610140816101a001602f82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610180528060040161019cfd5b61012051633ea9f06f610160526020610160600461017c845afa611885573d5f5f3e3d5ffd5b60203d10611b7a57610160905051670de0b6b3a7640000818118670de0b6b3a764000083100218905061014052633b9aca08610120516020525f5260405f205461016052633b9aca09610120516020525f5260405f205461018052633b9aca0b610120516020525f5260405f20546101a052633b9aca0a546101c052633b9aca0c546101e0526101205160405261191d61024061162c565b6102406040816102005e50633b9aca06610120516020525f5260405f206102005181556102205160018201555061020051610240526102405161014051808202811583838304141715611b7a5790509050670de0b6b3a7640000810490506102605261024051633b9aca09610120516020525f5260405f20556101c05161024051808201828110611b7a579050905061018051808203828111611b7a5790509050633b9aca0a5561026051633b9aca0b610120516020525f5260405f20556101e05161026051808201828110611b7a57905090506101a051808203828111611b7a5790509050633b9aca0c556020611bae5f395f5163f1fb05e96102a052306102c0526101c0516101e051670de0b6b3a7640000810281670de0b6b3a7640000820418611b7a579050046102e05260206102a060446102bc5f855af1611a65573d5f5f3e3d5ffd5b60203d10611b7a576102a09050516102805242633b9aca08610120516020525f5260405f2055633b9aca0d546101e05161028051670de0b6b3a7640000810281670de0b6b3a7640000820418611b7a57905004808201828110611b7a57905090506102a0526102805115611ade576102a051633b9aca0d555b61016051421115611b7057633b9aca0f610120516020525f5260405f2080546102a051633b9aca0e610120516020525f5260405f2054808203828111611b7a57905090506101a051808202811583838304141715611b7a5790509050670de0b6b3a764000081049050808201828110611b7a57905090508155506102a051633b9aca0e610120516020525f5260405f20555b6040610200825e50565b5f80fd147d10f015750139157513a60154100613e415750d6715560018151813011575120303420e1f12b2157514f90de212d0855820281ef720ef4c104c2db25aab6049f4d02e17e627cf89299866f4a7e503cdecb1191bae8118301840a165767970657283000403003800000000000000000000000001791f726b4103694969820be083196cc7c045ff0000000000000000000000008235c179e9e84688fbd8b12295efc26834dac211

Deployed Bytecode

0x5f3560e01c60026018820660011b611b7e01601e395f51565b63f0350c0481186100fa57602436103417611b7a576004358060a01c611b7a5761010052610044611579565b610100516100e9576020806101a0526026610120527f6f776e61626c653a206e6577206f776e657220697320746865207a65726f2061610140527f646472657373000000000000000000000000000000000000000000000000000061016052610120816101a001604682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610180528060040161019cfd5b610100516040526100f86115f5565b005b635f1a104c811861157557602436103417611b7a576004358060a01c611b7a57604052633b9aca046040516020525f5260405f20541560605260206060f35b638da5cb5b81186115755734611b7a575f5460405260206040f35b6352f9d92e81186102a157602436103417611b7a576004358060a01c611b7a5761010052610180611579565b633b9aca08610100516020525f5260405f20541561021057602080610180526013610120527f476175676520616c726561647920616464656400000000000000000000000000610140526101208161018001603382825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610160528060040161017cfd5b600154610120526101205160018101818110611b7a5790506001556101005161012051633b9aca00811015611b7a576002015542633b9aca08610100516020525f5260405f2055633b9aca0d54633b9aca0e610100516020525f5260405f20557f88b3a3dcf49d2c2bc73de47dc84b60f3b9179d60d97b8ba43a1d3aa726c818b961010051610140526020610140a1005b636207d866811861030457602436103417611b7a576004358060a01c611b7a57604052633b9aca0c54633b9aca0b6040516020525f5260405f2054670de0b6b3a7640000810281670de0b6b3a7640000820418611b7a5790500460605260206060f35b639d9e8ee6811861157557602436103417611b7a576004358060a01c611b7a57604052633b9aca106040516020525f5260405f205460605260206060f35b63f1443a91811861157557604436103417611b7a576004356004016032813511611b7a5780355f8160328111611b7a5780156103a057905b8060051b6020850101358060a01c611b7a578160051b610320015260010181811861037a575b5050806103005250506024356004016032813511611b7a57803560208160051b01808361096037505050306020611bce5f395f5163cada3682610fc0526020610fc06004610fdc845afa6103f6573d5f5f3e3d5ffd5b3d602081183d602010021880610fc001610fe011611b7a57610fc0518060a01c611b7a57611000525061100090505118156104a357602080611080526014611020527f566f746520636865636b6572206e6f7420736574000000000000000000000000611040526110208161108001603482825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0611060528060040161107cfd5b61030051610fc052610fc05161096051181561053157602080611040526013610fe0527f4d69736d6174636820696e206c656e677468730000000000000000000000000061100052610fe08161104001603382825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0611020528060040161103cfd5b6020611bce5f395f5163a7afdcae6110205233611040526040611020602461103c845afa610561573d5f5f3e3d5ffd5b60403d10611b7a576110209050604081610fe05e506110005161102052610fe051611040526020611bce5f395f5163adc6358961108052336110a0526020611080602461109c845afa6105b6573d5f5f3e3d5ffd5b60203d10611b7a576110809050516110605242611060511161064a576020806110e0526007611080527f45787069726564000000000000000000000000000000000000000000000000006110a052611080816110e001602782825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06110c052806004016110dcfd5b633b9aca04336020525f5260405f2054611080525f6032905b806110a052610fc0516110a0511015610cca576110a05161096051811015611b7a5760051b61098001516110c0526110a05161030051811015611b7a5760051b61032001516110e0526127106110c051111561073157602080611160526010611100527f57656967687420746f6f206c6172676500000000000000000000000000000000611120526111008161116001603082825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0611140528060040161115cfd5b6110c051156107ca57633b9aca026110e0516020525f5260405f2054156107ca57602080611160526006611100527f4b696c6c65640000000000000000000000000000000000000000000000000000611120526111008161116001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0611140528060040161115cfd5b633b9aca086110e0516020525f5260405f20546108595760208061116052600f611100527f4761756765206e6f742061646465640000000000000000000000000000000000611120526111008161116001602f82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0611140528060040161115cfd5b633b9aca05336020525f5260405f20806110e0516020525f5260405f20905054620d2f008101818110611b7a57905042101561090757602080611160526014611100527f43616e6e6f7420766f746520736f206f6674656e000000000000000000000000611120526111008161116001603482825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0611140528060040161115cfd5b633b9aca03336020525f5260405f20806110e0516020525f5260405f209050805461110052600181015461112052600281015461114052600381015461116052505f6111805261116051196109635761112051611180526109a9565b61116051428082811882841102189050905042808203828111611b7a57905090506111a052611100516111a051808202811583838304141715611b7a5790509050611180525b611020516110c051808202811583838304141715611b7a5790509050612710810490506111a0525f6111c0526110c0516111e05261106051611200525f611220526110605119610a1f57611040516110c051808202811583838304141715611b7a57905090506127108104905061122052610a4f565b6111a0516110605142808203828111611b7a5790509050808202811583838304141715611b7a5790509050611220525b611220516111c052611080516111e051808201828110611b7a579050905061114051808203828111611b7a5790509050611080526110e05161012052610a966112406117d0565b6112406040816112805e506040611280610fe05e610fe05161122051808201828110611b7a5790509050611180518082811882841102189050905061118051808203828111611b7a5790509050633b9aca066110e0516020525f5260405f2055426111605111610b3457633b9aca066110e0516020525f5260405f2060018101905080546111a051808201828110611b7a5790509050815550610b87565b611000516111a051808201828110611b7a5790509050611100518082811882841102189050905061110051808203828111611b7a5790509050633b9aca066110e0516020525f5260405f20600181019050555b42611160511115610bcc57633b9aca076110e0516020525f5260405f2080611160516020525f5260405f209050805461110051808203828111611b7a57905090508155505b633b9aca076110e0516020525f5260405f2080611200516020525f5260405f20905080546111a051808201828110611b7a5790509050815550633b9aca03336020525f5260405f20806110e0516020525f5260405f2090506111a05181556111c05160018201556111e0516002820155611200516003820155506110e05161012052610c596112406117d0565b6112405042633b9aca05336020525f5260405f20806110e0516020525f5260405f209050557f45ca9a4c8d0119eb329e580d28fe689e484e1be230da8037ade9547d2d25cc91426112405233611260526110e051611280526110c0516112a0526080611240a1600101818118610663575b5050612710611080511115610d51576020806111005260136110a0527f5573656420746f6f206d75636820706f776572000000000000000000000000006110c0526110a08161110001603382825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06110e052806004016110fcfd5b61108051633b9aca04336020525f5260405f2055005b634e791a3a8118610da457602436103417611b7a576004358060a01c611b7a5761012052602061012051604052610d9f61014061162c565b610140f35b6386b5c66a811861157557602436103417611b7a576004358060a01c611b7a57604052633b9aca096040516020525f5260405f205460605260206060f35b63a972985e811861157557602436103417611b7a576004358060a01c611b7a57610300526103005161012052610e196103206117d0565b61032050005b63e3a8d98a811861157557604436103417611b7a576004358060a01c611b7a57604052633b9aca086040516020525f5260405f2054610e65575f60605260206060611004565b633b9aca096040516020525f5260405f2054606052633b9aca0b6040516020525f5260405f2054608052633b9aca0a5460a052633b9aca0c5460c0525f60e052633b9aca086040516020525f5260405f20546024351115610f2d576020611bae5f395f51636ccb253b610100526024356101205260a05160c051670de0b6b3a7640000810281670de0b6b3a7640000820418611b7a57905004610140526020610100604461011c845afa610f1b573d5f5f3e3d5ffd5b60203d10611b7a5761010090505160e0525b633b9aca0d5460c05160e051670de0b6b3a7640000810281670de0b6b3a7640000820418611b7a57905004808201828110611b7a579050905061010052633b9aca0f6040516020525f5260405f205461010051633b9aca0e6040516020525f5260405f2054808203828111611b7a5790509050608051808202811583838304141715611b7a5790509050670de0b6b3a764000081049050808201828110611b7a57905090506101205261012051633b9aca106040516020525f5260405f2054808203828111611b7a57905090506101405260206101405bf35b633bdab8bf81186115755734611b7a5733610120526110266103006117d0565b61030050633b9aca0f336020525f5260405f20546103005261030051633b9aca10336020525f5260405f2054808203828111611b7a57905090506103205261030051633b9aca10336020525f5260405f205561032051156110e9576020611bae5f395f5163a9059cbb61034052336103605261032051610380526020610340604461035c5f855af16110ba573d5f5f3e3d5ffd5b3d602081183d6020100218806103400161036011611b7a57610340518060011c611b7a576103a052506103a050505b6020610320f35b634344ce71811861157557604436103417611b7a576004358060a01c611b7a57610100526024358060011c611b7a576101205261112b611579565b633b9aca08610100516020525f5260405f20546111ba576020806101a052600f610140527f4761756765206e6f74206164646564000000000000000000000000000000000061016052610140816101a001602f82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610180528060040161019cfd5b61012051633b9aca02610100516020525f5260405f20557f6f287c58034b39b1a4c2b7eb84d0bfceccc7984f19675343742bb94f114a46c660406101006101405e6040610140a1005b6382bfefc881186112215734611b7a576020611bae60403960206040f35b63e93841d0811861123d5734611b7a5760015460405260206040f35b630f467f98811861157557604436103417611b7a576004358060a01c611b7a576040526024358060a01c611b7a57606052633b9aca036040516020525f5260405f20806060516020525f5260405f2090508054608052600181015460a052600281015460c052600381015460e0525060806080f35b631f87f33381186115755734611b7a576020611bce60403960206040f35b63b0539187811861157557602436103417611b7a57600435633b9aca00811015611b7a576002015460405260206040f35b6359e63166811861133f57602436103417611b7a576004358060a01c611b7a57604052633b9aca026040516020525f5260405f205460605260206060f35b63f9b48876811861138757602436103417611b7a576004358060a01c611b7a57604052633b9aca066040516020525f5260405f20805460605260018101546080525060406060f35b63e2a18e8e81186115755734611b7a57633b9aca0c5460405260206040f35b63411e74b5811861157557602436103417611b7a576004358060a01c611b7a57604052633b9aca046040516020525f5260405f205460605260206060f35b637e418fa0811861143f57604436103417611b7a576004358060a01c611b7a576040526024358060a01c611b7a57606052633b9aca056040516020525f5260405f20806060516020525f5260405f2090505460805260206080f35b63d3e89bd0811861157557602436103417611b7a576004358060a01c611b7a57604052633b9aca0f6040516020525f5260405f205460605260206060f35b63a4d7a25081186114bb57602436103417611b7a576004358060a01c611b7a57604052633b9aca086040516020525f5260405f205460605260206060f35b63e0b51e78811861157557602436103417611b7a576004358060a01c611b7a57604052633b9aca0e6040516020525f5260405f205460605260206060f35b6394c8598581186115755734611b7a57633b9aca0a5460405260206040f35b63924809ad811861157557602436103417611b7a576004358060a01c611b7a57604052633b9aca0b6040516020525f5260405f205460605260206060f35b638a00d11b81186115755734611b7a57633b9aca0d5460405260206040f35b5f5ffd5b5f543318156115f35760208060a05260206040527f6f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260605260408160a001604082825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060805280600401609cfd5b565b5f546060526040515f556040516060517f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f6080a3565b633b9aca086040516020525f5260405f20546060524262093a808104905062093a8081028162093a80820418611b7a5790506080525f60a052606051156117c757633b9aca066040516020525f5260405f20805460c052600181015460e052505f6101f4905b806101005260805160605110156116ea5760605162093a808101818110611b7a57905062093a808104905062093a8081028162093a80820418611b7a579050606051808203828111611b7a579050905060a052611708565b42606051808203828111611b7a579050905060a05260a051156117b9575b60605160a051808201828110611b7a579050905060605260c05160e05160a051808202811583838304141715611b7a579050905060c05180828118828410021890509050808203828111611b7a579050905060c05260e051633b9aca076040516020525f5260405f20806060516020525f5260405f2090505460e05180828118828410021890509050808203828111611b7a579050905060e05260c0516117ae575f60e0525b600101818118611692575b5050604060c0825e506117ce565b6040368237505b565b633b9aca08610120516020525f5260405f205461185f576020806101a052600f610140527f4761756765206e6f7420616c697665000000000000000000000000000000000061016052610140816101a001602f82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610180528060040161019cfd5b61012051633ea9f06f610160526020610160600461017c845afa611885573d5f5f3e3d5ffd5b60203d10611b7a57610160905051670de0b6b3a7640000818118670de0b6b3a764000083100218905061014052633b9aca08610120516020525f5260405f205461016052633b9aca09610120516020525f5260405f205461018052633b9aca0b610120516020525f5260405f20546101a052633b9aca0a546101c052633b9aca0c546101e0526101205160405261191d61024061162c565b6102406040816102005e50633b9aca06610120516020525f5260405f206102005181556102205160018201555061020051610240526102405161014051808202811583838304141715611b7a5790509050670de0b6b3a7640000810490506102605261024051633b9aca09610120516020525f5260405f20556101c05161024051808201828110611b7a579050905061018051808203828111611b7a5790509050633b9aca0a5561026051633b9aca0b610120516020525f5260405f20556101e05161026051808201828110611b7a57905090506101a051808203828111611b7a5790509050633b9aca0c556020611bae5f395f5163f1fb05e96102a052306102c0526101c0516101e051670de0b6b3a7640000810281670de0b6b3a7640000820418611b7a579050046102e05260206102a060446102bc5f855af1611a65573d5f5f3e3d5ffd5b60203d10611b7a576102a09050516102805242633b9aca08610120516020525f5260405f2055633b9aca0d546101e05161028051670de0b6b3a7640000810281670de0b6b3a7640000820418611b7a57905004808201828110611b7a57905090506102a0526102805115611ade576102a051633b9aca0d555b61016051421115611b7057633b9aca0f610120516020525f5260405f2080546102a051633b9aca0e610120516020525f5260405f2054808203828111611b7a57905090506101a051808202811583838304141715611b7a5790509050670de0b6b3a764000081049050808201828110611b7a57905090508155506102a051633b9aca0e610120516020525f5260405f20555b6040610200825e50565b5f80fd147d10f015750139157513a60154100613e415750d6715560018151813011575120303420e1f12b2157514f90de212d000000000000000000000000001791f726b4103694969820be083196cc7c045ff0000000000000000000000008235c179e9e84688fbd8b12295efc26834dac211

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.