FRAX Price: $1.04 (+6.94%)

Contract

0xc64f8f0c754BC41A29F95946Fa0Abb3828C47e6d

Overview

FRAX Balance | FXTL Balance

0 FRAX | 32,335 FXTL

FRAX Value

$0.00

Token Holdings

More Info

Private Name Tags

ContractCreator

Multichain Info

No addresses found
Transaction Hash
Block
From
To

There are no matching entries

> 10 Token Transfers found.

View more zero value Internal Transactions in Advanced View mode

Advanced mode:

Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
EchoAdministration

Compiler Version
v0.8.30+commit.73712a01

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
// SPDX-License-Identifier: MIT
pragma solidity 0.8.30;

// ███████╗ ██████╗██╗  ██╗ ██████╗   ███╗   ███╗ █████╗ ██████╗ ██╗  ██╗███████╗████████╗
// ██╔════╝██╔════╝██║  ██║██╔═══██╗  ████╗ ████║██╔══██╗██╔══██╗██║ ██╔╝██╔════╝╚══██╔══╝
// █████╗  ██║     ███████║██║   ██║  ██╔████╔██║███████║██████╔╝█████╔╝ █████╗     ██║
// ██╔══╝  ██║     ██╔══██║██║   ██║  ██║╚██╔╝██║██╔══██║██╔══██╗██╔═██╗ ██╔══╝     ██║
// ███████╗╚██████╗██║  ██║╚██████╔╝  ██║ ╚═╝ ██║██║  ██║██║  ██║██║  ██╗███████╗   ██║
// ╚══════╝ ╚═════╝╚═╝  ╚═╝ ╚═════╝   ╚═╝     ╚═╝╚═╝  ╚═╝╚═╝  ╚═╝╚═╝  ╚═╝╚══════╝   ╚═╝
// ============================== EchoAdministration V2 ==============================
// =================================== Summer 2025 ===================================

import {ActionStatus, ActionAndKind, ModelData, IEchoAdministration} from "../interfaces/IEchoAdministration.sol";

