ETH Price: $3,398.44 (+1.60%)

Contract

0x455a3B78Cfe4B88268DBee2119eB06fB1d3F1f61
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

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

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
CollateralPoolPartitionValidator

Compiler Version
v0.6.10+commit.00c0fcaf

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
/**
 *Submitted for verification at Etherscan.io on 2020-08-28
*/

// SPDX-License-Identifier: MIT

pragma solidity 0.6.10;

abstract contract ERC1820Registry {
    function setInterfaceImplementer(
        address _addr,
        bytes32 _interfaceHash,
        address _implementer
    ) external virtual;

    function getInterfaceImplementer(address _addr, bytes32 _interfaceHash)
        external
        virtual
        view
        returns (address);

    function setManager(address _addr, address _newManager) external virtual;

    function getManager(address _addr) public virtual view returns (address);
}

/// Base client to interact with the registry.
contract ERC1820Client {
    ERC1820Registry constant ERC1820REGISTRY = ERC1820Registry(
        0x1820a4B7618BdE71Dce8cdc73aAB6C95905faD24
    );

    function setInterfaceImplementation(
        string memory _interfaceLabel,
        address _implementation
    ) internal {
        bytes32 interfaceHash = keccak256(abi.encodePacked(_interfaceLabel));
        ERC1820REGISTRY.setInterfaceImplementer(
            address(this),
            interfaceHash,
            _implementation
        );
    }

    function interfaceAddr(address addr, string memory _interfaceLabel)
        internal
        view
        returns (address)
    {
        bytes32 interfaceHash = keccak256(abi.encodePacked(_interfaceLabel));
        return ERC1820REGISTRY.getInterfaceImplementer(addr, interfaceHash);
    }

    function delegateManagement(address _newManager) internal {
        ERC1820REGISTRY.setManager(address(this), _newManager);
    }
}

contract ERC1820Implementer {
    /**
     * @dev ERC1820 well defined magic value indicating the contract has
     * registered with the ERC1820Registry that it can implement an interface.
     */
    bytes32 constant ERC1820_ACCEPT_MAGIC = keccak256(
        abi.encodePacked("ERC1820_ACCEPT_MAGIC")
    );

    /**
     * @dev Mapping of interface name keccak256 hashes for which this contract
     * implements the interface.
     * @dev Only settable internally.
     */
    mapping(bytes32 => bool) internal _interfaceHashes;

    /**
     * @notice Indicates whether the contract implements the interface `_interfaceHash`
     * for the address `_addr`.
     * @param _interfaceHash keccak256 hash of the name of the interface.
     * @return ERC1820_ACCEPT_MAGIC only if the contract implements `ìnterfaceHash`
     * for the address `_addr`.
     * @dev In this implementation, the `_addr` (the address for which the
     * contract will implement the interface) is always `address(this)`.
     */
    function canImplementInterfaceForAddress(
        bytes32 _interfaceHash,
        address // Comments to avoid compilation warnings for unused variables. /*addr*/
    ) external view returns (bytes32) {
        if (_interfaceHashes[_interfaceHash]) {
            return ERC1820_ACCEPT_MAGIC;
        } else {
            return "";
        }
    }

    /**
     * @notice Internally set the fact this contract implements the interface
     * identified by `_interfaceLabel`
     * @param _interfaceLabel String representation of the interface.
     */
    function _setInterface(string memory _interfaceLabel) internal {
        _interfaceHashes[keccak256(abi.encodePacked(_interfaceLabel))] = true;
    }
}

/**
 * @notice Partition strategy validator hooks for Amp
 */
interface IAmpPartitionStrategyValidator {
    function tokensFromPartitionToValidate(
        bytes4 _functionSig,
        bytes32 _partition,
        address _operator,
        address _from,
        address _to,
        uint256 _value,
        bytes calldata _data,
        bytes calldata _operatorData
    ) external;

    function tokensToPartitionToValidate(
        bytes4 _functionSig,
        bytes32 _partition,
        address _operator,
        address _from,
        address _to,
        uint256 _value,
        bytes calldata _data,
        bytes calldata _operatorData
    ) external;

    function isOperatorForPartitionScope(
        bytes32 _partition,
        address _operator,
        address _tokenHolder
    ) external view returns (bool);
}

/**
 * @title PartitionUtils
 * @notice Partition related helper functions.
 */

