FRAX Price: $0.82 (-10.26%)

Contract

0x9d6CD0f8D73Aed7Aa460bDA0801DdC4cf9DE830c

Overview

FRAX Balance | FXTL Balance

0 FRAX | 5 FXTL

FRAX Value

$0.00

Token Holdings

More Info

Private Name Tags

ContractCreator

Multichain Info

No addresses found
Transaction Hash
Block
From
To
0x60806040252145082025-09-07 10:08:47144 days ago1757239727IN
 Create: EchoCampaignV0
0 FRAX0.000045770.00010262
VIEW ADVANCED FILTER

Advanced mode:
Parent Transaction Hash Block From To
View All Internal Transactions

Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
EchoCampaignV0

Compiler Version
v0.8.30+commit.73712a01

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 2 : EchoCampaignV0.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.30;

// ================================= EchoCampaign V0 =================================
import {QualificationData, BudgetInfo, SocialKPIs} from "../../interfaces/IEchoCampaign.sol";

/// @title EchoCampaign V0 - Deprecated Anti-Attack Version
/// @author Dynabits.org
/// @notice This contract represents the deprecated V0 version of EchoCampaign.
/// @dev 
///  - It exists only as a protective layer against replay or initialization attacks
///    on previously deployed contract addresses.
///  - Any attempt to call `init` will revert with the `Deprecated()` error.
///  - The contract keeps the same interface shape as the original EchoCampaign
///    for compatibility, but all functionality has been disabled.
///
/// @custom:security Use newer versions of EchoCampaign. This version is locked and cannot
///                  be initialized or used for campaign creation.
contract EchoCampaignV0 {
    /********************************\
    |-*-*-*-*-*   ERRORS   *-*-*-*-*-|
    \********************************/

    /// @notice Thrown whenever a deprecated function is called.
    /// @dev Indicates that this contract version is intentionally disabled.
    error Deprecated();

    /**
     * @notice Disabled initializer of EchoCampaign V0.
     * @dev Always reverts with `Deprecated()`. 
     *      Maintains the same signature as the original version for compatibility.
     *
     * @param ipfsCID The IPFS hash containing campaign metadata (unused).
     * @param budgetInfo_ The campaign budget information (unused).
     * @param socialKPIs_ The social KPI thresholds (unused).
     * @param qaData_ Qualification data for participants (unused).
     *
     * @custom:throws Deprecated Always reverts to prevent misuse of this version.
     */
    function init(
        string calldata ipfsCID,
        BudgetInfo calldata budgetInfo_,
        SocialKPIs calldata socialKPIs_,
        QualificationData[] calldata qaData_
    ) external pure {
        ipfsCID;
        budgetInfo_;
        socialKPIs_;
        qaData_;
        revert Deprecated();
    }
}

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

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

enum QA_METHOD {
    AI,
    COMMUNITY,
    VOTE
}

enum Status {
    upcoming,
    inProgress,
    paused,
    finished,
    claimable,
    finalized
}

enum Finalizer {
    protocolAdmin,
    finalizerOracle
}

struct CampaignInitData {
    uint64 initTime;
    address clonedCampaign;
    address implementation;
}

struct BasicInfo {
    string name;
    string ipfsCID;
    address owner;
    uint256 startTime;
    uint256 endTime;
}

struct PostInfo {
    uint256 totalPosts;
    uint256 totalEligibleContents;
    uint256 totalEffectiveKPIs;
    uint256 lastPostTime;
    uint256 lastUpdatedTime;
    uint256 applicationFee;
}

struct Token {
    string name;
    string symbol;
    uint256 decimals;
}

struct BudgetInfo {
    address token;
    uint128 maxPerPost;
    uint128 reservedAmount;
}

struct PostData {
    string postLink;
    address applicant;
}

struct QualificationData {
    QA_METHOD method;
    uint88 pct;
    address oracle;
    string kind;
}

struct KPI {
    uint8 pct;
    uint248 min;
    uint256 ratio;
    string method;
    string extra;
}

struct SocialKPIs {
    string social;
    KPI[] kpis;
}

/**
 * @title IEchoCampaign
 * @notice Defines the interface for Echo Campaign contracts, which manage campaign
 *         settings, budgets, KPIs, content submissions, and reward distribution.
 * @dev This interface provides function definitions for interacting with campaign
 *      data, including retrieving budget details, tracking content KPIs, and
 *      managing administrative actions.
 * @author Dynabits.org
 */
interface IEchoCampaign {
    /*******************************\
    |*-*-*-*   EXTERNALS   *-*-*-*-*|
    \*******************************/

