From 233f7aef9705744c61d1efb1c7be5967a460099f Mon Sep 17 00:00:00 2001 From: kochou-nbc Date: Mon, 6 May 2024 09:29:23 +0700 Subject: [PATCH 01/82] upgrade worker hub (undone) --- .gitignore | 14 +- contracts/HybridModel.sol | 44 +- contracts/ModelCollection.sol | 146 ++++++ contracts/ModelReg.sol | 8 +- contracts/WorkerHub.sol | 456 +++++------------- contracts/interfaces/IHybridModel.sol | 7 +- contracts/interfaces/IInferable.sol | 6 + contracts/interfaces/IModelCollection.sol | 38 ++ contracts/interfaces/IWorkerHub.sol | 160 +++--- contracts/lib/TransferHelper.sol | 69 +++ contracts/lib/heap/Heap.sol | 264 ++++++++++ contracts/lib/heap/IHeapComparator.sol | 8 + contracts/storages/HybridModelStorage.sol | 15 + contracts/storages/ModelCollectionStorage.sol | 14 + contracts/storages/WorkerHubStorage.sol | 43 ++ 15 files changed, 815 insertions(+), 477 deletions(-) create mode 100644 contracts/ModelCollection.sol create mode 100644 contracts/interfaces/IInferable.sol create mode 100644 contracts/interfaces/IModelCollection.sol create mode 100644 contracts/lib/TransferHelper.sol create mode 100644 contracts/lib/heap/Heap.sol create mode 100644 contracts/lib/heap/IHeapComparator.sol create mode 100644 contracts/storages/HybridModelStorage.sol create mode 100644 contracts/storages/ModelCollectionStorage.sol create mode 100644 contracts/storages/WorkerHubStorage.sol diff --git a/.gitignore b/.gitignore index 67c873d..9a35347 100644 --- a/.gitignore +++ b/.gitignore @@ -12,19 +12,7 @@ deployments test-results out.log -# Exclude all artifact except EternalAI and MelodyRNN -artifacts/* -!artifacts/contracts -artifacts/contracts/* -!artifacts/contracts/ImageClassifier.sol -artifacts/contracts/ImageClassifier.sol/* -!artifacts/contracts/ImageClassifier.sol/ImageClassifier.json -!artifacts/contracts/EternalAI.sol -artifacts/contracts/EternalAI.sol/* -!artifacts/contracts/EternalAI.sol/EternalAI.json -!artifacts/contracts/MelodyRNN.sol -artifacts/contracts/MelodyRNN.sol/* -!artifacts/contracts/MelodyRNN.sol/MelodyRNN.json +artifacts .DS_Store _models diff --git a/contracts/HybridModel.sol b/contracts/HybridModel.sol index 98b0d05..2fa380a 100644 --- a/contracts/HybridModel.sol +++ b/contracts/HybridModel.sol @@ -6,31 +6,24 @@ import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/Own import {PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol"; import {ReentrancyGuardUpgradeable} from "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol"; -import {IWorkerHub} from "./interfaces/IWorkerHub.sol"; +import {IInferable} from "./interfaces/IInferable.sol"; -abstract contract HybridModelStorage is IHybridModel { - uint256 public identifier; - uint256 public inferenceCost; - - string public name; - string public url; - - address public workerHub; - - uint256[50] private __gap; -} +import {HybridModelStorage} from "./storages/HybridModelStorage.sol"; contract HybridModel is HybridModelStorage, OwnableUpgradeable, PausableUpgradeable, ReentrancyGuardUpgradeable { + string constant private VERSION = "v0.0.1"; + + receive() external payable {} + function initialize( address _workerHub, uint256 _identifier, string calldata _name, - string calldata _url, - uint256 _inferenceCost + string calldata _metadata ) external initializer { __Ownable_init(); __Pausable_init(); @@ -39,12 +32,11 @@ ReentrancyGuardUpgradeable { workerHub = _workerHub; identifier = _identifier; name = _name; - url = _url; - inferenceCost = _inferenceCost; + metadata = _metadata; } function version() external pure returns (string memory) { - return "v0.0.1"; + return VERSION; } function pause() external onlyOwner whenNotPaused { @@ -70,15 +62,9 @@ ReentrancyGuardUpgradeable { emit NameUpdate(_name); } - function updateUrl(string calldata _url) external onlyOwner { - url = _url; - emit UrlUpdate(_url); - } - - function updateInferenceCost(uint256 _inferenceCost) external onlyOwner { - inferenceCost = _inferenceCost; - - emit InferenceCostUpdate(_inferenceCost); + function updateMetadata(string calldata _metadata) external onlyOwner { + metadata = _metadata; + emit MetadataUpdate(_metadata); } function setModelId(uint256 _modelId) external { @@ -87,9 +73,7 @@ ReentrancyGuardUpgradeable { emit IdentifierUpdate(_modelId); } - function infer(bytes calldata _data) external payable whenNotPaused nonReentrant returns (uint256) { - if (msg.value < inferenceCost) revert InsufficientFunds(); - - return IWorkerHub(workerHub).infer{value: msg.value}(_data, identifier, msg.sender); + function infer(bytes calldata _input) external payable whenNotPaused nonReentrant returns (uint256) { + return IInferable(workerHub).infer{value: msg.value}(_input, msg.sender); } } diff --git a/contracts/ModelCollection.sol b/contracts/ModelCollection.sol new file mode 100644 index 0000000..f5fecd5 --- /dev/null +++ b/contracts/ModelCollection.sol @@ -0,0 +1,146 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.0; + +import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; +import {IERC165Upgradeable} from "@openzeppelin/contracts-upgradeable/interfaces/IERC165Upgradeable.sol"; +import {IERC2981Upgradeable} from "@openzeppelin/contracts-upgradeable/interfaces/IERC2981Upgradeable.sol"; +import {ReentrancyGuardUpgradeable} from "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol"; +import {ERC721Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol"; +import {ERC721EnumerableUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721EnumerableUpgradeable.sol"; +import {ERC721PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721PausableUpgradeable.sol"; +import {ERC721URIStorageUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721URIStorageUpgradeable.sol"; +import {IERC721MetadataUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/IERC721MetadataUpgradeable.sol"; + +import {IModel} from "./interfaces/IModel.sol"; + +import {ModelCollectionStorage} from "./storages/ModelCollectionStorage.sol"; + +contract ModelCollection is +ModelCollectionStorage, +ERC721EnumerableUpgradeable, +ERC721PausableUpgradeable, +ERC721URIStorageUpgradeable, +OwnableUpgradeable { + string constant private VERSION = "v0.0.1"; + uint256 constant private PORTION_DENOMINATOR = 10000; + + receive() external payable {} + + function initialize( + string calldata _name, + string calldata _symbol, + uint256 _mintPrice, + address _royaltyReceiver, + uint16 _royaltyPortion, + uint256 _nextModelId + ) external initializer { + __ERC721_init("Models", "MDL"); + __ERC721Pausable_init(); + __Ownable_init(); + + mintPrice = _mintPrice; + royaltyReceiver = _royaltyReceiver; + royaltyPortion = _royaltyPortion; + nextModelId = _nextModelId; + } + + function version() external pure returns (string memory) { + return VERSION; + } + + function pause() external onlyOwner whenNotPaused { + _pause(); + } + + function unpause() external onlyOwner whenPaused { + _unpause(); + } + + function updateMintPrice(uint256 _mintPrice) external onlyOwner { + mintPrice = _mintPrice; + emit MintPriceUpdate(_mintPrice); + } + + function updateRoyaltyReceiver(address _royaltyReceiver) external onlyOwner { + royaltyReceiver = _royaltyReceiver; + emit RoyaltyReceiverUpdate(_royaltyReceiver); + } + + function updateRoyaltyPortion(uint16 _royaltyPortion) external onlyOwner { + royaltyPortion = _royaltyPortion; + emit RoyaltyPortionUpdate(_royaltyPortion); + } + + function mint(address _to, string calldata _uri, address _model) external payable onlyOwner returns (uint256) { + if (msg.value < mintPrice) revert InsufficientFunds(); + + while (models[nextModelId] != address(0)) { + nextModelId++; + } + uint256 tokenId = nextModelId++; + + _safeMint(_to, tokenId); + _setTokenURI(tokenId, _uri); + models[tokenId] = _model; + IModel(_model).setModelId(tokenId); + + emit NewToken(tokenId, _uri, _model, msg.sender); + + return tokenId; + } + + function updateTokenURI(uint256 _tokenId, string calldata _uri) external onlyOwner { + _setTokenURI(_tokenId, _uri); + emit TokenURIUpdate(_tokenId, _uri); + } + + function updateTokenModel(uint256 _tokenId, address _model) external onlyOwner { + models[_tokenId] = _model; + emit TokenModelUpdate(_tokenId, _model); + } + + function modelAddressOf(uint256 _tokenId) external view returns (address) { + return models[_tokenId]; + } + + function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view returns (address, uint256) { + return (royaltyReceiver, _salePrice * royaltyPortion / PORTION_DENOMINATOR); + } + + function tokenURI(uint256 _tokenId) + public view override ( + ERC721Upgradeable, + ERC721URIStorageUpgradeable, + IERC721MetadataUpgradeable + ) returns (string memory) { + return super.tokenURI(_tokenId); + } + + function supportsInterface(bytes4 _interfaceId) + public view override ( + ERC721Upgradeable, + ERC721EnumerableUpgradeable, + ERC721URIStorageUpgradeable, + IERC165Upgradeable + ) returns (bool) { + return _interfaceId == type(IERC2981Upgradeable).interfaceId || super.supportsInterface(_interfaceId); + } + + function _beforeTokenTransfer( + address _from, + address _to, + uint256 _tokenId, + uint256 _batchSize + ) internal override ( + ERC721Upgradeable, + ERC721EnumerableUpgradeable, + ERC721PausableUpgradeable + ) { + super._beforeTokenTransfer(_from, _to, _tokenId, _batchSize); + } + + function _burn(uint256 _tokenId) + internal override (ERC721Upgradeable, ERC721URIStorageUpgradeable) { + super._burn(_tokenId); + } +} diff --git a/contracts/ModelReg.sol b/contracts/ModelReg.sol index e50b00a..f8c0a93 100644 --- a/contracts/ModelReg.sol +++ b/contracts/ModelReg.sol @@ -23,7 +23,7 @@ contract ModelRegStorage is IModelReg { uint256[50] private __gap; } -contract ModelReg is +contract ModelReg is ModelRegStorage, Initializable, ERC721Upgradeable, @@ -75,11 +75,11 @@ IERC2981Upgradeable { __ERC721_init("Models", "MDL"); __ERC721Enumerable_init(); __ERC721URIStorage_init(); - + mintPrice = _mintPrice; evalPrice = _evalPrice; royaltyReceiver = _royaltyReceiver; - nextModelId = 1; + nextModelId = 1; } function afterUpgrade(uint256 _mintPrice, uint256 _evalPrice, address _royaltyReceiver, uint256 _nextModelId) public { @@ -107,7 +107,7 @@ IERC2981Upgradeable { IModel(_modelAddr).setModelId(modelId); } - /* @dev EIP2981 royalties implementation. + /* @dev EIP2981 royalties implementation. // EIP2981 standard royalties return. */ function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view virtual override diff --git a/contracts/WorkerHub.sol b/contracts/WorkerHub.sol index adc4b38..540a99d 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -4,60 +4,58 @@ 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 {IERC721Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol"; -import {IHybridModel} from "./interfaces/IHybridModel.sol"; -import {IWorkerHub} from "./interfaces/IWorkerHub.sol"; +import {Heap} from "./lib/heap/Heap.sol"; +import {TransferHelper} from "./lib/TransferHelper.sol"; -abstract contract WorkerHubStorage is IWorkerHub { - mapping(address => bool) public isModel; - mapping(address => Worker) internal workers; - mapping(uint256 => Inference) internal inferences; - mapping(uint256 => UnstakeRequest) internal unstakeRequests; - - uint256 public inferenceNumber; - uint256 public unstakeRequestNumber; - uint256 public minimumStake; - - uint8 public feePercentage; - uint8 public royaltyPercentage; - uint40 public stakeLockingDuration; - - address public treasury; - address public collection; - - uint256[50] private __gap; -} +import {WorkerHubStorage} from "./storages/WorkerHubStorage.sol"; contract WorkerHub is WorkerHubStorage, OwnableUpgradeable, PausableUpgradeable, ReentrancyGuardUpgradeable { + using Heap for Heap.AddressHeap; + using Heap for Heap.Uint256Heap; + + string constant private VERSION = "v0.0.1"; + + receive() external payable {} + function initialize( - address _treasury, - address _collection, - uint8 _feePercentage, - uint8 _royaltyPercentage, - uint256 _minimumStake, - uint40 _stakeLockingDuration + uint256 _minterMinimumStake, + uint8 _minterRequirement, + uint40 _mintingTimeLimit, + uint256 _validatorMinimumStake, + uint8 _validatorRequirement, + uint40 _validatingTimeLimit, + uint16 _maximumTier ) external initializer { __Ownable_init(); __Pausable_init(); __ReentrancyGuard_init(); - if (_feePercentage + _royaltyPercentage > 100) revert ConflictedPercentage(); + minterMinimumStake = _minterMinimumStake; + minterRequirement = _minterRequirement; + mintingTimeLimit = _mintingTimeLimit; + mintingAssignmentsFront = 1; + + validatorMinimumStake = _validatorMinimumStake; + validatorRequirement = _validatorRequirement; + validatingTimeLimit = _validatingTimeLimit; + validatingAssignmentsFront = 1; - treasury = _treasury; - collection = _collection; - feePercentage = _feePercentage; - royaltyPercentage = _royaltyPercentage; - minimumStake = _minimumStake; - stakeLockingDuration = _stakeLockingDuration; + maximumTier = _maximumTier; + for (uint256 i = 0; i < _maximumTier; ++i) { + minterQueues[i].identifier = int64(uint64(i)); + validatorQueues[i].identifier = -int64(uint64(i)); + } + mintingTaskQueue.identifier = 1; + validatingTaskQueue.identifier = -1; } function version() external pure returns (string memory) { - return "v0.0.1"; + return VERSION; } function pause() external onlyOwner whenNotPaused { @@ -68,352 +66,134 @@ ReentrancyGuardUpgradeable { _unpause(); } - function updateTreasury(address _treasury) external onlyOwner { - treasury = _treasury; - emit TreasuryUpdate(_treasury); - } - - function updateCollection(address _collection) external onlyOwner { - collection = _collection; - emit CollectionUpdate(_collection); - } + function registerMinter(uint16 tier) external payable { + if (tier == 0 || tier > maximumTier) revert InvalidTier(); + if (msg.value < minterMinimumStake) revert StakeTooLow(); - function updateFeePercentage(uint8 _feePercentage) external onlyOwner { - feePercentage = _feePercentage; - emit FeePercentageUpdate(_feePercentage); - } + Worker storage minter = minters[msg.sender]; + if (minter.tier != 0) revert AlreadyRegistered(); - function updateRoyaltyPercentage(uint8 _royaltyPercentage) external onlyOwner { - royaltyPercentage = _royaltyPercentage; - emit RoyaltyPercentageUpdate(_royaltyPercentage); - } + minter.stake = msg.value; + minter.tier = tier; - function updateMinimumStake(uint256 _minimumStake) external onlyOwner { - minimumStake = _minimumStake; - emit MinimumStakeUpdate(_minimumStake); + emit MinterRegistration(msg.sender, tier, msg.value); } - function updateStakeLockingDuration(uint40 _stakeLockingDuration) external onlyOwner { - stakeLockingDuration = _stakeLockingDuration; - emit StakeLockingDurationUpdate(_stakeLockingDuration); - } + function unregisterMinter() external nonReentrant { + Worker storage minter = minters[msg.sender]; + if (minter.tier == 0) revert NotRegistered(); + if (minter.currentTaskId != 0) revert MintingSessionNotEnded(); - function registerModel(address _model) external onlyOwner { - if (isModel[_model]) revert AlreadyRegistered(); + minter.tier = 0; - isModel[_model] = true; + TransferHelper.safeTransferNative(msg.sender, minter.stake); + minter.stake = 0; - emit ModelRegistration(_model); + emit MinterUnregistration(msg.sender); } - function unregisterModel(address _model) external onlyOwner { - if (!isModel[_model]) revert NotRegistered(); - - isModel[_model] = false; - - emit ModelUnregistration(_model); + function increaseMinterStake() external payable { + Worker storage minter = minters[msg.sender]; + if (minter.tier == 0) revert NotRegistered(); + minter.stake += msg.value; + emit MinterExtraStake(msg.sender, msg.value); } - function authorizeWorker(address _worker) external onlyOwner { - workers[_worker].isAuthorized = true; + function registerValidator(uint16 tier) external payable { + if (tier == 0 || tier > maximumTier) revert InvalidTier(); + if (msg.value < validatorMinimumStake) revert StakeTooLow(); - emit WorkerAuthorization(_worker); - } + Worker storage validator = validators[msg.sender]; + if (validator.tier != 0) revert AlreadyRegistered(); - function unauthorizeWorker(address _worker) external onlyOwner { - workers[_worker].isAuthorized = false; + validator.stake = msg.value; + validator.tier = tier; - emit WorkerUnauthorization(_worker); + emit ValidatorRegistration(msg.sender, tier, msg.value); } - function getInference(uint256 _inferenceId) external view returns (Inference memory) { - if (_inferenceId == 0 || _inferenceId > inferenceNumber) revert InvalidInferenceId(); - return inferences[_inferenceId]; - } + function unregisterValidator() external nonReentrant { + Worker storage validator = validators[msg.sender]; + if (validator.tier == 0) revert NotRegistered(); + if (validator.currentTaskId != 0) revert ValidatingSessionNotEnded(); - function getInferences() external view returns (Inference[] memory) { - Inference[] memory result = new Inference[](inferenceNumber); - for (uint256 i = 1; i <= inferenceNumber; ++i) { - result[i] = inferences[i]; - } - return result; - } + validator.tier = 0; - function getUnresolvedInferences() external view returns (UnresolvedInference[] memory) { - uint256 counter = 0; - for (uint256 i = 1; i <= inferenceNumber; ++i) { - if (!inferences[i].isResolved) { - counter++; - } - } - UnresolvedInference[] memory result = new UnresolvedInference[](counter); - counter = 0; - for (uint256 i = 1; i <= inferenceNumber; ++i) { - if (!inferences[i].isResolved) { - Inference memory inference = inferences[i]; - result[counter++] = UnresolvedInference( - i, - inference.value, - inference.data, - inference.model, - inference.creator - ); - } - } + TransferHelper.safeTransferNative(msg.sender, validator.stake); + validator.stake = 0; - return result; + emit ValidatorUnregistration(msg.sender); } - function getIndividualInferences(address _account) external view returns (Inference[] memory) { - uint256 counter = 0; - for (uint256 i = 1; i <= inferenceNumber; ++i) { - if (inferences[i].creator == _account) { - counter++; - } - } - - Inference[] memory result = new Inference[](counter); - counter = 0; - for (uint256 i = 1; i <= inferenceNumber; ++i) { - if (inferences[i].creator == _account) { - result[counter++] = inferences[i]; - } - } - - return result; + function increaseValidatorStake() external payable { + Worker storage validator = validators[msg.sender]; + if (validator.tier == 0) revert NotRegistered(); + validator.stake += msg.value; + emit ValidatorExtraStake(msg.sender, msg.value); } - function getIndividualUnresolvedInferences(address _account) external view returns (UnresolvedInference[] memory) { - uint256 counter = 0; - for (uint256 i = 1; i <= inferenceNumber; ++i) { - if (!inferences[i].isResolved && inferences[i].creator == _account) { - counter++; - } - } - - UnresolvedInference[] memory result = new UnresolvedInference[](counter); - counter = 0; - for (uint256 i = 1; i <= inferenceNumber; ++i) { - if (!inferences[i].isResolved && inferences[i].creator == _account) { - Inference memory inference = inferences[i]; - result[counter++] = UnresolvedInference( - i, - inference.value, - inference.data, - inference.model, - inference.creator - ); - } - } - - return result; + function registerModel(address _model, uint16 _tier, uint256 _minimumFee) external onlyOwner returns (uint256) { + Model storage model = models[_model]; + if (model.modelId != 0) revert AlreadyRegistered(); + uint256 modelId = ++modelNumber; + model.modelId = modelId; + model.minimumFee = _minimumFee; + model.tier = _tier; + emit ModelRegistration(_model, modelId, _tier, _minimumFee); + return modelId; } - function getModelInferences(address _model) external view returns (Inference[] memory) { - uint256 counter = 0; - for (uint256 i = 1; i <= inferenceNumber; ++i) { - if (inferences[i].model == _model) { - counter++; - } - } - - Inference[] memory result = new Inference[](counter); - counter = 0; - for (uint256 i = 1; i <= inferenceNumber; ++i) { - if (inferences[i].model == _model) { - result[counter++] = inferences[i]; - } - } - - return result; + function unregisterModel(address _model) external { + Model storage model = models[_model]; + if (model.modelId == 0) revert NotRegistered(); + model.modelId = 0; + emit ModelUnregistration(_model); } - function getModelUnresolvedInferences(address _model) external view returns (UnresolvedInference[] memory) { - uint256 counter = 0; - for (uint256 i = 1; i <= inferenceNumber; ++i) { - if (!inferences[i].isResolved && inferences[i].model == _model) { - counter++; - } - } + function infer(bytes calldata _input, address _creator) external payable returns (uint256) { + Model storage model = models[msg.sender]; + if (model.tier == 0) revert Unauthorized(); + if (msg.value < model.minimumFee) revert FeeTooLow(); + uint256 inferenceId = ++inferenceNumber; + Inference storage inference = inferences[inferenceId]; + inference.input = _input; + inference.value = msg.value; + inference.creator = _creator; + inference.modelId = model.modelId; - UnresolvedInference[] memory result = new UnresolvedInference[](counter); - counter = 0; - for (uint256 i = 1; i <= inferenceNumber; ++i) { - if (!inferences[i].isResolved && inferences[i].model == _model) { - Inference memory inference = inferences[i]; - result[counter++] = UnresolvedInference( - i, - inference.value, - inference.data, - inference.model, - inference.creator - ); - } - } + uint256 taskId = ++taskNumber; + Task storage task = tasks[taskId]; + task.inferenceId = inferenceId; + task.workerRequirement = minterRequirement; - return result; - } + emit NewInference(inferenceId, _creator, msg.value); - function getWorker(address _worker) external view returns (Worker memory) { - return workers[_worker]; - } + _processMintingTasks(); - function getUnstakeRequest(uint256 _requestId) external view returns (UnstakeRequest memory) { - return unstakeRequests[_requestId]; + return inferenceId; } - function getIndividualUnstakeRequests(address _account) external view returns (UnstakeRequest[] memory) { - uint256 counter = 0; - for (uint256 i = 1; i <= unstakeRequestNumber; ++i) { - if (unstakeRequests[i].worker == _account) { - counter++; - } - } - - UnstakeRequest[] memory result = new UnstakeRequest[](counter); - counter = 0; - for (uint256 i = 1; i <= unstakeRequestNumber; ++i) { - if (unstakeRequests[i].worker == _account) { - result[counter++] = unstakeRequests[i]; - } - } - - return result; + function compareAddress(address _a, address _b, int64 _identifier) external view returns (bool) { + return _identifier > 0 ? _compareMinter(_a, _b) : _compareValidator(_a, _b); } - function getIndividualWithdrawableUnstakeRequests(address _account) external view returns (UnstakeRequest[] memory) { - uint256 counter = 0; - for (uint256 i = 1; i <= unstakeRequestNumber; ++i) { - if (unstakeRequests[i].worker == _account - && unstakeRequests[i].unlockedAt <= block.timestamp - && !unstakeRequests[i].isWithdrawn) { - counter++; - } - } - - UnstakeRequest[] memory result = new UnstakeRequest[](counter); - counter = 0; - for (uint256 i = 1; i <= unstakeRequestNumber; ++i) { - if (unstakeRequests[i].worker == _account - && unstakeRequests[i].unlockedAt <= block.timestamp - && !unstakeRequests[i].isWithdrawn) { - result[counter++] = unstakeRequests[i]; - } - } - - return result; + function compareUint256(uint256 _a, uint256 _b, int64 _identifier) external view returns (bool) { + return _compareTask(_a, _b); } - function stake() external payable whenNotPaused { - if (!workers[msg.sender].isAuthorized) revert Unauthorized(); - - workers[msg.sender].stakedValue += msg.value; - - emit Stake(msg.sender, msg.value); + function _compareMinter(address _minter1, address _minter2) private view returns (bool) { + return minters[_minter1].commission < minters[_minter2].commission; } - function requestUnstake(uint256 _value) external whenNotPaused { - uint256 stakedValue = workers[msg.sender].stakedValue; - if (_value > stakedValue) revert InsufficientFunds(); - - unchecked { - workers[msg.sender].stakedValue = stakedValue - _value; - - uint256 requestId = ++unstakeRequestNumber; - - unstakeRequests[unstakeRequestNumber] = UnstakeRequest( - _value, - msg.sender, - uint40(block.timestamp) + stakeLockingDuration, - false - ); - - emit NewUnstakeRequest( - requestId, - msg.sender, - _value - ); - } + function _compareValidator(address _validator1, address _validator2) private view returns (bool) { + return validators[_validator1].commission < validators[_validator2].commission; } - function unstake(uint256[] calldata _requestIds) external nonReentrant whenNotPaused { - uint256 totalStake; - - unchecked { - for (uint256 i = 0; i < _requestIds.length; ++i) { - UnstakeRequest storage unstakeRequest = unstakeRequests[_requestIds[i]]; - if (unstakeRequest.worker != msg.sender) revert Unauthorized(); - if (unstakeRequest.unlockedAt > block.timestamp) revert StakeIsNotUnlockedYet(); - if (unstakeRequest.isWithdrawn) revert RequestIsAlreadyWithdrawn(); - totalStake += unstakeRequest.value; - unstakeRequest.isWithdrawn = true; - } - } - - (bool success, ) = msg.sender.call{value: totalStake}(""); - if (!success) revert FailedTransfer(); - - emit Unstake(msg.sender, _requestIds); + function _compareTask(uint256 _taskId1, uint256 _taskId2) private view returns (bool) { + return tasks[_taskId1].value > tasks[_taskId2].value; } - function infer(bytes calldata _data, uint256 _modelId, address _creator) external payable whenNotPaused returns (uint256) { - if (!isModel[msg.sender]) revert Unauthorized(); - - uint256 inferenceId = ++inferenceNumber; - inferences[inferenceId] = Inference( - msg.value, - _modelId, - _data, - '', - false, - msg.sender, - _creator, - address(0) - ); - - emit NewInference(inferenceId, _creator); - - return inferenceId; - } + function _processMintingTasks() private { - function submitResult(uint256 _inferenceId, bytes calldata _result) external nonReentrant whenNotPaused { - if (_inferenceId == 0 || _inferenceId > inferenceNumber) revert InvalidInferenceId(); - if (feePercentage + royaltyPercentage > 100) revert ConflictedPercentage(); - - Inference storage inference = inferences[_inferenceId]; - if (inference.isResolved) revert InferenceIsAlreadyResolved(); - - Worker memory worker = workers[msg.sender]; - if (!worker.isAuthorized) revert Unauthorized(); - if (worker.stakedValue < minimumStake) revert NotEnoughStake(); - - inference.result = _result; - inference.isResolved = true; - inference.worker = msg.sender; - - unchecked { - uint256 value = inference.value; - uint256 fee = value * feePercentage / 100; - uint256 reward = value - fee; - bool success; - (success, ) = treasury.call{value: fee}(""); - if (!success) revert FailedTransfer(); - - if (collection != address(0)) { - uint256 modelIdentifier = IHybridModel(inference.model).identifier(); - if (modelIdentifier != 0) { - address modelOwner = IERC721Upgradeable(collection).ownerOf(modelIdentifier); - uint256 royalty = value * royaltyPercentage / 100; - reward -= royalty; - (success, ) = modelOwner.call{value: royalty}(""); - if (!success) revert FailedTransfer(); - } - } - - (success, ) = msg.sender.call{value: reward}(""); - if (!success) revert FailedTransfer(); - - emit ResultSubmission(_inferenceId, msg.sender); - } } } diff --git a/contracts/interfaces/IHybridModel.sol b/contracts/interfaces/IHybridModel.sol index 84ee282..305b3d5 100644 --- a/contracts/interfaces/IHybridModel.sol +++ b/contracts/interfaces/IHybridModel.sol @@ -7,19 +7,16 @@ interface IHybridModel is IModel { event WorkerHubUpdate(address newAddress); event IdentifierUpdate(uint256 newValue); - event InferenceCostUpdate(uint256 newValue); event NameUpdate(string newValue); - event UrlUpdate(string newValue); + event MetadataUpdate(string newValue); - error InsufficientFunds(); error ModelIdAlreadySet(); function version() external pure returns (string memory version); function identifier() external view returns (uint256 identifier); - function inferenceCost() external view returns (uint256 inferenceCost); + function metadata() external view returns (string memory metadata); function name() external view returns (string memory name); - function url() external view returns (string memory url); function infer(bytes calldata _data) external payable returns (uint256 referenceId); } diff --git a/contracts/interfaces/IInferable.sol b/contracts/interfaces/IInferable.sol new file mode 100644 index 0000000..ba602f5 --- /dev/null +++ b/contracts/interfaces/IInferable.sol @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.0; + +interface IInferable { + function infer(bytes calldata data, address creator) external payable returns (uint256 inferenceId); +} diff --git a/contracts/interfaces/IModelCollection.sol b/contracts/interfaces/IModelCollection.sol new file mode 100644 index 0000000..b475c0b --- /dev/null +++ b/contracts/interfaces/IModelCollection.sol @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.0; + +import {IERC2981Upgradeable} from "@openzeppelin/contracts-upgradeable/interfaces/IERC2981Upgradeable.sol"; +import {IERC721Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol"; +import {IERC721EnumerableUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/IERC721EnumerableUpgradeable.sol"; +import {IERC721MetadataUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/IERC721MetadataUpgradeable.sol"; + +import {IInferable} from "./IInferable.sol"; + +interface IModelCollection is +IERC721Upgradeable, +IERC721MetadataUpgradeable, +IERC721EnumerableUpgradeable, +IERC2981Upgradeable { + event MintPriceUpdate(uint256 newValue); + event RoyaltyPortionUpdate(uint16 newValue); + event RoyaltyReceiverUpdate(address newAddress); + + event NewToken( + uint256 indexed tokenId, + string uri, + address model, + address indexed minter + ); + event TokenURIUpdate(uint256 indexed tokenId, string uri); + event TokenModelUpdate(uint256 indexed tokenId, address model); + + error InsufficientFunds(); + + function version() external pure returns (string memory version); + function nextModelId() external view returns (uint256 nextModelId); + function mintPrice() external view returns (uint256 mintPrice); + function royaltyReceiver() external view returns (address royaltyReceiver); + function royaltyPortion() external view returns (uint16 royaltyPortion); + + function mint(address to, string calldata uri, address model) external payable returns (uint256 tokenId); +} diff --git a/contracts/interfaces/IWorkerHub.sol b/contracts/interfaces/IWorkerHub.sol index 230318c..e05c582 100644 --- a/contracts/interfaces/IWorkerHub.sol +++ b/contracts/interfaces/IWorkerHub.sol @@ -1,109 +1,95 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; -interface IWorkerHub { - struct Inference { - uint256 value; +import {IHeapComparator} from "../lib/heap/IHeapComparator.sol"; + +import {IInferable} from "./IInferable.sol"; + +interface IWorkerHub is IInferable, IHeapComparator { + struct Model { uint256 modelId; - bytes data; - bytes result; - bool isResolved; - address model; - address creator; - address worker; + uint256 minimumFee; + uint32 tier; } struct Worker { - uint256 stakedValue; - bool isAuthorized; + uint256 stake; + uint256 currentTaskId; + uint256 commission; + uint16 tier; } - struct UnresolvedInference { - uint256 requestId; - uint256 value; - bytes data; - address model; - address creator; + struct Assignment { + uint256 inferenceId; + address worker; + uint40 expiredAt; + bool accomplished; } - struct UnstakeRequest { + struct Task { + uint256 inferenceId; uint256 value; - address worker; - uint40 unlockedAt; - bool isWithdrawn; + uint8 workerRequirement; } - event CollectionUpdate(address newAddress); - event TreasuryUpdate(address newAddress); - - event FeePercentageUpdate(uint8 newValue); - event MinimumStakeUpdate(uint256 newValue); - event RoyaltyPercentageUpdate(uint8 newValue); - event StakeLockingDurationUpdate(uint40 newValue); - - event ModelRegistration(address model); - event ModelUnregistration(address model); - - event WorkerAuthorization(address worker); - event WorkerUnauthorization(address worker); + struct Output { + bytes data; + uint256 validationSubmissions; + address minter; + uint8 approval; + } - event NewUnstakeRequest(uint256 indexed requestId, address indexed worker, uint256 value); - event Stake(address indexed worker, uint256 value); - event Unstake(address indexed worker, uint256[] requestIds); + struct Inference { + address[] minters; + address[] validators; + Output[] outputs; + address modelAddress; + uint256 modelId; + uint256 value; + bytes input; + address creator; + } - event NewInference(uint256 indexed inferenceId, address indexed creator); - event ResultSubmission(uint256 indexed inferenceId, address indexed worker); + event ModelRegistration( + address indexed model, + uint256 indexed modelId, + uint16 indexed tier, + uint256 minimumFee + ); + event ModelUnregistration(address indexed model); + + event MinterExtraStake(address indexed minter, uint256 value); + event MinterRegistration( + address indexed minter, + uint16 indexed tier, + uint256 value + ); + event MinterUnregistration(address indexed minter); + + event ValidatorExtraStake(address indexed validator, uint256 value); + event ValidatorRegistration( + address indexed validator, + uint16 indexed tier, + uint256 value + ); + event ValidatorUnregistration(address indexed validator); + + event NewInference( + uint256 indexed inferenceId, + address indexed creator, + uint256 value + ); error AlreadyRegistered(); - error ConflictedPercentage(); - error FailedTransfer(); - error InferenceIsAlreadyResolved(); - error InsufficientFunds(); - error InvalidInferenceId(); - error NotEnoughStake(); error NotRegistered(); - error StakeIsNotUnlockedYet(); - error RequestIsAlreadyWithdrawn(); error Unauthorized(); - function version() external pure returns (string memory); - - function collection() external view returns (address collectionAddress); - function feePercentage() external view returns (uint8 feePercentage); - function inferenceNumber() external view returns (uint256 interferenceNumber); - function minimumStake() external view returns (uint256 minimumStake); - function royaltyPercentage() external view returns (uint8 royaltyPercentage); - function stakeLockingDuration() external view returns (uint40 stakeLockingDuration); - function unstakeRequestNumber() external view returns (uint256 unstakeRequestNumber); - function treasury() external view returns (address treasuryAddress); - - function getIndividualInferences(address account) - external view returns (Inference[] memory inferences); - function getIndividualUnresolvedInferences(address account) - external view returns (UnresolvedInference[] memory inferences); - function getIndividualUnstakeRequests(address account) - external view returns (UnstakeRequest[] memory requests); - function getIndividualWithdrawableUnstakeRequests(address _account) - external view returns (UnstakeRequest[] memory requests); - function getInference(uint256 inferenceId) - external view returns (Inference memory inference); - function getInferences() - external view returns (Inference[] memory inferences); - function getModelInferences(address model) - external view returns (Inference[] memory inferences); - function getModelUnresolvedInferences(address model) - external view returns (UnresolvedInference[] memory inferences); - function getUnresolvedInferences() - external view returns (UnresolvedInference[] memory inferences); - function getUnstakeRequest(uint256 requestId) - external view returns (UnstakeRequest memory); - function getWorker(address worker) - external view returns (Worker memory workerData); - - function stake() external payable; - function requestUnstake(uint256 value) external; - function unstake(uint256[] calldata requestIds) external; - - function infer(bytes calldata data, uint256 identifier, address creator) external payable returns (uint256); - function submitResult(uint256 inferenceId, bytes calldata result) external; + error InvalidModel(); + error InvalidTier(); + + error FeeTooLow(); + error StakeTooLow(); + + error MintingSessionNotEnded(); + error ValidatingSessionNotEnded(); } diff --git a/contracts/lib/TransferHelper.sol b/contracts/lib/TransferHelper.sol new file mode 100644 index 0000000..a4149c3 --- /dev/null +++ b/contracts/lib/TransferHelper.sol @@ -0,0 +1,69 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +library TransferHelper { + bytes4 constant private APPROVE_SELECTOR = bytes4(keccak256(bytes('approve(address,uint256)'))); + bytes4 constant private TRANSFER_SELECTOR = bytes4(keccak256(bytes('transfer(address,uint256)'))); + bytes4 constant private TRANSFER_FROM_SELECTOR = bytes4(keccak256(bytes('transferFrom(address,address,uint256)'))); + + error FailedApproval(); + error FailedTransfer(); + + function safeApprove( + address _token, + address _to, + uint256 _value + ) internal { + (bool success, bytes memory data) = _token.call( + abi.encodeWithSelector( + TRANSFER_SELECTOR, + _to, + _value + ) + ); + if (!success || (data.length > 0 && !abi.decode(data, (bool)))) { + revert FailedApproval(); + } + } + + function safeTransfer( + address _token, + address _to, + uint256 _value + ) internal { + (bool success, bytes memory data) = _token.call( + abi.encodeWithSelector( + TRANSFER_SELECTOR, + _to, + _value + ) + ); + if (!success || (data.length > 0 && !abi.decode(data, (bool)))) { + revert FailedTransfer(); + } + } + + function safeTransferFrom( + address _token, + address _from, + address _to, + uint256 _value + ) internal { + (bool success, bytes memory data) = _token.call( + abi.encodeWithSelector( + TRANSFER_FROM_SELECTOR, + _from, + _to, + _value + ) + ); + if (!success || (data.length > 0 && !abi.decode(data, (bool)))) { + revert FailedTransfer(); + } + } + + function safeTransferNative(address _to, uint256 _value) internal { + (bool success, ) = _to.call{value: _value}(""); + if (!success) revert FailedTransfer(); + } +} diff --git a/contracts/lib/heap/Heap.sol b/contracts/lib/heap/Heap.sol new file mode 100644 index 0000000..d387131 --- /dev/null +++ b/contracts/lib/heap/Heap.sol @@ -0,0 +1,264 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.0; + +import {IHeapComparator} from "./IHeapComparator.sol"; + +library Heap { + // Address Heap + struct AddressHeap { + mapping(uint256 => address) values; + mapping(address => uint256) positions; + address comparator; + int64 identifier; + uint256 size; + } + + error EmptyAddressHeap(); + error AddressHeapValueNotFound(address value); + error DuplicatedAddressHeapValue(address value); + + function _up(AddressHeap storage _heap, uint256 _node, address _value) private { + mapping(uint256 => address) storage values = _heap.values; + mapping(address => uint256) storage positions = _heap.positions; + function(address, address, int64) external view returns (bool) compare + = IHeapComparator(_heap.comparator).compareAddress; + int64 identifier = _heap.identifier; + while (_node > 1) { + uint256 parentNode = _node >> 1; + address parentAddr = values[parentNode]; + if (compare(parentAddr, _value, identifier)) break; + values[parentNode] = _value; + positions[_value] = parentNode; + + values[_node] = parentAddr; + positions[parentAddr] = _node; + + _node = parentNode; + } + } + + function _down(AddressHeap storage _heap, uint256 _node, address _value) private { + mapping(uint256 => address) storage values = _heap.values; + mapping(address => uint256) storage positions = _heap.positions; + function(address, address, int64) external view returns (bool) compare + = IHeapComparator(_heap.comparator).compareAddress; + int64 identifier = _heap.identifier; + uint256 size = _heap.size; + while (true) { + uint256 childNode = _node << 1; + address childAddr = values[childNode]; + if (childNode > size) break; + if (childNode < size && compare(values[childNode | 1], childAddr, identifier)) { + childNode |= 1; + childAddr = values[childNode]; + } + + if (compare(_value, childAddr, identifier)) break; + values[childNode] = _value; + positions[_value] = childNode; + + values[_node] = childAddr; + positions[childAddr] = _node; + + _node = childNode; + } + } + + function up(AddressHeap storage _heap, address _value) internal { + uint256 node = _heap.positions[_value]; + if (node == 0) revert AddressHeapValueNotFound(_value); + _up(_heap, node, _value); + } + + function down(AddressHeap storage _heap, address _value) internal { + uint256 node = _heap.positions[_value]; + if (node == 0) revert AddressHeapValueNotFound(_value); + _down(_heap, node, _value); + } + + function hasValue(AddressHeap storage _heap, address _value) internal view returns (bool) { + return _heap.positions[_value] != 0; + } + + function push(AddressHeap storage _heap, address _value) internal { + if (_heap.positions[_value] != 0) revert DuplicatedAddressHeapValue(_value); + uint256 node = ++_heap.size; + _heap.values[node] = _value; + _heap.positions[_value] = node; + _up(_heap, node, _value); + } + + function peek(AddressHeap storage _heap) internal view returns (address) { + if (_heap.size == 0) revert EmptyAddressHeap(); + return _heap.values[1]; + } + + function pop(AddressHeap storage _heap) internal { + if (_heap.size == 0) revert EmptyAddressHeap(); + if (_heap.size == 1) { + _heap.size = 0; + _heap.positions[_heap.values[1]] = 0; + } else { + mapping(uint256 => address) storage values = _heap.values; + mapping(address => uint256) storage positions = _heap.positions; + address addr = values[_heap.size]; + positions[values[1]] = 0; + values[1] = addr; + positions[addr] = 1; + _heap.size--; + _down(_heap, 1, addr); + } + } + + function remove(AddressHeap storage _heap, address _value) internal { + if (_heap.positions[_value] == 0) revert AddressHeapValueNotFound(_value); + + mapping(address => uint256) storage positions = _heap.positions; + uint256 node = positions[_value]; + positions[_value] = 0; + if (node == _heap.size) { + _heap.size--; + } else { + mapping(uint256 => address) storage values = _heap.values; + address newAddr = values[_heap.size]; + _heap.size--; + values[node] = newAddr; + positions[newAddr] = node; + if (node != 1 + && IHeapComparator(_heap.comparator).compareAddress(newAddr, values[node >> 1], _heap.identifier)) { + _up(_heap, node, newAddr); + } else { + _down(_heap, node, newAddr); + } + } + } + + // Uint256 Heap + struct Uint256Heap { + mapping(uint256 => uint256) values; + mapping(uint256 => uint256) positions; + address comparator; + int64 identifier; + uint256 size; + } + + error EmptyUint256Heap(); + error Uint256HeapValueNotFound(uint256 value); + error DuplicatedUint256HeapValue(uint256 value); + + function _up(Uint256Heap storage _heap, uint256 _node, uint256 _value) private { + mapping(uint256 => uint256) storage values = _heap.values; + mapping(uint256 => uint256) storage positions = _heap.positions; + function(uint256, uint256, int64) external view returns (bool) compare + = IHeapComparator(_heap.comparator).compareUint256; + int64 identifier = _heap.identifier; + while (_node > 1) { + uint256 parentNode = _node >> 1; + uint256 parentAddr = values[parentNode]; + if (compare(parentAddr, _value, identifier)) break; + values[parentNode] = _value; + positions[_value] = parentNode; + + values[_node] = parentAddr; + positions[parentAddr] = _node; + + _node = parentNode; + } + } + + function _down(Uint256Heap storage _heap, uint256 _node, uint256 _value) private { + mapping(uint256 => uint256) storage values = _heap.values; + mapping(uint256 => uint256) storage positions = _heap.positions; + function(uint256, uint256, int64) external view returns (bool) compare + = IHeapComparator(_heap.comparator).compareUint256; + int64 identifier = _heap.identifier; + uint256 size = _heap.size; + while (true) { + uint256 childNode = _node << 1; + uint256 childAddr = values[childNode]; + if (childNode > size) break; + if (childNode < size && compare(values[childNode | 1], childAddr, identifier)) { + childNode |= 1; + childAddr = values[childNode]; + } + + if (compare(_value, childAddr, identifier)) break; + values[childNode] = _value; + positions[_value] = childNode; + + values[_node] = childAddr; + positions[childAddr] = _node; + + _node = childNode; + } + } + + function up(Uint256Heap storage _heap, uint256 _value) internal { + uint256 node = _heap.positions[_value]; + if (node == 0) revert Uint256HeapValueNotFound(_value); + _up(_heap, node, _value); + } + + function down(Uint256Heap storage _heap, uint256 _value) internal { + uint256 node = _heap.positions[_value]; + if (node == 0) revert Uint256HeapValueNotFound(_value); + _down(_heap, node, _value); + } + + function hasValue(Uint256Heap storage _heap, uint256 _value) internal view returns (bool) { + return _heap.positions[_value] != 0; + } + + function push(Uint256Heap storage _heap, uint256 _value) internal { + if (_heap.positions[_value] != 0) revert DuplicatedUint256HeapValue(_value); + uint256 node = ++_heap.size; + _heap.values[node] = _value; + _heap.positions[_value] = node; + _up(_heap, node, _value); + } + + function peek(Uint256Heap storage _heap) internal view returns (uint256) { + if (_heap.size == 0) revert EmptyUint256Heap(); + return _heap.values[1]; + } + + function pop(Uint256Heap storage _heap) internal { + if (_heap.size == 0) revert EmptyUint256Heap(); + if (_heap.size == 1) { + _heap.size = 0; + _heap.positions[_heap.values[1]] = 0; + } else { + mapping(uint256 => uint256) storage values = _heap.values; + mapping(uint256 => uint256) storage positions = _heap.positions; + uint256 addr = values[_heap.size]; + positions[values[1]] = 0; + values[1] = addr; + positions[addr] = 1; + _heap.size--; + _down(_heap, 1, addr); + } + } + + function remove(Uint256Heap storage _heap, uint256 _value) internal { + if (_heap.positions[_value] == 0) revert Uint256HeapValueNotFound(_value); + + mapping(uint256 => uint256) storage positions = _heap.positions; + uint256 node = positions[_value]; + positions[_value] = 0; + if (node == _heap.size) { + _heap.size--; + } else { + mapping(uint256 => uint256) storage values = _heap.values; + uint256 newAddr = values[_heap.size]; + _heap.size--; + values[node] = newAddr; + positions[newAddr] = node; + if (node != 1 + && IHeapComparator(_heap.comparator).compareUint256(newAddr, values[node >> 1], _heap.identifier)) { + _up(_heap, node, newAddr); + } else { + _down(_heap, node, newAddr); + } + } + } +} diff --git a/contracts/lib/heap/IHeapComparator.sol b/contracts/lib/heap/IHeapComparator.sol new file mode 100644 index 0000000..82ad74d --- /dev/null +++ b/contracts/lib/heap/IHeapComparator.sol @@ -0,0 +1,8 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.0; + +interface IHeapComparator { + function compareUint256(uint256 a, uint256 b, int64 identifier) external view returns (bool); + + function compareAddress(address a, address b, int64 identifier) external view returns (bool); +} diff --git a/contracts/storages/HybridModelStorage.sol b/contracts/storages/HybridModelStorage.sol new file mode 100644 index 0000000..d5e193b --- /dev/null +++ b/contracts/storages/HybridModelStorage.sol @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.0; + +import {IHybridModel} from "../interfaces/IHybridModel.sol"; + +abstract contract HybridModelStorage is IHybridModel { + uint256 public identifier; + + string public name; + string public metadata; + + address public workerHub; + + uint256[50] private __gap; +} diff --git a/contracts/storages/ModelCollectionStorage.sol b/contracts/storages/ModelCollectionStorage.sol new file mode 100644 index 0000000..541a0f9 --- /dev/null +++ b/contracts/storages/ModelCollectionStorage.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.0; + +import {IModelCollection} from "../interfaces/IModelCollection.sol"; + +abstract contract ModelCollectionStorage is IModelCollection { + mapping(uint256 => address) internal models; + uint256 public nextModelId; + uint256 public mintPrice; + address public royaltyReceiver; + uint16 public royaltyPortion; + + uint256[50] private __gap; +} diff --git a/contracts/storages/WorkerHubStorage.sol b/contracts/storages/WorkerHubStorage.sol new file mode 100644 index 0000000..2f05974 --- /dev/null +++ b/contracts/storages/WorkerHubStorage.sol @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.0; + +import {IWorkerHub} from "../interfaces/IWorkerHub.sol"; + +import {Heap} from "../lib/heap/Heap.sol"; + +abstract contract WorkerHubStorage is IWorkerHub { + uint256 public mintingAssignmentsFront; + uint256 public mintingAssignmentsRear; + mapping(uint256 => Assignment) internal mintingAssignments; + + uint256 public validatingAssignmentsFront; + uint256 public validatingAssignmentsRear; + mapping(uint256 => Assignment) internal validatingAssignments; + + uint256 public modelNumber; + mapping(address => Model) public models; + + uint256 public inferenceNumber; + mapping(uint256 => Inference) internal inferences; + + uint256 public taskNumber; + mapping(uint256 => Task) internal tasks; + Heap.Uint256Heap internal mintingTaskQueue; + Heap.Uint256Heap internal validatingTaskQueue; + + mapping(address => Worker) public minters; + mapping(address => Worker) public validators; + mapping(uint256 => Heap.AddressHeap) internal minterQueues; + mapping(uint256 => Heap.AddressHeap) internal validatorQueues; + + uint256 public minterMinimumStake; + uint256 public validatorMinimumStake; + uint40 public mintingTimeLimit; + uint40 public validatingTimeLimit; + uint8 public minterRequirement; + uint8 public validatorRequirement; + + uint16 public maximumTier; + + uint256[50] private __gap; +} From 707d3d46c375f941e4a98830e10a96e4b3646fb9 Mon Sep 17 00:00:00 2001 From: rein-nbc Date: Tue, 7 May 2024 11:27:42 +0700 Subject: [PATCH 02/82] Make on-chain models use ModelCollection --- deploy/1-model.ts | 15 ++++++++------- scripts/deploy-image-model.ts | 8 ++++---- scripts/deploy-melody-model.ts | 8 ++++---- scripts/deploy-textrnn-model.ts | 8 ++++---- scripts/image.task.ts | 16 ++++++++-------- scripts/lib/modelLib.ts | 18 +++++++++--------- scripts/melody.task.ts | 16 ++++++++-------- scripts/textrnn.task.ts | 16 ++++++++-------- 8 files changed, 53 insertions(+), 52 deletions(-) diff --git a/deploy/1-model.ts b/deploy/1-model.ts index a626ae4..bf703eb 100644 --- a/deploy/1-model.ts +++ b/deploy/1-model.ts @@ -11,24 +11,25 @@ const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { await network.provider.send("evm_setIntervalMining", [3000]); } - // uint256 _mintPrice, uint256 _evalPrice, address _royaltyReceiver, uint256 _nextModelId + const name = "Models"; + const symbol = "MDL"; const mintPrice = ethers.utils.parseEther('0.1'); - const evalPrice = ethers.utils.parseEther('0.01'); const royaltyReceiver = deployer; - const nextModelId = 1000; + const royaltyPortion = 10; + const nextModelId = 1; - await deploy('ModelReg', { + await deploy('ModelCollection', { from: deployer, proxy: { proxyContract: 'OpenZeppelinTransparentProxy', execute: { init: { methodName: 'initialize', - args: [mintPrice, evalPrice, royaltyReceiver], + args: [name, symbol, mintPrice, royaltyReceiver, royaltyPortion, nextModelId], }, // onUpgrade: { // methodName: 'afterUpgrade', - // args: [mintPrice, evalPrice, royaltyReceiver, nextModelId], + // args: [name, symbol, mintPrice, royaltyReceiver, royaltyPortion, nextModelId], // } }, }, @@ -38,5 +39,5 @@ const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { }; -func.tags = ['1', 'ModelReg']; +func.tags = ['1', 'ModelCollection']; export default func; \ No newline at end of file diff --git a/scripts/deploy-image-model.ts b/scripts/deploy-image-model.ts index cfbdc1f..b90585b 100644 --- a/scripts/deploy-image-model.ts +++ b/scripts/deploy-image-model.ts @@ -7,7 +7,7 @@ import { fromFloat } from './lib/utils'; import { getModelConfig, uploadModelWeights, mintModel } from './lib/modelLib'; dotenv.config(); -const ModelRegContractName = "ModelReg"; +const ModelCollectionContractName = "ModelCollection"; const MaxWeightLen = 1000; const mintPrice = ethers.utils.parseEther('0.1'); const mintConfig = { value: mintPrice }; @@ -56,7 +56,7 @@ async function main() { let nftContractAddress = MODELS_NFT_CONTRACT as string; - const modelReg = await ethers.getContractAt(ModelRegContractName, nftContractAddress); + const modelCollection = await ethers.getContractAt(ModelCollectionContractName, nftContractAddress); // deploy a ImageClassifier contract // ImageClassifier contract is too big (larger than 49152 bytes) to be deployed with ContractFactory @@ -89,7 +89,7 @@ async function main() { const onchainModel = await upgrades.deployProxy( OnchainModel, [ - modelReg.address, + modelCollection.address, 0, params.model_name, image.address, @@ -105,7 +105,7 @@ async function main() { console.log("tx:", tx.hash); console.log("Minting new model"); - await mintModel(modelReg, onchainModel, MODEL_OWNER || signer.address, mintConfig); + await mintModel(modelCollection, onchainModel, MODEL_OWNER || signer.address, mintConfig); } main().catch((error) => { diff --git a/scripts/deploy-melody-model.ts b/scripts/deploy-melody-model.ts index ed1a58f..708f305 100644 --- a/scripts/deploy-melody-model.ts +++ b/scripts/deploy-melody-model.ts @@ -8,7 +8,7 @@ import { getModelConfig, uploadModelWeights, mintModel } from './lib/modelLib'; dotenv.config(); -const ModelRegContractName = "ModelReg"; +const ModelCollectionContractName = "ModelCollection"; const MaxWeightLen = 1000; const mintPrice = ethers.utils.parseEther('0.1'); const mintConfig = { value: mintPrice }; @@ -55,7 +55,7 @@ async function main() { let nftContractAddress = MODELS_NFT_CONTRACT as string; - const modelReg = await ethers.getContractAt(ModelRegContractName, nftContractAddress); + const modelCollection = await ethers.getContractAt(ModelCollectionContractName, nftContractAddress); // deploy a MelodyRNN contract const MelodyFac = new ethers.ContractFactory(MelodyRNNArtifact.abi, MelodyRNNArtifact.bytecode, signer); @@ -91,7 +91,7 @@ async function main() { const onchainModel = await upgrades.deployProxy( OnchainModel, [ - modelReg.address, + modelCollection.address, 0, params.model_name, mldy.address, @@ -107,7 +107,7 @@ async function main() { console.log("tx:", tx.hash); console.log("Minting new model"); - await mintModel(modelReg, onchainModel, MODEL_OWNER || signer.address, mintConfig); + await mintModel(modelCollection, onchainModel, MODEL_OWNER || signer.address, mintConfig); } main().catch((error) => { diff --git a/scripts/deploy-textrnn-model.ts b/scripts/deploy-textrnn-model.ts index a6ad237..597045e 100644 --- a/scripts/deploy-textrnn-model.ts +++ b/scripts/deploy-textrnn-model.ts @@ -7,7 +7,7 @@ import { fromFloat } from './lib/utils'; import { getModelConfig, uploadModelWeights, mintModel } from './lib/modelLib'; dotenv.config(); -const ModelRegContractName = "ModelReg"; +const ModelCollectionContractName = "ModelCollection"; const MaxWeightLen = 1000; const mintPrice = ethers.utils.parseEther('0.1'); const mintConfig = { value: mintPrice }; @@ -54,7 +54,7 @@ async function main() { let nftContractAddress = MODELS_NFT_CONTRACT as string; - const modelReg = await ethers.getContractAt(ModelRegContractName, nftContractAddress); + const modelCollection = await ethers.getContractAt(ModelCollectionContractName, nftContractAddress); // deploy a TextRNN contract // TextRNN contract is too big (larger than 49152 bytes) to be deployed with ContractFactory @@ -91,7 +91,7 @@ async function main() { const onchainModel = await upgrades.deployProxy( OnchainModel, [ - modelReg.address, + modelCollection.address, 0, params.model_name, eai.address, @@ -107,7 +107,7 @@ async function main() { console.log("tx:", tx.hash); console.log("Minting new model"); - await mintModel(modelReg, onchainModel, MODEL_OWNER || signer.address, mintConfig); + await mintModel(modelCollection, onchainModel, MODEL_OWNER || signer.address, mintConfig); } main().catch((error) => { diff --git a/scripts/image.task.ts b/scripts/image.task.ts index e2e9e9b..efeaef4 100644 --- a/scripts/image.task.ts +++ b/scripts/image.task.ts @@ -9,7 +9,7 @@ import { pixelsToImage, fromInt, toFloat, recursiveToFloat, recursiveToString } const ImageClassifierContractName = "ImageClassifier"; const OnchainModelContractName = "OnchainModel"; -const ModelRegContractName = "ModelReg"; +const ModelCollectionContractName = "ModelCollection"; async function inferModel(interfaceContract: ethers.Contract, pixels: ethers.BigNumber[][][]) { const abic = ethers.utils.defaultAbiCoder; @@ -32,7 +32,7 @@ async function inferModel(interfaceContract: ethers.Contract, pixels: ethers.Big task("eval-img", "evaluate model for each layer") .addOptionalParam("img", "image file name", "image.png", types.string) - .addOptionalParam("contract", "contract address", "", types.string) + .addOptionalParam("contract", "ModelCollection contract address", "", types.string) .addOptionalParam("id", "token id of model", "1", types.string) .setAction(async (taskArgs: any, hre: HardhatRuntimeEnvironment) => { const { ethers, deployments, getNamedAccounts } = hre; @@ -42,13 +42,13 @@ task("eval-img", "evaluate model for each layer") let contractAddress = taskArgs.contract; if (contractAddress === "") { - const baseContract = await deployments.get(ModelRegContractName); + const baseContract = await deployments.get(ModelCollectionContractName); contractAddress = baseContract.address; } - const modelRegContract = await ethers.getContractAt(ModelRegContractName, contractAddress, signer); + const ModelCollectionContract = await ethers.getContractAt(ModelCollectionContractName, contractAddress, signer); const tokenId = ethers.BigNumber.from(taskArgs.id); - const interfaceAddress = await modelRegContract.modelAddr(tokenId); + const interfaceAddress = await ModelCollectionContract.modelAddressOf(tokenId); const interfaceContract = await ethers.getContractAt(OnchainModelContractName, interfaceAddress, signer); const implementAddress = await interfaceContract.implementation(); @@ -90,12 +90,12 @@ task("get-image-model", "get eternal AI model") const [signer] = await ethers.getSigners(); let contractAddress = taskArgs.contract; if (contractAddress === "") { - const baseContract = await deployments.get(ModelRegContractName); + const baseContract = await deployments.get(ModelCollectionContractName); contractAddress = baseContract.address; } - const modelRegContract = await ethers.getContractAt(ModelRegContractName, contractAddress, signer); + const ModelCollectionContract = await ethers.getContractAt(ModelCollectionContractName, contractAddress, signer); const tokenId = ethers.BigNumber.from(taskArgs.id); - const interfaceAddress = await modelRegContract.modelAddr(tokenId); + const interfaceAddress = await ModelCollectionContract.modelAddressOf(tokenId); const interfaceContract = await ethers.getContractAt(OnchainModelContractName, interfaceAddress, signer); const implementAddress = await interfaceContract.implementation(); diff --git a/scripts/lib/modelLib.ts b/scripts/lib/modelLib.ts index 8b0ef8c..daf0085 100644 --- a/scripts/lib/modelLib.ts +++ b/scripts/lib/modelLib.ts @@ -246,7 +246,7 @@ export async function uploadModelWeights(model: ethers.Contract, weights: ethers } export async function mintModel( - modelReg: ethers.Contract, + modelCollection: ethers.Contract, model: ethers.Contract, owner: string, mintConfig: any @@ -262,16 +262,16 @@ export async function mintModel( try { const modelUri = ""; // unused - const tx = await modelReg.safeMint(owner, modelUri, model.address, {...mintConfig, gasLimit: 1_000_000 }); + const tx = await modelCollection.mint(owner, modelUri, model.address, {...mintConfig }); const rc = await tx.wait(); - // listen for Transfer event - const transferEvent = rc.events?.find((event: ethers.Event) => event.event === 'Transfer'); - if (transferEvent != null) { - const from = transferEvent.args?.from; - const to = transferEvent.args?.to; - const tokenId = transferEvent.args?.tokenId; + // listen for NewToken event + const newTokenEvent = rc.events?.find((event: ethers.Event) => event.event === 'NewToken'); + if (newTokenEvent != null) { + const model = newTokenEvent.args?.model; + const minter = newTokenEvent.args?.minter; + const tokenId = newTokenEvent.args?.tokenId; console.log("tx:", tx.hash); - console.log(`Minted new on-chain model, to=${to}, tokenId=${tokenId}`); + console.log(`Minted new on-chain model, tokenId=${tokenId}, model=${model}, minter=${minter}`); } // checkForDeployedModel(rc); } catch (e) { diff --git a/scripts/melody.task.ts b/scripts/melody.task.ts index 228553b..60a60a8 100644 --- a/scripts/melody.task.ts +++ b/scripts/melody.task.ts @@ -8,7 +8,7 @@ import { toInt } from "./lib/utils"; const MelodyRNNContractName = "MelodyRNN"; const OnchainModelContractName = "OnchainModel"; -const ModelRegContractName = "ModelReg"; +const ModelCollectionContractName = "ModelCollection"; async function inferModel(interfaceContract: ethers.Contract, noteCount: number, x: ethers.BigNumber[]) { const abic = ethers.utils.defaultAbiCoder; @@ -34,7 +34,7 @@ async function inferModel(interfaceContract: ethers.Contract, noteCount: number, } task("generate-melody", "evaluate model for each layer") - .addOptionalParam("contract", "modelRegistry contract address", "", types.string) + .addOptionalParam("contract", "ModelCollection contract address", "", types.string) .addOptionalParam("id", "token id of model", "1", types.string) .addOptionalParam("count", "number of step", 1, types.int) .addOptionalParam("steplen", "number of notes to generate per step", 1, types.int) @@ -48,13 +48,13 @@ task("generate-melody", "evaluate model for each layer") let contractAddress = taskArgs.contract; if (contractAddress === "") { - const baseContract = await deployments.get(ModelRegContractName); + const baseContract = await deployments.get(ModelCollectionContractName); contractAddress = baseContract.address; } - const modelRegContract = await ethers.getContractAt(ModelRegContractName, contractAddress, signer); + const modelCollectionContract = await ethers.getContractAt(ModelCollectionContractName, contractAddress, signer); const tokenId = ethers.BigNumber.from(taskArgs.id); - const interfaceAddress = await modelRegContract.modelAddr(tokenId); + const interfaceAddress = await modelCollectionContract.modelAddressOf(tokenId); const interfaceContract = await ethers.getContractAt(OnchainModelContractName, interfaceAddress, signer); const implementAddress = await interfaceContract.implementation(); @@ -109,12 +109,12 @@ task("get-melody-model", "get eternal AI model") const [signer] = await ethers.getSigners(); let contractAddress = taskArgs.contract; if (contractAddress === "") { - const baseContract = await deployments.get(ModelRegContractName); + const baseContract = await deployments.get(ModelCollectionContractName); contractAddress = baseContract.address; } - const modelRegContract = await ethers.getContractAt(ModelRegContractName, contractAddress, signer); + const modelCollectionContract = await ethers.getContractAt(ModelCollectionContractName, contractAddress, signer); const tokenId = ethers.BigNumber.from(taskArgs.id); - const modelAddress = await modelRegContract.modelAddr(tokenId); + const modelAddress = await modelCollectionContract.modelAddressOf(tokenId); console.log("Reading MelodyRNN model at address", modelAddress); const mldy = await ethers.getContractAt(MelodyRNNContractName, modelAddress, signer); // const model = await mldy.getInfo(tokenId); diff --git a/scripts/textrnn.task.ts b/scripts/textrnn.task.ts index 47d6ad8..a5bf05d 100644 --- a/scripts/textrnn.task.ts +++ b/scripts/textrnn.task.ts @@ -8,7 +8,7 @@ import { runeToText, isRune } from "./rune.task"; const EternalAIContractName = "TextRNN"; const OnchainModelContractName = "OnchainModel"; -const ModelRegContractName = "ModelReg"; +const ModelCollectionContractName = "ModelCollection"; async function inferModel(interfaceContract: ethers.Contract, prompt: string, generate: number, states: ethers.BigNumber[][][], seed: ethers.BigNumber) { const abic = ethers.utils.defaultAbiCoder; @@ -34,7 +34,7 @@ async function inferModel(interfaceContract: ethers.Contract, prompt: string, ge } task("generate-text", "generate text from RNN model") - .addOptionalParam("contract", "contract address", "", types.string) + .addOptionalParam("contract", "ModelCollection contract address", "", types.string) .addOptionalParam("id", "token id of model", "1", types.string) .addOptionalParam("prompt", "input prompt", "", types.string) .addOptionalParam("togenerate", "number of characters to be generated", 100, types.int) @@ -48,7 +48,7 @@ task("generate-text", "generate text from RNN model") let contractAddress = taskArgs.contract; if (contractAddress === "") { - const baseContract = await deployments.get(ModelRegContractName); + const baseContract = await deployments.get(ModelCollectionContractName); contractAddress = baseContract.address; } @@ -56,9 +56,9 @@ task("generate-text", "generate text from RNN model") const toGenerate = taskArgs.togenerate; const generatePerTx = (taskArgs.generatepertx == -1) ? toGenerate : taskArgs.generatepertx; - const modelRegContract = await ethers.getContractAt(ModelRegContractName, contractAddress, signer); + const modelCollectionContract = await ethers.getContractAt(ModelCollectionContractName, contractAddress, signer); const tokenId = ethers.BigNumber.from(taskArgs.id); - const interfaceAddress = await modelRegContract.modelAddr(tokenId); + const interfaceAddress = await modelCollectionContract.modelAddressOf(tokenId); const interfaceContract = await ethers.getContractAt(OnchainModelContractName, interfaceAddress, signer); const implementAddress = await interfaceContract.implementation(); @@ -147,12 +147,12 @@ task("get-textrnn-model", "get eternal AI model") const [signer] = await ethers.getSigners(); let contractAddress = taskArgs.contract; if (contractAddress === "") { - const baseContract = await deployments.get(ModelRegContractName); + const baseContract = await deployments.get(ModelCollectionContractName); contractAddress = baseContract.address; } - const modelRegContract = await ethers.getContractAt(ModelRegContractName, contractAddress, signer); + const modelCollectionContract = await ethers.getContractAt(ModelCollectionContractName, contractAddress, signer); const tokenId = ethers.BigNumber.from(taskArgs.id); - const modelAddress = await modelRegContract.modelAddr(tokenId); + const modelAddress = await modelCollectionContract.modelAddressOf(tokenId); const modelContract = await ethers.getContractAt(EternalAIContractName, modelAddress, signer); const model = await modelContract.getInfo(); From 9eb9c1665bcd1e10b524c8fdb44be54ba44ed756 Mon Sep 17 00:00:00 2001 From: 180945 <180945@trustless.computer> Date: Tue, 7 May 2024 19:20:29 +0700 Subject: [PATCH 03/82] added mint by signature --- contracts/ModelCollection.sol | 58 ++++++++++++++++--- contracts/interfaces/IModelCollection.sol | 2 + contracts/storages/ModelCollectionStorage.sol | 1 + 3 files changed, 54 insertions(+), 7 deletions(-) diff --git a/contracts/ModelCollection.sol b/contracts/ModelCollection.sol index f5fecd5..dc1ced4 100644 --- a/contracts/ModelCollection.sol +++ b/contracts/ModelCollection.sol @@ -10,6 +10,7 @@ import {ERC721EnumerableUpgradeable} from "@openzeppelin/contracts-upgradeable/t import {ERC721PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721PausableUpgradeable.sol"; import {ERC721URIStorageUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721URIStorageUpgradeable.sol"; import {IERC721MetadataUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/IERC721MetadataUpgradeable.sol"; +import {EIP712Upgradeable, ECDSAUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol"; import {IModel} from "./interfaces/IModel.sol"; @@ -17,6 +18,7 @@ import {ModelCollectionStorage} from "./storages/ModelCollectionStorage.sol"; contract ModelCollection is ModelCollectionStorage, +EIP712Upgradeable, ERC721EnumerableUpgradeable, ERC721PausableUpgradeable, ERC721URIStorageUpgradeable, @@ -34,7 +36,7 @@ OwnableUpgradeable { uint16 _royaltyPortion, uint256 _nextModelId ) external initializer { - __ERC721_init("Models", "MDL"); + __ERC721_init(_name, _symbol); __ERC721Pausable_init(); __Ownable_init(); @@ -71,14 +73,10 @@ OwnableUpgradeable { emit RoyaltyPortionUpdate(_royaltyPortion); } - function mint(address _to, string calldata _uri, address _model) external payable onlyOwner returns (uint256) { + function mint_(address _to, string calldata _uri, address _model, uint256 tokenId) internal returns (uint256) { + if (_model == address(0)) revert InvalidModel(); if (msg.value < mintPrice) revert InsufficientFunds(); - while (models[nextModelId] != address(0)) { - nextModelId++; - } - uint256 tokenId = nextModelId++; - _safeMint(_to, tokenId); _setTokenURI(tokenId, _uri); models[tokenId] = _model; @@ -89,12 +87,57 @@ OwnableUpgradeable { return tokenId; } + function mint(address _to, string calldata _uri, address _model) external payable onlyOwner returns (uint256) { + while (models[nextModelId] != address(0)) { + nextModelId++; + } + uint256 tokenId = nextModelId++; + + return mint_(_to, _uri, _model, tokenId); + } + + function mintBySignature( + address _to, + string calldata _uri, + address _model, + uint256 _tokenId, + uint8 v, + bytes32 r, + bytes32 s + ) public virtual returns (uint256) { + bytes32 hash = getHashToSign(_to, _uri, _model, _tokenId); + + address signer = ECDSAUpgradeable.recover(hash, v, r, s); + require(signer == owner(), "invalid signature"); + require(models[_tokenId] == address(0), "token minted"); + + return mint_(_to, _uri, _model, _tokenId); + } + + function getHashToSign( + address _to, + string calldata _uri, + address _model, + uint256 _tokenId + ) public view virtual returns(bytes32) { + bytes32 structHash = keccak256(abi.encode(_to, _uri, _model, _tokenId)); + + return _hashTypedDataV4(structHash); + } + + function withdraw(address _to, uint _value) external onlyOwner { + (bool success, ) = _to.call{value: _value}(""); + if (!success) revert FailedTransfer(); + } + function updateTokenURI(uint256 _tokenId, string calldata _uri) external onlyOwner { _setTokenURI(_tokenId, _uri); emit TokenURIUpdate(_tokenId, _uri); } function updateTokenModel(uint256 _tokenId, address _model) external onlyOwner { + require(_model != address(0), "invalid token model"); + models[_tokenId] = _model; emit TokenModelUpdate(_tokenId, _model); } @@ -104,6 +147,7 @@ OwnableUpgradeable { } function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view returns (address, uint256) { + _tokenId; return (royaltyReceiver, _salePrice * royaltyPortion / PORTION_DENOMINATOR); } diff --git a/contracts/interfaces/IModelCollection.sol b/contracts/interfaces/IModelCollection.sol index b475c0b..e7d1430 100644 --- a/contracts/interfaces/IModelCollection.sol +++ b/contracts/interfaces/IModelCollection.sol @@ -27,6 +27,8 @@ IERC2981Upgradeable { event TokenModelUpdate(uint256 indexed tokenId, address model); error InsufficientFunds(); + error InvalidModel(); + error FailedTransfer(); function version() external pure returns (string memory version); function nextModelId() external view returns (uint256 nextModelId); diff --git a/contracts/storages/ModelCollectionStorage.sol b/contracts/storages/ModelCollectionStorage.sol index 541a0f9..81f8d07 100644 --- a/contracts/storages/ModelCollectionStorage.sol +++ b/contracts/storages/ModelCollectionStorage.sol @@ -5,6 +5,7 @@ import {IModelCollection} from "../interfaces/IModelCollection.sol"; abstract contract ModelCollectionStorage is IModelCollection { mapping(uint256 => address) internal models; + mapping(bytes32 => bool) internal dataSignUsed; uint256 public nextModelId; uint256 public mintPrice; address public royaltyReceiver; From 1bd58fe632526143c759aada8127cd26107ef58f Mon Sep 17 00:00:00 2001 From: 180945 <180945@trustless.computer> Date: Tue, 7 May 2024 19:22:14 +0700 Subject: [PATCH 04/82] remove redundant --- contracts/storages/ModelCollectionStorage.sol | 1 - 1 file changed, 1 deletion(-) diff --git a/contracts/storages/ModelCollectionStorage.sol b/contracts/storages/ModelCollectionStorage.sol index 81f8d07..541a0f9 100644 --- a/contracts/storages/ModelCollectionStorage.sol +++ b/contracts/storages/ModelCollectionStorage.sol @@ -5,7 +5,6 @@ import {IModelCollection} from "../interfaces/IModelCollection.sol"; abstract contract ModelCollectionStorage is IModelCollection { mapping(uint256 => address) internal models; - mapping(bytes32 => bool) internal dataSignUsed; uint256 public nextModelId; uint256 public mintPrice; address public royaltyReceiver; From 4a3d3032f8dfd70e5b380058619d2a5349032d53 Mon Sep 17 00:00:00 2001 From: 180945 <180945@trustless.computer> Date: Wed, 8 May 2024 13:53:37 +0700 Subject: [PATCH 05/82] added events and contract inteface --- contracts/WorkerHub.sol | 39 +++++++++++++----- contracts/interfaces/IWorkerHub.sol | 54 +++++++++++++++++++------ contracts/storages/WorkerHubStorage.sol | 3 ++ 3 files changed, 73 insertions(+), 23 deletions(-) diff --git a/contracts/WorkerHub.sol b/contracts/WorkerHub.sol index 540a99d..38a2516 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -76,7 +76,7 @@ ReentrancyGuardUpgradeable { minter.stake = msg.value; minter.tier = tier; - emit MinterRegistration(msg.sender, tier, msg.value); + emit MinterRegistration(msg.sender, tier, msg.value, block.timestamp); } function unregisterMinter() external nonReentrant { @@ -173,27 +173,44 @@ ReentrancyGuardUpgradeable { return inferenceId; } + function _processMintingTasks() private {} + + // todo: kouchou remove code + // from here function compareAddress(address _a, address _b, int64 _identifier) external view returns (bool) { - return _identifier > 0 ? _compareMinter(_a, _b) : _compareValidator(_a, _b); + return true; } function compareUint256(uint256 _a, uint256 _b, int64 _identifier) external view returns (bool) { - return _compareTask(_a, _b); + return true; } + // end remove - function _compareMinter(address _minter1, address _minter2) private view returns (bool) { - return minters[_minter1].commission < minters[_minter2].commission; - } + // todo + // minter submit result for specific infer + function submitSolution(uint256 _assigmentId, bytes calldata _data) public virtual { - function _compareValidator(address _validator1, address _validator2) private view returns (bool) { - return validators[_validator1].commission < validators[_validator2].commission; } - function _compareTask(uint256 _taskId1, uint256 _taskId2) private view returns (bool) { - return tasks[_taskId1].value > tasks[_taskId2].value; + // todo + // validator notice result from minter incorrect and trigger dispute + function disputeInfer(uint256 _assignmentId) public virtual { + } - function _processMintingTasks() private { + // todo + // resolve pending inferences + // update infer status + // called by anyone + function resolveInfer(uint256 _inferId) public virtual { } + + // todo + // validator withdraw unstaked token after 21 days + function withdrawUnstake() public virtual {} + + // todo + // minter claim reward + function claimReward() public virtual {} } diff --git a/contracts/interfaces/IWorkerHub.sol b/contracts/interfaces/IWorkerHub.sol index e05c582..0a23d59 100644 --- a/contracts/interfaces/IWorkerHub.sol +++ b/contracts/interfaces/IWorkerHub.sol @@ -6,6 +6,13 @@ import {IHeapComparator} from "../lib/heap/IHeapComparator.sol"; import {IInferable} from "./IInferable.sol"; interface IWorkerHub is IInferable, IHeapComparator { + enum InferStatus { + None, + Solving, + Dispute, + Solved + } + struct Model { uint256 modelId; uint256 minimumFee; @@ -17,13 +24,15 @@ interface IWorkerHub is IInferable, IHeapComparator { uint256 currentTaskId; uint256 commission; uint16 tier; + uint256 activeTime; } struct Assignment { uint256 inferenceId; + uint256 validationSubmissions; address worker; - uint40 expiredAt; - bool accomplished; + uint8 disapproval; + bytes data; } struct Task { @@ -32,21 +41,16 @@ interface IWorkerHub is IInferable, IHeapComparator { uint8 workerRequirement; } - struct Output { - bytes data; - uint256 validationSubmissions; - address minter; - uint8 approval; - } - struct Inference { - address[] minters; + uint256[] assignments; // assignment ids address[] validators; - Output[] outputs; address modelAddress; uint256 modelId; uint256 value; bytes input; + address disputeAddress; // the first validator submit dispute request + uint40 expiredAt; + InferStatus status; address creator; } @@ -62,7 +66,8 @@ interface IWorkerHub is IInferable, IHeapComparator { event MinterRegistration( address indexed minter, uint16 indexed tier, - uint256 value + uint256 value, + uint256 activeTime ); event MinterUnregistration(address indexed minter); @@ -80,6 +85,31 @@ interface IWorkerHub is IInferable, IHeapComparator { uint256 value ); + event SubmitSolution( + address indexed _minter, + uint256 indexed _assigmentId + ); + + event DisputeInfer( + address indexed _validator, + uint256 indexed _assigmentId + ); + + event InferStatusUpdated( + uint256 indexed _inferId, + InferStatus _newStatus + ); + + event WithdrawUnstaked( + address indexed _validator, + uint256 _amount + ); + + event ClaimReward( + address indexed _minter, + uint256 _amount + ); + error AlreadyRegistered(); error NotRegistered(); error Unauthorized(); diff --git a/contracts/storages/WorkerHubStorage.sol b/contracts/storages/WorkerHubStorage.sol index 2f05974..85b8a58 100644 --- a/contracts/storages/WorkerHubStorage.sol +++ b/contracts/storages/WorkerHubStorage.sol @@ -39,5 +39,8 @@ abstract contract WorkerHubStorage is IWorkerHub { uint16 public maximumTier; + // validator mapping validator => assigment id => boolean + mapping(address => mapping(uint256 => bool)) public validatorDisputed; + uint256[50] private __gap; } From 4a857cfeba2c791d47c272b67cb12d860c453974 Mon Sep 17 00:00:00 2001 From: 180945 <180945@trustless.computer> Date: Wed, 8 May 2024 15:11:21 +0700 Subject: [PATCH 06/82] added reward funcs --- contracts/WorkerHub.sol | 56 ++++++++++++++++++++++--- contracts/interfaces/IWorkerHub.sol | 8 +++- contracts/storages/WorkerHubStorage.sol | 15 +++++++ 3 files changed, 73 insertions(+), 6 deletions(-) diff --git a/contracts/WorkerHub.sol b/contracts/WorkerHub.sol index 38a2516..2f160a4 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -67,6 +67,8 @@ ReentrancyGuardUpgradeable { } function registerMinter(uint16 tier) external payable { + _updateEpoch(); + if (tier == 0 || tier > maximumTier) revert InvalidTier(); if (msg.value < minterMinimumStake) revert StakeTooLow(); @@ -80,6 +82,8 @@ ReentrancyGuardUpgradeable { } function unregisterMinter() external nonReentrant { + _updateEpoch(); + Worker storage minter = minters[msg.sender]; if (minter.tier == 0) revert NotRegistered(); if (minter.currentTaskId != 0) revert MintingSessionNotEnded(); @@ -93,6 +97,8 @@ ReentrancyGuardUpgradeable { } function increaseMinterStake() external payable { + _updateEpoch(); + Worker storage minter = minters[msg.sender]; if (minter.tier == 0) revert NotRegistered(); minter.stake += msg.value; @@ -100,6 +106,8 @@ ReentrancyGuardUpgradeable { } function registerValidator(uint16 tier) external payable { + _updateEpoch(); + if (tier == 0 || tier > maximumTier) revert InvalidTier(); if (msg.value < validatorMinimumStake) revert StakeTooLow(); @@ -113,6 +121,8 @@ ReentrancyGuardUpgradeable { } function unregisterValidator() external nonReentrant { + _updateEpoch(); + Worker storage validator = validators[msg.sender]; if (validator.tier == 0) revert NotRegistered(); if (validator.currentTaskId != 0) revert ValidatingSessionNotEnded(); @@ -126,6 +136,8 @@ ReentrancyGuardUpgradeable { } function increaseValidatorStake() external payable { + _updateEpoch(); + Worker storage validator = validators[msg.sender]; if (validator.tier == 0) revert NotRegistered(); validator.stake += msg.value; @@ -133,6 +145,8 @@ ReentrancyGuardUpgradeable { } function registerModel(address _model, uint16 _tier, uint256 _minimumFee) external onlyOwner returns (uint256) { + _updateEpoch(); + Model storage model = models[_model]; if (model.modelId != 0) revert AlreadyRegistered(); uint256 modelId = ++modelNumber; @@ -175,6 +189,15 @@ ReentrancyGuardUpgradeable { function _processMintingTasks() private {} + // this internal function update new epoch + function _updateEpoch() private { + if (block.number - lastBlock >= blocksPerEpoch) { + currentEpoch++; + lastBlock = block.number; + rewardInEpoch[currentEpoch].totalReward = rewardPerEpoch; + } + } + // todo: kouchou remove code // from here function compareAddress(address _a, address _b, int64 _identifier) external view returns (bool) { @@ -189,13 +212,13 @@ ReentrancyGuardUpgradeable { // todo // minter submit result for specific infer function submitSolution(uint256 _assigmentId, bytes calldata _data) public virtual { - + _updateEpoch(); } // todo // validator notice result from minter incorrect and trigger dispute function disputeInfer(uint256 _assignmentId) public virtual { - + _updateEpoch(); } // todo @@ -203,14 +226,37 @@ ReentrancyGuardUpgradeable { // update infer status // called by anyone function resolveInfer(uint256 _inferId) public virtual { - + _updateEpoch(); } // todo // validator withdraw unstaked token after 21 days - function withdrawUnstake() public virtual {} + function withdrawUnstake() public virtual { + _updateEpoch(); + } // todo // minter claim reward - function claimReward() public virtual {} + function claimReward() public virtual { + _updateEpoch(); + } + + // todo + function setNewRewardInEpoch(uint256 _newRewardAmount) public virtual onlyOwner { + _updateEpoch(); + + } + + // todo + function setBlocksPerEpoch(uint256 _blocks) public virtual onlyOwner { + _updateEpoch(); + } + + // sum reward of an minter since last claimed epoch + function getRewardToClaim(address _minter) public view virtual returns(uint256 totalReward) { + uint96 lastClaimed = minters[_minter].lastClaimedEpoch; + for (lastClaimed += 1; lastClaimed < currentEpoch; lastClaimed++) { + totalReward += rewardInEpoch[uint256(lastClaimed)].totalReward * minterTaskCompleted[_minter][uint256(lastClaimed)] / uint256(rewardInEpoch[uint256(lastClaimed)].totalTaskCompleted) ; + } + } } diff --git a/contracts/interfaces/IWorkerHub.sol b/contracts/interfaces/IWorkerHub.sol index 0a23d59..b94ae3d 100644 --- a/contracts/interfaces/IWorkerHub.sol +++ b/contracts/interfaces/IWorkerHub.sol @@ -13,6 +13,11 @@ interface IWorkerHub is IInferable, IHeapComparator { Solved } + struct MinterEpochState { + uint256 totalReward; + uint96 totalTaskCompleted; + } + struct Model { uint256 modelId; uint256 minimumFee; @@ -24,7 +29,8 @@ interface IWorkerHub is IInferable, IHeapComparator { uint256 currentTaskId; uint256 commission; uint16 tier; - uint256 activeTime; + uint40 activeTime; + uint96 lastClaimedEpoch; } struct Assignment { diff --git a/contracts/storages/WorkerHubStorage.sol b/contracts/storages/WorkerHubStorage.sol index 85b8a58..66f7dcf 100644 --- a/contracts/storages/WorkerHubStorage.sol +++ b/contracts/storages/WorkerHubStorage.sol @@ -42,5 +42,20 @@ abstract contract WorkerHubStorage is IWorkerHub { // validator mapping validator => assigment id => boolean mapping(address => mapping(uint256 => bool)) public validatorDisputed; + // reward purpose + uint256 public blocksPerEpoch; + uint256 public currentEpoch; + uint256 public lastBlock; + uint256 public rewardPerEpoch; + + // mapping total task completed in epoch and reward per epoch + // epoch index => total reward + mapping(uint256 => MinterEpochState) public rewardInEpoch; + + // mapping detail minter completed how many request + // total task completed in epoch + // minter => epoch => total task completed + mapping(address => mapping(uint256 => uint256)) public minterTaskCompleted; + uint256[50] private __gap; } From 5dbe70b7d2e73eb6dfff55496b8e78749da36c43 Mon Sep 17 00:00:00 2001 From: 180945 <180945@trustless.computer> Date: Wed, 8 May 2024 15:49:44 +0700 Subject: [PATCH 07/82] added inteface --- contracts/WorkerHub.sol | 8 +++++++- contracts/interfaces/IWorkerHub.sol | 10 +++++----- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/contracts/WorkerHub.sol b/contracts/WorkerHub.sol index 2f160a4..3c606d5 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -187,7 +187,9 @@ ReentrancyGuardUpgradeable { return inferenceId; } - function _processMintingTasks() private {} + function _processMintingTasks() private { + + } // this internal function update new epoch function _updateEpoch() private { @@ -210,6 +212,7 @@ ReentrancyGuardUpgradeable { // end remove // todo + // kelvin // minter submit result for specific infer function submitSolution(uint256 _assigmentId, bytes calldata _data) public virtual { _updateEpoch(); @@ -219,6 +222,7 @@ ReentrancyGuardUpgradeable { // validator notice result from minter incorrect and trigger dispute function disputeInfer(uint256 _assignmentId) public virtual { _updateEpoch(); + } // todo @@ -227,6 +231,8 @@ ReentrancyGuardUpgradeable { // called by anyone function resolveInfer(uint256 _inferId) public virtual { _updateEpoch(); + + // switch case } // todo diff --git a/contracts/interfaces/IWorkerHub.sol b/contracts/interfaces/IWorkerHub.sol index b94ae3d..e07de2d 100644 --- a/contracts/interfaces/IWorkerHub.sol +++ b/contracts/interfaces/IWorkerHub.sol @@ -10,7 +10,8 @@ interface IWorkerHub is IInferable, IHeapComparator { None, Solving, Dispute, - Solved + Solved, + Killed } struct MinterEpochState { @@ -37,7 +38,7 @@ interface IWorkerHub is IInferable, IHeapComparator { uint256 inferenceId; uint256 validationSubmissions; address worker; - uint8 disapproval; + uint8 disapproval; // 1 / 3 total val bytes data; } @@ -48,13 +49,12 @@ interface IWorkerHub is IInferable, IHeapComparator { } struct Inference { - uint256[] assignments; // assignment ids - address[] validators; + uint256[] assignments; // assignment ids solution submitter address modelAddress; uint256 modelId; uint256 value; bytes input; - address disputeAddress; // the first validator submit dispute request + address disputeAddress; // the first validator submit dispute request => punishment uint40 expiredAt; InferStatus status; address creator; From 7e87567fceb450b6383a092eb3a66becbde0fbcb Mon Sep 17 00:00:00 2001 From: kochou-nbc Date: Wed, 8 May 2024 16:52:39 +0700 Subject: [PATCH 08/82] update storage --- contracts/WorkerHub.sol | 83 +++++++++++++------------ contracts/interfaces/IWorkerHub.sol | 8 +-- contracts/lib/Set.sol | 78 +++++++++++++++++++++++ contracts/lib/TransferHelper.sol | 12 ++-- contracts/storages/WorkerHubStorage.sol | 27 ++++---- 5 files changed, 139 insertions(+), 69 deletions(-) create mode 100644 contracts/lib/Set.sol diff --git a/contracts/WorkerHub.sol b/contracts/WorkerHub.sol index 3c606d5..2e359ca 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -5,7 +5,7 @@ import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/Own import {PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol"; import {ReentrancyGuardUpgradeable} from "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol"; -import {Heap} from "./lib/heap/Heap.sol"; +import {Set} from "./lib/Set.sol"; import {TransferHelper} from "./lib/TransferHelper.sol"; import {WorkerHubStorage} from "./storages/WorkerHubStorage.sol"; @@ -15,43 +15,43 @@ WorkerHubStorage, OwnableUpgradeable, PausableUpgradeable, ReentrancyGuardUpgradeable { - using Heap for Heap.AddressHeap; - using Heap for Heap.Uint256Heap; + using Set for Set.AddressSet; string constant private VERSION = "v0.0.1"; + uint256 constant private PERCENTAGE_DENOMINATOR = 100_00; receive() external payable {} function initialize( uint256 _minterMinimumStake, - uint8 _minterRequirement, - uint40 _mintingTimeLimit, uint256 _validatorMinimumStake, - uint8 _validatorRequirement, + uint40 _mintingTimeLimit, uint40 _validatingTimeLimit, - uint16 _maximumTier + uint40 _disputingTimeLimit, + uint8 _minterRequirement, + uint16 _maximumTier, + uint16 _disqualificationPercentage, + uint256 _blocksPerEpoch, + uint256 _rewardPerEpoch, + uint40 _penaltyDuration, + uint40 _unstakeDelayTime ) external initializer { __Ownable_init(); __Pausable_init(); __ReentrancyGuard_init(); minterMinimumStake = _minterMinimumStake; - minterRequirement = _minterRequirement; - mintingTimeLimit = _mintingTimeLimit; - mintingAssignmentsFront = 1; - validatorMinimumStake = _validatorMinimumStake; - validatorRequirement = _validatorRequirement; + mintingTimeLimit = _mintingTimeLimit; validatingTimeLimit = _validatingTimeLimit; - validatingAssignmentsFront = 1; - + disputingTimeLimit = _disputingTimeLimit; + minterRequirement = _minterRequirement; maximumTier = _maximumTier; - for (uint256 i = 0; i < _maximumTier; ++i) { - minterQueues[i].identifier = int64(uint64(i)); - validatorQueues[i].identifier = -int64(uint64(i)); - } - mintingTaskQueue.identifier = 1; - validatingTaskQueue.identifier = -1; + disqualificationPercentage = _disqualificationPercentage; + blocksPerEpoch = _blocksPerEpoch; + rewardPerEpoch = _rewardPerEpoch; + penaltyDuration = _penaltyDuration; + unstakeDelayTime = _unstakeDelayTime; } function version() external pure returns (string memory) { @@ -66,6 +66,29 @@ ReentrancyGuardUpgradeable { _unpause(); } + function registerModel(address _model, uint16 _tier, uint256 _minimumFee) external onlyOwner returns (uint256) { + _updateEpoch(); + + Model storage model = models[_model]; + if (model.modelId != 0) revert AlreadyRegistered(); + uint256 modelId = ++modelNumber; + model.modelId = modelId; + model.minimumFee = _minimumFee; + model.tier = _tier; + modelAddresses.insert(_model); + emit ModelRegistration(_model, modelId, _tier, _minimumFee); + return modelId; + } + + function unregisterModel(address _model) external onlyOwner { + Model storage model = models[_model]; + if (model.modelId == 0) revert NotRegistered(); + model.modelId = 0; + model.tier = 0; + modelAddresses.erase(_model); + emit ModelUnregistration(_model); + } + function registerMinter(uint16 tier) external payable { _updateEpoch(); @@ -144,26 +167,6 @@ ReentrancyGuardUpgradeable { emit ValidatorExtraStake(msg.sender, msg.value); } - function registerModel(address _model, uint16 _tier, uint256 _minimumFee) external onlyOwner returns (uint256) { - _updateEpoch(); - - Model storage model = models[_model]; - if (model.modelId != 0) revert AlreadyRegistered(); - uint256 modelId = ++modelNumber; - model.modelId = modelId; - model.minimumFee = _minimumFee; - model.tier = _tier; - emit ModelRegistration(_model, modelId, _tier, _minimumFee); - return modelId; - } - - function unregisterModel(address _model) external { - Model storage model = models[_model]; - if (model.modelId == 0) revert NotRegistered(); - model.modelId = 0; - emit ModelUnregistration(_model); - } - function infer(bytes calldata _input, address _creator) external payable returns (uint256) { Model storage model = models[msg.sender]; if (model.tier == 0) revert Unauthorized(); diff --git a/contracts/interfaces/IWorkerHub.sol b/contracts/interfaces/IWorkerHub.sol index e07de2d..358c32a 100644 --- a/contracts/interfaces/IWorkerHub.sol +++ b/contracts/interfaces/IWorkerHub.sol @@ -9,7 +9,7 @@ interface IWorkerHub is IInferable, IHeapComparator { enum InferStatus { None, Solving, - Dispute, + Disputed, Solved, Killed } @@ -42,12 +42,6 @@ interface IWorkerHub is IInferable, IHeapComparator { bytes data; } - struct Task { - uint256 inferenceId; - uint256 value; - uint8 workerRequirement; - } - struct Inference { uint256[] assignments; // assignment ids solution submitter address modelAddress; diff --git a/contracts/lib/Set.sol b/contracts/lib/Set.sol new file mode 100644 index 0000000..70ada21 --- /dev/null +++ b/contracts/lib/Set.sol @@ -0,0 +1,78 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.19; + +library Set { + struct AddressSet { + address[] values; + mapping(address => uint256) positions; + } + + error AddressSet_ValueNotFound(address value); + error AddressSet_DuplicatedValue(address value); + + function insert(AddressSet storage _set, address _value) internal { + if (_set.positions[_value] != 0) revert AddressSet_DuplicatedValue(_value); + _set.values.push(_value); + _set.positions[_value] = _set.values.length; + } + + function erase(AddressSet storage _set, address _value) internal { + uint256 p = _set.positions[_value]; + if (p == 0) revert AddressSet_ValueNotFound(_value); + unchecked { + _set.values[p - 1] = _set.values[_set.values.length - 1]; + _set.positions[_set.values[p - 1]] = p; + } + _set.values.pop(); + _set.positions[_value] = 0; + } + + function hasValue(AddressSet storage _set, address _value) internal view returns (bool) { + return _set.positions[_value] != 0; + } + + function isEmpty(AddressSet storage _set) internal view returns (bool) { + return _set.values.length == 0; + } + + function size(AddressSet storage _set) internal view returns (uint256) { + return _set.values.length; + } + + struct Uint256Set { + uint256[] values; + mapping(uint256 => uint256) positions; + } + + error Uint256Set_ValueNotFound(uint256 value); + error Uint256Set_DuplicatedValue(uint256 value); + + function insert(Uint256Set storage _set, uint256 _value) internal { + if (_set.positions[_value] != 0) revert Uint256Set_DuplicatedValue(_value); + _set.values.push(_value); + _set.positions[_value] = _set.values.length; + } + + function erase(Uint256Set storage _set, uint256 _value) internal { + uint256 p = _set.positions[_value]; + if (p == 0) revert Uint256Set_ValueNotFound(_value); + unchecked { + _set.values[p - 1] = _set.values[_set.values.length - 1]; + _set.positions[_set.values[p - 1]] = p; + } + _set.values.pop(); + _set.positions[_value] = 0; + } + + function hasValue(Uint256Set storage _set, uint256 _value) internal view returns (bool) { + return _set.positions[_value] != 0; + } + + function isEmpty(Uint256Set storage _set) internal view returns (bool) { + return _set.values.length == 0; + } + + function size(Uint256Set storage _set) internal view returns (uint256) { + return _set.values.length; + } +} diff --git a/contracts/lib/TransferHelper.sol b/contracts/lib/TransferHelper.sol index a4149c3..f071c9a 100644 --- a/contracts/lib/TransferHelper.sol +++ b/contracts/lib/TransferHelper.sol @@ -2,9 +2,9 @@ pragma solidity ^0.8.0; library TransferHelper { - bytes4 constant private APPROVE_SELECTOR = bytes4(keccak256(bytes('approve(address,uint256)'))); - bytes4 constant private TRANSFER_SELECTOR = bytes4(keccak256(bytes('transfer(address,uint256)'))); - bytes4 constant private TRANSFER_FROM_SELECTOR = bytes4(keccak256(bytes('transferFrom(address,address,uint256)'))); + bytes4 constant private SELECTOR_APPROVE = bytes4(keccak256(bytes('approve(address,uint256)'))); + bytes4 constant private SELECTOR_TRANSFER = bytes4(keccak256(bytes('transfer(address,uint256)'))); + bytes4 constant private SELECTOR_TRANSFER_FROM = bytes4(keccak256(bytes('transferFrom(address,address,uint256)'))); error FailedApproval(); error FailedTransfer(); @@ -16,7 +16,7 @@ library TransferHelper { ) internal { (bool success, bytes memory data) = _token.call( abi.encodeWithSelector( - TRANSFER_SELECTOR, + SELECTOR_TRANSFER, _to, _value ) @@ -33,7 +33,7 @@ library TransferHelper { ) internal { (bool success, bytes memory data) = _token.call( abi.encodeWithSelector( - TRANSFER_SELECTOR, + SELECTOR_TRANSFER, _to, _value ) @@ -51,7 +51,7 @@ library TransferHelper { ) internal { (bool success, bytes memory data) = _token.call( abi.encodeWithSelector( - TRANSFER_FROM_SELECTOR, + SELECTOR_TRANSFER_FROM, _from, _to, _value diff --git a/contracts/storages/WorkerHubStorage.sol b/contracts/storages/WorkerHubStorage.sol index 66f7dcf..1d95619 100644 --- a/contracts/storages/WorkerHubStorage.sol +++ b/contracts/storages/WorkerHubStorage.sol @@ -4,40 +4,35 @@ pragma solidity ^0.8.0; import {IWorkerHub} from "../interfaces/IWorkerHub.sol"; import {Heap} from "../lib/heap/Heap.sol"; +import {Set} from "../lib/Set.sol"; abstract contract WorkerHubStorage is IWorkerHub { - uint256 public mintingAssignmentsFront; - uint256 public mintingAssignmentsRear; + uint256 public mintingAssignmentNumber; mapping(uint256 => Assignment) internal mintingAssignments; - uint256 public validatingAssignmentsFront; - uint256 public validatingAssignmentsRear; - mapping(uint256 => Assignment) internal validatingAssignments; - uint256 public modelNumber; mapping(address => Model) public models; + mapping(address => Worker) public minters; + mapping(address => Worker) public validators; uint256 public inferenceNumber; mapping(uint256 => Inference) internal inferences; - uint256 public taskNumber; - mapping(uint256 => Task) internal tasks; - Heap.Uint256Heap internal mintingTaskQueue; - Heap.Uint256Heap internal validatingTaskQueue; - - mapping(address => Worker) public minters; - mapping(address => Worker) public validators; - mapping(uint256 => Heap.AddressHeap) internal minterQueues; - mapping(uint256 => Heap.AddressHeap) internal validatorQueues; + Set.AddressSet internal modelAddresses; + Set.AddressSet internal minterAddresses; + Set.AddressSet internal validatorAddresses; uint256 public minterMinimumStake; uint256 public validatorMinimumStake; uint40 public mintingTimeLimit; uint40 public validatingTimeLimit; + uint40 public disputingTimeLimit; + uint40 public penaltyDuration; + uint40 public unstakeDelayTime; uint8 public minterRequirement; - uint8 public validatorRequirement; uint16 public maximumTier; + uint16 public disqualificationPercentage; // validator mapping validator => assigment id => boolean mapping(address => mapping(uint256 => bool)) public validatorDisputed; From 6c6503c28946367da44bbf46cfce757e60c73bb7 Mon Sep 17 00:00:00 2001 From: kochou-nbc Date: Wed, 8 May 2024 16:54:10 +0700 Subject: [PATCH 09/82] minor --- contracts/WorkerHub.sol | 5 ----- contracts/interfaces/IWorkerHub.sol | 1 + 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/contracts/WorkerHub.sol b/contracts/WorkerHub.sol index 2e359ca..76f26d6 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -178,11 +178,6 @@ ReentrancyGuardUpgradeable { inference.creator = _creator; inference.modelId = model.modelId; - uint256 taskId = ++taskNumber; - Task storage task = tasks[taskId]; - task.inferenceId = inferenceId; - task.workerRequirement = minterRequirement; - emit NewInference(inferenceId, _creator, msg.value); _processMintingTasks(); diff --git a/contracts/interfaces/IWorkerHub.sol b/contracts/interfaces/IWorkerHub.sol index 358c32a..cf94947 100644 --- a/contracts/interfaces/IWorkerHub.sol +++ b/contracts/interfaces/IWorkerHub.sol @@ -44,6 +44,7 @@ interface IWorkerHub is IInferable, IHeapComparator { struct Inference { uint256[] assignments; // assignment ids solution submitter + uint256 totalValidator; address modelAddress; uint256 modelId; uint256 value; From deb110a7ddc26550db7aa381053cd7b717544923 Mon Sep 17 00:00:00 2001 From: kochou-nbc Date: Wed, 8 May 2024 16:55:19 +0700 Subject: [PATCH 10/82] minor --- contracts/interfaces/IWorkerHub.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/contracts/interfaces/IWorkerHub.sol b/contracts/interfaces/IWorkerHub.sol index cf94947..548eaa5 100644 --- a/contracts/interfaces/IWorkerHub.sol +++ b/contracts/interfaces/IWorkerHub.sol @@ -51,6 +51,7 @@ interface IWorkerHub is IInferable, IHeapComparator { bytes input; address disputeAddress; // the first validator submit dispute request => punishment uint40 expiredAt; + uint8 firstSubmitterIndex; InferStatus status; address creator; } From b6db360b5d52594ec9a113ba31c52fa5f4ac3d12 Mon Sep 17 00:00:00 2001 From: kochou-nbc Date: Wed, 8 May 2024 17:05:27 +0700 Subject: [PATCH 11/82] update storage --- contracts/storages/WorkerHubStorage.sol | 3 +++ 1 file changed, 3 insertions(+) diff --git a/contracts/storages/WorkerHubStorage.sol b/contracts/storages/WorkerHubStorage.sol index 1d95619..126f6e7 100644 --- a/contracts/storages/WorkerHubStorage.sol +++ b/contracts/storages/WorkerHubStorage.sol @@ -22,6 +22,9 @@ abstract contract WorkerHubStorage is IWorkerHub { Set.AddressSet internal minterAddresses; Set.AddressSet internal validatorAddresses; + mapping(address => Set.AddressSet) internal minterAddressesByModel; + mapping(address => Set.AddressSet) internal validatorAddressesByModel; + uint256 public minterMinimumStake; uint256 public validatorMinimumStake; uint40 public mintingTimeLimit; From a80223c1594724e7e8e23b101971de8d07545aff Mon Sep 17 00:00:00 2001 From: 180945 <180945@trustless.computer> Date: Wed, 8 May 2024 18:58:32 +0700 Subject: [PATCH 12/82] added claim reward --- contracts/WorkerHub.sol | 74 +++++++++++++++++++++---- contracts/interfaces/IWorkerHub.sol | 15 +++++ contracts/storages/WorkerHubStorage.sol | 3 +- 3 files changed, 80 insertions(+), 12 deletions(-) diff --git a/contracts/WorkerHub.sol b/contracts/WorkerHub.sol index 76f26d6..0509c1d 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -32,7 +32,7 @@ ReentrancyGuardUpgradeable { uint16 _maximumTier, uint16 _disqualificationPercentage, uint256 _blocksPerEpoch, - uint256 _rewardPerEpoch, + uint256 _rewardPerEpochBasedOnPerf, uint40 _penaltyDuration, uint40 _unstakeDelayTime ) external initializer { @@ -49,7 +49,7 @@ ReentrancyGuardUpgradeable { maximumTier = _maximumTier; disqualificationPercentage = _disqualificationPercentage; blocksPerEpoch = _blocksPerEpoch; - rewardPerEpoch = _rewardPerEpoch; + rewardPerEpochBasedOnPerf = _rewardPerEpochBasedOnPerf; penaltyDuration = _penaltyDuration; unstakeDelayTime = _unstakeDelayTime; } @@ -100,6 +100,7 @@ ReentrancyGuardUpgradeable { minter.stake = msg.value; minter.tier = tier; + minter.lastClaimedEpoch = currentEpoch; emit MinterRegistration(msg.sender, tier, msg.value, block.timestamp); } @@ -116,6 +117,9 @@ ReentrancyGuardUpgradeable { TransferHelper.safeTransferNative(msg.sender, minter.stake); minter.stake = 0; + // claim reward + claimReward(msg.sender); + emit MinterUnregistration(msg.sender); } @@ -194,7 +198,7 @@ ReentrancyGuardUpgradeable { if (block.number - lastBlock >= blocksPerEpoch) { currentEpoch++; lastBlock = block.number; - rewardInEpoch[currentEpoch].totalReward = rewardPerEpoch; + rewardInEpoch[currentEpoch].totalReward = rewardPerEpochBasedOnPerf; } } @@ -216,11 +220,33 @@ ReentrancyGuardUpgradeable { _updateEpoch(); } + function _handleDisputeSuccess(uint256 _inferId) internal { + // + + } + // todo // validator notice result from minter incorrect and trigger dispute function disputeInfer(uint256 _assignmentId) public virtual { - _updateEpoch(); - +// _updateEpoch(); +// +// require(validators[msg.sender].stake != 0, "invalid validator"); +// +// // check infer in solving status or dispute +// Assignment storage assignment = validatingAssignments[_assignmentId]; +// Inference storage infer = inferences[assignment.inferenceId]; +// +// require(infer.status == InferStatus.Dispute && block.timestamp < infer.expiredAt, "not in dispute phase or expired"); +// require(!validatorDisputed[msg.sender][_assignmentId], "voted"); +// validatorDisputed[msg.sender][_assignmentId] = true; +// assignment.disapproval++; +// +// // handle vote > 1/3 total validator +// if (true) { +// _handleDisputeSuccess(assignment.inferenceId); +// } +// +// emit DisputeInfer(msg.sender, _assignmentId); } // todo @@ -241,26 +267,52 @@ ReentrancyGuardUpgradeable { // todo // minter claim reward - function claimReward() public virtual { + function claimReward(address _minter) public virtual nonReentrant { _updateEpoch(); + uint256 rewardAmount = getRewardToClaim(_minter); + if (rewardAmount > 0) { + TransferHelper.safeTransferNative(_minter, rewardAmount); + + emit ClaimReward(_minter, rewardAmount); + } + minters[msg.sender].lastClaimedEpoch = currentEpoch; } - // todo + // @dev admin functions function setNewRewardInEpoch(uint256 _newRewardAmount) public virtual onlyOwner { _updateEpoch(); + emit RewardPerEpoch(rewardPerEpoch, _newRewardAmount); + rewardPerEpoch = _newRewardAmount; + } + + function setNewRewardInEpochBasedOnPerf(uint256 _newRewardAmount) public virtual onlyOwner { + _updateEpoch(); + emit RewardPerEpochBasedOnPerf(rewardPerEpoch, _newRewardAmount); + + rewardPerEpochBasedOnPerf = _newRewardAmount; } - // todo function setBlocksPerEpoch(uint256 _blocks) public virtual onlyOwner { _updateEpoch(); + emit BlocksPerEpoch(blocksPerEpoch, _blocks); + + blocksPerEpoch = _blocks; } // sum reward of an minter since last claimed epoch function getRewardToClaim(address _minter) public view virtual returns(uint256 totalReward) { - uint96 lastClaimed = minters[_minter].lastClaimedEpoch; - for (lastClaimed += 1; lastClaimed < currentEpoch; lastClaimed++) { - totalReward += rewardInEpoch[uint256(lastClaimed)].totalReward * minterTaskCompleted[_minter][uint256(lastClaimed)] / uint256(rewardInEpoch[uint256(lastClaimed)].totalTaskCompleted) ; + if (minters[_minter].stake < minterMinimumStake || currentEpoch <= minters[_minter].lastClaimedEpoch) { + totalReward = 0; + } else { + uint96 lastClaimed = minters[_minter].lastClaimedEpoch; + for (; lastClaimed < currentEpoch; lastClaimed++) { + totalReward += rewardInEpoch[uint256(lastClaimed)].totalReward * minterTaskCompleted[_minter][uint256(lastClaimed)] / uint256(rewardInEpoch[uint256(lastClaimed)].totalTaskCompleted); + } + + if (rewardPerEpoch > 0) { + totalReward += (currentEpoch - minters[_minter].lastClaimedEpoch) * rewardPerEpoch; + } } } } diff --git a/contracts/interfaces/IWorkerHub.sol b/contracts/interfaces/IWorkerHub.sol index 548eaa5..04312d5 100644 --- a/contracts/interfaces/IWorkerHub.sol +++ b/contracts/interfaces/IWorkerHub.sol @@ -112,6 +112,21 @@ interface IWorkerHub is IInferable, IHeapComparator { uint256 _amount ); + event RewardPerEpoch( + uint256 _oldReward, + uint256 _newReward + ); + + event RewardPerEpochBasedOnPerf( + uint256 _oldReward, + uint256 _newReward + ); + + event BlocksPerEpoch( + uint256 _oldBlocks, + uint256 _newBlocks + ); + error AlreadyRegistered(); error NotRegistered(); error Unauthorized(); diff --git a/contracts/storages/WorkerHubStorage.sol b/contracts/storages/WorkerHubStorage.sol index 1d95619..5fcf58f 100644 --- a/contracts/storages/WorkerHubStorage.sol +++ b/contracts/storages/WorkerHubStorage.sol @@ -39,8 +39,9 @@ abstract contract WorkerHubStorage is IWorkerHub { // reward purpose uint256 public blocksPerEpoch; - uint256 public currentEpoch; + uint96 public currentEpoch; uint256 public lastBlock; + uint256 public rewardPerEpochBasedOnPerf; uint256 public rewardPerEpoch; // mapping total task completed in epoch and reward per epoch From 98eec641496f19bc7c10f5ab949786359342a5ed Mon Sep 17 00:00:00 2001 From: 180945 <180945@trustless.computer> Date: Wed, 8 May 2024 19:03:15 +0700 Subject: [PATCH 13/82] fixed --- contracts/WorkerHub.sol | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/contracts/WorkerHub.sol b/contracts/WorkerHub.sol index 0509c1d..1a96165 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -265,17 +265,16 @@ ReentrancyGuardUpgradeable { _updateEpoch(); } - // todo // minter claim reward function claimReward(address _minter) public virtual nonReentrant { _updateEpoch(); uint256 rewardAmount = getRewardToClaim(_minter); + minters[msg.sender].lastClaimedEpoch = currentEpoch; if (rewardAmount > 0) { TransferHelper.safeTransferNative(_minter, rewardAmount); emit ClaimReward(_minter, rewardAmount); } - minters[msg.sender].lastClaimedEpoch = currentEpoch; } // @dev admin functions @@ -307,7 +306,10 @@ ReentrancyGuardUpgradeable { } else { uint96 lastClaimed = minters[_minter].lastClaimedEpoch; for (; lastClaimed < currentEpoch; lastClaimed++) { - totalReward += rewardInEpoch[uint256(lastClaimed)].totalReward * minterTaskCompleted[_minter][uint256(lastClaimed)] / uint256(rewardInEpoch[uint256(lastClaimed)].totalTaskCompleted); + uint256 totalTaskCompleted = uint256(rewardInEpoch[uint256(lastClaimed)].totalTaskCompleted); + if (totalTaskCompleted != 0) { + totalReward += rewardInEpoch[uint256(lastClaimed)].totalReward * minterTaskCompleted[_minter][uint256(lastClaimed)] / totalTaskCompleted; + } } if (rewardPerEpoch > 0) { From 98ed6efd82d9ed8996acab53c3f189da98f823cf Mon Sep 17 00:00:00 2001 From: kelvin2608 <2608@newbitcoincity.com> Date: Wed, 8 May 2024 19:59:10 +0700 Subject: [PATCH 14/82] Completed: The 'submit solution' function for the minter. --- contracts/WorkerHub.sol | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/contracts/WorkerHub.sol b/contracts/WorkerHub.sol index 1a96165..d4e53a4 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -218,6 +218,36 @@ ReentrancyGuardUpgradeable { // minter submit result for specific infer function submitSolution(uint256 _assigmentId, bytes calldata _data) public virtual { _updateEpoch(); + //Check _assigmentId exist + Assignment storage assignment = mintingAssignments[_assigmentId]; + + if (msg.sender != assignment.worker) revert("Sender is invalid"); + + assignment.data = _data; + + Inference storage inference = inferences[assignment.inferenceId]; + + // if inference.status is not None, the Tx will fail. + if (inference.status != InferStatus.None) { + revert("Assignment already submitted"); + } + + if (inference.expiredAt > block.timestamp) { + revert("Expire time"); + } + + inference.status = InferStatus.Solving; + uint256[] memory clonedAssignments = inference.assignments; + uint256 assignmentsLen = clonedAssignments.length; + + for (uint8 i = 0; i < assignmentsLen; i++) { + if (clonedAssignments[i] == _assigmentId) { + inference.firstSubmitterIndex = i; + break; + } + } + + emit SubmitSolution(msg.sender, _assigmentId); } function _handleDisputeSuccess(uint256 _inferId) internal { From 85cc09358ffaf3d58da1549a350b5ffb8e2675fc Mon Sep 17 00:00:00 2001 From: 180945 <180945@trustless.computer> Date: Thu, 9 May 2024 02:25:36 +0700 Subject: [PATCH 15/82] tested --- .gitignore | 2 + .gitmodules | 3 + contracts/WorkerHub.sol | 53 +++++---- contracts/interfaces/IWorkerHub.sol | 5 +- foundry.toml | 9 ++ lib/forge-std | 1 + package-lock.json | 13 +++ package.json | 1 + tests/Test.t.sol | 162 ++++++++++++++++++++++++++++ 9 files changed, 228 insertions(+), 21 deletions(-) create mode 100644 .gitmodules create mode 100644 foundry.toml create mode 160000 lib/forge-std create mode 100644 tests/Test.t.sol diff --git a/.gitignore b/.gitignore index fee1324..3383f75 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,5 @@ artifacts _data _models _outputs +cache_forge +out \ No newline at end of file diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..888d42d --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "lib/forge-std"] + path = lib/forge-std + url = https://github.com/foundry-rs/forge-std diff --git a/contracts/WorkerHub.sol b/contracts/WorkerHub.sol index 1a96165..2ae0aa6 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -118,7 +118,7 @@ ReentrancyGuardUpgradeable { minter.stake = 0; // claim reward - claimReward(msg.sender); + _claimReward(msg.sender); emit MinterUnregistration(msg.sender); } @@ -194,11 +194,19 @@ ReentrancyGuardUpgradeable { } // this internal function update new epoch - function _updateEpoch() private { - if (block.number - lastBlock >= blocksPerEpoch) { - currentEpoch++; + function _updateEpoch() internal { + if (blocksPerEpoch > 0) { + uint epochPassed = (block.number - lastBlock) / blocksPerEpoch; + if (epochPassed > 0) { + for (; epochPassed > 0; epochPassed--) { + currentEpoch++; + rewardInEpoch[currentEpoch].perfReward = rewardPerEpochBasedOnPerf; + rewardInEpoch[currentEpoch].epochReward = rewardPerEpoch; + } + lastBlock = block.number; + } + } else { lastBlock = block.number; - rewardInEpoch[currentEpoch].totalReward = rewardPerEpochBasedOnPerf; } } @@ -265,11 +273,9 @@ ReentrancyGuardUpgradeable { _updateEpoch(); } - // minter claim reward - function claimReward(address _minter) public virtual nonReentrant { - _updateEpoch(); + function _claimReward(address _minter) internal { uint256 rewardAmount = getRewardToClaim(_minter); - minters[msg.sender].lastClaimedEpoch = currentEpoch; + minters[_minter].lastClaimedEpoch = currentEpoch; if (rewardAmount > 0) { TransferHelper.safeTransferNative(_minter, rewardAmount); @@ -277,6 +283,12 @@ ReentrancyGuardUpgradeable { } } + // minter claim reward + function claimReward(address _minter) public virtual nonReentrant { + _updateEpoch(); + _claimReward(_minter); + } + // @dev admin functions function setNewRewardInEpoch(uint256 _newRewardAmount) public virtual onlyOwner { _updateEpoch(); @@ -301,19 +313,22 @@ ReentrancyGuardUpgradeable { // sum reward of an minter since last claimed epoch function getRewardToClaim(address _minter) public view virtual returns(uint256 totalReward) { - if (minters[_minter].stake < minterMinimumStake || currentEpoch <= minters[_minter].lastClaimedEpoch) { + uint lastEpoch = (blocksPerEpoch != 0 ? (block.number - lastBlock) / blocksPerEpoch : 0) + currentEpoch; + if (minters[_minter].stake <= 0 || lastEpoch <= minters[_minter].lastClaimedEpoch) { totalReward = 0; } else { - uint96 lastClaimed = minters[_minter].lastClaimedEpoch; - for (; lastClaimed < currentEpoch; lastClaimed++) { - uint256 totalTaskCompleted = uint256(rewardInEpoch[uint256(lastClaimed)].totalTaskCompleted); - if (totalTaskCompleted != 0) { - totalReward += rewardInEpoch[uint256(lastClaimed)].totalReward * minterTaskCompleted[_minter][uint256(lastClaimed)] / totalTaskCompleted; + uint256 lastClaimed = uint256(minters[_minter].lastClaimedEpoch); + uint perfReward; + uint epochReward; + for (; lastClaimed < lastEpoch; lastClaimed++) { + uint256 totalTaskCompleted = rewardInEpoch[lastClaimed].totalTaskCompleted; + // reward at epoch + (perfReward, epochReward) = lastClaimed > currentEpoch ? (rewardPerEpochBasedOnPerf, rewardPerEpoch) : + (rewardInEpoch[lastClaimed].perfReward, rewardInEpoch[lastClaimed].epochReward); + if (totalTaskCompleted > 0) { + totalReward += perfReward * minterTaskCompleted[_minter][lastClaimed] / totalTaskCompleted; } - } - - if (rewardPerEpoch > 0) { - totalReward += (currentEpoch - minters[_minter].lastClaimedEpoch) * rewardPerEpoch; + totalReward += epochReward; } } } diff --git a/contracts/interfaces/IWorkerHub.sol b/contracts/interfaces/IWorkerHub.sol index 04312d5..49b24b9 100644 --- a/contracts/interfaces/IWorkerHub.sol +++ b/contracts/interfaces/IWorkerHub.sol @@ -15,8 +15,9 @@ interface IWorkerHub is IInferable, IHeapComparator { } struct MinterEpochState { - uint256 totalReward; - uint96 totalTaskCompleted; + uint256 perfReward; + uint256 epochReward; + uint256 totalTaskCompleted; } struct Model { diff --git a/foundry.toml b/foundry.toml new file mode 100644 index 0000000..ebe58d8 --- /dev/null +++ b/foundry.toml @@ -0,0 +1,9 @@ +[profile.default] +src = 'contracts' +out = 'out' +libs = ['node_modules', 'lib'] +test = 'tests' +cache_path = 'cache_forge' + +[fuzz] +runs = 0 \ No newline at end of file diff --git a/lib/forge-std b/lib/forge-std new file mode 160000 index 0000000..978ac6f --- /dev/null +++ b/lib/forge-std @@ -0,0 +1 @@ +Subproject commit 978ac6fadb62f5f0b723c996f64be52eddba6801 diff --git a/package-lock.json b/package-lock.json index 80607c6..f34d39f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,7 @@ "@ethersproject/experimental": "^5.7.0", "@foundry-rs/hardhat-anvil": "^0.1.7", "@nomicfoundation/hardhat-chai-matchers": "^1.0.6", + "@nomicfoundation/hardhat-foundry": "^1.1.1", "@nomicfoundation/hardhat-network-helpers": "^1.0.10", "@nomicfoundation/hardhat-toolbox": "^2.0.2", "@nomiclabs/hardhat-etherscan": "^3.1.8", @@ -1715,6 +1716,18 @@ "hardhat": "^2.9.4" } }, + "node_modules/@nomicfoundation/hardhat-foundry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-foundry/-/hardhat-foundry-1.1.1.tgz", + "integrity": "sha512-cXGCBHAiXas9Pg9MhMOpBVQCkWRYoRFG7GJJAph+sdQsfd22iRs5U5Vs9XmpGEQd1yEvYISQZMeE68Nxj65iUQ==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2" + }, + "peerDependencies": { + "hardhat": "^2.17.2" + } + }, "node_modules/@nomicfoundation/hardhat-network-helpers": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.10.tgz", diff --git a/package.json b/package.json index dfa9eaf..d70f725 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "@ethersproject/experimental": "^5.7.0", "@foundry-rs/hardhat-anvil": "^0.1.7", "@nomicfoundation/hardhat-chai-matchers": "^1.0.6", + "@nomicfoundation/hardhat-foundry": "^1.1.1", "@nomicfoundation/hardhat-network-helpers": "^1.0.10", "@nomicfoundation/hardhat-toolbox": "^2.0.2", "@nomiclabs/hardhat-etherscan": "^3.1.8", diff --git a/tests/Test.t.sol b/tests/Test.t.sol new file mode 100644 index 0000000..37c97e6 --- /dev/null +++ b/tests/Test.t.sol @@ -0,0 +1,162 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.0; + +import "forge-std/Test.sol"; +import "../contracts/WorkerHub.sol"; + +contract Mockup is WorkerHub { + + function setMinerTaskCompleteInEpoch(address miner, uint epoch, uint totalCompleted) public { + _updateEpoch(); + + minterTaskCompleted[miner][epoch] = totalCompleted; + } + + function setTotalTaskCompleteInEpoch(uint epoch, uint totalCompleted) public { + _updateEpoch(); + + rewardInEpoch[epoch].totalTaskCompleted = totalCompleted; + } + +} + +contract WorkHubTest is Test { + Mockup workerHub; + address public constant ADMIN_ADDR = address(10); + address public constant Miner1 = address(101); + address public constant Miner2 = address(102); + address public constant Miner3 = address(103); + + function setUp() public { + workerHub = new Mockup(); + + vm.prank(ADMIN_ADDR); + workerHub.initialize( + 1e18, + 1e18, + 1, + 1, + 1, + 1, + 1, + 1, + 10, + 1e18, + 1 days, + 21 days + ); + + vm.prank(ADMIN_ADDR); + workerHub.setNewRewardInEpoch(1e16); + } + + function testRewards() public { + vm.deal(Miner1, 2e18); + vm.deal(Miner2, 2e18); + vm.deal(Miner3, 2e18); + + // init block height + vm.roll(10); + vm.prank(Miner1); + workerHub.registerMinter{value: 1e18}(1); + + vm.prank(Miner2); + workerHub.registerMinter{value: 1e18}(1); + + vm.prank(Miner3); + workerHub.registerMinter{value: 1e18}(1); + + assertEq(workerHub.currentEpoch(), 1); + assertEq(workerHub.getRewardToClaim(Miner1), 0); + assertEq(workerHub.getRewardToClaim(Miner2), 0); + assertEq(workerHub.getRewardToClaim(Miner3), 0); + (uint256 pefReward, uint256 epochReward, uint256 totalTaskCompleted) = workerHub.rewardInEpoch(1); + assertEq(pefReward, 1e18); + assertEq(totalTaskCompleted, 0); + assertEq(workerHub.rewardPerEpoch(), 1e16); + assertEq(workerHub.lastBlock(), 10); + + // create some data for 2 epochs sequence + vm.roll(30); + assertEq(workerHub.getRewardToClaim(Miner1), 20000000000000000); + assertEq(workerHub.getRewardToClaim(Miner2), 20000000000000000); + assertEq(workerHub.getRewardToClaim(Miner3), 20000000000000000); + + // setup task totalTaskCompleted + // epoch 1 + workerHub.setMinerTaskCompleteInEpoch(Miner1, 1, 6); + workerHub.setMinerTaskCompleteInEpoch(Miner2, 1, 1); + workerHub.setMinerTaskCompleteInEpoch(Miner3, 1, 3); + workerHub.setTotalTaskCompleteInEpoch(1, 10); + + (pefReward, epochReward, totalTaskCompleted) = workerHub.rewardInEpoch(1); + assertEq(pefReward, 1e18); + assertEq(totalTaskCompleted, 10); + + // epoch 2 + workerHub.setMinerTaskCompleteInEpoch(Miner1, 2, 3); + workerHub.setMinerTaskCompleteInEpoch(Miner2, 2, 0); + workerHub.setMinerTaskCompleteInEpoch(Miner3, 2, 7); + workerHub.setTotalTaskCompleteInEpoch(2, 10); + + (pefReward, epochReward, totalTaskCompleted) = workerHub.rewardInEpoch(2); + assertEq(pefReward, 1e18); + assertEq(totalTaskCompleted, 10); + + assertEq(workerHub.getRewardToClaim(Miner1), 920000000000000000); + assertEq(workerHub.getRewardToClaim(Miner2), 120000000000000000); + assertEq(workerHub.getRewardToClaim(Miner3), 1020000000000000000); + + vm.deal(address(workerHub), address(workerHub).balance + 2e18); + // claim reward + workerHub.claimReward(Miner1); + workerHub.claimReward(Miner2); + workerHub.claimReward(Miner3); + + assertEq(Miner1.balance, 920000000000000000 + 1e18); + assertEq(Miner2.balance, 120000000000000000 + 1e18); + assertEq(Miner3.balance, 1020000000000000000 + 1e18); + + assertEq(workerHub.getRewardToClaim(Miner1), 0); + assertEq(workerHub.getRewardToClaim(Miner2), 0); + assertEq(workerHub.getRewardToClaim(Miner3), 0); + + workerHub.claimReward(Miner1); + workerHub.claimReward(Miner2); + workerHub.claimReward(Miner3); + + assertEq(Miner1.balance, 920000000000000000 + 1e18); + assertEq(Miner2.balance, 120000000000000000 + 1e18); + assertEq(Miner3.balance, 1020000000000000000 + 1e18); + + // test miner request unstake + vm.prank(Miner1); + workerHub.unregisterMinter(); + assertEq(Miner1.balance, 920000000000000000 + 2e18); + + vm.startPrank(Miner1); + vm.roll(50); + assertEq(workerHub.getRewardToClaim(Miner1), 0); + workerHub.claimReward(Miner1); + assertEq(Miner1.balance, 920000000000000000 + 2e18); + workerHub.registerMinter{value: 1e18}(1); + assertEq(workerHub.getRewardToClaim(Miner1), 0); + workerHub.claimReward(Miner1); + assertEq(Miner1.balance, 920000000000000000 + 1e18); + workerHub.unregisterMinter(); + assertEq(workerHub.getRewardToClaim(Miner1), 0); + workerHub.claimReward(Miner1); + assertEq(Miner1.balance, 920000000000000000 + 2e18); + workerHub.registerMinter{value: 1e18}(1); + vm.roll(55); + assertEq(workerHub.getRewardToClaim(Miner1), 0); + workerHub.claimReward(Miner1); + assertEq(Miner1.balance, 920000000000000000 + 1e18); + vm.roll(60); + assertEq(workerHub.getRewardToClaim(Miner1), 1e16); + workerHub.claimReward(Miner1); + assertEq(Miner1.balance, 920000000000000000 + 1e18 + 1e16); + assertEq(workerHub.getRewardToClaim(Miner1), 0); + vm.stopPrank(); + } +} \ No newline at end of file From 87ab01cc76958fc2a043a90a62e49c1761779f87 Mon Sep 17 00:00:00 2001 From: 180945 <180945@trustless.computer> Date: Thu, 9 May 2024 08:23:37 +0700 Subject: [PATCH 16/82] update follow spec --- contracts/WorkerHub.sol | 28 ++++++---- contracts/interfaces/IWorkerHub.sol | 1 + contracts/storages/WorkerHubStorage.sol | 1 + tests/Test.t.sol | 69 +++++++++++++------------ 4 files changed, 57 insertions(+), 42 deletions(-) diff --git a/contracts/WorkerHub.sol b/contracts/WorkerHub.sol index e2d4ec3..a7a2162 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -101,6 +101,7 @@ ReentrancyGuardUpgradeable { minter.stake = msg.value; minter.tier = tier; minter.lastClaimedEpoch = currentEpoch; + minterNumber++; emit MinterRegistration(msg.sender, tier, msg.value, block.timestamp); } @@ -113,6 +114,7 @@ ReentrancyGuardUpgradeable { if (minter.currentTaskId != 0) revert MintingSessionNotEnded(); minter.tier = 0; + minterNumber--; TransferHelper.safeTransferNative(msg.sender, minter.stake); minter.stake = 0; @@ -199,6 +201,7 @@ ReentrancyGuardUpgradeable { uint epochPassed = (block.number - lastBlock) / blocksPerEpoch; if (epochPassed > 0) { for (; epochPassed > 0; epochPassed--) { + rewardInEpoch[currentEpoch].totalMinter = minterNumber; currentEpoch++; rewardInEpoch[currentEpoch].perfReward = rewardPerEpochBasedOnPerf; rewardInEpoch[currentEpoch].epochReward = rewardPerEpoch; @@ -304,7 +307,7 @@ ReentrancyGuardUpgradeable { } function _claimReward(address _minter) internal { - uint256 rewardAmount = getRewardToClaim(_minter); + uint256 rewardAmount = rewardToClaim(_minter); minters[_minter].lastClaimedEpoch = currentEpoch; if (rewardAmount > 0) { TransferHelper.safeTransferNative(_minter, rewardAmount); @@ -315,7 +318,6 @@ ReentrancyGuardUpgradeable { // minter claim reward function claimReward(address _minter) public virtual nonReentrant { - _updateEpoch(); _claimReward(_minter); } @@ -336,29 +338,37 @@ ReentrancyGuardUpgradeable { function setBlocksPerEpoch(uint256 _blocks) public virtual onlyOwner { _updateEpoch(); + require(_blocks > 0, "invalid blocks value"); + emit BlocksPerEpoch(blocksPerEpoch, _blocks); blocksPerEpoch = _blocks; } // sum reward of an minter since last claimed epoch - function getRewardToClaim(address _minter) public view virtual returns(uint256 totalReward) { - uint lastEpoch = (blocksPerEpoch != 0 ? (block.number - lastBlock) / blocksPerEpoch : 0) + currentEpoch; + function rewardToClaim(address _minter) public virtual returns(uint256 totalReward) { + _updateEpoch(); + + uint lastEpoch = currentEpoch; if (minters[_minter].stake <= 0 || lastEpoch <= minters[_minter].lastClaimedEpoch) { totalReward = 0; } else { uint256 lastClaimed = uint256(minters[_minter].lastClaimedEpoch); uint perfReward; uint epochReward; + uint currentMinter; for (; lastClaimed < lastEpoch; lastClaimed++) { - uint256 totalTaskCompleted = rewardInEpoch[lastClaimed].totalTaskCompleted; + MinterEpochState memory state = rewardInEpoch[lastClaimed]; + uint256 totalTaskCompleted = state.totalTaskCompleted; // reward at epoch - (perfReward, epochReward) = lastClaimed > currentEpoch ? (rewardPerEpochBasedOnPerf, rewardPerEpoch) : - (rewardInEpoch[lastClaimed].perfReward, rewardInEpoch[lastClaimed].epochReward); - if (totalTaskCompleted > 0) { + (perfReward, epochReward, currentMinter) = (state.perfReward, state.epochReward, state.totalMinter); + if (totalTaskCompleted > 0 && perfReward > 0) { totalReward += perfReward * minterTaskCompleted[_minter][lastClaimed] / totalTaskCompleted; } - totalReward += epochReward; + + if (currentMinter > 0 && epochReward > 0) { + totalReward += epochReward / currentMinter; + } } } } diff --git a/contracts/interfaces/IWorkerHub.sol b/contracts/interfaces/IWorkerHub.sol index 49b24b9..55b33ef 100644 --- a/contracts/interfaces/IWorkerHub.sol +++ b/contracts/interfaces/IWorkerHub.sol @@ -18,6 +18,7 @@ interface IWorkerHub is IInferable, IHeapComparator { uint256 perfReward; uint256 epochReward; uint256 totalTaskCompleted; + uint256 totalMinter; } struct Model { diff --git a/contracts/storages/WorkerHubStorage.sol b/contracts/storages/WorkerHubStorage.sol index 10b1518..3b327e2 100644 --- a/contracts/storages/WorkerHubStorage.sol +++ b/contracts/storages/WorkerHubStorage.sol @@ -12,6 +12,7 @@ abstract contract WorkerHubStorage is IWorkerHub { uint256 public modelNumber; mapping(address => Model) public models; + uint256 public minterNumber; mapping(address => Worker) public minters; mapping(address => Worker) public validators; diff --git a/tests/Test.t.sol b/tests/Test.t.sol index 37c97e6..30a9c61 100644 --- a/tests/Test.t.sol +++ b/tests/Test.t.sol @@ -66,21 +66,24 @@ contract WorkHubTest is Test { vm.prank(Miner3); workerHub.registerMinter{value: 1e18}(1); + assertEq(workerHub.minterNumber(), 3); + assertEq(workerHub.currentEpoch(), 1); - assertEq(workerHub.getRewardToClaim(Miner1), 0); - assertEq(workerHub.getRewardToClaim(Miner2), 0); - assertEq(workerHub.getRewardToClaim(Miner3), 0); - (uint256 pefReward, uint256 epochReward, uint256 totalTaskCompleted) = workerHub.rewardInEpoch(1); + assertEq(workerHub.rewardToClaim(Miner1), 0); + assertEq(workerHub.rewardToClaim(Miner2), 0); + assertEq(workerHub.rewardToClaim(Miner3), 0); + (uint256 pefReward, uint256 epochReward, uint256 totalTaskCompleted, uint256 totalMinter) = workerHub.rewardInEpoch(1); assertEq(pefReward, 1e18); + assertEq(epochReward, 1e16); assertEq(totalTaskCompleted, 0); assertEq(workerHub.rewardPerEpoch(), 1e16); assertEq(workerHub.lastBlock(), 10); // create some data for 2 epochs sequence vm.roll(30); - assertEq(workerHub.getRewardToClaim(Miner1), 20000000000000000); - assertEq(workerHub.getRewardToClaim(Miner2), 20000000000000000); - assertEq(workerHub.getRewardToClaim(Miner3), 20000000000000000); + assertEq(workerHub.rewardToClaim(Miner1), 6666666666666666); + assertEq(workerHub.rewardToClaim(Miner2), 6666666666666666); + assertEq(workerHub.rewardToClaim(Miner3), 6666666666666666); // setup task totalTaskCompleted // epoch 1 @@ -89,7 +92,7 @@ contract WorkHubTest is Test { workerHub.setMinerTaskCompleteInEpoch(Miner3, 1, 3); workerHub.setTotalTaskCompleteInEpoch(1, 10); - (pefReward, epochReward, totalTaskCompleted) = workerHub.rewardInEpoch(1); + (pefReward, epochReward, totalTaskCompleted, totalMinter) = workerHub.rewardInEpoch(1); assertEq(pefReward, 1e18); assertEq(totalTaskCompleted, 10); @@ -99,13 +102,13 @@ contract WorkHubTest is Test { workerHub.setMinerTaskCompleteInEpoch(Miner3, 2, 7); workerHub.setTotalTaskCompleteInEpoch(2, 10); - (pefReward, epochReward, totalTaskCompleted) = workerHub.rewardInEpoch(2); + (pefReward, epochReward, totalTaskCompleted, totalMinter) = workerHub.rewardInEpoch(2); assertEq(pefReward, 1e18); assertEq(totalTaskCompleted, 10); - assertEq(workerHub.getRewardToClaim(Miner1), 920000000000000000); - assertEq(workerHub.getRewardToClaim(Miner2), 120000000000000000); - assertEq(workerHub.getRewardToClaim(Miner3), 1020000000000000000); + assertEq(workerHub.rewardToClaim(Miner1), 906666666666666666); + assertEq(workerHub.rewardToClaim(Miner2), 106666666666666666); + assertEq(workerHub.rewardToClaim(Miner3), 1006666666666666666); vm.deal(address(workerHub), address(workerHub).balance + 2e18); // claim reward @@ -113,50 +116,50 @@ contract WorkHubTest is Test { workerHub.claimReward(Miner2); workerHub.claimReward(Miner3); - assertEq(Miner1.balance, 920000000000000000 + 1e18); - assertEq(Miner2.balance, 120000000000000000 + 1e18); - assertEq(Miner3.balance, 1020000000000000000 + 1e18); + assertEq(Miner1.balance, 906666666666666666 + 1e18); + assertEq(Miner2.balance, 106666666666666666 + 1e18); + assertEq(Miner3.balance, 1006666666666666666 + 1e18); - assertEq(workerHub.getRewardToClaim(Miner1), 0); - assertEq(workerHub.getRewardToClaim(Miner2), 0); - assertEq(workerHub.getRewardToClaim(Miner3), 0); + assertEq(workerHub.rewardToClaim(Miner1), 0); + assertEq(workerHub.rewardToClaim(Miner2), 0); + assertEq(workerHub.rewardToClaim(Miner3), 0); workerHub.claimReward(Miner1); workerHub.claimReward(Miner2); workerHub.claimReward(Miner3); - assertEq(Miner1.balance, 920000000000000000 + 1e18); - assertEq(Miner2.balance, 120000000000000000 + 1e18); - assertEq(Miner3.balance, 1020000000000000000 + 1e18); + assertEq(Miner1.balance, 906666666666666666 + 1e18); + assertEq(Miner2.balance, 106666666666666666 + 1e18); + assertEq(Miner3.balance, 1006666666666666666 + 1e18); // test miner request unstake vm.prank(Miner1); workerHub.unregisterMinter(); - assertEq(Miner1.balance, 920000000000000000 + 2e18); + assertEq(Miner1.balance, 906666666666666666 + 2e18); vm.startPrank(Miner1); vm.roll(50); - assertEq(workerHub.getRewardToClaim(Miner1), 0); + assertEq(workerHub.rewardToClaim(Miner1), 0); workerHub.claimReward(Miner1); - assertEq(Miner1.balance, 920000000000000000 + 2e18); + assertEq(Miner1.balance, 906666666666666666 + 2e18); workerHub.registerMinter{value: 1e18}(1); - assertEq(workerHub.getRewardToClaim(Miner1), 0); + assertEq(workerHub.rewardToClaim(Miner1), 0); workerHub.claimReward(Miner1); - assertEq(Miner1.balance, 920000000000000000 + 1e18); + assertEq(Miner1.balance, 906666666666666666 + 1e18); workerHub.unregisterMinter(); - assertEq(workerHub.getRewardToClaim(Miner1), 0); + assertEq(workerHub.rewardToClaim(Miner1), 0); workerHub.claimReward(Miner1); - assertEq(Miner1.balance, 920000000000000000 + 2e18); + assertEq(Miner1.balance, 906666666666666666 + 2e18); workerHub.registerMinter{value: 1e18}(1); vm.roll(55); - assertEq(workerHub.getRewardToClaim(Miner1), 0); + assertEq(workerHub.rewardToClaim(Miner1), 0); workerHub.claimReward(Miner1); - assertEq(Miner1.balance, 920000000000000000 + 1e18); + assertEq(Miner1.balance, 906666666666666666 + 1e18); vm.roll(60); - assertEq(workerHub.getRewardToClaim(Miner1), 1e16); + assertEq(workerHub.rewardToClaim(Miner1), 3333333333333333); workerHub.claimReward(Miner1); - assertEq(Miner1.balance, 920000000000000000 + 1e18 + 1e16); - assertEq(workerHub.getRewardToClaim(Miner1), 0); + assertEq(Miner1.balance, 906666666666666666 + 1e18 + 3333333333333333); + assertEq(workerHub.rewardToClaim(Miner1), 0); vm.stopPrank(); } } \ No newline at end of file From 8c67a2a49fb30a44824c7d8ee650f92ca901cc39 Mon Sep 17 00:00:00 2001 From: kochou-nbc Date: Thu, 9 May 2024 08:58:09 +0700 Subject: [PATCH 17/82] update registration and inferring --- contracts/WorkerHub.sol | 161 ++++++++++----- contracts/interfaces/IWorkerHub.sol | 34 +-- contracts/lib/Queue.sol | 43 ++++ contracts/lib/Random.sol | 17 ++ contracts/lib/heap/Heap.sol | 264 ------------------------ contracts/lib/heap/IHeapComparator.sol | 8 - contracts/storages/WorkerHubStorage.sol | 14 +- 7 files changed, 196 insertions(+), 345 deletions(-) create mode 100644 contracts/lib/Queue.sol create mode 100644 contracts/lib/Random.sol delete mode 100644 contracts/lib/heap/Heap.sol delete mode 100644 contracts/lib/heap/IHeapComparator.sol diff --git a/contracts/WorkerHub.sol b/contracts/WorkerHub.sol index a7a2162..0dd42a2 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -5,6 +5,8 @@ import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/Own import {PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol"; import {ReentrancyGuardUpgradeable} from "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol"; +import {Queue} from "./lib/Queue.sol"; +import {Random} from "./lib/Random.sol"; import {Set} from "./lib/Set.sol"; import {TransferHelper} from "./lib/TransferHelper.sol"; @@ -15,6 +17,8 @@ WorkerHubStorage, OwnableUpgradeable, PausableUpgradeable, ReentrancyGuardUpgradeable { + using Queue for Queue.Uint256Queue; + using Random for Random.Randomizer; using Set for Set.AddressSet; string constant private VERSION = "v0.0.1"; @@ -66,24 +70,20 @@ ReentrancyGuardUpgradeable { _unpause(); } - function registerModel(address _model, uint16 _tier, uint256 _minimumFee) external onlyOwner returns (uint256) { + function registerModel(address _model, uint16 _tier, uint256 _minimumFee) external onlyOwner { _updateEpoch(); Model storage model = models[_model]; - if (model.modelId != 0) revert AlreadyRegistered(); - uint256 modelId = ++modelNumber; - model.modelId = modelId; + if (model.tier != 0) revert AlreadyRegistered(); model.minimumFee = _minimumFee; model.tier = _tier; modelAddresses.insert(_model); - emit ModelRegistration(_model, modelId, _tier, _minimumFee); - return modelId; + emit ModelRegistration(_model, _tier, _minimumFee); } function unregisterModel(address _model) external onlyOwner { Model storage model = models[_model]; - if (model.modelId == 0) revert NotRegistered(); - model.modelId = 0; + if (model.tier == 0) revert NotRegistered(); model.tier = 0; modelAddresses.erase(_model); emit ModelUnregistration(_model); @@ -103,7 +103,14 @@ ReentrancyGuardUpgradeable { minter.lastClaimedEpoch = currentEpoch; minterNumber++; - emit MinterRegistration(msg.sender, tier, msg.value, block.timestamp); + address modelAddress = modelAddresses.values[randomizer.randomUint256() % modelAddresses.size()]; + minter.modelAddress = modelAddress; + minterAddressesByModel[modelAddress].insert(msg.sender); + + minterAddresses.insert(msg.sender); + assignmentsByMinter[msg.sender].init(); + + emit MinterRegistration(msg.sender, tier, msg.value); } function unregisterMinter() external nonReentrant { @@ -111,13 +118,22 @@ ReentrancyGuardUpgradeable { Worker storage minter = minters[msg.sender]; if (minter.tier == 0) revert NotRegistered(); - if (minter.currentTaskId != 0) revert MintingSessionNotEnded(); minter.tier = 0; minterNumber--; TransferHelper.safeTransferNative(msg.sender, minter.stake); minter.stake = 0; + minter.commitment = 0; + + minterAddresses.erase(msg.sender); + minterAddressesByModel[minter.modelAddress].erase(msg.sender); + minter.modelAddress = address(0); + + minterUnstakeRequests[msg.sender] = UnstakeRequest( + minter.stake, + uint40(block.timestamp + unstakeDelayTime) + ); // claim reward _claimReward(msg.sender); @@ -130,10 +146,25 @@ ReentrancyGuardUpgradeable { Worker storage minter = minters[msg.sender]; if (minter.tier == 0) revert NotRegistered(); + minter.stake += msg.value; + emit MinterExtraStake(msg.sender, msg.value); } + function unstakeForMinter() external { + _updateEpoch(); + + UnstakeRequest storage unstakeRequest = minterUnstakeRequests[msg.sender]; + if (block.timestamp < unstakeRequest.unlockAt) revert StillBeingLocked(); + + uint256 stake = unstakeRequest.stake; + if (stake == 0) revert NullStake(); + TransferHelper.safeTransferNative(msg.sender, stake); + + emit MinterUnstake(msg.sender, stake); + } + function registerValidator(uint16 tier) external payable { _updateEpoch(); @@ -145,6 +176,13 @@ ReentrancyGuardUpgradeable { validator.stake = msg.value; validator.tier = tier; + validator.lastClaimedEpoch = currentEpoch; + + address modelAddress = modelAddresses.values[randomizer.randomUint256() % modelAddresses.size()]; + validator.modelAddress = modelAddress; + validatorAddressesByModel[modelAddress].insert(msg.sender); + + validatorAddresses.insert(msg.sender); emit ValidatorRegistration(msg.sender, tier, msg.value); } @@ -154,12 +192,24 @@ ReentrancyGuardUpgradeable { Worker storage validator = validators[msg.sender]; if (validator.tier == 0) revert NotRegistered(); - if (validator.currentTaskId != 0) revert ValidatingSessionNotEnded(); validator.tier = 0; TransferHelper.safeTransferNative(msg.sender, validator.stake); validator.stake = 0; + validator.commitment = 0; + + validatorAddresses.erase(msg.sender); + validatorAddressesByModel[validator.modelAddress].erase(msg.sender); + validator.modelAddress = address(0); + + validatorUnstakeRequests[msg.sender] = UnstakeRequest( + validator.stake, + uint40(block.timestamp + unstakeDelayTime) + ); + + // claim reward + _claimReward(msg.sender); emit ValidatorUnregistration(msg.sender); } @@ -169,10 +219,25 @@ ReentrancyGuardUpgradeable { Worker storage validator = validators[msg.sender]; if (validator.tier == 0) revert NotRegistered(); + validator.stake += msg.value; + emit ValidatorExtraStake(msg.sender, msg.value); } + function unstakeForValidator() external { + _updateEpoch(); + + UnstakeRequest storage unstakeRequest = validatorUnstakeRequests[msg.sender]; + if (block.timestamp < unstakeRequest.unlockAt) revert StillBeingLocked(); + + uint256 stake = unstakeRequest.stake; + if (stake == 0) revert NullStake(); + TransferHelper.safeTransferNative(msg.sender, stake); + + emit ValidatorUnstake(msg.sender, stake); + } + function infer(bytes calldata _input, address _creator) external payable returns (uint256) { Model storage model = models[msg.sender]; if (model.tier == 0) revert Unauthorized(); @@ -182,17 +247,35 @@ ReentrancyGuardUpgradeable { inference.input = _input; inference.value = msg.value; inference.creator = _creator; - inference.modelId = model.modelId; + inference.modelAddress = msg.sender; + + Set.AddressSet storage minters = minterAddressesByModel[msg.sender]; + uint256 n = minterRequirement; + address[] memory selectedMinters = new address[](n); emit NewInference(inferenceId, _creator, msg.value); - _processMintingTasks(); + for (uint256 i = 0; i < n; ++i) { + address minter = minters.values[randomizer.randomUint256() % minters.size()]; + minters.erase(minter); + uint256 assignmentId = ++assignmentNumber; + assignments[assignmentId].inferenceId = inferenceId; + assignments[assignmentId].worker = minter; + selectedMinters[i] = minter; + assignmentsByMinter[msg.sender].push(assignmentId); + emit NewAssignment(assignmentId, inferenceId, minter); + } + + for (uint256 i = 0; i < n; ++i) minters.insert(selectedMinters[i]); return inferenceId; } - function _processMintingTasks() private { - + function getMintingAssignment() external view returns (uint256) { + Worker storage minter = minters[msg.sender]; + if (minter.tier == 0) revert NotRegistered(); + if (assignmentsByMinter[msg.sender].isEmpty()) return 0; + return assignmentsByMinter[msg.sender].front(); } // this internal function update new epoch @@ -213,28 +296,18 @@ ReentrancyGuardUpgradeable { } } - // todo: kouchou remove code - // from here - function compareAddress(address _a, address _b, int64 _identifier) external view returns (bool) { - return true; - } - - function compareUint256(uint256 _a, uint256 _b, int64 _identifier) external view returns (bool) { - return true; - } - // end remove - // todo // kelvin // minter submit result for specific infer function submitSolution(uint256 _assigmentId, bytes calldata _data) public virtual { _updateEpoch(); + //Check _assigmentId exist - Assignment storage assignment = mintingAssignments[_assigmentId]; + Assignment storage assignment = assignments[_assigmentId]; if (msg.sender != assignment.worker) revert("Sender is invalid"); - assignment.data = _data; + assignment.output = _data; Inference storage inference = inferences[assignment.inferenceId]; @@ -262,32 +335,12 @@ ReentrancyGuardUpgradeable { } function _handleDisputeSuccess(uint256 _inferId) internal { - // - + // TODO } - // todo - // validator notice result from minter incorrect and trigger dispute + function disputeInfer(uint256 _assignmentId) public virtual { -// _updateEpoch(); -// -// require(validators[msg.sender].stake != 0, "invalid validator"); -// -// // check infer in solving status or dispute -// Assignment storage assignment = validatingAssignments[_assignmentId]; -// Inference storage infer = inferences[assignment.inferenceId]; -// -// require(infer.status == InferStatus.Dispute && block.timestamp < infer.expiredAt, "not in dispute phase or expired"); -// require(!validatorDisputed[msg.sender][_assignmentId], "voted"); -// validatorDisputed[msg.sender][_assignmentId] = true; -// assignment.disapproval++; -// -// // handle vote > 1/3 total validator -// if (true) { -// _handleDisputeSuccess(assignment.inferenceId); -// } -// -// emit DisputeInfer(msg.sender, _assignmentId); + // TODO } // todo @@ -300,12 +353,6 @@ ReentrancyGuardUpgradeable { // switch case } - // todo - // validator withdraw unstaked token after 21 days - function withdrawUnstake() public virtual { - _updateEpoch(); - } - function _claimReward(address _minter) internal { uint256 rewardAmount = rewardToClaim(_minter); minters[_minter].lastClaimedEpoch = currentEpoch; diff --git a/contracts/interfaces/IWorkerHub.sol b/contracts/interfaces/IWorkerHub.sol index 55b33ef..ae97aad 100644 --- a/contracts/interfaces/IWorkerHub.sol +++ b/contracts/interfaces/IWorkerHub.sol @@ -1,11 +1,9 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; -import {IHeapComparator} from "../lib/heap/IHeapComparator.sol"; - import {IInferable} from "./IInferable.sol"; -interface IWorkerHub is IInferable, IHeapComparator { +interface IWorkerHub is IInferable { enum InferStatus { None, Solving, @@ -22,15 +20,14 @@ interface IWorkerHub is IInferable, IHeapComparator { } struct Model { - uint256 modelId; uint256 minimumFee; uint32 tier; } struct Worker { uint256 stake; - uint256 currentTaskId; - uint256 commission; + uint256 commitment; + address modelAddress; uint16 tier; uint40 activeTime; uint96 lastClaimedEpoch; @@ -41,14 +38,12 @@ interface IWorkerHub is IInferable, IHeapComparator { uint256 validationSubmissions; address worker; uint8 disapproval; // 1 / 3 total val - bytes data; + bytes output; } struct Inference { uint256[] assignments; // assignment ids solution submitter - uint256 totalValidator; address modelAddress; - uint256 modelId; uint256 value; bytes input; address disputeAddress; // the first validator submit dispute request => punishment @@ -58,9 +53,13 @@ interface IWorkerHub is IInferable, IHeapComparator { address creator; } + struct UnstakeRequest { + uint256 stake; + uint40 unlockAt; + } + event ModelRegistration( address indexed model, - uint256 indexed modelId, uint16 indexed tier, uint256 minimumFee ); @@ -70,8 +69,7 @@ interface IWorkerHub is IInferable, IHeapComparator { event MinterRegistration( address indexed minter, uint16 indexed tier, - uint256 value, - uint256 activeTime + uint256 value ); event MinterUnregistration(address indexed minter); @@ -89,6 +87,12 @@ interface IWorkerHub is IInferable, IHeapComparator { uint256 value ); + event NewAssignment( + uint256 indexed assignmentId, + uint256 indexed inferenceId, + address indexed worker + ); + event SubmitSolution( address indexed _minter, uint256 indexed _assigmentId @@ -129,16 +133,22 @@ interface IWorkerHub is IInferable, IHeapComparator { uint256 _newBlocks ); + event MinterUnstake(address minter, uint256 stake); + event ValidatorUnstake(address validator, uint256 stake); + error AlreadyRegistered(); error NotRegistered(); error Unauthorized(); + error StillBeingLocked(); error InvalidModel(); error InvalidTier(); error FeeTooLow(); error StakeTooLow(); + error NullStake(); error MintingSessionNotEnded(); error ValidatingSessionNotEnded(); + } diff --git a/contracts/lib/Queue.sol b/contracts/lib/Queue.sol new file mode 100644 index 0000000..05b586a --- /dev/null +++ b/contracts/lib/Queue.sol @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.0; + +library Queue { + struct Uint256Queue { + mapping(uint256 => uint256) values; + uint256 begin; + uint256 end; + } + + error Uint256Queue_Empty(); + + function init(Uint256Queue storage _queue) internal { + _queue.begin = 1; + _queue.end = 0; + } + + function push(Uint256Queue storage _queue, uint256 _value) internal { + _queue.values[++_queue.end] = _value; + } + + function pop(Uint256Queue storage _queue) internal { + uint256 begin = _queue.begin; + if (begin > _queue.end) revert Uint256Queue_Empty(); + delete _queue.values[begin++]; + } + + function front(Uint256Queue storage _queue) internal view returns (uint256) { + uint256 begin = _queue.begin; + if (begin > _queue.end) revert Uint256Queue_Empty(); + return _queue.values[begin]; + } + + function back(Uint256Queue storage _queue) internal view returns (uint256) { + uint256 end = _queue.end; + if (_queue.begin > end) revert Uint256Queue_Empty(); + return _queue.values[end]; + } + + function isEmpty(Uint256Queue storage _queue) internal view returns (bool) { + return _queue.begin > _queue.end; + } +} diff --git a/contracts/lib/Random.sol b/contracts/lib/Random.sol new file mode 100644 index 0000000..2db9e0b --- /dev/null +++ b/contracts/lib/Random.sol @@ -0,0 +1,17 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.0; + +library Random { + struct Randomizer { + uint256 nonce; + } + + function randomUint256(Randomizer storage _randomizer) internal returns (uint256) { + uint256 newNonce = uint256(keccak256(abi.encodePacked( + _randomizer.nonce, + block.timestamp, + blockhash(block.number) + ))); + return _randomizer.nonce = newNonce; + } +} diff --git a/contracts/lib/heap/Heap.sol b/contracts/lib/heap/Heap.sol deleted file mode 100644 index d387131..0000000 --- a/contracts/lib/heap/Heap.sol +++ /dev/null @@ -1,264 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.0; - -import {IHeapComparator} from "./IHeapComparator.sol"; - -library Heap { - // Address Heap - struct AddressHeap { - mapping(uint256 => address) values; - mapping(address => uint256) positions; - address comparator; - int64 identifier; - uint256 size; - } - - error EmptyAddressHeap(); - error AddressHeapValueNotFound(address value); - error DuplicatedAddressHeapValue(address value); - - function _up(AddressHeap storage _heap, uint256 _node, address _value) private { - mapping(uint256 => address) storage values = _heap.values; - mapping(address => uint256) storage positions = _heap.positions; - function(address, address, int64) external view returns (bool) compare - = IHeapComparator(_heap.comparator).compareAddress; - int64 identifier = _heap.identifier; - while (_node > 1) { - uint256 parentNode = _node >> 1; - address parentAddr = values[parentNode]; - if (compare(parentAddr, _value, identifier)) break; - values[parentNode] = _value; - positions[_value] = parentNode; - - values[_node] = parentAddr; - positions[parentAddr] = _node; - - _node = parentNode; - } - } - - function _down(AddressHeap storage _heap, uint256 _node, address _value) private { - mapping(uint256 => address) storage values = _heap.values; - mapping(address => uint256) storage positions = _heap.positions; - function(address, address, int64) external view returns (bool) compare - = IHeapComparator(_heap.comparator).compareAddress; - int64 identifier = _heap.identifier; - uint256 size = _heap.size; - while (true) { - uint256 childNode = _node << 1; - address childAddr = values[childNode]; - if (childNode > size) break; - if (childNode < size && compare(values[childNode | 1], childAddr, identifier)) { - childNode |= 1; - childAddr = values[childNode]; - } - - if (compare(_value, childAddr, identifier)) break; - values[childNode] = _value; - positions[_value] = childNode; - - values[_node] = childAddr; - positions[childAddr] = _node; - - _node = childNode; - } - } - - function up(AddressHeap storage _heap, address _value) internal { - uint256 node = _heap.positions[_value]; - if (node == 0) revert AddressHeapValueNotFound(_value); - _up(_heap, node, _value); - } - - function down(AddressHeap storage _heap, address _value) internal { - uint256 node = _heap.positions[_value]; - if (node == 0) revert AddressHeapValueNotFound(_value); - _down(_heap, node, _value); - } - - function hasValue(AddressHeap storage _heap, address _value) internal view returns (bool) { - return _heap.positions[_value] != 0; - } - - function push(AddressHeap storage _heap, address _value) internal { - if (_heap.positions[_value] != 0) revert DuplicatedAddressHeapValue(_value); - uint256 node = ++_heap.size; - _heap.values[node] = _value; - _heap.positions[_value] = node; - _up(_heap, node, _value); - } - - function peek(AddressHeap storage _heap) internal view returns (address) { - if (_heap.size == 0) revert EmptyAddressHeap(); - return _heap.values[1]; - } - - function pop(AddressHeap storage _heap) internal { - if (_heap.size == 0) revert EmptyAddressHeap(); - if (_heap.size == 1) { - _heap.size = 0; - _heap.positions[_heap.values[1]] = 0; - } else { - mapping(uint256 => address) storage values = _heap.values; - mapping(address => uint256) storage positions = _heap.positions; - address addr = values[_heap.size]; - positions[values[1]] = 0; - values[1] = addr; - positions[addr] = 1; - _heap.size--; - _down(_heap, 1, addr); - } - } - - function remove(AddressHeap storage _heap, address _value) internal { - if (_heap.positions[_value] == 0) revert AddressHeapValueNotFound(_value); - - mapping(address => uint256) storage positions = _heap.positions; - uint256 node = positions[_value]; - positions[_value] = 0; - if (node == _heap.size) { - _heap.size--; - } else { - mapping(uint256 => address) storage values = _heap.values; - address newAddr = values[_heap.size]; - _heap.size--; - values[node] = newAddr; - positions[newAddr] = node; - if (node != 1 - && IHeapComparator(_heap.comparator).compareAddress(newAddr, values[node >> 1], _heap.identifier)) { - _up(_heap, node, newAddr); - } else { - _down(_heap, node, newAddr); - } - } - } - - // Uint256 Heap - struct Uint256Heap { - mapping(uint256 => uint256) values; - mapping(uint256 => uint256) positions; - address comparator; - int64 identifier; - uint256 size; - } - - error EmptyUint256Heap(); - error Uint256HeapValueNotFound(uint256 value); - error DuplicatedUint256HeapValue(uint256 value); - - function _up(Uint256Heap storage _heap, uint256 _node, uint256 _value) private { - mapping(uint256 => uint256) storage values = _heap.values; - mapping(uint256 => uint256) storage positions = _heap.positions; - function(uint256, uint256, int64) external view returns (bool) compare - = IHeapComparator(_heap.comparator).compareUint256; - int64 identifier = _heap.identifier; - while (_node > 1) { - uint256 parentNode = _node >> 1; - uint256 parentAddr = values[parentNode]; - if (compare(parentAddr, _value, identifier)) break; - values[parentNode] = _value; - positions[_value] = parentNode; - - values[_node] = parentAddr; - positions[parentAddr] = _node; - - _node = parentNode; - } - } - - function _down(Uint256Heap storage _heap, uint256 _node, uint256 _value) private { - mapping(uint256 => uint256) storage values = _heap.values; - mapping(uint256 => uint256) storage positions = _heap.positions; - function(uint256, uint256, int64) external view returns (bool) compare - = IHeapComparator(_heap.comparator).compareUint256; - int64 identifier = _heap.identifier; - uint256 size = _heap.size; - while (true) { - uint256 childNode = _node << 1; - uint256 childAddr = values[childNode]; - if (childNode > size) break; - if (childNode < size && compare(values[childNode | 1], childAddr, identifier)) { - childNode |= 1; - childAddr = values[childNode]; - } - - if (compare(_value, childAddr, identifier)) break; - values[childNode] = _value; - positions[_value] = childNode; - - values[_node] = childAddr; - positions[childAddr] = _node; - - _node = childNode; - } - } - - function up(Uint256Heap storage _heap, uint256 _value) internal { - uint256 node = _heap.positions[_value]; - if (node == 0) revert Uint256HeapValueNotFound(_value); - _up(_heap, node, _value); - } - - function down(Uint256Heap storage _heap, uint256 _value) internal { - uint256 node = _heap.positions[_value]; - if (node == 0) revert Uint256HeapValueNotFound(_value); - _down(_heap, node, _value); - } - - function hasValue(Uint256Heap storage _heap, uint256 _value) internal view returns (bool) { - return _heap.positions[_value] != 0; - } - - function push(Uint256Heap storage _heap, uint256 _value) internal { - if (_heap.positions[_value] != 0) revert DuplicatedUint256HeapValue(_value); - uint256 node = ++_heap.size; - _heap.values[node] = _value; - _heap.positions[_value] = node; - _up(_heap, node, _value); - } - - function peek(Uint256Heap storage _heap) internal view returns (uint256) { - if (_heap.size == 0) revert EmptyUint256Heap(); - return _heap.values[1]; - } - - function pop(Uint256Heap storage _heap) internal { - if (_heap.size == 0) revert EmptyUint256Heap(); - if (_heap.size == 1) { - _heap.size = 0; - _heap.positions[_heap.values[1]] = 0; - } else { - mapping(uint256 => uint256) storage values = _heap.values; - mapping(uint256 => uint256) storage positions = _heap.positions; - uint256 addr = values[_heap.size]; - positions[values[1]] = 0; - values[1] = addr; - positions[addr] = 1; - _heap.size--; - _down(_heap, 1, addr); - } - } - - function remove(Uint256Heap storage _heap, uint256 _value) internal { - if (_heap.positions[_value] == 0) revert Uint256HeapValueNotFound(_value); - - mapping(uint256 => uint256) storage positions = _heap.positions; - uint256 node = positions[_value]; - positions[_value] = 0; - if (node == _heap.size) { - _heap.size--; - } else { - mapping(uint256 => uint256) storage values = _heap.values; - uint256 newAddr = values[_heap.size]; - _heap.size--; - values[node] = newAddr; - positions[newAddr] = node; - if (node != 1 - && IHeapComparator(_heap.comparator).compareUint256(newAddr, values[node >> 1], _heap.identifier)) { - _up(_heap, node, newAddr); - } else { - _down(_heap, node, newAddr); - } - } - } -} diff --git a/contracts/lib/heap/IHeapComparator.sol b/contracts/lib/heap/IHeapComparator.sol deleted file mode 100644 index 82ad74d..0000000 --- a/contracts/lib/heap/IHeapComparator.sol +++ /dev/null @@ -1,8 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.0; - -interface IHeapComparator { - function compareUint256(uint256 a, uint256 b, int64 identifier) external view returns (bool); - - function compareAddress(address a, address b, int64 identifier) external view returns (bool); -} diff --git a/contracts/storages/WorkerHubStorage.sol b/contracts/storages/WorkerHubStorage.sol index 3b327e2..67d3611 100644 --- a/contracts/storages/WorkerHubStorage.sol +++ b/contracts/storages/WorkerHubStorage.sol @@ -3,14 +3,17 @@ pragma solidity ^0.8.0; import {IWorkerHub} from "../interfaces/IWorkerHub.sol"; -import {Heap} from "../lib/heap/Heap.sol"; +import {Queue} from "../lib/Queue.sol"; +import {Random} from "../lib/Random.sol"; import {Set} from "../lib/Set.sol"; abstract contract WorkerHubStorage is IWorkerHub { - uint256 public mintingAssignmentNumber; - mapping(uint256 => Assignment) internal mintingAssignments; + Random.Randomizer internal randomizer; + + uint256 public assignmentNumber; + mapping(uint256 => Assignment) internal assignments; + mapping(address => Queue.Uint256Queue) internal assignmentsByMinter; - uint256 public modelNumber; mapping(address => Model) public models; uint256 public minterNumber; mapping(address => Worker) public minters; @@ -26,6 +29,9 @@ abstract contract WorkerHubStorage is IWorkerHub { mapping(address => Set.AddressSet) internal minterAddressesByModel; mapping(address => Set.AddressSet) internal validatorAddressesByModel; + mapping(address => UnstakeRequest) public minterUnstakeRequests; + mapping(address => UnstakeRequest) public validatorUnstakeRequests; + uint256 public minterMinimumStake; uint256 public validatorMinimumStake; uint40 public mintingTimeLimit; From f4e69cd832478b174c050205625c5296f545c0c8 Mon Sep 17 00:00:00 2001 From: kelvin2608 <2608@newbitcoincity.com> Date: Thu, 9 May 2024 10:15:04 +0700 Subject: [PATCH 18/82] Update logic related to submit solution function --- contracts/WorkerHub.sol | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/contracts/WorkerHub.sol b/contracts/WorkerHub.sol index 0dd42a2..e7c41f7 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -301,37 +301,41 @@ ReentrancyGuardUpgradeable { // minter submit result for specific infer function submitSolution(uint256 _assigmentId, bytes calldata _data) public virtual { _updateEpoch(); + address _msgSender = msg.sender; - //Check _assigmentId exist - Assignment storage assignment = assignments[_assigmentId]; + Assignment memory clonedAssignments = assignments[_assigmentId]; - if (msg.sender != assignment.worker) revert("Sender is invalid"); + if (_msgSender != clonedAssignments.worker) revert("Sender is invalid"); + if (clonedAssignments.output.length != 0) revert("Assignment already submitted"); - assignment.output = _data; + assignments[_assigmentId].output = _data; //Record the solution - Inference storage inference = inferences[assignment.inferenceId]; + Inference storage inference = inferences[clonedAssignments.inferenceId]; // if inference.status is not None, the Tx will fail. - if (inference.status != InferStatus.None) { + if (inference.status != InferStatus.Solving) { revert("Assignment already submitted"); } - if (inference.expiredAt > block.timestamp) { - revert("Expire time"); + _assignMinters(clonedAssignments.inferenceId); } - inference.status = InferStatus.Solving; - uint256[] memory clonedAssignments = inference.assignments; - uint256 assignmentsLen = clonedAssignments.length; + inference.status = InferStatus.Solved; + uint256[] memory inferAssignments = inference.assignments; + uint256 assignmentsLen = inferAssignments.length; for (uint8 i = 0; i < assignmentsLen; i++) { - if (clonedAssignments[i] == _assigmentId) { + if (inferAssignments[i] == _assigmentId) { inference.firstSubmitterIndex = i; break; } } - emit SubmitSolution(msg.sender, _assigmentId); + uint curEpoch = currentEpoch; + minterTaskCompleted[_msgSender][curEpoch] += 1; + rewardInEpoch[curEpoch].totalTaskCompleted += 1; + + emit SubmitSolution(_msgSender, _assigmentId); } function _handleDisputeSuccess(uint256 _inferId) internal { From a30069b9da837c3d83a0515ec0807e3d74ed40c6 Mon Sep 17 00:00:00 2001 From: kelvin2608 <2608@newbitcoincity.com> Date: Thu, 9 May 2024 10:50:08 +0700 Subject: [PATCH 19/82] Transfer 'infer value' to minter when task is done --- contracts/WorkerHub.sol | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/contracts/WorkerHub.sol b/contracts/WorkerHub.sol index e7c41f7..128ce34 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -299,7 +299,7 @@ ReentrancyGuardUpgradeable { // todo // kelvin // minter submit result for specific infer - function submitSolution(uint256 _assigmentId, bytes calldata _data) public virtual { + function submitSolution(uint256 _assigmentId, bytes calldata _data) public virtual whenNotPaused { _updateEpoch(); address _msgSender = msg.sender; @@ -310,18 +310,19 @@ ReentrancyGuardUpgradeable { assignments[_assigmentId].output = _data; //Record the solution + Inference memory clonedInference = inferences[clonedAssignments.inferenceId]; Inference storage inference = inferences[clonedAssignments.inferenceId]; - // if inference.status is not None, the Tx will fail. - if (inference.status != InferStatus.Solving) { + // if inference.status is not Solving, the Tx will fail. + if (clonedInference.status != InferStatus.Solving) { revert("Assignment already submitted"); } - if (inference.expiredAt > block.timestamp) { + if (clonedInference.expiredAt > block.timestamp) { _assignMinters(clonedAssignments.inferenceId); } inference.status = InferStatus.Solved; - uint256[] memory inferAssignments = inference.assignments; + uint256[] memory inferAssignments = clonedInference.assignments; uint256 assignmentsLen = inferAssignments.length; for (uint8 i = 0; i < assignmentsLen; i++) { @@ -335,6 +336,8 @@ ReentrancyGuardUpgradeable { minterTaskCompleted[_msgSender][curEpoch] += 1; rewardInEpoch[curEpoch].totalTaskCompleted += 1; + TransferHelper.safeTransferNative(_msgSender, clonedInference.value); + emit SubmitSolution(_msgSender, _assigmentId); } From f0fd82348ece796c606f2e5677b045b22e7624d7 Mon Sep 17 00:00:00 2001 From: kochou-nbc Date: Thu, 9 May 2024 10:58:21 +0700 Subject: [PATCH 20/82] update resolveInference --- contracts/WorkerHub.sol | 96 ++++++++++++++----------- contracts/interfaces/IWorkerHub.sol | 78 ++++++-------------- contracts/lib/Queue.sol | 43 ----------- contracts/storages/WorkerHubStorage.sol | 48 ++++++------- 4 files changed, 100 insertions(+), 165 deletions(-) delete mode 100644 contracts/lib/Queue.sol diff --git a/contracts/WorkerHub.sol b/contracts/WorkerHub.sol index 128ce34..c825546 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -5,7 +5,6 @@ import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/Own import {PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol"; import {ReentrancyGuardUpgradeable} from "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol"; -import {Queue} from "./lib/Queue.sol"; import {Random} from "./lib/Random.sol"; import {Set} from "./lib/Set.sol"; import {TransferHelper} from "./lib/TransferHelper.sol"; @@ -17,9 +16,9 @@ WorkerHubStorage, OwnableUpgradeable, PausableUpgradeable, ReentrancyGuardUpgradeable { - using Queue for Queue.Uint256Queue; using Random for Random.Randomizer; using Set for Set.AddressSet; + using Set for Set.Uint256Set; string constant private VERSION = "v0.0.1"; uint256 constant private PERCENTAGE_DENOMINATOR = 100_00; @@ -27,35 +26,30 @@ ReentrancyGuardUpgradeable { receive() external payable {} function initialize( + address _treasury, + uint16 _feePercentage, uint256 _minterMinimumStake, uint256 _validatorMinimumStake, uint40 _mintingTimeLimit, - uint40 _validatingTimeLimit, - uint40 _disputingTimeLimit, uint8 _minterRequirement, - uint16 _maximumTier, - uint16 _disqualificationPercentage, uint256 _blocksPerEpoch, uint256 _rewardPerEpochBasedOnPerf, - uint40 _penaltyDuration, uint40 _unstakeDelayTime ) external initializer { __Ownable_init(); __Pausable_init(); __ReentrancyGuard_init(); + treasury = _treasury; + feePercentage = _feePercentage; minterMinimumStake = _minterMinimumStake; validatorMinimumStake = _validatorMinimumStake; mintingTimeLimit = _mintingTimeLimit; - validatingTimeLimit = _validatingTimeLimit; - disputingTimeLimit = _disputingTimeLimit; minterRequirement = _minterRequirement; - maximumTier = _maximumTier; - disqualificationPercentage = _disqualificationPercentage; blocksPerEpoch = _blocksPerEpoch; rewardPerEpochBasedOnPerf = _rewardPerEpochBasedOnPerf; - penaltyDuration = _penaltyDuration; unstakeDelayTime = _unstakeDelayTime; + maximumTier = 1; } function version() external pure returns (string memory) { @@ -75,17 +69,23 @@ ReentrancyGuardUpgradeable { Model storage model = models[_model]; if (model.tier != 0) revert AlreadyRegistered(); + model.minimumFee = _minimumFee; model.tier = _tier; modelAddresses.insert(_model); + emit ModelRegistration(_model, _tier, _minimumFee); } function unregisterModel(address _model) external onlyOwner { + _updateEpoch(); + Model storage model = models[_model]; if (model.tier == 0) revert NotRegistered(); + model.tier = 0; modelAddresses.erase(_model); + emit ModelUnregistration(_model); } @@ -101,14 +101,12 @@ ReentrancyGuardUpgradeable { minter.stake = msg.value; minter.tier = tier; minter.lastClaimedEpoch = currentEpoch; - minterNumber++; address modelAddress = modelAddresses.values[randomizer.randomUint256() % modelAddresses.size()]; minter.modelAddress = modelAddress; minterAddressesByModel[modelAddress].insert(msg.sender); minterAddresses.insert(msg.sender); - assignmentsByMinter[msg.sender].init(); emit MinterRegistration(msg.sender, tier, msg.value); } @@ -120,7 +118,6 @@ ReentrancyGuardUpgradeable { if (minter.tier == 0) revert NotRegistered(); minter.tier = 0; - minterNumber--; TransferHelper.safeTransferNative(msg.sender, minter.stake); minter.stake = 0; @@ -135,7 +132,6 @@ ReentrancyGuardUpgradeable { uint40(block.timestamp + unstakeDelayTime) ); - // claim reward _claimReward(msg.sender); emit MinterUnregistration(msg.sender); @@ -208,9 +204,6 @@ ReentrancyGuardUpgradeable { uint40(block.timestamp + unstakeDelayTime) ); - // claim reward - _claimReward(msg.sender); - emit ValidatorUnregistration(msg.sender); } @@ -238,44 +231,57 @@ ReentrancyGuardUpgradeable { emit ValidatorUnstake(msg.sender, stake); } - function infer(bytes calldata _input, address _creator) external payable returns (uint256) { + function infer(bytes calldata _input, address _creator) external payable whenNotPaused returns (uint256) { Model storage model = models[msg.sender]; if (model.tier == 0) revert Unauthorized(); if (msg.value < model.minimumFee) revert FeeTooLow(); uint256 inferenceId = ++inferenceNumber; Inference storage inference = inferences[inferenceId]; + + uint256 fee = msg.value * feePercentage / PERCENTAGE_DENOMINATOR; + uint256 value = msg.value - fee; + inference.input = _input; - inference.value = msg.value; + inference.value = value; inference.creator = _creator; inference.modelAddress = msg.sender; + TransferHelper.safeTransferNative(treasury, fee); + + emit NewInference(inferenceId, _creator, value); + + _assignMinters(inferenceId); + + return inferenceId; + } + + function _assignMinters(uint256 _inferenceId) private { + uint40 expiredAt = uint40(block.timestamp + mintingTimeLimit); + inferences[_inferenceId].expiredAt = expiredAt; + inferences[_inferenceId].status = InferenceStatus.Solving; + Set.AddressSet storage minters = minterAddressesByModel[msg.sender]; uint256 n = minterRequirement; address[] memory selectedMinters = new address[](n); - emit NewInference(inferenceId, _creator, msg.value); for (uint256 i = 0; i < n; ++i) { address minter = minters.values[randomizer.randomUint256() % minters.size()]; minters.erase(minter); uint256 assignmentId = ++assignmentNumber; - assignments[assignmentId].inferenceId = inferenceId; + assignments[assignmentId].inferenceId = _inferenceId; assignments[assignmentId].worker = minter; selectedMinters[i] = minter; - assignmentsByMinter[msg.sender].push(assignmentId); - emit NewAssignment(assignmentId, inferenceId, minter); + assignmentsByMinter[msg.sender].insert(assignmentId); + assignmentsByInference[_inferenceId].insert(assignmentId); + emit NewAssignment(assignmentId, _inferenceId, minter, expiredAt); } for (uint256 i = 0; i < n; ++i) minters.insert(selectedMinters[i]); - - return inferenceId; } - function getMintingAssignment() external view returns (uint256) { - Worker storage minter = minters[msg.sender]; - if (minter.tier == 0) revert NotRegistered(); - if (assignmentsByMinter[msg.sender].isEmpty()) return 0; - return assignmentsByMinter[msg.sender].front(); + function getMintingAssignments() external view returns (uint256[] memory) { + return assignmentsByMinter[msg.sender].values; } // this internal function update new epoch @@ -284,7 +290,7 @@ ReentrancyGuardUpgradeable { uint epochPassed = (block.number - lastBlock) / blocksPerEpoch; if (epochPassed > 0) { for (; epochPassed > 0; epochPassed--) { - rewardInEpoch[currentEpoch].totalMinter = minterNumber; + rewardInEpoch[currentEpoch].totalMinter = minterAddresses.size(); currentEpoch++; rewardInEpoch[currentEpoch].perfReward = rewardPerEpochBasedOnPerf; rewardInEpoch[currentEpoch].epochReward = rewardPerEpoch; @@ -314,14 +320,14 @@ ReentrancyGuardUpgradeable { Inference storage inference = inferences[clonedAssignments.inferenceId]; // if inference.status is not Solving, the Tx will fail. - if (clonedInference.status != InferStatus.Solving) { + if (clonedInference.status != InferenceStatus.Solving) { revert("Assignment already submitted"); } if (clonedInference.expiredAt > block.timestamp) { _assignMinters(clonedAssignments.inferenceId); } - inference.status = InferStatus.Solved; + inference.status = InferenceStatus.Solved; uint256[] memory inferAssignments = clonedInference.assignments; uint256 assignmentsLen = inferAssignments.length; @@ -338,7 +344,7 @@ ReentrancyGuardUpgradeable { TransferHelper.safeTransferNative(_msgSender, clonedInference.value); - emit SubmitSolution(_msgSender, _assigmentId); + emit SolutionSubmission(_msgSender, _assigmentId); } function _handleDisputeSuccess(uint256 _inferId) internal { @@ -350,14 +356,18 @@ ReentrancyGuardUpgradeable { // TODO } - // todo - // resolve pending inferences - // update infer status - // called by anyone - function resolveInfer(uint256 _inferId) public virtual { + function resolveInference(uint256 _inferenceId) public virtual { _updateEpoch(); - // switch case + Inference storage inference = inferences[_inferenceId]; + if (inference.status == InferenceStatus.Solving && block.timestamp > inference.expiredAt) { + uint256[] storage assignmentIds = assignmentsByInference[_inferenceId].values; + uint256 assignmentNumber = assignmentIds.length; + for (uint256 i = 0; i < assignmentNumber; ++i) { + assignments[assignmentIds[i]].worker = address(0); + } + _assignMinters(_inferenceId); + } } function _claimReward(address _minter) internal { @@ -366,7 +376,7 @@ ReentrancyGuardUpgradeable { if (rewardAmount > 0) { TransferHelper.safeTransferNative(_minter, rewardAmount); - emit ClaimReward(_minter, rewardAmount); + emit RewardClaim(_minter, rewardAmount); } } diff --git a/contracts/interfaces/IWorkerHub.sol b/contracts/interfaces/IWorkerHub.sol index ae97aad..28b860a 100644 --- a/contracts/interfaces/IWorkerHub.sol +++ b/contracts/interfaces/IWorkerHub.sol @@ -4,10 +4,10 @@ pragma solidity ^0.8.0; import {IInferable} from "./IInferable.sol"; interface IWorkerHub is IInferable { - enum InferStatus { - None, + enum InferenceStatus { + Nil, Solving, - Disputed, + Disputing, Solved, Killed } @@ -28,28 +28,27 @@ interface IWorkerHub is IInferable { uint256 stake; uint256 commitment; address modelAddress; - uint16 tier; + uint40 lastClaimedEpoch; uint40 activeTime; - uint96 lastClaimedEpoch; + uint16 tier; } struct Assignment { uint256 inferenceId; - uint256 validationSubmissions; - address worker; - uint8 disapproval; // 1 / 3 total val bytes output; + address worker; + uint8 disapprovalCount; } struct Inference { - uint256[] assignments; // assignment ids solution submitter - address modelAddress; - uint256 value; + uint256[] assignments; bytes input; - address disputeAddress; // the first validator submit dispute request => punishment + uint256 value; + address disputingAddress; + address modelAddress; uint40 expiredAt; uint8 firstSubmitterIndex; - InferStatus status; + InferenceStatus status; address creator; } @@ -86,62 +85,31 @@ interface IWorkerHub is IInferable { address indexed creator, uint256 value ); + event InferenceDisputation(address indexed validator, uint256 indexed assigmentId); + event InferenceStatusUpdate(uint256 indexed inferenceId, InferenceStatus newStatus); event NewAssignment( uint256 indexed assignmentId, uint256 indexed inferenceId, - address indexed worker - ); - - event SubmitSolution( - address indexed _minter, - uint256 indexed _assigmentId - ); - - event DisputeInfer( - address indexed _validator, - uint256 indexed _assigmentId - ); - - event InferStatusUpdated( - uint256 indexed _inferId, - InferStatus _newStatus - ); - - event WithdrawUnstaked( - address indexed _validator, - uint256 _amount - ); - - event ClaimReward( - address indexed _minter, - uint256 _amount + address indexed minter, + uint40 expiredAt ); + event SolutionSubmission(address indexed minter, uint256 indexed assigmentId); - event RewardPerEpoch( - uint256 _oldReward, - uint256 _newReward - ); + event MinterUnstake(address indexed minter, uint256 stake); + event ValidatorUnstake(address indexed validator, uint256 stake); - event RewardPerEpochBasedOnPerf( - uint256 _oldReward, - uint256 _newReward - ); - - event BlocksPerEpoch( - uint256 _oldBlocks, - uint256 _newBlocks - ); + event RewardClaim(address indexed worker, uint256 value); - event MinterUnstake(address minter, uint256 stake); - event ValidatorUnstake(address validator, uint256 stake); + event RewardPerEpoch(uint256 oldReward, uint256 newReward); + event RewardPerEpochBasedOnPerf(uint256 oldReward, uint256 newReward); + event BlocksPerEpoch(uint256 oldBlocks, uint256 newBlocks); error AlreadyRegistered(); error NotRegistered(); error Unauthorized(); error StillBeingLocked(); - error InvalidModel(); error InvalidTier(); error FeeTooLow(); diff --git a/contracts/lib/Queue.sol b/contracts/lib/Queue.sol deleted file mode 100644 index 05b586a..0000000 --- a/contracts/lib/Queue.sol +++ /dev/null @@ -1,43 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.0; - -library Queue { - struct Uint256Queue { - mapping(uint256 => uint256) values; - uint256 begin; - uint256 end; - } - - error Uint256Queue_Empty(); - - function init(Uint256Queue storage _queue) internal { - _queue.begin = 1; - _queue.end = 0; - } - - function push(Uint256Queue storage _queue, uint256 _value) internal { - _queue.values[++_queue.end] = _value; - } - - function pop(Uint256Queue storage _queue) internal { - uint256 begin = _queue.begin; - if (begin > _queue.end) revert Uint256Queue_Empty(); - delete _queue.values[begin++]; - } - - function front(Uint256Queue storage _queue) internal view returns (uint256) { - uint256 begin = _queue.begin; - if (begin > _queue.end) revert Uint256Queue_Empty(); - return _queue.values[begin]; - } - - function back(Uint256Queue storage _queue) internal view returns (uint256) { - uint256 end = _queue.end; - if (_queue.begin > end) revert Uint256Queue_Empty(); - return _queue.values[end]; - } - - function isEmpty(Uint256Queue storage _queue) internal view returns (bool) { - return _queue.begin > _queue.end; - } -} diff --git a/contracts/storages/WorkerHubStorage.sol b/contracts/storages/WorkerHubStorage.sol index 67d3611..9a47f05 100644 --- a/contracts/storages/WorkerHubStorage.sol +++ b/contracts/storages/WorkerHubStorage.sol @@ -3,37 +3,49 @@ pragma solidity ^0.8.0; import {IWorkerHub} from "../interfaces/IWorkerHub.sol"; -import {Queue} from "../lib/Queue.sol"; import {Random} from "../lib/Random.sol"; import {Set} from "../lib/Set.sol"; abstract contract WorkerHubStorage is IWorkerHub { Random.Randomizer internal randomizer; - uint256 public assignmentNumber; - mapping(uint256 => Assignment) internal assignments; - mapping(address => Queue.Uint256Queue) internal assignmentsByMinter; - mapping(address => Model) public models; - uint256 public minterNumber; mapping(address => Worker) public minters; mapping(address => Worker) public validators; - uint256 public inferenceNumber; - mapping(uint256 => Inference) internal inferences; + mapping(address => Set.AddressSet) internal minterAddressesByModel; + mapping(address => Set.AddressSet) internal validatorAddressesByModel; Set.AddressSet internal modelAddresses; Set.AddressSet internal minterAddresses; Set.AddressSet internal validatorAddresses; - mapping(address => Set.AddressSet) internal minterAddressesByModel; - mapping(address => Set.AddressSet) internal validatorAddressesByModel; - mapping(address => UnstakeRequest) public minterUnstakeRequests; mapping(address => UnstakeRequest) public validatorUnstakeRequests; + uint256 public inferenceNumber; + mapping(uint256 => Inference) internal inferences; + + uint256 public assignmentNumber; + mapping(uint256 => Assignment) internal assignments; + mapping(address => Set.Uint256Set) internal assignmentsByMinter; + mapping(uint256 => Set.Uint256Set) internal assignmentsByInference; + + mapping(address => mapping(uint256 => bool)) public validatorDisputed; + + // mapping total task completed in epoch and reward per epoch + // epoch index => total reward + mapping(uint256 => MinterEpochState) public rewardInEpoch; + + // mapping detail minter completed how many request + // total task completed in epoch + // minter => epoch => total task completed + mapping(address => mapping(uint256 => uint256)) public minterTaskCompleted; + uint256 public minterMinimumStake; uint256 public validatorMinimumStake; + address public treasury; + uint16 public feePercentage; uint40 public mintingTimeLimit; uint40 public validatingTimeLimit; uint40 public disputingTimeLimit; @@ -44,24 +56,12 @@ abstract contract WorkerHubStorage is IWorkerHub { uint16 public maximumTier; uint16 public disqualificationPercentage; - // validator mapping validator => assigment id => boolean - mapping(address => mapping(uint256 => bool)) public validatorDisputed; - // reward purpose + uint40 public currentEpoch; uint256 public blocksPerEpoch; - uint96 public currentEpoch; uint256 public lastBlock; uint256 public rewardPerEpochBasedOnPerf; uint256 public rewardPerEpoch; - // mapping total task completed in epoch and reward per epoch - // epoch index => total reward - mapping(uint256 => MinterEpochState) public rewardInEpoch; - - // mapping detail minter completed how many request - // total task completed in epoch - // minter => epoch => total task completed - mapping(address => mapping(uint256 => uint256)) public minterTaskCompleted; - uint256[50] private __gap; } From ed7f05296e55d349620f3055146580201bb08e88 Mon Sep 17 00:00:00 2001 From: 180945 <180945@trustless.computer> Date: Thu, 9 May 2024 11:13:45 +0700 Subject: [PATCH 21/82] updated test. --- tests/Test.t.sol | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/tests/Test.t.sol b/tests/Test.t.sol index 30a9c61..bc73035 100644 --- a/tests/Test.t.sol +++ b/tests/Test.t.sol @@ -26,28 +26,27 @@ contract WorkHubTest is Test { address public constant Miner1 = address(101); address public constant Miner2 = address(102); address public constant Miner3 = address(103); + address public constant ModelAddr = address(1); + function setUp() public { workerHub = new Mockup(); - vm.prank(ADMIN_ADDR); + vm.startPrank(ADMIN_ADDR); workerHub.initialize( + ADMIN_ADDR, + 10, 1e18, 1e18, 1, 1, - 1, - 1, - 1, - 1, 10, 1e18, - 1 days, 21 days ); - - vm.prank(ADMIN_ADDR); workerHub.setNewRewardInEpoch(1e16); + workerHub.registerModel(ModelAddr, 1, 1e18); + vm.stopPrank(); } function testRewards() public { @@ -66,13 +65,12 @@ contract WorkHubTest is Test { vm.prank(Miner3); workerHub.registerMinter{value: 1e18}(1); - assertEq(workerHub.minterNumber(), 3); - assertEq(workerHub.currentEpoch(), 1); assertEq(workerHub.rewardToClaim(Miner1), 0); assertEq(workerHub.rewardToClaim(Miner2), 0); assertEq(workerHub.rewardToClaim(Miner3), 0); (uint256 pefReward, uint256 epochReward, uint256 totalTaskCompleted, uint256 totalMinter) = workerHub.rewardInEpoch(1); +// assertEq(totalMinter, 3); assertEq(pefReward, 1e18); assertEq(epochReward, 1e16); assertEq(totalTaskCompleted, 0); From cce64b2f72777348f361f6cfed1106a079f6e186 Mon Sep 17 00:00:00 2001 From: kochou-nbc Date: Thu, 9 May 2024 14:16:02 +0700 Subject: [PATCH 22/82] update getter --- contracts/WorkerHub.sol | 148 +++++++++++++++++++----- contracts/interfaces/IWorkerHub.sol | 34 +++++- contracts/storages/WorkerHubStorage.sol | 2 +- 3 files changed, 155 insertions(+), 29 deletions(-) diff --git a/contracts/WorkerHub.sol b/contracts/WorkerHub.sol index c825546..37e247d 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -64,6 +64,105 @@ ReentrancyGuardUpgradeable { _unpause(); } + function getMintingAssignments() external view returns (AssignmentInfo[] memory) { + uint256[] memory assignmentIds = assignmentsByMinter[msg.sender].values; + uint256 assignmentNumber = assignmentIds.length; + + uint256 counter = 0; + for (uint256 i = 0; i < assignmentNumber; ++i) + if (isAssignmentPending(assignmentIds[i])) counter++; + + counter = 0; + AssignmentInfo[] memory result = new AssignmentInfo[](counter); + for (uint256 i = 0; i < assignmentNumber; ++i) + if (isAssignmentPending(assignmentIds[i])) { + Assignment storage assignment = assignments[assignmentIds[i]]; + Inference storage inference = inferences[assignment.inferenceId]; + result[counter++] = AssignmentInfo( + assignmentIds[i], + assignment.inferenceId, + inference.modelAddress, + inference.input, + inference.expiredAt + ); + } + + return result; + } + + function getMinterAddresses() external view returns (address[] memory) { + return minterAddresses.values; + } + + function getMinters() external view returns (WorkerInfo[] memory) { + address[] memory addresses = minterAddresses.values; + uint256 minterNumber = addresses.length; + WorkerInfo[] memory result = new WorkerInfo[](minterNumber); + for (uint256 i = 0; i < minterNumber; ++i) { + Worker memory minter = minters[addresses[i]]; + result[i] = WorkerInfo( + addresses[i], + minter.stake, + minter.commitment, + minter.modelAddress, + minter.lastClaimedEpoch, + minter.activeTime, + minter.tier + ); + } + return result; + } + + function getValidatorAddresses() external view returns (address[] memory) { + return validatorAddresses.values; + } + + function getValidators() external view returns (WorkerInfo[] memory) { + address[] memory addresses = validatorAddresses.values; + uint256 validatorNumber = addresses.length; + WorkerInfo[] memory result = new WorkerInfo[](validatorNumber); + for (uint256 i = 0; i < validatorNumber; ++i) { + Worker memory validator = validators[addresses[i]]; + result[i] = WorkerInfo( + addresses[i], + validator.stake, + validator.commitment, + validator.modelAddress, + validator.lastClaimedEpoch, + validator.activeTime, + validator.tier + ); + } + return result; + } + + function isAssignmentPending(uint256 _assignmentId) public view returns (bool) { + return assignments[_assignmentId].output.length == 0 + && block.timestamp < inferences[assignments[_assignmentId].inferenceId].expiredAt; + } + + function getInferences(uint256[] calldata _inferenceIds) external view returns (InferenceInfo[] memory) { + uint256 inferenceNumber = _inferenceIds.length; + InferenceInfo[] memory result = new InferenceInfo[](inferenceNumber); + for (uint256 i = 0; i < inferenceNumber; ++i) { + Inference storage inference = inferences[_inferenceIds[i]]; + result[i] = InferenceInfo( + _inferenceIds[i], + inference.input, + inference.status == InferenceStatus.Solved + ? assignments[inference.assignments[inference.firstSubmissionId]].output + : bytes(""), + inference.value, + inference.disputingAddress, + inference.modelAddress, + inference.expiredAt, + inference.status, + inference.creator + ); + } + return result; + } + function registerModel(address _model, uint16 _tier, uint256 _minimumFee) external onlyOwner { _updateEpoch(); @@ -89,7 +188,7 @@ ReentrancyGuardUpgradeable { emit ModelUnregistration(_model); } - function registerMinter(uint16 tier) external payable { + function registerMinter(uint16 tier) external payable whenNotPaused { _updateEpoch(); if (tier == 0 || tier > maximumTier) revert InvalidTier(); @@ -137,7 +236,7 @@ ReentrancyGuardUpgradeable { emit MinterUnregistration(msg.sender); } - function increaseMinterStake() external payable { + function increaseMinterStake() external payable whenNotPaused { _updateEpoch(); Worker storage minter = minters[msg.sender]; @@ -161,7 +260,7 @@ ReentrancyGuardUpgradeable { emit MinterUnstake(msg.sender, stake); } - function registerValidator(uint16 tier) external payable { + function registerValidator(uint16 tier) external payable whenNotPaused { _updateEpoch(); if (tier == 0 || tier > maximumTier) revert InvalidTier(); @@ -207,7 +306,7 @@ ReentrancyGuardUpgradeable { emit ValidatorUnregistration(msg.sender); } - function increaseValidatorStake() external payable { + function increaseValidatorStake() external payable whenNotPaused { _updateEpoch(); Worker storage validator = validators[msg.sender]; @@ -260,8 +359,9 @@ ReentrancyGuardUpgradeable { inferences[_inferenceId].expiredAt = expiredAt; inferences[_inferenceId].status = InferenceStatus.Solving; + address model = inferences[_inferenceId].modelAddress; - Set.AddressSet storage minters = minterAddressesByModel[msg.sender]; + Set.AddressSet storage minters = minterAddressesByModel[model]; uint256 n = minterRequirement; address[] memory selectedMinters = new address[](n); @@ -280,14 +380,10 @@ ReentrancyGuardUpgradeable { for (uint256 i = 0; i < n; ++i) minters.insert(selectedMinters[i]); } - function getMintingAssignments() external view returns (uint256[] memory) { - return assignmentsByMinter[msg.sender].values; - } - // this internal function update new epoch function _updateEpoch() internal { if (blocksPerEpoch > 0) { - uint epochPassed = (block.number - lastBlock) / blocksPerEpoch; + uint256 epochPassed = (block.number - lastBlock) / blocksPerEpoch; if (epochPassed > 0) { for (; epochPassed > 0; epochPassed--) { rewardInEpoch[currentEpoch].totalMinter = minterAddresses.size(); @@ -302,17 +398,14 @@ ReentrancyGuardUpgradeable { } } - // todo - // kelvin - // minter submit result for specific infer function submitSolution(uint256 _assigmentId, bytes calldata _data) public virtual whenNotPaused { _updateEpoch(); address _msgSender = msg.sender; Assignment memory clonedAssignments = assignments[_assigmentId]; - if (_msgSender != clonedAssignments.worker) revert("Sender is invalid"); - if (clonedAssignments.output.length != 0) revert("Assignment already submitted"); + if (_msgSender != clonedAssignments.worker) revert Unauthorized(); + if (clonedAssignments.output.length != 0) revert AlreadySubmitted(); assignments[_assigmentId].output = _data; //Record the solution @@ -320,9 +413,7 @@ ReentrancyGuardUpgradeable { Inference storage inference = inferences[clonedAssignments.inferenceId]; // if inference.status is not Solving, the Tx will fail. - if (clonedInference.status != InferenceStatus.Solving) { - revert("Assignment already submitted"); - } + if (clonedInference.status != InferenceStatus.Solving) revert AlreadySubmitted(); if (clonedInference.expiredAt > block.timestamp) { _assignMinters(clonedAssignments.inferenceId); } @@ -333,12 +424,12 @@ ReentrancyGuardUpgradeable { for (uint8 i = 0; i < assignmentsLen; i++) { if (inferAssignments[i] == _assigmentId) { - inference.firstSubmitterIndex = i; + inference.firstSubmissionId = i; break; } } - uint curEpoch = currentEpoch; + uint256 curEpoch = currentEpoch; minterTaskCompleted[_msgSender][curEpoch] += 1; rewardInEpoch[curEpoch].totalTaskCompleted += 1; @@ -370,7 +461,7 @@ ReentrancyGuardUpgradeable { } } - function _claimReward(address _minter) internal { + function _claimReward(address _minter) internal whenNotPaused { uint256 rewardAmount = rewardToClaim(_minter); minters[_minter].lastClaimedEpoch = currentEpoch; if (rewardAmount > 0) { @@ -402,7 +493,7 @@ ReentrancyGuardUpgradeable { function setBlocksPerEpoch(uint256 _blocks) public virtual onlyOwner { _updateEpoch(); - require(_blocks > 0, "invalid blocks value"); + if (_blocks == 0) revert InvalidBlockValue(); emit BlocksPerEpoch(blocksPerEpoch, _blocks); @@ -410,17 +501,18 @@ ReentrancyGuardUpgradeable { } // sum reward of an minter since last claimed epoch - function rewardToClaim(address _minter) public virtual returns(uint256 totalReward) { + function rewardToClaim(address _minter) public virtual returns(uint256) { _updateEpoch(); - uint lastEpoch = currentEpoch; + uint256 totalReward; + uint256 lastEpoch = currentEpoch; if (minters[_minter].stake <= 0 || lastEpoch <= minters[_minter].lastClaimedEpoch) { totalReward = 0; } else { uint256 lastClaimed = uint256(minters[_minter].lastClaimedEpoch); - uint perfReward; - uint epochReward; - uint currentMinter; + uint256 perfReward; + uint256 epochReward; + uint256 currentMinter; for (; lastClaimed < lastEpoch; lastClaimed++) { MinterEpochState memory state = rewardInEpoch[lastClaimed]; uint256 totalTaskCompleted = state.totalTaskCompleted; @@ -435,5 +527,7 @@ ReentrancyGuardUpgradeable { } } } + + return totalReward; } } diff --git a/contracts/interfaces/IWorkerHub.sol b/contracts/interfaces/IWorkerHub.sol index 28b860a..ea5a83b 100644 --- a/contracts/interfaces/IWorkerHub.sol +++ b/contracts/interfaces/IWorkerHub.sol @@ -33,6 +33,16 @@ interface IWorkerHub is IInferable { uint16 tier; } + struct WorkerInfo { + address workerAddress; + uint256 stake; + uint256 commitment; + address modelAddress; + uint40 lastClaimedEpoch; + uint40 activeTime; + uint16 tier; + } + struct Assignment { uint256 inferenceId; bytes output; @@ -40,6 +50,14 @@ interface IWorkerHub is IInferable { uint8 disapprovalCount; } + struct AssignmentInfo { + uint256 assignmentId; + uint256 inferenceId; + address modelAddress; + bytes input; + uint40 expiredAt; + } + struct Inference { uint256[] assignments; bytes input; @@ -47,7 +65,19 @@ interface IWorkerHub is IInferable { address disputingAddress; address modelAddress; uint40 expiredAt; - uint8 firstSubmitterIndex; + uint8 firstSubmissionId; + InferenceStatus status; + address creator; + } + + struct InferenceInfo { + uint256 inferenceId; + bytes input; + bytes output; + uint256 value; + address disputingAddress; + address modelAddress; + uint40 expiredAt; InferenceStatus status; address creator; } @@ -106,10 +136,12 @@ interface IWorkerHub is IInferable { event BlocksPerEpoch(uint256 oldBlocks, uint256 newBlocks); error AlreadyRegistered(); + error AlreadySubmitted(); error NotRegistered(); error Unauthorized(); error StillBeingLocked(); + error InvalidBlockValue(); error InvalidTier(); error FeeTooLow(); diff --git a/contracts/storages/WorkerHubStorage.sol b/contracts/storages/WorkerHubStorage.sol index 9a47f05..5d8bc94 100644 --- a/contracts/storages/WorkerHubStorage.sol +++ b/contracts/storages/WorkerHubStorage.sol @@ -63,5 +63,5 @@ abstract contract WorkerHubStorage is IWorkerHub { uint256 public rewardPerEpochBasedOnPerf; uint256 public rewardPerEpoch; - uint256[50] private __gap; + uint256[100] private __gap; } From 03f2eef9eec86909e1c4db05cca0eec871d69120 Mon Sep 17 00:00:00 2001 From: kochou-nbc Date: Thu, 9 May 2024 14:37:36 +0700 Subject: [PATCH 23/82] update deploy scripts --- scripts/deployHybridModel.ts | 19 +++++++++++++------ scripts/deployWorkerHub.ts | 36 ++++++++++++++++++++++++++---------- 2 files changed, 39 insertions(+), 16 deletions(-) diff --git a/scripts/deployHybridModel.ts b/scripts/deployHybridModel.ts index 2f6894a..12db6c7 100644 --- a/scripts/deployHybridModel.ts +++ b/scripts/deployHybridModel.ts @@ -8,9 +8,17 @@ async function deployHybridModel() { const workerHubAddress = config.workerHubAddress; const identifier = 0; - const name = 'Futuristic Fragment';//`Model ${identifier}`; - const url = '';//`abc.com/${identifier}`; - const inferenceCost = ethers.utils.parseEther('100'); + const name = 'Max Multi';//`Model ${identifier}`; + const metadata = '{\n' + + '\t"version": 1,\n' + + '\t"model_name": "MaxMulti",\n' + + '\t"model_type": "image",\n' + + '\t"model_url": "https://gateway.lighthouse.storage/ipfs/QmcFYMYpVodkpT6t1fVmWNjPnUnnQbXvwpqyheXvPGKUr8",\n' + + '\t"model_file_hash": "7f1f29cb884c5b2f4d072b99afcb87f32cbe4adc88cffedab15ffc9fd30887ae",\n' + + '\t"min_hardware": 1,\n' + + '\t"verifier_url": "https://gateway.lighthouse.storage/ipfs/QmdkKEjx2fauzbPh1j5bUiQXrUG5Ft36pJGHS8awrN89Dc",\n' + + '\t"verifier_file_hash": "492b2b3dea3003d359fe1b2cee77a22777d8a9faf942ab6dee81e6bfadaadec4"\n' + + '}' const hybridModel = await upgrades.deployProxy( HybridModel, @@ -18,14 +26,13 @@ async function deployHybridModel() { workerHubAddress, identifier, name, - url, - inferenceCost + metadata ] ); await hybridModel.deployed(); const workerHub = WorkerHub.attach(workerHubAddress); - await workerHub.registerModel(hybridModel.address); + await workerHub.registerModel(hybridModel.address, 1, ethers.utils.parseEther('100')); console.log(`Contract HybridModel has been deployed to address ${hybridModel.address}`); diff --git a/scripts/deployWorkerHub.ts b/scripts/deployWorkerHub.ts index 3d8e0f5..802c36c 100644 --- a/scripts/deployWorkerHub.ts +++ b/scripts/deployWorkerHub.ts @@ -21,26 +21,42 @@ async function deployWorkerHub() { `Missing ${networkName}_TREASURY_ADDRESS from environment variables!` ); - const collectionAddress = config.collectionAddress || ethers.constants.AddressZero; - - const feePercentage = 10; - const royaltyPercentage = 10; - const minimumStake = ethers.constants.WeiPerEther; - const stakeLockingDuration = 0; + // const collectionAddress = config.collectionAddress || ethers.constants.AddressZero; + const feePercentage = 10_00; + const minterMinimumStake = ethers.utils.parseEther("70000"); + const validatorMinimumStake = ethers.utils.parseEther("70000"); + const mintingTimeLimit = 300; + const minterRequirement = 3; + const blockPerEpoch = 100; + const rewardPerEpochBasedOnPerf = ethers.utils.parseEther("0.5"); + const unstakeDelayTime = 12 * 24 * 3600; const workerHub = await upgrades.deployProxy( WorkerHub, [ treasuryAddress, - collectionAddress, feePercentage, - royaltyPercentage, - minimumStake, - stakeLockingDuration + minterMinimumStake, + validatorMinimumStake, + mintingTimeLimit, + minterRequirement, + blockPerEpoch, + rewardPerEpochBasedOnPerf, + unstakeDelayTime ] ); await workerHub.deployed(); + + await (await workerHub.setNewRewardInEpoch(ethers.utils.parseEther('1'))).wait(); + + const tx = { + to: workerHub.address, + value: ethers.utils.parseEther('1000') + } + + await (await ethers.getSigners())[0].sendTransaction(tx); + console.log(`Contract WorkerHub has been deployed to address ${workerHub.address}`); return workerHub.address; })(); From 5866c28fb39d8c3352a4a0e411d5662c39f20221 Mon Sep 17 00:00:00 2001 From: kelvin2608 <2608@newbitcoincity.com> Date: Thu, 9 May 2024 14:46:18 +0700 Subject: [PATCH 24/82] update code submit solution --- contracts/WorkerHub.sol | 34 +++++++++++++++++++--------------- scripts/deployWorkerHub.ts | 2 +- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/contracts/WorkerHub.sol b/contracts/WorkerHub.sol index 37e247d..df6faf5 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -398,6 +398,7 @@ ReentrancyGuardUpgradeable { } } + function submitSolution(uint256 _assigmentId, bytes calldata _data) public virtual whenNotPaused { _updateEpoch(); address _msgSender = msg.sender; @@ -407,9 +408,17 @@ ReentrancyGuardUpgradeable { if (_msgSender != clonedAssignments.worker) revert Unauthorized(); if (clonedAssignments.output.length != 0) revert AlreadySubmitted(); - assignments[_assigmentId].output = _data; //Record the solution - Inference memory clonedInference = inferences[clonedAssignments.inferenceId]; + + if (clonedInference.expiredAt < block.timestamp) { + if (clonedInference.assignments.length == 0) { + _assignMinters(clonedAssignments.inferenceId); + return; + } else { + revert("Expire time"); + } + } + Inference storage inference = inferences[clonedAssignments.inferenceId]; // if inference.status is not Solving, the Tx will fail. @@ -418,22 +427,17 @@ ReentrancyGuardUpgradeable { _assignMinters(clonedAssignments.inferenceId); } + assignments[_assigmentId].output = _data; //Record the solution inference.status = InferenceStatus.Solved; - uint256[] memory inferAssignments = clonedInference.assignments; - uint256 assignmentsLen = inferAssignments.length; + inference.assignments.push(_assigmentId); - for (uint8 i = 0; i < assignmentsLen; i++) { - if (inferAssignments[i] == _assigmentId) { - inference.firstSubmissionId = i; - break; - } - } - uint256 curEpoch = currentEpoch; - minterTaskCompleted[_msgSender][curEpoch] += 1; - rewardInEpoch[curEpoch].totalTaskCompleted += 1; - - TransferHelper.safeTransferNative(_msgSender, clonedInference.value); + if (inference.assignments.length == 1) { + uint256 curEpoch = currentEpoch; + minterTaskCompleted[_msgSender][curEpoch] += 1; + rewardInEpoch[curEpoch].totalTaskCompleted += 1; + TransferHelper.safeTransferNative(_msgSender, clonedInference.value); + } emit SolutionSubmission(_msgSender, _assigmentId); } diff --git a/scripts/deployWorkerHub.ts b/scripts/deployWorkerHub.ts index 802c36c..eea4a95 100644 --- a/scripts/deployWorkerHub.ts +++ b/scripts/deployWorkerHub.ts @@ -28,7 +28,7 @@ async function deployWorkerHub() { const validatorMinimumStake = ethers.utils.parseEther("70000"); const mintingTimeLimit = 300; const minterRequirement = 3; - const blockPerEpoch = 100; + const blockPerEpoch = 600; const rewardPerEpochBasedOnPerf = ethers.utils.parseEther("0.5"); const unstakeDelayTime = 12 * 24 * 3600; From e67297fc51a54519416e00fb4edbb8f5c4972007 Mon Sep 17 00:00:00 2001 From: kelvin2608 <2608@newbitcoincity.com> Date: Thu, 9 May 2024 15:01:54 +0700 Subject: [PATCH 25/82] Eliminate outdated logic --- contracts/WorkerHub.sol | 7 ------- 1 file changed, 7 deletions(-) diff --git a/contracts/WorkerHub.sol b/contracts/WorkerHub.sol index df6faf5..922d63b 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -421,17 +421,10 @@ ReentrancyGuardUpgradeable { Inference storage inference = inferences[clonedAssignments.inferenceId]; - // if inference.status is not Solving, the Tx will fail. - if (clonedInference.status != InferenceStatus.Solving) revert AlreadySubmitted(); - if (clonedInference.expiredAt > block.timestamp) { - _assignMinters(clonedAssignments.inferenceId); - } - assignments[_assigmentId].output = _data; //Record the solution inference.status = InferenceStatus.Solved; inference.assignments.push(_assigmentId); - if (inference.assignments.length == 1) { uint256 curEpoch = currentEpoch; minterTaskCompleted[_msgSender][curEpoch] += 1; From 303420280f36c0b9558cdd892bf87e36da10b9da Mon Sep 17 00:00:00 2001 From: kochou-nbc Date: Thu, 9 May 2024 15:15:04 +0700 Subject: [PATCH 26/82] update deploy scripts --- .openzeppelin/unknown-20156.json | 2797 +++++++++++++++++++++++++++ contracts/WorkerHub.sol | 10 +- contracts/interfaces/IWorkerHub.sol | 4 +- package.json | 2 + scripts/deployModelCollection.ts | 49 + 5 files changed, 2859 insertions(+), 3 deletions(-) create mode 100644 scripts/deployModelCollection.ts diff --git a/.openzeppelin/unknown-20156.json b/.openzeppelin/unknown-20156.json index b1ca00c..f0a4639 100644 --- a/.openzeppelin/unknown-20156.json +++ b/.openzeppelin/unknown-20156.json @@ -64,6 +64,21 @@ "address": "0xD65Bcd702A1260ec165bE6175Bd91cAfD99112F5", "txHash": "0xf8d1c6579d1e0919b954563436c917eb5ce92da94c48130bd2c6d391a7b37969", "kind": "transparent" + }, + { + "address": "0xfC662501feDBe154Dc72004f26033895501d7764", + "txHash": "0xecbf475a40c9c67daa4726dd65fbb8a6446ac3a7f4b1bebb953fa00814d0d353", + "kind": "transparent" + }, + { + "address": "0x5AE8B725d99b60b87B22651e5Da24629D58135B7", + "txHash": "0x8678cb7f7dd0c99a4e4466c077c4156ef30af856c49e98556b7b5a20b3d8b9ca", + "kind": "transparent" + }, + { + "address": "0xb4B5a53c379417002fF74d6E63a72d6c52573561", + "txHash": "0xca7d14f05c7920fe180f763cf18e434681f489f7a6e6db2a37fc4e74e930633d", + "kind": "transparent" } ], "impls": { @@ -1756,6 +1771,2788 @@ }, "namespaces": {} } + }, + "80923fdf3f842e80817cfb85ff464fd23fd30925ea48e6f74abb4cc7d6429b20": { + "address": "0x359e4D7Ec37D36c7cDF483406227Dd8f33037397", + "txHash": "0x548ba4392cab8a6230c87fc4ce884743eedcf67d2b4149e30e7c2c4dd4f6b73a", + "layout": { + "solcVersion": "0.8.19", + "storage": [ + { + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:63", + "retypedFrom": "bool" + }, + { + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:68" + }, + { + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)50_storage", + "contract": "ContextUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:40" + }, + { + "label": "__gap", + "offset": 0, + "slot": "51", + "type": "t_array(t_uint256)50_storage", + "contract": "ERC165Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol:41" + }, + { + "label": "_name", + "offset": 0, + "slot": "101", + "type": "t_string_storage", + "contract": "ERC721Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:25" + }, + { + "label": "_symbol", + "offset": 0, + "slot": "102", + "type": "t_string_storage", + "contract": "ERC721Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:28" + }, + { + "label": "_owners", + "offset": 0, + "slot": "103", + "type": "t_mapping(t_uint256,t_address)", + "contract": "ERC721Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:31" + }, + { + "label": "_balances", + "offset": 0, + "slot": "104", + "type": "t_mapping(t_address,t_uint256)", + "contract": "ERC721Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:34" + }, + { + "label": "_tokenApprovals", + "offset": 0, + "slot": "105", + "type": "t_mapping(t_uint256,t_address)", + "contract": "ERC721Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:37" + }, + { + "label": "_operatorApprovals", + "offset": 0, + "slot": "106", + "type": "t_mapping(t_address,t_mapping(t_address,t_bool))", + "contract": "ERC721Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:40" + }, + { + "label": "__gap", + "offset": 0, + "slot": "107", + "type": "t_array(t_uint256)44_storage", + "contract": "ERC721Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:477" + }, + { + "label": "models", + "offset": 0, + "slot": "151", + "type": "t_mapping(t_uint256,t_address)", + "contract": "ModelCollectionStorage", + "src": "contracts/storages/ModelCollectionStorage.sol:7" + }, + { + "label": "nextModelId", + "offset": 0, + "slot": "152", + "type": "t_uint256", + "contract": "ModelCollectionStorage", + "src": "contracts/storages/ModelCollectionStorage.sol:8" + }, + { + "label": "mintPrice", + "offset": 0, + "slot": "153", + "type": "t_uint256", + "contract": "ModelCollectionStorage", + "src": "contracts/storages/ModelCollectionStorage.sol:9" + }, + { + "label": "royaltyReceiver", + "offset": 0, + "slot": "154", + "type": "t_address", + "contract": "ModelCollectionStorage", + "src": "contracts/storages/ModelCollectionStorage.sol:10" + }, + { + "label": "royaltyPortion", + "offset": 20, + "slot": "154", + "type": "t_uint16", + "contract": "ModelCollectionStorage", + "src": "contracts/storages/ModelCollectionStorage.sol:11" + }, + { + "label": "__gap", + "offset": 0, + "slot": "155", + "type": "t_array(t_uint256)50_storage", + "contract": "ModelCollectionStorage", + "src": "contracts/storages/ModelCollectionStorage.sol:13" + }, + { + "label": "_hashedName", + "offset": 0, + "slot": "205", + "type": "t_bytes32", + "contract": "EIP712Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol:40", + "renamedFrom": "_HASHED_NAME" + }, + { + "label": "_hashedVersion", + "offset": 0, + "slot": "206", + "type": "t_bytes32", + "contract": "EIP712Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol:42", + "renamedFrom": "_HASHED_VERSION" + }, + { + "label": "_name", + "offset": 0, + "slot": "207", + "type": "t_string_storage", + "contract": "EIP712Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol:44" + }, + { + "label": "_version", + "offset": 0, + "slot": "208", + "type": "t_string_storage", + "contract": "EIP712Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol:45" + }, + { + "label": "__gap", + "offset": 0, + "slot": "209", + "type": "t_array(t_uint256)48_storage", + "contract": "EIP712Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol:204" + }, + { + "label": "_ownedTokens", + "offset": 0, + "slot": "257", + "type": "t_mapping(t_address,t_mapping(t_uint256,t_uint256))", + "contract": "ERC721EnumerableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721EnumerableUpgradeable.sol:17" + }, + { + "label": "_ownedTokensIndex", + "offset": 0, + "slot": "258", + "type": "t_mapping(t_uint256,t_uint256)", + "contract": "ERC721EnumerableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721EnumerableUpgradeable.sol:20" + }, + { + "label": "_allTokens", + "offset": 0, + "slot": "259", + "type": "t_array(t_uint256)dyn_storage", + "contract": "ERC721EnumerableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721EnumerableUpgradeable.sol:23" + }, + { + "label": "_allTokensIndex", + "offset": 0, + "slot": "260", + "type": "t_mapping(t_uint256,t_uint256)", + "contract": "ERC721EnumerableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721EnumerableUpgradeable.sol:26" + }, + { + "label": "__gap", + "offset": 0, + "slot": "261", + "type": "t_array(t_uint256)46_storage", + "contract": "ERC721EnumerableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721EnumerableUpgradeable.sol:171" + }, + { + "label": "_paused", + "offset": 0, + "slot": "307", + "type": "t_bool", + "contract": "PausableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol:29" + }, + { + "label": "__gap", + "offset": 0, + "slot": "308", + "type": "t_array(t_uint256)49_storage", + "contract": "PausableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol:116" + }, + { + "label": "__gap", + "offset": 0, + "slot": "357", + "type": "t_array(t_uint256)50_storage", + "contract": "ERC721PausableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721PausableUpgradeable.sol:53" + }, + { + "label": "_tokenURIs", + "offset": 0, + "slot": "407", + "type": "t_mapping(t_uint256,t_string_storage)", + "contract": "ERC721URIStorageUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721URIStorageUpgradeable.sol:17" + }, + { + "label": "__gap", + "offset": 0, + "slot": "408", + "type": "t_array(t_uint256)49_storage", + "contract": "ERC721URIStorageUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721URIStorageUpgradeable.sol:86" + }, + { + "label": "_owner", + "offset": 0, + "slot": "457", + "type": "t_address", + "contract": "OwnableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:22" + }, + { + "label": "__gap", + "offset": 0, + "slot": "458", + "type": "t_array(t_uint256)49_storage", + "contract": "OwnableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:94" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_uint256)44_storage": { + "label": "uint256[44]", + "numberOfBytes": "1408" + }, + "t_array(t_uint256)46_storage": { + "label": "uint256[46]", + "numberOfBytes": "1472" + }, + "t_array(t_uint256)48_storage": { + "label": "uint256[48]", + "numberOfBytes": "1536" + }, + "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_bytes32": { + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_bool)": { + "label": "mapping(address => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_mapping(t_address,t_bool))": { + "label": "mapping(address => mapping(address => 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_uint256)": { + "label": "mapping(address => uint256)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_address)": { + "label": "mapping(uint256 => address)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_string_storage)": { + "label": "mapping(uint256 => string)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_uint256)": { + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32" + }, + "t_string_storage": { + "label": "string", + "numberOfBytes": "32" + }, + "t_uint16": { + "label": "uint16", + "numberOfBytes": "2" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + }, + "namespaces": {} + } + }, + "1cc68a4b936075964a6e1e210ff8e3416c25bda0344074d86f45fb18126a65b8": { + "address": "0x1802761a5B21332b02e5312b92b0c55401DE14Da", + "txHash": "0x7e48fcec054bc4f3c43519d2b94d873e2ec342994f04bce77323ac4714677681", + "layout": { + "solcVersion": "0.8.19", + "storage": [ + { + "label": "identifier", + "offset": 0, + "slot": "0", + "type": "t_uint256", + "contract": "HybridModelStorage", + "src": "contracts/storages/HybridModelStorage.sol:7" + }, + { + "label": "name", + "offset": 0, + "slot": "1", + "type": "t_string_storage", + "contract": "HybridModelStorage", + "src": "contracts/storages/HybridModelStorage.sol:9" + }, + { + "label": "metadata", + "offset": 0, + "slot": "2", + "type": "t_string_storage", + "contract": "HybridModelStorage", + "src": "contracts/storages/HybridModelStorage.sol:10" + }, + { + "label": "workerHub", + "offset": 0, + "slot": "3", + "type": "t_address", + "contract": "HybridModelStorage", + "src": "contracts/storages/HybridModelStorage.sol:12" + }, + { + "label": "__gap", + "offset": 0, + "slot": "4", + "type": "t_array(t_uint256)50_storage", + "contract": "HybridModelStorage", + "src": "contracts/storages/HybridModelStorage.sol:14" + }, + { + "label": "_initialized", + "offset": 0, + "slot": "54", + "type": "t_uint8", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:63", + "retypedFrom": "bool" + }, + { + "label": "_initializing", + "offset": 1, + "slot": "54", + "type": "t_bool", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:68" + }, + { + "label": "__gap", + "offset": 0, + "slot": "55", + "type": "t_array(t_uint256)50_storage", + "contract": "ContextUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:40" + }, + { + "label": "_owner", + "offset": 0, + "slot": "105", + "type": "t_address", + "contract": "OwnableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:22" + }, + { + "label": "__gap", + "offset": 0, + "slot": "106", + "type": "t_array(t_uint256)49_storage", + "contract": "OwnableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:94" + }, + { + "label": "_paused", + "offset": 0, + "slot": "155", + "type": "t_bool", + "contract": "PausableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol:29" + }, + { + "label": "__gap", + "offset": 0, + "slot": "156", + "type": "t_array(t_uint256)49_storage", + "contract": "PausableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol:116" + }, + { + "label": "_status", + "offset": 0, + "slot": "205", + "type": "t_uint256", + "contract": "ReentrancyGuardUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol:38" + }, + { + "label": "__gap", + "offset": 0, + "slot": "206", + "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_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_string_storage": { + "label": "string", + "numberOfBytes": "32" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + }, + "namespaces": {} + } + }, + "0762af573778b62bc5791f9255dacf47b09112a89454a99e8ad0bd8616db835c": { + "address": "0x7625793508eC03ADE3d3f173C6D8381B9411C63a", + "txHash": "0xb3b122921de81505ef5d6a0b1b2af45f72bc7551344277ba74be0ebd3d0b6268", + "layout": { + "solcVersion": "0.8.19", + "storage": [ + { + "label": "randomizer", + "offset": 0, + "slot": "0", + "type": "t_struct(Randomizer)3266_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:10" + }, + { + "label": "models", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_struct(Model)3021_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:12" + }, + { + "label": "minters", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_address,t_struct(Worker)3034_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:13" + }, + { + "label": "validators", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_address,t_struct(Worker)3034_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:14" + }, + { + "label": "minterAddressesByModel", + "offset": 0, + "slot": "4", + "type": "t_mapping(t_address,t_struct(AddressSet)3310_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:16" + }, + { + "label": "validatorAddressesByModel", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_address,t_struct(AddressSet)3310_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:17" + }, + { + "label": "modelAddresses", + "offset": 0, + "slot": "6", + "type": "t_struct(AddressSet)3310_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:19" + }, + { + "label": "minterAddresses", + "offset": 0, + "slot": "8", + "type": "t_struct(AddressSet)3310_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:20" + }, + { + "label": "validatorAddresses", + "offset": 0, + "slot": "10", + "type": "t_struct(AddressSet)3310_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:21" + }, + { + "label": "minterUnstakeRequests", + "offset": 0, + "slot": "12", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3115_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:23" + }, + { + "label": "validatorUnstakeRequests", + "offset": 0, + "slot": "13", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3115_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)3090_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)3058_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:30" + }, + { + "label": "assignmentsByMinter", + "offset": 0, + "slot": "18", + "type": "t_mapping(t_address,t_struct(Uint256Set)3480_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:31" + }, + { + "label": "assignmentsByInference", + "offset": 0, + "slot": "19", + "type": "t_mapping(t_uint256,t_struct(Uint256Set)3480_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(MinterEpochState)3016_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:38" + }, + { + "label": "minterTaskCompleted", + "offset": 0, + "slot": "22", + "type": "t_mapping(t_address,t_mapping(t_uint256,t_uint256))", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:43" + }, + { + "label": "minterMinimumStake", + "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": "mintingTimeLimit", + "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": "minterRequirement", + "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)3007": { + "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)3310_storage)": { + "label": "mapping(address => struct Set.AddressSet)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Model)3021_storage)": { + "label": "mapping(address => struct IWorkerHub.Model)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Uint256Set)3480_storage)": { + "label": "mapping(address => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(UnstakeRequest)3115_storage)": { + "label": "mapping(address => struct IWorkerHub.UnstakeRequest)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Worker)3034_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)3058_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Assignment)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Inference)3090_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Inference)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(MinterEpochState)3016_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.MinterEpochState)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Uint256Set)3480_storage)": { + "label": "mapping(uint256 => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_uint256)": { + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32" + }, + "t_struct(AddressSet)3310_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)3058_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)3090_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)3007", + "offset": 26, + "slot": "4" + }, + { + "label": "creator", + "type": "t_address", + "offset": 0, + "slot": "5" + } + ], + "numberOfBytes": "192" + }, + "t_struct(MinterEpochState)3016_storage": { + "label": "struct IWorkerHub.MinterEpochState", + "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": "totalMinter", + "type": "t_uint256", + "offset": 0, + "slot": "3" + } + ], + "numberOfBytes": "128" + }, + "t_struct(Model)3021_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)3266_storage": { + "label": "struct Random.Randomizer", + "members": [ + { + "label": "nonce", + "type": "t_uint256", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(Uint256Set)3480_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)3115_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)3034_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": {} + } + }, + "49309266d7cc8cae52c0f6ea055a18ab180b183976b410083dd254e0686d55e7": { + "address": "0x45eB4B2CE7324c836260A042093CD4A88249c32e", + "txHash": "0x8ebb6912cb86cd35ce97d1fb3a57aa6545f4094c8ba4ac69ad5f5d62eeb3201b", + "layout": { + "solcVersion": "0.8.19", + "storage": [ + { + "label": "randomizer", + "offset": 0, + "slot": "0", + "type": "t_struct(Randomizer)3284_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:10" + }, + { + "label": "models", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_struct(Model)3035_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:12" + }, + { + "label": "minters", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_address,t_struct(Worker)3048_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:13" + }, + { + "label": "validators", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_address,t_struct(Worker)3048_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:14" + }, + { + "label": "minterAddressesByModel", + "offset": 0, + "slot": "4", + "type": "t_mapping(t_address,t_struct(AddressSet)3328_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:16" + }, + { + "label": "validatorAddressesByModel", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_address,t_struct(AddressSet)3328_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:17" + }, + { + "label": "modelAddresses", + "offset": 0, + "slot": "6", + "type": "t_struct(AddressSet)3328_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:19" + }, + { + "label": "minterAddresses", + "offset": 0, + "slot": "8", + "type": "t_struct(AddressSet)3328_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:20" + }, + { + "label": "validatorAddresses", + "offset": 0, + "slot": "10", + "type": "t_struct(AddressSet)3328_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:21" + }, + { + "label": "minterUnstakeRequests", + "offset": 0, + "slot": "12", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3133_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:23" + }, + { + "label": "validatorUnstakeRequests", + "offset": 0, + "slot": "13", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3133_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)3108_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)3072_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:30" + }, + { + "label": "assignmentsByMinter", + "offset": 0, + "slot": "18", + "type": "t_mapping(t_address,t_struct(Uint256Set)3498_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:31" + }, + { + "label": "assignmentsByInference", + "offset": 0, + "slot": "19", + "type": "t_mapping(t_uint256,t_struct(Uint256Set)3498_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(MinterEpochState)3030_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:38" + }, + { + "label": "minterTaskCompleted", + "offset": 0, + "slot": "22", + "type": "t_mapping(t_address,t_mapping(t_uint256,t_uint256))", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:43" + }, + { + "label": "minterMinimumStake", + "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": "mintingTimeLimit", + "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": "minterRequirement", + "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)3021": { + "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)3328_storage)": { + "label": "mapping(address => struct Set.AddressSet)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Model)3035_storage)": { + "label": "mapping(address => struct IWorkerHub.Model)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Uint256Set)3498_storage)": { + "label": "mapping(address => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(UnstakeRequest)3133_storage)": { + "label": "mapping(address => struct IWorkerHub.UnstakeRequest)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Worker)3048_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)3072_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Assignment)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Inference)3108_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Inference)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(MinterEpochState)3030_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.MinterEpochState)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Uint256Set)3498_storage)": { + "label": "mapping(uint256 => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_uint256)": { + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32" + }, + "t_struct(AddressSet)3328_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)3072_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)3108_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)3021", + "offset": 26, + "slot": "4" + }, + { + "label": "creator", + "type": "t_address", + "offset": 0, + "slot": "5" + } + ], + "numberOfBytes": "192" + }, + "t_struct(MinterEpochState)3030_storage": { + "label": "struct IWorkerHub.MinterEpochState", + "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": "totalMinter", + "type": "t_uint256", + "offset": 0, + "slot": "3" + } + ], + "numberOfBytes": "128" + }, + "t_struct(Model)3035_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)3284_storage": { + "label": "struct Random.Randomizer", + "members": [ + { + "label": "nonce", + "type": "t_uint256", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(Uint256Set)3498_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)3133_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)3048_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": {} + } + }, + "f2d51efd7368cc8425ff712b8568fbd5b4776bd664d9d9c596f46b95f8dae859": { + "address": "0xF951891fF5F8DeC5398453D18B022e839F56d881", + "txHash": "0xdc875ec01948fda018272a0f2a2a4c5c45e04bae89e051d3945337c1404b0695", + "layout": { + "solcVersion": "0.8.19", + "storage": [ + { + "label": "randomizer", + "offset": 0, + "slot": "0", + "type": "t_struct(Randomizer)3263_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:10" + }, + { + "label": "models", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_struct(Model)3014_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:12" + }, + { + "label": "minters", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_address,t_struct(Worker)3027_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:13" + }, + { + "label": "validators", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_address,t_struct(Worker)3027_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:14" + }, + { + "label": "minterAddressesByModel", + "offset": 0, + "slot": "4", + "type": "t_mapping(t_address,t_struct(AddressSet)3307_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:16" + }, + { + "label": "validatorAddressesByModel", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_address,t_struct(AddressSet)3307_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:17" + }, + { + "label": "modelAddresses", + "offset": 0, + "slot": "6", + "type": "t_struct(AddressSet)3307_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:19" + }, + { + "label": "minterAddresses", + "offset": 0, + "slot": "8", + "type": "t_struct(AddressSet)3307_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:20" + }, + { + "label": "validatorAddresses", + "offset": 0, + "slot": "10", + "type": "t_struct(AddressSet)3307_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:21" + }, + { + "label": "minterUnstakeRequests", + "offset": 0, + "slot": "12", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3112_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:23" + }, + { + "label": "validatorUnstakeRequests", + "offset": 0, + "slot": "13", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3112_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)3087_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)3051_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:30" + }, + { + "label": "assignmentsByMinter", + "offset": 0, + "slot": "18", + "type": "t_mapping(t_address,t_struct(Uint256Set)3477_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:31" + }, + { + "label": "assignmentsByInference", + "offset": 0, + "slot": "19", + "type": "t_mapping(t_uint256,t_struct(Uint256Set)3477_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(MinterEpochState)3009_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:38" + }, + { + "label": "minterTaskCompleted", + "offset": 0, + "slot": "22", + "type": "t_mapping(t_address,t_mapping(t_uint256,t_uint256))", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:43" + }, + { + "label": "minterMinimumStake", + "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": "mintingTimeLimit", + "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": "minterRequirement", + "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)3000": { + "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)3307_storage)": { + "label": "mapping(address => struct Set.AddressSet)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Model)3014_storage)": { + "label": "mapping(address => struct IWorkerHub.Model)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Uint256Set)3477_storage)": { + "label": "mapping(address => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(UnstakeRequest)3112_storage)": { + "label": "mapping(address => struct IWorkerHub.UnstakeRequest)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Worker)3027_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)3051_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Assignment)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Inference)3087_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Inference)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(MinterEpochState)3009_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.MinterEpochState)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Uint256Set)3477_storage)": { + "label": "mapping(uint256 => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_uint256)": { + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32" + }, + "t_struct(AddressSet)3307_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)3051_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)3087_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)3000", + "offset": 26, + "slot": "4" + }, + { + "label": "creator", + "type": "t_address", + "offset": 0, + "slot": "5" + } + ], + "numberOfBytes": "192" + }, + "t_struct(MinterEpochState)3009_storage": { + "label": "struct IWorkerHub.MinterEpochState", + "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": "totalMinter", + "type": "t_uint256", + "offset": 0, + "slot": "3" + } + ], + "numberOfBytes": "128" + }, + "t_struct(Model)3014_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)3263_storage": { + "label": "struct Random.Randomizer", + "members": [ + { + "label": "nonce", + "type": "t_uint256", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(Uint256Set)3477_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)3112_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)3027_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 922d63b..b744754 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -64,6 +64,10 @@ ReentrancyGuardUpgradeable { _unpause(); } + function getModelAddresses() external view returns (address[] memory) { + return modelAddresses.values; + } + function getMintingAssignments() external view returns (AssignmentInfo[] memory) { uint256[] memory assignmentIds = assignmentsByMinter[msg.sender].values; uint256 assignmentNumber = assignmentIds.length; @@ -81,8 +85,10 @@ ReentrancyGuardUpgradeable { result[counter++] = AssignmentInfo( assignmentIds[i], assignment.inferenceId, - inference.modelAddress, + inference.value, inference.input, + inference.modelAddress, + inference.creator, inference.expiredAt ); } @@ -398,7 +404,7 @@ ReentrancyGuardUpgradeable { } } - + function submitSolution(uint256 _assigmentId, bytes calldata _data) public virtual whenNotPaused { _updateEpoch(); address _msgSender = msg.sender; diff --git a/contracts/interfaces/IWorkerHub.sol b/contracts/interfaces/IWorkerHub.sol index ea5a83b..d756cfd 100644 --- a/contracts/interfaces/IWorkerHub.sol +++ b/contracts/interfaces/IWorkerHub.sol @@ -53,8 +53,10 @@ interface IWorkerHub is IInferable { struct AssignmentInfo { uint256 assignmentId; uint256 inferenceId; - address modelAddress; + uint256 value; bytes input; + address modelAddress; + address creator; uint40 expiredAt; } diff --git a/package.json b/package.json index d70f725..b35b984 100644 --- a/package.json +++ b/package.json @@ -10,9 +10,11 @@ "ts:run": "npx ts-node", "test": "echo \"Error: no test specified\" && exit 1", "console:regtest3": "npx hardhat console --network regtest3", + "deployModelCollection:regtest3": "npx hardhat run scripts/deployModelCollection.ts --network regtest3", "deployWorkerHub:regtest3": "npx hardhat run scripts/deployWorkerHub.ts --network regtest3", "deployHybridModel:regtest3": "npx hardhat run scripts/deployHybridModel.ts --network regtest3", "console:cudatest": "npx hardhat console --network cudatest", + "deployModelCollection:cudatest": "npx hardhat run scripts/deployModelCollection.ts --network cudatest", "deployWorkerHub:cudatest": "npx hardhat run scripts/deployWorkerHub.ts --network cudatest", "deployHybridModel:cudatest": "npx hardhat run scripts/deployHyrbidModel.ts --network cudatest" }, diff --git a/scripts/deployModelCollection.ts b/scripts/deployModelCollection.ts new file mode 100644 index 0000000..c85d85f --- /dev/null +++ b/scripts/deployModelCollection.ts @@ -0,0 +1,49 @@ +import assert from 'assert'; +import { ethers, network, upgrades } from 'hardhat'; + +async function deployModelCollection() { + const config = network.config as any; + const networkName = network.name.toUpperCase(); + const ModelCollection = await ethers.getContractFactory('ModelCollection'); + const modelCollectionAddress = config.collectionAddress ? + await (async () => { + await upgrades.upgradeProxy( + config.collectionAddress, + ModelCollection, + ); + console.log(`Contract ModelCollection has been updated to address ${config.collectionAddress}`); + return config.collectionAddress; + })() : + await (async () => { + const name = "Model" + const symbol = "MDL" + const mintPrice = ethers.utils.parseEther('100'); + const royaltyReceiver = (await ethers.getSigners())[0].address + const royalPortion = 20_00; + const nextModelId = 1000001; + + const modelCollection = await upgrades.deployProxy( + ModelCollection, + [ + name, + symbol, + mintPrice, + royaltyReceiver, + royalPortion, + nextModelId + ] + ); + await modelCollection.deployed(); + + console.log(`Contract ModelCollection has been deployed to address ${modelCollection.address}`); + return modelCollection.address; + })(); + console.log(`${networkName}_COLLECTION_ADDRESS=${modelCollectionAddress}`); +} + +deployModelCollection() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); From 38a8044d3812feabe2683719bf41b4543b2c4227 Mon Sep 17 00:00:00 2001 From: 180945 <180945@trustless.computer> Date: Thu, 9 May 2024 16:57:39 +0700 Subject: [PATCH 27/82] fixed init epoch --- contracts/WorkerHub.sol | 1 + tests/Test.t.sol | 12 ++++++------ 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/contracts/WorkerHub.sol b/contracts/WorkerHub.sol index df6faf5..aac960c 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -50,6 +50,7 @@ ReentrancyGuardUpgradeable { rewardPerEpochBasedOnPerf = _rewardPerEpochBasedOnPerf; unstakeDelayTime = _unstakeDelayTime; maximumTier = 1; + lastBlock = block.number; } function version() external pure returns (string memory) { diff --git a/tests/Test.t.sol b/tests/Test.t.sol index bc73035..4cbafa3 100644 --- a/tests/Test.t.sol +++ b/tests/Test.t.sol @@ -53,9 +53,9 @@ contract WorkHubTest is Test { vm.deal(Miner1, 2e18); vm.deal(Miner2, 2e18); vm.deal(Miner3, 2e18); - + assertEq(workerHub.lastBlock(), 1); // init block height - vm.roll(10); + vm.roll(11); vm.prank(Miner1); workerHub.registerMinter{value: 1e18}(1); @@ -65,6 +65,7 @@ contract WorkHubTest is Test { vm.prank(Miner3); workerHub.registerMinter{value: 1e18}(1); + assertEq(workerHub.lastBlock(), 11); assertEq(workerHub.currentEpoch(), 1); assertEq(workerHub.rewardToClaim(Miner1), 0); assertEq(workerHub.rewardToClaim(Miner2), 0); @@ -75,10 +76,9 @@ contract WorkHubTest is Test { assertEq(epochReward, 1e16); assertEq(totalTaskCompleted, 0); assertEq(workerHub.rewardPerEpoch(), 1e16); - assertEq(workerHub.lastBlock(), 10); // create some data for 2 epochs sequence - vm.roll(30); + vm.roll(31); assertEq(workerHub.rewardToClaim(Miner1), 6666666666666666); assertEq(workerHub.rewardToClaim(Miner2), 6666666666666666); assertEq(workerHub.rewardToClaim(Miner3), 6666666666666666); @@ -136,7 +136,7 @@ contract WorkHubTest is Test { assertEq(Miner1.balance, 906666666666666666 + 2e18); vm.startPrank(Miner1); - vm.roll(50); + vm.roll(51); assertEq(workerHub.rewardToClaim(Miner1), 0); workerHub.claimReward(Miner1); assertEq(Miner1.balance, 906666666666666666 + 2e18); @@ -153,7 +153,7 @@ contract WorkHubTest is Test { assertEq(workerHub.rewardToClaim(Miner1), 0); workerHub.claimReward(Miner1); assertEq(Miner1.balance, 906666666666666666 + 1e18); - vm.roll(60); + vm.roll(61); assertEq(workerHub.rewardToClaim(Miner1), 3333333333333333); workerHub.claimReward(Miner1); assertEq(Miner1.balance, 906666666666666666 + 1e18 + 3333333333333333); From 4ab0a346838250714ebd3c98de3f986eeed26161 Mon Sep 17 00:00:00 2001 From: kochou-nbc Date: Thu, 9 May 2024 17:33:24 +0700 Subject: [PATCH 28/82] rename minter -> minner --- .openzeppelin/unknown-20156.json | 1141 +++++++++++++++++++++ contracts/ModelCollection.sol | 4 +- contracts/WorkerHub.sol | 178 ++-- contracts/interfaces/IModelCollection.sol | 2 + contracts/interfaces/IWorkerHub.sol | 20 +- contracts/storages/WorkerHubStorage.sol | 24 +- scripts/deployHybridModel.ts | 15 + scripts/deployWorkerHub.ts | 14 +- tests/Test.t.sol | 26 +- 9 files changed, 1291 insertions(+), 133 deletions(-) diff --git a/.openzeppelin/unknown-20156.json b/.openzeppelin/unknown-20156.json index f0a4639..e0eb234 100644 --- a/.openzeppelin/unknown-20156.json +++ b/.openzeppelin/unknown-20156.json @@ -79,6 +79,26 @@ "address": "0xb4B5a53c379417002fF74d6E63a72d6c52573561", "txHash": "0xca7d14f05c7920fe180f763cf18e434681f489f7a6e6db2a37fc4e74e930633d", "kind": "transparent" + }, + { + "address": "0x787ab5d29D7596AcAeE838e0e0aBaC9c8C2288aF", + "txHash": "0x58adb18eefad1d11ada6bcc296c6a26d3e18aacd9bf1a49e000189060961a56a", + "kind": "transparent" + }, + { + "address": "0x23185552A359147680837cb0e3CDf8A380836C05", + "txHash": "0x3ff63a926744edaaf4ad7a141890b9ea8bb83dc7fcaa8b20aa7d3ab72239dcc2", + "kind": "transparent" + }, + { + "address": "0xEBD42A8E63ee327c3Eb30d2089E3E858aE74FCE1", + "txHash": "0x942f39caf0edfbe6ae0ccfb489eff50d0439d03b98db0c262dd2033d8e8f4b1e", + "kind": "transparent" + }, + { + "address": "0x8bC20218C88A65340F32178fE90FC804992C9E90", + "txHash": "0xd8b5332866b0b9dd4202f9c7580dd498ad434568725f7ef489d0b5b040055da3", + "kind": "transparent" } ], "impls": { @@ -4553,6 +4573,1127 @@ }, "namespaces": {} } + }, + "d26b765071ecc975c2331a608327b23e8c7633e8ead1e079225a5f115f94c5db": { + "address": "0x920b9d1E9fB3fd5aCd07d64bEAb2A8869CFaAa40", + "txHash": "0x102a0f25558271444ec2ebc62a115e7ab9727bfbe9b40198b771c5aab94aaf9c", + "layout": { + "solcVersion": "0.8.19", + "storage": [ + { + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:63", + "retypedFrom": "bool" + }, + { + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:68" + }, + { + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)50_storage", + "contract": "ContextUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:40" + }, + { + "label": "__gap", + "offset": 0, + "slot": "51", + "type": "t_array(t_uint256)50_storage", + "contract": "ERC165Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol:41" + }, + { + "label": "_name", + "offset": 0, + "slot": "101", + "type": "t_string_storage", + "contract": "ERC721Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:25" + }, + { + "label": "_symbol", + "offset": 0, + "slot": "102", + "type": "t_string_storage", + "contract": "ERC721Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:28" + }, + { + "label": "_owners", + "offset": 0, + "slot": "103", + "type": "t_mapping(t_uint256,t_address)", + "contract": "ERC721Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:31" + }, + { + "label": "_balances", + "offset": 0, + "slot": "104", + "type": "t_mapping(t_address,t_uint256)", + "contract": "ERC721Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:34" + }, + { + "label": "_tokenApprovals", + "offset": 0, + "slot": "105", + "type": "t_mapping(t_uint256,t_address)", + "contract": "ERC721Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:37" + }, + { + "label": "_operatorApprovals", + "offset": 0, + "slot": "106", + "type": "t_mapping(t_address,t_mapping(t_address,t_bool))", + "contract": "ERC721Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:40" + }, + { + "label": "__gap", + "offset": 0, + "slot": "107", + "type": "t_array(t_uint256)44_storage", + "contract": "ERC721Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:477" + }, + { + "label": "models", + "offset": 0, + "slot": "151", + "type": "t_mapping(t_uint256,t_address)", + "contract": "ModelCollectionStorage", + "src": "contracts/storages/ModelCollectionStorage.sol:7" + }, + { + "label": "nextModelId", + "offset": 0, + "slot": "152", + "type": "t_uint256", + "contract": "ModelCollectionStorage", + "src": "contracts/storages/ModelCollectionStorage.sol:8" + }, + { + "label": "mintPrice", + "offset": 0, + "slot": "153", + "type": "t_uint256", + "contract": "ModelCollectionStorage", + "src": "contracts/storages/ModelCollectionStorage.sol:9" + }, + { + "label": "royaltyReceiver", + "offset": 0, + "slot": "154", + "type": "t_address", + "contract": "ModelCollectionStorage", + "src": "contracts/storages/ModelCollectionStorage.sol:10" + }, + { + "label": "royaltyPortion", + "offset": 20, + "slot": "154", + "type": "t_uint16", + "contract": "ModelCollectionStorage", + "src": "contracts/storages/ModelCollectionStorage.sol:11" + }, + { + "label": "__gap", + "offset": 0, + "slot": "155", + "type": "t_array(t_uint256)50_storage", + "contract": "ModelCollectionStorage", + "src": "contracts/storages/ModelCollectionStorage.sol:13" + }, + { + "label": "_hashedName", + "offset": 0, + "slot": "205", + "type": "t_bytes32", + "contract": "EIP712Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol:40", + "renamedFrom": "_HASHED_NAME" + }, + { + "label": "_hashedVersion", + "offset": 0, + "slot": "206", + "type": "t_bytes32", + "contract": "EIP712Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol:42", + "renamedFrom": "_HASHED_VERSION" + }, + { + "label": "_name", + "offset": 0, + "slot": "207", + "type": "t_string_storage", + "contract": "EIP712Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol:44" + }, + { + "label": "_version", + "offset": 0, + "slot": "208", + "type": "t_string_storage", + "contract": "EIP712Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol:45" + }, + { + "label": "__gap", + "offset": 0, + "slot": "209", + "type": "t_array(t_uint256)48_storage", + "contract": "EIP712Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol:204" + }, + { + "label": "_ownedTokens", + "offset": 0, + "slot": "257", + "type": "t_mapping(t_address,t_mapping(t_uint256,t_uint256))", + "contract": "ERC721EnumerableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721EnumerableUpgradeable.sol:17" + }, + { + "label": "_ownedTokensIndex", + "offset": 0, + "slot": "258", + "type": "t_mapping(t_uint256,t_uint256)", + "contract": "ERC721EnumerableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721EnumerableUpgradeable.sol:20" + }, + { + "label": "_allTokens", + "offset": 0, + "slot": "259", + "type": "t_array(t_uint256)dyn_storage", + "contract": "ERC721EnumerableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721EnumerableUpgradeable.sol:23" + }, + { + "label": "_allTokensIndex", + "offset": 0, + "slot": "260", + "type": "t_mapping(t_uint256,t_uint256)", + "contract": "ERC721EnumerableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721EnumerableUpgradeable.sol:26" + }, + { + "label": "__gap", + "offset": 0, + "slot": "261", + "type": "t_array(t_uint256)46_storage", + "contract": "ERC721EnumerableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721EnumerableUpgradeable.sol:171" + }, + { + "label": "_paused", + "offset": 0, + "slot": "307", + "type": "t_bool", + "contract": "PausableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol:29" + }, + { + "label": "__gap", + "offset": 0, + "slot": "308", + "type": "t_array(t_uint256)49_storage", + "contract": "PausableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol:116" + }, + { + "label": "__gap", + "offset": 0, + "slot": "357", + "type": "t_array(t_uint256)50_storage", + "contract": "ERC721PausableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721PausableUpgradeable.sol:53" + }, + { + "label": "_tokenURIs", + "offset": 0, + "slot": "407", + "type": "t_mapping(t_uint256,t_string_storage)", + "contract": "ERC721URIStorageUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721URIStorageUpgradeable.sol:17" + }, + { + "label": "__gap", + "offset": 0, + "slot": "408", + "type": "t_array(t_uint256)49_storage", + "contract": "ERC721URIStorageUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721URIStorageUpgradeable.sol:86" + }, + { + "label": "_owner", + "offset": 0, + "slot": "457", + "type": "t_address", + "contract": "OwnableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:22" + }, + { + "label": "__gap", + "offset": 0, + "slot": "458", + "type": "t_array(t_uint256)49_storage", + "contract": "OwnableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:94" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_uint256)44_storage": { + "label": "uint256[44]", + "numberOfBytes": "1408" + }, + "t_array(t_uint256)46_storage": { + "label": "uint256[46]", + "numberOfBytes": "1472" + }, + "t_array(t_uint256)48_storage": { + "label": "uint256[48]", + "numberOfBytes": "1536" + }, + "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_bytes32": { + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_bool)": { + "label": "mapping(address => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_mapping(t_address,t_bool))": { + "label": "mapping(address => mapping(address => 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_uint256)": { + "label": "mapping(address => uint256)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_address)": { + "label": "mapping(uint256 => address)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_string_storage)": { + "label": "mapping(uint256 => string)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_uint256)": { + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32" + }, + "t_string_storage": { + "label": "string", + "numberOfBytes": "32" + }, + "t_uint16": { + "label": "uint16", + "numberOfBytes": "2" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + }, + "namespaces": {} + } + }, + "c596251116a4dbf42afa038e02c4323455b97b7a45bae160c1f497affdb11266": { + "address": "0x6bb53182851cF72Fb34A5305c18534eFf4A43D80", + "txHash": "0xb744a82df99b7fe464fae8afe8ea6e36771f71d286c0a6110d21a80ea7b5b010", + "layout": { + "solcVersion": "0.8.19", + "storage": [ + { + "label": "randomizer", + "offset": 0, + "slot": "0", + "type": "t_struct(Randomizer)7683_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:10" + }, + { + "label": "models", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_struct(Model)7434_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:12" + }, + { + "label": "minners", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_address,t_struct(Worker)7447_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:13" + }, + { + "label": "validators", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_address,t_struct(Worker)7447_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:14" + }, + { + "label": "minnerAddressesByModel", + "offset": 0, + "slot": "4", + "type": "t_mapping(t_address,t_struct(AddressSet)7727_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:16" + }, + { + "label": "validatorAddressesByModel", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_address,t_struct(AddressSet)7727_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:17" + }, + { + "label": "modelAddresses", + "offset": 0, + "slot": "6", + "type": "t_struct(AddressSet)7727_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:19" + }, + { + "label": "minnerAddresses", + "offset": 0, + "slot": "8", + "type": "t_struct(AddressSet)7727_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:20" + }, + { + "label": "validatorAddresses", + "offset": 0, + "slot": "10", + "type": "t_struct(AddressSet)7727_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:21" + }, + { + "label": "minnerUnstakeRequests", + "offset": 0, + "slot": "12", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)7532_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:23" + }, + { + "label": "validatorUnstakeRequests", + "offset": 0, + "slot": "13", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)7532_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)7507_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)7471_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:30" + }, + { + "label": "assignmentsByMinner", + "offset": 0, + "slot": "18", + "type": "t_mapping(t_address,t_struct(Uint256Set)7897_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:31" + }, + { + "label": "assignmentsByInference", + "offset": 0, + "slot": "19", + "type": "t_mapping(t_uint256,t_struct(Uint256Set)7897_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(MinnerEpochState)7429_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:38" + }, + { + "label": "minnerTaskCompleted", + "offset": 0, + "slot": "22", + "type": "t_mapping(t_address,t_mapping(t_uint256,t_uint256))", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:43" + }, + { + "label": "minnerMinimumStake", + "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": "minnerRequirement", + "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)7420": { + "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)7727_storage)": { + "label": "mapping(address => struct Set.AddressSet)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Model)7434_storage)": { + "label": "mapping(address => struct IWorkerHub.Model)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Uint256Set)7897_storage)": { + "label": "mapping(address => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(UnstakeRequest)7532_storage)": { + "label": "mapping(address => struct IWorkerHub.UnstakeRequest)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Worker)7447_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)7471_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Assignment)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Inference)7507_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Inference)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(MinnerEpochState)7429_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.MinnerEpochState)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Uint256Set)7897_storage)": { + "label": "mapping(uint256 => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_uint256)": { + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32" + }, + "t_struct(AddressSet)7727_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)7471_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)7507_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)7420", + "offset": 26, + "slot": "4" + }, + { + "label": "creator", + "type": "t_address", + "offset": 0, + "slot": "5" + } + ], + "numberOfBytes": "192" + }, + "t_struct(MinnerEpochState)7429_storage": { + "label": "struct IWorkerHub.MinnerEpochState", + "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": "totalMinner", + "type": "t_uint256", + "offset": 0, + "slot": "3" + } + ], + "numberOfBytes": "128" + }, + "t_struct(Model)7434_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)7683_storage": { + "label": "struct Random.Randomizer", + "members": [ + { + "label": "nonce", + "type": "t_uint256", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(Uint256Set)7897_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)7532_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)7447_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/ModelCollection.sol b/contracts/ModelCollection.sol index dc1ced4..2a70f4e 100644 --- a/contracts/ModelCollection.sol +++ b/contracts/ModelCollection.sol @@ -108,8 +108,8 @@ OwnableUpgradeable { bytes32 hash = getHashToSign(_to, _uri, _model, _tokenId); address signer = ECDSAUpgradeable.recover(hash, v, r, s); - require(signer == owner(), "invalid signature"); - require(models[_tokenId] == address(0), "token minted"); + if (signer != owner()) revert InvalidSignature(); + if (models[_tokenId] != address(0)) revert AlreadyMinted(); return mint_(_to, _uri, _model, _tokenId); } diff --git a/contracts/WorkerHub.sol b/contracts/WorkerHub.sol index c3b16fd..6214996 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -28,10 +28,10 @@ ReentrancyGuardUpgradeable { function initialize( address _treasury, uint16 _feePercentage, - uint256 _minterMinimumStake, + uint256 _minnerMinimumStake, uint256 _validatorMinimumStake, - uint40 _mintingTimeLimit, - uint8 _minterRequirement, + uint40 _miningTimeLimit, + uint8 _minnerRequirement, uint256 _blocksPerEpoch, uint256 _rewardPerEpochBasedOnPerf, uint40 _unstakeDelayTime @@ -42,10 +42,10 @@ ReentrancyGuardUpgradeable { treasury = _treasury; feePercentage = _feePercentage; - minterMinimumStake = _minterMinimumStake; + minnerMinimumStake = _minnerMinimumStake; validatorMinimumStake = _validatorMinimumStake; - mintingTimeLimit = _mintingTimeLimit; - minterRequirement = _minterRequirement; + miningTimeLimit = _miningTimeLimit; + minnerRequirement = _minnerRequirement; blocksPerEpoch = _blocksPerEpoch; rewardPerEpochBasedOnPerf = _rewardPerEpochBasedOnPerf; unstakeDelayTime = _unstakeDelayTime; @@ -69,8 +69,8 @@ ReentrancyGuardUpgradeable { return modelAddresses.values; } - function getMintingAssignments() external view returns (AssignmentInfo[] memory) { - uint256[] memory assignmentIds = assignmentsByMinter[msg.sender].values; + function getMiningAssignments() external view returns (AssignmentInfo[] memory) { + uint256[] memory assignmentIds = assignmentsByMinner[msg.sender].values; uint256 assignmentNumber = assignmentIds.length; uint256 counter = 0; @@ -97,24 +97,24 @@ ReentrancyGuardUpgradeable { return result; } - function getMinterAddresses() external view returns (address[] memory) { - return minterAddresses.values; + function getMinnerAddresses() external view returns (address[] memory) { + return minnerAddresses.values; } - function getMinters() external view returns (WorkerInfo[] memory) { - address[] memory addresses = minterAddresses.values; - uint256 minterNumber = addresses.length; - WorkerInfo[] memory result = new WorkerInfo[](minterNumber); - for (uint256 i = 0; i < minterNumber; ++i) { - Worker memory minter = minters[addresses[i]]; + function getMinners() external view returns (WorkerInfo[] memory) { + address[] memory addresses = minnerAddresses.values; + uint256 minnerNumber = addresses.length; + WorkerInfo[] memory result = new WorkerInfo[](minnerNumber); + for (uint256 i = 0; i < minnerNumber; ++i) { + Worker memory minner = minners[addresses[i]]; result[i] = WorkerInfo( addresses[i], - minter.stake, - minter.commitment, - minter.modelAddress, - minter.lastClaimedEpoch, - minter.activeTime, - minter.tier + minner.stake, + minner.commitment, + minner.modelAddress, + minner.lastClaimedEpoch, + minner.activeTime, + minner.tier ); } return result; @@ -195,76 +195,76 @@ ReentrancyGuardUpgradeable { emit ModelUnregistration(_model); } - function registerMinter(uint16 tier) external payable whenNotPaused { + function registerMinner(uint16 tier) external payable whenNotPaused { _updateEpoch(); if (tier == 0 || tier > maximumTier) revert InvalidTier(); - if (msg.value < minterMinimumStake) revert StakeTooLow(); + if (msg.value < minnerMinimumStake) revert StakeTooLow(); - Worker storage minter = minters[msg.sender]; - if (minter.tier != 0) revert AlreadyRegistered(); + Worker storage minner = minners[msg.sender]; + if (minner.tier != 0) revert AlreadyRegistered(); - minter.stake = msg.value; - minter.tier = tier; - minter.lastClaimedEpoch = currentEpoch; + minner.stake = msg.value; + minner.tier = tier; + minner.lastClaimedEpoch = currentEpoch; address modelAddress = modelAddresses.values[randomizer.randomUint256() % modelAddresses.size()]; - minter.modelAddress = modelAddress; - minterAddressesByModel[modelAddress].insert(msg.sender); + minner.modelAddress = modelAddress; + minnerAddressesByModel[modelAddress].insert(msg.sender); - minterAddresses.insert(msg.sender); + minnerAddresses.insert(msg.sender); - emit MinterRegistration(msg.sender, tier, msg.value); + emit MinnerRegistration(msg.sender, tier, msg.value); } - function unregisterMinter() external nonReentrant { + function unregisterMinner() external nonReentrant { _updateEpoch(); - Worker storage minter = minters[msg.sender]; - if (minter.tier == 0) revert NotRegistered(); + Worker storage minner = minners[msg.sender]; + if (minner.tier == 0) revert NotRegistered(); - minter.tier = 0; + minner.tier = 0; - TransferHelper.safeTransferNative(msg.sender, minter.stake); - minter.stake = 0; - minter.commitment = 0; + TransferHelper.safeTransferNative(msg.sender, minner.stake); + minner.stake = 0; + minner.commitment = 0; - minterAddresses.erase(msg.sender); - minterAddressesByModel[minter.modelAddress].erase(msg.sender); - minter.modelAddress = address(0); + minnerAddresses.erase(msg.sender); + minnerAddressesByModel[minner.modelAddress].erase(msg.sender); + minner.modelAddress = address(0); - minterUnstakeRequests[msg.sender] = UnstakeRequest( - minter.stake, + minnerUnstakeRequests[msg.sender] = UnstakeRequest( + minner.stake, uint40(block.timestamp + unstakeDelayTime) ); _claimReward(msg.sender); - emit MinterUnregistration(msg.sender); + emit MinnerUnregistration(msg.sender); } - function increaseMinterStake() external payable whenNotPaused { + function increaseMinnerStake() external payable whenNotPaused { _updateEpoch(); - Worker storage minter = minters[msg.sender]; - if (minter.tier == 0) revert NotRegistered(); + Worker storage minner = minners[msg.sender]; + if (minner.tier == 0) revert NotRegistered(); - minter.stake += msg.value; + minner.stake += msg.value; - emit MinterExtraStake(msg.sender, msg.value); + emit MinnerExtraStake(msg.sender, msg.value); } - function unstakeForMinter() external { + function unstakeForMinner() external { _updateEpoch(); - UnstakeRequest storage unstakeRequest = minterUnstakeRequests[msg.sender]; + UnstakeRequest storage unstakeRequest = minnerUnstakeRequests[msg.sender]; if (block.timestamp < unstakeRequest.unlockAt) revert StillBeingLocked(); uint256 stake = unstakeRequest.stake; if (stake == 0) revert NullStake(); TransferHelper.safeTransferNative(msg.sender, stake); - emit MinterUnstake(msg.sender, stake); + emit MinnerUnstake(msg.sender, stake); } function registerValidator(uint16 tier) external payable whenNotPaused { @@ -356,35 +356,35 @@ ReentrancyGuardUpgradeable { emit NewInference(inferenceId, _creator, value); - _assignMinters(inferenceId); + _assignMinners(inferenceId); return inferenceId; } - function _assignMinters(uint256 _inferenceId) private { - uint40 expiredAt = uint40(block.timestamp + mintingTimeLimit); + function _assignMinners(uint256 _inferenceId) private { + uint40 expiredAt = uint40(block.timestamp + miningTimeLimit); inferences[_inferenceId].expiredAt = expiredAt; inferences[_inferenceId].status = InferenceStatus.Solving; address model = inferences[_inferenceId].modelAddress; - Set.AddressSet storage minters = minterAddressesByModel[model]; - uint256 n = minterRequirement; - address[] memory selectedMinters = new address[](n); + Set.AddressSet storage minners = minnerAddressesByModel[model]; + uint256 n = minnerRequirement; + address[] memory selectedMinners = new address[](n); for (uint256 i = 0; i < n; ++i) { - address minter = minters.values[randomizer.randomUint256() % minters.size()]; - minters.erase(minter); + address minner = minners.values[randomizer.randomUint256() % minners.size()]; + minners.erase(minner); uint256 assignmentId = ++assignmentNumber; assignments[assignmentId].inferenceId = _inferenceId; - assignments[assignmentId].worker = minter; - selectedMinters[i] = minter; - assignmentsByMinter[msg.sender].insert(assignmentId); + assignments[assignmentId].worker = minner; + selectedMinners[i] = minner; + assignmentsByMinner[msg.sender].insert(assignmentId); assignmentsByInference[_inferenceId].insert(assignmentId); - emit NewAssignment(assignmentId, _inferenceId, minter, expiredAt); + emit NewAssignment(assignmentId, _inferenceId, minner, expiredAt); } - for (uint256 i = 0; i < n; ++i) minters.insert(selectedMinters[i]); + for (uint256 i = 0; i < n; ++i) minners.insert(selectedMinners[i]); } // this internal function update new epoch @@ -393,7 +393,7 @@ ReentrancyGuardUpgradeable { uint256 epochPassed = (block.number - lastBlock) / blocksPerEpoch; if (epochPassed > 0) { for (; epochPassed > 0; epochPassed--) { - rewardInEpoch[currentEpoch].totalMinter = minterAddresses.size(); + rewardInEpoch[currentEpoch].totalMinner = minnerAddresses.size(); currentEpoch++; rewardInEpoch[currentEpoch].perfReward = rewardPerEpochBasedOnPerf; rewardInEpoch[currentEpoch].epochReward = rewardPerEpoch; @@ -419,7 +419,7 @@ ReentrancyGuardUpgradeable { if (clonedInference.expiredAt < block.timestamp) { if (clonedInference.assignments.length == 0) { - _assignMinters(clonedAssignments.inferenceId); + _assignMinners(clonedAssignments.inferenceId); return; } else { revert("Expire time"); @@ -434,7 +434,7 @@ ReentrancyGuardUpgradeable { if (inference.assignments.length == 1) { uint256 curEpoch = currentEpoch; - minterTaskCompleted[_msgSender][curEpoch] += 1; + minnerTaskCompleted[_msgSender][curEpoch] += 1; rewardInEpoch[curEpoch].totalTaskCompleted += 1; TransferHelper.safeTransferNative(_msgSender, clonedInference.value); } @@ -461,23 +461,23 @@ ReentrancyGuardUpgradeable { for (uint256 i = 0; i < assignmentNumber; ++i) { assignments[assignmentIds[i]].worker = address(0); } - _assignMinters(_inferenceId); + _assignMinners(_inferenceId); } } - function _claimReward(address _minter) internal whenNotPaused { - uint256 rewardAmount = rewardToClaim(_minter); - minters[_minter].lastClaimedEpoch = currentEpoch; + function _claimReward(address _minner) internal whenNotPaused { + uint256 rewardAmount = rewardToClaim(_minner); + minners[_minner].lastClaimedEpoch = currentEpoch; if (rewardAmount > 0) { - TransferHelper.safeTransferNative(_minter, rewardAmount); + TransferHelper.safeTransferNative(_minner, rewardAmount); - emit RewardClaim(_minter, rewardAmount); + emit RewardClaim(_minner, rewardAmount); } } - // minter claim reward - function claimReward(address _minter) public virtual nonReentrant { - _claimReward(_minter); + // minner claim reward + function claimReward(address _minner) public virtual nonReentrant { + _claimReward(_minner); } // @dev admin functions @@ -504,30 +504,30 @@ ReentrancyGuardUpgradeable { blocksPerEpoch = _blocks; } - // sum reward of an minter since last claimed epoch - function rewardToClaim(address _minter) public virtual returns(uint256) { + // sum reward of an minner since last claimed epoch + function rewardToClaim(address _minner) public virtual returns(uint256) { _updateEpoch(); uint256 totalReward; uint256 lastEpoch = currentEpoch; - if (minters[_minter].stake <= 0 || lastEpoch <= minters[_minter].lastClaimedEpoch) { + if (minners[_minner].stake <= 0 || lastEpoch <= minners[_minner].lastClaimedEpoch) { totalReward = 0; } else { - uint256 lastClaimed = uint256(minters[_minter].lastClaimedEpoch); + uint256 lastClaimed = uint256(minners[_minner].lastClaimedEpoch); uint256 perfReward; uint256 epochReward; - uint256 currentMinter; + uint256 currentMinner; for (; lastClaimed < lastEpoch; lastClaimed++) { - MinterEpochState memory state = rewardInEpoch[lastClaimed]; + MinnerEpochState memory state = rewardInEpoch[lastClaimed]; uint256 totalTaskCompleted = state.totalTaskCompleted; // reward at epoch - (perfReward, epochReward, currentMinter) = (state.perfReward, state.epochReward, state.totalMinter); + (perfReward, epochReward, currentMinner) = (state.perfReward, state.epochReward, state.totalMinner); if (totalTaskCompleted > 0 && perfReward > 0) { - totalReward += perfReward * minterTaskCompleted[_minter][lastClaimed] / totalTaskCompleted; + totalReward += perfReward * minnerTaskCompleted[_minner][lastClaimed] / totalTaskCompleted; } - if (currentMinter > 0 && epochReward > 0) { - totalReward += epochReward / currentMinter; + if (currentMinner > 0 && epochReward > 0) { + totalReward += epochReward / currentMinner; } } } diff --git a/contracts/interfaces/IModelCollection.sol b/contracts/interfaces/IModelCollection.sol index e7d1430..322f930 100644 --- a/contracts/interfaces/IModelCollection.sol +++ b/contracts/interfaces/IModelCollection.sol @@ -26,8 +26,10 @@ IERC2981Upgradeable { event TokenURIUpdate(uint256 indexed tokenId, string uri); event TokenModelUpdate(uint256 indexed tokenId, address model); + error AlreadyMinted(); error InsufficientFunds(); error InvalidModel(); + error InvalidSignature(); error FailedTransfer(); function version() external pure returns (string memory version); diff --git a/contracts/interfaces/IWorkerHub.sol b/contracts/interfaces/IWorkerHub.sol index d756cfd..cfb12ae 100644 --- a/contracts/interfaces/IWorkerHub.sol +++ b/contracts/interfaces/IWorkerHub.sol @@ -12,11 +12,11 @@ interface IWorkerHub is IInferable { Killed } - struct MinterEpochState { + struct MinnerEpochState { uint256 perfReward; uint256 epochReward; uint256 totalTaskCompleted; - uint256 totalMinter; + uint256 totalMinner; } struct Model { @@ -96,13 +96,13 @@ interface IWorkerHub is IInferable { ); event ModelUnregistration(address indexed model); - event MinterExtraStake(address indexed minter, uint256 value); - event MinterRegistration( - address indexed minter, + event MinnerExtraStake(address indexed minner, uint256 value); + event MinnerRegistration( + address indexed minner, uint16 indexed tier, uint256 value ); - event MinterUnregistration(address indexed minter); + event MinnerUnregistration(address indexed minner); event ValidatorExtraStake(address indexed validator, uint256 value); event ValidatorRegistration( @@ -123,12 +123,12 @@ interface IWorkerHub is IInferable { event NewAssignment( uint256 indexed assignmentId, uint256 indexed inferenceId, - address indexed minter, + address indexed minner, uint40 expiredAt ); - event SolutionSubmission(address indexed minter, uint256 indexed assigmentId); + event SolutionSubmission(address indexed minner, uint256 indexed assigmentId); - event MinterUnstake(address indexed minter, uint256 stake); + event MinnerUnstake(address indexed minner, uint256 stake); event ValidatorUnstake(address indexed validator, uint256 stake); event RewardClaim(address indexed worker, uint256 value); @@ -150,7 +150,7 @@ interface IWorkerHub is IInferable { error StakeTooLow(); error NullStake(); - error MintingSessionNotEnded(); + error MiningSessionNotEnded(); error ValidatingSessionNotEnded(); } diff --git a/contracts/storages/WorkerHubStorage.sol b/contracts/storages/WorkerHubStorage.sol index 5d8bc94..6394228 100644 --- a/contracts/storages/WorkerHubStorage.sol +++ b/contracts/storages/WorkerHubStorage.sol @@ -10,17 +10,17 @@ abstract contract WorkerHubStorage is IWorkerHub { Random.Randomizer internal randomizer; mapping(address => Model) public models; - mapping(address => Worker) public minters; + mapping(address => Worker) public minners; mapping(address => Worker) public validators; - mapping(address => Set.AddressSet) internal minterAddressesByModel; + mapping(address => Set.AddressSet) internal minnerAddressesByModel; mapping(address => Set.AddressSet) internal validatorAddressesByModel; Set.AddressSet internal modelAddresses; - Set.AddressSet internal minterAddresses; + Set.AddressSet internal minnerAddresses; Set.AddressSet internal validatorAddresses; - mapping(address => UnstakeRequest) public minterUnstakeRequests; + mapping(address => UnstakeRequest) public minnerUnstakeRequests; mapping(address => UnstakeRequest) public validatorUnstakeRequests; uint256 public inferenceNumber; @@ -28,30 +28,30 @@ abstract contract WorkerHubStorage is IWorkerHub { uint256 public assignmentNumber; mapping(uint256 => Assignment) internal assignments; - mapping(address => Set.Uint256Set) internal assignmentsByMinter; + mapping(address => Set.Uint256Set) internal assignmentsByMinner; mapping(uint256 => Set.Uint256Set) internal assignmentsByInference; mapping(address => mapping(uint256 => bool)) public validatorDisputed; // mapping total task completed in epoch and reward per epoch // epoch index => total reward - mapping(uint256 => MinterEpochState) public rewardInEpoch; + mapping(uint256 => MinnerEpochState) public rewardInEpoch; - // mapping detail minter completed how many request + // mapping detail minner completed how many request // total task completed in epoch - // minter => epoch => total task completed - mapping(address => mapping(uint256 => uint256)) public minterTaskCompleted; + // minner => epoch => total task completed + mapping(address => mapping(uint256 => uint256)) public minnerTaskCompleted; - uint256 public minterMinimumStake; + uint256 public minnerMinimumStake; uint256 public validatorMinimumStake; address public treasury; uint16 public feePercentage; - uint40 public mintingTimeLimit; + uint40 public miningTimeLimit; uint40 public validatingTimeLimit; uint40 public disputingTimeLimit; uint40 public penaltyDuration; uint40 public unstakeDelayTime; - uint8 public minterRequirement; + uint8 public minnerRequirement; uint16 public maximumTier; uint16 public disqualificationPercentage; diff --git a/scripts/deployHybridModel.ts b/scripts/deployHybridModel.ts index 12db6c7..c2524c6 100644 --- a/scripts/deployHybridModel.ts +++ b/scripts/deployHybridModel.ts @@ -1,3 +1,4 @@ +import assert from 'assert'; import { ethers, network, upgrades } from 'hardhat'; async function deployHybridModel() { @@ -5,6 +6,13 @@ async function deployHybridModel() { const networkName = network.name.toUpperCase(); const HybridModel = await ethers.getContractFactory('HybridModel'); const WorkerHub = await ethers.getContractFactory('WorkerHub'); + const ModelCollection = await ethers.getContractFactory('ModelCollection'); + + const collectionAddress = config.collectionAddress; + assert.ok( + collectionAddress, + `Missing ${networkName}_COLLECTION_ADDRESS from environment variables!` + ); const workerHubAddress = config.workerHubAddress; const identifier = 0; @@ -31,6 +39,13 @@ async function deployHybridModel() { ); await hybridModel.deployed(); + const collection = ModelCollection.attach(config.collectionAddress); + await (await collection.mint( + (await ethers.getSigners())[0].address, + metadata, + hybridModel.address + )).wait(); + const workerHub = WorkerHub.attach(workerHubAddress); await workerHub.registerModel(hybridModel.address, 1, ethers.utils.parseEther('100')); diff --git a/scripts/deployWorkerHub.ts b/scripts/deployWorkerHub.ts index eea4a95..6e36ca6 100644 --- a/scripts/deployWorkerHub.ts +++ b/scripts/deployWorkerHub.ts @@ -24,10 +24,10 @@ async function deployWorkerHub() { // const collectionAddress = config.collectionAddress || ethers.constants.AddressZero; const feePercentage = 10_00; - const minterMinimumStake = ethers.utils.parseEther("70000"); - const validatorMinimumStake = ethers.utils.parseEther("70000"); - const mintingTimeLimit = 300; - const minterRequirement = 3; + const minnerMinimumStake = ethers.utils.parseEther("100"); + const validatorMinimumStake = ethers.utils.parseEther("100"); + const miningTimeLimit = 300; + const minnerRequirement = 3; const blockPerEpoch = 600; const rewardPerEpochBasedOnPerf = ethers.utils.parseEther("0.5"); const unstakeDelayTime = 12 * 24 * 3600; @@ -37,10 +37,10 @@ async function deployWorkerHub() { [ treasuryAddress, feePercentage, - minterMinimumStake, + minnerMinimumStake, validatorMinimumStake, - mintingTimeLimit, - minterRequirement, + miningTimeLimit, + minnerRequirement, blockPerEpoch, rewardPerEpochBasedOnPerf, unstakeDelayTime diff --git a/tests/Test.t.sol b/tests/Test.t.sol index 4cbafa3..ce1a5db 100644 --- a/tests/Test.t.sol +++ b/tests/Test.t.sol @@ -9,7 +9,7 @@ contract Mockup is WorkerHub { function setMinerTaskCompleteInEpoch(address miner, uint epoch, uint totalCompleted) public { _updateEpoch(); - minterTaskCompleted[miner][epoch] = totalCompleted; + minnerTaskCompleted[miner][epoch] = totalCompleted; } function setTotalTaskCompleteInEpoch(uint epoch, uint totalCompleted) public { @@ -57,21 +57,21 @@ contract WorkHubTest is Test { // init block height vm.roll(11); vm.prank(Miner1); - workerHub.registerMinter{value: 1e18}(1); + workerHub.registerMinner{value: 1e18}(1); vm.prank(Miner2); - workerHub.registerMinter{value: 1e18}(1); + workerHub.registerMinner{value: 1e18}(1); vm.prank(Miner3); - workerHub.registerMinter{value: 1e18}(1); + workerHub.registerMinner{value: 1e18}(1); assertEq(workerHub.lastBlock(), 11); assertEq(workerHub.currentEpoch(), 1); assertEq(workerHub.rewardToClaim(Miner1), 0); assertEq(workerHub.rewardToClaim(Miner2), 0); assertEq(workerHub.rewardToClaim(Miner3), 0); - (uint256 pefReward, uint256 epochReward, uint256 totalTaskCompleted, uint256 totalMinter) = workerHub.rewardInEpoch(1); -// assertEq(totalMinter, 3); + (uint256 pefReward, uint256 epochReward, uint256 totalTaskCompleted, uint256 totalMinner) = workerHub.rewardInEpoch(1); +// assertEq(totalMinner, 3); assertEq(pefReward, 1e18); assertEq(epochReward, 1e16); assertEq(totalTaskCompleted, 0); @@ -90,7 +90,7 @@ contract WorkHubTest is Test { workerHub.setMinerTaskCompleteInEpoch(Miner3, 1, 3); workerHub.setTotalTaskCompleteInEpoch(1, 10); - (pefReward, epochReward, totalTaskCompleted, totalMinter) = workerHub.rewardInEpoch(1); + (pefReward, epochReward, totalTaskCompleted, totalMinner) = workerHub.rewardInEpoch(1); assertEq(pefReward, 1e18); assertEq(totalTaskCompleted, 10); @@ -100,7 +100,7 @@ contract WorkHubTest is Test { workerHub.setMinerTaskCompleteInEpoch(Miner3, 2, 7); workerHub.setTotalTaskCompleteInEpoch(2, 10); - (pefReward, epochReward, totalTaskCompleted, totalMinter) = workerHub.rewardInEpoch(2); + (pefReward, epochReward, totalTaskCompleted, totalMinner) = workerHub.rewardInEpoch(2); assertEq(pefReward, 1e18); assertEq(totalTaskCompleted, 10); @@ -132,7 +132,7 @@ contract WorkHubTest is Test { // test miner request unstake vm.prank(Miner1); - workerHub.unregisterMinter(); + workerHub.unregisterMinner(); assertEq(Miner1.balance, 906666666666666666 + 2e18); vm.startPrank(Miner1); @@ -140,15 +140,15 @@ contract WorkHubTest is Test { assertEq(workerHub.rewardToClaim(Miner1), 0); workerHub.claimReward(Miner1); assertEq(Miner1.balance, 906666666666666666 + 2e18); - workerHub.registerMinter{value: 1e18}(1); + workerHub.registerMinner{value: 1e18}(1); assertEq(workerHub.rewardToClaim(Miner1), 0); workerHub.claimReward(Miner1); assertEq(Miner1.balance, 906666666666666666 + 1e18); - workerHub.unregisterMinter(); + workerHub.unregisterMinner(); assertEq(workerHub.rewardToClaim(Miner1), 0); workerHub.claimReward(Miner1); assertEq(Miner1.balance, 906666666666666666 + 2e18); - workerHub.registerMinter{value: 1e18}(1); + workerHub.registerMinner{value: 1e18}(1); vm.roll(55); assertEq(workerHub.rewardToClaim(Miner1), 0); workerHub.claimReward(Miner1); @@ -160,4 +160,4 @@ contract WorkHubTest is Test { assertEq(workerHub.rewardToClaim(Miner1), 0); vm.stopPrank(); } -} \ No newline at end of file +} From 876346ec6d99f03a214133bf4081fe23a315cfd4 Mon Sep 17 00:00:00 2001 From: kochou-nbc Date: Thu, 9 May 2024 18:01:27 +0700 Subject: [PATCH 29/82] rename minner -> miner, update worker join function --- contracts/WorkerHub.sol | 198 ++++++++++++++---------- contracts/interfaces/IWorkerHub.sol | 20 +-- contracts/storages/WorkerHubStorage.sol | 22 +-- scripts/deployWorkerHub.ts | 8 +- tests/Test.t.sol | 24 +-- 5 files changed, 151 insertions(+), 121 deletions(-) diff --git a/contracts/WorkerHub.sol b/contracts/WorkerHub.sol index 6214996..9b1121a 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -28,10 +28,10 @@ ReentrancyGuardUpgradeable { function initialize( address _treasury, uint16 _feePercentage, - uint256 _minnerMinimumStake, + uint256 _minerMinimumStake, uint256 _validatorMinimumStake, uint40 _miningTimeLimit, - uint8 _minnerRequirement, + uint8 _minerRequirement, uint256 _blocksPerEpoch, uint256 _rewardPerEpochBasedOnPerf, uint40 _unstakeDelayTime @@ -42,10 +42,10 @@ ReentrancyGuardUpgradeable { treasury = _treasury; feePercentage = _feePercentage; - minnerMinimumStake = _minnerMinimumStake; + minerMinimumStake = _minerMinimumStake; validatorMinimumStake = _validatorMinimumStake; miningTimeLimit = _miningTimeLimit; - minnerRequirement = _minnerRequirement; + minerRequirement = _minerRequirement; blocksPerEpoch = _blocksPerEpoch; rewardPerEpochBasedOnPerf = _rewardPerEpochBasedOnPerf; unstakeDelayTime = _unstakeDelayTime; @@ -70,7 +70,7 @@ ReentrancyGuardUpgradeable { } function getMiningAssignments() external view returns (AssignmentInfo[] memory) { - uint256[] memory assignmentIds = assignmentsByMinner[msg.sender].values; + uint256[] memory assignmentIds = assignmentsByMiner[msg.sender].values; uint256 assignmentNumber = assignmentIds.length; uint256 counter = 0; @@ -97,24 +97,24 @@ ReentrancyGuardUpgradeable { return result; } - function getMinnerAddresses() external view returns (address[] memory) { - return minnerAddresses.values; + function getMinerAddresses() external view returns (address[] memory) { + return minerAddresses.values; } - function getMinners() external view returns (WorkerInfo[] memory) { - address[] memory addresses = minnerAddresses.values; - uint256 minnerNumber = addresses.length; - WorkerInfo[] memory result = new WorkerInfo[](minnerNumber); - for (uint256 i = 0; i < minnerNumber; ++i) { - Worker memory minner = minners[addresses[i]]; + function getMiners() external view returns (WorkerInfo[] memory) { + address[] memory addresses = minerAddresses.values; + uint256 minerNumber = addresses.length; + WorkerInfo[] memory result = new WorkerInfo[](minerNumber); + for (uint256 i = 0; i < minerNumber; ++i) { + Worker memory miner = miners[addresses[i]]; result[i] = WorkerInfo( addresses[i], - minner.stake, - minner.commitment, - minner.modelAddress, - minner.lastClaimedEpoch, - minner.activeTime, - minner.tier + miner.stake, + miner.commitment, + miner.modelAddress, + miner.lastClaimedEpoch, + miner.activeTime, + miner.tier ); } return result; @@ -195,76 +195,90 @@ ReentrancyGuardUpgradeable { emit ModelUnregistration(_model); } - function registerMinner(uint16 tier) external payable whenNotPaused { + function registerMiner(uint16 tier) external payable whenNotPaused { _updateEpoch(); if (tier == 0 || tier > maximumTier) revert InvalidTier(); - if (msg.value < minnerMinimumStake) revert StakeTooLow(); + if (msg.value < minerMinimumStake) revert StakeTooLow(); - Worker storage minner = minners[msg.sender]; - if (minner.tier != 0) revert AlreadyRegistered(); + Worker storage miner = miners[msg.sender]; + if (miner.tier != 0) revert AlreadyRegistered(); - minner.stake = msg.value; - minner.tier = tier; - minner.lastClaimedEpoch = currentEpoch; + miner.stake = msg.value; + miner.tier = tier; + miner.lastClaimedEpoch = currentEpoch; address modelAddress = modelAddresses.values[randomizer.randomUint256() % modelAddresses.size()]; - minner.modelAddress = modelAddress; - minnerAddressesByModel[modelAddress].insert(msg.sender); + miner.modelAddress = modelAddress; + minerAddressesByModel[modelAddress].insert(msg.sender); - minnerAddresses.insert(msg.sender); + minerAddresses.insert(msg.sender); - emit MinnerRegistration(msg.sender, tier, msg.value); + emit MinerRegistration(msg.sender, tier, msg.value); } - function unregisterMinner() external nonReentrant { + function joinForMinting() external whenNotPaused { _updateEpoch(); - Worker storage minner = minners[msg.sender]; - if (minner.tier == 0) revert NotRegistered(); + Worker storage miner = miners[msg.sender]; + if (miner.tier == 0) revert NotRegistered(); - minner.tier = 0; + address modelAddress = miner.modelAddress; + minerAddressesByModel[modelAddress].insert(msg.sender); - TransferHelper.safeTransferNative(msg.sender, minner.stake); - minner.stake = 0; - minner.commitment = 0; + minerAddresses.insert(msg.sender); - minnerAddresses.erase(msg.sender); - minnerAddressesByModel[minner.modelAddress].erase(msg.sender); - minner.modelAddress = address(0); + emit MinerJoin(msg.sender); + } + + function unregisterMiner() external nonReentrant { + _updateEpoch(); + + Worker storage miner = miners[msg.sender]; + if (miner.tier == 0) revert NotRegistered(); + + miner.tier = 0; - minnerUnstakeRequests[msg.sender] = UnstakeRequest( - minner.stake, + TransferHelper.safeTransferNative(msg.sender, miner.stake); + miner.stake = 0; + miner.commitment = 0; + + minerAddresses.erase(msg.sender); + minerAddressesByModel[miner.modelAddress].erase(msg.sender); + miner.modelAddress = address(0); + + minerUnstakeRequests[msg.sender] = UnstakeRequest( + miner.stake, uint40(block.timestamp + unstakeDelayTime) ); _claimReward(msg.sender); - emit MinnerUnregistration(msg.sender); + emit MinerUnregistration(msg.sender); } - function increaseMinnerStake() external payable whenNotPaused { + function increaseMinerStake() external payable whenNotPaused { _updateEpoch(); - Worker storage minner = minners[msg.sender]; - if (minner.tier == 0) revert NotRegistered(); + Worker storage miner = miners[msg.sender]; + if (miner.tier == 0) revert NotRegistered(); - minner.stake += msg.value; + miner.stake += msg.value; - emit MinnerExtraStake(msg.sender, msg.value); + emit MinerExtraStake(msg.sender, msg.value); } - function unstakeForMinner() external { + function unstakeForMiner() external { _updateEpoch(); - UnstakeRequest storage unstakeRequest = minnerUnstakeRequests[msg.sender]; + UnstakeRequest storage unstakeRequest = minerUnstakeRequests[msg.sender]; if (block.timestamp < unstakeRequest.unlockAt) revert StillBeingLocked(); uint256 stake = unstakeRequest.stake; if (stake == 0) revert NullStake(); TransferHelper.safeTransferNative(msg.sender, stake); - emit MinnerUnstake(msg.sender, stake); + emit MinerUnstake(msg.sender, stake); } function registerValidator(uint16 tier) external payable whenNotPaused { @@ -289,6 +303,20 @@ ReentrancyGuardUpgradeable { emit ValidatorRegistration(msg.sender, tier, msg.value); } + function joinForValidating() external whenNotPaused { + _updateEpoch(); + + Worker storage validator = miners[msg.sender]; + if (validator.tier == 0) revert NotRegistered(); + + address modelAddress = validator.modelAddress; + validatorAddressesByModel[modelAddress].insert(msg.sender); + + validatorAddresses.insert(msg.sender); + + emit ValidatorJoin(msg.sender); + } + function unregisterValidator() external nonReentrant { _updateEpoch(); @@ -356,35 +384,35 @@ ReentrancyGuardUpgradeable { emit NewInference(inferenceId, _creator, value); - _assignMinners(inferenceId); + _assignMiners(inferenceId); return inferenceId; } - function _assignMinners(uint256 _inferenceId) private { + function _assignMiners(uint256 _inferenceId) private { uint40 expiredAt = uint40(block.timestamp + miningTimeLimit); inferences[_inferenceId].expiredAt = expiredAt; inferences[_inferenceId].status = InferenceStatus.Solving; address model = inferences[_inferenceId].modelAddress; - Set.AddressSet storage minners = minnerAddressesByModel[model]; - uint256 n = minnerRequirement; - address[] memory selectedMinners = new address[](n); + Set.AddressSet storage miners = minerAddressesByModel[model]; + uint256 n = minerRequirement; + address[] memory selectedMiners = new address[](n); for (uint256 i = 0; i < n; ++i) { - address minner = minners.values[randomizer.randomUint256() % minners.size()]; - minners.erase(minner); + address miner = miners.values[randomizer.randomUint256() % miners.size()]; + miners.erase(miner); uint256 assignmentId = ++assignmentNumber; assignments[assignmentId].inferenceId = _inferenceId; - assignments[assignmentId].worker = minner; - selectedMinners[i] = minner; - assignmentsByMinner[msg.sender].insert(assignmentId); + assignments[assignmentId].worker = miner; + selectedMiners[i] = miner; + assignmentsByMiner[msg.sender].insert(assignmentId); assignmentsByInference[_inferenceId].insert(assignmentId); - emit NewAssignment(assignmentId, _inferenceId, minner, expiredAt); + emit NewAssignment(assignmentId, _inferenceId, miner, expiredAt); } - for (uint256 i = 0; i < n; ++i) minners.insert(selectedMinners[i]); + for (uint256 i = 0; i < n; ++i) miners.insert(selectedMiners[i]); } // this internal function update new epoch @@ -393,7 +421,7 @@ ReentrancyGuardUpgradeable { uint256 epochPassed = (block.number - lastBlock) / blocksPerEpoch; if (epochPassed > 0) { for (; epochPassed > 0; epochPassed--) { - rewardInEpoch[currentEpoch].totalMinner = minnerAddresses.size(); + rewardInEpoch[currentEpoch].totalMiner = minerAddresses.size(); currentEpoch++; rewardInEpoch[currentEpoch].perfReward = rewardPerEpochBasedOnPerf; rewardInEpoch[currentEpoch].epochReward = rewardPerEpoch; @@ -419,7 +447,7 @@ ReentrancyGuardUpgradeable { if (clonedInference.expiredAt < block.timestamp) { if (clonedInference.assignments.length == 0) { - _assignMinners(clonedAssignments.inferenceId); + _assignMiners(clonedAssignments.inferenceId); return; } else { revert("Expire time"); @@ -434,7 +462,7 @@ ReentrancyGuardUpgradeable { if (inference.assignments.length == 1) { uint256 curEpoch = currentEpoch; - minnerTaskCompleted[_msgSender][curEpoch] += 1; + minerTaskCompleted[_msgSender][curEpoch] += 1; rewardInEpoch[curEpoch].totalTaskCompleted += 1; TransferHelper.safeTransferNative(_msgSender, clonedInference.value); } @@ -461,23 +489,23 @@ ReentrancyGuardUpgradeable { for (uint256 i = 0; i < assignmentNumber; ++i) { assignments[assignmentIds[i]].worker = address(0); } - _assignMinners(_inferenceId); + _assignMiners(_inferenceId); } } - function _claimReward(address _minner) internal whenNotPaused { - uint256 rewardAmount = rewardToClaim(_minner); - minners[_minner].lastClaimedEpoch = currentEpoch; + function _claimReward(address _miner) internal whenNotPaused { + uint256 rewardAmount = rewardToClaim(_miner); + miners[_miner].lastClaimedEpoch = currentEpoch; if (rewardAmount > 0) { - TransferHelper.safeTransferNative(_minner, rewardAmount); + TransferHelper.safeTransferNative(_miner, rewardAmount); - emit RewardClaim(_minner, rewardAmount); + emit RewardClaim(_miner, rewardAmount); } } - // minner claim reward - function claimReward(address _minner) public virtual nonReentrant { - _claimReward(_minner); + // miner claim reward + function claimReward(address _miner) public virtual nonReentrant { + _claimReward(_miner); } // @dev admin functions @@ -504,30 +532,30 @@ ReentrancyGuardUpgradeable { blocksPerEpoch = _blocks; } - // sum reward of an minner since last claimed epoch - function rewardToClaim(address _minner) public virtual returns(uint256) { + // sum reward of an miner since last claimed epoch + function rewardToClaim(address _miner) public virtual returns(uint256) { _updateEpoch(); uint256 totalReward; uint256 lastEpoch = currentEpoch; - if (minners[_minner].stake <= 0 || lastEpoch <= minners[_minner].lastClaimedEpoch) { + if (miners[_miner].stake <= 0 || lastEpoch <= miners[_miner].lastClaimedEpoch) { totalReward = 0; } else { - uint256 lastClaimed = uint256(minners[_minner].lastClaimedEpoch); + uint256 lastClaimed = uint256(miners[_miner].lastClaimedEpoch); uint256 perfReward; uint256 epochReward; - uint256 currentMinner; + uint256 currentMiner; for (; lastClaimed < lastEpoch; lastClaimed++) { - MinnerEpochState memory state = rewardInEpoch[lastClaimed]; + MinerEpochState memory state = rewardInEpoch[lastClaimed]; uint256 totalTaskCompleted = state.totalTaskCompleted; // reward at epoch - (perfReward, epochReward, currentMinner) = (state.perfReward, state.epochReward, state.totalMinner); + (perfReward, epochReward, currentMiner) = (state.perfReward, state.epochReward, state.totalMiner); if (totalTaskCompleted > 0 && perfReward > 0) { - totalReward += perfReward * minnerTaskCompleted[_minner][lastClaimed] / totalTaskCompleted; + totalReward += perfReward * minerTaskCompleted[_miner][lastClaimed] / totalTaskCompleted; } - if (currentMinner > 0 && epochReward > 0) { - totalReward += epochReward / currentMinner; + if (currentMiner > 0 && epochReward > 0) { + totalReward += epochReward / currentMiner; } } } diff --git a/contracts/interfaces/IWorkerHub.sol b/contracts/interfaces/IWorkerHub.sol index cfb12ae..e63a39d 100644 --- a/contracts/interfaces/IWorkerHub.sol +++ b/contracts/interfaces/IWorkerHub.sol @@ -12,11 +12,11 @@ interface IWorkerHub is IInferable { Killed } - struct MinnerEpochState { + struct MinerEpochState { uint256 perfReward; uint256 epochReward; uint256 totalTaskCompleted; - uint256 totalMinner; + uint256 totalMiner; } struct Model { @@ -96,13 +96,13 @@ interface IWorkerHub is IInferable { ); event ModelUnregistration(address indexed model); - event MinnerExtraStake(address indexed minner, uint256 value); - event MinnerRegistration( - address indexed minner, + event MinerExtraStake(address indexed miner, uint256 value); + event MinerRegistration( + address indexed miner, uint16 indexed tier, uint256 value ); - event MinnerUnregistration(address indexed minner); + event MinerUnregistration(address indexed miner); event ValidatorExtraStake(address indexed validator, uint256 value); event ValidatorRegistration( @@ -123,13 +123,15 @@ interface IWorkerHub is IInferable { event NewAssignment( uint256 indexed assignmentId, uint256 indexed inferenceId, - address indexed minner, + address indexed miner, uint40 expiredAt ); - event SolutionSubmission(address indexed minner, uint256 indexed assigmentId); + event SolutionSubmission(address indexed miner, uint256 indexed assigmentId); - event MinnerUnstake(address indexed minner, uint256 stake); + event MinerUnstake(address indexed miner, uint256 stake); + event MinerJoin(address indexed miner); event ValidatorUnstake(address indexed validator, uint256 stake); + event ValidatorJoin(address indexed validator); event RewardClaim(address indexed worker, uint256 value); diff --git a/contracts/storages/WorkerHubStorage.sol b/contracts/storages/WorkerHubStorage.sol index 6394228..a317bb4 100644 --- a/contracts/storages/WorkerHubStorage.sol +++ b/contracts/storages/WorkerHubStorage.sol @@ -10,17 +10,17 @@ abstract contract WorkerHubStorage is IWorkerHub { Random.Randomizer internal randomizer; mapping(address => Model) public models; - mapping(address => Worker) public minners; + mapping(address => Worker) public miners; mapping(address => Worker) public validators; - mapping(address => Set.AddressSet) internal minnerAddressesByModel; + mapping(address => Set.AddressSet) internal minerAddressesByModel; mapping(address => Set.AddressSet) internal validatorAddressesByModel; Set.AddressSet internal modelAddresses; - Set.AddressSet internal minnerAddresses; + Set.AddressSet internal minerAddresses; Set.AddressSet internal validatorAddresses; - mapping(address => UnstakeRequest) public minnerUnstakeRequests; + mapping(address => UnstakeRequest) public minerUnstakeRequests; mapping(address => UnstakeRequest) public validatorUnstakeRequests; uint256 public inferenceNumber; @@ -28,21 +28,21 @@ abstract contract WorkerHubStorage is IWorkerHub { uint256 public assignmentNumber; mapping(uint256 => Assignment) internal assignments; - mapping(address => Set.Uint256Set) internal assignmentsByMinner; + mapping(address => Set.Uint256Set) internal assignmentsByMiner; mapping(uint256 => Set.Uint256Set) internal assignmentsByInference; mapping(address => mapping(uint256 => bool)) public validatorDisputed; // mapping total task completed in epoch and reward per epoch // epoch index => total reward - mapping(uint256 => MinnerEpochState) public rewardInEpoch; + mapping(uint256 => MinerEpochState) public rewardInEpoch; - // mapping detail minner completed how many request + // mapping detail miner completed how many request // total task completed in epoch - // minner => epoch => total task completed - mapping(address => mapping(uint256 => uint256)) public minnerTaskCompleted; + // miner => epoch => total task completed + mapping(address => mapping(uint256 => uint256)) public minerTaskCompleted; - uint256 public minnerMinimumStake; + uint256 public minerMinimumStake; uint256 public validatorMinimumStake; address public treasury; uint16 public feePercentage; @@ -51,7 +51,7 @@ abstract contract WorkerHubStorage is IWorkerHub { uint40 public disputingTimeLimit; uint40 public penaltyDuration; uint40 public unstakeDelayTime; - uint8 public minnerRequirement; + uint8 public minerRequirement; uint16 public maximumTier; uint16 public disqualificationPercentage; diff --git a/scripts/deployWorkerHub.ts b/scripts/deployWorkerHub.ts index 6e36ca6..f210d67 100644 --- a/scripts/deployWorkerHub.ts +++ b/scripts/deployWorkerHub.ts @@ -24,10 +24,10 @@ async function deployWorkerHub() { // const collectionAddress = config.collectionAddress || ethers.constants.AddressZero; const feePercentage = 10_00; - const minnerMinimumStake = ethers.utils.parseEther("100"); + const minerMinimumStake = ethers.utils.parseEther("100"); const validatorMinimumStake = ethers.utils.parseEther("100"); const miningTimeLimit = 300; - const minnerRequirement = 3; + const minerRequirement = 3; const blockPerEpoch = 600; const rewardPerEpochBasedOnPerf = ethers.utils.parseEther("0.5"); const unstakeDelayTime = 12 * 24 * 3600; @@ -37,10 +37,10 @@ async function deployWorkerHub() { [ treasuryAddress, feePercentage, - minnerMinimumStake, + minerMinimumStake, validatorMinimumStake, miningTimeLimit, - minnerRequirement, + minerRequirement, blockPerEpoch, rewardPerEpochBasedOnPerf, unstakeDelayTime diff --git a/tests/Test.t.sol b/tests/Test.t.sol index ce1a5db..a0a7d05 100644 --- a/tests/Test.t.sol +++ b/tests/Test.t.sol @@ -9,7 +9,7 @@ contract Mockup is WorkerHub { function setMinerTaskCompleteInEpoch(address miner, uint epoch, uint totalCompleted) public { _updateEpoch(); - minnerTaskCompleted[miner][epoch] = totalCompleted; + minerTaskCompleted[miner][epoch] = totalCompleted; } function setTotalTaskCompleteInEpoch(uint epoch, uint totalCompleted) public { @@ -57,21 +57,21 @@ contract WorkHubTest is Test { // init block height vm.roll(11); vm.prank(Miner1); - workerHub.registerMinner{value: 1e18}(1); + workerHub.registerMiner{value: 1e18}(1); vm.prank(Miner2); - workerHub.registerMinner{value: 1e18}(1); + workerHub.registerMiner{value: 1e18}(1); vm.prank(Miner3); - workerHub.registerMinner{value: 1e18}(1); + workerHub.registerMiner{value: 1e18}(1); assertEq(workerHub.lastBlock(), 11); assertEq(workerHub.currentEpoch(), 1); assertEq(workerHub.rewardToClaim(Miner1), 0); assertEq(workerHub.rewardToClaim(Miner2), 0); assertEq(workerHub.rewardToClaim(Miner3), 0); - (uint256 pefReward, uint256 epochReward, uint256 totalTaskCompleted, uint256 totalMinner) = workerHub.rewardInEpoch(1); -// assertEq(totalMinner, 3); + (uint256 pefReward, uint256 epochReward, uint256 totalTaskCompleted, uint256 totalMiner) = workerHub.rewardInEpoch(1); +// assertEq(totalMiner, 3); assertEq(pefReward, 1e18); assertEq(epochReward, 1e16); assertEq(totalTaskCompleted, 0); @@ -90,7 +90,7 @@ contract WorkHubTest is Test { workerHub.setMinerTaskCompleteInEpoch(Miner3, 1, 3); workerHub.setTotalTaskCompleteInEpoch(1, 10); - (pefReward, epochReward, totalTaskCompleted, totalMinner) = workerHub.rewardInEpoch(1); + (pefReward, epochReward, totalTaskCompleted, totalMiner) = workerHub.rewardInEpoch(1); assertEq(pefReward, 1e18); assertEq(totalTaskCompleted, 10); @@ -100,7 +100,7 @@ contract WorkHubTest is Test { workerHub.setMinerTaskCompleteInEpoch(Miner3, 2, 7); workerHub.setTotalTaskCompleteInEpoch(2, 10); - (pefReward, epochReward, totalTaskCompleted, totalMinner) = workerHub.rewardInEpoch(2); + (pefReward, epochReward, totalTaskCompleted, totalMiner) = workerHub.rewardInEpoch(2); assertEq(pefReward, 1e18); assertEq(totalTaskCompleted, 10); @@ -132,7 +132,7 @@ contract WorkHubTest is Test { // test miner request unstake vm.prank(Miner1); - workerHub.unregisterMinner(); + workerHub.unregisterMiner(); assertEq(Miner1.balance, 906666666666666666 + 2e18); vm.startPrank(Miner1); @@ -140,15 +140,15 @@ contract WorkHubTest is Test { assertEq(workerHub.rewardToClaim(Miner1), 0); workerHub.claimReward(Miner1); assertEq(Miner1.balance, 906666666666666666 + 2e18); - workerHub.registerMinner{value: 1e18}(1); + workerHub.registerMiner{value: 1e18}(1); assertEq(workerHub.rewardToClaim(Miner1), 0); workerHub.claimReward(Miner1); assertEq(Miner1.balance, 906666666666666666 + 1e18); - workerHub.unregisterMinner(); + workerHub.unregisterMiner(); assertEq(workerHub.rewardToClaim(Miner1), 0); workerHub.claimReward(Miner1); assertEq(Miner1.balance, 906666666666666666 + 2e18); - workerHub.registerMinner{value: 1e18}(1); + workerHub.registerMiner{value: 1e18}(1); vm.roll(55); assertEq(workerHub.rewardToClaim(Miner1), 0); workerHub.claimReward(Miner1); From 7255044ea76c65c463d2efdaf66c08165976ee98 Mon Sep 17 00:00:00 2001 From: 180945 <180945@trustless.computer> Date: Thu, 9 May 2024 18:15:39 +0700 Subject: [PATCH 30/82] mark infer kill and refund --- contracts/WorkerHub.sol | 25 +++++++++++++------------ tests/Test.t.sol | 3 ++- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/contracts/WorkerHub.sol b/contracts/WorkerHub.sol index 9b1121a..c410995 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -34,6 +34,7 @@ ReentrancyGuardUpgradeable { uint8 _minerRequirement, uint256 _blocksPerEpoch, uint256 _rewardPerEpochBasedOnPerf, + uint256 _rewardPerEpoch, uint40 _unstakeDelayTime ) external initializer { __Ownable_init(); @@ -48,9 +49,12 @@ ReentrancyGuardUpgradeable { minerRequirement = _minerRequirement; blocksPerEpoch = _blocksPerEpoch; rewardPerEpochBasedOnPerf = _rewardPerEpochBasedOnPerf; + rewardPerEpoch = _rewardPerEpoch; unstakeDelayTime = _unstakeDelayTime; maximumTier = 1; lastBlock = block.number; + rewardInEpoch[currentEpoch].perfReward = rewardPerEpochBasedOnPerf; + rewardInEpoch[currentEpoch].epochReward = rewardPerEpoch; } function version() external pure returns (string memory) { @@ -372,16 +376,13 @@ ReentrancyGuardUpgradeable { uint256 inferenceId = ++inferenceNumber; Inference storage inference = inferences[inferenceId]; - uint256 fee = msg.value * feePercentage / PERCENTAGE_DENOMINATOR; - uint256 value = msg.value - fee; + uint256 value = msg.value; inference.input = _input; inference.value = value; inference.creator = _creator; inference.modelAddress = msg.sender; - TransferHelper.safeTransferNative(treasury, fee); - emit NewInference(inferenceId, _creator, value); _assignMiners(inferenceId); @@ -447,7 +448,7 @@ ReentrancyGuardUpgradeable { if (clonedInference.expiredAt < block.timestamp) { if (clonedInference.assignments.length == 0) { - _assignMiners(clonedAssignments.inferenceId); + resolveInference(clonedAssignments.inferenceId); return; } else { revert("Expire time"); @@ -464,7 +465,11 @@ ReentrancyGuardUpgradeable { uint256 curEpoch = currentEpoch; minerTaskCompleted[_msgSender][curEpoch] += 1; rewardInEpoch[curEpoch].totalTaskCompleted += 1; - TransferHelper.safeTransferNative(_msgSender, clonedInference.value); + + uint256 fee = clonedInference.value * feePercentage / PERCENTAGE_DENOMINATOR; + uint256 value = clonedInference.value - fee; + TransferHelper.safeTransferNative(treasury, fee); + TransferHelper.safeTransferNative(_msgSender, value); } emit SolutionSubmission(_msgSender, _assigmentId); @@ -484,12 +489,8 @@ ReentrancyGuardUpgradeable { Inference storage inference = inferences[_inferenceId]; if (inference.status == InferenceStatus.Solving && block.timestamp > inference.expiredAt) { - uint256[] storage assignmentIds = assignmentsByInference[_inferenceId].values; - uint256 assignmentNumber = assignmentIds.length; - for (uint256 i = 0; i < assignmentNumber; ++i) { - assignments[assignmentIds[i]].worker = address(0); - } - _assignMiners(_inferenceId); + inference.status = InferenceStatus.Killed; + TransferHelper.safeTransferNative(inference.creator, inference.value); } } diff --git a/tests/Test.t.sol b/tests/Test.t.sol index a0a7d05..f3e7001 100644 --- a/tests/Test.t.sol +++ b/tests/Test.t.sol @@ -42,9 +42,10 @@ contract WorkHubTest is Test { 1, 10, 1e18, + 1e16, 21 days ); - workerHub.setNewRewardInEpoch(1e16); +// workerHub.setNewRewardInEpoch(1e16); workerHub.registerModel(ModelAddr, 1, 1e18); vm.stopPrank(); } From 30a5fbb2c77676780dec26d8e54a1328fd11459c Mon Sep 17 00:00:00 2001 From: rein-nbc Date: Thu, 9 May 2024 18:42:16 +0700 Subject: [PATCH 31/82] (WIP) --- contracts/ImageClassifier.sol | 3 --- hardhat.config.ts | 7 ++++--- run-anvil.sh | 17 ++++++++++++++--- run-cudatest.sh | 6 +++--- run-local.sh | 6 +++--- run-regtest2.sh | 6 +++--- run-regtest3.sh | 20 ++++++++++---------- scripts/deploy-image-model.ts | 3 ++- scripts/deploy-melody-model.ts | 1 + scripts/deploy-textrnn-model.ts | 1 + 10 files changed, 41 insertions(+), 29 deletions(-) diff --git a/contracts/ImageClassifier.sol b/contracts/ImageClassifier.sol index 2ca4c12..0f72c17 100644 --- a/contracts/ImageClassifier.sol +++ b/contracts/ImageClassifier.sol @@ -29,9 +29,6 @@ contract ImageClassifier is IImageClassifier, Ownable { using Layers for Layers.MaxPooling2DLayer; using Layers for Layers.Conv2DLayer; using Tensor1DMethods for Tensors.Tensor1D; - using Tensor2DMethods for Tensors.Tensor2D; - using Tensor3DMethods for Tensors.Tensor3D; - using Tensor4DMethods for Tensors.Tensor4D; Model public model; address public modelInterface; diff --git a/hardhat.config.ts b/hardhat.config.ts index e56e4cc..6203ab5 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -70,9 +70,10 @@ const config: HardhatUserConfig = { treasuryAddress: process.env.REGTEST3_TREASURY_ADDRESS, collectionAddress: process.env.REGTEST3_COLLECTION_ADDRESS, workerHubAddress: process.env.REGTEST3_WORKER_HUB_ADDRESS, - timeout: 500_000, - gasPrice: 1_000_000_000, - blockGasLimit: 100_000_000_000, + timeout: 600_000, + gas: 10_000_000_000, + gasPrice: "auto", + blockGasLimit: 100_000_000_000 } as any, cudatest: { url: "http://34.124.187.213:8545", diff --git a/run-anvil.sh b/run-anvil.sh index ff719ac..2064f28 100644 --- a/run-anvil.sh +++ b/run-anvil.sh @@ -5,21 +5,32 @@ anvil --prune-history --order fifo --code-size-limit 4294967296 -m "test test te npx hardhat deploy --tags 1 --network anvil # ImageClassifier -npx hardhat run scripts/deploy-image-model.ts +npx hardhat run scripts/deploy-image-model.ts --network anvil npx hardhat eval-img --network anvil --id '1' --contract '0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0' --img 'sample-images/nft/cryptoadz/000.png' +npx hardhat eval-img --network anvil --id '1' --contract '0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0' --img 'sample-images/nft/cryptoadz/001.png' +npx hardhat eval-img --network anvil --id '1' --contract '0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0' --img 'sample-images/nft/cryptoadz/002.png' +npx hardhat eval-img --network anvil --id '1' --contract '0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0' --img 'sample-images/nft/cryptopunks/000.png' +npx hardhat eval-img --network anvil --id '1' --contract '0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0' --img 'sample-images/nft/cryptopunks/001.png' +npx hardhat eval-img --network anvil --id '1' --contract '0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0' --img 'sample-images/nft/cryptopunks/002.png' +npx hardhat eval-img --network anvil --id '1' --contract '0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0' --img 'sample-images/nft/moonbirds/000.png' +npx hardhat eval-img --network anvil --id '1' --contract '0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0' --img 'sample-images/nft/moonbirds/001.png' +npx hardhat eval-img --network anvil --id '1' --contract '0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0' --img 'sample-images/nft/moonbirds/002.png' +npx hardhat eval-img --network anvil --id '1' --contract '0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0' --img 'sample-images/nft/nouns/000.png' +npx hardhat eval-img --network anvil --id '1' --contract '0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0' --img 'sample-images/nft/nouns/001.png' +npx hardhat eval-img --network anvil --id '1' --contract '0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0' --img 'sample-images/nft/nouns/002.png' npx hardhat get-image-model --network anvil --id '1' --contract '0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0' # TextRNN -npx hardhat run scripts/deploy-textrnn-model.ts +npx hardhat run scripts/deploy-textrnn-model.ts --network anvil npx hardhat generate-text --network anvil --id '1' --contract '0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0' --prompt $'ROMEO:\nIs the day so young?' --togenerate 100 --generatepertx 10 npx hardhat get-textrnn-model --network anvil --id '1' --contract '0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0' # MelodyRNN -npx hardhat run scripts/deploy-melody-model.ts +npx hardhat run scripts/deploy-melody-model.ts --network anvil npx hardhat generate-melody --network anvil --id '1' --contract '0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0' --count 50 --steplen 1 --output "_outputs/vgm.mid" npx hardhat generate-melody --network anvil --id '1' --contract '0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0' --count 1 --steplen 50 --output "_outputs/vgm_stateful.mid" diff --git a/run-cudatest.sh b/run-cudatest.sh index e551ab1..1418d10 100644 --- a/run-cudatest.sh +++ b/run-cudatest.sh @@ -2,21 +2,21 @@ npx hardhat deploy --tags 1 --network cudatest # ImageClassifier -npx hardhat run scripts/deploy-image-model.ts +npx hardhat run scripts/deploy-image-model.ts --network cudatest npx hardhat eval-img --network cudatest --id '1' --contract '0x1D19Db739A466c156b007B8cC18687Eb21434D75' --img 'sample-images/nft/cryptoadz/000.png' npx hardhat get-image-model --network cudatest --id '1' --contract '0x1D19Db739A466c156b007B8cC18687Eb21434D75' # TextRNN -npx hardhat run scripts/deploy-textrnn-model.ts +npx hardhat run scripts/deploy-textrnn-model.ts --network cudatest npx hardhat generate-text --network cudatest --id '1' --contract '0x1D19Db739A466c156b007B8cC18687Eb21434D75' --prompt $'ROMEO:\nIs the day so young?' --togenerate 100 --generatepertx 10 npx hardhat get-textrnn-model --network cudatest --id '1' --contract '0x1D19Db739A466c156b007B8cC18687Eb21434D75' # MelodyRNN -npx hardhat run scripts/deploy-melody-model.ts +npx hardhat run scripts/deploy-melody-model.ts --network cudatest npx hardhat generate-melody --network cudatest --id '1' --contract '0x1D19Db739A466c156b007B8cC18687Eb21434D75' --count 50 --steplen 1 --output "_outputs/vgm.mid" npx hardhat generate-melody --network cudatest --id '1' --contract '0x1D19Db739A466c156b007B8cC18687Eb21434D75' --count 1 --steplen 50 --output "_outputs/vgm_stateful.mid" diff --git a/run-local.sh b/run-local.sh index 6b5aecd..41b7b39 100644 --- a/run-local.sh +++ b/run-local.sh @@ -5,21 +5,21 @@ npx hardhat node # ModelRegister contract is automatically deployed # ImageClassifier -npx hardhat run scripts/deploy-image-model.ts +npx hardhat run scripts/deploy-image-model.ts --network localhost npx hardhat eval-img --network localhost --id '1' --contract '0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0' --img 'sample-images/nft/cryptoadz/000.png' npx hardhat get-image-model --network localhost --id '1' --contract '0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0' # TextRNN -npx hardhat run scripts/deploy-textrnn-model.ts +npx hardhat run scripts/deploy-textrnn-model.ts --network localhost npx hardhat generate-text --network localhost --id '1' --contract '0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0' --prompt $'ROMEO:\nIs the day so young?' --togenerate 100 --generatepertx 10 npx hardhat get-textrnn-model --network localhost --id '1' --contract '0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0' # MelodyRNN -npx hardhat run scripts/deploy-melody-model.ts +npx hardhat run scripts/deploy-melody-model.ts --network localhost npx hardhat generate-melody --network localhost --id '1' --contract '0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0' --count 50 --steplen 1 --output "_outputs/vgm.mid" npx hardhat generate-melody --network localhost --id '1' --contract '0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0' --count 1 --steplen 50 --output "_outputs/vgm_stateful.mid" diff --git a/run-regtest2.sh b/run-regtest2.sh index 93ba820..d5bdf76 100644 --- a/run-regtest2.sh +++ b/run-regtest2.sh @@ -2,21 +2,21 @@ npx hardhat deploy --tags 1 --network regtest2 # ImageClassifier -npx hardhat run scripts/deploy-image-model.ts +npx hardhat run scripts/deploy-image-model.ts --network regtest2 npx hardhat eval-img --network regtest2 --id '1' --contract '0x987c7F1f0e0cec104b18Ed16e0139dc77Fa18361' --img 'sample-images/nft/cryptoadz/000.png' npx hardhat get-image-model --network regtest2 --id '1' --contract '0x987c7F1f0e0cec104b18Ed16e0139dc77Fa18361' # TextRNN -npx hardhat run scripts/deploy-textrnn-model.ts +npx hardhat run scripts/deploy-textrnn-model.ts --network regtest2 npx hardhat generate-text --network regtest2 --id '1' --contract '0x987c7F1f0e0cec104b18Ed16e0139dc77Fa18361' --prompt $'ROMEO:\nIs the day so young?' --togenerate 100 --generatepertx 10 npx hardhat get-textrnn-model --network regtest2 --id '1' --contract '0x987c7F1f0e0cec104b18Ed16e0139dc77Fa18361' # MelodyRNN -npx hardhat run scripts/deploy-melody-model.ts +npx hardhat run scripts/deploy-melody-model.ts --network regtest2 npx hardhat generate-melody --network regtest2 --id '1' --contract '0x987c7F1f0e0cec104b18Ed16e0139dc77Fa18361' --count 50 --steplen 1 --output "_outputs/vgm.mid" npx hardhat generate-melody --network regtest2 --id '1' --contract '0x987c7F1f0e0cec104b18Ed16e0139dc77Fa18361' --count 1 --steplen 50 --output "_outputs/vgm_stateful.mid" diff --git a/run-regtest3.sh b/run-regtest3.sh index 1c76a7c..1217220 100644 --- a/run-regtest3.sh +++ b/run-regtest3.sh @@ -2,26 +2,26 @@ npx hardhat deploy --tags 1 --network regtest3 # ImageClassifier -npx hardhat run scripts/deploy-image-model.ts +npx hardhat run scripts/deploy-image-model.ts --network regtest3 -npx hardhat eval-img --network regtest3 --id '1' --contract '0x987c7F1f0e0cec104b18Ed16e0139dc77Fa18361' --img 'sample-images/nft/cryptoadz/000.png' +npx hardhat eval-img --network regtest3 --id '1' --contract '0xfC662501feDBe154Dc72004f26033895501d7764' --img 'sample-images/nft/cryptoadz/000.png' -npx hardhat get-image-model --network regtest3 --id '1' --contract '0x987c7F1f0e0cec104b18Ed16e0139dc77Fa18361' +npx hardhat get-image-model --network regtest3 --id '1' --contract '0xfC662501feDBe154Dc72004f26033895501d7764' # TextRNN -npx hardhat run scripts/deploy-textrnn-model.ts +npx hardhat run scripts/deploy-textrnn-model.ts --network regtest3 -npx hardhat generate-text --network regtest3 --id '1' --contract '0x987c7F1f0e0cec104b18Ed16e0139dc77Fa18361' --prompt $'ROMEO:\nIs the day so young?' --togenerate 100 --generatepertx 10 +npx hardhat generate-text --network regtest3 --id '1' --contract '0xfC662501feDBe154Dc72004f26033895501d7764' --prompt $'ROMEO:\nIs the day so young?' --togenerate 100 --generatepertx 10 -npx hardhat get-textrnn-model --network regtest3 --id '1' --contract '0x987c7F1f0e0cec104b18Ed16e0139dc77Fa18361' +npx hardhat get-textrnn-model --network regtest3 --id '1' --contract '0xfC662501feDBe154Dc72004f26033895501d7764' # MelodyRNN -npx hardhat run scripts/deploy-melody-model.ts +npx hardhat run scripts/deploy-melody-model.ts --network regtest3 -npx hardhat generate-melody --network regtest3 --id '1' --contract '0x987c7F1f0e0cec104b18Ed16e0139dc77Fa18361' --count 50 --steplen 1 --output "_outputs/vgm.mid" -npx hardhat generate-melody --network regtest3 --id '1' --contract '0x987c7F1f0e0cec104b18Ed16e0139dc77Fa18361' --count 1 --steplen 50 --output "_outputs/vgm_stateful.mid" +npx hardhat generate-melody --network regtest3 --id '1' --contract '0xfC662501feDBe154Dc72004f26033895501d7764' --count 50 --steplen 1 --output "_outputs/vgm.mid" +npx hardhat generate-melody --network regtest3 --id '1' --contract '0xfC662501feDBe154Dc72004f26033895501d7764' --count 1 --steplen 50 --output "_outputs/vgm_stateful.mid" -npx hardhat get-melody-model --network regtest3 --id '1' --contract '0x987c7F1f0e0cec104b18Ed16e0139dc77Fa18361' +npx hardhat get-melody-model --network regtest3 --id '1' --contract '0xfC662501feDBe154Dc72004f26033895501d7764' # Testing contract storage npx hardhat test-storage-multi-contract --network regtest3 --n 500000 diff --git a/scripts/deploy-image-model.ts b/scripts/deploy-image-model.ts index b90585b..570af64 100644 --- a/scripts/deploy-image-model.ts +++ b/scripts/deploy-image-model.ts @@ -9,7 +9,7 @@ dotenv.config(); const ModelCollectionContractName = "ModelCollection"; const MaxWeightLen = 1000; -const mintPrice = ethers.utils.parseEther('0.1'); +const mintPrice = ethers.utils.parseEther('100'); const mintConfig = { value: mintPrice }; // model 10x10: MaxWeightLen = 40, numTx = 8, fee = 0.02 * 8 TC @@ -62,6 +62,7 @@ async function main() { // ImageClassifier contract is too big (larger than 49152 bytes) to be deployed with ContractFactory const ImageFac = new ethers.ContractFactory(ImageClassifierArtifact.abi, ImageClassifierArtifact.bytecode, signer); const imageImpl = await ImageFac.deploy(); + await imageImpl.deployed(); // const ProxyFac = new ethers.ContractFactory(EIP173ProxyWithReceiveArtifact.abi, EIP173ProxyWithReceiveArtifact.bytecode, signer); // const initData = ImageFac.interface.encodeFunctionData("initialize", [params.model_name, params.classes_name, nftContractAddress]); // const mldyProxy = await ProxyFac.deploy(mldyImpl.address, signer.address, initData); diff --git a/scripts/deploy-melody-model.ts b/scripts/deploy-melody-model.ts index 708f305..d0996ff 100644 --- a/scripts/deploy-melody-model.ts +++ b/scripts/deploy-melody-model.ts @@ -60,6 +60,7 @@ async function main() { // deploy a MelodyRNN contract const MelodyFac = new ethers.ContractFactory(MelodyRNNArtifact.abi, MelodyRNNArtifact.bytecode, signer); const mldyImpl = await MelodyFac.deploy(); + await mldyImpl.deployed(); // const ProxyFac = new ethers.ContractFactory(EIP173ProxyWithReceiveArtifact.abi, EIP173ProxyWithReceiveArtifact.bytecode, signer); // const initData = MelodyFac.interface.encodeFunctionData("initialize", [params.model_name, nftContractAddress]); // const mldyProxy = await ProxyFac.deploy(mldyImpl.address, signer.address, initData); diff --git a/scripts/deploy-textrnn-model.ts b/scripts/deploy-textrnn-model.ts index 597045e..52e0fcf 100644 --- a/scripts/deploy-textrnn-model.ts +++ b/scripts/deploy-textrnn-model.ts @@ -61,6 +61,7 @@ async function main() { const EaiFac = new ethers.ContractFactory(TextRNNArtifact.abi, TextRNNArtifact.bytecode, signer); const eaiImpl = await EaiFac.deploy(); + await eaiImpl.deployed(); // const ProxyFac = new ethers.ContractFactory(EIP173ProxyWithReceiveArtifact.abi, EIP173ProxyWithReceiveArtifact.bytecode, signer); // const initData = EaiFac.interface.encodeFunctionData("initialize", [params.model_name, params.classes_name, nftContractAddress]); // const mldyProxy = await ProxyFac.deploy(mldyImpl.address, signer.address, initData); From a41076e1f65b26ecfa9639827b1c9214c6b45099 Mon Sep 17 00:00:00 2001 From: kochou-nbc Date: Thu, 9 May 2024 19:15:50 +0700 Subject: [PATCH 32/82] fix bugs --- .openzeppelin/unknown-20156.json | 3790 +++++++++++++++++++++++ contracts/WorkerHub.sol | 8 +- contracts/storages/WorkerHubStorage.sol | 2 +- scripts/deployModelCollection.ts | 4 +- scripts/deployWorkerHub.ts | 4 +- 5 files changed, 3796 insertions(+), 12 deletions(-) diff --git a/.openzeppelin/unknown-20156.json b/.openzeppelin/unknown-20156.json index e0eb234..297bdab 100644 --- a/.openzeppelin/unknown-20156.json +++ b/.openzeppelin/unknown-20156.json @@ -99,6 +99,26 @@ "address": "0x8bC20218C88A65340F32178fE90FC804992C9E90", "txHash": "0xd8b5332866b0b9dd4202f9c7580dd498ad434568725f7ef489d0b5b040055da3", "kind": "transparent" + }, + { + "address": "0x0D8eEd4f3E1D19bCd0CC13BD093C01048c88ee13", + "txHash": "0xf3f3b83b6801cd8b618b26342c093de54660d4721285f68e9ed27df726bbc9a2", + "kind": "transparent" + }, + { + "address": "0xb0F6c20163170958f9935121378a3ed3E8d6263d", + "txHash": "0x4ff4db7c8c033ebbd7f08e112da1f6e538536d5173c882cd128ed998aa8038e1", + "kind": "transparent" + }, + { + "address": "0xC26cB208D0A08c13832C2963A65C54593dcBb4De", + "txHash": "0x4fe1ec2afae9579e41b02a44d8b8760cf38e6b10d3ec95e21aae954bd26ee95a", + "kind": "transparent" + }, + { + "address": "0xd6441ac1F986BFe46B402FD1e0A72e210F55E2E8", + "txHash": "0xfda781e2817f75b9695216df7d2adae1275358930ae1f932728e93963e9d7aeb", + "kind": "transparent" } ], "impls": { @@ -5694,6 +5714,3776 @@ }, "namespaces": {} } + }, + "414e315d53d6e00d66fa8c55b4e7faef7043f7318c979f54962006dbb277b504": { + "address": "0x430c1Aa440d635Eb5a13156181bCCD97B39AD4C1", + "txHash": "0x94c78b3f2f38c4b344a18938a91540b8fdb887b0e6860c352d6b6f55c5b29e63", + "layout": { + "solcVersion": "0.8.19", + "storage": [ + { + "label": "randomizer", + "offset": 0, + "slot": "0", + "type": "t_struct(Randomizer)3373_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:10" + }, + { + "label": "models", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_struct(Model)3116_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:12" + }, + { + "label": "miners", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_address,t_struct(Worker)3129_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:13" + }, + { + "label": "validators", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_address,t_struct(Worker)3129_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:14" + }, + { + "label": "minerAddressesByModel", + "offset": 0, + "slot": "4", + "type": "t_mapping(t_address,t_struct(AddressSet)3417_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:16" + }, + { + "label": "validatorAddressesByModel", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_address,t_struct(AddressSet)3417_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:17" + }, + { + "label": "modelAddresses", + "offset": 0, + "slot": "6", + "type": "t_struct(AddressSet)3417_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:19" + }, + { + "label": "minerAddresses", + "offset": 0, + "slot": "8", + "type": "t_struct(AddressSet)3417_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:20" + }, + { + "label": "validatorAddresses", + "offset": 0, + "slot": "10", + "type": "t_struct(AddressSet)3417_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:21" + }, + { + "label": "minerUnstakeRequests", + "offset": 0, + "slot": "12", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3214_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:23" + }, + { + "label": "validatorUnstakeRequests", + "offset": 0, + "slot": "13", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3214_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)3189_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)3153_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:30" + }, + { + "label": "assignmentsByMiner", + "offset": 0, + "slot": "18", + "type": "t_mapping(t_address,t_struct(Uint256Set)3587_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:31" + }, + { + "label": "assignmentsByInference", + "offset": 0, + "slot": "19", + "type": "t_mapping(t_uint256,t_struct(Uint256Set)3587_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)3111_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)3102": { + "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)3417_storage)": { + "label": "mapping(address => struct Set.AddressSet)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Model)3116_storage)": { + "label": "mapping(address => struct IWorkerHub.Model)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Uint256Set)3587_storage)": { + "label": "mapping(address => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(UnstakeRequest)3214_storage)": { + "label": "mapping(address => struct IWorkerHub.UnstakeRequest)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Worker)3129_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)3153_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Assignment)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Inference)3189_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Inference)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(MinerEpochState)3111_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.MinerEpochState)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Uint256Set)3587_storage)": { + "label": "mapping(uint256 => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_uint256)": { + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32" + }, + "t_struct(AddressSet)3417_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)3153_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)3189_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)3102", + "offset": 26, + "slot": "4" + }, + { + "label": "creator", + "type": "t_address", + "offset": 0, + "slot": "5" + } + ], + "numberOfBytes": "192" + }, + "t_struct(MinerEpochState)3111_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)3116_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)3373_storage": { + "label": "struct Random.Randomizer", + "members": [ + { + "label": "nonce", + "type": "t_uint256", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(Uint256Set)3587_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)3214_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)3129_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": {} + } + }, + "a1188c22853a3e7a80a0dbd28f1d5d63d8078f2881e1ccebe26d0667774f212d": { + "address": "0xf51C529F3b16bE14aEF05ef83BCB0431bE4b6997", + "txHash": "0x8e21c4d2aac75ca756eb7ff1128932cddbd508c16f45fe8ea159558365229a52", + "layout": { + "solcVersion": "0.8.19", + "storage": [ + { + "label": "randomizer", + "offset": 0, + "slot": "0", + "type": "t_struct(Randomizer)3343_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:10" + }, + { + "label": "models", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_struct(Model)3086_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:12" + }, + { + "label": "miners", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_address,t_struct(Worker)3099_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:13" + }, + { + "label": "validators", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_address,t_struct(Worker)3099_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:14" + }, + { + "label": "minerAddressesByModel", + "offset": 0, + "slot": "4", + "type": "t_mapping(t_address,t_struct(AddressSet)3387_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:16" + }, + { + "label": "validatorAddressesByModel", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_address,t_struct(AddressSet)3387_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:17" + }, + { + "label": "modelAddresses", + "offset": 0, + "slot": "6", + "type": "t_struct(AddressSet)3387_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:19" + }, + { + "label": "minerAddresses", + "offset": 0, + "slot": "8", + "type": "t_struct(AddressSet)3387_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:20" + }, + { + "label": "validatorAddresses", + "offset": 0, + "slot": "10", + "type": "t_struct(AddressSet)3387_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:21" + }, + { + "label": "minerUnstakeRequests", + "offset": 0, + "slot": "12", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3184_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:23" + }, + { + "label": "validatorUnstakeRequests", + "offset": 0, + "slot": "13", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3184_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)3159_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)3123_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:30" + }, + { + "label": "assignmentsByMiner", + "offset": 0, + "slot": "18", + "type": "t_mapping(t_address,t_struct(Uint256Set)3557_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:31" + }, + { + "label": "assignmentsByInference", + "offset": 0, + "slot": "19", + "type": "t_mapping(t_uint256,t_struct(Uint256Set)3557_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)3081_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)3072": { + "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)3387_storage)": { + "label": "mapping(address => struct Set.AddressSet)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Model)3086_storage)": { + "label": "mapping(address => struct IWorkerHub.Model)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Uint256Set)3557_storage)": { + "label": "mapping(address => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(UnstakeRequest)3184_storage)": { + "label": "mapping(address => struct IWorkerHub.UnstakeRequest)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Worker)3099_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)3123_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Assignment)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Inference)3159_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Inference)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(MinerEpochState)3081_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.MinerEpochState)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Uint256Set)3557_storage)": { + "label": "mapping(uint256 => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_uint256)": { + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32" + }, + "t_struct(AddressSet)3387_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)3123_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)3159_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)3072", + "offset": 26, + "slot": "4" + }, + { + "label": "creator", + "type": "t_address", + "offset": 0, + "slot": "5" + } + ], + "numberOfBytes": "192" + }, + "t_struct(MinerEpochState)3081_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)3086_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)3343_storage": { + "label": "struct Random.Randomizer", + "members": [ + { + "label": "nonce", + "type": "t_uint256", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(Uint256Set)3557_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)3184_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)3099_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": {} + } + }, + "9a17e681f5617ef10bef521e9bc1df2db2f2254478aca50b8c1772c89e47a271": { + "address": "0x457850fc8d5503d60EBbE0d44D7c1615e1847e3b", + "txHash": "0xe79ae152ec7469f57c0bf49fe93d758f21a409c461a93fdb9887917e33942f23", + "layout": { + "solcVersion": "0.8.19", + "storage": [ + { + "label": "randomizer", + "offset": 0, + "slot": "0", + "type": "t_struct(Randomizer)3343_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:10" + }, + { + "label": "models", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_struct(Model)3086_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:12" + }, + { + "label": "miners", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_address,t_struct(Worker)3099_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:13" + }, + { + "label": "validators", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_address,t_struct(Worker)3099_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:14" + }, + { + "label": "minerAddressesByModel", + "offset": 0, + "slot": "4", + "type": "t_mapping(t_address,t_struct(AddressSet)3387_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:16" + }, + { + "label": "validatorAddressesByModel", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_address,t_struct(AddressSet)3387_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:17" + }, + { + "label": "modelAddresses", + "offset": 0, + "slot": "6", + "type": "t_struct(AddressSet)3387_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:19" + }, + { + "label": "minerAddresses", + "offset": 0, + "slot": "8", + "type": "t_struct(AddressSet)3387_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:20" + }, + { + "label": "validatorAddresses", + "offset": 0, + "slot": "10", + "type": "t_struct(AddressSet)3387_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:21" + }, + { + "label": "minerUnstakeRequests", + "offset": 0, + "slot": "12", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3184_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:23" + }, + { + "label": "validatorUnstakeRequests", + "offset": 0, + "slot": "13", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3184_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)3159_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)3123_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:30" + }, + { + "label": "assignmentsByMiner", + "offset": 0, + "slot": "18", + "type": "t_mapping(t_address,t_struct(Uint256Set)3557_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:31" + }, + { + "label": "assignmentsByInference", + "offset": 0, + "slot": "19", + "type": "t_mapping(t_uint256,t_struct(Uint256Set)3557_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)3081_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)3072": { + "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)3387_storage)": { + "label": "mapping(address => struct Set.AddressSet)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Model)3086_storage)": { + "label": "mapping(address => struct IWorkerHub.Model)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Uint256Set)3557_storage)": { + "label": "mapping(address => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(UnstakeRequest)3184_storage)": { + "label": "mapping(address => struct IWorkerHub.UnstakeRequest)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Worker)3099_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)3123_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Assignment)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Inference)3159_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Inference)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(MinerEpochState)3081_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.MinerEpochState)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Uint256Set)3557_storage)": { + "label": "mapping(uint256 => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_uint256)": { + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32" + }, + "t_struct(AddressSet)3387_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)3123_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)3159_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)3072", + "offset": 26, + "slot": "4" + }, + { + "label": "creator", + "type": "t_address", + "offset": 0, + "slot": "5" + } + ], + "numberOfBytes": "192" + }, + "t_struct(MinerEpochState)3081_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)3086_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)3343_storage": { + "label": "struct Random.Randomizer", + "members": [ + { + "label": "nonce", + "type": "t_uint256", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(Uint256Set)3557_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)3184_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)3099_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": {} + } + }, + "759e2f2a6344788e43b106f467c9cff562bf617a44df6687ca828d2f05559838": { + "address": "0x62890C1f9Ea7929Ac3C0939bDbE6b0ba7dFe9F38", + "txHash": "0x6b394a2572e4b7ab0695fefe9c8b69cdb0df3c9e08a39722d670bf7c5029b1e6", + "layout": { + "solcVersion": "0.8.19", + "storage": [ + { + "label": "randomizer", + "offset": 0, + "slot": "0", + "type": "t_struct(Randomizer)3342_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:10" + }, + { + "label": "models", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_struct(Model)3085_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:12" + }, + { + "label": "miners", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_address,t_struct(Worker)3098_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:13" + }, + { + "label": "validators", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_address,t_struct(Worker)3098_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:14" + }, + { + "label": "minerAddressesByModel", + "offset": 0, + "slot": "4", + "type": "t_mapping(t_address,t_struct(AddressSet)3386_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:16" + }, + { + "label": "validatorAddressesByModel", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_address,t_struct(AddressSet)3386_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:17" + }, + { + "label": "modelAddresses", + "offset": 0, + "slot": "6", + "type": "t_struct(AddressSet)3386_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:19" + }, + { + "label": "minerAddresses", + "offset": 0, + "slot": "8", + "type": "t_struct(AddressSet)3386_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:20" + }, + { + "label": "validatorAddresses", + "offset": 0, + "slot": "10", + "type": "t_struct(AddressSet)3386_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:21" + }, + { + "label": "minerUnstakeRequests", + "offset": 0, + "slot": "12", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3183_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:23" + }, + { + "label": "validatorUnstakeRequests", + "offset": 0, + "slot": "13", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3183_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)3158_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)3122_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:30" + }, + { + "label": "assignmentsByMiner", + "offset": 0, + "slot": "18", + "type": "t_mapping(t_address,t_struct(Uint256Set)3556_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:31" + }, + { + "label": "assignmentsByInference", + "offset": 0, + "slot": "19", + "type": "t_mapping(t_uint256,t_struct(Uint256Set)3556_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)3080_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)3071": { + "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)3386_storage)": { + "label": "mapping(address => struct Set.AddressSet)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Model)3085_storage)": { + "label": "mapping(address => struct IWorkerHub.Model)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Uint256Set)3556_storage)": { + "label": "mapping(address => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(UnstakeRequest)3183_storage)": { + "label": "mapping(address => struct IWorkerHub.UnstakeRequest)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Worker)3098_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)3122_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Assignment)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Inference)3158_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Inference)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(MinerEpochState)3080_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.MinerEpochState)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Uint256Set)3556_storage)": { + "label": "mapping(uint256 => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_uint256)": { + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32" + }, + "t_struct(AddressSet)3386_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)3122_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)3158_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)3071", + "offset": 26, + "slot": "4" + }, + { + "label": "creator", + "type": "t_address", + "offset": 0, + "slot": "5" + } + ], + "numberOfBytes": "192" + }, + "t_struct(MinerEpochState)3080_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)3085_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)3342_storage": { + "label": "struct Random.Randomizer", + "members": [ + { + "label": "nonce", + "type": "t_uint256", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(Uint256Set)3556_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)3183_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)3098_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": {} + } + }, + "d03077031c7504eca3f4e12556d430043a5dacfc5cb7126256c0d09cebbabc1a": { + "address": "0xFA8d2aaA90E3ae33Bf26669619f33cc58325bda4", + "txHash": "0x411ebf567ff631d916cbf85a6d8bb9da9dcbdfe2ebc152b9b7c3ba5d75521f31", + "layout": { + "solcVersion": "0.8.19", + "storage": [ + { + "label": "randomizer", + "offset": 0, + "slot": "0", + "type": "t_struct(Randomizer)3342_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:10" + }, + { + "label": "models", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_struct(Model)3085_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:12" + }, + { + "label": "miners", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_address,t_struct(Worker)3098_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:13" + }, + { + "label": "validators", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_address,t_struct(Worker)3098_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:14" + }, + { + "label": "minerAddressesByModel", + "offset": 0, + "slot": "4", + "type": "t_mapping(t_address,t_struct(AddressSet)3386_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:16" + }, + { + "label": "validatorAddressesByModel", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_address,t_struct(AddressSet)3386_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:17" + }, + { + "label": "modelAddresses", + "offset": 0, + "slot": "6", + "type": "t_struct(AddressSet)3386_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:19" + }, + { + "label": "minerAddresses", + "offset": 0, + "slot": "8", + "type": "t_struct(AddressSet)3386_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:20" + }, + { + "label": "validatorAddresses", + "offset": 0, + "slot": "10", + "type": "t_struct(AddressSet)3386_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:21" + }, + { + "label": "minerUnstakeRequests", + "offset": 0, + "slot": "12", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3183_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:23" + }, + { + "label": "validatorUnstakeRequests", + "offset": 0, + "slot": "13", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3183_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)3158_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)3122_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:30" + }, + { + "label": "assignmentsByMiner", + "offset": 0, + "slot": "18", + "type": "t_mapping(t_address,t_struct(Uint256Set)3556_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:31" + }, + { + "label": "assignmentsByInference", + "offset": 0, + "slot": "19", + "type": "t_mapping(t_uint256,t_struct(Uint256Set)3556_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)3080_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)3071": { + "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)3386_storage)": { + "label": "mapping(address => struct Set.AddressSet)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Model)3085_storage)": { + "label": "mapping(address => struct IWorkerHub.Model)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Uint256Set)3556_storage)": { + "label": "mapping(address => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(UnstakeRequest)3183_storage)": { + "label": "mapping(address => struct IWorkerHub.UnstakeRequest)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Worker)3098_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)3122_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Assignment)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Inference)3158_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Inference)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(MinerEpochState)3080_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.MinerEpochState)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Uint256Set)3556_storage)": { + "label": "mapping(uint256 => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_uint256)": { + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32" + }, + "t_struct(AddressSet)3386_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)3122_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)3158_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)3071", + "offset": 26, + "slot": "4" + }, + { + "label": "creator", + "type": "t_address", + "offset": 0, + "slot": "5" + } + ], + "numberOfBytes": "192" + }, + "t_struct(MinerEpochState)3080_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)3085_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)3342_storage": { + "label": "struct Random.Randomizer", + "members": [ + { + "label": "nonce", + "type": "t_uint256", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(Uint256Set)3556_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)3183_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)3098_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 c410995..1660aaf 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -214,9 +214,6 @@ ReentrancyGuardUpgradeable { address modelAddress = modelAddresses.values[randomizer.randomUint256() % modelAddresses.size()]; miner.modelAddress = modelAddress; - minerAddressesByModel[modelAddress].insert(msg.sender); - - minerAddresses.insert(msg.sender); emit MinerRegistration(msg.sender, tier, msg.value); } @@ -300,9 +297,6 @@ ReentrancyGuardUpgradeable { address modelAddress = modelAddresses.values[randomizer.randomUint256() % modelAddresses.size()]; validator.modelAddress = modelAddress; - validatorAddressesByModel[modelAddress].insert(msg.sender); - - validatorAddresses.insert(msg.sender); emit ValidatorRegistration(msg.sender, tier, msg.value); } @@ -408,7 +402,7 @@ ReentrancyGuardUpgradeable { assignments[assignmentId].inferenceId = _inferenceId; assignments[assignmentId].worker = miner; selectedMiners[i] = miner; - assignmentsByMiner[msg.sender].insert(assignmentId); + assignmentsByMiner[miner].insert(assignmentId); assignmentsByInference[_inferenceId].insert(assignmentId); emit NewAssignment(assignmentId, _inferenceId, miner, expiredAt); } diff --git a/contracts/storages/WorkerHubStorage.sol b/contracts/storages/WorkerHubStorage.sol index a317bb4..f7a84bf 100644 --- a/contracts/storages/WorkerHubStorage.sol +++ b/contracts/storages/WorkerHubStorage.sol @@ -27,7 +27,7 @@ abstract contract WorkerHubStorage is IWorkerHub { mapping(uint256 => Inference) internal inferences; uint256 public assignmentNumber; - mapping(uint256 => Assignment) internal assignments; + mapping(uint256 => Assignment) public assignments; mapping(address => Set.Uint256Set) internal assignmentsByMiner; mapping(uint256 => Set.Uint256Set) internal assignmentsByInference; diff --git a/scripts/deployModelCollection.ts b/scripts/deployModelCollection.ts index c85d85f..e628edf 100644 --- a/scripts/deployModelCollection.ts +++ b/scripts/deployModelCollection.ts @@ -17,10 +17,10 @@ async function deployModelCollection() { await (async () => { const name = "Model" const symbol = "MDL" - const mintPrice = ethers.utils.parseEther('100'); + const mintPrice = ethers.utils.parseEther('0'); const royaltyReceiver = (await ethers.getSigners())[0].address const royalPortion = 20_00; - const nextModelId = 1000001; + const nextModelId = 100001; const modelCollection = await upgrades.deployProxy( ModelCollection, diff --git a/scripts/deployWorkerHub.ts b/scripts/deployWorkerHub.ts index f210d67..648d06b 100644 --- a/scripts/deployWorkerHub.ts +++ b/scripts/deployWorkerHub.ts @@ -30,6 +30,7 @@ async function deployWorkerHub() { const minerRequirement = 3; const blockPerEpoch = 600; const rewardPerEpochBasedOnPerf = ethers.utils.parseEther("0.5"); + const rewardPerEpoch = ethers.utils.parseEther('1'); const unstakeDelayTime = 12 * 24 * 3600; const workerHub = await upgrades.deployProxy( @@ -43,13 +44,12 @@ async function deployWorkerHub() { minerRequirement, blockPerEpoch, rewardPerEpochBasedOnPerf, + rewardPerEpoch, unstakeDelayTime ] ); await workerHub.deployed(); - await (await workerHub.setNewRewardInEpoch(ethers.utils.parseEther('1'))).wait(); - const tx = { to: workerHub.address, value: ethers.utils.parseEther('1000') From 36dd15587c64620282e55131f46fa6360518e2e0 Mon Sep 17 00:00:00 2001 From: 180945 <180945@trustless.computer> Date: Thu, 9 May 2024 20:26:46 +0700 Subject: [PATCH 33/82] fixed getMiningAssignments --- contracts/WorkerHub.sol | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/contracts/WorkerHub.sol b/contracts/WorkerHub.sol index 1660aaf..fcb55bf 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -81,8 +81,9 @@ ReentrancyGuardUpgradeable { for (uint256 i = 0; i < assignmentNumber; ++i) if (isAssignmentPending(assignmentIds[i])) counter++; - counter = 0; AssignmentInfo[] memory result = new AssignmentInfo[](counter); + counter = 0; + // todo: why not use i instead of counter for (uint256 i = 0; i < assignmentNumber; ++i) if (isAssignmentPending(assignmentIds[i])) { Assignment storage assignment = assignments[assignmentIds[i]]; From 34025fa6c7f9b7ce192f06c8a2116ed631cb0c6a Mon Sep 17 00:00:00 2001 From: 180945 <180945@trustless.computer> Date: Fri, 10 May 2024 08:36:06 +0700 Subject: [PATCH 34/82] fixed unstake flow --- contracts/WorkerHub.sol | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/contracts/WorkerHub.sol b/contracts/WorkerHub.sol index fcb55bf..e804bd0 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -241,7 +241,8 @@ ReentrancyGuardUpgradeable { miner.tier = 0; - TransferHelper.safeTransferNative(msg.sender, miner.stake); + // @kouchou review code + // TransferHelper.safeTransferNative(msg.sender, miner.stake); miner.stake = 0; miner.commitment = 0; @@ -249,8 +250,9 @@ ReentrancyGuardUpgradeable { minerAddressesByModel[miner.modelAddress].erase(msg.sender); miner.modelAddress = address(0); + uint currentUnstake = minerUnstakeRequests[msg.sender].stake; minerUnstakeRequests[msg.sender] = UnstakeRequest( - miner.stake, + miner.stake + currentUnstake, uint40(block.timestamp + unstakeDelayTime) ); @@ -278,6 +280,7 @@ ReentrancyGuardUpgradeable { uint256 stake = unstakeRequest.stake; if (stake == 0) revert NullStake(); + unstakeRequest.stake = 0; TransferHelper.safeTransferNative(msg.sender, stake); emit MinerUnstake(msg.sender, stake); @@ -324,7 +327,8 @@ ReentrancyGuardUpgradeable { validator.tier = 0; - TransferHelper.safeTransferNative(msg.sender, validator.stake); + // @koucho review code + // TransferHelper.safeTransferNative(msg.sender, validator.stake); validator.stake = 0; validator.commitment = 0; @@ -332,8 +336,9 @@ ReentrancyGuardUpgradeable { validatorAddressesByModel[validator.modelAddress].erase(msg.sender); validator.modelAddress = address(0); + uint currentUnstake = validatorUnstakeRequests[msg.sender].stake; validatorUnstakeRequests[msg.sender] = UnstakeRequest( - validator.stake, + validator.stake + currentUnstake, uint40(block.timestamp + unstakeDelayTime) ); @@ -359,6 +364,7 @@ ReentrancyGuardUpgradeable { uint256 stake = unstakeRequest.stake; if (stake == 0) revert NullStake(); + unstakeRequest.stake = 0; TransferHelper.safeTransferNative(msg.sender, stake); emit ValidatorUnstake(msg.sender, stake); From 0fc05d115cdcf0a5beeb2796f7b007461582b685 Mon Sep 17 00:00:00 2001 From: 180945 <180945@trustless.computer> Date: Fri, 10 May 2024 08:41:44 +0700 Subject: [PATCH 35/82] fixed unstake 0 --- contracts/WorkerHub.sol | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/contracts/WorkerHub.sol b/contracts/WorkerHub.sol index e804bd0..265c2b6 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -243,6 +243,7 @@ ReentrancyGuardUpgradeable { // @kouchou review code // TransferHelper.safeTransferNative(msg.sender, miner.stake); + uint stakeAmount = miner.stake; miner.stake = 0; miner.commitment = 0; @@ -252,7 +253,7 @@ ReentrancyGuardUpgradeable { uint currentUnstake = minerUnstakeRequests[msg.sender].stake; minerUnstakeRequests[msg.sender] = UnstakeRequest( - miner.stake + currentUnstake, + stakeAmount + currentUnstake, uint40(block.timestamp + unstakeDelayTime) ); @@ -329,6 +330,7 @@ ReentrancyGuardUpgradeable { // @koucho review code // TransferHelper.safeTransferNative(msg.sender, validator.stake); + uint stakeAmount = validator.stake; validator.stake = 0; validator.commitment = 0; @@ -338,7 +340,7 @@ ReentrancyGuardUpgradeable { uint currentUnstake = validatorUnstakeRequests[msg.sender].stake; validatorUnstakeRequests[msg.sender] = UnstakeRequest( - validator.stake + currentUnstake, + stakeAmount + currentUnstake, uint40(block.timestamp + unstakeDelayTime) ); From fe558e4610d31ec1534798e030be1859b73b5a38 Mon Sep 17 00:00:00 2001 From: 180945 <180945@trustless.computer> Date: Fri, 10 May 2024 09:00:08 +0700 Subject: [PATCH 36/82] added unstake delay time setter --- contracts/WorkerHub.sol | 10 ++++++++++ contracts/interfaces/IWorkerHub.sol | 1 + 2 files changed, 11 insertions(+) diff --git a/contracts/WorkerHub.sol b/contracts/WorkerHub.sol index 265c2b6..4f4d0b7 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -536,6 +536,16 @@ ReentrancyGuardUpgradeable { blocksPerEpoch = _blocks; } + function setUnstakDelayTime(uint40 _newUnstakeDelayTime) public virtual onlyOwner { + _updateEpoch(); + + require(_newUnstakeDelayTime != 0, "invalid unstake delay time"); + + emit UnstakeDelayTime(unstakeDelayTime, _newUnstakeDelayTime); + + unstakeDelayTime = _newUnstakeDelayTime; + } + // sum reward of an miner since last claimed epoch function rewardToClaim(address _miner) public virtual returns(uint256) { _updateEpoch(); diff --git a/contracts/interfaces/IWorkerHub.sol b/contracts/interfaces/IWorkerHub.sol index e63a39d..384a3cc 100644 --- a/contracts/interfaces/IWorkerHub.sol +++ b/contracts/interfaces/IWorkerHub.sol @@ -138,6 +138,7 @@ interface IWorkerHub is IInferable { event RewardPerEpoch(uint256 oldReward, uint256 newReward); event RewardPerEpochBasedOnPerf(uint256 oldReward, uint256 newReward); event BlocksPerEpoch(uint256 oldBlocks, uint256 newBlocks); + event UnstakeDelayTime(uint256 oldDelayTime, uint256 newDelayTime); error AlreadyRegistered(); error AlreadySubmitted(); From 814ad180f45db78d2723e9bc36fd5ac0cae7807b Mon Sep 17 00:00:00 2001 From: 180945 <180945@trustless.computer> Date: Fri, 10 May 2024 10:06:10 +0700 Subject: [PATCH 37/82] added event --- contracts/WorkerHub.sol | 2 ++ contracts/interfaces/IWorkerHub.sol | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/contracts/WorkerHub.sol b/contracts/WorkerHub.sol index 4f4d0b7..a27f65c 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -473,6 +473,8 @@ ReentrancyGuardUpgradeable { uint256 value = clonedInference.value - fee; TransferHelper.safeTransferNative(treasury, fee); TransferHelper.safeTransferNative(_msgSender, value); + + emit TransferFee(_msgSender, value, treasury, fee); } emit SolutionSubmission(_msgSender, _assigmentId); diff --git a/contracts/interfaces/IWorkerHub.sol b/contracts/interfaces/IWorkerHub.sol index 384a3cc..63e8ba7 100644 --- a/contracts/interfaces/IWorkerHub.sol +++ b/contracts/interfaces/IWorkerHub.sol @@ -127,6 +127,12 @@ interface IWorkerHub is IInferable { uint40 expiredAt ); event SolutionSubmission(address indexed miner, uint256 indexed assigmentId); + event TransferFee( + address indexed miner, + uint256 mingingFee, + address indexed treasury, + uint256 protocolFee + ); event MinerUnstake(address indexed miner, uint256 stake); event MinerJoin(address indexed miner); From 55a49458ec7dd5530aec2df66fff6a62937faa5d Mon Sep 17 00:00:00 2001 From: kochou-nbc Date: Fri, 10 May 2024 11:10:18 +0700 Subject: [PATCH 38/82] update getter --- .openzeppelin/unknown-20156.json | 2273 +++++++++++++++++++++++++++++- contracts/WorkerHub.sol | 23 + 2 files changed, 2291 insertions(+), 5 deletions(-) diff --git a/.openzeppelin/unknown-20156.json b/.openzeppelin/unknown-20156.json index 297bdab..fa08faf 100644 --- a/.openzeppelin/unknown-20156.json +++ b/.openzeppelin/unknown-20156.json @@ -105,11 +105,6 @@ "txHash": "0xf3f3b83b6801cd8b618b26342c093de54660d4721285f68e9ed27df726bbc9a2", "kind": "transparent" }, - { - "address": "0xb0F6c20163170958f9935121378a3ed3E8d6263d", - "txHash": "0x4ff4db7c8c033ebbd7f08e112da1f6e538536d5173c882cd128ed998aa8038e1", - "kind": "transparent" - }, { "address": "0xC26cB208D0A08c13832C2963A65C54593dcBb4De", "txHash": "0x4fe1ec2afae9579e41b02a44d8b8760cf38e6b10d3ec95e21aae954bd26ee95a", @@ -119,6 +114,10 @@ "address": "0xd6441ac1F986BFe46B402FD1e0A72e210F55E2E8", "txHash": "0xfda781e2817f75b9695216df7d2adae1275358930ae1f932728e93963e9d7aeb", "kind": "transparent" + }, + { + "address": "0xb0F6c20163170958f9935121378a3ed3E8d6263d", + "kind": "transparent" } ], "impls": { @@ -9484,6 +9483,2270 @@ }, "namespaces": {} } + }, + "989219c80312036518f573dd92297e0e7772b5aeff097477bcf30d4d07c02c73": { + "address": "0x2730657096A735AE208171e6546931905f480352", + "layout": { + "solcVersion": "0.8.19", + "storage": [ + { + "label": "randomizer", + "offset": 0, + "slot": "0", + "type": "t_struct(Randomizer)3414_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:10" + }, + { + "label": "models", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_struct(Model)3141_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:12" + }, + { + "label": "miners", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_address,t_struct(Worker)3154_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:13" + }, + { + "label": "validators", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_address,t_struct(Worker)3154_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:14" + }, + { + "label": "minerAddressesByModel", + "offset": 0, + "slot": "4", + "type": "t_mapping(t_address,t_struct(AddressSet)3458_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:16" + }, + { + "label": "validatorAddressesByModel", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_address,t_struct(AddressSet)3458_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:17" + }, + { + "label": "modelAddresses", + "offset": 0, + "slot": "6", + "type": "t_struct(AddressSet)3458_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:19" + }, + { + "label": "minerAddresses", + "offset": 0, + "slot": "8", + "type": "t_struct(AddressSet)3458_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:20" + }, + { + "label": "validatorAddresses", + "offset": 0, + "slot": "10", + "type": "t_struct(AddressSet)3458_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:21" + }, + { + "label": "minerUnstakeRequests", + "offset": 0, + "slot": "12", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3239_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:23" + }, + { + "label": "validatorUnstakeRequests", + "offset": 0, + "slot": "13", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3239_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)3214_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)3178_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:30" + }, + { + "label": "assignmentsByMiner", + "offset": 0, + "slot": "18", + "type": "t_mapping(t_address,t_struct(Uint256Set)3628_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:31" + }, + { + "label": "assignmentsByInference", + "offset": 0, + "slot": "19", + "type": "t_mapping(t_uint256,t_struct(Uint256Set)3628_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)3136_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)3127": { + "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)3458_storage)": { + "label": "mapping(address => struct Set.AddressSet)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Model)3141_storage)": { + "label": "mapping(address => struct IWorkerHub.Model)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Uint256Set)3628_storage)": { + "label": "mapping(address => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(UnstakeRequest)3239_storage)": { + "label": "mapping(address => struct IWorkerHub.UnstakeRequest)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Worker)3154_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)3178_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Assignment)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Inference)3214_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Inference)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(MinerEpochState)3136_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.MinerEpochState)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Uint256Set)3628_storage)": { + "label": "mapping(uint256 => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_uint256)": { + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32" + }, + "t_struct(AddressSet)3458_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)3178_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)3214_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)3127", + "offset": 26, + "slot": "4" + }, + { + "label": "creator", + "type": "t_address", + "offset": 0, + "slot": "5" + } + ], + "numberOfBytes": "192" + }, + "t_struct(MinerEpochState)3136_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)3141_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)3414_storage": { + "label": "struct Random.Randomizer", + "members": [ + { + "label": "nonce", + "type": "t_uint256", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(Uint256Set)3628_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)3239_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)3154_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": [ + "0x2730657096A735AE208171e6546931905f480352" + ] + }, + "8700117142687a914d9541804998cb8f9242137d9f88cd2fa07764868ed05c43": { + "address": "0x129F27497f026866954434A86ac48fc17E404E33", + "txHash": "0x61c55c04c73bbb247277aa5b01213b51a61de4681cbcca0c29cc3415981e7b48", + "layout": { + "solcVersion": "0.8.19", + "storage": [ + { + "label": "randomizer", + "offset": 0, + "slot": "0", + "type": "t_struct(Randomizer)3510_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:10" + }, + { + "label": "models", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_struct(Model)3237_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:12" + }, + { + "label": "miners", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_address,t_struct(Worker)3250_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:13" + }, + { + "label": "validators", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_address,t_struct(Worker)3250_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:14" + }, + { + "label": "minerAddressesByModel", + "offset": 0, + "slot": "4", + "type": "t_mapping(t_address,t_struct(AddressSet)3554_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:16" + }, + { + "label": "validatorAddressesByModel", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_address,t_struct(AddressSet)3554_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:17" + }, + { + "label": "modelAddresses", + "offset": 0, + "slot": "6", + "type": "t_struct(AddressSet)3554_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:19" + }, + { + "label": "minerAddresses", + "offset": 0, + "slot": "8", + "type": "t_struct(AddressSet)3554_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:20" + }, + { + "label": "validatorAddresses", + "offset": 0, + "slot": "10", + "type": "t_struct(AddressSet)3554_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:21" + }, + { + "label": "minerUnstakeRequests", + "offset": 0, + "slot": "12", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3335_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:23" + }, + { + "label": "validatorUnstakeRequests", + "offset": 0, + "slot": "13", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3335_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)3310_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)3274_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:30" + }, + { + "label": "assignmentsByMiner", + "offset": 0, + "slot": "18", + "type": "t_mapping(t_address,t_struct(Uint256Set)3724_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:31" + }, + { + "label": "assignmentsByInference", + "offset": 0, + "slot": "19", + "type": "t_mapping(t_uint256,t_struct(Uint256Set)3724_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)3232_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)3223": { + "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)3554_storage)": { + "label": "mapping(address => struct Set.AddressSet)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Model)3237_storage)": { + "label": "mapping(address => struct IWorkerHub.Model)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Uint256Set)3724_storage)": { + "label": "mapping(address => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(UnstakeRequest)3335_storage)": { + "label": "mapping(address => struct IWorkerHub.UnstakeRequest)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Worker)3250_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)3274_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Assignment)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Inference)3310_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Inference)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(MinerEpochState)3232_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.MinerEpochState)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Uint256Set)3724_storage)": { + "label": "mapping(uint256 => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_uint256)": { + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32" + }, + "t_struct(AddressSet)3554_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)3274_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)3310_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)3223", + "offset": 26, + "slot": "4" + }, + { + "label": "creator", + "type": "t_address", + "offset": 0, + "slot": "5" + } + ], + "numberOfBytes": "192" + }, + "t_struct(MinerEpochState)3232_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)3237_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)3510_storage": { + "label": "struct Random.Randomizer", + "members": [ + { + "label": "nonce", + "type": "t_uint256", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(Uint256Set)3724_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)3335_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)3250_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": {} + } + }, + "3b49755068f99cc5e0448a6fad6eb7bfc6c2751c3b677d114d41be2e5d36014e": { + "address": "0x959457f6DA7aBb473aE63542C94B91c3F364e131", + "txHash": "0xfff732a947a86e4ebe90fe3c5f17c1380abe4a5b0d1f6263ac0509b461871c47", + "layout": { + "solcVersion": "0.8.19", + "storage": [ + { + "label": "randomizer", + "offset": 0, + "slot": "0", + "type": "t_struct(Randomizer)3510_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:10" + }, + { + "label": "models", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_struct(Model)3237_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:12" + }, + { + "label": "miners", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_address,t_struct(Worker)3250_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:13" + }, + { + "label": "validators", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_address,t_struct(Worker)3250_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:14" + }, + { + "label": "minerAddressesByModel", + "offset": 0, + "slot": "4", + "type": "t_mapping(t_address,t_struct(AddressSet)3554_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:16" + }, + { + "label": "validatorAddressesByModel", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_address,t_struct(AddressSet)3554_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:17" + }, + { + "label": "modelAddresses", + "offset": 0, + "slot": "6", + "type": "t_struct(AddressSet)3554_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:19" + }, + { + "label": "minerAddresses", + "offset": 0, + "slot": "8", + "type": "t_struct(AddressSet)3554_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:20" + }, + { + "label": "validatorAddresses", + "offset": 0, + "slot": "10", + "type": "t_struct(AddressSet)3554_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:21" + }, + { + "label": "minerUnstakeRequests", + "offset": 0, + "slot": "12", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3335_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:23" + }, + { + "label": "validatorUnstakeRequests", + "offset": 0, + "slot": "13", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3335_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)3310_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)3274_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:30" + }, + { + "label": "assignmentsByMiner", + "offset": 0, + "slot": "18", + "type": "t_mapping(t_address,t_struct(Uint256Set)3724_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:31" + }, + { + "label": "assignmentsByInference", + "offset": 0, + "slot": "19", + "type": "t_mapping(t_uint256,t_struct(Uint256Set)3724_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)3232_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)3223": { + "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)3554_storage)": { + "label": "mapping(address => struct Set.AddressSet)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Model)3237_storage)": { + "label": "mapping(address => struct IWorkerHub.Model)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Uint256Set)3724_storage)": { + "label": "mapping(address => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(UnstakeRequest)3335_storage)": { + "label": "mapping(address => struct IWorkerHub.UnstakeRequest)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Worker)3250_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)3274_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Assignment)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Inference)3310_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Inference)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(MinerEpochState)3232_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.MinerEpochState)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Uint256Set)3724_storage)": { + "label": "mapping(uint256 => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_uint256)": { + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32" + }, + "t_struct(AddressSet)3554_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)3274_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)3310_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)3223", + "offset": 26, + "slot": "4" + }, + { + "label": "creator", + "type": "t_address", + "offset": 0, + "slot": "5" + } + ], + "numberOfBytes": "192" + }, + "t_struct(MinerEpochState)3232_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)3237_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)3510_storage": { + "label": "struct Random.Randomizer", + "members": [ + { + "label": "nonce", + "type": "t_uint256", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(Uint256Set)3724_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)3335_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)3250_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 a27f65c..1655f23 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -102,6 +102,28 @@ ReentrancyGuardUpgradeable { return result; } + function getMintingAssignmentsOfInference(uint256 _inferenceId) external view returns (AssignmentInfo[] memory) { + uint256[] memory assignmentIds = assignmentsByInference[_inferenceId].values; + uint256 assignmentNumber = assignmentIds.length; + + AssignmentInfo[] memory result = new AssignmentInfo[](assignmentNumber); + for (uint256 i = 0; i < assignmentNumber; ++i) { + Assignment storage assignment = assignments[assignmentIds[i]]; + Inference storage inference = inferences[assignment.inferenceId]; + result[i] = AssignmentInfo( + assignmentIds[i], + assignment.inferenceId, + inference.value, + inference.input, + inference.modelAddress, + inference.creator, + inference.expiredAt + ); + } + + return result; + } + function getMinerAddresses() external view returns (address[] memory) { return minerAddresses.values; } @@ -298,6 +320,7 @@ ReentrancyGuardUpgradeable { validator.stake = msg.value; validator.tier = tier; + validator.tier = tier; validator.lastClaimedEpoch = currentEpoch; address modelAddress = modelAddresses.values[randomizer.randomUint256() % modelAddresses.size()]; From 9f7df85bc1d608a886742881884e34d2fc96e3e5 Mon Sep 17 00:00:00 2001 From: kelvin2608 <2608@newbitcoincity.com> Date: Fri, 10 May 2024 11:59:15 +0700 Subject: [PATCH 39/82] Update submit solution function --- contracts/WorkerHub.sol | 7 +++++-- contracts/interfaces/IWorkerHub.sol | 1 + 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/contracts/WorkerHub.sol b/contracts/WorkerHub.sol index 1655f23..b7433ff 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -472,12 +472,12 @@ ReentrancyGuardUpgradeable { Inference memory clonedInference = inferences[clonedAssignments.inferenceId]; - if (clonedInference.expiredAt < block.timestamp) { + if (clonedInference.status == InferenceStatus.Solving && clonedInference.expiredAt < block.timestamp) { if (clonedInference.assignments.length == 0) { resolveInference(clonedAssignments.inferenceId); return; } else { - revert("Expire time"); + revert MiningSessionEnded(); } } @@ -500,6 +500,7 @@ ReentrancyGuardUpgradeable { emit TransferFee(_msgSender, value, treasury, fee); } + emit InferenceStatusUpdate(clonedAssignments.inferenceId, InferenceStatus.Solved); emit SolutionSubmission(_msgSender, _assigmentId); } @@ -520,6 +521,8 @@ ReentrancyGuardUpgradeable { inference.status = InferenceStatus.Killed; TransferHelper.safeTransferNative(inference.creator, inference.value); } + + emit InferenceStatusUpdate(_inferenceId, InferenceStatus.Killed); } function _claimReward(address _miner) internal whenNotPaused { diff --git a/contracts/interfaces/IWorkerHub.sol b/contracts/interfaces/IWorkerHub.sol index 63e8ba7..af6d9ef 100644 --- a/contracts/interfaces/IWorkerHub.sol +++ b/contracts/interfaces/IWorkerHub.sol @@ -161,5 +161,6 @@ interface IWorkerHub is IInferable { error MiningSessionNotEnded(); error ValidatingSessionNotEnded(); + error MiningSessionEnded(); } From 3d42fbff0807f3c0272b9ee4d087787d2842f1dc Mon Sep 17 00:00:00 2001 From: kelvin2608 <2608@newbitcoincity.com> Date: Fri, 10 May 2024 12:04:26 +0700 Subject: [PATCH 40/82] update emit InferenceStatusUpdate event --- contracts/WorkerHub.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/WorkerHub.sol b/contracts/WorkerHub.sol index b7433ff..99f50cd 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -498,9 +498,9 @@ ReentrancyGuardUpgradeable { TransferHelper.safeTransferNative(_msgSender, value); emit TransferFee(_msgSender, value, treasury, fee); + emit InferenceStatusUpdate(clonedAssignments.inferenceId, InferenceStatus.Solved); } - emit InferenceStatusUpdate(clonedAssignments.inferenceId, InferenceStatus.Solved); emit SolutionSubmission(_msgSender, _assigmentId); } From a0b5bb9c063c6592b4ad5e5c7aedb0999b67a882 Mon Sep 17 00:00:00 2001 From: kochou-nbc Date: Fri, 10 May 2024 12:26:03 +0700 Subject: [PATCH 41/82] update getter --- .openzeppelin/unknown-20156.json | 754 ++++++++++++++++++++++++++++ contracts/WorkerHub.sol | 29 +- contracts/interfaces/IWorkerHub.sol | 3 + 3 files changed, 784 insertions(+), 2 deletions(-) diff --git a/.openzeppelin/unknown-20156.json b/.openzeppelin/unknown-20156.json index fa08faf..a327453 100644 --- a/.openzeppelin/unknown-20156.json +++ b/.openzeppelin/unknown-20156.json @@ -11747,6 +11747,760 @@ }, "namespaces": {} } + }, + "5400b5b98d675ae79c3c6401e683d3f01d32c4483e3bdafbba54f198969610c5": { + "address": "0x4fCa55668127A4883C020303440a46C47CbCf4FC", + "txHash": "0x8de7a3efb7932d8e817fe0fd6a581ace0eb09f2cc435e47bb0aa84b111f0e8d6", + "layout": { + "solcVersion": "0.8.19", + "storage": [ + { + "label": "randomizer", + "offset": 0, + "slot": "0", + "type": "t_struct(Randomizer)3530_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:10" + }, + { + "label": "models", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_struct(Model)3255_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:12" + }, + { + "label": "miners", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_address,t_struct(Worker)3268_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:13" + }, + { + "label": "validators", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_address,t_struct(Worker)3268_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:14" + }, + { + "label": "minerAddressesByModel", + "offset": 0, + "slot": "4", + "type": "t_mapping(t_address,t_struct(AddressSet)3574_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:16" + }, + { + "label": "validatorAddressesByModel", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_address,t_struct(AddressSet)3574_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:17" + }, + { + "label": "modelAddresses", + "offset": 0, + "slot": "6", + "type": "t_struct(AddressSet)3574_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:19" + }, + { + "label": "minerAddresses", + "offset": 0, + "slot": "8", + "type": "t_struct(AddressSet)3574_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:20" + }, + { + "label": "validatorAddresses", + "offset": 0, + "slot": "10", + "type": "t_struct(AddressSet)3574_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:21" + }, + { + "label": "minerUnstakeRequests", + "offset": 0, + "slot": "12", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3353_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:23" + }, + { + "label": "validatorUnstakeRequests", + "offset": 0, + "slot": "13", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3353_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)3328_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)3292_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:30" + }, + { + "label": "assignmentsByMiner", + "offset": 0, + "slot": "18", + "type": "t_mapping(t_address,t_struct(Uint256Set)3744_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:31" + }, + { + "label": "assignmentsByInference", + "offset": 0, + "slot": "19", + "type": "t_mapping(t_uint256,t_struct(Uint256Set)3744_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)3250_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)3241": { + "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)3574_storage)": { + "label": "mapping(address => struct Set.AddressSet)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Model)3255_storage)": { + "label": "mapping(address => struct IWorkerHub.Model)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Uint256Set)3744_storage)": { + "label": "mapping(address => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(UnstakeRequest)3353_storage)": { + "label": "mapping(address => struct IWorkerHub.UnstakeRequest)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Worker)3268_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)3292_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Assignment)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Inference)3328_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Inference)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(MinerEpochState)3250_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.MinerEpochState)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Uint256Set)3744_storage)": { + "label": "mapping(uint256 => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_uint256)": { + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32" + }, + "t_struct(AddressSet)3574_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)3292_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)3328_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)3241", + "offset": 26, + "slot": "4" + }, + { + "label": "creator", + "type": "t_address", + "offset": 0, + "slot": "5" + } + ], + "numberOfBytes": "192" + }, + "t_struct(MinerEpochState)3250_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)3255_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)3530_storage": { + "label": "struct Random.Randomizer", + "members": [ + { + "label": "nonce", + "type": "t_uint256", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(Uint256Set)3744_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)3353_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)3268_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 99f50cd..033cd60 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -200,6 +200,8 @@ ReentrancyGuardUpgradeable { function registerModel(address _model, uint16 _tier, uint256 _minimumFee) external onlyOwner { _updateEpoch(); + if (_tier == 0) revert InvalidTier(); + Model storage model = models[_model]; if (model.tier != 0) revert AlreadyRegistered(); @@ -222,6 +224,30 @@ ReentrancyGuardUpgradeable { emit ModelUnregistration(_model); } + function updateModelTier(address _model, uint32 _tier) external onlyOwner { + _updateEpoch(); + + if (_tier == 0) revert InvalidTier(); + + Model storage model = models[_model]; + if (model.tier == 0) revert InvalidModel(); + + model.tier = _tier; + + emit ModelTierUpdate(_model, _tier); + } + + function updateModelMinimumFee(address _model, uint256 _minimumFee) external onlyOwner { + _updateEpoch(); + + Model storage model = models[_model]; + if (model.tier == 0) revert InvalidModel(); + + model.minimumFee = _minimumFee; + + emit ModelMinimumFeeUpdate(_model, _minimumFee); + } + function registerMiner(uint16 tier) external payable whenNotPaused { _updateEpoch(); @@ -520,9 +546,8 @@ ReentrancyGuardUpgradeable { if (inference.status == InferenceStatus.Solving && block.timestamp > inference.expiredAt) { inference.status = InferenceStatus.Killed; TransferHelper.safeTransferNative(inference.creator, inference.value); + emit InferenceStatusUpdate(_inferenceId, InferenceStatus.Killed); } - - emit InferenceStatusUpdate(_inferenceId, InferenceStatus.Killed); } function _claimReward(address _miner) internal whenNotPaused { diff --git a/contracts/interfaces/IWorkerHub.sol b/contracts/interfaces/IWorkerHub.sol index af6d9ef..e08087b 100644 --- a/contracts/interfaces/IWorkerHub.sol +++ b/contracts/interfaces/IWorkerHub.sol @@ -95,6 +95,8 @@ interface IWorkerHub is IInferable { uint256 minimumFee ); event ModelUnregistration(address indexed model); + event ModelTierUpdate(address indexed model, uint32 tier); + event ModelMinimumFeeUpdate(address indexed model, uint256 minimumFee); event MinerExtraStake(address indexed miner, uint256 value); event MinerRegistration( @@ -153,6 +155,7 @@ interface IWorkerHub is IInferable { error StillBeingLocked(); error InvalidBlockValue(); + error InvalidModel(); error InvalidTier(); error FeeTooLow(); From 4565115c92fe336e040a1874c7893d2a33a6bb51 Mon Sep 17 00:00:00 2001 From: kelvin2608 <2608@newbitcoincity.com> Date: Fri, 10 May 2024 12:33:47 +0700 Subject: [PATCH 42/82] Update logic for submit solution function --- contracts/WorkerHub.sol | 8 +++++++- contracts/interfaces/IWorkerHub.sol | 1 + 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/contracts/WorkerHub.sol b/contracts/WorkerHub.sol index 033cd60..5bd2dce 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -498,7 +498,13 @@ ReentrancyGuardUpgradeable { Inference memory clonedInference = inferences[clonedAssignments.inferenceId]; - if (clonedInference.status == InferenceStatus.Solving && clonedInference.expiredAt < block.timestamp) { + if (clonedInference.status != InferenceStatus.Solving && + clonedInference.status != InferenceStatus.Solved) + { + revert InvalidInferenceStatus(); + } + + if (clonedInference.expiredAt < block.timestamp) { if (clonedInference.assignments.length == 0) { resolveInference(clonedAssignments.inferenceId); return; diff --git a/contracts/interfaces/IWorkerHub.sol b/contracts/interfaces/IWorkerHub.sol index e08087b..4e92867 100644 --- a/contracts/interfaces/IWorkerHub.sol +++ b/contracts/interfaces/IWorkerHub.sol @@ -157,6 +157,7 @@ interface IWorkerHub is IInferable { error InvalidBlockValue(); error InvalidModel(); error InvalidTier(); + error InvalidInferenceStatus(); error FeeTooLow(); error StakeTooLow(); From 9cb7d45ec0273fbe5da2eba951369c01a5633eec Mon Sep 17 00:00:00 2001 From: kochou-nbc Date: Fri, 10 May 2024 12:26:03 +0700 Subject: [PATCH 43/82] update getter --- .openzeppelin/unknown-20156.json | 754 +++++++++++++++++++++++++++++++ 1 file changed, 754 insertions(+) diff --git a/.openzeppelin/unknown-20156.json b/.openzeppelin/unknown-20156.json index a327453..54d8a45 100644 --- a/.openzeppelin/unknown-20156.json +++ b/.openzeppelin/unknown-20156.json @@ -12501,6 +12501,760 @@ }, "namespaces": {} } + }, + "36869748d1d21dc9197b37d9c188a20e5b02e407dfe8c41399b416baa8c85399": { + "address": "0x70B03bB821A970d62744a5f52f826A5409539A54", + "txHash": "0xd6b9d0e5825fda50f7897c65d66f5885aee823c7f353ab78391a54221426a7ca", + "layout": { + "solcVersion": "0.8.19", + "storage": [ + { + "label": "randomizer", + "offset": 0, + "slot": "0", + "type": "t_struct(Randomizer)3636_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:10" + }, + { + "label": "models", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_struct(Model)3347_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:12" + }, + { + "label": "miners", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_address,t_struct(Worker)3360_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:13" + }, + { + "label": "validators", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_address,t_struct(Worker)3360_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:14" + }, + { + "label": "minerAddressesByModel", + "offset": 0, + "slot": "4", + "type": "t_mapping(t_address,t_struct(AddressSet)3680_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:16" + }, + { + "label": "validatorAddressesByModel", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_address,t_struct(AddressSet)3680_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:17" + }, + { + "label": "modelAddresses", + "offset": 0, + "slot": "6", + "type": "t_struct(AddressSet)3680_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:19" + }, + { + "label": "minerAddresses", + "offset": 0, + "slot": "8", + "type": "t_struct(AddressSet)3680_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:20" + }, + { + "label": "validatorAddresses", + "offset": 0, + "slot": "10", + "type": "t_struct(AddressSet)3680_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:21" + }, + { + "label": "minerUnstakeRequests", + "offset": 0, + "slot": "12", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3445_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:23" + }, + { + "label": "validatorUnstakeRequests", + "offset": 0, + "slot": "13", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3445_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)3420_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)3384_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:30" + }, + { + "label": "assignmentsByMiner", + "offset": 0, + "slot": "18", + "type": "t_mapping(t_address,t_struct(Uint256Set)3850_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:31" + }, + { + "label": "assignmentsByInference", + "offset": 0, + "slot": "19", + "type": "t_mapping(t_uint256,t_struct(Uint256Set)3850_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)3342_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)3333": { + "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)3680_storage)": { + "label": "mapping(address => struct Set.AddressSet)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Model)3347_storage)": { + "label": "mapping(address => struct IWorkerHub.Model)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Uint256Set)3850_storage)": { + "label": "mapping(address => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(UnstakeRequest)3445_storage)": { + "label": "mapping(address => struct IWorkerHub.UnstakeRequest)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Worker)3360_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)3384_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Assignment)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Inference)3420_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Inference)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(MinerEpochState)3342_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.MinerEpochState)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Uint256Set)3850_storage)": { + "label": "mapping(uint256 => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_uint256)": { + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32" + }, + "t_struct(AddressSet)3680_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)3384_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)3420_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)3333", + "offset": 26, + "slot": "4" + }, + { + "label": "creator", + "type": "t_address", + "offset": 0, + "slot": "5" + } + ], + "numberOfBytes": "192" + }, + "t_struct(MinerEpochState)3342_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)3347_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)3636_storage": { + "label": "struct Random.Randomizer", + "members": [ + { + "label": "nonce", + "type": "t_uint256", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(Uint256Set)3850_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)3445_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)3360_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": {} + } } } } From 72e907ac0dac30f9063a6d8c44b38f07c4abf9ca Mon Sep 17 00:00:00 2001 From: kochou-nbc Date: Fri, 10 May 2024 15:08:38 +0700 Subject: [PATCH 44/82] fix managing miners --- .openzeppelin/unknown-20156.json | 1508 +++++++++++++++++++++++++++ contracts/WorkerHub.sol | 17 +- contracts/interfaces/IWorkerHub.sol | 1 + 3 files changed, 1517 insertions(+), 9 deletions(-) diff --git a/.openzeppelin/unknown-20156.json b/.openzeppelin/unknown-20156.json index 54d8a45..b88fd88 100644 --- a/.openzeppelin/unknown-20156.json +++ b/.openzeppelin/unknown-20156.json @@ -13255,6 +13255,1514 @@ }, "namespaces": {} } + }, + "72b97a0ac8c71f7298ca6ab108270481b8a0c664cec231f56922b65688f7fe9d": { + "address": "0x49F48Bbd7FF59f6fBE8dfd980C0c681b2673520d", + "txHash": "0xb1bd4358139f027d0a2fc2cae5c96fcd595c172e4634cd827ae6e2eb0ebe66f5", + "layout": { + "solcVersion": "0.8.19", + "storage": [ + { + "label": "randomizer", + "offset": 0, + "slot": "0", + "type": "t_struct(Randomizer)3655_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:10" + }, + { + "label": "models", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_struct(Model)3364_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:12" + }, + { + "label": "miners", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_address,t_struct(Worker)3377_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:13" + }, + { + "label": "validators", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_address,t_struct(Worker)3377_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:14" + }, + { + "label": "minerAddressesByModel", + "offset": 0, + "slot": "4", + "type": "t_mapping(t_address,t_struct(AddressSet)3699_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:16" + }, + { + "label": "validatorAddressesByModel", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_address,t_struct(AddressSet)3699_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:17" + }, + { + "label": "modelAddresses", + "offset": 0, + "slot": "6", + "type": "t_struct(AddressSet)3699_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:19" + }, + { + "label": "minerAddresses", + "offset": 0, + "slot": "8", + "type": "t_struct(AddressSet)3699_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:20" + }, + { + "label": "validatorAddresses", + "offset": 0, + "slot": "10", + "type": "t_struct(AddressSet)3699_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:21" + }, + { + "label": "minerUnstakeRequests", + "offset": 0, + "slot": "12", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3462_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:23" + }, + { + "label": "validatorUnstakeRequests", + "offset": 0, + "slot": "13", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3462_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)3437_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)3401_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:30" + }, + { + "label": "assignmentsByMiner", + "offset": 0, + "slot": "18", + "type": "t_mapping(t_address,t_struct(Uint256Set)3869_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:31" + }, + { + "label": "assignmentsByInference", + "offset": 0, + "slot": "19", + "type": "t_mapping(t_uint256,t_struct(Uint256Set)3869_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)3359_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)3350": { + "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)3699_storage)": { + "label": "mapping(address => struct Set.AddressSet)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Model)3364_storage)": { + "label": "mapping(address => struct IWorkerHub.Model)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Uint256Set)3869_storage)": { + "label": "mapping(address => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(UnstakeRequest)3462_storage)": { + "label": "mapping(address => struct IWorkerHub.UnstakeRequest)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Worker)3377_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)3401_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Assignment)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Inference)3437_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Inference)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(MinerEpochState)3359_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.MinerEpochState)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Uint256Set)3869_storage)": { + "label": "mapping(uint256 => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_uint256)": { + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32" + }, + "t_struct(AddressSet)3699_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)3401_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)3437_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)3350", + "offset": 26, + "slot": "4" + }, + { + "label": "creator", + "type": "t_address", + "offset": 0, + "slot": "5" + } + ], + "numberOfBytes": "192" + }, + "t_struct(MinerEpochState)3359_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)3364_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)3655_storage": { + "label": "struct Random.Randomizer", + "members": [ + { + "label": "nonce", + "type": "t_uint256", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(Uint256Set)3869_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)3462_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)3377_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": {} + } + }, + "efd4f0ab02251c5c2442625fae0e25c333e1f68e2cc666a56f0d347762be461e": { + "address": "0xb04F3E8Db914C876952FF6c31511fe6728d9Bd39", + "txHash": "0x1bcb7f8ed4dd5b15860a348d9600b5575ae68302e55b0e7eef1e5f55821cb443", + "layout": { + "solcVersion": "0.8.19", + "storage": [ + { + "label": "randomizer", + "offset": 0, + "slot": "0", + "type": "t_struct(Randomizer)3668_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:10" + }, + { + "label": "models", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_struct(Model)3375_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:12" + }, + { + "label": "miners", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_address,t_struct(Worker)3388_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:13" + }, + { + "label": "validators", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_address,t_struct(Worker)3388_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:14" + }, + { + "label": "minerAddressesByModel", + "offset": 0, + "slot": "4", + "type": "t_mapping(t_address,t_struct(AddressSet)3712_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:16" + }, + { + "label": "validatorAddressesByModel", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_address,t_struct(AddressSet)3712_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:17" + }, + { + "label": "modelAddresses", + "offset": 0, + "slot": "6", + "type": "t_struct(AddressSet)3712_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:19" + }, + { + "label": "minerAddresses", + "offset": 0, + "slot": "8", + "type": "t_struct(AddressSet)3712_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:20" + }, + { + "label": "validatorAddresses", + "offset": 0, + "slot": "10", + "type": "t_struct(AddressSet)3712_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:21" + }, + { + "label": "minerUnstakeRequests", + "offset": 0, + "slot": "12", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3473_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:23" + }, + { + "label": "validatorUnstakeRequests", + "offset": 0, + "slot": "13", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3473_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)3448_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)3412_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:30" + }, + { + "label": "assignmentsByMiner", + "offset": 0, + "slot": "18", + "type": "t_mapping(t_address,t_struct(Uint256Set)3882_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:31" + }, + { + "label": "assignmentsByInference", + "offset": 0, + "slot": "19", + "type": "t_mapping(t_uint256,t_struct(Uint256Set)3882_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)3370_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)3361": { + "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)3712_storage)": { + "label": "mapping(address => struct Set.AddressSet)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Model)3375_storage)": { + "label": "mapping(address => struct IWorkerHub.Model)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Uint256Set)3882_storage)": { + "label": "mapping(address => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(UnstakeRequest)3473_storage)": { + "label": "mapping(address => struct IWorkerHub.UnstakeRequest)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Worker)3388_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)3412_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Assignment)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Inference)3448_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Inference)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(MinerEpochState)3370_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.MinerEpochState)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Uint256Set)3882_storage)": { + "label": "mapping(uint256 => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_uint256)": { + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32" + }, + "t_struct(AddressSet)3712_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)3412_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)3448_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)3361", + "offset": 26, + "slot": "4" + }, + { + "label": "creator", + "type": "t_address", + "offset": 0, + "slot": "5" + } + ], + "numberOfBytes": "192" + }, + "t_struct(MinerEpochState)3370_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)3375_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)3668_storage": { + "label": "struct Random.Randomizer", + "members": [ + { + "label": "nonce", + "type": "t_uint256", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(Uint256Set)3882_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)3473_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)3388_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 5bd2dce..11a1995 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -83,7 +83,7 @@ ReentrancyGuardUpgradeable { AssignmentInfo[] memory result = new AssignmentInfo[](counter); counter = 0; - // todo: why not use i instead of counter + for (uint256 i = 0; i < assignmentNumber; ++i) if (isAssignmentPending(assignmentIds[i])) { Assignment storage assignment = assignments[assignmentIds[i]]; @@ -289,14 +289,14 @@ ReentrancyGuardUpgradeable { miner.tier = 0; - // @kouchou review code - // TransferHelper.safeTransferNative(msg.sender, miner.stake); uint stakeAmount = miner.stake; miner.stake = 0; miner.commitment = 0; - minerAddresses.erase(msg.sender); - minerAddressesByModel[miner.modelAddress].erase(msg.sender); + if (minerAddresses.hasValue(msg.sender)) { + minerAddresses.erase(msg.sender); + minerAddressesByModel[miner.modelAddress].erase(msg.sender); + } miner.modelAddress = address(0); uint currentUnstake = minerUnstakeRequests[msg.sender].stake; @@ -377,8 +377,6 @@ ReentrancyGuardUpgradeable { validator.tier = 0; - // @koucho review code - // TransferHelper.safeTransferNative(msg.sender, validator.stake); uint stakeAmount = validator.stake; validator.stake = 0; validator.commitment = 0; @@ -448,6 +446,7 @@ ReentrancyGuardUpgradeable { inferences[_inferenceId].status = InferenceStatus.Solving; address model = inferences[_inferenceId].modelAddress; + if (minerAddressesByModel[model].size() < minerRequirement) revert NotEnoughMiners(); Set.AddressSet storage miners = minerAddressesByModel[model]; uint256 n = minerRequirement; @@ -498,8 +497,8 @@ ReentrancyGuardUpgradeable { Inference memory clonedInference = inferences[clonedAssignments.inferenceId]; - if (clonedInference.status != InferenceStatus.Solving && - clonedInference.status != InferenceStatus.Solved) + if (clonedInference.status != InferenceStatus.Solving && + clonedInference.status != InferenceStatus.Solved) { revert InvalidInferenceStatus(); } diff --git a/contracts/interfaces/IWorkerHub.sol b/contracts/interfaces/IWorkerHub.sol index 4e92867..5be0864 100644 --- a/contracts/interfaces/IWorkerHub.sol +++ b/contracts/interfaces/IWorkerHub.sol @@ -151,6 +151,7 @@ interface IWorkerHub is IInferable { error AlreadyRegistered(); error AlreadySubmitted(); error NotRegistered(); + error NotEnoughMiners(); error Unauthorized(); error StillBeingLocked(); From 596b1d71dc12738dde3aedd94780df90d7bceff0 Mon Sep 17 00:00:00 2001 From: 180945 <180945@trustless.computer> Date: Fri, 10 May 2024 18:20:54 +0700 Subject: [PATCH 45/82] update reward logic --- contracts/WorkerHub.sol | 6 ++---- tests/Test.t.sol | 34 +++++++++++++++++++++++++--------- 2 files changed, 27 insertions(+), 13 deletions(-) diff --git a/contracts/WorkerHub.sol b/contracts/WorkerHub.sol index 11a1995..c5aff38 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -53,8 +53,6 @@ ReentrancyGuardUpgradeable { unstakeDelayTime = _unstakeDelayTime; maximumTier = 1; lastBlock = block.number; - rewardInEpoch[currentEpoch].perfReward = rewardPerEpochBasedOnPerf; - rewardInEpoch[currentEpoch].epochReward = rewardPerEpoch; } function version() external pure returns (string memory) { @@ -474,9 +472,9 @@ ReentrancyGuardUpgradeable { if (epochPassed > 0) { for (; epochPassed > 0; epochPassed--) { rewardInEpoch[currentEpoch].totalMiner = minerAddresses.size(); - currentEpoch++; rewardInEpoch[currentEpoch].perfReward = rewardPerEpochBasedOnPerf; rewardInEpoch[currentEpoch].epochReward = rewardPerEpoch; + currentEpoch++; } lastBlock = block.number; } @@ -610,7 +608,7 @@ ReentrancyGuardUpgradeable { uint256 totalReward; uint256 lastEpoch = currentEpoch; - if (miners[_miner].stake <= 0 || lastEpoch <= miners[_miner].lastClaimedEpoch) { + if (!minerAddresses.hasValue(_miner) || lastEpoch <= miners[_miner].lastClaimedEpoch) { totalReward = 0; } else { uint256 lastClaimed = uint256(miners[_miner].lastClaimedEpoch); diff --git a/tests/Test.t.sol b/tests/Test.t.sol index f3e7001..da7694f 100644 --- a/tests/Test.t.sol +++ b/tests/Test.t.sol @@ -57,22 +57,28 @@ contract WorkHubTest is Test { assertEq(workerHub.lastBlock(), 1); // init block height vm.roll(11); - vm.prank(Miner1); + vm.startPrank(Miner1); workerHub.registerMiner{value: 1e18}(1); + workerHub.joinForMinting(); + vm.stopPrank(); - vm.prank(Miner2); + vm.startPrank(Miner2); workerHub.registerMiner{value: 1e18}(1); + workerHub.joinForMinting(); + vm.stopPrank(); - vm.prank(Miner3); + vm.startPrank(Miner3); workerHub.registerMiner{value: 1e18}(1); + workerHub.joinForMinting(); + vm.stopPrank(); assertEq(workerHub.lastBlock(), 11); assertEq(workerHub.currentEpoch(), 1); assertEq(workerHub.rewardToClaim(Miner1), 0); assertEq(workerHub.rewardToClaim(Miner2), 0); assertEq(workerHub.rewardToClaim(Miner3), 0); - (uint256 pefReward, uint256 epochReward, uint256 totalTaskCompleted, uint256 totalMiner) = workerHub.rewardInEpoch(1); -// assertEq(totalMiner, 3); + (uint256 pefReward, uint256 epochReward, uint256 totalTaskCompleted, uint256 totalMiner) = workerHub.rewardInEpoch(0); + // assertEq(totalMiner, 3); assertEq(pefReward, 1e18); assertEq(epochReward, 1e16); assertEq(totalTaskCompleted, 0); @@ -80,6 +86,13 @@ contract WorkHubTest is Test { // create some data for 2 epochs sequence vm.roll(31); + workerHub.rewardToClaim(ADMIN_ADDR); + ( pefReward, epochReward, totalTaskCompleted, totalMiner) = workerHub.rewardInEpoch(1); + assertEq(pefReward, 1e18); + + ( pefReward, epochReward, totalTaskCompleted, totalMiner) = workerHub.rewardInEpoch(2); + assertEq(pefReward, 1e18); + assertEq(workerHub.rewardToClaim(Miner1), 6666666666666666); assertEq(workerHub.rewardToClaim(Miner2), 6666666666666666); assertEq(workerHub.rewardToClaim(Miner3), 6666666666666666); @@ -132,11 +145,12 @@ contract WorkHubTest is Test { assertEq(Miner3.balance, 1006666666666666666 + 1e18); // test miner request unstake - vm.prank(Miner1); + vm.startPrank(Miner1); workerHub.unregisterMiner(); + vm.warp(block.timestamp + 21 days); + workerHub.unstakeForMiner(); assertEq(Miner1.balance, 906666666666666666 + 2e18); - vm.startPrank(Miner1); vm.roll(51); assertEq(workerHub.rewardToClaim(Miner1), 0); workerHub.claimReward(Miner1); @@ -146,6 +160,8 @@ contract WorkHubTest is Test { workerHub.claimReward(Miner1); assertEq(Miner1.balance, 906666666666666666 + 1e18); workerHub.unregisterMiner(); + vm.warp(block.timestamp + 21 days); + workerHub.unstakeForMiner(); assertEq(workerHub.rewardToClaim(Miner1), 0); workerHub.claimReward(Miner1); assertEq(Miner1.balance, 906666666666666666 + 2e18); @@ -155,9 +171,9 @@ contract WorkHubTest is Test { workerHub.claimReward(Miner1); assertEq(Miner1.balance, 906666666666666666 + 1e18); vm.roll(61); - assertEq(workerHub.rewardToClaim(Miner1), 3333333333333333); + assertEq(workerHub.rewardToClaim(Miner1), 0); workerHub.claimReward(Miner1); - assertEq(Miner1.balance, 906666666666666666 + 1e18 + 3333333333333333); + assertEq(Miner1.balance, 906666666666666666 + 1e18); assertEq(workerHub.rewardToClaim(Miner1), 0); vm.stopPrank(); } From f556be58b4f086292894ca608846ca9493715219 Mon Sep 17 00:00:00 2001 From: kochou-nbc Date: Fri, 10 May 2024 18:33:51 +0700 Subject: [PATCH 46/82] finalize to first deployment on mainnet --- .env.example | 5 + .openzeppelin/unknown-20156.json | 2262 ++++++++++++++++++++++++++++++ contracts/WorkerHub.sol | 9 + hardhat.config.ts | 13 +- package.json | 7 +- scripts/deployHybridModel.ts | 2 +- scripts/deployModelCollection.ts | 10 +- scripts/deployWorkerHub.ts | 33 +- 8 files changed, 2313 insertions(+), 28 deletions(-) diff --git a/.env.example b/.env.example index 5e5522e..f875a99 100644 --- a/.env.example +++ b/.env.example @@ -7,3 +7,8 @@ CUDATEST_PRIVATE_KEY= CUDATEST_TREASURY_ADDRESS= CUDATEST_COLLECTION_ADDRESS= CUDATEST_WORKER_HUB_ADDRESS= + +MAINNET_PRIVATE_KEY= +MAINNET_TREASURY_ADDRESS= +MAINNET_COLLECTION_ADDRESS= +MAINNET_WORKER_HUB_ADDRESS= diff --git a/.openzeppelin/unknown-20156.json b/.openzeppelin/unknown-20156.json index b88fd88..eef9565 100644 --- a/.openzeppelin/unknown-20156.json +++ b/.openzeppelin/unknown-20156.json @@ -14763,6 +14763,2268 @@ }, "namespaces": {} } + }, + "2b4d606112b3fbc104ca2a4b5cd83262def7c318980e610be44f9c03059be608": { + "address": "0x1B3b467e15A66C8744c392e57b341e6f8f4Bf0cc", + "txHash": "0x2c246ee644c66cb5995403e04b5c4a79bcc42e5010f534f7d730b43772ff1b61", + "layout": { + "solcVersion": "0.8.19", + "storage": [ + { + "label": "randomizer", + "offset": 0, + "slot": "0", + "type": "t_struct(Randomizer)3631_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:10" + }, + { + "label": "models", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_struct(Model)3338_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:12" + }, + { + "label": "miners", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_address,t_struct(Worker)3351_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:13" + }, + { + "label": "validators", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_address,t_struct(Worker)3351_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:14" + }, + { + "label": "minerAddressesByModel", + "offset": 0, + "slot": "4", + "type": "t_mapping(t_address,t_struct(AddressSet)3675_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:16" + }, + { + "label": "validatorAddressesByModel", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_address,t_struct(AddressSet)3675_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:17" + }, + { + "label": "modelAddresses", + "offset": 0, + "slot": "6", + "type": "t_struct(AddressSet)3675_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:19" + }, + { + "label": "minerAddresses", + "offset": 0, + "slot": "8", + "type": "t_struct(AddressSet)3675_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:20" + }, + { + "label": "validatorAddresses", + "offset": 0, + "slot": "10", + "type": "t_struct(AddressSet)3675_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:21" + }, + { + "label": "minerUnstakeRequests", + "offset": 0, + "slot": "12", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3436_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:23" + }, + { + "label": "validatorUnstakeRequests", + "offset": 0, + "slot": "13", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3436_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)3411_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)3375_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:30" + }, + { + "label": "assignmentsByMiner", + "offset": 0, + "slot": "18", + "type": "t_mapping(t_address,t_struct(Uint256Set)3845_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:31" + }, + { + "label": "assignmentsByInference", + "offset": 0, + "slot": "19", + "type": "t_mapping(t_uint256,t_struct(Uint256Set)3845_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)3333_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)3324": { + "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)3675_storage)": { + "label": "mapping(address => struct Set.AddressSet)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Model)3338_storage)": { + "label": "mapping(address => struct IWorkerHub.Model)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Uint256Set)3845_storage)": { + "label": "mapping(address => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(UnstakeRequest)3436_storage)": { + "label": "mapping(address => struct IWorkerHub.UnstakeRequest)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Worker)3351_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)3375_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Assignment)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Inference)3411_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Inference)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(MinerEpochState)3333_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.MinerEpochState)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Uint256Set)3845_storage)": { + "label": "mapping(uint256 => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_uint256)": { + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32" + }, + "t_struct(AddressSet)3675_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)3375_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)3411_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)3324", + "offset": 26, + "slot": "4" + }, + { + "label": "creator", + "type": "t_address", + "offset": 0, + "slot": "5" + } + ], + "numberOfBytes": "192" + }, + "t_struct(MinerEpochState)3333_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)3338_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)3631_storage": { + "label": "struct Random.Randomizer", + "members": [ + { + "label": "nonce", + "type": "t_uint256", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(Uint256Set)3845_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)3436_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)3351_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": {} + } + }, + "63f73f9ed6a03d93fef1e29dc4f74be2ab5599dbae613a485c3d87a5ded87611": { + "address": "0x6977064cBe32Ec80414160aB3fD8eab362011d38", + "txHash": "0x9c6a903882d7cc61ea2cdd3a8a1773bb5bb2729de0f75a683807efa157355776", + "layout": { + "solcVersion": "0.8.19", + "storage": [ + { + "label": "randomizer", + "offset": 0, + "slot": "0", + "type": "t_struct(Randomizer)3674_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:10" + }, + { + "label": "models", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_struct(Model)3377_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:12" + }, + { + "label": "miners", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_address,t_struct(Worker)3390_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:13" + }, + { + "label": "validators", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_address,t_struct(Worker)3390_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:14" + }, + { + "label": "minerAddressesByModel", + "offset": 0, + "slot": "4", + "type": "t_mapping(t_address,t_struct(AddressSet)3718_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:16" + }, + { + "label": "validatorAddressesByModel", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_address,t_struct(AddressSet)3718_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:17" + }, + { + "label": "modelAddresses", + "offset": 0, + "slot": "6", + "type": "t_struct(AddressSet)3718_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:19" + }, + { + "label": "minerAddresses", + "offset": 0, + "slot": "8", + "type": "t_struct(AddressSet)3718_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:20" + }, + { + "label": "validatorAddresses", + "offset": 0, + "slot": "10", + "type": "t_struct(AddressSet)3718_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:21" + }, + { + "label": "minerUnstakeRequests", + "offset": 0, + "slot": "12", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3475_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:23" + }, + { + "label": "validatorUnstakeRequests", + "offset": 0, + "slot": "13", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3475_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)3450_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)3414_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:30" + }, + { + "label": "assignmentsByMiner", + "offset": 0, + "slot": "18", + "type": "t_mapping(t_address,t_struct(Uint256Set)3888_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:31" + }, + { + "label": "assignmentsByInference", + "offset": 0, + "slot": "19", + "type": "t_mapping(t_uint256,t_struct(Uint256Set)3888_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)3372_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)3363": { + "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)3718_storage)": { + "label": "mapping(address => struct Set.AddressSet)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Model)3377_storage)": { + "label": "mapping(address => struct IWorkerHub.Model)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Uint256Set)3888_storage)": { + "label": "mapping(address => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(UnstakeRequest)3475_storage)": { + "label": "mapping(address => struct IWorkerHub.UnstakeRequest)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Worker)3390_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)3414_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Assignment)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Inference)3450_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Inference)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(MinerEpochState)3372_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.MinerEpochState)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Uint256Set)3888_storage)": { + "label": "mapping(uint256 => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_uint256)": { + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32" + }, + "t_struct(AddressSet)3718_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)3414_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)3450_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)3363", + "offset": 26, + "slot": "4" + }, + { + "label": "creator", + "type": "t_address", + "offset": 0, + "slot": "5" + } + ], + "numberOfBytes": "192" + }, + "t_struct(MinerEpochState)3372_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)3377_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)3674_storage": { + "label": "struct Random.Randomizer", + "members": [ + { + "label": "nonce", + "type": "t_uint256", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(Uint256Set)3888_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)3475_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)3390_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": {} + } + }, + "5fe2be26dfceb53b6ff062e8928254c53cd5538daa6ea40353c32ef4bd041388": { + "address": "0xaba0A512dE61b43bd3B87711183BcEc2fA9F2637", + "txHash": "0xf02e1c368d1508c489a9f6f23af73b108df987d5eddb3930b1db2093ad57052a", + "layout": { + "solcVersion": "0.8.19", + "storage": [ + { + "label": "randomizer", + "offset": 0, + "slot": "0", + "type": "t_struct(Randomizer)3696_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:10" + }, + { + "label": "models", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_struct(Model)3403_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:12" + }, + { + "label": "miners", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_address,t_struct(Worker)3416_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:13" + }, + { + "label": "validators", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_address,t_struct(Worker)3416_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:14" + }, + { + "label": "minerAddressesByModel", + "offset": 0, + "slot": "4", + "type": "t_mapping(t_address,t_struct(AddressSet)3740_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:16" + }, + { + "label": "validatorAddressesByModel", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_address,t_struct(AddressSet)3740_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:17" + }, + { + "label": "modelAddresses", + "offset": 0, + "slot": "6", + "type": "t_struct(AddressSet)3740_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:19" + }, + { + "label": "minerAddresses", + "offset": 0, + "slot": "8", + "type": "t_struct(AddressSet)3740_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:20" + }, + { + "label": "validatorAddresses", + "offset": 0, + "slot": "10", + "type": "t_struct(AddressSet)3740_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:21" + }, + { + "label": "minerUnstakeRequests", + "offset": 0, + "slot": "12", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3501_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:23" + }, + { + "label": "validatorUnstakeRequests", + "offset": 0, + "slot": "13", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3501_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)3476_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)3440_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:30" + }, + { + "label": "assignmentsByMiner", + "offset": 0, + "slot": "18", + "type": "t_mapping(t_address,t_struct(Uint256Set)3910_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:31" + }, + { + "label": "assignmentsByInference", + "offset": 0, + "slot": "19", + "type": "t_mapping(t_uint256,t_struct(Uint256Set)3910_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)3398_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)3389": { + "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)3740_storage)": { + "label": "mapping(address => struct Set.AddressSet)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Model)3403_storage)": { + "label": "mapping(address => struct IWorkerHub.Model)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Uint256Set)3910_storage)": { + "label": "mapping(address => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(UnstakeRequest)3501_storage)": { + "label": "mapping(address => struct IWorkerHub.UnstakeRequest)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Worker)3416_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)3440_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Assignment)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Inference)3476_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Inference)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(MinerEpochState)3398_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.MinerEpochState)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Uint256Set)3910_storage)": { + "label": "mapping(uint256 => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_uint256)": { + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32" + }, + "t_struct(AddressSet)3740_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)3440_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)3476_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)3389", + "offset": 26, + "slot": "4" + }, + { + "label": "creator", + "type": "t_address", + "offset": 0, + "slot": "5" + } + ], + "numberOfBytes": "192" + }, + "t_struct(MinerEpochState)3398_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)3403_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)3696_storage": { + "label": "struct Random.Randomizer", + "members": [ + { + "label": "nonce", + "type": "t_uint256", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(Uint256Set)3910_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)3501_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)3416_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 c5aff38..cc0841a 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -126,6 +126,15 @@ ReentrancyGuardUpgradeable { return minerAddresses.values; } + function getMinerAddressesOfModel(address _model) external view returns (address[] memory) { + return minerAddressesByModel[_model].values; + } + + function getValidatorAddressesOfModel(address _model) external view returns (address[] memory) { + return validatorAddressesByModel[_model].values; + } + + function getMiners() external view returns (WorkerInfo[] memory) { address[] memory addresses = minerAddresses.values; uint256 minerNumber = addresses.length; diff --git a/hardhat.config.ts b/hardhat.config.ts index e56e4cc..ab96bdd 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -38,7 +38,7 @@ const config: HardhatUserConfig = { url: "http://127.0.0.1:8545/", timeout: 600_000, gas: 10_000_000_000, - gasPrice: "auto", + gasPrice: "auto", }, localhost: { url: "http://localhost:8545", @@ -88,6 +88,17 @@ const config: HardhatUserConfig = { gasPrice: 1_000_000_000, blockGasLimit: 100_000_000_000, } as any, + mainnet: { + url: "https://node.eternalai.org/", + chainId: 43338, + accounts: [process.env.MAINNET_PRIVATE_KEY], + treasuryAddress: process.env.MAINNET_TREASURY_ADDRESS, + collectionAddress: process.env.MAINNET_COLLECTION_ADDRESS, + workerHubAddress: process.env.MAINNET_WORKER_HUB_ADDRESS, + timeout: 500_000, + gasPrice: 1_000_000_000, + blockGasLimit: 100_000_000_000, + } as any, }, namedAccounts: { deployer: 0, diff --git a/package.json b/package.json index b35b984..a5b38bb 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,12 @@ "console:cudatest": "npx hardhat console --network cudatest", "deployModelCollection:cudatest": "npx hardhat run scripts/deployModelCollection.ts --network cudatest", "deployWorkerHub:cudatest": "npx hardhat run scripts/deployWorkerHub.ts --network cudatest", - "deployHybridModel:cudatest": "npx hardhat run scripts/deployHyrbidModel.ts --network cudatest" + "deployHybridModel:cudatest": "npx hardhat run scripts/deployHyrbidModel.ts --network cudatest", + "console:mainnet": "npx hardhat console --network cudatest", + "deployModelCollection:mainnet": "npx hardhat run scripts/deployModelCollection.ts --network mainnet", + "deployWorkerHub:mainnet": "npx hardhat run scripts/deployWorkerHub.ts --network mainnet", + "deployHybridModel:mainnet": "npx hardhat run scripts/deployHyrbidModel.ts --network mainnet" + }, "devDependencies": { "@ericxstone/hardhat-blockscout-verify": "^1.0.2", diff --git a/scripts/deployHybridModel.ts b/scripts/deployHybridModel.ts index c2524c6..9a7b45b 100644 --- a/scripts/deployHybridModel.ts +++ b/scripts/deployHybridModel.ts @@ -47,7 +47,7 @@ async function deployHybridModel() { )).wait(); const workerHub = WorkerHub.attach(workerHubAddress); - await workerHub.registerModel(hybridModel.address, 1, ethers.utils.parseEther('100')); + await workerHub.registerModel(hybridModel.address, 1, ethers.utils.parseEther('0.2')); console.log(`Contract HybridModel has been deployed to address ${hybridModel.address}`); diff --git a/scripts/deployModelCollection.ts b/scripts/deployModelCollection.ts index e628edf..0cfdcc1 100644 --- a/scripts/deployModelCollection.ts +++ b/scripts/deployModelCollection.ts @@ -15,12 +15,12 @@ async function deployModelCollection() { return config.collectionAddress; })() : await (async () => { - const name = "Model" - const symbol = "MDL" + const name = "Eternal AI" + const symbol = "" const mintPrice = ethers.utils.parseEther('0'); - const royaltyReceiver = (await ethers.getSigners())[0].address - const royalPortion = 20_00; - const nextModelId = 100001; + const royaltyReceiver = '0x451064E5B968858cD54f227Dba7b7F419eAC5BA9' + const royalPortion = 5_00; + const nextModelId = 100_001; const modelCollection = await upgrades.deployProxy( ModelCollection, diff --git a/scripts/deployWorkerHub.ts b/scripts/deployWorkerHub.ts index 648d06b..dd901a2 100644 --- a/scripts/deployWorkerHub.ts +++ b/scripts/deployWorkerHub.ts @@ -15,23 +15,16 @@ async function deployWorkerHub() { return config.workerHubAddress; })() : await (async () => { - const treasuryAddress = config.treasuryAddress; - assert.ok( - treasuryAddress, - `Missing ${networkName}_TREASURY_ADDRESS from environment variables!` - ); - - // const collectionAddress = config.collectionAddress || ethers.constants.AddressZero; - + const treasuryAddress = '0x451064E5B968858cD54f227Dba7b7F419eAC5BA9'; const feePercentage = 10_00; - const minerMinimumStake = ethers.utils.parseEther("100"); - const validatorMinimumStake = ethers.utils.parseEther("100"); - const miningTimeLimit = 300; + const minerMinimumStake = ethers.utils.parseEther("25000"); + const validatorMinimumStake = ethers.utils.parseEther("40000"); + const miningTimeLimit = 10 * 60; const minerRequirement = 3; const blockPerEpoch = 600; - const rewardPerEpochBasedOnPerf = ethers.utils.parseEther("0.5"); - const rewardPerEpoch = ethers.utils.parseEther('1'); - const unstakeDelayTime = 12 * 24 * 3600; + const rewardPerEpochBasedOnPerf = ethers.utils.parseEther("0"); + const rewardPerEpoch = ethers.utils.parseEther('0'); + const unstakeDelayTime = 21 * 24 * 3600; const workerHub = await upgrades.deployProxy( WorkerHub, @@ -50,12 +43,12 @@ async function deployWorkerHub() { ); await workerHub.deployed(); - const tx = { - to: workerHub.address, - value: ethers.utils.parseEther('1000') - } - - await (await ethers.getSigners())[0].sendTransaction(tx); + // const tx = { + // to: workerHub.address, + // value: ethers.utils.parseEther('1000') + // } + // + // await (await ethers.getSigners())[0].sendTransaction(tx); console.log(`Contract WorkerHub has been deployed to address ${workerHub.address}`); return workerHub.address; From 94c6fbca1d73d3a5397a704c7341ad70e2ddb2c2 Mon Sep 17 00:00:00 2001 From: 180945 <180945@trustless.computer> Date: Fri, 10 May 2024 19:06:11 +0700 Subject: [PATCH 47/82] added reward fomula --- contracts/WorkerHub.sol | 11 +++++++++-- contracts/storages/WorkerHubStorage.sol | 4 ++-- tests/Test.t.sol | 22 ++++++++++++---------- 3 files changed, 23 insertions(+), 14 deletions(-) diff --git a/contracts/WorkerHub.sol b/contracts/WorkerHub.sol index c5aff38..9288119 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -22,6 +22,7 @@ ReentrancyGuardUpgradeable { 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 receive() external payable {} @@ -470,10 +471,16 @@ ReentrancyGuardUpgradeable { if (blocksPerEpoch > 0) { uint256 epochPassed = (block.number - lastBlock) / blocksPerEpoch; if (epochPassed > 0) { + // reward for this epoch + // rewardPerEpoch * total miner * blocker per epoch / blocks per year + uint256 rewardInCurrentEpoch = rewardPerEpoch * minerAddresses.size() * blocksPerEpoch / BLOCK_PER_YEAR; + uint256 perfReward = rewardInCurrentEpoch * rewardPerEpochBasedOnPerf / PERCENTAGE_DENOMINATOR; + uint256 equalReward = rewardInCurrentEpoch - perfReward; + for (; epochPassed > 0; epochPassed--) { rewardInEpoch[currentEpoch].totalMiner = minerAddresses.size(); - rewardInEpoch[currentEpoch].perfReward = rewardPerEpochBasedOnPerf; - rewardInEpoch[currentEpoch].epochReward = rewardPerEpoch; + rewardInEpoch[currentEpoch].perfReward = perfReward; + rewardInEpoch[currentEpoch].epochReward = equalReward; currentEpoch++; } lastBlock = block.number; diff --git a/contracts/storages/WorkerHubStorage.sol b/contracts/storages/WorkerHubStorage.sol index f7a84bf..6bca021 100644 --- a/contracts/storages/WorkerHubStorage.sol +++ b/contracts/storages/WorkerHubStorage.sol @@ -60,8 +60,8 @@ abstract contract WorkerHubStorage is IWorkerHub { uint40 public currentEpoch; uint256 public blocksPerEpoch; uint256 public lastBlock; - uint256 public rewardPerEpochBasedOnPerf; - uint256 public rewardPerEpoch; + uint256 public rewardPerEpochBasedOnPerf; // percentage for workers completed task + uint256 public rewardPerEpoch; // 12299.97 reward EAI for 1 worker per year uint256[100] private __gap; } diff --git a/tests/Test.t.sol b/tests/Test.t.sol index da7694f..cca6073 100644 --- a/tests/Test.t.sol +++ b/tests/Test.t.sol @@ -41,8 +41,8 @@ contract WorkHubTest is Test { 1, 1, 10, - 1e18, - 1e16, + 9000, // 90% + 1229997 * 1e16, // reward 1 worker in one year 21 days ); // workerHub.setNewRewardInEpoch(1e16); @@ -79,23 +79,25 @@ contract WorkHubTest is Test { assertEq(workerHub.rewardToClaim(Miner3), 0); (uint256 pefReward, uint256 epochReward, uint256 totalTaskCompleted, uint256 totalMiner) = workerHub.rewardInEpoch(0); // assertEq(totalMiner, 3); - assertEq(pefReward, 1e18); - assertEq(epochReward, 1e16); + assertEq(pefReward, 0); + assertEq(epochReward, 0); assertEq(totalTaskCompleted, 0); - assertEq(workerHub.rewardPerEpoch(), 1e16); + assertEq(workerHub.rewardPerEpoch(), 12299970000000000000000); // create some data for 2 epochs sequence vm.roll(31); workerHub.rewardToClaim(ADMIN_ADDR); ( pefReward, epochReward, totalTaskCompleted, totalMiner) = workerHub.rewardInEpoch(1); - assertEq(pefReward, 1e18); + assertEq(pefReward, 21061592465753424); + assertEq(epochReward, 2340176940639270); ( pefReward, epochReward, totalTaskCompleted, totalMiner) = workerHub.rewardInEpoch(2); - assertEq(pefReward, 1e18); + assertEq(pefReward, 21061592465753424); + assertEq(epochReward, 2340176940639270); - assertEq(workerHub.rewardToClaim(Miner1), 6666666666666666); - assertEq(workerHub.rewardToClaim(Miner2), 6666666666666666); - assertEq(workerHub.rewardToClaim(Miner3), 6666666666666666); + assertEq(workerHub.rewardToClaim(Miner1), 1560117960426180); + assertEq(workerHub.rewardToClaim(Miner2), 1560117960426180); + assertEq(workerHub.rewardToClaim(Miner3), 1560117960426180); // setup task totalTaskCompleted // epoch 1 From 160e815104f72b038f31fbee5ea5fc75a10e6d86 Mon Sep 17 00:00:00 2001 From: 180945 <180945@trustless.computer> Date: Fri, 10 May 2024 19:20:19 +0700 Subject: [PATCH 48/82] update test --- contracts/WorkerHub.sol | 1 + tests/Test.t.sol | 34 +++++++++++++++++----------------- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/contracts/WorkerHub.sol b/contracts/WorkerHub.sol index a2eab6b..4406548 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -481,6 +481,7 @@ ReentrancyGuardUpgradeable { uint256 epochPassed = (block.number - lastBlock) / blocksPerEpoch; if (epochPassed > 0) { // reward for this epoch + // rewardPerEpoch (reward one year for 1 miner) // rewardPerEpoch * total miner * blocker per epoch / blocks per year uint256 rewardInCurrentEpoch = rewardPerEpoch * minerAddresses.size() * blocksPerEpoch / BLOCK_PER_YEAR; uint256 perfReward = rewardInCurrentEpoch * rewardPerEpochBasedOnPerf / PERCENTAGE_DENOMINATOR; diff --git a/tests/Test.t.sol b/tests/Test.t.sol index cca6073..43fde9a 100644 --- a/tests/Test.t.sol +++ b/tests/Test.t.sol @@ -107,7 +107,7 @@ contract WorkHubTest is Test { workerHub.setTotalTaskCompleteInEpoch(1, 10); (pefReward, epochReward, totalTaskCompleted, totalMiner) = workerHub.rewardInEpoch(1); - assertEq(pefReward, 1e18); + assertEq(pefReward, 21061592465753424); assertEq(totalTaskCompleted, 10); // epoch 2 @@ -117,12 +117,12 @@ contract WorkHubTest is Test { workerHub.setTotalTaskCompleteInEpoch(2, 10); (pefReward, epochReward, totalTaskCompleted, totalMiner) = workerHub.rewardInEpoch(2); - assertEq(pefReward, 1e18); + assertEq(pefReward, 21061592465753424); assertEq(totalTaskCompleted, 10); - assertEq(workerHub.rewardToClaim(Miner1), 906666666666666666); - assertEq(workerHub.rewardToClaim(Miner2), 106666666666666666); - assertEq(workerHub.rewardToClaim(Miner3), 1006666666666666666); + assertEq(workerHub.rewardToClaim(Miner1), 20515551179604261); + assertEq(workerHub.rewardToClaim(Miner2), 3666277207001522); + assertEq(workerHub.rewardToClaim(Miner3), 22621710426179603); vm.deal(address(workerHub), address(workerHub).balance + 2e18); // claim reward @@ -130,9 +130,9 @@ contract WorkHubTest is Test { workerHub.claimReward(Miner2); workerHub.claimReward(Miner3); - assertEq(Miner1.balance, 906666666666666666 + 1e18); - assertEq(Miner2.balance, 106666666666666666 + 1e18); - assertEq(Miner3.balance, 1006666666666666666 + 1e18); + assertEq(Miner1.balance, 20515551179604261 + 1e18); + assertEq(Miner2.balance, 3666277207001522 + 1e18); + assertEq(Miner3.balance, 22621710426179603 + 1e18); assertEq(workerHub.rewardToClaim(Miner1), 0); assertEq(workerHub.rewardToClaim(Miner2), 0); @@ -142,40 +142,40 @@ contract WorkHubTest is Test { workerHub.claimReward(Miner2); workerHub.claimReward(Miner3); - assertEq(Miner1.balance, 906666666666666666 + 1e18); - assertEq(Miner2.balance, 106666666666666666 + 1e18); - assertEq(Miner3.balance, 1006666666666666666 + 1e18); + assertEq(Miner1.balance, 20515551179604261 + 1e18); + assertEq(Miner2.balance, 3666277207001522 + 1e18); + assertEq(Miner3.balance, 22621710426179603 + 1e18); // test miner request unstake vm.startPrank(Miner1); workerHub.unregisterMiner(); vm.warp(block.timestamp + 21 days); workerHub.unstakeForMiner(); - assertEq(Miner1.balance, 906666666666666666 + 2e18); + assertEq(Miner1.balance, 2020515551179604261); vm.roll(51); assertEq(workerHub.rewardToClaim(Miner1), 0); workerHub.claimReward(Miner1); - assertEq(Miner1.balance, 906666666666666666 + 2e18); + assertEq(Miner1.balance, 2020515551179604261); workerHub.registerMiner{value: 1e18}(1); assertEq(workerHub.rewardToClaim(Miner1), 0); workerHub.claimReward(Miner1); - assertEq(Miner1.balance, 906666666666666666 + 1e18); + assertEq(Miner1.balance, 2020515551179604261 - 1e18); workerHub.unregisterMiner(); vm.warp(block.timestamp + 21 days); workerHub.unstakeForMiner(); assertEq(workerHub.rewardToClaim(Miner1), 0); workerHub.claimReward(Miner1); - assertEq(Miner1.balance, 906666666666666666 + 2e18); + assertEq(Miner1.balance, 2020515551179604261); workerHub.registerMiner{value: 1e18}(1); vm.roll(55); assertEq(workerHub.rewardToClaim(Miner1), 0); workerHub.claimReward(Miner1); - assertEq(Miner1.balance, 906666666666666666 + 1e18); + assertEq(Miner1.balance, 2020515551179604261 - 1e18); vm.roll(61); assertEq(workerHub.rewardToClaim(Miner1), 0); workerHub.claimReward(Miner1); - assertEq(Miner1.balance, 906666666666666666 + 1e18); + assertEq(Miner1.balance, 2020515551179604261 - 1e18); assertEq(workerHub.rewardToClaim(Miner1), 0); vm.stopPrank(); } From 0189692d447c1ce7850be48183e8265a39a2e8a2 Mon Sep 17 00:00:00 2001 From: 180945 <180945@trustless.computer> Date: Sun, 12 May 2024 07:38:31 +0700 Subject: [PATCH 49/82] fixed unregis flow --- contracts/WorkerHub.sol | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/contracts/WorkerHub.sol b/contracts/WorkerHub.sol index 4406548..506d441 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -302,6 +302,7 @@ ReentrancyGuardUpgradeable { miner.commitment = 0; if (minerAddresses.hasValue(msg.sender)) { + _claimReward(msg.sender); minerAddresses.erase(msg.sender); minerAddressesByModel[miner.modelAddress].erase(msg.sender); } @@ -313,8 +314,6 @@ ReentrancyGuardUpgradeable { uint40(block.timestamp + unstakeDelayTime) ); - _claimReward(msg.sender); - emit MinerUnregistration(msg.sender); } From b4a59845fd6bd09c060fe02658b4c2f8f2e84f38 Mon Sep 17 00:00:00 2001 From: kochou-nbc Date: Mon, 13 May 2024 09:14:36 +0700 Subject: [PATCH 50/82] upgrade --- .openzeppelin/unknown-43338.json | 2650 ++++++++++++++++++++++++++++++ package.json | 2 +- 2 files changed, 2651 insertions(+), 1 deletion(-) create mode 100644 .openzeppelin/unknown-43338.json diff --git a/.openzeppelin/unknown-43338.json b/.openzeppelin/unknown-43338.json new file mode 100644 index 0000000..edb766e --- /dev/null +++ b/.openzeppelin/unknown-43338.json @@ -0,0 +1,2650 @@ +{ + "manifestVersion": "3.2", + "admin": { + "address": "0xD261fb5D8fA1a96d3B1f2bC2C79580BC363E9059", + "txHash": "0xcc118e38ca17636a387927af961cf0442b8ce40eff3d66d482d9b74e4475db8e" + }, + "proxies": [ + { + "address": "0x05726BF187938c06d6C832dc493E3Df70fe735c8", + "txHash": "0x0e2a37959f11ef671cbf17c103d47da29d86a0df78be42c8069c1a4ef6b6305d", + "kind": "transparent" + }, + { + "address": "0xB0e91e2Aa27330434Bfc33fF5314C796eD3Ad3c6", + "txHash": "0x9ba204c9d0ce1c4005839950b5a6722ee3d1174c8684ae4eedad45d83ba9f792", + "kind": "transparent" + } + ], + "impls": { + "cc39c392217c1bb24c515b641c4c643f71fe0fcec761330c7f56de14dc02ed48": { + "address": "0x4310D19bAFb2EB9C04204E1193253262fBC67dC2", + "txHash": "0xb68964561e6b4a3a113592640a5a473eb80898b87dc32e69b6f1876c88f73e6c", + "layout": { + "solcVersion": "0.8.19", + "storage": [ + { + "label": "randomizer", + "offset": 0, + "slot": "0", + "type": "t_struct(Randomizer)3681_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:10" + }, + { + "label": "models", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_struct(Model)3388_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:12" + }, + { + "label": "miners", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_address,t_struct(Worker)3401_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:13" + }, + { + "label": "validators", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_address,t_struct(Worker)3401_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:14" + }, + { + "label": "minerAddressesByModel", + "offset": 0, + "slot": "4", + "type": "t_mapping(t_address,t_struct(AddressSet)3725_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:16" + }, + { + "label": "validatorAddressesByModel", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_address,t_struct(AddressSet)3725_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:17" + }, + { + "label": "modelAddresses", + "offset": 0, + "slot": "6", + "type": "t_struct(AddressSet)3725_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:19" + }, + { + "label": "minerAddresses", + "offset": 0, + "slot": "8", + "type": "t_struct(AddressSet)3725_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:20" + }, + { + "label": "validatorAddresses", + "offset": 0, + "slot": "10", + "type": "t_struct(AddressSet)3725_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:21" + }, + { + "label": "minerUnstakeRequests", + "offset": 0, + "slot": "12", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3486_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:23" + }, + { + "label": "validatorUnstakeRequests", + "offset": 0, + "slot": "13", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3486_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)3461_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)3425_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:30" + }, + { + "label": "assignmentsByMiner", + "offset": 0, + "slot": "18", + "type": "t_mapping(t_address,t_struct(Uint256Set)3895_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:31" + }, + { + "label": "assignmentsByInference", + "offset": 0, + "slot": "19", + "type": "t_mapping(t_uint256,t_struct(Uint256Set)3895_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)3383_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)3374": { + "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)3725_storage)": { + "label": "mapping(address => struct Set.AddressSet)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Model)3388_storage)": { + "label": "mapping(address => struct IWorkerHub.Model)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Uint256Set)3895_storage)": { + "label": "mapping(address => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(UnstakeRequest)3486_storage)": { + "label": "mapping(address => struct IWorkerHub.UnstakeRequest)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Worker)3401_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)3425_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Assignment)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Inference)3461_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Inference)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(MinerEpochState)3383_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.MinerEpochState)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Uint256Set)3895_storage)": { + "label": "mapping(uint256 => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_uint256)": { + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32" + }, + "t_struct(AddressSet)3725_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)3425_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)3461_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)3374", + "offset": 26, + "slot": "4" + }, + { + "label": "creator", + "type": "t_address", + "offset": 0, + "slot": "5" + } + ], + "numberOfBytes": "192" + }, + "t_struct(MinerEpochState)3383_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)3388_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)3681_storage": { + "label": "struct Random.Randomizer", + "members": [ + { + "label": "nonce", + "type": "t_uint256", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(Uint256Set)3895_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)3486_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)3401_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": {} + } + }, + "d26b765071ecc975c2331a608327b23e8c7633e8ead1e079225a5f115f94c5db": { + "address": "0xc1eF380E348F5AE8fC1523F67Ba1A1d4fDfDea42", + "txHash": "0x129c431540a63d1c26dcac491e5f93b45fd9eaea878fa6f933146ec888bbef7d", + "layout": { + "solcVersion": "0.8.19", + "storage": [ + { + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:63", + "retypedFrom": "bool" + }, + { + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:68" + }, + { + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)50_storage", + "contract": "ContextUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:40" + }, + { + "label": "__gap", + "offset": 0, + "slot": "51", + "type": "t_array(t_uint256)50_storage", + "contract": "ERC165Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol:41" + }, + { + "label": "_name", + "offset": 0, + "slot": "101", + "type": "t_string_storage", + "contract": "ERC721Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:25" + }, + { + "label": "_symbol", + "offset": 0, + "slot": "102", + "type": "t_string_storage", + "contract": "ERC721Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:28" + }, + { + "label": "_owners", + "offset": 0, + "slot": "103", + "type": "t_mapping(t_uint256,t_address)", + "contract": "ERC721Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:31" + }, + { + "label": "_balances", + "offset": 0, + "slot": "104", + "type": "t_mapping(t_address,t_uint256)", + "contract": "ERC721Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:34" + }, + { + "label": "_tokenApprovals", + "offset": 0, + "slot": "105", + "type": "t_mapping(t_uint256,t_address)", + "contract": "ERC721Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:37" + }, + { + "label": "_operatorApprovals", + "offset": 0, + "slot": "106", + "type": "t_mapping(t_address,t_mapping(t_address,t_bool))", + "contract": "ERC721Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:40" + }, + { + "label": "__gap", + "offset": 0, + "slot": "107", + "type": "t_array(t_uint256)44_storage", + "contract": "ERC721Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:477" + }, + { + "label": "models", + "offset": 0, + "slot": "151", + "type": "t_mapping(t_uint256,t_address)", + "contract": "ModelCollectionStorage", + "src": "contracts/storages/ModelCollectionStorage.sol:7" + }, + { + "label": "nextModelId", + "offset": 0, + "slot": "152", + "type": "t_uint256", + "contract": "ModelCollectionStorage", + "src": "contracts/storages/ModelCollectionStorage.sol:8" + }, + { + "label": "mintPrice", + "offset": 0, + "slot": "153", + "type": "t_uint256", + "contract": "ModelCollectionStorage", + "src": "contracts/storages/ModelCollectionStorage.sol:9" + }, + { + "label": "royaltyReceiver", + "offset": 0, + "slot": "154", + "type": "t_address", + "contract": "ModelCollectionStorage", + "src": "contracts/storages/ModelCollectionStorage.sol:10" + }, + { + "label": "royaltyPortion", + "offset": 20, + "slot": "154", + "type": "t_uint16", + "contract": "ModelCollectionStorage", + "src": "contracts/storages/ModelCollectionStorage.sol:11" + }, + { + "label": "__gap", + "offset": 0, + "slot": "155", + "type": "t_array(t_uint256)50_storage", + "contract": "ModelCollectionStorage", + "src": "contracts/storages/ModelCollectionStorage.sol:13" + }, + { + "label": "_hashedName", + "offset": 0, + "slot": "205", + "type": "t_bytes32", + "contract": "EIP712Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol:40", + "renamedFrom": "_HASHED_NAME" + }, + { + "label": "_hashedVersion", + "offset": 0, + "slot": "206", + "type": "t_bytes32", + "contract": "EIP712Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol:42", + "renamedFrom": "_HASHED_VERSION" + }, + { + "label": "_name", + "offset": 0, + "slot": "207", + "type": "t_string_storage", + "contract": "EIP712Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol:44" + }, + { + "label": "_version", + "offset": 0, + "slot": "208", + "type": "t_string_storage", + "contract": "EIP712Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol:45" + }, + { + "label": "__gap", + "offset": 0, + "slot": "209", + "type": "t_array(t_uint256)48_storage", + "contract": "EIP712Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol:204" + }, + { + "label": "_ownedTokens", + "offset": 0, + "slot": "257", + "type": "t_mapping(t_address,t_mapping(t_uint256,t_uint256))", + "contract": "ERC721EnumerableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721EnumerableUpgradeable.sol:17" + }, + { + "label": "_ownedTokensIndex", + "offset": 0, + "slot": "258", + "type": "t_mapping(t_uint256,t_uint256)", + "contract": "ERC721EnumerableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721EnumerableUpgradeable.sol:20" + }, + { + "label": "_allTokens", + "offset": 0, + "slot": "259", + "type": "t_array(t_uint256)dyn_storage", + "contract": "ERC721EnumerableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721EnumerableUpgradeable.sol:23" + }, + { + "label": "_allTokensIndex", + "offset": 0, + "slot": "260", + "type": "t_mapping(t_uint256,t_uint256)", + "contract": "ERC721EnumerableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721EnumerableUpgradeable.sol:26" + }, + { + "label": "__gap", + "offset": 0, + "slot": "261", + "type": "t_array(t_uint256)46_storage", + "contract": "ERC721EnumerableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721EnumerableUpgradeable.sol:171" + }, + { + "label": "_paused", + "offset": 0, + "slot": "307", + "type": "t_bool", + "contract": "PausableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol:29" + }, + { + "label": "__gap", + "offset": 0, + "slot": "308", + "type": "t_array(t_uint256)49_storage", + "contract": "PausableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol:116" + }, + { + "label": "__gap", + "offset": 0, + "slot": "357", + "type": "t_array(t_uint256)50_storage", + "contract": "ERC721PausableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721PausableUpgradeable.sol:53" + }, + { + "label": "_tokenURIs", + "offset": 0, + "slot": "407", + "type": "t_mapping(t_uint256,t_string_storage)", + "contract": "ERC721URIStorageUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721URIStorageUpgradeable.sol:17" + }, + { + "label": "__gap", + "offset": 0, + "slot": "408", + "type": "t_array(t_uint256)49_storage", + "contract": "ERC721URIStorageUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721URIStorageUpgradeable.sol:86" + }, + { + "label": "_owner", + "offset": 0, + "slot": "457", + "type": "t_address", + "contract": "OwnableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:22" + }, + { + "label": "__gap", + "offset": 0, + "slot": "458", + "type": "t_array(t_uint256)49_storage", + "contract": "OwnableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:94" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_uint256)44_storage": { + "label": "uint256[44]", + "numberOfBytes": "1408" + }, + "t_array(t_uint256)46_storage": { + "label": "uint256[46]", + "numberOfBytes": "1472" + }, + "t_array(t_uint256)48_storage": { + "label": "uint256[48]", + "numberOfBytes": "1536" + }, + "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_bytes32": { + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_bool)": { + "label": "mapping(address => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_mapping(t_address,t_bool))": { + "label": "mapping(address => mapping(address => 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_uint256)": { + "label": "mapping(address => uint256)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_address)": { + "label": "mapping(uint256 => address)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_string_storage)": { + "label": "mapping(uint256 => string)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_uint256)": { + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32" + }, + "t_string_storage": { + "label": "string", + "numberOfBytes": "32" + }, + "t_uint16": { + "label": "uint16", + "numberOfBytes": "2" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + }, + "namespaces": {} + } + }, + "4d697a02bf64cd7d91de33c2b9aeaeeaf81999c770974b24d232b8e8eb754178": { + "address": "0x5C24921d52632F80c4B269b236F75C7388CD3a26", + "txHash": "0x8d85f56296c0e5a2623c5c457596a11b0961120a438d2c67bec51b1e2e66ad96", + "layout": { + "solcVersion": "0.8.19", + "storage": [ + { + "label": "randomizer", + "offset": 0, + "slot": "0", + "type": "t_struct(Randomizer)3712_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:10" + }, + { + "label": "models", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_struct(Model)3419_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:12" + }, + { + "label": "miners", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_address,t_struct(Worker)3432_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:13" + }, + { + "label": "validators", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_address,t_struct(Worker)3432_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:14" + }, + { + "label": "minerAddressesByModel", + "offset": 0, + "slot": "4", + "type": "t_mapping(t_address,t_struct(AddressSet)3756_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:16" + }, + { + "label": "validatorAddressesByModel", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_address,t_struct(AddressSet)3756_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:17" + }, + { + "label": "modelAddresses", + "offset": 0, + "slot": "6", + "type": "t_struct(AddressSet)3756_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:19" + }, + { + "label": "minerAddresses", + "offset": 0, + "slot": "8", + "type": "t_struct(AddressSet)3756_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:20" + }, + { + "label": "validatorAddresses", + "offset": 0, + "slot": "10", + "type": "t_struct(AddressSet)3756_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:21" + }, + { + "label": "minerUnstakeRequests", + "offset": 0, + "slot": "12", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3517_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:23" + }, + { + "label": "validatorUnstakeRequests", + "offset": 0, + "slot": "13", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3517_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)3492_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)3456_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:30" + }, + { + "label": "assignmentsByMiner", + "offset": 0, + "slot": "18", + "type": "t_mapping(t_address,t_struct(Uint256Set)3926_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:31" + }, + { + "label": "assignmentsByInference", + "offset": 0, + "slot": "19", + "type": "t_mapping(t_uint256,t_struct(Uint256Set)3926_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)3414_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)3405": { + "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)3756_storage)": { + "label": "mapping(address => struct Set.AddressSet)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Model)3419_storage)": { + "label": "mapping(address => struct IWorkerHub.Model)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Uint256Set)3926_storage)": { + "label": "mapping(address => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(UnstakeRequest)3517_storage)": { + "label": "mapping(address => struct IWorkerHub.UnstakeRequest)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Worker)3432_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)3456_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Assignment)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Inference)3492_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Inference)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(MinerEpochState)3414_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.MinerEpochState)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Uint256Set)3926_storage)": { + "label": "mapping(uint256 => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_uint256)": { + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32" + }, + "t_struct(AddressSet)3756_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)3456_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)3492_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)3405", + "offset": 26, + "slot": "4" + }, + { + "label": "creator", + "type": "t_address", + "offset": 0, + "slot": "5" + } + ], + "numberOfBytes": "192" + }, + "t_struct(MinerEpochState)3414_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)3419_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)3712_storage": { + "label": "struct Random.Randomizer", + "members": [ + { + "label": "nonce", + "type": "t_uint256", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(Uint256Set)3926_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)3517_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)3432_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": {} + } + }, + "f10ca3d3139c18ba9beb4e2ce264d1d1f404fa1bb707289cfcb83b267b1a1ecf": { + "address": "0xCC6C5e04340F799047B15d6c63b7936F0010AB27", + "txHash": "0xf30d32de3062bf64556d446f790dc84b584e08925f04c3031f47d2dd299fcc5d", + "layout": { + "solcVersion": "0.8.19", + "storage": [ + { + "label": "randomizer", + "offset": 0, + "slot": "0", + "type": "t_struct(Randomizer)3712_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:10" + }, + { + "label": "models", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_struct(Model)3419_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:12" + }, + { + "label": "miners", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_address,t_struct(Worker)3432_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:13" + }, + { + "label": "validators", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_address,t_struct(Worker)3432_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:14" + }, + { + "label": "minerAddressesByModel", + "offset": 0, + "slot": "4", + "type": "t_mapping(t_address,t_struct(AddressSet)3756_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:16" + }, + { + "label": "validatorAddressesByModel", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_address,t_struct(AddressSet)3756_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:17" + }, + { + "label": "modelAddresses", + "offset": 0, + "slot": "6", + "type": "t_struct(AddressSet)3756_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:19" + }, + { + "label": "minerAddresses", + "offset": 0, + "slot": "8", + "type": "t_struct(AddressSet)3756_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:20" + }, + { + "label": "validatorAddresses", + "offset": 0, + "slot": "10", + "type": "t_struct(AddressSet)3756_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:21" + }, + { + "label": "minerUnstakeRequests", + "offset": 0, + "slot": "12", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3517_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:23" + }, + { + "label": "validatorUnstakeRequests", + "offset": 0, + "slot": "13", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3517_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)3492_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)3456_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:30" + }, + { + "label": "assignmentsByMiner", + "offset": 0, + "slot": "18", + "type": "t_mapping(t_address,t_struct(Uint256Set)3926_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:31" + }, + { + "label": "assignmentsByInference", + "offset": 0, + "slot": "19", + "type": "t_mapping(t_uint256,t_struct(Uint256Set)3926_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)3414_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)3405": { + "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)3756_storage)": { + "label": "mapping(address => struct Set.AddressSet)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Model)3419_storage)": { + "label": "mapping(address => struct IWorkerHub.Model)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Uint256Set)3926_storage)": { + "label": "mapping(address => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(UnstakeRequest)3517_storage)": { + "label": "mapping(address => struct IWorkerHub.UnstakeRequest)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Worker)3432_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)3456_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Assignment)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Inference)3492_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Inference)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(MinerEpochState)3414_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.MinerEpochState)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Uint256Set)3926_storage)": { + "label": "mapping(uint256 => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_uint256)": { + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32" + }, + "t_struct(AddressSet)3756_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)3456_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)3492_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)3405", + "offset": 26, + "slot": "4" + }, + { + "label": "creator", + "type": "t_address", + "offset": 0, + "slot": "5" + } + ], + "numberOfBytes": "192" + }, + "t_struct(MinerEpochState)3414_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)3419_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)3712_storage": { + "label": "struct Random.Randomizer", + "members": [ + { + "label": "nonce", + "type": "t_uint256", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(Uint256Set)3926_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)3517_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)3432_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/package.json b/package.json index a5b38bb..59b969b 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "deployModelCollection:cudatest": "npx hardhat run scripts/deployModelCollection.ts --network cudatest", "deployWorkerHub:cudatest": "npx hardhat run scripts/deployWorkerHub.ts --network cudatest", "deployHybridModel:cudatest": "npx hardhat run scripts/deployHyrbidModel.ts --network cudatest", - "console:mainnet": "npx hardhat console --network cudatest", + "console:mainnet": "npx hardhat console --network mainnet", "deployModelCollection:mainnet": "npx hardhat run scripts/deployModelCollection.ts --network mainnet", "deployWorkerHub:mainnet": "npx hardhat run scripts/deployWorkerHub.ts --network mainnet", "deployHybridModel:mainnet": "npx hardhat run scripts/deployHyrbidModel.ts --network mainnet" From 32aa67b7845b0d5444e15ac524d0bb5b07b7d7e9 Mon Sep 17 00:00:00 2001 From: rein-nbc Date: Mon, 13 May 2024 16:27:29 +0700 Subject: [PATCH 51/82] Refactor onchain model upload --- contracts/OnchainModel.sol | 2 +- package.json | 8 ++- run-regtest3.sh | 27 ++++--- scripts/deploy-image-model.ts | 131 ++++++++++++++++++++-------------- scripts/deployHybridModel.ts | 3 +- 5 files changed, 104 insertions(+), 67 deletions(-) diff --git a/contracts/OnchainModel.sol b/contracts/OnchainModel.sol index 2e8cb25..9bdeee1 100644 --- a/contracts/OnchainModel.sol +++ b/contracts/OnchainModel.sol @@ -46,7 +46,7 @@ ReentrancyGuardUpgradeable { address _implementation, uint256 _inferenceCost ) external initializer nonReentrant { - // if (!IOnchainImplementation(_implementation).isReady()) revert ModelNotReady(); + if (!IOnchainImplementation(_implementation).isReady()) revert ModelNotReady(); __Ownable_init(); __Pausable_init(); diff --git a/package.json b/package.json index a5b38bb..aa817ef 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,10 @@ "blockscout:verify": "npx hardhat blockscout-verify", "ts:run": "npx ts-node", "test": "echo \"Error: no test specified\" && exit 1", + "console:anvil": "npx hardhat console --network anvil", + "deployModelCollection:anvil": "npx hardhat run scripts/deployModelCollection.ts --network anvil", + "deployWorkerHub:anvil": "npx hardhat run scripts/deployWorkerHub.ts --network anvil", + "deployHybridModel:anvil": "npx hardhat run scripts/deployHybridModel.ts --network anvil", "console:regtest3": "npx hardhat console --network regtest3", "deployModelCollection:regtest3": "npx hardhat run scripts/deployModelCollection.ts --network regtest3", "deployWorkerHub:regtest3": "npx hardhat run scripts/deployWorkerHub.ts --network regtest3", @@ -16,11 +20,11 @@ "console:cudatest": "npx hardhat console --network cudatest", "deployModelCollection:cudatest": "npx hardhat run scripts/deployModelCollection.ts --network cudatest", "deployWorkerHub:cudatest": "npx hardhat run scripts/deployWorkerHub.ts --network cudatest", - "deployHybridModel:cudatest": "npx hardhat run scripts/deployHyrbidModel.ts --network cudatest", + "deployHybridModel:cudatest": "npx hardhat run scripts/deployHybridModel.ts --network cudatest", "console:mainnet": "npx hardhat console --network cudatest", "deployModelCollection:mainnet": "npx hardhat run scripts/deployModelCollection.ts --network mainnet", "deployWorkerHub:mainnet": "npx hardhat run scripts/deployWorkerHub.ts --network mainnet", - "deployHybridModel:mainnet": "npx hardhat run scripts/deployHyrbidModel.ts --network mainnet" + "deployHybridModel:mainnet": "npx hardhat run scripts/deployHybridModel.ts --network mainnet" }, "devDependencies": { diff --git a/run-regtest3.sh b/run-regtest3.sh index 1217220..a726067 100644 --- a/run-regtest3.sh +++ b/run-regtest3.sh @@ -4,24 +4,35 @@ npx hardhat deploy --tags 1 --network regtest3 # ImageClassifier npx hardhat run scripts/deploy-image-model.ts --network regtest3 -npx hardhat eval-img --network regtest3 --id '1' --contract '0xfC662501feDBe154Dc72004f26033895501d7764' --img 'sample-images/nft/cryptoadz/000.png' - -npx hardhat get-image-model --network regtest3 --id '1' --contract '0xfC662501feDBe154Dc72004f26033895501d7764' +npx hardhat eval-img --network regtest3 --id '1000002' --contract '0x0D8eEd4f3E1D19bCd0CC13BD093C01048c88ee13' --img 'sample-images/nft/cryptoadz/000.png' +npx hardhat eval-img --network regtest3 --id '1000002' --contract '0x0D8eEd4f3E1D19bCd0CC13BD093C01048c88ee13' --img 'sample-images/nft/cryptoadz/001.png' +npx hardhat eval-img --network regtest3 --id '1000002' --contract '0x0D8eEd4f3E1D19bCd0CC13BD093C01048c88ee13' --img 'sample-images/nft/cryptoadz/002.png' +npx hardhat eval-img --network regtest3 --id '1000002' --contract '0x0D8eEd4f3E1D19bCd0CC13BD093C01048c88ee13' --img 'sample-images/nft/cryptopunks/000.png' +npx hardhat eval-img --network regtest3 --id '1000002' --contract '0x0D8eEd4f3E1D19bCd0CC13BD093C01048c88ee13' --img 'sample-images/nft/cryptopunks/001.png' +npx hardhat eval-img --network regtest3 --id '1000002' --contract '0x0D8eEd4f3E1D19bCd0CC13BD093C01048c88ee13' --img 'sample-images/nft/cryptopunks/002.png' +npx hardhat eval-img --network regtest3 --id '1000002' --contract '0x0D8eEd4f3E1D19bCd0CC13BD093C01048c88ee13' --img 'sample-images/nft/moonbirds/000.png' +npx hardhat eval-img --network regtest3 --id '1000002' --contract '0x0D8eEd4f3E1D19bCd0CC13BD093C01048c88ee13' --img 'sample-images/nft/moonbirds/001.png' +npx hardhat eval-img --network regtest3 --id '1000002' --contract '0x0D8eEd4f3E1D19bCd0CC13BD093C01048c88ee13' --img 'sample-images/nft/moonbirds/002.png' +npx hardhat eval-img --network regtest3 --id '1000002' --contract '0x0D8eEd4f3E1D19bCd0CC13BD093C01048c88ee13' --img 'sample-images/nft/nouns/000.png' +npx hardhat eval-img --network regtest3 --id '1000002' --contract '0x0D8eEd4f3E1D19bCd0CC13BD093C01048c88ee13' --img 'sample-images/nft/nouns/001.png' +npx hardhat eval-img --network regtest3 --id '1000002' --contract '0x0D8eEd4f3E1D19bCd0CC13BD093C01048c88ee13' --img 'sample-images/nft/nouns/002.png' + +npx hardhat get-image-model --network regtest3 --id '1000002' --contract '0x0D8eEd4f3E1D19bCd0CC13BD093C01048c88ee13' # TextRNN npx hardhat run scripts/deploy-textrnn-model.ts --network regtest3 -npx hardhat generate-text --network regtest3 --id '1' --contract '0xfC662501feDBe154Dc72004f26033895501d7764' --prompt $'ROMEO:\nIs the day so young?' --togenerate 100 --generatepertx 10 +npx hardhat generate-text --network regtest3 --id '1' --contract '0x0D8eEd4f3E1D19bCd0CC13BD093C01048c88ee13' --prompt $'ROMEO:\nIs the day so young?' --togenerate 100 --generatepertx 10 -npx hardhat get-textrnn-model --network regtest3 --id '1' --contract '0xfC662501feDBe154Dc72004f26033895501d7764' +npx hardhat get-textrnn-model --network regtest3 --id '1' --contract '0x0D8eEd4f3E1D19bCd0CC13BD093C01048c88ee13' # MelodyRNN npx hardhat run scripts/deploy-melody-model.ts --network regtest3 -npx hardhat generate-melody --network regtest3 --id '1' --contract '0xfC662501feDBe154Dc72004f26033895501d7764' --count 50 --steplen 1 --output "_outputs/vgm.mid" -npx hardhat generate-melody --network regtest3 --id '1' --contract '0xfC662501feDBe154Dc72004f26033895501d7764' --count 1 --steplen 50 --output "_outputs/vgm_stateful.mid" +npx hardhat generate-melody --network regtest3 --id '1' --contract '0x0D8eEd4f3E1D19bCd0CC13BD093C01048c88ee13' --count 50 --steplen 1 --output "_outputs/vgm.mid" +npx hardhat generate-melody --network regtest3 --id '1' --contract '0x0D8eEd4f3E1D19bCd0CC13BD093C01048c88ee13' --count 1 --steplen 50 --output "_outputs/vgm_stateful.mid" -npx hardhat get-melody-model --network regtest3 --id '1' --contract '0xfC662501feDBe154Dc72004f26033895501d7764' +npx hardhat get-melody-model --network regtest3 --id '1' --contract '0x0D8eEd4f3E1D19bCd0CC13BD093C01048c88ee13' # Testing contract storage npx hardhat test-storage-multi-contract --network regtest3 --n 500000 diff --git a/scripts/deploy-image-model.ts b/scripts/deploy-image-model.ts index 570af64..4204c0d 100644 --- a/scripts/deploy-image-model.ts +++ b/scripts/deploy-image-model.ts @@ -7,39 +7,16 @@ import { fromFloat } from './lib/utils'; import { getModelConfig, uploadModelWeights, mintModel } from './lib/modelLib'; dotenv.config(); +const ImageClassifierContractName = "ImageClassifier"; const ModelCollectionContractName = "ModelCollection"; -const MaxWeightLen = 1000; -const mintPrice = ethers.utils.parseEther('100'); +const OnchainModelContractName = "OnchainModel"; +const MaxWeightLen = 30000; +const mintPrice = ethers.utils.parseEther('0'); const mintConfig = { value: mintPrice }; // model 10x10: MaxWeightLen = 40, numTx = 8, fee = 0.02 * 8 TC -async function main() { - const { ethers, upgrades } = hre; - const { PRIVATE_KEY, NODE_ENDPOINT, MODEL_JSON, MODELS_NFT_CONTRACT, MODEL_OWNER, MODEL_INFERENCE_COST, CHUNK_LEN } = process.env; - if (!PRIVATE_KEY) { - throw new Error("PRIVATE_KEY is not set"); - } - if (!NODE_ENDPOINT) { - throw new Error("NODE_ENDPOINT is not set"); - } - if (!MODEL_JSON) { - throw new Error("MODEL_JSON is not set"); - } - if (!MODELS_NFT_CONTRACT || !ethers.utils.isAddress(MODELS_NFT_CONTRACT)) { - throw new Error("MODELS_NFT_CONTRACT is not set or invalid"); - } - if (!MODEL_OWNER || !ethers.utils.isAddress(MODEL_OWNER)) { - throw new Error("MODEL_OWNER is not set"); - } - - const provider = ethers.getDefaultProvider(NODE_ENDPOINT); - const signer = new ethers.Wallet(PRIVATE_KEY, provider); - - // load params from file - const modelParams = JSON.parse(fs.readFileSync(MODEL_JSON, 'utf-8')); - const params = Object.assign({}, modelParams); - +async function deployImageClassifier(params: any, weightPerTx: number, signer: ethers.Wallet): Promise { let weightsFlat: ethers.BigNumber[] = []; if (params.weight_b64) { const temp = Buffer.from(params.weight_b64, 'base64'); @@ -54,10 +31,6 @@ async function main() { params.layers_config = newLayerConfig.filter((x: any) => x !== null); params.classes_name = params.classes_name || []; - let nftContractAddress = MODELS_NFT_CONTRACT as string; - - const modelCollection = await ethers.getContractAt(ModelCollectionContractName, nftContractAddress); - // deploy a ImageClassifier contract // ImageClassifier contract is too big (larger than 49152 bytes) to be deployed with ContractFactory const ImageFac = new ethers.ContractFactory(ImageClassifierArtifact.abi, ImageClassifierArtifact.bytecode, signer); @@ -81,29 +54,77 @@ async function main() { console.log('Gas used:', rc.gasUsed); console.log("Uploading weights"); - const maxlen = CHUNK_LEN ? parseInt(CHUNK_LEN) : MaxWeightLen; // do not chunk the weights - await uploadModelWeights(image, weights, maxlen); - - console.log("Deploying OnchainModel contract"); - const inferenceCost = ethers.BigNumber.from(MODEL_INFERENCE_COST); - const OnchainModel = await ethers.getContractFactory('OnchainModel'); - const onchainModel = await upgrades.deployProxy( - OnchainModel, - [ - modelCollection.address, - 0, - params.model_name, - image.address, - inferenceCost - ] - ); - await onchainModel.deployed(); - console.log(`Contract OnchainModel has been deployed to address ${onchainModel.address}`); - - console.log(`Set model inferface`); - const tx = await image.setModelInterface(onchainModel.address); - await tx.wait(); - console.log("tx:", tx.hash); + await uploadModelWeights(image, weights, weightPerTx); + + return image; +} + +async function main() { + const { ethers, upgrades } = hre; + const { PRIVATE_KEY, NODE_ENDPOINT, MODEL_JSON, ONCHAIN_MODEL_CONTRACT, MODELS_NFT_CONTRACT, MODEL_OWNER, MODEL_INFERENCE_COST, CHUNK_LEN } = process.env; + if (!PRIVATE_KEY) { + throw new Error("PRIVATE_KEY is not set"); + } + if (!NODE_ENDPOINT) { + throw new Error("NODE_ENDPOINT is not set"); + } + if (!MODEL_JSON) { + throw new Error("MODEL_JSON is not set"); + } + if (ONCHAIN_MODEL_CONTRACT && !ethers.utils.isAddress(ONCHAIN_MODEL_CONTRACT)) { + throw new Error("ONCHAIN_MODEL_CONTRACT is invalid"); + } + if (!MODELS_NFT_CONTRACT || !ethers.utils.isAddress(MODELS_NFT_CONTRACT)) { + throw new Error("MODELS_NFT_CONTRACT is not set or invalid"); + } + if (!MODEL_OWNER || !ethers.utils.isAddress(MODEL_OWNER)) { + throw new Error("MODEL_OWNER is not set"); + } + if (!MODEL_INFERENCE_COST) { + throw new Error("MODEL_INFERENCE_COST is not set"); + } + + const provider = ethers.getDefaultProvider(NODE_ENDPOINT); + const signer = new ethers.Wallet(PRIVATE_KEY, provider); + + let nftContractAddress = MODELS_NFT_CONTRACT as string; + const modelCollection = await ethers.getContractAt(ModelCollectionContractName, nftContractAddress); + + const modelParams = JSON.parse(fs.readFileSync(MODEL_JSON, 'utf-8')); + const params = Object.assign({}, modelParams); + + const weightPerTx = CHUNK_LEN ? parseInt(CHUNK_LEN) : MaxWeightLen; // do not chunk the weights + let onchainModel: ethers.Contract; + let image: ethers.Contract; + + if (!ONCHAIN_MODEL_CONTRACT) { + image = await deployImageClassifier(params, weightPerTx, signer); + + console.log("Deploying OnchainModel contract"); + const inferenceCost = ethers.BigNumber.from(MODEL_INFERENCE_COST); + const OnchainModel = await ethers.getContractFactory('OnchainModel'); + onchainModel = await upgrades.deployProxy( + OnchainModel, + [ + modelCollection.address, + 0, + params.model_name, + image.address, + inferenceCost + ] + ); + await onchainModel.deployed(); + console.log(`Contract OnchainModel has been deployed to address ${onchainModel.address}`); + + console.log(`Set model inferface`); + const tx = await image.setModelInterface(onchainModel.address); + await tx.wait(); + console.log("tx:", tx.hash); + } else { + onchainModel = await ethers.getContractAt(OnchainModelContractName, ONCHAIN_MODEL_CONTRACT); + const implementAddress = await onchainModel.implementation(); + image = await ethers.getContractAt(ImageClassifierContractName, implementAddress, signer); + } console.log("Minting new model"); await mintModel(modelCollection, onchainModel, MODEL_OWNER || signer.address, mintConfig); diff --git a/scripts/deployHybridModel.ts b/scripts/deployHybridModel.ts index 9a7b45b..d7bdda7 100644 --- a/scripts/deployHybridModel.ts +++ b/scripts/deployHybridModel.ts @@ -17,6 +17,7 @@ async function deployHybridModel() { const workerHubAddress = config.workerHubAddress; const identifier = 0; const name = 'Max Multi';//`Model ${identifier}`; + const modelOwnerAddress = '0x10919C7A907DAAFcBF581cf5aBBb877DD6675D77'; const metadata = '{\n' + '\t"version": 1,\n' + '\t"model_name": "MaxMulti",\n' + @@ -41,7 +42,7 @@ async function deployHybridModel() { const collection = ModelCollection.attach(config.collectionAddress); await (await collection.mint( - (await ethers.getSigners())[0].address, + modelOwnerAddress, metadata, hybridModel.address )).wait(); From 03085f3a63a3b9fca5f65b424245fc9367a65b9e Mon Sep 17 00:00:00 2001 From: rein-nbc Date: Mon, 13 May 2024 16:34:08 +0700 Subject: [PATCH 52/82] Add update metadata script --- deploy_data/deploy_data.txt | 64 ++++++++++++++++++++++++++++ package.json | 9 ++-- scripts/deployHybridModel.ts | 18 +++++--- scripts/updateHybridModelMetadata.ts | 44 +++++++++++++++++++ 4 files changed, 125 insertions(+), 10 deletions(-) create mode 100644 deploy_data/deploy_data.txt create mode 100644 scripts/updateHybridModelMetadata.ts diff --git a/deploy_data/deploy_data.txt b/deploy_data/deploy_data.txt new file mode 100644 index 0000000..19db630 --- /dev/null +++ b/deploy_data/deploy_data.txt @@ -0,0 +1,64 @@ +const name = 'Max Multi';//`Model ${identifier}`; +const modelOwnerAddress = ''; +const metadata = '{\n' + + '\t"version": 1,\n' + + '\t"model_name": "MaxMulti",\n' + + '\t"model_type": "image",\n' + + '\t"model_url": "https://gateway.lighthouse.storage/ipfs/QmcFYMYpVodkpT6t1fVmWNjPnUnnQbXvwpqyheXvPGKUr8",\n' + + '\t"model_file_hash": "7f1f29cb884c5b2f4d072b99afcb87f32cbe4adc88cffedab15ffc9fd30887ae",\n' + + '\t"min_hardware": 1,\n' + + '\t"verifier_url": "https://gateway.lighthouse.storage/ipfs/QmdkKEjx2fauzbPh1j5bUiQXrUG5Ft36pJGHS8awrN89Dc",\n' + + '\t"verifier_file_hash": "492b2b3dea3003d359fe1b2cee77a22777d8a9faf942ab6dee81e6bfadaadec4"\n' + + '}' + +const name = 'SDXL-Lightning';//`Model ${identifier}`; +const modelOwnerAddress = '0x5D6429703D747805920D596E15427B08083e3D2c'; +const metadata = '{\n' + + '\t"version": 1,\n' + + '\t"model_name": "SDXL-Lightning",\n' + + '\t"model_type": "image",\n' + + '\t"model_url": "https://gateway.lighthouse.storage/ipfs/QmcYLMm3X9KVkozZJoVEJRoSHDXpfhwyQJpiPTZTEcNz8T",\n' + + '\t"model_file_hash": "49694d4077e0f007c8b49ed8a8a3a877f70dd6fbbb19ae230cba76b68451f7b0",\n' + + '\t"min_hardware": 1,\n' + + '\t"verifier_url": "",\n' + + '\t"verifier_file_hash": ""\n' + + '}' + +const name = 'Fantasy Map';//`Model ${identifier}`; +const modelOwnerAddress = '0x10919C7A907DAAFcBF581cf5aBBb877DD6675D77'; +const metadata = '{\n' + + '\t"version": 1,\n' + + '\t"model_name": "FantasyMap",\n' + + '\t"model_type": "image",\n' + + '\t"model_url": "https://gateway.lighthouse.storage/ipfs/Qmaz3AgnZVH1DVqXdciac6G8FUnungDTkBXDo2Dx1FtXx5",\n' + + '\t"model_file_hash": "2c25f12639d4821f6bb04d853c36a383bd99234b1bb3bcd80e0ac6c98d34247d",\n' + + '\t"min_hardware": 1,\n' + + '\t"verifier_url": "",\n' + + '\t"verifier_file_hash": ""\n' + + '}' + +const name = 'Animated Concept - SDXL LoRA';//`Model ${identifier}`; +const modelOwnerAddress = ''; +const metadata = '{\n' + + '\t"version": 1,\n' + + '\t"model_name": "Animated Concept - SDXL LoRA",\n' + + '\t"model_type": "image",\n' + + '\t"model_url": "https://gateway.lighthouse.storage/ipfs/QmcYLMm3X9KVkozZJoVEJRoSHDXpfhwyQJpiPTZTEcNz8T",\n' + + '\t"model_file_hash": "49694d4077e0f007c8b49ed8a8a3a877f70dd6fbbb19ae230cba76b68451f7b0",\n' + + '\t"min_hardware": 1,\n' + + '\t"verifier_url": "",\n' + + '\t"verifier_file_hash": ""\n' + + '}' + +const name = 'DreamShaper';//`Model ${identifier}`; +const modelOwnerAddress = ''; +const metadata = '{\n' + + '\t"version": 1,\n' + + '\t"model_name": "DreamShaper",\n' + + '\t"model_type": "image",\n' + + '\t"model_url": "https://gateway.lighthouse.storage/ipfs/QmcYLMm3X9KVkozZJoVEJRoSHDXpfhwyQJpiPTZTEcNz8T",\n' + + '\t"model_file_hash": "49694d4077e0f007c8b49ed8a8a3a877f70dd6fbbb19ae230cba76b68451f7b0",\n' + + '\t"min_hardware": 1,\n' + + '\t"verifier_url": "",\n' + + '\t"verifier_file_hash": ""\n' + + '}' diff --git a/package.json b/package.json index aa817ef..343c126 100644 --- a/package.json +++ b/package.json @@ -13,19 +13,22 @@ "deployModelCollection:anvil": "npx hardhat run scripts/deployModelCollection.ts --network anvil", "deployWorkerHub:anvil": "npx hardhat run scripts/deployWorkerHub.ts --network anvil", "deployHybridModel:anvil": "npx hardhat run scripts/deployHybridModel.ts --network anvil", + "updateHybridModelMetadata:anvil": "npx hardhat run scripts/updateHybridModelMetadata.ts --network anvil", "console:regtest3": "npx hardhat console --network regtest3", "deployModelCollection:regtest3": "npx hardhat run scripts/deployModelCollection.ts --network regtest3", "deployWorkerHub:regtest3": "npx hardhat run scripts/deployWorkerHub.ts --network regtest3", "deployHybridModel:regtest3": "npx hardhat run scripts/deployHybridModel.ts --network regtest3", + "updateHybridModelMetadata:regtest3": "npx hardhat run scripts/updateHybridModelMetadata.ts --network regtest3", "console:cudatest": "npx hardhat console --network cudatest", "deployModelCollection:cudatest": "npx hardhat run scripts/deployModelCollection.ts --network cudatest", "deployWorkerHub:cudatest": "npx hardhat run scripts/deployWorkerHub.ts --network cudatest", "deployHybridModel:cudatest": "npx hardhat run scripts/deployHybridModel.ts --network cudatest", - "console:mainnet": "npx hardhat console --network cudatest", + "updateHybridModelMetadata:cudatest": "npx hardhat run scripts/updateHybridModelMetadata.ts --network cudatest", + "console:mainnet": "npx hardhat console --network mainnet", "deployModelCollection:mainnet": "npx hardhat run scripts/deployModelCollection.ts --network mainnet", "deployWorkerHub:mainnet": "npx hardhat run scripts/deployWorkerHub.ts --network mainnet", - "deployHybridModel:mainnet": "npx hardhat run scripts/deployHybridModel.ts --network mainnet" - + "deployHybridModel:mainnet": "npx hardhat run scripts/deployHybridModel.ts --network mainnet", + "updateHybridModelMetadata:mainnet": "npx hardhat run scripts/updateHybridModelMetadata.ts --network mainnet" }, "devDependencies": { "@ericxstone/hardhat-blockscout-verify": "^1.0.2", diff --git a/scripts/deployHybridModel.ts b/scripts/deployHybridModel.ts index d7bdda7..7898d7e 100644 --- a/scripts/deployHybridModel.ts +++ b/scripts/deployHybridModel.ts @@ -16,17 +16,17 @@ async function deployHybridModel() { const workerHubAddress = config.workerHubAddress; const identifier = 0; - const name = 'Max Multi';//`Model ${identifier}`; + const name = 'Fantasy Map';//`Model ${identifier}`; const modelOwnerAddress = '0x10919C7A907DAAFcBF581cf5aBBb877DD6675D77'; const metadata = '{\n' + '\t"version": 1,\n' + - '\t"model_name": "MaxMulti",\n' + + '\t"model_name": "FantasyMap",\n' + '\t"model_type": "image",\n' + - '\t"model_url": "https://gateway.lighthouse.storage/ipfs/QmcFYMYpVodkpT6t1fVmWNjPnUnnQbXvwpqyheXvPGKUr8",\n' + - '\t"model_file_hash": "7f1f29cb884c5b2f4d072b99afcb87f32cbe4adc88cffedab15ffc9fd30887ae",\n' + + '\t"model_url": "https://gateway.lighthouse.storage/ipfs/Qmaz3AgnZVH1DVqXdciac6G8FUnungDTkBXDo2Dx1FtXx5",\n' + + '\t"model_file_hash": "2c25f12639d4821f6bb04d853c36a383bd99234b1bb3bcd80e0ac6c98d34247d",\n' + '\t"min_hardware": 1,\n' + - '\t"verifier_url": "https://gateway.lighthouse.storage/ipfs/QmdkKEjx2fauzbPh1j5bUiQXrUG5Ft36pJGHS8awrN89Dc",\n' + - '\t"verifier_file_hash": "492b2b3dea3003d359fe1b2cee77a22777d8a9faf942ab6dee81e6bfadaadec4"\n' + + '\t"verifier_url": "",\n' + + '\t"verifier_file_hash": ""\n' + '}' const hybridModel = await upgrades.deployProxy( @@ -41,7 +41,7 @@ async function deployHybridModel() { await hybridModel.deployed(); const collection = ModelCollection.attach(config.collectionAddress); - await (await collection.mint( + const mintReceipt = await (await collection.mint( modelOwnerAddress, metadata, hybridModel.address @@ -51,6 +51,10 @@ async function deployHybridModel() { await workerHub.registerModel(hybridModel.address, 1, ethers.utils.parseEther('0.2')); console.log(`Contract HybridModel has been deployed to address ${hybridModel.address}`); + const newTokenEvent = mintReceipt.events?.find((event: ethers.Event) => event.event === 'NewToken'); + if (newTokenEvent) { + console.log("tokenId:", newTokenEvent.args?.tokenId); + } console.log(`${networkName}_HYBRID_MODEL_ADDRESS=${hybridModel.address}`); } diff --git a/scripts/updateHybridModelMetadata.ts b/scripts/updateHybridModelMetadata.ts new file mode 100644 index 0000000..577cb5d --- /dev/null +++ b/scripts/updateHybridModelMetadata.ts @@ -0,0 +1,44 @@ +import assert from 'assert'; +import { ethers, network, upgrades } from 'hardhat'; + +async function updateHybridModelMetadata() { + const config = network.config as any; + const networkName = network.name.toUpperCase(); + const HybridModel = await ethers.getContractFactory('HybridModel'); + const WorkerHub = await ethers.getContractFactory('WorkerHub'); + const ModelCollection = await ethers.getContractFactory('ModelCollection'); + + const collectionAddress = config.collectionAddress; + assert.ok( + collectionAddress, + `Missing ${networkName}_COLLECTION_ADDRESS from environment variables!` + ); + + const tokenId = 1000001; + const metadata = '{\n' + + '\t"version": 1,\n' + + '\t"model_name": "Max Multi",\n' + + '\t"model_type": "image",\n' + + '\t"model_url": "https://gateway.lighthouse.storage/ipfs/QmcFYMYpVodkpT6t1fVmWNjPnUnnQbXvwpqyheXvPGKUr8",\n' + + '\t"model_file_hash": "7f1f29cb884c5b2f4d072b99afcb87f32cbe4adc88cffedab15ffc9fd30887ae",\n' + + '\t"min_hardware": 1,\n' + + '\t"verifier_url": "https://gateway.lighthouse.storage/ipfs/QmdkKEjx2fauzbPh1j5bUiQXrUG5Ft36pJGHS8awrN89Dc",\n' + + '\t"verifier_file_hash": "492b2b3dea3003d359fe1b2cee77a22777d8a9faf942ab6dee81e6bfadaadec4"\n' + + '}' + + const collection = ModelCollection.attach(config.collectionAddress); + await (await collection.updateTokenURI(tokenId, metadata)).wait(); + console.log("TokenURI updated"); + + const modelAddress = await collection.modelAddressOf(tokenId); + const hybridModel = HybridModel.attach(modelAddress); + await (await hybridModel.updateMetadata(metadata)).wait(); + console.log("Hybrid model metadata updated"); +} + +updateHybridModelMetadata() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); From 1dfccb2f1639545a0e24299357ca9219ab27f48d Mon Sep 17 00:00:00 2001 From: 180945 <180945@trustless.computer> Date: Mon, 13 May 2024 18:30:53 +0700 Subject: [PATCH 53/82] added topup --- contracts/WorkerHub.sol | 10 ++++++++++ contracts/interfaces/IWorkerHub.sol | 8 ++++++++ 2 files changed, 18 insertions(+) diff --git a/contracts/WorkerHub.sol b/contracts/WorkerHub.sol index 506d441..fd8d80c 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -447,6 +447,16 @@ ReentrancyGuardUpgradeable { return inferenceId; } + function topUpInfer(uint256 _inferenceId) external payable whenNotPaused { + if (msg.value == 0) revert ZeroValue(); + + Inference storage inference = inferences[_inferenceId]; + if (inference.status != InferenceStatus.Solving) revert InferMustBeSolvingState(); + inference.value += msg.value; + + emit TopUpInfer(_inferenceId, inference.creator, inference.value); + } + function _assignMiners(uint256 _inferenceId) private { uint40 expiredAt = uint40(block.timestamp + miningTimeLimit); inferences[_inferenceId].expiredAt = expiredAt; diff --git a/contracts/interfaces/IWorkerHub.sol b/contracts/interfaces/IWorkerHub.sol index 5be0864..0715659 100644 --- a/contracts/interfaces/IWorkerHub.sol +++ b/contracts/interfaces/IWorkerHub.sol @@ -136,6 +136,12 @@ interface IWorkerHub is IInferable { uint256 protocolFee ); + event TopUpInfer( + uint256 indexed inferenceId, + address indexed creator, + uint256 value + ); + event MinerUnstake(address indexed miner, uint256 stake); event MinerJoin(address indexed miner); event ValidatorUnstake(address indexed validator, uint256 stake); @@ -168,4 +174,6 @@ interface IWorkerHub is IInferable { error ValidatingSessionNotEnded(); error MiningSessionEnded(); + error InferMustBeSolvingState(); + error ZeroValue(); } From 63c3a4bc31e36a9a1ebe7e6804e089fedc5b9dfc Mon Sep 17 00:00:00 2001 From: kochou-nbc Date: Tue, 14 May 2024 15:08:13 +0700 Subject: [PATCH 54/82] update NewInference events --- contracts/WorkerHub.sol | 2 +- contracts/interfaces/IWorkerHub.sol | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/contracts/WorkerHub.sol b/contracts/WorkerHub.sol index fd8d80c..60d82ca 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -440,7 +440,7 @@ ReentrancyGuardUpgradeable { inference.creator = _creator; inference.modelAddress = msg.sender; - emit NewInference(inferenceId, _creator, value); + emit NewInference(inferenceId, msg.sender, _creator, value); _assignMiners(inferenceId); diff --git a/contracts/interfaces/IWorkerHub.sol b/contracts/interfaces/IWorkerHub.sol index 0715659..e862174 100644 --- a/contracts/interfaces/IWorkerHub.sol +++ b/contracts/interfaces/IWorkerHub.sol @@ -116,6 +116,7 @@ interface IWorkerHub is IInferable { event NewInference( uint256 indexed inferenceId, + address indexed model, address indexed creator, uint256 value ); From 7dfb78ee14cd731db0211db4e70cada105e4f52f Mon Sep 17 00:00:00 2001 From: 180945 <180945@trustless.computer> Date: Tue, 14 May 2024 15:45:32 +0700 Subject: [PATCH 55/82] added unstake feature --- contracts/WorkerHub.sol | 28 ++++++++++++++++++++++++++++ contracts/interfaces/IWorkerHub.sol | 1 + 2 files changed, 29 insertions(+) diff --git a/contracts/WorkerHub.sol b/contracts/WorkerHub.sol index 60d82ca..36d1066 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -280,6 +280,7 @@ ReentrancyGuardUpgradeable { Worker storage miner = miners[msg.sender]; if (miner.tier == 0) revert NotRegistered(); + if (miner.stake < minerMinimumStake) revert StakeTooLow(); address modelAddress = miner.modelAddress; minerAddressesByModel[modelAddress].insert(msg.sender); @@ -342,6 +343,33 @@ ReentrancyGuardUpgradeable { emit MinerUnstake(msg.sender, stake); } + function restakeForMiner(uint16 tier) external { + _updateEpoch(); + + UnstakeRequest storage unstakeRequest = minerUnstakeRequests[msg.sender]; + if (unstakeRequest.stake == 0) revert ZeroValue(); + uint unstakeAmount = unstakeRequest.stake; + unstakeRequest.stake = 0; + + Worker storage miner = miners[msg.sender]; + if (miner.stake < minerMinimumStake) { + miner.lastClaimedEpoch = currentEpoch; + } + + miner.stake += unstakeAmount; + if (miner.tier == 0) { + if (tier == 0 || tier > maximumTier) revert InvalidTier(); + miner.tier = tier; + } + + if (miner.modelAddress == address(0)) { + address modelAddress = modelAddresses.values[randomizer.randomUint256() % modelAddresses.size()]; + miner.modelAddress = modelAddress; + } + + emit Restake(msg.sender, unstakeAmount, miner.modelAddress); + } + function registerValidator(uint16 tier) external payable whenNotPaused { _updateEpoch(); diff --git a/contracts/interfaces/IWorkerHub.sol b/contracts/interfaces/IWorkerHub.sol index e862174..f0813d4 100644 --- a/contracts/interfaces/IWorkerHub.sol +++ b/contracts/interfaces/IWorkerHub.sol @@ -154,6 +154,7 @@ interface IWorkerHub is IInferable { event RewardPerEpochBasedOnPerf(uint256 oldReward, uint256 newReward); event BlocksPerEpoch(uint256 oldBlocks, uint256 newBlocks); event UnstakeDelayTime(uint256 oldDelayTime, uint256 newDelayTime); + event Restake(address indexed miner, uint256 restake, address indexed model); error AlreadyRegistered(); error AlreadySubmitted(); From a1a4229b4833d1e3850d07a3ba15a61f17981a5d Mon Sep 17 00:00:00 2001 From: 180945 <180945@trustless.computer> Date: Tue, 14 May 2024 16:38:31 +0700 Subject: [PATCH 56/82] update logic condition --- contracts/WorkerHub.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/WorkerHub.sol b/contracts/WorkerHub.sol index 36d1066..3504b87 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -352,7 +352,7 @@ ReentrancyGuardUpgradeable { unstakeRequest.stake = 0; Worker storage miner = miners[msg.sender]; - if (miner.stake < minerMinimumStake) { + if (rewardToClaim(msg.sender) == 0) { miner.lastClaimedEpoch = currentEpoch; } From 612a14516ef9b667c593bb5bdf438e5c9bc49f06 Mon Sep 17 00:00:00 2001 From: 180945 <180945@trustless.computer> Date: Tue, 14 May 2024 17:31:58 +0700 Subject: [PATCH 57/82] fixed epoch reward --- contracts/WorkerHub.sol | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/contracts/WorkerHub.sol b/contracts/WorkerHub.sol index 3504b87..4ca2e47 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -267,7 +267,6 @@ ReentrancyGuardUpgradeable { miner.stake = msg.value; miner.tier = tier; - miner.lastClaimedEpoch = currentEpoch; address modelAddress = modelAddresses.values[randomizer.randomUint256() % modelAddresses.size()]; miner.modelAddress = modelAddress; @@ -284,8 +283,8 @@ ReentrancyGuardUpgradeable { address modelAddress = miner.modelAddress; minerAddressesByModel[modelAddress].insert(msg.sender); - minerAddresses.insert(msg.sender); + miner.lastClaimedEpoch = currentEpoch; emit MinerJoin(msg.sender); } @@ -352,10 +351,6 @@ ReentrancyGuardUpgradeable { unstakeRequest.stake = 0; Worker storage miner = miners[msg.sender]; - if (rewardToClaim(msg.sender) == 0) { - miner.lastClaimedEpoch = currentEpoch; - } - miner.stake += unstakeAmount; if (miner.tier == 0) { if (tier == 0 || tier > maximumTier) revert InvalidTier(); From 4b5834a97a4e8253a3f3eafcfb98b3b630eca583 Mon Sep 17 00:00:00 2001 From: rein-nbc Date: Tue, 14 May 2024 18:26:30 +0700 Subject: [PATCH 58/82] Update metadata. Add change tier --- .openzeppelin/unknown-43338.json | 163 +++++++++++++++++++++++++++ deploy_data/deploy_data.txt | 25 ++-- scripts/deployHybridModel.ts | 15 +-- scripts/updateHybridModelMetadata.ts | 18 ++- 4 files changed, 202 insertions(+), 19 deletions(-) diff --git a/.openzeppelin/unknown-43338.json b/.openzeppelin/unknown-43338.json index edb766e..2a7ee1b 100644 --- a/.openzeppelin/unknown-43338.json +++ b/.openzeppelin/unknown-43338.json @@ -14,6 +14,16 @@ "address": "0xB0e91e2Aa27330434Bfc33fF5314C796eD3Ad3c6", "txHash": "0x9ba204c9d0ce1c4005839950b5a6722ee3d1174c8684ae4eedad45d83ba9f792", "kind": "transparent" + }, + { + "address": "0xb641b7b99b1d03B629b65D0059E3cEE391B6D352", + "txHash": "0x00a2da96987006f6a30de0874ec21014fbc1f6306985fc0767c644deb4aa78fb", + "kind": "transparent" + }, + { + "address": "0x3a269D64057314E7D0E9F4164077FF57fBDb93f9", + "txHash": "0x0bc79a2406868146e9db662459fb90a80ddc2e51d0a8a2cb0ad5132e6796be60", + "kind": "transparent" } ], "impls": { @@ -2645,6 +2655,159 @@ }, "namespaces": {} } + }, + "1cc68a4b936075964a6e1e210ff8e3416c25bda0344074d86f45fb18126a65b8": { + "address": "0xa7b24497714E87FaFE9D5eD3472a98eB8C4a67FA", + "txHash": "0xd427c6f599a5d5d4cf5f4c3f7c497a4605aadcbcc243797e137e9aade3e50a9d", + "layout": { + "solcVersion": "0.8.19", + "storage": [ + { + "label": "identifier", + "offset": 0, + "slot": "0", + "type": "t_uint256", + "contract": "HybridModelStorage", + "src": "contracts/storages/HybridModelStorage.sol:7" + }, + { + "label": "name", + "offset": 0, + "slot": "1", + "type": "t_string_storage", + "contract": "HybridModelStorage", + "src": "contracts/storages/HybridModelStorage.sol:9" + }, + { + "label": "metadata", + "offset": 0, + "slot": "2", + "type": "t_string_storage", + "contract": "HybridModelStorage", + "src": "contracts/storages/HybridModelStorage.sol:10" + }, + { + "label": "workerHub", + "offset": 0, + "slot": "3", + "type": "t_address", + "contract": "HybridModelStorage", + "src": "contracts/storages/HybridModelStorage.sol:12" + }, + { + "label": "__gap", + "offset": 0, + "slot": "4", + "type": "t_array(t_uint256)50_storage", + "contract": "HybridModelStorage", + "src": "contracts/storages/HybridModelStorage.sol:14" + }, + { + "label": "_initialized", + "offset": 0, + "slot": "54", + "type": "t_uint8", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:63", + "retypedFrom": "bool" + }, + { + "label": "_initializing", + "offset": 1, + "slot": "54", + "type": "t_bool", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:68" + }, + { + "label": "__gap", + "offset": 0, + "slot": "55", + "type": "t_array(t_uint256)50_storage", + "contract": "ContextUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:40" + }, + { + "label": "_owner", + "offset": 0, + "slot": "105", + "type": "t_address", + "contract": "OwnableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:22" + }, + { + "label": "__gap", + "offset": 0, + "slot": "106", + "type": "t_array(t_uint256)49_storage", + "contract": "OwnableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:94" + }, + { + "label": "_paused", + "offset": 0, + "slot": "155", + "type": "t_bool", + "contract": "PausableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol:29" + }, + { + "label": "__gap", + "offset": 0, + "slot": "156", + "type": "t_array(t_uint256)49_storage", + "contract": "PausableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol:116" + }, + { + "label": "_status", + "offset": 0, + "slot": "205", + "type": "t_uint256", + "contract": "ReentrancyGuardUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol:38" + }, + { + "label": "__gap", + "offset": 0, + "slot": "206", + "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_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_string_storage": { + "label": "string", + "numberOfBytes": "32" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + }, + "namespaces": {} + } } } } diff --git a/deploy_data/deploy_data.txt b/deploy_data/deploy_data.txt index 19db630..b0b8b96 100644 --- a/deploy_data/deploy_data.txt +++ b/deploy_data/deploy_data.txt @@ -1,4 +1,5 @@ const name = 'Max Multi';//`Model ${identifier}`; +const minHardware = 1; const modelOwnerAddress = ''; const metadata = '{\n' + '\t"version": 1,\n' + @@ -12,6 +13,7 @@ const metadata = '{\n' + '}' const name = 'SDXL-Lightning';//`Model ${identifier}`; +const minHardware = 1; const modelOwnerAddress = '0x5D6429703D747805920D596E15427B08083e3D2c'; const metadata = '{\n' + '\t"version": 1,\n' + @@ -25,6 +27,7 @@ const metadata = '{\n' + '}' const name = 'Fantasy Map';//`Model ${identifier}`; +const minHardware = 1; const modelOwnerAddress = '0x10919C7A907DAAFcBF581cf5aBBb877DD6675D77'; const metadata = '{\n' + '\t"version": 1,\n' + @@ -37,27 +40,29 @@ const metadata = '{\n' + '\t"verifier_file_hash": ""\n' + '}' -const name = 'Animated Concept - SDXL LoRA';//`Model ${identifier}`; -const modelOwnerAddress = ''; +const name = 'DreamShaper XL';//`Model ${identifier}`; +const minHardware = 1; +const modelOwnerAddress = '0x71E73197b9868f7aE530Cb3b12B04e31f521525F'; const metadata = '{\n' + '\t"version": 1,\n' + - '\t"model_name": "Animated Concept - SDXL LoRA",\n' + + '\t"model_name": "DreamShaper XL",\n' + '\t"model_type": "image",\n' + - '\t"model_url": "https://gateway.lighthouse.storage/ipfs/QmcYLMm3X9KVkozZJoVEJRoSHDXpfhwyQJpiPTZTEcNz8T",\n' + - '\t"model_file_hash": "49694d4077e0f007c8b49ed8a8a3a877f70dd6fbbb19ae230cba76b68451f7b0",\n' + + '\t"model_url": "https://gateway.lighthouse.storage/ipfs/QmfKxyFbvTEF3XyyeYzEq7ysUqTJbVM5QxGYbEts8AJjRX",\n' + + '\t"model_file_hash": "2ee8c8d423f5ad46034359f5d04825a44018a93689a4fd88ce7ec3287f1e7cf4",\n' + '\t"min_hardware": 1,\n' + '\t"verifier_url": "",\n' + '\t"verifier_file_hash": ""\n' + '}' -const name = 'DreamShaper';//`Model ${identifier}`; -const modelOwnerAddress = ''; +const name = 'Animated Concept - SDXL LoRA';//`Model ${identifier}`; +const minHardware = 1; +const modelOwnerAddress = '0xBb380912A2E0c83628935f98a5a1b08b8588Ae76'; const metadata = '{\n' + '\t"version": 1,\n' + - '\t"model_name": "DreamShaper",\n' + + '\t"model_name": "Animated Concept - SDXL LoRA",\n' + '\t"model_type": "image",\n' + - '\t"model_url": "https://gateway.lighthouse.storage/ipfs/QmcYLMm3X9KVkozZJoVEJRoSHDXpfhwyQJpiPTZTEcNz8T",\n' + - '\t"model_file_hash": "49694d4077e0f007c8b49ed8a8a3a877f70dd6fbbb19ae230cba76b68451f7b0",\n' + + '\t"model_url": "https://gateway.lighthouse.storage/ipfs/QmaG6DJstjfgVuBRDi6Ma66o9SMaReMse1S75nDDwwErM3",\n' + + '\t"model_file_hash": "dc881c939ff3078b59d9bf2a6fc83db2caf7b0780ee563d3a6fc09ea5a1b35a1",\n' + '\t"min_hardware": 1,\n' + '\t"verifier_url": "",\n' + '\t"verifier_file_hash": ""\n' + diff --git a/scripts/deployHybridModel.ts b/scripts/deployHybridModel.ts index 7898d7e..c6d8b0a 100644 --- a/scripts/deployHybridModel.ts +++ b/scripts/deployHybridModel.ts @@ -16,18 +16,19 @@ async function deployHybridModel() { const workerHubAddress = config.workerHubAddress; const identifier = 0; - const name = 'Fantasy Map';//`Model ${identifier}`; - const modelOwnerAddress = '0x10919C7A907DAAFcBF581cf5aBBb877DD6675D77'; + const name = 'Animated Concept - SDXL LoRA';//`Model ${identifier}`; + const minHardware = 1; + const modelOwnerAddress = '0xBb380912A2E0c83628935f98a5a1b08b8588Ae76'; const metadata = '{\n' + '\t"version": 1,\n' + - '\t"model_name": "FantasyMap",\n' + + '\t"model_name": "Animated Concept - SDXL LoRA",\n' + '\t"model_type": "image",\n' + - '\t"model_url": "https://gateway.lighthouse.storage/ipfs/Qmaz3AgnZVH1DVqXdciac6G8FUnungDTkBXDo2Dx1FtXx5",\n' + - '\t"model_file_hash": "2c25f12639d4821f6bb04d853c36a383bd99234b1bb3bcd80e0ac6c98d34247d",\n' + + '\t"model_url": "https://gateway.lighthouse.storage/ipfs/QmaG6DJstjfgVuBRDi6Ma66o9SMaReMse1S75nDDwwErM3",\n' + + '\t"model_file_hash": "dc881c939ff3078b59d9bf2a6fc83db2caf7b0780ee563d3a6fc09ea5a1b35a1",\n' + '\t"min_hardware": 1,\n' + '\t"verifier_url": "",\n' + '\t"verifier_file_hash": ""\n' + - '}' + '}' const hybridModel = await upgrades.deployProxy( HybridModel, @@ -48,7 +49,7 @@ async function deployHybridModel() { )).wait(); const workerHub = WorkerHub.attach(workerHubAddress); - await workerHub.registerModel(hybridModel.address, 1, ethers.utils.parseEther('0.2')); + await workerHub.registerModel(hybridModel.address, minHardware, ethers.utils.parseEther('0.2')); console.log(`Contract HybridModel has been deployed to address ${hybridModel.address}`); const newTokenEvent = mintReceipt.events?.find((event: ethers.Event) => event.event === 'NewToken'); diff --git a/scripts/updateHybridModelMetadata.ts b/scripts/updateHybridModelMetadata.ts index 577cb5d..1cdf388 100644 --- a/scripts/updateHybridModelMetadata.ts +++ b/scripts/updateHybridModelMetadata.ts @@ -14,14 +14,21 @@ async function updateHybridModelMetadata() { `Missing ${networkName}_COLLECTION_ADDRESS from environment variables!` ); + const workerHubAddress = config.workerHubAddress; + assert.ok( + workerHubAddress, + `Missing ${networkName}_WORKERHUB_ADDRESS from environment variables!` + ); + const tokenId = 1000001; + const minHardware = 1; const metadata = '{\n' + '\t"version": 1,\n' + '\t"model_name": "Max Multi",\n' + '\t"model_type": "image",\n' + '\t"model_url": "https://gateway.lighthouse.storage/ipfs/QmcFYMYpVodkpT6t1fVmWNjPnUnnQbXvwpqyheXvPGKUr8",\n' + '\t"model_file_hash": "7f1f29cb884c5b2f4d072b99afcb87f32cbe4adc88cffedab15ffc9fd30887ae",\n' + - '\t"min_hardware": 1,\n' + + `\t"min_hardware": ${minHardware},\n` + '\t"verifier_url": "https://gateway.lighthouse.storage/ipfs/QmdkKEjx2fauzbPh1j5bUiQXrUG5Ft36pJGHS8awrN89Dc",\n' + '\t"verifier_file_hash": "492b2b3dea3003d359fe1b2cee77a22777d8a9faf942ab6dee81e6bfadaadec4"\n' + '}' @@ -33,7 +40,14 @@ async function updateHybridModelMetadata() { const modelAddress = await collection.modelAddressOf(tokenId); const hybridModel = HybridModel.attach(modelAddress); await (await hybridModel.updateMetadata(metadata)).wait(); - console.log("Hybrid model metadata updated"); + console.log("Hybrid model metadata updated"); + + const workerHub = WorkerHub.attach(workerHubAddress); + const currentTier = (await workerHub.models(modelAddress)).tier; + if (currentTier !== minHardware) { + await (await workerHub.updateModelTier(modelAddress, minHardware)).wait(); + console.log(`Model tier updated (old=${currentTier}, new=${minHardware})`); + } } updateHybridModelMetadata() From 26b388028724e6987a38d72041fc0a020e7993d9 Mon Sep 17 00:00:00 2001 From: 180945 <180945@trustless.computer> Date: Wed, 15 May 2024 11:26:51 +0700 Subject: [PATCH 59/82] 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 4ca2e47..fe0be8b 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -512,6 +512,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 @@ -525,7 +526,6 @@ ReentrancyGuardUpgradeable { rewardInEpoch[currentEpoch].epochReward = equalReward; currentEpoch++; } - lastBlock = block.number; } } else { lastBlock = block.number; From 7edbdc1794698628741dbcb7820fc95712e79da0 Mon Sep 17 00:00:00 2001 From: kochou-nbc Date: Wed, 15 May 2024 15:21:29 +0700 Subject: [PATCH 60/82] 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 fe0be8b..4ccf270 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; } @@ -626,14 +631,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 f0813d4..7955a35 100644 --- a/contracts/interfaces/IWorkerHub.sol +++ b/contracts/interfaces/IWorkerHub.sol @@ -89,6 +89,8 @@ interface IWorkerHub is IInferable { uint40 unlockAt; } + event MiningTimeLimitUpdate(uint40 newValue); + event ModelRegistration( address indexed model, uint16 indexed tier, From 8e8ca2bc8a0e31093645c98451e89f7cb6271780 Mon Sep 17 00:00:00 2001 From: 180945 <180945@trustless.computer> Date: Thu, 16 May 2024 17:56:09 +0700 Subject: [PATCH 61/82] remove perf reward --- contracts/WorkerHub.sol | 17 ++------- tests/Test.t.sol | 80 +++++++++++++++-------------------------- 2 files changed, 30 insertions(+), 67 deletions(-) diff --git a/contracts/WorkerHub.sol b/contracts/WorkerHub.sol index 4ccf270..79e067f 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -522,13 +522,10 @@ ReentrancyGuardUpgradeable { // rewardPerEpoch (reward one year for 1 miner) // rewardPerEpoch * total miner * blocker per epoch / blocks per year uint256 rewardInCurrentEpoch = rewardPerEpoch * minerAddresses.size() * blocksPerEpoch / BLOCK_PER_YEAR; - uint256 perfReward = rewardInCurrentEpoch * rewardPerEpochBasedOnPerf / PERCENTAGE_DENOMINATOR; - uint256 equalReward = rewardInCurrentEpoch - perfReward; for (; epochPassed > 0; epochPassed--) { rewardInEpoch[currentEpoch].totalMiner = minerAddresses.size(); - rewardInEpoch[currentEpoch].perfReward = perfReward; - rewardInEpoch[currentEpoch].epochReward = equalReward; + rewardInEpoch[currentEpoch].epochReward = rewardInCurrentEpoch; currentEpoch++; } } @@ -571,10 +568,6 @@ ReentrancyGuardUpgradeable { inference.assignments.push(_assigmentId); if (inference.assignments.length == 1) { - uint256 curEpoch = currentEpoch; - minerTaskCompleted[_msgSender][curEpoch] += 1; - rewardInEpoch[curEpoch].totalTaskCompleted += 1; - uint256 fee = clonedInference.value * feePercentage / PERCENTAGE_DENOMINATOR; uint256 value = clonedInference.value - fee; TransferHelper.safeTransferNative(treasury, fee); @@ -666,18 +659,12 @@ ReentrancyGuardUpgradeable { totalReward = 0; } else { uint256 lastClaimed = uint256(miners[_miner].lastClaimedEpoch); - uint256 perfReward; uint256 epochReward; uint256 currentMiner; for (; lastClaimed < lastEpoch; lastClaimed++) { MinerEpochState memory state = rewardInEpoch[lastClaimed]; - uint256 totalTaskCompleted = state.totalTaskCompleted; // reward at epoch - (perfReward, epochReward, currentMiner) = (state.perfReward, state.epochReward, state.totalMiner); - if (totalTaskCompleted > 0 && perfReward > 0) { - totalReward += perfReward * minerTaskCompleted[_miner][lastClaimed] / totalTaskCompleted; - } - + (epochReward, currentMiner) = (state.epochReward, state.totalMiner); if (currentMiner > 0 && epochReward > 0) { totalReward += epochReward / currentMiner; } diff --git a/tests/Test.t.sol b/tests/Test.t.sol index 43fde9a..0c8c8ff 100644 --- a/tests/Test.t.sol +++ b/tests/Test.t.sol @@ -4,24 +4,8 @@ pragma solidity ^0.8.0; import "forge-std/Test.sol"; import "../contracts/WorkerHub.sol"; -contract Mockup is WorkerHub { - - function setMinerTaskCompleteInEpoch(address miner, uint epoch, uint totalCompleted) public { - _updateEpoch(); - - minerTaskCompleted[miner][epoch] = totalCompleted; - } - - function setTotalTaskCompleteInEpoch(uint epoch, uint totalCompleted) public { - _updateEpoch(); - - rewardInEpoch[epoch].totalTaskCompleted = totalCompleted; - } - -} - contract WorkHubTest is Test { - Mockup workerHub; + WorkerHub workerHub; address public constant ADMIN_ADDR = address(10); address public constant Miner1 = address(101); address public constant Miner2 = address(102); @@ -30,7 +14,7 @@ contract WorkHubTest is Test { function setUp() public { - workerHub = new Mockup(); + workerHub = new WorkerHub(); vm.startPrank(ADMIN_ADDR); workerHub.initialize( @@ -88,41 +72,33 @@ contract WorkHubTest is Test { vm.roll(31); workerHub.rewardToClaim(ADMIN_ADDR); ( pefReward, epochReward, totalTaskCompleted, totalMiner) = workerHub.rewardInEpoch(1); - assertEq(pefReward, 21061592465753424); - assertEq(epochReward, 2340176940639270); + assertEq(pefReward, 0); + assertEq(epochReward, 23401769406392694); ( pefReward, epochReward, totalTaskCompleted, totalMiner) = workerHub.rewardInEpoch(2); - assertEq(pefReward, 21061592465753424); - assertEq(epochReward, 2340176940639270); + assertEq(pefReward, 0); + assertEq(epochReward, 23401769406392694); - assertEq(workerHub.rewardToClaim(Miner1), 1560117960426180); - assertEq(workerHub.rewardToClaim(Miner2), 1560117960426180); - assertEq(workerHub.rewardToClaim(Miner3), 1560117960426180); + assertEq(workerHub.rewardToClaim(Miner1), 15601179604261796); + assertEq(workerHub.rewardToClaim(Miner2), 15601179604261796); + assertEq(workerHub.rewardToClaim(Miner3), 15601179604261796); // setup task totalTaskCompleted // epoch 1 - workerHub.setMinerTaskCompleteInEpoch(Miner1, 1, 6); - workerHub.setMinerTaskCompleteInEpoch(Miner2, 1, 1); - workerHub.setMinerTaskCompleteInEpoch(Miner3, 1, 3); - workerHub.setTotalTaskCompleteInEpoch(1, 10); (pefReward, epochReward, totalTaskCompleted, totalMiner) = workerHub.rewardInEpoch(1); - assertEq(pefReward, 21061592465753424); - assertEq(totalTaskCompleted, 10); + assertEq(pefReward, 0); + // assertEq(totalTaskCompleted, 10); // epoch 2 - workerHub.setMinerTaskCompleteInEpoch(Miner1, 2, 3); - workerHub.setMinerTaskCompleteInEpoch(Miner2, 2, 0); - workerHub.setMinerTaskCompleteInEpoch(Miner3, 2, 7); - workerHub.setTotalTaskCompleteInEpoch(2, 10); (pefReward, epochReward, totalTaskCompleted, totalMiner) = workerHub.rewardInEpoch(2); - assertEq(pefReward, 21061592465753424); - assertEq(totalTaskCompleted, 10); + assertEq(pefReward, 0); + assertEq(totalTaskCompleted, 0); - assertEq(workerHub.rewardToClaim(Miner1), 20515551179604261); - assertEq(workerHub.rewardToClaim(Miner2), 3666277207001522); - assertEq(workerHub.rewardToClaim(Miner3), 22621710426179603); + assertEq(workerHub.rewardToClaim(Miner1), 15601179604261796); + assertEq(workerHub.rewardToClaim(Miner2), 15601179604261796); + assertEq(workerHub.rewardToClaim(Miner3), 15601179604261796); vm.deal(address(workerHub), address(workerHub).balance + 2e18); // claim reward @@ -130,9 +106,9 @@ contract WorkHubTest is Test { workerHub.claimReward(Miner2); workerHub.claimReward(Miner3); - assertEq(Miner1.balance, 20515551179604261 + 1e18); - assertEq(Miner2.balance, 3666277207001522 + 1e18); - assertEq(Miner3.balance, 22621710426179603 + 1e18); + assertEq(Miner1.balance, 15601179604261796 + 1e18); + assertEq(Miner2.balance, 15601179604261796 + 1e18); + assertEq(Miner3.balance, 15601179604261796 + 1e18); assertEq(workerHub.rewardToClaim(Miner1), 0); assertEq(workerHub.rewardToClaim(Miner2), 0); @@ -142,40 +118,40 @@ contract WorkHubTest is Test { workerHub.claimReward(Miner2); workerHub.claimReward(Miner3); - assertEq(Miner1.balance, 20515551179604261 + 1e18); - assertEq(Miner2.balance, 3666277207001522 + 1e18); - assertEq(Miner3.balance, 22621710426179603 + 1e18); + assertEq(Miner1.balance, 15601179604261796 + 1e18); + assertEq(Miner2.balance, 15601179604261796 + 1e18); + assertEq(Miner3.balance, 15601179604261796 + 1e18); // test miner request unstake vm.startPrank(Miner1); workerHub.unregisterMiner(); vm.warp(block.timestamp + 21 days); workerHub.unstakeForMiner(); - assertEq(Miner1.balance, 2020515551179604261); + assertEq(Miner1.balance, 15601179604261796 + 2e18); vm.roll(51); assertEq(workerHub.rewardToClaim(Miner1), 0); workerHub.claimReward(Miner1); - assertEq(Miner1.balance, 2020515551179604261); + assertEq(Miner1.balance, 15601179604261796 + 2e18); workerHub.registerMiner{value: 1e18}(1); assertEq(workerHub.rewardToClaim(Miner1), 0); workerHub.claimReward(Miner1); - assertEq(Miner1.balance, 2020515551179604261 - 1e18); + assertEq(Miner1.balance, 15601179604261796 + 2e18 - 1e18); workerHub.unregisterMiner(); vm.warp(block.timestamp + 21 days); workerHub.unstakeForMiner(); assertEq(workerHub.rewardToClaim(Miner1), 0); workerHub.claimReward(Miner1); - assertEq(Miner1.balance, 2020515551179604261); + assertEq(Miner1.balance, 15601179604261796 + 2e18); workerHub.registerMiner{value: 1e18}(1); vm.roll(55); assertEq(workerHub.rewardToClaim(Miner1), 0); workerHub.claimReward(Miner1); - assertEq(Miner1.balance, 2020515551179604261 - 1e18); + assertEq(Miner1.balance, 15601179604261796 + 2e18 - 1e18); vm.roll(61); assertEq(workerHub.rewardToClaim(Miner1), 0); workerHub.claimReward(Miner1); - assertEq(Miner1.balance, 2020515551179604261 - 1e18); + assertEq(Miner1.balance, 15601179604261796 + 2e18 - 1e18); assertEq(workerHub.rewardToClaim(Miner1), 0); vm.stopPrank(); } From 04c98c8c08baecfa33c4db19d1c7ca2bc7158668 Mon Sep 17 00:00:00 2001 From: 180945 <180945@trustless.computer> Date: Thu, 16 May 2024 17:59:09 +0700 Subject: [PATCH 62/82] remove setter and event --- contracts/WorkerHub.sol | 9 +-------- contracts/interfaces/IWorkerHub.sol | 1 - 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/contracts/WorkerHub.sol b/contracts/WorkerHub.sol index 79e067f..bfccda3 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -623,15 +623,8 @@ ReentrancyGuardUpgradeable { rewardPerEpoch = _newRewardAmount; } - function setNewRewardInEpochBasedOnPerf(uint256 _newRewardAmount) public virtual onlyOwner { - // _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 7955a35..6174745 100644 --- a/contracts/interfaces/IWorkerHub.sol +++ b/contracts/interfaces/IWorkerHub.sol @@ -153,7 +153,6 @@ interface IWorkerHub is IInferable { event RewardClaim(address indexed worker, uint256 value); event RewardPerEpoch(uint256 oldReward, uint256 newReward); - event RewardPerEpochBasedOnPerf(uint256 oldReward, uint256 newReward); event BlocksPerEpoch(uint256 oldBlocks, uint256 newBlocks); event UnstakeDelayTime(uint256 oldDelayTime, uint256 newDelayTime); event Restake(address indexed miner, uint256 restake, address indexed model); From e8ba57479bc3c90520c73f32decf699e9a3690e7 Mon Sep 17 00:00:00 2001 From: kelvin2608 <2608@newbitcoincity.com> Date: Fri, 17 May 2024 10:38:19 +0700 Subject: [PATCH 63/82] Implement function to manually deactivate and slash worker --- contracts/WorkerHub.sol | 112 ++++++++++++++++++++++- contracts/interfaces/IWorkerHub.sol | 10 +++ contracts/storages/WorkerHubStorage.sol | 3 + scripts/deployWorkerHub.ts | 114 ++++++++++++------------ 4 files changed, 182 insertions(+), 57 deletions(-) diff --git a/contracts/WorkerHub.sol b/contracts/WorkerHub.sol index bfccda3..41bc858 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -36,7 +36,9 @@ ReentrancyGuardUpgradeable { uint256 _blocksPerEpoch, uint256 _rewardPerEpochBasedOnPerf, uint256 _rewardPerEpoch, - uint40 _unstakeDelayTime + uint40 _unstakeDelayTime, + uint40 _penaltyDuration, + uint16 _finePercentage ) external initializer { __Ownable_init(); __Pausable_init(); @@ -54,6 +56,8 @@ ReentrancyGuardUpgradeable { unstakeDelayTime = _unstakeDelayTime; maximumTier = 1; lastBlock = block.number; + penaltyDuration = _penaltyDuration; + finePercentage = _finePercentage; } function version() external pure returns (string memory) { @@ -285,6 +289,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 MinerInDeactivationTime(); address modelAddress = miner.modelAddress; minerAddressesByModel[modelAddress].insert(msg.sender); @@ -395,6 +400,7 @@ ReentrancyGuardUpgradeable { Worker storage validator = miners[msg.sender]; if (validator.tier == 0) revert NotRegistered(); + if (block.timestamp < validator.activeTime) revert ValidatorInDeactivationTime(); address modelAddress = validator.modelAddress; validatorAddressesByModel[modelAddress].insert(msg.sender); @@ -589,6 +595,110 @@ ReentrancyGuardUpgradeable { // TODO } + function deactivateValidator(address _validator) public virtual onlyOwner { + if (_validator == address(0)) revert InvalidValidator(); + + _deactivateValidator(_validator); + } + + function deactivateMiner(address _miner) public virtual onlyOwner { + if (_miner == address(0)) revert InvalidMiner(); + + _deactivateMiner(_miner); + } + + function _deactivateValidator(address _validator) internal { + Worker storage validator = validators[_validator]; + + if (!validatorAddresses.hasValue(_validator)) revert InvalidValidator(); + + address modelAddress = validator.modelAddress; + + // Double check hasValue + if (validatorAddressesByModel[modelAddress].hasValue(_validator)) { + validatorAddressesByModel[modelAddress].erase(_validator); + validatorAddresses.erase(_validator); + } + + 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) public virtual onlyOwner { + if (_validator == address(0)) revert InvalidValidator(); + + _slashValidator(_validator); + } + + function slashMiner(address _miner) public virtual onlyOwner { + if (_miner == address(0)) revert InvalidMiner(); + + _slashMiner(_miner); + } + + function _slashValidator(address _validator) internal { + Worker storage validator = validators[_validator]; + + if (!validatorAddresses.hasValue(_validator)) revert InvalidValidator(); + + address modelAddress = validator.modelAddress; + + if (validatorAddressesByModel[modelAddress].hasValue(_validator)) { + validatorAddressesByModel[modelAddress].erase(_validator); + validatorAddresses.erase(_validator); + } + + validator.activeTime = uint40(block.timestamp + penaltyDuration); + uint256 fine = validator.stake * finePercentage / PERCENTAGE_DENOMINATOR; + validator.stake -= fine; + + TransferHelper.safeTransferNative(treasury, 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 + penaltyDuration); + uint256 fine = miner.stake * finePercentage / PERCENTAGE_DENOMINATOR; // Fine = stake * 5% + miner.stake -= fine; + + TransferHelper.safeTransferNative(treasury, fine); + + emit FraudulentMinerPenalized(_miner, modelAddress, treasury, fine); + } + function resolveInference(uint256 _inferenceId) public virtual { _updateEpoch(); diff --git a/contracts/interfaces/IWorkerHub.sol b/contracts/interfaces/IWorkerHub.sol index 6174745..48fcc47 100644 --- a/contracts/interfaces/IWorkerHub.sol +++ b/contracts/interfaces/IWorkerHub.sol @@ -157,6 +157,11 @@ 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, 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); + error AlreadyRegistered(); error AlreadySubmitted(); error NotRegistered(); @@ -179,4 +184,9 @@ interface IWorkerHub is IInferable { error InferMustBeSolvingState(); error ZeroValue(); + error InvalidValidator(); + error InvalidMiner(); + + error MinerInDeactivationTime(); + error ValidatorInDeactivationTime(); } diff --git a/contracts/storages/WorkerHubStorage.sol b/contracts/storages/WorkerHubStorage.sol index 6bca021..0a748a3 100644 --- a/contracts/storages/WorkerHubStorage.sol +++ b/contracts/storages/WorkerHubStorage.sol @@ -63,5 +63,8 @@ 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 finePercentage; + uint256[100] private __gap; } diff --git a/scripts/deployWorkerHub.ts b/scripts/deployWorkerHub.ts index dd901a2..290fdc1 100644 --- a/scripts/deployWorkerHub.ts +++ b/scripts/deployWorkerHub.ts @@ -1,64 +1,66 @@ -import assert from 'assert'; -import { ethers, network, upgrades } from 'hardhat'; +import assert from "assert"; +import { ethers, network, upgrades } from "hardhat"; async function deployWorkerHub() { - const config = network.config as any; - const networkName = network.name.toUpperCase(); - const WorkerHub = await ethers.getContractFactory('WorkerHub'); - const workerHubAddress = config.workerHubAddress ? - await (async () => { - await upgrades.upgradeProxy( - config.workerHubAddress, - WorkerHub, - ); - console.log(`Contract WorkerHub has been updated to address ${config.workerHubAddress}`); - return config.workerHubAddress; - })() : - await (async () => { - const treasuryAddress = '0x451064E5B968858cD54f227Dba7b7F419eAC5BA9'; - const feePercentage = 10_00; - const minerMinimumStake = ethers.utils.parseEther("25000"); - const validatorMinimumStake = ethers.utils.parseEther("40000"); - const miningTimeLimit = 10 * 60; - const minerRequirement = 3; - const blockPerEpoch = 600; - const rewardPerEpochBasedOnPerf = ethers.utils.parseEther("0"); - const rewardPerEpoch = ethers.utils.parseEther('0'); - const unstakeDelayTime = 21 * 24 * 3600; + const config = network.config as any; + const networkName = network.name.toUpperCase(); + const WorkerHub = await ethers.getContractFactory("WorkerHub"); + const workerHubAddress = config.workerHubAddress + ? await (async () => { + await upgrades.upgradeProxy(config.workerHubAddress, WorkerHub); + console.log( + `Contract WorkerHub has been updated to address ${config.workerHubAddress}` + ); + return config.workerHubAddress; + })() + : await (async () => { + const treasuryAddress = "0x451064E5B968858cD54f227Dba7b7F419eAC5BA9"; + const feePercentage = 10_00; + const minerMinimumStake = ethers.utils.parseEther("25000"); + const validatorMinimumStake = ethers.utils.parseEther("40000"); + const miningTimeLimit = 10 * 60; + const minerRequirement = 3; + const blockPerEpoch = 600; + const rewardPerEpochBasedOnPerf = ethers.utils.parseEther("0"); + const rewardPerEpoch = ethers.utils.parseEther("0"); + const unstakeDelayTime = 21 * 24 * 3600; + const penaltyDuration = 3600; + const finePercentage = 5_00; - const workerHub = await upgrades.deployProxy( - WorkerHub, - [ - treasuryAddress, - feePercentage, - minerMinimumStake, - validatorMinimumStake, - miningTimeLimit, - minerRequirement, - blockPerEpoch, - rewardPerEpochBasedOnPerf, - rewardPerEpoch, - unstakeDelayTime - ] - ); - await workerHub.deployed(); + const workerHub = await upgrades.deployProxy(WorkerHub, [ + treasuryAddress, + feePercentage, + minerMinimumStake, + validatorMinimumStake, + miningTimeLimit, + minerRequirement, + blockPerEpoch, + rewardPerEpochBasedOnPerf, + rewardPerEpoch, + unstakeDelayTime, + penaltyDuration, + finePercentage, + ]); + await workerHub.deployed(); - // const tx = { - // to: workerHub.address, - // value: ethers.utils.parseEther('1000') - // } - // - // await (await ethers.getSigners())[0].sendTransaction(tx); + // const tx = { + // to: workerHub.address, + // value: ethers.utils.parseEther('1000') + // } + // + // await (await ethers.getSigners())[0].sendTransaction(tx); - console.log(`Contract WorkerHub has been deployed to address ${workerHub.address}`); - return workerHub.address; - })(); - console.log(`${networkName}_WORKER_HUB_ADDRESS=${workerHubAddress}`); + console.log( + `Contract WorkerHub has been deployed to address ${workerHub.address}` + ); + return workerHub.address; + })(); + console.log(`${networkName}_WORKER_HUB_ADDRESS=${workerHubAddress}`); } deployWorkerHub() - .then(() => process.exit(0)) - .catch((error) => { - console.error(error); - process.exit(1); - }); + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); From b5f64a80ae05e81a8f998a57820ae9a7da068db0 Mon Sep 17 00:00:00 2001 From: kelvin2608 <2608@newbitcoincity.com> Date: Fri, 17 May 2024 10:49:21 +0700 Subject: [PATCH 64/82] Update code to reduce contract size --- contracts/WorkerHub.sol | 51 ----------------------------------------- 1 file changed, 51 deletions(-) diff --git a/contracts/WorkerHub.sol b/contracts/WorkerHub.sol index 41bc858..e041d7d 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -595,36 +595,12 @@ ReentrancyGuardUpgradeable { // TODO } - function deactivateValidator(address _validator) public virtual onlyOwner { - if (_validator == address(0)) revert InvalidValidator(); - - _deactivateValidator(_validator); - } - function deactivateMiner(address _miner) public virtual onlyOwner { if (_miner == address(0)) revert InvalidMiner(); _deactivateMiner(_miner); } - function _deactivateValidator(address _validator) internal { - Worker storage validator = validators[_validator]; - - if (!validatorAddresses.hasValue(_validator)) revert InvalidValidator(); - - address modelAddress = validator.modelAddress; - - // Double check hasValue - if (validatorAddressesByModel[modelAddress].hasValue(_validator)) { - validatorAddressesByModel[modelAddress].erase(_validator); - validatorAddresses.erase(_validator); - } - - validator.activeTime = uint40(block.timestamp + penaltyDuration); - - emit ValidatorDeactivated(_validator, modelAddress, validator.activeTime); - } - function _deactivateMiner(address _miner) internal { Worker storage miner = miners[_miner]; @@ -643,39 +619,12 @@ ReentrancyGuardUpgradeable { emit MinerDeactivated(_miner, modelAddress, miner.activeTime); } - function slashValidator(address _validator) public virtual onlyOwner { - if (_validator == address(0)) revert InvalidValidator(); - - _slashValidator(_validator); - } - function slashMiner(address _miner) public virtual onlyOwner { if (_miner == address(0)) revert InvalidMiner(); _slashMiner(_miner); } - function _slashValidator(address _validator) internal { - Worker storage validator = validators[_validator]; - - if (!validatorAddresses.hasValue(_validator)) revert InvalidValidator(); - - address modelAddress = validator.modelAddress; - - if (validatorAddressesByModel[modelAddress].hasValue(_validator)) { - validatorAddressesByModel[modelAddress].erase(_validator); - validatorAddresses.erase(_validator); - } - - validator.activeTime = uint40(block.timestamp + penaltyDuration); - uint256 fine = validator.stake * finePercentage / PERCENTAGE_DENOMINATOR; - validator.stake -= fine; - - TransferHelper.safeTransferNative(treasury, fine); - - emit FraudulentValidatorPenalized(_validator, modelAddress, treasury, fine); - } - function _slashMiner(address _miner) internal { Worker storage miner = miners[_miner]; From 6c6cb23db65f8d30061eb3c7a6bf7cac10cdcf06 Mon Sep 17 00:00:00 2001 From: kelvin2608 <2608@newbitcoincity.com> Date: Fri, 17 May 2024 10:49:21 +0700 Subject: [PATCH 65/82] Update code to reduce contract size --- contracts/storages/WorkerHubStorage.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/storages/WorkerHubStorage.sol b/contracts/storages/WorkerHubStorage.sol index 0a748a3..3597372 100644 --- a/contracts/storages/WorkerHubStorage.sol +++ b/contracts/storages/WorkerHubStorage.sol @@ -66,5 +66,5 @@ abstract contract WorkerHubStorage is IWorkerHub { // Tx Fee uint16 public finePercentage; - uint256[100] private __gap; + uint256[99] private __gap; } From f1fecebc8abd705da1a1e39e786ec18994c6662f Mon Sep 17 00:00:00 2001 From: kelvin2608 <2608@newbitcoincity.com> Date: Fri, 17 May 2024 11:56:10 +0700 Subject: [PATCH 66/82] Refactor code related to slashing function --- contracts/WorkerHub.sol | 50 ++++++++++++++--------------- contracts/interfaces/IWorkerHub.sol | 4 +-- 2 files changed, 27 insertions(+), 27 deletions(-) diff --git a/contracts/WorkerHub.sol b/contracts/WorkerHub.sol index e041d7d..c1e0e4d 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -595,57 +595,57 @@ ReentrancyGuardUpgradeable { // TODO } - function deactivateMiner(address _miner) public virtual onlyOwner { + function slashMiner(address _miner, bool _isFined) public virtual onlyOwner { + _updateEpoch(); + if (_miner == address(0)) revert InvalidMiner(); - _deactivateMiner(_miner); + _slashMiner(_miner, _isFined); } - function _deactivateMiner(address _miner) internal { + function _slashMiner(address _miner, bool _isFined) internal { Worker storage miner = miners[_miner]; if (!minerAddresses.hasValue(_miner)) revert InvalidMiner(); address modelAddress = miner.modelAddress; - // Double check hasValue + // 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 + penaltyDuration); - emit MinerDeactivated(_miner, modelAddress, miner.activeTime); - } + if (_isFined) { + uint256 fine = miner.stake * finePercentage / PERCENTAGE_DENOMINATOR; // Fine = stake * 5% + miner.stake -= fine; - function slashMiner(address _miner) public virtual onlyOwner { - if (_miner == address(0)) revert InvalidMiner(); + TransferHelper.safeTransferNative(treasury, fine); - _slashMiner(_miner); - } + emit FraudulentMinerPenalized(_miner, modelAddress, treasury, fine); + return; + } - function _slashMiner(address _miner) internal { - Worker storage miner = miners[_miner]; + emit MinerDeactivated(_miner, modelAddress, miner.activeTime); + } - if (!minerAddresses.hasValue(_miner)) revert InvalidMiner(); + function setFinePercentage(uint16 _finePercentage) public virtual onlyOwner { + _updateEpoch(); - address modelAddress = miner.modelAddress; + emit FinePercentageUpdated(finePercentage, _finePercentage); - // Remove miner from available miner - if (minerAddressesByModel[modelAddress].hasValue(_miner)) { - minerAddressesByModel[modelAddress].erase(_miner); - minerAddresses.erase(_miner); - } + finePercentage = _finePercentage; + } - // Set the time miner can join again - miner.activeTime = uint40(block.timestamp + penaltyDuration); - uint256 fine = miner.stake * finePercentage / PERCENTAGE_DENOMINATOR; // Fine = stake * 5% - miner.stake -= fine; + function setPenaltyDuration(uint40 _penaltyDuration) public virtual onlyOwner { + _updateEpoch(); - TransferHelper.safeTransferNative(treasury, fine); + emit PenaltyDurationUpdated(penaltyDuration, _penaltyDuration); - emit FraudulentMinerPenalized(_miner, modelAddress, treasury, fine); + penaltyDuration = _penaltyDuration; } function resolveInference(uint256 _inferenceId) public virtual { diff --git a/contracts/interfaces/IWorkerHub.sol b/contracts/interfaces/IWorkerHub.sol index 48fcc47..3f63903 100644 --- a/contracts/interfaces/IWorkerHub.sol +++ b/contracts/interfaces/IWorkerHub.sol @@ -159,8 +159,8 @@ interface IWorkerHub is IInferable { 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); + event PenaltyDurationUpdated(uint40 oldDuration, uint40 newDuration); + event FinePercentageUpdated(uint16 oldPercent, uint16 newPercent); error AlreadyRegistered(); error AlreadySubmitted(); From 13331cbf281918d631200e74d77a2a5504a715ac Mon Sep 17 00:00:00 2001 From: 180945 <180945@trustless.computer> Date: Fri, 17 May 2024 13:00:43 +0700 Subject: [PATCH 67/82] update reward with map to tracking --- contracts/WorkerHub.sol | 15 ++++++++---- contracts/storages/WorkerHubStorage.sol | 11 +++++---- tests/Test.t.sol | 31 ++++++++++++++++++++++++- 3 files changed, 47 insertions(+), 10 deletions(-) diff --git a/contracts/WorkerHub.sol b/contracts/WorkerHub.sol index c1e0e4d..506d08e 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -312,7 +312,7 @@ ReentrancyGuardUpgradeable { miner.commitment = 0; if (minerAddresses.hasValue(msg.sender)) { - _claimReward(msg.sender); + _claimReward(msg.sender, false); minerAddresses.erase(msg.sender); minerAddressesByModel[miner.modelAddress].erase(msg.sender); } @@ -607,6 +607,8 @@ ReentrancyGuardUpgradeable { Worker storage miner = miners[_miner]; if (!minerAddresses.hasValue(_miner)) revert InvalidMiner(); + // update reward + _claimReward(msg.sender, false); address modelAddress = miner.modelAddress; @@ -659,19 +661,22 @@ ReentrancyGuardUpgradeable { } } - function _claimReward(address _miner) internal whenNotPaused { + function _claimReward(address _miner, bool _isTransfer) internal whenNotPaused { uint256 rewardAmount = rewardToClaim(_miner); miners[_miner].lastClaimedEpoch = currentEpoch; - if (rewardAmount > 0) { + if (rewardAmount > 0 && _isTransfer) { + minerRewards[_miner] = 0; TransferHelper.safeTransferNative(_miner, rewardAmount); emit RewardClaim(_miner, rewardAmount); + } else if (rewardAmount > 0) { + minerRewards[_miner] = rewardAmount; } } // miner claim reward function claimReward(address _miner) public virtual nonReentrant { - _claimReward(_miner); + _claimReward(_miner, true); } // @dev admin functions @@ -723,6 +728,6 @@ ReentrancyGuardUpgradeable { } } - return totalReward; + return totalReward + minerRewards[_miner]; } } diff --git a/contracts/storages/WorkerHubStorage.sol b/contracts/storages/WorkerHubStorage.sol index 3597372..f1ee60a 100644 --- a/contracts/storages/WorkerHubStorage.sol +++ b/contracts/storages/WorkerHubStorage.sol @@ -40,7 +40,7 @@ abstract contract WorkerHubStorage is IWorkerHub { // mapping detail miner completed how many request // total task completed in epoch // miner => epoch => total task completed - mapping(address => mapping(uint256 => uint256)) public minerTaskCompleted; + mapping(address => mapping(uint256 => uint256)) internal minerTaskCompleted; uint256 public minerMinimumStake; uint256 public validatorMinimumStake; @@ -60,11 +60,14 @@ abstract contract WorkerHubStorage is IWorkerHub { uint40 public currentEpoch; uint256 public blocksPerEpoch; uint256 public lastBlock; - uint256 public rewardPerEpochBasedOnPerf; // percentage for workers completed task + uint256 internal rewardPerEpochBasedOnPerf; // percentage for workers completed task uint256 public rewardPerEpoch; // 12299.97 reward EAI for 1 worker per year // Tx Fee - uint16 public finePercentage; + uint16 public finePercentage; - uint256[99] private __gap; + // mapping tracking reward + mapping(address => uint256) internal minerRewards; + + uint256[98] private __gap; } diff --git a/tests/Test.t.sol b/tests/Test.t.sol index 0c8c8ff..d55571e 100644 --- a/tests/Test.t.sol +++ b/tests/Test.t.sol @@ -27,7 +27,9 @@ contract WorkHubTest is Test { 10, 9000, // 90% 1229997 * 1e16, // reward 1 worker in one year - 21 days + 21 days, + 0, + 0 ); // workerHub.setNewRewardInEpoch(1e16); workerHub.registerModel(ModelAddr, 1, 1e18); @@ -153,6 +155,33 @@ contract WorkHubTest is Test { workerHub.claimReward(Miner1); assertEq(Miner1.balance, 15601179604261796 + 2e18 - 1e18); assertEq(workerHub.rewardToClaim(Miner1), 0); + + // test case miner active then unregis but no claim reward + workerHub.joinForMinting(); + vm.roll(71); + assertEq(workerHub.rewardToClaim(Miner1), 7800589802130898); + vm.roll(81); + assertEq(workerHub.rewardToClaim(Miner1), 7800589802130898 * 2); + workerHub.unregisterMiner(); + vm.warp(block.timestamp + 21 days); + workerHub.unstakeForMiner(); + assertEq(Miner1.balance, 15601179604261796 + 2e18); + assertEq(workerHub.rewardToClaim(Miner1), 7800589802130898 * 2); + + vm.roll(91); + assertEq(workerHub.rewardToClaim(Miner1), 7800589802130898 * 2); + workerHub.registerMiner{value: 1e18}(1); + workerHub.joinForMinting(); + vm.roll(101); + assertEq(workerHub.rewardToClaim(Miner1), 7800589802130898 * 3); + + // claim reward + workerHub.claimReward(Miner1); + assertEq(workerHub.rewardToClaim(Miner1), 0); + assertEq(Miner1.balance, 15601179604261796 + 2e18 - 1e18 + 7800589802130898 * 3); + vm.roll(109); + assertEq(workerHub.rewardToClaim(Miner1), 0); + vm.stopPrank(); } } From e24fb39ce99fb91da510f89c3114f6c55e0d9a32 Mon Sep 17 00:00:00 2001 From: kelvin2608 <2608@newbitcoincity.com> Date: Fri, 17 May 2024 13:16:07 +0700 Subject: [PATCH 68/82] Update: The inactive miner is not allowed to submit --- contracts/WorkerHub.sol | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/contracts/WorkerHub.sol b/contracts/WorkerHub.sol index 506d08e..bf87647 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -545,6 +545,12 @@ ReentrancyGuardUpgradeable { _updateEpoch(); address _msgSender = msg.sender; + // Check whether miner is available (the miner had previously joined). The inactive miner is not allowed to submit solution. + if (!minerAddresses.hasValue(msg.sender)) revert InvalidMiner(); + + address modelAddrOfMiner = miners[msg.sender].modelAddress; + if (!minerAddressesByModel[modelAddrOfMiner].hasValue(msg.sender)) revert InvalidMiner(); + Assignment memory clonedAssignments = assignments[_assigmentId]; if (_msgSender != clonedAssignments.worker) revert Unauthorized(); From 0e029ba381dc1fc5b465794d0f089b0929712aec Mon Sep 17 00:00:00 2001 From: kelvin2608 <2608@newbitcoincity.com> Date: Fri, 17 May 2024 13:16:07 +0700 Subject: [PATCH 69/82] Update: The inactive miner is not allowed to submit --- contracts/WorkerHub.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/WorkerHub.sol b/contracts/WorkerHub.sol index bf87647..2269581 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -614,7 +614,7 @@ ReentrancyGuardUpgradeable { if (!minerAddresses.hasValue(_miner)) revert InvalidMiner(); // update reward - _claimReward(msg.sender, false); + _claimReward(_miner, false); address modelAddress = miner.modelAddress; From 855180286fea1ab335ca4dbce02e4d4841318efb Mon Sep 17 00:00:00 2001 From: 180945 <180945@trustless.computer> Date: Mon, 20 May 2024 00:14:23 +0700 Subject: [PATCH 70/82] implemented boost --- contracts/WorkerHub.sol | 28 +++++++++------ contracts/interfaces/IWorkerHub.sol | 7 ++++ contracts/storages/WorkerHubStorage.sol | 5 ++- tests/Test.t.sol | 47 +++++++++++++++++++++++-- 4 files changed, 73 insertions(+), 14 deletions(-) diff --git a/contracts/WorkerHub.sol b/contracts/WorkerHub.sol index 2269581..84c71cb 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -295,6 +295,7 @@ ReentrancyGuardUpgradeable { minerAddressesByModel[modelAddress].insert(msg.sender); minerAddresses.insert(msg.sender); miner.lastClaimedEpoch = currentEpoch; + boost[msg.sender].minerTimestamp = uint40(block.timestamp); emit MinerJoin(msg.sender); } @@ -313,6 +314,8 @@ ReentrancyGuardUpgradeable { if (minerAddresses.hasValue(msg.sender)) { _claimReward(msg.sender, false); + boost[msg.sender].minerTimestamp = uint40(block.timestamp); + minerAddresses.erase(msg.sender); minerAddressesByModel[miner.modelAddress].erase(msg.sender); } @@ -631,6 +634,8 @@ ReentrancyGuardUpgradeable { uint256 fine = miner.stake * finePercentage / PERCENTAGE_DENOMINATOR; // Fine = stake * 5% miner.stake -= fine; + // reset boost + boost[msg.sender].minerTimestamp = uint40(block.timestamp); TransferHelper.safeTransferNative(treasury, fine); emit FraudulentMinerPenalized(_miner, modelAddress, treasury, fine); @@ -722,18 +727,21 @@ ReentrancyGuardUpgradeable { totalReward = 0; } else { uint256 lastClaimed = uint256(miners[_miner].lastClaimedEpoch); - uint256 epochReward; - uint256 currentMiner; - for (; lastClaimed < lastEpoch; lastClaimed++) { - MinerEpochState memory state = rewardInEpoch[lastClaimed]; - // reward at epoch - (epochReward, currentMiner) = (state.epochReward, state.totalMiner); - if (currentMiner > 0 && epochReward > 0) { - totalReward += epochReward / currentMiner; - } - } + uint256 epochReward = rewardPerEpoch * blocksPerEpoch / BLOCK_PER_YEAR; // reward per miner in 1 epoch + totalReward += (lastEpoch - lastClaimed) * epochReward * multiplier(_miner) / PERCENTAGE_DENOMINATOR; } return totalReward + minerRewards[_miner]; } + + function multiplier(address _miner) public view returns(uint256) { + if (!minerAddresses.hasValue(_miner)) { + return PERCENTAGE_DENOMINATOR; + } + + uint256 minerLastTimestamp = minerAddresses.hasValue(_miner) && boost[_miner].minerTimestamp == 0 ? + 1716046859 : boost[_miner].minerTimestamp; + uint256 multiplierRes = (block.timestamp - minerLastTimestamp) / 30 days; + return PERCENTAGE_DENOMINATOR + 500 * (multiplierRes >= 12 ? 12 : multiplierRes); + } } diff --git a/contracts/interfaces/IWorkerHub.sol b/contracts/interfaces/IWorkerHub.sol index 3f63903..2e53aa8 100644 --- a/contracts/interfaces/IWorkerHub.sol +++ b/contracts/interfaces/IWorkerHub.sol @@ -89,6 +89,13 @@ interface IWorkerHub is IInferable { uint40 unlockAt; } + struct Boost { + uint40 minerTimestamp; + uint40 validatorTimestamp; + uint48 reserved1; + uint128 reserved2; + } + event MiningTimeLimitUpdate(uint40 newValue); event ModelRegistration( diff --git a/contracts/storages/WorkerHubStorage.sol b/contracts/storages/WorkerHubStorage.sol index f1ee60a..c53f376 100644 --- a/contracts/storages/WorkerHubStorage.sol +++ b/contracts/storages/WorkerHubStorage.sol @@ -68,6 +68,9 @@ abstract contract WorkerHubStorage is IWorkerHub { // mapping tracking reward mapping(address => uint256) internal minerRewards; + // tracking time miner join the network to + // determine multiplier value + mapping(address => Boost) internal boost; - uint256[98] private __gap; + uint256[97] private __gap; } diff --git a/tests/Test.t.sol b/tests/Test.t.sol index d55571e..72b6b50 100644 --- a/tests/Test.t.sol +++ b/tests/Test.t.sol @@ -31,9 +31,11 @@ contract WorkHubTest is Test { 0, 0 ); -// workerHub.setNewRewardInEpoch(1e16); + workerHub.registerModel(ModelAddr, 1, 1e18); vm.stopPrank(); + // Sunday, May 19, 2024 4:14:11 PM + vm.warp(1716135251); } function testRewards() public { @@ -131,6 +133,8 @@ contract WorkHubTest is Test { workerHub.unstakeForMiner(); assertEq(Miner1.balance, 15601179604261796 + 2e18); + assertEq(workerHub.multiplier(Miner1), 1e4); + vm.roll(51); assertEq(workerHub.rewardToClaim(Miner1), 0); workerHub.claimReward(Miner1); @@ -155,9 +159,13 @@ contract WorkHubTest is Test { workerHub.claimReward(Miner1); assertEq(Miner1.balance, 15601179604261796 + 2e18 - 1e18); assertEq(workerHub.rewardToClaim(Miner1), 0); - + assertEq(workerHub.multiplier(Miner1), 1e4); // test case miner active then unregis but no claim reward workerHub.joinForMinting(); + + // assertEq(workerHub.test(Miner1), block.timestamp); + assertEq(workerHub.multiplier(Miner1), 1e4); + vm.roll(71); assertEq(workerHub.rewardToClaim(Miner1), 7800589802130898); vm.roll(81); @@ -168,12 +176,18 @@ contract WorkHubTest is Test { assertEq(Miner1.balance, 15601179604261796 + 2e18); assertEq(workerHub.rewardToClaim(Miner1), 7800589802130898 * 2); + // assertEq(workerHub.test(Miner1) + 21 days, block.timestamp); + vm.roll(91); assertEq(workerHub.rewardToClaim(Miner1), 7800589802130898 * 2); workerHub.registerMiner{value: 1e18}(1); workerHub.joinForMinting(); + + // assertEq(workerHub.test(Miner1), block.timestamp); + vm.roll(101); assertEq(workerHub.rewardToClaim(Miner1), 7800589802130898 * 3); + // assertEq(workerHub.test(Miner1), block.timestamp); // claim reward workerHub.claimReward(Miner1); @@ -181,7 +195,34 @@ contract WorkHubTest is Test { assertEq(Miner1.balance, 15601179604261796 + 2e18 - 1e18 + 7800589802130898 * 3); vm.roll(109); assertEq(workerHub.rewardToClaim(Miner1), 0); - vm.stopPrank(); + + // test boost reward + assertEq(workerHub.rewardToClaim(Miner1), 0); + // add 2 epochs + vm.roll(121); + assertEq(workerHub.multiplier(Miner2), 11000); + assertEq(workerHub.multiplier(Miner1), 1e4); + assertEq(workerHub.rewardToClaim(Miner1), 7800589802130898 * 2); + // assertEq(workerHub.test(Miner1), block.timestamp); + vm.warp(block.timestamp + 30 days); + uint boostReward = 7800589802130898 * 2 * 10500 / uint256(1e4); + assertEq(workerHub.rewardToClaim(Miner1), boostReward); + + vm.warp(block.timestamp + 30 days); + boostReward = 7800589802130898 * 2 * 11000 / uint256(1e4); + assertEq(workerHub.rewardToClaim(Miner1), boostReward); + + vm.warp(block.timestamp + 365 days); + boostReward = 7800589802130898 * 2 * 16000 / uint256(1e4); + assertEq(workerHub.rewardToClaim(Miner1), boostReward); + + workerHub.claimReward(Miner1); + assertEq(workerHub.rewardToClaim(Miner1), 0); + + // unregis reset boost + vm.startPrank(Miner1); + workerHub.unregisterMiner(); + assertEq(workerHub.multiplier(Miner1), 1e4); } } From 7e3a26e765c6273b1327f53c8e43ec4d3681f280 Mon Sep 17 00:00:00 2001 From: 180945 <180945@trustless.computer> Date: Mon, 20 May 2024 17:00:15 +0700 Subject: [PATCH 71/82] added getNOMiner --- contracts/WorkerHub.sol | 4 ++++ tests/Test.t.sol | 2 ++ 2 files changed, 6 insertions(+) diff --git a/contracts/WorkerHub.sol b/contracts/WorkerHub.sol index 84c71cb..ec0b644 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -132,6 +132,10 @@ ReentrancyGuardUpgradeable { return result; } + function getNOMiner() external view returns (uint) { + return minerAddresses.values.length; + } + function getMinerAddresses() external view returns (address[] memory) { return minerAddresses.values; } diff --git a/tests/Test.t.sol b/tests/Test.t.sol index 72b6b50..c0d1f8e 100644 --- a/tests/Test.t.sol +++ b/tests/Test.t.sol @@ -224,5 +224,7 @@ contract WorkHubTest is Test { vm.startPrank(Miner1); workerHub.unregisterMiner(); assertEq(workerHub.multiplier(Miner1), 1e4); + + assertEq(workerHub.getNOMiner(), 2); } } From 0d42934351998fd5996fc5cbc8ba7c292e3732ef Mon Sep 17 00:00:00 2001 From: 180945 <180945@trustless.computer> Date: Tue, 21 May 2024 19:04:45 +0700 Subject: [PATCH 72/82] update boost mining reward --- contracts/WorkerHub.sol | 24 ++++++++++++++++-------- contracts/interfaces/IWorkerHub.sol | 2 +- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/contracts/WorkerHub.sol b/contracts/WorkerHub.sol index 84c71cb..3c9771e 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -314,7 +314,8 @@ ReentrancyGuardUpgradeable { if (minerAddresses.hasValue(msg.sender)) { _claimReward(msg.sender, false); - boost[msg.sender].minerTimestamp = uint40(block.timestamp); + // reset boost + boost[msg.sender].reserved1 = 0; minerAddresses.erase(msg.sender); minerAddressesByModel[miner.modelAddress].erase(msg.sender); @@ -618,7 +619,8 @@ ReentrancyGuardUpgradeable { if (!minerAddresses.hasValue(_miner)) revert InvalidMiner(); // update reward _claimReward(_miner, false); - + boost[msg.sender].reserved1 += uint48(block.timestamp) - uint48(boost[msg.sender].minerTimestamp == 0 ? 1716046859 : boost[msg.sender].minerTimestamp); + boost[msg.sender].minerTimestamp = uint40(block.timestamp); address modelAddress = miner.modelAddress; // Remove miner from available miner @@ -635,7 +637,7 @@ ReentrancyGuardUpgradeable { miner.stake -= fine; // reset boost - boost[msg.sender].minerTimestamp = uint40(block.timestamp); + boost[msg.sender].reserved1 = 0; TransferHelper.safeTransferNative(treasury, fine); emit FraudulentMinerPenalized(_miner, modelAddress, treasury, fine); @@ -735,13 +737,19 @@ ReentrancyGuardUpgradeable { } function multiplier(address _miner) public view returns(uint256) { - if (!minerAddresses.hasValue(_miner)) { - return PERCENTAGE_DENOMINATOR; + uint256 minerLastTimestamp; + + if (minerAddresses.hasValue(_miner) && boost[_miner].minerTimestamp == 0) { + minerLastTimestamp = 1716046859; + } else if (!minerAddresses.hasValue(_miner)) { + minerLastTimestamp = block.timestamp; + } else { + minerLastTimestamp = boost[_miner].minerTimestamp; } - uint256 minerLastTimestamp = minerAddresses.hasValue(_miner) && boost[_miner].minerTimestamp == 0 ? - 1716046859 : boost[_miner].minerTimestamp; - uint256 multiplierRes = (block.timestamp - minerLastTimestamp) / 30 days; + + uint256 multiplierRes = (boost[_miner].reserved1 + block.timestamp - minerLastTimestamp) / 30 days; + return PERCENTAGE_DENOMINATOR + 500 * (multiplierRes >= 12 ? 12 : multiplierRes); } } diff --git a/contracts/interfaces/IWorkerHub.sol b/contracts/interfaces/IWorkerHub.sol index 2e53aa8..9748bed 100644 --- a/contracts/interfaces/IWorkerHub.sol +++ b/contracts/interfaces/IWorkerHub.sol @@ -92,7 +92,7 @@ interface IWorkerHub is IInferable { struct Boost { uint40 minerTimestamp; uint40 validatorTimestamp; - uint48 reserved1; + uint48 reserved1; // accumulated active time uint128 reserved2; } From 6e4eb277eb3b001eb34f92f8d3035c54b7a9536c Mon Sep 17 00:00:00 2001 From: 180945 <180945@trustless.computer> Date: Tue, 21 May 2024 19:13:37 +0700 Subject: [PATCH 73/82] update latest timestamp when unregis --- contracts/WorkerHub.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/contracts/WorkerHub.sol b/contracts/WorkerHub.sol index 3c9771e..7dfa3b9 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -316,6 +316,7 @@ ReentrancyGuardUpgradeable { _claimReward(msg.sender, false); // reset boost boost[msg.sender].reserved1 = 0; + boost[msg.sender].minerTimestamp = uint40(block.timestamp); minerAddresses.erase(msg.sender); minerAddressesByModel[miner.modelAddress].erase(msg.sender); From 7832af528314eaf1ffb0916ab9019c5770adedf4 Mon Sep 17 00:00:00 2001 From: 180945 <180945@trustless.computer> Date: Wed, 22 May 2024 08:18:33 +0700 Subject: [PATCH 74/82] fixed slash miner feature --- contracts/WorkerHub.sol | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/contracts/WorkerHub.sol b/contracts/WorkerHub.sol index 7dfa3b9..b684a5a 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -620,8 +620,8 @@ ReentrancyGuardUpgradeable { if (!minerAddresses.hasValue(_miner)) revert InvalidMiner(); // update reward _claimReward(_miner, false); - boost[msg.sender].reserved1 += uint48(block.timestamp) - uint48(boost[msg.sender].minerTimestamp == 0 ? 1716046859 : boost[msg.sender].minerTimestamp); - boost[msg.sender].minerTimestamp = uint40(block.timestamp); + boost[_miner].reserved1 += uint48(block.timestamp) - uint48(boost[_miner].minerTimestamp == 0 ? 1716046859 : boost[_miner].minerTimestamp); + boost[_miner].minerTimestamp = uint40(block.timestamp); address modelAddress = miner.modelAddress; // Remove miner from available miner @@ -638,7 +638,7 @@ ReentrancyGuardUpgradeable { miner.stake -= fine; // reset boost - boost[msg.sender].reserved1 = 0; + boost[_miner].reserved1 = 0; TransferHelper.safeTransferNative(treasury, fine); emit FraudulentMinerPenalized(_miner, modelAddress, treasury, fine); @@ -747,8 +747,6 @@ ReentrancyGuardUpgradeable { } else { minerLastTimestamp = boost[_miner].minerTimestamp; } - - uint256 multiplierRes = (boost[_miner].reserved1 + block.timestamp - minerLastTimestamp) / 30 days; return PERCENTAGE_DENOMINATOR + 500 * (multiplierRes >= 12 ? 12 : multiplierRes); From cff2ad6eb061c689a381e5a1613218fbbeb9b095 Mon Sep 17 00:00:00 2001 From: kochou-nbc Date: Wed, 22 May 2024 10:52:23 +0700 Subject: [PATCH 75/82] update .openzeppelin --- .openzeppelin/unknown-20156.json | 820 +++++++++++++++ .openzeppelin/unknown-43338.json | 1640 ++++++++++++++++++++++++++++++ 2 files changed, 2460 insertions(+) diff --git a/.openzeppelin/unknown-20156.json b/.openzeppelin/unknown-20156.json index b79f561..2ba0c4c 100644 --- a/.openzeppelin/unknown-20156.json +++ b/.openzeppelin/unknown-20156.json @@ -19287,6 +19287,826 @@ }, "namespaces": {} } + }, + "1621970fe69f5106989211676239da04dee2d6d2be4342e8139d6fead72bd0d4": { + "address": "0x7C872792629927d25FBfbE7F8e0587D598e98Bb2", + "txHash": "0xdb029c69f316e281187331954733b985a9ccc5abfa6d41b1dcbe0175124c5031", + "layout": { + "solcVersion": "0.8.19", + "storage": [ + { + "label": "randomizer", + "offset": 0, + "slot": "0", + "type": "t_struct(Randomizer)4214_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:10" + }, + { + "label": "models", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_struct(Model)3854_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:12" + }, + { + "label": "miners", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_address,t_struct(Worker)3867_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:13" + }, + { + "label": "validators", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_address,t_struct(Worker)3867_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:14" + }, + { + "label": "minerAddressesByModel", + "offset": 0, + "slot": "4", + "type": "t_mapping(t_address,t_struct(AddressSet)4258_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:16" + }, + { + "label": "validatorAddressesByModel", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_address,t_struct(AddressSet)4258_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:17" + }, + { + "label": "modelAddresses", + "offset": 0, + "slot": "6", + "type": "t_struct(AddressSet)4258_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:19" + }, + { + "label": "minerAddresses", + "offset": 0, + "slot": "8", + "type": "t_struct(AddressSet)4258_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:20" + }, + { + "label": "validatorAddresses", + "offset": 0, + "slot": "10", + "type": "t_struct(AddressSet)4258_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:21" + }, + { + "label": "minerUnstakeRequests", + "offset": 0, + "slot": "12", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3952_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:23" + }, + { + "label": "validatorUnstakeRequests", + "offset": 0, + "slot": "13", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3952_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)3927_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)3891_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:30" + }, + { + "label": "assignmentsByMiner", + "offset": 0, + "slot": "18", + "type": "t_mapping(t_address,t_struct(Uint256Set)4428_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:31" + }, + { + "label": "assignmentsByInference", + "offset": 0, + "slot": "19", + "type": "t_mapping(t_uint256,t_struct(Uint256Set)4428_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)3849_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": "finePercentage", + "offset": 0, + "slot": "31", + "type": "t_uint16", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:67" + }, + { + "label": "minerRewards", + "offset": 0, + "slot": "32", + "type": "t_mapping(t_address,t_uint256)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:70" + }, + { + "label": "boost", + "offset": 0, + "slot": "33", + "type": "t_mapping(t_address,t_struct(Boost)3961_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:73" + }, + { + "label": "__gap", + "offset": 0, + "slot": "34", + "type": "t_array(t_uint256)97_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:75" + }, + { + "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)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_array(t_uint256)97_storage": { + "label": "uint256[97]", + "numberOfBytes": "3104" + }, + "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)3840": { + "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)4258_storage)": { + "label": "mapping(address => struct Set.AddressSet)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Boost)3961_storage)": { + "label": "mapping(address => struct IWorkerHub.Boost)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Model)3854_storage)": { + "label": "mapping(address => struct IWorkerHub.Model)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Uint256Set)4428_storage)": { + "label": "mapping(address => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(UnstakeRequest)3952_storage)": { + "label": "mapping(address => struct IWorkerHub.UnstakeRequest)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Worker)3867_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)3891_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Assignment)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Inference)3927_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Inference)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(MinerEpochState)3849_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.MinerEpochState)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Uint256Set)4428_storage)": { + "label": "mapping(uint256 => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_uint256)": { + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32" + }, + "t_struct(AddressSet)4258_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)3891_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(Boost)3961_storage": { + "label": "struct IWorkerHub.Boost", + "members": [ + { + "label": "minerTimestamp", + "type": "t_uint40", + "offset": 0, + "slot": "0" + }, + { + "label": "validatorTimestamp", + "type": "t_uint40", + "offset": 5, + "slot": "0" + }, + { + "label": "reserved1", + "type": "t_uint48", + "offset": 10, + "slot": "0" + }, + { + "label": "reserved2", + "type": "t_uint128", + "offset": 16, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(Inference)3927_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)3840", + "offset": 26, + "slot": "4" + }, + { + "label": "creator", + "type": "t_address", + "offset": 0, + "slot": "5" + } + ], + "numberOfBytes": "192" + }, + "t_struct(MinerEpochState)3849_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)3854_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)4214_storage": { + "label": "struct Random.Randomizer", + "members": [ + { + "label": "nonce", + "type": "t_uint256", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(Uint256Set)4428_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)3952_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)3867_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_uint128": { + "label": "uint128", + "numberOfBytes": "16" + }, + "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_uint48": { + "label": "uint48", + "numberOfBytes": "6" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + }, + "namespaces": {} + } } } } diff --git a/.openzeppelin/unknown-43338.json b/.openzeppelin/unknown-43338.json index 41f817f..efb206b 100644 --- a/.openzeppelin/unknown-43338.json +++ b/.openzeppelin/unknown-43338.json @@ -6417,6 +6417,1646 @@ }, "namespaces": {} } + }, + "595301b19db4fc96cebf15646c8723e2757eafede1f678862c46c01bd45d25d6": { + "address": "0x88e78f97494FAe0e70fF11DE1cdEAB1993c83E09", + "txHash": "0x589b83a222f4a7e988f74d139cc1e31e4260211a48a3ec5a8b55253df6320e4e", + "layout": { + "solcVersion": "0.8.19", + "storage": [ + { + "label": "randomizer", + "offset": 0, + "slot": "0", + "type": "t_struct(Randomizer)4204_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:10" + }, + { + "label": "models", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_struct(Model)3844_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:12" + }, + { + "label": "miners", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_address,t_struct(Worker)3857_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:13" + }, + { + "label": "validators", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_address,t_struct(Worker)3857_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:14" + }, + { + "label": "minerAddressesByModel", + "offset": 0, + "slot": "4", + "type": "t_mapping(t_address,t_struct(AddressSet)4248_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:16" + }, + { + "label": "validatorAddressesByModel", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_address,t_struct(AddressSet)4248_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:17" + }, + { + "label": "modelAddresses", + "offset": 0, + "slot": "6", + "type": "t_struct(AddressSet)4248_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:19" + }, + { + "label": "minerAddresses", + "offset": 0, + "slot": "8", + "type": "t_struct(AddressSet)4248_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:20" + }, + { + "label": "validatorAddresses", + "offset": 0, + "slot": "10", + "type": "t_struct(AddressSet)4248_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:21" + }, + { + "label": "minerUnstakeRequests", + "offset": 0, + "slot": "12", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3942_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:23" + }, + { + "label": "validatorUnstakeRequests", + "offset": 0, + "slot": "13", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3942_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)3917_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)3881_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:30" + }, + { + "label": "assignmentsByMiner", + "offset": 0, + "slot": "18", + "type": "t_mapping(t_address,t_struct(Uint256Set)4418_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:31" + }, + { + "label": "assignmentsByInference", + "offset": 0, + "slot": "19", + "type": "t_mapping(t_uint256,t_struct(Uint256Set)4418_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)3839_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": "finePercentage", + "offset": 0, + "slot": "31", + "type": "t_uint16", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:67" + }, + { + "label": "minerRewards", + "offset": 0, + "slot": "32", + "type": "t_mapping(t_address,t_uint256)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:70" + }, + { + "label": "boost", + "offset": 0, + "slot": "33", + "type": "t_mapping(t_address,t_struct(Boost)3951_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:73" + }, + { + "label": "__gap", + "offset": 0, + "slot": "34", + "type": "t_array(t_uint256)97_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:75" + }, + { + "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)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_array(t_uint256)97_storage": { + "label": "uint256[97]", + "numberOfBytes": "3104" + }, + "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)3830": { + "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)4248_storage)": { + "label": "mapping(address => struct Set.AddressSet)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Boost)3951_storage)": { + "label": "mapping(address => struct IWorkerHub.Boost)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Model)3844_storage)": { + "label": "mapping(address => struct IWorkerHub.Model)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Uint256Set)4418_storage)": { + "label": "mapping(address => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(UnstakeRequest)3942_storage)": { + "label": "mapping(address => struct IWorkerHub.UnstakeRequest)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Worker)3857_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)3881_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Assignment)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Inference)3917_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Inference)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(MinerEpochState)3839_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.MinerEpochState)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Uint256Set)4418_storage)": { + "label": "mapping(uint256 => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_uint256)": { + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32" + }, + "t_struct(AddressSet)4248_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)3881_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(Boost)3951_storage": { + "label": "struct IWorkerHub.Boost", + "members": [ + { + "label": "minerTimestamp", + "type": "t_uint40", + "offset": 0, + "slot": "0" + }, + { + "label": "validatorTimestamp", + "type": "t_uint40", + "offset": 5, + "slot": "0" + }, + { + "label": "reserved1", + "type": "t_uint48", + "offset": 10, + "slot": "0" + }, + { + "label": "reserved2", + "type": "t_uint128", + "offset": 16, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(Inference)3917_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)3830", + "offset": 26, + "slot": "4" + }, + { + "label": "creator", + "type": "t_address", + "offset": 0, + "slot": "5" + } + ], + "numberOfBytes": "192" + }, + "t_struct(MinerEpochState)3839_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)3844_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)4204_storage": { + "label": "struct Random.Randomizer", + "members": [ + { + "label": "nonce", + "type": "t_uint256", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(Uint256Set)4418_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)3942_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)3857_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_uint128": { + "label": "uint128", + "numberOfBytes": "16" + }, + "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_uint48": { + "label": "uint48", + "numberOfBytes": "6" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + }, + "namespaces": {} + } + }, + "1621970fe69f5106989211676239da04dee2d6d2be4342e8139d6fead72bd0d4": { + "address": "0x6d2a105aEc1c02a40F4C7fAF8f038Eb6eA16Bf98", + "txHash": "0xbdd37a8fad5e3c6761428073036cb8585c647d96d0d91739c16c62e30dade318", + "layout": { + "solcVersion": "0.8.19", + "storage": [ + { + "label": "randomizer", + "offset": 0, + "slot": "0", + "type": "t_struct(Randomizer)4214_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:10" + }, + { + "label": "models", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_struct(Model)3854_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:12" + }, + { + "label": "miners", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_address,t_struct(Worker)3867_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:13" + }, + { + "label": "validators", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_address,t_struct(Worker)3867_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:14" + }, + { + "label": "minerAddressesByModel", + "offset": 0, + "slot": "4", + "type": "t_mapping(t_address,t_struct(AddressSet)4258_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:16" + }, + { + "label": "validatorAddressesByModel", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_address,t_struct(AddressSet)4258_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:17" + }, + { + "label": "modelAddresses", + "offset": 0, + "slot": "6", + "type": "t_struct(AddressSet)4258_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:19" + }, + { + "label": "minerAddresses", + "offset": 0, + "slot": "8", + "type": "t_struct(AddressSet)4258_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:20" + }, + { + "label": "validatorAddresses", + "offset": 0, + "slot": "10", + "type": "t_struct(AddressSet)4258_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:21" + }, + { + "label": "minerUnstakeRequests", + "offset": 0, + "slot": "12", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3952_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:23" + }, + { + "label": "validatorUnstakeRequests", + "offset": 0, + "slot": "13", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)3952_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)3927_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)3891_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:30" + }, + { + "label": "assignmentsByMiner", + "offset": 0, + "slot": "18", + "type": "t_mapping(t_address,t_struct(Uint256Set)4428_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:31" + }, + { + "label": "assignmentsByInference", + "offset": 0, + "slot": "19", + "type": "t_mapping(t_uint256,t_struct(Uint256Set)4428_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)3849_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": "finePercentage", + "offset": 0, + "slot": "31", + "type": "t_uint16", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:67" + }, + { + "label": "minerRewards", + "offset": 0, + "slot": "32", + "type": "t_mapping(t_address,t_uint256)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:70" + }, + { + "label": "boost", + "offset": 0, + "slot": "33", + "type": "t_mapping(t_address,t_struct(Boost)3961_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:73" + }, + { + "label": "__gap", + "offset": 0, + "slot": "34", + "type": "t_array(t_uint256)97_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:75" + }, + { + "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)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_array(t_uint256)97_storage": { + "label": "uint256[97]", + "numberOfBytes": "3104" + }, + "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)3840": { + "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)4258_storage)": { + "label": "mapping(address => struct Set.AddressSet)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Boost)3961_storage)": { + "label": "mapping(address => struct IWorkerHub.Boost)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Model)3854_storage)": { + "label": "mapping(address => struct IWorkerHub.Model)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Uint256Set)4428_storage)": { + "label": "mapping(address => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(UnstakeRequest)3952_storage)": { + "label": "mapping(address => struct IWorkerHub.UnstakeRequest)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Worker)3867_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)3891_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Assignment)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Inference)3927_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Inference)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(MinerEpochState)3849_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.MinerEpochState)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Uint256Set)4428_storage)": { + "label": "mapping(uint256 => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_uint256)": { + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32" + }, + "t_struct(AddressSet)4258_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)3891_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(Boost)3961_storage": { + "label": "struct IWorkerHub.Boost", + "members": [ + { + "label": "minerTimestamp", + "type": "t_uint40", + "offset": 0, + "slot": "0" + }, + { + "label": "validatorTimestamp", + "type": "t_uint40", + "offset": 5, + "slot": "0" + }, + { + "label": "reserved1", + "type": "t_uint48", + "offset": 10, + "slot": "0" + }, + { + "label": "reserved2", + "type": "t_uint128", + "offset": 16, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(Inference)3927_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)3840", + "offset": 26, + "slot": "4" + }, + { + "label": "creator", + "type": "t_address", + "offset": 0, + "slot": "5" + } + ], + "numberOfBytes": "192" + }, + "t_struct(MinerEpochState)3849_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)3854_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)4214_storage": { + "label": "struct Random.Randomizer", + "members": [ + { + "label": "nonce", + "type": "t_uint256", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(Uint256Set)4428_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)3952_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)3867_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_uint128": { + "label": "uint128", + "numberOfBytes": "16" + }, + "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_uint48": { + "label": "uint48", + "numberOfBytes": "6" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + }, + "namespaces": {} + } } } } From 466037d9d0d1cbb07f64d9fbf3e845cc8d5242bb Mon Sep 17 00:00:00 2001 From: rein-nbc Date: Fri, 24 May 2024 14:53:59 +0700 Subject: [PATCH 76/82] Add JugglenautXL --- .openzeppelin/unknown-43338.json | 5 +++++ deploy_data/deploy_data.txt | 28 ++++++++++++++-------------- scripts/deployHybridModel.ts | 14 +++++++------- 3 files changed, 26 insertions(+), 21 deletions(-) diff --git a/.openzeppelin/unknown-43338.json b/.openzeppelin/unknown-43338.json index 2a7ee1b..20d6fa8 100644 --- a/.openzeppelin/unknown-43338.json +++ b/.openzeppelin/unknown-43338.json @@ -24,6 +24,11 @@ "address": "0x3a269D64057314E7D0E9F4164077FF57fBDb93f9", "txHash": "0x0bc79a2406868146e9db662459fb90a80ddc2e51d0a8a2cb0ad5132e6796be60", "kind": "transparent" + }, + { + "address": "0x91DbBA6bE2aF20d1052C13Cdf9ffCaF92615ceD7", + "txHash": "0xcaa41c7538737b94622ee97d11e1f37e13e2721b264488f5fee000f3a9d58f03", + "kind": "transparent" } ], "impls": { diff --git a/deploy_data/deploy_data.txt b/deploy_data/deploy_data.txt index b0b8b96..57b36fe 100644 --- a/deploy_data/deploy_data.txt +++ b/deploy_data/deploy_data.txt @@ -1,17 +1,3 @@ -const name = 'Max Multi';//`Model ${identifier}`; -const minHardware = 1; -const modelOwnerAddress = ''; -const metadata = '{\n' + - '\t"version": 1,\n' + - '\t"model_name": "MaxMulti",\n' + - '\t"model_type": "image",\n' + - '\t"model_url": "https://gateway.lighthouse.storage/ipfs/QmcFYMYpVodkpT6t1fVmWNjPnUnnQbXvwpqyheXvPGKUr8",\n' + - '\t"model_file_hash": "7f1f29cb884c5b2f4d072b99afcb87f32cbe4adc88cffedab15ffc9fd30887ae",\n' + - '\t"min_hardware": 1,\n' + - '\t"verifier_url": "https://gateway.lighthouse.storage/ipfs/QmdkKEjx2fauzbPh1j5bUiQXrUG5Ft36pJGHS8awrN89Dc",\n' + - '\t"verifier_file_hash": "492b2b3dea3003d359fe1b2cee77a22777d8a9faf942ab6dee81e6bfadaadec4"\n' + - '}' - const name = 'SDXL-Lightning';//`Model ${identifier}`; const minHardware = 1; const modelOwnerAddress = '0x5D6429703D747805920D596E15427B08083e3D2c'; @@ -67,3 +53,17 @@ const metadata = '{\n' + '\t"verifier_url": "",\n' + '\t"verifier_file_hash": ""\n' + '}' + +const name = 'Juggernaut XL';//`Model ${identifier}`; +const minHardware = 1; +const modelOwnerAddress = '0xB0D0c3C59B9101D0C98cD2235c03C43F1294cb95'; +const metadata = '{\n' + + '\t"version": 1,\n' + + '\t"model_name": "Juggernaut XL",\n' + + '\t"model_type": "image",\n' + + '\t"model_url": "https://gateway.lighthouse.storage/ipfs/QmcFYMYpVodkpT6t1fVmWNjPnUnnQbXvwpqyheXvPGKUr8",\n' + + '\t"model_file_hash": "7f1f29cb884c5b2f4d072b99afcb87f32cbe4adc88cffedab15ffc9fd30887ae",\n' + + '\t"min_hardware": 1,\n' + + '\t"verifier_url": "https://gateway.lighthouse.storage/ipfs/QmdkKEjx2fauzbPh1j5bUiQXrUG5Ft36pJGHS8awrN89Dc",\n' + + '\t"verifier_file_hash": "492b2b3dea3003d359fe1b2cee77a22777d8a9faf942ab6dee81e6bfadaadec4"\n' + + '}' diff --git a/scripts/deployHybridModel.ts b/scripts/deployHybridModel.ts index c6d8b0a..6535882 100644 --- a/scripts/deployHybridModel.ts +++ b/scripts/deployHybridModel.ts @@ -16,18 +16,18 @@ async function deployHybridModel() { const workerHubAddress = config.workerHubAddress; const identifier = 0; - const name = 'Animated Concept - SDXL LoRA';//`Model ${identifier}`; + const name = 'Juggernaut XL';//`Model ${identifier}`; const minHardware = 1; - const modelOwnerAddress = '0xBb380912A2E0c83628935f98a5a1b08b8588Ae76'; + const modelOwnerAddress = '0xB0D0c3C59B9101D0C98cD2235c03C43F1294cb95'; const metadata = '{\n' + '\t"version": 1,\n' + - '\t"model_name": "Animated Concept - SDXL LoRA",\n' + + '\t"model_name": "Juggernaut XL",\n' + '\t"model_type": "image",\n' + - '\t"model_url": "https://gateway.lighthouse.storage/ipfs/QmaG6DJstjfgVuBRDi6Ma66o9SMaReMse1S75nDDwwErM3",\n' + - '\t"model_file_hash": "dc881c939ff3078b59d9bf2a6fc83db2caf7b0780ee563d3a6fc09ea5a1b35a1",\n' + + '\t"model_url": "https://gateway.lighthouse.storage/ipfs/QmcFYMYpVodkpT6t1fVmWNjPnUnnQbXvwpqyheXvPGKUr8",\n' + + '\t"model_file_hash": "7f1f29cb884c5b2f4d072b99afcb87f32cbe4adc88cffedab15ffc9fd30887ae",\n' + '\t"min_hardware": 1,\n' + - '\t"verifier_url": "",\n' + - '\t"verifier_file_hash": ""\n' + + '\t"verifier_url": "https://gateway.lighthouse.storage/ipfs/QmdkKEjx2fauzbPh1j5bUiQXrUG5Ft36pJGHS8awrN89Dc",\n' + + '\t"verifier_file_hash": "492b2b3dea3003d359fe1b2cee77a22777d8a9faf942ab6dee81e6bfadaadec4"\n' + '}' const hybridModel = await upgrades.deployProxy( From 6b71b803c6c02d705fae5f4b3662d0a99d943e17 Mon Sep 17 00:00:00 2001 From: rein-nbc Date: Fri, 24 May 2024 16:05:55 +0700 Subject: [PATCH 77/82] Change workerHub version --- contracts/WorkerHub.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/WorkerHub.sol b/contracts/WorkerHub.sol index aac577a..d75aa37 100644 --- a/contracts/WorkerHub.sol +++ b/contracts/WorkerHub.sol @@ -20,7 +20,7 @@ ReentrancyGuardUpgradeable { using Set for Set.AddressSet; using Set for Set.Uint256Set; - string constant private VERSION = "v0.0.1"; + string constant private VERSION = "v0.0.2"; uint256 constant private PERCENTAGE_DENOMINATOR = 100_00; uint256 constant private BLOCK_PER_YEAR = 365 days / 2; // 2s per block From 7e71ec5ae70985e01a6b0d0b9f793da9c872025b Mon Sep 17 00:00:00 2001 From: rein-nbc Date: Mon, 27 May 2024 19:09:54 +0700 Subject: [PATCH 78/82] Minor --- scripts/deployHybridModel.ts | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/scripts/deployHybridModel.ts b/scripts/deployHybridModel.ts index 6535882..e25eb56 100644 --- a/scripts/deployHybridModel.ts +++ b/scripts/deployHybridModel.ts @@ -1,4 +1,5 @@ import assert from 'assert'; +import { version } from 'chai'; import { ethers, network, upgrades } from 'hardhat'; async function deployHybridModel() { @@ -19,16 +20,19 @@ async function deployHybridModel() { const name = 'Juggernaut XL';//`Model ${identifier}`; const minHardware = 1; const modelOwnerAddress = '0xB0D0c3C59B9101D0C98cD2235c03C43F1294cb95'; - const metadata = '{\n' + - '\t"version": 1,\n' + - '\t"model_name": "Juggernaut XL",\n' + - '\t"model_type": "image",\n' + - '\t"model_url": "https://gateway.lighthouse.storage/ipfs/QmcFYMYpVodkpT6t1fVmWNjPnUnnQbXvwpqyheXvPGKUr8",\n' + - '\t"model_file_hash": "7f1f29cb884c5b2f4d072b99afcb87f32cbe4adc88cffedab15ffc9fd30887ae",\n' + - '\t"min_hardware": 1,\n' + - '\t"verifier_url": "https://gateway.lighthouse.storage/ipfs/QmdkKEjx2fauzbPh1j5bUiQXrUG5Ft36pJGHS8awrN89Dc",\n' + - '\t"verifier_file_hash": "492b2b3dea3003d359fe1b2cee77a22777d8a9faf942ab6dee81e6bfadaadec4"\n' + - '}' + const metadataObj = { + "version": 1, + "model_name": "Juggernaut XL", + "model_type": "image", + "model_url": "https://gateway.lighthouse.storage/ipfs/QmcFYMYpVodkpT6t1fVmWNjPnUnnQbXvwpqyheXvPGKUr8", + "model_file_hash": "7f1f29cb884c5b2f4d072b99afcb87f32cbe4adc88cffedab15ffc9fd30887ae", + "min_hardware": 1, + "verifier_url": "https://gateway.lighthouse.storage/ipfs/QmdkKEjx2fauzbPh1j5bUiQXrUG5Ft36pJGHS8awrN89Dc", + "verifier_file_hash": "492b2b3dea3003d359fe1b2cee77a22777d8a9faf942ab6dee81e6bfadaadec4", + } + + const metadata = JSON.stringify(metadataObj, null, "\t"); + console.log(metadata); const hybridModel = await upgrades.deployProxy( HybridModel, From 68147fe46172a246d9c1bb72aced3916840f784f Mon Sep 17 00:00:00 2001 From: 1337 | New Bitcoin City Date: Tue, 28 May 2024 14:20:30 +0700 Subject: [PATCH 79/82] update .openzeppelin --- .openzeppelin/unknown-20156.json | 820 +++++++++++++++++++++++++++++++ .openzeppelin/unknown-43338.json | 820 +++++++++++++++++++++++++++++++ 2 files changed, 1640 insertions(+) diff --git a/.openzeppelin/unknown-20156.json b/.openzeppelin/unknown-20156.json index 2ba0c4c..266fe0a 100644 --- a/.openzeppelin/unknown-20156.json +++ b/.openzeppelin/unknown-20156.json @@ -20107,6 +20107,826 @@ }, "namespaces": {} } + }, + "ca51d2c375fd54e47ed76b2b6e118e4dce495a1f042ddd821467d72ea63db2e0": { + "address": "0x96E62CA9B7Aa12D436797890C544aaEbE64fa2DE", + "txHash": "0xe7e040f05b0f51f7e9506022a351ec8dedbe60dc46c6932f09d4af4ca0fa31cb", + "layout": { + "solcVersion": "0.8.19", + "storage": [ + { + "label": "randomizer", + "offset": 0, + "slot": "0", + "type": "t_struct(Randomizer)4271_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:10" + }, + { + "label": "models", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_struct(Model)3911_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:12" + }, + { + "label": "miners", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_address,t_struct(Worker)3924_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:13" + }, + { + "label": "validators", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_address,t_struct(Worker)3924_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:14" + }, + { + "label": "minerAddressesByModel", + "offset": 0, + "slot": "4", + "type": "t_mapping(t_address,t_struct(AddressSet)4315_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:16" + }, + { + "label": "validatorAddressesByModel", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_address,t_struct(AddressSet)4315_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:17" + }, + { + "label": "modelAddresses", + "offset": 0, + "slot": "6", + "type": "t_struct(AddressSet)4315_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:19" + }, + { + "label": "minerAddresses", + "offset": 0, + "slot": "8", + "type": "t_struct(AddressSet)4315_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:20" + }, + { + "label": "validatorAddresses", + "offset": 0, + "slot": "10", + "type": "t_struct(AddressSet)4315_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:21" + }, + { + "label": "minerUnstakeRequests", + "offset": 0, + "slot": "12", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)4009_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:23" + }, + { + "label": "validatorUnstakeRequests", + "offset": 0, + "slot": "13", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)4009_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)3984_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)3948_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:30" + }, + { + "label": "assignmentsByMiner", + "offset": 0, + "slot": "18", + "type": "t_mapping(t_address,t_struct(Uint256Set)4485_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:31" + }, + { + "label": "assignmentsByInference", + "offset": 0, + "slot": "19", + "type": "t_mapping(t_uint256,t_struct(Uint256Set)4485_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)3906_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": "finePercentage", + "offset": 0, + "slot": "31", + "type": "t_uint16", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:67" + }, + { + "label": "minerRewards", + "offset": 0, + "slot": "32", + "type": "t_mapping(t_address,t_uint256)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:70" + }, + { + "label": "boost", + "offset": 0, + "slot": "33", + "type": "t_mapping(t_address,t_struct(Boost)4018_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:73" + }, + { + "label": "__gap", + "offset": 0, + "slot": "34", + "type": "t_array(t_uint256)97_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:75" + }, + { + "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)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_array(t_uint256)97_storage": { + "label": "uint256[97]", + "numberOfBytes": "3104" + }, + "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)3897": { + "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)4315_storage)": { + "label": "mapping(address => struct Set.AddressSet)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Boost)4018_storage)": { + "label": "mapping(address => struct IWorkerHub.Boost)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Model)3911_storage)": { + "label": "mapping(address => struct IWorkerHub.Model)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Uint256Set)4485_storage)": { + "label": "mapping(address => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(UnstakeRequest)4009_storage)": { + "label": "mapping(address => struct IWorkerHub.UnstakeRequest)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Worker)3924_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)3948_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Assignment)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Inference)3984_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Inference)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(MinerEpochState)3906_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.MinerEpochState)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Uint256Set)4485_storage)": { + "label": "mapping(uint256 => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_uint256)": { + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32" + }, + "t_struct(AddressSet)4315_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)3948_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(Boost)4018_storage": { + "label": "struct IWorkerHub.Boost", + "members": [ + { + "label": "minerTimestamp", + "type": "t_uint40", + "offset": 0, + "slot": "0" + }, + { + "label": "validatorTimestamp", + "type": "t_uint40", + "offset": 5, + "slot": "0" + }, + { + "label": "reserved1", + "type": "t_uint48", + "offset": 10, + "slot": "0" + }, + { + "label": "reserved2", + "type": "t_uint128", + "offset": 16, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(Inference)3984_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)3897", + "offset": 26, + "slot": "4" + }, + { + "label": "creator", + "type": "t_address", + "offset": 0, + "slot": "5" + } + ], + "numberOfBytes": "192" + }, + "t_struct(MinerEpochState)3906_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)3911_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)4271_storage": { + "label": "struct Random.Randomizer", + "members": [ + { + "label": "nonce", + "type": "t_uint256", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(Uint256Set)4485_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)4009_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)3924_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_uint128": { + "label": "uint128", + "numberOfBytes": "16" + }, + "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_uint48": { + "label": "uint48", + "numberOfBytes": "6" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + }, + "namespaces": {} + } } } } diff --git a/.openzeppelin/unknown-43338.json b/.openzeppelin/unknown-43338.json index efb206b..f3d9562 100644 --- a/.openzeppelin/unknown-43338.json +++ b/.openzeppelin/unknown-43338.json @@ -8057,6 +8057,826 @@ }, "namespaces": {} } + }, + "ca51d2c375fd54e47ed76b2b6e118e4dce495a1f042ddd821467d72ea63db2e0": { + "address": "0x96E62CA9B7Aa12D436797890C544aaEbE64fa2DE", + "txHash": "0xadd356e7a94b55b60dea41c5922ddb4c63709a620913a829928ed427bc615433", + "layout": { + "solcVersion": "0.8.19", + "storage": [ + { + "label": "randomizer", + "offset": 0, + "slot": "0", + "type": "t_struct(Randomizer)4271_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:10" + }, + { + "label": "models", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_struct(Model)3911_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:12" + }, + { + "label": "miners", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_address,t_struct(Worker)3924_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:13" + }, + { + "label": "validators", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_address,t_struct(Worker)3924_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:14" + }, + { + "label": "minerAddressesByModel", + "offset": 0, + "slot": "4", + "type": "t_mapping(t_address,t_struct(AddressSet)4315_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:16" + }, + { + "label": "validatorAddressesByModel", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_address,t_struct(AddressSet)4315_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:17" + }, + { + "label": "modelAddresses", + "offset": 0, + "slot": "6", + "type": "t_struct(AddressSet)4315_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:19" + }, + { + "label": "minerAddresses", + "offset": 0, + "slot": "8", + "type": "t_struct(AddressSet)4315_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:20" + }, + { + "label": "validatorAddresses", + "offset": 0, + "slot": "10", + "type": "t_struct(AddressSet)4315_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:21" + }, + { + "label": "minerUnstakeRequests", + "offset": 0, + "slot": "12", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)4009_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:23" + }, + { + "label": "validatorUnstakeRequests", + "offset": 0, + "slot": "13", + "type": "t_mapping(t_address,t_struct(UnstakeRequest)4009_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)3984_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)3948_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:30" + }, + { + "label": "assignmentsByMiner", + "offset": 0, + "slot": "18", + "type": "t_mapping(t_address,t_struct(Uint256Set)4485_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:31" + }, + { + "label": "assignmentsByInference", + "offset": 0, + "slot": "19", + "type": "t_mapping(t_uint256,t_struct(Uint256Set)4485_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)3906_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": "finePercentage", + "offset": 0, + "slot": "31", + "type": "t_uint16", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:67" + }, + { + "label": "minerRewards", + "offset": 0, + "slot": "32", + "type": "t_mapping(t_address,t_uint256)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:70" + }, + { + "label": "boost", + "offset": 0, + "slot": "33", + "type": "t_mapping(t_address,t_struct(Boost)4018_storage)", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:73" + }, + { + "label": "__gap", + "offset": 0, + "slot": "34", + "type": "t_array(t_uint256)97_storage", + "contract": "WorkerHubStorage", + "src": "contracts/storages/WorkerHubStorage.sol:75" + }, + { + "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)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_array(t_uint256)97_storage": { + "label": "uint256[97]", + "numberOfBytes": "3104" + }, + "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)3897": { + "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)4315_storage)": { + "label": "mapping(address => struct Set.AddressSet)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Boost)4018_storage)": { + "label": "mapping(address => struct IWorkerHub.Boost)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Model)3911_storage)": { + "label": "mapping(address => struct IWorkerHub.Model)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Uint256Set)4485_storage)": { + "label": "mapping(address => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(UnstakeRequest)4009_storage)": { + "label": "mapping(address => struct IWorkerHub.UnstakeRequest)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Worker)3924_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)3948_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Assignment)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Inference)3984_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.Inference)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(MinerEpochState)3906_storage)": { + "label": "mapping(uint256 => struct IWorkerHub.MinerEpochState)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Uint256Set)4485_storage)": { + "label": "mapping(uint256 => struct Set.Uint256Set)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_uint256)": { + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32" + }, + "t_struct(AddressSet)4315_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)3948_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(Boost)4018_storage": { + "label": "struct IWorkerHub.Boost", + "members": [ + { + "label": "minerTimestamp", + "type": "t_uint40", + "offset": 0, + "slot": "0" + }, + { + "label": "validatorTimestamp", + "type": "t_uint40", + "offset": 5, + "slot": "0" + }, + { + "label": "reserved1", + "type": "t_uint48", + "offset": 10, + "slot": "0" + }, + { + "label": "reserved2", + "type": "t_uint128", + "offset": 16, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(Inference)3984_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)3897", + "offset": 26, + "slot": "4" + }, + { + "label": "creator", + "type": "t_address", + "offset": 0, + "slot": "5" + } + ], + "numberOfBytes": "192" + }, + "t_struct(MinerEpochState)3906_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)3911_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)4271_storage": { + "label": "struct Random.Randomizer", + "members": [ + { + "label": "nonce", + "type": "t_uint256", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(Uint256Set)4485_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)4009_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)3924_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_uint128": { + "label": "uint128", + "numberOfBytes": "16" + }, + "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_uint48": { + "label": "uint48", + "numberOfBytes": "6" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + }, + "namespaces": {} + } } } } From 8298309a0081cfba66f826c463cc76a443455fbc Mon Sep 17 00:00:00 2001 From: rein-nbc Date: Thu, 30 May 2024 16:57:26 +0700 Subject: [PATCH 80/82] Add Tensor js lib --- scripts/solearn-js/tensors/Tensor1D.ts | 115 ++++++++++++ scripts/solearn-js/tensors/Tensor2D.ts | 134 ++++++++++++++ scripts/solearn-js/tensors/Tensor3D.ts | 205 ++++++++++++++++++++++ scripts/solearn-js/tensors/Tensor4D.ts | 232 +++++++++++++++++++++++++ scripts/solearn-js/tensors/Tensors.ts | 30 ++++ 5 files changed, 716 insertions(+) create mode 100644 scripts/solearn-js/tensors/Tensor1D.ts create mode 100644 scripts/solearn-js/tensors/Tensor2D.ts create mode 100644 scripts/solearn-js/tensors/Tensor3D.ts create mode 100644 scripts/solearn-js/tensors/Tensor4D.ts create mode 100644 scripts/solearn-js/tensors/Tensors.ts diff --git a/scripts/solearn-js/tensors/Tensor1D.ts b/scripts/solearn-js/tensors/Tensor1D.ts new file mode 100644 index 0000000..6fc594f --- /dev/null +++ b/scripts/solearn-js/tensors/Tensor1D.ts @@ -0,0 +1,115 @@ +import { Tensors } from "./Tensors"; +import type { Tensor2D } from "./Tensor2D"; + +export class Tensor1D { + n: number; + mat: number[]; + + constructor(mat: number[]) { + this.n = mat.length; + this.mat = mat; + } + + static emptyTensor(n: number): Tensor1D { + const ts = new Tensor1D([]); + ts.n = n; + return ts; + } + + static load(data: number[], n: number): Tensor1D { + const ts = Tensor1D.emptyTensor(n); + let ptr = 0; + for(let i = 0; i < n; ++i) { + ts.mat.push(ptr < data.length ? data[ptr] : 0.0); + ptr += 1; + } + return ts; + } + + static zerosTensor(n: number): Tensor1D { + return Tensor1D.load([], n); + } + + static cloneTensor(ts: Tensor1D): Tensor1D { + return Tensor1D.load(ts.mat, ts.n); + } + + static __apply_unary_op(a: Tensor1D, op: (x: number) => number): Tensor1D { + const res = Tensor1D.zerosTensor(a.n); + for(let i = 0; i < res.n; ++i) { + res.mat[i] = op(a.mat[i]); + } + return res; + } + + static __apply_binary_op(a: Tensor1D, b: Tensor1D, op: (x: number, y: number) => number): Tensor1D { + const res = Tensor1D.zerosTensor(a.n); + for(let i = 0; i < res.n; ++i) { + res.mat[i] = op(a.mat[i], b.mat[i]); + } + return res; + } + + static activation(a: Tensor1D, name: string): Tensor1D { + switch (name) { + case "relu": + return Tensor1D.__apply_unary_op(a, Tensors.__relu); + case "sigmoid": + return Tensor1D.__apply_unary_op(a, Tensors.__sigmoid); + case "tanh": + return Tensor1D.__apply_unary_op(a, Tensors.__tanh); + case "leaky_relu": + return Tensor1D.__apply_unary_op(a, Tensors.__leaky_relu); + case "linear": + default: + return Tensor1D.__apply_unary_op(a, Tensors.__linear); + } + } + + static add(a: Tensor1D, b: Tensor1D): Tensor1D { + return Tensor1D.__apply_binary_op(a, b, Tensors.__add); + } + + static add_scalar(a: Tensor1D, num: number): Tensor1D { + const res = Tensor1D.zerosTensor(a.n); + for(let i = 0; i < res.n; ++i) { + res.mat[i] = a.mat[i] + num; + } + return res; + } + + static mul(a: Tensor1D, b: Tensor1D): Tensor1D { + return Tensor1D.__apply_binary_op(a, b, Tensors.__mul); + } + + static mul_scalar(a: Tensor1D, num: number): Tensor1D { + const res = Tensor1D.zerosTensor(a.n); + for(let i = 0; i < res.n; ++i) { + res.mat[i] = a.mat[i] * num; + } + return res; + } + + static rescale(a: Tensor1D, scale: number, offset: number): Tensor1D { + return Tensor1D.__apply_unary_op(a, (x) => x * scale + offset); + } + + static matMul(a: Tensor1D, b: Tensor2D): Tensor1D { + const res = Tensor1D.zerosTensor(b.m); + for (let j = 0; j < b.m; j++) { + for (let k = 0; k < b.n; k++) { + res.mat[j] = res.mat[j] + a.mat[k] * b.mat[k][j]; + } + } + return res; + } + + static softmax(a: Tensor1D): Tensor1D { + const res = Tensor1D.__apply_unary_op(a, x => Math.exp(x)); + const sum_e = res.mat.reduce((a, b) => a + b); + for(let i = 0; i < a.n; ++i) { + res.mat[i] /= sum_e; + } + return res; + } +} diff --git a/scripts/solearn-js/tensors/Tensor2D.ts b/scripts/solearn-js/tensors/Tensor2D.ts new file mode 100644 index 0000000..d740692 --- /dev/null +++ b/scripts/solearn-js/tensors/Tensor2D.ts @@ -0,0 +1,134 @@ +import { Tensors } from "./Tensors"; + +export class Tensor2D { + n: number; + m: number; + mat: number[][]; + + constructor(mat: number[][]) { + this.n = mat.length; + this.m = mat[0].length; + this.mat = mat; + } + + static emptyTensor(n: number, m: number): Tensor2D { + const ts = new Tensor2D([]); + ts.n = n; + ts.m = m; + for(let i = 0; i < n; ++i) { + ts.mat.push([]); + } + return ts; + } + + static load(data: number[], n: number, m: number): Tensor2D { + const ts = Tensor2D.emptyTensor(n, m); + let ptr = 0; + for(let i = 0; i < n; ++i) { + for(let j = 0; j < m; ++j) { + ts.mat[i].push(ptr < data.length ? data[ptr] : 0.0); + ptr += 1; + } + } + return ts; + } + + static zerosTensor(n: number, m: number): Tensor2D { + return Tensor2D.load([], n, m); + } + + static cloneTensor(ts: Tensor2D): Tensor2D { + return Tensor2D.load(ts.mat.flat(), ts.n, ts.m); + } + + static __apply_unary_op(a: Tensor2D, op: (x: number) => number): Tensor2D { + const res = Tensor2D.zerosTensor(a.n, a.m); + for(let i = 0; i < res.n; ++i) { + for(let j = 0; j < res.m; ++j) { + res.mat[i][j] = op(a.mat[i][j]); + } + } + return res; + } + + static activation(a: Tensor2D, name: string): Tensor2D { + switch (name) { + case "relu": + return Tensor2D.__apply_unary_op(a, Tensors.__relu); + case "sigmoid": + return Tensor2D.__apply_unary_op(a, Tensors.__sigmoid); + case "tanh": + return Tensor2D.__apply_unary_op(a, Tensors.__tanh); + case "leaky_relu": + return Tensor2D.__apply_unary_op(a, Tensors.__leaky_relu); + case "linear": + default: + return Tensor2D.__apply_unary_op(a, Tensors.__linear); + } + } + + static __apply_binary_op = (a: Tensor2D, b: Tensor2D, op: (x: number, y: number) => number): Tensor2D => { + const res = Tensor2D.zerosTensor(a.n, a.m); + for(let i = 0; i < res.n; ++i) { + for(let j = 0; j < res.m; ++j) { + res.mat[i][j] = op(a.mat[i][j], b.mat[i][j]); + } + } + return res; + } + + static add(a: Tensor2D, b: Tensor2D): Tensor2D { + return Tensor2D.__apply_binary_op(a, b, Tensors.__add); + } + + static add_scalar(a: Tensor2D, num: number): Tensor2D { + const res = Tensor2D.zerosTensor(a.n, a.m); + for(let i = 0; i < res.n; ++i) { + for(let j = 0; j < res.m; ++j) { + res.mat[i][j] = a.mat[i][j] + num; + } + } + return res; + } + + static mul(a: Tensor2D, b: Tensor2D): Tensor2D { + return Tensor2D.__apply_binary_op(a, b, Tensors.__mul); + } + + static mul_scalar(a: Tensor2D, num: number): Tensor2D { + const res = Tensor2D.zerosTensor(a.n, a.m); + for(let i = 0; i < res.n; ++i) { + for(let j = 0; j < res.m; ++j) { + res.mat[i][j] = a.mat[i][j] * num; + } + } + return res; + } + + static rescale(a: Tensor2D, scale: number, offset: number): Tensor2D { + return Tensor2D.__apply_unary_op(a, (x) => x * scale + offset); + } + + static matMul(a: Tensor2D, b: Tensor2D): Tensor2D { + const res = Tensor2D.zerosTensor(a.n, b.m); + for(let i = 0; i < res.n; ++i) { + for(let j = 0; j < res.m; ++j) { + for(let k = 0; k < a.m; ++k) { + res.mat[i][j] += a.mat[i][k] * b.mat[k][j]; + } + } + } + return res; + } + + static softmax(a: Tensor2D): Tensor2D { + const res = Tensor2D.__apply_unary_op(a, x => Math.exp(x)); + const sum_e = res.mat.flat().reduce((a, b) => a + b); + for(let i = 0; i < a.n; ++i) { + for(let j = 0; j < a.m; ++j) { + res.mat[i][j] /= sum_e; + } + } + return res; + } +} diff --git a/scripts/solearn-js/tensors/Tensor3D.ts b/scripts/solearn-js/tensors/Tensor3D.ts new file mode 100644 index 0000000..8f9a260 --- /dev/null +++ b/scripts/solearn-js/tensors/Tensor3D.ts @@ -0,0 +1,205 @@ +import { Tensors } from "./Tensors"; +import { Tensor1D } from "./Tensor1D"; +import type { Tensor4D } from "./Tensor4D"; + +export class Tensor3D { + n: number; + m: number; + p: number; + mat: number[][][]; + + constructor(mat: number[][][]) { + this.n = mat.length; + this.m = mat[0].length; + this.p = mat[0][0].length; + this.mat = mat; + } + + static emptyTensor(n: number, m: number, p: number): Tensor3D { + const ts = new Tensor3D([]); + ts.n = n; + ts.m = m; + ts.p = p; + for(let i = 0; i < n; ++i) { + ts.mat.push([]); + for(let j = 0; j < m; ++j) { + ts.mat[i].push([]); + } + } + return ts; + } + + static load(data: number[], n: number, m: number, p: number): Tensor3D { + const ts = Tensor3D.emptyTensor(n, m, p); + let ptr = 0; + for(let i = 0; i < n; ++i) { + for(let j = 0; j < m; ++j) { + for(let k = 0; k < p; ++k) { + ts.mat[i][j].push(ptr < data.length ? data[ptr] : 0.0); + ptr += 1; + } + } + } + return ts; + } + + static zerosTensor(n: number, m: number, p: number): Tensor3D { + return Tensor3D.load([], n, m, p); + } + + static cloneTensor(ts: Tensor3D): Tensor3D { + return Tensor3D.load(ts.mat.flat(2), ts.n, ts.m, ts.p); + } + + static flat(a: Tensor3D): Tensor1D { + return new Tensor1D(a.mat.flat(2)); + } + + static __apply_unary_op(a: Tensor3D, op: (x: number) => number): Tensor3D { + const res = Tensor3D.emptyTensor(a.n, a.m, a.p); + for(let i = 0; i < res.n; ++i) { + for(let j = 0; j < res.m; ++j) { + for(let k = 0; k < res.p; ++k) { + res.mat[i][j][k] = op(a.mat[i][j][k]); + } + } + } + return res; + } + + static activation(a: Tensor3D, name: string): Tensor3D { + switch (name) { + case "relu": + return Tensor3D.__apply_unary_op(a, Tensors.__relu); + case "sigmoid": + return Tensor3D.__apply_unary_op(a, Tensors.__sigmoid); + case "tanh": + return Tensor3D.__apply_unary_op(a, Tensors.__tanh); + case "leaky_relu": + return Tensor3D.__apply_unary_op(a, Tensors.__leaky_relu); + case "linear": + default: + return Tensor3D.__apply_unary_op(a, Tensors.__linear); + } + } + + static __apply_binary_op = (a: Tensor3D, b: Tensor3D, op: (x: number, y: number) => number): Tensor3D => { + const res = Tensor3D.emptyTensor(a.n, a.m, a.p); + for(let i = 0; i < res.n; ++i) { + for(let j = 0; j < res.m; ++j) { + for(let k = 0; k < res.p; ++k) { + res.mat[i][j][k] = op(a.mat[i][j][k], b.mat[i][j][k]); + } + } + } + return res; + } + + static add(a: Tensor3D, b: Tensor3D): Tensor3D { + return Tensor3D.__apply_binary_op(a, b, Tensors.__add); + } + + static add_scalar(a: Tensor3D, num: number): Tensor3D { + const res = Tensor3D.zerosTensor(a.n, a.m, a.p); + for(let i = 0; i < res.n; ++i) { + for(let j = 0; j < res.m; ++j) { + for(let k = 0; k < res.p; ++k) { + res.mat[i][j][k] = a.mat[i][j][k] + num; + } + } + } + return res; + } + + static mul(a: Tensor3D, b: Tensor3D): Tensor3D { + return Tensor3D.__apply_binary_op(a, b, Tensors.__mul); + } + + static mul_scalar(a: Tensor3D, num: number): Tensor3D { + const res = Tensor3D.zerosTensor(a.n, a.m, a.p); + for(let i = 0; i < res.n; ++i) { + for(let j = 0; j < res.m; ++j) { + for(let k = 0; k < res.p; ++k) { + res.mat[i][j][k] = a.mat[i][j][k] * num; + } + } + } + return res; + } + + static rescale(a: Tensor3D, scale: number, offset: number): Tensor3D { + return Tensor3D.__apply_unary_op(a, (x) => x * scale + offset); + } + + // Input: (W, H, D) + // Filter: (F_W, F_H, D, K) + static conv2D(a: Tensor3D, b: Tensor4D, stride: number[], padding: string) { + const w = a.n, h = a.m, d = a.p; + const f_w = b.n, f_h = b.m, k = b.q; + const size = [f_w, f_h]; + const { out, pad } = Tensors.getConvSize([w, h], size, stride, padding); + + const res = Tensor3D.zerosTensor(out[0], out[1], k); + for(let x = 0; x < out[0]; ++x) { + for(let y = 0; y < out[1]; ++y) { + for(let p = 0; p < k; ++p) { + let cell = 0; + for(let dx = 0; dx < size[0]; ++dx) { + for(let dy = 0; dy < size[1]; ++dy) { + const X = x*stride[0] + dx - pad[0], Y = y*stride[1] + dy - pad[1]; + if (X >= 0 && X < w && Y >= 0 && Y < h) { + for(let q = 0; q < d; ++q) { + cell += a.mat[X][Y][q] * b.mat[dx][dy][q][p]; + } + } + } + } + res.mat[x][y][p] = cell; + } + } + } + + // console.log(res); + + return res; + } + + // Input: (W, H, D) + static maxPooling2D(a: Tensor3D, size: number[], stride: number[], padding: string) { + const w = a.n, h = a.m, d = a.p; + const { out, pad } = Tensors.getConvSize([w, h], size, stride, padding); + + const res = Tensor3D.zerosTensor(out[0], out[1], d); + for(let x = 0; x < out[0]; ++x) { + for(let y = 0; y < out[1]; ++y) { + for(let p = 0; p < d; ++p) { + let cell = -1e9; + for(let dx = 0; dx < size[0]; ++dx) { + for(let dy = 0; dy < size[1]; ++dy) { + const X = x*stride[0] + dx - pad[0], Y = y*stride[1] + dy - pad[1]; + const isIn = (X >= 0 && X < w && Y >= 0 && Y < h); + const val = isIn ? a.mat[X][Y][p] : 0; + cell = Math.max(cell, val); + } + } + res.mat[x][y][p] = cell; + } + } + } + + return res; + } + + static softmax(a: Tensor3D): Tensor3D { + const res = Tensor3D.__apply_unary_op(a, x => Math.exp(x)); + const sum_e = res.mat.flat(2).reduce((a, b) => a + b); + for(let i = 0; i < a.n; ++i) { + for(let j = 0; j < a.m; ++j) { + for(let k = 0; k < a.p; ++k) { + res.mat[i][j][k] /= sum_e; + } + } + } + return res; + } +} diff --git a/scripts/solearn-js/tensors/Tensor4D.ts b/scripts/solearn-js/tensors/Tensor4D.ts new file mode 100644 index 0000000..e1004c0 --- /dev/null +++ b/scripts/solearn-js/tensors/Tensor4D.ts @@ -0,0 +1,232 @@ +import { Tensors } from "./Tensors"; +import { Tensor1D } from "./Tensor1D"; +import { Tensor2D } from "./Tensor2D"; + +export class Tensor4D { + n: number; + m: number; + p: number; + q: number; + mat: number[][][][]; + + constructor(mat: number[][][][]) { + this.n = mat.length; + this.m = mat[0].length; + this.p = mat[0][0].length; + this.q = mat[0][0][0].length; + this.mat = mat; + } + + static emptyTensor(n: number, m: number, p: number, q: number): Tensor4D { + const ts = new Tensor4D([]); + ts.n = n; + ts.m = m; + ts.p = p; + ts.q = q; + for(let i = 0; i < n; ++i) { + ts.mat.push([]); + for(let j = 0; j < m; ++j) { + ts.mat[i].push([]); + for(let k = 0; k < p; ++k) { + ts.mat[i][j].push([]); + } + } + } + return ts; + } + + static load(data: number[], n: number, m: number, p: number, q: number): Tensor4D { + const ts = Tensor4D.emptyTensor(n, m, p, q); + let ptr = 0; + for(let i = 0; i < n; ++i) { + for(let j = 0; j < m; ++j) { + for(let k = 0; k < p; ++k) { + for(let l = 0; l < q; ++l) { + ts.mat[i][j][k].push(ptr < data.length ? data[ptr] : 0.0); + ptr += 1; + } + } + } + } + return ts; + } + + + static zerosTensor(n: number, m: number, p: number, q: number): Tensor4D { + return Tensor4D.load([], n, m, p, q); + } + + static cloneTensor(ts: Tensor4D): Tensor4D { + return Tensor4D.load(ts.mat.flat(3), ts.n, ts.m, ts.p, ts.q); + } + + static flat(a: Tensor4D): Tensor1D { + return new Tensor1D(a.mat.flat(3)); + } + + static flatKeep1stDim(a: Tensor4D): Tensor2D { + return Tensor2D.load(a.mat.flat(3), a.n, a.m * a.p * a.q); + } + + static __apply_unary_op(a: Tensor4D, op: (x: number) => number): Tensor4D { + const res = Tensor4D.emptyTensor(a.n, a.m, a.p, a.q); + for(let i = 0; i < res.n; ++i) { + for(let j = 0; j < res.m; ++j) { + for(let k = 0; k < res.p; ++k) { + for(let l = 0; l < res.q; ++l) { + res.mat[i][j][k][l] = op(a.mat[i][j][k][l]); + } + } + } + } + return res; + } + + static activation(a: Tensor4D, name: string): Tensor4D { + switch (name) { + case "relu": + return Tensor4D.__apply_unary_op(a, Tensors.__relu); + case "sigmoid": + return Tensor4D.__apply_unary_op(a, Tensors.__sigmoid); + case "tanh": + return Tensor4D.__apply_unary_op(a, Tensors.__tanh); + case "leaky_relu": + return Tensor4D.__apply_unary_op(a, Tensors.__leaky_relu); + case "linear": + default: + return Tensor4D.__apply_unary_op(a, Tensors.__linear); + } + } + + static __apply_binary_op = (a: Tensor4D, b: Tensor4D, op: (x: number, y: number) => number): Tensor4D => { + const res = Tensor4D.emptyTensor(a.n, a.m, a.p, a.q); + for(let i = 0; i < res.n; ++i) { + for(let j = 0; j < res.m; ++j) { + for(let k = 0; k < res.p; ++k) { + for(let l = 0; l < res.p; ++l) { + res.mat[i][j][k][l] = op(a.mat[i][j][k][l], b.mat[i][j][k][l]); + } + } + } + } + return res; + } + + static add(a: Tensor4D, b: Tensor4D): Tensor4D { + return Tensor4D.__apply_binary_op(a, b, Tensors.__add); + } + + static add_scalar(a: Tensor4D, num: number): Tensor4D { + const res = Tensor4D.zerosTensor(a.n, a.m, a.p, a.q); + for(let i = 0; i < res.n; ++i) { + for(let j = 0; j < res.m; ++j) { + for(let k = 0; k < res.p; ++k) { + for(let l = 0; l < res.p; ++l) { + res.mat[i][j][k][l] = a.mat[i][j][k][l] + num; + } + } + } + } + return res; + } + + static mul(a: Tensor4D, b: Tensor4D): Tensor4D { + return Tensor4D.__apply_binary_op(a, b, Tensors.__mul); + } + + static mul_scalar(a: Tensor4D, num: number): Tensor4D { + const res = Tensor4D.zerosTensor(a.n, a.m, a.p, a.q); + for(let i = 0; i < res.n; ++i) { + for(let j = 0; j < res.m; ++j) { + for(let k = 0; k < res.p; ++k) { + for(let l = 0; l < res.p; ++l) { + res.mat[i][j][k][l] = a.mat[i][j][k][l] * num; + } + } + } + } + return res; + } + + static rescale(a: Tensor4D, scale: number, offset: number): Tensor4D { + return Tensor4D.__apply_unary_op(a, (x) => x * scale + offset); + } + + // Input: (N, W, H, D) + // Filter: (F_W, F_H, D, K) + static conv2D(a: Tensor4D, b: Tensor4D, stride: number[], padding: string) { + const n = a.n, w = a.m, h = a.p, d = a.q; + const f_w = b.n, f_h = b.m, k = b.q; + const size = [f_w, f_h]; + const { out, pad } = Tensors.getConvSize([w, h], size, stride, padding); + + const res = Tensor4D.zerosTensor(n, out[0], out[1], k); + for(let i = 0; i < n; ++i) { + for(let x = 0; x < out[0]; ++x) { + for(let y = 0; y < out[1]; ++y) { + for(let p = 0; p < k; ++p) { + let cell = 0; + for(let dx = 0; dx < size[0]; ++dx) { + for(let dy = 0; dy < size[1]; ++dy) { + const X = x*stride[0] + dx - pad[0], Y = y*stride[1] + dy - pad[1]; + if (X >= 0 && X < w && Y >= 0 && Y < h) { + for(let q = 0; q < d; ++q) { + cell += a.mat[i][X][Y][q] * b.mat[dx][dy][q][p]; + } + } + } + } + res.mat[i][x][y][p] = cell; + } + } + } + } + + // console.log(res); + + return res; + } + + // Input: (N, W, H, D) + static maxPooling2D(a: Tensor4D, size: number[], stride: number[], padding: string) { + const n = a.n, w = a.m, h = a.p, d = a.q; + const { out, pad } = Tensors.getConvSize([w, h], size, stride, padding); + + const res = Tensor4D.zerosTensor(n, out[0], out[1], d); + for(let i = 0; i < n; ++i) { + for(let x = 0; x < out[0]; ++x) { + for(let y = 0; y < out[1]; ++y) { + for(let p = 0; p < d; ++p) { + let cell = -1e9; + for(let dx = 0; dx < size[0]; ++dx) { + for(let dy = 0; dy < size[1]; ++dy) { + const X = x*stride[0] + dx - pad[0], Y = y*stride[1] + dy - pad[1]; + const isIn = (X >= 0 && X < w && Y >= 0 && Y < h); + const val = isIn ? a.mat[i][X][Y][p] : 0; + cell = Math.max(cell, val); + } + } + res.mat[i][x][y][p] = cell; + } + } + } + } + + return res; + } + + static softmax(a: Tensor4D): Tensor4D { + const res = Tensor4D.__apply_unary_op(a, x => Math.exp(x)); + const sum_e = res.mat.flat(3).reduce((a, b) => a + b); + for(let i = 0; i < a.n; ++i) { + for(let j = 0; j < a.m; ++j) { + for(let k = 0; k < a.p; ++k) { + for(let l = 0; l < a.q; ++l) { + res.mat[i][j][k][l] /= sum_e; + } + } + } + } + return res; + } +} diff --git a/scripts/solearn-js/tensors/Tensors.ts b/scripts/solearn-js/tensors/Tensors.ts new file mode 100644 index 0000000..b3facd5 --- /dev/null +++ b/scripts/solearn-js/tensors/Tensors.ts @@ -0,0 +1,30 @@ +export class Tensors { + static __linear = (x: number): number => x; + static __relu = (x: number): number => Math.max(x, 0); + static __leaky_relu = (x: number): number => x > 0 ? x : x * 0.2; + static __sigmoid = (x: number): number => 1 / (1 + Math.exp(-x)); + static __tanh = (x: number): number => Math.tanh(x); + + static __add = (a: number, b: number): number => a + b; + static __mul = (a: number, b: number): number => a * b; + + static __subMax0(a: number, b: number): number { + return a > b ? a - b : 0; + } + + static getConvSize(dim: number[], size: number[], stride: number[], padding: string) { + const out = [], pad = []; + for(let i = 0; i < 2; ++i) { + if (padding == "same") { + out.push((dim[i] + stride[i] - 1) / stride[i]); + const total_pad = (dim[i] % stride[i] == 0) ? Math.max(size[i] - stride[i], 0) : Math.max(size[i] - dim[i] % stride[i], 0); + pad.push(total_pad / 2); + } else if (padding == "valid") { + // TODO: What if dim[i] < size[i] + out.push((dim[i] - size[i]) / stride[i] + 1); + pad.push(0); + } + } + return { out, pad }; + } +} From 53aacb29939e42c682cfe1185d357f090621fb67 Mon Sep 17 00:00:00 2001 From: rein-nbc Date: Thu, 30 May 2024 18:31:23 +0700 Subject: [PATCH 81/82] (WIP) --- scripts/solearn-js/layers/Layers.ts | 148 +++++++++++++++++++++ scripts/solearn-js/models/Sequential.ts | 164 ++++++++++++++++++++++++ scripts/solearn-js/test_sequential.ts | 43 +++++++ scripts/solearn-js/utils/utils.ts | 24 ++++ 4 files changed, 379 insertions(+) create mode 100644 scripts/solearn-js/layers/Layers.ts create mode 100644 scripts/solearn-js/models/Sequential.ts create mode 100644 scripts/solearn-js/test_sequential.ts create mode 100644 scripts/solearn-js/utils/utils.ts diff --git a/scripts/solearn-js/layers/Layers.ts b/scripts/solearn-js/layers/Layers.ts new file mode 100644 index 0000000..d82129b --- /dev/null +++ b/scripts/solearn-js/layers/Layers.ts @@ -0,0 +1,148 @@ +import { Tensors } from "../tensors/Tensors"; +import { Tensor1D } from "../tensors/Tensor1D"; +import { Tensor2D } from "../tensors/Tensor2D"; +import { Tensor3D } from "../tensors/Tensor3D"; +import { Tensor4D } from "../tensors/Tensor4D"; + +export class RescaleLayer { + scale: number; + offset: number; + + constructor(scale: number, offset: number) { + this.scale = scale; + this.offset = offset; + } + + forward(x: Tensor3D): Tensor3D { + // console.log("Rescale"); + return Tensor3D.rescale(x, this.scale, this.offset); + } +} + +export class FlattenLayer { + constructor() {} + + forward(x: Tensor3D): Tensor1D { + // console.log("Flatten"); + return Tensor3D.flat(x); + } +} + +export class DenseLayer { + input_dim: number; + out_dim: number; + activation: string; + bias: boolean; + w: Tensor2D; + b: Tensor1D; + + constructor(input_dim: number, out_dim: number, activation: string, bias: boolean, w: Tensor2D, b: Tensor1D) { + this.input_dim = input_dim; + this.out_dim = out_dim; + this.activation = activation; + this.bias = bias; + this.w = w; + this.b = b; + } + + forward(x: Tensor1D) { + // console.log("Dense"); + const y = Tensor1D.add(Tensor1D.matMul(x, this.w), this.b); + const z = Tensor1D.activation(y, this.activation); + return z; + } +} + +export class MaxPooling2DLayer { + size: number[]; + stride: number[]; + padding: string; + + constructor(size: number[], stride: number[], padding: string) { + this.size = size; + this.stride = stride; + this.padding = padding; + } + + forward(x: Tensor3D): Tensor3D { + // console.log("MaxPooling2D"); + const y = Tensor3D.maxPooling2D(x, this.size, this.stride, this.padding); + return y; + } +} + +export class Conv2DLayer { + filters: number; + size: number[]; + stride: number[]; + padding: string; + activation: string; + w: Tensor4D; + b: Tensor1D; + + constructor(filters: number, size: number[], stride: number[], padding: string, activation: string, w: Tensor4D, b: Tensor1D) { + this.filters = filters; + this.size = size; + this.stride = stride; + this.padding = padding; + this.activation = activation; + this.w = w; + this.b = b; + } + + forward(x: Tensor3D): Tensor3D { + // console.log("Conv2D"); + const y = Tensor3D.conv2D(x, this.w, this.stride, this.padding); + const z = Tensor3D.add(y, this.b); + const t = Tensor3D.activation(z, this.activation); + return t; + } +} + +export class EmbeddingLayer { + inputDim: number; + outputDim: number; + w: Tensor2D; + + constructor(inputDim: number, outputDim: number, w: Tensor2D) { + this.inputDim = inputDim; + this.outputDim = outputDim; + this.w = w; + } + + forward(x: number): Tensor1D { + return new Tensor1D(this.w.mat[x]); + } +} + +export class SimpleRNNLayer { + units: number; + activation: string; + w_h: Tensor2D; + w_x: Tensor2D; + b: Tensor1D; + states: Tensor1D; + + constructor(units: number, activation: string, w_h: Tensor2D, w_x: Tensor2D, b: Tensor1D) { + this.units = units; + this.activation = activation; + this.w_h = w_h; + this.w_x = w_x; + this.b = b; + this.states = Tensor1D.zerosTensor(this.units); + } + + reset_state() { + this.states = Tensor1D.zerosTensor(this.units); + } + + forward(x: Tensor1D): Tensor1D { + // console.log("SimpleRNN"); + const y_h = Tensor1D.matMul(this.states, this.w_h); + const y_x = Tensor1D.matMul(x, this.w_x); + const y = Tensor1D.add(Tensor1D.add(y_h, y_x), this.b); + const z = Tensor1D.activation(y, this.activation); + this.states = z; + return z; + } +} diff --git a/scripts/solearn-js/models/Sequential.ts b/scripts/solearn-js/models/Sequential.ts new file mode 100644 index 0000000..5b8e682 --- /dev/null +++ b/scripts/solearn-js/models/Sequential.ts @@ -0,0 +1,164 @@ +import { + RescaleLayer, + FlattenLayer, + DenseLayer, + MaxPooling2DLayer, + Conv2DLayer, + EmbeddingLayer, + SimpleRNNLayer, +} from "../layers/Layers"; + +import { Tensors } from "../tensors/Tensors"; +import { Tensor1D } from "../tensors/Tensor1D"; +import { Tensor2D } from "../tensors/Tensor2D"; +import { Tensor3D } from "../tensors/Tensor3D"; +import { Tensor4D } from "../tensors/Tensor4D"; + +import { base64ToFloatArray } from '../utils/utils'; + +class SequentialModel { + layers: any[]; + + constructor(layers: any[]) { + this.layers = layers; + } + + forward(x: any) { + // console.log(x); + for (const layer of this.layers) { + x = layer.forward(x); + // console.log(x); + } + return x; + } +} + +export function loadModel(layersConfig: any, weights_b64: string) { + const layers = []; + + const weights = base64ToFloatArray(weights_b64); + + let dim: any = null; + let p = 0; + let inputDim = []; + for(const info of layersConfig.config.layers) { + // console.log(info.class_name); + if (info.class_name == "InputLayer") { + dim = info.config.batch_input_shape.slice(1); + if (dim.length == 1 && dim[0] == null) { + dim = 1; + } + inputDim = dim; + } else if (info.class_name == "Rescaling") { + layers.push(new RescaleLayer(info.config.scale, info.config.offset)) + } else if (info.class_name == "Flatten") { + layers.push(new FlattenLayer()) + dim = [dim.reduce((a: number, b: number) => a * b)] + } else if (info.class_name == "Dense") { + const nxt_dim = [info.config.units]; + const w_size = dim[0] * nxt_dim[0]; + const b_size = nxt_dim[0]; + + const w_array = Array.from(weights.subarray(p, p + w_size)); + p += w_size; + const b_array = Array.from(weights.subarray(p, p + b_size)); + p += b_size; + + const w_tensor = Tensor2D.load(w_array, dim[0], nxt_dim[0]); + const b_tensor = Tensor1D.load(b_array, nxt_dim[0]); + const activation = info.config.activation; + + // console.log(w_tensor); + // console.log(b_tensor); + + layers.push(new DenseLayer(dim, nxt_dim[0], activation, true, w_tensor, b_tensor)); + + dim = nxt_dim; + } else if (info.class_name == "MaxPooling2D") { + const [w, h, d] = dim; + const [f_w, f_h] = info.config.pool_size; + const [s_w, s_h] = info.config.strides; + const padding = info.config.padding; + + layers.push(new MaxPooling2DLayer([f_w, f_h], [s_w, s_h], padding)); + + const { out } = Tensors.getConvSize([w, h], [f_w, f_h], [s_w, s_h], padding); + dim = [out[0], out[1], d]; + // console.log(L, R, T, B); + } else if (info.class_name == "Conv2D") { + const [w, h, d] = dim; + const [f_w, f_h] = info.config.kernel_size; + const [s_w, s_h] = info.config.strides; + const filters = info.config.filters + const padding = info.config.padding; + const activation = info.config.activation; + + const w_size = f_w * f_h * d * filters; + const b_size = filters; + + const w_array = Array.from(weights.subarray(p, p + w_size)); + p += w_size; + const b_array = Array.from(weights.subarray(p, p + b_size)); + p += b_size; + + const w_tensor = Tensor4D.load(w_array, f_w, f_h, d, filters); + const b_tensor = Tensor1D.load(b_array, filters); + + // console.log(w_tensor); + // console.log(b_tensor); + + layers.push(new Conv2DLayer(filters, [f_w, f_h], [s_w, s_h], padding, activation, w_tensor, b_tensor)); + + const { out } = Tensors.getConvSize([w, h], [f_w, f_h], [s_w, s_h], padding); + dim = [out[0], out[1], filters]; + // console.log(L, R, T, B); + } else if (info.class_name == "Embedding") { + const inputDim = info.config.input_dim; + const outputDim = info.config.output_dim; + + const w_size = inputDim * outputDim; + + const w_array = weights.subarray(p, p + w_size); + p += w_size; + + const w_tensor = new Tensor2D(w_array, inputDim, outputDim); + + // console.log(w_tensor); + // console.log(b_tensor); + + layers.push(new EmbeddingLayer(inputDim, outputDim, w_tensor)); + + dim = [outputDim]; + } else if (info.class_name == "SimpleRNN") { + const units = info.config.units; + const activation = info.config.activation; + const inputDim = dim[0]; + + const wx_size = inputDim * units; + const wx_array = weights.subarray(p, p + wx_size); + p += wx_size; + const wx_tensor = new Tensor2D(wx_array, inputDim, units); + + const wh_size = units * units; + const wh_array = weights.subarray(p, p + wh_size); + p += wh_size; + const wh_tensor = new Tensor2D(wh_array, units, units); + + const b_size = units; + const b_array = weights.subarray(p, p + b_size); + p += b_size; + const b_tensor = new Tensor1D(b_array, units); + + // console.log(w_tensor); + // console.log(b_tensor); + + layers.push(new SimpleRNNLayer(units, activation, wh_tensor, wx_tensor, b_tensor)); + + dim = [units]; + } + // console.log(dim); + } + const model = new SequentialModel(layers); + + return { model, inputDim }; +} diff --git a/scripts/solearn-js/test_sequential.ts b/scripts/solearn-js/test_sequential.ts new file mode 100644 index 0000000..4aee657 --- /dev/null +++ b/scripts/solearn-js/test_sequential.ts @@ -0,0 +1,43 @@ +import { ethers } from "hardhat"; +import fs from 'fs'; +import { loadModel } from "./models/Sequential"; + +async function main() { + const modelPath = 'sample-models/nft_mlp_10x10.json'; + const imgPath = 'sample-images/nft/cryptoadz/000.png'; + + const modelJson = fs.readFileSync(modelPath).toString(); + const modelObj = JSON.parse(modelJson); + + const model = loadModel() + + const layersConfig = modelObj.layers_config; + const weights_b64 = modelObj.weights_b64; + + const imgRaw = fs.readFileSync(imgPath); + console.log("imgRaw: ", imgRaw); + // TODO: Get inputDim from TextRNN and use the width and height from inputDim instead + // How to get input image size? + + const model = await implementContract.getInfo(); + const inputDim = model[0]; + if (inputDim.length < 2) { + throw new Error("Invalid model input dim"); + } + const h = inputDim[0].toNumber(); + const w = inputDim[1].toNumber(); + + const img = sharp(imgRaw); + const imgBuffer = await img.removeAlpha().resize(w, h).raw().toBuffer(); + const imgArray = [...imgBuffer]; + const pixelsFlat = imgArray.map((b: any) => fromInt(b)); + const pixels: ethers.BigNumber[][][] = pixelsToImage(pixelsFlat, h, w, 3); + +} + +// We recommend this pattern to be able to use async/await everywhere +// and properly handle errors. +main().catch((error) => { + console.error(error); + process.exitCode = 1; +}); diff --git a/scripts/solearn-js/utils/utils.ts b/scripts/solearn-js/utils/utils.ts new file mode 100644 index 0000000..919a88f --- /dev/null +++ b/scripts/solearn-js/utils/utils.ts @@ -0,0 +1,24 @@ + + +// Modified from https://gist.github.com/sketchpunk/f5fa58a56dcfe6168a9328e7c32a4fd4 +export function base64ToFloatArray(base64: string) { + // Base64 string converted to a char array + const blob = window.atob(base64); + // How many floats can be made, but be even + const fLen = blob.length / Float32Array.BYTES_PER_ELEMENT; + // ArrayBuffer/DataView to convert 4 bytes into 1 float. + const dView = new DataView( new ArrayBuffer(Float32Array.BYTES_PER_ELEMENT) ); + // Final Output at the correct size + const fAry = new Float32Array(fLen); + // Position + let p = 0; + + for(let j=0; j < fLen; j++){ + p = j * 4; + for(let b = 0; b < 4; ++b) { + dView.setUint8(b,blob.charCodeAt(p+b)); + } + fAry[j] = dView.getFloat32(0,true); + } + return fAry; +} \ No newline at end of file From 29ac6707dfb42982ee01ac95493da9718f029360 Mon Sep 17 00:00:00 2001 From: rein-nbc Date: Fri, 31 May 2024 18:24:57 +0700 Subject: [PATCH 82/82] (WIP) --- scripts/solearn-js/layers/Layers.ts | 5 +- scripts/solearn-js/models/Sequential.ts | 26 +++++---- scripts/solearn-js/tensors/Tensor1D.ts | 13 +++-- scripts/solearn-js/tensors/Tensor2D.ts | 16 +++-- scripts/solearn-js/tensors/Tensor3D.ts | 19 ++++-- scripts/solearn-js/tensors/Tensor4D.ts | 22 ++++--- scripts/solearn-js/test_sequential.ts | 77 +++++++++++++++---------- scripts/solearn-js/utils/utils.ts | 26 ++------- 8 files changed, 121 insertions(+), 83 deletions(-) diff --git a/scripts/solearn-js/layers/Layers.ts b/scripts/solearn-js/layers/Layers.ts index d82129b..2234556 100644 --- a/scripts/solearn-js/layers/Layers.ts +++ b/scripts/solearn-js/layers/Layers.ts @@ -46,7 +46,10 @@ export class DenseLayer { } forward(x: Tensor1D) { - // console.log("Dense"); + console.log("Dense"); + // console.log(x); + // console.log(this.w); + // console.log(this.b); const y = Tensor1D.add(Tensor1D.matMul(x, this.w), this.b); const z = Tensor1D.activation(y, this.activation); return z; diff --git a/scripts/solearn-js/models/Sequential.ts b/scripts/solearn-js/models/Sequential.ts index 5b8e682..65c62b0 100644 --- a/scripts/solearn-js/models/Sequential.ts +++ b/scripts/solearn-js/models/Sequential.ts @@ -33,7 +33,13 @@ class SequentialModel { } } -export function loadModel(layersConfig: any, weights_b64: string) { +export class ImageClassifier extends SequentialModel { + forward(x: Tensor3D): Tensor1D { + return super.forward(x); + } +} + +export function loadModel(layersConfig: any, weights_b64: string, type: { new(...args : any[]): T ;}): { model: T, inputDim: any } { const layers = []; const weights = base64ToFloatArray(weights_b64); @@ -118,10 +124,10 @@ export function loadModel(layersConfig: any, weights_b64: string) { const w_size = inputDim * outputDim; - const w_array = weights.subarray(p, p + w_size); + const w_array = Array.from(weights.subarray(p, p + w_size)); p += w_size; - const w_tensor = new Tensor2D(w_array, inputDim, outputDim); + const w_tensor = Tensor2D.load(w_array, inputDim, outputDim); // console.log(w_tensor); // console.log(b_tensor); @@ -135,19 +141,19 @@ export function loadModel(layersConfig: any, weights_b64: string) { const inputDim = dim[0]; const wx_size = inputDim * units; - const wx_array = weights.subarray(p, p + wx_size); + const wx_array = Array.from(weights.subarray(p, p + wx_size)); p += wx_size; - const wx_tensor = new Tensor2D(wx_array, inputDim, units); + const wx_tensor = Tensor2D.load(wx_array, inputDim, units); const wh_size = units * units; - const wh_array = weights.subarray(p, p + wh_size); + const wh_array = Array.from(weights.subarray(p, p + wh_size)); p += wh_size; - const wh_tensor = new Tensor2D(wh_array, units, units); + const wh_tensor = Tensor2D.load(wh_array, units, units); const b_size = units; - const b_array = weights.subarray(p, p + b_size); + const b_array = Array.from(weights.subarray(p, p + b_size)); p += b_size; - const b_tensor = new Tensor1D(b_array, units); + const b_tensor = Tensor1D.load(b_array, units); // console.log(w_tensor); // console.log(b_tensor); @@ -158,7 +164,7 @@ export function loadModel(layersConfig: any, weights_b64: string) { } // console.log(dim); } - const model = new SequentialModel(layers); + const model = new type(layers); return { model, inputDim }; } diff --git a/scripts/solearn-js/tensors/Tensor1D.ts b/scripts/solearn-js/tensors/Tensor1D.ts index 6fc594f..a287a50 100644 --- a/scripts/solearn-js/tensors/Tensor1D.ts +++ b/scripts/solearn-js/tensors/Tensor1D.ts @@ -5,13 +5,18 @@ export class Tensor1D { n: number; mat: number[]; - constructor(mat: number[]) { - this.n = mat.length; - this.mat = mat; + constructor(mat?: number[]) { + if (mat) { + this.n = mat.length; + this.mat = mat; + } else { + this.n = 0; + this.mat = []; + } } static emptyTensor(n: number): Tensor1D { - const ts = new Tensor1D([]); + const ts = new Tensor1D(); ts.n = n; return ts; } diff --git a/scripts/solearn-js/tensors/Tensor2D.ts b/scripts/solearn-js/tensors/Tensor2D.ts index d740692..a9949a1 100644 --- a/scripts/solearn-js/tensors/Tensor2D.ts +++ b/scripts/solearn-js/tensors/Tensor2D.ts @@ -5,14 +5,20 @@ export class Tensor2D { m: number; mat: number[][]; - constructor(mat: number[][]) { - this.n = mat.length; - this.m = mat[0].length; - this.mat = mat; + constructor(mat?: number[][]) { + if (mat) { + this.n = mat.length; + this.m = mat[0].length; + this.mat = mat; + } else { + this.n = 0; + this.m = 0; + this.mat = []; + } } static emptyTensor(n: number, m: number): Tensor2D { - const ts = new Tensor2D([]); + const ts = new Tensor2D(); ts.n = n; ts.m = m; for(let i = 0; i < n; ++i) { diff --git a/scripts/solearn-js/tensors/Tensor3D.ts b/scripts/solearn-js/tensors/Tensor3D.ts index 8f9a260..fd98f09 100644 --- a/scripts/solearn-js/tensors/Tensor3D.ts +++ b/scripts/solearn-js/tensors/Tensor3D.ts @@ -8,15 +8,22 @@ export class Tensor3D { p: number; mat: number[][][]; - constructor(mat: number[][][]) { - this.n = mat.length; - this.m = mat[0].length; - this.p = mat[0][0].length; - this.mat = mat; + constructor(mat?: number[][][]) { + if (mat) { + this.n = mat.length; + this.m = mat[0].length; + this.p = mat[0][0].length; + this.mat = mat; + } else { + this.n = 0; + this.m = 0; + this.p = 0; + this.mat = []; + } } static emptyTensor(n: number, m: number, p: number): Tensor3D { - const ts = new Tensor3D([]); + const ts = new Tensor3D(); ts.n = n; ts.m = m; ts.p = p; diff --git a/scripts/solearn-js/tensors/Tensor4D.ts b/scripts/solearn-js/tensors/Tensor4D.ts index e1004c0..6b962a4 100644 --- a/scripts/solearn-js/tensors/Tensor4D.ts +++ b/scripts/solearn-js/tensors/Tensor4D.ts @@ -9,16 +9,24 @@ export class Tensor4D { q: number; mat: number[][][][]; - constructor(mat: number[][][][]) { - this.n = mat.length; - this.m = mat[0].length; - this.p = mat[0][0].length; - this.q = mat[0][0][0].length; - this.mat = mat; + constructor(mat?: number[][][][]) { + if (mat) { + this.n = mat.length; + this.m = mat[0].length; + this.p = mat[0][0].length; + this.q = mat[0][0][0].length; + this.mat = mat; + } else { + this.n = 0; + this.m = 0; + this.p = 0; + this.q = 0; + this.mat = []; + } } static emptyTensor(n: number, m: number, p: number, q: number): Tensor4D { - const ts = new Tensor4D([]); + const ts = new Tensor4D(); ts.n = n; ts.m = m; ts.p = p; diff --git a/scripts/solearn-js/test_sequential.ts b/scripts/solearn-js/test_sequential.ts index 4aee657..3ca2173 100644 --- a/scripts/solearn-js/test_sequential.ts +++ b/scripts/solearn-js/test_sequential.ts @@ -1,38 +1,57 @@ import { ethers } from "hardhat"; import fs from 'fs'; -import { loadModel } from "./models/Sequential"; +import sharp from 'sharp'; +import { ImageClassifier, loadModel } from "./models/Sequential"; +import { Tensor3D } from "./tensors/Tensor3D"; +import { Tensor1D } from "./tensors/Tensor1D"; + +export function pixelsToImage(pixels: number[], h: number, w: number, c: number): number[][][] { + let ptr = 0; + let img: number[][][] = []; + for(let i = 0; i < h; ++i) { + img.push([]); + for(let j = 0; j < w; ++j) { + img[i].push([]); + for(let k = 0; k < c; ++k) { + img[i][j].push(pixels[ptr]); + ++ptr; + } + } + } + return img; +} async function main() { - const modelPath = 'sample-models/nft_mlp_10x10.json'; - const imgPath = 'sample-images/nft/cryptoadz/000.png'; - - const modelJson = fs.readFileSync(modelPath).toString(); - const modelObj = JSON.parse(modelJson); - - const model = loadModel() - - const layersConfig = modelObj.layers_config; - const weights_b64 = modelObj.weights_b64; - - const imgRaw = fs.readFileSync(imgPath); - console.log("imgRaw: ", imgRaw); - // TODO: Get inputDim from TextRNN and use the width and height from inputDim instead - // How to get input image size? - - const model = await implementContract.getInfo(); - const inputDim = model[0]; - if (inputDim.length < 2) { - throw new Error("Invalid model input dim"); - } - const h = inputDim[0].toNumber(); - const w = inputDim[1].toNumber(); + const modelPath = 'sample-models/nft_mlp_10x10.json'; + const imgPath = 'sample-images/nft/cryptoadz/000.png'; + + const modelJson = fs.readFileSync(modelPath).toString(); + const modelObj = JSON.parse(modelJson); + + const layersConfig = modelObj.layers_config; + const weight_b64 = modelObj.weight_b64; + const classesName = modelObj.classes_name; + + const { model, inputDim } = loadModel(layersConfig, weight_b64, ImageClassifier); + + const imgRaw = fs.readFileSync(imgPath); + console.log("imgRaw: ", imgRaw); + + const h = inputDim[0]; + const w = inputDim[1]; + + const img = sharp(imgRaw); + const imgBuffer = await img.removeAlpha().resize(w, h).raw().toBuffer(); + const imgArray = [...imgBuffer]; + const pixels = pixelsToImage(imgArray, h, w, 3); + + const pixelsTensor = new Tensor3D(pixels) - const img = sharp(imgRaw); - const imgBuffer = await img.removeAlpha().resize(w, h).raw().toBuffer(); - const imgArray = [...imgBuffer]; - const pixelsFlat = imgArray.map((b: any) => fromInt(b)); - const pixels: ethers.BigNumber[][][] = pixelsToImage(pixelsFlat, h, w, 3); + const logits = model.forward(pixelsTensor); + const probs = Tensor1D.softmax(logits).mat; + const prediction = probs.indexOf(Math.max(...probs)) + console.log(classesName[prediction], probs[prediction]); } // We recommend this pattern to be able to use async/await everywhere diff --git a/scripts/solearn-js/utils/utils.ts b/scripts/solearn-js/utils/utils.ts index 919a88f..d66e14f 100644 --- a/scripts/solearn-js/utils/utils.ts +++ b/scripts/solearn-js/utils/utils.ts @@ -1,24 +1,8 @@ - - // Modified from https://gist.github.com/sketchpunk/f5fa58a56dcfe6168a9328e7c32a4fd4 -export function base64ToFloatArray(base64: string) { +export function base64ToFloatArray(base64: string): Float32Array { // Base64 string converted to a char array - const blob = window.atob(base64); - // How many floats can be made, but be even - const fLen = blob.length / Float32Array.BYTES_PER_ELEMENT; - // ArrayBuffer/DataView to convert 4 bytes into 1 float. - const dView = new DataView( new ArrayBuffer(Float32Array.BYTES_PER_ELEMENT) ); - // Final Output at the correct size - const fAry = new Float32Array(fLen); - // Position - let p = 0; - - for(let j=0; j < fLen; j++){ - p = j * 4; - for(let b = 0; b < 4; ++b) { - dView.setUint8(b,blob.charCodeAt(p+b)); - } - fAry[j] = dView.getFloat32(0,true); - } - return fAry; + const blob = Buffer.from(base64, 'base64'); + // Convert raw buffer to Float32Array + const floatArray = new Float32Array(blob.buffer); + return floatArray; } \ No newline at end of file