/// @title Echo Administration contract
/// @author Dynabits.org
contract EchoAdministration is IEchoAdministration {
    /********************************\
    |-*-*-*-*-*   STATES   *-*-*-*-*-|
    \********************************/
    mapping(string => uint256) public totalKindMethods; // "X" => 6
    mapping(bytes32 => string) public hashToActionKind; // 0xba...ab => "X: Like"
    mapping(address => mapping(bytes32 => ModelData)) public modelData;
    // e.g:
    // address(0) => keccak("X: Like") => { fee: uint256, actionStatus: ActionStatus.KPI, socialKPIratio: uint256, oracle: address }
    // address(1) => keccak("CONFIG: AuthorWallet") => { fee: uint256, actionStatus: ActionStatus.Config, socialKPIratio: uint256(0), oracle: address }
    // address => keccak("QA-AI: Accuracy And Credibility") => { fee: uint256, actionStatus: ActionStatus.QA, socialKPIratio: 0, oracle: address(0) }
    // address => keccak("QA-C: Accuracy And Credibility") => { fee: uint256, actionStatus: ActionStatus.QA, socialKPIratio: 0, oracle: address(0) }
    // address => keccak("QA-V: Accuracy And Credibility") => { fee: uint256, actionStatus: ActionStatus.QA, socialKPIratio: 0, oracle: address(0) }

    // @Deprecated
    // uint24 public campaignFeeRate;
    // @Deprecated
    // uint72 public maxCampaignTime;
    // @Deprecated
    // address public protocolAdmin;
    // @Deprecated
    // mapping(address => bool) public whitelistedToken;
    // @Deprecated
    // mapping(address => bool) public disallowedOracle;
    /*******************************\
    |-*-*-*-*   CONSTANTS   *-*-*-*-|
    \*******************************/
    IEchoAdministration private constant ECHO_ADMIN_V1 =
        IEchoAdministration(0x787FB122fC8a4B183e42e92DD48D1b52F707e031);

    /********************************\
    |-*-*-*-*-*   EVENTS   *-*-*-*-*-|
    \********************************/
    event ModelSettled(
        ActionAndKind actionKind,
        bytes32 hashedActionKind,
        ModelData model
    );
    event ModelRemoved(
        ActionAndKind actionKind,
        bytes32 hashedActionKind,
        ModelData model
    );
    // @Deprecated
    // event ProtocolAdminChanged(
    //     address indexed lastImplementation,
    //     address indexed newImplementation
    // );
    // @Deprecated
    // event maxCampaignTimeChanged(
    //     uint256 indexed lastMaxCampaignTime,
    //     uint256 indexed maxCampaignTime
    // );
    // @Deprecated
    // event CampaignFeeRateChanged(
    //     uint256 indexed lastCampaignFeeRate,
    //     uint256 indexed CampaignFeeRate
    // );
    // @Deprecated
    // event TokenWhitelisted(address indexed token);
    // @Deprecated
    // event TokenRemoved(address indexed token);
    // @Deprecated
    // event OracleFullAccessChanged(
    //     address indexed oracle,
    //     bool isFullAccessRestricted
    // );

    /********************************\
    |-*-*-*-*-*   ERRORS   *-*-*-*-*-|
    \********************************/
    error CALL_ECHO_V1();
    error ONLY_PROTOCOL_ADMIN();
    error ZERO_ADDRESS_PROVIDED();
    error EMPTY_ACTION_OR_KIND_PROVIDED();
    error NA_ACTION_STATUS();
    error NOT_RELATIVE_ACTION(string action, ActionStatus actionStatus);
    error UNDEFINED_PROCESS();
    error ZERO_FEE_PROVIDED(ActionStatus actionStatus);
    error ZERO_SOCIAL_KPI_PROVIDED();
    // @Deprecated
    // error TOKEN_WHITELISTED_BEFORE();
    // @Deprecated
    // error TOKEN_DOESNT_EXIST();
    // @Deprecated
    // error FEE_RATE_MUST_BE_BETWEEN_0_TO_1E5(uint256 givenFee);

    /*******************************\
    |-*-*-*-*   MODIFIERS   *-*-*-*-|
    \*******************************/
    modifier onlyProtocolAdmin() {
        if (msg.sender != protocolAdmin()) revert ONLY_PROTOCOL_ADMIN();
        _;
    }

    /******************************\
    |-*-*-*-*   BUILT-IN   *-*-*-*-|
    \******************************/
    constructor() {
        totalKindMethods["QA-AI"] = 3;
        totalKindMethods["X"] = 7;
        totalKindMethods["CONFIG"] = 3;

        address echoOracle = 0xEC051Bb8876E78bA6a24E03cb07FBe1259E44C47;

        modelData[echoOracle][
            keccak256(abi.encodePacked("QA-AI: Relevance And Alignment"))
        ] = ModelData(ActionStatus.QA, 0, 1, address(0));
        modelData[echoOracle][
            keccak256(abi.encodePacked("QA-AI: Accuracy And Credibility"))
        ] = ModelData(ActionStatus.QA, 0, 1, address(0));
        modelData[echoOracle][
            keccak256(abi.encodePacked("QA-AI: Reputation And Influence"))
        ] = ModelData(ActionStatus.QA, 0, 1, address(0));

        modelData[address(0)][
            keccak256(abi.encodePacked("X: Post"))
        ] = ModelData(ActionStatus.KPI, 100, 1, echoOracle);
        modelData[address(0)][
            keccak256(abi.encodePacked("X: Reply"))
        ] = ModelData(ActionStatus.KPI, 50, 1, echoOracle);
        modelData[address(0)][
            keccak256(abi.encodePacked("X: Quote"))
        ] = ModelData(ActionStatus.KPI, 20, 1, echoOracle);
        modelData[address(0)][
            keccak256(abi.encodePacked("X: Retweet"))
        ] = ModelData(ActionStatus.KPI, 10, 1, echoOracle);
        modelData[address(0)][
            keccak256(abi.encodePacked("X: Like"))
        ] = ModelData(ActionStatus.KPI, 5, 1, echoOracle);
        modelData[address(0)][
            keccak256(abi.encodePacked("X: Bookmark"))
        ] = ModelData(ActionStatus.KPI, 5, 1, echoOracle);
        modelData[address(0)][
            keccak256(abi.encodePacked("X: Impression"))
        ] = ModelData(ActionStatus.KPI, 1, 1, echoOracle);

        modelData[address(1)][
            keccak256(abi.encodePacked("CONFIG: AuthorWallet"))
        ] = ModelData(ActionStatus.Config, 0, 0, echoOracle);
        modelData[address(1)][
            keccak256(abi.encodePacked("CONFIG: AuthorXID"))
        ] = ModelData(ActionStatus.Config, 0, 0, echoOracle);
        modelData[address(1)][
            keccak256(abi.encodePacked("CONFIG: Finalizer"))
        ] = ModelData(ActionStatus.Config, 0, 0, echoOracle);
    }

    /********************************\
    |-*-*-*   ADMINISTRATION   *-*-*-|
    \********************************/
    /// @inheritdoc IEchoAdministration
    function setModel(
        ActionAndKind calldata actionAndKind,
        ModelData calldata model
    ) external onlyProtocolAdmin {
        // Ensure that neither action nor kind is empty
        if (
            bytes(actionAndKind.action).length == 0 ||
            bytes(actionAndKind.kind).length == 0
        ) revert EMPTY_ACTION_OR_KIND_PROVIDED();

        // Validate that the actionStatus is not NA (must be QA, KPI, or CONFIG)
        if (model.actionStatus == ActionStatus.NA) revert NA_ACTION_STATUS();

        // Generate a unique hash for the action and kind combination
        bytes32 hashedActionKind = keccak256(
            abi.encodePacked(actionAndKind.action, ": ", actionAndKind.kind)
        );

        bool increaseTotalKinds;

        if (model.actionStatus == ActionStatus.QA) {
            // Validate that the action is a recognized QA type
            if (
                keccak256(abi.encodePacked(actionAndKind.action)) !=
                keccak256(abi.encodePacked("QA-AI")) &&
                keccak256(abi.encodePacked(actionAndKind.action)) !=
                keccak256(abi.encodePacked("QA-C")) &&
                keccak256(abi.encodePacked(actionAndKind.action)) !=
                keccak256(abi.encodePacked("QA-V"))
            ) revert NOT_RELATIVE_ACTION(actionAndKind.action, ActionStatus.QA);

            // Ensure a valid oracle fee: either both fee and oracle must be set, or neither
            if (model.fee != 0 && model.oracle == address(0))
                revert UNDEFINED_PROCESS();
            if (model.fee == 0 && model.oracle != address(0))
                revert ZERO_FEE_PROVIDED(ActionStatus.QA);

            // Update fee for the QA oracle or remove the QA access if fee is zero
            if (model.fee != 0) {
                if (modelData[model.oracle][hashedActionKind].fee == 0)
                    increaseTotalKinds = true;
                // Assign the provided actionStatus to the corresponding model data
                modelData[model.oracle][hashedActionKind].actionStatus = model
                    .actionStatus;
                modelData[model.oracle][hashedActionKind].fee = model.fee;
            } else delete modelData[model.oracle][hashedActionKind];
        } else if (model.actionStatus == ActionStatus.KPI) {
            // If fee is zero, remove the KPI mapping; otherwise, update the KPI model
            if (model.fee == 0) {
                delete modelData[address(0)][hashedActionKind];
            } else {
                // Ensure that social KPI ratio and fee are valid (non-zero)
                if (model.socialKPIratio == 0)
                    revert ZERO_SOCIAL_KPI_PROVIDED();
                _revertZeroAddress(model.oracle);

                if (modelData[address(0)][hashedActionKind].fee == 0)
                    increaseTotalKinds = true;

                modelData[address(0)][hashedActionKind] = model;
            }
        } else {
            // Validate that the action corresponds to CONFIG
            if (
                keccak256(abi.encodePacked(actionAndKind.action)) !=
                keccak256(abi.encodePacked("CONFIG"))
            )
                revert NOT_RELATIVE_ACTION(
                    actionAndKind.action,
                    ActionStatus.Config
                );

            // If fee is zero, remove the CONFIG mapping; otherwise, update the oracle
            if (model.fee == 0) delete modelData[address(1)][hashedActionKind];
            else {
                if (
                    modelData[address(1)][hashedActionKind].oracle == address(0)
                ) increaseTotalKinds = true;

                modelData[address(1)][hashedActionKind].actionStatus = model
                    .actionStatus;
                modelData[address(1)][hashedActionKind].oracle = model.oracle;
            }
        }

        // Emit appropriate events based on whether fee is provided
        if (model.fee != 0) {
            if (increaseTotalKinds) totalKindMethods[actionAndKind.action]++;
            hashToActionKind[hashedActionKind] = string.concat(
                actionAndKind.action,
                ": ",
                actionAndKind.kind
            );
            emit ModelSettled(actionAndKind, hashedActionKind, model);
        } else {
            if (bytes(hashToActionKind[hashedActionKind]).length != 0) {
                totalKindMethods[actionAndKind.action]--;
                delete hashToActionKind[hashedActionKind];
                emit ModelRemoved(actionAndKind, hashedActionKind, model);
            }
        }
    }

    // @Deprecated
    /// @inheritdoc IEchoAdministration
    function changeProtocolAdmin(address newProtocolAdmin)
        external
        view
        onlyProtocolAdmin
    {
        newProtocolAdmin;
        revert CALL_ECHO_V1();
        // _revertZeroAddress(newProtocolAdmin);
        // emit ProtocolAdminChanged(protocolAdmin, newProtocolAdmin);
        // protocolAdmin = newProtocolAdmin;
    }

    // @Deprecated
    /// @inheritdoc IEchoAdministration
    function changeCampaignFeeRate(uint24 newCampaignFeeRate)
        external
        view
        onlyProtocolAdmin
    {
        newCampaignFeeRate;
        revert CALL_ECHO_V1();
        // if (newCampaignFeeRate == 0 || newCampaignFeeRate >= 1e5)
        //     revert FEE_RATE_MUST_BE_BETWEEN_0_TO_1E5(newCampaignFeeRate);
        // emit CampaignFeeRateChanged(campaignFeeRate, newCampaignFeeRate);
        // campaignFeeRate = newCampaignFeeRate;
    }

    // @Deprecated
    /// @inheritdoc IEchoAdministration
    function setMaxCampaignTime(uint72 newMaxCampaignTime)
        external
        view
        onlyProtocolAdmin
    {
        newMaxCampaignTime;
        revert CALL_ECHO_V1();
        // emit maxCampaignTimeChanged(maxCampaignTime, newMaxCampaignTime);
        // if (newMaxCampaignTime == 0) delete maxCampaignTime;
        // maxCampaignTime = newMaxCampaignTime;
    }

    // @Deprecated
    /// @inheritdoc IEchoAdministration
    function whitelistToken(address token) external view onlyProtocolAdmin {
        token;
        revert CALL_ECHO_V1();
        // _revertZeroAddress(token);
        // if (whitelistedToken[token]) revert TOKEN_WHITELISTED_BEFORE();
        // whitelistedToken[token] = true;
        // emit TokenWhitelisted(token);
    }

    // @Deprecated
    /// @inheritdoc IEchoAdministration
    function removeWhitelistedToken(address token)
        external
        view
        onlyProtocolAdmin
    {
        token;
        revert CALL_ECHO_V1();
        // _revertZeroAddress(token);
        // if (!whitelistedToken[token]) revert TOKEN_DOESNT_EXIST();
        // delete whitelistedToken[token];
        // emit TokenRemoved(token);
    }

    // @Deprecated
    /// @inheritdoc IEchoAdministration
    function toggleOracleFullAccess(address oracle)
        external
        view
        onlyProtocolAdmin
    {
        oracle;
        revert CALL_ECHO_V1();
        // _revertZeroAddress(oracle);
        // disallowedOracle[oracle] = !disallowedOracle[oracle];

        // emit OracleFullAccessChanged(oracle, disallowedOracle[oracle]);
    }

    /*****************************\
    |-*-*-*-*   GETTERS   *-*-*-*-|
    \*****************************/
    /// @inheritdoc IEchoAdministration
    function campaignFeeRate() external view returns (uint24) {
        return ECHO_ADMIN_V1.campaignFeeRate();
    }

    /// @inheritdoc IEchoAdministration
    function maxCampaignTime() external view returns (uint72) {
        return ECHO_ADMIN_V1.maxCampaignTime();
    }

    /// @inheritdoc IEchoAdministration
    function whitelistedToken(address token) external view returns (bool) {
        return ECHO_ADMIN_V1.whitelistedToken(token);
    }

    /// @inheritdoc IEchoAdministration
    function disallowedOracle(address oracle) external view returns (bool) {
        return ECHO_ADMIN_V1.disallowedOracle(oracle);
    }

    /// @inheritdoc IEchoAdministration
    function allowedActionKind(
        address oracle,
        bytes32[] calldata hashedActionsKind
    ) external view returns (bool) {
        uint256 length = hashedActionsKind.length;
        ActionStatus actionStatus;

        /*
         * Determine the expected ActionStatus based on the provided oracle address:
         * - If oracle is address(0), check KPI access.
         * - If oracle is address(1), check CONFIG access.
         * - Otherwise, check QA access for the given oracle.
         */
        if (oracle == address(0)) actionStatus = ActionStatus.KPI;
        else if (oracle == address(1)) actionStatus = ActionStatus.Config;
        else actionStatus = ActionStatus.QA;

        /*
         * Iterate through the provided hashed action-kind values:
         * - If any action-kind entry does not match the expected ActionStatus, return false.
         * - Otherwise, continue checking.
         */
        for (uint256 i; i < length; ) {
            if (
                modelData[oracle][hashedActionsKind[i]].actionStatus !=
                actionStatus
            ) return false;

            unchecked {
                i++;
            }
        }

        // If all hashedActionsKind entries match the expected ActionStatus, return true
        return true;
    }

    function protocolAdmin() public view returns (address) {
        return ECHO_ADMIN_V1.protocolAdmin();
    }

    /*****************************\
    |-*-*-*-*   PRIVATE   *-*-*-*-|
    \*****************************/
    function _revertZeroAddress(address addr) private pure {
        if (addr == address(0)) revert ZERO_ADDRESS_PROVIDED();
    }
}

