Skip to content

Commit 97b844e

Browse files
committed
feat: request response
1 parent 672bf45 commit 97b844e

File tree

7 files changed

+83
-18
lines changed

7 files changed

+83
-18
lines changed

solidity/contracts/Oracle.sol

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,12 @@ contract Oracle is IOracle {
105105
Request calldata _request,
106106
Response calldata _response
107107
) external returns (bytes32 _responseId) {
108-
_responseId = ValidatorLib._validateResponse(_request, _response);
108+
bytes32 _requestId;
109+
(_requestId, _responseId) = ValidatorLib._validateRequestAndResponse(_request, _response);
110+
111+
if (requestCreatedAt[_requestId] == 0) {
112+
revert Oracle_InvalidRequestBody();
113+
}
109114

110115
// The caller must be the proposer, unless the response is coming from a dispute module
111116
if (msg.sender != _response.proposer && msg.sender != address(_request.disputeModule)) {

solidity/contracts/Validator.sol

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,23 @@ abstract contract Validator is IValidator {
4343
_id = ValidatorLib._getId(_dispute);
4444
}
4545

46+
/**
47+
* @notice Validates the correctness and existance of a request-response pair
48+
*
49+
* @param _request The request to compute the id for
50+
* @param _response The response to compute the id for
51+
* @return _requestId The id the request
52+
* @return _responseId The id the response
53+
*/
54+
function _validateRequestAndResponse(
55+
IOracle.Request calldata _request,
56+
IOracle.Response calldata _response
57+
) internal view returns (bytes32 _requestId, bytes32 _responseId) {
58+
(_requestId, _responseId) = ValidatorLib._validateRequestAndResponse(_request, _response);
59+
60+
if (ORACLE.responseCreatedAt(_responseId) == 0) revert Validator_InvalidResponse();
61+
}
62+
4663
/**
4764
* @notice Validates the correctness and existance of a request-response pair
4865
*

solidity/lib/ValidatorLib.sol

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,24 @@ library ValidatorLib {
4444
_id = keccak256(abi.encode(_dispute));
4545
}
4646

47+
/**
48+
* @notice Validates the correctness and existance of a request-response pair
49+
*
50+
* @param _request The request to compute the id for
51+
* @param _response The response to compute the id for
52+
* @return _requestId The id the request
53+
* @return _responseId The id the response
54+
*/
55+
function _validateRequestAndResponse(
56+
IOracle.Request calldata _request,
57+
IOracle.Response calldata _response
58+
) public pure returns (bytes32 _requestId, bytes32 _responseId) {
59+
_requestId = _getId(_request);
60+
_responseId = _getId(_response);
61+
62+
if (_response.requestId != _requestId) revert ValidatorLib_InvalidResponseBody();
63+
}
64+
4765
/**
4866
* @notice Validates the correctness and existance of a request-response pair
4967
*

solidity/test/lib/ValidatorLib.t.sol

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,21 @@ contract ValidatorLibGetIds is BaseTest {
6868
}
6969
}
7070

71+
contract ValidatorLibValidateRequestAndResponse is BaseTest {
72+
function test_validateRequestAndResponse() public {
73+
(bytes32 _requestId, bytes32 _responseId) = ValidatorLib._validateRequestAndResponse(mockRequest, mockResponse);
74+
assertEq(_requestId, keccak256(abi.encode(mockRequest)));
75+
assertEq(_responseId, keccak256(abi.encode(mockResponse)));
76+
}
77+
78+
function test_validateRequestAndResponse_InvalidResponseBody() public {
79+
IOracle.Response memory _response = mockResponse;
80+
_response.requestId = bytes32('invalid');
81+
vm.expectRevert(ValidatorLib.ValidatorLib_InvalidResponseBody.selector);
82+
ValidatorLib._validateRequestAndResponse(mockRequest, _response);
83+
}
84+
}
85+
7186
contract ValidatorLibValidateResponse is BaseTest {
7287
function test_validateResponse() public {
7388
bytes32 _responseId = ValidatorLib._validateResponse(mockRequest, mockResponse);
Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1 @@
1-
// SPDX-License-Identifier: MIT
2-
pragma solidity ^0.8.19;
31

4-
import {Module} from '../../../contracts/Module.sol';
5-
import {IOracle} from '../../../interfaces/IOracle.sol';
6-
import {IMockRequestModule} from '../interfaces/IMockRequestModule.sol';
7-
8-
contract MockRequestModule is Module, IMockRequestModule {
9-
constructor(IOracle _oracle) Module(_oracle) {}
10-
11-
function decodeRequestData(bytes calldata _data) public pure returns (RequestParameters memory _requestData) {
12-
_requestData = abi.decode(_data, (RequestParameters));
13-
}
14-
15-
function createRequest(bytes32 _requestId, bytes calldata _data, address _requester) external onlyOracle {}
16-
function moduleName() external view returns (string memory _moduleName) {}
17-
}

solidity/test/unit/Oracle.t.sol

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -459,6 +459,15 @@ contract Oracle_Unit_ProposeResponse is BaseTest {
459459
assertEq(_responseIds[1], _secondResponseId);
460460
}
461461

462+
function test_proposeResponse_revertsIfInvalidRequest() public {
463+
// Check: revert?
464+
vm.expectRevert(IOracle.Oracle_InvalidRequestBody.selector);
465+
466+
// Test: try to propose a response with an invalid request
467+
vm.prank(proposer);
468+
oracle.proposeResponse(mockRequest, mockResponse);
469+
}
470+
462471
/**
463472
* @notice Revert if the caller is not the proposer nor the dispute module
464473
*/

solidity/test/unit/Validator.t.sol

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,13 @@ import {Helpers} from '../utils/Helpers.sol';
2222
contract MockValidator is Validator {
2323
constructor(IOracle _oracle) Validator(_oracle) {}
2424

25+
function validateRequestAndResponse(
26+
IOracle.Request calldata _request,
27+
IOracle.Response calldata _response
28+
) external view returns (bytes32 _requestId, bytes32 _responseId) {
29+
return _validateRequestAndResponse(_request, _response);
30+
}
31+
2532
function validateResponse(
2633
IOracle.Request calldata _request,
2734
IOracle.Response calldata _response
@@ -84,8 +91,18 @@ contract BaseTest is Test, Helpers {
8491
}
8592
}
8693

94+
contract ValidatorValidateRequestAndResponse is BaseTest {
95+
function test_validateRequestAndResponse_InvalidResponse() public {
96+
vm.mockCall(
97+
address(oracle), abi.encodeWithSelector(IOracle.responseCreatedAt.selector, _getId(mockResponse)), abi.encode(0)
98+
);
99+
vm.expectRevert(IValidator.Validator_InvalidResponse.selector);
100+
validator.validateRequestAndResponse(mockRequest, mockResponse);
101+
}
102+
}
103+
87104
contract ValidatorValidateResponse is BaseTest {
88-
function test__validateResponse_InvalidResponse() public {
105+
function test_validateResponse_InvalidResponse() public {
89106
vm.mockCall(
90107
address(oracle), abi.encodeWithSelector(IOracle.responseCreatedAt.selector, _getId(mockResponse)), abi.encode(0)
91108
);

0 commit comments

Comments
 (0)