文件 1 的 3:IJBOperatorStore.sol
pragma solidity 0.8.6;
import './../structs/JBOperatorData.sol';
interface IJBOperatorStore {
event SetOperator(
address indexed operator,
address indexed account,
uint256 indexed domain,
uint256[] permissionIndexes,
uint256 packed
);
function permissionsOf(
address _operator,
address _account,
uint256 _domain
) external view returns (uint256);
function hasPermission(
address _operator,
address _account,
uint256 _domain,
uint256 _permissionIndex
) external view returns (bool);
function hasPermissions(
address _operator,
address _account,
uint256 _domain,
uint256[] calldata _permissionIndexes
) external view returns (bool);
function setOperator(JBOperatorData calldata _operatorData) external;
function setOperators(JBOperatorData[] calldata _operatorData) external;
}
文件 2 的 3:JBOperatorData.sol
pragma solidity 0.8.6;
struct JBOperatorData {
address operator;
uint256 domain;
uint256[] permissionIndexes;
}
文件 3 的 3:JBOperatorStore.sol
pragma solidity 0.8.6;
import './interfaces/IJBOperatorStore.sol';
contract JBOperatorStore is IJBOperatorStore {
error PERMISSION_INDEX_OUT_OF_BOUNDS();
mapping(address => mapping(address => mapping(uint256 => uint256))) public override permissionsOf;
function hasPermission(
address _operator,
address _account,
uint256 _domain,
uint256 _permissionIndex
) external view override returns (bool) {
if (_permissionIndex > 255) revert PERMISSION_INDEX_OUT_OF_BOUNDS();
return (((permissionsOf[_operator][_account][_domain] >> _permissionIndex) & 1) == 1);
}
function hasPermissions(
address _operator,
address _account,
uint256 _domain,
uint256[] calldata _permissionIndexes
) external view override returns (bool) {
for (uint256 _i = 0; _i < _permissionIndexes.length; _i++) {
uint256 _permissionIndex = _permissionIndexes[_i];
if (_permissionIndex > 255) revert PERMISSION_INDEX_OUT_OF_BOUNDS();
if (((permissionsOf[_operator][_account][_domain] >> _permissionIndex) & 1) == 0)
return false;
}
return true;
}
function setOperator(JBOperatorData calldata _operatorData) external override {
uint256 _packed = _packedPermissions(_operatorData.permissionIndexes);
permissionsOf[_operatorData.operator][msg.sender][_operatorData.domain] = _packed;
emit SetOperator(
_operatorData.operator,
msg.sender,
_operatorData.domain,
_operatorData.permissionIndexes,
_packed
);
}
function setOperators(JBOperatorData[] calldata _operatorData) external override {
for (uint256 _i = 0; _i < _operatorData.length; _i++) {
uint256 _packed = _packedPermissions(_operatorData[_i].permissionIndexes);
permissionsOf[_operatorData[_i].operator][msg.sender][_operatorData[_i].domain] = _packed;
emit SetOperator(
_operatorData[_i].operator,
msg.sender,
_operatorData[_i].domain,
_operatorData[_i].permissionIndexes,
_packed
);
}
}
function _packedPermissions(uint256[] calldata _indexes) private pure returns (uint256 packed) {
for (uint256 _i = 0; _i < _indexes.length; _i++) {
uint256 _index = _indexes[_i];
if (_index > 255) revert PERMISSION_INDEX_OUT_OF_BOUNDS();
packed |= 1 << _index;
}
}
}
{
"compilationTarget": {
"contracts/JBOperatorStore.sol": "JBOperatorStore"
},
"evmVersion": "berlin",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs",
"useLiteralContent": true
},
"optimizer": {
"enabled": true,
"runs": 10000
},
"remappings": []
}
[{"inputs":[],"name":"PERMISSION_INDEX_OUT_OF_BOUNDS","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"uint256","name":"domain","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"permissionIndexes","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"packed","type":"uint256"}],"name":"SetOperator","type":"event"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_domain","type":"uint256"},{"internalType":"uint256","name":"_permissionIndex","type":"uint256"}],"name":"hasPermission","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_domain","type":"uint256"},{"internalType":"uint256[]","name":"_permissionIndexes","type":"uint256[]"}],"name":"hasPermissions","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"permissionsOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"domain","type":"uint256"},{"internalType":"uint256[]","name":"permissionIndexes","type":"uint256[]"}],"internalType":"struct JBOperatorData","name":"_operatorData","type":"tuple"}],"name":"setOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"domain","type":"uint256"},{"internalType":"uint256[]","name":"permissionIndexes","type":"uint256[]"}],"internalType":"struct JBOperatorData[]","name":"_operatorData","type":"tuple[]"}],"name":"setOperators","outputs":[],"stateMutability":"nonpayable","type":"function"}]