// SPDX-License-Identifier: MIT
pragma solidity 0.8.30;

/***************************\
|*-*-*-*    TYPES    *-*-*-*|
\***************************/

enum ActionStatus {
    NA,
    Config,
    QA,
    KPI
}

struct ActionAndKind {
    ActionStatus actionStatus;
    string action;
    string kind;
}

struct ModelData {
    ActionStatus actionStatus;
    uint8 socialKPIratio;
    uint248 fee;
    address oracle;
}

/// @title Echo Administration Interface
/// @notice Defines administrative functions for managing campaign settings, token whitelisting, and oracle permissions.
/// @author Dynabits.org
interface IEchoAdministration {
    /*******************************\
    |*-*-*-*   EXTERNALS   *-*-*-*-*|
    \*******************************/

    /// @notice Transfers protocol admin rights to a new address.
    /// @dev Only the current protocol admin can call this function. The new admin address cannot be the zero address.
    /// @param newProtocolAdmin The address of the new protocol admin.
    function changeProtocolAdmin(address newProtocolAdmin) external;

    /// @notice Sets the campaign fee rate as a percentage of the allocated token at creation.
    /// @dev The value must be between 0 and 1e5.
    /// @param newCampaignFeeRate The new campaign creation fee rate.
    function changeCampaignFeeRate(uint24 newCampaignFeeRate) external;

    /// @notice Sets the maximum campaign duration.
    /// @dev A value of zero means there is no maximum campaign duration.
    /// @param newMaxCampaignTime The maximum campaign duration in seconds.
    function setMaxCampaignTime(uint72 newMaxCampaignTime) external;

    /// @notice Whitelists a new ERC20 token for use in campaigns.
    /// @dev A token cannot be whitelisted more than once. The whitelist status is checked during campaign creation.
    /// @param token The ERC20 token address.
    function whitelistToken(address token) external;

    /// @notice Removes an ERC20 token from the whitelist, preventing its selection as a campaign budget token.
    /// @param token The ERC20 token address.
    function removeWhitelistedToken(address token) external;

    /// @notice Toggles full access permissions for an oracle.
    /// @dev This function can be used to temporarily or permanently disable an oracle’s access to campaign-related functionalities.
    /// @param oracle The address of the oracle.
    function toggleOracleFullAccess(address oracle) external;

    /**
     * @notice Sets or updates the model data for a given action and kind.
     * @dev Configures an action-kind mapping with an associated oracle, fee, and status.
     * @param actionAndKind The struct containing the action and kind identifiers.
     * @param model The struct containing model details such as the oracle, fee, status, and social KPI ratio.
     *
     * Requirements:
     * - `actionAndKind.action` and `actionAndKind.kind` must not be empty.
     * - `model.actionStatus` must be one of `QA`, `KPI`, or `CONFIG`.
     * - Actions must match their respective `actionStatus`:
     *   - `QA` actions: `QA-AI`, `QA-C`, `QA-V`
     *   - `KPI` actions: `KPI`
     *   - `CONFIG` actions: `CONFIG`
     * - QA oracles must have a nonzero fee.
     * - KPI oracles must have both a nonzero fee and a nonzero social KPI ratio.
     * - CONFIG actions always have a zero fee.
     *
     * Effects:
     * - Adds or updates an action-kind mapping.
     * - Removes model data if `model.oracle` is zero.
     *
     * Emits:
     * - `ModelSettled` if a model is set or updated.
     * - `ModelRemoved` if a model is removed.
     *
     * Reverts:
     * - `EMPTY_ACTION_OR_KIND_PROVIDED` if either action or kind is empty.
     * - `NA_ACTION_STATUS` if the provided action status is `NA`.
     * - `NOT_RELATIVE_ACTION` if the action does not match its required type.
     * - `UNDEFINED_PROCESS` if a QA oracle has a fee but no valid address.
     * - `ZERO_FEE_PROVIDED` if a required fee is zero.
     * - `ZERO_SOCIAL_KPI_PROVIDED` if a required social KPI ratio is zero.
     */
    function setModel(
        ActionAndKind calldata actionAndKind,
        ModelData calldata model
    ) external;

    /*****************************\
    |-*-*-*-*   GETTERS   *-*-*-*-|
    \*****************************/

    /// @notice Returns the campaign creation fee rate as a percentage.
    /// @dev This value is deducted from the allocated budget immediately upon campaign creation.
    /// @return The campaign creation fee rate.
    function campaignFeeRate() external view returns (uint24);

    /// @notice Returns the maximum allowed duration for campaigns.
    /// @dev A campaign’s duration (end time - start time) must be less than or equal to this value at creation.
    /// @return The maximum campaign duration in seconds.
    function maxCampaignTime() external view returns (uint72);

    /// @notice Returns the protocol admin address.
    /// @dev The protocol admin has full access to infrastructural modifications.
    /// @return The address of the protocol admin.
    function protocolAdmin() external view returns (address);

    /// @notice Checks if a given ERC20 token is whitelisted for campaign use.
    /// @param token The ERC20 token address.
    /// @return A boolean indicating whether the token is whitelisted.
    function whitelistedToken(address token) external view returns (bool);

    /**
     * @notice Checks if an oracle has been banned.
     * @dev A banned oracle loses all permissions to interact with EchoContents and campaign contracts.
     * @param oracle The address of the oracle.
     * @return A boolean indicating whether the oracle is banned.
     */
    function disallowedOracle(address oracle) external view returns (bool);

    /**
     * @notice Returns the number of available methods and parameters for a given action.
     * @dev Examples:
     * - KPI actions (e.g., `X`) can have parameters like `Like` and `Retweet`.
     * - Qualification actions (`QA-V`) can have parameters like `Accuracy` and `Originality`.
     * @param action The action type, such as `X`, `QA-V`, or `Config`.
     * @return The number of available methods for the action.
     */
    function totalKindMethods(string calldata action)
        external
        view
        returns (uint256);

