FRAX Price: $0.99 (+2.67%)

Contract

0x787FB122fC8a4B183e42e92DD48D1b52F707e031

Overview

FRAX Balance | FXTL Balance

0 FRAX | 39,043 FXTL

FRAX Value

$0.00

Token Holdings

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Block
From
To
Change Protocol ...271730552025-10-22 18:13:4193 days ago1761156821IN
0x787FB122...2F707e031
0 FRAX0.000014330.00002086
Set Model250524752025-09-03 16:07:41143 days ago1756915661IN
0x787FB122...2F707e031
0 FRAX0.000140230.0012
Set Model250524542025-09-03 16:06:59143 days ago1756915619IN
0x787FB122...2F707e031
0 FRAX0.0001480.0012
Set Model250524442025-09-03 16:06:39143 days ago1756915599IN
0x787FB122...2F707e031
0 FRAX0.000152380.001199
Set Model250524352025-09-03 16:06:21143 days ago1756915581IN
0x787FB122...2F707e031
0 FRAX0.000153460.00119825
Set Model250524072025-09-03 16:05:25143 days ago1756915525IN
0x787FB122...2F707e031
0 FRAX0.0001730.00119925
Set Model250523832025-09-03 16:04:37143 days ago1756915477IN
0x787FB122...2F707e031
0 FRAX0.000173290.00119925
Set Model250523562025-09-03 16:03:43143 days ago1756915423IN
0x787FB122...2F707e031
0 FRAX0.000155170.0012
Set Model250522832025-09-03 16:01:17143 days ago1756915277IN
0x787FB122...2F707e031
0 FRAX0.000156170.0011
Whitelist Token239776112025-08-09 18:58:53167 days ago1754765933IN
0x787FB122...2F707e031
0 FRAX0.000055650.0012
Whitelist Token239775972025-08-09 18:58:25167 days ago1754765905IN
0x787FB122...2F707e031
0 FRAX0.000056040.0012
Whitelist Token239775812025-08-09 18:57:53167 days ago1754765873IN
0x787FB122...2F707e031
0 FRAX0.000050180.0012
Whitelist Token239775652025-08-09 18:57:21167 days ago1754765841IN
0x787FB122...2F707e031
0 FRAX0.00004810.001125
Whitelist Token239775032025-08-09 18:55:17167 days ago1754765717IN
0x787FB122...2F707e031
0 FRAX0.000045020.001
Whitelist Token239774772025-08-09 18:54:25167 days ago1754765665IN
0x787FB122...2F707e031
0 FRAX0.000044630.00100025
Change Protocol ...214250302025-06-11 16:52:51226 days ago1749660771IN
0x787FB122...2F707e031
0 FRAX0.000387180.00100025
Whitelist Token214250302025-06-11 16:52:51226 days ago1749660771IN
0x787FB122...2F707e031
0 FRAX0.00038720.00100025
Whitelist Token214250302025-06-11 16:52:51226 days ago1749660771IN
0x787FB122...2F707e031
0 FRAX0.00038720.00100025
Whitelist Token214250302025-06-11 16:52:51226 days ago1749660771IN
0x787FB122...2F707e031
0 FRAX0.00038720.00100025
Whitelist Token214250302025-06-11 16:52:51226 days ago1749660771IN
0x787FB122...2F707e031
0 FRAX0.00038720.00100025

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:
prague EvmVersion
// SPDX-License-Identifier: MIT
pragma solidity 0.8.30;

// ███████╗ ██████╗██╗  ██╗ ██████╗   ███╗   ███╗ █████╗ ██████╗ ██╗  ██╗███████╗████████╗
// ██╔════╝██╔════╝██║  ██║██╔═══██╗  ████╗ ████║██╔══██╗██╔══██╗██║ ██╔╝██╔════╝╚══██╔══╝
// █████╗  ██║     ███████║██║   ██║  ██╔████╔██║███████║██████╔╝█████╔╝ █████╗     ██║
// ██╔══╝  ██║     ██╔══██║██║   ██║  ██║╚██╔╝██║██╔══██║██╔══██╗██╔═██╗ ██╔══╝     ██║
// ███████╗╚██████╗██║  ██║╚██████╔╝  ██║ ╚═╝ ██║██║  ██║██║  ██║██║  ██╗███████╗   ██║
// ╚══════╝ ╚═════╝╚═╝  ╚═╝ ╚═════╝   ╚═╝     ╚═╝╚═╝  ╚═╝╚═╝  ╚═╝╚═╝  ╚═╝╚══════╝   ╚═╝
// =========================== EchoAdministration V1 =================================
// =================================== Spring 2025 ===================================

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

