Address Contract Verified
Address
0x832D9f06970ddAc7BA49Be5a2cCad8f89Df74C13
Balance
0 ETH
Nonce
1
Code Size
3495 bytes
Creator
0x0e28A8f8...73C0 at tx 0xf5981332...78cc65
Indexed Transactions
0
Contract Bytecode
3495 bytes
0x6080604052600436106100e85760003560e01c80639b789b7e1161008a578063d9d6bd8611610059578063d9d6bd861461031f578063dbd9655414610345578063f4dc754b14610373578063fa544161146103a6576100e8565b80639b789b7e146102715780639e6371ba14610286578063a00745b6146102b9578063b64b3bed146102ec576100e8565b806365e4ad9e116100c657806365e4ad9e146101795780636d3c6275146101b45780636d892f7e146101e75780636f77926b14610222576100e8565b806303d6e81e146100ed5780632896f60b146100f75780632bef45951461013e575b600080fd5b6100f56103d9565b005b34801561010357600080fd5b5061012a6004803603602081101561011a57600080fd5b50356001600160a01b03166104f1565b604080519115158252519081900360200190f35b34801561014a57600080fd5b506100f56004803603604081101561016157600080fd5b506001600160a01b0381358116916020013516610523565b34801561018557600080fd5b5061012a6004803603604081101561019c57600080fd5b506001600160a01b0381358116916020013516610653565b3480156101c057600080fd5b5061012a600480360360208110156101d757600080fd5b50356001600160a01b0316610687565b3480156101f357600080fd5b506100f56004803603604081101561020a57600080fd5b506001600160a01b0381358116916020013516610690565b34801561022e57600080fd5b506102556004803603602081101561024557600080fd5b50356001600160a01b03166107b7565b604080516001600160a01b039092168252519081900360200190f35b34801561027d57600080fd5b506100f56107d5565b34801561029257600080fd5b506100f5600480360360208110156102a957600080fd5b50356001600160a01b031661088a565b3480156102c557600080fd5b5061012a600480360360208110156102dc57600080fd5b50356001600160a01b03166109b4565b3480156102f857600080fd5b506100f56004803603602081101561030f57600080fd5b50356001600160a01b03166109bd565b6100f56004803603602081101561033557600080fd5b50356001600160a01b0316610a79565b6100f56004803603604081101561035b57600080fd5b506001600160a01b0381358116916020013516610c85565b34801561037f57600080fd5b5061012a6004803603602081101561039657600080fd5b50356001600160a01b0316610c9c565b3480156103b257600080fd5b50610255600480360360208110156103c957600080fd5b50356001600160a01b0316610ca5565b336000908152602081905260409020546001600160a01b0316610443576040805162461bcd60e51b815260206004820181905260248201527f776f726b657220646f6573206e6f7420686176652061206a6f62206f66666572604482015290519081900360640190fd5b3360009081526020818152604080832080546001600160a01b031981169091556001909252808320805460ff19169055516001600160a01b039091169182913480156108fc0292909190818181858888f193505050501580156104aa573d6000803e3d6000fd5b50336000818152602081905260408082205490516001600160a01b0390911692917fac8bfc64efe7b663f325ca81c7468a291a868aacc74c8f91cdc5c8141c15e38a91a350565b6000805b6001600160a01b03831660009081526001602052604090205460ff16600381111561051c57fe5b1492915050565b813361052e826107b7565b6001600160a01b031614610589576040805162461bcd60e51b815260206004820152601a60248201527f776f726b6572206e6f742068697265642062792073656e646572000000000000604482015290519081900360640190fd5b6000610596338585610cfe565b60008181526002602052604090205490915060ff16156105fd576040805162461bcd60e51b815260206004820152601760248201527f6461707020616c726561647920617574686f72697a6564000000000000000000604482015290519081900360640190fd5b600081815260026020526040808220805460ff19166001179055516001600160a01b03808616929087169133917fde756a416a233cdb16c23a1fa5dcb3113164968df8607e0a4eeca25974b96e0391a450505050565b60006002600061066c61066586610ca5565b8686610cfe565b815260208101919091526040016000205460ff169392505050565b600060036104f5565b813361069b826107b7565b6001600160a01b0316146106f6576040805162461bcd60e51b815260206004820152601a60248201527f776f726b6572206e6f742068697265642062792073656e646572000000000000604482015290519081900360640190fd5b6000610703338585610cfe565b60008181526002602052604090205490915060ff161515600114610764576040805162461bcd60e51b815260206004820152601360248201527219185c1c081b9bdd08185d5d1a1bdc9a5e9959606a1b604482015290519081900360640190fd5b600081815260026020526040808220805460ff19169055516001600160a01b03808616929087169133917f4d2275ddb8a6d9c36c95476c2eaf9746c1785b4ab76a99719fd647b36da46cee91a450505050565b6001600160a01b039081166000908152602081905260409020541690565b60013360009081526001602052604090205460ff1660038111156107f557fe5b146108315760405162461bcd60e51b8152600401808060200182810382526022815260200180610d506022913960400191505060405180910390fd5b336000818152600160209081526040808320805460ff19166002179055908290528082205490516001600160a01b0390911692917f0cfa12ab8ee8dc6f9b68938d5e764dafed737d43dc5ec8443abf81e645276eb691a3565b60026001600160a01b03821660009081526001602052604090205460ff1660038111156108b357fe5b146108f8576040805162461bcd60e51b815260206004820152601060248201526f1ddbdc9ad95c881b9bdd081bdddb995960821b604482015290519081900360640190fd5b6001600160a01b03818116600090815260208190526040902054163314610966576040805162461bcd60e51b815260206004820152601c60248201527f6f6e6c79206f776e65722063616e2072657469726520776f726b657200000000604482015290519081900360640190fd5b6001600160a01b038116600081815260016020526040808220805460ff19166003179055513392917f657b373e1262c26d1f1a83e8949f0af9067fe48026b308e47eec5ef6b40ff25d91a350565b600060016104f5565b6001600160a01b03818116600090815260208190526040902054163314610a2b576040805162461bcd60e51b815260206004820152601f60248201527f6f6e6c792068697265722063616e2063616e63656c20746865206f6666657200604482015290519081900360640190fd5b6001600160a01b038116600081815260016020526040808220805460ff19166003179055513392917fac8bfc64efe7b663f325ca81c7468a291a868aacc74c8f91cdc5c8141c15e38a91a350565b610a82816104f1565b610ad3576040805162461bcd60e51b815260206004820152601760248201527f776f726b6572206973206e6f7420617661696c61626c65000000000000000000604482015290519081900360640190fd5b6001600160a01b038116610b2e576040805162461bcd60e51b815260206004820152601d60248201527f776f726b657220616464726573732063616e206e6f7420626520307830000000604482015290519081900360640190fd5b66038d7ea4c68000341015610b82576040805162461bcd60e51b815260206004820152601560248201527466756e64696e672062656c6f77206d696e696d756d60581b604482015290519081900360640190fd5b6729a2241af62c0000341115610bd7576040805162461bcd60e51b815260206004820152601560248201527466756e64696e672061626f7665206d6178696d756d60581b604482015290519081900360640190fd5b6001600160a01b03811660009081526020818152604080832080546001600160a01b03191633179055600191829052909120805460ff1916828002179055506040516001600160a01b038216903480156108fc02916000818181858888f19350505050158015610c4b573d6000803e3d6000fd5b5060405133906001600160a01b038316907f2e0aa97ef0e6f4f76319861c90e91beec7a7a44a698cab856dfc1985a0c588f090600090a350565b610c8e82610a79565b610c988282610523565b5050565b600060026104f5565b600060026001600160a01b03831660009081526001602052604090205460ff166003811115610cd057fe5b14610cdc576000610cf8565b6001600160a01b03808316600090815260208190526040902054165b92915050565b604080516bffffffffffffffffffffffff19606095861b811660208084019190915294861b811660348301529290941b90911660488401528051603c818503018152605c909301905281519101209056fe776f726b6572206e6f74206973206e6f7420696e2070656e64696e67207374617465a26469706673582212208c53bf1eedc7351032f43e555009382924e5be081917cbd30b4284e0f572d9bc64736f6c63430007040033
Verified Source Code Full Match
Compiler: v0.7.4+commit.3f05b770
EVM: istanbul
Optimization: Yes (200 runs)
WorkerManager.sol 63 lines
// Copyright 2010 Cartesi Pte. Ltd.
// SPDX-License-Identifier: Apache-2.0
// Licensed under the Apache License, Version 2.0 (the "License"); you may not use
// this file except in compliance with the License. You may obtain a copy of the
// License at http://www.apache.org/licenses/LICENSE-2.0
// Unless required by applicable law or agreed to in writing, software distributed
// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
// CONDITIONS OF ANY KIND, either express or implied. See the License for the
// specific language governing permissions and limitations under the License.
/// @title WorkerManager
/// @author Danilo Tuler
pragma solidity ^0.7.0;
interface WorkerManager {
/// @notice Returns true if worker node is available
/// @param workerAddress address of the worker node
function isAvailable(address workerAddress) external view returns (bool);
/// @notice Returns true if worker node is pending
/// @param workerAddress address of the worker node
function isPending(address workerAddress) external view returns (bool);
/// @notice Get the owner of the worker node
/// @param workerAddress address of the worker node
function getOwner(address workerAddress) external view returns (address);
/// @notice Get the user of the worker node, which may not be the owner yet, or how was the previous owner of a retired node
function getUser(address workerAddress) external view returns (address);
/// @notice Returns true if worker node is owned by some user
function isOwned(address workerAddress) external view returns (bool);
/// @notice Asks the worker to work for the sender. Sender needs to pay something.
/// @param workerAddress address of the worker
function hire(address payable workerAddress) external payable;
/// @notice Called by the worker to accept the job
function acceptJob() external;
/// @notice Called by the worker to reject a job offer
function rejectJob() external payable;
/// @notice Called by the user to cancel a job offer
/// @param workerAddress address of the worker node
function cancelHire(address workerAddress) external;
/// @notice Called by the user to retire his worker.
/// @param workerAddress address of the worker to be retired
/// @dev this also removes all authorizations in place
function retire(address payable workerAddress) external;
/// @notice Returns true if worker node was retired by its owner
function isRetired(address workerAddress) external view returns (bool);
/// @notice Events signalling every state transition
event JobOffer(address indexed worker, address indexed user);
event JobAccepted(address indexed worker, address indexed user);
event JobRejected(address indexed worker, address indexed user);
event Retired(address indexed worker, address indexed user);
}
WorkerAuthManager.sol 54 lines
// Copyright 2020 Cartesi Pte. Ltd.
// SPDX-License-Identifier: Apache-2.0
// Licensed under the Apache License, Version 2.0 (the "License"); you may not use
// this file except in compliance with the License. You may obtain a copy of the
// License at http://www.apache.org/licenses/LICENSE-2.0
// Unless required by applicable law or agreed to in writing, software distributed
// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
// CONDITIONS OF ANY KIND, either express or implied. See the License for the
// specific language governing permissions and limitations under the License.
/// @title WorkerAuthManager
/// @author Danilo Tuler
pragma solidity ^0.7.0;
interface WorkerAuthManager {
/// @notice Gives worker permission to act on a DApp
/// @param _workerAddress address of the worker node to given permission
/// @param _dappAddress address of the dapp that permission will be given to
function authorize(address _workerAddress, address _dappAddress) external;
/// @notice Removes worker's permission to act on a DApp
/// @param _workerAddress address of the proxy that will lose permission
/// @param _dappAddresses addresses of dapps that will lose permission
function deauthorize(address _workerAddress, address _dappAddresses)
external;
/// @notice Returns is the dapp is authorized to be called by that worker
/// @param _workerAddress address of the worker
/// @param _dappAddress address of the DApp
function isAuthorized(address _workerAddress, address _dappAddress)
external
view
returns (bool);
/// @notice Get the owner of the worker node
/// @param workerAddress address of the worker node
function getOwner(address workerAddress) external view returns (address);
/// @notice A DApp has been authorized by a user for a worker
event Authorization(
address indexed user,
address indexed worker,
address indexed dapp
);
/// @notice A DApp has been deauthorized by a user for a worker
event Deauthorization(
address indexed user,
address indexed worker,
address indexed dapp
);
}
WorkerManagerAuthManagerImpl.sol 255 lines
// Copyright 2020 Cartesi Pte. Ltd.
// SPDX-License-Identifier: Apache-2.0
// Licensed under the Apache License, Version 2.0 (the "License"); you may not use
// this file except in compliance with the License. You may obtain a copy of the
// License at http://www.apache.org/licenses/LICENSE-2.0
// Unless required by applicable law or agreed to in writing, software distributed
// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
// CONDITIONS OF ANY KIND, either express or implied. See the License for the
// specific language governing permissions and limitations under the License.
/// @title WorkerManagerAuthManagerImpl
/// @author Danilo Tuler
pragma solidity ^0.7.0;
import "./WorkerManager.sol";
import "./WorkerAuthManager.sol";
contract WorkerManagerAuthManagerImpl is WorkerManager, WorkerAuthManager {
/// @dev user can only hire a worker if he sends more than minimum value
uint256 constant MINIMUM_FUNDING = 0.001 ether;
/// @dev transfers bigger than maximum value should be done directly
uint256 constant MAXIMUM_FUNDING = 3 ether;
/// @notice A worker can be in 4 different states, starting from Available
enum WorkerState {Available, Pending, Owned, Retired}
/// @dev mapping from worker to its user
mapping(address => address payable) private userOf;
/// @dev mapping from worker to its internal state
mapping(address => WorkerState) private stateOf;
/// @dev permissions keyed by hash(user, worker, dapp)
mapping(bytes32 => bool) private permissions;
function isAvailable(address workerAddress)
public
override
view
returns (bool)
{
return stateOf[workerAddress] == WorkerState.Available;
}
function isPending(address workerAddress)
public
override
view
returns (bool)
{
return stateOf[workerAddress] == WorkerState.Pending;
}
function getOwner(address _workerAddress)
public
override(WorkerManager, WorkerAuthManager)
view
returns (address)
{
return
stateOf[_workerAddress] == WorkerState.Owned
? userOf[_workerAddress]
: address(0);
}
function getUser(address _workerAddress)
public
override
view
returns (address)
{
return userOf[_workerAddress];
}
function isOwned(address _workerAddress)
public
override
view
returns (bool)
{
return stateOf[_workerAddress] == WorkerState.Owned;
}
function hire(address payable _workerAddress) public override payable {
require(isAvailable(_workerAddress), "worker is not available");
require(_workerAddress != address(0), "worker address can not be 0x0");
require(msg.value >= MINIMUM_FUNDING, "funding below minimum");
require(msg.value <= MAXIMUM_FUNDING, "funding above maximum");
// set owner
userOf[_workerAddress] = msg.sender;
// change state
stateOf[_workerAddress] = WorkerState.Pending;
// transfer ether to worker
_workerAddress.transfer(msg.value);
// emit event
emit JobOffer(_workerAddress, msg.sender);
}
function acceptJob() public override {
require(
stateOf[msg.sender] == WorkerState.Pending,
"worker not is not in pending state"
);
// change state
stateOf[msg.sender] = WorkerState.Owned;
// from now on getOwner will return the user
// emit event
emit JobAccepted(msg.sender, userOf[msg.sender]);
}
function rejectJob() public override payable {
require(
userOf[msg.sender] != address(0),
"worker does not have a job offer"
);
address payable owner = userOf[msg.sender];
// reset hirer back to null
userOf[msg.sender] = address(0);
// change state
stateOf[msg.sender] = WorkerState.Available;
// return the money
owner.transfer(msg.value);
// emit event
emit JobRejected(msg.sender, userOf[msg.sender]);
}
function cancelHire(address _workerAddress) public override {
require(
userOf[_workerAddress] == msg.sender,
"only hirer can cancel the offer"
);
// change state
stateOf[_workerAddress] = WorkerState.Retired;
// emit event
emit JobRejected(_workerAddress, msg.sender);
}
function retire(address payable _workerAddress) public override {
require(
stateOf[_workerAddress] == WorkerState.Owned,
"worker not owned"
);
require(
userOf[_workerAddress] == msg.sender,
"only owner can retire worker"
);
// change state
stateOf[_workerAddress] = WorkerState.Retired;
// emit event
emit Retired(_workerAddress, msg.sender);
}
function isRetired(address _workerAddress)
public
override
view
returns (bool)
{
return stateOf[_workerAddress] == WorkerState.Retired;
}
modifier onlyByUser(address _workerAddress) {
require(
getUser(_workerAddress) == msg.sender,
"worker not hired by sender"
);
_;
}
function getAuthorizationKey(
address _user,
address _worker,
address _dapp
) internal pure returns (bytes32) {
return keccak256(abi.encodePacked(_user, _worker, _dapp));
}
function authorize(address _workerAddress, address _dappAddress)
public
override
onlyByUser(_workerAddress)
{
bytes32 key = getAuthorizationKey(
msg.sender,
_workerAddress,
_dappAddress
);
require(permissions[key] == false, "dapp already authorized");
// record authorization from that user
permissions[key] = true;
// emit event
emit Authorization(msg.sender, _workerAddress, _dappAddress);
}
function deauthorize(address _workerAddress, address _dappAddress)
public
override
onlyByUser(_workerAddress)
{
bytes32 key = getAuthorizationKey(
msg.sender,
_workerAddress,
_dappAddress
);
require(permissions[key] == true, "dapp not authorized");
// record deauthorization from that user
permissions[key] = false;
// emit event
emit Deauthorization(msg.sender, _workerAddress, _dappAddress);
}
function isAuthorized(address _workerAddress, address _dappAddress)
public
override
view
returns (bool)
{
return
permissions[getAuthorizationKey(
getOwner(_workerAddress),
_workerAddress,
_dappAddress
)];
}
function hireAndAuthorize(
address payable _workerAddress,
address _dappAddress
) public payable {
hire(_workerAddress);
authorize(_workerAddress, _dappAddress);
}
}
Read Contract
getOwner 0xfa544161 → address
getUser 0x6f77926b → address
isAuthorized 0x65e4ad9e → bool
isAvailable 0x2896f60b → bool
isOwned 0xf4dc754b → bool
isPending 0xa00745b6 → bool
isRetired 0x6d3c6275 → bool
Write Contract 8 functions
These functions modify contract state and require a wallet transaction to execute.
acceptJob 0x9b789b7e
No parameters
authorize 0x2bef4595
address _workerAddress
address _dappAddress
cancelHire 0xb64b3bed
address _workerAddress
deauthorize 0x6d892f7e
address _workerAddress
address _dappAddress
hire 0xd9d6bd86
address _workerAddress
hireAndAuthorize 0xdbd96554
address _workerAddress
address _dappAddress
rejectJob 0x03d6e81e
No parameters
retire 0x9e6371ba
address _workerAddress
Recent Transactions
No transactions found for this address