    /**
     * @notice Retrieves the original action and kind from a given hashed identifier.
     * @dev Useful for reducing gas costs and simplifying comparisons.
     * @param hashedActionKind The hash of the concatenated action and kind.
     * @return The decoded action and kind as a string.
     */
    function hashToActionKind(bytes32 hashedActionKind)
        external
        view
        returns (string memory);

    /**
     * @notice Returns model data associated with an oracle and a hashed action-kind.
     * @param oracle_ The address of the oracle.
     * @param hashedActionKind The hashed action-kind identifier.
     * @return actionStatus The action status of the model.
     * @return socialKPIratio The social KPI ratio.
     * @return fee The associated fee for the action.
     * @return oracle The address of the oracle managing the action.
     */
    function modelData(address oracle_, bytes32 hashedActionKind)
        external
        view
        returns (
            ActionStatus actionStatus,
            uint8 socialKPIratio,
            uint248 fee,
            address oracle
        );

    /**
     * @notice Checks if an oracle has the required permissions for given action-kind hashes.
     * @dev Access is determined based on the oracle's address:
     * - `address(0)`: Checks if the hashed action-kind exists for KPI.
     * - `address(1)`: Checks if the hashed action-kind exists for CONFIG.
     * - Any other address: Checks if the oracle has QA access.
     * @param oracle The oracle’s address.
     * @param hashedActionsKind An array of hashed action-kind values to verify.
     * @return A boolean indicating whether the oracle is authorized.
     */
    function allowedActionKind(
        address oracle,
        bytes32[] calldata hashedActionsKind
    ) external view returns (bool);
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "remappings": [
    "forge-std/=lib/forge-std/src/",
    "@prb/math/=lib/prb-math/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/contracts/",
    "@openzeppelin/contracts/=lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/",
    "@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/"
  ]
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"CALL_ECHO_V1","type":"error"},{"inputs":[],"name":"EMPTY_ACTION_OR_KIND_PROVIDED","type":"error"},{"inputs":[],"name":"NA_ACTION_STATUS","type":"error"},{"inputs":[{"internalType":"string","name":"action","type":"string"},{"internalType":"enum ActionStatus","name":"actionStatus","type":"uint8"}],"name":"NOT_RELATIVE_ACTION","type":"error"},{"inputs":[],"name":"ONLY_PROTOCOL_ADMIN","type":"error"},{"inputs":[],"name":"UNDEFINED_PROCESS","type":"error"},{"inputs":[],"name":"ZERO_ADDRESS_PROVIDED","type":"error"},{"inputs":[{"internalType":"enum ActionStatus","name":"actionStatus","type":"uint8"}],"name":"ZERO_FEE_PROVIDED","type":"error"},{"inputs":[],"name":"ZERO_SOCIAL_KPI_PROVIDED","type":"error"},{"anonymous":false,"inputs":[{"components":[{"internalType":"enum ActionStatus","name":"actionStatus","type":"uint8"},{"internalType":"string","name":"action","type":"string"},{"internalType":"string","name":"kind","type":"string"}],"indexed":false,"internalType":"struct ActionAndKind","name":"actionKind","type":"tuple"},{"indexed":false,"internalType":"bytes32","name":"hashedActionKind","type":"bytes32"},{"components":[{"internalType":"enum ActionStatus","name":"actionStatus","type":"uint8"},{"internalType":"uint8","name":"socialKPIratio","type":"uint8"},{"internalType":"uint248","name":"fee","type":"uint248"},{"internalType":"address","name":"oracle","type":"address"}],"indexed":false,"internalType":"struct ModelData","name":"model","type":"tuple"}],"name":"ModelRemoved","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"enum ActionStatus","name":"actionStatus","type":"uint8"},{"internalType":"string","name":"action","type":"string"},{"internalType":"string","name":"kind","type":"string"}],"indexed":false,"internalType":"struct ActionAndKind","name":"actionKind","type":"tuple"},{"indexed":false,"internalType":"bytes32","name":"hashedActionKind","type":"bytes32"},{"components":[{"internalType":"enum ActionStatus","name":"actionStatus","type":"uint8"},{"internalType":"uint8","name":"socialKPIratio","type":"uint8"},{"internalType":"uint248","name":"fee","type":"uint248"},{"internalType":"address","name":"oracle","type":"address"}],"indexed":false,"internalType":"struct ModelData","name":"model","type":"tuple"}],"name":"ModelSettled","type":"event"},{"inputs":[{"internalType":"address","name":"oracle","type":"address"},{"internalType":"bytes32[]","name":"hashedActionsKind","type":"bytes32[]"}],"name":"allowedActionKind","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"campaignFeeRate","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint24","name":"newCampaignFeeRate","type":"uint24"}],"name":"changeCampaignFeeRate","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newProtocolAdmin","type":"address"}],"name":"changeProtocolAdmin","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"oracle","type":"address"}],"name":"disallowedOracle","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"hashToActionKind","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxCampaignTime","outputs":[{"internalType":"uint72","name":"","type":"uint72"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"modelData","outputs":[{"internalType":"enum ActionStatus","name":"actionStatus","type":"uint8"},{"internalType":"uint8","name":"socialKPIratio","type":"uint8"},{"internalType":"uint248","name":"fee","type":"uint248"},{"internalType":"address","name":"oracle","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"protocolAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"removeWhitelistedToken","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint72","name":"newMaxCampaignTime","type":"uint72"}],"name":"setMaxCampaignTime","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"enum ActionStatus","name":"actionStatus","type":"uint8"},{"internalType":"string","name":"action","type":"string"},{"internalType":"string","name":"kind","type":"string"}],"internalType":"struct ActionAndKind","name":"actionAndKind","type":"tuple"},{"components":[{"internalType":"enum ActionStatus","name":"actionStatus","type":"uint8"},{"internalType":"uint8","name":"socialKPIratio","type":"uint8"},{"internalType":"uint248","name":"fee","type":"uint248"},{"internalType":"address","name":"oracle","type":"address"}],"internalType":"struct ModelData","name":"model","type":"tuple"}],"name":"setModel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"oracle","type":"address"}],"name":"toggleOracleFullAccess","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"totalKindMethods","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"whitelistToken","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"whitelistedToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

