Skip to content

Commit

Permalink
fix(Proxy): change arbitrator bug
Browse files Browse the repository at this point in the history
  • Loading branch information
unknownunknown1 committed Jul 15, 2024
1 parent 0b5f1d8 commit aaa7c21
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 5 deletions.
13 changes: 9 additions & 4 deletions contracts/src/zkRealitioForeignProxy.sol
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ contract zkRealitioForeignProxy is IForeignArbitrationProxy, IDisputeResolver {
uint256 public loserAppealPeriodMultiplier; // Multiplier for calculating the duration of the appeal period for the loser, in basis points.

mapping(uint256 => mapping(address => ArbitrationRequest)) public arbitrationRequests; // Maps arbitration ID to its data. arbitrationRequests[uint(questionID)][requester].
mapping(uint256 => DisputeDetails) public disputeIDToDisputeDetails; // Maps external dispute ids to local arbitration ID and requester who was able to complete the arbitration request.
mapping(address => mapping(uint256 => DisputeDetails)) public arbitratorDisputeIDToDisputeDetails; // Maps external dispute ids from a particular arbitrator to local arbitration ID and requester who was able to complete the arbitration request.
mapping(uint256 => bool) public arbitrationIDToDisputeExists; // Whether a dispute has already been created for the given arbitration ID or not.
mapping(uint256 => address) public arbitrationIDToRequester; // Maps arbitration ID to the requester who was able to complete the arbitration request.

Expand Down Expand Up @@ -337,7 +337,7 @@ contract zkRealitioForeignProxy is IForeignArbitrationProxy, IDisputeResolver {
try
arbitration.arbitrator.createDispute{value: arbitrationCost}(NUMBER_OF_CHOICES_FOR_ARBITRATOR, arbitration.arbitratorExtraData)
returns (uint256 disputeID) {
DisputeDetails storage disputeDetails = disputeIDToDisputeDetails[disputeID];
DisputeDetails storage disputeDetails = arbitratorDisputeIDToDisputeDetails[address(arbitration.arbitrator)][disputeID];
disputeDetails.arbitrationID = arbitrationID;
disputeDetails.requester = _requester;

Expand Down Expand Up @@ -574,7 +574,7 @@ contract zkRealitioForeignProxy is IForeignArbitrationProxy, IDisputeResolver {
* @param _ruling The ruling given by the arbitrator.
*/
function rule(uint256 _disputeID, uint256 _ruling) external override {
DisputeDetails storage disputeDetails = disputeIDToDisputeDetails[_disputeID];
DisputeDetails storage disputeDetails = arbitratorDisputeIDToDisputeDetails[msg.sender][_disputeID];
uint256 arbitrationID = disputeDetails.arbitrationID;
address requester = disputeDetails.requester;

Expand Down Expand Up @@ -801,7 +801,12 @@ contract zkRealitioForeignProxy is IForeignArbitrationProxy, IDisputeResolver {
* @return localDisputeID Dispute id as in arbitrable contract.
*/
function externalIDtoLocalID(uint256 _externalDisputeID) external view override returns (uint256) {
return disputeIDToDisputeDetails[_externalDisputeID].arbitrationID;
// Note that in case of arbitrator's change external dispute from the new arbitrator
// will overwrite the external dispute with the same ID from the old arbitrator,
// which will make the data related to the old arbitrator's dispute unaccessible in DisputeResolver's UI.
// It should be fine since the dispute will be closed anyway.
// Ideally we would want to have arbitrator's address as one of the parameters, but we can't break the interface.
return arbitratorDisputeIDToDisputeDetails[address(arbitrator)][_externalDisputeID].arbitrationID;
}

/**
Expand Down
2 changes: 1 addition & 1 deletion contracts/test/foreign_proxy_with_appeals.js
Original file line number Diff line number Diff line change
Expand Up @@ -278,7 +278,7 @@ describe("Cross-chain arbitration with appeals", () => {
expect(arbitration[1]).to.equal(0, "Deposit value should be empty");
expect(arbitration[2]).to.equal(2, "Incorrect dispute ID");

const disputeData = await foreignProxy.disputeIDToDisputeDetails(2);
const disputeData = await foreignProxy.arbitratorDisputeIDToDisputeDetails(arbitrator.address, 2);
expect(disputeData[0]).to.equal(0, "Incorrect arbitration ID in disputeData");
expect(disputeData[1]).to.equal(await requester.getAddress(), "Incorrect requester address in disputeData");

Expand Down

0 comments on commit aaa7c21

Please sign in to comment.