/// @title Echo Administration contract
/// @author Dynabits.org
contract EchoAdministration is IEchoAdministration {
    /********************************\
    |-*-*-*-*-*   STATES   *-*-*-*-*-|
    \********************************/
    uint24 public campaignFeeRate; // 0 < x < 1e5
    uint72 public maxCampaignTime;
    address public protocolAdmin;
    mapping(address => bool) public whitelistedToken; // address => true
    mapping(address => bool) public disallowedOracle; // address => true
    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) }

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

    /********************************\
    |-*-*-*-*-*   ERRORS   *-*-*-*-*-|
    \********************************/
    error ONLY_PROTOCOL_ADMIN();
    error ZERO_ADDRESS_PROVIDED();
    error TOKEN_WHITELISTED_BEFORE();
    error TOKEN_DOESNT_EXIST();
    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 FEE_RATE_MUST_BE_BETWEEN_0_TO_1E5(uint256 givenFee);
    error ZERO_SOCIAL_KPI_PROVIDED();

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

    /******************************\
    |-*-*-*-*   BUILT-IN   *-*-*-*-|
    \******************************/
    constructor(
        address protocolAdmin_,
        address echoOracle,
        uint248[8] memory oracleFees,
        uint8[6] memory xKPIsRatio
    ) {
        _revertZeroAddress(protocolAdmin_);
        _revertZeroAddress(echoOracle);

        protocolAdmin = protocolAdmin_;

        bytes32[] memory actionToKind = new bytes32[](11);

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

        totalKindMethods["QA-AI"] = 2;
        actionToKind[3] = keccak256(
            abi.encodePacked("QA-AI: Relevance And Alignment")
        );
        actionToKind[4] = keccak256(
            abi.encodePacked("QA-AI: Accuracy And Credibility")
        );
        modelData[echoOracle][actionToKind[3]] = ModelData(
            ActionStatus.QA,
            0,
            oracleFees[0],
            address(0)
        );
        modelData[echoOracle][actionToKind[4]] = ModelData(
            ActionStatus.QA,
            0,
            oracleFees[1],
            address(0)
        );

        totalKindMethods["X"] = 6;
        actionToKind[5] = keccak256(abi.encodePacked("X: Like"));
        actionToKind[6] = keccak256(abi.encodePacked("X: Quote"));
        actionToKind[7] = keccak256(abi.encodePacked("X: Reply"));
        actionToKind[8] = keccak256(abi.encodePacked("X: Retweet"));
        actionToKind[9] = keccak256(abi.encodePacked("X: Bookmark"));
        actionToKind[10] = keccak256(abi.encodePacked("X: Impression"));

        modelData[address(0)][actionToKind[5]] = ModelData(
            ActionStatus.KPI,
            xKPIsRatio[0],
            oracleFees[2],
            echoOracle
        );
        modelData[address(0)][actionToKind[6]] = ModelData(
            ActionStatus.KPI,
            xKPIsRatio[1],
            oracleFees[3],
            echoOracle
        );
        modelData[address(0)][actionToKind[7]] = ModelData(
            ActionStatus.KPI,
            xKPIsRatio[2],
            oracleFees[4],
            echoOracle
        );
        modelData[address(0)][actionToKind[8]] = ModelData(
            ActionStatus.KPI,
            xKPIsRatio[3],
            oracleFees[5],
            echoOracle
        );
        modelData[address(0)][actionToKind[9]] = ModelData(
            ActionStatus.KPI,
            xKPIsRatio[4],
            oracleFees[6],
            echoOracle
        );
        modelData[address(0)][actionToKind[10]] = ModelData(
            ActionStatus.KPI,
            xKPIsRatio[5],
            oracleFees[7],
            echoOracle
        );

        maxCampaignTime = 30 days;

        emit maxCampaignTimeChanged(0, 30 days);
        emit ProtocolAdminChanged(address(0), protocolAdmin_);
    }

    /********************************\
    |-*-*-*   ADMINISTRATION   *-*-*-|
    \********************************/
    /// @inheritdoc IEchoAdministration
    function changeProtocolAdmin(
        address newProtocolAdmin
    ) external onlyProtocolAdmin {
        _revertZeroAddress(newProtocolAdmin);

        emit ProtocolAdminChanged(protocolAdmin, newProtocolAdmin);

        protocolAdmin = newProtocolAdmin;
    }

    /// @inheritdoc IEchoAdministration
    function changeCampaignFeeRate(
        uint24 newCampaignFeeRate
    ) external onlyProtocolAdmin {
        if (newCampaignFeeRate == 0 || newCampaignFeeRate >= 1e5)
            revert FEE_RATE_MUST_BE_BETWEEN_0_TO_1E5(newCampaignFeeRate);

        emit CampaignFeeRateChanged(campaignFeeRate, newCampaignFeeRate);

        campaignFeeRate = newCampaignFeeRate;
    }

    /// @inheritdoc IEchoAdministration
    function setMaxCampaignTime(
        uint72 newMaxCampaignTime
    ) external onlyProtocolAdmin {
        emit maxCampaignTimeChanged(maxCampaignTime, newMaxCampaignTime);

        if (newMaxCampaignTime == 0) delete maxCampaignTime;
        maxCampaignTime = newMaxCampaignTime;
    }

    /// @inheritdoc IEchoAdministration
    function whitelistToken(address token) external onlyProtocolAdmin {
        _revertZeroAddress(token);
        if (whitelistedToken[token]) revert TOKEN_WHITELISTED_BEFORE();

        whitelistedToken[token] = true;

        emit TokenWhitelisted(token);
    }

    /// @inheritdoc IEchoAdministration
    function removeWhitelistedToken(address token) external onlyProtocolAdmin {
        _revertZeroAddress(token);
        if (!whitelistedToken[token]) revert TOKEN_DOESNT_EXIST();

        delete whitelistedToken[token];

        emit TokenRemoved(token);
    }

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

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

    /// @inheritdoc IEchoAdministration
    function setModel(
        ActionAndKind calldata actionAndKind,
        ModelData memory 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;

        // Assign the provided actionStatus to the corresponding model data
        modelData[model.oracle][hashedActionKind].actionStatus = model
            .actionStatus;

        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;
                modelData[model.oracle][hashedActionKind].fee = model.fee;
            } else delete modelData[model.oracle][hashedActionKind];
        } else if (model.actionStatus == ActionStatus.KPI) {
            // Validate that the action corresponds to KPI
            if (
                keccak256(abi.encodePacked(actionAndKind.action)) !=
                keccak256(abi.encodePacked("KPI"))
            )
                revert NOT_RELATIVE_ACTION(
                    actionAndKind.action,
                    ActionStatus.KPI
                );

            // If oracle address is zero, remove the KPI mapping; otherwise, update the KPI model
            if (model.oracle == address(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();
                if (model.fee == 0) revert ZERO_FEE_PROVIDED(ActionStatus.KPI);

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

                modelData[address(0)][hashedActionKind].socialKPIratio = model
                    .socialKPIratio;
                modelData[address(0)][hashedActionKind].fee = model.fee;
                modelData[address(0)][hashedActionKind].oracle = model.oracle;
            }
        } 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 oracle address is zero, remove the CONFIG mapping; otherwise, update the oracle
            if (model.oracle == address(0))
                delete modelData[address(1)][hashedActionKind];
            else {
                if (
                    modelData[address(1)][hashedActionKind].oracle == address(0)
                ) increaseTotalKinds = true;

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

        // Emit appropriate events based on whether an oracle is provided
        if (model.oracle != address(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);
            }
        }
    }

    /*****************************\
    |-*-*-*-*   GETTERS   *-*-*-*-|
    \*****************************/
    /// @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;
    }

    /*****************************\
    |-*-*-*-*   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 memory 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/"
  ],
  "evmVersion": "prague"
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"protocolAdmin_","type":"address"},{"internalType":"address","name":"echoOracle","type":"address"},{"internalType":"uint248[8]","name":"oracleFees","type":"uint248[8]"},{"internalType":"uint8[6]","name":"xKPIsRatio","type":"uint8[6]"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"EMPTY_ACTION_OR_KIND_PROVIDED","type":"error"},{"inputs":[{"internalType":"uint256","name":"givenFee","type":"uint256"}],"name":"FEE_RATE_MUST_BE_BETWEEN_0_TO_1E5","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":"TOKEN_DOESNT_EXIST","type":"error"},{"inputs":[],"name":"TOKEN_WHITELISTED_BEFORE","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":[{"indexed":true,"internalType":"uint256","name":"lastCampaignFeeRate","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"CampaignFeeRate","type":"uint256"}],"name":"CampaignFeeRateChanged","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":"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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oracle","type":"address"},{"indexed":false,"internalType":"bool","name":"isFullAccessRestricted","type":"bool"}],"name":"OracleFullAccessChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"lastImplementation","type":"address"},{"indexed":true,"internalType":"address","name":"newImplementation","type":"address"}],"name":"ProtocolAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"}],"name":"TokenRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"}],"name":"TokenWhitelisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"lastMaxCampaignTime","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"maxCampaignTime","type":"uint256"}],"name":"maxCampaignTimeChanged","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":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newProtocolAdmin","type":"address"}],"name":"changeProtocolAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","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":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint72","name":"newMaxCampaignTime","type":"uint72"}],"name":"setMaxCampaignTime","outputs":[],"stateMutability":"nonpayable","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":"nonpayable","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":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistedToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

608060405234801561000f575f5ffd5b50604051612da0380380612da083398101604081905261002e91611208565b6100378461112a565b6100408361112a565b5f80546001600160601b03166c010000000000000000000000006001600160a01b0387160217815560408051600b80825261018082019092529060208201610160803683370190505090506003806040516100a79065434f4e46494760d01b815260060190565b9081526020016040518091039020819055506040516020016100ec907f434f4e4649473a20417574686f7257616c6c6574000000000000000000000000815260140190565b60405160208183030381529060405280519060200120815f81518110610114576101146112b0565b602002602001018181525050604051602001610147907010d3d3919251ce88105d5d1a1bdc961251607a1b815260110190565b6040516020818303038152906040528051906020012081600181518110610170576101706112b0565b6020026020010181815250506040516020016101a3907021a7a72324a39d102334b730b634bd32b960791b815260110190565b60405160208183030381529060405280519060200120816002815181106101cc576101cc6112b0565b6020908102919091018101919091526040805160808101825260018082525f8285018190529282018390526001600160a01b03881660608301528252600590925282515f516020612d605f395f51905f5291908490829061022f5761022f6112b0565b60209081029190910181015182528101919091526040015f2081518154829060ff19166001836003811115610266576102666112c4565b0217905550602082810151825461ff00191661010060ff90921691909102178255604080840151600180850180546001600160f81b0319166001600160f81b0390931692909217909155606094850151600290940180546001600160a01b0319166001600160a01b0395861617905581516080810183528181525f818501819052928101839052938916948401949094528381526005909152835191925f516020612d605f395f51905f52928591908110610323576103236112b0565b60209081029190910181015182528101919091526040015f2081518154829060ff1916600183600381111561035a5761035a6112c4565b0217905550602082810151825461ff00191661010060ff90921691909102178255604080840151600180850180546001600160f81b0319166001600160f81b0390931692909217909155606094850151600294850180546001600160a01b0319166001600160a01b0392831617905582516080810184528281525f818601819052938101849052908a16958101959095528152600590915283515f516020612d605f395f51905f529285918110610413576104136112b0565b60209081029190910181015182528101919091526040015f2081518154829060ff1916600183600381111561044a5761044a6112c4565b0217905550602082810151825460ff9091166101000261ff00199091161782556040808401516001840180546001600160f81b039092166001600160f81b0319909216919091179055606090930151600292830180546001600160a01b039092166001600160a01b031990921691909117905582516451412d414960d81b8152600360058201529251928390036025018320919091557f51412d41493a2052656c6576616e636520416e6420416c69676e6d656e74000090820152603e016040516020818303038152906040528051906020012081600381518110610531576105316112b0565b602002602001018181525050604051602001610570907f51412d41493a20416363757261637920416e6420437265646962696c697479008152601f0190565b6040516020818303038152906040528051906020012081600481518110610599576105996112b0565b6020908102919091010152604080516080810190915280600281526020015f60ff168152602001845f600881106105d2576105d26112b0565b60200201516001600160f81b031681526020015f6001600160a01b031681525060055f866001600160a01b03166001600160a01b031681526020019081526020015f205f83600381518110610629576106296112b0565b60209081029190910181015182528101919091526040015f2081518154829060ff19166001836003811115610660576106606112c4565b0217905550602082810151825461ff00191661010060ff909216919091021782556040808401516001840180546001600160f81b0319166001600160f81b03928316179055606094850151600294850180546001600160a01b0319166001600160a01b0392831617905582516080810184529485525f858501819052898501519092168584015294840181905293881684526005909152822083519192909184906004908110610712576107126112b0565b60209081029190910181015182528101919091526040015f2081518154829060ff19166001836003811115610749576107496112c4565b02179055506020820151815461ff00191661010060ff90921691909102178155604080830151600180840180546001600160f81b0319166001600160f81b0390931692909217909155606090930151600290920180546001600160a01b0319166001600160a01b039093169290921790915551600b60fb1b8152600691600391019081526020016040518091039020819055506040516020016107f99066583a204c696b6560c81b815260070190565b6040516020818303038152906040528051906020012081600581518110610822576108226112b0565b60200260200101818152505060405160200161084c9067583a2051756f746560c01b815260080190565b6040516020818303038152906040528051906020012081600681518110610875576108756112b0565b60200260200101818152505060405160200161089f9067583a205265706c7960c01b815260080190565b60405160208183030381529060405280519060200120816007815181106108c8576108c86112b0565b6020026020010181815250506040516020016108f49069160e8814995d1dd9595d60b21b8152600a0190565b604051602081830303815290604052805190602001208160088151811061091d5761091d6112b0565b60200260200101818152505060405160200161094a906a583a20426f6f6b6d61726b60a81b8152600b0190565b6040516020818303038152906040528051906020012081600981518110610973576109736112b0565b6020026020010181815250506040516020016109a2906c2c1d1024b6b83932b9b9b4b7b760991b8152600d0190565b6040516020818303038152906040528051906020012081600a815181106109cb576109cb6112b0565b6020908102919091018101919091526040805160808101825260038152845160ff1681840152858201516001600160f81b0316918101919091526001600160a01b03861660608201525f808052600592839052835191925f516020612d805f395f51905f52928591908110610a4257610a426112b0565b60209081029190910181015182528101919091526040015f2081518154829060ff19166001836003811115610a7957610a796112c4565b02179055506020820151815461ff00191661010060ff909216919091021781556040808301516001830180546001600160f81b0319166001600160f81b03909216919091179055606090920151600290910180546001600160a01b0319166001600160a01b039092169190911790558051608081019091528060038152602001836001602002015160ff16815260200184600360088110610b1c57610b1c6112b0565b60200201516001600160f81b03168152602001856001600160a01b031681525060055f5f6001600160a01b03166001600160a01b031681526020019081526020015f205f83600681518110610b7357610b736112b0565b60209081029190910181015182528101919091526040015f2081518154829060ff19166001836003811115610baa57610baa6112c4565b02179055506020820151815461ff00191661010060ff909216919091021781556040808301516001830180546001600160f81b0319166001600160f81b03909216919091179055606090920151600290910180546001600160a01b0319166001600160a01b039092169190911790558051608081019091528060038152602001836002602002015160ff16815260200184600460088110610c4d57610c4d6112b0565b60200201516001600160f81b03168152602001856001600160a01b031681525060055f5f6001600160a01b03166001600160a01b031681526020019081526020015f205f83600781518110610ca457610ca46112b0565b60209081029190910181015182528101919091526040015f2081518154829060ff19166001836003811115610cdb57610cdb6112c4565b0217905550602082810151825461ff00191661010060ff928316021783556040808501516001850180546001600160f81b0319166001600160f81b03928316179055606095860151600290950180546001600160a01b0319166001600160a01b03968716179055815160808101835260038152888701519093168385015260a08901511690820152918716928201929092525f8080526005909252825190915f516020612d805f395f51905f529184906008908110610d9c57610d9c6112b0565b60209081029190910181015182528101919091526040015f2081518154829060ff19166001836003811115610dd357610dd36112c4565b02179055506020820151815461ff00191661010060ff909216919091021781556040808301516001830180546001600160f81b0319166001600160f81b03909216919091179055606090920151600290910180546001600160a01b0319166001600160a01b039092169190911790558051608081019091528060038152602001836004602002015160ff16815260200184600660088110610e7657610e766112b0565b60200201516001600160f81b03168152602001856001600160a01b031681525060055f5f6001600160a01b03166001600160a01b031681526020019081526020015f205f83600981518110610ecd57610ecd6112b0565b60209081029190910181015182528101919091526040015f2081518154829060ff19166001836003811115610f0457610f046112c4565b02179055506020820151815461ff00191661010060ff909216919091021781556040808301516001830180546001600160f81b0319166001600160f81b03909216919091179055606090920151600290910180546001600160a01b0319166001600160a01b039092169190911790558051608081019091528060038152602001836005602002015160ff16815260200184600760088110610fa757610fa76112b0565b60200201516001600160f81b03168152602001856001600160a01b031681525060055f5f6001600160a01b03166001600160a01b031681526020019081526020015f205f83600a81518110610ffe57610ffe6112b0565b60209081029190910181015182528101919091526040015f2081518154829060ff19166001836003811115611035576110356112c4565b02179055506020820151815461ff00191661010060ff909216919091021781556040808301516001830180546001600160f81b0319166001600160f81b03909216919091179055606090920151600290910180546001600160a01b0319166001600160a01b039092169190911790555f80546301000000600160601b03191665278d00000000178155905162278d0091907fa7c1bd327e8be88867bc448d3515e6ed0e18d8e45e6916470fe3154fc21efa88908290a36040516001600160a01b038616905f907fc9e04b1ee54ac63d006722bdd59e0528d42e84263db6a5171b1cfe1bf6cd10d7908290a350505050506112d8565b6001600160a01b0381166111515760405163140efc4d60e21b815260040160405180910390fd5b50565b80516001600160a01b038116811461116a575f5ffd5b919050565b604051601f8201601f191681016001600160401b03811182821017156111a357634e487b7160e01b5f52604160045260245ffd5b604052919050565b5f82601f8301126111ba575f5ffd5b6111c460c061116f565b8060c08401858111156111d5575f5ffd5b845b818110156111fd57805160ff811681146111ef575f5ffd5b8452602093840193016111d7565b509095945050505050565b5f5f5f5f610200858703121561121c575f5ffd5b61122585611154565b935061123360208601611154565b925085605f860112611243575f5ffd5b61010061124f8161116f565b905080610140870188811115611263575f5ffd5b604088015b818110156112945780516001600160f81b0381168114611286575f5ffd5b845260209384019301611268565b508194506112a289826111ab565b935050505092959194509250565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b611a7b806112e55f395ff3fe608060405234801561000f575f5ffd5b50600436106100fb575f3560e01c8063911cf01411610093578063bec4d54e11610063578063bec4d54e146102b0578063e2cc5f3c146102e5578063e6e2be1614610307578063f33bd5be1461031a575f5ffd5b8063911cf014146101ea578063aa79b74114610223578063b6001e2414610236578063b82f038e1461029d575f5ffd5b8063531280c1116100ce578063531280c11461018f5780636247f6f2146101a25780636c8709ab146101b55780638ddc321f146101c8575f5ffd5b80631c88705d146100ff5780632ac1326b14610114578063420f68611461014b57806344c43a7d1461017c575b5f5ffd5b61011261010d36600461133c565b61033a565b005b61013661012236600461133c565b60026020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b5f5461016490600160601b90046001600160a01b031681565b6040516001600160a01b039091168152602001610142565b61011261018a36600461133c565b6103f4565b61011261019d366004611355565b610499565b6101126101b036600461133c565b61055b565b6101126101c3366004611377565b61061c565b5f546101d69062ffffff1681565b60405162ffffff9091168152602001610142565b6102156101f836600461140d565b805160208183018101805160038252928201919093012091525481565b604051908152602001610142565b61011261023136600461133c565b6106e4565b61028d6102443660046114a1565b600560209081525f928352604080842090915290825290208054600182015460029092015460ff8083169361010090930416916001600160f81b0316906001600160a01b031684565b60405161014294939291906114fd565b6101126102ab366004611549565b610788565b5f546102cb906301000000900468ffffffffffffffffff1681565b60405168ffffffffffffffffff9091168152602001610142565b6101366102f336600461133c565b60016020525f908152604090205460ff1681565b6101366103153660046115fe565b611146565b61032d61032836600461167f565b611216565b6040516101429190611696565b5f54600160601b90046001600160a01b0316331461036b576040516315cead3960e31b815260040160405180910390fd5b610374816112ad565b6001600160a01b0381165f9081526001602052604090205460ff166103ac57604051631f0f181560e21b815260040160405180910390fd5b6001600160a01b0381165f81815260016020526040808220805460ff19169055517f4c910b69fe65a61f7531b9c5042b2329ca7179c77290aa7e2eb3afa3c8511fd39190a250565b5f54600160601b90046001600160a01b03163314610425576040516315cead3960e31b815260040160405180910390fd5b61042e816112ad565b5f80546040516001600160a01b0380851693600160601b90930416917fc9e04b1ee54ac63d006722bdd59e0528d42e84263db6a5171b1cfe1bf6cd10d791a35f80546001600160a01b03909216600160601b026bffffffffffffffffffffffff909216919091179055565b5f54600160601b90046001600160a01b031633146104ca576040516315cead3960e31b815260040160405180910390fd5b62ffffff811615806104e45750620186a08162ffffff1610155b1561050e5760405163284b4c2f60e21b815262ffffff821660048201526024015b60405180910390fd5b5f805460405162ffffff808516939216917f493b9175b319f03f13b1025a4b52f390ab35b9d6f59b4f143f5967800961128e91a35f805462ffffff191662ffffff92909216919091179055565b5f54600160601b90046001600160a01b0316331461058c576040516315cead3960e31b815260040160405180910390fd5b610595816112ad565b6001600160a01b0381165f9081526001602052604090205460ff16156105ce57604051631a36501760e11b815260040160405180910390fd5b6001600160a01b0381165f818152600160208190526040808320805460ff1916909217909155517f6a65f90b1a644d2faac467a21e07e50e3f8fa5846e26231d30ae79a417d3d2629190a250565b5f54600160601b90046001600160a01b0316331461064d576040516315cead3960e31b815260040160405180910390fd5b5f805460405168ffffffffffffffffff80851693630100000090930416917fa7c1bd327e8be88867bc448d3515e6ed0e18d8e45e6916470fe3154fc21efa8891a38068ffffffffffffffffff165f036106b5575f80546bffffffffffffffffff000000191690555b5f805468ffffffffffffffffff9092166301000000026bffffffffffffffffff00000019909216919091179055565b5f54600160601b90046001600160a01b03163314610715576040516315cead3960e31b815260040160405180910390fd5b61071e816112ad565b6001600160a01b0381165f8181526002602052604090819020805460ff19811660ff9182161590811790925591517f3f7458521a03f141ff7274c8443bb095d3a975ed688d1a980f8a58510c29a0c79261077d92161515815260200190565b60405180910390a250565b5f54600160601b90046001600160a01b031633146107b9576040516315cead3960e31b815260040160405180910390fd5b6107c660208301836116cb565b159050806107e057506107dc60408301836116cb565b1590505b156107fe57604051630a8bf2b760e11b815260040160405180910390fd5b5f81516003811115610812576108126114c9565b0361083057604051631e719f3360e01b815260040160405180910390fd5b5f61083e60208401846116cb565b61084b60408601866116cb565b60405160200161085e9493929190611715565b60408051601f198184030181529181528151602092830120845160608601516001600160a01b03165f9081526005855283812083825290945291832080549194509060ff191660018360038111156108b8576108b86114c9565b02179055506002835160038111156108d2576108d26114c9565b03610bc2576040516451412d414960d81b60208201526025016040516020818303038152906040528051906020012084806020019061091191906116cb565b60405160200161092292919061173f565b60405160208183030381529060405280519060200120141580156109a457506040516351412d4360e01b60208201526024016040516020818303038152906040528051906020012084806020019061097a91906116cb565b60405160200161098b92919061173f565b6040516020818303038152906040528051906020012014155b8015610a0e57506040516328a096ab60e11b6020820152602401604051602081830303815290604052805190602001208480602001906109e491906116cb565b6040516020016109f592919061173f565b6040516020818303038152906040528051906020012014155b15610a3e57610a2060208501856116cb565b600260405163222a151760e11b815260040161050593929190611776565b60408301516001600160f81b031615801590610a65575060608301516001600160a01b0316155b15610a8357604051630e84ae9360e21b815260040160405180910390fd5b60408301516001600160f81b0316158015610aaa575060608301516001600160a01b031615155b15610acb57600260405163d5ff172960e01b815260040161050591906117a0565b60408301516001600160f81b031615610b6b5760608301516001600160a01b03165f9081526005602090815260408083208584529091528120600101546001600160f81b03169003610b1b575060015b60408381015160608501516001600160a01b03165f9081526005602090815283822086835290529190912060010180546001600160f81b0319166001600160f81b03909216919091179055610fa6565b60608301516001600160a01b03165f9081526005602090815260408083208584529091529020805461ffff191681556001810180546001600160f81b031916905560020180546001600160a01b0319169055610fa6565b600383516003811115610bd757610bd76114c9565b03610e1257604051624b504960e81b602082015260230160405160208183030381529060405280519060200120848060200190610c1491906116cb565b604051602001610c2592919061173f565b6040516020818303038152906040528051906020012014610c6b57610c4d60208501856116cb565b600360405163222a151760e11b815260040161050593929190611776565b60608301516001600160a01b0316610cda575f8281527f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc60205260409020805461ffff191681556001810180546001600160f81b031916905560020180546001600160a01b0319169055610fa6565b826020015160ff165f03610d0157604051636ab3f8d560e11b815260040160405180910390fd5b82604001516001600160f81b03165f03610d3157600360405163d5ff172960e01b815260040161050591906117a0565b5f8281527f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc60205260408120600101546001600160f81b03169003610d74575060015b6020838101515f8481527f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc909252604091829020805461ff00191661010060ff90931692909202919091178155908401516001820180546001600160f81b0319166001600160f81b039092169190911790556060840151600290910180546001600160a01b0319166001600160a01b03909216919091179055610fa6565b60405165434f4e46494760d01b602082015260260160405160208183030381529060405280519060200120848060200190610e4d91906116cb565b604051602001610e5e92919061173f565b6040516020818303038152906040528051906020012014610ea457610e8660208501856116cb565b600160405163222a151760e11b815260040161050593929190611776565b60608301516001600160a01b0316610f13575f8281527f1471eb6eb2c5e789fc3de43f8ce62938c7d1836ec861730447e2ada8fd81017b60205260409020805461ffff191681556001810180546001600160f81b031916905560020180546001600160a01b0319169055610fa6565b5f8281527f1471eb6eb2c5e789fc3de43f8ce62938c7d1836ec861730447e2ada8fd81017b60205260409020600201546001600160a01b0316610f54575060015b60608301515f8381527f1471eb6eb2c5e789fc3de43f8ce62938c7d1836ec861730447e2ada8fd81017b6020526040902060020180546001600160a01b0319166001600160a01b039092169190911790555b60608301516001600160a01b031615611091578015610ffe576003610fce60208601866116cb565b604051610fdc92919061173f565b9081526040519081900360200190208054905f610ff8836117c8565b91905055505b61100b60208501856116cb565b61101860408701876116cb565b60405160200161102b9493929190611715565b60408051601f198184030181529181525f848152600460205220906110509082611864565b507f308f9f55d3eeef9e8267285607d3dde765f53e18a5cdd7ed77e21e5633a6791b84838560405161108493929190611961565b60405180910390a1611140565b5f82815260046020526040902080546110a9906117e0565b1590506111405760036110bf60208601866116cb565b6040516110cd92919061173f565b9081526040519081900360200190208054905f6110e983611a1c565b90915550505f828152600460205260408120611104916112d7565b7f454f1484777e93d9fd2ad4a7fd63f5fa7a9edd73f994a2be242a7fae02c121c184838560405161113793929190611961565b60405180910390a15b50505050565b5f81816001600160a01b03861661115f5750600361117c565b5f196001600160a01b038716016111785750600161117c565b5060025b5f5b8281101561120757816003811115611198576111986114c9565b6001600160a01b0388165f908152600560205260408120908888858181106111c2576111c2611a31565b602090810292909201358352508101919091526040015f205460ff1660038111156111ef576111ef6114c9565b146111ff575f935050505061120f565b60010161117e565b506001925050505b9392505050565b60046020525f90815260409020805461122e906117e0565b80601f016020809104026020016040519081016040528092919081815260200182805461125a906117e0565b80156112a55780601f1061127c576101008083540402835291602001916112a5565b820191905f5260205f20905b81548152906001019060200180831161128857829003601f168201915b505050505081565b6001600160a01b0381166112d45760405163140efc4d60e21b815260040160405180910390fd5b50565b5080546112e3906117e0565b5f825580601f106112f2575050565b601f0160209004905f5260205f20908101906112d491905b8082111561131d575f815560010161130a565b5090565b80356001600160a01b0381168114611337575f5ffd5b919050565b5f6020828403121561134c575f5ffd5b61120f82611321565b5f60208284031215611365575f5ffd5b813562ffffff8116811461120f575f5ffd5b5f60208284031215611387575f5ffd5b813568ffffffffffffffffff8116811461120f575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b6040516080810167ffffffffffffffff811182821017156113d6576113d661139f565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156114055761140561139f565b604052919050565b5f6020828403121561141d575f5ffd5b813567ffffffffffffffff811115611433575f5ffd5b8201601f81018413611443575f5ffd5b803567ffffffffffffffff81111561145d5761145d61139f565b611470601f8201601f19166020016113dc565b818152856020838501011115611484575f5ffd5b816020840160208301375f91810160200191909152949350505050565b5f5f604083850312156114b2575f5ffd5b6114bb83611321565b946020939093013593505050565b634e487b7160e01b5f52602160045260245ffd5b600481106114f957634e487b7160e01b5f52602160045260245ffd5b9052565b6080810161150b82876114dd565b60ff9490941660208201526001600160f81b039290921660408301526001600160a01b0316606090910152919050565b803560048110611337575f5ffd5b5f5f82840360a081121561155b575f5ffd5b833567ffffffffffffffff811115611571575f5ffd5b840160608187031215611582575f5ffd5b92506080601f1982011215611595575f5ffd5b5061159e6113b3565b6115aa6020850161153b565b8152604084013560ff811681146115bf575f5ffd5b602082015260608401356001600160f81b03811681146115dd575f5ffd5b60408201526115ee60808501611321565b6060820152809150509250929050565b5f5f5f60408486031215611610575f5ffd5b61161984611321565b9250602084013567ffffffffffffffff811115611634575f5ffd5b8401601f81018613611644575f5ffd5b803567ffffffffffffffff81111561165a575f5ffd5b8660208260051b840101111561166e575f5ffd5b939660209190910195509293505050565b5f6020828403121561168f575f5ffd5b5035919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f8335601e198436030181126116e0575f5ffd5b83018035915067ffffffffffffffff8211156116fa575f5ffd5b60200191503681900382131561170e575f5ffd5b9250929050565b838582375f8482016101d160f51b8152838560028301375f93016002019283525090949350505050565b818382375f9101908152919050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b604081525f61178960408301858761174e565b905061179860208301846114dd565b949350505050565b602081016117ae82846114dd565b92915050565b634e487b7160e01b5f52601160045260245ffd5b5f600182016117d9576117d96117b4565b5060010190565b600181811c908216806117f457607f821691505b60208210810361181257634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561185f57805f5260205f20601f840160051c8101602085101561183d5750805b601f840160051c820191505b8181101561185c575f8155600101611849565b50505b505050565b815167ffffffffffffffff81111561187e5761187e61139f565b6118928161188c84546117e0565b84611818565b6020601f8211600181146118c4575f83156118ad5750848201515b5f19600385901b1c1916600184901b17845561185c565b5f84815260208120601f198516915b828110156118f357878501518255602094850194600190920191016118d3565b508482101561191057868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f5f8335601e19843603018112611934575f5ffd5b830160208101925035905067ffffffffffffffff811115611953575f5ffd5b80360382131561170e575f5ffd5b60c0815261197a60c082016119758661153b565b6114dd565b5f611988602086018661191f565b606060e085015261199e6101208501828461174e565b9150506119ae604087018761191f565b84830360bf19016101008601526119c683828461174e565b93505050508360208301526119df6040830184516114dd565b602083015160ff1660608381019190915260408401516001600160f81b03166080840152909201516001600160a01b031660a09091015292915050565b5f81611a2a57611a2a6117b4565b505f190190565b634e487b7160e01b5f52603260045260245ffdfea2646970667358221220bbd13e299624d41ffda2bce0ba16c1372fd7c104fb546b34743a5dfaa8a012af64736f6c634300081e00331471eb6eb2c5e789fc3de43f8ce62938c7d1836ec861730447e2ada8fd81017b05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc000000000000000000000000c2f8d4b61e078160630b6c93c5c51ec6f8304e26000000000000000000000000ec051bb8876e78ba6a24e03cb07fbe1259e44c4700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000001

Deployed Bytecode

0x608060405234801561000f575f5ffd5b50600436106100fb575f3560e01c8063911cf01411610093578063bec4d54e11610063578063bec4d54e146102b0578063e2cc5f3c146102e5578063e6e2be1614610307578063f33bd5be1461031a575f5ffd5b8063911cf014146101ea578063aa79b74114610223578063b6001e2414610236578063b82f038e1461029d575f5ffd5b8063531280c1116100ce578063531280c11461018f5780636247f6f2146101a25780636c8709ab146101b55780638ddc321f146101c8575f5ffd5b80631c88705d146100ff5780632ac1326b14610114578063420f68611461014b57806344c43a7d1461017c575b5f5ffd5b61011261010d36600461133c565b61033a565b005b61013661012236600461133c565b60026020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b5f5461016490600160601b90046001600160a01b031681565b6040516001600160a01b039091168152602001610142565b61011261018a36600461133c565b6103f4565b61011261019d366004611355565b610499565b6101126101b036600461133c565b61055b565b6101126101c3366004611377565b61061c565b5f546101d69062ffffff1681565b60405162ffffff9091168152602001610142565b6102156101f836600461140d565b805160208183018101805160038252928201919093012091525481565b604051908152602001610142565b61011261023136600461133c565b6106e4565b61028d6102443660046114a1565b600560209081525f928352604080842090915290825290208054600182015460029092015460ff8083169361010090930416916001600160f81b0316906001600160a01b031684565b60405161014294939291906114fd565b6101126102ab366004611549565b610788565b5f546102cb906301000000900468ffffffffffffffffff1681565b60405168ffffffffffffffffff9091168152602001610142565b6101366102f336600461133c565b60016020525f908152604090205460ff1681565b6101366103153660046115fe565b611146565b61032d61032836600461167f565b611216565b6040516101429190611696565b5f54600160601b90046001600160a01b0316331461036b576040516315cead3960e31b815260040160405180910390fd5b610374816112ad565b6001600160a01b0381165f9081526001602052604090205460ff166103ac57604051631f0f181560e21b815260040160405180910390fd5b6001600160a01b0381165f81815260016020526040808220805460ff19169055517f4c910b69fe65a61f7531b9c5042b2329ca7179c77290aa7e2eb3afa3c8511fd39190a250565b5f54600160601b90046001600160a01b03163314610425576040516315cead3960e31b815260040160405180910390fd5b61042e816112ad565b5f80546040516001600160a01b0380851693600160601b90930416917fc9e04b1ee54ac63d006722bdd59e0528d42e84263db6a5171b1cfe1bf6cd10d791a35f80546001600160a01b03909216600160601b026bffffffffffffffffffffffff909216919091179055565b5f54600160601b90046001600160a01b031633146104ca576040516315cead3960e31b815260040160405180910390fd5b62ffffff811615806104e45750620186a08162ffffff1610155b1561050e5760405163284b4c2f60e21b815262ffffff821660048201526024015b60405180910390fd5b5f805460405162ffffff808516939216917f493b9175b319f03f13b1025a4b52f390ab35b9d6f59b4f143f5967800961128e91a35f805462ffffff191662ffffff92909216919091179055565b5f54600160601b90046001600160a01b0316331461058c576040516315cead3960e31b815260040160405180910390fd5b610595816112ad565b6001600160a01b0381165f9081526001602052604090205460ff16156105ce57604051631a36501760e11b815260040160405180910390fd5b6001600160a01b0381165f818152600160208190526040808320805460ff1916909217909155517f6a65f90b1a644d2faac467a21e07e50e3f8fa5846e26231d30ae79a417d3d2629190a250565b5f54600160601b90046001600160a01b0316331461064d576040516315cead3960e31b815260040160405180910390fd5b5f805460405168ffffffffffffffffff80851693630100000090930416917fa7c1bd327e8be88867bc448d3515e6ed0e18d8e45e6916470fe3154fc21efa8891a38068ffffffffffffffffff165f036106b5575f80546bffffffffffffffffff000000191690555b5f805468ffffffffffffffffff9092166301000000026bffffffffffffffffff00000019909216919091179055565b5f54600160601b90046001600160a01b03163314610715576040516315cead3960e31b815260040160405180910390fd5b61071e816112ad565b6001600160a01b0381165f8181526002602052604090819020805460ff19811660ff9182161590811790925591517f3f7458521a03f141ff7274c8443bb095d3a975ed688d1a980f8a58510c29a0c79261077d92161515815260200190565b60405180910390a250565b5f54600160601b90046001600160a01b031633146107b9576040516315cead3960e31b815260040160405180910390fd5b6107c660208301836116cb565b159050806107e057506107dc60408301836116cb565b1590505b156107fe57604051630a8bf2b760e11b815260040160405180910390fd5b5f81516003811115610812576108126114c9565b0361083057604051631e719f3360e01b815260040160405180910390fd5b5f61083e60208401846116cb565b61084b60408601866116cb565b60405160200161085e9493929190611715565b60408051601f198184030181529181528151602092830120845160608601516001600160a01b03165f9081526005855283812083825290945291832080549194509060ff191660018360038111156108b8576108b86114c9565b02179055506002835160038111156108d2576108d26114c9565b03610bc2576040516451412d414960d81b60208201526025016040516020818303038152906040528051906020012084806020019061091191906116cb565b60405160200161092292919061173f565b60405160208183030381529060405280519060200120141580156109a457506040516351412d4360e01b60208201526024016040516020818303038152906040528051906020012084806020019061097a91906116cb565b60405160200161098b92919061173f565b6040516020818303038152906040528051906020012014155b8015610a0e57506040516328a096ab60e11b6020820152602401604051602081830303815290604052805190602001208480602001906109e491906116cb565b6040516020016109f592919061173f565b6040516020818303038152906040528051906020012014155b15610a3e57610a2060208501856116cb565b600260405163222a151760e11b815260040161050593929190611776565b60408301516001600160f81b031615801590610a65575060608301516001600160a01b0316155b15610a8357604051630e84ae9360e21b815260040160405180910390fd5b60408301516001600160f81b0316158015610aaa575060608301516001600160a01b031615155b15610acb57600260405163d5ff172960e01b815260040161050591906117a0565b60408301516001600160f81b031615610b6b5760608301516001600160a01b03165f9081526005602090815260408083208584529091528120600101546001600160f81b03169003610b1b575060015b60408381015160608501516001600160a01b03165f9081526005602090815283822086835290529190912060010180546001600160f81b0319166001600160f81b03909216919091179055610fa6565b60608301516001600160a01b03165f9081526005602090815260408083208584529091529020805461ffff191681556001810180546001600160f81b031916905560020180546001600160a01b0319169055610fa6565b600383516003811115610bd757610bd76114c9565b03610e1257604051624b504960e81b602082015260230160405160208183030381529060405280519060200120848060200190610c1491906116cb565b604051602001610c2592919061173f565b6040516020818303038152906040528051906020012014610c6b57610c4d60208501856116cb565b600360405163222a151760e11b815260040161050593929190611776565b60608301516001600160a01b0316610cda575f8281527f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc60205260409020805461ffff191681556001810180546001600160f81b031916905560020180546001600160a01b0319169055610fa6565b826020015160ff165f03610d0157604051636ab3f8d560e11b815260040160405180910390fd5b82604001516001600160f81b03165f03610d3157600360405163d5ff172960e01b815260040161050591906117a0565b5f8281527f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc60205260408120600101546001600160f81b03169003610d74575060015b6020838101515f8481527f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc909252604091829020805461ff00191661010060ff90931692909202919091178155908401516001820180546001600160f81b0319166001600160f81b039092169190911790556060840151600290910180546001600160a01b0319166001600160a01b03909216919091179055610fa6565b60405165434f4e46494760d01b602082015260260160405160208183030381529060405280519060200120848060200190610e4d91906116cb565b604051602001610e5e92919061173f565b6040516020818303038152906040528051906020012014610ea457610e8660208501856116cb565b600160405163222a151760e11b815260040161050593929190611776565b60608301516001600160a01b0316610f13575f8281527f1471eb6eb2c5e789fc3de43f8ce62938c7d1836ec861730447e2ada8fd81017b60205260409020805461ffff191681556001810180546001600160f81b031916905560020180546001600160a01b0319169055610fa6565b5f8281527f1471eb6eb2c5e789fc3de43f8ce62938c7d1836ec861730447e2ada8fd81017b60205260409020600201546001600160a01b0316610f54575060015b60608301515f8381527f1471eb6eb2c5e789fc3de43f8ce62938c7d1836ec861730447e2ada8fd81017b6020526040902060020180546001600160a01b0319166001600160a01b039092169190911790555b60608301516001600160a01b031615611091578015610ffe576003610fce60208601866116cb565b604051610fdc92919061173f565b9081526040519081900360200190208054905f610ff8836117c8565b91905055505b61100b60208501856116cb565b61101860408701876116cb565b60405160200161102b9493929190611715565b60408051601f198184030181529181525f848152600460205220906110509082611864565b507f308f9f55d3eeef9e8267285607d3dde765f53e18a5cdd7ed77e21e5633a6791b84838560405161108493929190611961565b60405180910390a1611140565b5f82815260046020526040902080546110a9906117e0565b1590506111405760036110bf60208601866116cb565b6040516110cd92919061173f565b9081526040519081900360200190208054905f6110e983611a1c565b90915550505f828152600460205260408120611104916112d7565b7f454f1484777e93d9fd2ad4a7fd63f5fa7a9edd73f994a2be242a7fae02c121c184838560405161113793929190611961565b60405180910390a15b50505050565b5f81816001600160a01b03861661115f5750600361117c565b5f196001600160a01b038716016111785750600161117c565b5060025b5f5b8281101561120757816003811115611198576111986114c9565b6001600160a01b0388165f908152600560205260408120908888858181106111c2576111c2611a31565b602090810292909201358352508101919091526040015f205460ff1660038111156111ef576111ef6114c9565b146111ff575f935050505061120f565b60010161117e565b506001925050505b9392505050565b60046020525f90815260409020805461122e906117e0565b80601f016020809104026020016040519081016040528092919081815260200182805461125a906117e0565b80156112a55780601f1061127c576101008083540402835291602001916112a5565b820191905f5260205f20905b81548152906001019060200180831161128857829003601f168201915b505050505081565b6001600160a01b0381166112d45760405163140efc4d60e21b815260040160405180910390fd5b50565b5080546112e3906117e0565b5f825580601f106112f2575050565b601f0160209004905f5260205f20908101906112d491905b8082111561131d575f815560010161130a565b5090565b80356001600160a01b0381168114611337575f5ffd5b919050565b5f6020828403121561134c575f5ffd5b61120f82611321565b5f60208284031215611365575f5ffd5b813562ffffff8116811461120f575f5ffd5b5f60208284031215611387575f5ffd5b813568ffffffffffffffffff8116811461120f575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b6040516080810167ffffffffffffffff811182821017156113d6576113d661139f565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156114055761140561139f565b604052919050565b5f6020828403121561141d575f5ffd5b813567ffffffffffffffff811115611433575f5ffd5b8201601f81018413611443575f5ffd5b803567ffffffffffffffff81111561145d5761145d61139f565b611470601f8201601f19166020016113dc565b818152856020838501011115611484575f5ffd5b816020840160208301375f91810160200191909152949350505050565b5f5f604083850312156114b2575f5ffd5b6114bb83611321565b946020939093013593505050565b634e487b7160e01b5f52602160045260245ffd5b600481106114f957634e487b7160e01b5f52602160045260245ffd5b9052565b6080810161150b82876114dd565b60ff9490941660208201526001600160f81b039290921660408301526001600160a01b0316606090910152919050565b803560048110611337575f5ffd5b5f5f82840360a081121561155b575f5ffd5b833567ffffffffffffffff811115611571575f5ffd5b840160608187031215611582575f5ffd5b92506080601f1982011215611595575f5ffd5b5061159e6113b3565b6115aa6020850161153b565b8152604084013560ff811681146115bf575f5ffd5b602082015260608401356001600160f81b03811681146115dd575f5ffd5b60408201526115ee60808501611321565b6060820152809150509250929050565b5f5f5f60408486031215611610575f5ffd5b61161984611321565b9250602084013567ffffffffffffffff811115611634575f5ffd5b8401601f81018613611644575f5ffd5b803567ffffffffffffffff81111561165a575f5ffd5b8660208260051b840101111561166e575f5ffd5b939660209190910195509293505050565b5f6020828403121561168f575f5ffd5b5035919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f8335601e198436030181126116e0575f5ffd5b83018035915067ffffffffffffffff8211156116fa575f5ffd5b60200191503681900382131561170e575f5ffd5b9250929050565b838582375f8482016101d160f51b8152838560028301375f93016002019283525090949350505050565b818382375f9101908152919050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b604081525f61178960408301858761174e565b905061179860208301846114dd565b949350505050565b602081016117ae82846114dd565b92915050565b634e487b7160e01b5f52601160045260245ffd5b5f600182016117d9576117d96117b4565b5060010190565b600181811c908216806117f457607f821691505b60208210810361181257634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561185f57805f5260205f20601f840160051c8101602085101561183d5750805b601f840160051c820191505b8181101561185c575f8155600101611849565b50505b505050565b815167ffffffffffffffff81111561187e5761187e61139f565b6118928161188c84546117e0565b84611818565b6020601f8211600181146118c4575f83156118ad5750848201515b5f19600385901b1c1916600184901b17845561185c565b5f84815260208120601f198516915b828110156118f357878501518255602094850194600190920191016118d3565b508482101561191057868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f5f8335601e19843603018112611934575f5ffd5b830160208101925035905067ffffffffffffffff811115611953575f5ffd5b80360382131561170e575f5ffd5b60c0815261197a60c082016119758661153b565b6114dd565b5f611988602086018661191f565b606060e085015261199e6101208501828461174e565b9150506119ae604087018761191f565b84830360bf19016101008601526119c683828461174e565b93505050508360208301526119df6040830184516114dd565b602083015160ff1660608381019190915260408401516001600160f81b03166080840152909201516001600160a01b031660a09091015292915050565b5f81611a2a57611a2a6117b4565b505f190190565b634e487b7160e01b5f52603260045260245ffdfea2646970667358221220bbd13e299624d41ffda2bce0ba16c1372fd7c104fb546b34743a5dfaa8a012af64736f6c634300081e0033

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

000000000000000000000000c2f8d4b61e078160630b6c93c5c51ec6f8304e26000000000000000000000000ec051bb8876e78ba6a24e03cb07fbe1259e44c4700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000001

-----Decoded View---------------
Arg [0] : protocolAdmin_ (address): 0xc2f8D4B61E078160630b6C93c5C51EC6F8304e26
Arg [1] : echoOracle (address): 0xEC051Bb8876E78bA6a24E03cb07FBe1259E44C47
Arg [2] : oracleFees (uint248[8]): 0,0,0,0,0,0,0,0
Arg [3] : xKPIsRatio (uint8[6]): 5,20,50,10,5,1

-----Encoded View---------------
16 Constructor Arguments found :
Arg [0] : 000000000000000000000000c2f8d4b61e078160630b6c93c5c51ec6f8304e26
Arg [1] : 000000000000000000000000ec051bb8876e78ba6a24e03cb07fbe1259e44c47
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000014
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000032
Arg [13] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [15] : 0000000000000000000000000000000000000000000000000000000000000001


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