AVAX Price: $25.12 (-5.39%)
Gas: 1.3 nAVAX
 

Overview

AVAX Balance

Avalanche C-Chain LogoAvalanche C-Chain LogoAvalanche C-Chain Logo0 AVAX

AVAX Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Call Component571506892025-02-11 7:28:0021 hrs ago1739258880IN
0xEB630461...8D9848e8c
0 AVAX0.000073441
Call Component571506872025-02-11 7:27:5721 hrs ago1739258877IN
0xEB630461...8D9848e8c
0 AVAX0.000345911
Call Component571506802025-02-11 7:27:4321 hrs ago1739258863IN
0xEB630461...8D9848e8c
0 AVAX0.000216441
Call Component571204942025-02-10 15:33:1737 hrs ago1739201597IN
0xEB630461...8D9848e8c
0 AVAX0.000770621.16186997
Call Component571204892025-02-10 15:33:0937 hrs ago1739201589IN
0xEB630461...8D9848e8c
0 AVAX0.000975341.00743589
Call Component571204862025-02-10 15:33:0237 hrs ago1739201582IN
0xEB630461...8D9848e8c
0 AVAX0.000297241.04408243
Call Component571204822025-02-10 15:32:5337 hrs ago1739201573IN
0xEB630461...8D9848e8c
0 AVAX0.000749041.00579916
Call Component571204772025-02-10 15:32:4737 hrs ago1739201567IN
0xEB630461...8D9848e8c
0 AVAX0.000080451.09547986
Call Component571204732025-02-10 15:32:4137 hrs ago1739201561IN
0xEB630461...8D9848e8c
0 AVAX0.000265311.18190988
Call Component571204612025-02-10 15:32:2437 hrs ago1739201544IN
0xEB630461...8D9848e8c
0 AVAX0.000488151.06216306
Call Component570690622025-02-09 14:03:352 days ago1739109815IN
0xEB630461...8D9848e8c
0 AVAX0.000664951
Call Component570690582025-02-09 14:03:302 days ago1739109810IN
0xEB630461...8D9848e8c
0 AVAX0.000073441
Call Component570690542025-02-09 14:03:252 days ago1739109805IN
0xEB630461...8D9848e8c
0 AVAX0.000201531
Call Component570690442025-02-09 14:03:122 days ago1739109792IN
0xEB630461...8D9848e8c
0 AVAX0.000304581
Call Component570187092025-02-08 12:56:253 days ago1739019385IN
0xEB630461...8D9848e8c
0 AVAX0.000577871.06900095
Call Component570187052025-02-08 12:56:183 days ago1739019378IN
0xEB630461...8D9848e8c
0 AVAX0.000529081
Call Component570187022025-02-08 12:56:093 days ago1739019369IN
0xEB630461...8D9848e8c
0 AVAX0.000073441
Call Component570187002025-02-08 12:56:053 days ago1739019365IN
0xEB630461...8D9848e8c
0 AVAX0.0008181
Call Component570186932025-02-08 12:55:533 days ago1739019353IN
0xEB630461...8D9848e8c
0 AVAX0.000312061
Call Component569675512025-02-07 11:50:114 days ago1738929011IN
0xEB630461...8D9848e8c
0 AVAX0.000228681.00027531
Call Component569675492025-02-07 11:50:054 days ago1738929005IN
0xEB630461...8D9848e8c
0 AVAX0.000073451.00017813
Call Component569675472025-02-07 11:50:014 days ago1738929001IN
0xEB630461...8D9848e8c
0 AVAX0.001011761
Call Component569675402025-02-07 11:49:474 days ago1738928987IN
0xEB630461...8D9848e8c
0 AVAX0.000243991.01165407
Call Component569163982025-02-06 10:42:465 days ago1738838566IN
0xEB630461...8D9848e8c
0 AVAX0.00040751.03732078
Call Component569163952025-02-06 10:42:415 days ago1738838561IN
0xEB630461...8D9848e8c
0 AVAX0.003197641.01907514
View all transactions

Latest 1 internal transaction

Parent Transaction Hash Block From To
291788042023-04-24 22:26:30659 days ago1682375190
0xEB630461...8D9848e8c
 Contract Creation0 AVAX
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
FeeManager

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 8 : FeeManager.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.10;

import {IERC20} from "openzeppelin/token/ERC20/IERC20.sol";
import {SafeOwnable} from "solrary/access/SafeOwnable.sol";

import {IFeeManager} from "./interfaces/IFeeManager.sol";
import {IFeeBank, FeeBank} from "./FeeBank.sol";
import {Address} from "./libraries/Address.sol";

/**
 * @title Fee Manager
 * @author Trader Joe
 * @notice This contract allows to let the fee bank contract to delegate call to any contract without
 * any risk of overwriting the storage variables of the fee bank contract.
 */
