Skip to content

Commit 84fe5c0

Browse files
committed
feat: refactor has access
2 parents 69efe2b + 8bb062e commit 84fe5c0

20 files changed

+579
-357
lines changed

solidity/contracts/AccessController.sol

Lines changed: 0 additions & 37 deletions
This file was deleted.
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// SPDX-License-Identifier: MIT
2+
pragma solidity ^0.8.19;
3+
4+
import {IAccessController} from '../interfaces/IAccessController.sol';
5+
import {IAccessModule} from '../interfaces/modules/access/IAccessModule.sol';
6+
7+
abstract contract CommonAccessController is IAccessController {
8+
/**
9+
* @notice Check whether the caller is authorized for the given parameters.
10+
* @param _accessModule The access module
11+
* @param _typehash The typehash
12+
* @param _typehashParams The params passed to the typehash
13+
* @param _accessControl The access control struct
14+
*/
15+
function _hasAccess(
16+
address _accessModule,
17+
bytes32 _typehash,
18+
bytes memory _typehashParams,
19+
AccessControl memory _accessControl
20+
) internal {
21+
bool _granted = IAccessModule(_accessModule).hasAccess(
22+
abi.encode(
23+
IAccessModule.AccessControlParameters({
24+
sender: msg.sender,
25+
accessControl: _accessControl,
26+
typehash: _typehash,
27+
typehashParams: _typehashParams
28+
})
29+
)
30+
);
31+
32+
if (!_granted) revert AccessController_NoAccess();
33+
}
34+
}

solidity/contracts/Oracle.sol

Lines changed: 14 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,17 @@ pragma solidity ^0.8.19;
33

44
import {IOracle} from '../interfaces/IOracle.sol';
55

6+
import {IAccessModule} from '../interfaces/modules/access/IAccessModule.sol';
67
import {IDisputeModule} from '../interfaces/modules/dispute/IDisputeModule.sol';
7-
8-
import {IAccessControlModule} from '../interfaces/modules/accessControl/IAccessControlModule.sol';
98
import {IFinalityModule} from '../interfaces/modules/finality/IFinalityModule.sol';
109
import {IRequestModule} from '../interfaces/modules/request/IRequestModule.sol';
1110
import {IResolutionModule} from '../interfaces/modules/resolution/IResolutionModule.sol';
1211
import {IResponseModule} from '../interfaces/modules/response/IResponseModule.sol';
1312
import {ValidatorLib} from '../libraries/ValidatorLib.sol';
14-
import {AccessController} from './AccessController.sol';
13+
import {OracleAccessController} from './OracleAccessController.sol';
1514
import {OracleTypehash} from './utils/OracleTypehash.sol';
1615