library PartitionUtils {
    bytes32 public constant CHANGE_PARTITION_FLAG = 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff;

    /**
     * @notice Retrieve the destination partition from the 'data' field.
     * A partition change is requested ONLY when 'data' starts with the flag:
     *
     *   0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
     *
     * When the flag is detected, the destination partition is extracted from the
     * 32 bytes following the flag.
     * @param _data Information attached to the transfer. Will contain the
     * destination partition if a change is requested.
     * @param _fallbackPartition Partition value to return if a partition change
     * is not requested in the `_data`.
     * @return toPartition Destination partition. If the `_data` does not contain
     * the prefix and bytes32 partition in the first 64 bytes, the method will
     * return the provided `_fromPartition`.
     */
    function _getDestinationPartition(bytes memory _data, bytes32 _fallbackPartition)
        internal
        pure
        returns (bytes32)
    {
        if (_data.length < 64) {
            return _fallbackPartition;
        }

        (bytes32 flag, bytes32 toPartition) = abi.decode(_data, (bytes32, bytes32));
        if (flag == CHANGE_PARTITION_FLAG) {
            return toPartition;
        }

        return _fallbackPartition;
    }

    /**
     * @notice Helper to get the strategy identifying prefix from the `_partition`.
     * @param _partition Partition to get the prefix for.
     * @return 4 byte partition strategy prefix.
     */
    function _getPartitionPrefix(bytes32 _partition) internal pure returns (bytes4) {
        return bytes4(_partition);
    }

    /**
     * @notice Helper method to split the partition into the prefix, sub partition
     * and partition owner components.
     * @param _partition The partition to split into parts.
     * @return The 4 byte partition prefix, 8 byte sub partition, and final 20
     * bytes representing an address.
     */
    function _splitPartition(bytes32 _partition)
        internal
        pure
        returns (
            bytes4,
            bytes8,
            address
        )
    {
        bytes4 prefix = bytes4(_partition);
        bytes8 subPartition = bytes8(_partition << 32);
        address addressPart = address(uint160(uint256(_partition)));
        return (prefix, subPartition, addressPart);
    }

    /**
     * @notice Helper method to get a partition strategy ERC1820 interface name
     * based on partition prefix.
     * @param _prefix 4 byte partition prefix.
     * @dev Each 4 byte prefix has a unique interface name so that an individual
     * hook implementation can be set for each prefix.
     */
    function _getPartitionStrategyValidatorIName(bytes4 _prefix)
        internal
        pure
        returns (string memory)
    {
        return string(abi.encodePacked("AmpPartitionStrategyValidator", _prefix));
    }
}

/**
 * @title Base contract that satisfies the IAmpPartitionStrategyValidator
 * interface
 */
contract AmpPartitionStrategyValidatorBase is
    IAmpPartitionStrategyValidator,
    ERC1820Client,
    ERC1820Implementer
{
    /**
     * @notice Partition prefix the hooks are valid for.
     * @dev Must to be set by the parent contract.
     */
    bytes4 public partitionPrefix;

    /**
     * @notice Amp contract address.
     */
    address public amp;

    /**
     * @notice Initialize the partition prefix and register the implementation
     * with the ERC1820 registry for the dynamic interface name.
     * @param _prefix Partition prefix the hooks are valid for.
     * @param _amp The address of the Amp contract.
     */
    constructor(bytes4 _prefix, address _amp) public {
        partitionPrefix = _prefix;

        string memory iname = PartitionUtils._getPartitionStrategyValidatorIName(
            partitionPrefix
        );
        ERC1820Implementer._setInterface(iname);

        amp = _amp;
    }

    /**
     * @dev Placeholder to satisfy IAmpPartitionSpaceValidator interface that
     * can be overridden by parent.
     */
    function tokensFromPartitionToValidate(
        bytes4, /* functionSig */
        bytes32, /* fromPartition */
        address, /* operator */
        address, /* from */
        address, /* to */
        uint256, /* value */
        bytes calldata, /* data */
        bytes calldata /* operatorData */
    ) external virtual override {}

    /**
     * @dev Placeholder to satisfy IAmpPartitionSpaceValidator interface that
     * can be overridden by parent.
     */
    function tokensToPartitionToValidate(
        bytes4, /* functionSig */
        bytes32, /* fromPartition */
        address, /* operator */
        address, /* from */
        address, /* to */
        uint256, /* value */
        bytes calldata, /* data */
        bytes calldata /* operatorData */
    ) external virtual override {}

    /**
     * @notice Report if address is an operator for a partition based on the
     * partition's strategy.
     * @dev Placeholder that can be overridden by parent.
     */
    function isOperatorForPartitionScope(
        bytes32, /* partition */
        address, /* operator */
        address /* tokenHolder */
    ) external virtual override view returns (bool) {
        return false;
    }
}


interface IAmp {
    function isCollateralManager(address) external view returns (bool);
}

/**
 * @title CollateralPoolPartitionValidator
 */
contract CollateralPoolPartitionValidator is AmpPartitionStrategyValidatorBase {
    bytes4 constant PARTITION_PREFIX = 0xCCCCCCCC;

    constructor(address _amp)
        public
        AmpPartitionStrategyValidatorBase(PARTITION_PREFIX, _amp)
    {}

    /**
     * @notice Reports if the token holder is an operator for the partition.
     * @dev The `_operator` address param is unused. For this strategy, this will
     * be being called on behalf of suppliers, as they have sent their tokens
     * to the collateral manager address, and are now trying to execute a
     * transfer from the pool. This implies that the pool sender hook
     * MUST be implemented in such a way as to restrict any unauthorized
     * transfers, as the partitions affected by this strategy will allow
     * all callers to make an attempt to transfer from the collateral
     * managers partition.
     * @param _partition The partition to check.
     * @param _tokenHolder The collateral manager holding the pool of tokens.
     * @return The operator check for this strategy returns true if the partition
     * owner (identified by the final 20 bytes of the partition) is the
     * same as the token holder address, as in this case the token holder
     * is the collateral manager address.
     */
    function isOperatorForPartitionScope(
        bytes32 _partition,
        address, /* operator */
        address _tokenHolder
    ) external override view returns (bool) {
        require(msg.sender == address(amp), "Hook must be called by amp");

        (, , address partitionOwner) = PartitionUtils._splitPartition(_partition);
        if (!IAmp(amp).isCollateralManager(partitionOwner)) {
            return false;
        }

        return _tokenHolder == partitionOwner;
    }

    /**
     * @notice Validate the rules of the strategy when tokens are being sent to
     * a partition under the purview of the strategy.
     * @dev The `_toPartition` must be formatted with the PARTITION_PREFIX as the
     * first 4 bytes, the `_to` value as the final 20 bytes. The 8 bytes in the
     * middle can be used by the manager to create sub partitions within their
     * impelemntation.
     * @param _toPartition The partition the tokens are transferred to.
     * @param _to The address of the collateral manager.
     */
    function tokensToPartitionToValidate(
        bytes4, /* functionSig */
        bytes32 _toPartition,
        address, /* operator */
        address, /* from */
        address _to,
        uint256, /* value */
        bytes calldata, /* _data */
        bytes calldata /* operatorData */
    ) external override {
        require(msg.sender == address(amp), "Hook must be called by amp");

        (, , address toPartitionOwner) = PartitionUtils._splitPartition(_toPartition);

        require(
            _to == toPartitionOwner,
            "Transfers to this partition must be to the partitionOwner"
        );
        require(
            IAmp(amp).isCollateralManager(toPartitionOwner),
            "Partition owner is not a registered collateral manager"
        );
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_amp","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"amp","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_interfaceHash","type":"bytes32"},{"internalType":"address","name":"","type":"address"}],"name":"canImplementInterfaceForAddress","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_partition","type":"bytes32"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"_tokenHolder","type":"address"}],"name":"isOperatorForPartitionScope","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"partitionPrefix","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"","type":"bytes4"},{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"tokensFromPartitionToValidate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"","type":"bytes4"},{"internalType":"bytes32","name":"_toPartition","type":"bytes32"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"tokensToPartitionToValidate","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b506040516109be3803806109be8339818101604052602081101561003357600080fd5b50516001805463cccccccc63ffffffff199091161790819055633333333360e21b9082906060906100719060e01b6100ba602090811b61066f17901c565b90506100868161010a60201b6106bf1760201c565b50600180546001600160a01b0390921664010000000002600160201b600160c01b0319909216919091179055506101a59050565b604080517f416d70506172746974696f6e537472617465677956616c696461746f7200000060208201526001600160e01b031992909216603d830152805180830360210181526041909201905290565b6001600080836040516020018082805190602001908083835b602083106101425780518252601f199092019160209182019101610123565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b61080a806101b46000396000f3fe608060405234801561001057600080fd5b50600436106100625760003560e01c80630973e6ba14610067578063249cb3fa1461008b5780633d006039146100c95780633f0413df146100ee578063b3c46f4214610136578063dc86ad7a14610235575b600080fd5b61006f610332565b604080516001600160a01b039092168252519081900360200190f35b6100b7600480360360408110156100a157600080fd5b50803590602001356001600160a01b0316610348565b60408051918252519081900360200190f35b6100d16103ae565b604080516001600160e01b03199092168252519081900360200190f35b6101226004803603606081101561010457600080fd5b508035906001600160a01b03602082013581169160400135166103b7565b604080519115158252519081900360200190f35b610233600480360361010081101561014d57600080fd5b6001600160e01b0319823516916020810135916001600160a01b036040830135811692606081013582169260808201359092169160a0820135919081019060e0810160c0820135600160201b8111156101a557600080fd5b8201836020820111156101b757600080fd5b803590602001918460018302840111600160201b831117156101d857600080fd5b919390929091602081019035600160201b8111156101f557600080fd5b82018360208201111561020757600080fd5b803590602001918460018302840111600160201b8311171561022857600080fd5b5090925090506104d5565b005b610233600480360361010081101561024c57600080fd5b6001600160e01b0319823516916020810135916001600160a01b036040830135811692606081013582169260808201359092169160a0820135919081019060e0810160c0820135600160201b8111156102a457600080fd5b8201836020820111156102b657600080fd5b803590602001918460018302840111600160201b831117156102d757600080fd5b919390929091602081019035600160201b8111156102f457600080fd5b82018360208201111561030657600080fd5b803590602001918460018302840111600160201b8311171561032757600080fd5b509092509050610663565b600154600160201b90046001600160a01b031681565b60008281526020819052604081205460ff16156103a457604051602001808073455243313832305f4143434550545f4d4147494360601b81525060140190506040516020818303038152906040528051906020012090506103a8565b5060005b92915050565b60015460e01b81565b600154600090600160201b90046001600160a01b03163314610420576040805162461bcd60e51b815260206004820152601a60248201527f486f6f6b206d7573742062652063616c6c656420627920616d70000000000000604482015290519081900360640190fd5b600061042b8561075a565b60015460408051630e0e923b60e01b81526001600160a01b0380851660048301529151939650600160201b909204169350630e0e923b9250602480820192602092909190829003018186803b15801561048357600080fd5b505afa158015610497573d6000803e3d6000fd5b505050506040513d60208110156104ad57600080fd5b50516104bd5760009150506104ce565b6001600160a01b0383811691161490505b9392505050565b600154600160201b90046001600160a01b0316331461053b576040805162461bcd60e51b815260206004820152601a60248201527f486f6f6b206d7573742062652063616c6c656420627920616d70000000000000604482015290519081900360640190fd5b60006105468a61075a565b92505050806001600160a01b0316876001600160a01b03161461059a5760405162461bcd60e51b815260040180806020018281038252603981526020018061079c6039913960400191505060405180910390fd5b60015460408051630e0e923b60e01b81526001600160a01b0384811660048301529151600160201b90930490911691630e0e923b91602480820192602092909190829003018186803b1580156105ef57600080fd5b505afa158015610603573d6000803e3d6000fd5b505050506040513d602081101561061957600080fd5b50516106565760405162461bcd60e51b81526004018080602001828103825260368152602001806107666036913960400191505060405180910390fd5b5050505050505050505050565b50505050505050505050565b604080517f416d70506172746974696f6e537472617465677956616c696461746f7200000060208201526001600160e01b031992909216603d830152805180830360210181526041909201905290565b6001600080836040516020018082805190602001908083835b602083106106f75780518252601f1990920191602091820191016106d8565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b90602082901b90829056fe506172746974696f6e206f776e6572206973206e6f742061207265676973746572656420636f6c6c61746572616c206d616e616765725472616e736665727320746f207468697320706172746974696f6e206d75737420626520746f2074686520706172746974696f6e4f776e6572a2646970667358221220e81c00e17ae5d4a7870b1b5d199fabbea10a06217f3c0b890d29af812cb54e8d64736f6c634300060a0033000000000000000000000000ff20817765cb7f73d4bde2e66e067e58d11095c2

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100625760003560e01c80630973e6ba14610067578063249cb3fa1461008b5780633d006039146100c95780633f0413df146100ee578063b3c46f4214610136578063dc86ad7a14610235575b600080fd5b61006f610332565b604080516001600160a01b039092168252519081900360200190f35b6100b7600480360360408110156100a157600080fd5b50803590602001356001600160a01b0316610348565b60408051918252519081900360200190f35b6100d16103ae565b604080516001600160e01b03199092168252519081900360200190f35b6101226004803603606081101561010457600080fd5b508035906001600160a01b03602082013581169160400135166103b7565b604080519115158252519081900360200190f35b610233600480360361010081101561014d57600080fd5b6001600160e01b0319823516916020810135916001600160a01b036040830135811692606081013582169260808201359092169160a0820135919081019060e0810160c0820135600160201b8111156101a557600080fd5b8201836020820111156101b757600080fd5b803590602001918460018302840111600160201b831117156101d857600080fd5b919390929091602081019035600160201b8111156101f557600080fd5b82018360208201111561020757600080fd5b803590602001918460018302840111600160201b8311171561022857600080fd5b5090925090506104d5565b005b610233600480360361010081101561024c57600080fd5b6001600160e01b0319823516916020810135916001600160a01b036040830135811692606081013582169260808201359092169160a0820135919081019060e0810160c0820135600160201b8111156102a457600080fd5b8201836020820111156102b657600080fd5b803590602001918460018302840111600160201b831117156102d757600080fd5b919390929091602081019035600160201b8111156102f457600080fd5b82018360208201111561030657600080fd5b803590602001918460018302840111600160201b8311171561032757600080fd5b509092509050610663565b600154600160201b90046001600160a01b031681565b60008281526020819052604081205460ff16156103a457604051602001808073455243313832305f4143434550545f4d4147494360601b81525060140190506040516020818303038152906040528051906020012090506103a8565b5060005b92915050565b60015460e01b81565b600154600090600160201b90046001600160a01b03163314610420576040805162461bcd60e51b815260206004820152601a60248201527f486f6f6b206d7573742062652063616c6c656420627920616d70000000000000604482015290519081900360640190fd5b600061042b8561075a565b60015460408051630e0e923b60e01b81526001600160a01b0380851660048301529151939650600160201b909204169350630e0e923b9250602480820192602092909190829003018186803b15801561048357600080fd5b505afa158015610497573d6000803e3d6000fd5b505050506040513d60208110156104ad57600080fd5b50516104bd5760009150506104ce565b6001600160a01b0383811691161490505b9392505050565b600154600160201b90046001600160a01b0316331461053b576040805162461bcd60e51b815260206004820152601a60248201527f486f6f6b206d7573742062652063616c6c656420627920616d70000000000000604482015290519081900360640190fd5b60006105468a61075a565b92505050806001600160a01b0316876001600160a01b03161461059a5760405162461bcd60e51b815260040180806020018281038252603981526020018061079c6039913960400191505060405180910390fd5b60015460408051630e0e923b60e01b81526001600160a01b0384811660048301529151600160201b90930490911691630e0e923b91602480820192602092909190829003018186803b1580156105ef57600080fd5b505afa158015610603573d6000803e3d6000fd5b505050506040513d602081101561061957600080fd5b50516106565760405162461bcd60e51b81526004018080602001828103825260368152602001806107666036913960400191505060405180910390fd5b5050505050505050505050565b50505050505050505050565b604080517f416d70506172746974696f6e537472617465677956616c696461746f7200000060208201526001600160e01b031992909216603d830152805180830360210181526041909201905290565b6001600080836040516020018082805190602001908083835b602083106106f75780518252601f1990920191602091820191016106d8565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b90602082901b90829056fe506172746974696f6e206f776e6572206973206e6f742061207265676973746572656420636f6c6c61746572616c206d616e616765725472616e736665727320746f207468697320706172746974696f6e206d75737420626520746f2074686520706172746974696f6e4f776e6572a2646970667358221220e81c00e17ae5d4a7870b1b5d199fabbea10a06217f3c0b890d29af812cb54e8d64736f6c634300060a0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000ff20817765cb7f73d4bde2e66e067e58d11095c2

-----Decoded View---------------
Arg [0] : _amp (address): 0xfF20817765cB7f73d4bde2e66e067E58D11095C2

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000ff20817765cb7f73d4bde2e66e067e58d11095c2


Deployed Bytecode Sourcemap

10006:3180:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7855:18;;;:::i;:::-;;;;-1:-1:-1;;;;;7855:18:0;;;;;;;;;;;;;;2626:356;;;;;;;;;;;;;;;;-1:-1:-1;2626:356:0;;;;;;-1:-1:-1;;;;;2626:356:0;;:::i;:::-;;;;;;;;;;;;;;;;7761:29;;;:::i;:::-;;;;-1:-1:-1;;;;;;7761:29:0;;;;;;;;;;;;;;11324:496;;;;;;;;;;;;;;;;-1:-1:-1;11324:496:0;;;-1:-1:-1;;;;;11324:496:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;12381:802;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;12381:802:0;;;;;;;;;-1:-1:-1;;;;;12381:802:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;12381:802:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;12381:802:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;12381:802:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;12381:802:0;;;;;;;;;;-1:-1:-1;12381:802:0;;-1:-1:-1;12381:802:0;-1:-1:-1;12381:802:0;:::i;:::-;;8598:346;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;8598:346:0;;;;;;;;;-1:-1:-1;;;;;8598:346:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8598:346:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8598:346:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8598:346:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8598:346:0;;;;;;;;;;-1:-1:-1;8598:346:0;;-1:-1:-1;8598:346:0;-1:-1:-1;8598:346:0;:::i;7855:18::-;;;-1:-1:-1;;;7855:18:0;;-1:-1:-1;;;;;7855:18:0;;:::o;2626:356::-;2821:7;2845:32;;;;;;;;;;;;;2841:134;;;1856:40;;;;;;-1:-1:-1;;;1856:40:0;;;;;;;;;;;;;;;;;;;1836:67;;;;;;2894:27;;;;2841:134;-1:-1:-1;2954:9:0;2841:134;2626:356;;;;:::o;7761:29::-;;;;;;:::o;11324:496::-;11540:3;;11493:4;;-1:-1:-1;;;11540:3:0;;-1:-1:-1;;;;;11540:3:0;11518:10;:26;11510:65;;;;;-1:-1:-1;;;11510:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;11593:22;11619:42;11650:10;11619:30;:42::i;:::-;11682:3;;11677:45;;;-1:-1:-1;;;11677:45:0;;-1:-1:-1;;;;;11677:45:0;;;11682:3;11677:45;;;;;11588:73;;-1:-1:-1;;;;11682:3:0;;;;;-1:-1:-1;11677:29:0;;-1:-1:-1;11677:45:0;;;;;;;;;;;;;;;11682:3;11677:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11677:45:0;11672:91;;11746:5;11739:12;;;;;11672:91;-1:-1:-1;;;;;11782:30:0;;;;;;;-1:-1:-1;11324:496:0;;;;;;:::o;12381:802::-;12745:3;;-1:-1:-1;;;12745:3:0;;-1:-1:-1;;;;;12745:3:0;12723:10;:26;12715:65;;;;;-1:-1:-1;;;12715:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;12798:24;12826:44;12857:12;12826:30;:44::i;:::-;12793:77;;;;12912:16;-1:-1:-1;;;;;12905:23:0;:3;-1:-1:-1;;;;;12905:23:0;;12883:130;;;;-1:-1:-1;;;12883:130:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13051:3;;13046:47;;;-1:-1:-1;;;13046:47:0;;-1:-1:-1;;;;;13046:47:0;;;13051:3;13046:47;;;;;-1:-1:-1;;;13051:3:0;;;;;;;13046:29;;:47;;;;;;;;;;;;;;;13051:3;13046:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13046:47:0;13024:151;;;;-1:-1:-1;;;13024:151:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12381:802;;;;;;;;;;;:::o;8598:346::-;;;;;;;;;;;:::o;7169:223::-;7325:58;;;;;;;;-1:-1:-1;;;;;;7325:58:0;;;;;;;;;;;;;;;;;;;;;;;;7169:223::o;3198:151::-;3337:4;3272:16;:62;3316:15;3299:33;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3299:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3289:44;;;;;;3272:62;;;;;;;;;;;;:69;;;;;;;;;;;;;;;;;;3198:151;:::o;6433:408::-;6642:10;6707:2;6693:16;;;;6642:10;;6433:408::o

Swarm Source

ipfs://e81c00e17ae5d4a7870b1b5d199fabbea10a06217f3c0b890d29af812cb54e8d

Block Transaction Difficulty 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
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.