contract FeeManager is SafeOwnable, IFeeManager {
    using Address for address;

    IFeeBank internal immutable _FEE_BANK;

    uint256 internal _verifiedRound;
    mapping(address => Component) private _components;

    /**
     * @dev Modifier to check if the caller is a verified component operator of a verified component.
     */
    modifier onlyVerifiedComponentOperator(address component) {
        Component storage _component = _components[component];

        uint256 round = _component.verifiedRound;

        if (round == 0) revert FeeManager__ComponentNotVerified();
        if (_component.operators[msg.sender] != round) revert FeeManager__OnlyComponentOperator();

        _;
    }

    /**
     * @dev Constructor that creates the fee bank.
     */
    constructor() {
        _FEE_BANK = new FeeBank();
    }

    /**
     * @notice Returns the fee bank address.
     * @return The fee bank address.
     */
    function getFeeBank() external view override returns (IFeeBank) {
        return _FEE_BANK;
    }

    /**
     * @notice Returns whether a component is verified.
     * @param component The component address.
     * @return Whether the component is verified, true if verified, false otherwise.
     */
    function isVerifiedComponent(address component) external view override returns (bool) {
        return _components[component].verifiedRound > 0;
    }

    /**
     * @notice Returns whether an operator is allowed to call a component.
     * @param component The component address.
     * @param operator The operator address.
     * @return Whether the operator is allowed to call the component, true if allowed, false otherwise.
     */
    function isComponentOperator(address component, address operator) external view override returns (bool) {
        Component storage _component = _components[component];

        uint256 round = _component.verifiedRound;
        return round > 0 && _component.operators[operator] == round;
    }

    /**
     * @notice Return the result of multiple static calls to different contracts.
     * @param targets The target contracts.
     * @param data The data to static call.
     * @return results The return data from the static calls.
     */
    function batchStaticCall(address[] calldata targets, bytes[] calldata data)
        external
        view
        override
        returns (bytes[] memory results)
    {
        if (targets.length != data.length) revert FeeManager__InvalidLength();

        results = new bytes[](targets.length);

        for (uint256 i; i < targets.length;) {
            (bool success, bytes memory result) = targets[i].staticcall(data[i]);

            unchecked {
                if (success) results[i++] = result;
            }
        }
    }

    /**
     * @notice Verifies a component.
     * @dev Only callable by the owner.
     * @param component The component address.
     */
    function verifyComponent(address component) external override onlyOwner {
        if (component == address(_FEE_BANK)) revert FeeManager__FeeBankIsNotAComponent();

        Component storage _component = _components[component];

        uint256 round = _component.verifiedRound;

        if (round > 0) revert FeeManager__ComponentAlreadyVerified();

        uint256 verifiedRound = ++_verifiedRound;
        _component.verifiedRound = verifiedRound;

        emit ComponentVerified(component, verifiedRound);
    }

    /**
     * @notice Unverifies a component.
     * @dev Only callable by the owner.
     * @param component The component address.
     */
    function unverifyComponent(address component) external override onlyOwner {
        Component storage _component = _components[component];

        if (_component.verifiedRound == 0) revert FeeManager__ComponentNotVerified();

        _component.verifiedRound = 0;

        emit ComponentUnverified(component);
    }

    /**
     * @notice Adds an operator to a component.
     * @dev Only callable by the owner.
     * @param component The component address.
     * @param operator The operator address.
     */
    function addComponentOperator(address component, address operator) external override onlyOwner {
        Component storage _component = _components[component];

        uint256 round = _component.verifiedRound;

        if (round == 0) revert FeeManager__ComponentNotVerified();
        if (_component.operators[operator] == round) revert FeeManager__ComponentOperatorAlreadyAdded();

        _component.operators[operator] = round;

        emit ComponentOperatorAdded(component, operator, round);
    }

    /**
     * @notice Removes an operator from a component.
     * @dev Only callable by the owner.
     * @param component The component address.
     * @param operator The operator address.
     */
    function removeComponentOperator(address component, address operator) external override onlyOwner {
        Component storage _component = _components[component];

        uint256 round = _component.verifiedRound;
        if (round == 0) revert FeeManager__ComponentNotVerified();
        if (_component.operators[operator] != round) revert FeeManager__ComponentOperatorNotAdded();

        _component.operators[operator] = 0;

        emit ComponentOperatorRemoved(component, operator);
    }

    /**
     * @notice Calls a component and returns the result.
     * @dev Only callable by a verified component operator.
     * @param component The component address.
     * @param data The data to call the component with.
     * @return The result of the call.
     */
    function callComponent(address component, bytes calldata data) external override returns (bytes memory) {
        return _callComponent(component, data);
    }

    /**
     * @notice Calls multiple components and returns the results.
     * @dev Only callable by a verified operator of each component.
     * @param components The component addresses.
     * @param data The data to call the components with.
     * @return The results of the calls.
     */
    function callComponents(address[] calldata components, bytes[] calldata data)
        external
        override
        returns (bytes[] memory)
    {
        if (components.length != data.length) revert FeeManager__InvalidLength();

        bytes[] memory results = new bytes[](components.length);

        for (uint256 i; i < components.length;) {
            results[i] = _callComponent(components[i], data[i]);

            unchecked {
                ++i;
            }
        }

        return results;
    }

    /**
     * @notice Calls a contract `target` with `data` and returns the result.
     * @dev Only callable by the owner.
     * @param target The target contract address.
     * @param data The data to call the contract with.
     * @return returnData The result of the call.
     */
    function directCall(address target, bytes calldata data)
        external
        override
        onlyOwner
        returns (bytes memory returnData)
    {
        if (data.length == 0) {
            target.sendValue(address(this).balance);
        } else {
            returnData = target.directCall(data);
        }
    }

    /**
     * @dev Calls a component and returns the result. This function is used to delegate call to the fee bank.
     * Only callable by a verified component operator.
     * @param component The component address.
     * @param data The data to call the component with.
     * @return The result of the call.
     */
    function _callComponent(address component, bytes calldata data)
        internal
        onlyVerifiedComponentOperator(component)
        returns (bytes memory)
    {
        return _FEE_BANK.delegateCall(component, data);
    }
}