    /**
     * @notice Initializes the contract with provided parameters.
     * @dev This function can only be called by the factory contract.
     * It sets the IPFS CID, budget information, social KPIs, and qualification data.
     * Additionally, it registers action kinds based on QA methods and social KPIs.
     * @param ipfsCID The IPFS Content Identifier (CID) associated with the data.
     * @param budgetInfo_ Struct containing budget-related information.
     * @param socialKPIs_ Struct containing social Key Performance Indicators (KPIs).
     * @param qaData_ An array of QualificationData structs defining QA methods and kinds.
     * Reverts:
     * - `ONLY_FACTORY` if the caller is not the factory contract.
     * - `DUPLICATE_QA` if there is a duplicate qualification.
     * - `DUPLICATE_KPI` if there is a duplicate KPI.
     */
    function init(
        string calldata ipfsCID,
        BudgetInfo calldata budgetInfo_,
        SocialKPIs calldata socialKPIs_,
        QualificationData[] calldata qaData_
    ) external;

    /**
     * @notice Toggles the campaign's pause state.
     * @dev Only callable by the protocol administrator.
     *
     * Emits:
     * - `CampaignPauseToggled` with the new state.
     *
     * Reverts:
     * - `UNAUTHORIZED_CALLER` if the caller is not the protocol administrator.
     */
    function togglePauseCampaign() external;

    /**
     * @notice Finalizes a campaign that is in progress.
     * @dev Only callable by the protocol administrator when the campaign status is `inProgress`.
     *      Refunds any unspent budget and marks the campaign as finalized.
     *
     * Emits:
     * - `CampaignFinalized` with the protocol administrator as the finalizer and the refunded amount.
     *
     * Reverts:
     * - `UNAUTHORIZED_CALLER` if the caller is not the protocol administrator.
     * - `ONLY_IN_PROGRESS_STATUS` if the campaign is not currently in progress.
     */
    function finalizeInProgressCampaign() external;

    /**
     * @notice Increases the campaign budget by a specified amount.
     * @dev Transfers the specified amount of tokens from the caller to the campaign
     *      and updates the reserved budget.
     * @param amount The amount of tokens to add to the campaign budget.
     *
     * Emits:
     * - `BudgetIncreased` with the added amount, previous budget, new budget, and sender address.
     *
     * Reverts:
     * - `ONLY_UPCOMING_OR_IN_PROGRESS_STATUS` if the campaign is not in `upcoming` or `inProgress` status.
     */
    function increaseBudget(uint256 amount) external;

    /**
     * @notice Submits content for the campaign.
     * @dev Adds a content link to the campaign without performing authentication checks at submission time.
     *      Authentication is enforced at the claiming stage.
     * @param contentLink The link to the submitted content.
     *
     * Reverts:
     * - `ONLY_IN_PROGRESS_STATUS` if the campaign is not in `inProgress` status.
     * - `INVALID_CONTENT_LINK` if the provided content link is empty.
     */
    function applyContent(string calldata contentLink) external;

    /**
     * @notice Finalizes a campaign that has reached the finished status.
     * @dev Ensures the campaign is in the `finished` status before finalization.
     *      Refunds any unspent budget and marks the campaign as finalized.
     *
     * Emits:
     * - `CampaignFinalized` with the finalizer and the refunded amount.
     *
     * Reverts:
     * - `ONLY_FINISHED_CAMPAIGN_STATUS` if the campaign is not in `finished` status.
     */
    function finalizeFinishedCampaign() external;

    /**
     * @notice Updates the KPI metrics for a specific content link.
     * @dev Modifies the total and per-content effective KPIs based on the provided values.
     *      If the content has no prior KPI value, it is counted as an eligible content.
     *
     * @param contentLink The unique identifier (link) of the content being updated.
     * @param additionalContentEffectiveKPI The KPI value to be added or subtracted.
     * @param additional A boolean indicating whether to increase or decrease the KPI.
     *
     * @return totalEffectiveKPIs The updated total sum of all effective KPIs.
     * @return contentEffectiveKPI_ The updated KPI for the specified content.
     * @return totalEligibleContents The updated count of eligible contents.
     * @return eligibilityPolarity must be either 1, 0, or -1 and determines how the total eligible content count is updated.
     *
     * Requirements:
     * - Caller must be the EchoContetns contract.
     */
    function updateKPIs(
        string calldata contentLink,
        uint256 additionalContentEffectiveKPI,
        bool additional
    )
        external
        returns (
            uint256 totalEffectiveKPIs,
            uint256 contentEffectiveKPI_,
            uint256 totalEligibleContents,
            int8 eligibilityPolarity
        );

