xDAI Price: $0.999787 (-0.03%)
Gas: 1.9 GWei

Contract

0x566b9F24200A9B51b76792D4e81B569AF27eda83

Overview

xDAI Balance

Gnosis Chain LogoGnosis Chain LogoGnosis Chain Logo0 xDAI

xDAI Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

Please try again later

View more zero value Internal Transactions in Advanced View mode

Loading...
Loading

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

Contract Name:
CowSwapBurner

Compiler Version
vyper:0.3.10

Optimization Enabled:
N/A

Other Settings:
MIT license

Contract Source Code (Vyper language format)

# @version 0.3.10
"""
@title CowSwapBurner
@license MIT
@author Curve Finance
@notice Exchange tokens using CowSwap
"""


interface ERC20:
    def approve(_to: address, _value: uint256): nonpayable
    def transfer(_to: address, _value: uint256) -> bool: nonpayable
    def transferFrom(_from: address, _to: address, _value: uint256) -> bool: nonpayable
    def balanceOf(_owner: address) -> uint256: view

ETH_ADDRESS: constant(address) = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE


struct Transfer:
    coin: ERC20
    to: address
    amount: uint256  # 2^256-1 for the whole balance

enum Epoch:
    SLEEP  # 1
    COLLECT  # 2
    EXCHANGE  # 4
    FORWARD  # 8

interface FeeCollector:
    def fee(_epoch: Epoch=empty(Epoch), _ts: uint256=block.timestamp) -> uint256: view
    def target() -> ERC20: view
    def owner() -> address: view
    def emergency_owner() -> address: view
    def epoch_time_frame(epoch: Epoch, ts: uint256=block.timestamp) -> (uint256, uint256): view
    def can_exchange(_coins: DynArray[ERC20, MAX_COINS_LEN]) -> bool: view
    def transfer(_transfers: DynArray[Transfer, MAX_COINS_LEN]): nonpayable

MAX_COINS_LEN: constant(uint256) = 64
ONE: constant(uint256) = 10 ** 18  # Precision
fee_collector: public(immutable(FeeCollector))


struct GPv2Order_Data:
    sellToken: ERC20  # token to sell
    buyToken: ERC20  # token to buy
    receiver: address  # receiver of the token to buy
    sellAmount: uint256
    buyAmount: uint256
    validTo: uint32  # timestamp until order is valid
    appData: bytes32  # extra info about the order
    feeAmount: uint256  # amount of fees in sellToken
    kind: bytes32  # buy or sell
    partiallyFillable: bool  # partially fillable (True) or fill-or-kill (False)
    sellTokenBalance: bytes32  # From where the sellToken balance is withdrawn
    buyTokenBalance: bytes32  # Where the buyToken is deposited

struct ConditionalOrderParams:
    # The contract implementing the conditional order logic
    handler: address  # self
    # Allows for multiple conditional orders of the same type and data
    salt: bytes32  # Not used for now
    # Data available to ALL discrete orders created by the conditional order
    staticData: Bytes[STATIC_DATA_LEN]  # Using coin address

struct PayloadStruct:
    proof: DynArray[bytes32, 32]
    params: ConditionalOrderParams
    offchainInput: Bytes[OFFCHAIN_DATA_LEN]

interface ComposableCow:
    def create(params: ConditionalOrderParams, dispatch: bool): nonpayable
    def domainSeparator() -> bytes32: view
    def isValidSafeSignature(
        safe: address, sender: address, _hash: bytes32, _domainSeparator: bytes32, typeHash: bytes32,
        encodeData: Bytes[15 * 32],
        payload: Bytes[(32 + 3 + 1 + 8) * 32],
    ) -> bytes4: view

STATIC_DATA_LEN: constant(uint256) = 20
OFFCHAIN_DATA_LEN: constant(uint256) = 1

vault_relayer: public(immutable(address))
composable_cow: public(immutable(ComposableCow))
ADD_DATA: public(constant(bytes32)) = 0x058315b749613051abcbf50cf2d605b4fa4a41554ec35d73fd058fc530da559f
SELL_KIND: constant(bytes32) = keccak256("sell")  # Surpluss in target coin
TOKEN_BALANCE: constant(bytes32) = keccak256("erc20")