608060405234801561000f575f5ffd5b5060035f60405161002b906451412d414960d81b815260050190565b90815260408051918290036020908101832093909355600b60fb1b82525f600180840182905282519384900360210184206007905565434f4e46494760d01b845260068401829052825193849003602601842060039081905560808501845260028086528587018490528585018390526060860184905273ec051bb8876e78ba6a24e03cb07fbe1259e44c4780855290875284517f51412d41493a2052656c6576616e636520416e6420416c69676e6d656e740000818901528551808203601e018152603e909101865280519088012084527fa9b6589dd0d1f34b744b892d1e4bba34aceb459014487f5f11469ce7fa63b82b909652929091208351815491939092849260ff191691849081111561014557610145610df3565b02179055506020820151815461ff00191661010060ff909216919091021781556040808301516001830180546001600160f81b0319166001600160f81b03909216919091179055606090920151600291820180546001600160a01b0319166001600160a01b03909216919091179055815160808101909252819081525f6020808301829052600160408085019190915260609093018290526001600160a01b038516825260028152828220925161022091017f51412d41493a20416363757261637920416e6420437265646962696c697479008152601f0190565b60408051601f198184030181529181528151602092830120835290820192909252015f2081518154829060ff1916600183600381111561026257610262610df3565b02179055506020820151815461ff00191661010060ff909216919091021781556040808301516001830180546001600160f81b0319166001600160f81b03909216919091179055606090920151600291820180546001600160a01b0319166001600160a01b03909216919091179055815160808101909252819081525f6020808301829052600160408085019190915260609093018290526001600160a01b038516825260028152828220925161033d91017f51412d41493a2052657075746174696f6e20416e6420496e666c75656e6365008152601f0190565b60408051601f198184030181529181528151602092830120835290820192909252015f2081518154829060ff1916600183600381111561037f5761037f610df3565b0217905550602082810151825461ff00191661010060ff90921691909102178255604080840151600180850180546001600160f81b0319166001600160f81b0390931692909217909155606094850151600294850180546001600160a01b0319166001600160a01b0392831617905582516080810184526003808252606482870152818501849052918816968101969096525f808052948452825166160e88141bdcdd60ca1b81860152835180820360070181526027909101845280519085012085525f5160206127bc5f395f51905f5290935292208351815491939092849260ff19169190849081111561047657610476610df3565b0217905550602082810151825461ff00191661010060ff90921691909102178255604080840151600180850180546001600160f81b0319166001600160f81b0390931692909217909155606094850151600294850180546001600160a01b0319166001600160a01b0392831617905582516080810184526003808252603282870152818501849052918816968101969096525f808052948452825167583a205265706c7960c01b81860152835180820360080181526028909101845280519085012085525f5160206127bc5f395f51905f5290935292208351815491939092849260ff19169190849081111561056e5761056e610df3565b0217905550602082810151825461ff00191661010060ff90921691909102178255604080840151600180850180546001600160f81b0319166001600160f81b0390931692909217909155606094850151600294850180546001600160a01b0319166001600160a01b0392831617905582516080810184526003808252601482870152818501849052918816968101969096525f808052948452825167583a2051756f746560c01b81860152835180820360080181526028909101845280519085012085525f5160206127bc5f395f51905f5290935292208351815491939092849260ff19169190849081111561066657610666610df3565b0217905550602082810151825461ff00191661010060ff90921691909102178255604080840151600180850180546001600160f81b0319166001600160f81b0390931692909217909155606094850151600294850180546001600160a01b0319166001600160a01b03928316179055825160808101845260038152600a81860152808401929092528616948101949094525f8080529282525169160e8814995d1dd9595d60b21b918101919091525f5160206127bc5f395f51905f529190602a0160408051601f198184030181529181528151602092830120835290820192909252015f2081518154829060ff1916600183600381111561076957610769610df3565b0217905550602082810151825461ff00191661010060ff90921691909102178255604080840151600180850180546001600160f81b0319166001600160f81b0390931692909217909155606094850151600294850180546001600160a01b0319166001600160a01b0392831617905582516080810184526003808252600582870152818501849052918816968101969096525f808052948452825166583a204c696b6560c81b81860152835180820360070181526027909101845280519085012085525f5160206127bc5f395f51905f5290935292208351815491939092849260ff19169190849081111561086057610860610df3565b0217905550602082810151825461ff00191661010060ff90921691909102178255604080840151600180850180546001600160f81b0319166001600160f81b0390931692909217909155606094850151600294850180546001600160a01b0319166001600160a01b0392831617905582516080810184526003808252600582870152818501849052918816968101969096525f80805294845282516a583a20426f6f6b6d61726b60a81b818601528351808203600b018152602b909101845280519085012085525f5160206127bc5f395f51905f5290935292208351815491939092849260ff19169190849081111561095b5761095b610df3565b0217905550602082810151825461ff00191661010060ff90921691909102178255604080840151600180850180546001600160f81b0319166001600160f81b0390931692909217909155606094850151600294850180546001600160a01b0319166001600160a01b0392831617905582516080810184526003808252818601849052818501849052918816968101969096525f80805294845282516c2c1d1024b6b83932b9b9b4b7b760991b818601528351808203600d018152602d909101845280519085012085525f5160206127bc5f395f51905f5290935292208351815491939092849260ff191691908490811115610a5857610a58610df3565b0217905550602082810151825461ff00191661010060ff90921691909102178255604080840151600180850180546001600160f81b0319166001600160f81b0390931692909217909155606094850151600294850180546001600160a01b0319166001600160a01b0392831617905582516080810184528281525f81860181905281850181905291881696810196909652908152928252517f434f4e4649473a20417574686f7257616c6c6574000000000000000000000000918101919091525f5160206127dc5f395f51905f52919060340160408051601f198184030181529181528151602092830120835290820192909252015f2081518154829060ff19166001836003811115610b6d57610b6d610df3565b0217905550602082810151825461ff00191661010060ff90921691909102178255604080840151600180850180546001600160f81b0319166001600160f81b0390931692909217909155606094850151600294850180546001600160a01b0319166001600160a01b0392831617905582516080810184528281525f81860181905281850181905291881696810196909652908152928252517010d3d3919251ce88105d5d1a1bdc961251607a1b918101919091525f5160206127dc5f395f51905f52919060310160408051601f198184030181529181528151602092830120835290820192909252015f2081518154829060ff19166001836003811115610c7657610c76610df3565b0217905550602082810151825461ff00191661010060ff90921691909102178255604080840151600180850180546001600160f81b0319166001600160f81b0390931692909217909155606094850151600294850180546001600160a01b0319166001600160a01b0392831617905582516080810184528281525f81860181905281850181905291881696810196909652908152928252517021a7a72324a39d102334b730b634bd32b960791b918101919091525f5160206127dc5f395f51905f52919060310160408051601f198184030181529181528151602092830120835290820192909252015f2081518154829060ff19166001836003811115610d7f57610d7f610df3565b02179055506020820151815461ff00191661010060ff9092169190910217815560408201516001820180546001600160f81b0319166001600160f81b03909216919091179055606090910151600290910180546001600160a01b0319166001600160a01b0390921691909117905550610e07565b634e487b7160e01b5f52602160045260245ffd5b6119a880610e145f395ff3fe608060405234801561000f575f5ffd5b50600436106100fb575f3560e01c8063911cf01411610093578063bec4d54e11610063578063bec4d54e14610244578063e2cc5f3c14610266578063e6e2be1614610279578063f33bd5be1461028c575f5ffd5b8063911cf01414610194578063aa79b741146100ff578063b6001e24146101cc578063b82f038e14610231575f5ffd5b8063531280c1116100ce578063531280c11461015c5780636247f6f2146100ff5780636c8709ab1461016a5780638ddc321f14610178575f5ffd5b80631c88705d146100ff5780632ac1326b14610114578063420f68611461013c57806344c43a7d146100ff575b5f5ffd5b61011261010d3660046110e2565b6102ac565b005b6101276101223660046110e2565b6102fe565b60405190151581526020015b60405180910390f35b610144610381565b6040516001600160a01b039091168152602001610133565b61011261010d36600461110d565b61011261010d36600461113e565b6101806103fb565b60405162ffffff9091168152602001610133565b6101be6101a236600461116d565b80516020818301810180515f8252928201919093012091525481565b604051908152602001610133565b6102216101da366004611220565b600260208181525f9384526040808520909152918352912080546001820154919092015460ff80841693610100900416916001600160f81b0316906001600160a01b031684565b604051610133949392919061127e565b61011261023f3660046112bc565b610470565b61024c610e3c565b60405168ffffffffffffffffff9091168152602001610133565b6101276102743660046110e2565b610eb1565b610127610287366004611316565b610ef3565b61029f61029a366004611399565b610fc3565b60405161013391906113b0565b6102b4610381565b6001600160a01b0316336001600160a01b0316146102e5576040516315cead3960e31b815260040160405180910390fd5b604051632ba079f560e01b815260040160405180910390fd5b604051632ac1326b60e01b81526001600160a01b03821660048201525f9073787fb122fc8a4b183e42e92dd48d1b52f707e03190632ac1326b906024015b602060405180830381865afa158015610357573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061037b91906113e5565b92915050565b5f73787fb122fc8a4b183e42e92dd48d1b52f707e0316001600160a01b031663420f68616040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103d2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103f69190611404565b905090565b5f73787fb122fc8a4b183e42e92dd48d1b52f707e0316001600160a01b0316638ddc321f6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561044c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103f6919061141f565b610478610381565b6001600160a01b0316336001600160a01b0316146104a9576040516315cead3960e31b815260040160405180910390fd5b6104b6602083018361143a565b159050806104d057506104cc604083018361143a565b1590505b156104ee57604051630a8bf2b760e11b815260040160405180910390fd5b5f6104fc6020830183611490565b600381111561050d5761050d61124a565b0361052b57604051631e719f3360e01b815260040160405180910390fd5b5f610539602084018461143a565b610546604086018661143a565b60405160200161055994939291906114ab565b60408051601f19818403018152919052805160209091012090505f60026105836020850185611490565b60038111156105945761059461124a565b0361096c576040516451412d414960d81b6020820152602501604051602081830303815290604052805190602001208480602001906105d3919061143a565b6040516020016105e49291906114d5565b604051602081830303815290604052805190602001201415801561066657506040516351412d4360e01b60208201526024016040516020818303038152906040528051906020012084806020019061063c919061143a565b60405160200161064d9291906114d5565b6040516020818303038152906040528051906020012014155b80156106d057506040516328a096ab60e11b6020820152602401604051602081830303815290604052805190602001208480602001906106a6919061143a565b6040516020016106b79291906114d5565b6040516020818303038152906040528051906020012014155b15610709576106e2602085018561143a565b600260405163222a151760e11b81526004016107009392919061150c565b60405180910390fd5b610719606084016040850161154a565b6001600160f81b03161580159061074757505f61073c60808501606086016110e2565b6001600160a01b0316145b1561076557604051630e84ae9360e21b815260040160405180910390fd5b610775606084016040850161154a565b6001600160f81b03161580156107a357505f61079760808501606086016110e2565b6001600160a01b031614155b156107c457600260405163d5ff172960e01b81526004016107009190611565565b6107d4606084016040850161154a565b6001600160f81b0316156109035760025f6107f560808601606087016110e2565b6001600160a01b0316815260208082019290925260409081015f9081208582529092528120600101546001600160f81b03169003610831575060015b61083e6020840184611490565b60025f61085160808701606088016110e2565b6001600160a01b0316815260208082019290925260409081015f9081208682529092529020805460ff191660018360038111156108905761089061124a565b02179055506108a5606084016040850161154a565b60025f6108b860808701606088016110e2565b6001600160a01b0316815260208082019290925260409081015f908120868252909252902060010180546001600160f81b0319166001600160f81b0392909216919091179055610c93565b60025f61091660808601606087016110e2565b6001600160a01b0316815260208082019290925260409081015f9081208582529092529020805461ffff191681556001810180546001600160f81b031916905560020180546001600160a01b0319169055610c93565b600361097b6020850185611490565b600381111561098c5761098c61124a565b03610ada576109a1606084016040850161154a565b6001600160f81b03165f03610a0d575f8281527fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b60205260409020805461ffff191681556001810180546001600160f81b031916905560020180546001600160a01b0319169055610c93565b610a1d6040840160208501611581565b60ff165f03610a3f57604051636ab3f8d560e11b815260040160405180910390fd5b610a57610a5260808501606086016110e2565b61105a565b5f8281527fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b60205260408120600101546001600160f81b03169003610a9a575060015b5f8281527fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b602052604090208390610ad282826115b4565b905050610c93565b60405165434f4e46494760d01b602082015260260160405160208183030381529060405280519060200120848060200190610b15919061143a565b604051602001610b269291906114d5565b6040516020818303038152906040528051906020012014610b6c57610b4e602085018561143a565b600160405163222a151760e11b81526004016107009392919061150c565b610b7c606084016040850161154a565b6001600160f81b03165f03610bd5575f8281525f5160206119535f395f51905f5260205260409020805461ffff191681556001810180546001600160f81b031916905560020180546001600160a01b0319169055610c93565b5f8281525f5160206119535f395f51905f5260205260409020600201546001600160a01b0316610c03575060015b610c106020840184611490565b5f8381525f5160206119535f395f51905f5260205260409020805460ff19166001836003811115610c4357610c4361124a565b0217905550610c5860808401606085016110e2565b5f8381525f5160206119535f395f51905f526020526040902060020180546001600160a01b0319166001600160a01b03929092169190911790555b610ca3606084016040850161154a565b6001600160f81b031615610d88578015610cf5575f610cc5602086018661143a565b604051610cd39291906114d5565b9081526040519081900360200190208054905f610cef8361168e565b91905055505b610d02602085018561143a565b610d0f604087018761143a565b604051602001610d2294939291906114ab565b60408051601f198184030181529181525f84815260016020522090610d47908261172a565b507f308f9f55d3eeef9e8267285607d3dde765f53e18a5cdd7ed77e21e5633a6791b848385604051610d7b93929190611827565b60405180910390a1610e36565b5f8281526001602052604090208054610da0906116a6565b159050610e36575f610db5602086018661143a565b604051610dc39291906114d5565b9081526040519081900360200190208054905f610ddf8361190e565b90915550505f828152600160205260408120610dfa91611084565b7f454f1484777e93d9fd2ad4a7fd63f5fa7a9edd73f994a2be242a7fae02c121c1848385604051610e2d93929190611827565b60405180910390a15b50505050565b5f73787fb122fc8a4b183e42e92dd48d1b52f707e0316001600160a01b031663bec4d54e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e8d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103f69190611923565b6040516338b317cf60e21b81526001600160a01b03821660048201525f9073787fb122fc8a4b183e42e92dd48d1b52f707e0319063e2cc5f3c9060240161033c565b5f81816001600160a01b038616610f0c57506003610f29565b5f196001600160a01b03871601610f2557506001610f29565b5060025b5f5b82811015610fb457816003811115610f4557610f4561124a565b6001600160a01b0388165f90815260026020526040812090888885818110610f6f57610f6f61193e565b602090810292909201358352508101919091526040015f205460ff166003811115610f9c57610f9c61124a565b14610fac575f9350505050610fbc565b600101610f2b565b506001925050505b9392505050565b60016020525f908152604090208054610fdb906116a6565b80601f0160208091040260200160405190810160405280929190818152602001828054611007906116a6565b80156110525780601f1061102957610100808354040283529160200191611052565b820191905f5260205f20905b81548152906001019060200180831161103557829003601f168201915b505050505081565b6001600160a01b0381166110815760405163140efc4d60e21b815260040160405180910390fd5b50565b508054611090906116a6565b5f825580601f1061109f575050565b601f0160209004905f5260205f209081019061108191905b808211156110ca575f81556001016110b7565b5090565b6001600160a01b0381168114611081575f5ffd5b5f602082840312156110f2575f5ffd5b8135610fbc816110ce565b62ffffff81168114611081575f5ffd5b5f6020828403121561111d575f5ffd5b8135610fbc816110fd565b68ffffffffffffffffff81168114611081575f5ffd5b5f6020828403121561114e575f5ffd5b8135610fbc81611128565b634e487b7160e01b5f52604160045260245ffd5b5f6020828403121561117d575f5ffd5b813567ffffffffffffffff811115611193575f5ffd5b8201601f810184136111a3575f5ffd5b803567ffffffffffffffff8111156111bd576111bd611159565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156111ec576111ec611159565b604052818152828201602001861015611203575f5ffd5b816020840160208301375f91810160200191909152949350505050565b5f5f60408385031215611231575f5ffd5b823561123c816110ce565b946020939093013593505050565b634e487b7160e01b5f52602160045260245ffd5b6004811061127a57634e487b7160e01b5f52602160045260245ffd5b9052565b6080810161128c828761125e565b60ff9490941660208201526001600160f81b039290921660408301526001600160a01b0316606090910152919050565b5f5f82840360a08112156112ce575f5ffd5b833567ffffffffffffffff8111156112e4575f5ffd5b8401606081870312156112f5575f5ffd5b92506080601f1982011215611308575f5ffd5b506020830190509250929050565b5f5f5f60408486031215611328575f5ffd5b8335611333816110ce565b9250602084013567ffffffffffffffff81111561134e575f5ffd5b8401601f8101861361135e575f5ffd5b803567ffffffffffffffff811115611374575f5ffd5b8660208260051b8401011115611388575f5ffd5b939660209190910195509293505050565b5f602082840312156113a9575f5ffd5b5035919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f602082840312156113f5575f5ffd5b81518015158114610fbc575f5ffd5b5f60208284031215611414575f5ffd5b8151610fbc816110ce565b5f6020828403121561142f575f5ffd5b8151610fbc816110fd565b5f5f8335601e1984360301811261144f575f5ffd5b83018035915067ffffffffffffffff821115611469575f5ffd5b60200191503681900382131561147d575f5ffd5b9250929050565b60048110611081575f5ffd5b5f602082840312156114a0575f5ffd5b8135610fbc81611484565b838582375f8482016101d160f51b8152838560028301375f93016002019283525090949350505050565b818382375f9101908152919050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b604081525f61151f6040830185876114e4565b905061152e602083018461125e565b949350505050565b6001600160f81b0381168114611081575f5ffd5b5f6020828403121561155a575f5ffd5b8135610fbc81611536565b6020810161037b828461125e565b60ff81168114611081575f5ffd5b5f60208284031215611591575f5ffd5b8135610fbc81611573565b5f813561037b81611536565b5f813561037b816110ce565b81356115bf81611484565b600481106115db57634e487b7160e01b5f52602160045260245ffd5b815460ff821691508160ff19821617835560208401356115fa81611573565b61ff008160081b168361ffff1984161717845550505061164361161f6040840161159c565b6001830180546001600160f81b0319166001600160f81b0392909216919091179055565b611676611652606084016115a8565b6002830180546001600160a01b0319166001600160a01b0392909216919091179055565b5050565b634e487b7160e01b5f52601160045260245ffd5b5f6001820161169f5761169f61167a565b5060010190565b600181811c908216806116ba57607f821691505b6020821081036116d857634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561172557805f5260205f20601f840160051c810160208510156117035750805b601f840160051c820191505b81811015611722575f815560010161170f565b50505b505050565b815167ffffffffffffffff81111561174457611744611159565b6117588161175284546116a6565b846116de565b6020601f82116001811461178a575f83156117735750848201515b5f19600385901b1c1916600184901b178455611722565b5f84815260208120601f198516915b828110156117b95787850151825560209485019460019092019101611799565b50848210156117d657868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f5f8335601e198436030181126117fa575f5ffd5b830160208101925035905067ffffffffffffffff811115611819575f5ffd5b80360382131561147d575f5ffd5b60c081525f843561183781611484565b61184460c084018261125e565b5061185260208601866117e5565b606060e0850152611868610120850182846114e4565b91505061187860408701876117e5565b84830360bf19016101008601526118908382846114e4565b935050505083602083015282356118a681611484565b6118b3604084018261125e565b5060208301356118c281611573565b60ff16606083015260408301356118d881611536565b6001600160f81b0316608083015260608301356118f4816110ce565b6001600160a01b031660a092909201919091529392505050565b5f8161191c5761191c61167a565b505f190190565b5f60208284031215611933575f5ffd5b8151610fbc81611128565b634e487b7160e01b5f52603260045260245ffdfee90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e0a26469706673582212207982f9666a07d64a98af7639c08d56957cc17e0ac70ba3c3347ba08df645c96d64736f6c634300081e0033ac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077be90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e0