File 2 of 8 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}

File 3 of 8 : ISafeOwnable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.10;

interface ISafeOwnable {
    error SafeOwnable__OnlyOwner();
    error SafeOwnable__OnlyPendingOwner();

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    event PendingOwnerSet(address indexed owner, address indexed pendingOwner);

    function owner() external view returns (address);

    function pendingOwner() external view returns (address);

    function setPendingOwner(address newPendingOwner) external;

    function becomeOwner() external;
}

File 4 of 8 : SafeOwnable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.10;

import "./ISafeOwnable.sol";

/**
 * @title Safe Ownable
 * @author 0x0Louis
 * @notice This contract is used to manage the ownership of a contract in a two-step process.
 */
abstract contract SafeOwnable is ISafeOwnable {
    address private _owner;
    address private _pendingOwner;

    /**
     * @dev Modifier that checks if the caller is the owner.
     */
    modifier onlyOwner() {
        if (msg.sender != owner()) revert SafeOwnable__OnlyOwner();
        _;
    }

    /**
     * @dev Modifier that checks if the caller is the pending owner.
     */
    modifier onlyPendingOwner() {
        if (msg.sender != pendingOwner()) revert SafeOwnable__OnlyPendingOwner();
        _;
    }

    /**
     * @notice Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(msg.sender);
    }

    /**
     * @notice Returns the address of the current owner.
     */
    function owner() public view virtual override returns (address) {
        return _owner;
    }

    /**
     * @notice Returns the address of the pending owner.
     */
    function pendingOwner() public view virtual override returns (address) {
        return _pendingOwner;
    }

    /**
     * @notice Sets the pending owner to a new address.
     * @param newOwner The address to transfer ownership to.
     */
    function setPendingOwner(address newOwner) public virtual override onlyOwner {
        _setPendingOwner(newOwner);
    }

    /**
     * @notice Accepts ownership of the contract.
     * @dev Can only be called by the pending owner.
     */
    function becomeOwner() public virtual override onlyPendingOwner {
        _transferOwnership(_pendingOwner);
        _setPendingOwner(address(0));
    }

    /** Private Functions */

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * @param newOwner The address to transfer ownership to.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }

    /**
     * @dev Sets the pending owner to a new address.
     * @param newPendingOwner The address to transfer ownership to.
     */
    function _setPendingOwner(address newPendingOwner) internal virtual {
        _pendingOwner = newPendingOwner;
        emit PendingOwnerSet(msg.sender, newPendingOwner);
    }
}

File 5 of 8 : FeeBank.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.10;

import {Address} from "./libraries/Address.sol";
import {IFeeBank} from "./interfaces/IFeeBank.sol";

/**
 * @title Fee Bank
 * @author Trader Joe
 * @notice This contracts holds fees from the different products of the protocol.
 * The fee manager can call any contract from this contract to execute different actions.
 */
contract FeeBank is IFeeBank {
    using Address for address;

    address internal immutable _FEE_MANAGER;

    /**
     * @notice Modifier to check if the caller is the fee manager.
     */
    modifier onlyFeeManager() {
        if (msg.sender != _FEE_MANAGER) revert FeeBank__OnlyFeeManager();
        _;
    }

    /**
     * @dev Constructor that sets the fee manager address.
     * Needs to be deployed by the fee manager itself.
     */
    constructor() {
        _FEE_MANAGER = msg.sender;
    }

    /**
     * @notice Returns the fee manager address.
     * @return The fee manager address.
     */
    function getFeeManager() external view override returns (address) {
        return _FEE_MANAGER;
    }

    /**
     * @notice Delegate calls to a contract.
     * @dev Only callable by the fee manager.
     * @param target The target contract.
     * @param data The data to delegate call.
     * @return The return data from the delegate call.
     */
    function delegateCall(address target, bytes calldata data) external onlyFeeManager returns (bytes memory) {
        return target.delegateCall(data);
    }
}

File 6 of 8 : IFeeBank.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.10;

interface IFeeBank {
    error FeeBank__NonContract();
    error FeeBank__CallFailed();
    error FeeBank__OnlyFeeManager();

    function getFeeManager() external view returns (address);

    function delegateCall(address target, bytes calldata data) external returns (bytes memory);
}

File 7 of 8 : IFeeManager.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.10;

import {IERC20} from "openzeppelin/token/ERC20/IERC20.sol";
import {ISafeOwnable} from "solrary/access/ISafeOwnable.sol";

import {IFeeBank} from "./IFeeBank.sol";