# SignatureVerifierMuxer at
# https://github.com/rndlabs/safe-contracts/blob/11273c1f08eda18ed8ff49ec1d4abec5e451ff21/contracts/handler/extensible/SignatureVerifierMuxer.sol:
# method_id("domainVerifiers(address,bytes32)") == "0x51cad5ee"
# method_id("setDomainVerifier(bytes32,address)") == "0x3365582c"
SIGNATURE_VERIFIER_MUXER_INTERFACE: constant(bytes4) = 0x62af8dc2
ERC1271_MAGIC_VALUE: constant(bytes4) = 0x1626ba7e
SUPPORTED_INTERFACES: constant(bytes4[4]) = [
    # ERC165: method_id("supportsInterface(bytes4)") == 0x01ffc9a7
    0x01ffc9a7,
    # Burner:
    #   method_id("burn(address[],address)") == 0x72a436a8
    #   method_id("push_target()") == 0x2eb078cd
    #   method_id("VERSION()") == 0xffa1ad74
    0xa3b5e311,
    # Interface corresponding to IConditionalOrderGenerator:
    #   method_id("getTradeableOrder(address,address,bytes32,bytes,bytes)") == 0xb8296fc4
    0xb8296fc4,
    # ERC1271 interface:
    #   method_id("isValidSignature(bytes32,bytes)") == 0x1626ba7e
    ERC1271_MAGIC_VALUE,
]
VERSION: public(constant(String[20])) = "CowSwap"

created: public(HashMap[ERC20, bool])

target_threshold: public(uint256)  # min amount to exchange


@external
def __init__(_fee_collector: FeeCollector,
    _composable_cow: ComposableCow, _vault_relayer: address, _target_threshold: uint256):
    """
    @notice Contract constructor
    @param _fee_collector FeeCollector to anchor to
    @param _composable_cow Address of ComposableCow contract
    @param _vault_relayer CowSwap's VaultRelayer contract address, all approves go there
    @param _target_threshold Minimum amount of target to buy per order
    """
    fee_collector = _fee_collector
    vault_relayer = _vault_relayer
    composable_cow = _composable_cow

    assert _target_threshold > 0, "Bad target threshold"
    self.target_threshold = _target_threshold


@external
def burn(_coins: DynArray[ERC20, MAX_COINS_LEN], _receiver: address):
    """
    @notice Post hook after collect to register coins for burn
    @dev Registers new orders in ComposableCow
    @param _coins Which coins to burn
    @param _receiver Receiver of profit
    """
    assert msg.sender == fee_collector.address, "Only FeeCollector"

    fee: uint256 = fee_collector.fee(Epoch.COLLECT)
    fee_payouts: DynArray[Transfer, MAX_COINS_LEN] = []
    self_transfers: DynArray[Transfer, MAX_COINS_LEN] = []
    for coin in _coins:
        if not self.created[coin]:
            composable_cow.create(ConditionalOrderParams({
                handler: self,
                salt: empty(bytes32),
                staticData: concat(b"", convert(coin.address, bytes20)),
            }), True)
            coin.approve(vault_relayer, max_value(uint256))
            self.created[coin] = True
        amount: uint256 = coin.balanceOf(fee_collector.address) * fee / ONE
        fee_payouts.append(Transfer({coin: coin, to: _receiver, amount: amount}))
        self_transfers.append(Transfer({coin: coin, to: self, amount: max_value(uint256)}))

    fee_collector.transfer(fee_payouts)
    fee_collector.transfer(self_transfers)


@view
@internal
def _get_order(sell_token: ERC20) -> GPv2Order_Data:
    buy_token: ERC20 = fee_collector.target()
    return GPv2Order_Data({
        sellToken: sell_token,  # token to sell
        buyToken: buy_token,  # token to buy
        receiver: fee_collector.address,  # receiver of the token to buy
        sellAmount: 0,  # Set later
        buyAmount: self.target_threshold,
        validTo: convert(fee_collector.epoch_time_frame(Epoch.EXCHANGE)[1], uint32),  # timestamp until order is valid
        appData: ADD_DATA,  # extra info about the order
        feeAmount: 0,  # amount of fees in sellToken
        kind: SELL_KIND,  # buy or sell
        partiallyFillable: True,  # partially fillable (True) or fill-or-kill (False)
        sellTokenBalance: TOKEN_BALANCE,  # From where the sellToken balance is withdrawn
        buyTokenBalance: TOKEN_BALANCE,  # Where the buyToken is deposited
    })


