From 53a989ec74d936d626c98cbcb301e9f1cde879c9 Mon Sep 17 00:00:00 2001 From: moebius <0xmoebius@tutanota.com> Date: Tue, 28 Nov 2023 08:43:16 -0300 Subject: [PATCH] feat: let proposers release its bond if the response is won and not used --- package.json | 2 +- .../modules/response/BondedResponseModule.sol | 26 +++++++++++++++++++ .../response/IBondedResponseModule.sol | 18 +++++++++++++ yarn.lock | 12 ++++----- 4 files changed, 50 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 647e268c..9baed5e7 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "package.json": "sort-package-json" }, "dependencies": { - "@defi-wonderland/prophet-core-contracts": "0.0.0-5fbc6720", + "@defi-wonderland/prophet-core-contracts": "0.0.0-c8bd8736", "@defi-wonderland/solidity-utils": "0.0.0-3e9c8e8b", "@openzeppelin/contracts": "^4.9.3", "ds-test": "https://github.com/dapphub/ds-test.git#e282159d5170298eb2455a6c05280ab5a73a4ef0", diff --git a/solidity/contracts/modules/response/BondedResponseModule.sol b/solidity/contracts/modules/response/BondedResponseModule.sol index c52bf5df..6ebaedb1 100644 --- a/solidity/contracts/modules/response/BondedResponseModule.sol +++ b/solidity/contracts/modules/response/BondedResponseModule.sol @@ -88,4 +88,30 @@ contract BondedResponseModule is Module, IBondedResponseModule { emit RequestFinalized(_response.requestId, _response, _finalizer); } + + /// @inheritdoc IBondedResponseModule + function releaseUncalledResponse( + IOracle.Request calldata _request, + IOracle.Response calldata _response, + IOracle.Dispute calldata _dispute + ) external { + bytes32 _disputeId = _validateDispute(_request, _response, _dispute); + + if (ORACLE.disputeStatus(_disputeId) != IOracle.DisputeStatus.Won) { + revert BondedResponseModule_InvalidReleaseParameters(); + } + + bytes32 _finalizedResponseId = ORACLE.getFinalizedResponseId(_response.requestId); + if (_finalizedResponseId == _dispute.responseId || _finalizedResponseId == bytes32(0)) { + revert BondedResponseModule_InvalidReleaseParameters(); + } + + RequestParameters memory _params = decodeRequestData(_request.responseModuleData); + _params.accountingExtension.release({ + _bonder: _response.proposer, + _requestId: _response.requestId, + _token: _params.bondToken, + _amount: _params.bondSize + }); + } } diff --git a/solidity/interfaces/modules/response/IBondedResponseModule.sol b/solidity/interfaces/modules/response/IBondedResponseModule.sol index 1b460221..7dc14378 100644 --- a/solidity/interfaces/modules/response/IBondedResponseModule.sol +++ b/solidity/interfaces/modules/response/IBondedResponseModule.sol @@ -44,6 +44,11 @@ interface IBondedResponseModule is IResponseModule { */ error BondedResponseModule_AlreadyResponded(); + /** + * @notice Thrown when trying to release an uncalled response with an invalid request, response or dispute + */ + error BondedResponseModule_InvalidReleaseParameters(); + /*/////////////////////////////////////////////////////////////// STRUCTS //////////////////////////////////////////////////////////////*/ @@ -99,4 +104,17 @@ interface IBondedResponseModule is IResponseModule { IOracle.Response calldata _response, address _finalizer ) external; + + /** + * @notice Releases the proposer fund if the response is valid and it has not been used to finalize the request + * + * @param _request The finalized request + * @param _response The uncalled response + * @param _response The won dispute + */ + function releaseUncalledResponse( + IOracle.Request calldata _request, + IOracle.Response calldata _response, + IOracle.Dispute calldata _dispute + ) external; } diff --git a/yarn.lock b/yarn.lock index 08861dda..3d74639d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -192,10 +192,10 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" -"@defi-wonderland/prophet-core-contracts@0.0.0-5fbc6720": - version "0.0.0-5fbc6720" - resolved "https://registry.yarnpkg.com/@defi-wonderland/prophet-core-contracts/-/prophet-core-contracts-0.0.0-5fbc6720.tgz#5fef99e5a9064289566c8b7eec3e754c20c67166" - integrity sha512-tXiSGhSFW/QJhW4eLKJ7MCUXEG+NvJvOPteFHlri+GEiXfQRQztpWBQYSngI68C+rourOTVCbXSm0bDJK2UfMw== +"@defi-wonderland/prophet-core-contracts@0.0.0-c8bd8736": + version "0.0.0-c8bd8736" + resolved "https://registry.yarnpkg.com/@defi-wonderland/prophet-core-contracts/-/prophet-core-contracts-0.0.0-c8bd8736.tgz#3f27e8296831b384c9bb516bcef3d7bceb5383bd" + integrity sha512-Zh+kWY6GZsEf6+Fs399XOxlWojWN1yFyznjnXh2Ydfxa72AqzyviaEPgse5zc9diizGJnBsyo9FRF/BY+EbuTg== dependencies: "@defi-wonderland/solidity-utils" "0.0.0-3e9c8e8b" "@openzeppelin/contracts" "^4.9.3" @@ -1183,16 +1183,15 @@ dotgitignore@^2.1.0: "ds-test@git+https://github.com/dapphub/ds-test.git#e282159d5170298eb2455a6c05280ab5a73a4ef0": version "1.0.0" + uid e282159d5170298eb2455a6c05280ab5a73a4ef0 resolved "git+https://github.com/dapphub/ds-test.git#e282159d5170298eb2455a6c05280ab5a73a4ef0" "ds-test@https://github.com/dapphub/ds-test": version "1.0.0" - uid e282159d5170298eb2455a6c05280ab5a73a4ef0 resolved "https://github.com/dapphub/ds-test#e282159d5170298eb2455a6c05280ab5a73a4ef0" "ds-test@https://github.com/dapphub/ds-test.git#e282159d5170298eb2455a6c05280ab5a73a4ef0": version "1.0.0" - uid e282159d5170298eb2455a6c05280ab5a73a4ef0 resolved "https://github.com/dapphub/ds-test.git#e282159d5170298eb2455a6c05280ab5a73a4ef0" eastasianwidth@^0.2.0: @@ -3285,7 +3284,6 @@ solidity-docgen@0.6.0-beta.35: "solmate@https://github.com/transmissions11/solmate.git#bfc9c25865a274a7827fea5abf6e4fb64fc64e6c": version "6.1.0" - uid bfc9c25865a274a7827fea5abf6e4fb64fc64e6c resolved "https://github.com/transmissions11/solmate.git#bfc9c25865a274a7827fea5abf6e4fb64fc64e6c" sort-object-keys@^1.1.3: