Abstract Testnet

Contract

0x00000c57a1af00A8E45a8a72c5480088A900E555

Overview

ETH Balance

0 ETH

Multichain Info

N/A
Transaction Hash
Method
Block
From
To

There are no matching entries

1 Internal Transaction found.

Latest 1 internal transaction

Parent Transaction Hash Block From To
45135312025-01-17 13:40:5221 hrs ago1737121252  Contract Creation0 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ExclusiveDelegateResolver

Compiler Version
v0.8.28+commit.7893614a

ZkSolc Version
v1.5.7

Optimization Enabled:
Yes with Mode 3

Other Settings:
cancun EvmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 2 : ExclusiveDelegateResolver.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.28;

import {IDelegateRegistry} from "./interfaces/IDelegateRegistry.sol";

/**
 * @title ExclusiveDelegateResolver
 * @author 0xQuit
 * @notice A contract to resolve a single canonical delegated owner for a given ERC721 token
 * @dev This contract is designed to be used in conjunction with a delegate registry to resolve the most specific
 * delegation that matches the rights, with specificity being determined by delegation type in order of ERC721 >
 * CONTRACT > ALL. ERC20 and ERC1155 are not supported. If multiple delegations of the same specificity match the rights,
 * the most recent one is respected. If no delegation matches the rights, global delegations (bytes24(0) are considered,
 * but MUST have an expiration greater than 0 to avoid conflicts with pre-existing delegations.
 * If no delegation matches the rights and there are no empty delegations, the owner is returned.
 * Expirations are supported by extracting a uint40 from the final 40 bits of a given delegation's rights value.
 * If the expiration is past, the delegation is not considered to match the request.
 */
contract ExclusiveDelegateResolver {
    /// @dev The address of the Delegate Registry contract
    address public constant DELEGATE_REGISTRY = 0x0000000059A24EB229eED07Ac44229DB56C5d797;

    /// @dev The rights value for a global delegation. These are considered only if no delegation by rights matches the request.
    bytes24 public constant GLOBAL_DELEGATION = bytes24(0);

    /**
     * @notice Gets an exclusive wallet delegation, resolved through delegatexyz if possible
     * @param vault The vault address
     * @param rights The rights to check
     * @return owner The vault wallet address or delegated wallet if one exists
     * @notice returns the most recent delegation that matches the rights for an entire wallet delegation
     * (type ALL) if multiple delegations of the same specificity match the rights, the most recent one is respected.
     * If no delegation matches the rights, global delegations (bytes24(0) are considered,
     * but MUST have an expiration greater than 0 to avoid conflicts with pre-existing delegations.
     * If no delegation matches the rights and there are no empty delegations, the owner is returned.
     * Expirations are supported by extracting a uint40 from the final 40 bits of a given delegation's rights value.
     * If the expiration is past, the delegation is not considered to match the request.
     */
    function exclusiveWalletByRights(address vault, bytes24 rights) public view returns (address) {
        IDelegateRegistry.Delegation[] memory delegations =
            IDelegateRegistry(DELEGATE_REGISTRY).getOutgoingDelegations(vault);

        IDelegateRegistry.Delegation memory delegationToReturn;

        for (uint256 i = delegations.length; i > 0;) {
            unchecked {
                --i;
            }
            IDelegateRegistry.Delegation memory delegation = delegations[i];

            if (_delegationMatchesRequest(delegation, rights)) {
                if (_delegationOutranksCurrent(delegationToReturn, delegation)) {
                    // re-check rights here to ensure global delegation does not get early returned
                    if (
                        delegation.type_ == IDelegateRegistry.DelegationType.ALL && bytes24(delegation.rights) == rights
                    ) {
                        return delegation.to;
                    }
                    delegationToReturn = delegation;
                }
            }
        }

        return delegationToReturn.to == address(0) ? vault : delegationToReturn.to;
    }

    /**
     * @notice Gets all wallets that have delegated to a given wallet
     * @param wallet The wallet to check
     * @param rights The rights to check
     * @return wallets The wallets that have delegated to the given wallet
     * @notice returns all wallets that have delegated to the given wallet, filtered by the rights
     * if multiple delegations of the same specificity match the rights, the most recent one is respected.
     * If no delegation matches the rights, global delegations (bytes24(0)) are considered,
     * but MUST have an expiration greater than 0 to avoid conflicts with pre-existing delegations.
     * Expirations are supported by extracting a uint40 from the final 40 bits of a given delegation's rights value.
     * If the expiration is past, the delegation is not considered to match the request.
     */
    function delegatedWalletsByRights(address wallet, bytes24 rights) external view returns (address[] memory) {
        IDelegateRegistry.Delegation[] memory delegations =
            IDelegateRegistry(DELEGATE_REGISTRY).getIncomingDelegations(wallet);

        uint256 matchesCount = 0;
        bool[] memory matches = new bool[](delegations.length);

        for (uint256 i; i < delegations.length; ++i) {
            IDelegateRegistry.Delegation memory delegation = delegations[i];

            if (_delegationMatchesRequest(delegation, rights)) {
                if (exclusiveWalletByRights(delegation.from, rights) == wallet) {
                    matches[i] = true;
                    matchesCount++;
                }
            }
        }

        address[] memory matchesArray = new address[](matchesCount);
        uint256 matchesIndex = 0;
        // filter to the delegated wallets that match the request
        for (uint256 i; i < delegations.length; ++i) {
            if (matches[i]) {
                matchesArray[matchesIndex] = delegations[i].from;
                matchesIndex++;
            }
        }
        return matchesArray;
    }

    /**
     * @notice Gets the owner of an ERC721 token, resolved through delegatexyz if possible
     * @param contractAddress The ERC721 contract address
     * @param tokenId The token ID to check
     * @return owner The owner address or delegated owner if one exists
     * @notice returns the most specific delegation that matches the rights, with specificity being determined
     * by delegation type in order of ERC721 > CONTRACT > ALL. ERC20 and ERC1155 are not supported
     * if multiple delegations of the same specificity match the rights, the most recent one is respected.
     * If no delegation matches the rights, global delegations (bytes24(0) are considered,
     * but MUST have an expiration greater than 0 to avoid conflicts with pre-existing delegations.
     * If no delegation matches the rights and there are no empty delegations, the owner is returned.
     * Expirations are supported by extracting a uint40 from the final 40 bits of a given delegation's rights value.
     * If the expiration is past, the delegation is not considered to match the request.
     */
    function exclusiveOwnerByRights(address contractAddress, uint256 tokenId, bytes24 rights)
        external
        view
        returns (address owner)
    {
        owner = _getOwner(contractAddress, tokenId);

        IDelegateRegistry.Delegation[] memory delegations =
            IDelegateRegistry(DELEGATE_REGISTRY).getOutgoingDelegations(owner);

        IDelegateRegistry.Delegation memory delegationToReturn;

        for (uint256 i = delegations.length; i > 0;) {
            unchecked {
                --i;
            }
            IDelegateRegistry.Delegation memory delegation = delegations[i];

            if (_delegationMatchesRequest(delegation, contractAddress, tokenId, rights)) {
                if (_delegationOutranksCurrent(delegationToReturn, delegation)) {
                    // re-check rights here to ensure global ERC721 type delegations do not get early returned
                    if (
                        delegation.type_ == IDelegateRegistry.DelegationType.ERC721
                            && bytes24(delegation.rights) == rights
                    ) {
                        return delegation.to;
                    }

                    delegationToReturn = delegation;
                }
            }
        }

        return delegationToReturn.to == address(0) ? owner : delegationToReturn.to;
    }

    /**
     * @notice Decodes a rights bytes32 value into its identifier and expiration
     * @param rights The rights bytes32 value
     * @return rightsIdentifier The rights identifier
     * @return expiration The expiration timestamp
     */
    function decodeRightsExpiration(bytes32 rights) public pure returns (bytes24, uint40) {
        bytes24 rightsIdentifier = bytes24(rights);
        uint40 expiration = uint40(uint256(rights));

        return (rightsIdentifier, expiration);
    }

    /**
     * @notice Convenience function to generate a rights bytes32 rights value with an expiration
     * @param rightsIdentifier The rights identifier
     * @param expiration The expiration timestamp
     * @return rights The rights bytes32 value
     */
    function generateRightsWithExpiration(bytes24 rightsIdentifier, uint40 expiration)
        external
        pure
        returns (bytes32)
    {
        uint256 rights = uint256(uint192(rightsIdentifier)) << 64;
        return bytes32(rights | uint256(expiration));
    }

    function _delegationMatchesRequest(IDelegateRegistry.Delegation memory delegation, bytes24 rights)
        internal
        view
        returns (bool)
    {
        (bytes24 rightsIdentifier, uint40 expiration) = decodeRightsExpiration(delegation.rights);

        if (block.timestamp > expiration) {
            return false;
        } else if (rightsIdentifier != rights && rightsIdentifier != GLOBAL_DELEGATION) {
            return false;
        } else if (delegation.type_ == IDelegateRegistry.DelegationType.ALL) {
            return true;
        } else {
            return false;
        }
    }

    function _delegationMatchesRequest(
        IDelegateRegistry.Delegation memory delegation,
        address contractAddress,
        uint256 tokenId,
        bytes24 rights
    ) internal view returns (bool) {
        // Extract rights identifier (remaining 192 bits)
        (bytes24 rightsIdentifier, uint40 expiration) = decodeRightsExpiration(delegation.rights);

        if (block.timestamp > expiration) {
            return false;
        } else if (rightsIdentifier != rights && rightsIdentifier != GLOBAL_DELEGATION) {
            return false;
        } else if (delegation.type_ == IDelegateRegistry.DelegationType.ALL) {
            return true;
        } else if (delegation.type_ == IDelegateRegistry.DelegationType.CONTRACT) {
            return delegation.contract_ == contractAddress;
        } else if (delegation.type_ == IDelegateRegistry.DelegationType.ERC721) {
            return delegation.contract_ == contractAddress && delegation.tokenId == tokenId;
        } else {
            return false;
        }
    }

    function _delegationOutranksCurrent(
        IDelegateRegistry.Delegation memory currentDelegation,
        IDelegateRegistry.Delegation memory newDelegation
    ) internal pure returns (bool) {
        bytes24 currentRightsIdentifier = bytes24(currentDelegation.rights);
        bytes24 newRightsIdentifier = bytes24(newDelegation.rights);

        if (currentRightsIdentifier == newRightsIdentifier) {
            return newDelegation.type_ > currentDelegation.type_;
        } else if (currentRightsIdentifier == GLOBAL_DELEGATION) {
            return true;
        } else {
            return false;
        }
    }

    function _getOwner(address contractAddress, uint256 tokenId) internal view returns (address owner) {
        /// @solidity memory-safe-assembly
        assembly {
            let m := mload(0x40)
            mstore(m, 0x6352211e00000000000000000000000000000000000000000000000000000000)
            mstore(add(m, 0x04), tokenId)
            let success := staticcall(gas(), contractAddress, m, 0x24, m, 0x20)
            if iszero(success) {
                mstore(0x00, 0x3204506f) // CallFailed()
                revert(0x1c, 0x04)
            }
            owner := mload(m)
        }
    }
}

File 2 of 2 : IDelegateRegistry.sol
// SPDX-License-Identifier: CC0-1.0
pragma solidity >=0.8.13;

/**
 * @title IDelegateRegistry
 * @custom:version 2.0
 * @custom:author foobar (0xfoobar)
 * @notice A standalone immutable registry storing delegated permissions from one address to another
 */
interface IDelegateRegistry {
    /// @notice Delegation type, NONE is used when a delegation does not exist or is revoked
    enum DelegationType {
        NONE,
        ALL,
        CONTRACT,
        ERC721,
        ERC20,
        ERC1155
    }

    /// @notice Struct for returning delegations
    struct Delegation {
        DelegationType type_;
        address to;
        address from;
        bytes32 rights;
        address contract_;
        uint256 tokenId;
        uint256 amount;
    }

    /// @notice Emitted when an address delegates or revokes rights for their entire wallet
    event DelegateAll(address indexed from, address indexed to, bytes32 rights, bool enable);

    /// @notice Emitted when an address delegates or revokes rights for a contract address
    event DelegateContract(
        address indexed from, address indexed to, address indexed contract_, bytes32 rights, bool enable
    );

    /// @notice Emitted when an address delegates or revokes rights for an ERC721 tokenId
    event DelegateERC721(
        address indexed from,
        address indexed to,
        address indexed contract_,
        uint256 tokenId,
        bytes32 rights,
        bool enable
    );

    /// @notice Emitted when an address delegates or revokes rights for an amount of ERC20 tokens
    event DelegateERC20(
        address indexed from, address indexed to, address indexed contract_, bytes32 rights, uint256 amount
    );

    /// @notice Emitted when an address delegates or revokes rights for an amount of an ERC1155 tokenId
    event DelegateERC1155(
        address indexed from,
        address indexed to,
        address indexed contract_,
        uint256 tokenId,
        bytes32 rights,
        uint256 amount
    );

    /// @notice Thrown if multicall calldata is malformed
    error MulticallFailed();

    /**
     * -----------  WRITE -----------
     */

    /**
     * @notice Call multiple functions in the current contract and return the data from all of them if they all succeed
     * @param data The encoded function data for each of the calls to make to this contract
     * @return results The results from each of the calls passed in via data
     */
    function multicall(bytes[] calldata data) external payable returns (bytes[] memory results);

    /**
     * @notice Allow the delegate to act on behalf of `msg.sender` for all contracts
     * @param to The address to act as delegate
     * @param rights Specific subdelegation rights granted to the delegate, pass an empty bytestring to encompass all rights
     * @param enable Whether to enable or disable this delegation, true delegates and false revokes
     * @return delegationHash The unique identifier of the delegation
     */
    function delegateAll(address to, bytes32 rights, bool enable) external payable returns (bytes32 delegationHash);

    /**
     * @notice Allow the delegate to act on behalf of `msg.sender` for a specific contract
     * @param to The address to act as delegate
     * @param contract_ The contract whose rights are being delegated
     * @param rights Specific subdelegation rights granted to the delegate, pass an empty bytestring to encompass all rights
     * @param enable Whether to enable or disable this delegation, true delegates and false revokes
     * @return delegationHash The unique identifier of the delegation
     */
    function delegateContract(address to, address contract_, bytes32 rights, bool enable)
        external
        payable
        returns (bytes32 delegationHash);

    /**
     * @notice Allow the delegate to act on behalf of `msg.sender` for a specific ERC721 token
     * @param to The address to act as delegate
     * @param contract_ The contract whose rights are being delegated
     * @param tokenId The token id to delegate
     * @param rights Specific subdelegation rights granted to the delegate, pass an empty bytestring to encompass all rights
     * @param enable Whether to enable or disable this delegation, true delegates and false revokes
     * @return delegationHash The unique identifier of the delegation
     */
    function delegateERC721(address to, address contract_, uint256 tokenId, bytes32 rights, bool enable)
        external
        payable
        returns (bytes32 delegationHash);

    /**
     * @notice Allow the delegate to act on behalf of `msg.sender` for a specific amount of ERC20 tokens
     * @dev The actual amount is not encoded in the hash, just the existence of a amount (since it is an upper bound)
     * @param to The address to act as delegate
     * @param contract_ The address for the fungible token contract
     * @param rights Specific subdelegation rights granted to the delegate, pass an empty bytestring to encompass all rights
     * @param amount The amount to delegate, > 0 delegates and 0 revokes
     * @return delegationHash The unique identifier of the delegation
     */
    function delegateERC20(address to, address contract_, bytes32 rights, uint256 amount)
        external
        payable
        returns (bytes32 delegationHash);

    /**
     * @notice Allow the delegate to act on behalf of `msg.sender` for a specific amount of ERC1155 tokens
     * @dev The actual amount is not encoded in the hash, just the existence of a amount (since it is an upper bound)
     * @param to The address to act as delegate
     * @param contract_ The address of the contract that holds the token
     * @param tokenId The token id to delegate
     * @param rights Specific subdelegation rights granted to the delegate, pass an empty bytestring to encompass all rights
     * @param amount The amount of that token id to delegate, > 0 delegates and 0 revokes
     * @return delegationHash The unique identifier of the delegation
     */
    function delegateERC1155(address to, address contract_, uint256 tokenId, bytes32 rights, uint256 amount)
        external
        payable
        returns (bytes32 delegationHash);

    /**
     * ----------- CHECKS -----------
     */

    /**
     * @notice Check if `to` is a delegate of `from` for the entire wallet
     * @param to The potential delegate address
     * @param from The potential address who delegated rights
     * @param rights Specific rights to check for, pass the zero value to ignore subdelegations and check full delegations only
     * @return valid Whether delegate is granted to act on the from's behalf
     */
    function checkDelegateForAll(address to, address from, bytes32 rights) external view returns (bool);