@view
@external
def get_current_order(sell_token: address=empty(address)) -> GPv2Order_Data:
    """
    @notice Get current order parameters
    @param sell_token Address of possible sell token
    @return Order parameters
    """
    return self._get_order(ERC20(sell_token))


@view
@external
def getTradeableOrder(_owner: address, _sender: address, _ctx: bytes32, _static_input: Bytes[STATIC_DATA_LEN], _offchain_input: Bytes[OFFCHAIN_DATA_LEN]) -> GPv2Order_Data:
    """
    @notice Generate order for WatchTower
    @dev _owner, _sender, _ctx, _offchain_input are ignored
    @param _owner Owner of order (self)
    @param _sender `msg.sender` context calling `isValidSignature`
    @param _ctx Execution context
    @param _static_input sellToken encoded as bytes(Bytes[20])
    @param _offchain_input Not used, zero-length bytes
    @return Order parameters
    """
    sell_token: ERC20 = ERC20(convert(convert(_static_input, bytes20), address))
    order: GPv2Order_Data = self._get_order(sell_token)
    order.sellAmount = sell_token.balanceOf(self)

    if order.sellAmount == 0 or not fee_collector.can_exchange([sell_token]):
        start: uint256 = 0
        end: uint256 = 0
        start, end = fee_collector.epoch_time_frame(Epoch.EXCHANGE)
        if block.timestamp >= start:
            start, end = fee_collector.epoch_time_frame(Epoch.EXCHANGE, block.timestamp + 7 * 24 * 3600)
        reason: String[11] = "ZeroBalance"
        if order.sellAmount != 0:  # FeeCollector reject
            reason = "NotAllowed"
        raw_revert(_abi_encode(start, reason, method_id=method_id("PollTryAtEpoch(uint256,string)")))

    return order


@view
@external
def verify(
    _owner: address,
    _sender: address,
    _hash: bytes32,
    _domain_separator: bytes32,
    _ctx: bytes32,
    _static_input: Bytes[STATIC_DATA_LEN],
    _offchain_input: Bytes[OFFCHAIN_DATA_LEN],
    _order: GPv2Order_Data,
):
    """
    @notice Verify order
    @dev Called from ComposableCow. _owner, _sender, _hash, _domain_separator, _ctx are ignored.
    @param _owner Owner of conditional order (self)
    @param _sender `msg.sender` context calling `isValidSignature`
    @param _hash `EIP-712` order digest
    @param _domain_separator `EIP-712` domain separator
    @param _ctx Execution context
    @param _static_input ConditionalOrder's staticData (coin address)
    @param _offchain_input Conditional order type-specific data NOT known at time of creation for a specific discrete order (or zero-length bytes if not applicable)
    @param _order The proposed discrete order's `GPv2Order.Data` struct
    """
    sell_token: ERC20 = ERC20(convert(convert(_static_input, bytes20), address))
    if not fee_collector.can_exchange([sell_token]):
        raw_revert(_abi_encode("NotAllowed", method_id=method_id("OrderNotValid(string)")))
    if _offchain_input != b"":
        raw_revert(_abi_encode("NonZeroOffchainInput", method_id=method_id("OrderNotValid(string)")))
    order: GPv2Order_Data = self._get_order(sell_token)
    order.sellAmount = _order.sellAmount  # Any amount allowed
    order.buyAmount = max(_order.buyAmount, order.buyAmount)  # Price is discovered within CowSwap competition
    if _abi_encode(order) != _abi_encode(_order):
        raw_revert(_abi_encode("BadOrder", method_id=method_id("OrderNotValid(string)")))


@view
@external
def isValidSignature(_hash: bytes32, signature: Bytes[1792]) -> bytes4:
    """
    @notice ERC1271 signature verifier method
    @dev Forwards query to ComposableCow
    @param _hash Hash of signed object. Ignored here
    @param signature Signature for the object. (GPv2Order.Data, PayloadStruct) here
    @return `ERC1271_MAGIC_VALUE` if signature is OK
    """
    order: GPv2Order_Data = empty(GPv2Order_Data)
    payload: PayloadStruct = empty(PayloadStruct)
    order, payload = _abi_decode(signature, (GPv2Order_Data, PayloadStruct))

    return composable_cow.isValidSafeSignature(self, msg.sender, _hash, composable_cow.domainSeparator(), empty(bytes32),
        _abi_encode(order),
        _abi_encode(payload),
    )


