From 522cb38cc4e9adcebe2f0ff19b2515c7736fec37 Mon Sep 17 00:00:00 2001 From: zorzal Date: Wed, 23 Oct 2024 15:54:20 -0400 Subject: [PATCH 01/50] feat: use access control in all the necessary functions --- .../modules/dispute/BondEscalationModule.sol | 62 ++++++-- .../dispute/RootVerificationModule.sol | 7 +- .../modules/resolution/ArbitratorModule.sol | 7 +- .../BondEscalationResolutionModule.sol | 134 ++++++++++++------ .../resolution/ERC20ResolutionModule.sol | 45 ++++-- .../PrivateERC20ResolutionModule.sol | 48 ++++--- .../modules/response/BondedResponseModule.sol | 22 ++- 7 files changed, 226 insertions(+), 99 deletions(-) diff --git a/solidity/contracts/modules/dispute/BondEscalationModule.sol b/solidity/contracts/modules/dispute/BondEscalationModule.sol index 84226026..2c360c46 100644 --- a/solidity/contracts/modules/dispute/BondEscalationModule.sol +++ b/solidity/contracts/modules/dispute/BondEscalationModule.sol @@ -1,13 +1,19 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.19; +import {AccessControllerModule} from '../accessControl/AccessControllerModule.sol'; +import { + AccessController, IAccessController +} from '@defi-wonderland/prophet-core/solidity/contracts/AccessController.sol'; import {IModule, Module} from '@defi-wonderland/prophet-core/solidity/contracts/Module.sol'; import {IOracle} from '@defi-wonderland/prophet-core/solidity/interfaces/IOracle.sol'; import {FixedPointMathLib} from 'solmate/src/utils/FixedPointMathLib.sol'; import {IBondEscalationModule} from '../../../interfaces/modules/dispute/IBondEscalationModule.sol'; -contract BondEscalationModule is Module, IBondEscalationModule { +import '../../utils/Typehash.sol'; + +contract BondEscalationModule is AccessController, Module, IBondEscalationModule { /// @inheritdoc IBondEscalationModule mapping(bytes32 _requestId => mapping(address _pledger => uint256 pledges)) public pledgesForDispute; @@ -31,7 +37,11 @@ contract BondEscalationModule is Module, IBondEscalationModule { IOracle.Request calldata _request, IOracle.Response calldata _response, IOracle.Dispute calldata _dispute - ) external onlyOracle { + ) + // review: access control? no + external + onlyOracle + { bytes32 _disputeId = _getId(_dispute); RequestParameters memory _params = decodeRequestData(_request.disputeModuleData); BondEscalation storage _escalation = _escalations[_dispute.requestId]; @@ -64,7 +74,7 @@ contract BondEscalationModule is Module, IBondEscalationModule { _escalation.disputeId = _disputeId; emit BondEscalationStatusUpdated(_dispute.requestId, _disputeId, BondEscalationStatus.Active); } else if (_disputeId != _escalation.disputeId) { - ORACLE.escalateDispute(_request, _response, _dispute); + ORACLE.escalateDispute(_request, _response, _dispute, _defaultAccessControl()); } } @@ -211,39 +221,58 @@ contract BondEscalationModule is Module, IBondEscalationModule { //////////////////////////////////////////////////////////////////// /// @inheritdoc IBondEscalationModule - function pledgeForDispute(IOracle.Request calldata _request, IOracle.Dispute calldata _dispute) external { + function pledgeForDispute( + IOracle.Request calldata _request, + IOracle.Dispute calldata _dispute, + IAccessController.AccessControl calldata _accessControl + ) + external + hasAccess(_request.accessControlModule, _PLEDGE_FOR_DISPUTE_TYPEHASH, abi.encode(_request, _dispute), _accessControl) + { bytes32 _disputeId = _getId(_dispute); RequestParameters memory _params = _pledgeChecks(_request, _dispute, true); _escalations[_dispute.requestId].amountOfPledgesForDispute += 1; - pledgesForDispute[_dispute.requestId][msg.sender] += 1; + pledgesForDispute[_dispute.requestId][_accessControl.user] += 1; _params.accountingExtension.pledge({ - _pledger: msg.sender, + _pledger: _accessControl.user, _request: _request, _dispute: _dispute, _token: _params.bondToken, _amount: _params.bondSize }); - emit PledgedForDispute(_disputeId, msg.sender, _params.bondSize); + emit PledgedForDispute(_disputeId, _accessControl.user, _params.bondSize); } /// @inheritdoc IBondEscalationModule - function pledgeAgainstDispute(IOracle.Request calldata _request, IOracle.Dispute calldata _dispute) external { + function pledgeAgainstDispute( + IOracle.Request calldata _request, + IOracle.Dispute calldata _dispute, + AccessControl calldata _accessControl + ) + external + hasAccess( + _request.accessControlModule, + _PLEDGE_AGAINST_DISPUTE_TYPEHASH, + abi.encode(_request, _dispute), + _accessControl + ) + { bytes32 _disputeId = _getId(_dispute); RequestParameters memory _params = _pledgeChecks(_request, _dispute, false); _escalations[_dispute.requestId].amountOfPledgesAgainstDispute += 1; - pledgesAgainstDispute[_dispute.requestId][msg.sender] += 1; + pledgesAgainstDispute[_dispute.requestId][_accessControl.user] += 1; _params.accountingExtension.pledge({ - _pledger: msg.sender, + _pledger: _accessControl.user, _request: _request, _dispute: _dispute, _token: _params.bondToken, _amount: _params.bondSize }); - emit PledgedAgainstDispute(_disputeId, msg.sender, _params.bondSize); + emit PledgedAgainstDispute(_disputeId, _accessControl.user, _params.bondSize); } /// @inheritdoc IBondEscalationModule @@ -251,7 +280,10 @@ contract BondEscalationModule is Module, IBondEscalationModule { IOracle.Request calldata _request, IOracle.Response calldata _response, IOracle.Dispute calldata _dispute - ) external { + ) + // review: access control? + external + { (, bytes32 _disputeId) = _validateResponseAndDispute(_request, _response, _dispute); RequestParameters memory _params = decodeRequestData(_request.disputeModuleData); BondEscalation storage _escalation = _escalations[_dispute.requestId]; @@ -278,7 +310,11 @@ contract BondEscalationModule is Module, IBondEscalationModule { emit BondEscalationStatusUpdated(_dispute.requestId, _disputeId, _escalation.status); ORACLE.updateDisputeStatus( - _request, _response, _dispute, _disputersWon ? IOracle.DisputeStatus.Won : IOracle.DisputeStatus.Lost + _request, + _response, + _dispute, + _disputersWon ? IOracle.DisputeStatus.Won : IOracle.DisputeStatus.Lost, + _defaultAccessControl() ); } diff --git a/solidity/contracts/modules/dispute/RootVerificationModule.sol b/solidity/contracts/modules/dispute/RootVerificationModule.sol index 775d26b7..ce218ae5 100644 --- a/solidity/contracts/modules/dispute/RootVerificationModule.sol +++ b/solidity/contracts/modules/dispute/RootVerificationModule.sol @@ -1,13 +1,14 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.19; +import {AccessController} from '@defi-wonderland/prophet-core/solidity/contracts/AccessController.sol'; import {IModule, Module} from '@defi-wonderland/prophet-core/solidity/contracts/Module.sol'; import {IOracle} from '@defi-wonderland/prophet-core/solidity/interfaces/IOracle.sol'; import {IRootVerificationModule} from '../../../interfaces/modules/dispute/IRootVerificationModule.sol'; import {MerkleLib} from '../../libraries/MerkleLib.sol'; -contract RootVerificationModule is Module, IRootVerificationModule { +contract RootVerificationModule is AccessController, Module, IRootVerificationModule { using MerkleLib for MerkleLib.Tree; /** @@ -54,7 +55,7 @@ contract RootVerificationModule is Module, IRootVerificationModule { emit DisputeStatusChanged({_disputeId: _disputeId, _dispute: _dispute, _status: IOracle.DisputeStatus.Won}); - ORACLE.proposeResponse(_request, _newResponse); + ORACLE.proposeResponse(_request, _newResponse, _defaultAccessControl()); ORACLE.finalize(_request, _newResponse); } else { emit DisputeStatusChanged({_disputeId: _disputeId, _dispute: _dispute, _status: IOracle.DisputeStatus.Lost}); @@ -86,7 +87,7 @@ contract RootVerificationModule is Module, IRootVerificationModule { _dispute: _dispute }); - ORACLE.updateDisputeStatus(_request, _response, _dispute, _status); + ORACLE.updateDisputeStatus(_request, _response, _dispute, _status, _defaultAccessControl()); } /// @inheritdoc IModule diff --git a/solidity/contracts/modules/resolution/ArbitratorModule.sol b/solidity/contracts/modules/resolution/ArbitratorModule.sol index 4dd8fe01..be401254 100644 --- a/solidity/contracts/modules/resolution/ArbitratorModule.sol +++ b/solidity/contracts/modules/resolution/ArbitratorModule.sol @@ -1,13 +1,14 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.19; +import {AccessController} from '@defi-wonderland/prophet-core/solidity/contracts/AccessController.sol'; import {IModule, Module} from '@defi-wonderland/prophet-core/solidity/contracts/Module.sol'; import {IOracle} from '@defi-wonderland/prophet-core/solidity/interfaces/IOracle.sol'; import {IArbitrator} from '../../../interfaces/IArbitrator.sol'; import {IArbitratorModule} from '../../../interfaces/modules/resolution/IArbitratorModule.sol'; -contract ArbitratorModule is Module, IArbitratorModule { +contract ArbitratorModule is AccessController, Module, IArbitratorModule { /** * @notice The status of all disputes */ @@ -41,7 +42,7 @@ contract ArbitratorModule is Module, IArbitratorModule { if (_params.arbitrator == address(0)) revert ArbitratorModule_InvalidArbitrator(); _disputeData[_disputeId] = ArbitrationStatus.Active; - IArbitrator(_params.arbitrator).resolve(_request, _response, _dispute); + IArbitrator(_params.arbitrator).resolve(_request, _response, _dispute, _defaultAccessControl()); emit ResolutionStarted(_dispute.requestId, _disputeId); } @@ -61,7 +62,7 @@ contract ArbitratorModule is Module, IArbitratorModule { if (_status <= IOracle.DisputeStatus.Escalated) revert ArbitratorModule_InvalidResolutionStatus(); _disputeData[_disputeId] = ArbitrationStatus.Resolved; - ORACLE.updateDisputeStatus(_request, _response, _dispute, _status); + ORACLE.updateDisputeStatus(_request, _response, _dispute, _status, _defaultAccessControl()); emit DisputeResolved(_dispute.requestId, _disputeId, _status); } diff --git a/solidity/contracts/modules/resolution/BondEscalationResolutionModule.sol b/solidity/contracts/modules/resolution/BondEscalationResolutionModule.sol index ca12c694..53c126d8 100644 --- a/solidity/contracts/modules/resolution/BondEscalationResolutionModule.sol +++ b/solidity/contracts/modules/resolution/BondEscalationResolutionModule.sol @@ -7,6 +7,7 @@ import {IERC20} from '@openzeppelin/contracts/token/ERC20/IERC20.sol'; import {SafeERC20} from '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol'; import {FixedPointMathLib} from 'solmate/src/utils/FixedPointMathLib.sol'; +import {AccessController} from '@defi-wonderland/prophet-core/solidity/contracts/AccessController.sol'; import {IModule, Module} from '@defi-wonderland/prophet-core/solidity/contracts/Module.sol'; import {IOracle} from '@defi-wonderland/prophet-core/solidity/interfaces/IOracle.sol'; @@ -17,7 +18,13 @@ import {IResolutionModule} from import {IBondEscalationResolutionModule} from '../../../interfaces/modules/resolution/IBondEscalationResolutionModule.sol'; -contract BondEscalationResolutionModule is Module, IBondEscalationResolutionModule { +import { + _CLAIM_PLEDGE_TYPEHASH, + _PLEDGE_AGAINST_DISPUTE_TYPEHASH, + _PLEDGE_FOR_DISPUTE_TYPEHASH +} from '../../utils/Typehash.sol'; + +contract BondEscalationResolutionModule is AccessController, Module, IBondEscalationResolutionModule { using SafeERC20 for IERC20; /// @inheritdoc IBondEscalationResolutionModule @@ -62,8 +69,17 @@ contract BondEscalationResolutionModule is Module, IBondEscalationResolutionModu function pledgeForDispute( IOracle.Request calldata _request, IOracle.Dispute calldata _dispute, - uint256 _pledgeAmount - ) external { + uint256 _pledgeAmount, + AccessControl calldata _accessControl + ) + external + hasAccess( + _request.accessControlModule, + _PLEDGE_FOR_DISPUTE_TYPEHASH, + abi.encode(_request, _dispute, _pledgeAmount), + _accessControl + ) + { _pledge(_request, _dispute, _pledgeAmount, true); } @@ -71,8 +87,17 @@ contract BondEscalationResolutionModule is Module, IBondEscalationResolutionModu function pledgeAgainstDispute( IOracle.Request calldata _request, IOracle.Dispute calldata _dispute, - uint256 _pledgeAmount - ) external { + uint256 _pledgeAmount, + AccessControl calldata _accessControl + ) + external + hasAccess( + _request.accessControlModule, + _PLEDGE_AGAINST_DISPUTE_TYPEHASH, + abi.encode(_request, _dispute, _pledgeAmount), + _accessControl + ) + { _pledge(_request, _dispute, _pledgeAmount, false); } @@ -116,12 +141,19 @@ contract BondEscalationResolutionModule is Module, IBondEscalationResolutionModu _disputeStatus = IOracle.DisputeStatus.Lost; } - ORACLE.updateDisputeStatus(_request, _response, _dispute, _disputeStatus); + ORACLE.updateDisputeStatus(_request, _response, _dispute, _disputeStatus, _defaultAccessControl()); emit DisputeResolved(_dispute.requestId, _disputeId, _disputeStatus); } /// @inheritdoc IBondEscalationResolutionModule - function claimPledge(IOracle.Request calldata _request, IOracle.Dispute calldata _dispute) external { + function claimPledge( + IOracle.Request calldata _request, + IOracle.Dispute calldata _dispute, + AccessControl calldata _accessControl + ) + external + hasAccess(_request.accessControlModule, _CLAIM_PLEDGE_TYPEHASH, abi.encode(_request, _dispute), _accessControl) + { bytes32 _disputeId = _validateDispute(_request, _dispute); Escalation storage _escalation = escalations[_disputeId]; @@ -130,61 +162,68 @@ contract BondEscalationResolutionModule is Module, IBondEscalationResolutionModu uint256 _pledgerBalanceBefore; uint256 _pledgerProportion; uint256 _amountToRelease; - uint256 _reward; RequestParameters memory _params = decodeRequestData(_request.resolutionModuleData); - if (_escalation.resolution == Resolution.DisputerWon) { - _pledgerBalanceBefore = pledgesForDispute[_disputeId][msg.sender]; - pledgesForDispute[_disputeId][msg.sender] -= _pledgerBalanceBefore; - _pledgerProportion = FixedPointMathLib.mulDivDown(_pledgerBalanceBefore, BASE, _escalation.pledgesFor); - _reward = FixedPointMathLib.mulDivDown(_escalation.pledgesAgainst, _pledgerProportion, BASE); - _amountToRelease = _reward + _pledgerBalanceBefore; - _claimPledge({ - _request: _request, - _dispute: _dispute, - _amountToRelease: _amountToRelease, - _resolution: _escalation.resolution, - _params: _params - }); - } else if (_escalation.resolution == Resolution.DisputerLost) { - _pledgerBalanceBefore = pledgesAgainstDispute[_disputeId][msg.sender]; - pledgesAgainstDispute[_disputeId][msg.sender] -= _pledgerBalanceBefore; - _pledgerProportion = FixedPointMathLib.mulDivDown(_pledgerBalanceBefore, BASE, _escalation.pledgesAgainst); - _reward = FixedPointMathLib.mulDivDown(_escalation.pledgesFor, _pledgerProportion, BASE); - _amountToRelease = _reward + _pledgerBalanceBefore; - _claimPledge({ - _request: _request, - _dispute: _dispute, - _amountToRelease: _amountToRelease, - _resolution: _escalation.resolution, - _params: _params - }); - } else if (_escalation.resolution == Resolution.NoResolution) { - uint256 _pledgerBalanceFor = pledgesForDispute[_disputeId][msg.sender]; - uint256 _pledgerBalanceAgainst = pledgesAgainstDispute[_disputeId][msg.sender]; + { + uint256 _reward; - if (_pledgerBalanceFor > 0) { - pledgesForDispute[_disputeId][msg.sender] -= _pledgerBalanceFor; + if (_escalation.resolution == Resolution.DisputerWon) { + _pledgerBalanceBefore = pledgesForDispute[_disputeId][_accessControl.user]; + pledgesForDispute[_disputeId][_accessControl.user] -= _pledgerBalanceBefore; + _pledgerProportion = FixedPointMathLib.mulDivDown(_pledgerBalanceBefore, BASE, _escalation.pledgesFor); + _reward = FixedPointMathLib.mulDivDown(_escalation.pledgesAgainst, _pledgerProportion, BASE); + _amountToRelease = _reward + _pledgerBalanceBefore; _claimPledge({ _request: _request, _dispute: _dispute, - _amountToRelease: _pledgerBalanceFor, + _amountToRelease: _amountToRelease, _resolution: _escalation.resolution, _params: _params }); - } - - if (_pledgerBalanceAgainst > 0) { - pledgesAgainstDispute[_disputeId][msg.sender] -= _pledgerBalanceAgainst; + } else if (_escalation.resolution == Resolution.DisputerLost) { + _pledgerBalanceBefore = pledgesAgainstDispute[_disputeId][_accessControl.user]; + pledgesAgainstDispute[_disputeId][_accessControl.user] -= _pledgerBalanceBefore; + _pledgerProportion = FixedPointMathLib.mulDivDown(_pledgerBalanceBefore, BASE, _escalation.pledgesAgainst); + _reward = FixedPointMathLib.mulDivDown(_escalation.pledgesFor, _pledgerProportion, BASE); + _amountToRelease = _reward + _pledgerBalanceBefore; _claimPledge({ _request: _request, _dispute: _dispute, - _amountToRelease: _pledgerBalanceAgainst, + _amountToRelease: _amountToRelease, _resolution: _escalation.resolution, _params: _params }); } } + + if (_escalation.resolution == Resolution.NoResolution) { + { + uint256 _pledgerBalanceFor = pledgesForDispute[_disputeId][msg.sender]; + if (_pledgerBalanceFor > 0) { + pledgesForDispute[_disputeId][msg.sender] -= _pledgerBalanceFor; + _claimPledge({ + _request: _request, + _dispute: _dispute, + _amountToRelease: _pledgerBalanceFor, + _resolution: _escalation.resolution, + _params: _params + }); + } + } + { + uint256 _pledgerBalanceAgainst = pledgesAgainstDispute[_disputeId][msg.sender]; + if (_pledgerBalanceAgainst > 0) { + pledgesAgainstDispute[_disputeId][msg.sender] -= _pledgerBalanceAgainst; + _claimPledge({ + _request: _request, + _dispute: _dispute, + _amountToRelease: _pledgerBalanceAgainst, + _resolution: _escalation.resolution, + _params: _params + }); + } + } + } } /** @@ -200,7 +239,10 @@ contract BondEscalationResolutionModule is Module, IBondEscalationResolutionModu IOracle.Dispute calldata _dispute, uint256 _pledgeAmount, bool _pledgingFor - ) internal { + ) + // todo: address pledger + internal + { bytes32 _disputeId = _validateDispute(_request, _dispute); Escalation storage _escalation = escalations[_disputeId]; diff --git a/solidity/contracts/modules/resolution/ERC20ResolutionModule.sol b/solidity/contracts/modules/resolution/ERC20ResolutionModule.sol index b2bfad3f..bed5d509 100644 --- a/solidity/contracts/modules/resolution/ERC20ResolutionModule.sol +++ b/solidity/contracts/modules/resolution/ERC20ResolutionModule.sol @@ -6,12 +6,15 @@ import {IERC20} from '@openzeppelin/contracts/token/ERC20/IERC20.sol'; import {SafeERC20} from '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol'; import {EnumerableSet} from '@openzeppelin/contracts/utils/structs/EnumerableSet.sol'; +import {AccessController} from '@defi-wonderland/prophet-core/solidity/contracts/AccessController.sol'; import {IModule, Module} from '@defi-wonderland/prophet-core/solidity/contracts/Module.sol'; import {IOracle} from '@defi-wonderland/prophet-core/solidity/interfaces/IOracle.sol'; import {IERC20ResolutionModule} from '../../../interfaces/modules/resolution/IERC20ResolutionModule.sol'; -contract ERC20ResolutionModule is Module, IERC20ResolutionModule { +import {_CAST_VOTE_TYPEHASH, _CLAIM_VOTE_TYPEHASH} from '../../utils/Typehash.sol'; + +contract ERC20ResolutionModule is AccessController, Module, IERC20ResolutionModule { using SafeERC20 for IERC20; using EnumerableSet for EnumerableSet.AddressSet; @@ -53,8 +56,17 @@ contract ERC20ResolutionModule is Module, IERC20ResolutionModule { function castVote( IOracle.Request calldata _request, IOracle.Dispute calldata _dispute, - uint256 _numberOfVotes - ) public { + uint256 _numberOfVotes, + AccessControl calldata _accessControl + ) + public // review: why not external? + hasAccess( + _request.accessControlModule, + _CAST_VOTE_TYPEHASH, + abi.encode(_request, _dispute, _numberOfVotes), + _accessControl + ) + { bytes32 _disputeId = _validateDispute(_request, _dispute); Escalation memory _escalation = escalations[_disputeId]; if (_escalation.startTime == 0) revert ERC20ResolutionModule_DisputeNotEscalated(); @@ -66,13 +78,13 @@ contract ERC20ResolutionModule is Module, IERC20ResolutionModule { uint256 _deadline = _escalation.startTime + _params.timeUntilDeadline; if (block.timestamp >= _deadline) revert ERC20ResolutionModule_VotingPhaseOver(); - votes[_disputeId][msg.sender] += _numberOfVotes; + votes[_disputeId][_accessControl.user] += _numberOfVotes; - _voters[_disputeId].add(msg.sender); + _voters[_disputeId].add(_accessControl.user); escalations[_disputeId].totalVotes += _numberOfVotes; - _params.accountingExtension.bond(msg.sender, _dispute.requestId, _params.votingToken, _numberOfVotes); - emit VoteCast(msg.sender, _disputeId, _numberOfVotes); + _params.accountingExtension.bond(_accessControl.user, _dispute.requestId, _params.votingToken, _numberOfVotes); + emit VoteCast(_accessControl.user, _disputeId, _numberOfVotes); } /// @inheritdoc IERC20ResolutionModule @@ -100,16 +112,23 @@ contract ERC20ResolutionModule is Module, IERC20ResolutionModule { // Update status if (_quorumReached == 1) { - ORACLE.updateDisputeStatus(_request, _response, _dispute, IOracle.DisputeStatus.Won); + ORACLE.updateDisputeStatus(_request, _response, _dispute, IOracle.DisputeStatus.Won, _defaultAccessControl()); emit DisputeResolved(_dispute.requestId, _disputeId, IOracle.DisputeStatus.Won); } else { - ORACLE.updateDisputeStatus(_request, _response, _dispute, IOracle.DisputeStatus.Lost); + ORACLE.updateDisputeStatus(_request, _response, _dispute, IOracle.DisputeStatus.Lost, _defaultAccessControl()); emit DisputeResolved(_dispute.requestId, _disputeId, IOracle.DisputeStatus.Lost); } } /// @inheritdoc IERC20ResolutionModule - function claimVote(IOracle.Request calldata _request, IOracle.Dispute calldata _dispute) external { + function claimVote( + IOracle.Request calldata _request, + IOracle.Dispute calldata _dispute, + AccessControl calldata _accessControl + ) + external + hasAccess(_request.accessControlModule, _CLAIM_VOTE_TYPEHASH, abi.encode(_request, _dispute), _accessControl) + { bytes32 _disputeId = _validateDispute(_request, _dispute); Escalation memory _escalation = escalations[_disputeId]; @@ -119,10 +138,10 @@ contract ERC20ResolutionModule is Module, IERC20ResolutionModule { if (block.timestamp < _deadline) revert ERC20ResolutionModule_OnGoingVotingPhase(); // Transfer the tokens back to the voter - uint256 _amount = votes[_disputeId][msg.sender]; - _params.accountingExtension.release(msg.sender, _dispute.requestId, _params.votingToken, _amount); + uint256 _amount = votes[_disputeId][_accessControl.user]; + _params.accountingExtension.release(_accessControl.user, _dispute.requestId, _params.votingToken, _amount); - emit VoteClaimed(msg.sender, _disputeId, _amount); + emit VoteClaimed(_accessControl.user, _disputeId, _amount); } /// @inheritdoc IERC20ResolutionModule diff --git a/solidity/contracts/modules/resolution/PrivateERC20ResolutionModule.sol b/solidity/contracts/modules/resolution/PrivateERC20ResolutionModule.sol index f56dd714..0c138002 100644 --- a/solidity/contracts/modules/resolution/PrivateERC20ResolutionModule.sol +++ b/solidity/contracts/modules/resolution/PrivateERC20ResolutionModule.sol @@ -6,12 +6,14 @@ import {IERC20} from '@openzeppelin/contracts/token/ERC20/IERC20.sol'; import {SafeERC20} from '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol'; import {EnumerableSet} from '@openzeppelin/contracts/utils/structs/EnumerableSet.sol'; +import {_COMMIT_VOTE_TYPEHASH, _REVEAL_VOTE_TYPEHASH} from '../../utils/Typehash.sol'; import {IModule, Module} from '@defi-wonderland/prophet-core/solidity/contracts/Module.sol'; import {IOracle} from '@defi-wonderland/prophet-core/solidity/interfaces/IOracle.sol'; import {IPrivateERC20ResolutionModule} from '../../../interfaces/modules/resolution/IPrivateERC20ResolutionModule.sol'; +import {AccessController} from '@defi-wonderland/prophet-core/solidity/contracts/AccessController.sol'; -contract PrivateERC20ResolutionModule is Module, IPrivateERC20ResolutionModule { +contract PrivateERC20ResolutionModule is AccessController, Module, IPrivateERC20ResolutionModule { using SafeERC20 for IERC20; using EnumerableSet for EnumerableSet.AddressSet; @@ -50,7 +52,15 @@ contract PrivateERC20ResolutionModule is Module, IPrivateERC20ResolutionModule { } /// @inheritdoc IPrivateERC20ResolutionModule - function commitVote(IOracle.Request calldata _request, IOracle.Dispute calldata _dispute, bytes32 _commitment) public { + function commitVote( + IOracle.Request calldata _request, + IOracle.Dispute calldata _dispute, + bytes32 _commitment, + AccessControl calldata _accessControl + ) + external + hasAccess(_request.accessControlModule, _COMMIT_VOTE_TYPEHASH, abi.encode(_request, _dispute), _accessControl) + { bytes32 _disputeId = _validateDispute(_request, _dispute); if (ORACLE.disputeStatus(_disputeId) != IOracle.DisputeStatus.Escalated) { revert PrivateERC20ResolutionModule_AlreadyResolved(); @@ -74,34 +84,38 @@ contract PrivateERC20ResolutionModule is Module, IPrivateERC20ResolutionModule { IOracle.Request calldata _request, IOracle.Dispute calldata _dispute, uint256 _numberOfVotes, - bytes32 _salt - ) public { + bytes32 _salt, + AccessControl calldata _accessControl + ) + public // review: why not external? + hasAccess(_request.accessControlModule, _REVEAL_VOTE_TYPEHASH, abi.encode(_request, _dispute), _accessControl) + { bytes32 _disputeId = _validateDispute(_request, _dispute); Escalation memory _escalation = escalations[_disputeId]; if (_escalation.startTime == 0) revert PrivateERC20ResolutionModule_DisputeNotEscalated(); RequestParameters memory _params = decodeRequestData(_request.resolutionModuleData); - (uint256 _revealStartTime, uint256 _revealEndTime) = ( - _escalation.startTime + _params.committingTimeWindow, - _escalation.startTime + _params.committingTimeWindow + _params.revealingTimeWindow - ); - if (block.timestamp <= _revealStartTime) revert PrivateERC20ResolutionModule_OnGoingCommittingPhase(); - if (block.timestamp > _revealEndTime) revert PrivateERC20ResolutionModule_RevealingPhaseOver(); + if (block.timestamp <= _escalation.startTime + _params.committingTimeWindow) { + revert PrivateERC20ResolutionModule_OnGoingCommittingPhase(); + } + if (block.timestamp > _escalation.startTime + _params.committingTimeWindow + _params.revealingTimeWindow) { + revert PrivateERC20ResolutionModule_RevealingPhaseOver(); + } - VoterData storage _voterData = _votersData[_disputeId][msg.sender]; + VoterData storage _voterData = _votersData[_disputeId][_accessControl.user]; - if (_voterData.commitment != keccak256(abi.encode(msg.sender, _disputeId, _numberOfVotes, _salt))) { + if (_voterData.commitment != keccak256(abi.encode(_accessControl.user, _disputeId, _numberOfVotes, _salt))) { revert PrivateERC20ResolutionModule_WrongRevealData(); } _voterData.numOfVotes = _numberOfVotes; _voterData.commitment = bytes32(''); - _voters[_disputeId].add(msg.sender); + _voters[_disputeId].add(_accessControl.user); escalations[_disputeId].totalVotes += _numberOfVotes; - _params.votingToken.safeTransferFrom(msg.sender, address(this), _numberOfVotes); + _params.votingToken.safeTransferFrom(_accessControl.user, address(this), _numberOfVotes); - emit VoteRevealed(msg.sender, _disputeId, _numberOfVotes); + emit VoteRevealed(_accessControl.user, _disputeId, _numberOfVotes); } /// @inheritdoc IPrivateERC20ResolutionModule @@ -130,10 +144,10 @@ contract PrivateERC20ResolutionModule is Module, IPrivateERC20ResolutionModule { uint256 _quorumReached = _escalation.totalVotes >= _params.minVotesForQuorum ? 1 : 0; if (_quorumReached == 1) { - ORACLE.updateDisputeStatus(_request, _response, _dispute, IOracle.DisputeStatus.Won); + ORACLE.updateDisputeStatus(_request, _response, _dispute, IOracle.DisputeStatus.Won, _defaultAccessControl()); emit DisputeResolved(_dispute.requestId, _disputeId, IOracle.DisputeStatus.Won); } else { - ORACLE.updateDisputeStatus(_request, _response, _dispute, IOracle.DisputeStatus.Lost); + ORACLE.updateDisputeStatus(_request, _response, _dispute, IOracle.DisputeStatus.Lost, _defaultAccessControl()); emit DisputeResolved(_dispute.requestId, _disputeId, IOracle.DisputeStatus.Lost); } diff --git a/solidity/contracts/modules/response/BondedResponseModule.sol b/solidity/contracts/modules/response/BondedResponseModule.sol index ba41b872..42184135 100644 --- a/solidity/contracts/modules/response/BondedResponseModule.sol +++ b/solidity/contracts/modules/response/BondedResponseModule.sol @@ -1,12 +1,14 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.19; -import {IBondedResponseModule} from '../../../interfaces/modules/response/IBondedResponseModule.sol'; - +import {AccessController} from '@defi-wonderland/prophet-core/solidity/contracts/AccessController.sol'; import {IModule, Module} from '@defi-wonderland/prophet-core/solidity/contracts/Module.sol'; import {IOracle} from '@defi-wonderland/prophet-core/solidity/interfaces/IOracle.sol'; -contract BondedResponseModule is Module, IBondedResponseModule { +import {IBondedResponseModule} from '../../../interfaces/modules/response/IBondedResponseModule.sol'; +import {_PLEDGE_FOR_DISPUTE_TYPEHASH, _RELEASE_UNUTILIZED_RESPONSE_TYPEHASH} from '../../utils/Typehash.sol'; + +contract BondedResponseModule is AccessController, Module, IBondedResponseModule { constructor(IOracle _oracle) Module(_oracle) {} /// @inheritdoc IModule @@ -98,7 +100,19 @@ contract BondedResponseModule is Module, IBondedResponseModule { } /// @inheritdoc IBondedResponseModule - function releaseUnutilizedResponse(IOracle.Request calldata _request, IOracle.Response calldata _response) external { + function releaseUnutilizedResponse( + IOracle.Request calldata _request, + IOracle.Response calldata _response, + AccessControl calldata _accessControl + ) + external + hasAccess( + _request.accessControlModule, + _RELEASE_UNUTILIZED_RESPONSE_TYPEHASH, + abi.encode(_request, _response), + _accessControl + ) + { bytes32 _responseId = _validateResponse(_request, _response); bytes32 _disputeId = ORACLE.disputeOf(_responseId); From 3dc123e723d9edc2ddcef9a3c8f9e38a0ea0a2e4 Mon Sep 17 00:00:00 2001 From: zorzal Date: Wed, 23 Oct 2024 15:58:41 -0400 Subject: [PATCH 02/50] feat: update interfaces --- solidity/interfaces/IArbitrator.sol | 4 +++- .../modules/dispute/IBondEscalationModule.sol | 13 +++++++++++-- .../modules/resolution/IArbitratorModule.sol | 5 ++++- .../resolution/IBondEscalationResolutionModule.sol | 13 ++++++++++--- .../modules/resolution/IERC20ResolutionModule.sol | 10 ++++++++-- .../resolution/IPrivateERC20ResolutionModule.sol | 8 ++++++-- .../modules/response/IBondedResponseModule.sol | 7 ++++++- 7 files changed, 48 insertions(+), 12 deletions(-) diff --git a/solidity/interfaces/IArbitrator.sol b/solidity/interfaces/IArbitrator.sol index c5fdc6cd..8207235d 100644 --- a/solidity/interfaces/IArbitrator.sol +++ b/solidity/interfaces/IArbitrator.sol @@ -1,6 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.19; +import {IAccessController} from '@defi-wonderland/prophet-core/solidity/interfaces/IAccessController.sol'; import {IOracle} from '@defi-wonderland/prophet-core/solidity/interfaces/IOracle.sol'; interface IArbitrator { @@ -21,6 +22,7 @@ interface IArbitrator { function resolve( IOracle.Request memory _request, IOracle.Response memory _response, - IOracle.Dispute memory _dispute + IOracle.Dispute memory _dispute, + IAccessController.AccessControl memory _accessControl ) external returns (bytes memory _data); } diff --git a/solidity/interfaces/modules/dispute/IBondEscalationModule.sol b/solidity/interfaces/modules/dispute/IBondEscalationModule.sol index 4ee78546..9340deec 100644 --- a/solidity/interfaces/modules/dispute/IBondEscalationModule.sol +++ b/solidity/interfaces/modules/dispute/IBondEscalationModule.sol @@ -1,6 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.19; +import {IAccessController} from '@defi-wonderland/prophet-core/solidity/interfaces/IAccessController.sol'; import {IOracle} from '@defi-wonderland/prophet-core/solidity/interfaces/IOracle.sol'; import {IDisputeModule} from '@defi-wonderland/prophet-core/solidity/interfaces/modules/dispute/IDisputeModule.sol'; import {IERC20} from '@openzeppelin/contracts/token/ERC20/IERC20.sol'; @@ -246,7 +247,11 @@ interface IBondEscalationModule is IDisputeModule { * During the tying buffer, the losing party can only tie, and once the escalation is tied * no further funds can be pledged. */ - function pledgeForDispute(IOracle.Request calldata _request, IOracle.Dispute calldata _dispute) external; + function pledgeForDispute( + IOracle.Request calldata _request, + IOracle.Dispute calldata _dispute, + IAccessController.AccessControl calldata _accessControl + ) external; /** * @notice Pledges funds against a given disputeId during its bond escalation process. @@ -260,7 +265,11 @@ interface IBondEscalationModule is IDisputeModule { * During the tying buffer, the losing party can only tie, and once the escalation is tied * no further funds can be pledged. */ - function pledgeAgainstDispute(IOracle.Request calldata _request, IOracle.Dispute calldata _dispute) external; + function pledgeAgainstDispute( + IOracle.Request calldata _request, + IOracle.Dispute calldata _dispute, + IAccessController.AccessControl calldata _accessControl + ) external; /** * @notice Settles the bond escalation process of a given requestId. diff --git a/solidity/interfaces/modules/resolution/IArbitratorModule.sol b/solidity/interfaces/modules/resolution/IArbitratorModule.sol index 5e34ea70..abc2effc 100644 --- a/solidity/interfaces/modules/resolution/IArbitratorModule.sol +++ b/solidity/interfaces/modules/resolution/IArbitratorModule.sol @@ -1,6 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.19; +import {IAccessController} from '@defi-wonderland/prophet-core/solidity/interfaces/IAccessController.sol'; import {IOracle} from '@defi-wonderland/prophet-core/solidity/interfaces/IOracle.sol'; import {IResolutionModule} from '@defi-wonderland/prophet-core/solidity/interfaces/modules/resolution/IResolutionModule.sol'; @@ -107,5 +108,7 @@ interface IArbitratorModule is IResolutionModule { IOracle.Request calldata _request, IOracle.Response calldata _response, IOracle.Dispute calldata _dispute - ) external; + ) + // IAccessController.AccessControl calldata _accessControl + external; } diff --git a/solidity/interfaces/modules/resolution/IBondEscalationResolutionModule.sol b/solidity/interfaces/modules/resolution/IBondEscalationResolutionModule.sol index ea32729b..d13e1984 100644 --- a/solidity/interfaces/modules/resolution/IBondEscalationResolutionModule.sol +++ b/solidity/interfaces/modules/resolution/IBondEscalationResolutionModule.sol @@ -1,6 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.19; +import {IAccessController} from '@defi-wonderland/prophet-core/solidity/interfaces/IAccessController.sol'; import {IOracle} from '@defi-wonderland/prophet-core/solidity/interfaces/IOracle.sol'; import {IResolutionModule} from '@defi-wonderland/prophet-core/solidity/interfaces/modules/resolution/IResolutionModule.sol'; @@ -280,7 +281,8 @@ interface IBondEscalationResolutionModule is IResolutionModule { function pledgeForDispute( IOracle.Request calldata _request, IOracle.Dispute calldata _dispute, - uint256 _pledgeAmount + uint256 _pledgeAmount, + IAccessController.AccessControl calldata _accessControl ) external; /** @@ -294,7 +296,8 @@ interface IBondEscalationResolutionModule is IResolutionModule { function pledgeAgainstDispute( IOracle.Request calldata _request, IOracle.Dispute calldata _dispute, - uint256 _pledgeAmount + uint256 _pledgeAmount, + IAccessController.AccessControl calldata _accessControl ) external; /** @@ -306,5 +309,9 @@ interface IBondEscalationResolutionModule is IResolutionModule { * @dev Winning pledgers will claim their pledges along with their reward. In case of no resolution, users can * claim their pledges back. Losing pledgers will go to the rewards of the winning pledgers. */ - function claimPledge(IOracle.Request calldata _request, IOracle.Dispute calldata _dispute) external; + function claimPledge( + IOracle.Request calldata _request, + IOracle.Dispute calldata _dispute, + IAccessController.AccessControl calldata _accessControl + ) external; } diff --git a/solidity/interfaces/modules/resolution/IERC20ResolutionModule.sol b/solidity/interfaces/modules/resolution/IERC20ResolutionModule.sol index f4fe7bbe..5ef6576c 100644 --- a/solidity/interfaces/modules/resolution/IERC20ResolutionModule.sol +++ b/solidity/interfaces/modules/resolution/IERC20ResolutionModule.sol @@ -1,6 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.19; +import {IAccessController} from '@defi-wonderland/prophet-core/solidity/interfaces/IAccessController.sol'; import {IOracle} from '@defi-wonderland/prophet-core/solidity/interfaces/IOracle.sol'; import {IResolutionModule} from '@defi-wonderland/prophet-core/solidity/interfaces/modules/resolution/IResolutionModule.sol'; @@ -156,7 +157,8 @@ interface IERC20ResolutionModule is IResolutionModule { function castVote( IOracle.Request calldata _request, IOracle.Dispute calldata _dispute, - uint256 _numberOfVotes + uint256 _numberOfVotes, + IAccessController.AccessControl calldata _accessControl ) external; /** @@ -180,7 +182,11 @@ interface IERC20ResolutionModule is IResolutionModule { * @param _request The request for which the dispute was created * @param _dispute The resolved dispute */ - function claimVote(IOracle.Request calldata _request, IOracle.Dispute calldata _dispute) external; + function claimVote( + IOracle.Request calldata _request, + IOracle.Dispute calldata _dispute, + IAccessController.AccessControl calldata _accessControl + ) external; /** * @notice Gets the voters of a dispute diff --git a/solidity/interfaces/modules/resolution/IPrivateERC20ResolutionModule.sol b/solidity/interfaces/modules/resolution/IPrivateERC20ResolutionModule.sol index 51ae24e6..569eb24a 100644 --- a/solidity/interfaces/modules/resolution/IPrivateERC20ResolutionModule.sol +++ b/solidity/interfaces/modules/resolution/IPrivateERC20ResolutionModule.sol @@ -2,6 +2,8 @@ pragma solidity ^0.8.19; import {IAccountingExtension} from '../../extensions/IAccountingExtension.sol'; + +import {IAccessController} from '@defi-wonderland/prophet-core/solidity/interfaces/IAccessController.sol'; import {IOracle} from '@defi-wonderland/prophet-core/solidity/interfaces/IOracle.sol'; import {IResolutionModule} from '@defi-wonderland/prophet-core/solidity/interfaces/modules/resolution/IResolutionModule.sol'; @@ -166,7 +168,8 @@ interface IPrivateERC20ResolutionModule is IResolutionModule { function commitVote( IOracle.Request calldata _request, IOracle.Dispute calldata _dispute, - bytes32 _commitment + bytes32 _commitment, + IAccessController.AccessControl calldata _accessControl ) external; /** @@ -181,7 +184,8 @@ interface IPrivateERC20ResolutionModule is IResolutionModule { IOracle.Request calldata _request, IOracle.Dispute calldata _dispute, uint256 _numberOfVotes, - bytes32 _salt + bytes32 _salt, + IAccessController.AccessControl calldata _accessControl ) external; /** diff --git a/solidity/interfaces/modules/response/IBondedResponseModule.sol b/solidity/interfaces/modules/response/IBondedResponseModule.sol index bacb55d0..4c064144 100644 --- a/solidity/interfaces/modules/response/IBondedResponseModule.sol +++ b/solidity/interfaces/modules/response/IBondedResponseModule.sol @@ -1,6 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.19; +import {IAccessController} from '@defi-wonderland/prophet-core/solidity/interfaces/IAccessController.sol'; import {IOracle} from '@defi-wonderland/prophet-core/solidity/interfaces/IOracle.sol'; import {IResponseModule} from '@defi-wonderland/prophet-core/solidity/interfaces/modules/response/IResponseModule.sol'; import {IERC20} from '@openzeppelin/contracts/token/ERC20/IERC20.sol'; @@ -117,5 +118,9 @@ interface IBondedResponseModule is IResponseModule { * @param _request The finalized request * @param _response The unutilized response */ - function releaseUnutilizedResponse(IOracle.Request calldata _request, IOracle.Response calldata _response) external; + function releaseUnutilizedResponse( + IOracle.Request calldata _request, + IOracle.Response calldata _response, + IAccessController.AccessControl calldata _accessControl + ) external; } From ed39f02e1c9e82cef9060fb8eb65fa2db1f0bc87 Mon Sep 17 00:00:00 2001 From: zorzal Date: Wed, 23 Oct 2024 16:13:03 -0400 Subject: [PATCH 03/50] test: update integration tests --- solidity/test/integration/Arbitration.t.sol | 12 +-- .../test/integration/BondEscalation.t.sol | 77 +++++++++++-------- .../test/integration/CallbackModule.t.sol | 2 +- .../integration/ContractCallRequest.t.sol | 2 +- .../test/integration/EscalateDispute.t.sol | 20 +++-- solidity/test/integration/HttpRequest.t.sol | 2 +- solidity/test/integration/IntegrationBase.sol | 7 +- .../integration/MultipleCallbacksModule.t.sol | 2 +- .../test/integration/ResponseDispute.t.sol | 14 ++-- .../test/integration/ResponseProposal.t.sol | 16 ++-- .../test/integration/RootVerification.t.sol | 10 +-- 11 files changed, 92 insertions(+), 72 deletions(-) diff --git a/solidity/test/integration/Arbitration.t.sol b/solidity/test/integration/Arbitration.t.sol index d0732b69..9a838ee6 100644 --- a/solidity/test/integration/Arbitration.t.sol +++ b/solidity/test/integration/Arbitration.t.sol @@ -25,14 +25,14 @@ contract Integration_Arbitration is IntegrationBase { // First step: escalating the dispute vm.prank(disputer); - oracle.escalateDispute(mockRequest, mockResponse, mockDispute); + oracle.escalateDispute(mockRequest, mockResponse, mockDispute, _createAccessControl(disputer)); // Check: is the dispute status active after starting the resolution? assertEq(uint256(_arbitratorModule.getStatus(_disputeId)), uint256(IArbitratorModule.ArbitrationStatus.Active)); // Second step: resolving the dispute vm.prank(disputer); - oracle.resolveDispute(mockRequest, mockResponse, mockDispute); + oracle.resolveDispute(mockRequest, mockResponse, mockDispute, _createAccessControl(disputer)); // Check: is the dispute status resolved after calling resolve? assertEq(uint256(_arbitratorModule.getStatus(_disputeId)), uint256(IArbitratorModule.ArbitrationStatus.Resolved)); @@ -58,7 +58,7 @@ contract Integration_Arbitration is IntegrationBase { // First step: escalating the dispute vm.prank(disputer); - oracle.escalateDispute(mockRequest, mockResponse, mockDispute); + oracle.escalateDispute(mockRequest, mockResponse, mockDispute, _createAccessControl(disputer)); // Check: is the dispute status resolved after calling resolve? assertEq(uint256(_arbitratorModule.getStatus(_disputeId)), uint256(IArbitratorModule.ArbitrationStatus.Resolved)); @@ -83,7 +83,7 @@ contract Integration_Arbitration is IntegrationBase { // First step: escalating the dispute vm.prank(disputer); - oracle.escalateDispute(mockRequest, mockResponse, mockDispute); + oracle.escalateDispute(mockRequest, mockResponse, mockDispute, _createAccessControl(disputer)); // Check: is the dispute status active after starting the resolution? assertEq(uint256(_arbitratorModule.getStatus(_disputeId)), uint256(IArbitratorModule.ArbitrationStatus.Active)); @@ -97,7 +97,7 @@ contract Integration_Arbitration is IntegrationBase { // Second step: resolving the dispute vm.prank(disputer); - oracle.resolveDispute(mockRequest, mockResponse, mockDispute); + oracle.resolveDispute(mockRequest, mockResponse, mockDispute, _createAccessControl(disputer)); // Check: is the dispute status resolved after calling resolve? assertEq(uint256(_arbitratorModule.getStatus(_disputeId)), uint256(IArbitratorModule.ArbitrationStatus.Resolved)); @@ -130,7 +130,7 @@ contract Integration_Arbitration is IntegrationBase { // First step: escalating and resolving the dispute vm.prank(disputer); - oracle.escalateDispute(mockRequest, mockResponse, mockDispute); + oracle.escalateDispute(mockRequest, mockResponse, mockDispute, _createAccessControl(disputer)); // Check: is the dispute status resolved after calling escalate? assertEq(uint256(_arbitratorModule.getStatus(_disputeId)), uint256(IArbitratorModule.ArbitrationStatus.Resolved)); diff --git a/solidity/test/integration/BondEscalation.t.sol b/solidity/test/integration/BondEscalation.t.sol index f68c5d55..d95c8912 100644 --- a/solidity/test/integration/BondEscalation.t.sol +++ b/solidity/test/integration/BondEscalation.t.sol @@ -101,29 +101,29 @@ contract Integration_BondEscalation is IntegrationBase { // Proposer proposes a response _deposit(_bondEscalationAccounting, proposer, usdc, _expectedBondSize); vm.prank(proposer); - _responseId = oracle.proposeResponse(mockRequest, mockResponse); + _responseId = oracle.proposeResponse(mockRequest, mockResponse, _createAccessControl(proposer)); // Disputer disputes the response _deposit(_bondEscalationAccounting, disputer, usdc, _pledgeSize); vm.prank(disputer); - _disputeId = oracle.disputeResponse(mockRequest, mockResponse, mockDispute); + _disputeId = oracle.disputeResponse(mockRequest, mockResponse, mockDispute, _createAccessControl(disputer)); } function test_proposerWins() public { // Step 1: Proposer pledges against the dispute _deposit(_bondEscalationAccounting, proposer, usdc, _pledgeSize); vm.prank(proposer); - _bondEscalationModule.pledgeAgainstDispute(mockRequest, mockDispute); + _bondEscalationModule.pledgeAgainstDispute(mockRequest, mockDispute, _createAccessControl(proposer)); // Step 2: Disputer doubles down _deposit(_bondEscalationAccounting, disputer, usdc, _pledgeSize); vm.prank(disputer); - _bondEscalationModule.pledgeForDispute(mockRequest, mockDispute); + _bondEscalationModule.pledgeForDispute(mockRequest, mockDispute, _createAccessControl(disputer)); // Step 3: Proposer doubles down _deposit(_bondEscalationAccounting, proposer, usdc, _pledgeSize); vm.prank(proposer); - _bondEscalationModule.pledgeAgainstDispute(mockRequest, mockDispute); + _bondEscalationModule.pledgeAgainstDispute(mockRequest, mockDispute, _createAccessControl(proposer)); // Step 4: Disputer runs out of capital // Step 5: External parties see that Disputer's dispute was wrong so they don't join to escalate @@ -173,17 +173,17 @@ contract Integration_BondEscalation is IntegrationBase { // Step 1: Proposer pledges against the dispute _deposit(_bondEscalationAccounting, proposer, usdc, _pledgeSize); vm.prank(proposer); - _bondEscalationModule.pledgeAgainstDispute(mockRequest, mockDispute); + _bondEscalationModule.pledgeAgainstDispute(mockRequest, mockDispute, _createAccessControl(proposer)); // Step 2: Disputer doubles down _deposit(_bondEscalationAccounting, disputer, usdc, _pledgeSize); vm.prank(disputer); - _bondEscalationModule.pledgeForDispute(mockRequest, mockDispute); + _bondEscalationModule.pledgeForDispute(mockRequest, mockDispute, _createAccessControl(disputer)); // Step 3: Another party joins the dispute _deposit(_bondEscalationAccounting, _secondDisputer, usdc, _pledgeSize); vm.prank(_secondDisputer); - _bondEscalationModule.pledgeForDispute(mockRequest, mockDispute); + _bondEscalationModule.pledgeForDispute(mockRequest, mockDispute, _createAccessControl(_secondDisputer)); // Step 4: Proposer runs out of capital and doesn't pledge anymore // External parties see that Proposer's proposal was wrong so they don't join to escalate @@ -225,27 +225,27 @@ contract Integration_BondEscalation is IntegrationBase { IOracle.Response({proposer: _secondProposer, requestId: _requestId, response: abi.encode('second response')}); _deposit(_bondEscalationAccounting, _secondProposer, usdc, _pledgeSize); vm.prank(_secondProposer); - _responseId = oracle.proposeResponse(mockRequest, _secondResponse); + _responseId = oracle.proposeResponse(mockRequest, _secondResponse, _createAccessControl(_secondProposer)); // Step 8: Disputer disputes Another proposer's answer // _deposit(_bondEscalationAccounting, disputer, usdc, _pledgeSize); IOracle.Dispute memory _secondDispute = IOracle.Dispute({disputer: disputer, responseId: _responseId, requestId: _requestId, proposer: _secondProposer}); vm.prank(disputer); - _disputeId = oracle.disputeResponse(mockRequest, _secondResponse, _secondDispute); + _disputeId = oracle.disputeResponse(mockRequest, _secondResponse, _secondDispute, _createAccessControl(disputer)); // Step 9: Shouldn't be able to pledge for or against the dispute due to the bond escalation deadline being over _deposit(_bondEscalationAccounting, disputer, usdc, _pledgeSize); vm.expectRevert(IBondEscalationModule.BondEscalationModule_InvalidDispute.selector); vm.prank(disputer); - _bondEscalationModule.pledgeForDispute(mockRequest, _secondDispute); + _bondEscalationModule.pledgeForDispute(mockRequest, _secondDispute, _createAccessControl(disputer)); // Step 10: Because Another proposer's answer is disputed, a third party can propose a new answer IOracle.Response memory _thirdResponse = IOracle.Response({proposer: _thirdProposer, requestId: _requestId, response: abi.encode('third response')}); _deposit(_bondEscalationAccounting, _thirdProposer, usdc, _expectedBondSize); vm.prank(_thirdProposer); - _responseId = oracle.proposeResponse(mockRequest, _thirdResponse); + _responseId = oracle.proposeResponse(mockRequest, _thirdResponse, _createAccessControl(_thirdProposer)); // Step 11: It goes undisputed for three days, therefore it's deemed correct and final vm.warp(block.timestamp + _expectedDeadline + 1); @@ -285,7 +285,7 @@ contract Integration_BondEscalation is IntegrationBase { // So Another proposer gets paid Disputer's bond vm.warp(block.timestamp + _expectedDeadline + 2 days); _mockArbitrator.setAnswer(IOracle.DisputeStatus.Lost); - oracle.resolveDispute(mockRequest, _secondResponse, _secondDispute); + oracle.resolveDispute(mockRequest, _secondResponse, _secondDispute, mockAccessControl); // Test: The requester still has nothing assertEq(_bondEscalationAccounting.balanceOf(requester, usdc), 0, 'Mismatch: Requester balance'); @@ -326,17 +326,17 @@ contract Integration_BondEscalation is IntegrationBase { // Step 1: Proposer pledges against the dispute _deposit(_bondEscalationAccounting, proposer, usdc, _pledgeSize); vm.prank(proposer); - _bondEscalationModule.pledgeAgainstDispute(mockRequest, mockDispute); + _bondEscalationModule.pledgeAgainstDispute(mockRequest, mockDispute, _createAccessControl(proposer)); // Step 2: Disputer doubles down _deposit(_bondEscalationAccounting, disputer, usdc, _pledgeSize); vm.prank(disputer); - _bondEscalationModule.pledgeForDispute(mockRequest, mockDispute); + _bondEscalationModule.pledgeForDispute(mockRequest, mockDispute, _createAccessControl(disputer)); // Step 3: Proposer doubles down _deposit(_bondEscalationAccounting, proposer, usdc, _pledgeSize); vm.prank(proposer); - _bondEscalationModule.pledgeAgainstDispute(mockRequest, mockDispute); + _bondEscalationModule.pledgeAgainstDispute(mockRequest, mockDispute, _createAccessControl(proposer)); // Step 4: Disputer runs out of capital // Step 5: The tying buffer kicks in @@ -345,21 +345,24 @@ contract Integration_BondEscalation is IntegrationBase { // Step 6: An external party sees that Proposer's response is incorrect, so they bond the required WETH _deposit(_bondEscalationAccounting, _secondDisputer, usdc, _pledgeSize); vm.prank(_secondDisputer); - _bondEscalationModule.pledgeForDispute(mockRequest, mockDispute); + _bondEscalationModule.pledgeForDispute(mockRequest, mockDispute, _createAccessControl(_secondDisputer)); // Step 7: They go into the dispute resolution module - oracle.escalateDispute(mockRequest, mockResponse, mockDispute); + // review: we could use a global address `_anyone` + address _escalator = makeAddr('escalator'); + vm.prank(_escalator); + oracle.escalateDispute(mockRequest, mockResponse, mockDispute, _createAccessControl(_escalator)); // Step 8: At this point, new answers can be proposed IOracle.Response memory _secondResponse = IOracle.Response({proposer: _secondProposer, requestId: _requestId, response: abi.encode('second response')}); _deposit(_bondEscalationAccounting, _secondProposer, usdc, _expectedBondSize); vm.prank(_secondProposer); - _responseId = oracle.proposeResponse(mockRequest, _secondResponse); + _responseId = oracle.proposeResponse(mockRequest, _secondResponse, _createAccessControl(_secondProposer)); // Step 9: After some time, the resolution module deems Disputer's dispute as correct _mineBlocks(100); - oracle.resolveDispute(mockRequest, mockResponse, mockDispute); + oracle.resolveDispute(mockRequest, mockResponse, mockDispute, mockAccessControl); IOracle.DisputeStatus _disputeStatus = oracle.disputeStatus(_disputeId); assertEq(uint256(_disputeStatus), uint256(IOracle.DisputeStatus.Won), 'Mismatch: Dispute status'); @@ -400,29 +403,35 @@ contract Integration_BondEscalation is IntegrationBase { // Step 1: Proposer pledges against the dispute _deposit(_bondEscalationAccounting, proposer, usdc, _pledgeSize); vm.prank(proposer); - _bondEscalationModule.pledgeAgainstDispute(mockRequest, mockDispute); + _bondEscalationModule.pledgeAgainstDispute(mockRequest, mockDispute, _createAccessControl(proposer)); // Step 2: Disputer doesn't have money // Step 3: External actor sees that Proposer's answer was incorrect so they pledge in favor of the dispute _deposit(_bondEscalationAccounting, _secondDisputer, usdc, _pledgeSize); vm.prank(_secondDisputer); - _bondEscalationModule.pledgeForDispute(mockRequest, mockDispute); + _bondEscalationModule.pledgeForDispute(mockRequest, mockDispute, _createAccessControl(_secondDisputer)); // Step 4: Proposer doubles down _deposit(_bondEscalationAccounting, proposer, usdc, _pledgeSize); vm.prank(proposer); - _bondEscalationModule.pledgeAgainstDispute(mockRequest, mockDispute); + _bondEscalationModule.pledgeAgainstDispute(mockRequest, mockDispute, _createAccessControl(proposer)); // Step 5: External actor sees that Proposer's answer was incorrect so they pledge in favor of the dispute, tying the bond escalation address _thirdDisputer = makeAddr('thirdDisputer'); _deposit(_bondEscalationAccounting, _thirdDisputer, usdc, _pledgeSize); vm.prank(_thirdDisputer); - _bondEscalationModule.pledgeForDispute(mockRequest, mockDispute); + _bondEscalationModule.pledgeForDispute(mockRequest, mockDispute, _createAccessControl(_thirdDisputer)); // Step 6: Proposer loses in resolution + address _escalator = makeAddr('escalator'); + address _resolver = makeAddr('resolver'); + vm.warp(block.timestamp + _bondEscalationDeadline + 1); - oracle.escalateDispute(mockRequest, mockResponse, mockDispute); - oracle.resolveDispute(mockRequest, mockResponse, mockDispute); + + vm.prank(_escalator); + oracle.escalateDispute(mockRequest, mockResponse, mockDispute, _createAccessControl(_escalator)); + vm.prank(_resolver); + oracle.resolveDispute(mockRequest, mockResponse, mockDispute, _createAccessControl(_resolver)); IOracle.DisputeStatus _disputeStatus = oracle.disputeStatus(_disputeId); assertEq(uint256(_disputeStatus), uint256(IOracle.DisputeStatus.Won), 'Mismatch: Dispute status'); @@ -456,17 +465,17 @@ contract Integration_BondEscalation is IntegrationBase { // Step 1: Proposer pledges against the dispute _deposit(_bondEscalationAccounting, proposer, usdc, _pledgeSize); vm.prank(proposer); - _bondEscalationModule.pledgeAgainstDispute(mockRequest, mockDispute); + _bondEscalationModule.pledgeAgainstDispute(mockRequest, mockDispute, _createAccessControl(proposer)); // Step 2: Disputer doubles down _deposit(_bondEscalationAccounting, disputer, usdc, _pledgeSize); vm.prank(disputer); - _bondEscalationModule.pledgeForDispute(mockRequest, mockDispute); + _bondEscalationModule.pledgeForDispute(mockRequest, mockDispute, _createAccessControl(disputer)); // Step 3: Proposer doubles down _deposit(_bondEscalationAccounting, proposer, usdc, _pledgeSize); vm.prank(proposer); - _bondEscalationModule.pledgeAgainstDispute(mockRequest, mockDispute); + _bondEscalationModule.pledgeAgainstDispute(mockRequest, mockDispute, _createAccessControl(proposer)); // Step 4: Disputer runs out of capital // Step 5: The tying buffer kicks in @@ -475,7 +484,7 @@ contract Integration_BondEscalation is IntegrationBase { // Step 6: An external party sees that Proposer's response is incorrect, so they bond the required WETH _deposit(_bondEscalationAccounting, _secondDisputer, usdc, _pledgeSize); vm.prank(_secondDisputer); - _bondEscalationModule.pledgeForDispute(mockRequest, mockDispute); + _bondEscalationModule.pledgeForDispute(mockRequest, mockDispute, _createAccessControl(_secondDisputer)); ////////////////// NEW MALICIOUS REQUEST //////////////////////// @@ -517,17 +526,17 @@ contract Integration_BondEscalation is IntegrationBase { // Step 1: Proposer pledges against the dispute _deposit(_bondEscalationAccounting, proposer, usdc, _pledgeSize); vm.prank(proposer); - _bondEscalationModule.pledgeAgainstDispute(mockRequest, mockDispute); + _bondEscalationModule.pledgeAgainstDispute(mockRequest, mockDispute, _createAccessControl(proposer)); // Step 2: Disputer doubles down _deposit(_bondEscalationAccounting, disputer, usdc, _pledgeSize); vm.prank(disputer); - _bondEscalationModule.pledgeForDispute(mockRequest, mockDispute); + _bondEscalationModule.pledgeForDispute(mockRequest, mockDispute, _createAccessControl(disputer)); // Step 3: Proposer doubles down _deposit(_bondEscalationAccounting, proposer, usdc, _pledgeSize); vm.prank(proposer); - _bondEscalationModule.pledgeAgainstDispute(mockRequest, mockDispute); + _bondEscalationModule.pledgeAgainstDispute(mockRequest, mockDispute, _createAccessControl(proposer)); // Step 4: Disputer runs out of capital // Step 5: The tying buffer kicks in @@ -536,7 +545,7 @@ contract Integration_BondEscalation is IntegrationBase { // Step 6: An external party sees that Proposer's response is incorrect, so they bond the required WETH _deposit(_bondEscalationAccounting, _secondDisputer, usdc, _pledgeSize); vm.prank(_secondDisputer); - _bondEscalationModule.pledgeForDispute(mockRequest, mockDispute); + _bondEscalationModule.pledgeForDispute(mockRequest, mockDispute, _createAccessControl(_secondDisputer)); ////////////////// NEW MALICIOUS REQUEST //////////////////////// diff --git a/solidity/test/integration/CallbackModule.t.sol b/solidity/test/integration/CallbackModule.t.sol index b285db6d..9e78a952 100644 --- a/solidity/test/integration/CallbackModule.t.sol +++ b/solidity/test/integration/CallbackModule.t.sol @@ -54,7 +54,7 @@ contract Integration_CallbackModule is IntegrationBase { vm.startPrank(proposer); _accountingExtension.approveModule(address(_responseModule)); mockResponse.response = abi.encode(proposer, _requestId, bytes('')); - oracle.proposeResponse(mockRequest, mockResponse); + oracle.proposeResponse(mockRequest, mockResponse, _createAccessControl()); vm.stopPrank(); } } diff --git a/solidity/test/integration/ContractCallRequest.t.sol b/solidity/test/integration/ContractCallRequest.t.sol index bbaf8ee5..41de2a01 100644 --- a/solidity/test/integration/ContractCallRequest.t.sol +++ b/solidity/test/integration/ContractCallRequest.t.sol @@ -71,7 +71,7 @@ contract Integration_ContractCallRequest is IntegrationBase { vm.startPrank(proposer); _accountingExtension.approveModule(address(_responseModule)); - oracle.proposeResponse(mockRequest, mockResponse); + oracle.proposeResponse(mockRequest, mockResponse, _createAccessControl()); vm.stopPrank(); // expect call to accounting to pay the proposer diff --git a/solidity/test/integration/EscalateDispute.t.sol b/solidity/test/integration/EscalateDispute.t.sol index 569d574b..a58e9fcf 100644 --- a/solidity/test/integration/EscalateDispute.t.sol +++ b/solidity/test/integration/EscalateDispute.t.sol @@ -59,21 +59,23 @@ contract Integration_EscalateDispute is IntegrationBase { _deposit(_bondEscalationAccounting, proposer, usdc, _expectedBondSize); vm.startPrank(proposer); _bondEscalationAccounting.approveModule(address(_responseModule)); - oracle.proposeResponse(mockRequest, mockResponse); + oracle.proposeResponse(mockRequest, mockResponse, _createAccessControl(proposer)); vm.stopPrank(); _deposit(_bondEscalationAccounting, disputer, usdc, _expectedBondSize); vm.startPrank(disputer); _bondEscalationAccounting.approveModule(address(_bondEscalationModule)); - _disputeId = oracle.disputeResponse(mockRequest, mockResponse, mockDispute); + _disputeId = oracle.disputeResponse(mockRequest, mockResponse, mockDispute, _createAccessControl(disputer)); vm.stopPrank(); } function test_escalateDispute() public { + address _escalator = makeAddr('escalator'); // Escalate dispute reverts if dispute does not exist mockDispute.requestId = bytes32(0); vm.expectRevert(ValidatorLib.ValidatorLib_InvalidDisputeBody.selector); - oracle.escalateDispute(mockRequest, mockResponse, mockDispute); + vm.prank(_escalator); + oracle.escalateDispute(mockRequest, mockResponse, mockDispute, _createAccessControl(_escalator)); mockDispute.requestId = _requestId; @@ -91,12 +93,17 @@ contract Integration_EscalateDispute is IntegrationBase { // The arbitrator module should call the arbitrator vm.expectCall( - address(_mockArbitrator), abi.encodeCall(MockArbitrator.resolve, (mockRequest, mockResponse, mockDispute)) + address(_mockArbitrator), + abi.encodeCall( + MockArbitrator.resolve, + (mockRequest, mockResponse, mockDispute, _createAccessControl(address(_arbitratorModule))) + ) ); // We escalate the dispute vm.warp(block.timestamp + _expectedDeadline + 1); - oracle.escalateDispute(mockRequest, mockResponse, mockDispute); + vm.prank(_escalator); + oracle.escalateDispute(mockRequest, mockResponse, mockDispute, _createAccessControl(_escalator)); // We check that the dispute was escalated IOracle.DisputeStatus _disputeStatus = oracle.disputeStatus(_disputeId); @@ -111,6 +118,7 @@ contract Integration_EscalateDispute is IntegrationBase { // Escalate dispute reverts if dispute is not active vm.expectRevert(abi.encodeWithSelector(IOracle.Oracle_CannotEscalate.selector, _disputeId)); - oracle.escalateDispute(mockRequest, mockResponse, mockDispute); + vm.prank(_escalator); + oracle.escalateDispute(mockRequest, mockResponse, mockDispute, _createAccessControl(_escalator)); } } diff --git a/solidity/test/integration/HttpRequest.t.sol b/solidity/test/integration/HttpRequest.t.sol index 894d3097..343ae7ef 100644 --- a/solidity/test/integration/HttpRequest.t.sol +++ b/solidity/test/integration/HttpRequest.t.sol @@ -59,7 +59,7 @@ contract Integration_HttpRequest is IntegrationBase { vm.startPrank(proposer); _accountingExtension.approveModule(address(_responseModule)); - oracle.proposeResponse(mockRequest, mockResponse); + oracle.proposeResponse(mockRequest, mockResponse, mockAccessControl); vm.stopPrank(); // expect call to accounting to pay the proposer diff --git a/solidity/test/integration/IntegrationBase.sol b/solidity/test/integration/IntegrationBase.sol index 056460de..f90f11ea 100644 --- a/solidity/test/integration/IntegrationBase.sol +++ b/solidity/test/integration/IntegrationBase.sol @@ -5,6 +5,9 @@ pragma solidity ^0.8.19; // solhint-disable-next-line no-console import {console} from 'forge-std/console.sol'; +import { + AccessController, IAccessController +} from '@defi-wonderland/prophet-core/solidity/contracts/AccessController.sol'; import {IOracle, Oracle} from '@defi-wonderland/prophet-core/solidity/contracts/Oracle.sol'; import {IDisputeModule} from '@defi-wonderland/prophet-core/solidity/interfaces/modules/dispute/IDisputeModule.sol'; import {IFinalityModule} from '@defi-wonderland/prophet-core/solidity/interfaces/modules/finality/IFinalityModule.sol'; @@ -229,7 +232,7 @@ contract IntegrationBase is DSTestPlus, TestConstants, Helpers { function _proposeResponse() internal returns (bytes32 _responseId) { vm.startPrank(proposer); _accountingExtension.approveModule(address(_responseModule)); - _responseId = oracle.proposeResponse(mockRequest, mockResponse); + _responseId = oracle.proposeResponse(mockRequest, mockResponse, _createAccessControl()); vm.stopPrank(); } @@ -240,7 +243,7 @@ contract IntegrationBase is DSTestPlus, TestConstants, Helpers { function _disputeResponse() internal returns (bytes32 _disputeId) { vm.startPrank(disputer); _accountingExtension.approveModule(address(_bondedDisputeModule)); - _disputeId = oracle.disputeResponse(mockRequest, mockResponse, mockDispute); + _disputeId = oracle.disputeResponse(mockRequest, mockResponse, mockDispute, _createAccessControl()); vm.stopPrank(); } diff --git a/solidity/test/integration/MultipleCallbacksModule.t.sol b/solidity/test/integration/MultipleCallbacksModule.t.sol index aaf7d584..d57de765 100644 --- a/solidity/test/integration/MultipleCallbacksModule.t.sol +++ b/solidity/test/integration/MultipleCallbacksModule.t.sol @@ -66,7 +66,7 @@ contract Integration_MultipleCallbackModule is IntegrationBase { vm.startPrank(proposer); _accountingExtension.approveModule(address(_responseModule)); mockResponse.response = abi.encode(proposer, _requestId, bytes('')); - oracle.proposeResponse(mockRequest, mockResponse); + oracle.proposeResponse(mockRequest, mockResponse, mockAccessControl); vm.stopPrank(); } diff --git a/solidity/test/integration/ResponseDispute.t.sol b/solidity/test/integration/ResponseDispute.t.sol index bcea40bd..38f6681d 100644 --- a/solidity/test/integration/ResponseDispute.t.sol +++ b/solidity/test/integration/ResponseDispute.t.sol @@ -27,7 +27,7 @@ contract Integration_ResponseDispute is IntegrationBase { _deposit(_accountingExtension, disputer, usdc, _expectedBondSize); vm.prank(disputer); - bytes32 _disputeId = oracle.disputeResponse(mockRequest, mockResponse, mockDispute); + bytes32 _disputeId = oracle.disputeResponse(mockRequest, mockResponse, mockDispute, _createAccessControl(disputer)); // Check: the disputer is a participant now? assertTrue(oracle.isParticipant(_getId(mockRequest), disputer)); @@ -52,7 +52,7 @@ contract Integration_ResponseDispute is IntegrationBase { vm.expectRevert(ValidatorLib.ValidatorLib_InvalidDisputeBody.selector); vm.prank(disputer); - oracle.disputeResponse(mockRequest, mockResponse, mockDispute); + oracle.disputeResponse(mockRequest, mockResponse, mockDispute, _createAccessControl(disputer)); } /** @@ -66,7 +66,7 @@ contract Integration_ResponseDispute is IntegrationBase { vm.expectRevert(ValidatorLib.ValidatorLib_InvalidDisputeBody.selector); vm.prank(disputer); - oracle.disputeResponse(mockRequest, mockResponse, mockDispute); + oracle.disputeResponse(mockRequest, mockResponse, mockDispute, _createAccessControl(disputer)); } /** @@ -76,7 +76,7 @@ contract Integration_ResponseDispute is IntegrationBase { vm.expectRevert(IAccountingExtension.AccountingExtension_InsufficientFunds.selector); vm.prank(disputer); - oracle.disputeResponse(mockRequest, mockResponse, mockDispute); + oracle.disputeResponse(mockRequest, mockResponse, mockDispute, _createAccessControl(disputer)); } /** @@ -89,7 +89,7 @@ contract Integration_ResponseDispute is IntegrationBase { vm.expectRevert(abi.encodeWithSelector(IOracle.Oracle_AlreadyFinalized.selector, _getId(mockRequest))); vm.prank(disputer); - oracle.disputeResponse(mockRequest, mockResponse, mockDispute); + oracle.disputeResponse(mockRequest, mockResponse, mockDispute, _createAccessControl(disputer)); } /** @@ -99,10 +99,10 @@ contract Integration_ResponseDispute is IntegrationBase { _deposit(_accountingExtension, disputer, usdc, _expectedBondSize); vm.prank(disputer); - oracle.disputeResponse(mockRequest, mockResponse, mockDispute); + oracle.disputeResponse(mockRequest, mockResponse, mockDispute, _createAccessControl(disputer)); vm.prank(disputer); vm.expectRevert(abi.encodeWithSelector(IOracle.Oracle_ResponseAlreadyDisputed.selector, _getId(mockResponse))); - oracle.disputeResponse(mockRequest, mockResponse, mockDispute); + oracle.disputeResponse(mockRequest, mockResponse, mockDispute, _createAccessControl(disputer)); } } diff --git a/solidity/test/integration/ResponseProposal.t.sol b/solidity/test/integration/ResponseProposal.t.sol index ea0d0e10..a59d3772 100644 --- a/solidity/test/integration/ResponseProposal.t.sol +++ b/solidity/test/integration/ResponseProposal.t.sol @@ -31,7 +31,7 @@ contract Integration_ResponseProposal is IntegrationBase { mockResponse.response = _responseBytes; vm.prank(proposer); - oracle.proposeResponse(mockRequest, mockResponse); + oracle.proposeResponse(mockRequest, mockResponse, mockAccessControl); // Check: the proposer is a participant now? assertTrue(oracle.isParticipant(_requestId, proposer)); @@ -59,7 +59,7 @@ contract Integration_ResponseProposal is IntegrationBase { vm.expectRevert(IBondedResponseModule.BondedResponseModule_TooLateToPropose.selector); vm.prank(proposer); - oracle.proposeResponse(mockRequest, mockResponse); + oracle.proposeResponse(mockRequest, mockResponse, mockAccessControl); } /** @@ -70,7 +70,7 @@ contract Integration_ResponseProposal is IntegrationBase { // First response vm.prank(proposer); - oracle.proposeResponse(mockRequest, mockResponse); + oracle.proposeResponse(mockRequest, mockResponse, mockAccessControl); mockResponse.response = abi.encode('second response'); @@ -79,7 +79,7 @@ contract Integration_ResponseProposal is IntegrationBase { // Second response vm.prank(proposer); - oracle.proposeResponse(mockRequest, mockResponse); + oracle.proposeResponse(mockRequest, mockResponse, mockAccessControl); } /** @@ -95,7 +95,7 @@ contract Integration_ResponseProposal is IntegrationBase { vm.expectRevert(ValidatorLib.ValidatorLib_InvalidResponseBody.selector); vm.prank(proposer); - oracle.proposeResponse(mockRequest, mockResponse); + oracle.proposeResponse(mockRequest, mockResponse, mockAccessControl); } /** @@ -128,7 +128,7 @@ contract Integration_ResponseProposal is IntegrationBase { vm.expectRevert(IAccountingExtension.AccountingExtension_InsufficientFunds.selector); vm.prank(proposer); - oracle.proposeResponse(mockRequest, mockResponse); + oracle.proposeResponse(mockRequest, mockResponse, mockAccessControl); } /** @@ -171,7 +171,7 @@ contract Integration_ResponseProposal is IntegrationBase { mockResponse.proposer = proposer; mockResponse.requestId = _requestIdApprovedDisputeModule; - oracle.proposeResponse(mockRequest, mockResponse); + oracle.proposeResponse(mockRequest, mockResponse, mockAccessControl); vm.stopPrank(); uint256 _newProposerBalance = _accountingExtension.balanceOf(proposer, usdc); @@ -212,6 +212,6 @@ contract Integration_ResponseProposal is IntegrationBase { // Should revert as the dispute module is not approved vm.expectRevert(IAccountingExtension.AccountingExtension_NotAllowed.selector); - oracle.proposeResponse(mockRequest, mockResponse); + oracle.proposeResponse(mockRequest, mockResponse, mockAccessControl); } } diff --git a/solidity/test/integration/RootVerification.t.sol b/solidity/test/integration/RootVerification.t.sol index 52792fde..45e01aec 100644 --- a/solidity/test/integration/RootVerification.t.sol +++ b/solidity/test/integration/RootVerification.t.sol @@ -104,7 +104,7 @@ contract Integration_RootVerification is IntegrationBase { mockResponse.response = abi.encode(_correctRoot); vm.prank(proposer); - oracle.proposeResponse(mockRequest, mockResponse); + oracle.proposeResponse(mockRequest, mockResponse, mockAccessControl); vm.warp(block.timestamp + _expectedDeadline + _baseDisputeWindow); @@ -119,13 +119,13 @@ contract Integration_RootVerification is IntegrationBase { mockResponse.response = abi.encode(_invalidRoot); vm.prank(proposer); - oracle.proposeResponse(mockRequest, mockResponse); + oracle.proposeResponse(mockRequest, mockResponse, _createAccessControl(proposer)); _resetMockIds(); vm.startPrank(disputer); _accountingExtension.approveModule(address(_responseModule)); _accountingExtension.approveModule(address(mockRequest.disputeModule)); - oracle.disputeResponse(mockRequest, mockResponse, mockDispute); + oracle.disputeResponse(mockRequest, mockResponse, mockDispute, _createAccessControl(disputer)); vm.stopPrank(); uint256 _requesterBondedBalance = _accountingExtension.bondedAmountOf(requester, usdc, _requestId); @@ -150,12 +150,12 @@ contract Integration_RootVerification is IntegrationBase { mockResponse.response = abi.encode(_correctRoot); vm.prank(proposer); - oracle.proposeResponse(mockRequest, mockResponse); + oracle.proposeResponse(mockRequest, mockResponse, _createAccessControl(proposer)); _resetMockIds(); vm.startPrank(disputer); _accountingExtension.approveModule(address(_responseModule)); - oracle.disputeResponse(mockRequest, mockResponse, mockDispute); + oracle.disputeResponse(mockRequest, mockResponse, mockDispute, _createAccessControl(disputer)); vm.stopPrank(); assertEq(_accountingExtension.bondedAmountOf(requester, usdc, _requestId), 0); From 88eaddfb06135bb3325b9d6ec1430eaf74eb6228 Mon Sep 17 00:00:00 2001 From: zorzal Date: Wed, 23 Oct 2024 16:13:42 -0400 Subject: [PATCH 04/50] test: update unit tests --- solidity/test/mocks/MockArbitrator.sol | 5 +- solidity/test/mocks/MockAtomicArbitrator.sol | 6 +- .../dispute/BondEscalationModule.t.sol | 50 ++++++++---- .../dispute/CircuitResolverModule.t.sol | 46 +++++++++-- .../dispute/RootVerificationModule.t.sol | 42 ++++++++-- .../modules/resolution/ArbitratorModule.t.sol | 26 ++++++- .../BondEscalationResolutionModule.t.sol | 78 ++++++++++++------- .../resolution/ERC20ResolutionModule.t.sol | 21 ++--- .../PrivateERC20ResolutionModule.t.sol | 50 ++++++------ .../response/BondedResponseModule.t.sol | 9 ++- solidity/test/utils/Helpers.sol | 14 ++++ 11 files changed, 249 insertions(+), 98 deletions(-) diff --git a/solidity/test/mocks/MockArbitrator.sol b/solidity/test/mocks/MockArbitrator.sol index 828e1dda..3a64de98 100644 --- a/solidity/test/mocks/MockArbitrator.sol +++ b/solidity/test/mocks/MockArbitrator.sol @@ -1,6 +1,8 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.19; +import {IAccessController} from '@defi-wonderland/prophet-core/solidity/interfaces/IAccessController.sol'; + import {IArbitrator, IOracle} from '../../interfaces/IArbitrator.sol'; contract MockArbitrator is IArbitrator { @@ -13,7 +15,8 @@ contract MockArbitrator is IArbitrator { function resolve( IOracle.Request memory, IOracle.Response memory, - IOracle.Dispute memory + IOracle.Dispute memory, + IAccessController.AccessControl memory AccessControl ) external pure returns (bytes memory _result) { _result = new bytes(0); } diff --git a/solidity/test/mocks/MockAtomicArbitrator.sol b/solidity/test/mocks/MockAtomicArbitrator.sol index 94323d0e..368df66a 100644 --- a/solidity/test/mocks/MockAtomicArbitrator.sol +++ b/solidity/test/mocks/MockAtomicArbitrator.sol @@ -2,6 +2,7 @@ pragma solidity ^0.8.19; import {IArbitrator} from '../../interfaces/IArbitrator.sol'; +import {IAccessController} from '@defi-wonderland/prophet-core/solidity/interfaces/IAccessController.sol'; import {IOracle} from '@defi-wonderland/prophet-core/solidity/interfaces/IOracle.sol'; contract MockAtomicArbitrator is IArbitrator { @@ -15,11 +16,12 @@ contract MockAtomicArbitrator is IArbitrator { function resolve( IOracle.Request memory _request, IOracle.Response memory _response, - IOracle.Dispute memory _dispute + IOracle.Dispute memory _dispute, + IAccessController.AccessControl memory _accessControl ) external returns (bytes memory _result) { _result = new bytes(0); answer = IOracle.DisputeStatus.Won; - oracle.resolveDispute(_request, _response, _dispute); + oracle.resolveDispute(_request, _response, _dispute, _accessControl); } function getAnswer(bytes32 /* _dispute */ ) external view returns (IOracle.DisputeStatus _answer) { diff --git a/solidity/test/unit/modules/dispute/BondEscalationModule.t.sol b/solidity/test/unit/modules/dispute/BondEscalationModule.t.sol index 219cb8f6..4a70c7a3 100644 --- a/solidity/test/unit/modules/dispute/BondEscalationModule.t.sol +++ b/solidity/test/unit/modules/dispute/BondEscalationModule.t.sol @@ -980,7 +980,7 @@ contract BondEscalationModule_Unit_PledgeForDispute is BaseTest { function test_revertIfInvalidDisputeBody() public { // Check: does it revert if the dispute body is invalid? vm.expectRevert(ValidatorLib.ValidatorLib_InvalidDisputeBody.selector); - bondEscalationModule.pledgeForDispute(mockRequest, mockDispute); + bondEscalationModule.pledgeForDispute(mockRequest, mockDispute, _createAccessControl(address(this))); } /** @@ -991,7 +991,7 @@ contract BondEscalationModule_Unit_PledgeForDispute is BaseTest { // Check: does it revert if the dispute is not escalated yet? vm.expectRevert(IBondEscalationModule.BondEscalationModule_InvalidDispute.selector); - bondEscalationModule.pledgeForDispute(mockRequest, _dispute); + bondEscalationModule.pledgeForDispute(mockRequest, _dispute, _createAccessControl(address(this))); } /** @@ -1017,7 +1017,7 @@ contract BondEscalationModule_Unit_PledgeForDispute is BaseTest { // Check: does it revert if the bond escalation is over? vm.expectRevert(IBondEscalationModule.BondEscalationModule_BondEscalationOver.selector); - bondEscalationModule.pledgeForDispute(mockRequest, _dispute); + bondEscalationModule.pledgeForDispute(mockRequest, _dispute, _createAccessControl(address(this))); } /** @@ -1046,7 +1046,7 @@ contract BondEscalationModule_Unit_PledgeForDispute is BaseTest { // Check: does it revert if the maximum number of escalations is reached? vm.expectRevert(IBondEscalationModule.BondEscalationModule_MaxNumberOfEscalationsReached.selector); - bondEscalationModule.pledgeForDispute(mockRequest, _dispute); + bondEscalationModule.pledgeForDispute(mockRequest, _dispute, _createAccessControl(address(this))); } /** @@ -1074,7 +1074,7 @@ contract BondEscalationModule_Unit_PledgeForDispute is BaseTest { // Check: does it revert if trying to pledge in a dispute that is already surpassed? vm.expectRevert(IBondEscalationModule.BondEscalationModule_CanOnlySurpassByOnePledge.selector); - bondEscalationModule.pledgeForDispute(mockRequest, _dispute); + bondEscalationModule.pledgeForDispute(mockRequest, _dispute, _createAccessControl(address(this))); } /** @@ -1107,7 +1107,7 @@ contract BondEscalationModule_Unit_PledgeForDispute is BaseTest { // Check: does it revert if trying to tie outside of the tying buffer? vm.expectRevert(IBondEscalationModule.BondEscalationModule_CannotBreakTieDuringTyingBuffer.selector); - bondEscalationModule.pledgeForDispute(mockRequest, _dispute); + bondEscalationModule.pledgeForDispute(mockRequest, _dispute, _createAccessControl(address(this))); } /** @@ -1148,7 +1148,7 @@ contract BondEscalationModule_Unit_PledgeForDispute is BaseTest { vm.expectEmit(true, true, true, true, address(bondEscalationModule)); emit PledgedForDispute(_disputeId, address(this), _params.bondSize); - bondEscalationModule.pledgeForDispute(mockRequest, _dispute); + bondEscalationModule.pledgeForDispute(mockRequest, _dispute, _createAccessControl(address(this))); uint256 _pledgesForDispute = bondEscalationModule.getEscalation(_requestId).amountOfPledgesForDispute; // Check: is the number of pledges for the dispute properly updated? @@ -1167,7 +1167,7 @@ contract BondEscalationModule_Unit_PledgeAgainstDispute is BaseTest { function test_revertIfInvalidDisputeBody() public { // Check: does it revert if the dispute body is invalid? vm.expectRevert(ValidatorLib.ValidatorLib_InvalidDisputeBody.selector); - bondEscalationModule.pledgeAgainstDispute(mockRequest, mockDispute); + bondEscalationModule.pledgeAgainstDispute(mockRequest, mockDispute, _createAccessControl(address(this))); } /** @@ -1178,7 +1178,7 @@ contract BondEscalationModule_Unit_PledgeAgainstDispute is BaseTest { // Check: does it revert if the dispute is not escalated yet? vm.expectRevert(IBondEscalationModule.BondEscalationModule_InvalidDispute.selector); - bondEscalationModule.pledgeAgainstDispute(mockRequest, _dispute); + bondEscalationModule.pledgeAgainstDispute(mockRequest, _dispute, _createAccessControl(address(this))); } /** @@ -1204,7 +1204,7 @@ contract BondEscalationModule_Unit_PledgeAgainstDispute is BaseTest { // Check: does it revert if the bond escalation is over? vm.expectRevert(IBondEscalationModule.BondEscalationModule_BondEscalationOver.selector); - bondEscalationModule.pledgeAgainstDispute(mockRequest, _dispute); + bondEscalationModule.pledgeAgainstDispute(mockRequest, _dispute, _createAccessControl(address(this))); } /** @@ -1234,7 +1234,7 @@ contract BondEscalationModule_Unit_PledgeAgainstDispute is BaseTest { // Check: does it revert if the maximum number of escalations is reached? vm.expectRevert(IBondEscalationModule.BondEscalationModule_MaxNumberOfEscalationsReached.selector); - bondEscalationModule.pledgeAgainstDispute(mockRequest, _dispute); + bondEscalationModule.pledgeAgainstDispute(mockRequest, _dispute, _createAccessControl(address(this))); } /** @@ -1265,7 +1265,7 @@ contract BondEscalationModule_Unit_PledgeAgainstDispute is BaseTest { // Check: does it revert if trying to pledge in a dispute that is already surpassed? vm.expectRevert(IBondEscalationModule.BondEscalationModule_CanOnlySurpassByOnePledge.selector); - bondEscalationModule.pledgeAgainstDispute(mockRequest, _dispute); + bondEscalationModule.pledgeAgainstDispute(mockRequest, _dispute, _createAccessControl(address(this))); } /** @@ -1298,7 +1298,7 @@ contract BondEscalationModule_Unit_PledgeAgainstDispute is BaseTest { // Check: does it revert if trying to tie outside of the tying buffer? vm.expectRevert(IBondEscalationModule.BondEscalationModule_CannotBreakTieDuringTyingBuffer.selector); - bondEscalationModule.pledgeAgainstDispute(mockRequest, _dispute); + bondEscalationModule.pledgeAgainstDispute(mockRequest, _dispute, _createAccessControl(address(this))); } /** @@ -1337,7 +1337,7 @@ contract BondEscalationModule_Unit_PledgeAgainstDispute is BaseTest { vm.expectEmit(true, true, true, true, address(bondEscalationModule)); emit PledgedAgainstDispute(_disputeId, address(this), _params.bondSize); - bondEscalationModule.pledgeAgainstDispute(mockRequest, _dispute); + bondEscalationModule.pledgeAgainstDispute(mockRequest, _dispute, _createAccessControl(address(this))); uint256 _pledgesForDispute = bondEscalationModule.getEscalation(_requestId).amountOfPledgesAgainstDispute; // Check: is the number of pledges for the dispute properly updated? @@ -1489,7 +1489,16 @@ contract BondEscalationModule_Unit_SettleBondEscalation is BaseTest { _mockAndExpect( address(oracle), - abi.encodeCall(IOracle.updateDisputeStatus, (mockRequest, _response, _dispute, IOracle.DisputeStatus.Won)), + abi.encodeCall( + IOracle.updateDisputeStatus, + ( + mockRequest, + _response, + _dispute, + IOracle.DisputeStatus.Won, + _createAccessControl(address(bondEscalationModule)) + ) + ), abi.encode(true) ); @@ -1534,7 +1543,16 @@ contract BondEscalationModule_Unit_SettleBondEscalation is BaseTest { _mockAndExpect( address(oracle), - abi.encodeCall(IOracle.updateDisputeStatus, (mockRequest, _response, _dispute, IOracle.DisputeStatus.Lost)), + abi.encodeCall( + IOracle.updateDisputeStatus, + ( + mockRequest, + _response, + _dispute, + IOracle.DisputeStatus.Lost, + _createAccessControl(address(bondEscalationModule)) + ) + ), abi.encode(true) ); diff --git a/solidity/test/unit/modules/dispute/CircuitResolverModule.t.sol b/solidity/test/unit/modules/dispute/CircuitResolverModule.t.sol index 7d071dfd..691b87d7 100644 --- a/solidity/test/unit/modules/dispute/CircuitResolverModule.t.sol +++ b/solidity/test/unit/modules/dispute/CircuitResolverModule.t.sol @@ -159,9 +159,19 @@ contract CircuitResolverModule_Unit_DisputeResponse is BaseTest { // Mock and expect the call the oracle, updating the dispute's status _mockAndExpect( address(oracle), - abi.encodeWithSelector( - oracle.updateDisputeStatus.selector, mockRequest, mockResponse, mockDispute, IOracle.DisputeStatus.Won + abi.encodeCall( + IOracle.updateDisputeStatus, + ( + mockRequest, + mockResponse, + mockDispute, + IOracle.DisputeStatus.Won, + _createAccessControl(address(circuitResolverModule)) + ) ), + // abi.encodeWithSelector( + // oracle.updateDisputeStatus.selector, + // ), abi.encode(true) ); @@ -201,8 +211,18 @@ contract CircuitResolverModule_Unit_DisputeResponse is BaseTest { // Mock and expect the call the oracle, updating the dispute's status _mockAndExpect( address(oracle), - abi.encodeWithSelector( - oracle.updateDisputeStatus.selector, mockRequest, mockResponse, mockDispute, IOracle.DisputeStatus.Won + // abi.encodeWithSelector( + // oracle.updateDisputeStatus.selector, mockRequest, mockResponse, mockDispute, IOracle.DisputeStatus.Won + // ), + abi.encodeCall( + IOracle.updateDisputeStatus, + ( + mockRequest, + mockResponse, + mockDispute, + IOracle.DisputeStatus.Won, + _createAccessControl(address(circuitResolverModule)) + ) ), abi.encode(true) ); @@ -254,9 +274,19 @@ contract CircuitResolverModule_Unit_DisputeResponse is BaseTest { // Mock and expect the call the oracle, updating the dispute's status _mockAndExpect( address(oracle), - abi.encodeWithSelector( - oracle.updateDisputeStatus.selector, mockRequest, mockResponse, mockDispute, IOracle.DisputeStatus.Lost + abi.encodeCall( + IOracle.updateDisputeStatus, + ( + mockRequest, + mockResponse, + mockDispute, + IOracle.DisputeStatus.Lost, + _createAccessControl(address(circuitResolverModule)) + ) ), + // abi.encodeWithSelector( + // oracle.updateDisputeStatus.selector, mockRequest, mockResponse, mockDispute, IOracle.DisputeStatus.Lost + // ), abi.encode(true) ); @@ -377,7 +407,9 @@ contract CircuitResolverModule_Unit_OnDisputeStatusChange is BaseTest { // Mock and expect the call to the oracle, proposing the correct response _mockAndExpect( address(oracle), - abi.encodeCall(IOracle.proposeResponse, (mockRequest, _newResponse)), + abi.encodeCall( + IOracle.proposeResponse, (mockRequest, _newResponse, _createAccessControl(address(circuitResolverModule))) + ), abi.encode(_getId(_newResponse)) ); diff --git a/solidity/test/unit/modules/dispute/RootVerificationModule.t.sol b/solidity/test/unit/modules/dispute/RootVerificationModule.t.sol index bf74e3bb..40bd66af 100644 --- a/solidity/test/unit/modules/dispute/RootVerificationModule.t.sol +++ b/solidity/test/unit/modules/dispute/RootVerificationModule.t.sol @@ -207,8 +207,18 @@ contract RootVerificationModule_Unit_DisputeResponse is BaseTest { // Mock and expect the call the oracle, updating the dispute's status _mockAndExpect( address(oracle), - abi.encodeWithSelector( - oracle.updateDisputeStatus.selector, mockRequest, mockResponse, mockDispute, IOracle.DisputeStatus.Won + // abi.encodeWithSelector( + // oracle.updateDisputeStatus.selector, mockRequest, mockResponse, mockDispute, IOracle.DisputeStatus.Won + // ), + abi.encodeCall( + IOracle.updateDisputeStatus, + ( + mockRequest, + mockResponse, + mockDispute, + IOracle.DisputeStatus.Won, + _createAccessControl(address(rootVerificationModule)) + ) ), abi.encode(true) ); @@ -250,9 +260,19 @@ contract RootVerificationModule_Unit_DisputeResponse is BaseTest { // Mock and expect the call the oracle, updating the dispute's status _mockAndExpect( address(oracle), - abi.encodeWithSelector( - oracle.updateDisputeStatus.selector, mockRequest, mockResponse, mockDispute, IOracle.DisputeStatus.Won + abi.encodeCall( + IOracle.updateDisputeStatus, + ( + mockRequest, + mockResponse, + mockDispute, + IOracle.DisputeStatus.Won, + _createAccessControl(address(rootVerificationModule)) + ) ), + // abi.encodeWithSelector( + // oracle.updateDisputeStatus.selector, mockRequest, mockResponse, mockDispute, IOracle.DisputeStatus.Won + // ), abi.encode(true) ); @@ -305,9 +325,19 @@ contract RootVerificationModule_Unit_DisputeResponse is BaseTest { // Mock and expect the call the oracle, updating the dispute's status _mockAndExpect( address(oracle), - abi.encodeWithSelector( - oracle.updateDisputeStatus.selector, mockRequest, mockResponse, mockDispute, IOracle.DisputeStatus.Lost + abi.encodeCall( + IOracle.updateDisputeStatus, + ( + mockRequest, + mockResponse, + mockDispute, + IOracle.DisputeStatus.Lost, + _createAccessControl(address(rootVerificationModule)) + ) ), + // abi.encodeWithSelector( + // oracle.updateDisputeStatus.selector, mockRequest, mockResponse, mockDispute, IOracle.DisputeStatus.Lost + // ), abi.encode(true) ); diff --git a/solidity/test/unit/modules/resolution/ArbitratorModule.t.sol b/solidity/test/unit/modules/resolution/ArbitratorModule.t.sol index ef030191..79ba3296 100644 --- a/solidity/test/unit/modules/resolution/ArbitratorModule.t.sol +++ b/solidity/test/unit/modules/resolution/ArbitratorModule.t.sol @@ -116,7 +116,13 @@ contract ArbitratorModule_Unit_StartResolution is BaseTest { // Mock and expect the callback to the arbitrator _mockAndExpect( - _arbitrator, abi.encodeCall(arbitrator.resolve, (mockRequest, mockResponse, mockDispute)), abi.encode(bytes('')) + _arbitrator, + abi.encodeCall( + arbitrator.resolve, + // review + (mockRequest, mockResponse, mockDispute, _createAccessControl(address(arbitratorModule))) + ), + abi.encode(bytes('')) ); vm.prank(address(oracle)); @@ -135,7 +141,13 @@ contract ArbitratorModule_Unit_StartResolution is BaseTest { // Mock and expect the callback to the arbitrator _mockAndExpect( - _arbitrator, abi.encodeCall(arbitrator.resolve, (mockRequest, mockResponse, mockDispute)), abi.encode(bytes('')) + _arbitrator, + abi.encodeCall( + arbitrator.resolve, + // review + (mockRequest, mockResponse, mockDispute, _createAccessControl(address(arbitratorModule))) + ), + abi.encode(bytes('')) ); // Check: is the event emitted? @@ -196,7 +208,10 @@ contract ArbitratorModule_Unit_ResolveDispute is BaseTest { // Mock and expect IOracle.updateDisputeStatus to be called _mockAndExpect( address(oracle), - abi.encodeCall(oracle.updateDisputeStatus, (mockRequest, mockResponse, mockDispute, _arbitratorStatus)), + abi.encodeCall( + oracle.updateDisputeStatus, + (mockRequest, mockResponse, mockDispute, _arbitratorStatus, _createAccessControl(address(arbitratorModule))) + ), abi.encode() ); @@ -251,7 +266,10 @@ contract ArbitratorModule_Unit_ResolveDispute is BaseTest { // Mock and expect IOracle.updateDisputeStatus to be called _mockAndExpect( address(oracle), - abi.encodeCall(oracle.updateDisputeStatus, (mockRequest, mockResponse, mockDispute, _arbitratorStatus)), + abi.encodeCall( + oracle.updateDisputeStatus, + (mockRequest, mockResponse, mockDispute, _arbitratorStatus, _createAccessControl(address(arbitratorModule))) + ), abi.encode() ); diff --git a/solidity/test/unit/modules/resolution/BondEscalationResolutionModule.t.sol b/solidity/test/unit/modules/resolution/BondEscalationResolutionModule.t.sol index 3362cac0..93cd7cb4 100644 --- a/solidity/test/unit/modules/resolution/BondEscalationResolutionModule.t.sol +++ b/solidity/test/unit/modules/resolution/BondEscalationResolutionModule.t.sol @@ -272,7 +272,8 @@ contract BondEscalationResolutionModule_Unit_PledgeForDispute is BaseTest { // Check: does it revert if the dispute body is invalid? mockDispute.requestId = bytes32(0); vm.expectRevert(ValidatorLib.ValidatorLib_InvalidDisputeBody.selector); - module.pledgeForDispute(mockRequest, mockDispute, _pledgeAmount); + vm.prank(pledgerFor); + module.pledgeForDispute(mockRequest, mockDispute, _pledgeAmount, _createAccessControl(pledgerFor)); // 1. BondEscalationResolutionModule_NotEscalated (_requestId,, _disputeId) = _setResolutionModuleData(_params); @@ -282,7 +283,8 @@ contract BondEscalationResolutionModule_Unit_PledgeForDispute is BaseTest { // Check: does it revert if the dispute is not escalated? vm.expectRevert(IBondEscalationResolutionModule.BondEscalationResolutionModule_NotEscalated.selector); - module.pledgeForDispute(mockRequest, mockDispute, _pledgeAmount); + vm.prank(pledgerFor); + module.pledgeForDispute(mockRequest, mockDispute, _pledgeAmount, _createAccessControl(pledgerFor)); // 2. BondEscalationResolutionModule_PledgingPhaseOver _params.timeUntilDeadline = block.timestamp - 1; @@ -293,7 +295,8 @@ contract BondEscalationResolutionModule_Unit_PledgeForDispute is BaseTest { // Check: does it revert if the pledging phase is over? vm.expectRevert(IBondEscalationResolutionModule.BondEscalationResolutionModule_PledgingPhaseOver.selector); - module.pledgeForDispute(mockRequest, mockDispute, _pledgeAmount); + vm.prank(pledgerFor); + module.pledgeForDispute(mockRequest, mockDispute, _pledgeAmount, _createAccessControl(pledgerFor)); // 3. BondEscalationResolutionModule_MustBeResolved _params.timeUntilDeadline = 10_000; @@ -313,7 +316,8 @@ contract BondEscalationResolutionModule_Unit_PledgeForDispute is BaseTest { // Check: does it revert if inequality timer has passed? vm.expectRevert(IBondEscalationResolutionModule.BondEscalationResolutionModule_MustBeResolved.selector); - module.pledgeForDispute(mockRequest, mockDispute, _pledgeAmount); + vm.prank(pledgerFor); + module.pledgeForDispute(mockRequest, mockDispute, _pledgeAmount, _createAccessControl(pledgerFor)); // 4. BondEscalationResolutionModule_AgainstTurnToEqualize vm.warp(block.timestamp - _params.timeToBreakInequality - 1); // Not past the deadline anymore @@ -331,7 +335,7 @@ contract BondEscalationResolutionModule_Unit_PledgeForDispute is BaseTest { // Check: does it revert if status == AgainstTurnToEqualize? vm.expectRevert(IBondEscalationResolutionModule.BondEscalationResolutionModule_AgainstTurnToEqualize.selector); vm.prank(pledgerFor); - module.pledgeForDispute(mockRequest, mockDispute, _pledgeAmount); + module.pledgeForDispute(mockRequest, mockDispute, _pledgeAmount, _createAccessControl(pledgerFor)); } function test_earlyReturnIfThresholdNotSurpassed( @@ -373,7 +377,7 @@ contract BondEscalationResolutionModule_Unit_PledgeForDispute is BaseTest { emit PledgedForDispute(pledgerFor, _requestId, _disputeId, _pledgeAmount); vm.startPrank(pledgerFor); - module.pledgeForDispute(mockRequest, mockDispute, _pledgeAmount); + module.pledgeForDispute(mockRequest, mockDispute, _pledgeAmount, _createAccessControl(pledgerFor)); (,, uint256 _realPledgesFor,) = module.escalations(_disputeId); (IBondEscalationResolutionModule.InequalityStatus _status,) = module.inequalityData(_disputeId); @@ -421,7 +425,7 @@ contract BondEscalationResolutionModule_Unit_PledgeForDispute is BaseTest { emit PledgedForDispute(pledgerFor, _requestId, _disputeId, _pledgeAmount); vm.startPrank(pledgerFor); - module.pledgeForDispute(mockRequest, mockDispute, _pledgeAmount); + module.pledgeForDispute(mockRequest, mockDispute, _pledgeAmount, _createAccessControl(pledgerFor)); (,, uint256 _realPledgesFor,) = module.escalations(_disputeId); (IBondEscalationResolutionModule.InequalityStatus _status, uint256 _timer) = module.inequalityData(_disputeId); @@ -472,7 +476,7 @@ contract BondEscalationResolutionModule_Unit_PledgeForDispute is BaseTest { emit PledgedForDispute(pledgerFor, _requestId, _disputeId, _pledgeAmount); vm.prank(pledgerFor); - module.pledgeForDispute(mockRequest, mockDispute, _pledgeAmount); + module.pledgeForDispute(mockRequest, mockDispute, _pledgeAmount, _createAccessControl(pledgerFor)); (,, uint256 _realPledgesFor,) = module.escalations(_disputeId); (IBondEscalationResolutionModule.InequalityStatus _status, uint256 _timer) = module.inequalityData(_disputeId); @@ -520,7 +524,7 @@ contract BondEscalationResolutionModule_Unit_PledgeForDispute is BaseTest { emit PledgedForDispute(pledgerFor, _requestId, _disputeId, _pledgeAmount); vm.prank(pledgerFor); - module.pledgeForDispute(mockRequest, mockDispute, _pledgeAmount); + module.pledgeForDispute(mockRequest, mockDispute, _pledgeAmount, _createAccessControl(pledgerFor)); (,, uint256 _realPledgesFor,) = module.escalations(_disputeId); (IBondEscalationResolutionModule.InequalityStatus _status, uint256 _timer) = module.inequalityData(_disputeId); @@ -558,7 +562,7 @@ contract BondEscalationResolutionModule_Unit_PledgeAgainstDispute is BaseTest { // Check: does it revert if the dispute body is invalid? mockDispute.requestId = bytes32(0); vm.expectRevert(ValidatorLib.ValidatorLib_InvalidDisputeBody.selector); - module.pledgeAgainstDispute(mockRequest, mockDispute, _pledgeAmount); + module.pledgeAgainstDispute(mockRequest, mockDispute, _pledgeAmount, _createAccessControl(address(this))); // 1. BondEscalationResolutionModule_NotEscalated (_requestId,, _disputeId) = _setResolutionModuleData(_params); @@ -568,7 +572,7 @@ contract BondEscalationResolutionModule_Unit_PledgeAgainstDispute is BaseTest { // Check: does it revert if the dispute is not escalated? vm.expectRevert(IBondEscalationResolutionModule.BondEscalationResolutionModule_NotEscalated.selector); - module.pledgeAgainstDispute(mockRequest, mockDispute, _pledgeAmount); + module.pledgeAgainstDispute(mockRequest, mockDispute, _pledgeAmount, _createAccessControl(address(this))); // 2. BondEscalationResolutionModule_PledgingPhaseOver _params.timeUntilDeadline = block.timestamp - 1; @@ -578,7 +582,7 @@ contract BondEscalationResolutionModule_Unit_PledgeAgainstDispute is BaseTest { // Check: does it revert if the pledging phase is over? vm.expectRevert(IBondEscalationResolutionModule.BondEscalationResolutionModule_PledgingPhaseOver.selector); - module.pledgeAgainstDispute(mockRequest, mockDispute, _pledgeAmount); + module.pledgeAgainstDispute(mockRequest, mockDispute, _pledgeAmount, _createAccessControl(address(this))); // 3. BondEscalationResolutionModule_MustBeResolved _params.timeUntilDeadline = 10_000; @@ -599,7 +603,7 @@ contract BondEscalationResolutionModule_Unit_PledgeAgainstDispute is BaseTest { // Check: does it revert if inequality timer has passed? vm.expectRevert(IBondEscalationResolutionModule.BondEscalationResolutionModule_MustBeResolved.selector); - module.pledgeAgainstDispute(mockRequest, mockDispute, _pledgeAmount); + module.pledgeAgainstDispute(mockRequest, mockDispute, _pledgeAmount, _createAccessControl(address(this))); // 4. BondEscalationResolutionModule_AgainstTurnToEqualize vm.warp(block.timestamp - _params.timeToBreakInequality - 1); // Not past the deadline anymore @@ -617,7 +621,7 @@ contract BondEscalationResolutionModule_Unit_PledgeAgainstDispute is BaseTest { // Check: does it revert if status == AgainstTurnToEqualize? vm.expectRevert(IBondEscalationResolutionModule.BondEscalationResolutionModule_ForTurnToEqualize.selector); vm.prank(pledgerAgainst); - module.pledgeAgainstDispute(mockRequest, mockDispute, _pledgeAmount); + module.pledgeAgainstDispute(mockRequest, mockDispute, _pledgeAmount, _createAccessControl(pledgerAgainst)); } function test_earlyReturnIfThresholdNotSurpassed(uint256 _pledgeAmount) public { @@ -658,7 +662,7 @@ contract BondEscalationResolutionModule_Unit_PledgeAgainstDispute is BaseTest { emit PledgedAgainstDispute(pledgerAgainst, _requestId, _disputeId, _pledgeAmount); vm.startPrank(pledgerAgainst); - module.pledgeAgainstDispute(mockRequest, mockDispute, _pledgeAmount); + module.pledgeAgainstDispute(mockRequest, mockDispute, _pledgeAmount, _createAccessControl(pledgerAgainst)); (,,, uint256 _realPledgesAgainst) = module.escalations(_disputeId); (IBondEscalationResolutionModule.InequalityStatus _status,) = module.inequalityData(_disputeId); @@ -706,7 +710,7 @@ contract BondEscalationResolutionModule_Unit_PledgeAgainstDispute is BaseTest { emit PledgedAgainstDispute(pledgerAgainst, _requestId, _disputeId, _pledgeAmount); vm.startPrank(pledgerAgainst); - module.pledgeAgainstDispute(mockRequest, mockDispute, _pledgeAmount); + module.pledgeAgainstDispute(mockRequest, mockDispute, _pledgeAmount, _createAccessControl(pledgerAgainst)); (,,, uint256 _realPledgesAgainst) = module.escalations(_disputeId); (IBondEscalationResolutionModule.InequalityStatus _status, uint256 _timer) = module.inequalityData(_disputeId); @@ -757,7 +761,7 @@ contract BondEscalationResolutionModule_Unit_PledgeAgainstDispute is BaseTest { emit PledgedAgainstDispute(pledgerAgainst, _requestId, _disputeId, _pledgeAmount); vm.prank(pledgerAgainst); - module.pledgeAgainstDispute(mockRequest, mockDispute, _pledgeAmount); + module.pledgeAgainstDispute(mockRequest, mockDispute, _pledgeAmount, _createAccessControl(pledgerAgainst)); (,,, uint256 _realPledgesAgainst) = module.escalations(_disputeId); (IBondEscalationResolutionModule.InequalityStatus _status, uint256 _timer) = module.inequalityData(_disputeId); @@ -805,7 +809,7 @@ contract BondEscalationResolutionModule_Unit_PledgeAgainstDispute is BaseTest { emit PledgedAgainstDispute(pledgerAgainst, _requestId, _disputeId, _pledgeAmount); vm.prank(pledgerAgainst); - module.pledgeAgainstDispute(mockRequest, mockDispute, _pledgeAmount); + module.pledgeAgainstDispute(mockRequest, mockDispute, _pledgeAmount, _createAccessControl(pledgerAgainst)); (,, uint256 _realPledgesAgainst,) = module.escalations(_disputeId); (IBondEscalationResolutionModule.InequalityStatus _status, uint256 _timer) = module.inequalityData(_disputeId); @@ -895,7 +899,14 @@ contract BondEscalationResolutionModule_Unit_ResolveDispute is BaseTest { _mockAndExpect( address(oracle), abi.encodeCall( - IOracle.updateDisputeStatus, (mockRequest, mockResponse, mockDispute, IOracle.DisputeStatus.NoResolution) + IOracle.updateDisputeStatus, + ( + mockRequest, + mockResponse, + mockDispute, + IOracle.DisputeStatus.NoResolution, + _createAccessControl(address(module)) + ) ), abi.encode() ); @@ -925,7 +936,14 @@ contract BondEscalationResolutionModule_Unit_ResolveDispute is BaseTest { _mockAndExpect( address(oracle), abi.encodeCall( - IOracle.updateDisputeStatus, (mockRequest, mockResponse, mockDispute, IOracle.DisputeStatus.NoResolution) + IOracle.updateDisputeStatus, + ( + mockRequest, + mockResponse, + mockDispute, + IOracle.DisputeStatus.NoResolution, + _createAccessControl(address(module)) + ) ), abi.encode() ); @@ -966,7 +984,10 @@ contract BondEscalationResolutionModule_Unit_ResolveDispute is BaseTest { // Mock and expect IOracle.updateDisputeStatus to be called _mockAndExpect( address(oracle), - abi.encodeCall(IOracle.updateDisputeStatus, (mockRequest, mockResponse, mockDispute, IOracle.DisputeStatus.Won)), + abi.encodeCall( + IOracle.updateDisputeStatus, + (mockRequest, mockResponse, mockDispute, IOracle.DisputeStatus.Won, _createAccessControl(address(module))) + ), abi.encode() ); @@ -1002,7 +1023,10 @@ contract BondEscalationResolutionModule_Unit_ResolveDispute is BaseTest { // Mock and expect IOracle.updateDisputeStatus to be called _mockAndExpect( address(oracle), - abi.encodeCall(IOracle.updateDisputeStatus, (mockRequest, mockResponse, mockDispute, IOracle.DisputeStatus.Lost)), + abi.encodeCall( + IOracle.updateDisputeStatus, + (mockRequest, mockResponse, mockDispute, IOracle.DisputeStatus.Lost, _createAccessControl(address(module))) + ), abi.encode() ); @@ -1032,7 +1056,7 @@ contract BondEscalationResolutionModule_Unit_ClaimPledge is BaseTest { // Check: does it revert if the dispute body is invalid? mockDispute.requestId = bytes32(0); vm.expectRevert(ValidatorLib.ValidatorLib_InvalidDisputeBody.selector); - module.claimPledge(mockRequest, mockDispute); + module.claimPledge(mockRequest, mockDispute, _createAccessControl(address(this))); (,, bytes32 _disputeId) = _setResolutionModuleData(_params); @@ -1046,7 +1070,7 @@ contract BondEscalationResolutionModule_Unit_ClaimPledge is BaseTest { // Check: does it revert if trying to claim a pledge of a not resolved escalation? vm.expectRevert(IBondEscalationResolutionModule.BondEscalationResolutionModule_NotResolved.selector); - module.claimPledge(mockRequest, mockDispute); + module.claimPledge(mockRequest, mockDispute, _createAccessControl(address(this))); } function test_disputerWon( @@ -1097,7 +1121,7 @@ contract BondEscalationResolutionModule_Unit_ClaimPledge is BaseTest { ); vm.prank(_randomPledger); - module.claimPledge(mockRequest, mockDispute); + module.claimPledge(mockRequest, mockDispute, _createAccessControl(_randomPledger)); // Check: are the pledges for dispute for the dispute and pledger set to 0? assertEq(module.pledgesForDispute(_disputeId, _randomPledger), 0); @@ -1151,7 +1175,7 @@ contract BondEscalationResolutionModule_Unit_ClaimPledge is BaseTest { ); vm.prank(_randomPledger); - module.claimPledge(mockRequest, mockDispute); + module.claimPledge(mockRequest, mockDispute, _createAccessControl(_randomPledger)); // Check: is the pledges against dispute for this dispute and pledger set to 0? assertEq(module.pledgesAgainstDispute(_disputeId, _randomPledger), 0); @@ -1217,7 +1241,7 @@ contract BondEscalationResolutionModule_Unit_ClaimPledge is BaseTest { ); vm.prank(_randomPledger); - module.claimPledge(mockRequest, mockDispute); + module.claimPledge(mockRequest, mockDispute, _createAccessControl(address(_randomPledger))); // Check: is the pledges against dispute for this dispute and pledger set to 0? assertEq(module.pledgesAgainstDispute(_disputeId, _randomPledger), 0); diff --git a/solidity/test/unit/modules/resolution/ERC20ResolutionModule.t.sol b/solidity/test/unit/modules/resolution/ERC20ResolutionModule.t.sol index 1ea5bba7..53305658 100644 --- a/solidity/test/unit/modules/resolution/ERC20ResolutionModule.t.sol +++ b/solidity/test/unit/modules/resolution/ERC20ResolutionModule.t.sol @@ -199,7 +199,7 @@ contract ERC20ResolutionModule_Unit_CastVote is BaseTest { emit VoteCast(_voter, _disputeId, _amountOfVotes); vm.prank(_voter); - module.castVote(mockRequest, _dispute, _amountOfVotes); + module.castVote(mockRequest, _dispute, _amountOfVotes, _createAccessControl(_voter)); (, uint256 _totalVotes) = module.escalations(_disputeId); // Check: totalVotes is updated? @@ -216,7 +216,7 @@ contract ERC20ResolutionModule_Unit_CastVote is BaseTest { // Check: does it revert if the dispute body is invalid? mockDispute.requestId = bytes32(0); vm.expectRevert(ValidatorLib.ValidatorLib_InvalidDisputeBody.selector); - module.castVote(mockRequest, mockDispute, _numberOfVotes); + module.castVote(mockRequest, mockDispute, _numberOfVotes, _createAccessControl(address(this))); } /** @@ -233,7 +233,7 @@ contract ERC20ResolutionModule_Unit_CastVote is BaseTest { // Check: reverts if called with `_disputeId` of a non-escalated dispute? vm.expectRevert(IERC20ResolutionModule.ERC20ResolutionModule_DisputeNotEscalated.selector); - module.castVote(mockRequest, _dispute, _numberOfVotes); + module.castVote(mockRequest, _dispute, _numberOfVotes, _createAccessControl(address(this))); } /** @@ -265,7 +265,7 @@ contract ERC20ResolutionModule_Unit_CastVote is BaseTest { // Check: reverts if dispute is already resolved? vm.expectRevert(IERC20ResolutionModule.ERC20ResolutionModule_AlreadyResolved.selector); - module.castVote(mockRequest, _dispute, _amountOfVotes); + module.castVote(mockRequest, _dispute, _amountOfVotes, _createAccessControl(address(this))); } /** @@ -303,7 +303,7 @@ contract ERC20ResolutionModule_Unit_CastVote is BaseTest { // Check: reverts if trying to cast vote after voting phase? vm.expectRevert(IERC20ResolutionModule.ERC20ResolutionModule_VotingPhaseOver.selector); - module.castVote(mockRequest, _dispute, _numberOfVotes); + module.castVote(mockRequest, _dispute, _numberOfVotes, _createAccessControl(address(this))); } } @@ -358,7 +358,10 @@ contract ERC20ResolutionModule_Unit_ResolveDispute is BaseTest { // Mock and expect IOracle.updateDisputeStatus to be called _mockAndExpect( address(oracle), - abi.encodeCall(IOracle.updateDisputeStatus, (mockRequest, mockResponse, mockDispute, _newStatus)), + abi.encodeCall( + IOracle.updateDisputeStatus, + (mockRequest, mockResponse, mockDispute, _newStatus, _createAccessControl(address(module))) + ), abi.encode() ); @@ -417,7 +420,7 @@ contract ERC20ResolutionModule_Unit_ClaimVote is BaseTest { // Check: does it revert if the dispute body is invalid? mockDispute.requestId = bytes32(0); vm.expectRevert(ValidatorLib.ValidatorLib_InvalidDisputeBody.selector); - module.claimVote(mockRequest, mockDispute); + module.claimVote(mockRequest, mockDispute, _createAccessControl(address(this))); } /** @@ -447,7 +450,7 @@ contract ERC20ResolutionModule_Unit_ClaimVote is BaseTest { // Claim the refund vm.prank(_voter); - module.claimVote(mockRequest, _dispute); + module.claimVote(mockRequest, _dispute, _createAccessControl(address(_voter))); } /** @@ -488,7 +491,7 @@ contract ERC20ResolutionModule_Unit_ClaimVote is BaseTest { // Claim the refund vm.prank(_voter); - module.claimVote(mockRequest, _dispute); + module.claimVote(mockRequest, _dispute, _createAccessControl(address(_voter))); } } diff --git a/solidity/test/unit/modules/resolution/PrivateERC20ResolutionModule.t.sol b/solidity/test/unit/modules/resolution/PrivateERC20ResolutionModule.t.sol index 09cb0530..7a54b3a8 100644 --- a/solidity/test/unit/modules/resolution/PrivateERC20ResolutionModule.t.sol +++ b/solidity/test/unit/modules/resolution/PrivateERC20ResolutionModule.t.sol @@ -93,7 +93,7 @@ contract BaseTest is Test, Helpers { abi.encodeCall(IOracle.disputeStatus, (_disputeId)), abi.encode(IOracle.DisputeStatus.Escalated) ); - module.commitVote(_request, _dispute, _commitment); + module.commitVote(_request, _dispute, _commitment, _createAccessControl()); vm.warp(140_001); @@ -102,7 +102,7 @@ contract BaseTest is Test, Helpers { abi.encodeCall(IERC20.transferFrom, (vm.addr(_i), address(module), _amountOfVotes)), abi.encode() ); - module.revealVote(_request, _dispute, _amountOfVotes, bytes32(_i)); + module.revealVote(_request, _dispute, _amountOfVotes, bytes32(_i), _createAccessControl()); vm.stopPrank(); _totalVotesCast += _amountOfVotes; unchecked { @@ -205,21 +205,21 @@ contract PrivateERC20ResolutionModule_Unit_CommitVote is BaseTest { // Check: does it revert if no commitment is given? vm.expectRevert(IPrivateERC20ResolutionModule.PrivateERC20ResolutionModule_EmptyCommitment.selector); - module.commitVote(mockRequest, mockDispute, bytes32('')); + module.commitVote(mockRequest, mockDispute, bytes32(''), _createAccessControl()); // Compute and store commitment - module.commitVote(mockRequest, mockDispute, _commitment); + module.commitVote(mockRequest, mockDispute, _commitment, _createAccessControl()); // Check: reverts if empty commitment is given? vm.expectRevert(IPrivateERC20ResolutionModule.PrivateERC20ResolutionModule_EmptyCommitment.selector); - module.commitVote(mockRequest, mockDispute, bytes32('')); + module.commitVote(mockRequest, mockDispute, bytes32(''), _createAccessControl()); // Check: is the commitment stored? IPrivateERC20ResolutionModule.VoterData memory _voterData = module.forTest_getVoterData(_disputeId, _voter); assertEq(_voterData.commitment, _commitment); bytes32 _newCommitment = module.computeCommitment(_disputeId, uint256(_salt), bytes32(_amountOfVotes)); - module.commitVote(mockRequest, mockDispute, _newCommitment); + module.commitVote(mockRequest, mockDispute, _newCommitment, _createAccessControl()); vm.stopPrank(); // Check: is voters data updated with new commitment? @@ -234,7 +234,7 @@ contract PrivateERC20ResolutionModule_Unit_CommitVote is BaseTest { // Check: does it revert if the dispute body is invalid? mockDispute.requestId = bytes32(0); vm.expectRevert(ValidatorLib.ValidatorLib_InvalidDisputeBody.selector); - module.commitVote(mockRequest, mockDispute, _commitment); + module.commitVote(mockRequest, mockDispute, _commitment, _createAccessControl(address(this))); } /** @@ -251,7 +251,7 @@ contract PrivateERC20ResolutionModule_Unit_CommitVote is BaseTest { // Check: does it revert if no dispute exists? vm.expectRevert(IValidator.Validator_InvalidDispute.selector); - module.commitVote(mockRequest, _dispute, _commitment); + module.commitVote(mockRequest, _dispute, _commitment, _createAccessControl(address(this))); } /** @@ -272,7 +272,7 @@ contract PrivateERC20ResolutionModule_Unit_CommitVote is BaseTest { // Check: does it revert if the dispute is already resolved? vm.expectRevert(IPrivateERC20ResolutionModule.PrivateERC20ResolutionModule_AlreadyResolved.selector); - module.commitVote(mockRequest, mockDispute, _commitment); + module.commitVote(mockRequest, mockDispute, _commitment, _createAccessControl(address(this))); } /** @@ -295,7 +295,7 @@ contract PrivateERC20ResolutionModule_Unit_CommitVote is BaseTest { // Check: does it revert if the dispute is already resolved? vm.expectRevert(IPrivateERC20ResolutionModule.PrivateERC20ResolutionModule_AlreadyResolved.selector); - module.commitVote(mockRequest, mockDispute, _commitment); + module.commitVote(mockRequest, mockDispute, _commitment, _createAccessControl(address(this))); } /** @@ -316,7 +316,7 @@ contract PrivateERC20ResolutionModule_Unit_CommitVote is BaseTest { // Check: does it revert if the dispute is already resolved? vm.expectRevert(IPrivateERC20ResolutionModule.PrivateERC20ResolutionModule_AlreadyResolved.selector); - module.commitVote(mockRequest, mockDispute, _commitment); + module.commitVote(mockRequest, mockDispute, _commitment, _createAccessControl(address(this))); } /** @@ -337,7 +337,7 @@ contract PrivateERC20ResolutionModule_Unit_CommitVote is BaseTest { // Check: does it revert if the dispute is already resolved? vm.expectRevert(IPrivateERC20ResolutionModule.PrivateERC20ResolutionModule_AlreadyResolved.selector); - module.commitVote(mockRequest, mockDispute, _commitment); + module.commitVote(mockRequest, mockDispute, _commitment, _createAccessControl(address(this))); } /** @@ -358,7 +358,7 @@ contract PrivateERC20ResolutionModule_Unit_CommitVote is BaseTest { // Check: reverts if dispute is not escalated? == no escalation data vm.expectRevert(IPrivateERC20ResolutionModule.PrivateERC20ResolutionModule_DisputeNotEscalated.selector); - module.commitVote(mockRequest, _dispute, _commitment); + module.commitVote(mockRequest, _dispute, _commitment, _createAccessControl(address(this))); } /** @@ -398,7 +398,7 @@ contract PrivateERC20ResolutionModule_Unit_CommitVote is BaseTest { // Check: does it revert if the committing phase is over? vm.expectRevert(IPrivateERC20ResolutionModule.PrivateERC20ResolutionModule_CommittingPhaseOver.selector); - module.commitVote(mockRequest, mockDispute, _commitment); + module.commitVote(mockRequest, mockDispute, _commitment, _createAccessControl(address(this))); } } @@ -449,7 +449,7 @@ contract PrivateERC20ResolutionModule_Unit_RevealVote is BaseTest { emit VoteRevealed(_voter, _disputeId, _amountOfVotes); vm.prank(_voter); - module.revealVote(mockRequest, _dispute, _amountOfVotes, _salt); + module.revealVote(mockRequest, _dispute, _amountOfVotes, _salt, _createAccessControl(address(_voter))); (, uint256 _totalVotes) = module.escalations(_disputeId); // Check: is totalVotes updated? @@ -467,7 +467,7 @@ contract PrivateERC20ResolutionModule_Unit_RevealVote is BaseTest { // Check: does it revert if the dispute body is invalid? mockDispute.requestId = bytes32(0); vm.expectRevert(ValidatorLib.ValidatorLib_InvalidDisputeBody.selector); - module.revealVote(mockRequest, mockDispute, _numberOfVotes, _salt); + module.revealVote(mockRequest, mockDispute, _numberOfVotes, _salt, _createAccessControl(address(this))); } /** @@ -484,7 +484,7 @@ contract PrivateERC20ResolutionModule_Unit_RevealVote is BaseTest { // Check: does it revert if the dispute is not escalated? vm.expectRevert(IPrivateERC20ResolutionModule.PrivateERC20ResolutionModule_DisputeNotEscalated.selector); - module.revealVote(mockRequest, mockDispute, _numberOfVotes, _salt); + module.revealVote(mockRequest, mockDispute, _numberOfVotes, _salt, _createAccessControl(address(this))); } /** @@ -519,11 +519,11 @@ contract PrivateERC20ResolutionModule_Unit_RevealVote is BaseTest { if (_timestamp <= 140_000) { // Check: does it revert if trying to reveal during the committing phase? vm.expectRevert(IPrivateERC20ResolutionModule.PrivateERC20ResolutionModule_OnGoingCommittingPhase.selector); - module.revealVote(mockRequest, _dispute, _numberOfVotes, _salt); + module.revealVote(mockRequest, _dispute, _numberOfVotes, _salt, _createAccessControl(address(this))); } else { // Check: does it revert if trying to reveal after the revealing phase? vm.expectRevert(IPrivateERC20ResolutionModule.PrivateERC20ResolutionModule_RevealingPhaseOver.selector); - module.revealVote(mockRequest, _dispute, _numberOfVotes, _salt); + module.revealVote(mockRequest, _dispute, _numberOfVotes, _salt, _createAccessControl(address(this))); } } @@ -574,18 +574,18 @@ contract PrivateERC20ResolutionModule_Unit_RevealVote is BaseTest { // Check: does it revert if the commitment is not valid? (wrong salt) vm.expectRevert(IPrivateERC20ResolutionModule.PrivateERC20ResolutionModule_WrongRevealData.selector); - module.revealVote(mockRequest, _dispute, _amountOfVotes, _wrongSalt); + module.revealVote(mockRequest, _dispute, _amountOfVotes, _wrongSalt, _createAccessControl()); // Check: does it revert if the commitment is not valid? (wrong amount of votes) vm.expectRevert(IPrivateERC20ResolutionModule.PrivateERC20ResolutionModule_WrongRevealData.selector); - module.revealVote(mockRequest, _dispute, _wrongAmountOfVotes, _salt); + module.revealVote(mockRequest, _dispute, _wrongAmountOfVotes, _salt, _createAccessControl()); vm.stopPrank(); // Check: does it revert if the commitment is not valid? (wrong voter) vm.expectRevert(IPrivateERC20ResolutionModule.PrivateERC20ResolutionModule_WrongRevealData.selector); vm.prank(_wrongVoter); - module.revealVote(mockRequest, _dispute, _amountOfVotes, _salt); + module.revealVote(mockRequest, _dispute, _amountOfVotes, _salt, _createAccessControl(_wrongVoter)); } } @@ -648,7 +648,10 @@ contract PrivateERC20ResolutionModule_Unit_ResolveDispute is BaseTest { // Mock and expect IOracle.updateDisputeStatus to be called _mockAndExpect( address(oracle), - abi.encodeCall(IOracle.updateDisputeStatus, (mockRequest, mockResponse, mockDispute, _newStatus)), + abi.encodeCall( + IOracle.updateDisputeStatus, + (mockRequest, mockResponse, mockDispute, _newStatus, _createAccessControl(address(module))) + ), abi.encode() ); @@ -701,6 +704,7 @@ contract PrivateERC20ResolutionModule_Unit_ResolveDispute is BaseTest { // Jump to timestamp vm.warp(_timestamp); + // fixme : refactor this test if (_timestamp <= 500_000) { // Check: does it revert if trying to resolve during the committing phase? vm.expectRevert(IPrivateERC20ResolutionModule.PrivateERC20ResolutionModule_OnGoingCommittingPhase.selector); diff --git a/solidity/test/unit/modules/response/BondedResponseModule.t.sol b/solidity/test/unit/modules/response/BondedResponseModule.t.sol index 5fb16cc0..ed64e1c1 100644 --- a/solidity/test/unit/modules/response/BondedResponseModule.t.sol +++ b/solidity/test/unit/modules/response/BondedResponseModule.t.sol @@ -513,7 +513,7 @@ contract BondedResponseModule_Unit_ReleaseUnutilizedResponse is BaseTest { emit UnutilizedResponseReleased(_requestId, _responseId); // Test: does it release the bond? - bondedResponseModule.releaseUnutilizedResponse(mockRequest, mockResponse); + bondedResponseModule.releaseUnutilizedResponse(mockRequest, mockResponse, _createAccessControl(address(this))); } /** @@ -546,7 +546,7 @@ contract BondedResponseModule_Unit_ReleaseUnutilizedResponse is BaseTest { // Check: reverts? vm.expectRevert(IBondedResponseModule.BondedResponseModule_InvalidReleaseParameters.selector); - bondedResponseModule.releaseUnutilizedResponse(mockRequest, _response); + bondedResponseModule.releaseUnutilizedResponse(mockRequest, _response, _createAccessControl(address(this))); } /** @@ -605,7 +605,10 @@ contract BondedResponseModule_Unit_ReleaseUnutilizedResponse is BaseTest { vm.expectRevert(IBondedResponseModule.BondedResponseModule_InvalidReleaseParameters.selector); } - bondedResponseModule.releaseUnutilizedResponse(mockRequest, _response); + // todo: use `_anyone` + address _notTheProposer = makeAddr('not-the-proposer'); + vm.prank(_notTheProposer); + bondedResponseModule.releaseUnutilizedResponse(mockRequest, _response, _createAccessControl(_notTheProposer)); } } } diff --git a/solidity/test/utils/Helpers.sol b/solidity/test/utils/Helpers.sol index 44462aba..e56478cc 100644 --- a/solidity/test/utils/Helpers.sol +++ b/solidity/test/utils/Helpers.sol @@ -2,6 +2,7 @@ pragma solidity ^0.8.19; import {TestConstants} from './TestConstants.sol'; +import {IAccessController} from '@defi-wonderland/prophet-core/solidity/interfaces/IAccessController.sol'; import {IOracle} from '@defi-wonderland/prophet-core/solidity/interfaces/IOracle.sol'; import {DSTestPlus} from '@defi-wonderland/solidity-utils/solidity/test/DSTestPlus.sol'; @@ -12,6 +13,7 @@ contract Helpers is DSTestPlus, TestConstants { // Mock objects IOracle.Request public mockRequest = IOracle.Request({ + accessControlModule: address(0), requestModule: address(0), responseModule: address(0), disputeModule: address(0), @@ -25,6 +27,10 @@ contract Helpers is DSTestPlus, TestConstants { requester: address(this), nonce: 1 }); + + IAccessController.AccessControl public mockAccessControl = + IAccessController.AccessControl({user: address(0), data: bytes('')}); + bytes32 internal _mockRequestId = keccak256(abi.encode(mockRequest)); IOracle.Response public mockResponse = @@ -158,4 +164,12 @@ contract Helpers is DSTestPlus, TestConstants { function _expectEmit(address _contract) internal { vm.expectEmit(true, true, true, true, _contract); } + + function _createAccessControl() internal returns (IAccessController.AccessControl memory _accessControl) { + _accessControl = _createAccessControl(msg.sender); + } + + function _createAccessControl(address _user) internal returns (IAccessController.AccessControl memory _accessControl) { + _accessControl = IAccessController.AccessControl({user: _user, data: bytes('')}); + } } From 495fde58c1effbc7aa2deaa57b0cc182215e6ce1 Mon Sep 17 00:00:00 2001 From: zorzal Date: Wed, 23 Oct 2024 16:18:22 -0400 Subject: [PATCH 05/50] feat: add typehash constants --- solidity/contracts/utils/Typehash.sol | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 solidity/contracts/utils/Typehash.sol diff --git a/solidity/contracts/utils/Typehash.sol b/solidity/contracts/utils/Typehash.sol new file mode 100644 index 00000000..6a68c94c --- /dev/null +++ b/solidity/contracts/utils/Typehash.sol @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +bytes32 constant _PLEDGE_FOR_DISPUTE_TYPEHASH = keccak256( + 'pledgeForDispute(IOracle.Request _request, IOracle.Dispute _dispute,IAccessController.AccessControl _accessControl)' +); + +bytes32 constant _PLEDGE_AGAINST_DISPUTE_TYPEHASH = keccak256( + 'pledgeAgainstDispute(IOracle.Request _request, IOracle.Dispute _dispute,IAccessController.AccessControl _accessControl)' +); + +bytes32 constant _CLAIM_VOTE_TYPEHASH = keccak256(''); +bytes32 constant _CLAIM_PLEDGE_TYPEHASH = keccak256(''); + +bytes32 constant _RELEASE_UNUTILIZED_RESPONSE_TYPEHASH = keccak256(''); +bytes32 constant _CAST_VOTE_TYPEHASH = keccak256(''); +bytes32 constant _COMMIT_VOTE_TYPEHASH = keccak256(''); +bytes32 constant _REVEAL_VOTE_TYPEHASH = keccak256(''); From 42cb077784f5327949d28c5af5b3c5d37dc7fb27 Mon Sep 17 00:00:00 2001 From: zorzal Date: Thu, 24 Oct 2024 06:10:55 -0400 Subject: [PATCH 06/50] feat: run linter --- .../modules/dispute/BondEscalationModule.sol | 23 ++++++++----------- .../dispute/RootVerificationModule.sol | 8 ++++++- .../modules/resolution/ArbitratorModule.sol | 8 ++++++- .../BondEscalationResolutionModule.sol | 16 +++++++++---- .../resolution/ERC20ResolutionModule.sol | 16 +++++++++++-- .../PrivateERC20ResolutionModule.sol | 16 +++++++++++-- .../modules/response/BondedResponseModule.sol | 2 +- .../modules/resolution/IArbitratorModule.sol | 5 +--- .../integration/MultipleCallbacksModule.t.sol | 2 +- solidity/test/mocks/MockArbitrator.sol | 2 +- solidity/test/utils/Helpers.sol | 6 ++++- 11 files changed, 72 insertions(+), 32 deletions(-) diff --git a/solidity/contracts/modules/dispute/BondEscalationModule.sol b/solidity/contracts/modules/dispute/BondEscalationModule.sol index 2c360c46..70a26006 100644 --- a/solidity/contracts/modules/dispute/BondEscalationModule.sol +++ b/solidity/contracts/modules/dispute/BondEscalationModule.sol @@ -1,17 +1,14 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.19; -import {AccessControllerModule} from '../accessControl/AccessControllerModule.sol'; -import { - AccessController, IAccessController -} from '@defi-wonderland/prophet-core/solidity/contracts/AccessController.sol'; +import {AccessController} from '@defi-wonderland/prophet-core/solidity/contracts/AccessController.sol'; import {IModule, Module} from '@defi-wonderland/prophet-core/solidity/contracts/Module.sol'; import {IOracle} from '@defi-wonderland/prophet-core/solidity/interfaces/IOracle.sol'; import {FixedPointMathLib} from 'solmate/src/utils/FixedPointMathLib.sol'; import {IBondEscalationModule} from '../../../interfaces/modules/dispute/IBondEscalationModule.sol'; -import '../../utils/Typehash.sol'; +import {_PLEDGE_AGAINST_DISPUTE_TYPEHASH, _PLEDGE_FOR_DISPUTE_TYPEHASH} from '../../utils/Typehash.sol'; contract BondEscalationModule is AccessController, Module, IBondEscalationModule { /// @inheritdoc IBondEscalationModule @@ -224,7 +221,7 @@ contract BondEscalationModule is AccessController, Module, IBondEscalationModule function pledgeForDispute( IOracle.Request calldata _request, IOracle.Dispute calldata _dispute, - IAccessController.AccessControl calldata _accessControl + AccessControl calldata _accessControl ) external hasAccess(_request.accessControlModule, _PLEDGE_FOR_DISPUTE_TYPEHASH, abi.encode(_request, _dispute), _accessControl) @@ -309,13 +306,13 @@ contract BondEscalationModule is AccessController, Module, IBondEscalationModule emit BondEscalationStatusUpdated(_dispute.requestId, _disputeId, _escalation.status); - ORACLE.updateDisputeStatus( - _request, - _response, - _dispute, - _disputersWon ? IOracle.DisputeStatus.Won : IOracle.DisputeStatus.Lost, - _defaultAccessControl() - ); + ORACLE.updateDisputeStatus({ + _request: _request, + _response: _response, + _dispute: _dispute, + _status: _disputersWon ? IOracle.DisputeStatus.Won : IOracle.DisputeStatus.Lost, + _accessControl: _defaultAccessControl() + }); } /** diff --git a/solidity/contracts/modules/dispute/RootVerificationModule.sol b/solidity/contracts/modules/dispute/RootVerificationModule.sol index ce218ae5..039215e5 100644 --- a/solidity/contracts/modules/dispute/RootVerificationModule.sol +++ b/solidity/contracts/modules/dispute/RootVerificationModule.sol @@ -87,7 +87,13 @@ contract RootVerificationModule is AccessController, Module, IRootVerificationMo _dispute: _dispute }); - ORACLE.updateDisputeStatus(_request, _response, _dispute, _status, _defaultAccessControl()); + ORACLE.updateDisputeStatus({ + _request: _request, + _response: _response, + _dispute: _dispute, + _status: _status, + _accessControl: _defaultAccessControl() + }); } /// @inheritdoc IModule diff --git a/solidity/contracts/modules/resolution/ArbitratorModule.sol b/solidity/contracts/modules/resolution/ArbitratorModule.sol index be401254..f109507b 100644 --- a/solidity/contracts/modules/resolution/ArbitratorModule.sol +++ b/solidity/contracts/modules/resolution/ArbitratorModule.sol @@ -62,7 +62,13 @@ contract ArbitratorModule is AccessController, Module, IArbitratorModule { if (_status <= IOracle.DisputeStatus.Escalated) revert ArbitratorModule_InvalidResolutionStatus(); _disputeData[_disputeId] = ArbitrationStatus.Resolved; - ORACLE.updateDisputeStatus(_request, _response, _dispute, _status, _defaultAccessControl()); + ORACLE.updateDisputeStatus({ + _request: _request, + _response: _response, + _dispute: _dispute, + _status: _status, + _accessControl: _defaultAccessControl() + }); emit DisputeResolved(_dispute.requestId, _disputeId, _status); } diff --git a/solidity/contracts/modules/resolution/BondEscalationResolutionModule.sol b/solidity/contracts/modules/resolution/BondEscalationResolutionModule.sol index 53c126d8..7959e8b9 100644 --- a/solidity/contracts/modules/resolution/BondEscalationResolutionModule.sol +++ b/solidity/contracts/modules/resolution/BondEscalationResolutionModule.sol @@ -141,7 +141,13 @@ contract BondEscalationResolutionModule is AccessController, Module, IBondEscala _disputeStatus = IOracle.DisputeStatus.Lost; } - ORACLE.updateDisputeStatus(_request, _response, _dispute, _disputeStatus, _defaultAccessControl()); + ORACLE.updateDisputeStatus({ + _request: _request, + _response: _response, + _dispute: _dispute, + _status: _disputeStatus, + _accessControl: _defaultAccessControl() + }); emit DisputeResolved(_dispute.requestId, _disputeId, _disputeStatus); } @@ -198,9 +204,9 @@ contract BondEscalationResolutionModule is AccessController, Module, IBondEscala if (_escalation.resolution == Resolution.NoResolution) { { - uint256 _pledgerBalanceFor = pledgesForDispute[_disputeId][msg.sender]; + uint256 _pledgerBalanceFor = pledgesForDispute[_disputeId][_accessControl.user]; if (_pledgerBalanceFor > 0) { - pledgesForDispute[_disputeId][msg.sender] -= _pledgerBalanceFor; + pledgesForDispute[_disputeId][_accessControl.user] -= _pledgerBalanceFor; _claimPledge({ _request: _request, _dispute: _dispute, @@ -211,9 +217,9 @@ contract BondEscalationResolutionModule is AccessController, Module, IBondEscala } } { - uint256 _pledgerBalanceAgainst = pledgesAgainstDispute[_disputeId][msg.sender]; + uint256 _pledgerBalanceAgainst = pledgesAgainstDispute[_disputeId][_accessControl.user]; if (_pledgerBalanceAgainst > 0) { - pledgesAgainstDispute[_disputeId][msg.sender] -= _pledgerBalanceAgainst; + pledgesAgainstDispute[_disputeId][_accessControl.user] -= _pledgerBalanceAgainst; _claimPledge({ _request: _request, _dispute: _dispute, diff --git a/solidity/contracts/modules/resolution/ERC20ResolutionModule.sol b/solidity/contracts/modules/resolution/ERC20ResolutionModule.sol index bed5d509..f251a34c 100644 --- a/solidity/contracts/modules/resolution/ERC20ResolutionModule.sol +++ b/solidity/contracts/modules/resolution/ERC20ResolutionModule.sol @@ -112,10 +112,22 @@ contract ERC20ResolutionModule is AccessController, Module, IERC20ResolutionModu // Update status if (_quorumReached == 1) { - ORACLE.updateDisputeStatus(_request, _response, _dispute, IOracle.DisputeStatus.Won, _defaultAccessControl()); + ORACLE.updateDisputeStatus({ + _request: _request, + _response: _response, + _dispute: _dispute, + _status: IOracle.DisputeStatus.Won, + _accessControl: _defaultAccessControl() + }); emit DisputeResolved(_dispute.requestId, _disputeId, IOracle.DisputeStatus.Won); } else { - ORACLE.updateDisputeStatus(_request, _response, _dispute, IOracle.DisputeStatus.Lost, _defaultAccessControl()); + ORACLE.updateDisputeStatus({ + _request: _request, + _response: _response, + _dispute: _dispute, + _status: IOracle.DisputeStatus.Lost, + _accessControl: _defaultAccessControl() + }); emit DisputeResolved(_dispute.requestId, _disputeId, IOracle.DisputeStatus.Lost); } } diff --git a/solidity/contracts/modules/resolution/PrivateERC20ResolutionModule.sol b/solidity/contracts/modules/resolution/PrivateERC20ResolutionModule.sol index 0c138002..412d6a7c 100644 --- a/solidity/contracts/modules/resolution/PrivateERC20ResolutionModule.sol +++ b/solidity/contracts/modules/resolution/PrivateERC20ResolutionModule.sol @@ -144,10 +144,22 @@ contract PrivateERC20ResolutionModule is AccessController, Module, IPrivateERC20 uint256 _quorumReached = _escalation.totalVotes >= _params.minVotesForQuorum ? 1 : 0; if (_quorumReached == 1) { - ORACLE.updateDisputeStatus(_request, _response, _dispute, IOracle.DisputeStatus.Won, _defaultAccessControl()); + ORACLE.updateDisputeStatus({ + _request: _request, + _response: _response, + _dispute: _dispute, + _status: IOracle.DisputeStatus.Won, + _accessControl: _defaultAccessControl() + }); emit DisputeResolved(_dispute.requestId, _disputeId, IOracle.DisputeStatus.Won); } else { - ORACLE.updateDisputeStatus(_request, _response, _dispute, IOracle.DisputeStatus.Lost, _defaultAccessControl()); + ORACLE.updateDisputeStatus({ + _request: _request, + _response: _response, + _dispute: _dispute, + _status: IOracle.DisputeStatus.Lost, + _accessControl: _defaultAccessControl() + }); emit DisputeResolved(_dispute.requestId, _disputeId, IOracle.DisputeStatus.Lost); } diff --git a/solidity/contracts/modules/response/BondedResponseModule.sol b/solidity/contracts/modules/response/BondedResponseModule.sol index 42184135..c15df71a 100644 --- a/solidity/contracts/modules/response/BondedResponseModule.sol +++ b/solidity/contracts/modules/response/BondedResponseModule.sol @@ -6,7 +6,7 @@ import {IModule, Module} from '@defi-wonderland/prophet-core/solidity/contracts/ import {IOracle} from '@defi-wonderland/prophet-core/solidity/interfaces/IOracle.sol'; import {IBondedResponseModule} from '../../../interfaces/modules/response/IBondedResponseModule.sol'; -import {_PLEDGE_FOR_DISPUTE_TYPEHASH, _RELEASE_UNUTILIZED_RESPONSE_TYPEHASH} from '../../utils/Typehash.sol'; +import {_RELEASE_UNUTILIZED_RESPONSE_TYPEHASH} from '../../utils/Typehash.sol'; contract BondedResponseModule is AccessController, Module, IBondedResponseModule { constructor(IOracle _oracle) Module(_oracle) {} diff --git a/solidity/interfaces/modules/resolution/IArbitratorModule.sol b/solidity/interfaces/modules/resolution/IArbitratorModule.sol index abc2effc..5e34ea70 100644 --- a/solidity/interfaces/modules/resolution/IArbitratorModule.sol +++ b/solidity/interfaces/modules/resolution/IArbitratorModule.sol @@ -1,7 +1,6 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.19; -import {IAccessController} from '@defi-wonderland/prophet-core/solidity/interfaces/IAccessController.sol'; import {IOracle} from '@defi-wonderland/prophet-core/solidity/interfaces/IOracle.sol'; import {IResolutionModule} from '@defi-wonderland/prophet-core/solidity/interfaces/modules/resolution/IResolutionModule.sol'; @@ -108,7 +107,5 @@ interface IArbitratorModule is IResolutionModule { IOracle.Request calldata _request, IOracle.Response calldata _response, IOracle.Dispute calldata _dispute - ) - // IAccessController.AccessControl calldata _accessControl - external; + ) external; } diff --git a/solidity/test/integration/MultipleCallbacksModule.t.sol b/solidity/test/integration/MultipleCallbacksModule.t.sol index d57de765..00a1e2c2 100644 --- a/solidity/test/integration/MultipleCallbacksModule.t.sol +++ b/solidity/test/integration/MultipleCallbacksModule.t.sol @@ -73,7 +73,7 @@ contract Integration_MultipleCallbackModule is IntegrationBase { function _createCallbacksData( address _target, uint256 _length - ) internal returns (address[] memory _targets, bytes[] memory _datas) { + ) internal pure returns (address[] memory _targets, bytes[] memory _datas) { _targets = new address[](_length); _datas = new bytes[](_length); for (uint256 _i; _i < _length; _i++) { diff --git a/solidity/test/mocks/MockArbitrator.sol b/solidity/test/mocks/MockArbitrator.sol index 3a64de98..f45dd64e 100644 --- a/solidity/test/mocks/MockArbitrator.sol +++ b/solidity/test/mocks/MockArbitrator.sol @@ -16,7 +16,7 @@ contract MockArbitrator is IArbitrator { IOracle.Request memory, IOracle.Response memory, IOracle.Dispute memory, - IAccessController.AccessControl memory AccessControl + IAccessController.AccessControl memory ) external pure returns (bytes memory _result) { _result = new bytes(0); } diff --git a/solidity/test/utils/Helpers.sol b/solidity/test/utils/Helpers.sol index e56478cc..dfd5be7a 100644 --- a/solidity/test/utils/Helpers.sol +++ b/solidity/test/utils/Helpers.sol @@ -169,7 +169,11 @@ contract Helpers is DSTestPlus, TestConstants { _accessControl = _createAccessControl(msg.sender); } - function _createAccessControl(address _user) internal returns (IAccessController.AccessControl memory _accessControl) { + function _createAccessControl(address _user) + internal + pure + returns (IAccessController.AccessControl memory _accessControl) + { _accessControl = IAccessController.AccessControl({user: _user, data: bytes('')}); } } From 73688ac864459e600ae4fee922ae712fa6ff1738 Mon Sep 17 00:00:00 2001 From: zorzal Date: Thu, 24 Oct 2024 08:16:14 -0400 Subject: [PATCH 07/50] feat: add AccessControllerModule --- .../modules/accessControl/AccessControllerModule.sol | 10 ++++++++++ .../contracts/modules/dispute/BondEscalationModule.sol | 6 +++--- .../modules/dispute/RootVerificationModule.sol | 6 +++--- .../contracts/modules/resolution/ArbitratorModule.sol | 7 ++++--- .../resolution/BondEscalationResolutionModule.sol | 6 +++--- .../modules/resolution/ERC20ResolutionModule.sol | 6 +++--- .../resolution/PrivateERC20ResolutionModule.sol | 6 +++--- .../modules/response/BondedResponseModule.sol | 5 +++-- 8 files changed, 32 insertions(+), 20 deletions(-) create mode 100644 solidity/contracts/modules/accessControl/AccessControllerModule.sol diff --git a/solidity/contracts/modules/accessControl/AccessControllerModule.sol b/solidity/contracts/modules/accessControl/AccessControllerModule.sol new file mode 100644 index 00000000..ca1efb66 --- /dev/null +++ b/solidity/contracts/modules/accessControl/AccessControllerModule.sol @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import {AccessController} from '@defi-wonderland/prophet-core/solidity/contracts/AccessController.sol'; +import {Module} from '@defi-wonderland/prophet-core/solidity/contracts/Module.sol'; +import {IOracle} from '@defi-wonderland/prophet-core/solidity/interfaces/IOracle.sol'; + +abstract contract AccessControllerModule is AccessController, Module { + constructor(IOracle _oracle) Module(_oracle) {} +} diff --git a/solidity/contracts/modules/dispute/BondEscalationModule.sol b/solidity/contracts/modules/dispute/BondEscalationModule.sol index 70a26006..f0c34fac 100644 --- a/solidity/contracts/modules/dispute/BondEscalationModule.sol +++ b/solidity/contracts/modules/dispute/BondEscalationModule.sol @@ -1,7 +1,6 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.19; -import {AccessController} from '@defi-wonderland/prophet-core/solidity/contracts/AccessController.sol'; import {IModule, Module} from '@defi-wonderland/prophet-core/solidity/contracts/Module.sol'; import {IOracle} from '@defi-wonderland/prophet-core/solidity/interfaces/IOracle.sol'; import {FixedPointMathLib} from 'solmate/src/utils/FixedPointMathLib.sol'; @@ -9,8 +8,9 @@ import {FixedPointMathLib} from 'solmate/src/utils/FixedPointMathLib.sol'; import {IBondEscalationModule} from '../../../interfaces/modules/dispute/IBondEscalationModule.sol'; import {_PLEDGE_AGAINST_DISPUTE_TYPEHASH, _PLEDGE_FOR_DISPUTE_TYPEHASH} from '../../utils/Typehash.sol'; +import {AccessControllerModule} from '../accessControl/AccessControllerModule.sol'; -contract BondEscalationModule is AccessController, Module, IBondEscalationModule { +contract BondEscalationModule is AccessControllerModule, IBondEscalationModule { /// @inheritdoc IBondEscalationModule mapping(bytes32 _requestId => mapping(address _pledger => uint256 pledges)) public pledgesForDispute; @@ -22,7 +22,7 @@ contract BondEscalationModule is AccessController, Module, IBondEscalationModule */ mapping(bytes32 _requestId => BondEscalation) internal _escalations; - constructor(IOracle _oracle) Module(_oracle) {} + constructor(IOracle _oracle) AccessControllerModule(_oracle) {} /// @inheritdoc IModule function moduleName() external pure returns (string memory _moduleName) { diff --git a/solidity/contracts/modules/dispute/RootVerificationModule.sol b/solidity/contracts/modules/dispute/RootVerificationModule.sol index 039215e5..d2ae49f5 100644 --- a/solidity/contracts/modules/dispute/RootVerificationModule.sol +++ b/solidity/contracts/modules/dispute/RootVerificationModule.sol @@ -1,14 +1,14 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.19; -import {AccessController} from '@defi-wonderland/prophet-core/solidity/contracts/AccessController.sol'; import {IModule, Module} from '@defi-wonderland/prophet-core/solidity/contracts/Module.sol'; import {IOracle} from '@defi-wonderland/prophet-core/solidity/interfaces/IOracle.sol'; import {IRootVerificationModule} from '../../../interfaces/modules/dispute/IRootVerificationModule.sol'; import {MerkleLib} from '../../libraries/MerkleLib.sol'; +import {AccessControllerModule} from '../accessControl/AccessControllerModule.sol'; -contract RootVerificationModule is AccessController, Module, IRootVerificationModule { +contract RootVerificationModule is AccessControllerModule, IRootVerificationModule { using MerkleLib for MerkleLib.Tree; /** @@ -16,7 +16,7 @@ contract RootVerificationModule is AccessController, Module, IRootVerificationMo */ mapping(bytes32 _requestId => bytes32 _correctRoot) internal _correctRoots; - constructor(IOracle _oracle) Module(_oracle) {} + constructor(IOracle _oracle) AccessControllerModule(_oracle) {} /// @inheritdoc IModule function moduleName() external pure returns (string memory _moduleName) { diff --git a/solidity/contracts/modules/resolution/ArbitratorModule.sol b/solidity/contracts/modules/resolution/ArbitratorModule.sol index f109507b..15062d62 100644 --- a/solidity/contracts/modules/resolution/ArbitratorModule.sol +++ b/solidity/contracts/modules/resolution/ArbitratorModule.sol @@ -1,20 +1,21 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.19; -import {AccessController} from '@defi-wonderland/prophet-core/solidity/contracts/AccessController.sol'; import {IModule, Module} from '@defi-wonderland/prophet-core/solidity/contracts/Module.sol'; import {IOracle} from '@defi-wonderland/prophet-core/solidity/interfaces/IOracle.sol'; import {IArbitrator} from '../../../interfaces/IArbitrator.sol'; import {IArbitratorModule} from '../../../interfaces/modules/resolution/IArbitratorModule.sol'; -contract ArbitratorModule is AccessController, Module, IArbitratorModule { +import {AccessControllerModule} from '../accessControl/AccessControllerModule.sol'; + +contract ArbitratorModule is AccessControllerModule, IArbitratorModule { /** * @notice The status of all disputes */ mapping(bytes32 _disputeId => ArbitrationStatus _status) internal _disputeData; - constructor(IOracle _oracle) Module(_oracle) {} + constructor(IOracle _oracle) AccessControllerModule(_oracle) {} /// @inheritdoc IModule function moduleName() external pure returns (string memory _moduleName) { diff --git a/solidity/contracts/modules/resolution/BondEscalationResolutionModule.sol b/solidity/contracts/modules/resolution/BondEscalationResolutionModule.sol index 7959e8b9..460f4128 100644 --- a/solidity/contracts/modules/resolution/BondEscalationResolutionModule.sol +++ b/solidity/contracts/modules/resolution/BondEscalationResolutionModule.sol @@ -7,7 +7,6 @@ import {IERC20} from '@openzeppelin/contracts/token/ERC20/IERC20.sol'; import {SafeERC20} from '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol'; import {FixedPointMathLib} from 'solmate/src/utils/FixedPointMathLib.sol'; -import {AccessController} from '@defi-wonderland/prophet-core/solidity/contracts/AccessController.sol'; import {IModule, Module} from '@defi-wonderland/prophet-core/solidity/contracts/Module.sol'; import {IOracle} from '@defi-wonderland/prophet-core/solidity/interfaces/IOracle.sol'; @@ -17,6 +16,7 @@ import {IResolutionModule} from import {IBondEscalationResolutionModule} from '../../../interfaces/modules/resolution/IBondEscalationResolutionModule.sol'; +import {AccessControllerModule} from '../accessControl/AccessControllerModule.sol'; import { _CLAIM_PLEDGE_TYPEHASH, @@ -24,7 +24,7 @@ import { _PLEDGE_FOR_DISPUTE_TYPEHASH } from '../../utils/Typehash.sol'; -contract BondEscalationResolutionModule is AccessController, Module, IBondEscalationResolutionModule { +contract BondEscalationResolutionModule is AccessControllerModule, IBondEscalationResolutionModule { using SafeERC20 for IERC20; /// @inheritdoc IBondEscalationResolutionModule @@ -42,7 +42,7 @@ contract BondEscalationResolutionModule is AccessController, Module, IBondEscala /// @inheritdoc IBondEscalationResolutionModule mapping(bytes32 _disputeId => mapping(address _pledger => uint256 pledges)) public pledgesAgainstDispute; - constructor(IOracle _oracle) Module(_oracle) {} + constructor(IOracle _oracle) AccessControllerModule(_oracle) {} /// @inheritdoc IModule function moduleName() external pure returns (string memory _moduleName) { diff --git a/solidity/contracts/modules/resolution/ERC20ResolutionModule.sol b/solidity/contracts/modules/resolution/ERC20ResolutionModule.sol index f251a34c..4b6e2d3e 100644 --- a/solidity/contracts/modules/resolution/ERC20ResolutionModule.sol +++ b/solidity/contracts/modules/resolution/ERC20ResolutionModule.sol @@ -6,15 +6,15 @@ import {IERC20} from '@openzeppelin/contracts/token/ERC20/IERC20.sol'; import {SafeERC20} from '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol'; import {EnumerableSet} from '@openzeppelin/contracts/utils/structs/EnumerableSet.sol'; -import {AccessController} from '@defi-wonderland/prophet-core/solidity/contracts/AccessController.sol'; import {IModule, Module} from '@defi-wonderland/prophet-core/solidity/contracts/Module.sol'; import {IOracle} from '@defi-wonderland/prophet-core/solidity/interfaces/IOracle.sol'; import {IERC20ResolutionModule} from '../../../interfaces/modules/resolution/IERC20ResolutionModule.sol'; import {_CAST_VOTE_TYPEHASH, _CLAIM_VOTE_TYPEHASH} from '../../utils/Typehash.sol'; +import {AccessControllerModule} from '../accessControl/AccessControllerModule.sol'; -contract ERC20ResolutionModule is AccessController, Module, IERC20ResolutionModule { +contract ERC20ResolutionModule is AccessControllerModule, IERC20ResolutionModule { using SafeERC20 for IERC20; using EnumerableSet for EnumerableSet.AddressSet; @@ -29,7 +29,7 @@ contract ERC20ResolutionModule is AccessController, Module, IERC20ResolutionModu */ mapping(bytes32 _disputeId => EnumerableSet.AddressSet _votersSet) internal _voters; - constructor(IOracle _oracle) Module(_oracle) {} + constructor(IOracle _oracle) AccessControllerModule(_oracle) {} /// @inheritdoc IModule function moduleName() external pure returns (string memory _moduleName) { diff --git a/solidity/contracts/modules/resolution/PrivateERC20ResolutionModule.sol b/solidity/contracts/modules/resolution/PrivateERC20ResolutionModule.sol index 412d6a7c..352134de 100644 --- a/solidity/contracts/modules/resolution/PrivateERC20ResolutionModule.sol +++ b/solidity/contracts/modules/resolution/PrivateERC20ResolutionModule.sol @@ -11,9 +11,9 @@ import {IModule, Module} from '@defi-wonderland/prophet-core/solidity/contracts/ import {IOracle} from '@defi-wonderland/prophet-core/solidity/interfaces/IOracle.sol'; import {IPrivateERC20ResolutionModule} from '../../../interfaces/modules/resolution/IPrivateERC20ResolutionModule.sol'; -import {AccessController} from '@defi-wonderland/prophet-core/solidity/contracts/AccessController.sol'; +import {AccessControllerModule} from '../accessControl/AccessControllerModule.sol'; -contract PrivateERC20ResolutionModule is AccessController, Module, IPrivateERC20ResolutionModule { +contract PrivateERC20ResolutionModule is AccessControllerModule, IPrivateERC20ResolutionModule { using SafeERC20 for IERC20; using EnumerableSet for EnumerableSet.AddressSet; @@ -28,7 +28,7 @@ contract PrivateERC20ResolutionModule is AccessController, Module, IPrivateERC20 */ mapping(bytes32 _disputeId => EnumerableSet.AddressSet _votersSet) internal _voters; - constructor(IOracle _oracle) Module(_oracle) {} + constructor(IOracle _oracle) AccessControllerModule(_oracle) {} /// @inheritdoc IModule function moduleName() external pure returns (string memory _moduleName) { diff --git a/solidity/contracts/modules/response/BondedResponseModule.sol b/solidity/contracts/modules/response/BondedResponseModule.sol index c15df71a..c776946f 100644 --- a/solidity/contracts/modules/response/BondedResponseModule.sol +++ b/solidity/contracts/modules/response/BondedResponseModule.sol @@ -7,9 +7,10 @@ import {IOracle} from '@defi-wonderland/prophet-core/solidity/interfaces/IOracle import {IBondedResponseModule} from '../../../interfaces/modules/response/IBondedResponseModule.sol'; import {_RELEASE_UNUTILIZED_RESPONSE_TYPEHASH} from '../../utils/Typehash.sol'; +import {AccessControllerModule} from '../accessControl/AccessControllerModule.sol'; -contract BondedResponseModule is AccessController, Module, IBondedResponseModule { - constructor(IOracle _oracle) Module(_oracle) {} +contract BondedResponseModule is AccessControllerModule, IBondedResponseModule { + constructor(IOracle _oracle) AccessControllerModule(_oracle) {} /// @inheritdoc IModule function moduleName() public pure returns (string memory _moduleName) { From f8e711319aaa5674680503ba69ed1ea4b71765e3 Mon Sep 17 00:00:00 2001 From: zorzal Date: Thu, 24 Oct 2024 08:36:35 -0400 Subject: [PATCH 08/50] feat: pass params to hasAccess modifier --- .../modules/resolution/ERC20ResolutionModule.sol | 4 ++-- .../resolution/PrivateERC20ResolutionModule.sol | 14 ++++++++++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/solidity/contracts/modules/resolution/ERC20ResolutionModule.sol b/solidity/contracts/modules/resolution/ERC20ResolutionModule.sol index 4b6e2d3e..f4b1ba0b 100644 --- a/solidity/contracts/modules/resolution/ERC20ResolutionModule.sol +++ b/solidity/contracts/modules/resolution/ERC20ResolutionModule.sol @@ -59,11 +59,11 @@ contract ERC20ResolutionModule is AccessControllerModule, IERC20ResolutionModule uint256 _numberOfVotes, AccessControl calldata _accessControl ) - public // review: why not external? + external hasAccess( _request.accessControlModule, _CAST_VOTE_TYPEHASH, - abi.encode(_request, _dispute, _numberOfVotes), + abi.encode(_request, _dispute, _numberOfVotes, _numberOfVotes), _accessControl ) { diff --git a/solidity/contracts/modules/resolution/PrivateERC20ResolutionModule.sol b/solidity/contracts/modules/resolution/PrivateERC20ResolutionModule.sol index 352134de..b55d6caa 100644 --- a/solidity/contracts/modules/resolution/PrivateERC20ResolutionModule.sol +++ b/solidity/contracts/modules/resolution/PrivateERC20ResolutionModule.sol @@ -59,7 +59,12 @@ contract PrivateERC20ResolutionModule is AccessControllerModule, IPrivateERC20Re AccessControl calldata _accessControl ) external - hasAccess(_request.accessControlModule, _COMMIT_VOTE_TYPEHASH, abi.encode(_request, _dispute), _accessControl) + hasAccess( + _request.accessControlModule, + _COMMIT_VOTE_TYPEHASH, + abi.encode(_request, _dispute, _commitment), + _accessControl + ) { bytes32 _disputeId = _validateDispute(_request, _dispute); if (ORACLE.disputeStatus(_disputeId) != IOracle.DisputeStatus.Escalated) { @@ -88,7 +93,12 @@ contract PrivateERC20ResolutionModule is AccessControllerModule, IPrivateERC20Re AccessControl calldata _accessControl ) public // review: why not external? - hasAccess(_request.accessControlModule, _REVEAL_VOTE_TYPEHASH, abi.encode(_request, _dispute), _accessControl) + hasAccess( + _request.accessControlModule, + _REVEAL_VOTE_TYPEHASH, + abi.encode(_request, _dispute, _numberOfVotes, _salt), + _accessControl + ) { bytes32 _disputeId = _validateDispute(_request, _dispute); Escalation memory _escalation = escalations[_disputeId]; From b3731d349a4e6989095157e4d0d81762078dc1ed Mon Sep 17 00:00:00 2001 From: zorzal Date: Thu, 24 Oct 2024 08:41:46 -0400 Subject: [PATCH 09/50] feat: update typehashes --- solidity/contracts/utils/Typehash.sol | 28 +++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/solidity/contracts/utils/Typehash.sol b/solidity/contracts/utils/Typehash.sol index 6a68c94c..a64ddead 100644 --- a/solidity/contracts/utils/Typehash.sol +++ b/solidity/contracts/utils/Typehash.sol @@ -1,18 +1,22 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.19; -bytes32 constant _PLEDGE_FOR_DISPUTE_TYPEHASH = keccak256( - 'pledgeForDispute(IOracle.Request _request, IOracle.Dispute _dispute,IAccessController.AccessControl _accessControl)' -); +bytes32 constant _PLEDGE_FOR_DISPUTE_TYPEHASH = + keccak256('pledgeForDispute(Request _request, Dispute _dispute,IAccessController.AccessControl _accessControl)'); -bytes32 constant _PLEDGE_AGAINST_DISPUTE_TYPEHASH = keccak256( - 'pledgeAgainstDispute(IOracle.Request _request, IOracle.Dispute _dispute,IAccessController.AccessControl _accessControl)' -); +bytes32 constant _PLEDGE_AGAINST_DISPUTE_TYPEHASH = + keccak256('pledgeAgainstDispute(Request _request,Dispute _dispute,IAccessController.AccessControl _accessControl)'); -bytes32 constant _CLAIM_VOTE_TYPEHASH = keccak256(''); -bytes32 constant _CLAIM_PLEDGE_TYPEHASH = keccak256(''); +bytes32 constant _CLAIM_PLEDGE_TYPEHASH = + keccak256('claimPledge(Request _request,Dispute _dispute,AccessControl _accessControl)'); -bytes32 constant _RELEASE_UNUTILIZED_RESPONSE_TYPEHASH = keccak256(''); -bytes32 constant _CAST_VOTE_TYPEHASH = keccak256(''); -bytes32 constant _COMMIT_VOTE_TYPEHASH = keccak256(''); -bytes32 constant _REVEAL_VOTE_TYPEHASH = keccak256(''); +bytes32 constant _CLAIM_VOTE_TYPEHASH = + keccak256('claimVote(Request _request,Dispute _dispute,AccessControl _accessControl)'); + +bytes32 constant _CAST_VOTE_TYPEHASH = + keccak256('castVote(Request _request,Dispute _dispute,uint256 _numberOfVotes,AccessControl _accessControl)'); +bytes32 constant _COMMIT_VOTE_TYPEHASH = + keccak256('commitVote(Request _request,Dispute _dispute,bytes32 _commitment,AccessControl _accessControl)'); +bytes32 constant _REVEAL_VOTE_TYPEHASH = keccak256( + 'revealVote(Request _request,Dispute _dispute,uint256 _numberOfVotes,bytes32 _salt,AccessControl _accessControl)' +); From 5796f2971215a954e2700367e1aa833af69d3f10 Mon Sep 17 00:00:00 2001 From: zorzal Date: Thu, 24 Oct 2024 08:42:20 -0400 Subject: [PATCH 10/50] feat: releaseUnutilizedResponse does not require access control --- .../modules/response/BondedResponseModule.sol | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/solidity/contracts/modules/response/BondedResponseModule.sol b/solidity/contracts/modules/response/BondedResponseModule.sol index c776946f..acbb3438 100644 --- a/solidity/contracts/modules/response/BondedResponseModule.sol +++ b/solidity/contracts/modules/response/BondedResponseModule.sol @@ -101,19 +101,7 @@ contract BondedResponseModule is AccessControllerModule, IBondedResponseModule { } /// @inheritdoc IBondedResponseModule - function releaseUnutilizedResponse( - IOracle.Request calldata _request, - IOracle.Response calldata _response, - AccessControl calldata _accessControl - ) - external - hasAccess( - _request.accessControlModule, - _RELEASE_UNUTILIZED_RESPONSE_TYPEHASH, - abi.encode(_request, _response), - _accessControl - ) - { + function releaseUnutilizedResponse(IOracle.Request calldata _request, IOracle.Response calldata _response) external { bytes32 _responseId = _validateResponse(_request, _response); bytes32 _disputeId = ORACLE.disputeOf(_responseId); From 1ebcfc9582846ef617322306e789fbeea8288fb9 Mon Sep 17 00:00:00 2001 From: zorzal Date: Thu, 24 Oct 2024 09:22:33 -0400 Subject: [PATCH 11/50] feat: update releaseUnutilizedResponse calls --- .../contracts/modules/response/BondedResponseModule.sol | 1 - .../interfaces/modules/response/IBondedResponseModule.sol | 6 +----- .../test/unit/modules/response/BondedResponseModule.t.sol | 6 +++--- solidity/test/utils/Helpers.sol | 2 +- 4 files changed, 5 insertions(+), 10 deletions(-) diff --git a/solidity/contracts/modules/response/BondedResponseModule.sol b/solidity/contracts/modules/response/BondedResponseModule.sol index acbb3438..4d6dffbe 100644 --- a/solidity/contracts/modules/response/BondedResponseModule.sol +++ b/solidity/contracts/modules/response/BondedResponseModule.sol @@ -6,7 +6,6 @@ import {IModule, Module} from '@defi-wonderland/prophet-core/solidity/contracts/ import {IOracle} from '@defi-wonderland/prophet-core/solidity/interfaces/IOracle.sol'; import {IBondedResponseModule} from '../../../interfaces/modules/response/IBondedResponseModule.sol'; -import {_RELEASE_UNUTILIZED_RESPONSE_TYPEHASH} from '../../utils/Typehash.sol'; import {AccessControllerModule} from '../accessControl/AccessControllerModule.sol'; contract BondedResponseModule is AccessControllerModule, IBondedResponseModule { diff --git a/solidity/interfaces/modules/response/IBondedResponseModule.sol b/solidity/interfaces/modules/response/IBondedResponseModule.sol index 4c064144..aff570d8 100644 --- a/solidity/interfaces/modules/response/IBondedResponseModule.sol +++ b/solidity/interfaces/modules/response/IBondedResponseModule.sol @@ -118,9 +118,5 @@ interface IBondedResponseModule is IResponseModule { * @param _request The finalized request * @param _response The unutilized response */ - function releaseUnutilizedResponse( - IOracle.Request calldata _request, - IOracle.Response calldata _response, - IAccessController.AccessControl calldata _accessControl - ) external; + function releaseUnutilizedResponse(IOracle.Request calldata _request, IOracle.Response calldata _response) external; } diff --git a/solidity/test/unit/modules/response/BondedResponseModule.t.sol b/solidity/test/unit/modules/response/BondedResponseModule.t.sol index ed64e1c1..eedb4bd3 100644 --- a/solidity/test/unit/modules/response/BondedResponseModule.t.sol +++ b/solidity/test/unit/modules/response/BondedResponseModule.t.sol @@ -513,7 +513,7 @@ contract BondedResponseModule_Unit_ReleaseUnutilizedResponse is BaseTest { emit UnutilizedResponseReleased(_requestId, _responseId); // Test: does it release the bond? - bondedResponseModule.releaseUnutilizedResponse(mockRequest, mockResponse, _createAccessControl(address(this))); + bondedResponseModule.releaseUnutilizedResponse(mockRequest, mockResponse); } /** @@ -546,7 +546,7 @@ contract BondedResponseModule_Unit_ReleaseUnutilizedResponse is BaseTest { // Check: reverts? vm.expectRevert(IBondedResponseModule.BondedResponseModule_InvalidReleaseParameters.selector); - bondedResponseModule.releaseUnutilizedResponse(mockRequest, _response, _createAccessControl(address(this))); + bondedResponseModule.releaseUnutilizedResponse(mockRequest, _response); } /** @@ -608,7 +608,7 @@ contract BondedResponseModule_Unit_ReleaseUnutilizedResponse is BaseTest { // todo: use `_anyone` address _notTheProposer = makeAddr('not-the-proposer'); vm.prank(_notTheProposer); - bondedResponseModule.releaseUnutilizedResponse(mockRequest, _response, _createAccessControl(_notTheProposer)); + bondedResponseModule.releaseUnutilizedResponse(mockRequest, _response); } } } diff --git a/solidity/test/utils/Helpers.sol b/solidity/test/utils/Helpers.sol index dfd5be7a..8e0a0519 100644 --- a/solidity/test/utils/Helpers.sol +++ b/solidity/test/utils/Helpers.sol @@ -165,7 +165,7 @@ contract Helpers is DSTestPlus, TestConstants { vm.expectEmit(true, true, true, true, _contract); } - function _createAccessControl() internal returns (IAccessController.AccessControl memory _accessControl) { + function _createAccessControl() internal view returns (IAccessController.AccessControl memory _accessControl) { _accessControl = _createAccessControl(msg.sender); } From 5398e6376e51fe3636710d166e012590779ee483 Mon Sep 17 00:00:00 2001 From: zorzal Date: Fri, 25 Oct 2024 09:06:47 -0400 Subject: [PATCH 12/50] feat: add _defaultAccessControl to AccessControllerModule --- .../modules/accessControl/AccessControllerModule.sol | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/solidity/contracts/modules/accessControl/AccessControllerModule.sol b/solidity/contracts/modules/accessControl/AccessControllerModule.sol index ca1efb66..19471a7c 100644 --- a/solidity/contracts/modules/accessControl/AccessControllerModule.sol +++ b/solidity/contracts/modules/accessControl/AccessControllerModule.sol @@ -7,4 +7,9 @@ import {IOracle} from '@defi-wonderland/prophet-core/solidity/interfaces/IOracle abstract contract AccessControllerModule is AccessController, Module { constructor(IOracle _oracle) Module(_oracle) {} + + // todo: add docs, update name to _selfAccessControl + function _defaultAccessControl() internal view returns (AccessControl memory _accessControl) { + _accessControl = AccessControl({user: address(this), data: bytes('')}); + } } From f0b55fc29ae947bf1fd60c1a6f4473d21a155993 Mon Sep 17 00:00:00 2001 From: zorzal Date: Fri, 25 Oct 2024 09:17:31 -0400 Subject: [PATCH 13/50] feat: remove accessControl param from unnecesary functions --- .../contracts/modules/dispute/BondEscalationModule.sol | 5 ++--- .../contracts/modules/dispute/RootVerificationModule.sol | 8 +------- .../contracts/modules/resolution/ArbitratorModule.sol | 8 +------- .../modules/resolution/BondEscalationResolutionModule.sol | 8 +------- .../modules/resolution/ERC20ResolutionModule.sol | 6 ++---- .../modules/resolution/PrivateERC20ResolutionModule.sol | 6 ++---- 6 files changed, 9 insertions(+), 32 deletions(-) diff --git a/solidity/contracts/modules/dispute/BondEscalationModule.sol b/solidity/contracts/modules/dispute/BondEscalationModule.sol index f0c34fac..6103d4df 100644 --- a/solidity/contracts/modules/dispute/BondEscalationModule.sol +++ b/solidity/contracts/modules/dispute/BondEscalationModule.sol @@ -71,7 +71,7 @@ contract BondEscalationModule is AccessControllerModule, IBondEscalationModule { _escalation.disputeId = _disputeId; emit BondEscalationStatusUpdated(_dispute.requestId, _disputeId, BondEscalationStatus.Active); } else if (_disputeId != _escalation.disputeId) { - ORACLE.escalateDispute(_request, _response, _dispute, _defaultAccessControl()); + ORACLE.escalateDispute(_request, _response, _dispute); } } @@ -310,8 +310,7 @@ contract BondEscalationModule is AccessControllerModule, IBondEscalationModule { _request: _request, _response: _response, _dispute: _dispute, - _status: _disputersWon ? IOracle.DisputeStatus.Won : IOracle.DisputeStatus.Lost, - _accessControl: _defaultAccessControl() + _status: _disputersWon ? IOracle.DisputeStatus.Won : IOracle.DisputeStatus.Lost }); } diff --git a/solidity/contracts/modules/dispute/RootVerificationModule.sol b/solidity/contracts/modules/dispute/RootVerificationModule.sol index d2ae49f5..4b205518 100644 --- a/solidity/contracts/modules/dispute/RootVerificationModule.sol +++ b/solidity/contracts/modules/dispute/RootVerificationModule.sol @@ -87,13 +87,7 @@ contract RootVerificationModule is AccessControllerModule, IRootVerificationModu _dispute: _dispute }); - ORACLE.updateDisputeStatus({ - _request: _request, - _response: _response, - _dispute: _dispute, - _status: _status, - _accessControl: _defaultAccessControl() - }); + ORACLE.updateDisputeStatus({_request: _request, _response: _response, _dispute: _dispute, _status: _status}); } /// @inheritdoc IModule diff --git a/solidity/contracts/modules/resolution/ArbitratorModule.sol b/solidity/contracts/modules/resolution/ArbitratorModule.sol index 15062d62..9ace482c 100644 --- a/solidity/contracts/modules/resolution/ArbitratorModule.sol +++ b/solidity/contracts/modules/resolution/ArbitratorModule.sol @@ -63,13 +63,7 @@ contract ArbitratorModule is AccessControllerModule, IArbitratorModule { if (_status <= IOracle.DisputeStatus.Escalated) revert ArbitratorModule_InvalidResolutionStatus(); _disputeData[_disputeId] = ArbitrationStatus.Resolved; - ORACLE.updateDisputeStatus({ - _request: _request, - _response: _response, - _dispute: _dispute, - _status: _status, - _accessControl: _defaultAccessControl() - }); + ORACLE.updateDisputeStatus({_request: _request, _response: _response, _dispute: _dispute, _status: _status}); emit DisputeResolved(_dispute.requestId, _disputeId, _status); } diff --git a/solidity/contracts/modules/resolution/BondEscalationResolutionModule.sol b/solidity/contracts/modules/resolution/BondEscalationResolutionModule.sol index 460f4128..aff6c470 100644 --- a/solidity/contracts/modules/resolution/BondEscalationResolutionModule.sol +++ b/solidity/contracts/modules/resolution/BondEscalationResolutionModule.sol @@ -141,13 +141,7 @@ contract BondEscalationResolutionModule is AccessControllerModule, IBondEscalati _disputeStatus = IOracle.DisputeStatus.Lost; } - ORACLE.updateDisputeStatus({ - _request: _request, - _response: _response, - _dispute: _dispute, - _status: _disputeStatus, - _accessControl: _defaultAccessControl() - }); + ORACLE.updateDisputeStatus({_request: _request, _response: _response, _dispute: _dispute, _status: _disputeStatus}); emit DisputeResolved(_dispute.requestId, _disputeId, _disputeStatus); } diff --git a/solidity/contracts/modules/resolution/ERC20ResolutionModule.sol b/solidity/contracts/modules/resolution/ERC20ResolutionModule.sol index f4b1ba0b..41489c00 100644 --- a/solidity/contracts/modules/resolution/ERC20ResolutionModule.sol +++ b/solidity/contracts/modules/resolution/ERC20ResolutionModule.sol @@ -116,8 +116,7 @@ contract ERC20ResolutionModule is AccessControllerModule, IERC20ResolutionModule _request: _request, _response: _response, _dispute: _dispute, - _status: IOracle.DisputeStatus.Won, - _accessControl: _defaultAccessControl() + _status: IOracle.DisputeStatus.Won }); emit DisputeResolved(_dispute.requestId, _disputeId, IOracle.DisputeStatus.Won); } else { @@ -125,8 +124,7 @@ contract ERC20ResolutionModule is AccessControllerModule, IERC20ResolutionModule _request: _request, _response: _response, _dispute: _dispute, - _status: IOracle.DisputeStatus.Lost, - _accessControl: _defaultAccessControl() + _status: IOracle.DisputeStatus.Lost }); emit DisputeResolved(_dispute.requestId, _disputeId, IOracle.DisputeStatus.Lost); } diff --git a/solidity/contracts/modules/resolution/PrivateERC20ResolutionModule.sol b/solidity/contracts/modules/resolution/PrivateERC20ResolutionModule.sol index b55d6caa..1d10881a 100644 --- a/solidity/contracts/modules/resolution/PrivateERC20ResolutionModule.sol +++ b/solidity/contracts/modules/resolution/PrivateERC20ResolutionModule.sol @@ -158,8 +158,7 @@ contract PrivateERC20ResolutionModule is AccessControllerModule, IPrivateERC20Re _request: _request, _response: _response, _dispute: _dispute, - _status: IOracle.DisputeStatus.Won, - _accessControl: _defaultAccessControl() + _status: IOracle.DisputeStatus.Won }); emit DisputeResolved(_dispute.requestId, _disputeId, IOracle.DisputeStatus.Won); } else { @@ -167,8 +166,7 @@ contract PrivateERC20ResolutionModule is AccessControllerModule, IPrivateERC20Re _request: _request, _response: _response, _dispute: _dispute, - _status: IOracle.DisputeStatus.Lost, - _accessControl: _defaultAccessControl() + _status: IOracle.DisputeStatus.Lost }); emit DisputeResolved(_dispute.requestId, _disputeId, IOracle.DisputeStatus.Lost); } From 463bfd68739ca43c8a0c7f2368b655e5769eebd4 Mon Sep 17 00:00:00 2001 From: zorzal Date: Fri, 25 Oct 2024 09:19:45 -0400 Subject: [PATCH 14/50] test: use access control in corresponding functions --- .../integration/AccountingExtension.t.sol | 2 +- solidity/test/integration/Arbitration.t.sol | 12 +++--- .../test/integration/BondEscalation.t.sol | 13 +++--- .../test/integration/CallbackModule.t.sol | 2 +- .../integration/ContractCallRequest.t.sol | 4 +- .../test/integration/EscalateDispute.t.sol | 8 ++-- solidity/test/integration/HttpRequest.t.sol | 4 +- solidity/test/integration/IntegrationBase.sol | 2 +- .../integration/MultipleCallbacksModule.t.sol | 2 +- .../test/integration/RequestCreation.t.sol | 21 +++++----- .../test/integration/ResponseProposal.t.sol | 10 ++--- .../test/integration/RootVerification.t.sol | 2 +- solidity/test/mocks/MockAtomicArbitrator.sol | 2 +- .../dispute/BondEscalationModule.t.sol | 22 +--------- .../dispute/RootVerificationModule.t.sol | 42 ++----------------- .../modules/resolution/ArbitratorModule.t.sol | 10 +---- .../BondEscalationResolutionModule.t.sol | 28 ++----------- .../resolution/ERC20ResolutionModule.t.sol | 5 +-- .../PrivateERC20ResolutionModule.t.sol | 5 +-- 19 files changed, 56 insertions(+), 140 deletions(-) diff --git a/solidity/test/integration/AccountingExtension.t.sol b/solidity/test/integration/AccountingExtension.t.sol index 3ea7348c..7e63988e 100644 --- a/solidity/test/integration/AccountingExtension.t.sol +++ b/solidity/test/integration/AccountingExtension.t.sol @@ -121,7 +121,7 @@ contract Integration_AccountingExtension is IntegrationBase { vm.startPrank(user); _accountingExtension.approveModule(address(_requestModule)); - oracle.createRequest(mockRequest, _ipfsHash); + oracle.createRequest(mockRequest, _ipfsHash, _createAccessControl()); // Check: does it revert if trying to withdraw an amount that is bonded to a request? vm.expectRevert(IAccountingExtension.AccountingExtension_InsufficientFunds.selector); diff --git a/solidity/test/integration/Arbitration.t.sol b/solidity/test/integration/Arbitration.t.sol index 9a838ee6..d0732b69 100644 --- a/solidity/test/integration/Arbitration.t.sol +++ b/solidity/test/integration/Arbitration.t.sol @@ -25,14 +25,14 @@ contract Integration_Arbitration is IntegrationBase { // First step: escalating the dispute vm.prank(disputer); - oracle.escalateDispute(mockRequest, mockResponse, mockDispute, _createAccessControl(disputer)); + oracle.escalateDispute(mockRequest, mockResponse, mockDispute); // Check: is the dispute status active after starting the resolution? assertEq(uint256(_arbitratorModule.getStatus(_disputeId)), uint256(IArbitratorModule.ArbitrationStatus.Active)); // Second step: resolving the dispute vm.prank(disputer); - oracle.resolveDispute(mockRequest, mockResponse, mockDispute, _createAccessControl(disputer)); + oracle.resolveDispute(mockRequest, mockResponse, mockDispute); // Check: is the dispute status resolved after calling resolve? assertEq(uint256(_arbitratorModule.getStatus(_disputeId)), uint256(IArbitratorModule.ArbitrationStatus.Resolved)); @@ -58,7 +58,7 @@ contract Integration_Arbitration is IntegrationBase { // First step: escalating the dispute vm.prank(disputer); - oracle.escalateDispute(mockRequest, mockResponse, mockDispute, _createAccessControl(disputer)); + oracle.escalateDispute(mockRequest, mockResponse, mockDispute); // Check: is the dispute status resolved after calling resolve? assertEq(uint256(_arbitratorModule.getStatus(_disputeId)), uint256(IArbitratorModule.ArbitrationStatus.Resolved)); @@ -83,7 +83,7 @@ contract Integration_Arbitration is IntegrationBase { // First step: escalating the dispute vm.prank(disputer); - oracle.escalateDispute(mockRequest, mockResponse, mockDispute, _createAccessControl(disputer)); + oracle.escalateDispute(mockRequest, mockResponse, mockDispute); // Check: is the dispute status active after starting the resolution? assertEq(uint256(_arbitratorModule.getStatus(_disputeId)), uint256(IArbitratorModule.ArbitrationStatus.Active)); @@ -97,7 +97,7 @@ contract Integration_Arbitration is IntegrationBase { // Second step: resolving the dispute vm.prank(disputer); - oracle.resolveDispute(mockRequest, mockResponse, mockDispute, _createAccessControl(disputer)); + oracle.resolveDispute(mockRequest, mockResponse, mockDispute); // Check: is the dispute status resolved after calling resolve? assertEq(uint256(_arbitratorModule.getStatus(_disputeId)), uint256(IArbitratorModule.ArbitrationStatus.Resolved)); @@ -130,7 +130,7 @@ contract Integration_Arbitration is IntegrationBase { // First step: escalating and resolving the dispute vm.prank(disputer); - oracle.escalateDispute(mockRequest, mockResponse, mockDispute, _createAccessControl(disputer)); + oracle.escalateDispute(mockRequest, mockResponse, mockDispute); // Check: is the dispute status resolved after calling escalate? assertEq(uint256(_arbitratorModule.getStatus(_disputeId)), uint256(IArbitratorModule.ArbitrationStatus.Resolved)); diff --git a/solidity/test/integration/BondEscalation.t.sol b/solidity/test/integration/BondEscalation.t.sol index d95c8912..05d43dfe 100644 --- a/solidity/test/integration/BondEscalation.t.sol +++ b/solidity/test/integration/BondEscalation.t.sol @@ -96,7 +96,7 @@ contract Integration_BondEscalation is IntegrationBase { // Requester creates a request _deposit(_bondEscalationAccounting, requester, usdc, _expectedReward); vm.prank(requester); - _requestId = oracle.createRequest(mockRequest, _ipfsHash); + _requestId = oracle.createRequest(mockRequest, _ipfsHash, _createAccessControl(requester)); // Proposer proposes a response _deposit(_bondEscalationAccounting, proposer, usdc, _expectedBondSize); @@ -285,7 +285,7 @@ contract Integration_BondEscalation is IntegrationBase { // So Another proposer gets paid Disputer's bond vm.warp(block.timestamp + _expectedDeadline + 2 days); _mockArbitrator.setAnswer(IOracle.DisputeStatus.Lost); - oracle.resolveDispute(mockRequest, _secondResponse, _secondDispute, mockAccessControl); + oracle.resolveDispute(mockRequest, _secondResponse, _secondDispute); // Test: The requester still has nothing assertEq(_bondEscalationAccounting.balanceOf(requester, usdc), 0, 'Mismatch: Requester balance'); @@ -351,7 +351,7 @@ contract Integration_BondEscalation is IntegrationBase { // review: we could use a global address `_anyone` address _escalator = makeAddr('escalator'); vm.prank(_escalator); - oracle.escalateDispute(mockRequest, mockResponse, mockDispute, _createAccessControl(_escalator)); + oracle.escalateDispute(mockRequest, mockResponse, mockDispute); // Step 8: At this point, new answers can be proposed IOracle.Response memory _secondResponse = @@ -362,7 +362,7 @@ contract Integration_BondEscalation is IntegrationBase { // Step 9: After some time, the resolution module deems Disputer's dispute as correct _mineBlocks(100); - oracle.resolveDispute(mockRequest, mockResponse, mockDispute, mockAccessControl); + oracle.resolveDispute(mockRequest, mockResponse, mockDispute); IOracle.DisputeStatus _disputeStatus = oracle.disputeStatus(_disputeId); assertEq(uint256(_disputeStatus), uint256(IOracle.DisputeStatus.Won), 'Mismatch: Dispute status'); @@ -428,10 +428,11 @@ contract Integration_BondEscalation is IntegrationBase { vm.warp(block.timestamp + _bondEscalationDeadline + 1); + // todo: use `_anyone` vm.prank(_escalator); - oracle.escalateDispute(mockRequest, mockResponse, mockDispute, _createAccessControl(_escalator)); + oracle.escalateDispute(mockRequest, mockResponse, mockDispute); vm.prank(_resolver); - oracle.resolveDispute(mockRequest, mockResponse, mockDispute, _createAccessControl(_resolver)); + oracle.resolveDispute(mockRequest, mockResponse, mockDispute); IOracle.DisputeStatus _disputeStatus = oracle.disputeStatus(_disputeId); assertEq(uint256(_disputeStatus), uint256(IOracle.DisputeStatus.Won), 'Mismatch: Dispute status'); diff --git a/solidity/test/integration/CallbackModule.t.sol b/solidity/test/integration/CallbackModule.t.sol index 9e78a952..fd283d0b 100644 --- a/solidity/test/integration/CallbackModule.t.sol +++ b/solidity/test/integration/CallbackModule.t.sol @@ -47,7 +47,7 @@ contract Integration_CallbackModule is IntegrationBase { _deposit(_accountingExtension, requester, usdc, _expectedReward); vm.startPrank(requester); _accountingExtension.approveModule(address(_requestModule)); - _requestId = oracle.createRequest(mockRequest, _ipfsHash); + _requestId = oracle.createRequest(mockRequest, _ipfsHash, _createAccessControl()); vm.stopPrank(); _deposit(_accountingExtension, proposer, usdc, _expectedBondSize); diff --git a/solidity/test/integration/ContractCallRequest.t.sol b/solidity/test/integration/ContractCallRequest.t.sol index 41de2a01..9a663004 100644 --- a/solidity/test/integration/ContractCallRequest.t.sol +++ b/solidity/test/integration/ContractCallRequest.t.sol @@ -46,7 +46,7 @@ contract Integration_ContractCallRequest is IntegrationBase { function test_createRequest_finalizeEmptyResponse() public { vm.prank(requester); - bytes32 _requestId = oracle.createRequest(mockRequest, _ipfsHash); + bytes32 _requestId = oracle.createRequest(mockRequest, _ipfsHash, _createAccessControl()); // mock an empty response mockResponse = @@ -65,7 +65,7 @@ contract Integration_ContractCallRequest is IntegrationBase { function test_createRequest_finalizeValidResponse() public { vm.prank(requester); - bytes32 _requestId = oracle.createRequest(mockRequest, _ipfsHash); + bytes32 _requestId = oracle.createRequest(mockRequest, _ipfsHash, _createAccessControl(requester)); mockResponse = IOracle.Response({proposer: proposer, requestId: _requestId, response: bytes('good-answer')}); diff --git a/solidity/test/integration/EscalateDispute.t.sol b/solidity/test/integration/EscalateDispute.t.sol index a58e9fcf..41aea3a0 100644 --- a/solidity/test/integration/EscalateDispute.t.sol +++ b/solidity/test/integration/EscalateDispute.t.sol @@ -50,7 +50,7 @@ contract Integration_EscalateDispute is IntegrationBase { vm.startPrank(requester); _bondEscalationAccounting.approveModule(address(_requestModule)); - _requestId = oracle.createRequest(mockRequest, _ipfsHash); + _requestId = oracle.createRequest(mockRequest, _ipfsHash, _createAccessControl()); vm.stopPrank(); _resetMockIds(); @@ -75,7 +75,7 @@ contract Integration_EscalateDispute is IntegrationBase { mockDispute.requestId = bytes32(0); vm.expectRevert(ValidatorLib.ValidatorLib_InvalidDisputeBody.selector); vm.prank(_escalator); - oracle.escalateDispute(mockRequest, mockResponse, mockDispute, _createAccessControl(_escalator)); + oracle.escalateDispute(mockRequest, mockResponse, mockDispute); mockDispute.requestId = _requestId; @@ -103,7 +103,7 @@ contract Integration_EscalateDispute is IntegrationBase { // We escalate the dispute vm.warp(block.timestamp + _expectedDeadline + 1); vm.prank(_escalator); - oracle.escalateDispute(mockRequest, mockResponse, mockDispute, _createAccessControl(_escalator)); + oracle.escalateDispute(mockRequest, mockResponse, mockDispute); // We check that the dispute was escalated IOracle.DisputeStatus _disputeStatus = oracle.disputeStatus(_disputeId); @@ -119,6 +119,6 @@ contract Integration_EscalateDispute is IntegrationBase { // Escalate dispute reverts if dispute is not active vm.expectRevert(abi.encodeWithSelector(IOracle.Oracle_CannotEscalate.selector, _disputeId)); vm.prank(_escalator); - oracle.escalateDispute(mockRequest, mockResponse, mockDispute, _createAccessControl(_escalator)); + oracle.escalateDispute(mockRequest, mockResponse, mockDispute); } } diff --git a/solidity/test/integration/HttpRequest.t.sol b/solidity/test/integration/HttpRequest.t.sol index 343ae7ef..d293baa6 100644 --- a/solidity/test/integration/HttpRequest.t.sol +++ b/solidity/test/integration/HttpRequest.t.sol @@ -33,7 +33,7 @@ contract Integration_HttpRequest is IntegrationBase { function test_createRequest_finalizeEmptyResponse() public { vm.prank(requester); - bytes32 _requestId = oracle.createRequest(mockRequest, _ipfsHash); + bytes32 _requestId = oracle.createRequest(mockRequest, _ipfsHash, _createAccessControl(requester)); // mock an empty response mockResponse = @@ -53,7 +53,7 @@ contract Integration_HttpRequest is IntegrationBase { function test_createRequest_finalizeValidResponse() public { vm.prank(requester); - bytes32 _requestId = oracle.createRequest(mockRequest, _ipfsHash); + bytes32 _requestId = oracle.createRequest(mockRequest, _ipfsHash, _createAccessControl(requester)); mockResponse = IOracle.Response({proposer: proposer, requestId: _requestId, response: bytes('good-answer')}); diff --git a/solidity/test/integration/IntegrationBase.sol b/solidity/test/integration/IntegrationBase.sol index f90f11ea..87c8f633 100644 --- a/solidity/test/integration/IntegrationBase.sol +++ b/solidity/test/integration/IntegrationBase.sol @@ -221,7 +221,7 @@ contract IntegrationBase is DSTestPlus, TestConstants, Helpers { function _createRequest() internal returns (bytes32 _requestId) { vm.startPrank(requester); _accountingExtension.approveModule(address(_requestModule)); - _requestId = oracle.createRequest(mockRequest, _ipfsHash); + _requestId = oracle.createRequest(mockRequest, _ipfsHash, _createAccessControl()); vm.stopPrank(); } diff --git a/solidity/test/integration/MultipleCallbacksModule.t.sol b/solidity/test/integration/MultipleCallbacksModule.t.sol index 00a1e2c2..5c769543 100644 --- a/solidity/test/integration/MultipleCallbacksModule.t.sol +++ b/solidity/test/integration/MultipleCallbacksModule.t.sol @@ -59,7 +59,7 @@ contract Integration_MultipleCallbackModule is IntegrationBase { _deposit(_accountingExtension, requester, usdc, _expectedReward); vm.startPrank(requester); _accountingExtension.approveModule(address(_requestModule)); - _requestId = oracle.createRequest(mockRequest, _ipfsHash); + _requestId = oracle.createRequest(mockRequest, _ipfsHash, _createAccessControl()); vm.stopPrank(); _deposit(_accountingExtension, proposer, usdc, _expectedBondSize); diff --git a/solidity/test/integration/RequestCreation.t.sol b/solidity/test/integration/RequestCreation.t.sol index 30b0474f..2fb7d777 100644 --- a/solidity/test/integration/RequestCreation.t.sol +++ b/solidity/test/integration/RequestCreation.t.sol @@ -26,7 +26,7 @@ contract Integration_RequestCreation is IntegrationBase { // Create the request vm.prank(requester); - bytes32 _requestId = oracle.createRequest(mockRequest, _ipfsHash); + bytes32 _requestId = oracle.createRequest(mockRequest, _ipfsHash, _createAccessControl(requester)); // Check: saved the correct id? assertEq(_requestId, _getId(mockRequest)); @@ -52,7 +52,7 @@ contract Integration_RequestCreation is IntegrationBase { function test_createRequest_withAllModules() public { // Create the request vm.prank(requester); - bytes32 _requestId = oracle.createRequest(mockRequest, _ipfsHash); + bytes32 _requestId = oracle.createRequest(mockRequest, _ipfsHash, _createAccessControl(requester)); // Check: saved the correct id? assertEq(_requestId, _getId(mockRequest)); @@ -92,7 +92,7 @@ contract Integration_RequestCreation is IntegrationBase { // Check: should not revert as user has set no rewards and bonded? vm.prank(requester); - oracle.createRequest(mockRequest, _ipfsHash); + oracle.createRequest(mockRequest, _ipfsHash, _createAccessControl(requester)); } /** @@ -113,7 +113,7 @@ contract Integration_RequestCreation is IntegrationBase { // Check: doesn't revert if the reward is 0 and the user has not bonded? vm.prank(requester); - oracle.createRequest(mockRequest, _ipfsHash); + oracle.createRequest(mockRequest, _ipfsHash, _createAccessControl(requester)); } /** @@ -135,7 +135,7 @@ contract Integration_RequestCreation is IntegrationBase { // Check: should revert with `InsufficientFunds` as user has not deposited? vm.expectRevert(IAccountingExtension.AccountingExtension_InsufficientFunds.selector); vm.prank(requester); - oracle.createRequest(mockRequest, _ipfsHash); + oracle.createRequest(mockRequest, _ipfsHash, _createAccessControl(requester)); } /** @@ -147,11 +147,11 @@ contract Integration_RequestCreation is IntegrationBase { // Create the first request vm.startPrank(requester); - bytes32 _firstRequestId = oracle.createRequest(mockRequest, _ipfsHash); + bytes32 _firstRequestId = oracle.createRequest(mockRequest, _ipfsHash, _createAccessControl()); // Set the new nonce and create the second request mockRequest.nonce += 1; - bytes32 _secondRequestId = oracle.createRequest(mockRequest, _ipfsHash); + bytes32 _secondRequestId = oracle.createRequest(mockRequest, _ipfsHash, _createAccessControl()); vm.stopPrank(); // Check: saved different ids? @@ -174,7 +174,7 @@ contract Integration_RequestCreation is IntegrationBase { // Check: reverts due to the invalid token address? vm.expectRevert(IAccountingExtension.AccountingExtension_InsufficientFunds.selector); vm.prank(requester); - oracle.createRequest(mockRequest, _ipfsHash); + oracle.createRequest(mockRequest, _ipfsHash, _createAccessControl(requester)); } /** @@ -186,9 +186,10 @@ contract Integration_RequestCreation is IntegrationBase { vm.startPrank(requester); + // review: should we specify the evm error? // Check: reverts with `EVM error`? vm.expectRevert(); - oracle.createRequest(mockRequest, _ipfsHash); + oracle.createRequest(mockRequest, _ipfsHash, _createAccessControl()); // Reset the modules back and configure an invalid dispute module. mockRequest.requestModule = address(_requestModule); @@ -196,7 +197,7 @@ contract Integration_RequestCreation is IntegrationBase { mockRequest.disputeModule = makeAddr('NON-EXISTENT DISPUTE MODULE'); // Check: doesn't revert if any module but the request module is invalid? - oracle.createRequest(mockRequest, _ipfsHash); + oracle.createRequest(mockRequest, _ipfsHash, _createAccessControl()); vm.stopPrank(); } diff --git a/solidity/test/integration/ResponseProposal.t.sol b/solidity/test/integration/ResponseProposal.t.sol index a59d3772..d6d29581 100644 --- a/solidity/test/integration/ResponseProposal.t.sol +++ b/solidity/test/integration/ResponseProposal.t.sol @@ -16,7 +16,7 @@ contract Integration_ResponseProposal is IntegrationBase { // Create the request vm.startPrank(requester); _accountingExtension.approveModule(address(_requestModule)); - _requestId = oracle.createRequest(mockRequest, _ipfsHash); + _requestId = oracle.createRequest(mockRequest, _ipfsHash, _createAccessControl()); vm.stopPrank(); // Approve the response module on behalf of the proposer @@ -119,7 +119,7 @@ contract Integration_ResponseProposal is IntegrationBase { // Creates the request vm.prank(requester); - oracle.createRequest(mockRequest, _ipfsHash); + oracle.createRequest(mockRequest, _ipfsHash, _createAccessControl(requester)); mockResponse.response = _responseBytes; _resetMockIds(); @@ -128,7 +128,7 @@ contract Integration_ResponseProposal is IntegrationBase { vm.expectRevert(IAccountingExtension.AccountingExtension_InsufficientFunds.selector); vm.prank(proposer); - oracle.proposeResponse(mockRequest, mockResponse, mockAccessControl); + oracle.proposeResponse(mockRequest, mockResponse, _createAccessControl(proposer)); } /** @@ -162,7 +162,7 @@ contract Integration_ResponseProposal is IntegrationBase { vm.startPrank(_otherRequester); // Create a new request with another dispute module _accountingExtension.approveModule(mockRequest.requestModule); - bytes32 _requestIdApprovedDisputeModule = oracle.createRequest(mockRequest, _ipfsHash); + bytes32 _requestIdApprovedDisputeModule = oracle.createRequest(mockRequest, _ipfsHash, _createAccessControl()); changePrank(_approvedDisputeModule); @@ -203,7 +203,7 @@ contract Integration_ResponseProposal is IntegrationBase { // Attacker creates a request with their own address as the dispute module mockRequest.disputeModule = _attacker; _accountingExtension.approveModule(mockRequest.requestModule); - bytes32 _requestIdAttacker = oracle.createRequest(mockRequest, _ipfsHash); + bytes32 _requestIdAttacker = oracle.createRequest(mockRequest, _ipfsHash, _createAccessControl()); // Attacker proposes a response from their address (the dispute module) and using another user as the proposer mockResponse.response = _responseBytes; diff --git a/solidity/test/integration/RootVerification.t.sol b/solidity/test/integration/RootVerification.t.sol index 45e01aec..b1e75a0e 100644 --- a/solidity/test/integration/RootVerification.t.sol +++ b/solidity/test/integration/RootVerification.t.sol @@ -89,7 +89,7 @@ contract Integration_RootVerification is IntegrationBase { vm.startPrank(requester); _accountingExtension.approveModule(address(_sparseMerkleTreeModule)); - _requestId = oracle.createRequest(mockRequest, _ipfsHash); + _requestId = oracle.createRequest(mockRequest, _ipfsHash, _createAccessControl()); vm.stopPrank(); vm.prank(proposer); diff --git a/solidity/test/mocks/MockAtomicArbitrator.sol b/solidity/test/mocks/MockAtomicArbitrator.sol index 368df66a..ec47dc96 100644 --- a/solidity/test/mocks/MockAtomicArbitrator.sol +++ b/solidity/test/mocks/MockAtomicArbitrator.sol @@ -21,7 +21,7 @@ contract MockAtomicArbitrator is IArbitrator { ) external returns (bytes memory _result) { _result = new bytes(0); answer = IOracle.DisputeStatus.Won; - oracle.resolveDispute(_request, _response, _dispute, _accessControl); + oracle.resolveDispute(_request, _response, _dispute); } function getAnswer(bytes32 /* _dispute */ ) external view returns (IOracle.DisputeStatus _answer) { diff --git a/solidity/test/unit/modules/dispute/BondEscalationModule.t.sol b/solidity/test/unit/modules/dispute/BondEscalationModule.t.sol index 4a70c7a3..ab38e3e5 100644 --- a/solidity/test/unit/modules/dispute/BondEscalationModule.t.sol +++ b/solidity/test/unit/modules/dispute/BondEscalationModule.t.sol @@ -1489,16 +1489,7 @@ contract BondEscalationModule_Unit_SettleBondEscalation is BaseTest { _mockAndExpect( address(oracle), - abi.encodeCall( - IOracle.updateDisputeStatus, - ( - mockRequest, - _response, - _dispute, - IOracle.DisputeStatus.Won, - _createAccessControl(address(bondEscalationModule)) - ) - ), + abi.encodeCall(IOracle.updateDisputeStatus, (mockRequest, _response, _dispute, IOracle.DisputeStatus.Won)), abi.encode(true) ); @@ -1543,16 +1534,7 @@ contract BondEscalationModule_Unit_SettleBondEscalation is BaseTest { _mockAndExpect( address(oracle), - abi.encodeCall( - IOracle.updateDisputeStatus, - ( - mockRequest, - _response, - _dispute, - IOracle.DisputeStatus.Lost, - _createAccessControl(address(bondEscalationModule)) - ) - ), + abi.encodeCall(IOracle.updateDisputeStatus, (mockRequest, _response, _dispute, IOracle.DisputeStatus.Lost)), abi.encode(true) ); diff --git a/solidity/test/unit/modules/dispute/RootVerificationModule.t.sol b/solidity/test/unit/modules/dispute/RootVerificationModule.t.sol index 40bd66af..1205386f 100644 --- a/solidity/test/unit/modules/dispute/RootVerificationModule.t.sol +++ b/solidity/test/unit/modules/dispute/RootVerificationModule.t.sol @@ -207,19 +207,7 @@ contract RootVerificationModule_Unit_DisputeResponse is BaseTest { // Mock and expect the call the oracle, updating the dispute's status _mockAndExpect( address(oracle), - // abi.encodeWithSelector( - // oracle.updateDisputeStatus.selector, mockRequest, mockResponse, mockDispute, IOracle.DisputeStatus.Won - // ), - abi.encodeCall( - IOracle.updateDisputeStatus, - ( - mockRequest, - mockResponse, - mockDispute, - IOracle.DisputeStatus.Won, - _createAccessControl(address(rootVerificationModule)) - ) - ), + abi.encodeCall(IOracle.updateDisputeStatus, (mockRequest, mockResponse, mockDispute, IOracle.DisputeStatus.Won)), abi.encode(true) ); @@ -260,19 +248,7 @@ contract RootVerificationModule_Unit_DisputeResponse is BaseTest { // Mock and expect the call the oracle, updating the dispute's status _mockAndExpect( address(oracle), - abi.encodeCall( - IOracle.updateDisputeStatus, - ( - mockRequest, - mockResponse, - mockDispute, - IOracle.DisputeStatus.Won, - _createAccessControl(address(rootVerificationModule)) - ) - ), - // abi.encodeWithSelector( - // oracle.updateDisputeStatus.selector, mockRequest, mockResponse, mockDispute, IOracle.DisputeStatus.Won - // ), + abi.encodeCall(IOracle.updateDisputeStatus, (mockRequest, mockResponse, mockDispute, IOracle.DisputeStatus.Won)), abi.encode(true) ); @@ -325,19 +301,7 @@ contract RootVerificationModule_Unit_DisputeResponse is BaseTest { // Mock and expect the call the oracle, updating the dispute's status _mockAndExpect( address(oracle), - abi.encodeCall( - IOracle.updateDisputeStatus, - ( - mockRequest, - mockResponse, - mockDispute, - IOracle.DisputeStatus.Lost, - _createAccessControl(address(rootVerificationModule)) - ) - ), - // abi.encodeWithSelector( - // oracle.updateDisputeStatus.selector, mockRequest, mockResponse, mockDispute, IOracle.DisputeStatus.Lost - // ), + abi.encodeCall(IOracle.updateDisputeStatus, (mockRequest, mockResponse, mockDispute, IOracle.DisputeStatus.Lost)), abi.encode(true) ); diff --git a/solidity/test/unit/modules/resolution/ArbitratorModule.t.sol b/solidity/test/unit/modules/resolution/ArbitratorModule.t.sol index 79ba3296..478b3620 100644 --- a/solidity/test/unit/modules/resolution/ArbitratorModule.t.sol +++ b/solidity/test/unit/modules/resolution/ArbitratorModule.t.sol @@ -208,10 +208,7 @@ contract ArbitratorModule_Unit_ResolveDispute is BaseTest { // Mock and expect IOracle.updateDisputeStatus to be called _mockAndExpect( address(oracle), - abi.encodeCall( - oracle.updateDisputeStatus, - (mockRequest, mockResponse, mockDispute, _arbitratorStatus, _createAccessControl(address(arbitratorModule))) - ), + abi.encodeCall(oracle.updateDisputeStatus, (mockRequest, mockResponse, mockDispute, _arbitratorStatus)), abi.encode() ); @@ -266,10 +263,7 @@ contract ArbitratorModule_Unit_ResolveDispute is BaseTest { // Mock and expect IOracle.updateDisputeStatus to be called _mockAndExpect( address(oracle), - abi.encodeCall( - oracle.updateDisputeStatus, - (mockRequest, mockResponse, mockDispute, _arbitratorStatus, _createAccessControl(address(arbitratorModule))) - ), + abi.encodeCall(oracle.updateDisputeStatus, (mockRequest, mockResponse, mockDispute, _arbitratorStatus)), abi.encode() ); diff --git a/solidity/test/unit/modules/resolution/BondEscalationResolutionModule.t.sol b/solidity/test/unit/modules/resolution/BondEscalationResolutionModule.t.sol index 93cd7cb4..4bee84d3 100644 --- a/solidity/test/unit/modules/resolution/BondEscalationResolutionModule.t.sol +++ b/solidity/test/unit/modules/resolution/BondEscalationResolutionModule.t.sol @@ -899,14 +899,7 @@ contract BondEscalationResolutionModule_Unit_ResolveDispute is BaseTest { _mockAndExpect( address(oracle), abi.encodeCall( - IOracle.updateDisputeStatus, - ( - mockRequest, - mockResponse, - mockDispute, - IOracle.DisputeStatus.NoResolution, - _createAccessControl(address(module)) - ) + IOracle.updateDisputeStatus, (mockRequest, mockResponse, mockDispute, IOracle.DisputeStatus.NoResolution) ), abi.encode() ); @@ -936,14 +929,7 @@ contract BondEscalationResolutionModule_Unit_ResolveDispute is BaseTest { _mockAndExpect( address(oracle), abi.encodeCall( - IOracle.updateDisputeStatus, - ( - mockRequest, - mockResponse, - mockDispute, - IOracle.DisputeStatus.NoResolution, - _createAccessControl(address(module)) - ) + IOracle.updateDisputeStatus, (mockRequest, mockResponse, mockDispute, IOracle.DisputeStatus.NoResolution) ), abi.encode() ); @@ -984,10 +970,7 @@ contract BondEscalationResolutionModule_Unit_ResolveDispute is BaseTest { // Mock and expect IOracle.updateDisputeStatus to be called _mockAndExpect( address(oracle), - abi.encodeCall( - IOracle.updateDisputeStatus, - (mockRequest, mockResponse, mockDispute, IOracle.DisputeStatus.Won, _createAccessControl(address(module))) - ), + abi.encodeCall(IOracle.updateDisputeStatus, (mockRequest, mockResponse, mockDispute, IOracle.DisputeStatus.Won)), abi.encode() ); @@ -1023,10 +1006,7 @@ contract BondEscalationResolutionModule_Unit_ResolveDispute is BaseTest { // Mock and expect IOracle.updateDisputeStatus to be called _mockAndExpect( address(oracle), - abi.encodeCall( - IOracle.updateDisputeStatus, - (mockRequest, mockResponse, mockDispute, IOracle.DisputeStatus.Lost, _createAccessControl(address(module))) - ), + abi.encodeCall(IOracle.updateDisputeStatus, (mockRequest, mockResponse, mockDispute, IOracle.DisputeStatus.Lost)), abi.encode() ); diff --git a/solidity/test/unit/modules/resolution/ERC20ResolutionModule.t.sol b/solidity/test/unit/modules/resolution/ERC20ResolutionModule.t.sol index 53305658..23c99964 100644 --- a/solidity/test/unit/modules/resolution/ERC20ResolutionModule.t.sol +++ b/solidity/test/unit/modules/resolution/ERC20ResolutionModule.t.sol @@ -358,10 +358,7 @@ contract ERC20ResolutionModule_Unit_ResolveDispute is BaseTest { // Mock and expect IOracle.updateDisputeStatus to be called _mockAndExpect( address(oracle), - abi.encodeCall( - IOracle.updateDisputeStatus, - (mockRequest, mockResponse, mockDispute, _newStatus, _createAccessControl(address(module))) - ), + abi.encodeCall(IOracle.updateDisputeStatus, (mockRequest, mockResponse, mockDispute, _newStatus)), abi.encode() ); diff --git a/solidity/test/unit/modules/resolution/PrivateERC20ResolutionModule.t.sol b/solidity/test/unit/modules/resolution/PrivateERC20ResolutionModule.t.sol index 7a54b3a8..7ebcb03d 100644 --- a/solidity/test/unit/modules/resolution/PrivateERC20ResolutionModule.t.sol +++ b/solidity/test/unit/modules/resolution/PrivateERC20ResolutionModule.t.sol @@ -648,10 +648,7 @@ contract PrivateERC20ResolutionModule_Unit_ResolveDispute is BaseTest { // Mock and expect IOracle.updateDisputeStatus to be called _mockAndExpect( address(oracle), - abi.encodeCall( - IOracle.updateDisputeStatus, - (mockRequest, mockResponse, mockDispute, _newStatus, _createAccessControl(address(module))) - ), + abi.encodeCall(IOracle.updateDisputeStatus, (mockRequest, mockResponse, mockDispute, _newStatus)), abi.encode() ); From 08fe1caee0e71a6ce889995a9e713267c8ccc2df Mon Sep 17 00:00:00 2001 From: zorzal Date: Fri, 25 Oct 2024 09:33:16 -0400 Subject: [PATCH 15/50] docs: add access control param to natspec --- solidity/interfaces/IArbitrator.sol | 1 + .../interfaces/modules/dispute/IBondEscalationModule.sol | 2 ++ .../modules/resolution/IBondEscalationResolutionModule.sol | 5 ++++- .../interfaces/modules/resolution/IERC20ResolutionModule.sol | 2 ++ .../modules/resolution/IPrivateERC20ResolutionModule.sol | 2 ++ 5 files changed, 11 insertions(+), 1 deletion(-) diff --git a/solidity/interfaces/IArbitrator.sol b/solidity/interfaces/IArbitrator.sol index 8207235d..2a6ed4b4 100644 --- a/solidity/interfaces/IArbitrator.sol +++ b/solidity/interfaces/IArbitrator.sol @@ -19,6 +19,7 @@ interface IArbitrator { * @param _dispute The dispute object * @return _data The data for the dispute resolution */ + // review: I think don't need access control here. function resolve( IOracle.Request memory _request, IOracle.Response memory _response, diff --git a/solidity/interfaces/modules/dispute/IBondEscalationModule.sol b/solidity/interfaces/modules/dispute/IBondEscalationModule.sol index 9340deec..dcc41d5d 100644 --- a/solidity/interfaces/modules/dispute/IBondEscalationModule.sol +++ b/solidity/interfaces/modules/dispute/IBondEscalationModule.sol @@ -241,6 +241,7 @@ interface IBondEscalationModule is IDisputeModule { * * @param _request The request data. * @param _dispute The dispute data. + * @param _accessControl The access control data * * @dev If the bond escalation is not tied at the end of its deadline, a tying buffer is added * to avoid scenarios where one of the parties breaks the tie very last second. @@ -258,6 +259,7 @@ interface IBondEscalationModule is IDisputeModule { * * @param _request The request data. * @param _dispute The dispute data. + * @param _accessControl The access control data * * @dev Will revert if the disputeId is not going through the bond escalation process. * @dev If the bond escalation is not tied at the end of its deadline, a tying buffer is added diff --git a/solidity/interfaces/modules/resolution/IBondEscalationResolutionModule.sol b/solidity/interfaces/modules/resolution/IBondEscalationResolutionModule.sol index d13e1984..b976c8af 100644 --- a/solidity/interfaces/modules/resolution/IBondEscalationResolutionModule.sol +++ b/solidity/interfaces/modules/resolution/IBondEscalationResolutionModule.sol @@ -277,6 +277,7 @@ interface IBondEscalationResolutionModule is IResolutionModule { * @param _request The request data * @param _dispute The dispute data * @param _pledgeAmount The amount of pledges to pledge. + * @param _accessControl The access control data */ function pledgeForDispute( IOracle.Request calldata _request, @@ -291,7 +292,8 @@ interface IBondEscalationResolutionModule is IResolutionModule { * * @param _request The request data * @param _dispute The dispute data - * @param _pledgeAmount The amount of pledges to pledge. + * @param _pledgeAmount The amount of pledges to pledge + * @param _accessControl The access control data */ function pledgeAgainstDispute( IOracle.Request calldata _request, @@ -305,6 +307,7 @@ interface IBondEscalationResolutionModule is IResolutionModule { * * @param _request The request data * @param _dispute The dispute data + * @param _accessControl The access control data * * @dev Winning pledgers will claim their pledges along with their reward. In case of no resolution, users can * claim their pledges back. Losing pledgers will go to the rewards of the winning pledgers. diff --git a/solidity/interfaces/modules/resolution/IERC20ResolutionModule.sol b/solidity/interfaces/modules/resolution/IERC20ResolutionModule.sol index 5ef6576c..365b7e01 100644 --- a/solidity/interfaces/modules/resolution/IERC20ResolutionModule.sol +++ b/solidity/interfaces/modules/resolution/IERC20ResolutionModule.sol @@ -153,6 +153,7 @@ interface IERC20ResolutionModule is IResolutionModule { * @param _request The request for which the dispute was created * @param _dispute The dispute for which the vote is being cast * @param _numberOfVotes The number of votes to cast + * @param _accessControl The access control data */ function castVote( IOracle.Request calldata _request, @@ -181,6 +182,7 @@ interface IERC20ResolutionModule is IResolutionModule { * * @param _request The request for which the dispute was created * @param _dispute The resolved dispute + * @param _accessControl The access control data */ function claimVote( IOracle.Request calldata _request, diff --git a/solidity/interfaces/modules/resolution/IPrivateERC20ResolutionModule.sol b/solidity/interfaces/modules/resolution/IPrivateERC20ResolutionModule.sol index 569eb24a..692b7877 100644 --- a/solidity/interfaces/modules/resolution/IPrivateERC20ResolutionModule.sol +++ b/solidity/interfaces/modules/resolution/IPrivateERC20ResolutionModule.sol @@ -164,6 +164,7 @@ interface IPrivateERC20ResolutionModule is IResolutionModule { * @param _request The request data * @param _dispute The dispute being voted on * @param _commitment The commitment computed from the provided data and the user's address + * @param _accessControl The access control data */ function commitVote( IOracle.Request calldata _request, @@ -179,6 +180,7 @@ interface IPrivateERC20ResolutionModule is IResolutionModule { * @param _dispute The dispute being voted on * @param _numberOfVotes The amount of votes being revealed * @param _salt The salt used to compute the commitment + * @param _accessControl The access control data */ function revealVote( IOracle.Request calldata _request, From 2b28b578ab71ea1df775b799c8b2479843905a76 Mon Sep 17 00:00:00 2001 From: zorzal Date: Fri, 25 Oct 2024 09:34:10 -0400 Subject: [PATCH 16/50] docs: add natspec for _defaultAccessControl --- .../modules/accessControl/AccessControllerModule.sol | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/solidity/contracts/modules/accessControl/AccessControllerModule.sol b/solidity/contracts/modules/accessControl/AccessControllerModule.sol index 19471a7c..ce38f7fb 100644 --- a/solidity/contracts/modules/accessControl/AccessControllerModule.sol +++ b/solidity/contracts/modules/accessControl/AccessControllerModule.sol @@ -8,7 +8,13 @@ import {IOracle} from '@defi-wonderland/prophet-core/solidity/interfaces/IOracle abstract contract AccessControllerModule is AccessController, Module { constructor(IOracle _oracle) Module(_oracle) {} - // todo: add docs, update name to _selfAccessControl + /** + * // todo: update name to _selfAccessControl + * @notice Returns an access control object using the contract address as user + * + * @dev should only be used by modules as the self-access-control object + * @return _accessControl The self access control for this contract. + */ function _defaultAccessControl() internal view returns (AccessControl memory _accessControl) { _accessControl = AccessControl({user: address(this), data: bytes('')}); } From a37968c42e361b6ea317842eceb9cd26f17d6380 Mon Sep 17 00:00:00 2001 From: zorzal Date: Fri, 25 Oct 2024 09:34:36 -0400 Subject: [PATCH 17/50] docs: add missing natspec for onlyAuthorizedCaller modifier --- solidity/contracts/extensions/BondEscalationAccounting.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/solidity/contracts/extensions/BondEscalationAccounting.sol b/solidity/contracts/extensions/BondEscalationAccounting.sol index cd0d4fb4..7465039c 100644 --- a/solidity/contracts/extensions/BondEscalationAccounting.sol +++ b/solidity/contracts/extensions/BondEscalationAccounting.sol @@ -29,6 +29,7 @@ contract BondEscalationAccounting is AccountingExtension, IBondEscalationAccount } } + /// @notice Checks if the caller is an authorized caller modifier onlyAuthorizedCaller() { if (!authorizedCallers[msg.sender]) revert BondEscalationAccounting_UnauthorizedCaller(); _; From 76067484f787ed934b763be0c79b80b25385e81e Mon Sep 17 00:00:00 2001 From: zorzal Date: Wed, 30 Oct 2024 06:48:48 -0400 Subject: [PATCH 18/50] test: replace mockAC for actual access control --- solidity/test/integration/Arbitration.t.sol | 8 ++++---- .../test/integration/BondEscalation.t.sol | 20 +++++++++---------- .../test/integration/CallbackModule.t.sol | 4 ++-- .../integration/ContractCallRequest.t.sol | 4 ++-- .../test/integration/EscalateDispute.t.sol | 6 +++--- solidity/test/integration/Finalization.t.sol | 14 ++++++------- solidity/test/integration/HttpRequest.t.sol | 6 +++--- .../integration/MultipleCallbacksModule.t.sol | 6 +++--- solidity/test/integration/Payments.t.sol | 4 ++-- .../test/integration/ResponseDispute.t.sol | 2 +- .../test/integration/ResponseProposal.t.sol | 14 ++++++------- .../test/integration/RootVerification.t.sol | 4 ++-- 12 files changed, 46 insertions(+), 46 deletions(-) diff --git a/solidity/test/integration/Arbitration.t.sol b/solidity/test/integration/Arbitration.t.sol index d0732b69..ee96663b 100644 --- a/solidity/test/integration/Arbitration.t.sol +++ b/solidity/test/integration/Arbitration.t.sol @@ -25,7 +25,7 @@ contract Integration_Arbitration is IntegrationBase { // First step: escalating the dispute vm.prank(disputer); - oracle.escalateDispute(mockRequest, mockResponse, mockDispute); + oracle.escalateDispute(mockRequest, mockResponse, mockDispute, _createAccessControl(disputer)); // Check: is the dispute status active after starting the resolution? assertEq(uint256(_arbitratorModule.getStatus(_disputeId)), uint256(IArbitratorModule.ArbitrationStatus.Active)); @@ -58,7 +58,7 @@ contract Integration_Arbitration is IntegrationBase { // First step: escalating the dispute vm.prank(disputer); - oracle.escalateDispute(mockRequest, mockResponse, mockDispute); + oracle.escalateDispute(mockRequest, mockResponse, mockDispute, _createAccessControl(disputer)); // Check: is the dispute status resolved after calling resolve? assertEq(uint256(_arbitratorModule.getStatus(_disputeId)), uint256(IArbitratorModule.ArbitrationStatus.Resolved)); @@ -83,7 +83,7 @@ contract Integration_Arbitration is IntegrationBase { // First step: escalating the dispute vm.prank(disputer); - oracle.escalateDispute(mockRequest, mockResponse, mockDispute); + oracle.escalateDispute(mockRequest, mockResponse, mockDispute, _createAccessControl(disputer)); // Check: is the dispute status active after starting the resolution? assertEq(uint256(_arbitratorModule.getStatus(_disputeId)), uint256(IArbitratorModule.ArbitrationStatus.Active)); @@ -130,7 +130,7 @@ contract Integration_Arbitration is IntegrationBase { // First step: escalating and resolving the dispute vm.prank(disputer); - oracle.escalateDispute(mockRequest, mockResponse, mockDispute); + oracle.escalateDispute(mockRequest, mockResponse, mockDispute, _createAccessControl(disputer)); // Check: is the dispute status resolved after calling escalate? assertEq(uint256(_arbitratorModule.getStatus(_disputeId)), uint256(IArbitratorModule.ArbitrationStatus.Resolved)); diff --git a/solidity/test/integration/BondEscalation.t.sol b/solidity/test/integration/BondEscalation.t.sol index 05d43dfe..98a7dd5c 100644 --- a/solidity/test/integration/BondEscalation.t.sol +++ b/solidity/test/integration/BondEscalation.t.sol @@ -153,7 +153,7 @@ contract Integration_BondEscalation is IntegrationBase { // Step 8: Finalize request and check balances again vm.warp(block.timestamp + _expectedDeadline + 1 days); - oracle.finalize(mockRequest, mockResponse); + oracle.finalize(mockRequest, mockResponse, _createAccessControl(address(this))); // Test: The requester has no balance because he has paid the proposer assertEq(_bondEscalationAccounting.balanceOf(requester, usdc), 0, 'Mismatch: Requester balance'); @@ -173,17 +173,17 @@ contract Integration_BondEscalation is IntegrationBase { // Step 1: Proposer pledges against the dispute _deposit(_bondEscalationAccounting, proposer, usdc, _pledgeSize); vm.prank(proposer); - _bondEscalationModule.pledgeAgainstDispute(mockRequest, mockDispute, _createAccessControl(proposer)); + _bondEscalationModule.pledgeAgainstDispute(mockRequest, mockDispute, _createAccessControl()); // Step 2: Disputer doubles down _deposit(_bondEscalationAccounting, disputer, usdc, _pledgeSize); vm.prank(disputer); - _bondEscalationModule.pledgeForDispute(mockRequest, mockDispute, _createAccessControl(disputer)); + _bondEscalationModule.pledgeForDispute(mockRequest, mockDispute, _createAccessControl()); // Step 3: Another party joins the dispute _deposit(_bondEscalationAccounting, _secondDisputer, usdc, _pledgeSize); vm.prank(_secondDisputer); - _bondEscalationModule.pledgeForDispute(mockRequest, mockDispute, _createAccessControl(_secondDisputer)); + _bondEscalationModule.pledgeForDispute(mockRequest, mockDispute, _createAccessControl()); // Step 4: Proposer runs out of capital and doesn't pledge anymore // External parties see that Proposer's proposal was wrong so they don't join to escalate @@ -232,24 +232,24 @@ contract Integration_BondEscalation is IntegrationBase { IOracle.Dispute memory _secondDispute = IOracle.Dispute({disputer: disputer, responseId: _responseId, requestId: _requestId, proposer: _secondProposer}); vm.prank(disputer); - _disputeId = oracle.disputeResponse(mockRequest, _secondResponse, _secondDispute, _createAccessControl(disputer)); + _disputeId = oracle.disputeResponse(mockRequest, _secondResponse, _secondDispute, _createAccessControl()); // Step 9: Shouldn't be able to pledge for or against the dispute due to the bond escalation deadline being over _deposit(_bondEscalationAccounting, disputer, usdc, _pledgeSize); vm.expectRevert(IBondEscalationModule.BondEscalationModule_InvalidDispute.selector); vm.prank(disputer); - _bondEscalationModule.pledgeForDispute(mockRequest, _secondDispute, _createAccessControl(disputer)); + _bondEscalationModule.pledgeForDispute(mockRequest, _secondDispute, _createAccessControl()); // Step 10: Because Another proposer's answer is disputed, a third party can propose a new answer IOracle.Response memory _thirdResponse = IOracle.Response({proposer: _thirdProposer, requestId: _requestId, response: abi.encode('third response')}); _deposit(_bondEscalationAccounting, _thirdProposer, usdc, _expectedBondSize); vm.prank(_thirdProposer); - _responseId = oracle.proposeResponse(mockRequest, _thirdResponse, _createAccessControl(_thirdProposer)); + _responseId = oracle.proposeResponse(mockRequest, _thirdResponse, _createAccessControl()); // Step 11: It goes undisputed for three days, therefore it's deemed correct and final vm.warp(block.timestamp + _expectedDeadline + 1); - oracle.finalize(mockRequest, _thirdResponse); + oracle.finalize(mockRequest, _thirdResponse, _createAccessControl(address(this))); // Test: The requester has paid out the reward assertEq(_bondEscalationAccounting.balanceOf(requester, usdc), 0, 'Mismatch: Requester balance'); @@ -351,7 +351,7 @@ contract Integration_BondEscalation is IntegrationBase { // review: we could use a global address `_anyone` address _escalator = makeAddr('escalator'); vm.prank(_escalator); - oracle.escalateDispute(mockRequest, mockResponse, mockDispute); + oracle.escalateDispute(mockRequest, mockResponse, mockDispute, _createAccessControl(_escalator)); // Step 8: At this point, new answers can be proposed IOracle.Response memory _secondResponse = @@ -430,7 +430,7 @@ contract Integration_BondEscalation is IntegrationBase { // todo: use `_anyone` vm.prank(_escalator); - oracle.escalateDispute(mockRequest, mockResponse, mockDispute); + oracle.escalateDispute(mockRequest, mockResponse, mockDispute, _createAccessControl(_escalator)); vm.prank(_resolver); oracle.resolveDispute(mockRequest, mockResponse, mockDispute); diff --git a/solidity/test/integration/CallbackModule.t.sol b/solidity/test/integration/CallbackModule.t.sol index fd283d0b..60422525 100644 --- a/solidity/test/integration/CallbackModule.t.sol +++ b/solidity/test/integration/CallbackModule.t.sol @@ -25,7 +25,7 @@ contract Integration_CallbackModule is IntegrationBase { // advance time past deadline vm.warp(block.timestamp + _expectedDeadline + _baseDisputeWindow); - oracle.finalize(mockRequest, mockResponse); + oracle.finalize(mockRequest, mockResponse, _createAccessControl(address(this))); } function test_callbacksNeverRevert() public { @@ -38,7 +38,7 @@ contract Integration_CallbackModule is IntegrationBase { vm.expectCall(address(_target), abi.encodeCall(IProphetCallback.prophetCallback, (_expectedData))); vm.warp(block.timestamp + _expectedDeadline + _baseDisputeWindow); - oracle.finalize(mockRequest, mockResponse); + oracle.finalize(mockRequest, mockResponse, _createAccessControl(address(this))); } function _setupRequest() internal { diff --git a/solidity/test/integration/ContractCallRequest.t.sol b/solidity/test/integration/ContractCallRequest.t.sol index 9a663004..05171980 100644 --- a/solidity/test/integration/ContractCallRequest.t.sol +++ b/solidity/test/integration/ContractCallRequest.t.sol @@ -60,7 +60,7 @@ contract Integration_ContractCallRequest is IntegrationBase { vm.warp(block.timestamp + 2 days); vm.prank(_finalizer); - oracle.finalize(mockRequest, mockResponse); + oracle.finalize(mockRequest, mockResponse, _createAccessControl()); } function test_createRequest_finalizeValidResponse() public { @@ -85,6 +85,6 @@ contract Integration_ContractCallRequest is IntegrationBase { vm.warp(block.timestamp + _expectedDeadline); vm.prank(_finalizer); - oracle.finalize(mockRequest, mockResponse); + oracle.finalize(mockRequest, mockResponse, _createAccessControl()); } } diff --git a/solidity/test/integration/EscalateDispute.t.sol b/solidity/test/integration/EscalateDispute.t.sol index 41aea3a0..967463cb 100644 --- a/solidity/test/integration/EscalateDispute.t.sol +++ b/solidity/test/integration/EscalateDispute.t.sol @@ -75,7 +75,7 @@ contract Integration_EscalateDispute is IntegrationBase { mockDispute.requestId = bytes32(0); vm.expectRevert(ValidatorLib.ValidatorLib_InvalidDisputeBody.selector); vm.prank(_escalator); - oracle.escalateDispute(mockRequest, mockResponse, mockDispute); + oracle.escalateDispute(mockRequest, mockResponse, mockDispute, _createAccessControl(_escalator)); mockDispute.requestId = _requestId; @@ -103,7 +103,7 @@ contract Integration_EscalateDispute is IntegrationBase { // We escalate the dispute vm.warp(block.timestamp + _expectedDeadline + 1); vm.prank(_escalator); - oracle.escalateDispute(mockRequest, mockResponse, mockDispute); + oracle.escalateDispute(mockRequest, mockResponse, mockDispute, _createAccessControl(_escalator)); // We check that the dispute was escalated IOracle.DisputeStatus _disputeStatus = oracle.disputeStatus(_disputeId); @@ -119,6 +119,6 @@ contract Integration_EscalateDispute is IntegrationBase { // Escalate dispute reverts if dispute is not active vm.expectRevert(abi.encodeWithSelector(IOracle.Oracle_CannotEscalate.selector, _disputeId)); vm.prank(_escalator); - oracle.escalateDispute(mockRequest, mockResponse, mockDispute); + oracle.escalateDispute(mockRequest, mockResponse, mockDispute, _createAccessControl(_escalator)); } } diff --git a/solidity/test/integration/Finalization.t.sol b/solidity/test/integration/Finalization.t.sol index be4c2d0a..d4a70557 100644 --- a/solidity/test/integration/Finalization.t.sol +++ b/solidity/test/integration/Finalization.t.sol @@ -33,7 +33,7 @@ contract Integration_Finalization is IntegrationBase { vm.expectCall(address(_mockCallback), abi.encodeWithSelector(IProphetCallback.prophetCallback.selector, _calldata)); vm.prank(_finalizer); - oracle.finalize(mockRequest, mockResponse); + oracle.finalize(mockRequest, mockResponse, _createAccessControl()); // Check: is response finalized? bytes32 _finalizedResponseId = oracle.finalizedResponseId(_getId(mockRequest)); @@ -50,7 +50,7 @@ contract Integration_Finalization is IntegrationBase { vm.expectRevert(IOracle.Oracle_InvalidResponse.selector); vm.prank(_finalizer); - oracle.finalize(mockRequest, mockResponse); + oracle.finalize(mockRequest, mockResponse, _createAccessControl()); } /** @@ -61,9 +61,9 @@ contract Integration_Finalization is IntegrationBase { _proposeResponse(); _disputeResponse(); - vm.prank(_finalizer); vm.expectRevert(IOracle.Oracle_InvalidFinalizedResponse.selector); - oracle.finalize(mockRequest, mockResponse); + vm.prank(_finalizer); + oracle.finalize(mockRequest, mockResponse, _createAccessControl()); } /** @@ -80,7 +80,7 @@ contract Integration_Finalization is IntegrationBase { // Check: reverts if called during the dispute window? vm.expectRevert(IBondedResponseModule.BondedResponseModule_TooEarlyToFinalize.selector); vm.prank(_finalizer); - oracle.finalize(mockRequest, mockResponse); + oracle.finalize(mockRequest, mockResponse, _createAccessControl()); } /** @@ -100,7 +100,7 @@ contract Integration_Finalization is IntegrationBase { vm.expectCall(address(_mockCallback), abi.encodeWithSelector(IProphetCallback.prophetCallback.selector, _calldata)); vm.prank(_finalizer); - oracle.finalize(mockRequest, mockResponse); + oracle.finalize(mockRequest, mockResponse, _createAccessControl()); // Check: is response finalized? bytes32 _finalizedResponseId = oracle.finalizedResponseId(_getId(mockRequest)); @@ -123,7 +123,7 @@ contract Integration_Finalization is IntegrationBase { vm.expectRevert(IBondedResponseModule.BondedResponseModule_TooEarlyToFinalize.selector); vm.prank(_finalizer); - oracle.finalize(mockRequest, mockResponse); + oracle.finalize(mockRequest, mockResponse, _createAccessControl()); } /** diff --git a/solidity/test/integration/HttpRequest.t.sol b/solidity/test/integration/HttpRequest.t.sol index d293baa6..331b0ca9 100644 --- a/solidity/test/integration/HttpRequest.t.sol +++ b/solidity/test/integration/HttpRequest.t.sol @@ -48,7 +48,7 @@ contract Integration_HttpRequest is IntegrationBase { vm.warp(block.timestamp + _expectedDeadline); vm.prank(_finalizer); - oracle.finalize(mockRequest, mockResponse); + oracle.finalize(mockRequest, mockResponse, _createAccessControl()); } function test_createRequest_finalizeValidResponse() public { @@ -59,7 +59,7 @@ contract Integration_HttpRequest is IntegrationBase { vm.startPrank(proposer); _accountingExtension.approveModule(address(_responseModule)); - oracle.proposeResponse(mockRequest, mockResponse, mockAccessControl); + oracle.proposeResponse(mockRequest, mockResponse, _createAccessControl()); vm.stopPrank(); // expect call to accounting to pay the proposer @@ -74,6 +74,6 @@ contract Integration_HttpRequest is IntegrationBase { vm.warp(block.timestamp + _expectedDeadline); vm.prank(_finalizer); - oracle.finalize(mockRequest, mockResponse); + oracle.finalize(mockRequest, mockResponse, _createAccessControl(_finalizer)); } } diff --git a/solidity/test/integration/MultipleCallbacksModule.t.sol b/solidity/test/integration/MultipleCallbacksModule.t.sol index 5c769543..3e1b35ac 100644 --- a/solidity/test/integration/MultipleCallbacksModule.t.sol +++ b/solidity/test/integration/MultipleCallbacksModule.t.sol @@ -31,7 +31,7 @@ contract Integration_MultipleCallbackModule is IntegrationBase { } vm.warp(block.timestamp + _expectedDeadline + _baseDisputeWindow); - oracle.finalize(mockRequest, mockResponse); + oracle.finalize(mockRequest, mockResponse, _createAccessControl(address(this))); } function test_callbacksNeverRevert() public { @@ -50,7 +50,7 @@ contract Integration_MultipleCallbackModule is IntegrationBase { } vm.warp(block.timestamp + _expectedDeadline + _baseDisputeWindow); - oracle.finalize(mockRequest, mockResponse); + oracle.finalize(mockRequest, mockResponse, _createAccessControl(address(this))); } function _setupRequest() internal { @@ -66,7 +66,7 @@ contract Integration_MultipleCallbackModule is IntegrationBase { vm.startPrank(proposer); _accountingExtension.approveModule(address(_responseModule)); mockResponse.response = abi.encode(proposer, _requestId, bytes('')); - oracle.proposeResponse(mockRequest, mockResponse, mockAccessControl); + oracle.proposeResponse(mockRequest, mockResponse, _createAccessControl()); vm.stopPrank(); } diff --git a/solidity/test/integration/Payments.t.sol b/solidity/test/integration/Payments.t.sol index ecee5489..1917890e 100644 --- a/solidity/test/integration/Payments.t.sol +++ b/solidity/test/integration/Payments.t.sol @@ -29,7 +29,7 @@ contract Integration_Payments is IntegrationBase { vm.warp(block.timestamp + _expectedDeadline + _baseDisputeWindow); // Finalize request/response - oracle.finalize(mockRequest, mockResponse); + oracle.finalize(mockRequest, mockResponse, _createAccessControl(address(this))); // Check: requester has paid for response? assertEq(_accountingExtension.balanceOf(requester, usdc), 0); @@ -68,7 +68,7 @@ contract Integration_Payments is IntegrationBase { // Warp to finalization time. vm.warp(block.timestamp + _expectedDeadline + _baseDisputeWindow); // Finalize request/response. - oracle.finalize(mockRequest, mockResponse); + oracle.finalize(mockRequest, mockResponse, _createAccessControl(address(this))); // Check: requester has paid for response? assertEq(_accountingExtension.balanceOf(requester, weth), 0); diff --git a/solidity/test/integration/ResponseDispute.t.sol b/solidity/test/integration/ResponseDispute.t.sol index 38f6681d..30c04825 100644 --- a/solidity/test/integration/ResponseDispute.t.sol +++ b/solidity/test/integration/ResponseDispute.t.sol @@ -84,7 +84,7 @@ contract Integration_ResponseDispute is IntegrationBase { */ function test_disputeResponse_alreadyFinalized() public { vm.warp(block.timestamp + _expectedDeadline + _baseDisputeWindow); - oracle.finalize(mockRequest, mockResponse); + oracle.finalize(mockRequest, mockResponse, _createAccessControl(address(this))); vm.expectRevert(abi.encodeWithSelector(IOracle.Oracle_AlreadyFinalized.selector, _getId(mockRequest))); diff --git a/solidity/test/integration/ResponseProposal.t.sol b/solidity/test/integration/ResponseProposal.t.sol index d6d29581..62ecdde4 100644 --- a/solidity/test/integration/ResponseProposal.t.sol +++ b/solidity/test/integration/ResponseProposal.t.sol @@ -31,7 +31,7 @@ contract Integration_ResponseProposal is IntegrationBase { mockResponse.response = _responseBytes; vm.prank(proposer); - oracle.proposeResponse(mockRequest, mockResponse, mockAccessControl); + oracle.proposeResponse(mockRequest, mockResponse, _createAccessControl()); // Check: the proposer is a participant now? assertTrue(oracle.isParticipant(_requestId, proposer)); @@ -59,7 +59,7 @@ contract Integration_ResponseProposal is IntegrationBase { vm.expectRevert(IBondedResponseModule.BondedResponseModule_TooLateToPropose.selector); vm.prank(proposer); - oracle.proposeResponse(mockRequest, mockResponse, mockAccessControl); + oracle.proposeResponse(mockRequest, mockResponse, _createAccessControl()); } /** @@ -70,7 +70,7 @@ contract Integration_ResponseProposal is IntegrationBase { // First response vm.prank(proposer); - oracle.proposeResponse(mockRequest, mockResponse, mockAccessControl); + oracle.proposeResponse(mockRequest, mockResponse, _createAccessControl()); mockResponse.response = abi.encode('second response'); @@ -79,7 +79,7 @@ contract Integration_ResponseProposal is IntegrationBase { // Second response vm.prank(proposer); - oracle.proposeResponse(mockRequest, mockResponse, mockAccessControl); + oracle.proposeResponse(mockRequest, mockResponse, _createAccessControl()); } /** @@ -95,7 +95,7 @@ contract Integration_ResponseProposal is IntegrationBase { vm.expectRevert(ValidatorLib.ValidatorLib_InvalidResponseBody.selector); vm.prank(proposer); - oracle.proposeResponse(mockRequest, mockResponse, mockAccessControl); + oracle.proposeResponse(mockRequest, mockResponse, _createAccessControl()); } /** @@ -171,7 +171,7 @@ contract Integration_ResponseProposal is IntegrationBase { mockResponse.proposer = proposer; mockResponse.requestId = _requestIdApprovedDisputeModule; - oracle.proposeResponse(mockRequest, mockResponse, mockAccessControl); + oracle.proposeResponse(mockRequest, mockResponse, _createAccessControl()); vm.stopPrank(); uint256 _newProposerBalance = _accountingExtension.balanceOf(proposer, usdc); @@ -212,6 +212,6 @@ contract Integration_ResponseProposal is IntegrationBase { // Should revert as the dispute module is not approved vm.expectRevert(IAccountingExtension.AccountingExtension_NotAllowed.selector); - oracle.proposeResponse(mockRequest, mockResponse, mockAccessControl); + oracle.proposeResponse(mockRequest, mockResponse, _createAccessControl()); } } diff --git a/solidity/test/integration/RootVerification.t.sol b/solidity/test/integration/RootVerification.t.sol index b1e75a0e..9d501b68 100644 --- a/solidity/test/integration/RootVerification.t.sol +++ b/solidity/test/integration/RootVerification.t.sol @@ -104,11 +104,11 @@ contract Integration_RootVerification is IntegrationBase { mockResponse.response = abi.encode(_correctRoot); vm.prank(proposer); - oracle.proposeResponse(mockRequest, mockResponse, mockAccessControl); + oracle.proposeResponse(mockRequest, mockResponse, _createAccessControl()); vm.warp(block.timestamp + _expectedDeadline + _baseDisputeWindow); - oracle.finalize(mockRequest, mockResponse); + oracle.finalize(mockRequest, mockResponse, _createAccessControl(address(this))); } function test_disputeResponse_incorrectResponse(bytes32 _invalidRoot) public { From 384e297934f5bd36394eae256e7449a8fa5c4b17 Mon Sep 17 00:00:00 2001 From: zorzal Date: Wed, 30 Oct 2024 06:49:33 -0400 Subject: [PATCH 19/50] test: use pranked caller in _createAccessControl --- solidity/test/utils/Helpers.sol | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/solidity/test/utils/Helpers.sol b/solidity/test/utils/Helpers.sol index 8e0a0519..b92a301e 100644 --- a/solidity/test/utils/Helpers.sol +++ b/solidity/test/utils/Helpers.sol @@ -165,8 +165,9 @@ contract Helpers is DSTestPlus, TestConstants { vm.expectEmit(true, true, true, true, _contract); } - function _createAccessControl() internal view returns (IAccessController.AccessControl memory _accessControl) { - _accessControl = _createAccessControl(msg.sender); + function _createAccessControl() internal returns (IAccessController.AccessControl memory _accessControl) { + (, address _msgSender,) = vm.readCallers(); + _accessControl = _createAccessControl(_msgSender); } function _createAccessControl(address _user) From 7c76a8c78b86d88b9eef72318fde33c04211df1f Mon Sep 17 00:00:00 2001 From: zorzal Date: Wed, 30 Oct 2024 06:55:42 -0400 Subject: [PATCH 20/50] feat: use access control in finalize and escalate --- .../contracts/modules/dispute/BondEscalationModule.sol | 8 ++------ .../contracts/modules/dispute/RootVerificationModule.sol | 7 ++++--- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/solidity/contracts/modules/dispute/BondEscalationModule.sol b/solidity/contracts/modules/dispute/BondEscalationModule.sol index 6103d4df..65b36fc2 100644 --- a/solidity/contracts/modules/dispute/BondEscalationModule.sol +++ b/solidity/contracts/modules/dispute/BondEscalationModule.sol @@ -34,11 +34,7 @@ contract BondEscalationModule is AccessControllerModule, IBondEscalationModule { IOracle.Request calldata _request, IOracle.Response calldata _response, IOracle.Dispute calldata _dispute - ) - // review: access control? no - external - onlyOracle - { + ) external onlyOracle { bytes32 _disputeId = _getId(_dispute); RequestParameters memory _params = decodeRequestData(_request.disputeModuleData); BondEscalation storage _escalation = _escalations[_dispute.requestId]; @@ -71,7 +67,7 @@ contract BondEscalationModule is AccessControllerModule, IBondEscalationModule { _escalation.disputeId = _disputeId; emit BondEscalationStatusUpdated(_dispute.requestId, _disputeId, BondEscalationStatus.Active); } else if (_disputeId != _escalation.disputeId) { - ORACLE.escalateDispute(_request, _response, _dispute); + ORACLE.escalateDispute(_request, _response, _dispute, _defaultAccessControl()); } } diff --git a/solidity/contracts/modules/dispute/RootVerificationModule.sol b/solidity/contracts/modules/dispute/RootVerificationModule.sol index 4b205518..e79874d9 100644 --- a/solidity/contracts/modules/dispute/RootVerificationModule.sol +++ b/solidity/contracts/modules/dispute/RootVerificationModule.sol @@ -37,6 +37,7 @@ contract RootVerificationModule is AccessControllerModule, IRootVerificationModu ) external onlyOracle { RequestParameters memory _params = decodeRequestData(_request.disputeModuleData); IOracle.DisputeStatus _status = ORACLE.disputeStatus(_disputeId); + AccessControl memory _accessControl = _defaultAccessControl(); if (_status == IOracle.DisputeStatus.Won) { _params.accountingExtension.pay({ @@ -55,11 +56,11 @@ contract RootVerificationModule is AccessControllerModule, IRootVerificationModu emit DisputeStatusChanged({_disputeId: _disputeId, _dispute: _dispute, _status: IOracle.DisputeStatus.Won}); - ORACLE.proposeResponse(_request, _newResponse, _defaultAccessControl()); - ORACLE.finalize(_request, _newResponse); + ORACLE.proposeResponse(_request, _newResponse, _accessControl); + ORACLE.finalize(_request, _newResponse, _accessControl); } else { emit DisputeStatusChanged({_disputeId: _disputeId, _dispute: _dispute, _status: IOracle.DisputeStatus.Lost}); - ORACLE.finalize(_request, _response); + ORACLE.finalize(_request, _response, _accessControl); } delete _correctRoots[_dispute.requestId]; From cb76d9aa979d96d21dbcc98976f9a71737fb04ee Mon Sep 17 00:00:00 2001 From: zorzal Date: Wed, 30 Oct 2024 06:58:26 -0400 Subject: [PATCH 21/50] chore: remove unused import --- solidity/contracts/modules/response/BondedResponseModule.sol | 1 - solidity/interfaces/modules/response/IBondedResponseModule.sol | 1 - 2 files changed, 2 deletions(-) diff --git a/solidity/contracts/modules/response/BondedResponseModule.sol b/solidity/contracts/modules/response/BondedResponseModule.sol index 4d6dffbe..791a9c64 100644 --- a/solidity/contracts/modules/response/BondedResponseModule.sol +++ b/solidity/contracts/modules/response/BondedResponseModule.sol @@ -1,7 +1,6 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.19; -import {AccessController} from '@defi-wonderland/prophet-core/solidity/contracts/AccessController.sol'; import {IModule, Module} from '@defi-wonderland/prophet-core/solidity/contracts/Module.sol'; import {IOracle} from '@defi-wonderland/prophet-core/solidity/interfaces/IOracle.sol'; diff --git a/solidity/interfaces/modules/response/IBondedResponseModule.sol b/solidity/interfaces/modules/response/IBondedResponseModule.sol index aff570d8..bacb55d0 100644 --- a/solidity/interfaces/modules/response/IBondedResponseModule.sol +++ b/solidity/interfaces/modules/response/IBondedResponseModule.sol @@ -1,7 +1,6 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.19; -import {IAccessController} from '@defi-wonderland/prophet-core/solidity/interfaces/IAccessController.sol'; import {IOracle} from '@defi-wonderland/prophet-core/solidity/interfaces/IOracle.sol'; import {IResponseModule} from '@defi-wonderland/prophet-core/solidity/interfaces/modules/response/IResponseModule.sol'; import {IERC20} from '@openzeppelin/contracts/token/ERC20/IERC20.sol'; From 21cd67ec0dc7050c86757c7bc5cf64f0a98d05b9 Mon Sep 17 00:00:00 2001 From: zorzal Date: Wed, 30 Oct 2024 07:00:44 -0400 Subject: [PATCH 22/50] feat: revealVote is now external --- .../modules/resolution/PrivateERC20ResolutionModule.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/solidity/contracts/modules/resolution/PrivateERC20ResolutionModule.sol b/solidity/contracts/modules/resolution/PrivateERC20ResolutionModule.sol index 1d10881a..59ef1193 100644 --- a/solidity/contracts/modules/resolution/PrivateERC20ResolutionModule.sol +++ b/solidity/contracts/modules/resolution/PrivateERC20ResolutionModule.sol @@ -92,7 +92,7 @@ contract PrivateERC20ResolutionModule is AccessControllerModule, IPrivateERC20Re bytes32 _salt, AccessControl calldata _accessControl ) - public // review: why not external? + external hasAccess( _request.accessControlModule, _REVEAL_VOTE_TYPEHASH, From 137d27e89c253a5d992d9a233b5df1cfabe223ba Mon Sep 17 00:00:00 2001 From: zorzal Date: Wed, 30 Oct 2024 15:20:15 -0400 Subject: [PATCH 23/50] test: add access control unit test for BondEscalationModule --- .../dispute/BondEscalationModule.t.sol | 76 ++++++++++++++++++- 1 file changed, 74 insertions(+), 2 deletions(-) diff --git a/solidity/test/unit/modules/dispute/BondEscalationModule.t.sol b/solidity/test/unit/modules/dispute/BondEscalationModule.t.sol index ab38e3e5..77547275 100644 --- a/solidity/test/unit/modules/dispute/BondEscalationModule.t.sol +++ b/solidity/test/unit/modules/dispute/BondEscalationModule.t.sol @@ -5,8 +5,12 @@ import 'forge-std/Test.sol'; import {Helpers} from '../../../utils/Helpers.sol'; +import {IAccessController} from '@defi-wonderland/prophet-core/solidity/interfaces/IAccessController.sol'; import {IModule} from '@defi-wonderland/prophet-core/solidity/interfaces/IModule.sol'; + import {IOracle} from '@defi-wonderland/prophet-core/solidity/interfaces/IOracle.sol'; +import {IAccessControlModule} from + '@defi-wonderland/prophet-core/solidity/interfaces/modules/accessControl/IAccessControlModule.sol'; import {ValidatorLib} from '@defi-wonderland/prophet-core/solidity/libraries/ValidatorLib.sol'; import {IERC20} from '@openzeppelin/contracts/token/ERC20/IERC20.sol'; import {Strings} from '@openzeppelin/contracts/utils/Strings.sol'; @@ -15,12 +19,13 @@ import { BondEscalationModule, IBondEscalationModule } from '../../../../contracts/modules/dispute/BondEscalationModule.sol'; +import '../../../../contracts/utils/Typehash.sol'; import {IAccountingExtension} from '../../../../interfaces/extensions/IAccountingExtension.sol'; import {IBondEscalationAccounting} from '../../../../interfaces/extensions/IBondEscalationAccounting.sol'; - /** * @dev Harness to set an entry in the requestData mapping, without triggering setup request hooks */ + contract ForTest_BondEscalationModule is BondEscalationModule { constructor(IOracle _oracle) BondEscalationModule(_oracle) {} @@ -94,7 +99,7 @@ contract BaseTest is Test, Helpers { /** * @notice Deploy the target and mock oracle+accounting extension */ - function setUp() public { + function setUp() public virtual { oracle = IOracle(makeAddr('Oracle')); vm.etch(address(oracle), hex'069420'); @@ -1550,3 +1555,70 @@ contract BondEscalationModule_Unit_SettleBondEscalation is BaseTest { ); } } + +contract BondEscalationModule_Unit_AccessControl is BaseTest { + address _accessControlModule = makeAddr('accessControlModule'); + + function setUp() public override { + mockRequest.accessControlModule = _accessControlModule; + super.setUp(); + } + + function test_pledgeForDispute_accessControl( + address _caller, + address _user, + bytes memory _data, + IBondEscalationModule.RequestParameters memory _params + ) public assumeFuzzable(address(_params.accountingExtension)) { + vm.assume(_caller != _user); + + _params.bondSize = 1000; + _params.maxNumberOfEscalations = 3; + _params.bondEscalationDeadline = bondEscalationDeadline; + _params.tyingBuffer = 1000; + mockRequest.disputeModuleData = abi.encode(_params); + + (, IOracle.Dispute memory _dispute) = _getResponseAndDispute(oracle); + + bytes32 _requestId = _getId(mockRequest); + bytes32 _disputeId = _getId(_dispute); + + bondEscalationModule.forTest_setEscalatedDispute(_requestId, _disputeId); + + uint256 _numForPledgers = 2; + uint256 _numAgainstPledgers = _numForPledgers + 1; + _setBondEscalation(_requestId, _numForPledgers, _numAgainstPledgers); + + IAccessController.AccessControl memory _accessControl = IAccessController.AccessControl({user: _user, data: _data}); + + // Mock and expect call to access control module + vm.mockCall( + _accessControlModule, + abi.encodeCall( + IAccessControlModule.hasAccess, + ( + abi.encode( + IAccessControlModule.AccessControlParameters({ + sender: _caller, + typehash: _PLEDGE_FOR_DISPUTE_TYPEHASH, + params: abi.encode(mockRequest, _dispute), + accessControl: _accessControl + }) + ) + ) + ), + abi.encode(true) + ); + + _mockAndExpect( + address(_params.accountingExtension), + abi.encodeCall( + IBondEscalationAccounting.pledge, (_user, mockRequest, _dispute, _params.bondToken, _params.bondSize) + ), + abi.encode(true) + ); + + vm.prank(_caller); + bondEscalationModule.pledgeForDispute(mockRequest, _dispute, _accessControl); + } +} From 124764ac79ef63bac2ea9b6f4fa4f44a40c99772 Mon Sep 17 00:00:00 2001 From: zorzal Date: Wed, 30 Oct 2024 15:24:34 -0400 Subject: [PATCH 24/50] feat: add unit for access controlled function --- .../dispute/BondEscalationModule.t.sol | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/solidity/test/unit/modules/dispute/BondEscalationModule.t.sol b/solidity/test/unit/modules/dispute/BondEscalationModule.t.sol index 77547275..62a3b6ac 100644 --- a/solidity/test/unit/modules/dispute/BondEscalationModule.t.sol +++ b/solidity/test/unit/modules/dispute/BondEscalationModule.t.sol @@ -1621,4 +1621,62 @@ contract BondEscalationModule_Unit_AccessControl is BaseTest { vm.prank(_caller); bondEscalationModule.pledgeForDispute(mockRequest, _dispute, _accessControl); } + + function test_pledgeAgainstDispute_accessControl( + address _caller, + address _user, + bytes memory _data, + IBondEscalationModule.RequestParameters memory _params + ) public assumeFuzzable(address(_params.accountingExtension)) { + vm.assume(_caller != _user); + + _params.bondSize = 1000; + _params.maxNumberOfEscalations = 3; + _params.bondEscalationDeadline = bondEscalationDeadline; + _params.tyingBuffer = 1000; + mockRequest.disputeModuleData = abi.encode(_params); + + (, IOracle.Dispute memory _dispute) = _getResponseAndDispute(oracle); + bytes32 _requestId = _getId(mockRequest); + bytes32 _disputeId = _getId(_dispute); + + bondEscalationModule.forTest_setEscalatedDispute(_requestId, _disputeId); + + uint256 _numAgainstPledgers = 2; + uint256 _numForPledgers = _numAgainstPledgers + 1; + + _setBondEscalation(_requestId, _numForPledgers, _numAgainstPledgers); + + _mockAndExpect( + address(_params.accountingExtension), + abi.encodeCall( + IBondEscalationAccounting.pledge, (_user, mockRequest, _dispute, _params.bondToken, _params.bondSize) + ), + abi.encode(true) + ); + + IAccessController.AccessControl memory _accessControl = IAccessController.AccessControl({user: _user, data: _data}); + + // Mock and expect call to access control module + vm.mockCall( + _accessControlModule, + abi.encodeCall( + IAccessControlModule.hasAccess, + ( + abi.encode( + IAccessControlModule.AccessControlParameters({ + sender: _caller, + typehash: _PLEDGE_AGAINST_DISPUTE_TYPEHASH, + params: abi.encode(mockRequest, _dispute), + accessControl: _accessControl + }) + ) + ) + ), + abi.encode(true) + ); + + vm.prank(_caller); + bondEscalationModule.pledgeAgainstDispute(mockRequest, _dispute, _accessControl); + } } From dbadc596507c2fbbe88bed32ec84aba971e9febd Mon Sep 17 00:00:00 2001 From: zorzal Date: Wed, 30 Oct 2024 16:21:56 -0400 Subject: [PATCH 25/50] chore: remove comment --- solidity/contracts/modules/dispute/BondEscalationModule.sol | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/solidity/contracts/modules/dispute/BondEscalationModule.sol b/solidity/contracts/modules/dispute/BondEscalationModule.sol index 65b36fc2..bf2ce8a6 100644 --- a/solidity/contracts/modules/dispute/BondEscalationModule.sol +++ b/solidity/contracts/modules/dispute/BondEscalationModule.sol @@ -273,10 +273,7 @@ contract BondEscalationModule is AccessControllerModule, IBondEscalationModule { IOracle.Request calldata _request, IOracle.Response calldata _response, IOracle.Dispute calldata _dispute - ) - // review: access control? - external - { + ) external { (, bytes32 _disputeId) = _validateResponseAndDispute(_request, _response, _dispute); RequestParameters memory _params = decodeRequestData(_request.disputeModuleData); BondEscalation storage _escalation = _escalations[_dispute.requestId]; From eae4ea18a5a654fecde94722e5cfe3baafbfe6cc Mon Sep 17 00:00:00 2001 From: zorzal Date: Thu, 31 Oct 2024 11:27:16 -0400 Subject: [PATCH 26/50] feat: replace usage of msg.sender, instead use accessControl.user --- .../BondEscalationResolutionModule.sol | 31 ++++++++++--------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/solidity/contracts/modules/resolution/BondEscalationResolutionModule.sol b/solidity/contracts/modules/resolution/BondEscalationResolutionModule.sol index aff6c470..8c754db0 100644 --- a/solidity/contracts/modules/resolution/BondEscalationResolutionModule.sol +++ b/solidity/contracts/modules/resolution/BondEscalationResolutionModule.sol @@ -80,7 +80,7 @@ contract BondEscalationResolutionModule is AccessControllerModule, IBondEscalati _accessControl ) { - _pledge(_request, _dispute, _pledgeAmount, true); + _pledge(_request, _dispute, _pledgeAmount, true, _accessControl.user); } /// @inheritdoc IBondEscalationResolutionModule @@ -98,7 +98,7 @@ contract BondEscalationResolutionModule is AccessControllerModule, IBondEscalati _accessControl ) { - _pledge(_request, _dispute, _pledgeAmount, false); + _pledge(_request, _dispute, _pledgeAmount, false, _accessControl.user); } /// @inheritdoc IResolutionModule @@ -177,6 +177,7 @@ contract BondEscalationResolutionModule is AccessControllerModule, IBondEscalati _request: _request, _dispute: _dispute, _amountToRelease: _amountToRelease, + _pledge: _accessControl.user, _resolution: _escalation.resolution, _params: _params }); @@ -190,6 +191,7 @@ contract BondEscalationResolutionModule is AccessControllerModule, IBondEscalati _request: _request, _dispute: _dispute, _amountToRelease: _amountToRelease, + _pledge: _accessControl.user, _resolution: _escalation.resolution, _params: _params }); @@ -205,6 +207,7 @@ contract BondEscalationResolutionModule is AccessControllerModule, IBondEscalati _request: _request, _dispute: _dispute, _amountToRelease: _pledgerBalanceFor, + _pledge: _accessControl.user, _resolution: _escalation.resolution, _params: _params }); @@ -218,6 +221,7 @@ contract BondEscalationResolutionModule is AccessControllerModule, IBondEscalati _request: _request, _dispute: _dispute, _amountToRelease: _pledgerBalanceAgainst, + _pledge: _accessControl.user, _resolution: _escalation.resolution, _params: _params }); @@ -238,11 +242,9 @@ contract BondEscalationResolutionModule is AccessControllerModule, IBondEscalati IOracle.Request calldata _request, IOracle.Dispute calldata _dispute, uint256 _pledgeAmount, - bool _pledgingFor - ) - // todo: address pledger - internal - { + bool _pledgingFor, + address _pledger + ) internal { bytes32 _disputeId = _validateDispute(_request, _dispute); Escalation storage _escalation = escalations[_disputeId]; @@ -261,7 +263,7 @@ contract BondEscalationResolutionModule is AccessControllerModule, IBondEscalati } _params.accountingExtension.pledge({ - _pledger: msg.sender, + _pledger: _pledger, _request: _request, _dispute: _dispute, _token: _params.bondToken, @@ -274,16 +276,16 @@ contract BondEscalationResolutionModule is AccessControllerModule, IBondEscalati } _escalation.pledgesFor += _pledgeAmount; - pledgesForDispute[_disputeId][msg.sender] += _pledgeAmount; - emit PledgedForDispute(msg.sender, _dispute.requestId, _disputeId, _pledgeAmount); + pledgesForDispute[_disputeId][_pledger] += _pledgeAmount; + emit PledgedForDispute(_pledger, _dispute.requestId, _disputeId, _pledgeAmount); } else { if (_inequalityData.inequalityStatus == InequalityStatus.ForTurnToEqualize) { revert BondEscalationResolutionModule_ForTurnToEqualize(); } _escalation.pledgesAgainst += _pledgeAmount; - pledgesAgainstDispute[_disputeId][msg.sender] += _pledgeAmount; - emit PledgedAgainstDispute(msg.sender, _dispute.requestId, _disputeId, _pledgeAmount); + pledgesAgainstDispute[_disputeId][_pledger] += _pledgeAmount; + emit PledgedAgainstDispute(_pledger, _dispute.requestId, _disputeId, _pledgeAmount); } if (_escalation.pledgesFor + _escalation.pledgesAgainst >= _params.pledgeThreshold) { @@ -360,13 +362,14 @@ contract BondEscalationResolutionModule is AccessControllerModule, IBondEscalati IOracle.Request calldata _request, IOracle.Dispute calldata _dispute, uint256 _amountToRelease, + address _pledger, Resolution _resolution, RequestParameters memory _params ) internal { _params.accountingExtension.releasePledge({ _request: _request, _dispute: _dispute, - _pledger: msg.sender, + _pledger: _pledger, _token: _params.bondToken, _amount: _amountToRelease }); @@ -374,7 +377,7 @@ contract BondEscalationResolutionModule is AccessControllerModule, IBondEscalati emit PledgeClaimed({ _requestId: _getId(_request), _disputeId: _getId(_dispute), - _pledger: msg.sender, + _pledger: _pledger, _token: _params.bondToken, _pledgeReleased: _amountToRelease, _resolution: _resolution From 618cc36999e534ce68a011977319ec9c10522eba Mon Sep 17 00:00:00 2001 From: zorzal Date: Thu, 31 Oct 2024 11:41:31 -0400 Subject: [PATCH 27/50] refactor: rework local variables to avoid stack to deep error --- .../BondEscalationResolutionModule.sol | 50 ++++++++++--------- 1 file changed, 27 insertions(+), 23 deletions(-) diff --git a/solidity/contracts/modules/resolution/BondEscalationResolutionModule.sol b/solidity/contracts/modules/resolution/BondEscalationResolutionModule.sol index 8c754db0..19921b3d 100644 --- a/solidity/contracts/modules/resolution/BondEscalationResolutionModule.sol +++ b/solidity/contracts/modules/resolution/BondEscalationResolutionModule.sol @@ -159,39 +159,43 @@ contract BondEscalationResolutionModule is AccessControllerModule, IBondEscalati if (_escalation.resolution == Resolution.Unresolved) revert BondEscalationResolutionModule_NotResolved(); - uint256 _pledgerBalanceBefore; - uint256 _pledgerProportion; - uint256 _amountToRelease; RequestParameters memory _params = decodeRequestData(_request.resolutionModuleData); + address _pledger = _accessControl.user; + { + uint256 _pledgerBalanceBefore; uint256 _reward; if (_escalation.resolution == Resolution.DisputerWon) { - _pledgerBalanceBefore = pledgesForDispute[_disputeId][_accessControl.user]; - pledgesForDispute[_disputeId][_accessControl.user] -= _pledgerBalanceBefore; - _pledgerProportion = FixedPointMathLib.mulDivDown(_pledgerBalanceBefore, BASE, _escalation.pledgesFor); - _reward = FixedPointMathLib.mulDivDown(_escalation.pledgesAgainst, _pledgerProportion, BASE); - _amountToRelease = _reward + _pledgerBalanceBefore; + _pledgerBalanceBefore = pledgesForDispute[_disputeId][_pledger]; + pledgesForDispute[_disputeId][_pledger] -= _pledgerBalanceBefore; + _reward = FixedPointMathLib.mulDivDown( + _escalation.pledgesAgainst, + FixedPointMathLib.mulDivDown(_pledgerBalanceBefore, BASE, _escalation.pledgesFor), + BASE + ); _claimPledge({ _request: _request, _dispute: _dispute, - _amountToRelease: _amountToRelease, - _pledge: _accessControl.user, + _amountToRelease: _reward + _pledgerBalanceBefore, + _pledger: _pledger, _resolution: _escalation.resolution, _params: _params }); } else if (_escalation.resolution == Resolution.DisputerLost) { - _pledgerBalanceBefore = pledgesAgainstDispute[_disputeId][_accessControl.user]; - pledgesAgainstDispute[_disputeId][_accessControl.user] -= _pledgerBalanceBefore; - _pledgerProportion = FixedPointMathLib.mulDivDown(_pledgerBalanceBefore, BASE, _escalation.pledgesAgainst); - _reward = FixedPointMathLib.mulDivDown(_escalation.pledgesFor, _pledgerProportion, BASE); - _amountToRelease = _reward + _pledgerBalanceBefore; + _pledgerBalanceBefore = pledgesAgainstDispute[_disputeId][_pledger]; + pledgesAgainstDispute[_disputeId][_pledger] -= _pledgerBalanceBefore; + _reward = FixedPointMathLib.mulDivDown( + _escalation.pledgesFor, + FixedPointMathLib.mulDivDown(_pledgerBalanceBefore, BASE, _escalation.pledgesAgainst), + BASE + ); _claimPledge({ _request: _request, _dispute: _dispute, - _amountToRelease: _amountToRelease, - _pledge: _accessControl.user, + _amountToRelease: _reward + _pledgerBalanceBefore, + _pledger: _pledger, _resolution: _escalation.resolution, _params: _params }); @@ -200,28 +204,28 @@ contract BondEscalationResolutionModule is AccessControllerModule, IBondEscalati if (_escalation.resolution == Resolution.NoResolution) { { - uint256 _pledgerBalanceFor = pledgesForDispute[_disputeId][_accessControl.user]; + uint256 _pledgerBalanceFor = pledgesForDispute[_disputeId][_pledger]; if (_pledgerBalanceFor > 0) { - pledgesForDispute[_disputeId][_accessControl.user] -= _pledgerBalanceFor; + pledgesForDispute[_disputeId][_pledger] -= _pledgerBalanceFor; _claimPledge({ _request: _request, _dispute: _dispute, _amountToRelease: _pledgerBalanceFor, - _pledge: _accessControl.user, + _pledger: _pledger, _resolution: _escalation.resolution, _params: _params }); } } { - uint256 _pledgerBalanceAgainst = pledgesAgainstDispute[_disputeId][_accessControl.user]; + uint256 _pledgerBalanceAgainst = pledgesAgainstDispute[_disputeId][_pledger]; if (_pledgerBalanceAgainst > 0) { - pledgesAgainstDispute[_disputeId][_accessControl.user] -= _pledgerBalanceAgainst; + pledgesAgainstDispute[_disputeId][_pledger] -= _pledgerBalanceAgainst; _claimPledge({ _request: _request, _dispute: _dispute, _amountToRelease: _pledgerBalanceAgainst, - _pledge: _accessControl.user, + _pledger: _pledger, _resolution: _escalation.resolution, _params: _params }); From 28f44e94ba9bfcbd314281c0ab6c0109975a9cb1 Mon Sep 17 00:00:00 2001 From: zorzal Date: Thu, 31 Oct 2024 11:43:12 -0400 Subject: [PATCH 28/50] chore: lint --- solidity/test/integration/RequestCreation.t.sol | 1 - .../test/unit/modules/dispute/BondEscalationModule.t.sol | 6 ++++-- .../test/unit/modules/resolution/ArbitratorModule.t.sol | 8 ++------ 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/solidity/test/integration/RequestCreation.t.sol b/solidity/test/integration/RequestCreation.t.sol index 2fb7d777..629b00bc 100644 --- a/solidity/test/integration/RequestCreation.t.sol +++ b/solidity/test/integration/RequestCreation.t.sol @@ -186,7 +186,6 @@ contract Integration_RequestCreation is IntegrationBase { vm.startPrank(requester); - // review: should we specify the evm error? // Check: reverts with `EVM error`? vm.expectRevert(); oracle.createRequest(mockRequest, _ipfsHash, _createAccessControl()); diff --git a/solidity/test/unit/modules/dispute/BondEscalationModule.t.sol b/solidity/test/unit/modules/dispute/BondEscalationModule.t.sol index 62a3b6ac..e9a07c23 100644 --- a/solidity/test/unit/modules/dispute/BondEscalationModule.t.sol +++ b/solidity/test/unit/modules/dispute/BondEscalationModule.t.sol @@ -19,13 +19,15 @@ import { BondEscalationModule, IBondEscalationModule } from '../../../../contracts/modules/dispute/BondEscalationModule.sol'; -import '../../../../contracts/utils/Typehash.sol'; +import { + _PLEDGE_AGAINST_DISPUTE_TYPEHASH, _PLEDGE_FOR_DISPUTE_TYPEHASH +} from '../../../../contracts/utils/Typehash.sol'; import {IAccountingExtension} from '../../../../interfaces/extensions/IAccountingExtension.sol'; import {IBondEscalationAccounting} from '../../../../interfaces/extensions/IBondEscalationAccounting.sol'; + /** * @dev Harness to set an entry in the requestData mapping, without triggering setup request hooks */ - contract ForTest_BondEscalationModule is BondEscalationModule { constructor(IOracle _oracle) BondEscalationModule(_oracle) {} diff --git a/solidity/test/unit/modules/resolution/ArbitratorModule.t.sol b/solidity/test/unit/modules/resolution/ArbitratorModule.t.sol index 478b3620..b385bc64 100644 --- a/solidity/test/unit/modules/resolution/ArbitratorModule.t.sol +++ b/solidity/test/unit/modules/resolution/ArbitratorModule.t.sol @@ -118,9 +118,7 @@ contract ArbitratorModule_Unit_StartResolution is BaseTest { _mockAndExpect( _arbitrator, abi.encodeCall( - arbitrator.resolve, - // review - (mockRequest, mockResponse, mockDispute, _createAccessControl(address(arbitratorModule))) + arbitrator.resolve, (mockRequest, mockResponse, mockDispute, _createAccessControl(address(arbitratorModule))) ), abi.encode(bytes('')) ); @@ -143,9 +141,7 @@ contract ArbitratorModule_Unit_StartResolution is BaseTest { _mockAndExpect( _arbitrator, abi.encodeCall( - arbitrator.resolve, - // review - (mockRequest, mockResponse, mockDispute, _createAccessControl(address(arbitratorModule))) + arbitrator.resolve, (mockRequest, mockResponse, mockDispute, _createAccessControl(address(arbitratorModule))) ), abi.encode(bytes('')) ); From 5f875e464502d2fc33b5099d2c7cbdb80286d65a Mon Sep 17 00:00:00 2001 From: zorzal Date: Thu, 31 Oct 2024 12:04:44 -0400 Subject: [PATCH 29/50] chore: run linter --- .../BondEscalationResolutionModule.sol | 16 ++++++++++++++-- .../modules/dispute/BondEscalationModule.t.sol | 2 +- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/solidity/contracts/modules/resolution/BondEscalationResolutionModule.sol b/solidity/contracts/modules/resolution/BondEscalationResolutionModule.sol index 19921b3d..9c21fa1a 100644 --- a/solidity/contracts/modules/resolution/BondEscalationResolutionModule.sol +++ b/solidity/contracts/modules/resolution/BondEscalationResolutionModule.sol @@ -80,7 +80,13 @@ contract BondEscalationResolutionModule is AccessControllerModule, IBondEscalati _accessControl ) { - _pledge(_request, _dispute, _pledgeAmount, true, _accessControl.user); + _pledge({ + _request: _request, + _dispute: _dispute, + _pledgeAmount: _pledgeAmount, + _pledgingFor: true, + _pledger: _accessContro.user + }); } /// @inheritdoc IBondEscalationResolutionModule @@ -98,7 +104,13 @@ contract BondEscalationResolutionModule is AccessControllerModule, IBondEscalati _accessControl ) { - _pledge(_request, _dispute, _pledgeAmount, false, _accessControl.user); + _pledge({ + _request: _request, + _dispute: _dispute, + _pledgeAmount: _pledgeAmount, + _pledgingFor: false, + _pledger: _accessContro.user + }); } /// @inheritdoc IResolutionModule diff --git a/solidity/test/unit/modules/dispute/BondEscalationModule.t.sol b/solidity/test/unit/modules/dispute/BondEscalationModule.t.sol index e9a07c23..af4ea0ad 100644 --- a/solidity/test/unit/modules/dispute/BondEscalationModule.t.sol +++ b/solidity/test/unit/modules/dispute/BondEscalationModule.t.sol @@ -1559,7 +1559,7 @@ contract BondEscalationModule_Unit_SettleBondEscalation is BaseTest { } contract BondEscalationModule_Unit_AccessControl is BaseTest { - address _accessControlModule = makeAddr('accessControlModule'); + address internal _accessControlModule = makeAddr('accessControlModule'); function setUp() public override { mockRequest.accessControlModule = _accessControlModule; From ea1d17f16413a3ef6324fb616ed1516b60083773 Mon Sep 17 00:00:00 2001 From: zorzal Date: Fri, 1 Nov 2024 16:35:09 -0400 Subject: [PATCH 30/50] feat: declare local variable instead of using access control --- .../modules/dispute/BondEscalationModule.sol | 16 ++++++++----- .../BondEscalationResolutionModule.sol | 11 +++++---- .../resolution/ERC20ResolutionModule.sol | 23 +++++++++++-------- .../PrivateERC20ResolutionModule.sol | 17 +++++++------- 4 files changed, 39 insertions(+), 28 deletions(-) diff --git a/solidity/contracts/modules/dispute/BondEscalationModule.sol b/solidity/contracts/modules/dispute/BondEscalationModule.sol index bf2ce8a6..19200640 100644 --- a/solidity/contracts/modules/dispute/BondEscalationModule.sol +++ b/solidity/contracts/modules/dispute/BondEscalationModule.sol @@ -225,17 +225,19 @@ contract BondEscalationModule is AccessControllerModule, IBondEscalationModule { bytes32 _disputeId = _getId(_dispute); RequestParameters memory _params = _pledgeChecks(_request, _dispute, true); + address _pledger = _accessControl.user; + _escalations[_dispute.requestId].amountOfPledgesForDispute += 1; - pledgesForDispute[_dispute.requestId][_accessControl.user] += 1; + pledgesForDispute[_dispute.requestId][_pledger] += 1; _params.accountingExtension.pledge({ - _pledger: _accessControl.user, + _pledger: _pledger, _request: _request, _dispute: _dispute, _token: _params.bondToken, _amount: _params.bondSize }); - emit PledgedForDispute(_disputeId, _accessControl.user, _params.bondSize); + emit PledgedForDispute(_disputeId, _pledger, _params.bondSize); } /// @inheritdoc IBondEscalationModule @@ -255,17 +257,19 @@ contract BondEscalationModule is AccessControllerModule, IBondEscalationModule { bytes32 _disputeId = _getId(_dispute); RequestParameters memory _params = _pledgeChecks(_request, _dispute, false); + address _pledger = _accessControl.user; + _escalations[_dispute.requestId].amountOfPledgesAgainstDispute += 1; - pledgesAgainstDispute[_dispute.requestId][_accessControl.user] += 1; + pledgesAgainstDispute[_dispute.requestId][_pledger] += 1; _params.accountingExtension.pledge({ - _pledger: _accessControl.user, + _pledger: _pledger, _request: _request, _dispute: _dispute, _token: _params.bondToken, _amount: _params.bondSize }); - emit PledgedAgainstDispute(_disputeId, _accessControl.user, _params.bondSize); + emit PledgedAgainstDispute(_disputeId, _pledger, _params.bondSize); } /// @inheritdoc IBondEscalationModule diff --git a/solidity/contracts/modules/resolution/BondEscalationResolutionModule.sol b/solidity/contracts/modules/resolution/BondEscalationResolutionModule.sol index 9c21fa1a..86ee33c9 100644 --- a/solidity/contracts/modules/resolution/BondEscalationResolutionModule.sol +++ b/solidity/contracts/modules/resolution/BondEscalationResolutionModule.sol @@ -85,7 +85,7 @@ contract BondEscalationResolutionModule is AccessControllerModule, IBondEscalati _dispute: _dispute, _pledgeAmount: _pledgeAmount, _pledgingFor: true, - _pledger: _accessContro.user + _pledger: _accessControl.user }); } @@ -109,7 +109,7 @@ contract BondEscalationResolutionModule is AccessControllerModule, IBondEscalati _dispute: _dispute, _pledgeAmount: _pledgeAmount, _pledgingFor: false, - _pledger: _accessContro.user + _pledger: _accessControl.user }); } @@ -253,6 +253,7 @@ contract BondEscalationResolutionModule is AccessControllerModule, IBondEscalati * @param _dispute The dispute to vote for or against * @param _pledgeAmount The amount to pledge * @param _pledgingFor Whether the pledger is pledging for or against the dispute + * @param _pledger The address of the pledger */ function _pledge( IOracle.Request calldata _request, @@ -269,9 +270,11 @@ contract BondEscalationResolutionModule is AccessControllerModule, IBondEscalati InequalityData storage _inequalityData = inequalityData[_disputeId]; RequestParameters memory _params = decodeRequestData(_request.resolutionModuleData); - uint256 _pledgingDeadline = _escalation.startTime + _params.timeUntilDeadline; + // uint256 _pledgingDeadline = _escalation.startTime + _params.timeUntilDeadline; - if (block.timestamp >= _pledgingDeadline) revert BondEscalationResolutionModule_PledgingPhaseOver(); + if (block.timestamp >= _escalation.startTime + _params.timeUntilDeadline) { + revert BondEscalationResolutionModule_PledgingPhaseOver(); + } // Revert if the inequality timer has passed if (_inequalityData.time != 0 && block.timestamp >= _inequalityData.time + _params.timeToBreakInequality) { diff --git a/solidity/contracts/modules/resolution/ERC20ResolutionModule.sol b/solidity/contracts/modules/resolution/ERC20ResolutionModule.sol index 41489c00..ebbb46a7 100644 --- a/solidity/contracts/modules/resolution/ERC20ResolutionModule.sol +++ b/solidity/contracts/modules/resolution/ERC20ResolutionModule.sol @@ -75,16 +75,19 @@ contract ERC20ResolutionModule is AccessControllerModule, IERC20ResolutionModule } RequestParameters memory _params = decodeRequestData(_request.resolutionModuleData); - uint256 _deadline = _escalation.startTime + _params.timeUntilDeadline; - if (block.timestamp >= _deadline) revert ERC20ResolutionModule_VotingPhaseOver(); + if (block.timestamp >= _escalation.startTime + _params.timeUntilDeadline) { + revert ERC20ResolutionModule_VotingPhaseOver(); + } - votes[_disputeId][_accessControl.user] += _numberOfVotes; + address _voter = _accessControl.user; - _voters[_disputeId].add(_accessControl.user); + votes[_disputeId][_voter] += _numberOfVotes; + + _voters[_disputeId].add(_voter); escalations[_disputeId].totalVotes += _numberOfVotes; - _params.accountingExtension.bond(_accessControl.user, _dispute.requestId, _params.votingToken, _numberOfVotes); - emit VoteCast(_accessControl.user, _disputeId, _numberOfVotes); + _params.accountingExtension.bond(_voter, _dispute.requestId, _params.votingToken, _numberOfVotes); + emit VoteCast(_voter, _disputeId, _numberOfVotes); } /// @inheritdoc IERC20ResolutionModule @@ -146,12 +149,12 @@ contract ERC20ResolutionModule is AccessControllerModule, IERC20ResolutionModule RequestParameters memory _params = decodeRequestData(_request.resolutionModuleData); uint256 _deadline = _escalation.startTime + _params.timeUntilDeadline; if (block.timestamp < _deadline) revert ERC20ResolutionModule_OnGoingVotingPhase(); - + address _voter = _accessControl.user; // Transfer the tokens back to the voter - uint256 _amount = votes[_disputeId][_accessControl.user]; - _params.accountingExtension.release(_accessControl.user, _dispute.requestId, _params.votingToken, _amount); + uint256 _amount = votes[_disputeId][_voter]; + _params.accountingExtension.release(_voter, _dispute.requestId, _params.votingToken, _amount); - emit VoteClaimed(_accessControl.user, _disputeId, _amount); + emit VoteClaimed(_voter, _disputeId, _amount); } /// @inheritdoc IERC20ResolutionModule diff --git a/solidity/contracts/modules/resolution/PrivateERC20ResolutionModule.sol b/solidity/contracts/modules/resolution/PrivateERC20ResolutionModule.sol index 59ef1193..7dd0a173 100644 --- a/solidity/contracts/modules/resolution/PrivateERC20ResolutionModule.sol +++ b/solidity/contracts/modules/resolution/PrivateERC20ResolutionModule.sol @@ -77,11 +77,11 @@ contract PrivateERC20ResolutionModule is AccessControllerModule, IPrivateERC20Re RequestParameters memory _params = decodeRequestData(_request.resolutionModuleData); uint256 _committingDeadline = _startTime + _params.committingTimeWindow; if (block.timestamp >= _committingDeadline) revert PrivateERC20ResolutionModule_CommittingPhaseOver(); - + address _voter = _accessControl.user; if (_commitment == bytes32('')) revert PrivateERC20ResolutionModule_EmptyCommitment(); - _votersData[_disputeId][msg.sender] = VoterData({numOfVotes: 0, commitment: _commitment}); + _votersData[_disputeId][_voter] = VoterData({numOfVotes: 0, commitment: _commitment}); - emit VoteCommitted(msg.sender, _disputeId, _commitment); + emit VoteCommitted(_voter, _disputeId, _commitment); } /// @inheritdoc IPrivateERC20ResolutionModule @@ -111,21 +111,22 @@ contract PrivateERC20ResolutionModule is AccessControllerModule, IPrivateERC20Re if (block.timestamp > _escalation.startTime + _params.committingTimeWindow + _params.revealingTimeWindow) { revert PrivateERC20ResolutionModule_RevealingPhaseOver(); } + address _voter = _accessControl.user; - VoterData storage _voterData = _votersData[_disputeId][_accessControl.user]; + VoterData storage _voterData = _votersData[_disputeId][_voter]; - if (_voterData.commitment != keccak256(abi.encode(_accessControl.user, _disputeId, _numberOfVotes, _salt))) { + if (_voterData.commitment != keccak256(abi.encode(_voter, _disputeId, _numberOfVotes, _salt))) { revert PrivateERC20ResolutionModule_WrongRevealData(); } _voterData.numOfVotes = _numberOfVotes; _voterData.commitment = bytes32(''); - _voters[_disputeId].add(_accessControl.user); + _voters[_disputeId].add(_voter); escalations[_disputeId].totalVotes += _numberOfVotes; - _params.votingToken.safeTransferFrom(_accessControl.user, address(this), _numberOfVotes); + _params.votingToken.safeTransferFrom(_voter, address(this), _numberOfVotes); - emit VoteRevealed(_accessControl.user, _disputeId, _numberOfVotes); + emit VoteRevealed(_voter, _disputeId, _numberOfVotes); } /// @inheritdoc IPrivateERC20ResolutionModule From d526ff95df5d7817f5730db93a3898fa78a0ad58 Mon Sep 17 00:00:00 2001 From: zorzal Date: Sat, 2 Nov 2024 08:49:06 -0400 Subject: [PATCH 31/50] feat: update circuit resolve module --- .../modules/dispute/CircuitResolverModule.sol | 15 +++-- .../dispute/CircuitResolverModule.t.sol | 58 ++++++------------- 2 files changed, 26 insertions(+), 47 deletions(-) diff --git a/solidity/contracts/modules/dispute/CircuitResolverModule.sol b/solidity/contracts/modules/dispute/CircuitResolverModule.sol index e4c955d9..80b6894a 100644 --- a/solidity/contracts/modules/dispute/CircuitResolverModule.sol +++ b/solidity/contracts/modules/dispute/CircuitResolverModule.sol @@ -7,11 +7,13 @@ import {IOracle} from '@defi-wonderland/prophet-core/solidity/interfaces/IOracle import {IProphetVerifier} from '../../../interfaces/IProphetVerifier.sol'; import {ICircuitResolverModule} from '../../../interfaces/modules/dispute/ICircuitResolverModule.sol'; -contract CircuitResolverModule is Module, ICircuitResolverModule { +import {AccessControllerModule} from '../accessControl/AccessControllerModule.sol'; + +contract CircuitResolverModule is AccessControllerModule, ICircuitResolverModule { /// @notice Keeps track of the correct responses to requests mapping(bytes32 _requestId => bytes _correctResponse) internal _correctResponses; - constructor(IOracle _oracle) Module(_oracle) {} + constructor(IOracle _oracle) AccessControllerModule(_oracle) {} /// @inheritdoc IModule function moduleName() external pure returns (string memory _moduleName) { @@ -32,6 +34,7 @@ contract CircuitResolverModule is Module, ICircuitResolverModule { ) external onlyOracle { RequestParameters memory _params = decodeRequestData(_request.disputeModuleData); IOracle.DisputeStatus _status = ORACLE.disputeStatus(_disputeId); + AccessControl memory _accessControl = _defaultAccessControl(); if (_status == IOracle.DisputeStatus.Won) { _params.accountingExtension.pay({ @@ -50,12 +53,12 @@ contract CircuitResolverModule is Module, ICircuitResolverModule { emit DisputeStatusChanged({_disputeId: _disputeId, _dispute: _dispute, _status: IOracle.DisputeStatus.Won}); - ORACLE.proposeResponse(_request, _newResponse); - ORACLE.finalize(_request, _newResponse); + ORACLE.proposeResponse(_request, _newResponse, _accessControl); + ORACLE.finalize(_request, _newResponse, _accessControl); } else { emit DisputeStatusChanged({_disputeId: _disputeId, _dispute: _dispute, _status: IOracle.DisputeStatus.Lost}); - ORACLE.finalize(_request, _response); + ORACLE.finalize(_request, _response, _accessControl); } delete _correctResponses[_dispute.requestId]; @@ -88,7 +91,7 @@ contract CircuitResolverModule is Module, ICircuitResolverModule { _dispute: _dispute }); - ORACLE.updateDisputeStatus(_request, _response, _dispute, _status); + ORACLE.updateDisputeStatus({_request: _request, _response: _response, _dispute: _dispute, _status: _status}); } /// @inheritdoc IModule diff --git a/solidity/test/unit/modules/dispute/CircuitResolverModule.t.sol b/solidity/test/unit/modules/dispute/CircuitResolverModule.t.sol index 691b87d7..144a5e2d 100644 --- a/solidity/test/unit/modules/dispute/CircuitResolverModule.t.sol +++ b/solidity/test/unit/modules/dispute/CircuitResolverModule.t.sol @@ -159,19 +159,7 @@ contract CircuitResolverModule_Unit_DisputeResponse is BaseTest { // Mock and expect the call the oracle, updating the dispute's status _mockAndExpect( address(oracle), - abi.encodeCall( - IOracle.updateDisputeStatus, - ( - mockRequest, - mockResponse, - mockDispute, - IOracle.DisputeStatus.Won, - _createAccessControl(address(circuitResolverModule)) - ) - ), - // abi.encodeWithSelector( - // oracle.updateDisputeStatus.selector, - // ), + abi.encodeCall(IOracle.updateDisputeStatus, (mockRequest, mockResponse, mockDispute, IOracle.DisputeStatus.Won)), abi.encode(true) ); @@ -211,19 +199,7 @@ contract CircuitResolverModule_Unit_DisputeResponse is BaseTest { // Mock and expect the call the oracle, updating the dispute's status _mockAndExpect( address(oracle), - // abi.encodeWithSelector( - // oracle.updateDisputeStatus.selector, mockRequest, mockResponse, mockDispute, IOracle.DisputeStatus.Won - // ), - abi.encodeCall( - IOracle.updateDisputeStatus, - ( - mockRequest, - mockResponse, - mockDispute, - IOracle.DisputeStatus.Won, - _createAccessControl(address(circuitResolverModule)) - ) - ), + abi.encodeCall(IOracle.updateDisputeStatus, (mockRequest, mockResponse, mockDispute, IOracle.DisputeStatus.Won)), abi.encode(true) ); @@ -274,19 +250,7 @@ contract CircuitResolverModule_Unit_DisputeResponse is BaseTest { // Mock and expect the call the oracle, updating the dispute's status _mockAndExpect( address(oracle), - abi.encodeCall( - IOracle.updateDisputeStatus, - ( - mockRequest, - mockResponse, - mockDispute, - IOracle.DisputeStatus.Lost, - _createAccessControl(address(circuitResolverModule)) - ) - ), - // abi.encodeWithSelector( - // oracle.updateDisputeStatus.selector, mockRequest, mockResponse, mockDispute, IOracle.DisputeStatus.Lost - // ), + abi.encodeCall(IOracle.updateDisputeStatus, (mockRequest, mockResponse, mockDispute, IOracle.DisputeStatus.Lost)), abi.encode(true) ); @@ -344,7 +308,13 @@ contract CircuitResolverModule_Unit_OnDisputeStatusChange is BaseTest { _mockAndExpect(address(oracle), abi.encodeCall(IOracle.disputeStatus, (_disputeId)), abi.encode(_status)); // Mock and expect the call to the oracle, finalizing the request - _mockAndExpect(address(oracle), abi.encodeCall(IOracle.finalize, (mockRequest, mockResponse)), abi.encode()); + _mockAndExpect( + address(oracle), + abi.encodeCall( + IOracle.finalize, (mockRequest, mockResponse, _createAccessControl(address(circuitResolverModule))) + ), + abi.encode() + ); // Check: is the event emitted? vm.expectEmit(true, true, true, true, address(circuitResolverModule)); @@ -414,7 +384,13 @@ contract CircuitResolverModule_Unit_OnDisputeStatusChange is BaseTest { ); // Mock and expect the call to the accounting extension, paying the disputer - _mockAndExpect(address(oracle), abi.encodeCall(IOracle.finalize, (mockRequest, _newResponse)), abi.encode()); + _mockAndExpect( + address(oracle), + abi.encodeCall( + IOracle.finalize, (mockRequest, _newResponse, _createAccessControl(address(circuitResolverModule))) + ), + abi.encode() + ); vm.prank(address(oracle)); circuitResolverModule.onDisputeStatusChange(_disputeId, mockRequest, mockResponse, mockDispute); From b99f8c1fc2f685e10e96ed0464884428dea4bf7d Mon Sep 17 00:00:00 2001 From: zorzal Date: Mon, 4 Nov 2024 05:41:37 -0500 Subject: [PATCH 32/50] feat: add another defaultAccessControl fn --- .../accessControl/AccessControllerModule.sol | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/solidity/contracts/modules/accessControl/AccessControllerModule.sol b/solidity/contracts/modules/accessControl/AccessControllerModule.sol index ce38f7fb..4a6e0b9a 100644 --- a/solidity/contracts/modules/accessControl/AccessControllerModule.sol +++ b/solidity/contracts/modules/accessControl/AccessControllerModule.sol @@ -10,12 +10,22 @@ abstract contract AccessControllerModule is AccessController, Module { /** * // todo: update name to _selfAccessControl - * @notice Returns an access control object using the contract address as user + * @notice Returns an access control object using the contract address as user, and empty data * * @dev should only be used by modules as the self-access-control object * @return _accessControl The self access control for this contract. */ function _defaultAccessControl() internal view returns (AccessControl memory _accessControl) { - _accessControl = AccessControl({user: address(this), data: bytes('')}); + _accessControl = _defaultAccessControl(bytes('')); + } + + /** + * @notice Returns an access control object using the contract address as user and the given data + * @dev should only be used by modules as the self-access-control object + * @param _data Arbitrary data + * @return _accessControl The self access control for this contract. + */ + function _defaultAccessControl(bytes calldata _data) internal view returns (AccessControl memory _accessControl) { + _accessControl = AccessControl({user: address(this), data: _data}); } } From 5fa2a043f78bd0d33dd6976f47f9436cc1fb9a80 Mon Sep 17 00:00:00 2001 From: zorzal Date: Mon, 4 Nov 2024 05:42:32 -0500 Subject: [PATCH 33/50] docs: review the _isModule check --- solidity/contracts/modules/response/BondedResponseModule.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/solidity/contracts/modules/response/BondedResponseModule.sol b/solidity/contracts/modules/response/BondedResponseModule.sol index 791a9c64..7d973a0f 100644 --- a/solidity/contracts/modules/response/BondedResponseModule.sol +++ b/solidity/contracts/modules/response/BondedResponseModule.sol @@ -75,6 +75,7 @@ contract BondedResponseModule is AccessControllerModule, IBondedResponseModule { ) external override(IBondedResponseModule, Module) onlyOracle { RequestParameters memory _params = decodeRequestData(_request.responseModuleData); + // review: _finalizer is Oracle:finalize's accessControl.user bool _isModule = ORACLE.allowedModule(_response.requestId, _finalizer); if (!_isModule && block.timestamp < ORACLE.requestCreatedAt(_response.requestId) + _params.deadline) { From f65effdbba6a78a81adda81f3d78c9fe0479cd00 Mon Sep 17 00:00:00 2001 From: zorzal Date: Mon, 4 Nov 2024 05:43:21 -0500 Subject: [PATCH 34/50] test: add vm.skip(false) in a few tests to revisit them later --- .../resolution/BondEscalationResolutionModule.t.sol | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/solidity/test/unit/modules/resolution/BondEscalationResolutionModule.t.sol b/solidity/test/unit/modules/resolution/BondEscalationResolutionModule.t.sol index 4bee84d3..3570c120 100644 --- a/solidity/test/unit/modules/resolution/BondEscalationResolutionModule.t.sol +++ b/solidity/test/unit/modules/resolution/BondEscalationResolutionModule.t.sol @@ -342,6 +342,7 @@ contract BondEscalationResolutionModule_Unit_PledgeForDispute is BaseTest { uint256 _pledgeAmount, IBondEscalationResolutionModule.RequestParameters memory _params ) public assumeFuzzable(address(_params.accountingExtension)) { + vm.skip(false); vm.assume(_pledgeAmount < type(uint256).max - 1000); // _pledgeThreshold > _updatedTotalVotes; @@ -394,6 +395,7 @@ contract BondEscalationResolutionModule_Unit_PledgeForDispute is BaseTest { * @notice Testing _forPercentageDifference >= _scaledPercentageDiffAsInt */ function test_changesStatusIfForSideIsWinning(uint256 _pledgeAmount) public { + vm.skip(false); _pledgeAmount = bound(_pledgeAmount, 1, type(uint192).max); // I'm setting the values so that the percentage diff is 20% in favor of pledgesFor. @@ -444,6 +446,7 @@ contract BondEscalationResolutionModule_Unit_PledgeForDispute is BaseTest { * @notice Testing _againstPercentageDifference >= _scaledPercentageDiffAsInt */ function test_changesStatusIfAgainstSideIsWinning(uint256 _pledgeAmount) public { + vm.skip(false); _pledgeAmount = bound(_pledgeAmount, 1, type(uint192).max); // Making the against percentage 60% of the total as percentageDiff is 20% @@ -495,6 +498,7 @@ contract BondEscalationResolutionModule_Unit_PledgeForDispute is BaseTest { * @notice Testing _status == forTurnToEqualize && both diffs < percentageDiff */ function test_changesStatusIfSidesAreEqual(uint256 _pledgeAmount) public { + vm.skip(false); _pledgeAmount = bound(_pledgeAmount, 1, type(uint192).max); // Making both the same so the percentage diff is not reached @@ -679,6 +683,7 @@ contract BondEscalationResolutionModule_Unit_PledgeAgainstDispute is BaseTest { * @notice Testing _againstPercentageDifference >= _scaledPercentageDiffAsInt */ function test_changesStatusIfAgainstSideIsWinning(uint256 _pledgeAmount) public { + vm.skip(false); _pledgeAmount = bound(_pledgeAmount, 1, type(uint192).max); // I'm setting the values so that the percentage diff is 20% in favor of pledgesAgainst. @@ -729,6 +734,7 @@ contract BondEscalationResolutionModule_Unit_PledgeAgainstDispute is BaseTest { * @notice Testing _forPercentageDifference >= _scaledPercentageDiffAsInt */ function test_changesStatusIfForSideIsWinning(uint256 _pledgeAmount) public { + vm.skip(false); _pledgeAmount = bound(_pledgeAmount, 1, type(uint192).max); // Making the against percentage 60% of the total as percentageDiff is 20% @@ -780,6 +786,8 @@ contract BondEscalationResolutionModule_Unit_PledgeAgainstDispute is BaseTest { * @notice Testing _status == againstTurnToEqualize && both diffs < percentageDiff */ function test_changesStatusIfSidesAreEqual(uint256 _pledgeAmount) public { + vm.skip(false); + _pledgeAmount = bound(_pledgeAmount, 1, type(uint192).max); // Making both the same so the percentage diff is not reached From cb2a55837d2014a028745ab47eea8c1ab235cb0f Mon Sep 17 00:00:00 2001 From: zorzal Date: Mon, 4 Nov 2024 10:19:07 -0500 Subject: [PATCH 35/50] feat: update calldata for memory --- .../accessControl/AccessControllerModule.sol | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/solidity/contracts/modules/accessControl/AccessControllerModule.sol b/solidity/contracts/modules/accessControl/AccessControllerModule.sol index 4a6e0b9a..ad2a7fde 100644 --- a/solidity/contracts/modules/accessControl/AccessControllerModule.sol +++ b/solidity/contracts/modules/accessControl/AccessControllerModule.sol @@ -9,23 +9,23 @@ abstract contract AccessControllerModule is AccessController, Module { constructor(IOracle _oracle) Module(_oracle) {} /** - * // todo: update name to _selfAccessControl - * @notice Returns an access control object using the contract address as user, and empty data - * + * @notice Returns an access control object using the contract address as user and the given data * @dev should only be used by modules as the self-access-control object + * @param _data Arbitrary data * @return _accessControl The self access control for this contract. */ - function _defaultAccessControl() internal view returns (AccessControl memory _accessControl) { - _accessControl = _defaultAccessControl(bytes('')); + function _defaultAccessControl(bytes memory _data) internal view returns (AccessControl memory _accessControl) { + _accessControl = AccessControl({user: address(this), data: _data}); } /** - * @notice Returns an access control object using the contract address as user and the given data + * // todo: update name to _selfAccessControl + * @notice Returns an access control object using the contract address as user, and empty data + * * @dev should only be used by modules as the self-access-control object - * @param _data Arbitrary data * @return _accessControl The self access control for this contract. */ - function _defaultAccessControl(bytes calldata _data) internal view returns (AccessControl memory _accessControl) { - _accessControl = AccessControl({user: address(this), data: _data}); + function _defaultAccessControl() internal view returns (AccessControl memory _accessControl) { + _accessControl = _defaultAccessControl(bytes('')); } } From ff81b355079e88a1320ffc72065d6a299118bf97 Mon Sep 17 00:00:00 2001 From: zorzal Date: Mon, 4 Nov 2024 10:20:25 -0500 Subject: [PATCH 36/50] test: resolveDispute now uses access control --- solidity/test/integration/Arbitration.t.sol | 26 +++++++++---------- .../test/integration/BondEscalation.t.sol | 6 ++--- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/solidity/test/integration/Arbitration.t.sol b/solidity/test/integration/Arbitration.t.sol index ee96663b..530d66ba 100644 --- a/solidity/test/integration/Arbitration.t.sol +++ b/solidity/test/integration/Arbitration.t.sol @@ -32,7 +32,7 @@ contract Integration_Arbitration is IntegrationBase { // Second step: resolving the dispute vm.prank(disputer); - oracle.resolveDispute(mockRequest, mockResponse, mockDispute); + oracle.resolveDispute(mockRequest, mockResponse, mockDispute, _createAccessControl()); // Check: is the dispute status resolved after calling resolve? assertEq(uint256(_arbitratorModule.getStatus(_disputeId)), uint256(IArbitratorModule.ArbitrationStatus.Resolved)); @@ -97,7 +97,7 @@ contract Integration_Arbitration is IntegrationBase { // Second step: resolving the dispute vm.prank(disputer); - oracle.resolveDispute(mockRequest, mockResponse, mockDispute); + oracle.resolveDispute(mockRequest, mockResponse, mockDispute, _createAccessControl()); // Check: is the dispute status resolved after calling resolve? assertEq(uint256(_arbitratorModule.getStatus(_disputeId)), uint256(IArbitratorModule.ArbitrationStatus.Resolved)); @@ -132,20 +132,20 @@ contract Integration_Arbitration is IntegrationBase { vm.prank(disputer); oracle.escalateDispute(mockRequest, mockResponse, mockDispute, _createAccessControl(disputer)); - // Check: is the dispute status resolved after calling escalate? - assertEq(uint256(_arbitratorModule.getStatus(_disputeId)), uint256(IArbitratorModule.ArbitrationStatus.Resolved)); + // // Check: is the dispute status resolved after calling escalate? + // assertEq(uint256(_arbitratorModule.getStatus(_disputeId)), uint256(IArbitratorModule.ArbitrationStatus.Resolved)); - IOracle.DisputeStatus _disputeStatus = oracle.disputeStatus(_disputeId); - // Check: is the dispute updated as lost? - assertEq(uint256(_disputeStatus), uint256(IOracle.DisputeStatus.Lost)); + // IOracle.DisputeStatus _disputeStatus = oracle.disputeStatus(_disputeId); + // // Check: is the dispute updated as lost? + // assertEq(uint256(_disputeStatus), uint256(IOracle.DisputeStatus.Lost)); - // Check: does the disputer receive the disputer's bond? - uint256 _proposerBalance = _accountingExtension.balanceOf(proposer, usdc); - assertEq(_proposerBalance, _expectedBondSize * 2); + // // Check: does the disputer receive the disputer's bond? + // uint256 _proposerBalance = _accountingExtension.balanceOf(proposer, usdc); + // assertEq(_proposerBalance, _expectedBondSize * 2); - // Check: does the disputer get its bond slashed? - uint256 _disputerBondedAmount = _accountingExtension.bondedAmountOf(disputer, usdc, _getId(mockRequest)); - assertEq(_disputerBondedAmount, 0); + // // Check: does the disputer get its bond slashed? + // uint256 _disputerBondedAmount = _accountingExtension.bondedAmountOf(disputer, usdc, _getId(mockRequest)); + // assertEq(_disputerBondedAmount, 0); } function _setArbitrator(address _arbitrator) internal { diff --git a/solidity/test/integration/BondEscalation.t.sol b/solidity/test/integration/BondEscalation.t.sol index 98a7dd5c..190510fb 100644 --- a/solidity/test/integration/BondEscalation.t.sol +++ b/solidity/test/integration/BondEscalation.t.sol @@ -285,7 +285,7 @@ contract Integration_BondEscalation is IntegrationBase { // So Another proposer gets paid Disputer's bond vm.warp(block.timestamp + _expectedDeadline + 2 days); _mockArbitrator.setAnswer(IOracle.DisputeStatus.Lost); - oracle.resolveDispute(mockRequest, _secondResponse, _secondDispute); + oracle.resolveDispute(mockRequest, _secondResponse, _secondDispute, _createAccessControl(address(this))); // Test: The requester still has nothing assertEq(_bondEscalationAccounting.balanceOf(requester, usdc), 0, 'Mismatch: Requester balance'); @@ -362,7 +362,7 @@ contract Integration_BondEscalation is IntegrationBase { // Step 9: After some time, the resolution module deems Disputer's dispute as correct _mineBlocks(100); - oracle.resolveDispute(mockRequest, mockResponse, mockDispute); + oracle.resolveDispute(mockRequest, mockResponse, mockDispute, _createAccessControl(address(this))); IOracle.DisputeStatus _disputeStatus = oracle.disputeStatus(_disputeId); assertEq(uint256(_disputeStatus), uint256(IOracle.DisputeStatus.Won), 'Mismatch: Dispute status'); @@ -432,7 +432,7 @@ contract Integration_BondEscalation is IntegrationBase { vm.prank(_escalator); oracle.escalateDispute(mockRequest, mockResponse, mockDispute, _createAccessControl(_escalator)); vm.prank(_resolver); - oracle.resolveDispute(mockRequest, mockResponse, mockDispute); + oracle.resolveDispute(mockRequest, mockResponse, mockDispute, _createAccessControl()); IOracle.DisputeStatus _disputeStatus = oracle.disputeStatus(_disputeId); assertEq(uint256(_disputeStatus), uint256(IOracle.DisputeStatus.Won), 'Mismatch: Dispute status'); From f0b77fb0dd0122aeabd8d8ff6c5c766f1d0652d1 Mon Sep 17 00:00:00 2001 From: zorzal Date: Mon, 4 Nov 2024 10:20:39 -0500 Subject: [PATCH 37/50] feat: resolveDispute in MockAtomicArbitrator --- solidity/test/mocks/MockAtomicArbitrator.sol | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/solidity/test/mocks/MockAtomicArbitrator.sol b/solidity/test/mocks/MockAtomicArbitrator.sol index ec47dc96..9606f612 100644 --- a/solidity/test/mocks/MockAtomicArbitrator.sol +++ b/solidity/test/mocks/MockAtomicArbitrator.sol @@ -17,11 +17,13 @@ contract MockAtomicArbitrator is IArbitrator { IOracle.Request memory _request, IOracle.Response memory _response, IOracle.Dispute memory _dispute, + // review: why access control here? IAccessController.AccessControl memory _accessControl ) external returns (bytes memory _result) { _result = new bytes(0); answer = IOracle.DisputeStatus.Won; - oracle.resolveDispute(_request, _response, _dispute); + // review: really not sure about this change + oracle.resolveDispute(_request, _response, _dispute, IAccessController.AccessControl(address(this), bytes(''))); } function getAnswer(bytes32 /* _dispute */ ) external view returns (IOracle.DisputeStatus _answer) { From cf061e22c479b9ab2b883643b95b7939b7e2ef5b Mon Sep 17 00:00:00 2001 From: zorzal Date: Mon, 4 Nov 2024 12:25:13 -0500 Subject: [PATCH 38/50] chore: fix conflict --- solidity/test/integration/ContractCallRequest.t.sol | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/solidity/test/integration/ContractCallRequest.t.sol b/solidity/test/integration/ContractCallRequest.t.sol index 05171980..42479947 100644 --- a/solidity/test/integration/ContractCallRequest.t.sol +++ b/solidity/test/integration/ContractCallRequest.t.sol @@ -47,6 +47,7 @@ contract Integration_ContractCallRequest is IntegrationBase { function test_createRequest_finalizeEmptyResponse() public { vm.prank(requester); bytes32 _requestId = oracle.createRequest(mockRequest, _ipfsHash, _createAccessControl()); + uint256 _requestCreatedAt = oracle.requestCreatedAt(_requestId); // mock an empty response mockResponse = @@ -58,7 +59,10 @@ contract Integration_ContractCallRequest is IntegrationBase { abi.encodeCall(IAccountingExtension.release, (mockRequest.requester, _requestId, usdc, _expectedReward)) ); - vm.warp(block.timestamp + 2 days); + // assert response does not exist + assertEq(oracle.responseCreatedAt(_getId(mockResponse)), 0); + + vm.warp(_requestCreatedAt + _expectedDeadline); vm.prank(_finalizer); oracle.finalize(mockRequest, mockResponse, _createAccessControl()); } From 879dc9dbefda760ed03cfa575fac65e7b9775b26 Mon Sep 17 00:00:00 2001 From: zorzal Date: Mon, 4 Nov 2024 13:14:23 -0500 Subject: [PATCH 39/50] chore: update prophet-core to canary release --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3a191166..3b374eeb 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "package.json": "sort-package-json" }, "dependencies": { - "@defi-wonderland/prophet-core": "0.0.0-4d28a0ec", + "@defi-wonderland/prophet-core": "0.0.0-3afab791", "@openzeppelin/contracts": "4.9.5", "solmate": "https://github.com/transmissions11/solmate.git#bfc9c25865a274a7827fea5abf6e4fb64fc64e6c" }, From 0f5367f666905730f7e975902bcef3102cdf6e09 Mon Sep 17 00:00:00 2001 From: zorzal Date: Mon, 4 Nov 2024 13:15:19 -0500 Subject: [PATCH 40/50] chore: update yarn.lock --- yarn.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/yarn.lock b/yarn.lock index a8aee5fa..e9f077bd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -193,10 +193,10 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" -"@defi-wonderland/prophet-core@0.0.0-4d28a0ec": - version "0.0.0-4d28a0ec" - resolved "https://registry.yarnpkg.com/@defi-wonderland/prophet-core/-/prophet-core-0.0.0-4d28a0ec.tgz#228896bb7b9b239c6c25b4deefa8b204d87d7118" - integrity sha512-BF+gSf+nZWNByr9V2/eUvdt7zHlScP0hF47L+grlllMHRadm8T7Eboo6jpIHOgMpLkfNAEVsOyg2vfvgABzACQ== +"@defi-wonderland/prophet-core@0.0.0-3afab791": + version "0.0.0-3afab791" + resolved "https://registry.yarnpkg.com/@defi-wonderland/prophet-core/-/prophet-core-0.0.0-3afab791.tgz#e9e40fabf2ae50b1edbfca806d4159b29b64daec" + integrity sha512-0zvdUCehT2yMDzRPG60XUlMIwSESxeVqaWwVswnDlr3G4ISYhFl1kZvg4fShJTbB9pu9G9tfj19/zFXt0BFaHw== "@defi-wonderland/solidity-utils@0.0.0-3e9c8e8b": version "0.0.0-3e9c8e8b" From 71c6b112dc6d2f7fdd168a91f16367595c94c04e Mon Sep 17 00:00:00 2001 From: zorzal Date: Tue, 5 Nov 2024 13:18:36 -0500 Subject: [PATCH 41/50] chore: remove commented line, uncomment snippet --- .../BondEscalationResolutionModule.sol | 2 -- solidity/test/integration/Arbitration.t.sol | 22 +++++++++---------- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/solidity/contracts/modules/resolution/BondEscalationResolutionModule.sol b/solidity/contracts/modules/resolution/BondEscalationResolutionModule.sol index 86ee33c9..661a0c6c 100644 --- a/solidity/contracts/modules/resolution/BondEscalationResolutionModule.sol +++ b/solidity/contracts/modules/resolution/BondEscalationResolutionModule.sol @@ -270,8 +270,6 @@ contract BondEscalationResolutionModule is AccessControllerModule, IBondEscalati InequalityData storage _inequalityData = inequalityData[_disputeId]; RequestParameters memory _params = decodeRequestData(_request.resolutionModuleData); - // uint256 _pledgingDeadline = _escalation.startTime + _params.timeUntilDeadline; - if (block.timestamp >= _escalation.startTime + _params.timeUntilDeadline) { revert BondEscalationResolutionModule_PledgingPhaseOver(); } diff --git a/solidity/test/integration/Arbitration.t.sol b/solidity/test/integration/Arbitration.t.sol index 530d66ba..fc48ba9e 100644 --- a/solidity/test/integration/Arbitration.t.sol +++ b/solidity/test/integration/Arbitration.t.sol @@ -132,20 +132,20 @@ contract Integration_Arbitration is IntegrationBase { vm.prank(disputer); oracle.escalateDispute(mockRequest, mockResponse, mockDispute, _createAccessControl(disputer)); - // // Check: is the dispute status resolved after calling escalate? - // assertEq(uint256(_arbitratorModule.getStatus(_disputeId)), uint256(IArbitratorModule.ArbitrationStatus.Resolved)); + // Check: is the dispute status resolved after calling escalate? + assertEq(uint256(_arbitratorModule.getStatus(_disputeId)), uint256(IArbitratorModule.ArbitrationStatus.Resolved)); - // IOracle.DisputeStatus _disputeStatus = oracle.disputeStatus(_disputeId); - // // Check: is the dispute updated as lost? - // assertEq(uint256(_disputeStatus), uint256(IOracle.DisputeStatus.Lost)); + IOracle.DisputeStatus _disputeStatus = oracle.disputeStatus(_disputeId); + // Check: is the dispute updated as lost? + assertEq(uint256(_disputeStatus), uint256(IOracle.DisputeStatus.Lost)); - // // Check: does the disputer receive the disputer's bond? - // uint256 _proposerBalance = _accountingExtension.balanceOf(proposer, usdc); - // assertEq(_proposerBalance, _expectedBondSize * 2); + // Check: does the disputer receive the disputer's bond? + uint256 _proposerBalance = _accountingExtension.balanceOf(proposer, usdc); + assertEq(_proposerBalance, _expectedBondSize * 2); - // // Check: does the disputer get its bond slashed? - // uint256 _disputerBondedAmount = _accountingExtension.bondedAmountOf(disputer, usdc, _getId(mockRequest)); - // assertEq(_disputerBondedAmount, 0); + // Check: does the disputer get its bond slashed? + uint256 _disputerBondedAmount = _accountingExtension.bondedAmountOf(disputer, usdc, _getId(mockRequest)); + assertEq(_disputerBondedAmount, 0); } function _setArbitrator(address _arbitrator) internal { From 054165570b1b18dc66c3f23a23dc1ea609f3e2a9 Mon Sep 17 00:00:00 2001 From: xorsal Date: Sun, 10 Nov 2024 15:32:13 -0500 Subject: [PATCH 42/50] feat: access module (#77) Co-authored-by: Ashitaka --- package.json | 2 +- .../ModuleAccessController.sol} | 22 +++++- .../modules/dispute/BondEscalationModule.sol | 20 +++-- .../modules/dispute/CircuitResolverModule.sol | 6 +- .../dispute/RootVerificationModule.sol | 6 +- .../modules/resolution/ArbitratorModule.sol | 7 +- .../BondEscalationResolutionModule.sol | 27 +++---- .../resolution/ERC20ResolutionModule.sol | 14 ++-- .../PrivateERC20ResolutionModule.sol | 16 ++-- .../modules/response/BondedResponseModule.sol | 5 +- solidity/contracts/utils/ModuleTypehash.sol | 26 +++++++ solidity/contracts/utils/Typehash.sol | 22 ------ .../access/IModuleAccessController.sol | 35 +++++++++ solidity/test/integration/IntegrationBase.sol | 5 +- .../dispute/BondEscalationModule.t.sol | 78 +++++++++++++------ solidity/test/utils/Helpers.sol | 2 +- yarn.lock | 8 +- 17 files changed, 198 insertions(+), 103 deletions(-) rename solidity/contracts/modules/{accessControl/AccessControllerModule.sol => access/ModuleAccessController.sol} (57%) create mode 100644 solidity/contracts/utils/ModuleTypehash.sol delete mode 100644 solidity/contracts/utils/Typehash.sol create mode 100644 solidity/interfaces/modules/access/IModuleAccessController.sol diff --git a/package.json b/package.json index 3b374eeb..0a893bbe 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "package.json": "sort-package-json" }, "dependencies": { - "@defi-wonderland/prophet-core": "0.0.0-3afab791", + "@defi-wonderland/prophet-core": "0.0.0-823459fc", "@openzeppelin/contracts": "4.9.5", "solmate": "https://github.com/transmissions11/solmate.git#bfc9c25865a274a7827fea5abf6e4fb64fc64e6c" }, diff --git a/solidity/contracts/modules/accessControl/AccessControllerModule.sol b/solidity/contracts/modules/access/ModuleAccessController.sol similarity index 57% rename from solidity/contracts/modules/accessControl/AccessControllerModule.sol rename to solidity/contracts/modules/access/ModuleAccessController.sol index ad2a7fde..e2cd9c21 100644 --- a/solidity/contracts/modules/accessControl/AccessControllerModule.sol +++ b/solidity/contracts/modules/access/ModuleAccessController.sol @@ -1,11 +1,13 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.19; -import {AccessController} from '@defi-wonderland/prophet-core/solidity/contracts/AccessController.sol'; +import {CommonAccessController} from '@defi-wonderland/prophet-core/solidity/contracts/CommonAccessController.sol'; + +import {IModuleAccessController} from '../../../interfaces/modules/access/IModuleAccessController.sol'; import {Module} from '@defi-wonderland/prophet-core/solidity/contracts/Module.sol'; import {IOracle} from '@defi-wonderland/prophet-core/solidity/interfaces/IOracle.sol'; -abstract contract AccessControllerModule is AccessController, Module { +abstract contract ModuleAccessController is IModuleAccessController, CommonAccessController, Module { constructor(IOracle _oracle) Module(_oracle) {} /** @@ -19,7 +21,6 @@ abstract contract AccessControllerModule is AccessController, Module { } /** - * // todo: update name to _selfAccessControl * @notice Returns an access control object using the contract address as user, and empty data * * @dev should only be used by modules as the self-access-control object @@ -28,4 +29,19 @@ abstract contract AccessControllerModule is AccessController, Module { function _defaultAccessControl() internal view returns (AccessControl memory _accessControl) { _accessControl = _defaultAccessControl(bytes('')); } + + modifier hasAccess( + address _accessModule, + bytes32 _typehash, + bytes memory _params, + AccessControl memory _accessControl + ) { + // Revert if sender is acting for a user without module approval + if (msg.sender != _accessControl.user && !ORACLE.isAccessModuleApproved(_accessControl.user, _accessModule)) { + revert ModuleAccessController_AccessModuleNotApproved(); + } + // todo: probably a change name is required here, something like `_ensureAccess`? + _hasAccess(_accessModule, _typehash, _params, _accessControl); + _; + } } diff --git a/solidity/contracts/modules/dispute/BondEscalationModule.sol b/solidity/contracts/modules/dispute/BondEscalationModule.sol index 090a07d6..08906b5f 100644 --- a/solidity/contracts/modules/dispute/BondEscalationModule.sol +++ b/solidity/contracts/modules/dispute/BondEscalationModule.sol @@ -7,10 +7,11 @@ import {FixedPointMathLib} from 'solmate/src/utils/FixedPointMathLib.sol'; import {IBondEscalationModule} from '../../../interfaces/modules/dispute/IBondEscalationModule.sol'; -import {_PLEDGE_AGAINST_DISPUTE_TYPEHASH, _PLEDGE_FOR_DISPUTE_TYPEHASH} from '../../utils/Typehash.sol'; -import {AccessControllerModule} from '../accessControl/AccessControllerModule.sol'; +import {ModuleAccessController} from '../access/ModuleAccessController.sol'; -contract BondEscalationModule is AccessControllerModule, IBondEscalationModule { +import {ModuleTypehash} from '../../utils/ModuleTypehash.sol'; + +contract BondEscalationModule is ModuleAccessController, IBondEscalationModule { /// @inheritdoc IBondEscalationModule mapping(bytes32 _requestId => mapping(address _pledger => uint256 pledges)) public pledgesForDispute; @@ -22,7 +23,7 @@ contract BondEscalationModule is AccessControllerModule, IBondEscalationModule { */ mapping(bytes32 _requestId => BondEscalation) internal _escalations; - constructor(IOracle _oracle) AccessControllerModule(_oracle) {} + constructor(IOracle _oracle) ModuleAccessController(_oracle) {} /// @inheritdoc IModule function moduleName() external pure returns (string memory _moduleName) { @@ -217,7 +218,12 @@ contract BondEscalationModule is AccessControllerModule, IBondEscalationModule { AccessControl calldata _accessControl ) external - hasAccess(_request.accessControlModule, _PLEDGE_FOR_DISPUTE_TYPEHASH, abi.encode(_request, _dispute), _accessControl) + hasAccess( + _request.accessModule, + ModuleTypehash._PLEDGE_FOR_DISPUTE_TYPEHASH, + abi.encode(_request, _dispute), + _accessControl + ) { bytes32 _disputeId = _getId(_dispute); RequestParameters memory _params = _pledgeChecks(_request, _dispute, true); @@ -245,8 +251,8 @@ contract BondEscalationModule is AccessControllerModule, IBondEscalationModule { ) external hasAccess( - _request.accessControlModule, - _PLEDGE_AGAINST_DISPUTE_TYPEHASH, + _request.accessModule, + ModuleTypehash._PLEDGE_AGAINST_DISPUTE_TYPEHASH, abi.encode(_request, _dispute), _accessControl ) diff --git a/solidity/contracts/modules/dispute/CircuitResolverModule.sol b/solidity/contracts/modules/dispute/CircuitResolverModule.sol index 80b6894a..c7d06d7b 100644 --- a/solidity/contracts/modules/dispute/CircuitResolverModule.sol +++ b/solidity/contracts/modules/dispute/CircuitResolverModule.sol @@ -7,13 +7,13 @@ import {IOracle} from '@defi-wonderland/prophet-core/solidity/interfaces/IOracle import {IProphetVerifier} from '../../../interfaces/IProphetVerifier.sol'; import {ICircuitResolverModule} from '../../../interfaces/modules/dispute/ICircuitResolverModule.sol'; -import {AccessControllerModule} from '../accessControl/AccessControllerModule.sol'; +import {ModuleAccessController} from '../access/ModuleAccessController.sol'; -contract CircuitResolverModule is AccessControllerModule, ICircuitResolverModule { +contract CircuitResolverModule is ModuleAccessController, ICircuitResolverModule { /// @notice Keeps track of the correct responses to requests mapping(bytes32 _requestId => bytes _correctResponse) internal _correctResponses; - constructor(IOracle _oracle) AccessControllerModule(_oracle) {} + constructor(IOracle _oracle) ModuleAccessController(_oracle) {} /// @inheritdoc IModule function moduleName() external pure returns (string memory _moduleName) { diff --git a/solidity/contracts/modules/dispute/RootVerificationModule.sol b/solidity/contracts/modules/dispute/RootVerificationModule.sol index e79874d9..24e164a6 100644 --- a/solidity/contracts/modules/dispute/RootVerificationModule.sol +++ b/solidity/contracts/modules/dispute/RootVerificationModule.sol @@ -6,9 +6,9 @@ import {IOracle} from '@defi-wonderland/prophet-core/solidity/interfaces/IOracle import {IRootVerificationModule} from '../../../interfaces/modules/dispute/IRootVerificationModule.sol'; import {MerkleLib} from '../../libraries/MerkleLib.sol'; -import {AccessControllerModule} from '../accessControl/AccessControllerModule.sol'; +import {ModuleAccessController} from '../access/ModuleAccessController.sol'; -contract RootVerificationModule is AccessControllerModule, IRootVerificationModule { +contract RootVerificationModule is ModuleAccessController, IRootVerificationModule { using MerkleLib for MerkleLib.Tree; /** @@ -16,7 +16,7 @@ contract RootVerificationModule is AccessControllerModule, IRootVerificationModu */ mapping(bytes32 _requestId => bytes32 _correctRoot) internal _correctRoots; - constructor(IOracle _oracle) AccessControllerModule(_oracle) {} + constructor(IOracle _oracle) ModuleAccessController(_oracle) {} /// @inheritdoc IModule function moduleName() external pure returns (string memory _moduleName) { diff --git a/solidity/contracts/modules/resolution/ArbitratorModule.sol b/solidity/contracts/modules/resolution/ArbitratorModule.sol index 9ace482c..f970df6b 100644 --- a/solidity/contracts/modules/resolution/ArbitratorModule.sol +++ b/solidity/contracts/modules/resolution/ArbitratorModule.sol @@ -6,16 +6,15 @@ import {IOracle} from '@defi-wonderland/prophet-core/solidity/interfaces/IOracle import {IArbitrator} from '../../../interfaces/IArbitrator.sol'; import {IArbitratorModule} from '../../../interfaces/modules/resolution/IArbitratorModule.sol'; +import {ModuleAccessController} from '../access/ModuleAccessController.sol'; -import {AccessControllerModule} from '../accessControl/AccessControllerModule.sol'; - -contract ArbitratorModule is AccessControllerModule, IArbitratorModule { +contract ArbitratorModule is ModuleAccessController, IArbitratorModule { /** * @notice The status of all disputes */ mapping(bytes32 _disputeId => ArbitrationStatus _status) internal _disputeData; - constructor(IOracle _oracle) AccessControllerModule(_oracle) {} + constructor(IOracle _oracle) ModuleAccessController(_oracle) {} /// @inheritdoc IModule function moduleName() external pure returns (string memory _moduleName) { diff --git a/solidity/contracts/modules/resolution/BondEscalationResolutionModule.sol b/solidity/contracts/modules/resolution/BondEscalationResolutionModule.sol index 661a0c6c..63002a90 100644 --- a/solidity/contracts/modules/resolution/BondEscalationResolutionModule.sol +++ b/solidity/contracts/modules/resolution/BondEscalationResolutionModule.sol @@ -16,15 +16,11 @@ import {IResolutionModule} from import {IBondEscalationResolutionModule} from '../../../interfaces/modules/resolution/IBondEscalationResolutionModule.sol'; -import {AccessControllerModule} from '../accessControl/AccessControllerModule.sol'; +import {ModuleAccessController} from '../access/ModuleAccessController.sol'; -import { - _CLAIM_PLEDGE_TYPEHASH, - _PLEDGE_AGAINST_DISPUTE_TYPEHASH, - _PLEDGE_FOR_DISPUTE_TYPEHASH -} from '../../utils/Typehash.sol'; +import {ModuleTypehash} from '../../utils/ModuleTypehash.sol'; -contract BondEscalationResolutionModule is AccessControllerModule, IBondEscalationResolutionModule { +contract BondEscalationResolutionModule is ModuleAccessController, IBondEscalationResolutionModule { using SafeERC20 for IERC20; /// @inheritdoc IBondEscalationResolutionModule @@ -42,7 +38,7 @@ contract BondEscalationResolutionModule is AccessControllerModule, IBondEscalati /// @inheritdoc IBondEscalationResolutionModule mapping(bytes32 _disputeId => mapping(address _pledger => uint256 pledges)) public pledgesAgainstDispute; - constructor(IOracle _oracle) AccessControllerModule(_oracle) {} + constructor(IOracle _oracle) ModuleAccessController(_oracle) {} /// @inheritdoc IModule function moduleName() external pure returns (string memory _moduleName) { @@ -74,8 +70,8 @@ contract BondEscalationResolutionModule is AccessControllerModule, IBondEscalati ) external hasAccess( - _request.accessControlModule, - _PLEDGE_FOR_DISPUTE_TYPEHASH, + _request.accessModule, + ModuleTypehash._PLEDGE_FOR_DISPUTE_TYPEHASH, abi.encode(_request, _dispute, _pledgeAmount), _accessControl ) @@ -98,8 +94,8 @@ contract BondEscalationResolutionModule is AccessControllerModule, IBondEscalati ) external hasAccess( - _request.accessControlModule, - _PLEDGE_AGAINST_DISPUTE_TYPEHASH, + _request.accessModule, + ModuleTypehash._PLEDGE_AGAINST_DISPUTE_TYPEHASH, abi.encode(_request, _dispute, _pledgeAmount), _accessControl ) @@ -164,7 +160,12 @@ contract BondEscalationResolutionModule is AccessControllerModule, IBondEscalati AccessControl calldata _accessControl ) external - hasAccess(_request.accessControlModule, _CLAIM_PLEDGE_TYPEHASH, abi.encode(_request, _dispute), _accessControl) + hasAccess( + _request.accessModule, + ModuleTypehash._CLAIM_PLEDGE_TYPEHASH, + abi.encode(_request, _dispute), + _accessControl + ) { bytes32 _disputeId = _validateDispute(_request, _dispute); Escalation storage _escalation = escalations[_disputeId]; diff --git a/solidity/contracts/modules/resolution/ERC20ResolutionModule.sol b/solidity/contracts/modules/resolution/ERC20ResolutionModule.sol index ebbb46a7..9e187af0 100644 --- a/solidity/contracts/modules/resolution/ERC20ResolutionModule.sol +++ b/solidity/contracts/modules/resolution/ERC20ResolutionModule.sol @@ -11,10 +11,10 @@ import {IOracle} from '@defi-wonderland/prophet-core/solidity/interfaces/IOracle import {IERC20ResolutionModule} from '../../../interfaces/modules/resolution/IERC20ResolutionModule.sol'; -import {_CAST_VOTE_TYPEHASH, _CLAIM_VOTE_TYPEHASH} from '../../utils/Typehash.sol'; -import {AccessControllerModule} from '../accessControl/AccessControllerModule.sol'; +import {ModuleTypehash} from '../../utils/ModuleTypehash.sol'; +import {ModuleAccessController} from '../access/ModuleAccessController.sol'; -contract ERC20ResolutionModule is AccessControllerModule, IERC20ResolutionModule { +contract ERC20ResolutionModule is ModuleAccessController, IERC20ResolutionModule { using SafeERC20 for IERC20; using EnumerableSet for EnumerableSet.AddressSet; @@ -29,7 +29,7 @@ contract ERC20ResolutionModule is AccessControllerModule, IERC20ResolutionModule */ mapping(bytes32 _disputeId => EnumerableSet.AddressSet _votersSet) internal _voters; - constructor(IOracle _oracle) AccessControllerModule(_oracle) {} + constructor(IOracle _oracle) ModuleAccessController(_oracle) {} /// @inheritdoc IModule function moduleName() external pure returns (string memory _moduleName) { @@ -61,8 +61,8 @@ contract ERC20ResolutionModule is AccessControllerModule, IERC20ResolutionModule ) external hasAccess( - _request.accessControlModule, - _CAST_VOTE_TYPEHASH, + _request.accessModule, + ModuleTypehash._CAST_VOTE_TYPEHASH, abi.encode(_request, _dispute, _numberOfVotes, _numberOfVotes), _accessControl ) @@ -140,7 +140,7 @@ contract ERC20ResolutionModule is AccessControllerModule, IERC20ResolutionModule AccessControl calldata _accessControl ) external - hasAccess(_request.accessControlModule, _CLAIM_VOTE_TYPEHASH, abi.encode(_request, _dispute), _accessControl) + hasAccess(_request.accessModule, ModuleTypehash._CLAIM_VOTE_TYPEHASH, abi.encode(_request, _dispute), _accessControl) { bytes32 _disputeId = _validateDispute(_request, _dispute); Escalation memory _escalation = escalations[_disputeId]; diff --git a/solidity/contracts/modules/resolution/PrivateERC20ResolutionModule.sol b/solidity/contracts/modules/resolution/PrivateERC20ResolutionModule.sol index 7dd0a173..d71705ea 100644 --- a/solidity/contracts/modules/resolution/PrivateERC20ResolutionModule.sol +++ b/solidity/contracts/modules/resolution/PrivateERC20ResolutionModule.sol @@ -6,14 +6,14 @@ import {IERC20} from '@openzeppelin/contracts/token/ERC20/IERC20.sol'; import {SafeERC20} from '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol'; import {EnumerableSet} from '@openzeppelin/contracts/utils/structs/EnumerableSet.sol'; -import {_COMMIT_VOTE_TYPEHASH, _REVEAL_VOTE_TYPEHASH} from '../../utils/Typehash.sol'; +import {ModuleTypehash} from '../../utils/ModuleTypehash.sol'; import {IModule, Module} from '@defi-wonderland/prophet-core/solidity/contracts/Module.sol'; import {IOracle} from '@defi-wonderland/prophet-core/solidity/interfaces/IOracle.sol'; import {IPrivateERC20ResolutionModule} from '../../../interfaces/modules/resolution/IPrivateERC20ResolutionModule.sol'; -import {AccessControllerModule} from '../accessControl/AccessControllerModule.sol'; +import {ModuleAccessController} from '../access/ModuleAccessController.sol'; -contract PrivateERC20ResolutionModule is AccessControllerModule, IPrivateERC20ResolutionModule { +contract PrivateERC20ResolutionModule is ModuleAccessController, IPrivateERC20ResolutionModule { using SafeERC20 for IERC20; using EnumerableSet for EnumerableSet.AddressSet; @@ -28,7 +28,7 @@ contract PrivateERC20ResolutionModule is AccessControllerModule, IPrivateERC20Re */ mapping(bytes32 _disputeId => EnumerableSet.AddressSet _votersSet) internal _voters; - constructor(IOracle _oracle) AccessControllerModule(_oracle) {} + constructor(IOracle _oracle) ModuleAccessController(_oracle) {} /// @inheritdoc IModule function moduleName() external pure returns (string memory _moduleName) { @@ -60,8 +60,8 @@ contract PrivateERC20ResolutionModule is AccessControllerModule, IPrivateERC20Re ) external hasAccess( - _request.accessControlModule, - _COMMIT_VOTE_TYPEHASH, + _request.accessModule, + ModuleTypehash._COMMIT_VOTE_TYPEHASH, abi.encode(_request, _dispute, _commitment), _accessControl ) @@ -94,8 +94,8 @@ contract PrivateERC20ResolutionModule is AccessControllerModule, IPrivateERC20Re ) external hasAccess( - _request.accessControlModule, - _REVEAL_VOTE_TYPEHASH, + _request.accessModule, + ModuleTypehash._REVEAL_VOTE_TYPEHASH, abi.encode(_request, _dispute, _numberOfVotes, _salt), _accessControl ) diff --git a/solidity/contracts/modules/response/BondedResponseModule.sol b/solidity/contracts/modules/response/BondedResponseModule.sol index c552c1aa..cb52b7cb 100644 --- a/solidity/contracts/modules/response/BondedResponseModule.sol +++ b/solidity/contracts/modules/response/BondedResponseModule.sol @@ -5,10 +5,9 @@ import {IModule, Module} from '@defi-wonderland/prophet-core/solidity/contracts/ import {IOracle} from '@defi-wonderland/prophet-core/solidity/interfaces/IOracle.sol'; import {IBondedResponseModule} from '../../../interfaces/modules/response/IBondedResponseModule.sol'; -import {AccessControllerModule} from '../accessControl/AccessControllerModule.sol'; -contract BondedResponseModule is AccessControllerModule, IBondedResponseModule { - constructor(IOracle _oracle) AccessControllerModule(_oracle) {} +contract BondedResponseModule is Module, IBondedResponseModule { + constructor(IOracle _oracle) Module(_oracle) {} /// @inheritdoc IModule function moduleName() public pure returns (string memory _moduleName) { diff --git a/solidity/contracts/utils/ModuleTypehash.sol b/solidity/contracts/utils/ModuleTypehash.sol new file mode 100644 index 00000000..37f44ec3 --- /dev/null +++ b/solidity/contracts/utils/ModuleTypehash.sol @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +library ModuleTypehash { + bytes32 internal constant _PLEDGE_FOR_DISPUTE_TYPEHASH = + keccak256('pledgeForDispute(Request _request, Dispute _dispute,IAccessController.AccessControl _accessControl)'); + + bytes32 internal constant _PLEDGE_AGAINST_DISPUTE_TYPEHASH = + keccak256('pledgeAgainstDispute(Request _request,Dispute _dispute,IAccessController.AccessControl _accessControl)'); + + bytes32 internal constant _CLAIM_PLEDGE_TYPEHASH = + keccak256('claimPledge(Request _request,Dispute _dispute,AccessControl _accessControl)'); + + bytes32 internal constant _CLAIM_VOTE_TYPEHASH = + keccak256('claimVote(Request _request,Dispute _dispute,AccessControl _accessControl)'); + + bytes32 internal constant _CAST_VOTE_TYPEHASH = + keccak256('castVote(Request _request,Dispute _dispute,uint256 _numberOfVotes,AccessControl _accessControl)'); + + bytes32 internal constant _COMMIT_VOTE_TYPEHASH = + keccak256('commitVote(Request _request,Dispute _dispute,bytes32 _commitment,AccessControl _accessControl)'); + + bytes32 internal constant _REVEAL_VOTE_TYPEHASH = keccak256( + 'revealVote(Request _request,Dispute _dispute,uint256 _numberOfVotes,bytes32 _salt,AccessControl _accessControl)' + ); +} diff --git a/solidity/contracts/utils/Typehash.sol b/solidity/contracts/utils/Typehash.sol deleted file mode 100644 index a64ddead..00000000 --- a/solidity/contracts/utils/Typehash.sol +++ /dev/null @@ -1,22 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.19; - -bytes32 constant _PLEDGE_FOR_DISPUTE_TYPEHASH = - keccak256('pledgeForDispute(Request _request, Dispute _dispute,IAccessController.AccessControl _accessControl)'); - -bytes32 constant _PLEDGE_AGAINST_DISPUTE_TYPEHASH = - keccak256('pledgeAgainstDispute(Request _request,Dispute _dispute,IAccessController.AccessControl _accessControl)'); - -bytes32 constant _CLAIM_PLEDGE_TYPEHASH = - keccak256('claimPledge(Request _request,Dispute _dispute,AccessControl _accessControl)'); - -bytes32 constant _CLAIM_VOTE_TYPEHASH = - keccak256('claimVote(Request _request,Dispute _dispute,AccessControl _accessControl)'); - -bytes32 constant _CAST_VOTE_TYPEHASH = - keccak256('castVote(Request _request,Dispute _dispute,uint256 _numberOfVotes,AccessControl _accessControl)'); -bytes32 constant _COMMIT_VOTE_TYPEHASH = - keccak256('commitVote(Request _request,Dispute _dispute,bytes32 _commitment,AccessControl _accessControl)'); -bytes32 constant _REVEAL_VOTE_TYPEHASH = keccak256( - 'revealVote(Request _request,Dispute _dispute,uint256 _numberOfVotes,bytes32 _salt,AccessControl _accessControl)' -); diff --git a/solidity/interfaces/modules/access/IModuleAccessController.sol b/solidity/interfaces/modules/access/IModuleAccessController.sol new file mode 100644 index 00000000..1713b7de --- /dev/null +++ b/solidity/interfaces/modules/access/IModuleAccessController.sol @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import {IAccessController} from '@defi-wonderland/prophet-core/solidity/interfaces/IAccessController.sol'; + +/** + * @title Module Access Controller Interface + * @notice Interface for the module access controller + */ +interface IModuleAccessController is IAccessController { + /*/////////////////////////////////////////////////////////////// + EVENTS + //////////////////////////////////////////////////////////////*/ + + /*/////////////////////////////////////////////////////////////// + STRUCTS + //////////////////////////////////////////////////////////////*/ + + /*/////////////////////////////////////////////////////////////// + ERRORS + //////////////////////////////////////////////////////////////*/ + + /** + * @notice Thrown when user has not approved the access module + */ + error ModuleAccessController_AccessModuleNotApproved(); + + /*/////////////////////////////////////////////////////////////// + VARIABLES + //////////////////////////////////////////////////////////////*/ + + /*/////////////////////////////////////////////////////////////// + LOGIC + //////////////////////////////////////////////////////////////*/ +} diff --git a/solidity/test/integration/IntegrationBase.sol b/solidity/test/integration/IntegrationBase.sol index cb86d3dc..21e0edbc 100644 --- a/solidity/test/integration/IntegrationBase.sol +++ b/solidity/test/integration/IntegrationBase.sol @@ -6,8 +6,9 @@ pragma solidity ^0.8.19; import {console} from 'forge-std/console.sol'; import { - AccessController, IAccessController -} from '@defi-wonderland/prophet-core/solidity/contracts/AccessController.sol'; + CommonAccessController, + IAccessController +} from '@defi-wonderland/prophet-core/solidity/contracts/CommonAccessController.sol'; import {IOracle, Oracle} from '@defi-wonderland/prophet-core/solidity/contracts/Oracle.sol'; import {IDisputeModule} from '@defi-wonderland/prophet-core/solidity/interfaces/modules/dispute/IDisputeModule.sol'; import {IFinalityModule} from '@defi-wonderland/prophet-core/solidity/interfaces/modules/finality/IFinalityModule.sol'; diff --git a/solidity/test/unit/modules/dispute/BondEscalationModule.t.sol b/solidity/test/unit/modules/dispute/BondEscalationModule.t.sol index 8927bfa7..1adf211a 100644 --- a/solidity/test/unit/modules/dispute/BondEscalationModule.t.sol +++ b/solidity/test/unit/modules/dispute/BondEscalationModule.t.sol @@ -8,9 +8,8 @@ import {Helpers} from '../../../utils/Helpers.sol'; import {IAccessController} from '@defi-wonderland/prophet-core/solidity/interfaces/IAccessController.sol'; import {IModule} from '@defi-wonderland/prophet-core/solidity/interfaces/IModule.sol'; -import {IOracle} from '@defi-wonderland/prophet-core/solidity/interfaces/IOracle.sol'; -import {IAccessControlModule} from - '@defi-wonderland/prophet-core/solidity/interfaces/modules/accessControl/IAccessControlModule.sol'; +import {IOracle, IOracleAccessController} from '@defi-wonderland/prophet-core/solidity/interfaces/IOracle.sol'; +import {IAccessModule} from '@defi-wonderland/prophet-core/solidity/interfaces/modules/access/IAccessModule.sol'; import {ValidatorLib} from '@defi-wonderland/prophet-core/solidity/libraries/ValidatorLib.sol'; import {IERC20} from '@openzeppelin/contracts/token/ERC20/IERC20.sol'; import {Strings} from '@openzeppelin/contracts/utils/Strings.sol'; @@ -19,11 +18,10 @@ import { BondEscalationModule, IBondEscalationModule } from '../../../../contracts/modules/dispute/BondEscalationModule.sol'; -import { - _PLEDGE_AGAINST_DISPUTE_TYPEHASH, _PLEDGE_FOR_DISPUTE_TYPEHASH -} from '../../../../contracts/utils/Typehash.sol'; +import {ModuleTypehash} from '../../../../contracts/utils/ModuleTypehash.sol'; import {IAccountingExtension} from '../../../../interfaces/extensions/IAccountingExtension.sol'; import {IBondEscalationAccounting} from '../../../../interfaces/extensions/IBondEscalationAccounting.sol'; +import {IModuleAccessController} from '../../../../interfaces/modules/access/IModuleAccessController.sol'; /** * @dev Harness to set an entry in the requestData mapping, without triggering setup request hooks @@ -1501,14 +1499,14 @@ contract BondEscalationModule_Unit_SettleBondEscalation is BaseTest { } contract BondEscalationModule_Unit_AccessControl is BaseTest { - address internal _accessControlModule = makeAddr('accessControlModule'); + address internal _accessModule = makeAddr('accessModule'); function setUp() public override { - mockRequest.accessControlModule = _accessControlModule; + mockRequest.accessModule = _accessModule; super.setUp(); } - function test_pledgeForDispute_accessControl( + function test_pledgeForDispute_accessControl_granted( address _caller, address _user, bytes memory _data, @@ -1533,20 +1531,27 @@ contract BondEscalationModule_Unit_AccessControl is BaseTest { uint256 _numAgainstPledgers = _numForPledgers + 1; _setBondEscalation(_requestId, _numForPledgers, _numAgainstPledgers); + // expect a call checking whether the access module has been approved by the user + _mockAndExpect( + address(oracle), + abi.encodeCall(IOracleAccessController.isAccessModuleApproved, (_user, _accessModule)), + abi.encode(true) + ); + IAccessController.AccessControl memory _accessControl = IAccessController.AccessControl({user: _user, data: _data}); // Mock and expect call to access control module vm.mockCall( - _accessControlModule, + _accessModule, abi.encodeCall( - IAccessControlModule.hasAccess, + IAccessModule.hasAccess, ( abi.encode( - IAccessControlModule.AccessControlParameters({ + IAccessModule.AccessControlParameters({ sender: _caller, - typehash: _PLEDGE_FOR_DISPUTE_TYPEHASH, - params: abi.encode(mockRequest, _dispute), - accessControl: _accessControl + accessControl: _accessControl, + typehash: ModuleTypehash._PLEDGE_FOR_DISPUTE_TYPEHASH, + typehashParams: abi.encode(mockRequest, _dispute) }) ) ) @@ -1566,7 +1571,29 @@ contract BondEscalationModule_Unit_AccessControl is BaseTest { bondEscalationModule.pledgeForDispute(mockRequest, _dispute, _accessControl); } - function test_pledgeAgainstDispute_accessControl( + function test_pledgeForDispute_accessControl_notGranted( + address _caller, + address _user, + bytes memory _data, + IBondEscalationModule.RequestParameters memory _params + ) public assumeFuzzable(address(_params.accountingExtension)) { + vm.assume(_caller != _user); + + // mock and expect a call checking whether the access module has been approved by the user + _mockAndExpect( + address(oracle), + abi.encodeCall(IOracleAccessController.isAccessModuleApproved, (_user, _accessModule)), + abi.encode(false) + ); + + IAccessController.AccessControl memory _accessControl = IAccessController.AccessControl({user: _user, data: _data}); + + vm.expectRevert(IModuleAccessController.ModuleAccessController_AccessModuleNotApproved.selector); + vm.prank(_caller); + bondEscalationModule.pledgeForDispute(mockRequest, mockDispute, _accessControl); + } + + function test_pledgeAgainstDispute_accessControl_granted( address _caller, address _user, bytes memory _data, @@ -1591,6 +1618,13 @@ contract BondEscalationModule_Unit_AccessControl is BaseTest { _setBondEscalation(_requestId, _numForPledgers, _numAgainstPledgers); + // todo: extract to helper when we add tests for the other access controlled functions + _mockAndExpect( + address(oracle), + abi.encodeCall(IOracleAccessController.isAccessModuleApproved, (_user, _accessModule)), + abi.encode(true) + ); + _mockAndExpect( address(_params.accountingExtension), abi.encodeCall( @@ -1603,16 +1637,16 @@ contract BondEscalationModule_Unit_AccessControl is BaseTest { // Mock and expect call to access control module vm.mockCall( - _accessControlModule, + _accessModule, abi.encodeCall( - IAccessControlModule.hasAccess, + IAccessModule.hasAccess, ( abi.encode( - IAccessControlModule.AccessControlParameters({ + IAccessModule.AccessControlParameters({ sender: _caller, - typehash: _PLEDGE_AGAINST_DISPUTE_TYPEHASH, - params: abi.encode(mockRequest, _dispute), - accessControl: _accessControl + accessControl: _accessControl, + typehash: ModuleTypehash._PLEDGE_AGAINST_DISPUTE_TYPEHASH, + typehashParams: abi.encode(mockRequest, _dispute) }) ) ) diff --git a/solidity/test/utils/Helpers.sol b/solidity/test/utils/Helpers.sol index b92a301e..cd3d2add 100644 --- a/solidity/test/utils/Helpers.sol +++ b/solidity/test/utils/Helpers.sol @@ -13,7 +13,7 @@ contract Helpers is DSTestPlus, TestConstants { // Mock objects IOracle.Request public mockRequest = IOracle.Request({ - accessControlModule: address(0), + accessModule: address(0), requestModule: address(0), responseModule: address(0), disputeModule: address(0), diff --git a/yarn.lock b/yarn.lock index e9f077bd..ac0d62e4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -193,10 +193,10 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" -"@defi-wonderland/prophet-core@0.0.0-3afab791": - version "0.0.0-3afab791" - resolved "https://registry.yarnpkg.com/@defi-wonderland/prophet-core/-/prophet-core-0.0.0-3afab791.tgz#e9e40fabf2ae50b1edbfca806d4159b29b64daec" - integrity sha512-0zvdUCehT2yMDzRPG60XUlMIwSESxeVqaWwVswnDlr3G4ISYhFl1kZvg4fShJTbB9pu9G9tfj19/zFXt0BFaHw== +"@defi-wonderland/prophet-core@0.0.0-823459fc": + version "0.0.0-823459fc" + resolved "https://registry.yarnpkg.com/@defi-wonderland/prophet-core/-/prophet-core-0.0.0-823459fc.tgz#a48f7b35899968468f37f5c9eb2c67a1c8a823ff" + integrity sha512-lqTFlKFUwt4yjBGnSUJf9PwNQE6MP4KJHUSCov2+yxJCkKHKzFlYQ7M25dAdebiwa6Hfd+XHQfLx1bzff6mM6Q== "@defi-wonderland/solidity-utils@0.0.0-3e9c8e8b": version "0.0.0-3e9c8e8b" From 15061dbfaad8754105ac718daff37d7125baa1a8 Mon Sep 17 00:00:00 2001 From: Gas One Cent <86567384+gas1cent@users.noreply.github.com> Date: Tue, 12 Nov 2024 11:54:22 +0400 Subject: [PATCH 43/50] fix: an extra space --- solidity/contracts/utils/ModuleTypehash.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/solidity/contracts/utils/ModuleTypehash.sol b/solidity/contracts/utils/ModuleTypehash.sol index 37f44ec3..b70bbb5a 100644 --- a/solidity/contracts/utils/ModuleTypehash.sol +++ b/solidity/contracts/utils/ModuleTypehash.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.19; library ModuleTypehash { bytes32 internal constant _PLEDGE_FOR_DISPUTE_TYPEHASH = - keccak256('pledgeForDispute(Request _request, Dispute _dispute,IAccessController.AccessControl _accessControl)'); + keccak256('pledgeForDispute(Request _request,Dispute _dispute,IAccessController.AccessControl _accessControl)'); bytes32 internal constant _PLEDGE_AGAINST_DISPUTE_TYPEHASH = keccak256('pledgeAgainstDispute(Request _request,Dispute _dispute,IAccessController.AccessControl _accessControl)'); From 78dd38de6551b35be62edecd769d7e3ab803480b Mon Sep 17 00:00:00 2001 From: Gas One Cent <86567384+gas1cent@users.noreply.github.com> Date: Tue, 12 Nov 2024 12:04:43 +0400 Subject: [PATCH 44/50] refactor: unnecessary `AccessControl` in `IArbitrator` --- .../modules/resolution/ArbitratorModule.sol | 2 +- solidity/interfaces/IArbitrator.sol | 4 +--- .../test/integration/EscalateDispute.t.sol | 18 +++--------------- solidity/test/mocks/MockArbitrator.sol | 3 +-- solidity/test/mocks/MockAtomicArbitrator.sol | 4 +--- .../modules/resolution/ArbitratorModule.t.sol | 12 ++---------- 6 files changed, 9 insertions(+), 34 deletions(-) diff --git a/solidity/contracts/modules/resolution/ArbitratorModule.sol b/solidity/contracts/modules/resolution/ArbitratorModule.sol index f970df6b..497dfa16 100644 --- a/solidity/contracts/modules/resolution/ArbitratorModule.sol +++ b/solidity/contracts/modules/resolution/ArbitratorModule.sol @@ -42,7 +42,7 @@ contract ArbitratorModule is ModuleAccessController, IArbitratorModule { if (_params.arbitrator == address(0)) revert ArbitratorModule_InvalidArbitrator(); _disputeData[_disputeId] = ArbitrationStatus.Active; - IArbitrator(_params.arbitrator).resolve(_request, _response, _dispute, _defaultAccessControl()); + IArbitrator(_params.arbitrator).resolve(_request, _response, _dispute); emit ResolutionStarted(_dispute.requestId, _disputeId); } diff --git a/solidity/interfaces/IArbitrator.sol b/solidity/interfaces/IArbitrator.sol index 2a6ed4b4..f323ddc8 100644 --- a/solidity/interfaces/IArbitrator.sol +++ b/solidity/interfaces/IArbitrator.sol @@ -19,11 +19,9 @@ interface IArbitrator { * @param _dispute The dispute object * @return _data The data for the dispute resolution */ - // review: I think don't need access control here. function resolve( IOracle.Request memory _request, IOracle.Response memory _response, - IOracle.Dispute memory _dispute, - IAccessController.AccessControl memory _accessControl + IOracle.Dispute memory _dispute ) external returns (bytes memory _data); } diff --git a/solidity/test/integration/EscalateDispute.t.sol b/solidity/test/integration/EscalateDispute.t.sol index 585d4bdc..d707a776 100644 --- a/solidity/test/integration/EscalateDispute.t.sol +++ b/solidity/test/integration/EscalateDispute.t.sol @@ -345,11 +345,7 @@ contract Integration_EscalateDispute is IntegrationBase { // The arbitrator module should call the arbitrator vm.expectCall( - address(_mockArbitrator), - abi.encodeCall( - MockArbitrator.resolve, - (mockRequest, mockResponse, mockDispute, _createAccessControl(address(_arbitratorModule))) - ) + address(_mockArbitrator), abi.encodeCall(MockArbitrator.resolve, (mockRequest, mockResponse, mockDispute)) ); // We escalate the dispute @@ -456,11 +452,7 @@ contract Integration_EscalateDispute is IntegrationBase { // The arbitrator module should call the arbitrator vm.expectCall( - address(_mockArbitrator), - abi.encodeCall( - MockArbitrator.resolve, - (mockRequest, mockResponse, mockDispute, _createAccessControl(address(_arbitratorModule))) - ) + address(_mockArbitrator), abi.encodeCall(MockArbitrator.resolve, (mockRequest, mockResponse, mockDispute)) ); // We escalate the dispute @@ -521,11 +513,7 @@ contract Integration_EscalateDispute is IntegrationBase { // The arbitrator module should call the arbitrator vm.expectCall( - address(_mockArbitrator), - abi.encodeCall( - MockArbitrator.resolve, - (mockRequest, mockResponse, mockDispute, _createAccessControl(address(_arbitratorModule))) - ) + address(_mockArbitrator), abi.encodeCall(MockArbitrator.resolve, (mockRequest, mockResponse, mockDispute)) ); // We escalate the dispute diff --git a/solidity/test/mocks/MockArbitrator.sol b/solidity/test/mocks/MockArbitrator.sol index f45dd64e..0ed3624d 100644 --- a/solidity/test/mocks/MockArbitrator.sol +++ b/solidity/test/mocks/MockArbitrator.sol @@ -15,8 +15,7 @@ contract MockArbitrator is IArbitrator { function resolve( IOracle.Request memory, IOracle.Response memory, - IOracle.Dispute memory, - IAccessController.AccessControl memory + IOracle.Dispute memory ) external pure returns (bytes memory _result) { _result = new bytes(0); } diff --git a/solidity/test/mocks/MockAtomicArbitrator.sol b/solidity/test/mocks/MockAtomicArbitrator.sol index 9606f612..95a02151 100644 --- a/solidity/test/mocks/MockAtomicArbitrator.sol +++ b/solidity/test/mocks/MockAtomicArbitrator.sol @@ -16,9 +16,7 @@ contract MockAtomicArbitrator is IArbitrator { function resolve( IOracle.Request memory _request, IOracle.Response memory _response, - IOracle.Dispute memory _dispute, - // review: why access control here? - IAccessController.AccessControl memory _accessControl + IOracle.Dispute memory _dispute ) external returns (bytes memory _result) { _result = new bytes(0); answer = IOracle.DisputeStatus.Won; diff --git a/solidity/test/unit/modules/resolution/ArbitratorModule.t.sol b/solidity/test/unit/modules/resolution/ArbitratorModule.t.sol index b385bc64..ef030191 100644 --- a/solidity/test/unit/modules/resolution/ArbitratorModule.t.sol +++ b/solidity/test/unit/modules/resolution/ArbitratorModule.t.sol @@ -116,11 +116,7 @@ contract ArbitratorModule_Unit_StartResolution is BaseTest { // Mock and expect the callback to the arbitrator _mockAndExpect( - _arbitrator, - abi.encodeCall( - arbitrator.resolve, (mockRequest, mockResponse, mockDispute, _createAccessControl(address(arbitratorModule))) - ), - abi.encode(bytes('')) + _arbitrator, abi.encodeCall(arbitrator.resolve, (mockRequest, mockResponse, mockDispute)), abi.encode(bytes('')) ); vm.prank(address(oracle)); @@ -139,11 +135,7 @@ contract ArbitratorModule_Unit_StartResolution is BaseTest { // Mock and expect the callback to the arbitrator _mockAndExpect( - _arbitrator, - abi.encodeCall( - arbitrator.resolve, (mockRequest, mockResponse, mockDispute, _createAccessControl(address(arbitratorModule))) - ), - abi.encode(bytes('')) + _arbitrator, abi.encodeCall(arbitrator.resolve, (mockRequest, mockResponse, mockDispute)), abi.encode(bytes('')) ); // Check: is the event emitted? From 4507e3e6ea8228236be515d64c214ac4896ed57b Mon Sep 17 00:00:00 2001 From: Gas One Cent <86567384+gas1cent@users.noreply.github.com> Date: Tue, 12 Nov 2024 12:07:37 +0400 Subject: [PATCH 45/50] test: access control in bond escalation module tests --- solidity/test/unit/modules/dispute/BondEscalationModule.t.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/solidity/test/unit/modules/dispute/BondEscalationModule.t.sol b/solidity/test/unit/modules/dispute/BondEscalationModule.t.sol index 20cf14a4..00582e47 100644 --- a/solidity/test/unit/modules/dispute/BondEscalationModule.t.sol +++ b/solidity/test/unit/modules/dispute/BondEscalationModule.t.sol @@ -1087,7 +1087,7 @@ contract BondEscalationModule_Unit_PledgeForDispute is BaseTest { vm.warp(disputeCreatedAt + _params.bondEscalationDeadline + _params.tyingBuffer + 1); vm.expectRevert(IBondEscalationModule.BondEscalationModule_BondEscalationOver.selector); - bondEscalationModule.pledgeForDispute(mockRequest, _dispute); + bondEscalationModule.pledgeForDispute(mockRequest, _dispute, _createAccessControl(address(this))); } /** @@ -1309,7 +1309,7 @@ contract BondEscalationModule_Unit_PledgeAgainstDispute is BaseTest { vm.warp(disputeCreatedAt + _params.bondEscalationDeadline + _params.tyingBuffer + 1); vm.expectRevert(IBondEscalationModule.BondEscalationModule_BondEscalationOver.selector); - bondEscalationModule.pledgeAgainstDispute(mockRequest, _dispute); + bondEscalationModule.pledgeAgainstDispute(mockRequest, _dispute, _createAccessControl(address(this))); } /** From a57e89d81f6888f90f2e52d9e319b3e3cca09236 Mon Sep 17 00:00:00 2001 From: Gas One Cent <86567384+gas1cent@users.noreply.github.com> Date: Tue, 12 Nov 2024 12:08:25 +0400 Subject: [PATCH 46/50] fix: stack too deep --- .../resolution/PrivateERC20ResolutionModule.sol | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/solidity/contracts/modules/resolution/PrivateERC20ResolutionModule.sol b/solidity/contracts/modules/resolution/PrivateERC20ResolutionModule.sol index 96a190eb..172fb46c 100644 --- a/solidity/contracts/modules/resolution/PrivateERC20ResolutionModule.sol +++ b/solidity/contracts/modules/resolution/PrivateERC20ResolutionModule.sol @@ -106,12 +106,14 @@ contract PrivateERC20ResolutionModule is ModuleAccessController, IPrivateERC20Re RequestParameters memory _params = decodeRequestData(_request.resolutionModuleData); - (uint256 _revealStartTime, uint256 _revealEndTime) = ( - _escalation.startTime + _params.committingTimeWindow, - _escalation.startTime + _params.committingTimeWindow + _params.revealingTimeWindow - ); - if (block.timestamp < _revealStartTime) revert PrivateERC20ResolutionModule_OnGoingCommittingPhase(); - if (block.timestamp >= _revealEndTime) revert PrivateERC20ResolutionModule_RevealingPhaseOver(); + { + (uint256 _revealStartTime, uint256 _revealEndTime) = ( + _escalation.startTime + _params.committingTimeWindow, + _escalation.startTime + _params.committingTimeWindow + _params.revealingTimeWindow + ); + if (block.timestamp < _revealStartTime) revert PrivateERC20ResolutionModule_OnGoingCommittingPhase(); + if (block.timestamp >= _revealEndTime) revert PrivateERC20ResolutionModule_RevealingPhaseOver(); + } address _voter = _accessControl.user; VoterData storage _voterData = _votersData[_disputeId][_voter]; From b863c5e4d868b8d480c7dc86c1f3db37481a84f4 Mon Sep 17 00:00:00 2001 From: zorzal Date: Tue, 12 Nov 2024 09:44:44 -0500 Subject: [PATCH 47/50] chore: remove addressed todos by _addressed_ I mean either in this branch or by creating a task to track it :) --- solidity/contracts/modules/access/ModuleAccessController.sol | 1 - solidity/test/integration/BondEscalation.t.sol | 2 -- solidity/test/mocks/MockAtomicArbitrator.sol | 1 - solidity/test/unit/modules/dispute/BondEscalationModule.t.sol | 1 - solidity/test/unit/modules/response/BondedResponseModule.t.sol | 1 - 5 files changed, 6 deletions(-) diff --git a/solidity/contracts/modules/access/ModuleAccessController.sol b/solidity/contracts/modules/access/ModuleAccessController.sol index e2cd9c21..b1ab5197 100644 --- a/solidity/contracts/modules/access/ModuleAccessController.sol +++ b/solidity/contracts/modules/access/ModuleAccessController.sol @@ -40,7 +40,6 @@ abstract contract ModuleAccessController is IModuleAccessController, CommonAcces if (msg.sender != _accessControl.user && !ORACLE.isAccessModuleApproved(_accessControl.user, _accessModule)) { revert ModuleAccessController_AccessModuleNotApproved(); } - // todo: probably a change name is required here, something like `_ensureAccess`? _hasAccess(_accessModule, _typehash, _params, _accessControl); _; } diff --git a/solidity/test/integration/BondEscalation.t.sol b/solidity/test/integration/BondEscalation.t.sol index 190510fb..7a2360db 100644 --- a/solidity/test/integration/BondEscalation.t.sol +++ b/solidity/test/integration/BondEscalation.t.sol @@ -348,7 +348,6 @@ contract Integration_BondEscalation is IntegrationBase { _bondEscalationModule.pledgeForDispute(mockRequest, mockDispute, _createAccessControl(_secondDisputer)); // Step 7: They go into the dispute resolution module - // review: we could use a global address `_anyone` address _escalator = makeAddr('escalator'); vm.prank(_escalator); oracle.escalateDispute(mockRequest, mockResponse, mockDispute, _createAccessControl(_escalator)); @@ -428,7 +427,6 @@ contract Integration_BondEscalation is IntegrationBase { vm.warp(block.timestamp + _bondEscalationDeadline + 1); - // todo: use `_anyone` vm.prank(_escalator); oracle.escalateDispute(mockRequest, mockResponse, mockDispute, _createAccessControl(_escalator)); vm.prank(_resolver); diff --git a/solidity/test/mocks/MockAtomicArbitrator.sol b/solidity/test/mocks/MockAtomicArbitrator.sol index 95a02151..710da1bc 100644 --- a/solidity/test/mocks/MockAtomicArbitrator.sol +++ b/solidity/test/mocks/MockAtomicArbitrator.sol @@ -20,7 +20,6 @@ contract MockAtomicArbitrator is IArbitrator { ) external returns (bytes memory _result) { _result = new bytes(0); answer = IOracle.DisputeStatus.Won; - // review: really not sure about this change oracle.resolveDispute(_request, _response, _dispute, IAccessController.AccessControl(address(this), bytes(''))); } diff --git a/solidity/test/unit/modules/dispute/BondEscalationModule.t.sol b/solidity/test/unit/modules/dispute/BondEscalationModule.t.sol index 00582e47..bdd9957b 100644 --- a/solidity/test/unit/modules/dispute/BondEscalationModule.t.sol +++ b/solidity/test/unit/modules/dispute/BondEscalationModule.t.sol @@ -1684,7 +1684,6 @@ contract BondEscalationModule_Unit_AccessControl is BaseTest { _setBondEscalation(_requestId, _numForPledgers, _numAgainstPledgers); - // todo: extract to helper when we add tests for the other access controlled functions _mockAndExpect( address(oracle), abi.encodeCall(IOracleAccessController.isAccessModuleApproved, (_user, _accessModule)), diff --git a/solidity/test/unit/modules/response/BondedResponseModule.t.sol b/solidity/test/unit/modules/response/BondedResponseModule.t.sol index c553bc88..5e65732a 100644 --- a/solidity/test/unit/modules/response/BondedResponseModule.t.sol +++ b/solidity/test/unit/modules/response/BondedResponseModule.t.sol @@ -646,7 +646,6 @@ contract BondedResponseModule_Unit_ReleaseUnutilizedResponse is BaseTest { vm.expectRevert(IBondedResponseModule.BondedResponseModule_InvalidReleaseParameters.selector); } - // todo: use `_anyone` address _notTheProposer = makeAddr('not-the-proposer'); vm.prank(_notTheProposer); bondedResponseModule.releaseUnutilizedResponse(mockRequest, _response); From ebc91e83f52d50ecd6755c3312c4102f8083d3ee Mon Sep 17 00:00:00 2001 From: Gas One Cent <86567384+gas1cent@users.noreply.github.com> Date: Tue, 12 Nov 2024 18:29:32 +0400 Subject: [PATCH 48/50] feat: update prophet-core --- package.json | 2 +- report.md | 918 +++++++++++++++++++++++++++++++++++++++++++++++++++ yarn.lock | 8 +- 3 files changed, 923 insertions(+), 5 deletions(-) create mode 100644 report.md diff --git a/package.json b/package.json index 0a893bbe..7e90eff5 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "package.json": "sort-package-json" }, "dependencies": { - "@defi-wonderland/prophet-core": "0.0.0-823459fc", + "@defi-wonderland/prophet-core": "0.0.0-0e46031c", "@openzeppelin/contracts": "4.9.5", "solmate": "https://github.com/transmissions11/solmate.git#bfc9c25865a274a7827fea5abf6e4fb64fc64e6c" }, diff --git a/report.md b/report.md new file mode 100644 index 00000000..2d1b9837 --- /dev/null +++ b/report.md @@ -0,0 +1,918 @@ +# Aderyn Analysis Report + +This report was generated by [Aderyn](https://github.com/Cyfrin/aderyn), a static analysis tool built by [Cyfrin](https://cyfrin.io), a blockchain security company. This report is not a substitute for manual audit or security review. It should not be relied upon for any purpose other than to assist in the identification of potential security vulnerabilities. +# Table of Contents + +- [Summary](#summary) + - [Files Summary](#files-summary) + - [Files Details](#files-details) + - [Issue Summary](#issue-summary) +- [Low Issues](#low-issues) + - [L-1: Unsafe ERC20 Operations should not be used](#l-1-unsafe-erc20-operations-should-not-be-used) + - [L-2: Solidity pragma should be specific, not wide](#l-2-solidity-pragma-should-be-specific-not-wide) + - [L-3: PUSH0 is not supported by all chains](#l-3-push0-is-not-supported-by-all-chains) +- [NC Issues](#nc-issues) + - [NC-1: Missing checks for `address(0)` when assigning values to address state variables](#nc-1-missing-checks-for-address0-when-assigning-values-to-address-state-variables) + - [NC-2: Functions not used internally could be marked external](#nc-2-functions-not-used-internally-could-be-marked-external) + - [NC-3: Constants should be defined and used instead of literals](#nc-3-constants-should-be-defined-and-used-instead-of-literals) + - [NC-4: Event is missing `indexed` fields](#nc-4-event-is-missing-indexed-fields) + + +# Summary + +## Files Summary + +| Key | Value | +| --- | --- | +| .sol Files | 44 | +| Total nSLOC | 9385 | + + +## Files Details + +| Filepath | nSLOC | +| --- | --- | +| solidity/contracts/extensions/AccountingExtension.sol | 109 | +| solidity/contracts/extensions/BondEscalationAccounting.sol | 103 | +| solidity/contracts/modules/dispute/BondEscalationModule.sol | 256 | +| solidity/contracts/modules/dispute/BondedDisputeModule.sol | 95 | +| solidity/contracts/modules/dispute/CircuitResolverModule.sol | 76 | +| solidity/contracts/modules/dispute/RootVerificationModule.sol | 76 | +| solidity/contracts/modules/finality/CallbackModule.sol | 32 | +| solidity/contracts/modules/finality/MultipleCallbacksModule.sol | 50 | +| solidity/contracts/modules/request/ContractCallRequestModule.sol | 56 | +| solidity/contracts/modules/request/HttpRequestModule.sol | 56 | +| solidity/contracts/modules/request/SparseMerkleTreeRequestModule.sol | 57 | +| solidity/contracts/modules/resolution/ArbitratorModule.sol | 53 | +| solidity/contracts/modules/resolution/BondEscalationResolutionModule.sol | 259 | +| solidity/contracts/modules/resolution/ERC20ResolutionModule.sol | 96 | +| solidity/contracts/modules/resolution/PrivateERC20ResolutionModule.sol | 125 | +| solidity/contracts/modules/response/BondedResponseModule.sol | 93 | +| solidity/contracts/periphery/SparseMerkleTreeL32Verifier.sol | 29 | +| solidity/interfaces/IArbitrator.sol | 10 | +| solidity/interfaces/ITreeVerifier.sol | 7 | +| solidity/interfaces/extensions/IAccountingExtension.sol | 28 | +| solidity/interfaces/extensions/IBondEscalationAccounting.sol | 56 | +| solidity/interfaces/modules/dispute/IBondEscalationModule.sol | 70 | +| solidity/interfaces/modules/dispute/IBondedDisputeModule.sol | 25 | +| solidity/interfaces/modules/dispute/ICircuitResolverModule.sol | 28 | +| solidity/interfaces/modules/dispute/IRootVerificationModule.sol | 29 | +| solidity/interfaces/modules/finality/ICallbackModule.sol | 17 | +| solidity/interfaces/modules/finality/IMultipleCallbacksModule.sol | 17 | +| solidity/interfaces/modules/request/IContractCallRequestModule.sol | 23 | +| solidity/interfaces/modules/request/IHttpRequestModule.sol | 27 | +| solidity/interfaces/modules/request/ISparseMerkleTreeRequestModule.sol | 24 | +| solidity/interfaces/modules/resolution/IArbitratorModule.sol | 31 | +| solidity/interfaces/modules/resolution/IBondEscalationResolutionModule.sol | 83 | +| solidity/interfaces/modules/resolution/IERC20ResolutionModule.sol | 49 | +| solidity/interfaces/modules/resolution/IPrivateERC20ResolutionModule.sol | 65 | +| solidity/interfaces/modules/response/IBondedResponseModule.sol | 29 | +| solidity/scripts/Deploy.sol | 77 | +| solidity/test/integration/IntegrationBase.sol | 171 | +| solidity/test/mocks/MockArbitrator.sol | 21 | +| solidity/test/mocks/MockAtomicArbitrator.sol | 25 | +| solidity/test/mocks/MockCallback.sol | 8 | +| solidity/test/mocks/MockVerifier.sol | 11 | +| solidity/test/utils/Helpers.sol | 43 | +| solidity/test/utils/TestConstants.sol | 7 | +| solidity/test/utils/external/IWETH9.sol | 6 | +| **Total** | **9385** | + + +## Issue Summary + +| Category | No. of Issues | +| --- | --- | +| Critical | 0 | +| High | 0 | +| Medium | 0 | +| Low | 3 | +| NC | 4 | + + +# Low Issues + +## L-1: Unsafe ERC20 Operations should not be used + +ERC20 functions may not behave as expected. For example: return values are not always meaningful. It is recommended to use OpenZeppelin's SafeERC20 library. + +- Found in solidity/test/integration/IntegrationBase.sol [Line: 246](solidity/test/integration/IntegrationBase.sol#L246) + + ```solidity + _token.approve(address(_accounting), _amount); + ``` + + + +## L-2: Solidity pragma should be specific, not wide + +Consider using a specific version of Solidity in your contracts instead of a wide version. For example, instead of `pragma solidity ^0.8.0;`, use `pragma solidity 0.8.0;` + +- Found in solidity/contracts/extensions/AccountingExtension.sol [Line: 2](solidity/contracts/extensions/AccountingExtension.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/contracts/extensions/BondEscalationAccounting.sol [Line: 2](solidity/contracts/extensions/BondEscalationAccounting.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/contracts/modules/dispute/BondEscalationModule.sol [Line: 2](solidity/contracts/modules/dispute/BondEscalationModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/contracts/modules/dispute/BondedDisputeModule.sol [Line: 2](solidity/contracts/modules/dispute/BondedDisputeModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/contracts/modules/dispute/CircuitResolverModule.sol [Line: 2](solidity/contracts/modules/dispute/CircuitResolverModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/contracts/modules/dispute/RootVerificationModule.sol [Line: 2](solidity/contracts/modules/dispute/RootVerificationModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/contracts/modules/finality/CallbackModule.sol [Line: 2](solidity/contracts/modules/finality/CallbackModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/contracts/modules/finality/MultipleCallbacksModule.sol [Line: 2](solidity/contracts/modules/finality/MultipleCallbacksModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/contracts/modules/request/ContractCallRequestModule.sol [Line: 2](solidity/contracts/modules/request/ContractCallRequestModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/contracts/modules/request/HttpRequestModule.sol [Line: 2](solidity/contracts/modules/request/HttpRequestModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/contracts/modules/request/SparseMerkleTreeRequestModule.sol [Line: 2](solidity/contracts/modules/request/SparseMerkleTreeRequestModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/contracts/modules/resolution/ArbitratorModule.sol [Line: 2](solidity/contracts/modules/resolution/ArbitratorModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/contracts/modules/resolution/BondEscalationResolutionModule.sol [Line: 2](solidity/contracts/modules/resolution/BondEscalationResolutionModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/contracts/modules/resolution/ERC20ResolutionModule.sol [Line: 2](solidity/contracts/modules/resolution/ERC20ResolutionModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/contracts/modules/resolution/PrivateERC20ResolutionModule.sol [Line: 2](solidity/contracts/modules/resolution/PrivateERC20ResolutionModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/contracts/modules/response/BondedResponseModule.sol [Line: 2](solidity/contracts/modules/response/BondedResponseModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/contracts/periphery/SparseMerkleTreeL32Verifier.sol [Line: 2](solidity/contracts/periphery/SparseMerkleTreeL32Verifier.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/interfaces/IArbitrator.sol [Line: 2](solidity/interfaces/IArbitrator.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/interfaces/ITreeVerifier.sol [Line: 2](solidity/interfaces/ITreeVerifier.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/interfaces/extensions/IAccountingExtension.sol [Line: 2](solidity/interfaces/extensions/IAccountingExtension.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/interfaces/extensions/IBondEscalationAccounting.sol [Line: 2](solidity/interfaces/extensions/IBondEscalationAccounting.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/interfaces/modules/dispute/IBondEscalationModule.sol [Line: 2](solidity/interfaces/modules/dispute/IBondEscalationModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/interfaces/modules/dispute/IBondedDisputeModule.sol [Line: 2](solidity/interfaces/modules/dispute/IBondedDisputeModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/interfaces/modules/dispute/ICircuitResolverModule.sol [Line: 2](solidity/interfaces/modules/dispute/ICircuitResolverModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/interfaces/modules/dispute/IRootVerificationModule.sol [Line: 2](solidity/interfaces/modules/dispute/IRootVerificationModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/interfaces/modules/finality/ICallbackModule.sol [Line: 2](solidity/interfaces/modules/finality/ICallbackModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/interfaces/modules/finality/IMultipleCallbacksModule.sol [Line: 2](solidity/interfaces/modules/finality/IMultipleCallbacksModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/interfaces/modules/request/IContractCallRequestModule.sol [Line: 2](solidity/interfaces/modules/request/IContractCallRequestModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/interfaces/modules/request/IHttpRequestModule.sol [Line: 2](solidity/interfaces/modules/request/IHttpRequestModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/interfaces/modules/request/ISparseMerkleTreeRequestModule.sol [Line: 2](solidity/interfaces/modules/request/ISparseMerkleTreeRequestModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/interfaces/modules/resolution/IArbitratorModule.sol [Line: 2](solidity/interfaces/modules/resolution/IArbitratorModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/interfaces/modules/resolution/IBondEscalationResolutionModule.sol [Line: 2](solidity/interfaces/modules/resolution/IBondEscalationResolutionModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/interfaces/modules/resolution/IERC20ResolutionModule.sol [Line: 2](solidity/interfaces/modules/resolution/IERC20ResolutionModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/interfaces/modules/resolution/IPrivateERC20ResolutionModule.sol [Line: 2](solidity/interfaces/modules/resolution/IPrivateERC20ResolutionModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/interfaces/modules/response/IBondedResponseModule.sol [Line: 2](solidity/interfaces/modules/response/IBondedResponseModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/scripts/Deploy.sol [Line: 2](solidity/scripts/Deploy.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/test/integration/IntegrationBase.sol [Line: 2](solidity/test/integration/IntegrationBase.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/test/mocks/MockArbitrator.sol [Line: 2](solidity/test/mocks/MockArbitrator.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/test/mocks/MockAtomicArbitrator.sol [Line: 2](solidity/test/mocks/MockAtomicArbitrator.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/test/mocks/MockCallback.sol [Line: 2](solidity/test/mocks/MockCallback.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/test/mocks/MockVerifier.sol [Line: 2](solidity/test/mocks/MockVerifier.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/test/utils/Helpers.sol [Line: 2](solidity/test/utils/Helpers.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/test/utils/TestConstants.sol [Line: 2](solidity/test/utils/TestConstants.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/test/utils/external/IWETH9.sol [Line: 2](solidity/test/utils/external/IWETH9.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + + + +## L-3: PUSH0 is not supported by all chains + +Solc compiler version 0.8.20 switches the default target EVM version to Shanghai, which means that the generated bytecode will include PUSH0 opcodes. Be sure to select the appropriate EVM version in case you intend to deploy on a chain other than mainnet like L2 chains that may not support PUSH0, otherwise deployment of your contracts will fail. + +- Found in solidity/contracts/extensions/AccountingExtension.sol [Line: 2](solidity/contracts/extensions/AccountingExtension.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/contracts/extensions/BondEscalationAccounting.sol [Line: 2](solidity/contracts/extensions/BondEscalationAccounting.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/contracts/modules/dispute/BondEscalationModule.sol [Line: 2](solidity/contracts/modules/dispute/BondEscalationModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/contracts/modules/dispute/BondedDisputeModule.sol [Line: 2](solidity/contracts/modules/dispute/BondedDisputeModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/contracts/modules/dispute/CircuitResolverModule.sol [Line: 2](solidity/contracts/modules/dispute/CircuitResolverModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/contracts/modules/dispute/RootVerificationModule.sol [Line: 2](solidity/contracts/modules/dispute/RootVerificationModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/contracts/modules/finality/CallbackModule.sol [Line: 2](solidity/contracts/modules/finality/CallbackModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/contracts/modules/finality/MultipleCallbacksModule.sol [Line: 2](solidity/contracts/modules/finality/MultipleCallbacksModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/contracts/modules/request/ContractCallRequestModule.sol [Line: 2](solidity/contracts/modules/request/ContractCallRequestModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/contracts/modules/request/HttpRequestModule.sol [Line: 2](solidity/contracts/modules/request/HttpRequestModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/contracts/modules/request/SparseMerkleTreeRequestModule.sol [Line: 2](solidity/contracts/modules/request/SparseMerkleTreeRequestModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/contracts/modules/resolution/ArbitratorModule.sol [Line: 2](solidity/contracts/modules/resolution/ArbitratorModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/contracts/modules/resolution/BondEscalationResolutionModule.sol [Line: 2](solidity/contracts/modules/resolution/BondEscalationResolutionModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/contracts/modules/resolution/ERC20ResolutionModule.sol [Line: 2](solidity/contracts/modules/resolution/ERC20ResolutionModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/contracts/modules/resolution/PrivateERC20ResolutionModule.sol [Line: 2](solidity/contracts/modules/resolution/PrivateERC20ResolutionModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/contracts/modules/response/BondedResponseModule.sol [Line: 2](solidity/contracts/modules/response/BondedResponseModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/contracts/periphery/SparseMerkleTreeL32Verifier.sol [Line: 2](solidity/contracts/periphery/SparseMerkleTreeL32Verifier.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/interfaces/IArbitrator.sol [Line: 2](solidity/interfaces/IArbitrator.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/interfaces/ITreeVerifier.sol [Line: 2](solidity/interfaces/ITreeVerifier.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/interfaces/extensions/IAccountingExtension.sol [Line: 2](solidity/interfaces/extensions/IAccountingExtension.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/interfaces/extensions/IBondEscalationAccounting.sol [Line: 2](solidity/interfaces/extensions/IBondEscalationAccounting.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/interfaces/modules/dispute/IBondEscalationModule.sol [Line: 2](solidity/interfaces/modules/dispute/IBondEscalationModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/interfaces/modules/dispute/IBondedDisputeModule.sol [Line: 2](solidity/interfaces/modules/dispute/IBondedDisputeModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/interfaces/modules/dispute/ICircuitResolverModule.sol [Line: 2](solidity/interfaces/modules/dispute/ICircuitResolverModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/interfaces/modules/dispute/IRootVerificationModule.sol [Line: 2](solidity/interfaces/modules/dispute/IRootVerificationModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/interfaces/modules/finality/ICallbackModule.sol [Line: 2](solidity/interfaces/modules/finality/ICallbackModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/interfaces/modules/finality/IMultipleCallbacksModule.sol [Line: 2](solidity/interfaces/modules/finality/IMultipleCallbacksModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/interfaces/modules/request/IContractCallRequestModule.sol [Line: 2](solidity/interfaces/modules/request/IContractCallRequestModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/interfaces/modules/request/IHttpRequestModule.sol [Line: 2](solidity/interfaces/modules/request/IHttpRequestModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/interfaces/modules/request/ISparseMerkleTreeRequestModule.sol [Line: 2](solidity/interfaces/modules/request/ISparseMerkleTreeRequestModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/interfaces/modules/resolution/IArbitratorModule.sol [Line: 2](solidity/interfaces/modules/resolution/IArbitratorModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/interfaces/modules/resolution/IBondEscalationResolutionModule.sol [Line: 2](solidity/interfaces/modules/resolution/IBondEscalationResolutionModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/interfaces/modules/resolution/IERC20ResolutionModule.sol [Line: 2](solidity/interfaces/modules/resolution/IERC20ResolutionModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/interfaces/modules/resolution/IPrivateERC20ResolutionModule.sol [Line: 2](solidity/interfaces/modules/resolution/IPrivateERC20ResolutionModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/interfaces/modules/response/IBondedResponseModule.sol [Line: 2](solidity/interfaces/modules/response/IBondedResponseModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/scripts/Deploy.sol [Line: 2](solidity/scripts/Deploy.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/test/integration/IntegrationBase.sol [Line: 2](solidity/test/integration/IntegrationBase.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/test/mocks/MockArbitrator.sol [Line: 2](solidity/test/mocks/MockArbitrator.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/test/mocks/MockAtomicArbitrator.sol [Line: 2](solidity/test/mocks/MockAtomicArbitrator.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/test/mocks/MockCallback.sol [Line: 2](solidity/test/mocks/MockCallback.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/test/mocks/MockVerifier.sol [Line: 2](solidity/test/mocks/MockVerifier.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/test/utils/Helpers.sol [Line: 2](solidity/test/utils/Helpers.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/test/utils/TestConstants.sol [Line: 2](solidity/test/utils/TestConstants.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in solidity/test/utils/external/IWETH9.sol [Line: 2](solidity/test/utils/external/IWETH9.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + + + +# NC Issues + +## NC-1: Missing checks for `address(0)` when assigning values to address state variables + +Assigning values to address state variables without checking for `address(0)`. + +- Found in solidity/test/mocks/MockAtomicArbitrator.sol [Line: 12](solidity/test/mocks/MockAtomicArbitrator.sol#L12) + + ```solidity + oracle = _oracle; + ``` + + + +## NC-2: Functions not used internally could be marked external + + + +- Found in solidity/contracts/modules/dispute/BondEscalationModule.sol [Line: 335](solidity/contracts/modules/dispute/BondEscalationModule.sol#L335) + + ```solidity + function getEscalation(bytes32 _requestId) public view returns (BondEscalation memory _escalation) { + ``` + +- Found in solidity/contracts/modules/finality/CallbackModule.sol [Line: 14](solidity/contracts/modules/finality/CallbackModule.sol#L14) + + ```solidity + function moduleName() public pure returns (string memory _moduleName) { + ``` + +- Found in solidity/contracts/modules/finality/MultipleCallbacksModule.sol [Line: 19](solidity/contracts/modules/finality/MultipleCallbacksModule.sol#L19) + + ```solidity + function moduleName() public pure returns (string memory _moduleName) { + ``` + +- Found in solidity/contracts/modules/request/ContractCallRequestModule.sol [Line: 14](solidity/contracts/modules/request/ContractCallRequestModule.sol#L14) + + ```solidity + function moduleName() public pure returns (string memory _moduleName) { + ``` + +- Found in solidity/contracts/modules/request/HttpRequestModule.sol [Line: 14](solidity/contracts/modules/request/HttpRequestModule.sol#L14) + + ```solidity + function moduleName() public pure returns (string memory _moduleName) { + ``` + +- Found in solidity/contracts/modules/request/SparseMerkleTreeRequestModule.sol [Line: 14](solidity/contracts/modules/request/SparseMerkleTreeRequestModule.sol#L14) + + ```solidity + function moduleName() public pure returns (string memory _moduleName) { + ``` + +- Found in solidity/contracts/modules/resolution/ERC20ResolutionModule.sol [Line: 54](solidity/contracts/modules/resolution/ERC20ResolutionModule.sol#L54) + + ```solidity + function castVote( + ``` + +- Found in solidity/contracts/modules/resolution/PrivateERC20ResolutionModule.sol [Line: 54](solidity/contracts/modules/resolution/PrivateERC20ResolutionModule.sol#L54) + + ```solidity + function commitVote(IOracle.Request calldata _request, IOracle.Dispute calldata _dispute, bytes32 _commitment) public { + ``` + +- Found in solidity/contracts/modules/resolution/PrivateERC20ResolutionModule.sol [Line: 75](solidity/contracts/modules/resolution/PrivateERC20ResolutionModule.sol#L75) + + ```solidity + function revealVote( + ``` + +- Found in solidity/contracts/modules/response/BondedResponseModule.sol [Line: 13](solidity/contracts/modules/response/BondedResponseModule.sol#L13) + + ```solidity + function moduleName() public pure returns (string memory _moduleName) { + ``` + +- Found in solidity/scripts/Deploy.sol [Line: 63](solidity/scripts/Deploy.sol#L63) + + ```solidity + function run() public { + ``` + +- Found in solidity/test/integration/IntegrationBase.sol [Line: 80](solidity/test/integration/IntegrationBase.sol#L80) + + ```solidity + function setUp() public virtual { + ``` + + + +## NC-3: Constants should be defined and used instead of literals + + + +- Found in solidity/contracts/extensions/BondEscalationAccounting.sol [Line: 87](solidity/contracts/extensions/BondEscalationAccounting.sol#L87) + + ```solidity + _numberOfPledges = 1; + ``` + +- Found in solidity/contracts/modules/dispute/BondEscalationModule.sol [Line: 217](solidity/contracts/modules/dispute/BondEscalationModule.sol#L217) + + ```solidity + _escalations[_dispute.requestId].amountOfPledgesForDispute += 1; + ``` + +- Found in solidity/contracts/modules/dispute/BondEscalationModule.sol [Line: 218](solidity/contracts/modules/dispute/BondEscalationModule.sol#L218) + + ```solidity + pledgesForDispute[_dispute.requestId][msg.sender] += 1; + ``` + +- Found in solidity/contracts/modules/dispute/BondEscalationModule.sol [Line: 235](solidity/contracts/modules/dispute/BondEscalationModule.sol#L235) + + ```solidity + _escalations[_dispute.requestId].amountOfPledgesAgainstDispute += 1; + ``` + +- Found in solidity/contracts/modules/dispute/BondEscalationModule.sol [Line: 236](solidity/contracts/modules/dispute/BondEscalationModule.sol#L236) + + ```solidity + pledgesAgainstDispute[_dispute.requestId][msg.sender] += 1; + ``` + +- Found in solidity/contracts/modules/resolution/BondEscalationResolutionModule.sol [Line: 283](solidity/contracts/modules/resolution/BondEscalationResolutionModule.sol#L283) + + ```solidity + int256 _scaledPercentageDiffAsInt = int256(_percentageDiff * BASE / 100); + ``` + +- Found in solidity/contracts/modules/resolution/ERC20ResolutionModule.sol [Line: 100](solidity/contracts/modules/resolution/ERC20ResolutionModule.sol#L100) + + ```solidity + uint256 _quorumReached = _escalation.totalVotes >= _params.minVotesForQuorum ? 1 : 0; + ``` + +- Found in solidity/contracts/modules/resolution/ERC20ResolutionModule.sol [Line: 103](solidity/contracts/modules/resolution/ERC20ResolutionModule.sol#L103) + + ```solidity + if (_quorumReached == 1) { + ``` + +- Found in solidity/contracts/modules/resolution/PrivateERC20ResolutionModule.sol [Line: 133](solidity/contracts/modules/resolution/PrivateERC20ResolutionModule.sol#L133) + + ```solidity + uint256 _quorumReached = _escalation.totalVotes >= _params.minVotesForQuorum ? 1 : 0; + ``` + +- Found in solidity/contracts/modules/resolution/PrivateERC20ResolutionModule.sol [Line: 137](solidity/contracts/modules/resolution/PrivateERC20ResolutionModule.sol#L137) + + ```solidity + if (_quorumReached == 1) { + ``` + +- Found in solidity/contracts/modules/response/BondedResponseModule.sol [Line: 38](solidity/contracts/modules/response/BondedResponseModule.sol#L38) + + ```solidity + bytes32 _disputeId = ORACLE.disputeOf(_responseIds[_responsesLength - 1]); + ``` + +- Found in solidity/contracts/periphery/SparseMerkleTreeL32Verifier.sol [Line: 28](solidity/contracts/periphery/SparseMerkleTreeL32Verifier.sol#L28) + + ```solidity + (_treeBranches, _treeCount) = abi.decode(_treeData, (bytes32[32], uint256)); + ``` + +- Found in solidity/test/integration/IntegrationBase.sol [Line: 179](solidity/test/integration/IntegrationBase.sol#L179) + + ```solidity + _mineBlocks(1); + ``` + +- Found in solidity/test/utils/Helpers.sol [Line: 91](solidity/test/utils/Helpers.sol#L91) + + ```solidity + vm.etch(_contract, hex'69'); + ``` + + + +## NC-4: Event is missing `indexed` fields + +Index event fields make the field more quickly accessible to off-chain tools that parse events. However, note that each index field costs extra gas during emission, so it's not necessarily best to index the maximum allowed per event (three fields). Each event should use three indexed fields if there are three or more fields, and gas usage is not particularly of concern for the events in question. If there are fewer than three fields, all of the fields should be indexed. + +- Found in solidity/interfaces/extensions/IAccountingExtension.sol [Line: 23](solidity/interfaces/extensions/IAccountingExtension.sol#L23) + + ```solidity + event Deposited(address indexed _depositor, IERC20 indexed _token, uint256 _amount); + ``` + +- Found in solidity/interfaces/extensions/IAccountingExtension.sol [Line: 31](solidity/interfaces/extensions/IAccountingExtension.sol#L31) + + ```solidity + event Withdrew(address indexed _withdrawer, IERC20 indexed _token, uint256 _amount); + ``` + +- Found in solidity/interfaces/extensions/IBondEscalationAccounting.sol [Line: 56](solidity/interfaces/extensions/IBondEscalationAccounting.sol#L56) + + ```solidity + event BondEscalationSettled( + ``` + +- Found in solidity/interfaces/modules/dispute/IBondEscalationModule.sol [Line: 45](solidity/interfaces/modules/dispute/IBondEscalationModule.sol#L45) + + ```solidity + event BondEscalationStatusUpdated( + ``` + +- Found in solidity/interfaces/modules/finality/ICallbackModule.sol [Line: 24](solidity/interfaces/modules/finality/ICallbackModule.sol#L24) + + ```solidity + event Callback(bytes32 indexed _requestId, address indexed _target, bytes _data); + ``` + +- Found in solidity/interfaces/modules/finality/IMultipleCallbacksModule.sol [Line: 24](solidity/interfaces/modules/finality/IMultipleCallbacksModule.sol#L24) + + ```solidity + event Callback(bytes32 indexed _requestId, address indexed _target, bytes _data); + ``` + +- Found in solidity/interfaces/modules/resolution/IERC20ResolutionModule.sol [Line: 30](solidity/interfaces/modules/resolution/IERC20ResolutionModule.sol#L30) + + ```solidity + event VoteCast(address _voter, bytes32 _disputeId, uint256 _numberOfVotes); + ``` + +- Found in solidity/interfaces/modules/resolution/IERC20ResolutionModule.sol [Line: 37](solidity/interfaces/modules/resolution/IERC20ResolutionModule.sol#L37) + + ```solidity + event VotingPhaseStarted(uint256 _startTime, bytes32 _disputeId); + ``` + +- Found in solidity/interfaces/modules/resolution/IERC20ResolutionModule.sol [Line: 42](solidity/interfaces/modules/resolution/IERC20ResolutionModule.sol#L42) + + ```solidity + event VoteClaimed(address _voter, bytes32 _disputeId, uint256 _amount); + ``` + +- Found in solidity/interfaces/modules/resolution/IPrivateERC20ResolutionModule.sol [Line: 26](solidity/interfaces/modules/resolution/IPrivateERC20ResolutionModule.sol#L26) + + ```solidity + event VoteCommitted(address _voter, bytes32 _disputeId, bytes32 _commitment); + ``` + +- Found in solidity/interfaces/modules/resolution/IPrivateERC20ResolutionModule.sol [Line: 35](solidity/interfaces/modules/resolution/IPrivateERC20ResolutionModule.sol#L35) + + ```solidity + event VoteRevealed(address _voter, bytes32 _disputeId, uint256 _numberOfVotes); + ``` + +- Found in solidity/interfaces/modules/resolution/IPrivateERC20ResolutionModule.sol [Line: 42](solidity/interfaces/modules/resolution/IPrivateERC20ResolutionModule.sol#L42) + + ```solidity + event CommittingPhaseStarted(uint256 _startTime, bytes32 _disputeId); + ``` + +- Found in solidity/interfaces/modules/response/IBondedResponseModule.sol [Line: 26](solidity/interfaces/modules/response/IBondedResponseModule.sol#L26) + + ```solidity + event ResponseProposed(bytes32 indexed _requestId, IOracle.Response _response, uint256 indexed _blockNumber); + ``` + +- Found in solidity/test/utils/Helpers.sol [Line: 23](solidity/test/utils/Helpers.sol#L23) + + ```solidity + event RequestFinalized(bytes32 indexed _requestId, IOracle.Response _response, address _finalizer); + ``` + + + diff --git a/yarn.lock b/yarn.lock index ac0d62e4..931b0815 100644 --- a/yarn.lock +++ b/yarn.lock @@ -193,10 +193,10 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" -"@defi-wonderland/prophet-core@0.0.0-823459fc": - version "0.0.0-823459fc" - resolved "https://registry.yarnpkg.com/@defi-wonderland/prophet-core/-/prophet-core-0.0.0-823459fc.tgz#a48f7b35899968468f37f5c9eb2c67a1c8a823ff" - integrity sha512-lqTFlKFUwt4yjBGnSUJf9PwNQE6MP4KJHUSCov2+yxJCkKHKzFlYQ7M25dAdebiwa6Hfd+XHQfLx1bzff6mM6Q== +"@defi-wonderland/prophet-core@0.0.0-0e46031c": + version "0.0.0-0e46031c" + resolved "https://registry.yarnpkg.com/@defi-wonderland/prophet-core/-/prophet-core-0.0.0-0e46031c.tgz#0c31c1a8b45dce4789a1605764672aa9470e89ef" + integrity sha512-0y2Bczrhz3G3lto6UhT8JCfsakKnyi4ERgVIDvjjT8ryBjKBSJqw0jbZ79zU1OMUEE3QiUMKmm7p9V1LsLXiXw== "@defi-wonderland/solidity-utils@0.0.0-3e9c8e8b": version "0.0.0-3e9c8e8b" From 0977b85e03a6c0c6e6cfee2aa53d31c9ee683a7e Mon Sep 17 00:00:00 2001 From: Gas One Cent <86567384+gas1cent@users.noreply.github.com> Date: Tue, 12 Nov 2024 19:27:26 +0400 Subject: [PATCH 49/50] feat: avoid external calls if access control user is the sender --- .../modules/access/ModuleAccessController.sol | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/solidity/contracts/modules/access/ModuleAccessController.sol b/solidity/contracts/modules/access/ModuleAccessController.sol index b1ab5197..58d09859 100644 --- a/solidity/contracts/modules/access/ModuleAccessController.sol +++ b/solidity/contracts/modules/access/ModuleAccessController.sol @@ -36,11 +36,16 @@ abstract contract ModuleAccessController is IModuleAccessController, CommonAcces bytes memory _params, AccessControl memory _accessControl ) { - // Revert if sender is acting for a user without module approval - if (msg.sender != _accessControl.user && !ORACLE.isAccessModuleApproved(_accessControl.user, _accessModule)) { - revert ModuleAccessController_AccessModuleNotApproved(); + if (_accessControl.user != msg.sender) { + if (_accessModule == address(0)) { + revert AccessController_NoAccess(); + } else { + if (!ORACLE.isAccessModuleApproved(_accessControl.user, _accessModule)) { + revert ModuleAccessController_AccessModuleNotApproved(); + } + _hasAccess(_accessModule, _typehash, _params, _accessControl); + } } - _hasAccess(_accessModule, _typehash, _params, _accessControl); _; } } From d5e88d5a62c39f9f875585da78251f25e0fc8a8f Mon Sep 17 00:00:00 2001 From: Gas One Cent <86567384+gas1cent@users.noreply.github.com> Date: Tue, 12 Nov 2024 19:39:20 +0400 Subject: [PATCH 50/50] feat: remove Aderyn report --- report.md | 918 ------------------------------------------------------ 1 file changed, 918 deletions(-) delete mode 100644 report.md diff --git a/report.md b/report.md deleted file mode 100644 index 2d1b9837..00000000 --- a/report.md +++ /dev/null @@ -1,918 +0,0 @@ -# Aderyn Analysis Report - -This report was generated by [Aderyn](https://github.com/Cyfrin/aderyn), a static analysis tool built by [Cyfrin](https://cyfrin.io), a blockchain security company. This report is not a substitute for manual audit or security review. It should not be relied upon for any purpose other than to assist in the identification of potential security vulnerabilities. -# Table of Contents - -- [Summary](#summary) - - [Files Summary](#files-summary) - - [Files Details](#files-details) - - [Issue Summary](#issue-summary) -- [Low Issues](#low-issues) - - [L-1: Unsafe ERC20 Operations should not be used](#l-1-unsafe-erc20-operations-should-not-be-used) - - [L-2: Solidity pragma should be specific, not wide](#l-2-solidity-pragma-should-be-specific-not-wide) - - [L-3: PUSH0 is not supported by all chains](#l-3-push0-is-not-supported-by-all-chains) -- [NC Issues](#nc-issues) - - [NC-1: Missing checks for `address(0)` when assigning values to address state variables](#nc-1-missing-checks-for-address0-when-assigning-values-to-address-state-variables) - - [NC-2: Functions not used internally could be marked external](#nc-2-functions-not-used-internally-could-be-marked-external) - - [NC-3: Constants should be defined and used instead of literals](#nc-3-constants-should-be-defined-and-used-instead-of-literals) - - [NC-4: Event is missing `indexed` fields](#nc-4-event-is-missing-indexed-fields) - - -# Summary - -## Files Summary - -| Key | Value | -| --- | --- | -| .sol Files | 44 | -| Total nSLOC | 9385 | - - -## Files Details - -| Filepath | nSLOC | -| --- | --- | -| solidity/contracts/extensions/AccountingExtension.sol | 109 | -| solidity/contracts/extensions/BondEscalationAccounting.sol | 103 | -| solidity/contracts/modules/dispute/BondEscalationModule.sol | 256 | -| solidity/contracts/modules/dispute/BondedDisputeModule.sol | 95 | -| solidity/contracts/modules/dispute/CircuitResolverModule.sol | 76 | -| solidity/contracts/modules/dispute/RootVerificationModule.sol | 76 | -| solidity/contracts/modules/finality/CallbackModule.sol | 32 | -| solidity/contracts/modules/finality/MultipleCallbacksModule.sol | 50 | -| solidity/contracts/modules/request/ContractCallRequestModule.sol | 56 | -| solidity/contracts/modules/request/HttpRequestModule.sol | 56 | -| solidity/contracts/modules/request/SparseMerkleTreeRequestModule.sol | 57 | -| solidity/contracts/modules/resolution/ArbitratorModule.sol | 53 | -| solidity/contracts/modules/resolution/BondEscalationResolutionModule.sol | 259 | -| solidity/contracts/modules/resolution/ERC20ResolutionModule.sol | 96 | -| solidity/contracts/modules/resolution/PrivateERC20ResolutionModule.sol | 125 | -| solidity/contracts/modules/response/BondedResponseModule.sol | 93 | -| solidity/contracts/periphery/SparseMerkleTreeL32Verifier.sol | 29 | -| solidity/interfaces/IArbitrator.sol | 10 | -| solidity/interfaces/ITreeVerifier.sol | 7 | -| solidity/interfaces/extensions/IAccountingExtension.sol | 28 | -| solidity/interfaces/extensions/IBondEscalationAccounting.sol | 56 | -| solidity/interfaces/modules/dispute/IBondEscalationModule.sol | 70 | -| solidity/interfaces/modules/dispute/IBondedDisputeModule.sol | 25 | -| solidity/interfaces/modules/dispute/ICircuitResolverModule.sol | 28 | -| solidity/interfaces/modules/dispute/IRootVerificationModule.sol | 29 | -| solidity/interfaces/modules/finality/ICallbackModule.sol | 17 | -| solidity/interfaces/modules/finality/IMultipleCallbacksModule.sol | 17 | -| solidity/interfaces/modules/request/IContractCallRequestModule.sol | 23 | -| solidity/interfaces/modules/request/IHttpRequestModule.sol | 27 | -| solidity/interfaces/modules/request/ISparseMerkleTreeRequestModule.sol | 24 | -| solidity/interfaces/modules/resolution/IArbitratorModule.sol | 31 | -| solidity/interfaces/modules/resolution/IBondEscalationResolutionModule.sol | 83 | -| solidity/interfaces/modules/resolution/IERC20ResolutionModule.sol | 49 | -| solidity/interfaces/modules/resolution/IPrivateERC20ResolutionModule.sol | 65 | -| solidity/interfaces/modules/response/IBondedResponseModule.sol | 29 | -| solidity/scripts/Deploy.sol | 77 | -| solidity/test/integration/IntegrationBase.sol | 171 | -| solidity/test/mocks/MockArbitrator.sol | 21 | -| solidity/test/mocks/MockAtomicArbitrator.sol | 25 | -| solidity/test/mocks/MockCallback.sol | 8 | -| solidity/test/mocks/MockVerifier.sol | 11 | -| solidity/test/utils/Helpers.sol | 43 | -| solidity/test/utils/TestConstants.sol | 7 | -| solidity/test/utils/external/IWETH9.sol | 6 | -| **Total** | **9385** | - - -## Issue Summary - -| Category | No. of Issues | -| --- | --- | -| Critical | 0 | -| High | 0 | -| Medium | 0 | -| Low | 3 | -| NC | 4 | - - -# Low Issues - -## L-1: Unsafe ERC20 Operations should not be used - -ERC20 functions may not behave as expected. For example: return values are not always meaningful. It is recommended to use OpenZeppelin's SafeERC20 library. - -- Found in solidity/test/integration/IntegrationBase.sol [Line: 246](solidity/test/integration/IntegrationBase.sol#L246) - - ```solidity - _token.approve(address(_accounting), _amount); - ``` - - - -## L-2: Solidity pragma should be specific, not wide - -Consider using a specific version of Solidity in your contracts instead of a wide version. For example, instead of `pragma solidity ^0.8.0;`, use `pragma solidity 0.8.0;` - -- Found in solidity/contracts/extensions/AccountingExtension.sol [Line: 2](solidity/contracts/extensions/AccountingExtension.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/contracts/extensions/BondEscalationAccounting.sol [Line: 2](solidity/contracts/extensions/BondEscalationAccounting.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/contracts/modules/dispute/BondEscalationModule.sol [Line: 2](solidity/contracts/modules/dispute/BondEscalationModule.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/contracts/modules/dispute/BondedDisputeModule.sol [Line: 2](solidity/contracts/modules/dispute/BondedDisputeModule.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/contracts/modules/dispute/CircuitResolverModule.sol [Line: 2](solidity/contracts/modules/dispute/CircuitResolverModule.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/contracts/modules/dispute/RootVerificationModule.sol [Line: 2](solidity/contracts/modules/dispute/RootVerificationModule.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/contracts/modules/finality/CallbackModule.sol [Line: 2](solidity/contracts/modules/finality/CallbackModule.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/contracts/modules/finality/MultipleCallbacksModule.sol [Line: 2](solidity/contracts/modules/finality/MultipleCallbacksModule.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/contracts/modules/request/ContractCallRequestModule.sol [Line: 2](solidity/contracts/modules/request/ContractCallRequestModule.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/contracts/modules/request/HttpRequestModule.sol [Line: 2](solidity/contracts/modules/request/HttpRequestModule.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/contracts/modules/request/SparseMerkleTreeRequestModule.sol [Line: 2](solidity/contracts/modules/request/SparseMerkleTreeRequestModule.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/contracts/modules/resolution/ArbitratorModule.sol [Line: 2](solidity/contracts/modules/resolution/ArbitratorModule.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/contracts/modules/resolution/BondEscalationResolutionModule.sol [Line: 2](solidity/contracts/modules/resolution/BondEscalationResolutionModule.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/contracts/modules/resolution/ERC20ResolutionModule.sol [Line: 2](solidity/contracts/modules/resolution/ERC20ResolutionModule.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/contracts/modules/resolution/PrivateERC20ResolutionModule.sol [Line: 2](solidity/contracts/modules/resolution/PrivateERC20ResolutionModule.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/contracts/modules/response/BondedResponseModule.sol [Line: 2](solidity/contracts/modules/response/BondedResponseModule.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/contracts/periphery/SparseMerkleTreeL32Verifier.sol [Line: 2](solidity/contracts/periphery/SparseMerkleTreeL32Verifier.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/interfaces/IArbitrator.sol [Line: 2](solidity/interfaces/IArbitrator.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/interfaces/ITreeVerifier.sol [Line: 2](solidity/interfaces/ITreeVerifier.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/interfaces/extensions/IAccountingExtension.sol [Line: 2](solidity/interfaces/extensions/IAccountingExtension.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/interfaces/extensions/IBondEscalationAccounting.sol [Line: 2](solidity/interfaces/extensions/IBondEscalationAccounting.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/interfaces/modules/dispute/IBondEscalationModule.sol [Line: 2](solidity/interfaces/modules/dispute/IBondEscalationModule.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/interfaces/modules/dispute/IBondedDisputeModule.sol [Line: 2](solidity/interfaces/modules/dispute/IBondedDisputeModule.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/interfaces/modules/dispute/ICircuitResolverModule.sol [Line: 2](solidity/interfaces/modules/dispute/ICircuitResolverModule.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/interfaces/modules/dispute/IRootVerificationModule.sol [Line: 2](solidity/interfaces/modules/dispute/IRootVerificationModule.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/interfaces/modules/finality/ICallbackModule.sol [Line: 2](solidity/interfaces/modules/finality/ICallbackModule.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/interfaces/modules/finality/IMultipleCallbacksModule.sol [Line: 2](solidity/interfaces/modules/finality/IMultipleCallbacksModule.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/interfaces/modules/request/IContractCallRequestModule.sol [Line: 2](solidity/interfaces/modules/request/IContractCallRequestModule.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/interfaces/modules/request/IHttpRequestModule.sol [Line: 2](solidity/interfaces/modules/request/IHttpRequestModule.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/interfaces/modules/request/ISparseMerkleTreeRequestModule.sol [Line: 2](solidity/interfaces/modules/request/ISparseMerkleTreeRequestModule.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/interfaces/modules/resolution/IArbitratorModule.sol [Line: 2](solidity/interfaces/modules/resolution/IArbitratorModule.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/interfaces/modules/resolution/IBondEscalationResolutionModule.sol [Line: 2](solidity/interfaces/modules/resolution/IBondEscalationResolutionModule.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/interfaces/modules/resolution/IERC20ResolutionModule.sol [Line: 2](solidity/interfaces/modules/resolution/IERC20ResolutionModule.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/interfaces/modules/resolution/IPrivateERC20ResolutionModule.sol [Line: 2](solidity/interfaces/modules/resolution/IPrivateERC20ResolutionModule.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/interfaces/modules/response/IBondedResponseModule.sol [Line: 2](solidity/interfaces/modules/response/IBondedResponseModule.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/scripts/Deploy.sol [Line: 2](solidity/scripts/Deploy.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/test/integration/IntegrationBase.sol [Line: 2](solidity/test/integration/IntegrationBase.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/test/mocks/MockArbitrator.sol [Line: 2](solidity/test/mocks/MockArbitrator.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/test/mocks/MockAtomicArbitrator.sol [Line: 2](solidity/test/mocks/MockAtomicArbitrator.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/test/mocks/MockCallback.sol [Line: 2](solidity/test/mocks/MockCallback.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/test/mocks/MockVerifier.sol [Line: 2](solidity/test/mocks/MockVerifier.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/test/utils/Helpers.sol [Line: 2](solidity/test/utils/Helpers.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/test/utils/TestConstants.sol [Line: 2](solidity/test/utils/TestConstants.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/test/utils/external/IWETH9.sol [Line: 2](solidity/test/utils/external/IWETH9.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - - - -## L-3: PUSH0 is not supported by all chains - -Solc compiler version 0.8.20 switches the default target EVM version to Shanghai, which means that the generated bytecode will include PUSH0 opcodes. Be sure to select the appropriate EVM version in case you intend to deploy on a chain other than mainnet like L2 chains that may not support PUSH0, otherwise deployment of your contracts will fail. - -- Found in solidity/contracts/extensions/AccountingExtension.sol [Line: 2](solidity/contracts/extensions/AccountingExtension.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/contracts/extensions/BondEscalationAccounting.sol [Line: 2](solidity/contracts/extensions/BondEscalationAccounting.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/contracts/modules/dispute/BondEscalationModule.sol [Line: 2](solidity/contracts/modules/dispute/BondEscalationModule.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/contracts/modules/dispute/BondedDisputeModule.sol [Line: 2](solidity/contracts/modules/dispute/BondedDisputeModule.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/contracts/modules/dispute/CircuitResolverModule.sol [Line: 2](solidity/contracts/modules/dispute/CircuitResolverModule.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/contracts/modules/dispute/RootVerificationModule.sol [Line: 2](solidity/contracts/modules/dispute/RootVerificationModule.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/contracts/modules/finality/CallbackModule.sol [Line: 2](solidity/contracts/modules/finality/CallbackModule.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/contracts/modules/finality/MultipleCallbacksModule.sol [Line: 2](solidity/contracts/modules/finality/MultipleCallbacksModule.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/contracts/modules/request/ContractCallRequestModule.sol [Line: 2](solidity/contracts/modules/request/ContractCallRequestModule.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/contracts/modules/request/HttpRequestModule.sol [Line: 2](solidity/contracts/modules/request/HttpRequestModule.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/contracts/modules/request/SparseMerkleTreeRequestModule.sol [Line: 2](solidity/contracts/modules/request/SparseMerkleTreeRequestModule.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/contracts/modules/resolution/ArbitratorModule.sol [Line: 2](solidity/contracts/modules/resolution/ArbitratorModule.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/contracts/modules/resolution/BondEscalationResolutionModule.sol [Line: 2](solidity/contracts/modules/resolution/BondEscalationResolutionModule.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/contracts/modules/resolution/ERC20ResolutionModule.sol [Line: 2](solidity/contracts/modules/resolution/ERC20ResolutionModule.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/contracts/modules/resolution/PrivateERC20ResolutionModule.sol [Line: 2](solidity/contracts/modules/resolution/PrivateERC20ResolutionModule.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/contracts/modules/response/BondedResponseModule.sol [Line: 2](solidity/contracts/modules/response/BondedResponseModule.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/contracts/periphery/SparseMerkleTreeL32Verifier.sol [Line: 2](solidity/contracts/periphery/SparseMerkleTreeL32Verifier.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/interfaces/IArbitrator.sol [Line: 2](solidity/interfaces/IArbitrator.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/interfaces/ITreeVerifier.sol [Line: 2](solidity/interfaces/ITreeVerifier.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/interfaces/extensions/IAccountingExtension.sol [Line: 2](solidity/interfaces/extensions/IAccountingExtension.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/interfaces/extensions/IBondEscalationAccounting.sol [Line: 2](solidity/interfaces/extensions/IBondEscalationAccounting.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/interfaces/modules/dispute/IBondEscalationModule.sol [Line: 2](solidity/interfaces/modules/dispute/IBondEscalationModule.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/interfaces/modules/dispute/IBondedDisputeModule.sol [Line: 2](solidity/interfaces/modules/dispute/IBondedDisputeModule.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/interfaces/modules/dispute/ICircuitResolverModule.sol [Line: 2](solidity/interfaces/modules/dispute/ICircuitResolverModule.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/interfaces/modules/dispute/IRootVerificationModule.sol [Line: 2](solidity/interfaces/modules/dispute/IRootVerificationModule.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/interfaces/modules/finality/ICallbackModule.sol [Line: 2](solidity/interfaces/modules/finality/ICallbackModule.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/interfaces/modules/finality/IMultipleCallbacksModule.sol [Line: 2](solidity/interfaces/modules/finality/IMultipleCallbacksModule.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/interfaces/modules/request/IContractCallRequestModule.sol [Line: 2](solidity/interfaces/modules/request/IContractCallRequestModule.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/interfaces/modules/request/IHttpRequestModule.sol [Line: 2](solidity/interfaces/modules/request/IHttpRequestModule.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/interfaces/modules/request/ISparseMerkleTreeRequestModule.sol [Line: 2](solidity/interfaces/modules/request/ISparseMerkleTreeRequestModule.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/interfaces/modules/resolution/IArbitratorModule.sol [Line: 2](solidity/interfaces/modules/resolution/IArbitratorModule.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/interfaces/modules/resolution/IBondEscalationResolutionModule.sol [Line: 2](solidity/interfaces/modules/resolution/IBondEscalationResolutionModule.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/interfaces/modules/resolution/IERC20ResolutionModule.sol [Line: 2](solidity/interfaces/modules/resolution/IERC20ResolutionModule.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/interfaces/modules/resolution/IPrivateERC20ResolutionModule.sol [Line: 2](solidity/interfaces/modules/resolution/IPrivateERC20ResolutionModule.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/interfaces/modules/response/IBondedResponseModule.sol [Line: 2](solidity/interfaces/modules/response/IBondedResponseModule.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/scripts/Deploy.sol [Line: 2](solidity/scripts/Deploy.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/test/integration/IntegrationBase.sol [Line: 2](solidity/test/integration/IntegrationBase.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/test/mocks/MockArbitrator.sol [Line: 2](solidity/test/mocks/MockArbitrator.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/test/mocks/MockAtomicArbitrator.sol [Line: 2](solidity/test/mocks/MockAtomicArbitrator.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/test/mocks/MockCallback.sol [Line: 2](solidity/test/mocks/MockCallback.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/test/mocks/MockVerifier.sol [Line: 2](solidity/test/mocks/MockVerifier.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/test/utils/Helpers.sol [Line: 2](solidity/test/utils/Helpers.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/test/utils/TestConstants.sol [Line: 2](solidity/test/utils/TestConstants.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - -- Found in solidity/test/utils/external/IWETH9.sol [Line: 2](solidity/test/utils/external/IWETH9.sol#L2) - - ```solidity - pragma solidity ^0.8.19; - ``` - - - -# NC Issues - -## NC-1: Missing checks for `address(0)` when assigning values to address state variables - -Assigning values to address state variables without checking for `address(0)`. - -- Found in solidity/test/mocks/MockAtomicArbitrator.sol [Line: 12](solidity/test/mocks/MockAtomicArbitrator.sol#L12) - - ```solidity - oracle = _oracle; - ``` - - - -## NC-2: Functions not used internally could be marked external - - - -- Found in solidity/contracts/modules/dispute/BondEscalationModule.sol [Line: 335](solidity/contracts/modules/dispute/BondEscalationModule.sol#L335) - - ```solidity - function getEscalation(bytes32 _requestId) public view returns (BondEscalation memory _escalation) { - ``` - -- Found in solidity/contracts/modules/finality/CallbackModule.sol [Line: 14](solidity/contracts/modules/finality/CallbackModule.sol#L14) - - ```solidity - function moduleName() public pure returns (string memory _moduleName) { - ``` - -- Found in solidity/contracts/modules/finality/MultipleCallbacksModule.sol [Line: 19](solidity/contracts/modules/finality/MultipleCallbacksModule.sol#L19) - - ```solidity - function moduleName() public pure returns (string memory _moduleName) { - ``` - -- Found in solidity/contracts/modules/request/ContractCallRequestModule.sol [Line: 14](solidity/contracts/modules/request/ContractCallRequestModule.sol#L14) - - ```solidity - function moduleName() public pure returns (string memory _moduleName) { - ``` - -- Found in solidity/contracts/modules/request/HttpRequestModule.sol [Line: 14](solidity/contracts/modules/request/HttpRequestModule.sol#L14) - - ```solidity - function moduleName() public pure returns (string memory _moduleName) { - ``` - -- Found in solidity/contracts/modules/request/SparseMerkleTreeRequestModule.sol [Line: 14](solidity/contracts/modules/request/SparseMerkleTreeRequestModule.sol#L14) - - ```solidity - function moduleName() public pure returns (string memory _moduleName) { - ``` - -- Found in solidity/contracts/modules/resolution/ERC20ResolutionModule.sol [Line: 54](solidity/contracts/modules/resolution/ERC20ResolutionModule.sol#L54) - - ```solidity - function castVote( - ``` - -- Found in solidity/contracts/modules/resolution/PrivateERC20ResolutionModule.sol [Line: 54](solidity/contracts/modules/resolution/PrivateERC20ResolutionModule.sol#L54) - - ```solidity - function commitVote(IOracle.Request calldata _request, IOracle.Dispute calldata _dispute, bytes32 _commitment) public { - ``` - -- Found in solidity/contracts/modules/resolution/PrivateERC20ResolutionModule.sol [Line: 75](solidity/contracts/modules/resolution/PrivateERC20ResolutionModule.sol#L75) - - ```solidity - function revealVote( - ``` - -- Found in solidity/contracts/modules/response/BondedResponseModule.sol [Line: 13](solidity/contracts/modules/response/BondedResponseModule.sol#L13) - - ```solidity - function moduleName() public pure returns (string memory _moduleName) { - ``` - -- Found in solidity/scripts/Deploy.sol [Line: 63](solidity/scripts/Deploy.sol#L63) - - ```solidity - function run() public { - ``` - -- Found in solidity/test/integration/IntegrationBase.sol [Line: 80](solidity/test/integration/IntegrationBase.sol#L80) - - ```solidity - function setUp() public virtual { - ``` - - - -## NC-3: Constants should be defined and used instead of literals - - - -- Found in solidity/contracts/extensions/BondEscalationAccounting.sol [Line: 87](solidity/contracts/extensions/BondEscalationAccounting.sol#L87) - - ```solidity - _numberOfPledges = 1; - ``` - -- Found in solidity/contracts/modules/dispute/BondEscalationModule.sol [Line: 217](solidity/contracts/modules/dispute/BondEscalationModule.sol#L217) - - ```solidity - _escalations[_dispute.requestId].amountOfPledgesForDispute += 1; - ``` - -- Found in solidity/contracts/modules/dispute/BondEscalationModule.sol [Line: 218](solidity/contracts/modules/dispute/BondEscalationModule.sol#L218) - - ```solidity - pledgesForDispute[_dispute.requestId][msg.sender] += 1; - ``` - -- Found in solidity/contracts/modules/dispute/BondEscalationModule.sol [Line: 235](solidity/contracts/modules/dispute/BondEscalationModule.sol#L235) - - ```solidity - _escalations[_dispute.requestId].amountOfPledgesAgainstDispute += 1; - ``` - -- Found in solidity/contracts/modules/dispute/BondEscalationModule.sol [Line: 236](solidity/contracts/modules/dispute/BondEscalationModule.sol#L236) - - ```solidity - pledgesAgainstDispute[_dispute.requestId][msg.sender] += 1; - ``` - -- Found in solidity/contracts/modules/resolution/BondEscalationResolutionModule.sol [Line: 283](solidity/contracts/modules/resolution/BondEscalationResolutionModule.sol#L283) - - ```solidity - int256 _scaledPercentageDiffAsInt = int256(_percentageDiff * BASE / 100); - ``` - -- Found in solidity/contracts/modules/resolution/ERC20ResolutionModule.sol [Line: 100](solidity/contracts/modules/resolution/ERC20ResolutionModule.sol#L100) - - ```solidity - uint256 _quorumReached = _escalation.totalVotes >= _params.minVotesForQuorum ? 1 : 0; - ``` - -- Found in solidity/contracts/modules/resolution/ERC20ResolutionModule.sol [Line: 103](solidity/contracts/modules/resolution/ERC20ResolutionModule.sol#L103) - - ```solidity - if (_quorumReached == 1) { - ``` - -- Found in solidity/contracts/modules/resolution/PrivateERC20ResolutionModule.sol [Line: 133](solidity/contracts/modules/resolution/PrivateERC20ResolutionModule.sol#L133) - - ```solidity - uint256 _quorumReached = _escalation.totalVotes >= _params.minVotesForQuorum ? 1 : 0; - ``` - -- Found in solidity/contracts/modules/resolution/PrivateERC20ResolutionModule.sol [Line: 137](solidity/contracts/modules/resolution/PrivateERC20ResolutionModule.sol#L137) - - ```solidity - if (_quorumReached == 1) { - ``` - -- Found in solidity/contracts/modules/response/BondedResponseModule.sol [Line: 38](solidity/contracts/modules/response/BondedResponseModule.sol#L38) - - ```solidity - bytes32 _disputeId = ORACLE.disputeOf(_responseIds[_responsesLength - 1]); - ``` - -- Found in solidity/contracts/periphery/SparseMerkleTreeL32Verifier.sol [Line: 28](solidity/contracts/periphery/SparseMerkleTreeL32Verifier.sol#L28) - - ```solidity - (_treeBranches, _treeCount) = abi.decode(_treeData, (bytes32[32], uint256)); - ``` - -- Found in solidity/test/integration/IntegrationBase.sol [Line: 179](solidity/test/integration/IntegrationBase.sol#L179) - - ```solidity - _mineBlocks(1); - ``` - -- Found in solidity/test/utils/Helpers.sol [Line: 91](solidity/test/utils/Helpers.sol#L91) - - ```solidity - vm.etch(_contract, hex'69'); - ``` - - - -## NC-4: Event is missing `indexed` fields - -Index event fields make the field more quickly accessible to off-chain tools that parse events. However, note that each index field costs extra gas during emission, so it's not necessarily best to index the maximum allowed per event (three fields). Each event should use three indexed fields if there are three or more fields, and gas usage is not particularly of concern for the events in question. If there are fewer than three fields, all of the fields should be indexed. - -- Found in solidity/interfaces/extensions/IAccountingExtension.sol [Line: 23](solidity/interfaces/extensions/IAccountingExtension.sol#L23) - - ```solidity - event Deposited(address indexed _depositor, IERC20 indexed _token, uint256 _amount); - ``` - -- Found in solidity/interfaces/extensions/IAccountingExtension.sol [Line: 31](solidity/interfaces/extensions/IAccountingExtension.sol#L31) - - ```solidity - event Withdrew(address indexed _withdrawer, IERC20 indexed _token, uint256 _amount); - ``` - -- Found in solidity/interfaces/extensions/IBondEscalationAccounting.sol [Line: 56](solidity/interfaces/extensions/IBondEscalationAccounting.sol#L56) - - ```solidity - event BondEscalationSettled( - ``` - -- Found in solidity/interfaces/modules/dispute/IBondEscalationModule.sol [Line: 45](solidity/interfaces/modules/dispute/IBondEscalationModule.sol#L45) - - ```solidity - event BondEscalationStatusUpdated( - ``` - -- Found in solidity/interfaces/modules/finality/ICallbackModule.sol [Line: 24](solidity/interfaces/modules/finality/ICallbackModule.sol#L24) - - ```solidity - event Callback(bytes32 indexed _requestId, address indexed _target, bytes _data); - ``` - -- Found in solidity/interfaces/modules/finality/IMultipleCallbacksModule.sol [Line: 24](solidity/interfaces/modules/finality/IMultipleCallbacksModule.sol#L24) - - ```solidity - event Callback(bytes32 indexed _requestId, address indexed _target, bytes _data); - ``` - -- Found in solidity/interfaces/modules/resolution/IERC20ResolutionModule.sol [Line: 30](solidity/interfaces/modules/resolution/IERC20ResolutionModule.sol#L30) - - ```solidity - event VoteCast(address _voter, bytes32 _disputeId, uint256 _numberOfVotes); - ``` - -- Found in solidity/interfaces/modules/resolution/IERC20ResolutionModule.sol [Line: 37](solidity/interfaces/modules/resolution/IERC20ResolutionModule.sol#L37) - - ```solidity - event VotingPhaseStarted(uint256 _startTime, bytes32 _disputeId); - ``` - -- Found in solidity/interfaces/modules/resolution/IERC20ResolutionModule.sol [Line: 42](solidity/interfaces/modules/resolution/IERC20ResolutionModule.sol#L42) - - ```solidity - event VoteClaimed(address _voter, bytes32 _disputeId, uint256 _amount); - ``` - -- Found in solidity/interfaces/modules/resolution/IPrivateERC20ResolutionModule.sol [Line: 26](solidity/interfaces/modules/resolution/IPrivateERC20ResolutionModule.sol#L26) - - ```solidity - event VoteCommitted(address _voter, bytes32 _disputeId, bytes32 _commitment); - ``` - -- Found in solidity/interfaces/modules/resolution/IPrivateERC20ResolutionModule.sol [Line: 35](solidity/interfaces/modules/resolution/IPrivateERC20ResolutionModule.sol#L35) - - ```solidity - event VoteRevealed(address _voter, bytes32 _disputeId, uint256 _numberOfVotes); - ``` - -- Found in solidity/interfaces/modules/resolution/IPrivateERC20ResolutionModule.sol [Line: 42](solidity/interfaces/modules/resolution/IPrivateERC20ResolutionModule.sol#L42) - - ```solidity - event CommittingPhaseStarted(uint256 _startTime, bytes32 _disputeId); - ``` - -- Found in solidity/interfaces/modules/response/IBondedResponseModule.sol [Line: 26](solidity/interfaces/modules/response/IBondedResponseModule.sol#L26) - - ```solidity - event ResponseProposed(bytes32 indexed _requestId, IOracle.Response _response, uint256 indexed _blockNumber); - ``` - -- Found in solidity/test/utils/Helpers.sol [Line: 23](solidity/test/utils/Helpers.sol#L23) - - ```solidity - event RequestFinalized(bytes32 indexed _requestId, IOracle.Response _response, address _finalizer); - ``` - - -