// SPDX-License-Identifier: MIT pragma solidity >=0.8.0; import './Controllable.sol'; import './Validator.sol'; /** * @title ControllableWithApi */ contract ControllableWithApi is Controllable, Validator { bytes32 private _API_ROLE; function __ControllableWithApi_init( string memory name, string memory version, address apiAddress ) internal onlyInitializing { __ControllableWithApi_init_unchained(name, version, apiAddress); } function __ControllableWithApi_init_unchained( string memory name, string memory version, address apiAddress ) internal onlyInitializing { __Controllable_init(); __Validator_init(name, version); _grantRole(_API_ROLE, apiAddress); } /** * @dev Only allow access from the API_ROLE */ modifier onlyApi() { require(isApi(_msgSender()), 'ControllableWithApi: Restricted to API'); _; } /** * @dev Verify account has API_ROLE * @param account - The account address to verify */ function isApi(address account) public view returns (bool) { return hasRole(_API_ROLE, account); } /** * @dev Validate action by sig * @param account - Suposed signer * @param action - Action to perform * @param details - Extra details of the action (to explain the signature) * @param dbRef - Database reference * @param signatureExpiry - Signatura expiration timestamp * @param v - Split signature.v * @param r - Split signature.r * @param s - Split signature.s */ function validateAction( address account, string calldata action, string calldata details, string calldata dbRef, uint256 signatureExpiry, uint8 v, bytes32 r, bytes32 s ) external view virtual onlyApi returns (bool success) { // Blockchain if (_validateString(action, _ACTION_ADD_BLOCKCHAIN)) return _validateAction(account, action, details, dbRef, signatureExpiry, v, r, s); // Add blockchain else if (_validateString(action, _ACTION_VALIDATE_BLOCKCHAIN) && isAdmin(account)) return _validateAction(account, action, details, dbRef, signatureExpiry, v, r, s); // Validate blockchain else if (_validateString(action, _ACTION_UPDATE_BLOCKCHAIN) && isAdmin(account)) return _validateAction(account, action, details, dbRef, signatureExpiry, v, r, s); // Update blockchain else if (_validateString(action, _ACTION_DELETE_BLOCKCHAIN) && isAdmin(account)) return _validateAction(account, action, details, dbRef, signatureExpiry, v, r, s); // Delete blockchain // RPC else if (_validateString(action, _ACTION_ADD_RPC)) return _validateAction(account, action, details, dbRef, signatureExpiry, v, r, s); // Add blockchain else if (_validateString(action, _ACTION_VALIDATE_RPC) && isAdmin(account)) return _validateAction(account, action, details, dbRef, signatureExpiry, v, r, s); // Validate RPC else if (_validateString(action, _ACTION_UPDATE_RPC) && isAdmin(account)) return _validateAction(account, action, details, dbRef, signatureExpiry, v, r, s); // Update RPC else if (_validateString(action, _ACTION_DELETE_RPC) && isAdmin(account)) return _validateAction(account, action, details, dbRef, signatureExpiry, v, r, s); // Delete RPC // Faucet else if (_validateString(action, _ACTION_ADD_FAUCET)) return _validateAction(account, action, details, dbRef, signatureExpiry, v, r, s); // Add blockchain else if (_validateString(action, _ACTION_VALIDATE_FAUCET) && isAdmin(account)) return _validateAction(account, action, details, dbRef, signatureExpiry, v, r, s); // Validate Faucet else if (_validateString(action, _ACTION_UPDATE_FAUCET) && isAdmin(account)) return _validateAction(account, action, details, dbRef, signatureExpiry, v, r, s); // Update Faucet else if (_validateString(action, _ACTION_DELETE_FAUCET) && isAdmin(account)) return _validateAction(account, action, details, dbRef, signatureExpiry, v, r, s); // Delete Faucet // Token else if (_validateString(action, _ACTION_ADD_TOKEN)) return _validateAction(account, action, details, dbRef, signatureExpiry, v, r, s); // Add blockchain else if (_validateString(action, _ACTION_VALIDATE_TOKEN) && isAdmin(account)) return _validateAction(account, action, details, dbRef, signatureExpiry, v, r, s); // Validate Token else if (_validateString(action, _ACTION_UPDATE_TOKEN) && isAdmin(account)) return _validateAction(account, action, details, dbRef, signatureExpiry, v, r, s); // Update Token else if (_validateString(action, _ACTION_DELETE_TOKEN) && isAdmin(account)) return _validateAction(account, action, details, dbRef, signatureExpiry, v, r, s); // Delete Token else return false; } uint256[50] private __gap; }