@external
def push_target() -> uint256:
    """
    @notice In case target coin is left in contract can be pushed to forward
    @return Amount of coin pushed further
    """
    target: ERC20 = fee_collector.target()
    amount: uint256 = target.balanceOf(self)
    if amount > 0:
        target.transfer(fee_collector.address, amount)
    return amount


@pure
@external
def supportsInterface(_interface_id: bytes4) -> bool:
    """
    @dev Interface identification is specified in ERC-165.
    Fails on SignatureVerifierMuxer for compatability with ComposableCow.
    @param _interface_id Id of the interface
    @return True if contract supports given interface
    """
    assert _interface_id != SIGNATURE_VERIFIER_MUXER_INTERFACE
    return _interface_id in SUPPORTED_INTERFACES


@external
def set_target_threshold(_target_threshold: uint256):
    """
    @dev Callable only by owner
    @param _target_threshold Minimum amount of target to receive, with base=10**18
    """
    assert msg.sender == fee_collector.owner(), "Only owner"
    assert _target_threshold > 0, "Bad target threshold"

    self.target_threshold = _target_threshold


@external
def recover(_coins: DynArray[ERC20, MAX_COINS_LEN]):
    """
    @notice Recover ERC20 tokens or Ether from this contract
    @dev Callable only by owner and emergency owner
    @param _coins Token addresses
    """
    assert msg.sender in [fee_collector.owner(), fee_collector.emergency_owner()], "Only owner"

    for coin in _coins:
        if coin.address == ETH_ADDRESS:
            raw_call(fee_collector.address, b"", value=self.balance)
        else:
            coin.transfer(fee_collector.address, coin.balanceOf(self))  # do not need safe transfer

Contract Security Audit

Contract ABI