    /**
     * @notice Check if `to` is a delegate of `from` for the specified `contract_` or the entire wallet
     * @param to The delegated address to check
     * @param contract_ The specific contract address being checked
     * @param from The cold wallet who issued the delegation
     * @param rights Specific rights to check for, pass the zero value to ignore subdelegations and check full delegations only
     * @return valid Whether delegate is granted to act on from's behalf for entire wallet or that specific contract
     */
    function checkDelegateForContract(address to, address from, address contract_, bytes32 rights)
        external
        view
        returns (bool);

    /**
     * @notice Check if `to` is a delegate of `from` for the specific `contract` and `tokenId`, the entire `contract_`, or the entire wallet
     * @param to The delegated address to check
     * @param contract_ The specific contract address being checked
     * @param tokenId The token id for the token to delegating
     * @param from The wallet that issued the delegation
     * @param rights Specific rights to check for, pass the zero value to ignore subdelegations and check full delegations only
     * @return valid Whether delegate is granted to act on from's behalf for entire wallet, that contract, or that specific tokenId
     */
    function checkDelegateForERC721(address to, address from, address contract_, uint256 tokenId, bytes32 rights)
        external
        view
        returns (bool);

    /**
     * @notice Returns the amount of ERC20 tokens the delegate is granted rights to act on the behalf of
     * @param to The delegated address to check
     * @param contract_ The address of the token contract
     * @param from The cold wallet who issued the delegation
     * @param rights Specific rights to check for, pass the zero value to ignore subdelegations and check full delegations only
     * @return balance The delegated balance, which will be 0 if the delegation does not exist
     */
    function checkDelegateForERC20(address to, address from, address contract_, bytes32 rights)
        external
        view
        returns (uint256);

    /**
     * @notice Returns the amount of a ERC1155 tokens the delegate is granted rights to act on the behalf of
     * @param to The delegated address to check
     * @param contract_ The address of the token contract
     * @param tokenId The token id to check the delegated amount of
     * @param from The cold wallet who issued the delegation
     * @param rights Specific rights to check for, pass the zero value to ignore subdelegations and check full delegations only
     * @return balance The delegated balance, which will be 0 if the delegation does not exist
     */
    function checkDelegateForERC1155(address to, address from, address contract_, uint256 tokenId, bytes32 rights)
        external
        view
        returns (uint256);

    /**
     * ----------- ENUMERATIONS -----------
     */

    /**
     * @notice Returns all enabled delegations a given delegate has received
     * @param to The address to retrieve delegations for
     * @return delegations Array of Delegation structs
     */
    function getIncomingDelegations(address to) external view returns (Delegation[] memory delegations);

    /**
     * @notice Returns all enabled delegations an address has given out
     * @param from The address to retrieve delegations for
     * @return delegations Array of Delegation structs
     */
    function getOutgoingDelegations(address from) external view returns (Delegation[] memory delegations);

    /**
     * @notice Returns all hashes associated with enabled delegations an address has received
     * @param to The address to retrieve incoming delegation hashes for
     * @return delegationHashes Array of delegation hashes
     */
    function getIncomingDelegationHashes(address to) external view returns (bytes32[] memory delegationHashes);

    /**
     * @notice Returns all hashes associated with enabled delegations an address has given out
     * @param from The address to retrieve outgoing delegation hashes for
     * @return delegationHashes Array of delegation hashes
     */
    function getOutgoingDelegationHashes(address from) external view returns (bytes32[] memory delegationHashes);

    /**
     * @notice Returns the delegations for a given array of delegation hashes
     * @param delegationHashes is an array of hashes that correspond to delegations
     * @return delegations Array of Delegation structs, return empty structs for nonexistent or revoked delegations
     */
    function getDelegationsFromHashes(bytes32[] calldata delegationHashes)
        external
        view
        returns (Delegation[] memory delegations);

    /**
     * ----------- STORAGE ACCESS -----------
     */

    /**
     * @notice Allows external contracts to read arbitrary storage slots
     */
    function readSlot(bytes32 location) external view returns (bytes32);

    /**
     * @notice Allows external contracts to read an arbitrary array of storage slots
     */
    function readSlots(bytes32[] calldata locations) external view returns (bytes32[] memory);
}

Settings
{
  "viaIR": false,
  "codegen": "yul",
  "remappings": [
    "solady/=lib/solady/src/",
    "forge/=lib/forge-std/src/",
    "forge-std/=lib/forge-std/src/"
  ],
  "evmVersion": "cancun",
  "outputSelection": {
    "*": {
      "*": [
        "abi",
        "metadata"
      ],
      "": [
        "ast"
      ]
    }
  },
  "optimizer": {
    "enabled": true,
    "mode": "3",
    "fallback_to_optimizing_for_size": false,
    "disable_system_request_memoization": true
  },
  "metadata": {},
  "libraries": {},
  "enableEraVMExtensions": false,
  "forceEVMLA": false
}

Contract ABI

[{"inputs":[],"name":"DELEGATE_REGISTRY","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GLOBAL_DELEGATION","outputs":[{"internalType":"bytes24","name":"","type":"bytes24"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"rights","type":"bytes32"}],"name":"decodeRightsExpiration","outputs":[{"internalType":"bytes24","name":"","type":"bytes24"},{"internalType":"uint40","name":"","type":"uint40"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"bytes24","name":"rights","type":"bytes24"}],"name":"delegatedWalletsByRights","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes24","name":"rights","type":"bytes24"}],"name":"exclusiveOwnerByRights","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"vault","type":"address"},{"internalType":"bytes24","name":"rights","type":"bytes24"}],"name":"exclusiveWalletByRights","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes24","name":"rightsIdentifier","type":"bytes24"},{"internalType":"uint40","name":"expiration","type":"uint40"}],"name":"generateRightsWithExpiration","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"}]

