From 12f78f4ed85c10528c1dec333d61f64e5b398cf0 Mon Sep 17 00:00:00 2001 From: kelvin2608 <2608@newbitcoincity.com> Date: Mon, 13 May 2024 16:02:40 +0700 Subject: [PATCH 1/9] Draft of validating --- .vscode/settings.json | 3 + contracts/WorkerHub.sol | 192 +++++++++++++++++++++++- contracts/interfaces/IWorkerHub.sol | 21 +++ contracts/storages/WorkerHubStorage.sol | 16 +- 4 files changed, 224 insertions(+), 8 deletions(-) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..c1b0617 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "cSpell.enableFiletypes": ["solidity"] +} diff --git a/contracts/WorkerHub.sol b/contracts/WorkerHub.sol index 4ca2e47..31ab324 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -19,11 +19,16 @@ ReentrancyGuardUpgradeable { using Random for Random.Randomizer; using Set for Set.AddressSet; using Set for Set.Uint256Set; + using DoubleEndedQueue for Bytes32Deque; string constant private VERSION = "v0.0.1"; uint256 constant private PERCENTAGE_DENOMINATOR = 100_00; uint256 constant private BLOCK_PER_YEAR = 365 days / 2; // 2s per block + modifier onlyMiner { + require(msg.sender == ) + } + receive() external payable {} function initialize( @@ -280,6 +285,7 @@ ReentrancyGuardUpgradeable { Worker storage miner = miners[msg.sender]; if (miner.tier == 0) revert NotRegistered(); if (miner.stake < minerMinimumStake) revert StakeTooLow(); + if (block.timestamp < miner.activeTime) revert ("Miner in slashing time"); address modelAddress = miner.modelAddress; minerAddressesByModel[modelAddress].insert(msg.sender); @@ -388,8 +394,10 @@ ReentrancyGuardUpgradeable { function joinForValidating() external whenNotPaused { _updateEpoch(); + Worker storage validator = miners[msg.sender]; if (validator.tier == 0) revert NotRegistered(); + if (block.timestamp < validator.activeTime) revert ("Validator in slashing time"); address modelAddress = validator.modelAddress; validatorAddressesByModel[modelAddress].insert(msg.sender); @@ -533,12 +541,16 @@ ReentrancyGuardUpgradeable { } - function submitSolution(uint256 _assigmentId, bytes calldata _data) public virtual whenNotPaused { + function submitSolution(uint256 _assignmentId, bytes calldata _data) public virtual whenNotPaused { _updateEpoch(); address _msgSender = msg.sender; - Assignment memory clonedAssignments = assignments[_assigmentId]; + // TODO: Check msg.sender is active + + + Assignment memory clonedAssignments = assignments[_assignmentId]; + // check msgSender is miner if (_msgSender != clonedAssignments.worker) revert Unauthorized(); if (clonedAssignments.output.length != 0) revert AlreadySubmitted(); @@ -561,9 +573,9 @@ ReentrancyGuardUpgradeable { Inference storage inference = inferences[clonedAssignments.inferenceId]; - assignments[_assigmentId].output = _data; //Record the solution + assignments[_assignmentId].output = _data; //Record the solution inference.status = InferenceStatus.Solved; - inference.assignments.push(_assigmentId); + inference.assignments.push(_assignmentId); if (inference.assignments.length == 1) { uint256 curEpoch = currentEpoch; @@ -579,16 +591,184 @@ ReentrancyGuardUpgradeable { emit InferenceStatusUpdate(clonedAssignments.inferenceId, InferenceStatus.Solved); } - emit SolutionSubmission(_msgSender, _assigmentId); + emit SolutionSubmission(_msgSender, _assignmentId); } function _handleDisputeSuccess(uint256 _inferId) internal { // TODO } + //Check whether a worker is available (It had been joined) + function _checkAvailableWorker() internal { + if (!validatorAddresses.hasValue(msg.sender)) { + if (!minerAddresses.hasValue(msg.sender)) revert ("Invalid miner"); + if (!minerAddressesByModel.hasValue(msg.sender)) revert("Invalid validator"); + } + if (!validatorAddressesByModel.hasValue(msg.sender)) revert("Invalid validator"); + } function disputeInfer(uint256 _assignmentId) public virtual { + _updateEpoch(); + _checkAvailableWorker(); // TODO + address _msgSender = msg.sender; + + // check msgSender is validator + // if (!validatorAddresses.hasValue(msg.sender)) revert("Invalid validator"); + // if (!validatorAddressesByModel.hasValue(msg.sender)) revert("Invalid validator"); + + Assignment memory clonedAssignment = assignments[_assignmentId]; + Inference memory clonedInference = inferences[clonedAssignment.inferenceId]; + + //check this assignment has been disputed + if (clonedAssignment.output.length == 0) revert("Assignment is not submitted"); + if (clonedInference.status != InferenceStatus.Solved) revert InvalidInferenceStatus(); + + // check disputing time expire + uint40 validatingExpiredAt = uint40(clonedInference.expiredAt + validatingTimeLimit); + uint40 disputingExpiredAt = uint40(clonedInference.expiredAt + validatingTimeLimit); + + if (block.timestamp < clonedInference.expiredAt) revert ("The validating time has not yet arrived"); + if (validatingExpiredAt < block.timestamp) revert ("Exceeding the validating period"); + + if(disputedAssignmentIds.hasValue(_assignmentId)) revert ("Assignment already disputed"); + + // validatorDisputed[_msgSender][_assignmentId] = true; + disputedAssignmentIds.insert(_assignmentId); + disputedAssignmentsOf[msg.sender].insert(_assignmentId) + + DisputedAssignment storage disAssignment = disputedAssignments[_assignmentId]; + disAssignment.inferenceId = clonedAssignment.inferenceId; + disAssignment.creator = msg.sender; + disAssignment.totalValidator = validators.length; + disAssignment.validatingExpireAt = validatingExpiredAt; + disAssignment.disputingExpireAt = disputingExpiredAt; + + //inference + Inference storage inference = inferences[clonedAssignment.inferenceId]; + inference.disputingAddress = msg.sender; + inference.status = InferenceStatus.Disputing; + + //disputing queue + DisputingQueueElement memory disputingEl = DisputingQueueElement(_assignmentId, disputingExpiredAt); + bytes32 encodedEl = bytes32(abi.encode(pair)); + disputingQueue.pushBack(encodedEl); + } + + function upvoteDispute(uint256 _assignmentId) public virtual { + _updateEpoch(); + + // check msgSender is available for validating (it had been joined) + if (!validatorAddresses.hasValue(msg.sender)) revert("Invalid validator"); + if (!validatorAddressesByModel.hasValue(msg.sender)) revert("Invalid validator"); + + Assignment memory clonedAssignment = assignments[_assignmentId]; + Inference memory clonedInference = inferences[clonedAssignment.inferenceId]; + DisputedAssignment memory clonedDisputedAssignment = disputedAssignments[_assignmentId]; + + //check this assignment has been disputed + if (clonedAssignment.output.length == 0) revert("Assignment is not submitted"); + if (clonedInference.status != InferenceStatus.Disputing) revert InvalidInferenceStatus(); + + // check disputing time expire + uint40 validatingExpiredAt = clonedDisputedAssignment.validatingExpireAt; + uint40 disputingExpiredAt = clonedDisputedAssignment.disputingExpireAt;; + + if (block.timestamp < validatingExpiredAt) revert ("The disputing time has not yet arrived"); + if (disputingExpiredAt < block.timestamp) revert ("Exceeding the disputing period"); + + if (!disputedAssignmentIds.hasValue(_assignmentId)) revert ("Assignment is not disputed"); + if (votersOf[_assignmentId].hasValue(msg.sender)) revert("Validator already voted"); + + //Handle + clonedAssignment.disapprovalCount++; + + disputedAssignmentsOf[msg.sender].insert(_assignmentId); + votersOf[_assignmentId].insert(msg.sender); + } + + function _resolveDispute() internal { + while (true) { + bytes32 head = disputingQueue.popFront(); + DisputingQueueElement memory disputingEl = abi.decode(head, (DisputingQueueElement)); + uint256 assignmentId = disputingEl.id; + + Assignment memory assignment = assignments[assignmentId]; + + if (block.timestamp < disputingEl.expiredAt) { + disputingQueue.pushFront(head); + break; + } else { + uint8 disapprovalCount = votersOf[assignmentId].length; + DisputedAssignment storage disAssignment = disputedAssignments[assignmentId]; + + Assignment storage assignment = assignments[assignmentId]; + assignment.disapprovalCount = disapprovalCount; + Inference storage inference = inferences[assignment.inferenceId]; + + if (disapprovalCount * 3 < disAssignment.totalValidator * 2 + 3) { // total voted >= 2/3 validator + 1 + //inference + inference.status = InferenceStatus.Solved; + disAssignment.isValid = false; //Dispute is not valid, The miner is honest + + //slashing validator + _slashValidator(assignment.worker); + + } else { + inference.status = InferenceStatus.Killed; + disAssignment.isValid = true; //Dispute is valid, The miner is dishonest + + //slashing miner + _slashMiner(assignment.worker) + } + + emit ResolveDispute(assignmentId, inference.status); + } + } + } + + function _slashMiner(address _miner) internal { + Worker storage miner = miners[_miner]; + + if (!minerAddresses.hasValue(_miner)) revert ("Miner does not exist"); + + address modelAddress = miner.modelAddress; + + // Remove miner from available miner + if (minerAddressesByModel[modelAddress].hasValue(_miner)) { + minerAddressesByModel[modelAddress].erase(_miner); + minerAddresses.erase(_miner); + } + + // Set the time miner can join again + miner.activeTime = block.timestamp + slashingMinerTimeLimit; + uint256 fine = miner.stake * 5 / 100; // Fine = stake * 5% + miner.stake -= fine; + + TransferHelper.safeTransferNative(treasury, fine); + + emit SlashingMiner(_miner, miner.activeTime, fine); + } + + function _slashValidator(address _validator) internal { + Worker storage validator = validators[_validator]; + + if (!validatorAddresses.hasValue(_validator)) revert ("Validator does not exist"); + + address modelAddress = validator.modelAddress; + + if (validatorAddressesByModel[modelAddress].hasValue(_miner)) { + validatorAddressesByModel[modelAddress].erase(_validator); + validatorAddresses.erase(_validator); + } + + validator.activeTime = block.timestamp + slashingValidatorTimeLimit; + uint256 fine = validator.stake * 5 / 100; + validator.stake -= fine; + + TransferHelper.safeTransferNative(treasury, fine); + + emit ValidatorSlashed(_validator, validator.activeTime, fine); } function resolveInference(uint256 _inferenceId) public virtual { @@ -602,6 +782,8 @@ ReentrancyGuardUpgradeable { } } + + function _claimReward(address _miner) internal whenNotPaused { uint256 rewardAmount = rewardToClaim(_miner); miners[_miner].lastClaimedEpoch = currentEpoch; diff --git a/contracts/interfaces/IWorkerHub.sol b/contracts/interfaces/IWorkerHub.sol index f0813d4..e13ca1c 100644 --- a/contracts/interfaces/IWorkerHub.sol +++ b/contracts/interfaces/IWorkerHub.sol @@ -84,6 +84,21 @@ interface IWorkerHub is IInferable { address creator; } + struct DisputedAssignment { + uint256 inferenceId; + address creator; + uint16 totalValidator; + uint16 votedValidator; + bool isValid; + uint40 validatingExpireAt; + uint40 disputingExpireAt; + } + + struct DisputingQueueElement { + uint256 id; + uint40 expiredAt; + } + struct UnstakeRequest { uint256 stake; uint40 unlockAt; @@ -156,6 +171,12 @@ interface IWorkerHub is IInferable { event UnstakeDelayTime(uint256 oldDelayTime, uint256 newDelayTime); event Restake(address indexed miner, uint256 restake, address indexed model); + event MinerSlashed(address indexed miner, uint40 activeTime, uint256 fine); + event ValidatorSlashed(address indexed validator, uint40 activeTime, uint256 fine); + event DisputeResolving(uint256 indexed assignmentId, InferenceStatus status); + + + error AlreadyRegistered(); error AlreadySubmitted(); error NotRegistered(); diff --git a/contracts/storages/WorkerHubStorage.sol b/contracts/storages/WorkerHubStorage.sol index 6bca021..1508849 100644 --- a/contracts/storages/WorkerHubStorage.sol +++ b/contracts/storages/WorkerHubStorage.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; - +import "@openzeppelin/contracts/utils/structs/DoubleEndedQueue.sol"; import {IWorkerHub} from "../interfaces/IWorkerHub.sol"; import {Random} from "../lib/Random.sol"; @@ -30,8 +30,14 @@ abstract contract WorkerHubStorage is IWorkerHub { mapping(uint256 => Assignment) public assignments; mapping(address => Set.Uint256Set) internal assignmentsByMiner; mapping(uint256 => Set.Uint256Set) internal assignmentsByInference; - - mapping(address => mapping(uint256 => bool)) public validatorDisputed; + + //Dispute structures + Set.Uint256Set internal disputedAssignmentIds; + DoubleEndedQueue.Bytes32Deque disputingQueue; + mapping(uint256 => DisputedAssignment) internal disputedAssignments; // assignmentId => DisputedAssignment + mapping(address => Set.Uint256Set) disputedAssignmentsOf; //voter's address => disputed assignments + mapping(uint256 => Set.AddressSet) votersOf; // disputed assignment ID => voters's address + // mapping(address => mapping(uint256 => bool)) public validatorDisputed; // mapping total task completed in epoch and reward per epoch // epoch index => total reward @@ -63,5 +69,9 @@ abstract contract WorkerHubStorage is IWorkerHub { uint256 public rewardPerEpochBasedOnPerf; // percentage for workers completed task uint256 public rewardPerEpoch; // 12299.97 reward EAI for 1 worker per year + //Slashing + uint40 public slashingMinerTimeLimit; + uint40 public slashingValidatorTimeLimit; + uint256[100] private __gap; } From e80625320ae3cc75fcbc7ff9480e310269118b82 Mon Sep 17 00:00:00 2001 From: kelvin2608 <2608@newbitcoincity.com> Date: Wed, 15 May 2024 08:16:54 +0700 Subject: [PATCH 2/9] Pre-complete dispute | vote | slash --- contracts/WorkerHub.sol | 284 +++++++++++++++--------- contracts/interfaces/IWorkerHub.sol | 39 +++- contracts/storages/WorkerHubStorage.sol | 20 +- 3 files changed, 214 insertions(+), 129 deletions(-) diff --git a/contracts/WorkerHub.sol b/contracts/WorkerHub.sol index 31ab324..9be0808 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -4,6 +4,7 @@ pragma solidity ^0.8.0; import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import {PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol"; import {ReentrancyGuardUpgradeable} from "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol"; +import {DoubleEndedQueue} from "@openzeppelin/contracts/utils/structs/DoubleEndedQueue.sol"; import {Random} from "./lib/Random.sol"; import {Set} from "./lib/Set.sol"; @@ -19,16 +20,12 @@ ReentrancyGuardUpgradeable { using Random for Random.Randomizer; using Set for Set.AddressSet; using Set for Set.Uint256Set; - using DoubleEndedQueue for Bytes32Deque; + using DoubleEndedQueue for DoubleEndedQueue.Bytes32Deque; string constant private VERSION = "v0.0.1"; uint256 constant private PERCENTAGE_DENOMINATOR = 100_00; uint256 constant private BLOCK_PER_YEAR = 365 days / 2; // 2s per block - modifier onlyMiner { - require(msg.sender == ) - } - receive() external payable {} function initialize( @@ -545,9 +542,6 @@ ReentrancyGuardUpgradeable { _updateEpoch(); address _msgSender = msg.sender; - // TODO: Check msg.sender is active - - Assignment memory clonedAssignments = assignments[_assignmentId]; // check msgSender is miner @@ -598,177 +592,247 @@ ReentrancyGuardUpgradeable { // TODO } - //Check whether a worker is available (It had been joined) - function _checkAvailableWorker() internal { + //Check whether a worker is available (the worker had previously joined). + function _checkAvailableWorker() internal view { if (!validatorAddresses.hasValue(msg.sender)) { - if (!minerAddresses.hasValue(msg.sender)) revert ("Invalid miner"); - if (!minerAddressesByModel.hasValue(msg.sender)) revert("Invalid validator"); + if (!minerAddresses.hasValue(msg.sender)) revert InvalidMiner(); + + address modelAddrOfMiner = miners[msg.sender].modelAddress; + if (!minerAddressesByModel[modelAddrOfMiner].hasValue(msg.sender)) revert InvalidMiner(); } - if (!validatorAddressesByModel.hasValue(msg.sender)) revert("Invalid validator"); + + address modelAddrOfValidator = validators[msg.sender].modelAddress; + if (!validatorAddressesByModel[modelAddrOfValidator].hasValue(msg.sender)) revert InvalidValidator(); } - function disputeInfer(uint256 _assignmentId) public virtual { + function disputeInfer(uint256 _inferId) public virtual { _updateEpoch(); _checkAvailableWorker(); - // TODO - address _msgSender = msg.sender; - // check msgSender is validator - // if (!validatorAddresses.hasValue(msg.sender)) revert("Invalid validator"); - // if (!validatorAddressesByModel.hasValue(msg.sender)) revert("Invalid validator"); + Inference memory clonedInference = inferences[_inferId]; + uint256[] memory assignmentIds = clonedInference.assignments; - Assignment memory clonedAssignment = assignments[_assignmentId]; - Inference memory clonedInference = inferences[clonedAssignment.inferenceId]; - - //check this assignment has been disputed - if (clonedAssignment.output.length == 0) revert("Assignment is not submitted"); + // Check case: There is only one submission. TODO: handle (kelvin) + if (assignmentIds.length == 1) revert LoneSubmissionNoDispute(); + if (assignmentIds.length == 0) revert SubmissionsEmpty(); if (clonedInference.status != InferenceStatus.Solved) revert InvalidInferenceStatus(); - // check disputing time expire - uint40 validatingExpiredAt = uint40(clonedInference.expiredAt + validatingTimeLimit); - uint40 disputingExpiredAt = uint40(clonedInference.expiredAt + validatingTimeLimit); + // Verify if this inference has been disputed + if(disputedInferIds.hasValue(_inferId)) revert InferenceAlreadyDisputed(); - if (block.timestamp < clonedInference.expiredAt) revert ("The validating time has not yet arrived"); - if (validatingExpiredAt < block.timestamp) revert ("Exceeding the validating period"); + uint40 validateExpireTimestamp = uint40(clonedInference.expiredAt + validatingTimeLimit); + uint40 disputeExpiredTimestamp = uint40(clonedInference.expiredAt + validatingTimeLimit + disputingTimeLimit); - if(disputedAssignmentIds.hasValue(_assignmentId)) revert ("Assignment already disputed"); + // Verify whether the dispute is raised within the permitted time window + if (block.timestamp < clonedInference.expiredAt) revert PrematureValidate(); + if (validateExpireTimestamp < block.timestamp) revert ValidateTimeout(); - // validatorDisputed[_msgSender][_assignmentId] = true; - disputedAssignmentIds.insert(_assignmentId); - disputedAssignmentsOf[msg.sender].insert(_assignmentId) + disputedInferIds.insert(_inferId); + // disputedInfersOf[msg.sender].insert(_inferId); - DisputedAssignment storage disAssignment = disputedAssignments[_assignmentId]; - disAssignment.inferenceId = clonedAssignment.inferenceId; - disAssignment.creator = msg.sender; - disAssignment.totalValidator = validators.length; - disAssignment.validatingExpireAt = validatingExpiredAt; - disAssignment.disputingExpireAt = disputingExpiredAt; + DisputedInfer storage disputedInfer = disputedInfers[_inferId]; + disputedInfer.totalValidator = uint16(validatorAddresses.values.length); + disputedInfer.validatingExpireAt = validateExpireTimestamp; + disputedInfer.disputingExpireAt = disputeExpiredTimestamp; //inference - Inference storage inference = inferences[clonedAssignment.inferenceId]; + Inference storage inference = inferences[_inferId]; inference.disputingAddress = msg.sender; inference.status = InferenceStatus.Disputing; + emit DisputeInference(msg.sender, _inferId, uint40(block.timestamp), validateExpireTimestamp, disputeExpiredTimestamp); + //disputing queue - DisputingQueueElement memory disputingEl = DisputingQueueElement(_assignmentId, disputingExpiredAt); - bytes32 encodedEl = bytes32(abi.encode(pair)); - disputingQueue.pushBack(encodedEl); + // DisputingQueueElement memory disputingEl = DisputingQueueElement(assignmentId, disputingExpiredAt); + // bytes32 encodedEl = bytes32(abi.encode(pair)); + // disputingQueue.pushBack(encodedEl); } - function upvoteDispute(uint256 _assignmentId) public virtual { + function upvoteDispute(uint256 _inferId, Ballot[] calldata ballots) public virtual { _updateEpoch(); - // check msgSender is available for validating (it had been joined) - if (!validatorAddresses.hasValue(msg.sender)) revert("Invalid validator"); - if (!validatorAddressesByModel.hasValue(msg.sender)) revert("Invalid validator"); + if (ballots.length == 0) revert BallotEmpty(); - Assignment memory clonedAssignment = assignments[_assignmentId]; - Inference memory clonedInference = inferences[clonedAssignment.inferenceId]; - DisputedAssignment memory clonedDisputedAssignment = disputedAssignments[_assignmentId]; + // Check whether a validator is available (the validator had previously joined). + if (!validatorAddresses.hasValue(msg.sender)) revert InvalidValidator(); + address modelAddr = validators[msg.sender].modelAddress; + if (!validatorAddressesByModel[modelAddr].hasValue(msg.sender)) revert InvalidValidator(); - //check this assignment has been disputed - if (clonedAssignment.output.length == 0) revert("Assignment is not submitted"); + Inference memory clonedInference = inferences[_inferId]; + DisputedInfer memory disputedInfer = disputedInfers[_inferId]; + + if (clonedInference.assignments.length == 0) revert SubmissionsEmpty(); if (clonedInference.status != InferenceStatus.Disputing) revert InvalidInferenceStatus(); - // check disputing time expire - uint40 validatingExpiredAt = clonedDisputedAssignment.validatingExpireAt; - uint40 disputingExpiredAt = clonedDisputedAssignment.disputingExpireAt;; + // Verify if this assignment has been disputed. + if (!disputedInferIds.hasValue(_inferId)) revert InferenceNotDisputed(); + + // Verify if the dispute period has ended + if (block.timestamp < disputedInfer.disputingExpireAt) revert PrematureDispute(); + if (disputedInfer.disputingExpireAt < block.timestamp) revert DisputeTimeout(); + + // Each person is only allowed to vote once. + if (votersOf[_inferId].hasValue(msg.sender)) revert ValidatorVoteExists(); - if (block.timestamp < validatingExpiredAt) revert ("The disputing time has not yet arrived"); - if (disputingExpiredAt < block.timestamp) revert ("Exceeding the disputing period"); + uint256 ballotsLen = ballots.length; + + for (uint256 i = 0; i < ballotsLen; i++) { + if (!ballots[i].result) { + assignments[ballots[i].assignmentId].disapprovalCount++; + } + } - if (!disputedAssignmentIds.hasValue(_assignmentId)) revert ("Assignment is not disputed"); - if (votersOf[_assignmentId].hasValue(msg.sender)) revert("Validator already voted"); + // disputedInfersOf[msg.sender].insert(_inferId); + votersOf[_inferId].insert(msg.sender); - //Handle - clonedAssignment.disapprovalCount++; + emit DisputeUpvote(msg.sender, _inferId, uint40(block.timestamp)); - disputedAssignmentsOf[msg.sender].insert(_assignmentId); - votersOf[_assignmentId].insert(msg.sender); + //TODO: If the reaction time expires but the number of ballots is less than 2/3, + // should we extend the waiting time for validators or slash inactive validators and initiate a new vote? } - function _resolveDispute() internal { - while (true) { - bytes32 head = disputingQueue.popFront(); - DisputingQueueElement memory disputingEl = abi.decode(head, (DisputingQueueElement)); - uint256 assignmentId = disputingEl.id; + function resolveDispute(uint256 _inferId) public { + // Verify if this assignment has been disputed. + if (!disputedInferIds.hasValue(_inferId)) revert InferenceNotDisputed(); - Assignment memory assignment = assignments[assignmentId]; + Inference memory inference = inferences[_inferId]; + DisputedInfer memory disputedInfer = disputedInfers[_inferId]; - if (block.timestamp < disputingEl.expiredAt) { - disputingQueue.pushFront(head); - break; - } else { - uint8 disapprovalCount = votersOf[assignmentId].length; - DisputedAssignment storage disAssignment = disputedAssignments[assignmentId]; + if (block.timestamp < disputedInfer.disputingExpireAt) revert PrematureDispute(); + if (inference.status != InferenceStatus.Disputing) revert InvalidInferenceStatus(); - Assignment storage assignment = assignments[assignmentId]; - assignment.disapprovalCount = disapprovalCount; - Inference storage inference = inferences[assignment.inferenceId]; + // TODO: Handling the 'No voter' edge case + // votersOf[_inferId].values == 0 - if (disapprovalCount * 3 < disAssignment.totalValidator * 2 + 3) { // total voted >= 2/3 validator + 1 - //inference - inference.status = InferenceStatus.Solved; - disAssignment.isValid = false; //Dispute is not valid, The miner is honest + uint16 totalValidator = disputedInfer.totalValidator; - //slashing validator - _slashValidator(assignment.worker); + uint256[] memory assignmentIds = inference.assignments; + uint256 assignmentsLen = assignmentIds.length; + address[] memory fraudMiners = new address[](minerRequirement); - } else { - inference.status = InferenceStatus.Killed; - disAssignment.isValid = true; //Dispute is valid, The miner is dishonest + uint256 counter = 0; + bool isDisputeValid = true; + + for (uint256 i = 0; i < assignmentsLen; i++){ + Assignment memory assignment = assignments[assignmentIds[i]]; + // A dispute will be invalid if the disapproval count for a submission falls outside the range of 1/3 to 2/3 of the total number of validators. + if (totalValidator <= assignment.disapprovalCount * 3 && assignment.disapprovalCount * 3 <= totalValidator * 2) { + isDisputeValid = false; + } else if ( totalValidator * 2 < assignment.disapprovalCount * 3 ) { + fraudMiners[counter++] = assignment.worker; + } + } - //slashing miner - _slashMiner(assignment.worker) - } + //deactivate and slash + _cullInactiveValidator(_inferId); + + if (isDisputeValid) { + // Slash the fraud miners + uint256 fraudMinersLen = fraudMiners.length; - emit ResolveDispute(assignmentId, inference.status); + for (uint256 i = 0; i < fraudMinersLen; i++) { + if (fraudMiners[i] == address(0)) break; + _slashMiner(fraudMiners[i]); } + + emit DisputeResolving(_inferId, inference.modelAddress, isDisputeValid); + } else { + _slashValidator(inference.disputingAddress); } } - function _slashMiner(address _miner) internal { - Worker storage miner = miners[_miner]; + // Pruning when validator lazy to vote + function _cullInactiveValidator(uint256 _inferId) internal { + address modelAddr = inferences[_inferId].modelAddress; - if (!minerAddresses.hasValue(_miner)) revert ("Miner does not exist"); - address modelAddress = miner.modelAddress; + address[] memory validators = validatorAddressesByModel[modelAddr].values; + uint256 validatorsLen = validators.length; + if (validatorsLen == 0) return; - // Remove miner from available miner - if (minerAddressesByModel[modelAddress].hasValue(_miner)) { - minerAddressesByModel[modelAddress].erase(_miner); - minerAddresses.erase(_miner); + Set.AddressSet storage votersSet = votersOf[_inferId]; + uint256 votersLen = votersSet.values.length; + + if (votersLen == validatorsLen) return; + + address[] memory inactiveValidators = new address[](validatorsLen - votersLen); + uint16 counter = 0; + + for (uint256 i = 0; i < validatorsLen; i++) { + if (!votersSet.hasValue(validators[i])) { + inactiveValidators[counter++] = validators[i]; + } } - // Set the time miner can join again - miner.activeTime = block.timestamp + slashingMinerTimeLimit; - uint256 fine = miner.stake * 5 / 100; // Fine = stake * 5% - miner.stake -= fine; + uint256 len = inactiveValidators.length; - TransferHelper.safeTransferNative(treasury, fine); + for (uint256 i = 0; i < len; i++) { + _deactivateValidator(inactiveValidators[i]); + } + } + + function _deactivateValidator(address _validator) internal { + Worker storage validator = validators[_validator]; - emit SlashingMiner(_miner, miner.activeTime, fine); + if (!validatorAddresses.hasValue(_validator)) revert ("Validator does not exist"); + + address modelAddress = validator.modelAddress; + + // Double check hasValue + if (validatorAddressesByModel[modelAddress].hasValue(_validator)) { + validatorAddressesByModel[modelAddress].erase(_validator); + validatorAddresses.erase(_validator); + } + + validator.activeTime = uint40(block.timestamp + slashingValidatorTimeLimit); + + emit ValidatorDeactivated(_validator, modelAddress, validator.activeTime); } function _slashValidator(address _validator) internal { Worker storage validator = validators[_validator]; - if (!validatorAddresses.hasValue(_validator)) revert ("Validator does not exist"); + if (!validatorAddresses.hasValue(_validator)) revert InvalidValidator(); address modelAddress = validator.modelAddress; - if (validatorAddressesByModel[modelAddress].hasValue(_miner)) { + if (validatorAddressesByModel[modelAddress].hasValue(_validator)) { validatorAddressesByModel[modelAddress].erase(_validator); validatorAddresses.erase(_validator); } - validator.activeTime = block.timestamp + slashingValidatorTimeLimit; + validator.activeTime = uint40(block.timestamp + slashingValidatorTimeLimit); uint256 fine = validator.stake * 5 / 100; validator.stake -= fine; TransferHelper.safeTransferNative(treasury, fine); - emit ValidatorSlashed(_validator, validator.activeTime, fine); + emit FraudulentValidatorPenalized(_validator, modelAddress, treasury, fine); + } + + + + function _slashMiner(address _miner) internal { + Worker storage miner = miners[_miner]; + + if (!minerAddresses.hasValue(_miner)) revert InvalidMiner(); + + address modelAddress = miner.modelAddress; + + // Remove miner from available miner + if (minerAddressesByModel[modelAddress].hasValue(_miner)) { + minerAddressesByModel[modelAddress].erase(_miner); + minerAddresses.erase(_miner); + } + + // Set the time miner can join again + miner.activeTime = uint40(block.timestamp + slashingMinerTimeLimit); + uint256 fine = miner.stake * 5 / 100; // Fine = stake * 5% + miner.stake -= fine; + + TransferHelper.safeTransferNative(treasury, fine); + + emit FraudulentMinerPenalized(_miner, modelAddress, treasury, fine); } function resolveInference(uint256 _inferenceId) public virtual { @@ -782,8 +846,6 @@ ReentrancyGuardUpgradeable { } } - - function _claimReward(address _miner) internal whenNotPaused { uint256 rewardAmount = rewardToClaim(_miner); miners[_miner].lastClaimedEpoch = currentEpoch; diff --git a/contracts/interfaces/IWorkerHub.sol b/contracts/interfaces/IWorkerHub.sol index e13ca1c..9b99c7a 100644 --- a/contracts/interfaces/IWorkerHub.sol +++ b/contracts/interfaces/IWorkerHub.sol @@ -84,16 +84,19 @@ interface IWorkerHub is IInferable { address creator; } - struct DisputedAssignment { - uint256 inferenceId; - address creator; + struct DisputedInfer { uint16 totalValidator; - uint16 votedValidator; + // uint16 votedValidator; bool isValid; uint40 validatingExpireAt; uint40 disputingExpireAt; } + struct Ballot { + uint256 assignmentId; + bool result; + } + struct DisputingQueueElement { uint256 id; uint40 expiredAt; @@ -171,11 +174,13 @@ interface IWorkerHub is IInferable { event UnstakeDelayTime(uint256 oldDelayTime, uint256 newDelayTime); event Restake(address indexed miner, uint256 restake, address indexed model); - event MinerSlashed(address indexed miner, uint40 activeTime, uint256 fine); - event ValidatorSlashed(address indexed validator, uint40 activeTime, uint256 fine); - event DisputeResolving(uint256 indexed assignmentId, InferenceStatus status); - - + event MinerDeactivated(address indexed miner, uint40 activeTime, uint256 fine); + event FraudulentMinerPenalized(address indexed miner, address indexed modelAddress, address indexed treasury, uint256 fine); + event ValidatorDeactivated(address indexed validator, address indexed modelAddress, uint40 activeTime); + event FraudulentValidatorPenalized(address indexed validator, address indexed modelAddress, address indexed treasury, uint256 fine); + event DisputeInference(address indexed caller, uint256 indexed inferId, uint40 now, uint40 validateExpireTimestamp, uint40 disputeExpiredTimestamp); + event DisputeUpvote(address indexed caller, uint256 indexed inferId, uint40 now); + event DisputeResolving(uint256 indexed inferId, address indexed modelAddress, bool status); error AlreadyRegistered(); error AlreadySubmitted(); @@ -199,4 +204,20 @@ interface IWorkerHub is IInferable { error InferMustBeSolvingState(); error ZeroValue(); + error InvalidValidator(); + error InvalidMiner(); + + error InferenceAlreadyDisputed(); + error InferenceNotDisputed(); + + error PrematureValidate(); + error ValidateTimeout(); + error PrematureDispute(); + error DisputeTimeout(); + + error ValidatorVoteExists(); + error SubmissionsEmpty(); + error LoneSubmissionNoDispute(); + error BallotEmpty(); + } diff --git a/contracts/storages/WorkerHubStorage.sol b/contracts/storages/WorkerHubStorage.sol index 1508849..7276ade 100644 --- a/contracts/storages/WorkerHubStorage.sol +++ b/contracts/storages/WorkerHubStorage.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; -import "@openzeppelin/contracts/utils/structs/DoubleEndedQueue.sol"; +import {DoubleEndedQueue} from "@openzeppelin/contracts/utils/structs/DoubleEndedQueue.sol"; import {IWorkerHub} from "../interfaces/IWorkerHub.sol"; import {Random} from "../lib/Random.sol"; @@ -30,14 +30,9 @@ abstract contract WorkerHubStorage is IWorkerHub { mapping(uint256 => Assignment) public assignments; mapping(address => Set.Uint256Set) internal assignmentsByMiner; mapping(uint256 => Set.Uint256Set) internal assignmentsByInference; - - //Dispute structures - Set.Uint256Set internal disputedAssignmentIds; - DoubleEndedQueue.Bytes32Deque disputingQueue; - mapping(uint256 => DisputedAssignment) internal disputedAssignments; // assignmentId => DisputedAssignment - mapping(address => Set.Uint256Set) disputedAssignmentsOf; //voter's address => disputed assignments - mapping(uint256 => Set.AddressSet) votersOf; // disputed assignment ID => voters's address - // mapping(address => mapping(uint256 => bool)) public validatorDisputed; + + mapping(address => mapping(uint256 => bool)) public validatorDisputed; //Do know the need + // mapping total task completed in epoch and reward per epoch // epoch index => total reward @@ -72,6 +67,13 @@ abstract contract WorkerHubStorage is IWorkerHub { //Slashing uint40 public slashingMinerTimeLimit; uint40 public slashingValidatorTimeLimit; + + //Dispute structures + Set.Uint256Set internal disputedInferIds; + mapping(uint256 => DisputedInfer) internal disputedInfers; // inferId => DisputedInfer + mapping(uint256 => Set.AddressSet) internal votersOf; // disputed inference ID => voters's address + // mapping(address => Set.Uint256Set) internal disputedInfersOf; //voter's address => disputed inference id + // DoubleEndedQueue.Bytes32Deque internal disputingQueue; uint256[100] private __gap; } From 860a8e31c285312c19056e98fab36ac0e4d1ce16 Mon Sep 17 00:00:00 2001 From: kelvin2608 <2608@newbitcoincity.com> Date: Wed, 15 May 2024 08:20:06 +0700 Subject: [PATCH 3/9] Clean code --- contracts/WorkerHub.sol | 7 ------- contracts/interfaces/IWorkerHub.sol | 6 ------ contracts/storages/WorkerHubStorage.sol | 2 -- 3 files changed, 15 deletions(-) diff --git a/contracts/WorkerHub.sol b/contracts/WorkerHub.sol index 9be0808..f601968 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -4,7 +4,6 @@ pragma solidity ^0.8.0; import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import {PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol"; import {ReentrancyGuardUpgradeable} from "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol"; -import {DoubleEndedQueue} from "@openzeppelin/contracts/utils/structs/DoubleEndedQueue.sol"; import {Random} from "./lib/Random.sol"; import {Set} from "./lib/Set.sol"; @@ -20,7 +19,6 @@ ReentrancyGuardUpgradeable { using Random for Random.Randomizer; using Set for Set.AddressSet; using Set for Set.Uint256Set; - using DoubleEndedQueue for DoubleEndedQueue.Bytes32Deque; string constant private VERSION = "v0.0.1"; uint256 constant private PERCENTAGE_DENOMINATOR = 100_00; @@ -641,11 +639,6 @@ ReentrancyGuardUpgradeable { inference.status = InferenceStatus.Disputing; emit DisputeInference(msg.sender, _inferId, uint40(block.timestamp), validateExpireTimestamp, disputeExpiredTimestamp); - - //disputing queue - // DisputingQueueElement memory disputingEl = DisputingQueueElement(assignmentId, disputingExpiredAt); - // bytes32 encodedEl = bytes32(abi.encode(pair)); - // disputingQueue.pushBack(encodedEl); } function upvoteDispute(uint256 _inferId, Ballot[] calldata ballots) public virtual { diff --git a/contracts/interfaces/IWorkerHub.sol b/contracts/interfaces/IWorkerHub.sol index 9b99c7a..d26140b 100644 --- a/contracts/interfaces/IWorkerHub.sol +++ b/contracts/interfaces/IWorkerHub.sol @@ -86,7 +86,6 @@ interface IWorkerHub is IInferable { struct DisputedInfer { uint16 totalValidator; - // uint16 votedValidator; bool isValid; uint40 validatingExpireAt; uint40 disputingExpireAt; @@ -97,11 +96,6 @@ interface IWorkerHub is IInferable { bool result; } - struct DisputingQueueElement { - uint256 id; - uint40 expiredAt; - } - struct UnstakeRequest { uint256 stake; uint40 unlockAt; diff --git a/contracts/storages/WorkerHubStorage.sol b/contracts/storages/WorkerHubStorage.sol index 7276ade..a583efb 100644 --- a/contracts/storages/WorkerHubStorage.sol +++ b/contracts/storages/WorkerHubStorage.sol @@ -1,6 +1,5 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; -import {DoubleEndedQueue} from "@openzeppelin/contracts/utils/structs/DoubleEndedQueue.sol"; import {IWorkerHub} from "../interfaces/IWorkerHub.sol"; import {Random} from "../lib/Random.sol"; @@ -73,7 +72,6 @@ abstract contract WorkerHubStorage is IWorkerHub { mapping(uint256 => DisputedInfer) internal disputedInfers; // inferId => DisputedInfer mapping(uint256 => Set.AddressSet) internal votersOf; // disputed inference ID => voters's address // mapping(address => Set.Uint256Set) internal disputedInfersOf; //voter's address => disputed inference id - // DoubleEndedQueue.Bytes32Deque internal disputingQueue; uint256[100] private __gap; } From 152ba23f1712608ecf89b62f8e2670a164f341d8 Mon Sep 17 00:00:00 2001 From: kelvin2608 <2608@newbitcoincity.com> Date: Wed, 15 May 2024 11:56:55 +0700 Subject: [PATCH 4/9] Update logic for transferring value to miners and validators --- contracts/WorkerHub.sol | 38 +++++++++++++++++++------ contracts/interfaces/IWorkerHub.sol | 1 + contracts/storages/WorkerHubStorage.sol | 3 ++ 3 files changed, 34 insertions(+), 8 deletions(-) diff --git a/contracts/WorkerHub.sol b/contracts/WorkerHub.sol index f601968..14be5ca 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -575,7 +575,7 @@ ReentrancyGuardUpgradeable { rewardInEpoch[curEpoch].totalTaskCompleted += 1; uint256 fee = clonedInference.value * feePercentage / PERCENTAGE_DENOMINATOR; - uint256 value = clonedInference.value - fee; + uint256 value = clonedInference.value * minerFeePercentage / PERCENTAGE_DENOMINATOR; TransferHelper.safeTransferNative(treasury, fee); TransferHelper.safeTransferNative(_msgSender, value); @@ -590,6 +590,7 @@ ReentrancyGuardUpgradeable { // TODO } + //Check whether a worker is available (the worker had previously joined). function _checkAvailableWorker() internal view { if (!validatorAddresses.hasValue(msg.sender)) { @@ -603,10 +604,7 @@ ReentrancyGuardUpgradeable { if (!validatorAddressesByModel[modelAddrOfValidator].hasValue(msg.sender)) revert InvalidValidator(); } - function disputeInfer(uint256 _inferId) public virtual { - _updateEpoch(); - _checkAvailableWorker(); - + function _beforeDispute(uint256 _inferId) internal view returns(uint40, uint40){ Inference memory clonedInference = inferences[_inferId]; uint256[] memory assignmentIds = clonedInference.assignments; @@ -625,6 +623,30 @@ ReentrancyGuardUpgradeable { if (block.timestamp < clonedInference.expiredAt) revert PrematureValidate(); if (validateExpireTimestamp < block.timestamp) revert ValidateTimeout(); + return (validateExpireTimestamp, disputeExpiredTimestamp); + } + + function noDispute(uint256 _inferId) public { + _updateEpoch(); + _checkAvailableWorker(); + // TODO: following new logic, we must check the msg.sender has been assigned the task. + + (uint40 validateExpireTimestamp, uint40 disputeExpiredTimestamp) = _beforeDispute(_inferId); + + Inference memory clonedInference = inferences[_inferId]; + uint256 value = clonedInference.value * (PERCENTAGE_DENOMINATOR - feePercentage - minerFeePercentage) / PERCENTAGE_DENOMINATOR; + + TransferHelper.safeTransferNative(msg.sender, value); + + emit NoDisputeInference(msg.sender, _inferId, uint40(block.timestamp), value); + } + + function disputeInfer(uint256 _inferId) public virtual { + _updateEpoch(); + _checkAvailableWorker(); + + (uint40 validateExpireTimestamp, uint40 disputeExpiredTimestamp) = _beforeDispute(_inferId); + disputedInferIds.insert(_inferId); // disputedInfersOf[msg.sender].insert(_inferId); @@ -638,6 +660,7 @@ ReentrancyGuardUpgradeable { inference.disputingAddress = msg.sender; inference.status = InferenceStatus.Disputing; + emit InferenceStatusUpdate(_inferId, InferenceStatus.Disputing); emit DisputeInference(msg.sender, _inferId, uint40(block.timestamp), validateExpireTimestamp, disputeExpiredTimestamp); } @@ -685,6 +708,8 @@ ReentrancyGuardUpgradeable { } function resolveDispute(uint256 _inferId) public { + _updateEpoch(); + // Verify if this assignment has been disputed. if (!disputedInferIds.hasValue(_inferId)) revert InferenceNotDisputed(); @@ -738,7 +763,6 @@ ReentrancyGuardUpgradeable { function _cullInactiveValidator(uint256 _inferId) internal { address modelAddr = inferences[_inferId].modelAddress; - address[] memory validators = validatorAddressesByModel[modelAddr].values; uint256 validatorsLen = validators.length; if (validatorsLen == 0) return; @@ -803,8 +827,6 @@ ReentrancyGuardUpgradeable { emit FraudulentValidatorPenalized(_validator, modelAddress, treasury, fine); } - - function _slashMiner(address _miner) internal { Worker storage miner = miners[_miner]; diff --git a/contracts/interfaces/IWorkerHub.sol b/contracts/interfaces/IWorkerHub.sol index d26140b..ef8d258 100644 --- a/contracts/interfaces/IWorkerHub.sol +++ b/contracts/interfaces/IWorkerHub.sol @@ -173,6 +173,7 @@ interface IWorkerHub is IInferable { event ValidatorDeactivated(address indexed validator, address indexed modelAddress, uint40 activeTime); event FraudulentValidatorPenalized(address indexed validator, address indexed modelAddress, address indexed treasury, uint256 fine); event DisputeInference(address indexed caller, uint256 indexed inferId, uint40 now, uint40 validateExpireTimestamp, uint40 disputeExpiredTimestamp); + event NoDisputeInference(address indexed caller, uint256 indexed inferId, uint40 now, uint256 value); event DisputeUpvote(address indexed caller, uint256 indexed inferId, uint40 now); event DisputeResolving(uint256 indexed inferId, address indexed modelAddress, bool status); diff --git a/contracts/storages/WorkerHubStorage.sol b/contracts/storages/WorkerHubStorage.sol index a583efb..45565fe 100644 --- a/contracts/storages/WorkerHubStorage.sol +++ b/contracts/storages/WorkerHubStorage.sol @@ -63,6 +63,9 @@ abstract contract WorkerHubStorage is IWorkerHub { uint256 public rewardPerEpochBasedOnPerf; // percentage for workers completed task uint256 public rewardPerEpoch; // 12299.97 reward EAI for 1 worker per year + // Tx Fee + uint16 public minerFeePercentage; + //Slashing uint40 public slashingMinerTimeLimit; uint40 public slashingValidatorTimeLimit; From f08fbdd075cf187a9a8babb6af3563b150d00b4c Mon Sep 17 00:00:00 2001 From: kelvin2608 <2608@newbitcoincity.com> Date: Wed, 15 May 2024 11:56:55 +0700 Subject: [PATCH 5/9] Update logic for transferring value to miners and validators --- contracts/WorkerHub.sol | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/contracts/WorkerHub.sol b/contracts/WorkerHub.sol index 14be5ca..b0af10f 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -757,6 +757,10 @@ ReentrancyGuardUpgradeable { } else { _slashValidator(inference.disputingAddress); } + + inferences[_inferId].status = InferenceStatus.Solved; + + emit InferenceStatusUpdate(_inferId, InferenceStatus.Solved); } // Pruning when validator lazy to vote From 2d753872879eac8eea8bb18c0d0375eade262a0d Mon Sep 17 00:00:00 2001 From: kelvin2608 <2608@newbitcoincity.com> Date: Wed, 15 May 2024 15:46:45 +0700 Subject: [PATCH 6/9] Create func deactivate inactive miners and update resolve inference --- contracts/WorkerHub.sol | 46 ++++++++++++++++++++----- contracts/interfaces/IWorkerHub.sol | 5 ++- contracts/storages/WorkerHubStorage.sol | 7 ++-- 3 files changed, 46 insertions(+), 12 deletions(-) diff --git a/contracts/WorkerHub.sol b/contracts/WorkerHub.sol index b0af10f..fb59f88 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -280,7 +280,7 @@ ReentrancyGuardUpgradeable { Worker storage miner = miners[msg.sender]; if (miner.tier == 0) revert NotRegistered(); if (miner.stake < minerMinimumStake) revert StakeTooLow(); - if (block.timestamp < miner.activeTime) revert ("Miner in slashing time"); + if (block.timestamp < miner.activeTime) revert MinerInSlashingTime(); address modelAddress = miner.modelAddress; minerAddressesByModel[modelAddress].insert(msg.sender); @@ -392,7 +392,7 @@ ReentrancyGuardUpgradeable { Worker storage validator = miners[msg.sender]; if (validator.tier == 0) revert NotRegistered(); - if (block.timestamp < validator.activeTime) revert ("Validator in slashing time"); + if (block.timestamp < validator.activeTime) revert ValidatorInSlashingTime(); address modelAddress = validator.modelAddress; validatorAddressesByModel[modelAddress].insert(msg.sender); @@ -753,6 +753,9 @@ ReentrancyGuardUpgradeable { _slashMiner(fraudMiners[i]); } + uint256 value = inference.value * (PERCENTAGE_DENOMINATOR - feePercentage - minerFeePercentage) / PERCENTAGE_DENOMINATOR; + TransferHelper.safeTransferNative(inference.disputingAddress, value); + emit DisputeResolving(_inferId, inference.modelAddress, isDisputeValid); } else { _slashValidator(inference.disputingAddress); @@ -795,7 +798,7 @@ ReentrancyGuardUpgradeable { function _deactivateValidator(address _validator) internal { Worker storage validator = validators[_validator]; - if (!validatorAddresses.hasValue(_validator)) revert ("Validator does not exist"); + if (!validatorAddresses.hasValue(_validator)) revert InvalidValidator(); address modelAddress = validator.modelAddress; @@ -805,11 +808,29 @@ ReentrancyGuardUpgradeable { validatorAddresses.erase(_validator); } - validator.activeTime = uint40(block.timestamp + slashingValidatorTimeLimit); + validator.activeTime = uint40(block.timestamp + penaltyDuration); emit ValidatorDeactivated(_validator, modelAddress, validator.activeTime); } + function _deactivateMiner(address _miner) internal { + Worker storage miner = miners[_miner]; + + if (!minerAddresses.hasValue(_miner)) revert InvalidMiner(); + + address modelAddress = miner.modelAddress; + + // Double check hasValue + if (minerAddressesByModel[modelAddress].hasValue(_miner)) { + minerAddressesByModel[modelAddress].erase(_miner); + minerAddresses.erase(_miner); + } + + miner.activeTime = uint40(block.timestamp + penaltyDuration); + + emit MinerDeactivated(_miner, modelAddress, miner.activeTime); + } + function _slashValidator(address _validator) internal { Worker storage validator = validators[_validator]; @@ -822,8 +843,8 @@ ReentrancyGuardUpgradeable { validatorAddresses.erase(_validator); } - validator.activeTime = uint40(block.timestamp + slashingValidatorTimeLimit); - uint256 fine = validator.stake * 5 / 100; + validator.activeTime = uint40(block.timestamp + penaltyDuration); + uint256 fine = validator.stake * finePercentage / PERCENTAGE_DENOMINATOR; validator.stake -= fine; TransferHelper.safeTransferNative(treasury, fine); @@ -845,8 +866,8 @@ ReentrancyGuardUpgradeable { } // Set the time miner can join again - miner.activeTime = uint40(block.timestamp + slashingMinerTimeLimit); - uint256 fine = miner.stake * 5 / 100; // Fine = stake * 5% + miner.activeTime = uint40(block.timestamp + penaltyDuration); + uint256 fine = miner.stake * finePercentage / PERCENTAGE_DENOMINATOR; // Fine = stake * 5% miner.stake -= fine; TransferHelper.safeTransferNative(treasury, fine); @@ -862,6 +883,15 @@ ReentrancyGuardUpgradeable { inference.status = InferenceStatus.Killed; TransferHelper.safeTransferNative(inference.creator, inference.value); emit InferenceStatusUpdate(_inferenceId, InferenceStatus.Killed); + + // Deactivate inactive miners. + // Deactivate all 3 miners because this inference has solving status. This mean there is no submission. + uint256[] memory assignmentIds = inference.assignments; + uint256 assignmentsLen = assignmentIds.length; + + for (uint256 i = 0; i < assignmentsLen; i++) { + _deactivateMiner(assignments[assignmentIds[i]].worker); + } } } diff --git a/contracts/interfaces/IWorkerHub.sol b/contracts/interfaces/IWorkerHub.sol index ef8d258..5f36a60 100644 --- a/contracts/interfaces/IWorkerHub.sol +++ b/contracts/interfaces/IWorkerHub.sol @@ -168,7 +168,7 @@ interface IWorkerHub is IInferable { event UnstakeDelayTime(uint256 oldDelayTime, uint256 newDelayTime); event Restake(address indexed miner, uint256 restake, address indexed model); - event MinerDeactivated(address indexed miner, uint40 activeTime, uint256 fine); + event MinerDeactivated(address indexed miner, address indexed modelAddress, uint40 activeTime); event FraudulentMinerPenalized(address indexed miner, address indexed modelAddress, address indexed treasury, uint256 fine); event ValidatorDeactivated(address indexed validator, address indexed modelAddress, uint40 activeTime); event FraudulentValidatorPenalized(address indexed validator, address indexed modelAddress, address indexed treasury, uint256 fine); @@ -215,4 +215,7 @@ interface IWorkerHub is IInferable { error LoneSubmissionNoDispute(); error BallotEmpty(); + error MinerInSlashingTime(); + error ValidatorInSlashingTime(); + } diff --git a/contracts/storages/WorkerHubStorage.sol b/contracts/storages/WorkerHubStorage.sol index 45565fe..7d7faa8 100644 --- a/contracts/storages/WorkerHubStorage.sol +++ b/contracts/storages/WorkerHubStorage.sol @@ -64,11 +64,12 @@ abstract contract WorkerHubStorage is IWorkerHub { uint256 public rewardPerEpoch; // 12299.97 reward EAI for 1 worker per year // Tx Fee - uint16 public minerFeePercentage; + uint16 public minerFeePercentage; // Percentage of inference value allocated to miner + uint16 public finePercentage; //Slashing - uint40 public slashingMinerTimeLimit; - uint40 public slashingValidatorTimeLimit; + // uint40 public slashingMinerTimeLimit; + // uint40 public slashingValidatorTimeLimit; //Dispute structures Set.Uint256Set internal disputedInferIds; From 17f5d01aa68ce377a52d02b5665d1e44f58df728 Mon Sep 17 00:00:00 2001 From: kelvin2608 <2608@newbitcoincity.com> Date: Wed, 15 May 2024 18:10:47 +0700 Subject: [PATCH 7/9] Update logic related to slashing the dishonest disputer --- contracts/WorkerHub.sol | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/contracts/WorkerHub.sol b/contracts/WorkerHub.sol index fb59f88..5a93745 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -626,7 +626,7 @@ ReentrancyGuardUpgradeable { return (validateExpireTimestamp, disputeExpiredTimestamp); } - function noDispute(uint256 _inferId) public { + function noDisputeInfer(uint256 _inferId) public { _updateEpoch(); _checkAvailableWorker(); // TODO: following new logic, we must check the msg.sender has been assigned the task. @@ -644,6 +644,7 @@ ReentrancyGuardUpgradeable { function disputeInfer(uint256 _inferId) public virtual { _updateEpoch(); _checkAvailableWorker(); + // TODO: following new logic, we must check the msg.sender has been assigned the task. (uint40 validateExpireTimestamp, uint40 disputeExpiredTimestamp) = _beforeDispute(_inferId); @@ -758,7 +759,13 @@ ReentrancyGuardUpgradeable { emit DisputeResolving(_inferId, inference.modelAddress, isDisputeValid); } else { - _slashValidator(inference.disputingAddress); + // disputing address can be miner or validator + address disputer = inference.disputingAddress; + if (minerAddresses.hasValue(disputer)) { + _slashMiner(disputer); + } else if (validatorAddresses.hasValue(disputer)) { + _slashValidator(disputer); + } } inferences[_inferId].status = InferenceStatus.Solved; From 26bb4aecc49f45846f67d1da342b151f424d0d9e Mon Sep 17 00:00:00 2001 From: 180945 <180945@trustless.computer> Date: Wed, 15 May 2024 11:26:51 +0700 Subject: [PATCH 8/9] fixed lastblock setter --- contracts/WorkerHub.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/WorkerHub.sol b/contracts/WorkerHub.sol index 5a93745..0f295f3 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -515,6 +515,7 @@ ReentrancyGuardUpgradeable { if (blocksPerEpoch > 0) { uint256 epochPassed = (block.number - lastBlock) / blocksPerEpoch; if (epochPassed > 0) { + lastBlock += blocksPerEpoch * epochPassed; // reward for this epoch // rewardPerEpoch (reward one year for 1 miner) // rewardPerEpoch * total miner * blocker per epoch / blocks per year @@ -528,7 +529,6 @@ ReentrancyGuardUpgradeable { rewardInEpoch[currentEpoch].epochReward = equalReward; currentEpoch++; } - lastBlock = block.number; } } else { lastBlock = block.number; From dc149f35445a30009265959b583938c70ad55c17 Mon Sep 17 00:00:00 2001 From: kochou-nbc Date: Wed, 15 May 2024 15:21:29 +0700 Subject: [PATCH 9/9] update --- .openzeppelin/unknown-20156.json | 2262 ++++++++++++++++ .openzeppelin/unknown-43338.json | 3772 +++++++++++++++++++++++++++ contracts/WorkerHub.sol | 9 +- contracts/interfaces/IWorkerHub.sol | 2 + 4 files changed, 6043 insertions(+), 2 deletions(-) diff --git a/.openzeppelin/unknown-20156.json b/.openzeppelin/unknown-20156.json index eef9565..b79f561 100644 --- a/.openzeppelin/unknown-20156.json +++ b/.openzeppelin/unknown-20156.json @@ -17025,6 +17025,2268 @@ }, "namespaces": {} } + }, + "21fda098b396956bf528175f91d0d75663441f74bf358d1ed59e766c6b50bc2f": { + "address": "0x059A5a40F8B9D126370B3145cBC6574f093826C5", + "txHash": "0x1c8efcfd53ac2db396f0b0bb24535438d9e8c9f1aab45041f95f925ca9c5acab", + "layout": { + "solcVersion": "0.8.19", + "storage": [ + { + "label": "randomizer", + "offset": 0, + "slot": "0", + "type": "t_struct(Randomizer)3920_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:10" + }, + { + "label": "models", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_struct(Model)3601_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:12" + }, + { + "label": "miners", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_address,t_struct(Worker)3614_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:13" + }, + { + "label": "validators", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_address,t_struct(Worker)3614_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:14" + }, + { + "label": "minerAddressesByModel", + "offset": 0, + "slot": "4", + "type": "t_mapping(t_address,t_struct(AddressSet)3964_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:16" + }, + { + "label": "validatorAddressesByModel", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_address,t_struct(AddressSet)3964_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:17" + }, + { + "label": "modelAddresses", + "offset": 0, + "slot": "6", + "type": "t_struct(AddressSet)3964_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:19" + }, + { + "label": "minerAddresses", + "offset": 0, + "slot": "8", + "type": "t_struct(AddressSet)3964_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:20" + }, + { + "label": "validatorAddresses", + "offset": 0, + "slot": "10", + "type": "t_struct(AddressSet)3964_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:21" + }, + { + "label": "minerUnstakeRequests", + "offset": 0, + "slot": "12", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3699_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:23" + }, + { + "label": "validatorUnstakeRequests", + "offset": 0, + "slot": "13", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3699_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:24" + }, + { + "label": "inferenceNumber", + "offset": 0, + "slot": "14", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:26" + }, + { + "label": "inferences", + "offset": 0, + "slot": "15", + "type": "t_mapping(t_uint256,t_struct(Inference)3674_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:27" + }, + { + "label": "assignmentNumber", + "offset": 0, + "slot": "16", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:29" + }, + { + "label": "assignments", + "offset": 0, + "slot": "17", + "type": "t_mapping(t_uint256,t_struct(Assignment)3638_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:30" + }, + { + "label": "assignmentsByMiner", + "offset": 0, + "slot": "18", + "type": "t_mapping(t_address,t_struct(Uint256Set)4134_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:31" + }, + { + "label": "assignmentsByInference", + "offset": 0, + "slot": "19", + "type": "t_mapping(t_uint256,t_struct(Uint256Set)4134_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:32" + }, + { + "label": "validatorDisputed", + "offset": 0, + "slot": "20", + "type": "t_mapping(t_address,t_mapping(t_uint256,t_bool))", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:34" + }, + { + "label": "rewardInEpoch", + "offset": 0, + "slot": "21", + "type": "t_mapping(t_uint256,t_struct(MinerEpochState)3596_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:38" + }, + { + "label": "minerTaskCompleted", + "offset": 0, + "slot": "22", + "type": "t_mapping(t_address,t_mapping(t_uint256,t_uint256))", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:43" + }, + { + "label": "minerMinimumStake", + "offset": 0, + "slot": "23", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:45" + }, + { + "label": "validatorMinimumStake", + "offset": 0, + "slot": "24", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:46" + }, + { + "label": "treasury", + "offset": 0, + "slot": "25", + "type": "t_address", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:47" + }, + { + "label": "feePercentage", + "offset": 20, + "slot": "25", + "type": "t_uint16", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:48" + }, + { + "label": "miningTimeLimit", + "offset": 22, + "slot": "25", + "type": "t_uint40", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:49" + }, + { + "label": "validatingTimeLimit", + "offset": 27, + "slot": "25", + "type": "t_uint40", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:50" + }, + { + "label": "disputingTimeLimit", + "offset": 0, + "slot": "26", + "type": "t_uint40", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:51" + }, + { + "label": "penaltyDuration", + "offset": 5, + "slot": "26", + "type": "t_uint40", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:52" + }, + { + "label": "unstakeDelayTime", + "offset": 10, + "slot": "26", + "type": "t_uint40", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:53" + }, + { + "label": "minerRequirement", + "offset": 15, + "slot": "26", + "type": "t_uint8", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:54" + }, + { + "label": "maximumTier", + "offset": 16, + "slot": "26", + "type": "t_uint16", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:56" + }, + { + "label": "disqualificationPercentage", + "offset": 18, + "slot": "26", + "type": "t_uint16", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:57" + }, + { + "label": "currentEpoch", + "offset": 20, + "slot": "26", + "type": "t_uint40", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:60" + }, + { + "label": "blocksPerEpoch", + "offset": 0, + "slot": "27", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:61" + }, + { + "label": "lastBlock", + "offset": 0, + "slot": "28", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:62" + }, + { + "label": "rewardPerEpochBasedOnPerf", + "offset": 0, + "slot": "29", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:63" + }, + { + "label": "rewardPerEpoch", + "offset": 0, + "slot": "30", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:64" + }, + { + "label": "__gap", + "offset": 0, + "slot": "31", + "type": "t_array(t_uint256)100_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:66" + }, + { + "label": "_initialized", + "offset": 0, + "slot": "131", + "type": "t_uint8", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:63", + "retypedFrom": "bool" + }, + { + "label": "_initializing", + "offset": 1, + "slot": "131", + "type": "t_bool", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:68" + }, + { + "label": "__gap", + "offset": 0, + "slot": "132", + "type": "t_array(t_uint256)50_storage", + "contract": "ContextUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:40" + }, + { + "label": "_owner", + "offset": 0, + "slot": "182", + "type": "t_address", + "contract": "OwnableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:22" + }, + { + "label": "__gap", + "offset": 0, + "slot": "183", + "type": "t_array(t_uint256)49_storage", + "contract": "OwnableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:94" + }, + { + "label": "_paused", + "offset": 0, + "slot": "232", + "type": "t_bool", + "contract": "PausableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol:29" + }, + { + "label": "__gap", + "offset": 0, + "slot": "233", + "type": "t_array(t_uint256)49_storage", + "contract": "PausableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol:116" + }, + { + "label": "_status", + "offset": 0, + "slot": "282", + "type": "t_uint256", + "contract": "ReentrancyGuardUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol:38" + }, + { + "label": "__gap", + "offset": 0, + "slot": "283", + "type": "t_array(t_uint256)49_storage", + "contract": "ReentrancyGuardUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol:88" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_address)dyn_storage": { + "label": "address[]", + "numberOfBytes": "32" + }, + "t_array(t_uint256)100_storage": { + "label": "uint256[100]", + "numberOfBytes": "3200" + }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_array(t_uint256)dyn_storage": { + "label": "uint256[]", + "numberOfBytes": "32" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes_storage": { + "label": "bytes", + "numberOfBytes": "32" + }, + "t_enum(InferenceStatus)3587": { + "label": "enum IWorkerHub.InferenceStatus", + "members": [ + "Nil", + "Solving", + "Disputing", + "Solved", + "Killed" + ], + "numberOfBytes": "1" + }, + "t_mapping(t_address,t_mapping(t_uint256,t_bool))": { + "label": "mapping(address => mapping(uint256 => bool))", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_mapping(t_uint256,t_uint256))": { + "label": "mapping(address => mapping(uint256 => uint256))", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(AddressSet)3964_storage)": { + "label": "mapping(address => struct Set.AddressSet)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Model)3601_storage)": { + "label": "mapping(address => struct IWorkerHub.Model)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Uint256Set)4134_storage)": { + "label": "mapping(address => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(UnstakeRequest)3699_storage)": { + "label": "mapping(address => struct IWorkerHub.UnstakeRequest)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Worker)3614_storage)": { + "label": "mapping(address => struct IWorkerHub.Worker)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_uint256)": { + "label": "mapping(address => uint256)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_bool)": { + "label": "mapping(uint256 => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Assignment)3638_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Assignment)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Inference)3674_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Inference)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(MinerEpochState)3596_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.MinerEpochState)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Uint256Set)4134_storage)": { + "label": "mapping(uint256 => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_uint256)": { + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32" + }, + "t_struct(AddressSet)3964_storage": { + "label": "struct Set.AddressSet", + "members": [ + { + "label": "values", + "type": "t_array(t_address)dyn_storage", + "offset": 0, + "slot": "0" + }, + { + "label": "positions", + "type": "t_mapping(t_address,t_uint256)", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_struct(Assignment)3638_storage": { + "label": "struct IWorkerHub.Assignment", + "members": [ + { + "label": "inferenceId", + "type": "t_uint256", + "offset": 0, + "slot": "0" + }, + { + "label": "output", + "type": "t_bytes_storage", + "offset": 0, + "slot": "1" + }, + { + "label": "worker", + "type": "t_address", + "offset": 0, + "slot": "2" + }, + { + "label": "disapprovalCount", + "type": "t_uint8", + "offset": 20, + "slot": "2" + } + ], + "numberOfBytes": "96" + }, + "t_struct(Inference)3674_storage": { + "label": "struct IWorkerHub.Inference", + "members": [ + { + "label": "assignments", + "type": "t_array(t_uint256)dyn_storage", + "offset": 0, + "slot": "0" + }, + { + "label": "input", + "type": "t_bytes_storage", + "offset": 0, + "slot": "1" + }, + { + "label": "value", + "type": "t_uint256", + "offset": 0, + "slot": "2" + }, + { + "label": "disputingAddress", + "type": "t_address", + "offset": 0, + "slot": "3" + }, + { + "label": "modelAddress", + "type": "t_address", + "offset": 0, + "slot": "4" + }, + { + "label": "expiredAt", + "type": "t_uint40", + "offset": 20, + "slot": "4" + }, + { + "label": "firstSubmissionId", + "type": "t_uint8", + "offset": 25, + "slot": "4" + }, + { + "label": "status", + "type": "t_enum(InferenceStatus)3587", + "offset": 26, + "slot": "4" + }, + { + "label": "creator", + "type": "t_address", + "offset": 0, + "slot": "5" + } + ], + "numberOfBytes": "192" + }, + "t_struct(MinerEpochState)3596_storage": { + "label": "struct IWorkerHub.MinerEpochState", + "members": [ + { + "label": "perfReward", + "type": "t_uint256", + "offset": 0, + "slot": "0" + }, + { + "label": "epochReward", + "type": "t_uint256", + "offset": 0, + "slot": "1" + }, + { + "label": "totalTaskCompleted", + "type": "t_uint256", + "offset": 0, + "slot": "2" + }, + { + "label": "totalMiner", + "type": "t_uint256", + "offset": 0, + "slot": "3" + } + ], + "numberOfBytes": "128" + }, + "t_struct(Model)3601_storage": { + "label": "struct IWorkerHub.Model", + "members": [ + { + "label": "minimumFee", + "type": "t_uint256", + "offset": 0, + "slot": "0" + }, + { + "label": "tier", + "type": "t_uint32", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_struct(Randomizer)3920_storage": { + "label": "struct Random.Randomizer", + "members": [ + { + "label": "nonce", + "type": "t_uint256", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(Uint256Set)4134_storage": { + "label": "struct Set.Uint256Set", + "members": [ + { + "label": "values", + "type": "t_array(t_uint256)dyn_storage", + "offset": 0, + "slot": "0" + }, + { + "label": "positions", + "type": "t_mapping(t_uint256,t_uint256)", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_struct(UnstakeRequest)3699_storage": { + "label": "struct IWorkerHub.UnstakeRequest", + "members": [ + { + "label": "stake", + "type": "t_uint256", + "offset": 0, + "slot": "0" + }, + { + "label": "unlockAt", + "type": "t_uint40", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_struct(Worker)3614_storage": { + "label": "struct IWorkerHub.Worker", + "members": [ + { + "label": "stake", + "type": "t_uint256", + "offset": 0, + "slot": "0" + }, + { + "label": "commitment", + "type": "t_uint256", + "offset": 0, + "slot": "1" + }, + { + "label": "modelAddress", + "type": "t_address", + "offset": 0, + "slot": "2" + }, + { + "label": "lastClaimedEpoch", + "type": "t_uint40", + "offset": 20, + "slot": "2" + }, + { + "label": "activeTime", + "type": "t_uint40", + "offset": 25, + "slot": "2" + }, + { + "label": "tier", + "type": "t_uint16", + "offset": 30, + "slot": "2" + } + ], + "numberOfBytes": "96" + }, + "t_uint16": { + "label": "uint16", + "numberOfBytes": "2" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint32": { + "label": "uint32", + "numberOfBytes": "4" + }, + "t_uint40": { + "label": "uint40", + "numberOfBytes": "5" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + }, + "namespaces": {} + } + }, + "4276c9135e4bac8599d720824032a256f5412cc731e446fee410bbb02bee88db": { + "address": "0x868C1A4fb713A5e681df54c99B8CCA77D3BEf08E", + "txHash": "0x7cb7e714dbe8ef05c546a79729fac47ac5d7eb6337c79dd233c2ae15bf65b3c7", + "layout": { + "solcVersion": "0.8.19", + "storage": [ + { + "label": "randomizer", + "offset": 0, + "slot": "0", + "type": "t_struct(Randomizer)3921_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:10" + }, + { + "label": "models", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_struct(Model)3602_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:12" + }, + { + "label": "miners", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_address,t_struct(Worker)3615_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:13" + }, + { + "label": "validators", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_address,t_struct(Worker)3615_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:14" + }, + { + "label": "minerAddressesByModel", + "offset": 0, + "slot": "4", + "type": "t_mapping(t_address,t_struct(AddressSet)3965_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:16" + }, + { + "label": "validatorAddressesByModel", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_address,t_struct(AddressSet)3965_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:17" + }, + { + "label": "modelAddresses", + "offset": 0, + "slot": "6", + "type": "t_struct(AddressSet)3965_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:19" + }, + { + "label": "minerAddresses", + "offset": 0, + "slot": "8", + "type": "t_struct(AddressSet)3965_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:20" + }, + { + "label": "validatorAddresses", + "offset": 0, + "slot": "10", + "type": "t_struct(AddressSet)3965_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:21" + }, + { + "label": "minerUnstakeRequests", + "offset": 0, + "slot": "12", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3700_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:23" + }, + { + "label": "validatorUnstakeRequests", + "offset": 0, + "slot": "13", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3700_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:24" + }, + { + "label": "inferenceNumber", + "offset": 0, + "slot": "14", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:26" + }, + { + "label": "inferences", + "offset": 0, + "slot": "15", + "type": "t_mapping(t_uint256,t_struct(Inference)3675_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:27" + }, + { + "label": "assignmentNumber", + "offset": 0, + "slot": "16", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:29" + }, + { + "label": "assignments", + "offset": 0, + "slot": "17", + "type": "t_mapping(t_uint256,t_struct(Assignment)3639_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:30" + }, + { + "label": "assignmentsByMiner", + "offset": 0, + "slot": "18", + "type": "t_mapping(t_address,t_struct(Uint256Set)4135_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:31" + }, + { + "label": "assignmentsByInference", + "offset": 0, + "slot": "19", + "type": "t_mapping(t_uint256,t_struct(Uint256Set)4135_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:32" + }, + { + "label": "validatorDisputed", + "offset": 0, + "slot": "20", + "type": "t_mapping(t_address,t_mapping(t_uint256,t_bool))", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:34" + }, + { + "label": "rewardInEpoch", + "offset": 0, + "slot": "21", + "type": "t_mapping(t_uint256,t_struct(MinerEpochState)3597_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:38" + }, + { + "label": "minerTaskCompleted", + "offset": 0, + "slot": "22", + "type": "t_mapping(t_address,t_mapping(t_uint256,t_uint256))", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:43" + }, + { + "label": "minerMinimumStake", + "offset": 0, + "slot": "23", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:45" + }, + { + "label": "validatorMinimumStake", + "offset": 0, + "slot": "24", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:46" + }, + { + "label": "treasury", + "offset": 0, + "slot": "25", + "type": "t_address", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:47" + }, + { + "label": "feePercentage", + "offset": 20, + "slot": "25", + "type": "t_uint16", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:48" + }, + { + "label": "miningTimeLimit", + "offset": 22, + "slot": "25", + "type": "t_uint40", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:49" + }, + { + "label": "validatingTimeLimit", + "offset": 27, + "slot": "25", + "type": "t_uint40", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:50" + }, + { + "label": "disputingTimeLimit", + "offset": 0, + "slot": "26", + "type": "t_uint40", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:51" + }, + { + "label": "penaltyDuration", + "offset": 5, + "slot": "26", + "type": "t_uint40", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:52" + }, + { + "label": "unstakeDelayTime", + "offset": 10, + "slot": "26", + "type": "t_uint40", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:53" + }, + { + "label": "minerRequirement", + "offset": 15, + "slot": "26", + "type": "t_uint8", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:54" + }, + { + "label": "maximumTier", + "offset": 16, + "slot": "26", + "type": "t_uint16", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:56" + }, + { + "label": "disqualificationPercentage", + "offset": 18, + "slot": "26", + "type": "t_uint16", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:57" + }, + { + "label": "currentEpoch", + "offset": 20, + "slot": "26", + "type": "t_uint40", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:60" + }, + { + "label": "blocksPerEpoch", + "offset": 0, + "slot": "27", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:61" + }, + { + "label": "lastBlock", + "offset": 0, + "slot": "28", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:62" + }, + { + "label": "rewardPerEpochBasedOnPerf", + "offset": 0, + "slot": "29", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:63" + }, + { + "label": "rewardPerEpoch", + "offset": 0, + "slot": "30", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:64" + }, + { + "label": "__gap", + "offset": 0, + "slot": "31", + "type": "t_array(t_uint256)100_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:66" + }, + { + "label": "_initialized", + "offset": 0, + "slot": "131", + "type": "t_uint8", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:63", + "retypedFrom": "bool" + }, + { + "label": "_initializing", + "offset": 1, + "slot": "131", + "type": "t_bool", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:68" + }, + { + "label": "__gap", + "offset": 0, + "slot": "132", + "type": "t_array(t_uint256)50_storage", + "contract": "ContextUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:40" + }, + { + "label": "_owner", + "offset": 0, + "slot": "182", + "type": "t_address", + "contract": "OwnableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:22" + }, + { + "label": "__gap", + "offset": 0, + "slot": "183", + "type": "t_array(t_uint256)49_storage", + "contract": "OwnableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:94" + }, + { + "label": "_paused", + "offset": 0, + "slot": "232", + "type": "t_bool", + "contract": "PausableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol:29" + }, + { + "label": "__gap", + "offset": 0, + "slot": "233", + "type": "t_array(t_uint256)49_storage", + "contract": "PausableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol:116" + }, + { + "label": "_status", + "offset": 0, + "slot": "282", + "type": "t_uint256", + "contract": "ReentrancyGuardUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol:38" + }, + { + "label": "__gap", + "offset": 0, + "slot": "283", + "type": "t_array(t_uint256)49_storage", + "contract": "ReentrancyGuardUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol:88" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_address)dyn_storage": { + "label": "address[]", + "numberOfBytes": "32" + }, + "t_array(t_uint256)100_storage": { + "label": "uint256[100]", + "numberOfBytes": "3200" + }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_array(t_uint256)dyn_storage": { + "label": "uint256[]", + "numberOfBytes": "32" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes_storage": { + "label": "bytes", + "numberOfBytes": "32" + }, + "t_enum(InferenceStatus)3588": { + "label": "enum IWorkerHub.InferenceStatus", + "members": [ + "Nil", + "Solving", + "Disputing", + "Solved", + "Killed" + ], + "numberOfBytes": "1" + }, + "t_mapping(t_address,t_mapping(t_uint256,t_bool))": { + "label": "mapping(address => mapping(uint256 => bool))", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_mapping(t_uint256,t_uint256))": { + "label": "mapping(address => mapping(uint256 => uint256))", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(AddressSet)3965_storage)": { + "label": "mapping(address => struct Set.AddressSet)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Model)3602_storage)": { + "label": "mapping(address => struct IWorkerHub.Model)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Uint256Set)4135_storage)": { + "label": "mapping(address => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(UnstakeRequest)3700_storage)": { + "label": "mapping(address => struct IWorkerHub.UnstakeRequest)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Worker)3615_storage)": { + "label": "mapping(address => struct IWorkerHub.Worker)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_uint256)": { + "label": "mapping(address => uint256)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_bool)": { + "label": "mapping(uint256 => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Assignment)3639_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Assignment)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Inference)3675_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Inference)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(MinerEpochState)3597_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.MinerEpochState)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Uint256Set)4135_storage)": { + "label": "mapping(uint256 => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_uint256)": { + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32" + }, + "t_struct(AddressSet)3965_storage": { + "label": "struct Set.AddressSet", + "members": [ + { + "label": "values", + "type": "t_array(t_address)dyn_storage", + "offset": 0, + "slot": "0" + }, + { + "label": "positions", + "type": "t_mapping(t_address,t_uint256)", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_struct(Assignment)3639_storage": { + "label": "struct IWorkerHub.Assignment", + "members": [ + { + "label": "inferenceId", + "type": "t_uint256", + "offset": 0, + "slot": "0" + }, + { + "label": "output", + "type": "t_bytes_storage", + "offset": 0, + "slot": "1" + }, + { + "label": "worker", + "type": "t_address", + "offset": 0, + "slot": "2" + }, + { + "label": "disapprovalCount", + "type": "t_uint8", + "offset": 20, + "slot": "2" + } + ], + "numberOfBytes": "96" + }, + "t_struct(Inference)3675_storage": { + "label": "struct IWorkerHub.Inference", + "members": [ + { + "label": "assignments", + "type": "t_array(t_uint256)dyn_storage", + "offset": 0, + "slot": "0" + }, + { + "label": "input", + "type": "t_bytes_storage", + "offset": 0, + "slot": "1" + }, + { + "label": "value", + "type": "t_uint256", + "offset": 0, + "slot": "2" + }, + { + "label": "disputingAddress", + "type": "t_address", + "offset": 0, + "slot": "3" + }, + { + "label": "modelAddress", + "type": "t_address", + "offset": 0, + "slot": "4" + }, + { + "label": "expiredAt", + "type": "t_uint40", + "offset": 20, + "slot": "4" + }, + { + "label": "firstSubmissionId", + "type": "t_uint8", + "offset": 25, + "slot": "4" + }, + { + "label": "status", + "type": "t_enum(InferenceStatus)3588", + "offset": 26, + "slot": "4" + }, + { + "label": "creator", + "type": "t_address", + "offset": 0, + "slot": "5" + } + ], + "numberOfBytes": "192" + }, + "t_struct(MinerEpochState)3597_storage": { + "label": "struct IWorkerHub.MinerEpochState", + "members": [ + { + "label": "perfReward", + "type": "t_uint256", + "offset": 0, + "slot": "0" + }, + { + "label": "epochReward", + "type": "t_uint256", + "offset": 0, + "slot": "1" + }, + { + "label": "totalTaskCompleted", + "type": "t_uint256", + "offset": 0, + "slot": "2" + }, + { + "label": "totalMiner", + "type": "t_uint256", + "offset": 0, + "slot": "3" + } + ], + "numberOfBytes": "128" + }, + "t_struct(Model)3602_storage": { + "label": "struct IWorkerHub.Model", + "members": [ + { + "label": "minimumFee", + "type": "t_uint256", + "offset": 0, + "slot": "0" + }, + { + "label": "tier", + "type": "t_uint32", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_struct(Randomizer)3921_storage": { + "label": "struct Random.Randomizer", + "members": [ + { + "label": "nonce", + "type": "t_uint256", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(Uint256Set)4135_storage": { + "label": "struct Set.Uint256Set", + "members": [ + { + "label": "values", + "type": "t_array(t_uint256)dyn_storage", + "offset": 0, + "slot": "0" + }, + { + "label": "positions", + "type": "t_mapping(t_uint256,t_uint256)", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_struct(UnstakeRequest)3700_storage": { + "label": "struct IWorkerHub.UnstakeRequest", + "members": [ + { + "label": "stake", + "type": "t_uint256", + "offset": 0, + "slot": "0" + }, + { + "label": "unlockAt", + "type": "t_uint40", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_struct(Worker)3615_storage": { + "label": "struct IWorkerHub.Worker", + "members": [ + { + "label": "stake", + "type": "t_uint256", + "offset": 0, + "slot": "0" + }, + { + "label": "commitment", + "type": "t_uint256", + "offset": 0, + "slot": "1" + }, + { + "label": "modelAddress", + "type": "t_address", + "offset": 0, + "slot": "2" + }, + { + "label": "lastClaimedEpoch", + "type": "t_uint40", + "offset": 20, + "slot": "2" + }, + { + "label": "activeTime", + "type": "t_uint40", + "offset": 25, + "slot": "2" + }, + { + "label": "tier", + "type": "t_uint16", + "offset": 30, + "slot": "2" + } + ], + "numberOfBytes": "96" + }, + "t_uint16": { + "label": "uint16", + "numberOfBytes": "2" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint32": { + "label": "uint32", + "numberOfBytes": "4" + }, + "t_uint40": { + "label": "uint40", + "numberOfBytes": "5" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + }, + "namespaces": {} + } + }, + "ecaf24cfbbd79f3ed56820ca3d5b133690abea7c288dc58c43e7fdfe976e7723": { + "address": "0x732D393285fa372B975a6370B6Ca43B503635AC6", + "txHash": "0x7c96a10013670d819841c88c9a3296de59686968dd664091ab86af692f75b944", + "layout": { + "solcVersion": "0.8.19", + "storage": [ + { + "label": "randomizer", + "offset": 0, + "slot": "0", + "type": "t_struct(Randomizer)3915_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:10" + }, + { + "label": "models", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_struct(Model)3596_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:12" + }, + { + "label": "miners", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_address,t_struct(Worker)3609_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:13" + }, + { + "label": "validators", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_address,t_struct(Worker)3609_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:14" + }, + { + "label": "minerAddressesByModel", + "offset": 0, + "slot": "4", + "type": "t_mapping(t_address,t_struct(AddressSet)3959_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:16" + }, + { + "label": "validatorAddressesByModel", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_address,t_struct(AddressSet)3959_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:17" + }, + { + "label": "modelAddresses", + "offset": 0, + "slot": "6", + "type": "t_struct(AddressSet)3959_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:19" + }, + { + "label": "minerAddresses", + "offset": 0, + "slot": "8", + "type": "t_struct(AddressSet)3959_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:20" + }, + { + "label": "validatorAddresses", + "offset": 0, + "slot": "10", + "type": "t_struct(AddressSet)3959_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:21" + }, + { + "label": "minerUnstakeRequests", + "offset": 0, + "slot": "12", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3694_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:23" + }, + { + "label": "validatorUnstakeRequests", + "offset": 0, + "slot": "13", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3694_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:24" + }, + { + "label": "inferenceNumber", + "offset": 0, + "slot": "14", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:26" + }, + { + "label": "inferences", + "offset": 0, + "slot": "15", + "type": "t_mapping(t_uint256,t_struct(Inference)3669_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:27" + }, + { + "label": "assignmentNumber", + "offset": 0, + "slot": "16", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:29" + }, + { + "label": "assignments", + "offset": 0, + "slot": "17", + "type": "t_mapping(t_uint256,t_struct(Assignment)3633_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:30" + }, + { + "label": "assignmentsByMiner", + "offset": 0, + "slot": "18", + "type": "t_mapping(t_address,t_struct(Uint256Set)4129_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:31" + }, + { + "label": "assignmentsByInference", + "offset": 0, + "slot": "19", + "type": "t_mapping(t_uint256,t_struct(Uint256Set)4129_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:32" + }, + { + "label": "validatorDisputed", + "offset": 0, + "slot": "20", + "type": "t_mapping(t_address,t_mapping(t_uint256,t_bool))", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:34" + }, + { + "label": "rewardInEpoch", + "offset": 0, + "slot": "21", + "type": "t_mapping(t_uint256,t_struct(MinerEpochState)3591_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:38" + }, + { + "label": "minerTaskCompleted", + "offset": 0, + "slot": "22", + "type": "t_mapping(t_address,t_mapping(t_uint256,t_uint256))", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:43" + }, + { + "label": "minerMinimumStake", + "offset": 0, + "slot": "23", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:45" + }, + { + "label": "validatorMinimumStake", + "offset": 0, + "slot": "24", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:46" + }, + { + "label": "treasury", + "offset": 0, + "slot": "25", + "type": "t_address", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:47" + }, + { + "label": "feePercentage", + "offset": 20, + "slot": "25", + "type": "t_uint16", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:48" + }, + { + "label": "miningTimeLimit", + "offset": 22, + "slot": "25", + "type": "t_uint40", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:49" + }, + { + "label": "validatingTimeLimit", + "offset": 27, + "slot": "25", + "type": "t_uint40", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:50" + }, + { + "label": "disputingTimeLimit", + "offset": 0, + "slot": "26", + "type": "t_uint40", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:51" + }, + { + "label": "penaltyDuration", + "offset": 5, + "slot": "26", + "type": "t_uint40", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:52" + }, + { + "label": "unstakeDelayTime", + "offset": 10, + "slot": "26", + "type": "t_uint40", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:53" + }, + { + "label": "minerRequirement", + "offset": 15, + "slot": "26", + "type": "t_uint8", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:54" + }, + { + "label": "maximumTier", + "offset": 16, + "slot": "26", + "type": "t_uint16", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:56" + }, + { + "label": "disqualificationPercentage", + "offset": 18, + "slot": "26", + "type": "t_uint16", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:57" + }, + { + "label": "currentEpoch", + "offset": 20, + "slot": "26", + "type": "t_uint40", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:60" + }, + { + "label": "blocksPerEpoch", + "offset": 0, + "slot": "27", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:61" + }, + { + "label": "lastBlock", + "offset": 0, + "slot": "28", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:62" + }, + { + "label": "rewardPerEpochBasedOnPerf", + "offset": 0, + "slot": "29", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:63" + }, + { + "label": "rewardPerEpoch", + "offset": 0, + "slot": "30", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:64" + }, + { + "label": "__gap", + "offset": 0, + "slot": "31", + "type": "t_array(t_uint256)100_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:66" + }, + { + "label": "_initialized", + "offset": 0, + "slot": "131", + "type": "t_uint8", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:63", + "retypedFrom": "bool" + }, + { + "label": "_initializing", + "offset": 1, + "slot": "131", + "type": "t_bool", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:68" + }, + { + "label": "__gap", + "offset": 0, + "slot": "132", + "type": "t_array(t_uint256)50_storage", + "contract": "ContextUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:40" + }, + { + "label": "_owner", + "offset": 0, + "slot": "182", + "type": "t_address", + "contract": "OwnableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:22" + }, + { + "label": "__gap", + "offset": 0, + "slot": "183", + "type": "t_array(t_uint256)49_storage", + "contract": "OwnableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:94" + }, + { + "label": "_paused", + "offset": 0, + "slot": "232", + "type": "t_bool", + "contract": "PausableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol:29" + }, + { + "label": "__gap", + "offset": 0, + "slot": "233", + "type": "t_array(t_uint256)49_storage", + "contract": "PausableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol:116" + }, + { + "label": "_status", + "offset": 0, + "slot": "282", + "type": "t_uint256", + "contract": "ReentrancyGuardUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol:38" + }, + { + "label": "__gap", + "offset": 0, + "slot": "283", + "type": "t_array(t_uint256)49_storage", + "contract": "ReentrancyGuardUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol:88" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_address)dyn_storage": { + "label": "address[]", + "numberOfBytes": "32" + }, + "t_array(t_uint256)100_storage": { + "label": "uint256[100]", + "numberOfBytes": "3200" + }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_array(t_uint256)dyn_storage": { + "label": "uint256[]", + "numberOfBytes": "32" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes_storage": { + "label": "bytes", + "numberOfBytes": "32" + }, + "t_enum(InferenceStatus)3582": { + "label": "enum IWorkerHub.InferenceStatus", + "members": [ + "Nil", + "Solving", + "Disputing", + "Solved", + "Killed" + ], + "numberOfBytes": "1" + }, + "t_mapping(t_address,t_mapping(t_uint256,t_bool))": { + "label": "mapping(address => mapping(uint256 => bool))", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_mapping(t_uint256,t_uint256))": { + "label": "mapping(address => mapping(uint256 => uint256))", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(AddressSet)3959_storage)": { + "label": "mapping(address => struct Set.AddressSet)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Model)3596_storage)": { + "label": "mapping(address => struct IWorkerHub.Model)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Uint256Set)4129_storage)": { + "label": "mapping(address => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(UnstakeRequest)3694_storage)": { + "label": "mapping(address => struct IWorkerHub.UnstakeRequest)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Worker)3609_storage)": { + "label": "mapping(address => struct IWorkerHub.Worker)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_uint256)": { + "label": "mapping(address => uint256)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_bool)": { + "label": "mapping(uint256 => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Assignment)3633_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Assignment)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Inference)3669_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Inference)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(MinerEpochState)3591_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.MinerEpochState)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Uint256Set)4129_storage)": { + "label": "mapping(uint256 => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_uint256)": { + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32" + }, + "t_struct(AddressSet)3959_storage": { + "label": "struct Set.AddressSet", + "members": [ + { + "label": "values", + "type": "t_array(t_address)dyn_storage", + "offset": 0, + "slot": "0" + }, + { + "label": "positions", + "type": "t_mapping(t_address,t_uint256)", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_struct(Assignment)3633_storage": { + "label": "struct IWorkerHub.Assignment", + "members": [ + { + "label": "inferenceId", + "type": "t_uint256", + "offset": 0, + "slot": "0" + }, + { + "label": "output", + "type": "t_bytes_storage", + "offset": 0, + "slot": "1" + }, + { + "label": "worker", + "type": "t_address", + "offset": 0, + "slot": "2" + }, + { + "label": "disapprovalCount", + "type": "t_uint8", + "offset": 20, + "slot": "2" + } + ], + "numberOfBytes": "96" + }, + "t_struct(Inference)3669_storage": { + "label": "struct IWorkerHub.Inference", + "members": [ + { + "label": "assignments", + "type": "t_array(t_uint256)dyn_storage", + "offset": 0, + "slot": "0" + }, + { + "label": "input", + "type": "t_bytes_storage", + "offset": 0, + "slot": "1" + }, + { + "label": "value", + "type": "t_uint256", + "offset": 0, + "slot": "2" + }, + { + "label": "disputingAddress", + "type": "t_address", + "offset": 0, + "slot": "3" + }, + { + "label": "modelAddress", + "type": "t_address", + "offset": 0, + "slot": "4" + }, + { + "label": "expiredAt", + "type": "t_uint40", + "offset": 20, + "slot": "4" + }, + { + "label": "firstSubmissionId", + "type": "t_uint8", + "offset": 25, + "slot": "4" + }, + { + "label": "status", + "type": "t_enum(InferenceStatus)3582", + "offset": 26, + "slot": "4" + }, + { + "label": "creator", + "type": "t_address", + "offset": 0, + "slot": "5" + } + ], + "numberOfBytes": "192" + }, + "t_struct(MinerEpochState)3591_storage": { + "label": "struct IWorkerHub.MinerEpochState", + "members": [ + { + "label": "perfReward", + "type": "t_uint256", + "offset": 0, + "slot": "0" + }, + { + "label": "epochReward", + "type": "t_uint256", + "offset": 0, + "slot": "1" + }, + { + "label": "totalTaskCompleted", + "type": "t_uint256", + "offset": 0, + "slot": "2" + }, + { + "label": "totalMiner", + "type": "t_uint256", + "offset": 0, + "slot": "3" + } + ], + "numberOfBytes": "128" + }, + "t_struct(Model)3596_storage": { + "label": "struct IWorkerHub.Model", + "members": [ + { + "label": "minimumFee", + "type": "t_uint256", + "offset": 0, + "slot": "0" + }, + { + "label": "tier", + "type": "t_uint32", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_struct(Randomizer)3915_storage": { + "label": "struct Random.Randomizer", + "members": [ + { + "label": "nonce", + "type": "t_uint256", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(Uint256Set)4129_storage": { + "label": "struct Set.Uint256Set", + "members": [ + { + "label": "values", + "type": "t_array(t_uint256)dyn_storage", + "offset": 0, + "slot": "0" + }, + { + "label": "positions", + "type": "t_mapping(t_uint256,t_uint256)", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_struct(UnstakeRequest)3694_storage": { + "label": "struct IWorkerHub.UnstakeRequest", + "members": [ + { + "label": "stake", + "type": "t_uint256", + "offset": 0, + "slot": "0" + }, + { + "label": "unlockAt", + "type": "t_uint40", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_struct(Worker)3609_storage": { + "label": "struct IWorkerHub.Worker", + "members": [ + { + "label": "stake", + "type": "t_uint256", + "offset": 0, + "slot": "0" + }, + { + "label": "commitment", + "type": "t_uint256", + "offset": 0, + "slot": "1" + }, + { + "label": "modelAddress", + "type": "t_address", + "offset": 0, + "slot": "2" + }, + { + "label": "lastClaimedEpoch", + "type": "t_uint40", + "offset": 20, + "slot": "2" + }, + { + "label": "activeTime", + "type": "t_uint40", + "offset": 25, + "slot": "2" + }, + { + "label": "tier", + "type": "t_uint16", + "offset": 30, + "slot": "2" + } + ], + "numberOfBytes": "96" + }, + "t_uint16": { + "label": "uint16", + "numberOfBytes": "2" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint32": { + "label": "uint32", + "numberOfBytes": "4" + }, + "t_uint40": { + "label": "uint40", + "numberOfBytes": "5" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + }, + "namespaces": {} + } } } } diff --git a/.openzeppelin/unknown-43338.json b/.openzeppelin/unknown-43338.json index edb766e..41f817f 100644 --- a/.openzeppelin/unknown-43338.json +++ b/.openzeppelin/unknown-43338.json @@ -2645,6 +2645,3778 @@ }, "namespaces": {} } + }, + "66d8effdce7c7bfd7ef2894c5b5d2ae4001d70b682e47ab05710df6e35833e45": { + "address": "0xDCd0622D0d2C3fB5645D005f2829529eeccAe730", + "layout": { + "solcVersion": "0.8.19", + "storage": [ + { + "label": "randomizer", + "offset": 0, + "slot": "0", + "type": "t_struct(Randomizer)3771_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:10" + }, + { + "label": "models", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_struct(Model)3466_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:12" + }, + { + "label": "miners", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_address,t_struct(Worker)3479_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:13" + }, + { + "label": "validators", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_address,t_struct(Worker)3479_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:14" + }, + { + "label": "minerAddressesByModel", + "offset": 0, + "slot": "4", + "type": "t_mapping(t_address,t_struct(AddressSet)3815_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:16" + }, + { + "label": "validatorAddressesByModel", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_address,t_struct(AddressSet)3815_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:17" + }, + { + "label": "modelAddresses", + "offset": 0, + "slot": "6", + "type": "t_struct(AddressSet)3815_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:19" + }, + { + "label": "minerAddresses", + "offset": 0, + "slot": "8", + "type": "t_struct(AddressSet)3815_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:20" + }, + { + "label": "validatorAddresses", + "offset": 0, + "slot": "10", + "type": "t_struct(AddressSet)3815_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:21" + }, + { + "label": "minerUnstakeRequests", + "offset": 0, + "slot": "12", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3564_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:23" + }, + { + "label": "validatorUnstakeRequests", + "offset": 0, + "slot": "13", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3564_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:24" + }, + { + "label": "inferenceNumber", + "offset": 0, + "slot": "14", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:26" + }, + { + "label": "inferences", + "offset": 0, + "slot": "15", + "type": "t_mapping(t_uint256,t_struct(Inference)3539_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:27" + }, + { + "label": "assignmentNumber", + "offset": 0, + "slot": "16", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:29" + }, + { + "label": "assignments", + "offset": 0, + "slot": "17", + "type": "t_mapping(t_uint256,t_struct(Assignment)3503_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:30" + }, + { + "label": "assignmentsByMiner", + "offset": 0, + "slot": "18", + "type": "t_mapping(t_address,t_struct(Uint256Set)3985_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:31" + }, + { + "label": "assignmentsByInference", + "offset": 0, + "slot": "19", + "type": "t_mapping(t_uint256,t_struct(Uint256Set)3985_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:32" + }, + { + "label": "validatorDisputed", + "offset": 0, + "slot": "20", + "type": "t_mapping(t_address,t_mapping(t_uint256,t_bool))", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:34" + }, + { + "label": "rewardInEpoch", + "offset": 0, + "slot": "21", + "type": "t_mapping(t_uint256,t_struct(MinerEpochState)3461_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:38" + }, + { + "label": "minerTaskCompleted", + "offset": 0, + "slot": "22", + "type": "t_mapping(t_address,t_mapping(t_uint256,t_uint256))", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:43" + }, + { + "label": "minerMinimumStake", + "offset": 0, + "slot": "23", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:45" + }, + { + "label": "validatorMinimumStake", + "offset": 0, + "slot": "24", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:46" + }, + { + "label": "treasury", + "offset": 0, + "slot": "25", + "type": "t_address", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:47" + }, + { + "label": "feePercentage", + "offset": 20, + "slot": "25", + "type": "t_uint16", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:48" + }, + { + "label": "miningTimeLimit", + "offset": 22, + "slot": "25", + "type": "t_uint40", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:49" + }, + { + "label": "validatingTimeLimit", + "offset": 27, + "slot": "25", + "type": "t_uint40", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:50" + }, + { + "label": "disputingTimeLimit", + "offset": 0, + "slot": "26", + "type": "t_uint40", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:51" + }, + { + "label": "penaltyDuration", + "offset": 5, + "slot": "26", + "type": "t_uint40", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:52" + }, + { + "label": "unstakeDelayTime", + "offset": 10, + "slot": "26", + "type": "t_uint40", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:53" + }, + { + "label": "minerRequirement", + "offset": 15, + "slot": "26", + "type": "t_uint8", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:54" + }, + { + "label": "maximumTier", + "offset": 16, + "slot": "26", + "type": "t_uint16", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:56" + }, + { + "label": "disqualificationPercentage", + "offset": 18, + "slot": "26", + "type": "t_uint16", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:57" + }, + { + "label": "currentEpoch", + "offset": 20, + "slot": "26", + "type": "t_uint40", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:60" + }, + { + "label": "blocksPerEpoch", + "offset": 0, + "slot": "27", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:61" + }, + { + "label": "lastBlock", + "offset": 0, + "slot": "28", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:62" + }, + { + "label": "rewardPerEpochBasedOnPerf", + "offset": 0, + "slot": "29", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:63" + }, + { + "label": "rewardPerEpoch", + "offset": 0, + "slot": "30", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:64" + }, + { + "label": "__gap", + "offset": 0, + "slot": "31", + "type": "t_array(t_uint256)100_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:66" + }, + { + "label": "_initialized", + "offset": 0, + "slot": "131", + "type": "t_uint8", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:63", + "retypedFrom": "bool" + }, + { + "label": "_initializing", + "offset": 1, + "slot": "131", + "type": "t_bool", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:68" + }, + { + "label": "__gap", + "offset": 0, + "slot": "132", + "type": "t_array(t_uint256)50_storage", + "contract": "ContextUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:40" + }, + { + "label": "_owner", + "offset": 0, + "slot": "182", + "type": "t_address", + "contract": "OwnableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:22" + }, + { + "label": "__gap", + "offset": 0, + "slot": "183", + "type": "t_array(t_uint256)49_storage", + "contract": "OwnableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:94" + }, + { + "label": "_paused", + "offset": 0, + "slot": "232", + "type": "t_bool", + "contract": "PausableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol:29" + }, + { + "label": "__gap", + "offset": 0, + "slot": "233", + "type": "t_array(t_uint256)49_storage", + "contract": "PausableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol:116" + }, + { + "label": "_status", + "offset": 0, + "slot": "282", + "type": "t_uint256", + "contract": "ReentrancyGuardUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol:38" + }, + { + "label": "__gap", + "offset": 0, + "slot": "283", + "type": "t_array(t_uint256)49_storage", + "contract": "ReentrancyGuardUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol:88" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_address)dyn_storage": { + "label": "address[]", + "numberOfBytes": "32" + }, + "t_array(t_uint256)100_storage": { + "label": "uint256[100]", + "numberOfBytes": "3200" + }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_array(t_uint256)dyn_storage": { + "label": "uint256[]", + "numberOfBytes": "32" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes_storage": { + "label": "bytes", + "numberOfBytes": "32" + }, + "t_enum(InferenceStatus)3452": { + "label": "enum IWorkerHub.InferenceStatus", + "members": [ + "Nil", + "Solving", + "Disputing", + "Solved", + "Killed" + ], + "numberOfBytes": "1" + }, + "t_mapping(t_address,t_mapping(t_uint256,t_bool))": { + "label": "mapping(address => mapping(uint256 => bool))", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_mapping(t_uint256,t_uint256))": { + "label": "mapping(address => mapping(uint256 => uint256))", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(AddressSet)3815_storage)": { + "label": "mapping(address => struct Set.AddressSet)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Model)3466_storage)": { + "label": "mapping(address => struct IWorkerHub.Model)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Uint256Set)3985_storage)": { + "label": "mapping(address => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(UnstakeRequest)3564_storage)": { + "label": "mapping(address => struct IWorkerHub.UnstakeRequest)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Worker)3479_storage)": { + "label": "mapping(address => struct IWorkerHub.Worker)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_uint256)": { + "label": "mapping(address => uint256)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_bool)": { + "label": "mapping(uint256 => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Assignment)3503_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Assignment)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Inference)3539_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Inference)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(MinerEpochState)3461_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.MinerEpochState)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Uint256Set)3985_storage)": { + "label": "mapping(uint256 => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_uint256)": { + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32" + }, + "t_struct(AddressSet)3815_storage": { + "label": "struct Set.AddressSet", + "members": [ + { + "label": "values", + "type": "t_array(t_address)dyn_storage", + "offset": 0, + "slot": "0" + }, + { + "label": "positions", + "type": "t_mapping(t_address,t_uint256)", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_struct(Assignment)3503_storage": { + "label": "struct IWorkerHub.Assignment", + "members": [ + { + "label": "inferenceId", + "type": "t_uint256", + "offset": 0, + "slot": "0" + }, + { + "label": "output", + "type": "t_bytes_storage", + "offset": 0, + "slot": "1" + }, + { + "label": "worker", + "type": "t_address", + "offset": 0, + "slot": "2" + }, + { + "label": "disapprovalCount", + "type": "t_uint8", + "offset": 20, + "slot": "2" + } + ], + "numberOfBytes": "96" + }, + "t_struct(Inference)3539_storage": { + "label": "struct IWorkerHub.Inference", + "members": [ + { + "label": "assignments", + "type": "t_array(t_uint256)dyn_storage", + "offset": 0, + "slot": "0" + }, + { + "label": "input", + "type": "t_bytes_storage", + "offset": 0, + "slot": "1" + }, + { + "label": "value", + "type": "t_uint256", + "offset": 0, + "slot": "2" + }, + { + "label": "disputingAddress", + "type": "t_address", + "offset": 0, + "slot": "3" + }, + { + "label": "modelAddress", + "type": "t_address", + "offset": 0, + "slot": "4" + }, + { + "label": "expiredAt", + "type": "t_uint40", + "offset": 20, + "slot": "4" + }, + { + "label": "firstSubmissionId", + "type": "t_uint8", + "offset": 25, + "slot": "4" + }, + { + "label": "status", + "type": "t_enum(InferenceStatus)3452", + "offset": 26, + "slot": "4" + }, + { + "label": "creator", + "type": "t_address", + "offset": 0, + "slot": "5" + } + ], + "numberOfBytes": "192" + }, + "t_struct(MinerEpochState)3461_storage": { + "label": "struct IWorkerHub.MinerEpochState", + "members": [ + { + "label": "perfReward", + "type": "t_uint256", + "offset": 0, + "slot": "0" + }, + { + "label": "epochReward", + "type": "t_uint256", + "offset": 0, + "slot": "1" + }, + { + "label": "totalTaskCompleted", + "type": "t_uint256", + "offset": 0, + "slot": "2" + }, + { + "label": "totalMiner", + "type": "t_uint256", + "offset": 0, + "slot": "3" + } + ], + "numberOfBytes": "128" + }, + "t_struct(Model)3466_storage": { + "label": "struct IWorkerHub.Model", + "members": [ + { + "label": "minimumFee", + "type": "t_uint256", + "offset": 0, + "slot": "0" + }, + { + "label": "tier", + "type": "t_uint32", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_struct(Randomizer)3771_storage": { + "label": "struct Random.Randomizer", + "members": [ + { + "label": "nonce", + "type": "t_uint256", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(Uint256Set)3985_storage": { + "label": "struct Set.Uint256Set", + "members": [ + { + "label": "values", + "type": "t_array(t_uint256)dyn_storage", + "offset": 0, + "slot": "0" + }, + { + "label": "positions", + "type": "t_mapping(t_uint256,t_uint256)", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_struct(UnstakeRequest)3564_storage": { + "label": "struct IWorkerHub.UnstakeRequest", + "members": [ + { + "label": "stake", + "type": "t_uint256", + "offset": 0, + "slot": "0" + }, + { + "label": "unlockAt", + "type": "t_uint40", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_struct(Worker)3479_storage": { + "label": "struct IWorkerHub.Worker", + "members": [ + { + "label": "stake", + "type": "t_uint256", + "offset": 0, + "slot": "0" + }, + { + "label": "commitment", + "type": "t_uint256", + "offset": 0, + "slot": "1" + }, + { + "label": "modelAddress", + "type": "t_address", + "offset": 0, + "slot": "2" + }, + { + "label": "lastClaimedEpoch", + "type": "t_uint40", + "offset": 20, + "slot": "2" + }, + { + "label": "activeTime", + "type": "t_uint40", + "offset": 25, + "slot": "2" + }, + { + "label": "tier", + "type": "t_uint16", + "offset": 30, + "slot": "2" + } + ], + "numberOfBytes": "96" + }, + "t_uint16": { + "label": "uint16", + "numberOfBytes": "2" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint32": { + "label": "uint32", + "numberOfBytes": "4" + }, + "t_uint40": { + "label": "uint40", + "numberOfBytes": "5" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + }, + "namespaces": {} + }, + "allAddresses": [ + "0xDCd0622D0d2C3fB5645D005f2829529eeccAe730" + ] + }, + "ab2ce02221b12c99077e2f45f8d3badbd641b8a2f4007920599f757106fec228": { + "address": "0x92eE37e1718613f5A9E6AA27879Fa2626568bf73", + "txHash": "0x4a38ce0d1162082d9e8d22ff3e97773c3378fff3e7a2748f066e835a31607467", + "layout": { + "solcVersion": "0.8.19", + "storage": [ + { + "label": "randomizer", + "offset": 0, + "slot": "0", + "type": "t_struct(Randomizer)3914_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:10" + }, + { + "label": "models", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_struct(Model)3599_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:12" + }, + { + "label": "miners", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_address,t_struct(Worker)3612_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:13" + }, + { + "label": "validators", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_address,t_struct(Worker)3612_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:14" + }, + { + "label": "minerAddressesByModel", + "offset": 0, + "slot": "4", + "type": "t_mapping(t_address,t_struct(AddressSet)3958_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:16" + }, + { + "label": "validatorAddressesByModel", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_address,t_struct(AddressSet)3958_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:17" + }, + { + "label": "modelAddresses", + "offset": 0, + "slot": "6", + "type": "t_struct(AddressSet)3958_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:19" + }, + { + "label": "minerAddresses", + "offset": 0, + "slot": "8", + "type": "t_struct(AddressSet)3958_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:20" + }, + { + "label": "validatorAddresses", + "offset": 0, + "slot": "10", + "type": "t_struct(AddressSet)3958_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:21" + }, + { + "label": "minerUnstakeRequests", + "offset": 0, + "slot": "12", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3697_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:23" + }, + { + "label": "validatorUnstakeRequests", + "offset": 0, + "slot": "13", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3697_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:24" + }, + { + "label": "inferenceNumber", + "offset": 0, + "slot": "14", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:26" + }, + { + "label": "inferences", + "offset": 0, + "slot": "15", + "type": "t_mapping(t_uint256,t_struct(Inference)3672_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:27" + }, + { + "label": "assignmentNumber", + "offset": 0, + "slot": "16", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:29" + }, + { + "label": "assignments", + "offset": 0, + "slot": "17", + "type": "t_mapping(t_uint256,t_struct(Assignment)3636_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:30" + }, + { + "label": "assignmentsByMiner", + "offset": 0, + "slot": "18", + "type": "t_mapping(t_address,t_struct(Uint256Set)4128_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:31" + }, + { + "label": "assignmentsByInference", + "offset": 0, + "slot": "19", + "type": "t_mapping(t_uint256,t_struct(Uint256Set)4128_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:32" + }, + { + "label": "validatorDisputed", + "offset": 0, + "slot": "20", + "type": "t_mapping(t_address,t_mapping(t_uint256,t_bool))", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:34" + }, + { + "label": "rewardInEpoch", + "offset": 0, + "slot": "21", + "type": "t_mapping(t_uint256,t_struct(MinerEpochState)3594_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:38" + }, + { + "label": "minerTaskCompleted", + "offset": 0, + "slot": "22", + "type": "t_mapping(t_address,t_mapping(t_uint256,t_uint256))", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:43" + }, + { + "label": "minerMinimumStake", + "offset": 0, + "slot": "23", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:45" + }, + { + "label": "validatorMinimumStake", + "offset": 0, + "slot": "24", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:46" + }, + { + "label": "treasury", + "offset": 0, + "slot": "25", + "type": "t_address", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:47" + }, + { + "label": "feePercentage", + "offset": 20, + "slot": "25", + "type": "t_uint16", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:48" + }, + { + "label": "miningTimeLimit", + "offset": 22, + "slot": "25", + "type": "t_uint40", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:49" + }, + { + "label": "validatingTimeLimit", + "offset": 27, + "slot": "25", + "type": "t_uint40", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:50" + }, + { + "label": "disputingTimeLimit", + "offset": 0, + "slot": "26", + "type": "t_uint40", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:51" + }, + { + "label": "penaltyDuration", + "offset": 5, + "slot": "26", + "type": "t_uint40", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:52" + }, + { + "label": "unstakeDelayTime", + "offset": 10, + "slot": "26", + "type": "t_uint40", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:53" + }, + { + "label": "minerRequirement", + "offset": 15, + "slot": "26", + "type": "t_uint8", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:54" + }, + { + "label": "maximumTier", + "offset": 16, + "slot": "26", + "type": "t_uint16", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:56" + }, + { + "label": "disqualificationPercentage", + "offset": 18, + "slot": "26", + "type": "t_uint16", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:57" + }, + { + "label": "currentEpoch", + "offset": 20, + "slot": "26", + "type": "t_uint40", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:60" + }, + { + "label": "blocksPerEpoch", + "offset": 0, + "slot": "27", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:61" + }, + { + "label": "lastBlock", + "offset": 0, + "slot": "28", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:62" + }, + { + "label": "rewardPerEpochBasedOnPerf", + "offset": 0, + "slot": "29", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:63" + }, + { + "label": "rewardPerEpoch", + "offset": 0, + "slot": "30", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:64" + }, + { + "label": "__gap", + "offset": 0, + "slot": "31", + "type": "t_array(t_uint256)100_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:66" + }, + { + "label": "_initialized", + "offset": 0, + "slot": "131", + "type": "t_uint8", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:63", + "retypedFrom": "bool" + }, + { + "label": "_initializing", + "offset": 1, + "slot": "131", + "type": "t_bool", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:68" + }, + { + "label": "__gap", + "offset": 0, + "slot": "132", + "type": "t_array(t_uint256)50_storage", + "contract": "ContextUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:40" + }, + { + "label": "_owner", + "offset": 0, + "slot": "182", + "type": "t_address", + "contract": "OwnableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:22" + }, + { + "label": "__gap", + "offset": 0, + "slot": "183", + "type": "t_array(t_uint256)49_storage", + "contract": "OwnableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:94" + }, + { + "label": "_paused", + "offset": 0, + "slot": "232", + "type": "t_bool", + "contract": "PausableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol:29" + }, + { + "label": "__gap", + "offset": 0, + "slot": "233", + "type": "t_array(t_uint256)49_storage", + "contract": "PausableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol:116" + }, + { + "label": "_status", + "offset": 0, + "slot": "282", + "type": "t_uint256", + "contract": "ReentrancyGuardUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol:38" + }, + { + "label": "__gap", + "offset": 0, + "slot": "283", + "type": "t_array(t_uint256)49_storage", + "contract": "ReentrancyGuardUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol:88" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_address)dyn_storage": { + "label": "address[]", + "numberOfBytes": "32" + }, + "t_array(t_uint256)100_storage": { + "label": "uint256[100]", + "numberOfBytes": "3200" + }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_array(t_uint256)dyn_storage": { + "label": "uint256[]", + "numberOfBytes": "32" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes_storage": { + "label": "bytes", + "numberOfBytes": "32" + }, + "t_enum(InferenceStatus)3585": { + "label": "enum IWorkerHub.InferenceStatus", + "members": [ + "Nil", + "Solving", + "Disputing", + "Solved", + "Killed" + ], + "numberOfBytes": "1" + }, + "t_mapping(t_address,t_mapping(t_uint256,t_bool))": { + "label": "mapping(address => mapping(uint256 => bool))", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_mapping(t_uint256,t_uint256))": { + "label": "mapping(address => mapping(uint256 => uint256))", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(AddressSet)3958_storage)": { + "label": "mapping(address => struct Set.AddressSet)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Model)3599_storage)": { + "label": "mapping(address => struct IWorkerHub.Model)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Uint256Set)4128_storage)": { + "label": "mapping(address => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(UnstakeRequest)3697_storage)": { + "label": "mapping(address => struct IWorkerHub.UnstakeRequest)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Worker)3612_storage)": { + "label": "mapping(address => struct IWorkerHub.Worker)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_uint256)": { + "label": "mapping(address => uint256)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_bool)": { + "label": "mapping(uint256 => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Assignment)3636_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Assignment)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Inference)3672_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Inference)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(MinerEpochState)3594_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.MinerEpochState)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Uint256Set)4128_storage)": { + "label": "mapping(uint256 => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_uint256)": { + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32" + }, + "t_struct(AddressSet)3958_storage": { + "label": "struct Set.AddressSet", + "members": [ + { + "label": "values", + "type": "t_array(t_address)dyn_storage", + "offset": 0, + "slot": "0" + }, + { + "label": "positions", + "type": "t_mapping(t_address,t_uint256)", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_struct(Assignment)3636_storage": { + "label": "struct IWorkerHub.Assignment", + "members": [ + { + "label": "inferenceId", + "type": "t_uint256", + "offset": 0, + "slot": "0" + }, + { + "label": "output", + "type": "t_bytes_storage", + "offset": 0, + "slot": "1" + }, + { + "label": "worker", + "type": "t_address", + "offset": 0, + "slot": "2" + }, + { + "label": "disapprovalCount", + "type": "t_uint8", + "offset": 20, + "slot": "2" + } + ], + "numberOfBytes": "96" + }, + "t_struct(Inference)3672_storage": { + "label": "struct IWorkerHub.Inference", + "members": [ + { + "label": "assignments", + "type": "t_array(t_uint256)dyn_storage", + "offset": 0, + "slot": "0" + }, + { + "label": "input", + "type": "t_bytes_storage", + "offset": 0, + "slot": "1" + }, + { + "label": "value", + "type": "t_uint256", + "offset": 0, + "slot": "2" + }, + { + "label": "disputingAddress", + "type": "t_address", + "offset": 0, + "slot": "3" + }, + { + "label": "modelAddress", + "type": "t_address", + "offset": 0, + "slot": "4" + }, + { + "label": "expiredAt", + "type": "t_uint40", + "offset": 20, + "slot": "4" + }, + { + "label": "firstSubmissionId", + "type": "t_uint8", + "offset": 25, + "slot": "4" + }, + { + "label": "status", + "type": "t_enum(InferenceStatus)3585", + "offset": 26, + "slot": "4" + }, + { + "label": "creator", + "type": "t_address", + "offset": 0, + "slot": "5" + } + ], + "numberOfBytes": "192" + }, + "t_struct(MinerEpochState)3594_storage": { + "label": "struct IWorkerHub.MinerEpochState", + "members": [ + { + "label": "perfReward", + "type": "t_uint256", + "offset": 0, + "slot": "0" + }, + { + "label": "epochReward", + "type": "t_uint256", + "offset": 0, + "slot": "1" + }, + { + "label": "totalTaskCompleted", + "type": "t_uint256", + "offset": 0, + "slot": "2" + }, + { + "label": "totalMiner", + "type": "t_uint256", + "offset": 0, + "slot": "3" + } + ], + "numberOfBytes": "128" + }, + "t_struct(Model)3599_storage": { + "label": "struct IWorkerHub.Model", + "members": [ + { + "label": "minimumFee", + "type": "t_uint256", + "offset": 0, + "slot": "0" + }, + { + "label": "tier", + "type": "t_uint32", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_struct(Randomizer)3914_storage": { + "label": "struct Random.Randomizer", + "members": [ + { + "label": "nonce", + "type": "t_uint256", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(Uint256Set)4128_storage": { + "label": "struct Set.Uint256Set", + "members": [ + { + "label": "values", + "type": "t_array(t_uint256)dyn_storage", + "offset": 0, + "slot": "0" + }, + { + "label": "positions", + "type": "t_mapping(t_uint256,t_uint256)", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_struct(UnstakeRequest)3697_storage": { + "label": "struct IWorkerHub.UnstakeRequest", + "members": [ + { + "label": "stake", + "type": "t_uint256", + "offset": 0, + "slot": "0" + }, + { + "label": "unlockAt", + "type": "t_uint40", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_struct(Worker)3612_storage": { + "label": "struct IWorkerHub.Worker", + "members": [ + { + "label": "stake", + "type": "t_uint256", + "offset": 0, + "slot": "0" + }, + { + "label": "commitment", + "type": "t_uint256", + "offset": 0, + "slot": "1" + }, + { + "label": "modelAddress", + "type": "t_address", + "offset": 0, + "slot": "2" + }, + { + "label": "lastClaimedEpoch", + "type": "t_uint40", + "offset": 20, + "slot": "2" + }, + { + "label": "activeTime", + "type": "t_uint40", + "offset": 25, + "slot": "2" + }, + { + "label": "tier", + "type": "t_uint16", + "offset": 30, + "slot": "2" + } + ], + "numberOfBytes": "96" + }, + "t_uint16": { + "label": "uint16", + "numberOfBytes": "2" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint32": { + "label": "uint32", + "numberOfBytes": "4" + }, + "t_uint40": { + "label": "uint40", + "numberOfBytes": "5" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + }, + "namespaces": {} + } + }, + "d011b18cc132a83de1fd50498e076dd0fd7fffc2eee2b912ce9e7d16cea01449": { + "address": "0x271fD1B22171Eb935F03D7f0Ece310Cc9C7CDDcD", + "txHash": "0x6603035b0de64a43aefad2e8021ff0949ea3302e48addfa16f94b3964fd08a01", + "layout": { + "solcVersion": "0.8.19", + "storage": [ + { + "label": "randomizer", + "offset": 0, + "slot": "0", + "type": "t_struct(Randomizer)3934_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:10" + }, + { + "label": "models", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_struct(Model)3615_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:12" + }, + { + "label": "miners", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_address,t_struct(Worker)3628_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:13" + }, + { + "label": "validators", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_address,t_struct(Worker)3628_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:14" + }, + { + "label": "minerAddressesByModel", + "offset": 0, + "slot": "4", + "type": "t_mapping(t_address,t_struct(AddressSet)3978_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:16" + }, + { + "label": "validatorAddressesByModel", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_address,t_struct(AddressSet)3978_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:17" + }, + { + "label": "modelAddresses", + "offset": 0, + "slot": "6", + "type": "t_struct(AddressSet)3978_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:19" + }, + { + "label": "minerAddresses", + "offset": 0, + "slot": "8", + "type": "t_struct(AddressSet)3978_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:20" + }, + { + "label": "validatorAddresses", + "offset": 0, + "slot": "10", + "type": "t_struct(AddressSet)3978_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:21" + }, + { + "label": "minerUnstakeRequests", + "offset": 0, + "slot": "12", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3713_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:23" + }, + { + "label": "validatorUnstakeRequests", + "offset": 0, + "slot": "13", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3713_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:24" + }, + { + "label": "inferenceNumber", + "offset": 0, + "slot": "14", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:26" + }, + { + "label": "inferences", + "offset": 0, + "slot": "15", + "type": "t_mapping(t_uint256,t_struct(Inference)3688_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:27" + }, + { + "label": "assignmentNumber", + "offset": 0, + "slot": "16", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:29" + }, + { + "label": "assignments", + "offset": 0, + "slot": "17", + "type": "t_mapping(t_uint256,t_struct(Assignment)3652_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:30" + }, + { + "label": "assignmentsByMiner", + "offset": 0, + "slot": "18", + "type": "t_mapping(t_address,t_struct(Uint256Set)4148_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:31" + }, + { + "label": "assignmentsByInference", + "offset": 0, + "slot": "19", + "type": "t_mapping(t_uint256,t_struct(Uint256Set)4148_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:32" + }, + { + "label": "validatorDisputed", + "offset": 0, + "slot": "20", + "type": "t_mapping(t_address,t_mapping(t_uint256,t_bool))", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:34" + }, + { + "label": "rewardInEpoch", + "offset": 0, + "slot": "21", + "type": "t_mapping(t_uint256,t_struct(MinerEpochState)3610_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:38" + }, + { + "label": "minerTaskCompleted", + "offset": 0, + "slot": "22", + "type": "t_mapping(t_address,t_mapping(t_uint256,t_uint256))", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:43" + }, + { + "label": "minerMinimumStake", + "offset": 0, + "slot": "23", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:45" + }, + { + "label": "validatorMinimumStake", + "offset": 0, + "slot": "24", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:46" + }, + { + "label": "treasury", + "offset": 0, + "slot": "25", + "type": "t_address", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:47" + }, + { + "label": "feePercentage", + "offset": 20, + "slot": "25", + "type": "t_uint16", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:48" + }, + { + "label": "miningTimeLimit", + "offset": 22, + "slot": "25", + "type": "t_uint40", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:49" + }, + { + "label": "validatingTimeLimit", + "offset": 27, + "slot": "25", + "type": "t_uint40", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:50" + }, + { + "label": "disputingTimeLimit", + "offset": 0, + "slot": "26", + "type": "t_uint40", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:51" + }, + { + "label": "penaltyDuration", + "offset": 5, + "slot": "26", + "type": "t_uint40", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:52" + }, + { + "label": "unstakeDelayTime", + "offset": 10, + "slot": "26", + "type": "t_uint40", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:53" + }, + { + "label": "minerRequirement", + "offset": 15, + "slot": "26", + "type": "t_uint8", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:54" + }, + { + "label": "maximumTier", + "offset": 16, + "slot": "26", + "type": "t_uint16", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:56" + }, + { + "label": "disqualificationPercentage", + "offset": 18, + "slot": "26", + "type": "t_uint16", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:57" + }, + { + "label": "currentEpoch", + "offset": 20, + "slot": "26", + "type": "t_uint40", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:60" + }, + { + "label": "blocksPerEpoch", + "offset": 0, + "slot": "27", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:61" + }, + { + "label": "lastBlock", + "offset": 0, + "slot": "28", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:62" + }, + { + "label": "rewardPerEpochBasedOnPerf", + "offset": 0, + "slot": "29", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:63" + }, + { + "label": "rewardPerEpoch", + "offset": 0, + "slot": "30", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:64" + }, + { + "label": "__gap", + "offset": 0, + "slot": "31", + "type": "t_array(t_uint256)100_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:66" + }, + { + "label": "_initialized", + "offset": 0, + "slot": "131", + "type": "t_uint8", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:63", + "retypedFrom": "bool" + }, + { + "label": "_initializing", + "offset": 1, + "slot": "131", + "type": "t_bool", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:68" + }, + { + "label": "__gap", + "offset": 0, + "slot": "132", + "type": "t_array(t_uint256)50_storage", + "contract": "ContextUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:40" + }, + { + "label": "_owner", + "offset": 0, + "slot": "182", + "type": "t_address", + "contract": "OwnableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:22" + }, + { + "label": "__gap", + "offset": 0, + "slot": "183", + "type": "t_array(t_uint256)49_storage", + "contract": "OwnableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:94" + }, + { + "label": "_paused", + "offset": 0, + "slot": "232", + "type": "t_bool", + "contract": "PausableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol:29" + }, + { + "label": "__gap", + "offset": 0, + "slot": "233", + "type": "t_array(t_uint256)49_storage", + "contract": "PausableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol:116" + }, + { + "label": "_status", + "offset": 0, + "slot": "282", + "type": "t_uint256", + "contract": "ReentrancyGuardUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol:38" + }, + { + "label": "__gap", + "offset": 0, + "slot": "283", + "type": "t_array(t_uint256)49_storage", + "contract": "ReentrancyGuardUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol:88" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_address)dyn_storage": { + "label": "address[]", + "numberOfBytes": "32" + }, + "t_array(t_uint256)100_storage": { + "label": "uint256[100]", + "numberOfBytes": "3200" + }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_array(t_uint256)dyn_storage": { + "label": "uint256[]", + "numberOfBytes": "32" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes_storage": { + "label": "bytes", + "numberOfBytes": "32" + }, + "t_enum(InferenceStatus)3601": { + "label": "enum IWorkerHub.InferenceStatus", + "members": [ + "Nil", + "Solving", + "Disputing", + "Solved", + "Killed" + ], + "numberOfBytes": "1" + }, + "t_mapping(t_address,t_mapping(t_uint256,t_bool))": { + "label": "mapping(address => mapping(uint256 => bool))", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_mapping(t_uint256,t_uint256))": { + "label": "mapping(address => mapping(uint256 => uint256))", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(AddressSet)3978_storage)": { + "label": "mapping(address => struct Set.AddressSet)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Model)3615_storage)": { + "label": "mapping(address => struct IWorkerHub.Model)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Uint256Set)4148_storage)": { + "label": "mapping(address => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(UnstakeRequest)3713_storage)": { + "label": "mapping(address => struct IWorkerHub.UnstakeRequest)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Worker)3628_storage)": { + "label": "mapping(address => struct IWorkerHub.Worker)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_uint256)": { + "label": "mapping(address => uint256)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_bool)": { + "label": "mapping(uint256 => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Assignment)3652_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Assignment)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Inference)3688_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Inference)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(MinerEpochState)3610_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.MinerEpochState)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Uint256Set)4148_storage)": { + "label": "mapping(uint256 => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_uint256)": { + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32" + }, + "t_struct(AddressSet)3978_storage": { + "label": "struct Set.AddressSet", + "members": [ + { + "label": "values", + "type": "t_array(t_address)dyn_storage", + "offset": 0, + "slot": "0" + }, + { + "label": "positions", + "type": "t_mapping(t_address,t_uint256)", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_struct(Assignment)3652_storage": { + "label": "struct IWorkerHub.Assignment", + "members": [ + { + "label": "inferenceId", + "type": "t_uint256", + "offset": 0, + "slot": "0" + }, + { + "label": "output", + "type": "t_bytes_storage", + "offset": 0, + "slot": "1" + }, + { + "label": "worker", + "type": "t_address", + "offset": 0, + "slot": "2" + }, + { + "label": "disapprovalCount", + "type": "t_uint8", + "offset": 20, + "slot": "2" + } + ], + "numberOfBytes": "96" + }, + "t_struct(Inference)3688_storage": { + "label": "struct IWorkerHub.Inference", + "members": [ + { + "label": "assignments", + "type": "t_array(t_uint256)dyn_storage", + "offset": 0, + "slot": "0" + }, + { + "label": "input", + "type": "t_bytes_storage", + "offset": 0, + "slot": "1" + }, + { + "label": "value", + "type": "t_uint256", + "offset": 0, + "slot": "2" + }, + { + "label": "disputingAddress", + "type": "t_address", + "offset": 0, + "slot": "3" + }, + { + "label": "modelAddress", + "type": "t_address", + "offset": 0, + "slot": "4" + }, + { + "label": "expiredAt", + "type": "t_uint40", + "offset": 20, + "slot": "4" + }, + { + "label": "firstSubmissionId", + "type": "t_uint8", + "offset": 25, + "slot": "4" + }, + { + "label": "status", + "type": "t_enum(InferenceStatus)3601", + "offset": 26, + "slot": "4" + }, + { + "label": "creator", + "type": "t_address", + "offset": 0, + "slot": "5" + } + ], + "numberOfBytes": "192" + }, + "t_struct(MinerEpochState)3610_storage": { + "label": "struct IWorkerHub.MinerEpochState", + "members": [ + { + "label": "perfReward", + "type": "t_uint256", + "offset": 0, + "slot": "0" + }, + { + "label": "epochReward", + "type": "t_uint256", + "offset": 0, + "slot": "1" + }, + { + "label": "totalTaskCompleted", + "type": "t_uint256", + "offset": 0, + "slot": "2" + }, + { + "label": "totalMiner", + "type": "t_uint256", + "offset": 0, + "slot": "3" + } + ], + "numberOfBytes": "128" + }, + "t_struct(Model)3615_storage": { + "label": "struct IWorkerHub.Model", + "members": [ + { + "label": "minimumFee", + "type": "t_uint256", + "offset": 0, + "slot": "0" + }, + { + "label": "tier", + "type": "t_uint32", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_struct(Randomizer)3934_storage": { + "label": "struct Random.Randomizer", + "members": [ + { + "label": "nonce", + "type": "t_uint256", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(Uint256Set)4148_storage": { + "label": "struct Set.Uint256Set", + "members": [ + { + "label": "values", + "type": "t_array(t_uint256)dyn_storage", + "offset": 0, + "slot": "0" + }, + { + "label": "positions", + "type": "t_mapping(t_uint256,t_uint256)", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_struct(UnstakeRequest)3713_storage": { + "label": "struct IWorkerHub.UnstakeRequest", + "members": [ + { + "label": "stake", + "type": "t_uint256", + "offset": 0, + "slot": "0" + }, + { + "label": "unlockAt", + "type": "t_uint40", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_struct(Worker)3628_storage": { + "label": "struct IWorkerHub.Worker", + "members": [ + { + "label": "stake", + "type": "t_uint256", + "offset": 0, + "slot": "0" + }, + { + "label": "commitment", + "type": "t_uint256", + "offset": 0, + "slot": "1" + }, + { + "label": "modelAddress", + "type": "t_address", + "offset": 0, + "slot": "2" + }, + { + "label": "lastClaimedEpoch", + "type": "t_uint40", + "offset": 20, + "slot": "2" + }, + { + "label": "activeTime", + "type": "t_uint40", + "offset": 25, + "slot": "2" + }, + { + "label": "tier", + "type": "t_uint16", + "offset": 30, + "slot": "2" + } + ], + "numberOfBytes": "96" + }, + "t_uint16": { + "label": "uint16", + "numberOfBytes": "2" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint32": { + "label": "uint32", + "numberOfBytes": "4" + }, + "t_uint40": { + "label": "uint40", + "numberOfBytes": "5" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + }, + "namespaces": {} + } + }, + "21fda098b396956bf528175f91d0d75663441f74bf358d1ed59e766c6b50bc2f": { + "address": "0x6dd29e64a144cd41705661F42B7F1aa3abCCD552", + "txHash": "0xa26d8b62fe833fcd888108e50506a17ba1e42106c0b130aa3cce198bc98d5507", + "layout": { + "solcVersion": "0.8.19", + "storage": [ + { + "label": "randomizer", + "offset": 0, + "slot": "0", + "type": "t_struct(Randomizer)3920_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:10" + }, + { + "label": "models", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_struct(Model)3601_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:12" + }, + { + "label": "miners", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_address,t_struct(Worker)3614_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:13" + }, + { + "label": "validators", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_address,t_struct(Worker)3614_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:14" + }, + { + "label": "minerAddressesByModel", + "offset": 0, + "slot": "4", + "type": "t_mapping(t_address,t_struct(AddressSet)3964_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:16" + }, + { + "label": "validatorAddressesByModel", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_address,t_struct(AddressSet)3964_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:17" + }, + { + "label": "modelAddresses", + "offset": 0, + "slot": "6", + "type": "t_struct(AddressSet)3964_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:19" + }, + { + "label": "minerAddresses", + "offset": 0, + "slot": "8", + "type": "t_struct(AddressSet)3964_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:20" + }, + { + "label": "validatorAddresses", + "offset": 0, + "slot": "10", + "type": "t_struct(AddressSet)3964_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:21" + }, + { + "label": "minerUnstakeRequests", + "offset": 0, + "slot": "12", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3699_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:23" + }, + { + "label": "validatorUnstakeRequests", + "offset": 0, + "slot": "13", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3699_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:24" + }, + { + "label": "inferenceNumber", + "offset": 0, + "slot": "14", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:26" + }, + { + "label": "inferences", + "offset": 0, + "slot": "15", + "type": "t_mapping(t_uint256,t_struct(Inference)3674_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:27" + }, + { + "label": "assignmentNumber", + "offset": 0, + "slot": "16", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:29" + }, + { + "label": "assignments", + "offset": 0, + "slot": "17", + "type": "t_mapping(t_uint256,t_struct(Assignment)3638_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:30" + }, + { + "label": "assignmentsByMiner", + "offset": 0, + "slot": "18", + "type": "t_mapping(t_address,t_struct(Uint256Set)4134_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:31" + }, + { + "label": "assignmentsByInference", + "offset": 0, + "slot": "19", + "type": "t_mapping(t_uint256,t_struct(Uint256Set)4134_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:32" + }, + { + "label": "validatorDisputed", + "offset": 0, + "slot": "20", + "type": "t_mapping(t_address,t_mapping(t_uint256,t_bool))", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:34" + }, + { + "label": "rewardInEpoch", + "offset": 0, + "slot": "21", + "type": "t_mapping(t_uint256,t_struct(MinerEpochState)3596_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:38" + }, + { + "label": "minerTaskCompleted", + "offset": 0, + "slot": "22", + "type": "t_mapping(t_address,t_mapping(t_uint256,t_uint256))", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:43" + }, + { + "label": "minerMinimumStake", + "offset": 0, + "slot": "23", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:45" + }, + { + "label": "validatorMinimumStake", + "offset": 0, + "slot": "24", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:46" + }, + { + "label": "treasury", + "offset": 0, + "slot": "25", + "type": "t_address", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:47" + }, + { + "label": "feePercentage", + "offset": 20, + "slot": "25", + "type": "t_uint16", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:48" + }, + { + "label": "miningTimeLimit", + "offset": 22, + "slot": "25", + "type": "t_uint40", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:49" + }, + { + "label": "validatingTimeLimit", + "offset": 27, + "slot": "25", + "type": "t_uint40", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:50" + }, + { + "label": "disputingTimeLimit", + "offset": 0, + "slot": "26", + "type": "t_uint40", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:51" + }, + { + "label": "penaltyDuration", + "offset": 5, + "slot": "26", + "type": "t_uint40", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:52" + }, + { + "label": "unstakeDelayTime", + "offset": 10, + "slot": "26", + "type": "t_uint40", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:53" + }, + { + "label": "minerRequirement", + "offset": 15, + "slot": "26", + "type": "t_uint8", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:54" + }, + { + "label": "maximumTier", + "offset": 16, + "slot": "26", + "type": "t_uint16", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:56" + }, + { + "label": "disqualificationPercentage", + "offset": 18, + "slot": "26", + "type": "t_uint16", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:57" + }, + { + "label": "currentEpoch", + "offset": 20, + "slot": "26", + "type": "t_uint40", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:60" + }, + { + "label": "blocksPerEpoch", + "offset": 0, + "slot": "27", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:61" + }, + { + "label": "lastBlock", + "offset": 0, + "slot": "28", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:62" + }, + { + "label": "rewardPerEpochBasedOnPerf", + "offset": 0, + "slot": "29", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:63" + }, + { + "label": "rewardPerEpoch", + "offset": 0, + "slot": "30", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:64" + }, + { + "label": "__gap", + "offset": 0, + "slot": "31", + "type": "t_array(t_uint256)100_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:66" + }, + { + "label": "_initialized", + "offset": 0, + "slot": "131", + "type": "t_uint8", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:63", + "retypedFrom": "bool" + }, + { + "label": "_initializing", + "offset": 1, + "slot": "131", + "type": "t_bool", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:68" + }, + { + "label": "__gap", + "offset": 0, + "slot": "132", + "type": "t_array(t_uint256)50_storage", + "contract": "ContextUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:40" + }, + { + "label": "_owner", + "offset": 0, + "slot": "182", + "type": "t_address", + "contract": "OwnableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:22" + }, + { + "label": "__gap", + "offset": 0, + "slot": "183", + "type": "t_array(t_uint256)49_storage", + "contract": "OwnableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:94" + }, + { + "label": "_paused", + "offset": 0, + "slot": "232", + "type": "t_bool", + "contract": "PausableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol:29" + }, + { + "label": "__gap", + "offset": 0, + "slot": "233", + "type": "t_array(t_uint256)49_storage", + "contract": "PausableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol:116" + }, + { + "label": "_status", + "offset": 0, + "slot": "282", + "type": "t_uint256", + "contract": "ReentrancyGuardUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol:38" + }, + { + "label": "__gap", + "offset": 0, + "slot": "283", + "type": "t_array(t_uint256)49_storage", + "contract": "ReentrancyGuardUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol:88" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_address)dyn_storage": { + "label": "address[]", + "numberOfBytes": "32" + }, + "t_array(t_uint256)100_storage": { + "label": "uint256[100]", + "numberOfBytes": "3200" + }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_array(t_uint256)dyn_storage": { + "label": "uint256[]", + "numberOfBytes": "32" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes_storage": { + "label": "bytes", + "numberOfBytes": "32" + }, + "t_enum(InferenceStatus)3587": { + "label": "enum IWorkerHub.InferenceStatus", + "members": [ + "Nil", + "Solving", + "Disputing", + "Solved", + "Killed" + ], + "numberOfBytes": "1" + }, + "t_mapping(t_address,t_mapping(t_uint256,t_bool))": { + "label": "mapping(address => mapping(uint256 => bool))", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_mapping(t_uint256,t_uint256))": { + "label": "mapping(address => mapping(uint256 => uint256))", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(AddressSet)3964_storage)": { + "label": "mapping(address => struct Set.AddressSet)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Model)3601_storage)": { + "label": "mapping(address => struct IWorkerHub.Model)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Uint256Set)4134_storage)": { + "label": "mapping(address => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(UnstakeRequest)3699_storage)": { + "label": "mapping(address => struct IWorkerHub.UnstakeRequest)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Worker)3614_storage)": { + "label": "mapping(address => struct IWorkerHub.Worker)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_uint256)": { + "label": "mapping(address => uint256)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_bool)": { + "label": "mapping(uint256 => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Assignment)3638_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Assignment)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Inference)3674_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Inference)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(MinerEpochState)3596_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.MinerEpochState)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Uint256Set)4134_storage)": { + "label": "mapping(uint256 => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_uint256)": { + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32" + }, + "t_struct(AddressSet)3964_storage": { + "label": "struct Set.AddressSet", + "members": [ + { + "label": "values", + "type": "t_array(t_address)dyn_storage", + "offset": 0, + "slot": "0" + }, + { + "label": "positions", + "type": "t_mapping(t_address,t_uint256)", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_struct(Assignment)3638_storage": { + "label": "struct IWorkerHub.Assignment", + "members": [ + { + "label": "inferenceId", + "type": "t_uint256", + "offset": 0, + "slot": "0" + }, + { + "label": "output", + "type": "t_bytes_storage", + "offset": 0, + "slot": "1" + }, + { + "label": "worker", + "type": "t_address", + "offset": 0, + "slot": "2" + }, + { + "label": "disapprovalCount", + "type": "t_uint8", + "offset": 20, + "slot": "2" + } + ], + "numberOfBytes": "96" + }, + "t_struct(Inference)3674_storage": { + "label": "struct IWorkerHub.Inference", + "members": [ + { + "label": "assignments", + "type": "t_array(t_uint256)dyn_storage", + "offset": 0, + "slot": "0" + }, + { + "label": "input", + "type": "t_bytes_storage", + "offset": 0, + "slot": "1" + }, + { + "label": "value", + "type": "t_uint256", + "offset": 0, + "slot": "2" + }, + { + "label": "disputingAddress", + "type": "t_address", + "offset": 0, + "slot": "3" + }, + { + "label": "modelAddress", + "type": "t_address", + "offset": 0, + "slot": "4" + }, + { + "label": "expiredAt", + "type": "t_uint40", + "offset": 20, + "slot": "4" + }, + { + "label": "firstSubmissionId", + "type": "t_uint8", + "offset": 25, + "slot": "4" + }, + { + "label": "status", + "type": "t_enum(InferenceStatus)3587", + "offset": 26, + "slot": "4" + }, + { + "label": "creator", + "type": "t_address", + "offset": 0, + "slot": "5" + } + ], + "numberOfBytes": "192" + }, + "t_struct(MinerEpochState)3596_storage": { + "label": "struct IWorkerHub.MinerEpochState", + "members": [ + { + "label": "perfReward", + "type": "t_uint256", + "offset": 0, + "slot": "0" + }, + { + "label": "epochReward", + "type": "t_uint256", + "offset": 0, + "slot": "1" + }, + { + "label": "totalTaskCompleted", + "type": "t_uint256", + "offset": 0, + "slot": "2" + }, + { + "label": "totalMiner", + "type": "t_uint256", + "offset": 0, + "slot": "3" + } + ], + "numberOfBytes": "128" + }, + "t_struct(Model)3601_storage": { + "label": "struct IWorkerHub.Model", + "members": [ + { + "label": "minimumFee", + "type": "t_uint256", + "offset": 0, + "slot": "0" + }, + { + "label": "tier", + "type": "t_uint32", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_struct(Randomizer)3920_storage": { + "label": "struct Random.Randomizer", + "members": [ + { + "label": "nonce", + "type": "t_uint256", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(Uint256Set)4134_storage": { + "label": "struct Set.Uint256Set", + "members": [ + { + "label": "values", + "type": "t_array(t_uint256)dyn_storage", + "offset": 0, + "slot": "0" + }, + { + "label": "positions", + "type": "t_mapping(t_uint256,t_uint256)", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_struct(UnstakeRequest)3699_storage": { + "label": "struct IWorkerHub.UnstakeRequest", + "members": [ + { + "label": "stake", + "type": "t_uint256", + "offset": 0, + "slot": "0" + }, + { + "label": "unlockAt", + "type": "t_uint40", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_struct(Worker)3614_storage": { + "label": "struct IWorkerHub.Worker", + "members": [ + { + "label": "stake", + "type": "t_uint256", + "offset": 0, + "slot": "0" + }, + { + "label": "commitment", + "type": "t_uint256", + "offset": 0, + "slot": "1" + }, + { + "label": "modelAddress", + "type": "t_address", + "offset": 0, + "slot": "2" + }, + { + "label": "lastClaimedEpoch", + "type": "t_uint40", + "offset": 20, + "slot": "2" + }, + { + "label": "activeTime", + "type": "t_uint40", + "offset": 25, + "slot": "2" + }, + { + "label": "tier", + "type": "t_uint16", + "offset": 30, + "slot": "2" + } + ], + "numberOfBytes": "96" + }, + "t_uint16": { + "label": "uint16", + "numberOfBytes": "2" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint32": { + "label": "uint32", + "numberOfBytes": "4" + }, + "t_uint40": { + "label": "uint40", + "numberOfBytes": "5" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + }, + "namespaces": {} + } + }, + "4276c9135e4bac8599d720824032a256f5412cc731e446fee410bbb02bee88db": { + "address": "0x4d9b308AB88B0ADB410849977db062A4404AC6f5", + "txHash": "0xbd560c694dd42f74f5652248cfcbdc14a81c595dea9fe4c0d2b50f524b6152e1", + "layout": { + "solcVersion": "0.8.19", + "storage": [ + { + "label": "randomizer", + "offset": 0, + "slot": "0", + "type": "t_struct(Randomizer)3921_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:10" + }, + { + "label": "models", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_struct(Model)3602_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:12" + }, + { + "label": "miners", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_address,t_struct(Worker)3615_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:13" + }, + { + "label": "validators", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_address,t_struct(Worker)3615_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:14" + }, + { + "label": "minerAddressesByModel", + "offset": 0, + "slot": "4", + "type": "t_mapping(t_address,t_struct(AddressSet)3965_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:16" + }, + { + "label": "validatorAddressesByModel", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_address,t_struct(AddressSet)3965_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:17" + }, + { + "label": "modelAddresses", + "offset": 0, + "slot": "6", + "type": "t_struct(AddressSet)3965_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:19" + }, + { + "label": "minerAddresses", + "offset": 0, + "slot": "8", + "type": "t_struct(AddressSet)3965_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:20" + }, + { + "label": "validatorAddresses", + "offset": 0, + "slot": "10", + "type": "t_struct(AddressSet)3965_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:21" + }, + { + "label": "minerUnstakeRequests", + "offset": 0, + "slot": "12", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3700_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:23" + }, + { + "label": "validatorUnstakeRequests", + "offset": 0, + "slot": "13", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3700_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:24" + }, + { + "label": "inferenceNumber", + "offset": 0, + "slot": "14", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:26" + }, + { + "label": "inferences", + "offset": 0, + "slot": "15", + "type": "t_mapping(t_uint256,t_struct(Inference)3675_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:27" + }, + { + "label": "assignmentNumber", + "offset": 0, + "slot": "16", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:29" + }, + { + "label": "assignments", + "offset": 0, + "slot": "17", + "type": "t_mapping(t_uint256,t_struct(Assignment)3639_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:30" + }, + { + "label": "assignmentsByMiner", + "offset": 0, + "slot": "18", + "type": "t_mapping(t_address,t_struct(Uint256Set)4135_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:31" + }, + { + "label": "assignmentsByInference", + "offset": 0, + "slot": "19", + "type": "t_mapping(t_uint256,t_struct(Uint256Set)4135_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:32" + }, + { + "label": "validatorDisputed", + "offset": 0, + "slot": "20", + "type": "t_mapping(t_address,t_mapping(t_uint256,t_bool))", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:34" + }, + { + "label": "rewardInEpoch", + "offset": 0, + "slot": "21", + "type": "t_mapping(t_uint256,t_struct(MinerEpochState)3597_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:38" + }, + { + "label": "minerTaskCompleted", + "offset": 0, + "slot": "22", + "type": "t_mapping(t_address,t_mapping(t_uint256,t_uint256))", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:43" + }, + { + "label": "minerMinimumStake", + "offset": 0, + "slot": "23", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:45" + }, + { + "label": "validatorMinimumStake", + "offset": 0, + "slot": "24", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:46" + }, + { + "label": "treasury", + "offset": 0, + "slot": "25", + "type": "t_address", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:47" + }, + { + "label": "feePercentage", + "offset": 20, + "slot": "25", + "type": "t_uint16", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:48" + }, + { + "label": "miningTimeLimit", + "offset": 22, + "slot": "25", + "type": "t_uint40", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:49" + }, + { + "label": "validatingTimeLimit", + "offset": 27, + "slot": "25", + "type": "t_uint40", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:50" + }, + { + "label": "disputingTimeLimit", + "offset": 0, + "slot": "26", + "type": "t_uint40", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:51" + }, + { + "label": "penaltyDuration", + "offset": 5, + "slot": "26", + "type": "t_uint40", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:52" + }, + { + "label": "unstakeDelayTime", + "offset": 10, + "slot": "26", + "type": "t_uint40", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:53" + }, + { + "label": "minerRequirement", + "offset": 15, + "slot": "26", + "type": "t_uint8", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:54" + }, + { + "label": "maximumTier", + "offset": 16, + "slot": "26", + "type": "t_uint16", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:56" + }, + { + "label": "disqualificationPercentage", + "offset": 18, + "slot": "26", + "type": "t_uint16", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:57" + }, + { + "label": "currentEpoch", + "offset": 20, + "slot": "26", + "type": "t_uint40", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:60" + }, + { + "label": "blocksPerEpoch", + "offset": 0, + "slot": "27", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:61" + }, + { + "label": "lastBlock", + "offset": 0, + "slot": "28", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:62" + }, + { + "label": "rewardPerEpochBasedOnPerf", + "offset": 0, + "slot": "29", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:63" + }, + { + "label": "rewardPerEpoch", + "offset": 0, + "slot": "30", + "type": "t_uint256", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:64" + }, + { + "label": "__gap", + "offset": 0, + "slot": "31", + "type": "t_array(t_uint256)100_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:66" + }, + { + "label": "_initialized", + "offset": 0, + "slot": "131", + "type": "t_uint8", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:63", + "retypedFrom": "bool" + }, + { + "label": "_initializing", + "offset": 1, + "slot": "131", + "type": "t_bool", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:68" + }, + { + "label": "__gap", + "offset": 0, + "slot": "132", + "type": "t_array(t_uint256)50_storage", + "contract": "ContextUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:40" + }, + { + "label": "_owner", + "offset": 0, + "slot": "182", + "type": "t_address", + "contract": "OwnableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:22" + }, + { + "label": "__gap", + "offset": 0, + "slot": "183", + "type": "t_array(t_uint256)49_storage", + "contract": "OwnableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:94" + }, + { + "label": "_paused", + "offset": 0, + "slot": "232", + "type": "t_bool", + "contract": "PausableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol:29" + }, + { + "label": "__gap", + "offset": 0, + "slot": "233", + "type": "t_array(t_uint256)49_storage", + "contract": "PausableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol:116" + }, + { + "label": "_status", + "offset": 0, + "slot": "282", + "type": "t_uint256", + "contract": "ReentrancyGuardUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol:38" + }, + { + "label": "__gap", + "offset": 0, + "slot": "283", + "type": "t_array(t_uint256)49_storage", + "contract": "ReentrancyGuardUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol:88" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_address)dyn_storage": { + "label": "address[]", + "numberOfBytes": "32" + }, + "t_array(t_uint256)100_storage": { + "label": "uint256[100]", + "numberOfBytes": "3200" + }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_array(t_uint256)dyn_storage": { + "label": "uint256[]", + "numberOfBytes": "32" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes_storage": { + "label": "bytes", + "numberOfBytes": "32" + }, + "t_enum(InferenceStatus)3588": { + "label": "enum IWorkerHub.InferenceStatus", + "members": [ + "Nil", + "Solving", + "Disputing", + "Solved", + "Killed" + ], + "numberOfBytes": "1" + }, + "t_mapping(t_address,t_mapping(t_uint256,t_bool))": { + "label": "mapping(address => mapping(uint256 => bool))", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_mapping(t_uint256,t_uint256))": { + "label": "mapping(address => mapping(uint256 => uint256))", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(AddressSet)3965_storage)": { + "label": "mapping(address => struct Set.AddressSet)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Model)3602_storage)": { + "label": "mapping(address => struct IWorkerHub.Model)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Uint256Set)4135_storage)": { + "label": "mapping(address => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(UnstakeRequest)3700_storage)": { + "label": "mapping(address => struct IWorkerHub.UnstakeRequest)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Worker)3615_storage)": { + "label": "mapping(address => struct IWorkerHub.Worker)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_uint256)": { + "label": "mapping(address => uint256)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_bool)": { + "label": "mapping(uint256 => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Assignment)3639_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Assignment)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Inference)3675_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Inference)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(MinerEpochState)3597_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.MinerEpochState)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Uint256Set)4135_storage)": { + "label": "mapping(uint256 => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_uint256)": { + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32" + }, + "t_struct(AddressSet)3965_storage": { + "label": "struct Set.AddressSet", + "members": [ + { + "label": "values", + "type": "t_array(t_address)dyn_storage", + "offset": 0, + "slot": "0" + }, + { + "label": "positions", + "type": "t_mapping(t_address,t_uint256)", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_struct(Assignment)3639_storage": { + "label": "struct IWorkerHub.Assignment", + "members": [ + { + "label": "inferenceId", + "type": "t_uint256", + "offset": 0, + "slot": "0" + }, + { + "label": "output", + "type": "t_bytes_storage", + "offset": 0, + "slot": "1" + }, + { + "label": "worker", + "type": "t_address", + "offset": 0, + "slot": "2" + }, + { + "label": "disapprovalCount", + "type": "t_uint8", + "offset": 20, + "slot": "2" + } + ], + "numberOfBytes": "96" + }, + "t_struct(Inference)3675_storage": { + "label": "struct IWorkerHub.Inference", + "members": [ + { + "label": "assignments", + "type": "t_array(t_uint256)dyn_storage", + "offset": 0, + "slot": "0" + }, + { + "label": "input", + "type": "t_bytes_storage", + "offset": 0, + "slot": "1" + }, + { + "label": "value", + "type": "t_uint256", + "offset": 0, + "slot": "2" + }, + { + "label": "disputingAddress", + "type": "t_address", + "offset": 0, + "slot": "3" + }, + { + "label": "modelAddress", + "type": "t_address", + "offset": 0, + "slot": "4" + }, + { + "label": "expiredAt", + "type": "t_uint40", + "offset": 20, + "slot": "4" + }, + { + "label": "firstSubmissionId", + "type": "t_uint8", + "offset": 25, + "slot": "4" + }, + { + "label": "status", + "type": "t_enum(InferenceStatus)3588", + "offset": 26, + "slot": "4" + }, + { + "label": "creator", + "type": "t_address", + "offset": 0, + "slot": "5" + } + ], + "numberOfBytes": "192" + }, + "t_struct(MinerEpochState)3597_storage": { + "label": "struct IWorkerHub.MinerEpochState", + "members": [ + { + "label": "perfReward", + "type": "t_uint256", + "offset": 0, + "slot": "0" + }, + { + "label": "epochReward", + "type": "t_uint256", + "offset": 0, + "slot": "1" + }, + { + "label": "totalTaskCompleted", + "type": "t_uint256", + "offset": 0, + "slot": "2" + }, + { + "label": "totalMiner", + "type": "t_uint256", + "offset": 0, + "slot": "3" + } + ], + "numberOfBytes": "128" + }, + "t_struct(Model)3602_storage": { + "label": "struct IWorkerHub.Model", + "members": [ + { + "label": "minimumFee", + "type": "t_uint256", + "offset": 0, + "slot": "0" + }, + { + "label": "tier", + "type": "t_uint32", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_struct(Randomizer)3921_storage": { + "label": "struct Random.Randomizer", + "members": [ + { + "label": "nonce", + "type": "t_uint256", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(Uint256Set)4135_storage": { + "label": "struct Set.Uint256Set", + "members": [ + { + "label": "values", + "type": "t_array(t_uint256)dyn_storage", + "offset": 0, + "slot": "0" + }, + { + "label": "positions", + "type": "t_mapping(t_uint256,t_uint256)", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_struct(UnstakeRequest)3700_storage": { + "label": "struct IWorkerHub.UnstakeRequest", + "members": [ + { + "label": "stake", + "type": "t_uint256", + "offset": 0, + "slot": "0" + }, + { + "label": "unlockAt", + "type": "t_uint40", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_struct(Worker)3615_storage": { + "label": "struct IWorkerHub.Worker", + "members": [ + { + "label": "stake", + "type": "t_uint256", + "offset": 0, + "slot": "0" + }, + { + "label": "commitment", + "type": "t_uint256", + "offset": 0, + "slot": "1" + }, + { + "label": "modelAddress", + "type": "t_address", + "offset": 0, + "slot": "2" + }, + { + "label": "lastClaimedEpoch", + "type": "t_uint40", + "offset": 20, + "slot": "2" + }, + { + "label": "activeTime", + "type": "t_uint40", + "offset": 25, + "slot": "2" + }, + { + "label": "tier", + "type": "t_uint16", + "offset": 30, + "slot": "2" + } + ], + "numberOfBytes": "96" + }, + "t_uint16": { + "label": "uint16", + "numberOfBytes": "2" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint32": { + "label": "uint32", + "numberOfBytes": "4" + }, + "t_uint40": { + "label": "uint40", + "numberOfBytes": "5" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + }, + "namespaces": {} + } } } } diff --git a/contracts/WorkerHub.sol b/contracts/WorkerHub.sol index 0f295f3..9bc41dd 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -68,6 +68,11 @@ ReentrancyGuardUpgradeable { _unpause(); } + function updateMiningTimeLimit(uint40 _miningTimeLimit) external onlyOwner { + miningTimeLimit = _miningTimeLimit; + emit MiningTimeLimitUpdate(_miningTimeLimit); + } + function getModelAddresses() external view returns (address[] memory) { return modelAddresses.values; } @@ -926,14 +931,14 @@ ReentrancyGuardUpgradeable { } function setNewRewardInEpochBasedOnPerf(uint256 _newRewardAmount) public virtual onlyOwner { - _updateEpoch(); + // _updateEpoch(); emit RewardPerEpochBasedOnPerf(rewardPerEpoch, _newRewardAmount); rewardPerEpochBasedOnPerf = _newRewardAmount; } function setBlocksPerEpoch(uint256 _blocks) public virtual onlyOwner { - _updateEpoch(); + // _updateEpoch(); if (_blocks == 0) revert InvalidBlockValue(); emit BlocksPerEpoch(blocksPerEpoch, _blocks); diff --git a/contracts/interfaces/IWorkerHub.sol b/contracts/interfaces/IWorkerHub.sol index 5f36a60..131beae 100644 --- a/contracts/interfaces/IWorkerHub.sol +++ b/contracts/interfaces/IWorkerHub.sol @@ -101,6 +101,8 @@ interface IWorkerHub is IInferable { uint40 unlockAt; } + event MiningTimeLimitUpdate(uint40 newValue); + event ModelRegistration( address indexed model, uint16 indexed tier,