[{"stateMutability":"nonpayable","type":"constructor","inputs":[{"name":"_fee_collector","type":"address"},{"name":"_composable_cow","type":"address"},{"name":"_vault_relayer","type":"address"},{"name":"_target_threshold","type":"uint256"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"burn","inputs":[{"name":"_coins","type":"address[]"},{"name":"_receiver","type":"address"}],"outputs":[]},{"stateMutability":"view","type":"function","name":"get_current_order","inputs":[],"outputs":[{"name":"","type":"tuple","components":[{"name":"sellToken","type":"address"},{"name":"buyToken","type":"address"},{"name":"receiver","type":"address"},{"name":"sellAmount","type":"uint256"},{"name":"buyAmount","type":"uint256"},{"name":"validTo","type":"uint32"},{"name":"appData","type":"bytes32"},{"name":"feeAmount","type":"uint256"},{"name":"kind","type":"bytes32"},{"name":"partiallyFillable","type":"bool"},{"name":"sellTokenBalance","type":"bytes32"},{"name":"buyTokenBalance","type":"bytes32"}]}]},{"stateMutability":"view","type":"function","name":"get_current_order","inputs":[{"name":"sell_token","type":"address"}],"outputs":[{"name":"","type":"tuple","components":[{"name":"sellToken","type":"address"},{"name":"buyToken","type":"address"},{"name":"receiver","type":"address"},{"name":"sellAmount","type":"uint256"},{"name":"buyAmount","type":"uint256"},{"name":"validTo","type":"uint32"},{"name":"appData","type":"bytes32"},{"name":"feeAmount","type":"uint256"},{"name":"kind","type":"bytes32"},{"name":"partiallyFillable","type":"bool"},{"name":"sellTokenBalance","type":"bytes32"},{"name":"buyTokenBalance","type":"bytes32"}]}]},{"stateMutability":"view","type":"function","name":"getTradeableOrder","inputs":[{"name":"_owner","type":"address"},{"name":"_sender","type":"address"},{"name":"_ctx","type":"bytes32"},{"name":"_static_input","type":"bytes"},{"name":"_offchain_input","type":"bytes"}],"outputs":[{"name":"","type":"tuple","components":[{"name":"sellToken","type":"address"},{"name":"buyToken","type":"address"},{"name":"receiver","type":"address"},{"name":"sellAmount","type":"uint256"},{"name":"buyAmount","type":"uint256"},{"name":"validTo","type":"uint32"},{"name":"appData","type":"bytes32"},{"name":"feeAmount","type":"uint256"},{"name":"kind","type":"bytes32"},{"name":"partiallyFillable","type":"bool"},{"name":"sellTokenBalance","type":"bytes32"},{"name":"buyTokenBalance","type":"bytes32"}]}]},{"stateMutability":"view","type":"function","name":"verify","inputs":[{"name":"_owner","type":"address"},{"name":"_sender","type":"address"},{"name":"_hash","type":"bytes32"},{"name":"_domain_separator","type":"bytes32"},{"name":"_ctx","type":"bytes32"},{"name":"_static_input","type":"bytes"},{"name":"_offchain_input","type":"bytes"},{"name":"_order","type":"tuple","components":[{"name":"sellToken","type":"address"},{"name":"buyToken","type":"address"},{"name":"receiver","type":"address"},{"name":"sellAmount","type":"uint256"},{"name":"buyAmount","type":"uint256"},{"name":"validTo","type":"uint32"},{"name":"appData","type":"bytes32"},{"name":"feeAmount","type":"uint256"},{"name":"kind","type":"bytes32"},{"name":"partiallyFillable","type":"bool"},{"name":"sellTokenBalance","type":"bytes32"},{"name":"buyTokenBalance","type":"bytes32"}]}],"outputs":[]},{"stateMutability":"view","type":"function","name":"isValidSignature","inputs":[{"name":"_hash","type":"bytes32"},{"name":"signature","type":"bytes"}],"outputs":[{"name":"","type":"bytes4"}]},{"stateMutability":"nonpayable","type":"function","name":"push_target","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"pure","type":"function","name":"supportsInterface","inputs":[{"name":"_interface_id","type":"bytes4"}],"outputs":[{"name":"","type":"bool"}]},{"stateMutability":"nonpayable","type":"function","name":"set_target_threshold","inputs":[{"name":"_target_threshold","type":"uint256"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"recover","inputs":[{"name":"_coins","type":"address[]"}],"outputs":[]},{"stateMutability":"view","type":"function","name":"fee_collector","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"vault_relayer","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"composable_cow","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"ADD_DATA","inputs":[],"outputs":[{"name":"","type":"bytes32"}]},{"stateMutability":"view","type":"function","name":"VERSION","inputs":[],"outputs":[{"name":"","type":"string"}]},{"stateMutability":"view","type":"function","name":"created","inputs":[{"name":"arg0","type":"address"}],"outputs":[{"name":"","type":"bool"}]},{"stateMutability":"view","type":"function","name":"target_threshold","inputs":[],"outputs":[{"name":"","type":"uint256"}]}]

Deployed Bytecode

0x5f3560e01c60026014820660011b61190101601e395f51565b63f5e8fa23811861003657346118fd57602061192960403960206040f35b63d42efd838118611795576024361034176118fd576004358060a01c6118fd576040525f6040516020525f5260405f205460605260206060f3611795565b6334dd4ee8811861009257346118fd57602061194960403960206040f35b63ceb4c2f88118611795576024361034176118fd5760206119295f395f51638da5cb5b604052602060406004605c845afa6100cf573d5f5f3e3d5ffd5b60203d106118fd576040518060a01c6118fd57608052608090505133181561014d57600a60a0527f4f6e6c79206f776e65720000000000000000000000000000000000000000000060c05260a05060a0518060c001601f825f031636823750506308c379a06060526020608052601f19601f60a0510116604401607cfd5b6004356101af5760146040527f42616420746172676574207468726573686f6c6400000000000000000000000060605260405060405180606001601f825f031636823750506308c379a05f526020602052601f19601f6040510116604401601cfd5b60043560015500611795565b6311742cea81186101d957346118fd57602061196960403960206040f35b633df5e0ce811861179557346118fd575f60e052610a4d56611795565b6348507e61811861179557346118fd577f058315b749613051abcbf50cf2d605b4fa4a41554ec35d73fd058fc530da559f60405260206040f3611795565b63ffa1ad7481186102b257346118fd5760208060805260076040527f436f77537761700000000000000000000000000000000000000000000000000060605260408160800181518152602082015160208201528051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506080f35b6372a436a88118611795576064361034176118fd5760043560040160408135116118fd5780355f81604081116118fd57801561030f57905b8060051b6020850101358060a01c6118fd578160051b606001526001018181186102ea575b50508060405250506024358060a01c6118fd576108605260206119295f395f5133181561039b576011610880527f4f6e6c7920466565436f6c6c6563746f720000000000000000000000000000006108a0526108805061088051806108a001601f825f031636823750506308c379a061084052602061086052601f19601f61088051011660440161085cfd5b60206119295f395f516339b37ab06108a05260026108c05260206108a060246108bc845afa6103cc573d5f5f3e3d5ffd5b60203d106118fd576108a0905051610880525f6108a0525f6120c0525f604051604081116118fd57801561063657905b8060051b606001516138e0525f6138e0516020525f5260405f205461053f5760206119695f395f51636bfae1ca6139605260408061398052806139800160603082525f60208301528060408301525f6138e0518060601b90508161394001526014810190508061392052613920905081830181518152602082015160208201528051806020830101601f825f03163682375050601f19601f82516020010116905090508101905090508101905060016139a05250803b156118fd575f61396060e461397c5f855af16104d0573d5f5f3e3d5ffd5b506138e05163095ea7b3613900526020611949613920397fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61394052803b156118fd575f613900604461391c5f855af161052c573d5f5f3e3d5ffd5b5060015f6138e0516020525f5260405f20555b6138e0516370a08231613920526020611929613940396020613920602461393c845afa61056e573d5f5f3e3d5ffd5b60203d106118fd57613920905051610880518082028115838383041417156118fd5790509050670de0b6b3a764000081049050613900526108a051603f81116118fd57606081026108c0016138e051815261086051602082015261390051604082015250600181016108a052506120c051603f81116118fd57606081026120e0016138e05181523060208201527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff604082015250600181016120c052506001018181186103fc575b505060206119295f395f51630e67c6bc6138e0526020806139005280613900015f6108a051808352606081025f82604081116118fd5780156106aa57905b606081026020870101606082026108c0018051825260208101516020830152604081015160408301525050600101818118610674575b50508201602001915050905081015050803b156118fd575f6138e06118446138fc5f855af16106db573d5f5f3e3d5ffd5b5060206119295f395f51630e67c6bc6138e0526020806139005280613900015f6120c051808352606081025f82604081116118fd57801561074e57905b606081026020870101606082026120e0018051825260208101516020830152604081015160408301525050600101818118610718575b50508201602001915050905081015050803b156118fd575f6138e06118446138fc5f855af161077f573d5f5f3e3d5ffd5b5000611795565b63bd39679681186107a257346118fd5760015460405260206040f35b6318ab6efe8118611795576044361034176118fd5760043560040160408135116118fd5780355f81604081116118fd5780156107ff57905b8060051b6020850101358060a01c6118fd578160051b606001526001018181186107da575b50508060405250503360206119295f395f51638da5cb5b610920526020610920600461093c845afa610833573d5f5f3e3d5ffd5b60203d106118fd57610920518060a01c6118fd5761096052610960905051811861085e5760016108ab565b60206119295f395f516363a4042a610980526020610980600461099c845afa610889573d5f5f3e3d5ffd5b60203d106118fd57610980518060a01c6118fd576109c0526109c09050518118155b905061091657600a610a00527f4f6e6c79206f776e657200000000000000000000000000000000000000000000610a2052610a0050610a005180610a2001601f825f031636823750506308c379a06109c05260206109e052601f19601f610a005101166044016109dcfd5b5f604051604081116118fd578015610a2157905b8060051b606001516108605273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee610860511861098b5760206119295f395f51475a5f61088052610880505f5f610880516108a0858786f1905090509050610a16573d5f5f3e3d5ffd610a16565b6108605163a9059cbb6108c05260206119296108e039610860516370a0823161088052306108a0526020610880602461089c845afa6109cc573d5f5f3e3d5ffd5b60203d106118fd576108809050516109005260206108c060446108dc5f855af16109f8573d5f5f3e3d5ffd5b60203d106118fd576108c0518060011c6118fd576109205261092050505b60010181811861092a575b505000611795565b630d3ecec48118610a66576024361034176118fd576004358060a01c6118fd5760e0525b61018060e051604052610a61610100611799565b610100f35b63b8296fc481186117955760e4361034176118fd576004358060a01c6118fd5760e0526024358060a01c6118fd576101005260643560040160148135116118fd576020813501808261012037505060843560040160018135116118fd57602081350180826101603750506101205160200360031b61014051811c811b90508060601c90506101a0526101a051604052610b00610340611799565b6103406101806101c06101808360045afa50506101a0516370a082316103405230610360526020610340602461035c845afa610b3e573d5f5f3e3d5ffd5b60203d106118fd576103409050516102205261022051610b5f576001610c14565b60206119295f395f5163dc7168e9610340526020806103605280610360015f6101a051610bc0526001610ba0525f610ba0518084528060051b5f82604081116118fd578015610bc857905b8060051b610bc001518160051b602089010152600101818118610baa575b505082016020019150509050905081015050602061034061084461035c845afa610bf4573d5f5f3e3d5ffd5b60203d106118fd57610340518060011c6118fd576113c0526113c0905051155b15610dc4576040366113e03760206119295f395f5163dffe059c611420526004611440526040611420602461143c845afa610c51573d5f5f3e3d5ffd5b60403d106118fd57611420905080516113e052602081015161140052506113e0514210610cdb5760206119295f395f5163b676f748611420526004611440524262093a8081018181106118fd579050611460526040611420604461143c845afa610cbd573d5f5f3e3d5ffd5b60403d106118fd57611420905080516113e052602081015161140052505b600b611460527f5a65726f42616c616e636500000000000000000000000000000000000000000061148052611460805161142052602081015161144052506102205115610d6157600a611460527f4e6f74416c6c6f7765640000000000000000000000000000000000000000000061148052611460805161142052602081015161144052505b637e33463761146452600460406113e05161148452806114a45280611484016114205181526114405160208201528051806020830101601f825f03163682375050601f19601f825160200101169050810190500161146052611460805160208201fd5b6101806101c0f3611795565b6314a2a7848118611795576102a4361034176118fd576004358060a01c6118fd5760e0526024358060a01c6118fd576101005260a43560040160148135116118fd576020813501808261012037505060c43560040160018135116118fd576020813501808261016037505060e4358060a01c6118fd576101a052610104358060a01c6118fd576101c052610124358060a01c6118fd576101e052604061014461020037610184358060201c6118fd57610240526101a4356102605260406101c461028037610204358060011c6118fd576102c05260406102246102e0376101205160200360031b61014051811c811b90508060601c90506103205260206119295f395f5163dc7168e9610340526020806103605280610360015f61032051610bc0526001610ba0525f610ba0518084528060051b5f82604081116118fd578015610f3457905b8060051b610bc001518160051b602089010152600101818118610f16575b505082016020019150509050905081015050602061034061084461035c845afa610f60573d5f5f3e3d5ffd5b60203d106118fd57610340518060011c6118fd576113c0526113c090505161100c5763c8fc272561142452600460208061144452600a6113e0527f4e6f74416c6c6f77656400000000000000000000000000000000000000000000611400526113e0816114440181518152602082015160208201528051806020830101601f825f03163682375050601f19601f8251602001011690509050810190500161142052611420805160208201fd5b5f610360526103608051602082012090506101605161018020146110b45763c8fc27256103c45260046020806103e4526014610380527f4e6f6e5a65726f4f6666636861696e496e7075740000000000000000000000006103a052610380816103e40181518152602082015160208201528051806020830101601f825f03163682375050601f19601f825160200101169050905081019050016103c0526103c0805160208201fd5b610320516040526110c66104c0611799565b6104c06101806103406101808360045afa5050610200516103a052610220516103c051808281188284110218905090506103c0526101806109c06101806101a060045afa506101806109a0526109a080516020820120905061018061082061018061034060045afa5061018061080052610800805160208201209050146111d15763c8fc2725610b84526004602080610ba4526008610b40527f4261644f72646572000000000000000000000000000000000000000000000000610b6052610b4081610ba40181518152602082015160208201528051806020830101601f825f03163682375050601f19601f82516020010116905090508101905001610b8052610b80805160208201fd5b00611795565b631626ba7e8118611795576064361034176118fd576024356004016107008135116118fd57602081350180826040375050610660366107603760405161070181106102bf821116156118fd57506060518060a01c6118fd57610dc0526080518060a01c6118fd57610de05260a0518060a01c6118fd57610e005260c051610e205260e051610e4052610100518060201c6118fd57610e605261012051610e805261014051610ea05261016051610ec052610180518060011c6118fd57610ee0526101a051610f00526101c051610f20526101e0516060018051810160208151116118fd57805160208160051b0180610f40828560045afa505050506020810151810180518060a01c6118fd57611360526020810151611380526040810151810160148151116118fd5780516113a05260208101516113c05250506040810151810160018151116118fd5780516113e0526020810151611400525050610dc06101806107606101808360045afa5061018081016104e06108e06104e08360045afa505050602060206119695f395f516353f00b146115405260e0306115605233611580526004356115a05260206119695f395f5163f698da25610dc0526020610dc06004610ddc845afa6113ac573d5f5f3e3d5ffd5b60203d106118fd57610dc09050516115c0525f6115e0528061160052610180610e2061018061076060045afa50610180610e0052610e00816115600160208251018082828560045afa50508051806020830101601f825f03163682375050601f19601f8251602001011690509050810190508061162052602080610fc05280610fc00160608082528082015f6108e0518083528060051b5f82602081116118fd57801561147357905b8060051b61090001518160051b602088010152600101818118611455575b505082016020019150509050810190508060208301528082016060610d00518252610d20516020830152806040830152808201610d40518152610d605160208201528051806020830101601f825f03163682375050601f19601f82516020010116905081019050905081019050806040830152808201610d80518152610da05160208201528051806020830101601f825f03163682375050601f19601f82516020010116905081019050905081019050610fa052610fa0816115600160208251018082828560045afa50508051806020830101601f825f03163682375050601f19601f825160200101169050905081015050602061154061082461155c845afa61157f573d5f5f3e3d5ffd5b60203d106118fd57611540518060201b6118fd57611d8052611d809050f3611795565b632eb078cd811861179557346118fd5760206119295f395f5163d4b83992606052602060606004607c845afa6115da573d5f5f3e3d5ffd5b60203d106118fd576060518060a01c6118fd5760a05260a09050516040526040516370a082316080523060a052602060806024609c845afa61161e573d5f5f3e3d5ffd5b60203d106118fd576080905051606052606051156116825760405163a9059cbb608052602061192960a03960605160c052602060806044609c5f855af1611667573d5f5f3e3d5ffd5b60203d106118fd576080518060011c6118fd5760e05260e050505b60206060f3611795565b6301ffc9a78118611795576024361034176118fd576004358060201b6118fd576040527f62af8dc200000000000000000000000000000000000000000000000000000000604051146118fd576040517f01ffc9a700000000000000000000000000000000000000000000000000000000811861170957600161178a565b7fa3b5e31100000000000000000000000000000000000000000000000000000000811861173757600161178a565b7fb8296fc400000000000000000000000000000000000000000000000000000000811861176557600161178a565b7f1626ba7e000000000000000000000000000000000000000000000000000000008118155b905060805260206080f35b5f5ffd5b60206119295f395f5163d4b83992608052602060806004609c845afa6117c1573d5f5f3e3d5ffd5b60203d106118fd576080518060a01c6118fd5760c05260c090505160605260405181526060516020820152602061192960408301395f6060820152600154608082015260206119295f395f5163dffe059c608052600460a052604060806024609c845afa611831573d5f5f3e3d5ffd5b60403d106118fd5760809050602081019050518060201c6118fd5760a08201527f058315b749613051abcbf50cf2d605b4fa4a41554ec35d73fd058fc530da559f60c08201525f60e08201527ff3b277728b3fee749481eb3e0b3b48980dbbab78658fc419025cb16eee34677561010082015260016101208201527f5a28e9363bb942b639270062aa6bb295f434bcdfc42c97267bf003f272060dc96101408201527f5a28e9363bb942b639270062aa6bb295f434bcdfc42c97267bf003f272060dc961016082015250565b5f80fd0234179511d71795179501f601bb001800741795179517950a291795078617950dd015a21795168c000000000000000000000000bb7404f9965487a9dde721b3a5f0f3ccfa9aa4c5000000000000000000000000c92e8bdf79f0507f65a392b0ab4667716bfe0110000000000000000000000000fdafc9d1902f4e0b84f65f49f244b32b31013b74

Block Transaction Gas Used Reward
view all blocks validated

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits

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.