    /**
     * @notice Allows the reward claim for registered and eligible content whose author has been registered by the oracle.
     * @dev This function verifies that the campaign status is `claimable`, ensures the content is registered,
     *      checks its effective KPI score, calculates the reward based on the KPI ratio, and distributes
     *      the appropriate amount. If a max reward per post is defined, any excess funds are refunded.
     *      Once all eligible claims have been processed, the campaign is finished.
     * @param contentLink The unique identifier (URL) of the content for which the claim is being made.
     *
     * Requirements:
     * - The campaign status must be `claimable`.
     * - The content must be registered under the campaign.
     * - The content must have an effective KPI score greater than zero.
     *
     * Emits:
     * - `Claimed` event upon successful claim, indicating the content, recipient, reward amount, and refund amount.
     * - `CampaignFinished` event is emitted when all eligible contents have been claimed and the campaign is finished.
     *
     * Reverts:
     * - `ONLY_CLAIMABLE_STATUS()` if the campaign is not in the `claimable` status.
     * - `INVALID_CONTENT_LINK()` if the content is not registered in the campaign.
     * - `NO_CONTENT_AUTHOR()` if the content's author has not been registered by the oracle before claiming.
     * - `NOT_ELIGIBLE_FOR_WITHDRAW()` if the content has no effective KPI score.
     */
    function claim(string calldata contentLink) external;

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

    /// @notice Retrieves the budget information for the campaign.
    /// @return budgetInfo_ The budget details, including reserved amount and token information.
    function budgetInfo() external view returns (BudgetInfo memory budgetInfo_);

    /// @notice Retrieves the social KPIs associated with the campaign.
    /// @return socialKPIs_ The set of social KPIs used for evaluating campaign performance.
    function socialKPIs() external view returns (SocialKPIs memory socialKPIs_);

    /// @notice Retrieves the qualification data for the campaign.
    /// @return qaData_ An array of qualification data required for content evaluation.
    function qaData()
        external
        view
        returns (QualificationData[] memory qaData_);

    /// @notice Checks whether a specific action kind is registered in the campaign.
    /// @param actionKind The string representation of the action kind to check.
    /// @return isRegistered A boolean indicating whether the action kind is registered.
    function registeredActionKind(string calldata actionKind)
        external
        view
        returns (bool);

    /// @notice Retrieves the effective KPI score for a given content link.
    /// @param contentLink The unique identifier (URL or hash) of the submitted content.
    /// @return kpiScore The effective KPI score assigned to the content.
    function contentEffectiveKPI(string calldata contentLink)
        external
        view
        returns (uint256);

    /**
     * @notice Estimates the reward amount for content based on provided QA and KPI data.
     * @dev Ensures QA and KPI inputs match the campaign's predefined requirements.
     * @param qas An array of qualification data for the content.
     * @param kpis An array of KPI data for the content.
     * @return rewardAmount The estimated reward amount in campaign token units.
     */
    function rewardEstimation(
        QualificationData[] calldata qas,
        KPI[] calldata kpis
    ) external view returns (uint256 rewardAmount);

    /**
     * @notice Retrieves comprehensive details about the campaign.
     * @return basicInfo_ Basic campaign details such as name, owner, and time period.
     * @return initData_ Initialization data from the campaign factory.
     * @return budgetInfo_ Budget details including token and reserved amounts.
     * @return token_ Token metadata such as name, symbol, and decimals.
     * @return socialKPIs_ The social KPI details of the campaign.
     * @return qaData_ The qualification data required for content.
     * @return postInfo_ Statistics related to campaign content submissions.
     * @return status_ The current status of the campaign.
     */
    function details()
        external
        view
        returns (
            BasicInfo memory basicInfo_,
            CampaignInitData memory initData_,
            BudgetInfo memory budgetInfo_,
            Token memory token_,
            SocialKPIs memory socialKPIs_,
            QualificationData[] memory qaData_,
            PostInfo memory postInfo_,
            Status status_
        );

    /**
     * @notice Returns the address of the person who created the specified content and is eligible to claim it.
     * @param contentLink The URL of the submitted content.
     * @return The wallet address of the content creator for the given content.
               May return the zero address (0x0) if no record is found in the oracle.
     */
    function getContentCreator(string calldata contentLink)
        external
        view
        returns (address);

    /// @notice Retrieves the current status of the campaign.
    /// @return status_ The campaign's status as an enum value.
    function currentStatus() external view returns (Status status_);

    /// @notice Calculates the application fee required for content submission.
    /// @return fee The total application fee in campaign token units.
    function applicationFee() external view returns (uint256 fee);

    /// @notice Retrieves the campaign's name.
    /// @return campaignName The human-readable name of the campaign.
    function name() external view returns (string memory campaignName);

    /// @notice Retrieves the address of the Echo Contents contract.
    /// @return contentsAddress The address of the content management contract.
    function contents() external view returns (address contentsAddress);

    /// @notice Retrieves the address of the Echo Administration contract.
    /// @return adminAddress The address of the admin contract.
    function admin() external pure returns (address adminAddress);

    /// @notice Retrieves the address of the campaign factory.
    /// @return factoryAddress The address of the campaign factory contract.
    function factory() external pure returns (address factoryAddress);