17-
contract Oracle is IOracle, AccessController, OracleTypehash {
16+
contract Oracle is IOracle, OracleAccessController, OracleTypehash {
1817
using ValidatorLib for *;
1918

2019
/// @inheritdoc IOracle
@@ -47,9 +46,6 @@ contract Oracle is IOracle, AccessController, OracleTypehash {
4746
/// @inheritdoc IOracle
4847
mapping(bytes32 _requestId => mapping(address _user => bool _isParticipant)) public isParticipant;
4948

50-
/// @inheritdoc IOracle
51-
mapping(address _user => mapping(address _accessControlModule => bool _approved)) public isAccessControlApproved;
52-
5349
/// @inheritdoc IOracle
5450
uint256 public totalRequestCount;
5551

@@ -58,18 +54,6 @@ contract Oracle is IOracle, AccessController, OracleTypehash {
5854
*/
5955
mapping(bytes32 _requestId => bytes _responseIds) internal _responseIds;
6056

61-
/**
62-
* @notice Modifier to check if the user approved to the access control module
63-
* @param _user The address of the user
64-
* @param _accessControlModule The access control module to check if approved
65-
*/
66-
modifier isApproved(address _user, address _accessControlModule) {
67-
if (_accessControlModule != address(0) && !isAccessControlApproved[_user][_accessControlModule]) {
68-
revert Oracle_AccessControlModuleNotApproved();
69-
}
70-
_;
71-
}
72-
7357
/// @inheritdoc IOracle
7458
function getResponseIds(bytes32 _requestId) public view returns (bytes32[] memory _ids) {
7559
bytes memory _responses = _responseIds[_requestId];
@@ -111,16 +95,6 @@ contract Oracle is IOracle, AccessController, OracleTypehash {
11195
}
11296
}
11397

114-
/// @inheritdoc IOracle
115-
function setAccessControlModule(address _accessControlModule, bool _approved) external {
116-
if (isAccessControlApproved[msg.sender][_accessControlModule] == _approved) {
117-
revert Oracle_AccessControlModuleAlreadySet();
118-
}
119-
isAccessControlApproved[msg.sender][_accessControlModule] = _approved;
120-
121-
emit AccessControlModuleSet(msg.sender, _accessControlModule, _approved);
122-
}
123-
12498
/// @inheritdoc IOracle
12599
function createRequest(
126100
Request calldata _request,
@@ -154,8 +128,7 @@ contract Oracle is IOracle, AccessController, OracleTypehash {
154128
AccessControl calldata _accessControl
155129
)
156130
external
157-
isApproved(_accessControl.user, _request.accessControlModule)
158-
hasAccess(_request.accessControlModule, PROPOSE_TYPEHASH, abi.encode(_request, _response), _accessControl)
131+
hasAccess(_request.accessModule, PROPOSE_TYPEHASH, abi.encode(_request, _response), _accessControl)
159132
returns (bytes32 _responseId)
160133
{
161134
_responseId = ValidatorLib._validateResponse(_request, _response);
@@ -195,8 +168,7 @@ contract Oracle is IOracle, AccessController, OracleTypehash {
195168
AccessControl calldata _accessControl
196169
)
197170
external
198-
isApproved(_accessControl.user, _request.accessControlModule)
199-
hasAccess(_request.accessControlModule, DISPUTE_TYPEHASH, abi.encode(_request, _response, _dispute), _accessControl)
171+
hasAccess(_request.accessModule, DISPUTE_TYPEHASH, abi.encode(_request, _response, _dispute), _accessControl)
200172
returns (bytes32 _disputeId)
201173
{
202174
bytes32 _responseId;
@@ -241,8 +213,7 @@ contract Oracle is IOracle, AccessController, OracleTypehash {
241213
AccessControl calldata _accessControl
242214
)
243215
external
244-
isApproved(_accessControl.user, _request.accessControlModule)
245-
hasAccess(_request.accessControlModule, ESCALATE_TYPEHASH, abi.encode(_request, _response, _dispute), _accessControl)
216+
hasAccess(_request.accessModule, ESCALATE_TYPEHASH, abi.encode(_request, _response, _dispute), _accessControl)
246217
{
247218
(bytes32 _responseId, bytes32 _disputeId) = ValidatorLib._validateResponseAndDispute(_request, _response, _dispute);
248219

@@ -280,8 +251,7 @@ contract Oracle is IOracle, AccessController, OracleTypehash {
280251
AccessControl calldata _accessControl
281252
)
282253
external
283-
isApproved(_accessControl.user, _request.accessControlModule)
284-
hasAccess(_request.accessControlModule, RESOLVE_TYPEHASH, abi.encode(_request, _response, _dispute), _accessControl)
254+
hasAccess(_request.accessModule, RESOLVE_TYPEHASH, abi.encode(_request, _response, _dispute), _accessControl)
285255
{
286256
(bytes32 _responseId, bytes32 _disputeId) = ValidatorLib._validateResponseAndDispute(_request, _response, _dispute);
287257

@@ -346,11 +316,7 @@ contract Oracle is IOracle, AccessController, OracleTypehash {
346316
IOracle.Request calldata _request,
347317
IOracle.Response calldata _response,
348318
AccessControl calldata _accessControl
349-
)
350-
external
351-
isApproved(_accessControl.user, _request.accessControlModule)
352-
hasAccess(_request.accessControlModule, FINALIZE_TYPEHASH, abi.encode(_request, _response), _accessControl)
353-
{
319+
) external hasAccess(_request.accessModule, FINALIZE_TYPEHASH, abi.encode(_request, _response), _accessControl) {
354320
bytes32 _requestId;
355321
bytes32 _responseId;
356322

@@ -378,7 +344,11 @@ contract Oracle is IOracle, AccessController, OracleTypehash {
378344
IDisputeModule(_request.disputeModule).finalizeRequest(_request, _response, _accessControl.user);
379345
IResponseModule(_request.responseModule).finalizeRequest(_request, _response, _accessControl.user);
380346
IRequestModule(_request.requestModule).finalizeRequest(_request, _response, _accessControl.user);
381-
IAccessControlModule(_request.accessControlModule).finalizeRequest(_request, _response, _accessControl.user);
347+
IAccessModule(_request.accessModule).finalizeRequest(_request, _response, _accessControl.user);
348+
349+
if (_request.accessModule != address(0)) {
350+
IAccessModule(_request.accessModule).finalizeRequest(_request, _response, _accessControl.user);
351+
}
382352

383353
emit OracleRequestFinalized(_requestId, _responseId);
384354
}
@@ -460,8 +430,7 @@ contract Oracle is IOracle, AccessController, OracleTypehash {
460430
AccessControl calldata _accessControl
461431
)
462432
internal
463-
isApproved(_accessControl.user, _request.accessControlModule)
464-
hasAccess(_request.accessControlModule, CREATE_TYPEHASH, abi.encode(_request), _accessControl)
433+
hasAccess(_request.accessModule, CREATE_TYPEHASH, abi.encode(_request), _accessControl)
465434
returns (bytes32 _requestId)
466435
{
467436
uint256 _requestNonce = totalRequestCount++;
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
// SPDX-License-Identifier: MIT
2+
pragma solidity ^0.8.19;
3+
4+
import {IOracleAccessController} from '../interfaces/IOracleAccessController.sol';
5+
import {CommonAccessController} from './CommonAccessController.sol';
6+
7+
abstract contract OracleAccessController is IOracleAccessController, CommonAccessController {
8+
/// @inheritdoc IOracleAccessController
9+
mapping(address _user => mapping(address _accessModule => bool _approved)) public isAccessModuleApproved;
10+
11+
modifier hasAccess(
12+
address _accessModule,
13+
bytes32 _typehash,
14+
bytes memory _params,
15+
AccessControl memory _accessControl
16+
) {
17+
if (_accessControl.user != msg.sender) {
18+
if (_accessModule == address(0)) {
19+
revert AccessController_NoAccess();
20+
} else {
21+
if (!isAccessModuleApproved[_accessControl.user][_accessModule]) {
22+
revert OracleAccessController_AccessModuleNotApproved();
23+
}
24+
_hasAccess(_accessModule, _typehash, _params, _accessControl);
25+
}
26+
}
27+
_;
28+
}
29+
30+
/// @inheritdoc IOracleAccessController
31+
function setAccessModule(address _accessModule, bool _approved) external {
32+
if (isAccessModuleApproved[msg.sender][_accessModule] == _approved) {
33+
revert OracleAccessController_AccessModuleAlreadySet();
34+
}
35+
isAccessModuleApproved[msg.sender][_accessModule] = _approved;
36+
37+
emit AccessModuleSet(msg.sender, _accessModule, _approved);
38+
}
39+
}

solidity/interfaces/IAccessController.sol

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,17 @@ pragma solidity ^0.8.19;
77
*/
88
interface IAccessController {
99
/*///////////////////////////////////////////////////////////////
10-
EVENTS
10+
ERRORS
1111
//////////////////////////////////////////////////////////////*/
12+
/**
13+
* @notice Thrown when the caller has no access
14+
*/
15+
error AccessController_NoAccess();
1216

1317
/*///////////////////////////////////////////////////////////////
1418
STRUCTS
1519
//////////////////////////////////////////////////////////////*/
20+
1621
/**
1722
* @notice The access control struct
1823
* @param user The address of the user
@@ -22,20 +27,4 @@ interface IAccessController {
2227
address user;
2328
bytes data;
2429
}
25-
26-
/*///////////////////////////////////////////////////////////////
27-
ERRORS
28-
//////////////////////////////////////////////////////////////*/
29-
/**
30-
* @notice Thrown when the caller has no access
31-
*/
32-
error AccessController_NoAccess();
33-
34-
/*///////////////////////////////////////////////////////////////
35-
VARIABLES
36-
//////////////////////////////////////////////////////////////*/
37-
38-
/*///////////////////////////////////////////////////////////////
39-
LOGIC
40-
//////////////////////////////////////////////////////////////*/
4130
}

solidity/interfaces/IOracle.sol

Lines changed: 4 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
// SPDX-License-Identifier: MIT
22
pragma solidity ^0.8.19;
33

4-
import {IAccessController} from './IAccessController.sol';
4+
import {IAccessController, IOracleAccessController} from './IOracleAccessController.sol';
55

66
/**
77
* @title Oracle
88
* @notice The main contract storing requests, responses and disputes, and routing the calls to the modules.
99
*/
10-
interface IOracle is IAccessController {
10+
interface IOracle is IOracleAccessController {
1111
/*///////////////////////////////////////////////////////////////
1212
EVENTS
1313
//////////////////////////////////////////////////////////////*/
@@ -66,14 +66,6 @@ interface IOracle is IAccessController {
6666
*/
6767
event DisputeResolved(bytes32 indexed _disputeId, Dispute _dispute);
6868

69-
/**
70-
* @notice Emitted when the access control module is set
71-
* @param _user The address of the user
72-
* @param _accessControlModule The address of the access control module
73-
* @param _approved If the module is approved
74-
*/
75-
event AccessControlModuleSet(address indexed _user, address indexed _accessControlModule, bool _approved);
76-
7769
/*///////////////////////////////////////////////////////////////
7870
ERRORS
7971
//////////////////////////////////////////////////////////////*/
@@ -176,16 +168,6 @@ interface IOracle is IAccessController {
176168
*/
177169
error Oracle_InvalidDisputer();
178170

179-
/**
180-
* @notice Thrown when user didn't approve the access control module
181-
*/
182-
error Oracle_AccessControlModuleNotApproved();
183-
184-
/**
185-
* @notice Thrown when the access control module is already set
186-
*/
187-
error Oracle_AccessControlModuleAlreadySet();
188-
189171
/*///////////////////////////////////////////////////////////////
190172
ENUMS
191173
//////////////////////////////////////////////////////////////*/
@@ -214,7 +196,7 @@ interface IOracle is IAccessController {
214196
* @param disputeModule The address of the dispute module
215197
* @param resolutionModule The address of the resolution module
216198
* @param finalityModule The address of the finality module
217-
* @param accessControlModule The address of the access control module
199+
* @param accessModule The address of the access module
218200
* @param requestModuleData The parameters for the request module
219201
* @param responseModuleData The parameters for the response module
220202
* @param disputeModuleData The parameters for the dispute module
@@ -231,7 +213,7 @@ interface IOracle is IAccessController {
231213
address disputeModule;
232214
address resolutionModule;
233215
address finalityModule;
234-
address accessControlModule;
216+
address accessModule;
235217
bytes requestModuleData;
236218
bytes responseModuleData;
237219
bytes disputeModuleData;
@@ -375,15 +357,6 @@ interface IOracle is IAccessController {
375357
*/
376358
function getResponseIds(bytes32 _requestId) external view returns (bytes32[] memory _ids);
377359

378-
/**
379-
* @notice Checks if the given address approved the access control module
380-
*
381-
* @param _user The address to check
382-
* @param _accessControlModule The address of the access control module
383-
* @return _approved If the user approved the access control module
384-
*/
385-
function isAccessControlApproved(address _user, address _accessControlModule) external view returns (bool _approved);
386-
387360
/*///////////////////////////////////////////////////////////////
388361
LOGIC
389362
//////////////////////////////////////////////////////////////*/
@@ -505,12 +478,4 @@ interface IOracle is IAccessController {
505478
Response calldata _response,
506479
AccessControl calldata _accessControl
507480
) external;
508-
509-
/**
510-
* @notice Sets the address of the access control module
511-
*
512-
* @param _accessControlModule The address of the access control module
513-
* @param _approved If the module is approved
514-
*/
515-
function setAccessControlModule(address _accessControlModule, bool _approved) external;
516481
}

0 commit comments

Comments
 (0)