ETH Price: $2,416.67 (+1.91%)

Contract

0x7b292034084A41B9D441B71b6E3557Edd0463fa8
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Execute Proposal197096502024-04-22 8:09:23145 days ago1713773363IN
0x7b292034...dd0463fa8
0 ETH0.000897387.82211902
Execute Proposal197096482024-04-22 8:08:59145 days ago1713773339IN
0x7b292034...dd0463fa8
0 ETH0.000858427.60862279
Execute Proposal196615462024-04-15 14:36:47151 days ago1713191807IN
0x7b292034...dd0463fa8
0 ETH0.0048133322.72776397
Execute Proposal196615442024-04-15 14:36:23151 days ago1713191783IN
0x7b292034...dd0463fa8
0 ETH0.0049910123.07738046
Execute Proposal196615422024-04-15 14:35:59151 days ago1713191759IN
0x7b292034...dd0463fa8
0 ETH0.0049570421.97659724
Execute Proposal196615402024-04-15 14:35:35151 days ago1713191735IN
0x7b292034...dd0463fa8
0 ETH0.0030252523.4192843
Execute Proposal196615372024-04-15 14:34:59151 days ago1713191699IN
0x7b292034...dd0463fa8
0 ETH0.0024205122.01507541
Execute Proposal196260632024-04-10 15:16:35156 days ago1712762195IN
0x7b292034...dd0463fa8
0 ETH0.0034106929.77651428
Execute Proposal195618872024-04-01 15:31:23165 days ago1711985483IN
0x7b292034...dd0463fa8
0 ETH0.0061851864.47463214
Execute Proposal195618852024-04-01 15:30:59165 days ago1711985459IN
0x7b292034...dd0463fa8
0 ETH0.0060299362.87208314
Execute Proposal195618832024-04-01 15:30:35165 days ago1711985435IN
0x7b292034...dd0463fa8
0 ETH0.006578657.34289326
Execute Proposal195618802024-04-01 15:29:59165 days ago1711985399IN
0x7b292034...dd0463fa8
0 ETH0.0061106554.16193427
Execute Proposal194288702024-03-13 21:40:59184 days ago1710366059IN
0x7b292034...dd0463fa8
0 ETH0.0174085659.29852141
Execute Proposal194195282024-03-12 14:14:47185 days ago1710252887IN
0x7b292034...dd0463fa8
0 ETH0.0193749873.76870487
Execute Proposal194195252024-03-12 14:14:11185 days ago1710252851IN
0x7b292034...dd0463fa8
0 ETH0.0100264575.66906631
Execute Proposal194195152024-03-12 14:12:11185 days ago1710252731IN
0x7b292034...dd0463fa8
0 ETH0.0097716877.64610107
Execute Proposal180815062023-09-07 2:15:35373 days ago1694052935IN
0x7b292034...dd0463fa8
0 ETH0.0014924212.69709019
Execute Proposal180129252023-08-28 11:43:59382 days ago1693223039IN
0x7b292034...dd0463fa8
0 ETH0.0022412215.92596066
Multicall176688842023-07-11 7:27:11431 days ago1689060431IN
0x7b292034...dd0463fa8
0 ETH0.02421217.76636501
Execute Proposal173222392023-05-23 13:29:47479 days ago1684848587IN
0x7b292034...dd0463fa8
0 ETH0.0042016938.21528809
Execute Proposal167941502023-03-10 0:17:47554 days ago1678407467IN
0x7b292034...dd0463fa8
0 ETH0.0034147833.14999611
Reset Member166974252023-02-24 9:51:35568 days ago1677232295IN
0x7b292034...dd0463fa8
0 ETH0.0008109423.92601155
Reset Member166974232023-02-24 9:51:11568 days ago1677232271IN
0x7b292034...dd0463fa8
0 ETH0.0010177826.85025193
Reset Member166974212023-02-24 9:50:47568 days ago1677232247IN
0x7b292034...dd0463fa8
0 ETH0.001030727.19116495
0x60a06040166972762023-02-24 9:20:59568 days ago1677230459IN
 Create: GovernorV2
0 ETH0.0721328826.9791406

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
GovernorV2

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
Yes with 1000000 runs

Other Settings:
default evmVersion
File 1 of 12 : GovernorV2.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity 0.8.16;

import "../../common/implementation/Lockable.sol";
import "../../common/implementation/MultiCaller.sol";
import "../../common/implementation/MultiRole.sol";
import "../interfaces/FinderInterface.sol";
import "../interfaces/IdentifierWhitelistInterface.sol";
import "../interfaces/OracleGovernanceInterface.sol";
import "./Constants.sol";
import "./AdminIdentifierLib.sol";

import "@openzeppelin/contracts/utils/Address.sol";

/**
 * @title Takes proposals for certain governance actions and allows UMA token holders to vote on them.
 */
contract GovernorV2 is MultiRole, Lockable, MultiCaller {
    using Address for address;

    /****************************************
     *             GOVERNOR STATE           *
     ****************************************/

    // Permissioned governor rolls.
    enum Roles {
        Owner, // Can set the proposer.
        Proposer, // Address that can make proposals.
        EmergencyProposer // Address that can make emergency proposals.
    }

    // Structure to represent a transaction.
    struct Transaction {
        address to; // Target.
        uint256 value; // value, in eth, to be sent as the msg.value.
        bytes data; // payload data to be sent to the target. Would include encoded function call data usually.
    }

    // Structure to represent a governance proposal.
    struct Proposal {
        Transaction[] transactions; // Set of transactions to be sent, if the proposal is executed.
        uint256 requestTime; // Time at which the proposal was proposed.
        bytes ancillaryData; // Extra data appended to a proposal to enhance the voters information.
    }

    // Reference to UMA finder, used to find addresses of other UMA ecosystem contracts.
    FinderInterface public immutable finder;

    // Array of all proposals.
    Proposal[] public proposals;

    /****************************************
     *                EVENTS                *
     ****************************************/

    event NewProposal(uint256 indexed id, Transaction[] transactions);

    event ProposalExecuted(uint256 indexed id, uint256 transactionIndex);
    event EmergencyExecution(address indexed to, uint256 value, bytes data);

    /**
     * @notice Construct the Governor contract.
     * @param _finderAddress keeps track of all contracts within the system based on their interfaceName.
     * @param _startingId the initial proposal id that the contract will begin incrementing from.
     */
    constructor(address _finderAddress, uint256 _startingId) {
        finder = FinderInterface(_finderAddress);
        _createExclusiveRole(uint256(Roles.Owner), uint256(Roles.Owner), msg.sender);
        _createExclusiveRole(uint256(Roles.Proposer), uint256(Roles.Owner), msg.sender);
        _createExclusiveRole(uint256(Roles.EmergencyProposer), uint256(Roles.Owner), msg.sender);

        // Ensure the startingId is not set unreasonably high to avoid it being set such that new proposals overwrite
        // other storage slots in the contract.
        uint256 maxStartingId = 10**18;
        require(_startingId <= maxStartingId, "Cannot set startingId larger than 10^18");

        // Sets the initial length of the array to the startingId. Modifying length directly has been disallowed in solidity 0.6.
        assembly {
            sstore(proposals.slot, _startingId)
        }
    }

    /****************************************
     *          PROPOSAL ACTIONS            *
     ****************************************/

    /**
     * @notice Proposes a new governance action. Can only be called by the holder of the Proposer role.
     * @param transactions list of transactions that are being proposed.
     * @param ancillaryData arbitrary data appended to a price request to give the voters more info from the caller.
     */
    function propose(Transaction[] memory transactions, bytes memory ancillaryData)
        external
        nonReentrant()
        onlyRoleHolder(uint256(Roles.Proposer))
    {
        require(transactions.length > 0, "Empty transactions array");
        uint256 id = proposals.length;
        uint256 time = getCurrentTime();

        // Note: doing all of this array manipulation manually is necessary because directly setting an array of
        // structs in storage to an array of structs in memory is currently not implemented in solidity :/.

        // Add a zero-initialized element to the proposals array.
        proposals.push();

        // Initialize the new proposal.
        Proposal storage proposal = proposals[id];
        proposal.requestTime = time;
        proposal.ancillaryData = ancillaryData;

        // Initialize the transaction array.
        for (uint256 i = 0; i < transactions.length; i++) {
            require(transactions[i].to != address(0), "The `to` address cannot be 0x0");
            // If the transaction has any data with it the recipient must be a contract, not an EOA.
            if (transactions[i].data.length > 0) {
                require(transactions[i].to.isContract(), "EOA can't accept tx with data");
            }
            proposal.transactions.push(transactions[i]);
        }

        bytes32 identifier = AdminIdentifierLib._constructIdentifier(id);

        // Request a vote on this proposal in the DVM.
        _getOracle().requestGovernanceAction(identifier, time, ancillaryData);

        emit NewProposal(id, transactions);
    }

    /**
     * @notice Executes a proposed governance action that has been approved by voters.
     * @dev This can be called by any address. Caller is expected to send enough ETH to execute payable transactions.
     * @param id unique id for the executed proposal.
     * @param transactionIndex unique transaction index for the executed proposal.
     */
    function executeProposal(uint256 id, uint256 transactionIndex) external payable nonReentrant() {
        Proposal storage proposal = proposals[id];
        int256 price =
            _getOracle().getPrice(
                AdminIdentifierLib._constructIdentifier(id),
                proposal.requestTime,
                proposal.ancillaryData
            );

        Transaction memory transaction = proposal.transactions[transactionIndex];

        require(
            transactionIndex == 0 || proposal.transactions[transactionIndex - 1].to == address(0),
            "Previous tx not yet executed"
        );
        require(transaction.to != address(0), "Tx already executed");
        require(price != 0, "Proposal was rejected");
        require(msg.value == transaction.value, "Must send exact amount of ETH");

        // Delete the transaction before execution to avoid any potential re-entrancy issues.
        delete proposal.transactions[transactionIndex];

        require(_executeCall(transaction.to, transaction.value, transaction.data), "Tx execution failed");

        emit ProposalExecuted(id, transactionIndex);
    }

    /**
     * @notice Emergency execution method that bypasses the voting system to execute a transaction.
     * @dev This can only be called by the EmergencyProposer.
     * @param transaction a single transaction to execute.
     */
    function emergencyExecute(Transaction memory transaction)
        external
        payable
        nonReentrant()
        onlyRoleHolder(uint256(Roles.EmergencyProposer))
    {
        require(_executeCall(transaction.to, transaction.value, transaction.data), "Tx execution failed");

        emit EmergencyExecution(transaction.to, transaction.value, transaction.data);
    }

    /**
     * @notice Returns the current block timestamp.
     * @dev Can be overridden to control contract time.
     * @return the current block timestamp.
     */
    function getCurrentTime() public view virtual returns (uint256) {
        return block.timestamp;
    }

    /****************************************
     *       GOVERNOR STATE GETTERS         *
     ****************************************/

    /**
     * @notice Gets the total number of proposals (includes executed and non-executed).
     * @return uint256 representing the current number of proposals.
     */
    function numProposals() external view returns (uint256) {
        return proposals.length;
    }

    /**
     * @notice Gets the proposal data for a particular id.
     * @dev after a proposal is executed, its data will be zeroed out, except for the request time and ancillary data.
     * @param id uniquely identify the identity of the proposal.
     * @return proposal struct containing transactions[] and requestTime.
     */
    function getProposal(uint256 id) external view returns (Proposal memory) {
        return proposals[id];
    }

    /****************************************
     *      PRIVATE GETTERS AND FUNCTIONS   *
     ****************************************/

    // Runs a function call on to, with value eth sent and data payload.
    function _executeCall(
        address to,
        uint256 value,
        bytes memory data
    ) private returns (bool) {
        // Mostly copied from:
        // solhint-disable-next-line max-line-length
        // https://github.com/gnosis/safe-contracts/blob/59cfdaebcd8b87a0a32f87b50fead092c10d3a05/contracts/base/Executor.sol#L23-L31
        // solhint-disable-next-line no-inline-assembly

        bool success;
        assembly {
            let inputData := add(data, 0x20)
            let inputDataSize := mload(data)
            success := call(gas(), to, value, inputData, inputDataSize, 0, 0)
        }
        return success;
    }

    // Returns the Voting contract address, named "Oracle" in the finder.
    function _getOracle() private view returns (OracleGovernanceInterface) {
        return OracleGovernanceInterface(finder.getImplementationAddress(OracleInterfaces.Oracle));
    }

    // Returns the IdentifierWhitelist contract address, named "IdentifierWhitelist" in the finder.
    function _getIdentifierWhitelist() private view returns (IdentifierWhitelistInterface) {
        return IdentifierWhitelistInterface(finder.getImplementationAddress(OracleInterfaces.IdentifierWhitelist));
    }
}

