FRAX Price: $0.99 (+1.90%)

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
Age:7D
Reset Filter

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:
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

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.