    /// @notice Retrieves the owner of the campaign.
    /// @return ownerAddress The address of the campaign owner.
    function owner() external pure returns (address ownerAddress);

    /// @notice Retrieves the refund address for the campaign.
    /// @return refundAddr The address where refunds are sent.
    function refundAddress() external pure returns (address refundAddr);

    /// @notice Retrieves the hashed name of the campaign.
    /// @return campaignNameHash The bytes32 representation of the campaign name.
    function nameHash() external pure returns (bytes32 campaignNameHash);

    /// @notice Retrieves the start time of the campaign.
    /// @return startTimestamp The Unix timestamp of the campaign start time.
    function startTime() external pure returns (uint256 startTimestamp);

    /// @notice Retrieves the end time of the campaign.
    /// @return endTimestamp The Unix timestamp of the campaign end time.
    function endTime() external pure returns (uint256 endTimestamp);
}

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

Contract Security Audit

Contract ABI

API
[{"inputs":[],"name":"Deprecated","type":"error"},{"inputs":[{"internalType":"string","name":"ipfsCID","type":"string"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint128","name":"maxPerPost","type":"uint128"},{"internalType":"uint128","name":"reservedAmount","type":"uint128"}],"internalType":"struct BudgetInfo","name":"budgetInfo_","type":"tuple"},{"components":[{"internalType":"string","name":"social","type":"string"},{"components":[{"internalType":"uint8","name":"pct","type":"uint8"},{"internalType":"uint248","name":"min","type":"uint248"},{"internalType":"uint256","name":"ratio","type":"uint256"},{"internalType":"string","name":"method","type":"string"},{"internalType":"string","name":"extra","type":"string"}],"internalType":"struct KPI[]","name":"kpis","type":"tuple[]"}],"internalType":"struct SocialKPIs","name":"socialKPIs_","type":"tuple"},{"components":[{"internalType":"enum QA_METHOD","name":"method","type":"uint8"},{"internalType":"uint88","name":"pct","type":"uint88"},{"internalType":"address","name":"oracle","type":"address"},{"internalType":"string","name":"kind","type":"string"}],"internalType":"struct QualificationData[]","name":"qaData_","type":"tuple[]"}],"name":"init","outputs":[],"stateMutability":"pure","type":"function"}]

6080604052348015600e575f5ffd5b506101d88061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610029575f3560e01c8063e80099481461002d575b5f5ffd5b61004061003b3660046100c9565b610042565b005b6040516331cee75f60e21b815260040160405180910390fd5b5f6060828403121561006b575f5ffd5b50919050565b5f6040828403121561006b575f5ffd5b5f5f83601f840112610091575f5ffd5b50813567ffffffffffffffff8111156100a8575f5ffd5b6020830191508360208260051b85010111156100c2575f5ffd5b9250929050565b5f5f5f5f5f5f60c087890312156100de575f5ffd5b863567ffffffffffffffff8111156100f4575f5ffd5b8701601f81018913610104575f5ffd5b803567ffffffffffffffff81111561011a575f5ffd5b89602082840101111561012b575f5ffd5b602091820197509550610141908990890161005b565b9350608087013567ffffffffffffffff81111561015c575f5ffd5b61016889828a01610071565b93505060a087013567ffffffffffffffff811115610184575f5ffd5b61019089828a01610081565b979a969950949750929593949250505056fea264697066735822122085f0141185a2559570f188dacacf8ec880e449dc96182fa14032b8a4898e2f2c64736f6c634300081e0033

Deployed Bytecode

0x608060405234801561000f575f5ffd5b5060043610610029575f3560e01c8063e80099481461002d575b5f5ffd5b61004061003b3660046100c9565b610042565b005b6040516331cee75f60e21b815260040160405180910390fd5b5f6060828403121561006b575f5ffd5b50919050565b5f6040828403121561006b575f5ffd5b5f5f83601f840112610091575f5ffd5b50813567ffffffffffffffff8111156100a8575f5ffd5b6020830191508360208260051b85010111156100c2575f5ffd5b9250929050565b5f5f5f5f5f5f60c087890312156100de575f5ffd5b863567ffffffffffffffff8111156100f4575f5ffd5b8701601f81018913610104575f5ffd5b803567ffffffffffffffff81111561011a575f5ffd5b89602082840101111561012b575f5ffd5b602091820197509550610141908990890161005b565b9350608087013567ffffffffffffffff81111561015c575f5ffd5b61016889828a01610071565b93505060a087013567ffffffffffffffff811115610184575f5ffd5b61019089828a01610081565b979a969950949750929593949250505056fea264697066735822122085f0141185a2559570f188dacacf8ec880e449dc96182fa14032b8a4898e2f2c64736f6c634300081e0033

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.