File 2 of 12 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 3 of 12 : Lockable.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity ^0.8.0;

/**
 * @title A contract that provides modifiers to prevent reentrancy to state-changing and view-only methods. This contract
 * is inspired by https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/ReentrancyGuard.sol
 * and https://github.com/balancer-labs/balancer-core/blob/master/contracts/BPool.sol.
 */
contract Lockable {
    bool private _notEntered;

    constructor() {
        // Storing an initial non-zero value makes deployment a bit more expensive, but in exchange the refund on every
        // call to nonReentrant will be lower in amount. Since refunds are capped to a percentage of the total
        // transaction's gas, it is best to keep them low in cases like this one, to increase the likelihood of the full
        // refund coming into effect.
        _notEntered = true;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant` function is not supported. It is possible to
     * prevent this from happening by making the `nonReentrant` function external, and making it call a `private`
     * function that does the actual state modification.
     */
    modifier nonReentrant() {
        _preEntranceCheck();
        _preEntranceSet();
        _;
        _postEntranceReset();
    }

    /**
     * @dev Designed to prevent a view-only method from being re-entered during a call to a `nonReentrant()` state-changing method.
     */
    modifier nonReentrantView() {
        _preEntranceCheck();
        _;
    }

    // Internal methods are used to avoid copying the require statement's bytecode to every `nonReentrant()` method.
    // On entry into a function, `_preEntranceCheck()` should always be called to check if the function is being
    // re-entered. Then, if the function modifies state, it should call `_postEntranceSet()`, perform its logic, and
    // then call `_postEntranceReset()`.
    // View-only methods can simply call `_preEntranceCheck()` to make sure that it is not being re-entered.
    function _preEntranceCheck() internal view {
        // On the first call to nonReentrant, _notEntered will be true
        require(_notEntered, "ReentrancyGuard: reentrant call");
    }

    function _preEntranceSet() internal {
        // Any calls to nonReentrant after this point will fail
        _notEntered = false;
    }

    function _postEntranceReset() internal {
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _notEntered = true;
    }

    // These functions are intended to be used by child contracts to temporarily disable and re-enable the guard.
    // Intended use:
    // _startReentrantGuardDisabled();
    // ...
    // _endReentrantGuardDisabled();
    //
    // IMPORTANT: these should NEVER be used in a method that isn't inside a nonReentrant block. Otherwise, it's
    // possible to permanently lock your contract.
    function _startReentrantGuardDisabled() internal {
        _notEntered = true;
    }

    function _endReentrantGuardDisabled() internal {
        _notEntered = false;
    }
}

File 4 of 12 : MultiCaller.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity ^0.8.0;

// This contract is taken from Uniswap's multi call implementation (https://github.com/Uniswap/uniswap-v3-periphery/blob/main/contracts/base/Multicall.sol)
// and was modified to be solidity 0.8 compatible. Additionally, the method was restricted to only work with msg.value
// set to 0 to avoid any nasty attack vectors on function calls that use value sent with deposits.

/// @title MultiCaller
/// @notice Enables calling multiple methods in a single call to the contract
contract MultiCaller {
    function multicall(bytes[] calldata data) external returns (bytes[] memory results) {
        results = new bytes[](data.length);
        for (uint256 i = 0; i < data.length; i++) {
            (bool success, bytes memory result) = address(this).delegatecall(data[i]);

            if (!success) {
                // Next 5 lines from https://ethereum.stackexchange.com/a/83577
                if (result.length < 68) revert();
                assembly {
                    result := add(result, 0x04)
                }
                revert(abi.decode(result, (string)));
            }

            results[i] = result;
        }
    }
}

File 5 of 12 : MultiRole.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity ^0.8.0;

library Exclusive {
    struct RoleMembership {
        address member;
    }

    function isMember(RoleMembership storage roleMembership, address memberToCheck) internal view returns (bool) {
        return roleMembership.member == memberToCheck;
    }

    function resetMember(RoleMembership storage roleMembership, address newMember) internal {
        require(newMember != address(0x0), "Cannot set an exclusive role to 0x0");
        roleMembership.member = newMember;
    }

    function getMember(RoleMembership storage roleMembership) internal view returns (address) {
        return roleMembership.member;
    }

    function init(RoleMembership storage roleMembership, address initialMember) internal {
        resetMember(roleMembership, initialMember);
    }
}

library Shared {
    struct RoleMembership {
        mapping(address => bool) members;
    }

    function isMember(RoleMembership storage roleMembership, address memberToCheck) internal view returns (bool) {
        return roleMembership.members[memberToCheck];
    }

    function addMember(RoleMembership storage roleMembership, address memberToAdd) internal {
        require(memberToAdd != address(0x0), "Cannot add 0x0 to a shared role");
        roleMembership.members[memberToAdd] = true;
    }

    function removeMember(RoleMembership storage roleMembership, address memberToRemove) internal {
        roleMembership.members[memberToRemove] = false;
    }

    function init(RoleMembership storage roleMembership, address[] memory initialMembers) internal {
        for (uint256 i = 0; i < initialMembers.length; i++) {
            addMember(roleMembership, initialMembers[i]);
        }
    }
}

/**
 * @title Base class to manage permissions for the derived class.
 */
abstract contract MultiRole {
    using Exclusive for Exclusive.RoleMembership;
    using Shared for Shared.RoleMembership;

    enum RoleType { Invalid, Exclusive, Shared }

    struct Role {
        uint256 managingRole;
        RoleType roleType;
        Exclusive.RoleMembership exclusiveRoleMembership;
        Shared.RoleMembership sharedRoleMembership;
    }

    mapping(uint256 => Role) private roles;

    event ResetExclusiveMember(uint256 indexed roleId, address indexed newMember, address indexed manager);
    event AddedSharedMember(uint256 indexed roleId, address indexed newMember, address indexed manager);
    event RemovedSharedMember(uint256 indexed roleId, address indexed oldMember, address indexed manager);

    /**
     * @notice Reverts unless the caller is a member of the specified roleId.
     */
    modifier onlyRoleHolder(uint256 roleId) {
        require(holdsRole(roleId, msg.sender), "Sender does not hold required role");
        _;
    }

    /**
     * @notice Reverts unless the caller is a member of the manager role for the specified roleId.
     */
    modifier onlyRoleManager(uint256 roleId) {
        require(holdsRole(roles[roleId].managingRole, msg.sender), "Can only be called by a role manager");
        _;
    }

    /**
     * @notice Reverts unless the roleId represents an initialized, exclusive roleId.
     */
    modifier onlyExclusive(uint256 roleId) {
        require(roles[roleId].roleType == RoleType.Exclusive, "Must be called on an initialized Exclusive role");
        _;
    }

    /**
     * @notice Reverts unless the roleId represents an initialized, shared roleId.
     */
    modifier onlyShared(uint256 roleId) {
        require(roles[roleId].roleType == RoleType.Shared, "Must be called on an initialized Shared role");
        _;
    }

    /**
     * @notice Whether `memberToCheck` is a member of roleId.
     * @dev Reverts if roleId does not correspond to an initialized role.
     * @param roleId the Role to check.
     * @param memberToCheck the address to check.
     * @return True if `memberToCheck` is a member of `roleId`.
     */
    function holdsRole(uint256 roleId, address memberToCheck) public view returns (bool) {
        Role storage role = roles[roleId];
        if (role.roleType == RoleType.Exclusive) {
            return role.exclusiveRoleMembership.isMember(memberToCheck);
        } else if (role.roleType == RoleType.Shared) {
            return role.sharedRoleMembership.isMember(memberToCheck);
        }
        revert("Invalid roleId");
    }

    /**
     * @notice Changes the exclusive role holder of `roleId` to `newMember`.
     * @dev Reverts if the caller is not a member of the managing role for `roleId` or if `roleId` is not an
     * initialized, ExclusiveRole.
     * @param roleId the ExclusiveRole membership to modify.
     * @param newMember the new ExclusiveRole member.
     */
    function resetMember(uint256 roleId, address newMember) public onlyExclusive(roleId) onlyRoleManager(roleId) {
        roles[roleId].exclusiveRoleMembership.resetMember(newMember);
        emit ResetExclusiveMember(roleId, newMember, msg.sender);
    }

    /**
     * @notice Gets the current holder of the exclusive role, `roleId`.
     * @dev Reverts if `roleId` does not represent an initialized, exclusive role.
     * @param roleId the ExclusiveRole membership to check.
     * @return the address of the current ExclusiveRole member.
     */
    function getMember(uint256 roleId) public view onlyExclusive(roleId) returns (address) {
        return roles[roleId].exclusiveRoleMembership.getMember();
    }

    /**
     * @notice Adds `newMember` to the shared role, `roleId`.
     * @dev Reverts if `roleId` does not represent an initialized, SharedRole or if the caller is not a member of the
     * managing role for `roleId`.
     * @param roleId the SharedRole membership to modify.
     * @param newMember the new SharedRole member.
     */
    function addMember(uint256 roleId, address newMember) public onlyShared(roleId) onlyRoleManager(roleId) {
        roles[roleId].sharedRoleMembership.addMember(newMember);
        emit AddedSharedMember(roleId, newMember, msg.sender);
    }

    /**
     * @notice Removes `memberToRemove` from the shared role, `roleId`.
     * @dev Reverts if `roleId` does not represent an initialized, SharedRole or if the caller is not a member of the
     * managing role for `roleId`.
     * @param roleId the SharedRole membership to modify.
     * @param memberToRemove the current SharedRole member to remove.
     */
    function removeMember(uint256 roleId, address memberToRemove) public onlyShared(roleId) onlyRoleManager(roleId) {
        roles[roleId].sharedRoleMembership.removeMember(memberToRemove);
        emit RemovedSharedMember(roleId, memberToRemove, msg.sender);
    }

    /**
     * @notice Removes caller from the role, `roleId`.
     * @dev Reverts if the caller is not a member of the role for `roleId` or if `roleId` is not an
     * initialized, SharedRole.
     * @param roleId the SharedRole membership to modify.
     */
    function renounceMembership(uint256 roleId) public onlyShared(roleId) onlyRoleHolder(roleId) {
        roles[roleId].sharedRoleMembership.removeMember(msg.sender);
        emit RemovedSharedMember(roleId, msg.sender, msg.sender);
    }

    /**
     * @notice Reverts if `roleId` is not initialized.
     */
    modifier onlyValidRole(uint256 roleId) {
        require(roles[roleId].roleType != RoleType.Invalid, "Attempted to use an invalid roleId");
        _;
    }

    /**
     * @notice Reverts if `roleId` is initialized.
     */
    modifier onlyInvalidRole(uint256 roleId) {
        require(roles[roleId].roleType == RoleType.Invalid, "Cannot use a pre-existing role");
        _;
    }

    /**
     * @notice Internal method to initialize a shared role, `roleId`, which will be managed by `managingRoleId`.
     * `initialMembers` will be immediately added to the role.
     * @dev Should be called by derived contracts, usually at construction time. Will revert if the role is already
     * initialized.
     */
    function _createSharedRole(
        uint256 roleId,
        uint256 managingRoleId,
        address[] memory initialMembers
    ) internal onlyInvalidRole(roleId) {
        Role storage role = roles[roleId];
        role.roleType = RoleType.Shared;
        role.managingRole = managingRoleId;
        role.sharedRoleMembership.init(initialMembers);
        require(
            roles[managingRoleId].roleType != RoleType.Invalid,
            "Attempted to use an invalid role to manage a shared role"
        );
    }

    /**
     * @notice Internal method to initialize an exclusive role, `roleId`, which will be managed by `managingRoleId`.
     * `initialMember` will be immediately added to the role.
     * @dev Should be called by derived contracts, usually at construction time. Will revert if the role is already
     * initialized.
     */
    function _createExclusiveRole(
        uint256 roleId,
        uint256 managingRoleId,
        address initialMember
    ) internal onlyInvalidRole(roleId) {
        Role storage role = roles[roleId];
        role.roleType = RoleType.Exclusive;
        role.managingRole = managingRoleId;
        role.exclusiveRoleMembership.init(initialMember);
        require(
            roles[managingRoleId].roleType != RoleType.Invalid,
            "Attempted to use an invalid role to manage an exclusive role"
        );
    }
}

File 6 of 12 : AdminIdentifierLib.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity 0.8.16;

/**
 * @title Library to construct admin identifiers.
 */
library AdminIdentifierLib {
    // Returns a UTF-8 identifier representing a particular admin proposal.
    // The identifier is of the form "Admin n", where n is the proposal id provided.
    function _constructIdentifier(uint256 id) internal pure returns (bytes32) {
        bytes32 bytesId = _uintToUtf8(id);
        return _addPrefix(bytesId, "Admin ", 6);
    }

    // This method converts the integer `v` into a base-10, UTF-8 representation stored in a `bytes32` type.
    // If the input cannot be represented by 32 base-10 digits, it returns only the highest 32 digits.
    // This method is based off of this code: https://ethereum.stackexchange.com/a/6613/47801.
    function _uintToUtf8(uint256 v) internal pure returns (bytes32) {
        bytes32 ret;
        if (v == 0) {
            // Handle 0 case explicitly.
            ret = "0";
        } else {
            // Constants.
            uint256 bitsPerByte = 8;
            uint256 base = 10; // Note: the output should be base-10. The below implementation will not work for bases > 10.
            uint256 utf8NumberOffset = 48;
            while (v > 0) {
                // Downshift the entire bytes32 to allow the new digit to be added at the "front" of the bytes32, which
                // translates to the beginning of the UTF-8 representation.
                ret = ret >> bitsPerByte;

                // Separate the last digit that remains in v by modding by the base of desired output representation.
                uint256 leastSignificantDigit = v % base;

                // Digits 0-9 are represented by 48-57 in UTF-8, so an offset must be added to create the character.
                bytes32 utf8Digit = bytes32(leastSignificantDigit + utf8NumberOffset);

                // The top byte of ret has already been cleared to make room for the new digit.
                // Upshift by 31 bytes to put it in position, and OR it with ret to leave the other characters untouched.
                ret |= utf8Digit << (31 * bitsPerByte);

                // Divide v by the base to remove the digit that was just added.
                v /= base;
            }
        }
        return ret;
    }

    // This method takes two UTF-8 strings represented as bytes32 and outputs one as a prefixed by the other.
    // `input` is the UTF-8 that should have the prefix prepended.
    // `prefix` is the UTF-8 that should be prepended onto input.
    // `prefixLength` is number of UTF-8 characters represented by `prefix`.
    // Notes:
    // 1. If the resulting UTF-8 is larger than 32 characters, then only the first 32 characters will be represented
    //    by the bytes32 output.
    // 2. If `prefix` has more characters than `prefixLength`, the function will produce an invalid result.
    function _addPrefix(
        bytes32 input,
        bytes32 prefix,
        uint256 prefixLength
    ) internal pure returns (bytes32) {
        // Downshift `input` to open space at the "front" of the bytes32
        bytes32 shiftedInput = input >> (prefixLength * 8);
        return shiftedInput | prefix;
    }
}

File 7 of 12 : Constants.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity ^0.8.0;

/**
 * @title Stores common interface names used throughout the DVM by registration in the Finder.
 */
library OracleInterfaces {
    bytes32 public constant Oracle = "Oracle";
    bytes32 public constant IdentifierWhitelist = "IdentifierWhitelist";
    bytes32 public constant Store = "Store";
    bytes32 public constant FinancialContractsAdmin = "FinancialContractsAdmin";
    bytes32 public constant Registry = "Registry";
    bytes32 public constant CollateralWhitelist = "CollateralWhitelist";
    bytes32 public constant OptimisticOracle = "OptimisticOracle";
    bytes32 public constant OptimisticOracleV2 = "OptimisticOracleV2";
    bytes32 public constant OptimisticOracleV3 = "OptimisticOracleV3";
    bytes32 public constant Bridge = "Bridge";
    bytes32 public constant GenericHandler = "GenericHandler";
    bytes32 public constant SkinnyOptimisticOracle = "SkinnyOptimisticOracle";
    bytes32 public constant ChildMessenger = "ChildMessenger";
    bytes32 public constant OracleHub = "OracleHub";
    bytes32 public constant OracleSpoke = "OracleSpoke";
}

/**
 * @title Commonly re-used values for contracts associated with the OptimisticOracle.
 */
library OptimisticOracleConstraints {
    // Any price request submitted to the OptimisticOracle must contain ancillary data no larger than this value.
    // This value must be <= the Voting contract's `ancillaryBytesLimit` constant value otherwise it is possible
    // that a price can be requested to the OptimisticOracle successfully, but cannot be resolved by the DVM which
    // refuses to accept a price request made with ancillary data length over a certain size.
    uint256 public constant ancillaryBytesLimit = 8192;
}

File 8 of 12 : FinderInterface.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity ^0.8.0;

/**
 * @title Provides addresses of the live contracts implementing certain interfaces.
 * @dev Examples are the Oracle or Store interfaces.
 */
interface FinderInterface {
    /**
     * @notice Updates the address of the contract that implements `interfaceName`.
     * @param interfaceName bytes32 encoding of the interface name that is either changed or registered.
     * @param implementationAddress address of the deployed contract that implements the interface.
     */
    function changeImplementationAddress(bytes32 interfaceName, address implementationAddress) external;

    /**
     * @notice Gets the address of the contract that implements the given `interfaceName`.
     * @param interfaceName queried interface.
     * @return implementationAddress address of the deployed contract that implements the interface.
     */
    function getImplementationAddress(bytes32 interfaceName) external view returns (address);
}

File 9 of 12 : IdentifierWhitelistInterface.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity ^0.8.0;

/**
 * @title Interface for whitelists of supported identifiers that the oracle can provide prices for.
 */
interface IdentifierWhitelistInterface {
    /**
     * @notice Adds the provided identifier as a supported identifier.
     * @dev Price requests using this identifier will succeed after this call.
     * @param identifier bytes32 encoding of the string identifier. Eg: BTC/USD.
     */
    function addSupportedIdentifier(bytes32 identifier) external;

    /**
     * @notice Removes the identifier from the whitelist.
     * @dev Price requests using this identifier will no longer succeed after this call.
     * @param identifier bytes32 encoding of the string identifier. Eg: BTC/USD.
     */
    function removeSupportedIdentifier(bytes32 identifier) external;

    /**
     * @notice Checks whether an identifier is on the whitelist.
     * @param identifier bytes32 encoding of the string identifier. Eg: BTC/USD.
     * @return bool if the identifier is supported (or not).
     */
    function isIdentifierSupported(bytes32 identifier) external view returns (bool);
}

File 10 of 12 : OracleAncillaryInterface.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity ^0.8.0;

/**
 * @title Financial contract facing Oracle interface.
 * @dev Interface used by financial contracts to interact with the Oracle. Voters will use a different interface.
 */
abstract contract OracleAncillaryInterface {
    /**
     * @notice Enqueues a request (if a request isn't already present) for the given `identifier`, `time` pair.
     * @dev Time must be in the past and the identifier must be supported.
     * @param identifier uniquely identifies the price requested. eg BTC/USD (encoded as bytes32) could be requested.
     * @param ancillaryData arbitrary data appended to a price request to give the voters more info from the caller.
     * @param time unix timestamp for the price request.
     */

    function requestPrice(
        bytes32 identifier,
        uint256 time,
        bytes memory ancillaryData
    ) public virtual;

    /**
     * @notice Whether the price for `identifier` and `time` is available.
     * @dev Time must be in the past and the identifier must be supported.
     * @param identifier uniquely identifies the price requested. eg BTC/USD (encoded as bytes32) could be requested.
     * @param time unix timestamp for the price request.
     * @param ancillaryData arbitrary data appended to a price request to give the voters more info from the caller.
     * @return bool if the DVM has resolved to a price for the given identifier and timestamp.
     */
    function hasPrice(
        bytes32 identifier,
        uint256 time,
        bytes memory ancillaryData
    ) public view virtual returns (bool);

    /**
     * @notice Gets the price for `identifier` and `time` if it has already been requested and resolved.
     * @dev If the price is not available, the method reverts.
     * @param identifier uniquely identifies the price requested. eg BTC/USD (encoded as bytes32) could be requested.
     * @param time unix timestamp for the price request.
     * @param ancillaryData arbitrary data appended to a price request to give the voters more info from the caller.
     * @return int256 representing the resolved price for the given identifier and timestamp.
     */

    function getPrice(
        bytes32 identifier,
        uint256 time,
        bytes memory ancillaryData
    ) public view virtual returns (int256);
}

File 11 of 12 : OracleGovernanceInterface.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity ^0.8.0;

import "./OracleInterface.sol";
import "./OracleAncillaryInterface.sol";

/**
 * @title Financial contract facing extending the Oracle interface with governance actions.
 * @dev Interface used by financial contracts to interact with the Oracle extending governance actions. Voters will use a different interface.
 */
abstract contract OracleGovernanceInterface is OracleInterface, OracleAncillaryInterface {
    /**
     * @notice Enqueues a request (if a request isn't already present) for the given `identifier`, `time` pair.
     * @dev Time must be in the past and the identifier must be supported.
     * @param identifier uniquely identifies the price requested. eg BTC/USD (encoded as bytes32) could be requested.
     * @param ancillaryData arbitrary data appended to a price request to give the voters more info from the caller.
     * @param time unix timestamp for the price request.
     */
    function requestGovernanceAction(
        bytes32 identifier,
        uint256 time,
        bytes memory ancillaryData
    ) external virtual;
}

File 12 of 12 : OracleInterface.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity ^0.8.0;

/**
 * @title Financial contract facing Oracle interface.
 * @dev Interface used by financial contracts to interact with the Oracle. Voters will use a different interface.
 */
abstract contract OracleInterface {
    /**
     * @notice Enqueues a request (if a request isn't already present) for the given `identifier`, `time` pair.
     * @dev Time must be in the past and the identifier must be supported.
     * @param identifier uniquely identifies the price requested. eg BTC/USD (encoded as bytes32) could be requested.
     * @param time unix timestamp for the price request.
     */
    function requestPrice(bytes32 identifier, uint256 time) external virtual;

    /**
     * @notice Whether the price for `identifier` and `time` is available.
     * @dev Time must be in the past and the identifier must be supported.
     * @param identifier uniquely identifies the price requested. eg BTC/USD (encoded as bytes32) could be requested.
     * @param time unix timestamp for the price request.
     * @return bool if the DVM has resolved to a price for the given identifier and timestamp.
     */
    function hasPrice(bytes32 identifier, uint256 time) external view virtual returns (bool);

    /**
     * @notice Gets the price for `identifier` and `time` if it has already been requested and resolved.
     * @dev If the price is not available, the method reverts.
     * @param identifier uniquely identifies the price requested. eg BTC/USD (encoded as bytes32) could be requested.
     * @param time unix timestamp for the price request.
     * @return int256 representing the resolved price for the given identifier and timestamp.
     */
    function getPrice(bytes32 identifier, uint256 time) external view virtual returns (int256);
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 1000000
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "metadata": {
    "useLiteralContent": true
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_finderAddress","type":"address"},{"internalType":"uint256","name":"_startingId","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"roleId","type":"uint256"},{"indexed":true,"internalType":"address","name":"newMember","type":"address"},{"indexed":true,"internalType":"address","name":"manager","type":"address"}],"name":"AddedSharedMember","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"EmergencyExecution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"components":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"indexed":false,"internalType":"struct GovernorV2.Transaction[]","name":"transactions","type":"tuple[]"}],"name":"NewProposal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"transactionIndex","type":"uint256"}],"name":"ProposalExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"roleId","type":"uint256"},{"indexed":true,"internalType":"address","name":"oldMember","type":"address"},{"indexed":true,"internalType":"address","name":"manager","type":"address"}],"name":"RemovedSharedMember","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"roleId","type":"uint256"},{"indexed":true,"internalType":"address","name":"newMember","type":"address"},{"indexed":true,"internalType":"address","name":"manager","type":"address"}],"name":"ResetExclusiveMember","type":"event"},{"inputs":[{"internalType":"uint256","name":"roleId","type":"uint256"},{"internalType":"address","name":"newMember","type":"address"}],"name":"addMember","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct GovernorV2.Transaction","name":"transaction","type":"tuple"}],"name":"emergencyExecute","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"transactionIndex","type":"uint256"}],"name":"executeProposal","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"finder","outputs":[{"internalType":"contract FinderInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"roleId","type":"uint256"}],"name":"getMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getProposal","outputs":[{"components":[{"components":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct GovernorV2.Transaction[]","name":"transactions","type":"tuple[]"},{"internalType":"uint256","name":"requestTime","type":"uint256"},{"internalType":"bytes","name":"ancillaryData","type":"bytes"}],"internalType":"struct GovernorV2.Proposal","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"roleId","type":"uint256"},{"internalType":"address","name":"memberToCheck","type":"address"}],"name":"holdsRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicall","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"numProposals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"proposals","outputs":[{"internalType":"uint256","name":"requestTime","type":"uint256"},{"internalType":"bytes","name":"ancillaryData","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct GovernorV2.Transaction[]","name":"transactions","type":"tuple[]"},{"internalType":"bytes","name":"ancillaryData","type":"bytes"}],"name":"propose","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"roleId","type":"uint256"},{"internalType":"address","name":"memberToRemove","type":"address"}],"name":"removeMember","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"roleId","type":"uint256"}],"name":"renounceMembership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"roleId","type":"uint256"},{"internalType":"address","name":"newMember","type":"address"}],"name":"resetMember","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a06040523480156200001157600080fd5b5060405162002f6f38038062002f6f8339810160408190526200003491620002dd565b6001805460ff1916811790556001600160a01b0382166080526200005d60005b600033620000ef565b62000069600162000054565b62000075600262000054565b670de0b6b3a764000080821115620000e45760405162461bcd60e51b815260206004820152602760248201527f43616e6e6f7420736574207374617274696e674964206c6172676572207468616044820152660dc406260bc62760cb1b60648201526084015b60405180910390fd5b50600255506200032f565b826000808281526020819052604090206001015460ff1660028111156200011a576200011a62000319565b14620001695760405162461bcd60e51b815260206004820152601e60248201527f43616e6e6f74207573652061207072652d6578697374696e6720726f6c6500006044820152606401620000db565b60008481526020819052604090206001808201805460ff191682800217905550838155620001a760028201846200024c602090811b62001c8117901c565b60008481526020819052604081206001015460ff166002811115620001d057620001d062000319565b03620002455760405162461bcd60e51b815260206004820152603c60248201527f417474656d7074656420746f2075736520616e20696e76616c696420726f6c6560448201527f20746f206d616e61676520616e206578636c757369766520726f6c65000000006064820152608401620000db565b5050505050565b6200025882826200025c565b5050565b6001600160a01b038116620002c05760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f742073657420616e206578636c757369766520726f6c6520746f2060448201526203078360ec1b6064820152608401620000db565b81546001600160a01b0319166001600160a01b0391909116179055565b60008060408385031215620002f157600080fd5b82516001600160a01b03811681146200030957600080fd5b6020939093015192949293505050565b634e487b7160e01b600052602160045260246000fd5b608051612c1d620003526000396000818161029f0152611d4a0152612c1d6000f3fe6080604052600436106100e85760003560e01c8063a7d0967c1161008a578063b9a3c84c11610059578063b9a3c84c1461028d578063c7f758a8146102c1578063d4c408ac146102ee578063d97c05be1461030157600080fd5b8063a7d0967c146101db578063aaa14ca3146101fb578063ab3545e51461021b578063ac9650d81461026057600080fd5b8063400e3949116100c6578063400e3949146101565780636be7658b1461016b57806374d0a6761461018b5780637cdc1cb9146101ab57600080fd5b8063013cf08b146100ed5780631ab767121461012457806329cb924d14610139575b600080fd5b3480156100f957600080fd5b5061010d6101083660046120d1565b610321565b60405161011b929190612158565b60405180910390f35b610137610132366004612179565b6103dd565b005b34801561014557600080fd5b50425b60405190815260200161011b565b34801561016257600080fd5b50600254610148565b34801561017757600080fd5b506101376101863660046121bd565b610952565b34801561019757600080fd5b506101376101a63660046121bd565b610b37565b3480156101b757600080fd5b506101cb6101c63660046121bd565b610cf9565b604051901515815260200161011b565b3480156101e757600080fd5b506101376101f636600461238c565b610e07565b34801561020757600080fd5b506101376102163660046120d1565b6112b8565b34801561022757600080fd5b5061023b6102363660046120d1565b611479565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161011b565b34801561026c57600080fd5b5061028061027b366004612472565b611563565b60405161011b91906124e7565b34801561029957600080fd5b5061023b7f000000000000000000000000000000000000000000000000000000000000000081565b3480156102cd57600080fd5b506102e16102dc3660046120d1565b6116d5565b60405161011b91906125ef565b6101376102fc366004612659565b6118e6565b34801561030d57600080fd5b5061013761031c3660046121bd565b611abf565b6002818154811061033157600080fd5b906000526020600020906003020160009150905080600101549080600201805461035a9061268e565b80601f01602080910402602001604051908101604052809291908181526020018280546103869061268e565b80156103d35780601f106103a8576101008083540402835291602001916103d3565b820191906000526020600020905b8154815290600101906020018083116103b657829003601f168201915b5050505050905082565b6103e5611c8b565b610412600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b600060028381548110610427576104276126db565b906000526020600020906003020190506000610441611cf9565b73ffffffffffffffffffffffffffffffffffffffff1663719c6d5661046586611dcf565b8460010154856002016040518463ffffffff1660e01b815260040161048c9392919061270a565b602060405180830381865afa1580156104a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104cd91906127c2565b905060008260000184815481106104e6576104e66126db565b90600052602060002090600302016040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820154815260200160028201805461056f9061268e565b80601f016020809104026020016040519081016040528092919081815260200182805461059b9061268e565b80156105e85780601f106105bd576101008083540402835291602001916105e8565b820191906000526020600020905b8154815290600101906020018083116105cb57829003601f168201915b50505050508152505090508360001480610644575060008361060b60018761280a565b8154811061061b5761061b6126db565b600091825260209091206003909102015473ffffffffffffffffffffffffffffffffffffffff16145b6106af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f50726576696f7573207478206e6f74207965742065786563757465640000000060448201526064015b60405180910390fd5b805173ffffffffffffffffffffffffffffffffffffffff1661072d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f547820616c72656164792065786563757465640000000000000000000000000060448201526064016106a6565b81600003610797576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f50726f706f73616c207761732072656a6563746564000000000000000000000060448201526064016106a6565b80602001513414610804576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d7573742073656e6420657861637420616d6f756e74206f662045544800000060448201526064016106a6565b826000018481548110610819576108196126db565b60009182526020822060039091020180547fffffffffffffffffffffffff000000000000000000000000000000000000000016815560018101829055906108636002830182612083565b505061087c816000015182602001518360400151611e09565b6108e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f547820657865637574696f6e206661696c65640000000000000000000000000060448201526064016106a6565b847ff758fc91e01b00ea6b4a6138756f7f28e021f9bf21db6dbf8c36c88eb737257a8560405161091491815260200190565b60405180910390a250505061094e600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681179055565b5050565b81600260008281526020819052604090206001015460ff16600281111561097b5761097b61281d565b14610a08576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4d7573742062652063616c6c6564206f6e20616e20696e697469616c697a656460448201527f2053686172656420726f6c65000000000000000000000000000000000000000060648201526084016106a6565b6000838152602081905260409020548390610a239033610cf9565b610aae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f43616e206f6e6c792062652063616c6c6564206279206120726f6c65206d616e60448201527f616765720000000000000000000000000000000000000000000000000000000060648201526084016106a6565b60008481526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552600390910190925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339287917feb3e33034c392e69263b04ec0fa376dc12784a41b6676c7f31b936cbc0fbb5af9190a450505050565b81600260008281526020819052604090206001015460ff166002811115610b6057610b6061281d565b14610bed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4d7573742062652063616c6c6564206f6e20616e20696e697469616c697a656460448201527f2053686172656420726f6c65000000000000000000000000000000000000000060648201526084016106a6565b6000838152602081905260409020548390610c089033610cf9565b610c93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f43616e206f6e6c792062652063616c6c6564206279206120726f6c65206d616e60448201527f616765720000000000000000000000000000000000000000000000000000000060648201526084016106a6565b6000848152602081905260409020610cae9060030184611e26565b604051339073ffffffffffffffffffffffffffffffffffffffff85169086907f63502af7324ff6db91ab38f8236a648727d9385ea6c782073dd4882d8a61a48f90600090a450505050565b600082815260208190526040812060018082015460ff166002811115610d2157610d2161281d565b03610d4f57600281015473ffffffffffffffffffffffffffffffffffffffff8481169116145b915050610e01565b6002600182015460ff166002811115610d6a57610d6a61281d565b03610d9f5773ffffffffffffffffffffffffffffffffffffffff8316600090815260038201602052604090205460ff16610d47565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f496e76616c696420726f6c65496400000000000000000000000000000000000060448201526064016106a6565b92915050565b610e0f611c8b565b610e3c600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b6001610e488133610cf9565b610ed4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f53656e64657220646f6573206e6f7420686f6c6420726571756972656420726f60448201527f6c6500000000000000000000000000000000000000000000000000000000000060648201526084016106a6565b6000835111610f3f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f456d707479207472616e73616374696f6e73206172726179000000000000000060448201526064016106a6565b60028054600181018083556000838152919242929184908110610f6457610f646126db565b6000918252602090912060039091020160018101839055905060028101610f8b868261289b565b5060005b86518110156111c857600073ffffffffffffffffffffffffffffffffffffffff16878281518110610fc257610fc26126db565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff160361104b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f5468652060746f6020616464726573732063616e6e6f7420626520307830000060448201526064016106a6565b600087828151811061105f5761105f6126db565b602002602001015160400151511115611115576110af878281518110611087576110876126db565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff163b151590565b611115576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f454f412063616e2774206163636570742074782077697468206461746100000060448201526064016106a6565b8160000187828151811061112b5761112b6126db565b602090810291909101810151825460018082018555600094855293839020825160039092020180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9092169190911781559181015192820192909255604082015160028201906111b2908261289b565b50505080806111c0906129b5565b915050610f8f565b5060006111d484611dcf565b90506111de611cf9565b73ffffffffffffffffffffffffffffffffffffffff16639b21758d8285896040518463ffffffff1660e01b815260040161121a939291906129ed565b600060405180830381600087803b15801561123457600080fd5b505af1158015611248573d6000803e3d6000fd5b50505050837f082d2a29e61e3d0508e5617570bed4c7c58ae73d4719b31052d8638812bc4c0c8860405161127c9190612a0c565b60405180910390a2505050505061094e600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681179055565b80600260008281526020819052604090206001015460ff1660028111156112e1576112e161281d565b1461136e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4d7573742062652063616c6c6564206f6e20616e20696e697469616c697a656460448201527f2053686172656420726f6c65000000000000000000000000000000000000000060648201526084016106a6565b816113798133610cf9565b611405576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f53656e64657220646f6573206e6f7420686f6c6420726571756972656420726f60448201527f6c6500000000000000000000000000000000000000000000000000000000000060648201526084016106a6565b600083815260208181526040808320338452600301909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040513390819085907feb3e33034c392e69263b04ec0fa376dc12784a41b6676c7f31b936cbc0fbb5af90600090a4505050565b600081600160008281526020819052604090206001015460ff1660028111156114a4576114a461281d565b14611531576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f4d7573742062652063616c6c6564206f6e20616e20696e697469616c697a656460448201527f204578636c757369766520726f6c65000000000000000000000000000000000060648201526084016106a6565b60008381526020819052604090206002015473ffffffffffffffffffffffffffffffffffffffff165b91505b50919050565b60608167ffffffffffffffff81111561157e5761157e6121ed565b6040519080825280602002602001820160405280156115b157816020015b606081526020019060019003908161159c5790505b50905060005b828110156116ce57600080308686858181106115d5576115d56126db565b90506020028101906115e79190612a26565b6040516115f5929190612a92565b600060405180830381855af49150503d8060008114611630576040519150601f19603f3d011682016040523d82523d6000602084013e611635565b606091505b50915091508161169b5760448151101561164e57600080fd5b600481019050808060200190518101906116689190612aa2565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106a69190612b10565b808484815181106116ae576116ae6126db565b6020026020010181905250505080806116c6906129b5565b9150506115b7565b5092915050565b6116f960405180606001604052806060815260200160008152602001606081525090565b6002828154811061170c5761170c6126db565b906000526020600020906003020160405180606001604052908160008201805480602002602001604051908101604052809291908181526020016000905b8282101561183b5760008481526020908190206040805160608101825260038602909201805473ffffffffffffffffffffffffffffffffffffffff168352600181015493830193909352600283018054929392918401916117aa9061268e565b80601f01602080910402602001604051908101604052809291908181526020018280546117d69061268e565b80156118235780601f106117f857610100808354040283529160200191611823565b820191906000526020600020905b81548152906001019060200180831161180657829003601f168201915b5050505050815250508152602001906001019061174a565b5050505081526020016001820154815260200160028201805461185d9061268e565b80601f01602080910402602001604051908101604052809291908181526020018280546118899061268e565b80156118d65780601f106118ab576101008083540402835291602001916118d6565b820191906000526020600020905b8154815290600101906020018083116118b957829003601f168201915b5050505050815250509050919050565b6118ee611c8b565b61191b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b60026119278133610cf9565b6119b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f53656e64657220646f6573206e6f7420686f6c6420726571756972656420726f60448201527f6c6500000000000000000000000000000000000000000000000000000000000060648201526084016106a6565b6119ca826000015183602001518460400151611e09565b611a30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f547820657865637574696f6e206661696c65640000000000000000000000000060448201526064016106a6565b816000015173ffffffffffffffffffffffffffffffffffffffff167f30b23081131d845e535ea154259726b125804196aa1b2fcb38ac52e5fc34db3683602001518460400151604051611a84929190612158565b60405180910390a250611abc600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681179055565b50565b81600160008281526020819052604090206001015460ff166002811115611ae857611ae861281d565b14611b75576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f4d7573742062652063616c6c6564206f6e20616e20696e697469616c697a656460448201527f204578636c757369766520726f6c65000000000000000000000000000000000060648201526084016106a6565b6000838152602081905260409020548390611b909033610cf9565b611c1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f43616e206f6e6c792062652063616c6c6564206279206120726f6c65206d616e60448201527f616765720000000000000000000000000000000000000000000000000000000060648201526084016106a6565b6000848152602081905260409020611c369060020184611ef3565b604051339073ffffffffffffffffffffffffffffffffffffffff85169086907f3b855c56b409b671c7112789d022675eb639d0bcb8896f1b6197c132f799e74690600090a450505050565b61094e8282611ef3565b60015460ff16611cf7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106a6565b565b6040517faafd5e400000000000000000000000000000000000000000000000000000000081527f4f7261636c65000000000000000000000000000000000000000000000000000060048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063aafd5e4090602401602060405180830381865afa158015611da6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dca9190612b23565b905090565b600080611ddb83611fd8565b905061155a817f41646d696e2000000000000000000000000000000000000000000000000000006006612066565b6000806020830183516000808284898b5af1979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff8116611ea3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f43616e6e6f74206164642030783020746f20612073686172656420726f6c650060448201526064016106a6565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020919091526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b73ffffffffffffffffffffffffffffffffffffffff8116611f96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f43616e6e6f742073657420616e206578636c757369766520726f6c6520746f2060448201527f307830000000000000000000000000000000000000000000000000000000000060648201526084016106a6565b81547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff91909116179055565b6000808260000361200a57507f3000000000000000000000000000000000000000000000000000000000000000610e01565b6008600a60305b851561205d5792821c9260006120278388612b6f565b905060006120358383612b83565b905061204285601f612b96565b81901b95909517946120548489612bd3565b97505050612011565b50505092915050565b600080612074836008612b96565b85901c84179150509392505050565b50805461208f9061268e565b6000825580601f1061209f575050565b601f016020900490600052602060002090810190611abc91905b808211156120cd57600081556001016120b9565b5090565b6000602082840312156120e357600080fd5b5035919050565b60005b838110156121055781810151838201526020016120ed565b50506000910152565b600081518084526121268160208601602086016120ea565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b828152604060208201526000612171604083018461210e565b949350505050565b6000806040838503121561218c57600080fd5b50508035926020909101359150565b73ffffffffffffffffffffffffffffffffffffffff81168114611abc57600080fd5b600080604083850312156121d057600080fd5b8235915060208301356121e28161219b565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612263576122636121ed565b604052919050565b600067ffffffffffffffff821115612285576122856121ed565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f8301126122c257600080fd5b81356122d56122d08261226b565b61221c565b8181528460208386010111156122ea57600080fd5b816020850160208301376000918101602001919091529392505050565b60006060828403121561231957600080fd5b6040516060810167ffffffffffffffff828210818311171561233d5761233d6121ed565b81604052829350843591506123518261219b565b81835260208501356020840152604085013591508082111561237257600080fd5b5061237f858286016122b1565b6040830152505092915050565b6000806040838503121561239f57600080fd5b823567ffffffffffffffff808211156123b757600080fd5b818501915085601f8301126123cb57600080fd5b81356020828211156123df576123df6121ed565b8160051b6123ee82820161221c565b928352848101820192828101908a85111561240857600080fd5b83870192505b84831015612444578235868111156124265760008081fd5b6124348c86838b0101612307565b835250918301919083019061240e565b975050508601359250508082111561245b57600080fd5b50612468858286016122b1565b9150509250929050565b6000806020838503121561248557600080fd5b823567ffffffffffffffff8082111561249d57600080fd5b818501915085601f8301126124b157600080fd5b8135818111156124c057600080fd5b8660208260051b85010111156124d557600080fd5b60209290920196919550909350505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561255a577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845261254885835161210e565b9450928501929085019060010161250e565b5092979650505050505050565b6000815180845260208085019450848260051b860182860160005b858110156125e25783830389528151805173ffffffffffffffffffffffffffffffffffffffff16845285810151868501526040908101516060918501829052906125ce8186018361210e565b9a87019a9450505090840190600101612582565b5090979650505050505050565b60208152600082516060602084015261260b6080840182612567565b90506020840151604084015260408401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848303016060850152612650828261210e565b95945050505050565b60006020828403121561266b57600080fd5b813567ffffffffffffffff81111561268257600080fd5b61217184828501612307565b600181811c908216806126a257607f821691505b60208210810361155d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b838152600060208481840152606060408401526000845461272a8161268e565b806060870152608060018084166000811461274c5760018114612784576127b2565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008516838a01528284151560051b8a010195506127b2565b896000528660002060005b858110156127aa5781548b820186015290830190880161278f565b8a0184019650505b50939a9950505050505050505050565b6000602082840312156127d457600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81810381811115610e0157610e016127db565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b601f82111561289657600081815260208120601f850160051c810160208610156128735750805b601f850160051c820191505b818110156128925782815560010161287f565b5050505b505050565b815167ffffffffffffffff8111156128b5576128b56121ed565b6128c9816128c3845461268e565b8461284c565b602080601f83116001811461291c57600084156128e65750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555612892565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156129695788860151825594840194600190910190840161294a565b50858210156129a557878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036129e6576129e66127db565b5060010190565b838152826020820152606060408201526000612650606083018461210e565b602081526000612a1f6020830184612567565b9392505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112612a5b57600080fd5b83018035915067ffffffffffffffff821115612a7657600080fd5b602001915036819003821315612a8b57600080fd5b9250929050565b8183823760009101908152919050565b600060208284031215612ab457600080fd5b815167ffffffffffffffff811115612acb57600080fd5b8201601f81018413612adc57600080fd5b8051612aea6122d08261226b565b818152856020838501011115612aff57600080fd5b6126508260208301602086016120ea565b602081526000612a1f602083018461210e565b600060208284031215612b3557600080fd5b8151612a1f8161219b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082612b7e57612b7e612b40565b500690565b80820180821115610e0157610e016127db565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612bce57612bce6127db565b500290565b600082612be257612be2612b40565b50049056fea264697066735822122044f677d6a970b275314d4082c5537fe69d1d4d9488e9c2be5af178843b706db764736f6c6343000810003300000000000000000000000040f941e48a552bf496b154af6bf55725f18d77c300000000000000000000000000000000000000000000000000000000000000bf

Deployed Bytecode

0x6080604052600436106100e85760003560e01c8063a7d0967c1161008a578063b9a3c84c11610059578063b9a3c84c1461028d578063c7f758a8146102c1578063d4c408ac146102ee578063d97c05be1461030157600080fd5b8063a7d0967c146101db578063aaa14ca3146101fb578063ab3545e51461021b578063ac9650d81461026057600080fd5b8063400e3949116100c6578063400e3949146101565780636be7658b1461016b57806374d0a6761461018b5780637cdc1cb9146101ab57600080fd5b8063013cf08b146100ed5780631ab767121461012457806329cb924d14610139575b600080fd5b3480156100f957600080fd5b5061010d6101083660046120d1565b610321565b60405161011b929190612158565b60405180910390f35b610137610132366004612179565b6103dd565b005b34801561014557600080fd5b50425b60405190815260200161011b565b34801561016257600080fd5b50600254610148565b34801561017757600080fd5b506101376101863660046121bd565b610952565b34801561019757600080fd5b506101376101a63660046121bd565b610b37565b3480156101b757600080fd5b506101cb6101c63660046121bd565b610cf9565b604051901515815260200161011b565b3480156101e757600080fd5b506101376101f636600461238c565b610e07565b34801561020757600080fd5b506101376102163660046120d1565b6112b8565b34801561022757600080fd5b5061023b6102363660046120d1565b611479565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161011b565b34801561026c57600080fd5b5061028061027b366004612472565b611563565b60405161011b91906124e7565b34801561029957600080fd5b5061023b7f00000000000000000000000040f941e48a552bf496b154af6bf55725f18d77c381565b3480156102cd57600080fd5b506102e16102dc3660046120d1565b6116d5565b60405161011b91906125ef565b6101376102fc366004612659565b6118e6565b34801561030d57600080fd5b5061013761031c3660046121bd565b611abf565b6002818154811061033157600080fd5b906000526020600020906003020160009150905080600101549080600201805461035a9061268e565b80601f01602080910402602001604051908101604052809291908181526020018280546103869061268e565b80156103d35780601f106103a8576101008083540402835291602001916103d3565b820191906000526020600020905b8154815290600101906020018083116103b657829003601f168201915b5050505050905082565b6103e5611c8b565b610412600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b600060028381548110610427576104276126db565b906000526020600020906003020190506000610441611cf9565b73ffffffffffffffffffffffffffffffffffffffff1663719c6d5661046586611dcf565b8460010154856002016040518463ffffffff1660e01b815260040161048c9392919061270a565b602060405180830381865afa1580156104a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104cd91906127c2565b905060008260000184815481106104e6576104e66126db565b90600052602060002090600302016040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820154815260200160028201805461056f9061268e565b80601f016020809104026020016040519081016040528092919081815260200182805461059b9061268e565b80156105e85780601f106105bd576101008083540402835291602001916105e8565b820191906000526020600020905b8154815290600101906020018083116105cb57829003601f168201915b50505050508152505090508360001480610644575060008361060b60018761280a565b8154811061061b5761061b6126db565b600091825260209091206003909102015473ffffffffffffffffffffffffffffffffffffffff16145b6106af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f50726576696f7573207478206e6f74207965742065786563757465640000000060448201526064015b60405180910390fd5b805173ffffffffffffffffffffffffffffffffffffffff1661072d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f547820616c72656164792065786563757465640000000000000000000000000060448201526064016106a6565b81600003610797576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f50726f706f73616c207761732072656a6563746564000000000000000000000060448201526064016106a6565b80602001513414610804576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d7573742073656e6420657861637420616d6f756e74206f662045544800000060448201526064016106a6565b826000018481548110610819576108196126db565b60009182526020822060039091020180547fffffffffffffffffffffffff000000000000000000000000000000000000000016815560018101829055906108636002830182612083565b505061087c816000015182602001518360400151611e09565b6108e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f547820657865637574696f6e206661696c65640000000000000000000000000060448201526064016106a6565b847ff758fc91e01b00ea6b4a6138756f7f28e021f9bf21db6dbf8c36c88eb737257a8560405161091491815260200190565b60405180910390a250505061094e600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681179055565b5050565b81600260008281526020819052604090206001015460ff16600281111561097b5761097b61281d565b14610a08576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4d7573742062652063616c6c6564206f6e20616e20696e697469616c697a656460448201527f2053686172656420726f6c65000000000000000000000000000000000000000060648201526084016106a6565b6000838152602081905260409020548390610a239033610cf9565b610aae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f43616e206f6e6c792062652063616c6c6564206279206120726f6c65206d616e60448201527f616765720000000000000000000000000000000000000000000000000000000060648201526084016106a6565b60008481526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552600390910190925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339287917feb3e33034c392e69263b04ec0fa376dc12784a41b6676c7f31b936cbc0fbb5af9190a450505050565b81600260008281526020819052604090206001015460ff166002811115610b6057610b6061281d565b14610bed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4d7573742062652063616c6c6564206f6e20616e20696e697469616c697a656460448201527f2053686172656420726f6c65000000000000000000000000000000000000000060648201526084016106a6565b6000838152602081905260409020548390610c089033610cf9565b610c93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f43616e206f6e6c792062652063616c6c6564206279206120726f6c65206d616e60448201527f616765720000000000000000000000000000000000000000000000000000000060648201526084016106a6565b6000848152602081905260409020610cae9060030184611e26565b604051339073ffffffffffffffffffffffffffffffffffffffff85169086907f63502af7324ff6db91ab38f8236a648727d9385ea6c782073dd4882d8a61a48f90600090a450505050565b600082815260208190526040812060018082015460ff166002811115610d2157610d2161281d565b03610d4f57600281015473ffffffffffffffffffffffffffffffffffffffff8481169116145b915050610e01565b6002600182015460ff166002811115610d6a57610d6a61281d565b03610d9f5773ffffffffffffffffffffffffffffffffffffffff8316600090815260038201602052604090205460ff16610d47565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f496e76616c696420726f6c65496400000000000000000000000000000000000060448201526064016106a6565b92915050565b610e0f611c8b565b610e3c600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b6001610e488133610cf9565b610ed4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f53656e64657220646f6573206e6f7420686f6c6420726571756972656420726f60448201527f6c6500000000000000000000000000000000000000000000000000000000000060648201526084016106a6565b6000835111610f3f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f456d707479207472616e73616374696f6e73206172726179000000000000000060448201526064016106a6565b60028054600181018083556000838152919242929184908110610f6457610f646126db565b6000918252602090912060039091020160018101839055905060028101610f8b868261289b565b5060005b86518110156111c857600073ffffffffffffffffffffffffffffffffffffffff16878281518110610fc257610fc26126db565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff160361104b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f5468652060746f6020616464726573732063616e6e6f7420626520307830000060448201526064016106a6565b600087828151811061105f5761105f6126db565b602002602001015160400151511115611115576110af878281518110611087576110876126db565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff163b151590565b611115576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f454f412063616e2774206163636570742074782077697468206461746100000060448201526064016106a6565b8160000187828151811061112b5761112b6126db565b602090810291909101810151825460018082018555600094855293839020825160039092020180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9092169190911781559181015192820192909255604082015160028201906111b2908261289b565b50505080806111c0906129b5565b915050610f8f565b5060006111d484611dcf565b90506111de611cf9565b73ffffffffffffffffffffffffffffffffffffffff16639b21758d8285896040518463ffffffff1660e01b815260040161121a939291906129ed565b600060405180830381600087803b15801561123457600080fd5b505af1158015611248573d6000803e3d6000fd5b50505050837f082d2a29e61e3d0508e5617570bed4c7c58ae73d4719b31052d8638812bc4c0c8860405161127c9190612a0c565b60405180910390a2505050505061094e600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681179055565b80600260008281526020819052604090206001015460ff1660028111156112e1576112e161281d565b1461136e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4d7573742062652063616c6c6564206f6e20616e20696e697469616c697a656460448201527f2053686172656420726f6c65000000000000000000000000000000000000000060648201526084016106a6565b816113798133610cf9565b611405576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f53656e64657220646f6573206e6f7420686f6c6420726571756972656420726f60448201527f6c6500000000000000000000000000000000000000000000000000000000000060648201526084016106a6565b600083815260208181526040808320338452600301909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040513390819085907feb3e33034c392e69263b04ec0fa376dc12784a41b6676c7f31b936cbc0fbb5af90600090a4505050565b600081600160008281526020819052604090206001015460ff1660028111156114a4576114a461281d565b14611531576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f4d7573742062652063616c6c6564206f6e20616e20696e697469616c697a656460448201527f204578636c757369766520726f6c65000000000000000000000000000000000060648201526084016106a6565b60008381526020819052604090206002015473ffffffffffffffffffffffffffffffffffffffff165b91505b50919050565b60608167ffffffffffffffff81111561157e5761157e6121ed565b6040519080825280602002602001820160405280156115b157816020015b606081526020019060019003908161159c5790505b50905060005b828110156116ce57600080308686858181106115d5576115d56126db565b90506020028101906115e79190612a26565b6040516115f5929190612a92565b600060405180830381855af49150503d8060008114611630576040519150601f19603f3d011682016040523d82523d6000602084013e611635565b606091505b50915091508161169b5760448151101561164e57600080fd5b600481019050808060200190518101906116689190612aa2565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106a69190612b10565b808484815181106116ae576116ae6126db565b6020026020010181905250505080806116c6906129b5565b9150506115b7565b5092915050565b6116f960405180606001604052806060815260200160008152602001606081525090565b6002828154811061170c5761170c6126db565b906000526020600020906003020160405180606001604052908160008201805480602002602001604051908101604052809291908181526020016000905b8282101561183b5760008481526020908190206040805160608101825260038602909201805473ffffffffffffffffffffffffffffffffffffffff168352600181015493830193909352600283018054929392918401916117aa9061268e565b80601f01602080910402602001604051908101604052809291908181526020018280546117d69061268e565b80156118235780601f106117f857610100808354040283529160200191611823565b820191906000526020600020905b81548152906001019060200180831161180657829003601f168201915b5050505050815250508152602001906001019061174a565b5050505081526020016001820154815260200160028201805461185d9061268e565b80601f01602080910402602001604051908101604052809291908181526020018280546118899061268e565b80156118d65780601f106118ab576101008083540402835291602001916118d6565b820191906000526020600020905b8154815290600101906020018083116118b957829003601f168201915b5050505050815250509050919050565b6118ee611c8b565b61191b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b60026119278133610cf9565b6119b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f53656e64657220646f6573206e6f7420686f6c6420726571756972656420726f60448201527f6c6500000000000000000000000000000000000000000000000000000000000060648201526084016106a6565b6119ca826000015183602001518460400151611e09565b611a30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f547820657865637574696f6e206661696c65640000000000000000000000000060448201526064016106a6565b816000015173ffffffffffffffffffffffffffffffffffffffff167f30b23081131d845e535ea154259726b125804196aa1b2fcb38ac52e5fc34db3683602001518460400151604051611a84929190612158565b60405180910390a250611abc600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681179055565b50565b81600160008281526020819052604090206001015460ff166002811115611ae857611ae861281d565b14611b75576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f4d7573742062652063616c6c6564206f6e20616e20696e697469616c697a656460448201527f204578636c757369766520726f6c65000000000000000000000000000000000060648201526084016106a6565b6000838152602081905260409020548390611b909033610cf9565b611c1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f43616e206f6e6c792062652063616c6c6564206279206120726f6c65206d616e60448201527f616765720000000000000000000000000000000000000000000000000000000060648201526084016106a6565b6000848152602081905260409020611c369060020184611ef3565b604051339073ffffffffffffffffffffffffffffffffffffffff85169086907f3b855c56b409b671c7112789d022675eb639d0bcb8896f1b6197c132f799e74690600090a450505050565b61094e8282611ef3565b60015460ff16611cf7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106a6565b565b6040517faafd5e400000000000000000000000000000000000000000000000000000000081527f4f7261636c65000000000000000000000000000000000000000000000000000060048201526000907f00000000000000000000000040f941e48a552bf496b154af6bf55725f18d77c373ffffffffffffffffffffffffffffffffffffffff169063aafd5e4090602401602060405180830381865afa158015611da6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dca9190612b23565b905090565b600080611ddb83611fd8565b905061155a817f41646d696e2000000000000000000000000000000000000000000000000000006006612066565b6000806020830183516000808284898b5af1979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff8116611ea3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f43616e6e6f74206164642030783020746f20612073686172656420726f6c650060448201526064016106a6565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020919091526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b73ffffffffffffffffffffffffffffffffffffffff8116611f96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f43616e6e6f742073657420616e206578636c757369766520726f6c6520746f2060448201527f307830000000000000000000000000000000000000000000000000000000000060648201526084016106a6565b81547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff91909116179055565b6000808260000361200a57507f3000000000000000000000000000000000000000000000000000000000000000610e01565b6008600a60305b851561205d5792821c9260006120278388612b6f565b905060006120358383612b83565b905061204285601f612b96565b81901b95909517946120548489612bd3565b97505050612011565b50505092915050565b600080612074836008612b96565b85901c84179150509392505050565b50805461208f9061268e565b6000825580601f1061209f575050565b601f016020900490600052602060002090810190611abc91905b808211156120cd57600081556001016120b9565b5090565b6000602082840312156120e357600080fd5b5035919050565b60005b838110156121055781810151838201526020016120ed565b50506000910152565b600081518084526121268160208601602086016120ea565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b828152604060208201526000612171604083018461210e565b949350505050565b6000806040838503121561218c57600080fd5b50508035926020909101359150565b73ffffffffffffffffffffffffffffffffffffffff81168114611abc57600080fd5b600080604083850312156121d057600080fd5b8235915060208301356121e28161219b565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612263576122636121ed565b604052919050565b600067ffffffffffffffff821115612285576122856121ed565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f8301126122c257600080fd5b81356122d56122d08261226b565b61221c565b8181528460208386010111156122ea57600080fd5b816020850160208301376000918101602001919091529392505050565b60006060828403121561231957600080fd5b6040516060810167ffffffffffffffff828210818311171561233d5761233d6121ed565b81604052829350843591506123518261219b565b81835260208501356020840152604085013591508082111561237257600080fd5b5061237f858286016122b1565b6040830152505092915050565b6000806040838503121561239f57600080fd5b823567ffffffffffffffff808211156123b757600080fd5b818501915085601f8301126123cb57600080fd5b81356020828211156123df576123df6121ed565b8160051b6123ee82820161221c565b928352848101820192828101908a85111561240857600080fd5b83870192505b84831015612444578235868111156124265760008081fd5b6124348c86838b0101612307565b835250918301919083019061240e565b975050508601359250508082111561245b57600080fd5b50612468858286016122b1565b9150509250929050565b6000806020838503121561248557600080fd5b823567ffffffffffffffff8082111561249d57600080fd5b818501915085601f8301126124b157600080fd5b8135818111156124c057600080fd5b8660208260051b85010111156124d557600080fd5b60209290920196919550909350505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561255a577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845261254885835161210e565b9450928501929085019060010161250e565b5092979650505050505050565b6000815180845260208085019450848260051b860182860160005b858110156125e25783830389528151805173ffffffffffffffffffffffffffffffffffffffff16845285810151868501526040908101516060918501829052906125ce8186018361210e565b9a87019a9450505090840190600101612582565b5090979650505050505050565b60208152600082516060602084015261260b6080840182612567565b90506020840151604084015260408401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848303016060850152612650828261210e565b95945050505050565b60006020828403121561266b57600080fd5b813567ffffffffffffffff81111561268257600080fd5b61217184828501612307565b600181811c908216806126a257607f821691505b60208210810361155d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b838152600060208481840152606060408401526000845461272a8161268e565b806060870152608060018084166000811461274c5760018114612784576127b2565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008516838a01528284151560051b8a010195506127b2565b896000528660002060005b858110156127aa5781548b820186015290830190880161278f565b8a0184019650505b50939a9950505050505050505050565b6000602082840312156127d457600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81810381811115610e0157610e016127db565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b601f82111561289657600081815260208120601f850160051c810160208610156128735750805b601f850160051c820191505b818110156128925782815560010161287f565b5050505b505050565b815167ffffffffffffffff8111156128b5576128b56121ed565b6128c9816128c3845461268e565b8461284c565b602080601f83116001811461291c57600084156128e65750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555612892565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156129695788860151825594840194600190910190840161294a565b50858210156129a557878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036129e6576129e66127db565b5060010190565b838152826020820152606060408201526000612650606083018461210e565b602081526000612a1f6020830184612567565b9392505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112612a5b57600080fd5b83018035915067ffffffffffffffff821115612a7657600080fd5b602001915036819003821315612a8b57600080fd5b9250929050565b8183823760009101908152919050565b600060208284031215612ab457600080fd5b815167ffffffffffffffff811115612acb57600080fd5b8201601f81018413612adc57600080fd5b8051612aea6122d08261226b565b818152856020838501011115612aff57600080fd5b6126508260208301602086016120ea565b602081526000612a1f602083018461210e565b600060208284031215612b3557600080fd5b8151612a1f8161219b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082612b7e57612b7e612b40565b500690565b80820180821115610e0157610e016127db565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612bce57612bce6127db565b500290565b600082612be257612be2612b40565b50049056fea264697066735822122044f677d6a970b275314d4082c5537fe69d1d4d9488e9c2be5af178843b706db764736f6c63430008100033

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

00000000000000000000000040f941e48a552bf496b154af6bf55725f18d77c300000000000000000000000000000000000000000000000000000000000000bf

-----Decoded View---------------
Arg [0] : _finderAddress (address): 0x40f941E48A552bF496B154Af6bf55725f18D77c3
Arg [1] : _startingId (uint256): 191

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000040f941e48a552bf496b154af6bf55725f18d77c3
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000bf


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