Deployed Bytecode

0x608060405234801561000f575f5ffd5b50600436106100fb575f3560e01c8063911cf01411610093578063bec4d54e11610063578063bec4d54e14610244578063e2cc5f3c14610266578063e6e2be1614610279578063f33bd5be1461028c575f5ffd5b8063911cf01414610194578063aa79b741146100ff578063b6001e24146101cc578063b82f038e14610231575f5ffd5b8063531280c1116100ce578063531280c11461015c5780636247f6f2146100ff5780636c8709ab1461016a5780638ddc321f14610178575f5ffd5b80631c88705d146100ff5780632ac1326b14610114578063420f68611461013c57806344c43a7d146100ff575b5f5ffd5b61011261010d3660046110e2565b6102ac565b005b6101276101223660046110e2565b6102fe565b60405190151581526020015b60405180910390f35b610144610381565b6040516001600160a01b039091168152602001610133565b61011261010d36600461110d565b61011261010d36600461113e565b6101806103fb565b60405162ffffff9091168152602001610133565b6101be6101a236600461116d565b80516020818301810180515f8252928201919093012091525481565b604051908152602001610133565b6102216101da366004611220565b600260208181525f9384526040808520909152918352912080546001820154919092015460ff80841693610100900416916001600160f81b0316906001600160a01b031684565b604051610133949392919061127e565b61011261023f3660046112bc565b610470565b61024c610e3c565b60405168ffffffffffffffffff9091168152602001610133565b6101276102743660046110e2565b610eb1565b610127610287366004611316565b610ef3565b61029f61029a366004611399565b610fc3565b60405161013391906113b0565b6102b4610381565b6001600160a01b0316336001600160a01b0316146102e5576040516315cead3960e31b815260040160405180910390fd5b604051632ba079f560e01b815260040160405180910390fd5b604051632ac1326b60e01b81526001600160a01b03821660048201525f9073787fb122fc8a4b183e42e92dd48d1b52f707e03190632ac1326b906024015b602060405180830381865afa158015610357573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061037b91906113e5565b92915050565b5f73787fb122fc8a4b183e42e92dd48d1b52f707e0316001600160a01b031663420f68616040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103d2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103f69190611404565b905090565b5f73787fb122fc8a4b183e42e92dd48d1b52f707e0316001600160a01b0316638ddc321f6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561044c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103f6919061141f565b610478610381565b6001600160a01b0316336001600160a01b0316146104a9576040516315cead3960e31b815260040160405180910390fd5b6104b6602083018361143a565b159050806104d057506104cc604083018361143a565b1590505b156104ee57604051630a8bf2b760e11b815260040160405180910390fd5b5f6104fc6020830183611490565b600381111561050d5761050d61124a565b0361052b57604051631e719f3360e01b815260040160405180910390fd5b5f610539602084018461143a565b610546604086018661143a565b60405160200161055994939291906114ab565b60408051601f19818403018152919052805160209091012090505f60026105836020850185611490565b60038111156105945761059461124a565b0361096c576040516451412d414960d81b6020820152602501604051602081830303815290604052805190602001208480602001906105d3919061143a565b6040516020016105e49291906114d5565b604051602081830303815290604052805190602001201415801561066657506040516351412d4360e01b60208201526024016040516020818303038152906040528051906020012084806020019061063c919061143a565b60405160200161064d9291906114d5565b6040516020818303038152906040528051906020012014155b80156106d057506040516328a096ab60e11b6020820152602401604051602081830303815290604052805190602001208480602001906106a6919061143a565b6040516020016106b79291906114d5565b6040516020818303038152906040528051906020012014155b15610709576106e2602085018561143a565b600260405163222a151760e11b81526004016107009392919061150c565b60405180910390fd5b610719606084016040850161154a565b6001600160f81b03161580159061074757505f61073c60808501606086016110e2565b6001600160a01b0316145b1561076557604051630e84ae9360e21b815260040160405180910390fd5b610775606084016040850161154a565b6001600160f81b03161580156107a357505f61079760808501606086016110e2565b6001600160a01b031614155b156107c457600260405163d5ff172960e01b81526004016107009190611565565b6107d4606084016040850161154a565b6001600160f81b0316156109035760025f6107f560808601606087016110e2565b6001600160a01b0316815260208082019290925260409081015f9081208582529092528120600101546001600160f81b03169003610831575060015b61083e6020840184611490565b60025f61085160808701606088016110e2565b6001600160a01b0316815260208082019290925260409081015f9081208682529092529020805460ff191660018360038111156108905761089061124a565b02179055506108a5606084016040850161154a565b60025f6108b860808701606088016110e2565b6001600160a01b0316815260208082019290925260409081015f908120868252909252902060010180546001600160f81b0319166001600160f81b0392909216919091179055610c93565b60025f61091660808601606087016110e2565b6001600160a01b0316815260208082019290925260409081015f9081208582529092529020805461ffff191681556001810180546001600160f81b031916905560020180546001600160a01b0319169055610c93565b600361097b6020850185611490565b600381111561098c5761098c61124a565b03610ada576109a1606084016040850161154a565b6001600160f81b03165f03610a0d575f8281527fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b60205260409020805461ffff191681556001810180546001600160f81b031916905560020180546001600160a01b0319169055610c93565b610a1d6040840160208501611581565b60ff165f03610a3f57604051636ab3f8d560e11b815260040160405180910390fd5b610a57610a5260808501606086016110e2565b61105a565b5f8281527fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b60205260408120600101546001600160f81b03169003610a9a575060015b5f8281527fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b602052604090208390610ad282826115b4565b905050610c93565b60405165434f4e46494760d01b602082015260260160405160208183030381529060405280519060200120848060200190610b15919061143a565b604051602001610b269291906114d5565b6040516020818303038152906040528051906020012014610b6c57610b4e602085018561143a565b600160405163222a151760e11b81526004016107009392919061150c565b610b7c606084016040850161154a565b6001600160f81b03165f03610bd5575f8281525f5160206119535f395f51905f5260205260409020805461ffff191681556001810180546001600160f81b031916905560020180546001600160a01b0319169055610c93565b5f8281525f5160206119535f395f51905f5260205260409020600201546001600160a01b0316610c03575060015b610c106020840184611490565b5f8381525f5160206119535f395f51905f5260205260409020805460ff19166001836003811115610c4357610c4361124a565b0217905550610c5860808401606085016110e2565b5f8381525f5160206119535f395f51905f526020526040902060020180546001600160a01b0319166001600160a01b03929092169190911790555b610ca3606084016040850161154a565b6001600160f81b031615610d88578015610cf5575f610cc5602086018661143a565b604051610cd39291906114d5565b9081526040519081900360200190208054905f610cef8361168e565b91905055505b610d02602085018561143a565b610d0f604087018761143a565b604051602001610d2294939291906114ab565b60408051601f198184030181529181525f84815260016020522090610d47908261172a565b507f308f9f55d3eeef9e8267285607d3dde765f53e18a5cdd7ed77e21e5633a6791b848385604051610d7b93929190611827565b60405180910390a1610e36565b5f8281526001602052604090208054610da0906116a6565b159050610e36575f610db5602086018661143a565b604051610dc39291906114d5565b9081526040519081900360200190208054905f610ddf8361190e565b90915550505f828152600160205260408120610dfa91611084565b7f454f1484777e93d9fd2ad4a7fd63f5fa7a9edd73f994a2be242a7fae02c121c1848385604051610e2d93929190611827565b60405180910390a15b50505050565b5f73787fb122fc8a4b183e42e92dd48d1b52f707e0316001600160a01b031663bec4d54e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e8d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103f69190611923565b6040516338b317cf60e21b81526001600160a01b03821660048201525f9073787fb122fc8a4b183e42e92dd48d1b52f707e0319063e2cc5f3c9060240161033c565b5f81816001600160a01b038616610f0c57506003610f29565b5f196001600160a01b03871601610f2557506001610f29565b5060025b5f5b82811015610fb457816003811115610f4557610f4561124a565b6001600160a01b0388165f90815260026020526040812090888885818110610f6f57610f6f61193e565b602090810292909201358352508101919091526040015f205460ff166003811115610f9c57610f9c61124a565b14610fac575f9350505050610fbc565b600101610f2b565b506001925050505b9392505050565b60016020525f908152604090208054610fdb906116a6565b80601f0160208091040260200160405190810160405280929190818152602001828054611007906116a6565b80156110525780601f1061102957610100808354040283529160200191611052565b820191905f5260205f20905b81548152906001019060200180831161103557829003601f168201915b505050505081565b6001600160a01b0381166110815760405163140efc4d60e21b815260040160405180910390fd5b50565b508054611090906116a6565b5f825580601f1061109f575050565b601f0160209004905f5260205f209081019061108191905b808211156110ca575f81556001016110b7565b5090565b6001600160a01b0381168114611081575f5ffd5b5f602082840312156110f2575f5ffd5b8135610fbc816110ce565b62ffffff81168114611081575f5ffd5b5f6020828403121561111d575f5ffd5b8135610fbc816110fd565b68ffffffffffffffffff81168114611081575f5ffd5b5f6020828403121561114e575f5ffd5b8135610fbc81611128565b634e487b7160e01b5f52604160045260245ffd5b5f6020828403121561117d575f5ffd5b813567ffffffffffffffff811115611193575f5ffd5b8201601f810184136111a3575f5ffd5b803567ffffffffffffffff8111156111bd576111bd611159565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156111ec576111ec611159565b604052818152828201602001861015611203575f5ffd5b816020840160208301375f91810160200191909152949350505050565b5f5f60408385031215611231575f5ffd5b823561123c816110ce565b946020939093013593505050565b634e487b7160e01b5f52602160045260245ffd5b6004811061127a57634e487b7160e01b5f52602160045260245ffd5b9052565b6080810161128c828761125e565b60ff9490941660208201526001600160f81b039290921660408301526001600160a01b0316606090910152919050565b5f5f82840360a08112156112ce575f5ffd5b833567ffffffffffffffff8111156112e4575f5ffd5b8401606081870312156112f5575f5ffd5b92506080601f1982011215611308575f5ffd5b506020830190509250929050565b5f5f5f60408486031215611328575f5ffd5b8335611333816110ce565b9250602084013567ffffffffffffffff81111561134e575f5ffd5b8401601f8101861361135e575f5ffd5b803567ffffffffffffffff811115611374575f5ffd5b8660208260051b8401011115611388575f5ffd5b939660209190910195509293505050565b5f602082840312156113a9575f5ffd5b5035919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f602082840312156113f5575f5ffd5b81518015158114610fbc575f5ffd5b5f60208284031215611414575f5ffd5b8151610fbc816110ce565b5f6020828403121561142f575f5ffd5b8151610fbc816110fd565b5f5f8335601e1984360301811261144f575f5ffd5b83018035915067ffffffffffffffff821115611469575f5ffd5b60200191503681900382131561147d575f5ffd5b9250929050565b60048110611081575f5ffd5b5f602082840312156114a0575f5ffd5b8135610fbc81611484565b838582375f8482016101d160f51b8152838560028301375f93016002019283525090949350505050565b818382375f9101908152919050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b604081525f61151f6040830185876114e4565b905061152e602083018461125e565b949350505050565b6001600160f81b0381168114611081575f5ffd5b5f6020828403121561155a575f5ffd5b8135610fbc81611536565b6020810161037b828461125e565b60ff81168114611081575f5ffd5b5f60208284031215611591575f5ffd5b8135610fbc81611573565b5f813561037b81611536565b5f813561037b816110ce565b81356115bf81611484565b600481106115db57634e487b7160e01b5f52602160045260245ffd5b815460ff821691508160ff19821617835560208401356115fa81611573565b61ff008160081b168361ffff1984161717845550505061164361161f6040840161159c565b6001830180546001600160f81b0319166001600160f81b0392909216919091179055565b611676611652606084016115a8565b6002830180546001600160a01b0319166001600160a01b0392909216919091179055565b5050565b634e487b7160e01b5f52601160045260245ffd5b5f6001820161169f5761169f61167a565b5060010190565b600181811c908216806116ba57607f821691505b6020821081036116d857634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561172557805f5260205f20601f840160051c810160208510156117035750805b601f840160051c820191505b81811015611722575f815560010161170f565b50505b505050565b815167ffffffffffffffff81111561174457611744611159565b6117588161175284546116a6565b846116de565b6020601f82116001811461178a575f83156117735750848201515b5f19600385901b1c1916600184901b178455611722565b5f84815260208120601f198516915b828110156117b95787850151825560209485019460019092019101611799565b50848210156117d657868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f5f8335601e198436030181126117fa575f5ffd5b830160208101925035905067ffffffffffffffff811115611819575f5ffd5b80360382131561147d575f5ffd5b60c081525f843561183781611484565b61184460c084018261125e565b5061185260208601866117e5565b606060e0850152611868610120850182846114e4565b91505061187860408701876117e5565b84830360bf19016101008601526118908382846114e4565b935050505083602083015282356118a681611484565b6118b3604084018261125e565b5060208301356118c281611573565b60ff16606083015260408301356118d881611536565b6001600160f81b0316608083015260608301356118f4816110ce565b6001600160a01b031660a092909201919091529392505050565b5f8161191c5761191c61167a565b505f190190565b5f60208284031215611933575f5ffd5b8151610fbc81611128565b634e487b7160e01b5f52603260045260245ffdfee90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e0a26469706673582212207982f9666a07d64a98af7639c08d56957cc17e0ac70ba3c3347ba08df645c96d64736f6c634300081e0033

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.