FRAX Price: $0.81 (-0.03%)

Contract

0x9f06fD798Ea0446Ae1d8828BAae989e162d6A1Dc

Overview

FRAX Balance | FXTL Balance

0 FRAX | 232 FXTL

FRAX Value

$0.00

Token Holdings

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Block
From
To
Add Quest87697222024-08-22 18:09:15521 days ago1724350155IN
0x9f06fD79...162d6A1Dc
0 FRAX0.000000490.00166691
Manage Flox Cont...87696622024-08-22 18:07:15521 days ago1724350035IN
0x9f06fD79...162d6A1Dc
0 FRAX0.000004940.10000025
Initialize87693922024-08-22 17:58:15521 days ago1724349495IN
0x9f06fD79...162d6A1Dc
0 FRAX0.000000240.00100025

View more zero value Internal Transactions in Advanced View mode

Advanced mode:

Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
QuestTracker

Compiler Version
v0.8.23+commit.f704f362

Optimization Enabled:
Yes with 100000 runs

Other Settings:
paris EvmVersion
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.0;

/**
 * ====================================================================
 * |     ______                   _______                             |
 * |    / _____________ __  __   / ____(_____  ____ _____  ________   |
 * |   / /_  / ___/ __ `| |/_/  / /_  / / __ \/ __ `/ __ \/ ___/ _ \  |
 * |  / __/ / /  / /_/ _>  <   / __/ / / / / / /_/ / / / / /__/  __/  |
 * | /_/   /_/   \__,_/_/|_|  /_/   /_/_/ /_/\__,_/_/ /_/\___/\___/   |
 * |                                                                  |
 * ====================================================================
 * ========================= QuestTracker =============================
 * ====================================================================
 * Frax Finance: https://github.com/FraxFinance
 */

import { QuestTrackerAccessControl } from './QuestTrackerAccessControl.sol';

/**
 * @title QuestTracker
 * @author Frax Finance
 * @notice The QuestTracker contract is used to track quests and their progress for users.
 */
contract QuestTracker is QuestTrackerAccessControl {
    /**
     * @notice This struct represents a quest.
     */
    struct Quest {
        uint256 reward; // The amount of FXTL points awarded for completing the quest
        uint256 startBlock; // The start block of the quest - marks the first block that compleion conditions apply
        uint256 endBlock; // The end block of the quest - marks the last block that completion conditions apply
        QuestStatus status; // The status of the quest (Pending, Upcoming, Active, Expired)
        string title; // The title of the quest
        string description; // The URI to the quest description
    }

    /**
     * @notice This mapping is used to keep track of all of the quests.
     * @dev The quests are stored using their unique ID.
     * @dev questId ID of the quest
     * @dev quest The quest being stored
     */
    mapping(uint256 questId => Quest quest) public quests;
    /**
     * @notice This mapping represents the status of a user's progress on a quest.
     * @dev Tracking the users progress through quest allows for allocation of awards upon completion of the quest.
     * @dev user Address of the user
     * @dev questId ID of the quest
     * @dev status Status of the user's progress on the quest
     */
    mapping(address user => mapping(uint256 questId => UserQuestStatus status)) public userQuests;

    /// ID of the next quest to be added as well as the total number of quests.
    uint256 public nextQuestId;
    /// Flag to determine if the contract has been initialized.
    bool public initialized;

    /**
     * @notice Initialize the QuestTracker and set the owner.
     * @param owner Address of the owner of the contract
     */
    function initialize(address owner) public override {
        if (initialized) revert AlreadyInitialized();
        
        super.initialize(owner);
        initialized = true;
    }

    /**
     * @notice Used to add a new quest to the tracker.
     * @dev This can only be called by the Flox contributors.
     * @param reward Amount of FXTL received upon completion of the quest
     * @param startBlock Block number of the block at which the quest starts
     * @param endBlock Block number of the block at which the quest ends
     * @param title The title of the quest
     * @param description The URI to the quest description
     */
    function addQuest(
        uint256 reward,
        uint256 startBlock,
        uint256 endBlock,
        string memory title,
        string memory description
    ) external {
        _onlyFloxContributor();

        if (startBlock > endBlock) revert InvalidBlockRange();

        QuestStatus status;

        if (block.number < startBlock) {
            status = QuestStatus.Upcoming;
        } else if (block.number < endBlock) {
            status = QuestStatus.Active;
        } else {
            status = QuestStatus.Expired;
        }

        quests[nextQuestId] = Quest(reward, startBlock, endBlock, status, title, description);
        nextQuestId++;

        emit QuestAdded(nextQuestId - 1, reward, startBlock, endBlock);
    }

    /**
     * @notice Used to update an existing quest.
     * @dev Passing an empty value for any of the parameters will result in the value not being updated.
     * @dev This can only be called by the Flox contributors.
     * @param questId ID of the quest to update
     * @param updatedReward New amount of FXTL received upon completion of the quest
     * @param updatedStartBlock New block number at which the quest starts
     * @param updatedEndBlock New block number at which the quest ends
     * @param updatedTitle New title of the quest
     * @param updatedDescription New URI to the quest description
     */
    function updateQuest(
        uint256 questId,
        uint256 updatedReward,
        uint256 updatedStartBlock,
        uint256 updatedEndBlock,
        string memory updatedTitle,
        string memory updatedDescription
    ) external {
        _onlyFloxContributor();

        if (questId >= nextQuestId) revert QuestDoesNotExist();

        updatedReward = updatedReward == 0 ? quests[questId].reward : updatedReward;
        updatedStartBlock = updatedStartBlock == 0 ? quests[questId].startBlock : updatedStartBlock;
        updatedEndBlock = updatedEndBlock == 0 ? quests[questId].endBlock : updatedEndBlock;
        updatedTitle = bytes(updatedTitle).length == 0 ? quests[questId].title : updatedTitle;
        updatedDescription = bytes(updatedDescription).length == 0 ? quests[questId].description : updatedDescription;

        if (updatedStartBlock > updatedEndBlock) revert InvalidBlockRange();

        QuestStatus updatedStatus;

        if (block.number < updatedStartBlock) {
            updatedStatus = QuestStatus.Upcoming;
        } else if (block.number < updatedEndBlock) {
            updatedStatus = QuestStatus.Active;
        } else {
            updatedStatus = QuestStatus.Expired;
        }

        quests[questId] = Quest(
            updatedReward,
            updatedStartBlock,
            updatedEndBlock,
            updatedStatus,
            updatedTitle,
            updatedDescription
        );

        emit QuestUpdated(questId, updatedReward, updatedStartBlock, updatedEndBlock, updatedStatus);
    }

    /**
     * @notice Used to update the status of a user's quest.
     * @dev This can only be called by the contributors of the quest of Flox contributors.
     * @param user Address of the user receiving the quest status update
     * @param questId ID of the quest being updated
     * @param status Status of the user's quest progress after the update
     */
    function updateUserQuestStatus(address user, uint256 questId, UserQuestStatus status) external {
        _onlyContributor(questId);

        if (questId >= nextQuestId) revert QuestDoesNotExist();
        if (status <= userQuests[user][questId]) revert InvalidUserQuestStatusUpdate(userQuests[user][questId], status);

        userQuests[user][questId] = status;

        emit UserQuestStatusUpdated(user, questId, status);
    }

    /**
     * @notice Used to update the status of a user's quest progress for multiple quests and various progress statuses.
     * @dev Each status will be applied to the corresponding quest ID.
     * @dev This can only be called by the Flox contributors.
     * @param user Address of the user receiving the quest status updates
     * @param questIds IDs of the quests being updated
     * @param statuses Statuses of the user's quest progress after the update
     */
    function bulkUpdateSingleUserQuestStatuses(
        address user,
        uint256[] memory questIds,
        UserQuestStatus[] memory statuses
    ) external {
        _onlyFloxContributor();

        if (questIds.length != statuses.length) revert ArrayLengthMismatch();

        for (uint256 i; i < questIds.length; ) {
            if (questIds[i] >= nextQuestId) revert QuestDoesNotExist();
            if (statuses[i] <= userQuests[user][questIds[i]]) {
                revert InvalidUserQuestStatusUpdate(userQuests[user][questIds[i]], statuses[i]);
            }

            userQuests[user][questIds[i]] = statuses[i];

            emit UserQuestStatusUpdated(user, questIds[i], statuses[i]);

            unchecked {
                ++i;
            }
        }
    }

    /**
     * @notice Used to update the status of multiple users' progresses in a single quest.
     * @dev This can only be called by the contributors of the quest or Flox contributors.
     * @param users Addresses of the users receiving the quest status updates
     * @param questId ID of the quest being updated
     * @param status New status assigned to the users' progress on the quest
     */
    function bulkUpdateMultipleUsersQuestStatus(
        address[] memory users,
        uint256 questId,
        UserQuestStatus status
    ) external {
        _onlyContributor(questId);

        if (questId >= nextQuestId) revert QuestDoesNotExist();

        for (uint256 i; i < users.length; ) {
            if (status <= userQuests[users[i]][questId]) {
                revert InvalidUserQuestStatusUpdate(userQuests[users[i]][questId], status);
            }

            userQuests[users[i]][questId] = status;

            emit UserQuestStatusUpdated(users[i], questId, status);

            unchecked {
                ++i;
            }
        }
    }

    /**
     * @notice Used to update the status of multiple users' progresses in multiple quests.
     * @dev The status at each index will be applied to the corresponding user and quest ID.
     * @dev This can only be called by the Flox contributors.
     * @param users Addresses of the ussers receiving the quest status updates
     * @param questIds IDs of the quests being updated
     * @param statuses Quest progress statuses of the users after the update
     */
    function bulkUpdateMultipleUsersQuestsStatuses(
        address[] memory users,
        uint256[] memory questIds,
        UserQuestStatus[] memory statuses
    ) external {
        _onlyFloxContributor();

        if (users.length != questIds.length) revert ArrayLengthMismatch();
        if (questIds.length != statuses.length) revert ArrayLengthMismatch();

        for (uint256 i; i < users.length; ) {
            if (questIds[i] >= nextQuestId) revert QuestDoesNotExist();
            if (statuses[i] <= userQuests[users[i]][questIds[i]]) {
                revert InvalidUserQuestStatusUpdate(userQuests[users[i]][questIds[i]], statuses[i]);
            }

            userQuests[users[i]][questIds[i]] = statuses[i];

            emit UserQuestStatusUpdated(users[i], questIds[i], statuses[i]);

            unchecked {
                ++i;
            }
        }
    }

    /// Storage gap to prevent storage collisions.
    uint256[50] private __gap;
}

// SPDX-License-Identifier: MIT
pragma solidity >=0.8.0;

/**
 * ====================================================================
 * |     ______                   _______                             |
 * |    / _____________ __  __   / ____(_____  ____ _____  ________   |
 * |   / /_  / ___/ __ `| |/_/  / /_  / / __ \/ __ `/ __ \/ ___/ _ \  |
 * |  / __/ / /  / /_/ _>  <   / __/ / / / / / /_/ / / / / /__/  __/  |
 * | /_/   /_/   \__,_/_/|_|  /_/   /_/_/ /_/\__,_/_/ /_/\___/\___/   |
 * |                                                                  |
 * ====================================================================
 * =================== QuestTrackerAccessControl ======================
 * ====================================================================
 * Frax Finance: https://github.com/FraxFinance
 */

import { IQuestTrackerEvents } from './IQuestTrackerEvents.sol';

/**
 * @title QuestTrackerAccessControl
 * @author Frax Finance
 * @notice The QuestTrackerAccessControl contract is used to power the access control of the QuestTracker smart contract.
 */
contract QuestTrackerAccessControl is IQuestTrackerEvents {
    /// Address of the owner of the contract.
    address public owner;
    /// Address of the nominated owner of the contract.
    address public nominatedOwner;

    /**
     * @notice Used to track Flox contributors.
     * @dev contributor Address of the contributor
     * @dev isContributor Status of the contributor
     */
    mapping(address contributor => bool isContributor) public floxContributors;
    /**
     * @notice Used to track contributors for specific quests.
     * @dev The quest contributors are used to manage the statuses of specific quests.
     * @dev questId ID of the quest
     * @dev questContibutor Address of the quest contributor
     * @dev isContributor Status of the quest contributor
     */
    mapping(uint256 questId => mapping(address questContibutor => bool isContributor)) public questContributors;

    /**
     * @notice Used to initialize the smart contract and set the owner.
     * @param _owner Address of the owner of the contract
     */
    function initialize(address _owner) public virtual {
        if (owner != address(0)) revert AlreadyInitialized();
        
        owner = _owner;
    }

    /**
     * @notice Used to restrict function execution to calls initiated by the owner.
     */
    modifier onlyOwner() {
        if (msg.sender != owner) revert NotOwner();
        _;
    }

    /**
     * @notice Nominate a new owner for the contract.
     * @dev Only the current owner can nominate a new owner.
     * @param _owner Address of the new owner
     */
    function nominateNewOwner(address _owner) external onlyOwner {
        nominatedOwner = _owner;
    }

    /**
     * @notice Accept the ownership of the contract.
     * @dev Only the nominated owner can accept the ownership.
     */
    function acceptOwnership() external {
        if (msg.sender != nominatedOwner) revert NotNominatedOwner();

        owner = nominatedOwner;
        nominatedOwner = address(0);

        emit OwnerChanged(owner, nominatedOwner);
    }

    /**
     * @notice Manage Flox contributors.
     * @dev Flox contributor is allowed to manage all quests as well as their progress status for every user.
     * @param _contributor Address of the contributor to manage
     * @param _isContributor Status to assign the contributor. `false` to remove, `true` to add.
     */
    function manageFloxContributors(address _contributor, bool _isContributor) external onlyOwner {
        if (floxContributors[_contributor] == _isContributor) revert SameContributorStatus();

        floxContributors[_contributor] = _isContributor;

        emit FloxContributorUpdate(_contributor, _isContributor);
    }

    /**
     * @notice Update the specific contributor for a quest.
     * @dev Only the owner can call this function.
     * @dev We allow multiple contributors for a single quest, so that we support the possibility of automatic quest
     *  status updates as well as dedicated validators of quest completion to work in synergy.
     * @param _questId ID of the quest we are configuring the specific contibutor for.
     * @param _contributor Address of the quest contributor being managed
     * @param _isContributor Status to assign the contributor. `false` to remove, `true` to add.
     */
    function updateQuestContributor(uint256 _questId, address _contributor, bool _isContributor) external onlyOwner {
        if (questContributors[_questId][_contributor] == _isContributor) revert SameContributorStatus();

        questContributors[_questId][_contributor] = _isContributor;

        emit QuestContributorUpdate(_questId, _contributor, _isContributor);
    }

    /**
     * @notice Used to restrict function execution to calls initiated by a Quest contributor.
     * @param _questId ID of the quest to check the quest contributor status for
     */
    function _onlyQuestContributor(uint256 _questId) internal view {
        if (!questContributors[_questId][msg.sender]) revert NotQuestContributor();
    }

    /**
     * @notice Used to restrict function execution to calls initiated by a Flox contributor.
     */
    function _onlyFloxContributor() internal view {
        if (!floxContributors[msg.sender]) revert NotFloxContributor();
    }

    /**
     * @notice Used to restrict function execution to calls initiated by a Flox or Quest contributor.
     * @param _questId ID of the quest to check the quest contributor status for
     */
    function _onlyContributor(uint256 _questId) internal view {
        if (!floxContributors[msg.sender] && !questContributors[_questId][msg.sender]) {
            revert NotFloxOrQuestContributor();
        }
    }

    /// Storage gap to prevent storage collisions.
    uint256[50] private __gap;
}

File 3 of 5 : IQuestTrackerEvents.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.0;

/**
 * ====================================================================
 * |     ______                   _______                             |
 * |    / _____________ __  __   / ____(_____  ____ _____  ________   |
 * |   / /_  / ___/ __ `| |/_/  / /_  / / __ \/ __ `/ __ \/ ___/ _ \  |
 * |  / __/ / /  / /_/ _>  <   / __/ / / / / / /_/ / / / / /__/  __/  |
 * | /_/   /_/   \__,_/_/|_|  /_/   /_/_/ /_/\__,_/_/ /_/\___/\___/   |
 * |                                                                  |
 * ====================================================================
 * ======================== IQuestTrackerEvents =======================
 * ====================================================================
 * Frax Finance: https://github.com/FraxFinance
 */

import { IQuestTrackerErrors } from "./IQuestTrackerErrors.sol";

/**
 * @title IQuestTrackerEvents
 * @author Frax Finance
 * @notice A collection of events used by the Flox Quest tracker system.
 */
contract IQuestTrackerEvents is IQuestTrackerErrors {
    /**
     * @notice Emitted when the Flox contributor status is updated.
     * @param contributor Address of the cintributor being updated
     * @param isContributor New status assigned to the contributor
     */
    event FloxContributorUpdate(address contributor, bool isContributor);

    /**
     * @notice Emitted when the ownership of the contract is transferred.
     * @param oldOwner Address of the previous owner
     * @param newOwner Address of the new owner
     */
    event OwnerChanged(address oldOwner, address newOwner);

    /**
     * @notice Emitted when a new owner is nominated.
     * @param newOwner Address of the account nominated to be the new owner
     */
    event OwnerNominated(address newOwner);

    /**
     * @notice Emitted when a user's progress on a quest is updated.
     * @param user Address of the user receiving the quest status update
     * @param questId ID of the quest being updated
     * @param status New status assigned to the user's progress on the quest
     */
    event UserQuestStatusUpdated(address indexed user, uint256 indexed questId, UserQuestStatus status);

    /**
     * @notice Emitted when a new quest is added.
     * @param questId ID of the quest being added
     * @param reward Amount of FXTL received upon completion of the quest
     * @param startBlock Block at which the quest starts
     * @param endBlock Block at which the quest ends
     */
    event QuestAdded(uint256 indexed questId, uint256 reward, uint256 startBlock, uint256 endBlock);

    /**
     * @notice Emitted when the quest contributor status is updated.
     * @param questId ID of the quest receiving the contributor update
     * @param contributor Address of the contributor being updated
     * @param isContributor New status assigned to the contributor
     */
    event QuestContributorUpdate(uint256 questId, address contributor, bool isContributor);

    /**
     * @notice Emitted when a quest is updated.
     * @param questId ID of the quest being updated
     * @param reward Amount of FXRTL received upon completion of the quest
     * @param startBlock Block number at which the quest starts
     * @param endBlock BlockNumber at which the quest starts
     * @param status Status of the quest after the update
     */
    event QuestUpdated(
        uint256 indexed questId,
        uint256 reward,
        uint256 startBlock,
        uint256 endBlock,
        QuestStatus status
    );
}

File 4 of 5 : IQuestTrackerErrors.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.0;

/**
 * ====================================================================
 * |     ______                   _______                             |
 * |    / _____________ __  __   / ____(_____  ____ _____  ________   |
 * |   / /_  / ___/ __ `| |/_/  / /_  / / __ \/ __ `/ __ \/ ___/ _ \  |
 * |  / __/ / /  / /_/ _>  <   / __/ / / / / / /_/ / / / / /__/  __/  |
 * | /_/   /_/   \__,_/_/|_|  /_/   /_/_/ /_/\__,_/_/ /_/\___/\___/   |
 * |                                                                  |
 * ====================================================================
 * ======================== IQuestTrackerErrors =======================
 * ====================================================================
 * Frax Finance: https://github.com/FraxFinance
 */

import {IQuestTrackerEnums} from "./IQuestTrackerEnums.sol";

/**
 * @title IQuestTrackerErrors
 * @author Frax Finance
 * @notice A collection of events used by the Flox Quest tracker system.
 */
contract IQuestTrackerErrors is IQuestTrackerEnums {
    /// Returned if the smart contract is already initialized
    error AlreadyInitialized();

    /// Returned if the length of the arrays passed to a function do not match.
    error ArrayLengthMismatch();

    /// Returned if the start block is greater than the end block.
    error InvalidBlockRange();

    /**
     * @notice Returned if the user quest status update is invalid.
     * @param currentStatus The current status of the user's progress on the quest
     * @param attemptedStatus The status attempted to be assigned to the user's progress on the quest
     */
    error InvalidUserQuestStatusUpdate(UserQuestStatus currentStatus, UserQuestStatus attemptedStatus);

    /// Signifies that the caller is not a Flox contributor.
    error NotFloxContributor();

    /// Signifies tht the caller is neiter a Flox or Quest contributor.
    error NotFloxOrQuestContributor();

    /// Signifies that the caller is not the nominated owner.
    error NotNominatedOwner();

    /// Signifies that the caller is not the owner.
    error NotOwner();

    /// Signifies that the caller is not the quest contributor.
    error NotQuestContributor();

    /// Returned if the quest being accessed does not exist.
    error QuestDoesNotExist();

    /// Signifies that the attempted status change is the same as the preexisting status.
    error SameContributorStatus();
}

File 5 of 5 : IQuestTrackerEnums.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.0;

/**
 * ====================================================================
 * |     ______                   _______                             |
 * |    / _____________ __  __   / ____(_____  ____ _____  ________   |
 * |   / /_  / ___/ __ `| |/_/  / /_  / / __ \/ __ `/ __ \/ ___/ _ \  |
 * |  / __/ / /  / /_/ _>  <   / __/ / / / / / /_/ / / / / /__/  __/  |
 * | /_/   /_/   \__,_/_/|_|  /_/   /_/_/ /_/\__,_/_/ /_/\___/\___/   |
 * |                                                                  |
 * ====================================================================
 * ===================== IQuestTrackerEnums ===========================
 * ====================================================================
 * Frax Finance: https://github.com/FraxFinance
 */