3cda335100000000000000000000000000000000000000001abc31881b858cbe520c00400100018b48cb08d55e462ad7fc8441b148abb246b96d4322b71eb479fa8e16eb00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x0002000000000002001300000000000200010000000103550000006003100270000001650030019d0000008004000039000000400040043f0000000100200190000000270000c13d0000016502300197000000040020008c000002260000413d000000000301043b000000e003300270000001670030009c0000002f0000a13d000001680030009c000000500000213d0000016b0030009c000001080000613d0000016c0030009c000002260000c13d000000440020008c000002260000413d0000000002000416000000000002004b000002260000c13d0000000402100370000000000202043b0000017100200198000002260000c13d0000002401100370000000000101043b0000017e0010009c000002260000213d000000000121019f000000800010043f0000018301000041000005900001042e0000000001000416000000000001004b000002260000c13d0000002001000039000001000010044300000120000004430000016601000041000005900001042e0000016d0030009c0000010f0000613d0000016e0030009c0000011c0000613d0000016f0030009c000002260000c13d000000640020008c000002260000413d0000000002000416000000000002004b000002260000c13d0000000402100370000000000202043b000b00000002001d000001700020009c000002260000213d0000004402100370000000000202043b000a00000002001d0000017100200198000002260000c13d0000002401100370000000000201043b0000018401000041000000800010043f000900000002001d000000840020043f00000000010004140000000b02000029000000040020008c000001380000c13d00000080030000390000015b0000013d000001690030009c000001320000613d0000016a0030009c000002260000c13d000000440020008c000002260000413d0000000002000416000000000002004b000002260000c13d0000000402100370000000000202043b000400000002001d000001700020009c000002260000213d0000002401100370000000000101043b000300000001001d0000017100100198000002260000c13d0000017201000041000000800010043f0000000401000029000000840010043f0000000001000414000001650010009c0000016501008041000000c00110021000000173011001c70000017402000041058f058a0000040f00000060031002700000001f0430018f000001750530019700000165033001970000000100200190000001bd0000613d0000008002500039000000000005004b00000080080000390000007d0000613d000000000601034f000000006706043c0000000008780436000000000028004b000000790000c13d000000000004004b0000008a0000613d000000000151034f0000000304400210000000000502043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001204350000001f013000390000017601100197000100000001001d0000008001100039000c00000001001d000000400010043f000000200030008c000002260000413d000000800200043d000001710020009c000002260000213d00000080013000390000009f03200039000000000013004b000002260000813d00000080032000390000000004030433000001710040009c000001b70000213d00000005034002100000003f0330003900000177033001970000000c03300029000001710030009c000001b70000213d000000400030043f0000000c030000290000000000430435000000a002200039000000e0034000c90000000003230019000000000013004b000002260000213d000000000004004b0000000004000019000001e90000c13d00000005014002100000003f021000390000017a03200197000000400200043d000b00000002001d0000000002230019000000000032004b00000000030000390000000103004039000001710020009c000001b70000213d0000000100300190000001b70000c13d000000400020043f0000000b020000290000000002420436000a00000002001d0000001f0210018f000000000001004b000000ca0000613d0000000a04000029000000000114001900000000030000310000000103300367000000003503043c0000000004540436000000000014004b000000c60000c13d000000000002004b0000000c010000290000000001010433000000000001004b000200000000001d000002730000c13d000000020100002900000005031002100000003f013000390000017a04100197000000400200043d0000000001240019000000000041004b00000000040000390000000104004039000001710010009c000001b70000213d0000000100400190000001b70000c13d000000400010043f000000020100002900000000011204360000001f0430018f000000000003004b000000eb0000613d0000000003310019000000000500003100000001055003670000000006010019000000005705043c0000000006760436000000000036004b000000e70000c13d000000000004004b0000000c030000290000000006030433000000000006004b000003b50000c13d000000400300043d00000020040000390000000005430436000000000402043300000000004504350000004002300039000000000004004b000000ff0000613d00000000050000190000000016010434000001700660019700000000026204360000000105500039000000000045004b000000f90000413d0000000001320049000001650010009c00000165010080410000006001100210000001650030009c00000165030080410000004002300210000000000121019f000005900001042e0000000001000416000000000001004b000002260000c13d0000017401000041000000800010043f0000018301000041000005900001042e000000240020008c000002260000413d0000000002000416000000000002004b000002260000c13d0000000401100370000000000101043b0000017b02100197000000800020043f0000017e01100197000000a00010043f0000018801000041000005900001042e000000440020008c000002260000413d0000000002000416000000000002004b000002260000c13d0000000401100370000000000101043b000001700010009c000002260000213d001300000001001d058f04530000040f00000000020100190000001301000029058f045b0000040f0000017001100197000000400200043d0000000000120435000001650020009c0000016502008041000000400120021000000187011001c7000005900001042e0000000001000416000000000001004b000002260000c13d000000800000043f0000018301000041000005900001042e000001650010009c0000016501008041000000c00110021000000173011001c7058f058a0000040f00000060031002700000016503300197000000200030008c00000020030080390000001f0430018f000000200530019000000080035001bf0000014b0000613d0000008006000039000000000701034f000000007807043c0000000006860436000000000036004b000001470000c13d000000000004004b000001580000613d000000000151034f0000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001304350000000100200190000001e50000613d000000400300043d001300000003001d000000800200043d0000017f010000410000000000130435000800000002001d000001700120019700000004023000390000000000120435000001650030009c0000016501000041000000000103401900000040011002100000000002000414000001650020009c0000016502008041000000c002200210000000000112019f00000180011001c70000017402000041058f058a0000040f00000060031002700000001f0430018f000001750530019700000165033001970000000100200190000001c80000613d00000013090000290000000002590019000000000005004b0000017f0000613d000000000601034f0000000007090019000000006806043c0000000007870436000000000027004b0000017b0000c13d000000000004004b0000018c0000613d000000000151034f0000000304400210000000000502043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001204350000001f0130003900000176011001970000000002910019000000000012004b00000000010000390000000101004039000e00000002001d000001710020009c000001b70000213d0000000100100190000001b70000c13d0000000e01000029000000400010043f000000200030008c000002260000413d0000000002090433000001710020009c000002260000213d000000000193001900000000029200190000001f03200039000000000013004b0000000004000019000001810400804100000181033001970000018105100197000000000653013f000000000053004b00000000030000190000018103004041000001810060009c000000000304c019000000000003004b000002260000c13d0000000023020434000001710030009c000001b70000213d00000005043002100000003f0440003900000177044001970000000e04400029000001710040009c0000021e0000a13d0000018201000041000000000010043f0000004101000039000000040010043f00000180010000410000059100010430000000400200043d0000000006520019000000000005004b000001d20000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000068004b000001c30000c13d000001d20000013d000000400200043d0000000006520019000000000005004b000001d20000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000068004b000001ce0000c13d000000000004004b000001df0000613d000000000151034f0000000304400210000000000506043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001604350000006001300210000001650020009c00000165020080410000004002200210000000000112019f00000591000104300000018501000041000000000010043f000001860100004100000591000104300000000c040000290000000005210049000001780050009c000002260000213d000000e00050008c000002260000413d000000400500043d000001790050009c000001b70000213d000000e006500039000000400060043f0000000067020434000000050070008c000002260000213d00000000077504360000000006060433000001700060009c000002260000213d000000000067043500000040062000390000000006060433000001700060009c000002260000213d00000040075000390000000000670435000000600650003900000060072000390000000007070433000000000076043500000080062000390000000006060433000001700060009c000002260000213d000000200440003900000080075000390000000000670435000000a0062000390000000006060433000000a0075000390000000000670435000000c0062000390000000006060433000000c00750003900000000006704350000000000540435000000e002200039000000000032004b000001ea0000413d0000000c010000290000000004010433000001710040009c000000ae0000a13d000001b70000013d000000400040043f0000000e040000290000000004340436000d00000004001d000000e0033000c90000000003230019000000000013004b000002280000a13d00000000010000190000059100010430000000000032004b0000025a0000813d0000000e040000290000000005210049000001780050009c000002260000213d000000e00050008c000002260000413d000000400500043d000001790050009c000001b70000213d000000e006500039000000400060043f0000000067020434000000050070008c000002260000213d00000000077504360000000006060433000001700060009c000002260000213d000000000067043500000040062000390000000006060433000001700060009c000002260000213d00000040075000390000000000670435000000600650003900000060072000390000000007070433000000000076043500000080062000390000000006060433000001700060009c000002260000213d000000200440003900000080075000390000000000670435000000a0062000390000000006060433000000a0075000390000000000670435000000c0062000390000000006060433000000c00750003900000000006704350000000000540435000000e002200039000000000032004b0000022b0000413d000000400100043d000001790010009c000001b70000213d0000000006010019000000e001600039000000400010043f000000c0016000390000000000010435000000a00160003900000000000104350000008001600039000000000001043500000060016000390000000000010435000000400160003900000000000104350000002001600039000000000001043500000000000604350000000e010000290000000001010433000000000001004b000003da0000c13d00000008010000290000012a0000013d00000003010000290008017b0010019b0000000101000029000600a00010003d0000000002000019000200000000001d000002800000013d000000090200002900000001022000390000000c010000290000000001010433000000000012004b000004440000813d000900000002001d0000000502200210000700000002001d00000006012000290000000001010433001200000001001d00000060011000390000000001010433001300000001001d0000017c0100004100000000001004430000000001000414000001650010009c0000016501008041000000c0011002100000017d011001c70000800b02000039058f058a0000040f0000000100200190000004380000613d00000013030000290000017e02300197000000000101043b000000000021004b0000027a0000213d0000017b01300197000000080010006c0000029e0000613d000000000001004b0000027a0000c13d00000012020000290000000001020433000000050010008c000004390000213d000000010010008c0000027a0000c13d00000040012000390000000001010433000000400300043d0000017f02000041000000000023043500000170021001970000000401300039000e00000002001d0000000000210435000001650030009c001300000003001d0000016501000041000000000103401900000040011002100000000002000414000001650020009c0000016502008041000000c002200210000000000112019f00000180011001c70000017402000041058f058a0000040f00000060031002700000001f0430018f000001750530019700000165033001970000000100200190000004480000613d00000013090000290000000002590019000000000005004b000002ca0000613d000000000601034f0000000007090019000000006806043c0000000007870436000000000027004b000002c60000c13d000000000004004b000002d70000613d000000000151034f0000000304400210000000000502043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001204350000001f0130003900000176011001970000000002910019000000000012004b00000000010000390000000101004039001100000002001d000001710020009c000001b70000213d0000000100100190000001b70000c13d0000001101000029000000400010043f000000200030008c000002260000413d0000000002090433000001710020009c000002260000213d000000000193001900000000029200190000001f03200039000000000013004b0000000004000019000001810400804100000181033001970000018105100197000000000653013f000000000053004b00000000030000190000018103004041000001810060009c000000000304c019000000000003004b000002260000c13d0000000023020434000001710030009c000001b70000213d00000005043002100000003f0440003900000177044001970000001104400029000001710040009c000001b70000213d000000400040043f00000011040000290000000004340436000d00000004001d000000e0033000c90000000003230019000000000013004b000002260000213d000000000032004b0000033c0000813d00000011040000290000000005210049000001780050009c000002260000213d000000e00050008c000002260000413d000000400500043d000001790050009c000001b70000213d000000e006500039000000400060043f0000000067020434000000050070008c000002260000213d00000000077504360000000006060433000001700060009c000002260000213d000000000067043500000040062000390000000006060433000001700060009c000002260000213d00000040075000390000000000670435000000600650003900000060072000390000000007070433000000000076043500000080062000390000000006060433000001700060009c000002260000213d000000200440003900000080075000390000000000670435000000a0062000390000000006060433000000a0075000390000000000670435000000c0062000390000000006060433000000c00750003900000000006704350000000000540435000000e002200039000000000032004b0000030d0000413d000000400200043d000001790020009c000001b70000213d000000e001200039000000400010043f000000c0012000390000000000010435000000a001200039000000000001043500000080012000390000000000010435000000600120003900000000000104350000004001200039000000000001043500000020012000390000000000010435000000000002043500000011010000290000000006010433000000000006004b0000039c0000613d000500000002001d000003580000013d000000000003004b000003910000613d000000000006004b000003980000613d000000010660008a00000011010000290000000001010433000000000061004b000003d40000a13d001300000006001d00000005016002100000000d011000290000000001010433001000000001001d0000006001100039000f00000001001d0000000001010433001200000001001d0000017c0100004100000000001004430000000001000414000001650010009c0000016501008041000000c0011002100000017d011001c70000800b02000039058f058a0000040f0000000100200190000004380000613d00000012030000290000017e02300197000000000101043b000000000021004b0000000e050000290000001306000029000003560000213d0000017b01300197000000080010006c0000037d0000613d000000000001004b000003560000c13d00000010070000290000000012070434000000050020008c000004390000213d000000010020008c000003560000c13d0000000502000029000000600220003900000000020204330000017b032001970000000f0200002900000000020204330000017b04200197000000000043004b000003540000c13d00000005030000290000000003030433000000050030008c000003540000a13d000004390000013d000000030220014f000001710020009c000500000007001d000003560000213d00000000010104330000017005100197000003a00000013d0000000501000029000000200110003900000000010104330000039e0000013d00000000010000190000000e050000290000017001100198000000000501c0190000000902000029000000040050006c0000027b0000c13d0000000b010000290000000001010433000000000021004b000003d40000a13d00000007020000290000000a01200029000000010200003900000000002104350000000201000029000200010010003e00000009020000290000027b0000c13d0000018201000041000000000010043f0000001101000039000000040010043f000001800100004100000591000104300000000103000029000000a00330003900000000040000190000000005000019000003c80000013d0000000506500210000000000616001900000000077300190000000007070433000000400770003900000000070704330000017007700197000000000076043500000001055000390000000c0600002900000000060604330000000104400039000000000064004b000000f00000813d0000000b070000290000000007070433000000000047004b000003d40000a13d00000005074002100000000a087000290000000008080433000000000008004b000003c50000613d0000000006020433000000000056004b000003ba0000213d0000018201000041000000000010043f0000003201000039000000040010043f0000018001000041000005910001043000000000020100190000000a01000029000c017b0010019b000003e20000013d00000000060700190000001102000029000000000002004b0000043f0000613d001300000006001d000000010220008a0000000e010000290000000001010433000000000021004b000003d40000a13d001100000002001d00000005012002100000000d011000290000000001010433001000000001001d0000006001100039000f00000001001d0000000001010433001200000001001d0000017c0100004100000000001004430000000001000414000001650010009c0000016501008041000000c0011002100000017d011001c70000800b02000039058f058a0000040f0000000100200190000004380000613d00000012030000290000017e02300197000000000101043b000000000021004b0000001306000029000003df0000213d0000017b013001970000000c0010006c000004070000613d000000000001004b000003df0000c13d00000010070000290000000012070434000000060020008c000004390000813d000000010020008c000004200000613d000000020020008c0000041b0000613d000000030020008c000003df0000c13d000000800370003900000000030304330000000b0330014f0000017000300198000003df0000c13d000000a0037000390000000003030433000000090030006c000003df0000c13d000004200000013d000000800370003900000000030304330000000b0330014f0000017000300198000003df0000c13d000000600360003900000000030304330000017b043001970000000f0300002900000000030304330000017b05300197000000000054004b0000042e0000c13d0000000004060433000000050040008c000004390000213d000000000042004b000003df0000a13d000004300000013d000000000004004b000003df0000c13d000000030020008c000003de0000c13d0000000a0230014f000001710020009c0000000006070019000003df0000213d00000000010104330000012a0000013d000000000001042f0000018201000041000000000010043f0000002101000039000000040010043f000001800100004100000591000104300000002001600039000000000101043300000170011001980000012a0000c13d000002710000013d0000000201000029000001710010009c000000d00000a13d000001b70000013d000000400200043d0000000006520019000000000005004b000001d20000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000068004b0000044e0000c13d000001d20000013d00000024010000390000000101100367000000000101043b0000017100100198000004590000c13d000000000001042d00000000010000190000059100010430000a000000000002000200000002001d000000400300043d0000017f020000410000000000230435000100000001001d000001700110019700000004023000390000000000120435000001650030009c000a00000003001d0000016501000041000000000103401900000040011002100000000002000414000001650020009c0000016502008041000000c002200210000000000112019f00000180011001c70000017402000041058f058a0000040f00000060031002700000001f0430018f0000017505300197000001650330019700000001002001900000056c0000613d0000000a090000290000000002590019000000000005004b000004810000613d000000000601034f0000000007090019000000006806043c0000000007870436000000000027004b0000047d0000c13d000000000004004b0000048e0000613d000000000151034f0000000304400210000000000502043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001204350000001f0130003900000176011001970000000002910019000000000012004b00000000010000390000000101004039000800000002001d000001710020009c000005590000213d0000000100100190000005590000c13d0000000801000029000000400010043f0000001f0030008c000005570000a13d0000000002090433000001710020009c000005570000213d000000000193001900000000029200190000001f03200039000000000013004b0000000004000019000001810400804100000181033001970000018105100197000000000653013f000000000053004b00000000030000190000018103004041000001810060009c000000000304c019000000000003004b000005570000c13d0000000023020434000001710030009c000005590000213d00000005043002100000003f0440003900000177044001970000000804400029000001710040009c000005590000213d000000400040043f00000008040000290000000004340436000500000004001d000000e0033000c90000000003230019000000000013004b000005570000213d000000000032004b000004f30000813d00000008040000290000000005210049000001780050009c000005570000213d000000e00050008c000005570000413d000000400500043d000001790050009c000005590000213d000000e006500039000000400060043f0000000067020434000000050070008c000005570000213d00000000077504360000000006060433000001700060009c000005570000213d000000000067043500000040062000390000000006060433000001700060009c000005570000213d00000040075000390000000000670435000000600650003900000060072000390000000007070433000000000076043500000080062000390000000006060433000001700060009c000005570000213d000000200440003900000080075000390000000000670435000000a0062000390000000006060433000000a0075000390000000000670435000000c0062000390000000006060433000000c00750003900000000006704350000000000540435000000e002200039000000000032004b000004c40000413d000000400200043d000001790020009c000005590000213d000000e001200039000000400010043f000000c0012000390000000000010435000000a0012000390000000000010435000000800120003900000000000104350000006001200039000000000001043500000040012000390000000000010435000300000002001d0000000001020436000000000001043500000008020000290000000002020433000000000002004b000005510000613d00000002010000290004017b0010019b000005110000013d000000000003004b000005480000613d0000000902000029000000000002004b0000054f0000613d000000010220008a00000008010000290000000001010433000000000021004b0000055f0000a13d000900000002001d000000050120021000000005011000290000000001010433000700000001001d0000006001100039000600000001001d0000000001010433000a00000001001d0000017c0100004100000000001004430000000001000414000001650010009c0000016501008041000000c0011002100000017d011001c70000800b02000039058f058a0000040f0000000100200190000005650000613d0000000a030000290000017e02300197000000000101043b000000000021004b0000050e0000213d0000017b01300197000000040010006c000005340000613d000000000001004b0000050e0000c13d00000007050000290000000012050434000000060020008c000005660000813d000000010020008c0000050e0000c13d0000000302000029000000600220003900000000020204330000017b03200197000000060200002900000000020204330000017b04200197000000000043004b0000050c0000c13d00000003030000290000000003030433000000050030008c0000050c0000a13d000005660000013d000000020220014f000001710020009c000300000005001d0000050e0000213d00000000010104330000017001100197000000000001042d0000000301000029000000200110003900000000010104330000017001100198000000000201001900000001020060290000000001020019000000000001042d000000000100001900000591000104300000018201000041000000000010043f0000004101000039000000040010043f000001800100004100000591000104300000018201000041000000000010043f0000003201000039000000040010043f00000180010000410000059100010430000000000001042f0000018201000041000000000010043f0000002101000039000000040010043f00000180010000410000059100010430000000400200043d0000000006520019000000000005004b000005760000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000068004b000005720000c13d000000000004004b000005830000613d000000000151034f0000000304400210000000000506043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001604350000006001300210000001650020009c00000165020080410000004002200210000000000112019f0000059100010430000000000001042f0000058d002104230000000102000039000000000001042d0000000002000019000000000001042d0000058f00000432000005900001042e00000591000104300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffff0000000200000000000000000000000000000040000001000000000000000000000000000000000000000000000000000000000000000000000000008286eee1000000000000000000000000000000000000000000000000000000009b0cc7d3000000000000000000000000000000000000000000000000000000009b0cc7d400000000000000000000000000000000000000000000000000000000e1030efb000000000000000000000000000000000000000000000000000000008286eee200000000000000000000000000000000000000000000000000000000981c103d000000000000000000000000000000000000000000000000000000003fbac58d0000000000000000000000000000000000000000000000000000000059892657000000000000000000000000000000000000000000000000000000007f63c3dd000000000000000000000000ffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000ffffffffffffffff42f87c250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000240000008000000000000000000000000000000000000000000000000059a24eb229eed07ac44229db56c5d79700000000000000000000000000000000000000000000000000000000ffffffe000000000000000000000000000000000000000000000000000000001ffffffe07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000ffffffffffffff1f00000000000000000000000000000000000000000000003fffffffffffffffe0ffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000796b89b91644bc98cd93958e4c9038275d622183e25ac5af08cc6b5d955391320200000200000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffff51525e9a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002400000000000000000000000080000000000000000000000000000000000000000000000000000000000000004e487b710000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000008000000000000000006352211e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003204506f00000000000000000000000000000000000000040000001c000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000040000000800000000000000000000000000000000000000000000000000000000000000000000000000000000029de6d153045aa11de0ef101215b66254eff70fb8889ab4afee01b30d7a55b95

Block Transaction Gas Used Reward
view all blocks produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
[ Download: CSV Export  ]

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.