interface IFeeManager is ISafeOwnable {
    error FeeManager__ComponentNotVerified();
    error FeeManager__OnlyComponentOperator();
    error FeeManager__ComponentAlreadyVerified();
    error FeeManager__ComponentOperatorAlreadyAdded();
    error FeeManager__ComponentOperatorNotAdded();
    error FeeManager__FeeBankIsNotAComponent();
    error FeeManager__InvalidLength();

    struct Component {
        mapping(address => uint256) operators;
        uint256 verifiedRound;
    }

    event ComponentVerified(address indexed component, uint256 indexed round);

    event ComponentUnverified(address indexed component);

    event ComponentOperatorAdded(address indexed component, address indexed operator, uint256 indexed round);

    event ComponentOperatorRemoved(address indexed component, address indexed operator);

    function getFeeBank() external view returns (IFeeBank);

    function isVerifiedComponent(address component) external view returns (bool);

    function isComponentOperator(address component, address operator) external view returns (bool);

    function batchStaticCall(address[] calldata targets, bytes[] calldata data)
        external
        view
        returns (bytes[] memory results);

    function verifyComponent(address component) external;

    function unverifyComponent(address component) external;

    function addComponentOperator(address component, address operator) external;

    function removeComponentOperator(address component, address operator) external;

    function callComponent(address component, bytes calldata data) external returns (bytes memory);

    function callComponents(address[] calldata component, bytes[] calldata data) external returns (bytes[] memory);

    function directCall(address target, bytes calldata data) external returns (bytes memory);
}

File 8 of 8 : Address.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.10;

library Address {
    error Address__SendFailed();
    error Address__NonContract();
    error Address__CallFailed();

    /**
     * @dev Sends the given amount of ether to the given address, forwarding all available gas and reverting on errors.
     * @param target The address to send ether to.
     * @param value The amount of ether to send.
     */
    function sendValue(address target, uint256 value) internal {
        (bool success,) = target.call{value: value}("");
        if (!success) revert Address__SendFailed();
    }

    /**
     * @dev Calls the target contract with the given data and bubbles up errors.
     * @param target The target contract.
     * @param data The data to call the target contract with.
     * @return The return data from the call.
     */
    function directCall(address target, bytes memory data) internal returns (bytes memory) {
        return directCallWithValue(target, data, 0);
    }

    /**
     * @dev Calls the target contract with the given data and bubbles up errors.
     * @param target The target contract.
     * @param data The data to call the target contract with.
     * @param value The amount of ether to send to the target contract.
     * @return The return data from the call.
     */
    function directCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        (bool success, bytes memory returnData) = target.call{value: value}(data);

        _catchError(target, success, returnData);

        return returnData;
    }

    /**
     * @dev Delegate calls the target contract with the given data and bubbles up errors.
     * @param target The target contract.
     * @param data The data to delegate call the target contract with.
     * @return The return data from the delegate call.
     */
    function delegateCall(address target, bytes memory data) internal returns (bytes memory) {
        (bool success, bytes memory returnData) = target.delegatecall(data);

        _catchError(target, success, returnData);

        return returnData;
    }

    /**
     * @dev Bubbles up errors from the target contract, target must be a contract.
     * @param target The target contract.
     * @param success The success flag from the call.
     * @param returnData The return data from the call.
     */
    function _catchError(address target, bool success, bytes memory returnData) private view {
        if (success) {
            if (returnData.length == 0 && target.code.length == 0) {
                revert Address__NonContract();
            }
        } else {
            if (returnData.length > 0) {
                assembly {
                    revert(add(32, returnData), mload(returnData))
                }
            } else {
                revert Address__CallFailed();
            }
        }
    }
}