/**
 * @title IQuestTrackerEnums
 * @author Frax Finance
 * @notice A collection of enums used by the Flox Quest tracker system.
 */
contract IQuestTrackerEnums {
    /**
     * @notice This enum represents the global status of a quest.
     */
    enum QuestStatus {
        Pending, // 0; Quest has not yet been added or fully defined
        Upcoming, // 1; Quest is defined but not yet active (the starting block is in the future)
        Active, // 2; Quest is currently active and can be completed by the users in order to earn rewards
        Expired // 3; Quest is no longer active and can no longer be completed by the users
    }

    /**
     * @notice This enum represents the status of a user's progress on a quest.
     */
    enum UserQuestStatus {
        Incomplete, // 0; User has not yet completed the quest
        PendingAllocation, // 1; User has completed the quest but the reward has not yet been allocated
        Allocated // 2; User has completed the quest and the reward has been allocated
    }
}

Settings
{
  "remappings": [
    "frax-std/=lib/frax-standard-solidity/src/",
    "@eth-optimism/=lib/optimism/packages/",
    "lib/optimism/packages/contracts-bedrock:src/=lib/optimism/packages/contracts-bedrock/src/",
    "src/=src/",
    "@openzeppelin-4/=node_modules/@openzeppelin-4/",
    "@openzeppelin-5/=node_modules/@openzeppelin-5/",
    "@openzeppelin/=node_modules/@openzeppelin/",
    "@rari-capital/=node_modules/@rari-capital/",
    "clones-with-immutable-args/=lib/optimism/packages/contracts-bedrock/lib/clones-with-immutable-args/src/",
    "ds-test/=lib/frax-standard-solidity/lib/forge-std/lib/ds-test/src/",
    "forge-std/=lib/frax-standard-solidity/lib/forge-std/src/",
    "frax-standard-solidity/=lib/frax-standard-solidity/src/",
    "kontrol-cheatcodes/=lib/optimism/packages/contracts-bedrock/lib/kontrol-cheatcodes/src/",
    "lib-keccak/=lib/optimism/packages/contracts-bedrock/lib/lib-keccak/contracts/",
    "openzeppelin-contracts-upgradeable/=lib/optimism/packages/contracts-bedrock/lib/openzeppelin-contracts-upgradeable/",
    "openzeppelin-contracts/=lib/optimism/packages/contracts-bedrock/lib/openzeppelin-contracts/",
    "optimism/=lib/optimism/",
    "safe-contracts/=lib/optimism/packages/contracts-bedrock/lib/safe-contracts/contracts/",
    "solady/=lib/optimism/packages/contracts-bedrock/lib/solady/",
    "solidity-bytes-utils/=lib/frax-standard-solidity/lib/solidity-bytes-utils/",
    "solmate/=lib/optimism/packages/contracts-bedrock/lib/solmate/src/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 100000
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "paris",
  "libraries": {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"name":"AlreadyInitialized","type":"error"},{"inputs":[],"name":"ArrayLengthMismatch","type":"error"},{"inputs":[],"name":"InvalidBlockRange","type":"error"},{"inputs":[{"internalType":"enum IQuestTrackerEnums.UserQuestStatus","name":"currentStatus","type":"uint8"},{"internalType":"enum IQuestTrackerEnums.UserQuestStatus","name":"attemptedStatus","type":"uint8"}],"name":"InvalidUserQuestStatusUpdate","type":"error"},{"inputs":[],"name":"NotFloxContributor","type":"error"},{"inputs":[],"name":"NotFloxOrQuestContributor","type":"error"},{"inputs":[],"name":"NotNominatedOwner","type":"error"},{"inputs":[],"name":"NotOwner","type":"error"},{"inputs":[],"name":"NotQuestContributor","type":"error"},{"inputs":[],"name":"QuestDoesNotExist","type":"error"},{"inputs":[],"name":"SameContributorStatus","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"contributor","type":"address"},{"indexed":false,"internalType":"bool","name":"isContributor","type":"bool"}],"name":"FloxContributorUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerNominated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"questId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"startBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endBlock","type":"uint256"}],"name":"QuestAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"questId","type":"uint256"},{"indexed":false,"internalType":"address","name":"contributor","type":"address"},{"indexed":false,"internalType":"bool","name":"isContributor","type":"bool"}],"name":"QuestContributorUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"questId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"startBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endBlock","type":"uint256"},{"indexed":false,"internalType":"enum IQuestTrackerEnums.QuestStatus","name":"status","type":"uint8"}],"name":"QuestUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"questId","type":"uint256"},{"indexed":false,"internalType":"enum IQuestTrackerEnums.UserQuestStatus","name":"status","type":"uint8"}],"name":"UserQuestStatusUpdated","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"reward","type":"uint256"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"endBlock","type":"uint256"},{"internalType":"string","name":"title","type":"string"},{"internalType":"string","name":"description","type":"string"}],"name":"addQuest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"},{"internalType":"uint256","name":"questId","type":"uint256"},{"internalType":"enum IQuestTrackerEnums.UserQuestStatus","name":"status","type":"uint8"}],"name":"bulkUpdateMultipleUsersQuestStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"},{"internalType":"uint256[]","name":"questIds","type":"uint256[]"},{"internalType":"enum IQuestTrackerEnums.UserQuestStatus[]","name":"statuses","type":"uint8[]"}],"name":"bulkUpdateMultipleUsersQuestsStatuses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256[]","name":"questIds","type":"uint256[]"},{"internalType":"enum IQuestTrackerEnums.UserQuestStatus[]","name":"statuses","type":"uint8[]"}],"name":"bulkUpdateSingleUserQuestStatuses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contributor","type":"address"}],"name":"floxContributors","outputs":[{"internalType":"bool","name":"isContributor","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_contributor","type":"address"},{"internalType":"bool","name":"_isContributor","type":"bool"}],"name":"manageFloxContributors","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nextQuestId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"nominateNewOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nominatedOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"questId","type":"uint256"},{"internalType":"address","name":"questContibutor","type":"address"}],"name":"questContributors","outputs":[{"internalType":"bool","name":"isContributor","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"questId","type":"uint256"}],"name":"quests","outputs":[{"internalType":"uint256","name":"reward","type":"uint256"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"endBlock","type":"uint256"},{"internalType":"enum IQuestTrackerEnums.QuestStatus","name":"status","type":"uint8"},{"internalType":"string","name":"title","type":"string"},{"internalType":"string","name":"description","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"questId","type":"uint256"},{"internalType":"uint256","name":"updatedReward","type":"uint256"},{"internalType":"uint256","name":"updatedStartBlock","type":"uint256"},{"internalType":"uint256","name":"updatedEndBlock","type":"uint256"},{"internalType":"string","name":"updatedTitle","type":"string"},{"internalType":"string","name":"updatedDescription","type":"string"}],"name":"updateQuest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_questId","type":"uint256"},{"internalType":"address","name":"_contributor","type":"address"},{"internalType":"bool","name":"_isContributor","type":"bool"}],"name":"updateQuestContributor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"questId","type":"uint256"},{"internalType":"enum IQuestTrackerEnums.UserQuestStatus","name":"status","type":"uint8"}],"name":"updateUserQuestStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"questId","type":"uint256"}],"name":"userQuests","outputs":[{"internalType":"enum IQuestTrackerEnums.UserQuestStatus","name":"status","type":"uint8"}],"stateMutability":"view","type":"function"}]

608060405234801561001057600080fd5b50612474806100206000396000f3fe608060405234801561001057600080fd5b50600436106101515760003560e01c80637b484022116100cd578063d638c98311610081578063e085f98011610066578063e085f98014610307578063e1d936371461032c578063fc403b7a1461035a57600080fd5b8063d638c983146102dd578063d7c7a41f146102f457600080fd5b80638da5cb5b116100b25780638da5cb5b1461026f5780639f4d58561461028f578063c4d66de8146102ca57600080fd5b80637b484022146102495780638b6326001461025c57600080fd5b80634fd9d1e011610124578063685767a011610109578063685767a01461021b57806369e968a21461022e57806379ba50971461024157600080fd5b80634fd9d1e0146101b357806353a47bb7146101d657600080fd5b80630d76afab14610156578063158ef93e1461016b5780631627540c1461018d57806336d1467a146101a0575b600080fd5b610169610164366004611c92565b61036d565b005b6039546101789060ff1681565b60405190151581526020015b60405180910390f35b61016961019b366004611d1a565b610767565b6101696101ae366004611d3c565b6107ff565b6101786101c1366004611d1a565b60026020526000908152604090205460ff1681565b6001546101f69073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610184565b610169610229366004611e06565b6109cd565b61016961023c366004611e87565b610b6e565b610169610e1a565b610169610257366004611ec2565b610ef3565b61016961026a366004611f10565b611150565b6000546101f69073ffffffffffffffffffffffffffffffffffffffff1681565b6102bd61029d366004611f99565b603760209081526000928352604080842090915290825290205460ff1681565b6040516101849190612006565b6101696102d8366004611d1a565b6114bd565b6102e660385481565b604051908152602001610184565b61016961030236600461202a565b611531565b61031a61031536600461205d565b611696565b604051610184969594939291906120ea565b61017861033a36600461213b565b600360209081526000928352604080842090915290825290205460ff1681565b610169610368366004612167565b6117e1565b610375611927565b81518351146103b0576040517fa24a13a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80518251146103eb576040517fa24a13a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b83518110156107615760385483828151811061040c5761040c612191565b60200260200101511061044b576040517f8150a44b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6037600085838151811061046157610461612191565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008483815181106104b7576104b7612191565b60209081029190910181015182528101919091526040016000205460ff1660028111156104e6576104e6611fc3565b8282815181106104f8576104f8612191565b6020026020010151600281111561051157610511611fc3565b116105fd576037600085838151811061052c5761052c612191565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084838151811061058257610582612191565b6020026020010151815260200190815260200160002060009054906101000a900460ff168282815181106105b8576105b8612191565b60200260200101516040517fad4955fe0000000000000000000000000000000000000000000000000000000081526004016105f49291906121c0565b60405180910390fd5b81818151811061060f5761060f612191565b60200260200101516037600086848151811061062d5761062d612191565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085848151811061068357610683612191565b6020026020010151815260200190815260200160002060006101000a81548160ff021916908360028111156106ba576106ba611fc3565b02179055508281815181106106d1576106d1612191565b60200260200101518482815181106106eb576106eb612191565b602002602001015173ffffffffffffffffffffffffffffffffffffffff167fd9e580fcfd14507572b3d361f3d417659f0904750daa571d71973973f9d70f2284848151811061073c5761073c612191565b60200260200101516040516107519190612006565b60405180910390a36001016103ee565b50505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146107b8576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b61080882611972565b6038548210610843576040517f8150a44b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8316600090815260376020908152604080832085845290915290205460ff16600281111561088857610888611fc3565b81600281111561089a5761089a611fc3565b116109095773ffffffffffffffffffffffffffffffffffffffff83166000908152603760209081526040808320858452909152908190205490517fad4955fe0000000000000000000000000000000000000000000000000000000081526105f49160ff169083906004016121c0565b73ffffffffffffffffffffffffffffffffffffffff83166000908152603760209081526040808320858452909152902080548291907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600183600281111561097457610974611fc3565b0217905550818373ffffffffffffffffffffffffffffffffffffffff167fd9e580fcfd14507572b3d361f3d417659f0904750daa571d71973973f9d70f22836040516109c09190612006565b60405180910390a3505050565b6109d5611927565b82841115610a0f576040517f4a90c82c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084431015610a2157506001610a35565b83431015610a3157506002610a35565b5060035b6040518060c00160405280878152602001868152602001858152602001826003811115610a6457610a64611fc3565b81526020018481526020018381525060366000603854815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030160006101000a81548160ff02191690836003811115610ad057610ad0611fc3565b021790555060808201516004820190610ae9908261227f565b5060a08201516005820190610afe908261227f565b50506038805491506000610b11836123c8565b91905055506001603854610b259190612400565b60408051888152602081018890529081018690527f564d54b0c338901d75d2e732afcb7cb2aeba7be8b25fb42fdaaf3621239dc9b29060600160405180910390a2505050505050565b610b76611927565b8051825114610bb1576040517fa24a13a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b825181101561076157603854838281518110610bd257610bd2612191565b602002602001015110610c11576040517f8150a44b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff841660009081526037602052604081208451909190859084908110610c4d57610c4d612191565b60209081029190910181015182528101919091526040016000205460ff166002811115610c7c57610c7c611fc3565b828281518110610c8e57610c8e612191565b60200260200101516002811115610ca757610ca7611fc3565b11610ce85773ffffffffffffffffffffffffffffffffffffffff84166000908152603760205260408120845190919085908490811061058257610582612191565b818181518110610cfa57610cfa612191565b6020026020010151603760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000858481518110610d5557610d55612191565b6020026020010151815260200190815260200160002060006101000a81548160ff02191690836002811115610d8c57610d8c611fc3565b0217905550828181518110610da357610da3612191565b60200260200101518473ffffffffffffffffffffffffffffffffffffffff167fd9e580fcfd14507572b3d361f3d417659f0904750daa571d71973973f9d70f22848481518110610df557610df5612191565b6020026020010151604051610e0a9190612006565b60405180910390a3600101610bb4565b60015473ffffffffffffffffffffffffffffffffffffffff163314610e6b576040517fb1f6da5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180546000805473ffffffffffffffffffffffffffffffffffffffff83167fffffffffffffffffffffffff00000000000000000000000000000000000000009182168117835592169092556040805191825260208201929092527fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c910160405180910390a1565b610efc82611972565b6038548210610f37576040517f8150a44b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b83518110156107615760376000858381518110610f5957610f59612191565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff168252818101929092526040908101600090812086825290925290205460ff166002811115610fab57610fab611fc3565b826002811115610fbd57610fbd611fc3565b1161104f5760376000858381518110610fd857610fd8612191565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff1682528181019290925260409081016000908120868252909252908190205490517fad4955fe0000000000000000000000000000000000000000000000000000000081526105f49160ff169084906004016121c0565b816037600086848151811061106657611066612191565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff1682528181019290925260409081016000908120878252909252902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660018360028111156110db576110db611fc3565b0217905550828482815181106110f3576110f3612191565b602002602001015173ffffffffffffffffffffffffffffffffffffffff167fd9e580fcfd14507572b3d361f3d417659f0904750daa571d71973973f9d70f22846040516111409190612006565b60405180910390a3600101610f3a565b611158611927565b6038548610611193576040517f8150a44b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b841561119f57846111af565b6000868152603660205260409020545b945083156111bd57836111d0565b6000868152603660205260409020600101545b935082156111de57826111f1565b6000868152603660205260409020600201545b92508151600014611202578161129d565b6000868152603660205260409020600401805461121e906121db565b80601f016020809104026020016040519081016040528092919081815260200182805461124a906121db565b80156112975780601f1061126c57610100808354040283529160200191611297565b820191906000526020600020905b81548152906001019060200180831161127a57829003601f168201915b50505050505b915080516000146112ae5780611349565b600086815260366020526040902060050180546112ca906121db565b80601f01602080910402602001604051908101604052809291908181526020018280546112f6906121db565b80156113435780601f1061131857610100808354040283529160200191611343565b820191906000526020600020905b81548152906001019060200180831161132657829003601f168201915b50505050505b905082841115611385576040517f4a90c82c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084431015611397575060016113ab565b834310156113a7575060026113ab565b5060035b6040518060c001604052808781526020018681526020018581526020018260038111156113da576113da611fc3565b8152602001848152602001838152506036600089815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030160006101000a81548160ff0219169083600381111561144457611444611fc3565b02179055506080820151600482019061145d908261227f565b5060a08201516005820190611472908261227f565b50905050867ff9563eeed6ea72b1ce1b1a6f05ff561a9c1427041e7ff09402b5b9ad7575da89878787856040516114ac9493929190612413565b60405180910390a250505050505050565b60395460ff16156114fa576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611503816119e6565b50603980547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60005473ffffffffffffffffffffffffffffffffffffffff163314611582576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616845290915290205481151560ff9091161515036115f3576040517fd31fc68300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168515159081179091558151878152928301939093528101919091527f8f670544d20af5fd2c568b1c2f0e21971fb6e9e6cc303fe9fac7579bc983ad319060600160405180910390a1505050565b6036602052600090815260409020805460018201546002830154600384015460048501805494959394929360ff909216926116d0906121db565b80601f01602080910402602001604051908101604052809291908181526020018280546116fc906121db565b80156117495780601f1061171e57610100808354040283529160200191611749565b820191906000526020600020905b81548152906001019060200180831161172c57829003601f168201915b50505050509080600501805461175e906121db565b80601f016020809104026020016040519081016040528092919081815260200182805461178a906121db565b80156117d75780601f106117ac576101008083540402835291602001916117d7565b820191906000526020600020905b8154815290600101906020018083116117ba57829003601f168201915b5050505050905086565b60005473ffffffffffffffffffffffffffffffffffffffff163314611832576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526002602052604090205481151560ff909116151503611899576040517fd31fc68300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821660008181526002602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168515159081179091558251938452908301527f1b6e6916bd76fb0e62ff02acf466a38852d02426c13ba96e69803693ac627d58910160405180910390a15050565b3360009081526002602052604090205460ff16611970576040517f6b697ed100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b3360009081526002602052604090205460ff161580156119ac5750600081815260036020908152604080832033845290915290205460ff16155b156119e3576040517f0e20c7ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b60005473ffffffffffffffffffffffffffffffffffffffff1615611a36576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611af357611af3611a7d565b604052919050565b600067ffffffffffffffff821115611b1557611b15611a7d565b5060051b60200190565b803573ffffffffffffffffffffffffffffffffffffffff81168114611b4357600080fd5b919050565b600082601f830112611b5957600080fd5b81356020611b6e611b6983611afb565b611aac565b8083825260208201915060208460051b870101935086841115611b9057600080fd5b602086015b84811015611bb357611ba681611b1f565b8352918301918301611b95565b509695505050505050565b600082601f830112611bcf57600080fd5b81356020611bdf611b6983611afb565b8083825260208201915060208460051b870101935086841115611c0157600080fd5b602086015b84811015611bb35780358352918301918301611c06565b803560038110611b4357600080fd5b600082601f830112611c3d57600080fd5b81356020611c4d611b6983611afb565b8083825260208201915060208460051b870101935086841115611c6f57600080fd5b602086015b84811015611bb357611c8581611c1d565b8352918301918301611c74565b600080600060608486031215611ca757600080fd5b833567ffffffffffffffff80821115611cbf57600080fd5b611ccb87838801611b48565b94506020860135915080821115611ce157600080fd5b611ced87838801611bbe565b93506040860135915080821115611d0357600080fd5b50611d1086828701611c2c565b9150509250925092565b600060208284031215611d2c57600080fd5b611d3582611b1f565b9392505050565b600080600060608486031215611d5157600080fd5b611d5a84611b1f565b925060208401359150611d6f60408501611c1d565b90509250925092565b600082601f830112611d8957600080fd5b813567ffffffffffffffff811115611da357611da3611a7d565b611dd460207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611aac565b818152846020838601011115611de957600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a08688031215611e1e57600080fd5b853594506020860135935060408601359250606086013567ffffffffffffffff80821115611e4b57600080fd5b611e5789838a01611d78565b93506080880135915080821115611e6d57600080fd5b50611e7a88828901611d78565b9150509295509295909350565b600080600060608486031215611e9c57600080fd5b611ea584611b1f565b9250602084013567ffffffffffffffff80821115611ce157600080fd5b600080600060608486031215611ed757600080fd5b833567ffffffffffffffff811115611eee57600080fd5b611efa86828701611b48565b93505060208401359150611d6f60408501611c1d565b60008060008060008060c08789031215611f2957600080fd5b86359550602087013594506040870135935060608701359250608087013567ffffffffffffffff80821115611f5d57600080fd5b611f698a838b01611d78565b935060a0890135915080821115611f7f57600080fd5b50611f8c89828a01611d78565b9150509295509295509295565b60008060408385031215611fac57600080fd5b611fb583611b1f565b946020939093013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6003811061200257612002611fc3565b9052565b602081016120148284611ff2565b92915050565b80358015158114611b4357600080fd5b60008060006060848603121561203f57600080fd5b8335925061204f60208501611b1f565b9150611d6f6040850161201a565b60006020828403121561206f57600080fd5b5035919050565b6004811061200257612002611fc3565b6000815180845260005b818110156120ac57602081850181015186830182015201612090565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b8681528560208201528460408201526121066060820185612076565b60c06080820152600061211c60c0830185612086565b82810360a084015261212e8185612086565b9998505050505050505050565b6000806040838503121561214e57600080fd5b8235915061215e60208401611b1f565b90509250929050565b6000806040838503121561217a57600080fd5b61218383611b1f565b915061215e6020840161201a565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b604081016121ce8285611ff2565b611d356020830184611ff2565b600181811c908216806121ef57607f821691505b602082108103612228577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f82111561227a576000816000526020600020601f850160051c810160208610156122575750805b601f850160051c820191505b8181101561227657828155600101612263565b5050505b505050565b815167ffffffffffffffff81111561229957612299611a7d565b6122ad816122a784546121db565b8461222e565b602080601f83116001811461230057600084156122ca5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555612276565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561234d5788860151825594840194600190910190840161232e565b508582101561238957878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036123f9576123f9612399565b5060010190565b8181038181111561201457612014612399565b8481526020810184905260408101839052608081016124356060830184612076565b9594505050505056fea264697066735822122034c21958f1c557bd7a4c0a56342135d6743abc40a888fbde35163feaecfb2eef64736f6c63430008170033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101515760003560e01c80637b484022116100cd578063d638c98311610081578063e085f98011610066578063e085f98014610307578063e1d936371461032c578063fc403b7a1461035a57600080fd5b8063d638c983146102dd578063d7c7a41f146102f457600080fd5b80638da5cb5b116100b25780638da5cb5b1461026f5780639f4d58561461028f578063c4d66de8146102ca57600080fd5b80637b484022146102495780638b6326001461025c57600080fd5b80634fd9d1e011610124578063685767a011610109578063685767a01461021b57806369e968a21461022e57806379ba50971461024157600080fd5b80634fd9d1e0146101b357806353a47bb7146101d657600080fd5b80630d76afab14610156578063158ef93e1461016b5780631627540c1461018d57806336d1467a146101a0575b600080fd5b610169610164366004611c92565b61036d565b005b6039546101789060ff1681565b60405190151581526020015b60405180910390f35b61016961019b366004611d1a565b610767565b6101696101ae366004611d3c565b6107ff565b6101786101c1366004611d1a565b60026020526000908152604090205460ff1681565b6001546101f69073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610184565b610169610229366004611e06565b6109cd565b61016961023c366004611e87565b610b6e565b610169610e1a565b610169610257366004611ec2565b610ef3565b61016961026a366004611f10565b611150565b6000546101f69073ffffffffffffffffffffffffffffffffffffffff1681565b6102bd61029d366004611f99565b603760209081526000928352604080842090915290825290205460ff1681565b6040516101849190612006565b6101696102d8366004611d1a565b6114bd565b6102e660385481565b604051908152602001610184565b61016961030236600461202a565b611531565b61031a61031536600461205d565b611696565b604051610184969594939291906120ea565b61017861033a36600461213b565b600360209081526000928352604080842090915290825290205460ff1681565b610169610368366004612167565b6117e1565b610375611927565b81518351146103b0576040517fa24a13a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80518251146103eb576040517fa24a13a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b83518110156107615760385483828151811061040c5761040c612191565b60200260200101511061044b576040517f8150a44b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6037600085838151811061046157610461612191565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008483815181106104b7576104b7612191565b60209081029190910181015182528101919091526040016000205460ff1660028111156104e6576104e6611fc3565b8282815181106104f8576104f8612191565b6020026020010151600281111561051157610511611fc3565b116105fd576037600085838151811061052c5761052c612191565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084838151811061058257610582612191565b6020026020010151815260200190815260200160002060009054906101000a900460ff168282815181106105b8576105b8612191565b60200260200101516040517fad4955fe0000000000000000000000000000000000000000000000000000000081526004016105f49291906121c0565b60405180910390fd5b81818151811061060f5761060f612191565b60200260200101516037600086848151811061062d5761062d612191565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085848151811061068357610683612191565b6020026020010151815260200190815260200160002060006101000a81548160ff021916908360028111156106ba576106ba611fc3565b02179055508281815181106106d1576106d1612191565b60200260200101518482815181106106eb576106eb612191565b602002602001015173ffffffffffffffffffffffffffffffffffffffff167fd9e580fcfd14507572b3d361f3d417659f0904750daa571d71973973f9d70f2284848151811061073c5761073c612191565b60200260200101516040516107519190612006565b60405180910390a36001016103ee565b50505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146107b8576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b61080882611972565b6038548210610843576040517f8150a44b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8316600090815260376020908152604080832085845290915290205460ff16600281111561088857610888611fc3565b81600281111561089a5761089a611fc3565b116109095773ffffffffffffffffffffffffffffffffffffffff83166000908152603760209081526040808320858452909152908190205490517fad4955fe0000000000000000000000000000000000000000000000000000000081526105f49160ff169083906004016121c0565b73ffffffffffffffffffffffffffffffffffffffff83166000908152603760209081526040808320858452909152902080548291907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600183600281111561097457610974611fc3565b0217905550818373ffffffffffffffffffffffffffffffffffffffff167fd9e580fcfd14507572b3d361f3d417659f0904750daa571d71973973f9d70f22836040516109c09190612006565b60405180910390a3505050565b6109d5611927565b82841115610a0f576040517f4a90c82c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084431015610a2157506001610a35565b83431015610a3157506002610a35565b5060035b6040518060c00160405280878152602001868152602001858152602001826003811115610a6457610a64611fc3565b81526020018481526020018381525060366000603854815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030160006101000a81548160ff02191690836003811115610ad057610ad0611fc3565b021790555060808201516004820190610ae9908261227f565b5060a08201516005820190610afe908261227f565b50506038805491506000610b11836123c8565b91905055506001603854610b259190612400565b60408051888152602081018890529081018690527f564d54b0c338901d75d2e732afcb7cb2aeba7be8b25fb42fdaaf3621239dc9b29060600160405180910390a2505050505050565b610b76611927565b8051825114610bb1576040517fa24a13a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b825181101561076157603854838281518110610bd257610bd2612191565b602002602001015110610c11576040517f8150a44b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff841660009081526037602052604081208451909190859084908110610c4d57610c4d612191565b60209081029190910181015182528101919091526040016000205460ff166002811115610c7c57610c7c611fc3565b828281518110610c8e57610c8e612191565b60200260200101516002811115610ca757610ca7611fc3565b11610ce85773ffffffffffffffffffffffffffffffffffffffff84166000908152603760205260408120845190919085908490811061058257610582612191565b818181518110610cfa57610cfa612191565b6020026020010151603760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000858481518110610d5557610d55612191565b6020026020010151815260200190815260200160002060006101000a81548160ff02191690836002811115610d8c57610d8c611fc3565b0217905550828181518110610da357610da3612191565b60200260200101518473ffffffffffffffffffffffffffffffffffffffff167fd9e580fcfd14507572b3d361f3d417659f0904750daa571d71973973f9d70f22848481518110610df557610df5612191565b6020026020010151604051610e0a9190612006565b60405180910390a3600101610bb4565b60015473ffffffffffffffffffffffffffffffffffffffff163314610e6b576040517fb1f6da5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180546000805473ffffffffffffffffffffffffffffffffffffffff83167fffffffffffffffffffffffff00000000000000000000000000000000000000009182168117835592169092556040805191825260208201929092527fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c910160405180910390a1565b610efc82611972565b6038548210610f37576040517f8150a44b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b83518110156107615760376000858381518110610f5957610f59612191565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff168252818101929092526040908101600090812086825290925290205460ff166002811115610fab57610fab611fc3565b826002811115610fbd57610fbd611fc3565b1161104f5760376000858381518110610fd857610fd8612191565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff1682528181019290925260409081016000908120868252909252908190205490517fad4955fe0000000000000000000000000000000000000000000000000000000081526105f49160ff169084906004016121c0565b816037600086848151811061106657611066612191565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff1682528181019290925260409081016000908120878252909252902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660018360028111156110db576110db611fc3565b0217905550828482815181106110f3576110f3612191565b602002602001015173ffffffffffffffffffffffffffffffffffffffff167fd9e580fcfd14507572b3d361f3d417659f0904750daa571d71973973f9d70f22846040516111409190612006565b60405180910390a3600101610f3a565b611158611927565b6038548610611193576040517f8150a44b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b841561119f57846111af565b6000868152603660205260409020545b945083156111bd57836111d0565b6000868152603660205260409020600101545b935082156111de57826111f1565b6000868152603660205260409020600201545b92508151600014611202578161129d565b6000868152603660205260409020600401805461121e906121db565b80601f016020809104026020016040519081016040528092919081815260200182805461124a906121db565b80156112975780601f1061126c57610100808354040283529160200191611297565b820191906000526020600020905b81548152906001019060200180831161127a57829003601f168201915b50505050505b915080516000146112ae5780611349565b600086815260366020526040902060050180546112ca906121db565b80601f01602080910402602001604051908101604052809291908181526020018280546112f6906121db565b80156113435780601f1061131857610100808354040283529160200191611343565b820191906000526020600020905b81548152906001019060200180831161132657829003601f168201915b50505050505b905082841115611385576040517f4a90c82c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084431015611397575060016113ab565b834310156113a7575060026113ab565b5060035b6040518060c001604052808781526020018681526020018581526020018260038111156113da576113da611fc3565b8152602001848152602001838152506036600089815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030160006101000a81548160ff0219169083600381111561144457611444611fc3565b02179055506080820151600482019061145d908261227f565b5060a08201516005820190611472908261227f565b50905050867ff9563eeed6ea72b1ce1b1a6f05ff561a9c1427041e7ff09402b5b9ad7575da89878787856040516114ac9493929190612413565b60405180910390a250505050505050565b60395460ff16156114fa576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611503816119e6565b50603980547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60005473ffffffffffffffffffffffffffffffffffffffff163314611582576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616845290915290205481151560ff9091161515036115f3576040517fd31fc68300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168515159081179091558151878152928301939093528101919091527f8f670544d20af5fd2c568b1c2f0e21971fb6e9e6cc303fe9fac7579bc983ad319060600160405180910390a1505050565b6036602052600090815260409020805460018201546002830154600384015460048501805494959394929360ff909216926116d0906121db565b80601f01602080910402602001604051908101604052809291908181526020018280546116fc906121db565b80156117495780601f1061171e57610100808354040283529160200191611749565b820191906000526020600020905b81548152906001019060200180831161172c57829003601f168201915b50505050509080600501805461175e906121db565b80601f016020809104026020016040519081016040528092919081815260200182805461178a906121db565b80156117d75780601f106117ac576101008083540402835291602001916117d7565b820191906000526020600020905b8154815290600101906020018083116117ba57829003601f168201915b5050505050905086565b60005473ffffffffffffffffffffffffffffffffffffffff163314611832576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526002602052604090205481151560ff909116151503611899576040517fd31fc68300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821660008181526002602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168515159081179091558251938452908301527f1b6e6916bd76fb0e62ff02acf466a38852d02426c13ba96e69803693ac627d58910160405180910390a15050565b3360009081526002602052604090205460ff16611970576040517f6b697ed100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b3360009081526002602052604090205460ff161580156119ac5750600081815260036020908152604080832033845290915290205460ff16155b156119e3576040517f0e20c7ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b60005473ffffffffffffffffffffffffffffffffffffffff1615611a36576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611af357611af3611a7d565b604052919050565b600067ffffffffffffffff821115611b1557611b15611a7d565b5060051b60200190565b803573ffffffffffffffffffffffffffffffffffffffff81168114611b4357600080fd5b919050565b600082601f830112611b5957600080fd5b81356020611b6e611b6983611afb565b611aac565b8083825260208201915060208460051b870101935086841115611b9057600080fd5b602086015b84811015611bb357611ba681611b1f565b8352918301918301611b95565b509695505050505050565b600082601f830112611bcf57600080fd5b81356020611bdf611b6983611afb565b8083825260208201915060208460051b870101935086841115611c0157600080fd5b602086015b84811015611bb35780358352918301918301611c06565b803560038110611b4357600080fd5b600082601f830112611c3d57600080fd5b81356020611c4d611b6983611afb565b8083825260208201915060208460051b870101935086841115611c6f57600080fd5b602086015b84811015611bb357611c8581611c1d565b8352918301918301611c74565b600080600060608486031215611ca757600080fd5b833567ffffffffffffffff80821115611cbf57600080fd5b611ccb87838801611b48565b94506020860135915080821115611ce157600080fd5b611ced87838801611bbe565b93506040860135915080821115611d0357600080fd5b50611d1086828701611c2c565b9150509250925092565b600060208284031215611d2c57600080fd5b611d3582611b1f565b9392505050565b600080600060608486031215611d5157600080fd5b611d5a84611b1f565b925060208401359150611d6f60408501611c1d565b90509250925092565b600082601f830112611d8957600080fd5b813567ffffffffffffffff811115611da357611da3611a7d565b611dd460207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611aac565b818152846020838601011115611de957600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a08688031215611e1e57600080fd5b853594506020860135935060408601359250606086013567ffffffffffffffff80821115611e4b57600080fd5b611e5789838a01611d78565b93506080880135915080821115611e6d57600080fd5b50611e7a88828901611d78565b9150509295509295909350565b600080600060608486031215611e9c57600080fd5b611ea584611b1f565b9250602084013567ffffffffffffffff80821115611ce157600080fd5b600080600060608486031215611ed757600080fd5b833567ffffffffffffffff811115611eee57600080fd5b611efa86828701611b48565b93505060208401359150611d6f60408501611c1d565b60008060008060008060c08789031215611f2957600080fd5b86359550602087013594506040870135935060608701359250608087013567ffffffffffffffff80821115611f5d57600080fd5b611f698a838b01611d78565b935060a0890135915080821115611f7f57600080fd5b50611f8c89828a01611d78565b9150509295509295509295565b60008060408385031215611fac57600080fd5b611fb583611b1f565b946020939093013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6003811061200257612002611fc3565b9052565b602081016120148284611ff2565b92915050565b80358015158114611b4357600080fd5b60008060006060848603121561203f57600080fd5b8335925061204f60208501611b1f565b9150611d6f6040850161201a565b60006020828403121561206f57600080fd5b5035919050565b6004811061200257612002611fc3565b6000815180845260005b818110156120ac57602081850181015186830182015201612090565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b8681528560208201528460408201526121066060820185612076565b60c06080820152600061211c60c0830185612086565b82810360a084015261212e8185612086565b9998505050505050505050565b6000806040838503121561214e57600080fd5b8235915061215e60208401611b1f565b90509250929050565b6000806040838503121561217a57600080fd5b61218383611b1f565b915061215e6020840161201a565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b604081016121ce8285611ff2565b611d356020830184611ff2565b600181811c908216806121ef57607f821691505b602082108103612228577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f82111561227a576000816000526020600020601f850160051c810160208610156122575750805b601f850160051c820191505b8181101561227657828155600101612263565b5050505b505050565b815167ffffffffffffffff81111561229957612299611a7d565b6122ad816122a784546121db565b8461222e565b602080601f83116001811461230057600084156122ca5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555612276565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561234d5788860151825594840194600190910190840161232e565b508582101561238957878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036123f9576123f9612399565b5060010190565b8181038181111561201457612014612399565b8481526020810184905260408101839052608081016124356060830184612076565b9594505050505056fea264697066735822122034c21958f1c557bd7a4c0a56342135d6743abc40a888fbde35163feaecfb2eef64736f6c63430008170033

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.