Source Code
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Cross-Chain Transactions
Loading...
Loading
Contract Name:
QuestTracker
Compiler Version
v0.8.23+commit.f704f362
Optimization Enabled:
Yes with 100000 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// 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;
}// 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
);
}// 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();
}// 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
}
}{
"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
- No Contract Security Audit Submitted- Submit Audit Here
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"}]Contract Creation Code
608060405234801561001057600080fd5b50612474806100206000396000f3fe608060405234801561001057600080fd5b50600436106101515760003560e01c80637b484022116100cd578063d638c98311610081578063e085f98011610066578063e085f98014610307578063e1d936371461032c578063fc403b7a1461035a57600080fd5b8063d638c983146102dd578063d7c7a41f146102f457600080fd5b80638da5cb5b116100b25780638da5cb5b1461026f5780639f4d58561461028f578063c4d66de8146102ca57600080fd5b80637b484022146102495780638b6326001461025c57600080fd5b80634fd9d1e011610124578063685767a011610109578063685767a01461021b57806369e968a21461022e57806379ba50971461024157600080fd5b80634fd9d1e0146101b357806353a47bb7146101d657600080fd5b80630d76afab14610156578063158ef93e1461016b5780631627540c1461018d57806336d1467a146101a0575b600080fd5b610169610164366004611c92565b61036d565b005b6039546101789060ff1681565b60405190151581526020015b60405180910390f35b61016961019b366004611d1a565b610767565b6101696101ae366004611d3c565b6107ff565b6101786101c1366004611d1a565b60026020526000908152604090205460ff1681565b6001546101f69073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610184565b610169610229366004611e06565b6109cd565b61016961023c366004611e87565b610b6e565b610169610e1a565b610169610257366004611ec2565b610ef3565b61016961026a366004611f10565b611150565b6000546101f69073ffffffffffffffffffffffffffffffffffffffff1681565b6102bd61029d366004611f99565b603760209081526000928352604080842090915290825290205460ff1681565b6040516101849190612006565b6101696102d8366004611d1a565b6114bd565b6102e660385481565b604051908152602001610184565b61016961030236600461202a565b611531565b61031a61031536600461205d565b611696565b604051610184969594939291906120ea565b61017861033a36600461213b565b600360209081526000928352604080842090915290825290205460ff1681565b610169610368366004612167565b6117e1565b610375611927565b81518351146103b0576040517fa24a13a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80518251146103eb576040517fa24a13a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b83518110156107615760385483828151811061040c5761040c612191565b60200260200101511061044b576040517f8150a44b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6037600085838151811061046157610461612191565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008483815181106104b7576104b7612191565b60209081029190910181015182528101919091526040016000205460ff1660028111156104e6576104e6611fc3565b8282815181106104f8576104f8612191565b6020026020010151600281111561051157610511611fc3565b116105fd576037600085838151811061052c5761052c612191565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084838151811061058257610582612191565b6020026020010151815260200190815260200160002060009054906101000a900460ff168282815181106105b8576105b8612191565b60200260200101516040517fad4955fe0000000000000000000000000000000000000000000000000000000081526004016105f49291906121c0565b60405180910390fd5b81818151811061060f5761060f612191565b60200260200101516037600086848151811061062d5761062d612191565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085848151811061068357610683612191565b6020026020010151815260200190815260200160002060006101000a81548160ff021916908360028111156106ba576106ba611fc3565b02179055508281815181106106d1576106d1612191565b60200260200101518482815181106106eb576106eb612191565b602002602001015173ffffffffffffffffffffffffffffffffffffffff167fd9e580fcfd14507572b3d361f3d417659f0904750daa571d71973973f9d70f2284848151811061073c5761073c612191565b60200260200101516040516107519190612006565b60405180910390a36001016103ee565b50505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146107b8576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b61080882611972565b6038548210610843576040517f8150a44b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8316600090815260376020908152604080832085845290915290205460ff16600281111561088857610888611fc3565b81600281111561089a5761089a611fc3565b116109095773ffffffffffffffffffffffffffffffffffffffff83166000908152603760209081526040808320858452909152908190205490517fad4955fe0000000000000000000000000000000000000000000000000000000081526105f49160ff169083906004016121c0565b73ffffffffffffffffffffffffffffffffffffffff83166000908152603760209081526040808320858452909152902080548291907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600183600281111561097457610974611fc3565b0217905550818373ffffffffffffffffffffffffffffffffffffffff167fd9e580fcfd14507572b3d361f3d417659f0904750daa571d71973973f9d70f22836040516109c09190612006565b60405180910390a3505050565b6109d5611927565b82841115610a0f576040517f4a90c82c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084431015610a2157506001610a35565b83431015610a3157506002610a35565b5060035b6040518060c00160405280878152602001868152602001858152602001826003811115610a6457610a64611fc3565b81526020018481526020018381525060366000603854815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030160006101000a81548160ff02191690836003811115610ad057610ad0611fc3565b021790555060808201516004820190610ae9908261227f565b5060a08201516005820190610afe908261227f565b50506038805491506000610b11836123c8565b91905055506001603854610b259190612400565b60408051888152602081018890529081018690527f564d54b0c338901d75d2e732afcb7cb2aeba7be8b25fb42fdaaf3621239dc9b29060600160405180910390a2505050505050565b610b76611927565b8051825114610bb1576040517fa24a13a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b825181101561076157603854838281518110610bd257610bd2612191565b602002602001015110610c11576040517f8150a44b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff841660009081526037602052604081208451909190859084908110610c4d57610c4d612191565b60209081029190910181015182528101919091526040016000205460ff166002811115610c7c57610c7c611fc3565b828281518110610c8e57610c8e612191565b60200260200101516002811115610ca757610ca7611fc3565b11610ce85773ffffffffffffffffffffffffffffffffffffffff84166000908152603760205260408120845190919085908490811061058257610582612191565b818181518110610cfa57610cfa612191565b6020026020010151603760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000858481518110610d5557610d55612191565b6020026020010151815260200190815260200160002060006101000a81548160ff02191690836002811115610d8c57610d8c611fc3565b0217905550828181518110610da357610da3612191565b60200260200101518473ffffffffffffffffffffffffffffffffffffffff167fd9e580fcfd14507572b3d361f3d417659f0904750daa571d71973973f9d70f22848481518110610df557610df5612191565b6020026020010151604051610e0a9190612006565b60405180910390a3600101610bb4565b60015473ffffffffffffffffffffffffffffffffffffffff163314610e6b576040517fb1f6da5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180546000805473ffffffffffffffffffffffffffffffffffffffff83167fffffffffffffffffffffffff00000000000000000000000000000000000000009182168117835592169092556040805191825260208201929092527fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c910160405180910390a1565b610efc82611972565b6038548210610f37576040517f8150a44b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b83518110156107615760376000858381518110610f5957610f59612191565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff168252818101929092526040908101600090812086825290925290205460ff166002811115610fab57610fab611fc3565b826002811115610fbd57610fbd611fc3565b1161104f5760376000858381518110610fd857610fd8612191565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff1682528181019290925260409081016000908120868252909252908190205490517fad4955fe0000000000000000000000000000000000000000000000000000000081526105f49160ff169084906004016121c0565b816037600086848151811061106657611066612191565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff1682528181019290925260409081016000908120878252909252902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660018360028111156110db576110db611fc3565b0217905550828482815181106110f3576110f3612191565b602002602001015173ffffffffffffffffffffffffffffffffffffffff167fd9e580fcfd14507572b3d361f3d417659f0904750daa571d71973973f9d70f22846040516111409190612006565b60405180910390a3600101610f3a565b611158611927565b6038548610611193576040517f8150a44b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b841561119f57846111af565b6000868152603660205260409020545b945083156111bd57836111d0565b6000868152603660205260409020600101545b935082156111de57826111f1565b6000868152603660205260409020600201545b92508151600014611202578161129d565b6000868152603660205260409020600401805461121e906121db565b80601f016020809104026020016040519081016040528092919081815260200182805461124a906121db565b80156112975780601f1061126c57610100808354040283529160200191611297565b820191906000526020600020905b81548152906001019060200180831161127a57829003601f168201915b50505050505b915080516000146112ae5780611349565b600086815260366020526040902060050180546112ca906121db565b80601f01602080910402602001604051908101604052809291908181526020018280546112f6906121db565b80156113435780601f1061131857610100808354040283529160200191611343565b820191906000526020600020905b81548152906001019060200180831161132657829003601f168201915b50505050505b905082841115611385576040517f4a90c82c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084431015611397575060016113ab565b834310156113a7575060026113ab565b5060035b6040518060c001604052808781526020018681526020018581526020018260038111156113da576113da611fc3565b8152602001848152602001838152506036600089815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030160006101000a81548160ff0219169083600381111561144457611444611fc3565b02179055506080820151600482019061145d908261227f565b5060a08201516005820190611472908261227f565b50905050867ff9563eeed6ea72b1ce1b1a6f05ff561a9c1427041e7ff09402b5b9ad7575da89878787856040516114ac9493929190612413565b60405180910390a250505050505050565b60395460ff16156114fa576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611503816119e6565b50603980547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60005473ffffffffffffffffffffffffffffffffffffffff163314611582576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616845290915290205481151560ff9091161515036115f3576040517fd31fc68300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168515159081179091558151878152928301939093528101919091527f8f670544d20af5fd2c568b1c2f0e21971fb6e9e6cc303fe9fac7579bc983ad319060600160405180910390a1505050565b6036602052600090815260409020805460018201546002830154600384015460048501805494959394929360ff909216926116d0906121db565b80601f01602080910402602001604051908101604052809291908181526020018280546116fc906121db565b80156117495780601f1061171e57610100808354040283529160200191611749565b820191906000526020600020905b81548152906001019060200180831161172c57829003601f168201915b50505050509080600501805461175e906121db565b80601f016020809104026020016040519081016040528092919081815260200182805461178a906121db565b80156117d75780601f106117ac576101008083540402835291602001916117d7565b820191906000526020600020905b8154815290600101906020018083116117ba57829003601f168201915b5050505050905086565b60005473ffffffffffffffffffffffffffffffffffffffff163314611832576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526002602052604090205481151560ff909116151503611899576040517fd31fc68300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821660008181526002602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168515159081179091558251938452908301527f1b6e6916bd76fb0e62ff02acf466a38852d02426c13ba96e69803693ac627d58910160405180910390a15050565b3360009081526002602052604090205460ff16611970576040517f6b697ed100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b3360009081526002602052604090205460ff161580156119ac5750600081815260036020908152604080832033845290915290205460ff16155b156119e3576040517f0e20c7ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b60005473ffffffffffffffffffffffffffffffffffffffff1615611a36576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611af357611af3611a7d565b604052919050565b600067ffffffffffffffff821115611b1557611b15611a7d565b5060051b60200190565b803573ffffffffffffffffffffffffffffffffffffffff81168114611b4357600080fd5b919050565b600082601f830112611b5957600080fd5b81356020611b6e611b6983611afb565b611aac565b8083825260208201915060208460051b870101935086841115611b9057600080fd5b602086015b84811015611bb357611ba681611b1f565b8352918301918301611b95565b509695505050505050565b600082601f830112611bcf57600080fd5b81356020611bdf611b6983611afb565b8083825260208201915060208460051b870101935086841115611c0157600080fd5b602086015b84811015611bb35780358352918301918301611c06565b803560038110611b4357600080fd5b600082601f830112611c3d57600080fd5b81356020611c4d611b6983611afb565b8083825260208201915060208460051b870101935086841115611c6f57600080fd5b602086015b84811015611bb357611c8581611c1d565b8352918301918301611c74565b600080600060608486031215611ca757600080fd5b833567ffffffffffffffff80821115611cbf57600080fd5b611ccb87838801611b48565b94506020860135915080821115611ce157600080fd5b611ced87838801611bbe565b93506040860135915080821115611d0357600080fd5b50611d1086828701611c2c565b9150509250925092565b600060208284031215611d2c57600080fd5b611d3582611b1f565b9392505050565b600080600060608486031215611d5157600080fd5b611d5a84611b1f565b925060208401359150611d6f60408501611c1d565b90509250925092565b600082601f830112611d8957600080fd5b813567ffffffffffffffff811115611da357611da3611a7d565b611dd460207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611aac565b818152846020838601011115611de957600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a08688031215611e1e57600080fd5b853594506020860135935060408601359250606086013567ffffffffffffffff80821115611e4b57600080fd5b611e5789838a01611d78565b93506080880135915080821115611e6d57600080fd5b50611e7a88828901611d78565b9150509295509295909350565b600080600060608486031215611e9c57600080fd5b611ea584611b1f565b9250602084013567ffffffffffffffff80821115611ce157600080fd5b600080600060608486031215611ed757600080fd5b833567ffffffffffffffff811115611eee57600080fd5b611efa86828701611b48565b93505060208401359150611d6f60408501611c1d565b60008060008060008060c08789031215611f2957600080fd5b86359550602087013594506040870135935060608701359250608087013567ffffffffffffffff80821115611f5d57600080fd5b611f698a838b01611d78565b935060a0890135915080821115611f7f57600080fd5b50611f8c89828a01611d78565b9150509295509295509295565b60008060408385031215611fac57600080fd5b611fb583611b1f565b946020939093013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6003811061200257612002611fc3565b9052565b602081016120148284611ff2565b92915050565b80358015158114611b4357600080fd5b60008060006060848603121561203f57600080fd5b8335925061204f60208501611b1f565b9150611d6f6040850161201a565b60006020828403121561206f57600080fd5b5035919050565b6004811061200257612002611fc3565b6000815180845260005b818110156120ac57602081850181015186830182015201612090565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b8681528560208201528460408201526121066060820185612076565b60c06080820152600061211c60c0830185612086565b82810360a084015261212e8185612086565b9998505050505050505050565b6000806040838503121561214e57600080fd5b8235915061215e60208401611b1f565b90509250929050565b6000806040838503121561217a57600080fd5b61218383611b1f565b915061215e6020840161201a565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b604081016121ce8285611ff2565b611d356020830184611ff2565b600181811c908216806121ef57607f821691505b602082108103612228577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f82111561227a576000816000526020600020601f850160051c810160208610156122575750805b601f850160051c820191505b8181101561227657828155600101612263565b5050505b505050565b815167ffffffffffffffff81111561229957612299611a7d565b6122ad816122a784546121db565b8461222e565b602080601f83116001811461230057600084156122ca5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555612276565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561234d5788860151825594840194600190910190840161232e565b508582101561238957878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036123f9576123f9612399565b5060010190565b8181038181111561201457612014612399565b8481526020810184905260408101839052608081016124356060830184612076565b9594505050505056fea264697066735822122034c21958f1c557bd7a4c0a56342135d6743abc40a888fbde35163feaecfb2eef64736f6c63430008170033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101515760003560e01c80637b484022116100cd578063d638c98311610081578063e085f98011610066578063e085f98014610307578063e1d936371461032c578063fc403b7a1461035a57600080fd5b8063d638c983146102dd578063d7c7a41f146102f457600080fd5b80638da5cb5b116100b25780638da5cb5b1461026f5780639f4d58561461028f578063c4d66de8146102ca57600080fd5b80637b484022146102495780638b6326001461025c57600080fd5b80634fd9d1e011610124578063685767a011610109578063685767a01461021b57806369e968a21461022e57806379ba50971461024157600080fd5b80634fd9d1e0146101b357806353a47bb7146101d657600080fd5b80630d76afab14610156578063158ef93e1461016b5780631627540c1461018d57806336d1467a146101a0575b600080fd5b610169610164366004611c92565b61036d565b005b6039546101789060ff1681565b60405190151581526020015b60405180910390f35b61016961019b366004611d1a565b610767565b6101696101ae366004611d3c565b6107ff565b6101786101c1366004611d1a565b60026020526000908152604090205460ff1681565b6001546101f69073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610184565b610169610229366004611e06565b6109cd565b61016961023c366004611e87565b610b6e565b610169610e1a565b610169610257366004611ec2565b610ef3565b61016961026a366004611f10565b611150565b6000546101f69073ffffffffffffffffffffffffffffffffffffffff1681565b6102bd61029d366004611f99565b603760209081526000928352604080842090915290825290205460ff1681565b6040516101849190612006565b6101696102d8366004611d1a565b6114bd565b6102e660385481565b604051908152602001610184565b61016961030236600461202a565b611531565b61031a61031536600461205d565b611696565b604051610184969594939291906120ea565b61017861033a36600461213b565b600360209081526000928352604080842090915290825290205460ff1681565b610169610368366004612167565b6117e1565b610375611927565b81518351146103b0576040517fa24a13a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80518251146103eb576040517fa24a13a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b83518110156107615760385483828151811061040c5761040c612191565b60200260200101511061044b576040517f8150a44b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6037600085838151811061046157610461612191565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008483815181106104b7576104b7612191565b60209081029190910181015182528101919091526040016000205460ff1660028111156104e6576104e6611fc3565b8282815181106104f8576104f8612191565b6020026020010151600281111561051157610511611fc3565b116105fd576037600085838151811061052c5761052c612191565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084838151811061058257610582612191565b6020026020010151815260200190815260200160002060009054906101000a900460ff168282815181106105b8576105b8612191565b60200260200101516040517fad4955fe0000000000000000000000000000000000000000000000000000000081526004016105f49291906121c0565b60405180910390fd5b81818151811061060f5761060f612191565b60200260200101516037600086848151811061062d5761062d612191565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085848151811061068357610683612191565b6020026020010151815260200190815260200160002060006101000a81548160ff021916908360028111156106ba576106ba611fc3565b02179055508281815181106106d1576106d1612191565b60200260200101518482815181106106eb576106eb612191565b602002602001015173ffffffffffffffffffffffffffffffffffffffff167fd9e580fcfd14507572b3d361f3d417659f0904750daa571d71973973f9d70f2284848151811061073c5761073c612191565b60200260200101516040516107519190612006565b60405180910390a36001016103ee565b50505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146107b8576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b61080882611972565b6038548210610843576040517f8150a44b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8316600090815260376020908152604080832085845290915290205460ff16600281111561088857610888611fc3565b81600281111561089a5761089a611fc3565b116109095773ffffffffffffffffffffffffffffffffffffffff83166000908152603760209081526040808320858452909152908190205490517fad4955fe0000000000000000000000000000000000000000000000000000000081526105f49160ff169083906004016121c0565b73ffffffffffffffffffffffffffffffffffffffff83166000908152603760209081526040808320858452909152902080548291907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600183600281111561097457610974611fc3565b0217905550818373ffffffffffffffffffffffffffffffffffffffff167fd9e580fcfd14507572b3d361f3d417659f0904750daa571d71973973f9d70f22836040516109c09190612006565b60405180910390a3505050565b6109d5611927565b82841115610a0f576040517f4a90c82c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084431015610a2157506001610a35565b83431015610a3157506002610a35565b5060035b6040518060c00160405280878152602001868152602001858152602001826003811115610a6457610a64611fc3565b81526020018481526020018381525060366000603854815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030160006101000a81548160ff02191690836003811115610ad057610ad0611fc3565b021790555060808201516004820190610ae9908261227f565b5060a08201516005820190610afe908261227f565b50506038805491506000610b11836123c8565b91905055506001603854610b259190612400565b60408051888152602081018890529081018690527f564d54b0c338901d75d2e732afcb7cb2aeba7be8b25fb42fdaaf3621239dc9b29060600160405180910390a2505050505050565b610b76611927565b8051825114610bb1576040517fa24a13a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b825181101561076157603854838281518110610bd257610bd2612191565b602002602001015110610c11576040517f8150a44b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff841660009081526037602052604081208451909190859084908110610c4d57610c4d612191565b60209081029190910181015182528101919091526040016000205460ff166002811115610c7c57610c7c611fc3565b828281518110610c8e57610c8e612191565b60200260200101516002811115610ca757610ca7611fc3565b11610ce85773ffffffffffffffffffffffffffffffffffffffff84166000908152603760205260408120845190919085908490811061058257610582612191565b818181518110610cfa57610cfa612191565b6020026020010151603760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000858481518110610d5557610d55612191565b6020026020010151815260200190815260200160002060006101000a81548160ff02191690836002811115610d8c57610d8c611fc3565b0217905550828181518110610da357610da3612191565b60200260200101518473ffffffffffffffffffffffffffffffffffffffff167fd9e580fcfd14507572b3d361f3d417659f0904750daa571d71973973f9d70f22848481518110610df557610df5612191565b6020026020010151604051610e0a9190612006565b60405180910390a3600101610bb4565b60015473ffffffffffffffffffffffffffffffffffffffff163314610e6b576040517fb1f6da5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180546000805473ffffffffffffffffffffffffffffffffffffffff83167fffffffffffffffffffffffff00000000000000000000000000000000000000009182168117835592169092556040805191825260208201929092527fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c910160405180910390a1565b610efc82611972565b6038548210610f37576040517f8150a44b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b83518110156107615760376000858381518110610f5957610f59612191565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff168252818101929092526040908101600090812086825290925290205460ff166002811115610fab57610fab611fc3565b826002811115610fbd57610fbd611fc3565b1161104f5760376000858381518110610fd857610fd8612191565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff1682528181019290925260409081016000908120868252909252908190205490517fad4955fe0000000000000000000000000000000000000000000000000000000081526105f49160ff169084906004016121c0565b816037600086848151811061106657611066612191565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff1682528181019290925260409081016000908120878252909252902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660018360028111156110db576110db611fc3565b0217905550828482815181106110f3576110f3612191565b602002602001015173ffffffffffffffffffffffffffffffffffffffff167fd9e580fcfd14507572b3d361f3d417659f0904750daa571d71973973f9d70f22846040516111409190612006565b60405180910390a3600101610f3a565b611158611927565b6038548610611193576040517f8150a44b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b841561119f57846111af565b6000868152603660205260409020545b945083156111bd57836111d0565b6000868152603660205260409020600101545b935082156111de57826111f1565b6000868152603660205260409020600201545b92508151600014611202578161129d565b6000868152603660205260409020600401805461121e906121db565b80601f016020809104026020016040519081016040528092919081815260200182805461124a906121db565b80156112975780601f1061126c57610100808354040283529160200191611297565b820191906000526020600020905b81548152906001019060200180831161127a57829003601f168201915b50505050505b915080516000146112ae5780611349565b600086815260366020526040902060050180546112ca906121db565b80601f01602080910402602001604051908101604052809291908181526020018280546112f6906121db565b80156113435780601f1061131857610100808354040283529160200191611343565b820191906000526020600020905b81548152906001019060200180831161132657829003601f168201915b50505050505b905082841115611385576040517f4a90c82c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084431015611397575060016113ab565b834310156113a7575060026113ab565b5060035b6040518060c001604052808781526020018681526020018581526020018260038111156113da576113da611fc3565b8152602001848152602001838152506036600089815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030160006101000a81548160ff0219169083600381111561144457611444611fc3565b02179055506080820151600482019061145d908261227f565b5060a08201516005820190611472908261227f565b50905050867ff9563eeed6ea72b1ce1b1a6f05ff561a9c1427041e7ff09402b5b9ad7575da89878787856040516114ac9493929190612413565b60405180910390a250505050505050565b60395460ff16156114fa576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611503816119e6565b50603980547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60005473ffffffffffffffffffffffffffffffffffffffff163314611582576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616845290915290205481151560ff9091161515036115f3576040517fd31fc68300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168515159081179091558151878152928301939093528101919091527f8f670544d20af5fd2c568b1c2f0e21971fb6e9e6cc303fe9fac7579bc983ad319060600160405180910390a1505050565b6036602052600090815260409020805460018201546002830154600384015460048501805494959394929360ff909216926116d0906121db565b80601f01602080910402602001604051908101604052809291908181526020018280546116fc906121db565b80156117495780601f1061171e57610100808354040283529160200191611749565b820191906000526020600020905b81548152906001019060200180831161172c57829003601f168201915b50505050509080600501805461175e906121db565b80601f016020809104026020016040519081016040528092919081815260200182805461178a906121db565b80156117d75780601f106117ac576101008083540402835291602001916117d7565b820191906000526020600020905b8154815290600101906020018083116117ba57829003601f168201915b5050505050905086565b60005473ffffffffffffffffffffffffffffffffffffffff163314611832576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526002602052604090205481151560ff909116151503611899576040517fd31fc68300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821660008181526002602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168515159081179091558251938452908301527f1b6e6916bd76fb0e62ff02acf466a38852d02426c13ba96e69803693ac627d58910160405180910390a15050565b3360009081526002602052604090205460ff16611970576040517f6b697ed100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b3360009081526002602052604090205460ff161580156119ac5750600081815260036020908152604080832033845290915290205460ff16155b156119e3576040517f0e20c7ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b60005473ffffffffffffffffffffffffffffffffffffffff1615611a36576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611af357611af3611a7d565b604052919050565b600067ffffffffffffffff821115611b1557611b15611a7d565b5060051b60200190565b803573ffffffffffffffffffffffffffffffffffffffff81168114611b4357600080fd5b919050565b600082601f830112611b5957600080fd5b81356020611b6e611b6983611afb565b611aac565b8083825260208201915060208460051b870101935086841115611b9057600080fd5b602086015b84811015611bb357611ba681611b1f565b8352918301918301611b95565b509695505050505050565b600082601f830112611bcf57600080fd5b81356020611bdf611b6983611afb565b8083825260208201915060208460051b870101935086841115611c0157600080fd5b602086015b84811015611bb35780358352918301918301611c06565b803560038110611b4357600080fd5b600082601f830112611c3d57600080fd5b81356020611c4d611b6983611afb565b8083825260208201915060208460051b870101935086841115611c6f57600080fd5b602086015b84811015611bb357611c8581611c1d565b8352918301918301611c74565b600080600060608486031215611ca757600080fd5b833567ffffffffffffffff80821115611cbf57600080fd5b611ccb87838801611b48565b94506020860135915080821115611ce157600080fd5b611ced87838801611bbe565b93506040860135915080821115611d0357600080fd5b50611d1086828701611c2c565b9150509250925092565b600060208284031215611d2c57600080fd5b611d3582611b1f565b9392505050565b600080600060608486031215611d5157600080fd5b611d5a84611b1f565b925060208401359150611d6f60408501611c1d565b90509250925092565b600082601f830112611d8957600080fd5b813567ffffffffffffffff811115611da357611da3611a7d565b611dd460207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611aac565b818152846020838601011115611de957600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a08688031215611e1e57600080fd5b853594506020860135935060408601359250606086013567ffffffffffffffff80821115611e4b57600080fd5b611e5789838a01611d78565b93506080880135915080821115611e6d57600080fd5b50611e7a88828901611d78565b9150509295509295909350565b600080600060608486031215611e9c57600080fd5b611ea584611b1f565b9250602084013567ffffffffffffffff80821115611ce157600080fd5b600080600060608486031215611ed757600080fd5b833567ffffffffffffffff811115611eee57600080fd5b611efa86828701611b48565b93505060208401359150611d6f60408501611c1d565b60008060008060008060c08789031215611f2957600080fd5b86359550602087013594506040870135935060608701359250608087013567ffffffffffffffff80821115611f5d57600080fd5b611f698a838b01611d78565b935060a0890135915080821115611f7f57600080fd5b50611f8c89828a01611d78565b9150509295509295509295565b60008060408385031215611fac57600080fd5b611fb583611b1f565b946020939093013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6003811061200257612002611fc3565b9052565b602081016120148284611ff2565b92915050565b80358015158114611b4357600080fd5b60008060006060848603121561203f57600080fd5b8335925061204f60208501611b1f565b9150611d6f6040850161201a565b60006020828403121561206f57600080fd5b5035919050565b6004811061200257612002611fc3565b6000815180845260005b818110156120ac57602081850181015186830182015201612090565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b8681528560208201528460408201526121066060820185612076565b60c06080820152600061211c60c0830185612086565b82810360a084015261212e8185612086565b9998505050505050505050565b6000806040838503121561214e57600080fd5b8235915061215e60208401611b1f565b90509250929050565b6000806040838503121561217a57600080fd5b61218383611b1f565b915061215e6020840161201a565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b604081016121ce8285611ff2565b611d356020830184611ff2565b600181811c908216806121ef57607f821691505b602082108103612228577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f82111561227a576000816000526020600020601f850160051c810160208610156122575750805b601f850160051c820191505b8181101561227657828155600101612263565b5050505b505050565b815167ffffffffffffffff81111561229957612299611a7d565b6122ad816122a784546121db565b8461222e565b602080601f83116001811461230057600084156122ca5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555612276565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561234d5788860151825594840194600190910190840161232e565b508582101561238957878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036123f9576123f9612399565b5060010190565b8181038181111561201457612014612399565b8481526020810184905260408101839052608081016124356060830184612076565b9594505050505056fea264697066735822122034c21958f1c557bd7a4c0a56342135d6743abc40a888fbde35163feaecfb2eef64736f6c63430008170033
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in FRAX
0
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
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.