Settings
{
  "remappings": [
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
    "forge-std/=lib/forge-std/src/",
    "joe-v2/=lib/joe-v2/src/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/",
    "openzeppelin/=lib/openzeppelin-contracts/contracts/",
    "solrary/=lib/solrary/src/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "metadata": {
    "bytecodeHash": "ipfs"
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "london",
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"Address__CallFailed","type":"error"},{"inputs":[],"name":"Address__NonContract","type":"error"},{"inputs":[],"name":"Address__SendFailed","type":"error"},{"inputs":[],"name":"FeeManager__ComponentAlreadyVerified","type":"error"},{"inputs":[],"name":"FeeManager__ComponentNotVerified","type":"error"},{"inputs":[],"name":"FeeManager__ComponentOperatorAlreadyAdded","type":"error"},{"inputs":[],"name":"FeeManager__ComponentOperatorNotAdded","type":"error"},{"inputs":[],"name":"FeeManager__FeeBankIsNotAComponent","type":"error"},{"inputs":[],"name":"FeeManager__InvalidLength","type":"error"},{"inputs":[],"name":"FeeManager__OnlyComponentOperator","type":"error"},{"inputs":[],"name":"SafeOwnable__OnlyOwner","type":"error"},{"inputs":[],"name":"SafeOwnable__OnlyPendingOwner","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"component","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"uint256","name":"round","type":"uint256"}],"name":"ComponentOperatorAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"component","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"}],"name":"ComponentOperatorRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"component","type":"address"}],"name":"ComponentUnverified","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"component","type":"address"},{"indexed":true,"internalType":"uint256","name":"round","type":"uint256"}],"name":"ComponentVerified","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"pendingOwner","type":"address"}],"name":"PendingOwnerSet","type":"event"},{"inputs":[{"internalType":"address","name":"component","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"addComponentOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"targets","type":"address[]"},{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"batchStaticCall","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"becomeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"component","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"callComponent","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"components","type":"address[]"},{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"callComponents","outputs":[{"internalType":"bytes[]","name":"","type":"bytes[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"directCall","outputs":[{"internalType":"bytes","name":"returnData","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getFeeBank","outputs":[{"internalType":"contract IFeeBank","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"component","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isComponentOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"component","type":"address"}],"name":"isVerifiedComponent","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"component","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"removeComponentOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"setPendingOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"component","type":"address"}],"name":"unverifyComponent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"component","type":"address"}],"name":"verifyComponent","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a060405234801561001057600080fd5b5061001a33610054565b604051610026906100a4565b604051809103906000f080158015610042573d6000803e3d6000fd5b506001600160a01b03166080526100b1565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6103838061123383390190565b6080516111596100da60003960008181610209015281816109180152610a8701526111596000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c80636b6447ae11610097578063c42069ec11610066578063c42069ec14610240578063e30c397814610253578063f9dca98914610264578063fdd6eaed1461026c57600080fd5b80636b6447ae146101cf5780638da5cb5b146101e2578063ac78496d14610207578063becf77791461022d57600080fd5b806346fbdb55116100d357806346fbdb5514610176578063552284d7146101965780635bb0431d146101a9578063669dcec9146101bc57600080fd5b80631450ce22146100fa57806314c5ae621461010f5780631e9d963514610138575b600080fd5b61010d610108366004610d1f565b61027f565b005b61012261011d366004610d9e565b61036a565b60405161012f9190610e66565b60405180910390f35b610166610146366004610ec8565b6001600160a01b0316600090815260036020526040902060010154151590565b604051901515815260200161012f565b610189610184366004610ee3565b61046a565b60405161012f9190610f66565b6101666101a4366004610d1f565b610481565b6101896101b7366004610ee3565b6104cd565b61010d6101ca366004610d1f565b610579565b61010d6101dd366004610ec8565b610664565b6000546001600160a01b03165b6040516001600160a01b03909116815260200161012f565b7f00000000000000000000000000000000000000000000000000000000000000006101ef565b61012261023b366004610d9e565b610707565b61010d61024e366004610ec8565b610868565b6001546001600160a01b03166101ef565b61010d61089f565b61010d61027a366004610ec8565b6108eb565b6000546001600160a01b031633146102aa57604051631c1d490560e21b815260040160405180910390fd5b6001600160a01b03821660009081526003602052604090206001810154806102e55760405163ae469f1d60e01b815260040160405180910390fd5b6001600160a01b038316600090815260208390526040902054811461031d57604051630eb25ec760e11b815260040160405180910390fd5b6001600160a01b038084166000818152602085905260408082208290555191928716917fe47eb1ae85338794d8dd5529f47fe49e96c025db48f915399c303e9872b7456d9190a350505050565b606083821461038c576040516329f2386760e01b815260040160405180910390fd5b60008467ffffffffffffffff8111156103a7576103a7610f79565b6040519080825280602002602001820160405280156103da57816020015b60608152602001906001900390816103c55790505b50905060005b858110156104605761043b8787838181106103fd576103fd610f8f565b90506020020160208101906104129190610ec8565b86868481811061042457610424610f8f565b90506020028101906104369190610fa5565b610a01565b82828151811061044d5761044d610f8f565b60209081029190910101526001016103e0565b5095945050505050565b6060610477848484610a01565b90505b9392505050565b6001600160a01b0382166000908152600360205260408120600181015480158015906104c457506001600160a01b03841660009081526020839052604090205481145b95945050505050565b60606104e16000546001600160a01b031690565b6001600160a01b0316336001600160a01b03161461051257604051631c1d490560e21b815260040160405180910390fd5b8161052f5761052a6001600160a01b03851647610b12565b61047a565b61047783838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506001600160a01b03881692915050610b8b565b6000546001600160a01b031633146105a457604051631c1d490560e21b815260040160405180910390fd5b6001600160a01b03821660009081526003602052604090206001810154806105df5760405163ae469f1d60e01b815260040160405180910390fd5b6001600160a01b03831660009081526020839052604090205481141561061857604051633e37ccfb60e11b815260040160405180910390fd5b6001600160a01b038084166000818152602085905260408082208590555184938816917f4ed75292a1dcc025209b6b838c3c0b769310bd1d2910bf2e56cb2fbc7f4c5d8c91a450505050565b6000546001600160a01b0316331461068f57604051631c1d490560e21b815260040160405180910390fd5b6001600160a01b038116600090815260036020526040902060018101546106c95760405163ae469f1d60e01b815260040160405180910390fd5b6000600182018190556040516001600160a01b038416917f28395b05bf9eaf40ab2f61e39137d518737cf216df8c7b25e1e6f23fc08fcef191a25050565b6060838214610729576040516329f2386760e01b815260040160405180910390fd5b8367ffffffffffffffff81111561074257610742610f79565b60405190808252806020026020018201604052801561077557816020015b60608152602001906001900390816107605790505b50905060005b8481101561085f5760008087878481811061079857610798610f8f565b90506020020160208101906107ad9190610ec8565b6001600160a01b03168686858181106107c8576107c8610f8f565b90506020028101906107da9190610fa5565b6040516107e8929190610fec565b600060405180830381855afa9150503d8060008114610823576040519150601f19603f3d011682016040523d82523d6000602084013e610828565b606091505b50915091508115610858578084848060010195508151811061084c5761084c610f8f565b60200260200101819052505b505061077b565b50949350505050565b6000546001600160a01b0316331461089357604051631c1d490560e21b815260040160405180910390fd5b61089c81610b99565b50565b6001546001600160a01b031633146108ca576040516301bd182d60e41b815260040160405180910390fd5b6001546108df906001600160a01b0316610be5565b6108e96000610b99565b565b6000546001600160a01b0316331461091657604051631c1d490560e21b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b0316141561096957604051632003d68d60e21b815260040160405180910390fd5b6001600160a01b0381166000908152600360205260409020600181015480156109a55760405163381c6f9b60e01b815260040160405180910390fd5b60006002600081546109b690610ffc565b91829055506001840181905560405190915081906001600160a01b038616907fc2bc7bba60b0c97bca88aaf37563aceadc8c6d96e0d4b5043b9500c4df5d775090600090a350505050565b6001600160a01b03831660009081526003602052604090206001810154606091859180610a415760405163ae469f1d60e01b815260040160405180910390fd5b336000908152602083905260409020548114610a7057604051635b86172f60e01b815260040160405180910390fd5b604051632b73dbd560e11b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906356e7b7aa90610ac0908a908a908a90600401611025565b6000604051808303816000875af1158015610adf573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b079190810190611065565b979650505050505050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114610b5f576040519150601f19603f3d011682016040523d82523d6000602084013e610b64565b606091505b5050905080610b8657604051633ec93ffb60e21b815260040160405180910390fd5b505050565b606061047a83836000610c35565b600180546001600160a01b0319166001600160a01b03831690811790915560405133907fa86864fa6b65f969d5ac8391ddaac6a0eba3f41386cbf6e78c3e4d6c59eb115f90600090a350565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060600080856001600160a01b03168486604051610c539190611107565b60006040518083038185875af1925050503d8060008114610c90576040519150601f19603f3d011682016040523d82523d6000602084013e610c95565b606091505b50915091506104c48683838115610cdb578051158015610cbd57506001600160a01b0383163b155b15610b8657604051631c4430c960e21b815260040160405180910390fd5b805115610cea57805181602001fd5b604051630ac7997b60e41b815260040160405180910390fd5b80356001600160a01b0381168114610d1a57600080fd5b919050565b60008060408385031215610d3257600080fd5b610d3b83610d03565b9150610d4960208401610d03565b90509250929050565b60008083601f840112610d6457600080fd5b50813567ffffffffffffffff811115610d7c57600080fd5b6020830191508360208260051b8501011115610d9757600080fd5b9250929050565b60008060008060408587031215610db457600080fd5b843567ffffffffffffffff80821115610dcc57600080fd5b610dd888838901610d52565b90965094506020870135915080821115610df157600080fd5b50610dfe87828801610d52565b95989497509550505050565b60005b83811015610e25578181015183820152602001610e0d565b83811115610e34576000848401525b50505050565b60008151808452610e52816020860160208601610e0a565b601f01601f19169290920160200192915050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015610ebb57603f19888603018452610ea9858351610e3a565b94509285019290850190600101610e8d565b5092979650505050505050565b600060208284031215610eda57600080fd5b61047a82610d03565b600080600060408486031215610ef857600080fd5b610f0184610d03565b9250602084013567ffffffffffffffff80821115610f1e57600080fd5b818601915086601f830112610f3257600080fd5b813581811115610f4157600080fd5b876020828501011115610f5357600080fd5b6020830194508093505050509250925092565b60208152600061047a6020830184610e3a565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112610fbc57600080fd5b83018035915067ffffffffffffffff821115610fd757600080fd5b602001915036819003821315610d9757600080fd5b8183823760009101908152919050565b600060001982141561101e57634e487b7160e01b600052601160045260246000fd5b5060010190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b60006020828403121561107757600080fd5b815167ffffffffffffffff8082111561108f57600080fd5b818401915084601f8301126110a357600080fd5b8151818111156110b5576110b5610f79565b604051601f8201601f19908116603f011681019083821181831017156110dd576110dd610f79565b816040528281528760208487010111156110f657600080fd5b610b07836020830160208801610e0a565b60008251611119818460208701610e0a565b919091019291505056fea264697066735822122086a65220438bd41072cf16f725c57c2434214f9c01dbdf4a6244008f952779c164736f6c634300080a003360a060405234801561001057600080fd5b503360805260805161034e610035600039600081816071015260a8015261034e6000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806356e7b7aa1461003b578063f2d6382614610064575b600080fd5b61004e610049366004610208565b61009b565b60405161005b91906102c9565b60405180910390f35b6040516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016815260200161005b565b6060336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146100e657604051633859417b60e01b815260040160405180910390fd5b61013083838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506001600160a01b03881692915050610138565b949350505050565b6060600080846001600160a01b03168460405161015591906102fc565b600060405180830381855af49150503d8060008114610190576040519150601f19603f3d011682016040523d82523d6000602084013e610195565b606091505b509150915061013085838381156101e05780511580156101bd57506001600160a01b0383163b155b156101db57604051631c4430c960e21b815260040160405180910390fd5b505050565b8051156101ef57805181602001fd5b604051630ac7997b60e41b815260040160405180910390fd5b60008060006040848603121561021d57600080fd5b83356001600160a01b038116811461023457600080fd5b9250602084013567ffffffffffffffff8082111561025157600080fd5b818601915086601f83011261026557600080fd5b81358181111561027457600080fd5b87602082850101111561028657600080fd5b6020830194508093505050509250925092565b60005b838110156102b457818101518382015260200161029c565b838111156102c3576000848401525b50505050565b60208152600082518060208401526102e8816040850160208701610299565b601f01601f19169190910160400192915050565b6000825161030e818460208701610299565b919091019291505056fea2646970667358221220b8277034d7d77fd952c1725d736dfad6781431f7474c7d91d8069cd1fd96f15364736f6c634300080a0033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100f55760003560e01c80636b6447ae11610097578063c42069ec11610066578063c42069ec14610240578063e30c397814610253578063f9dca98914610264578063fdd6eaed1461026c57600080fd5b80636b6447ae146101cf5780638da5cb5b146101e2578063ac78496d14610207578063becf77791461022d57600080fd5b806346fbdb55116100d357806346fbdb5514610176578063552284d7146101965780635bb0431d146101a9578063669dcec9146101bc57600080fd5b80631450ce22146100fa57806314c5ae621461010f5780631e9d963514610138575b600080fd5b61010d610108366004610d1f565b61027f565b005b61012261011d366004610d9e565b61036a565b60405161012f9190610e66565b60405180910390f35b610166610146366004610ec8565b6001600160a01b0316600090815260036020526040902060010154151590565b604051901515815260200161012f565b610189610184366004610ee3565b61046a565b60405161012f9190610f66565b6101666101a4366004610d1f565b610481565b6101896101b7366004610ee3565b6104cd565b61010d6101ca366004610d1f565b610579565b61010d6101dd366004610ec8565b610664565b6000546001600160a01b03165b6040516001600160a01b03909116815260200161012f565b7f00000000000000000000000060233142befce7d4ed73e7793ead2d6190fccaab6101ef565b61012261023b366004610d9e565b610707565b61010d61024e366004610ec8565b610868565b6001546001600160a01b03166101ef565b61010d61089f565b61010d61027a366004610ec8565b6108eb565b6000546001600160a01b031633146102aa57604051631c1d490560e21b815260040160405180910390fd5b6001600160a01b03821660009081526003602052604090206001810154806102e55760405163ae469f1d60e01b815260040160405180910390fd5b6001600160a01b038316600090815260208390526040902054811461031d57604051630eb25ec760e11b815260040160405180910390fd5b6001600160a01b038084166000818152602085905260408082208290555191928716917fe47eb1ae85338794d8dd5529f47fe49e96c025db48f915399c303e9872b7456d9190a350505050565b606083821461038c576040516329f2386760e01b815260040160405180910390fd5b60008467ffffffffffffffff8111156103a7576103a7610f79565b6040519080825280602002602001820160405280156103da57816020015b60608152602001906001900390816103c55790505b50905060005b858110156104605761043b8787838181106103fd576103fd610f8f565b90506020020160208101906104129190610ec8565b86868481811061042457610424610f8f565b90506020028101906104369190610fa5565b610a01565b82828151811061044d5761044d610f8f565b60209081029190910101526001016103e0565b5095945050505050565b6060610477848484610a01565b90505b9392505050565b6001600160a01b0382166000908152600360205260408120600181015480158015906104c457506001600160a01b03841660009081526020839052604090205481145b95945050505050565b60606104e16000546001600160a01b031690565b6001600160a01b0316336001600160a01b03161461051257604051631c1d490560e21b815260040160405180910390fd5b8161052f5761052a6001600160a01b03851647610b12565b61047a565b61047783838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506001600160a01b03881692915050610b8b565b6000546001600160a01b031633146105a457604051631c1d490560e21b815260040160405180910390fd5b6001600160a01b03821660009081526003602052604090206001810154806105df5760405163ae469f1d60e01b815260040160405180910390fd5b6001600160a01b03831660009081526020839052604090205481141561061857604051633e37ccfb60e11b815260040160405180910390fd5b6001600160a01b038084166000818152602085905260408082208590555184938816917f4ed75292a1dcc025209b6b838c3c0b769310bd1d2910bf2e56cb2fbc7f4c5d8c91a450505050565b6000546001600160a01b0316331461068f57604051631c1d490560e21b815260040160405180910390fd5b6001600160a01b038116600090815260036020526040902060018101546106c95760405163ae469f1d60e01b815260040160405180910390fd5b6000600182018190556040516001600160a01b038416917f28395b05bf9eaf40ab2f61e39137d518737cf216df8c7b25e1e6f23fc08fcef191a25050565b6060838214610729576040516329f2386760e01b815260040160405180910390fd5b8367ffffffffffffffff81111561074257610742610f79565b60405190808252806020026020018201604052801561077557816020015b60608152602001906001900390816107605790505b50905060005b8481101561085f5760008087878481811061079857610798610f8f565b90506020020160208101906107ad9190610ec8565b6001600160a01b03168686858181106107c8576107c8610f8f565b90506020028101906107da9190610fa5565b6040516107e8929190610fec565b600060405180830381855afa9150503d8060008114610823576040519150601f19603f3d011682016040523d82523d6000602084013e610828565b606091505b50915091508115610858578084848060010195508151811061084c5761084c610f8f565b60200260200101819052505b505061077b565b50949350505050565b6000546001600160a01b0316331461089357604051631c1d490560e21b815260040160405180910390fd5b61089c81610b99565b50565b6001546001600160a01b031633146108ca576040516301bd182d60e41b815260040160405180910390fd5b6001546108df906001600160a01b0316610be5565b6108e96000610b99565b565b6000546001600160a01b0316331461091657604051631c1d490560e21b815260040160405180910390fd5b7f00000000000000000000000060233142befce7d4ed73e7793ead2d6190fccaab6001600160a01b0316816001600160a01b0316141561096957604051632003d68d60e21b815260040160405180910390fd5b6001600160a01b0381166000908152600360205260409020600181015480156109a55760405163381c6f9b60e01b815260040160405180910390fd5b60006002600081546109b690610ffc565b91829055506001840181905560405190915081906001600160a01b038616907fc2bc7bba60b0c97bca88aaf37563aceadc8c6d96e0d4b5043b9500c4df5d775090600090a350505050565b6001600160a01b03831660009081526003602052604090206001810154606091859180610a415760405163ae469f1d60e01b815260040160405180910390fd5b336000908152602083905260409020548114610a7057604051635b86172f60e01b815260040160405180910390fd5b604051632b73dbd560e11b81526001600160a01b037f00000000000000000000000060233142befce7d4ed73e7793ead2d6190fccaab16906356e7b7aa90610ac0908a908a908a90600401611025565b6000604051808303816000875af1158015610adf573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b079190810190611065565b979650505050505050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114610b5f576040519150601f19603f3d011682016040523d82523d6000602084013e610b64565b606091505b5050905080610b8657604051633ec93ffb60e21b815260040160405180910390fd5b505050565b606061047a83836000610c35565b600180546001600160a01b0319166001600160a01b03831690811790915560405133907fa86864fa6b65f969d5ac8391ddaac6a0eba3f41386cbf6e78c3e4d6c59eb115f90600090a350565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060600080856001600160a01b03168486604051610c539190611107565b60006040518083038185875af1925050503d8060008114610c90576040519150601f19603f3d011682016040523d82523d6000602084013e610c95565b606091505b50915091506104c48683838115610cdb578051158015610cbd57506001600160a01b0383163b155b15610b8657604051631c4430c960e21b815260040160405180910390fd5b805115610cea57805181602001fd5b604051630ac7997b60e41b815260040160405180910390fd5b80356001600160a01b0381168114610d1a57600080fd5b919050565b60008060408385031215610d3257600080fd5b610d3b83610d03565b9150610d4960208401610d03565b90509250929050565b60008083601f840112610d6457600080fd5b50813567ffffffffffffffff811115610d7c57600080fd5b6020830191508360208260051b8501011115610d9757600080fd5b9250929050565b60008060008060408587031215610db457600080fd5b843567ffffffffffffffff80821115610dcc57600080fd5b610dd888838901610d52565b90965094506020870135915080821115610df157600080fd5b50610dfe87828801610d52565b95989497509550505050565b60005b83811015610e25578181015183820152602001610e0d565b83811115610e34576000848401525b50505050565b60008151808452610e52816020860160208601610e0a565b601f01601f19169290920160200192915050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015610ebb57603f19888603018452610ea9858351610e3a565b94509285019290850190600101610e8d565b5092979650505050505050565b600060208284031215610eda57600080fd5b61047a82610d03565b600080600060408486031215610ef857600080fd5b610f0184610d03565b9250602084013567ffffffffffffffff80821115610f1e57600080fd5b818601915086601f830112610f3257600080fd5b813581811115610f4157600080fd5b876020828501011115610f5357600080fd5b6020830194508093505050509250925092565b60208152600061047a6020830184610e3a565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112610fbc57600080fd5b83018035915067ffffffffffffffff821115610fd757600080fd5b602001915036819003821315610d9757600080fd5b8183823760009101908152919050565b600060001982141561101e57634e487b7160e01b600052601160045260246000fd5b5060010190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b60006020828403121561107757600080fd5b815167ffffffffffffffff8082111561108f57600080fd5b818401915084601f8301126110a357600080fd5b8151818111156110b5576110b5610f79565b604051601f8201601f19908116603f011681019083821181831017156110dd576110dd610f79565b816040528281528760208487010111156110f657600080fd5b610b07836020830160208801610e0a565b60008251611119818460208701610e0a565b919091019291505056fea264697066735822122086a65220438bd41072cf16f725c57c2434214f9c01dbdf4a6244008f952779c164736f6c634300080a0033

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  ]
[ 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.