From db6a763fe636dd73468d5967a3f9cc98b55d44c2 Mon Sep 17 00:00:00 2001 From: Shaleen Jain Date: Fri, 21 Jan 2022 06:12:02 +0000 Subject: [PATCH 1/9] refactor(gateway): add RAB pragma and use internal functions for the bridge --- contracts/src/bridge/IL1Bridge.sol | 12 ++++++++---- contracts/src/bridge/IL2Bridge.sol | 10 +++++++--- contracts/src/bridge/arbitrum/ArbL1Bridge.sol | 14 +++++++++++--- contracts/src/bridge/arbitrum/ArbL2Bridge.sol | 12 ++++++++++-- contracts/src/bridge/xdai/xDaiL1Bridge.sol | 14 +++++++++++--- contracts/src/bridge/xdai/xDaiL2Bridge.sol | 12 ++++++++++-- contracts/src/gateway/BaseForeignGateway.sol | 15 +++++++++++---- contracts/src/gateway/BaseHomeGateway.sol | 12 ++++++++++-- 8 files changed, 78 insertions(+), 23 deletions(-) diff --git a/contracts/src/bridge/IL1Bridge.sol b/contracts/src/bridge/IL1Bridge.sol index 817208036..f0ff4b508 100644 --- a/contracts/src/bridge/IL1Bridge.sol +++ b/contracts/src/bridge/IL1Bridge.sol @@ -2,7 +2,11 @@ pragma solidity ^0.8.0; -interface IL1Bridge { +/** + * This is essentially an interface but defined as an abstract contract + * to declare functions as internal instead of as external + */ +abstract contract IL1Bridge { /** * Sends an arbitrary message from one domain to another. * @@ -24,9 +28,9 @@ interface IL1Bridge { bytes memory _calldata, uint256 _maxGas, uint256 _gasPriceBid - ) external payable returns (uint256); + ) internal virtual returns (uint256); - function getSubmissionPrice(uint256 _calldatasize) external view returns (uint256); + function getSubmissionPrice(uint256 _calldatasize) internal view virtual returns (uint256); - function onlyAuthorized() external; + function onlyAuthorized() internal virtual; } diff --git a/contracts/src/bridge/IL2Bridge.sol b/contracts/src/bridge/IL2Bridge.sol index 7eab0cf79..8f8c9a52d 100644 --- a/contracts/src/bridge/IL2Bridge.sol +++ b/contracts/src/bridge/IL2Bridge.sol @@ -2,14 +2,18 @@ pragma solidity ^0.8.0; -interface IL2Bridge { +/** + * This is essentially an interface but defined as an abstract contract + * to declare functions as internal instead of as external + */ +abstract contract IL2Bridge { /** * Sends an arbitrary message from one domain to another. * * @param _calldata The L1 encoded message data. * @return Unique id to track the message request/transaction. */ - function sendCrossDomainMessage(bytes memory _calldata) external returns (uint256); + function sendCrossDomainMessage(bytes memory _calldata) internal virtual returns (uint256); - function onlyAuthorized() external; + function onlyAuthorized() internal virtual; } diff --git a/contracts/src/bridge/arbitrum/ArbL1Bridge.sol b/contracts/src/bridge/arbitrum/ArbL1Bridge.sol index 7dd394bf9..4382d6797 100644 --- a/contracts/src/bridge/arbitrum/ArbL1Bridge.sol +++ b/contracts/src/bridge/arbitrum/ArbL1Bridge.sol @@ -1,5 +1,13 @@ // SPDX-License-Identifier: MIT +/** + * @authors: [@shalzz] + * @reviewers: [] + * @auditors: [] + * @bounties: [] + * @deployments: [] + */ + pragma solidity ^0.8.0; import "./interfaces/IInbox.sol"; @@ -41,7 +49,7 @@ contract ArbL1Bridge is IL1Bridge { bytes memory _calldata, uint256 _maxGas, uint256 _gasPriceBid - ) external payable returns (uint256) { + ) internal override returns (uint256) { uint256 baseSubmissionCost = getSubmissionPrice(_calldata.length); require(msg.value >= baseSubmissionCost + (_maxGas * _gasPriceBid)); @@ -60,12 +68,12 @@ contract ArbL1Bridge is IL1Bridge { return ticketID; } - function getSubmissionPrice(uint256 _calldatasize) public view returns (uint256) { + function getSubmissionPrice(uint256 _calldatasize) internal view override returns (uint256) { (uint256 submissionCost, ) = arbRetryableTx.getSubmissionPrice(_calldatasize); return submissionCost; } - function onlyAuthorized() external { + function onlyAuthorized() internal override { IOutbox outbox = IOutbox(inbox.bridge().activeOutbox()); address l2Sender = outbox.l2ToL1Sender(); require(l2Sender == l2Target, "Only L2 target"); diff --git a/contracts/src/bridge/arbitrum/ArbL2Bridge.sol b/contracts/src/bridge/arbitrum/ArbL2Bridge.sol index a0a216447..977c523bb 100644 --- a/contracts/src/bridge/arbitrum/ArbL2Bridge.sol +++ b/contracts/src/bridge/arbitrum/ArbL2Bridge.sol @@ -1,5 +1,13 @@ // SPDX-License-Identifier: MIT +/** + * @authors: [@shalzz] + * @reviewers: [] + * @auditors: [] + * @bounties: [] + * @deployments: [] + */ + pragma solidity ^0.8.0; import "./interfaces/IArbSys.sol"; @@ -23,14 +31,14 @@ contract ArbL2Bridge is IL2Bridge { * @param _calldata The L1 encoded message data. * @return Unique id to track the message request/transaction. */ - function sendCrossDomainMessage(bytes memory _calldata) external returns (uint256) { + function sendCrossDomainMessage(bytes memory _calldata) internal override returns (uint256) { uint256 withdrawalId = arbsys.sendTxToL1(l1Target, _calldata); emit L2ToL1TxCreated(withdrawalId); return withdrawalId; } - function onlyAuthorized() external { + function onlyAuthorized() internal override { require(msg.sender == AddressAliasHelper.applyL1ToL2Alias(l1Target), "Only L1 target"); } } diff --git a/contracts/src/bridge/xdai/xDaiL1Bridge.sol b/contracts/src/bridge/xdai/xDaiL1Bridge.sol index 99ac7f941..36730be4e 100644 --- a/contracts/src/bridge/xdai/xDaiL1Bridge.sol +++ b/contracts/src/bridge/xdai/xDaiL1Bridge.sol @@ -1,5 +1,13 @@ // SPDX-License-Identifier: MIT +/** + * @authors: [@shalzz] + * @reviewers: [] + * @auditors: [] + * @bounties: [] + * @deployments: [] + */ + pragma solidity ^0.8.0; import "./interfaces/IAMB.sol"; @@ -19,7 +27,7 @@ contract xDaiL1Bridge is IL1Bridge { bytes memory _calldata, uint256 _maxGas, uint256 _gasPriceBid - ) external payable returns (uint256) { + ) internal override returns (uint256) { bytes32 id = amb.requireToPassMessage(l2Target, _calldata, amb.maxGasPerTx()); return uint256(id); } @@ -30,11 +38,11 @@ contract xDaiL1Bridge is IL1Bridge { */ function getSubmissionPrice( uint256 /* _calldatasize */ - ) public view returns (uint256) { + ) internal view override returns (uint256) { return 0; } - function onlyAuthorized() external { + function onlyAuthorized() internal override { require(msg.sender == address(amb), "Only AMB allowed"); // require(amb.messageSourceChainId() == foreignChainId, "Only foreign chain allowed"); require(amb.messageSender() == l2Target, "Only foreign gateway allowed"); diff --git a/contracts/src/bridge/xdai/xDaiL2Bridge.sol b/contracts/src/bridge/xdai/xDaiL2Bridge.sol index ce30834c4..d12b3769c 100644 --- a/contracts/src/bridge/xdai/xDaiL2Bridge.sol +++ b/contracts/src/bridge/xdai/xDaiL2Bridge.sol @@ -1,5 +1,13 @@ // SPDX-License-Identifier: MIT +/** + * @authors: [@shalzz] + * @reviewers: [] + * @auditors: [] + * @bounties: [] + * @deployments: [] + */ + pragma solidity ^0.8.0; import "./interfaces/IAMB.sol"; @@ -15,12 +23,12 @@ contract xDaiL2Bridge is IL2Bridge { amb = _amb; } - function sendCrossDomainMessage(bytes memory _calldata) external returns (uint256) { + function sendCrossDomainMessage(bytes memory _calldata) internal override returns (uint256) { bytes32 id = amb.requireToPassMessage(l1Target, _calldata, amb.maxGasPerTx()); return uint256(id); } - function onlyAuthorized() external { + function onlyAuthorized() internal override { require(msg.sender == address(amb), "Only AMB allowed"); // require(amb.messageSourceChainId() == homeChainId, "Only home chain allowed"); require(amb.messageSender() == l1Target, "Only home gateway allowed"); diff --git a/contracts/src/gateway/BaseForeignGateway.sol b/contracts/src/gateway/BaseForeignGateway.sol index 802e5d907..55e2f26c5 100644 --- a/contracts/src/gateway/BaseForeignGateway.sol +++ b/contracts/src/gateway/BaseForeignGateway.sol @@ -1,5 +1,13 @@ // SPDX-License-Identifier: MIT +/** + * @authors: [@shalzz] + * @reviewers: [] + * @auditors: [] + * @bounties: [] + * @deployments: [] + */ + pragma solidity ^0.8.0; import "../arbitration/IArbitrable.sol"; @@ -29,7 +37,7 @@ abstract contract BaseForeignGateway is IL1Bridge, IForeignGateway { uint256 public chainID; modifier onlyFromL2() { - this.onlyAuthorized(); + onlyAuthorized(); _; } @@ -65,7 +73,6 @@ abstract contract BaseForeignGateway is IL1Bridge, IForeignGateway { bytes4 methodSelector = IHomeGateway.relayCreateDispute.selector; bytes memory data = abi.encodeWithSelector(methodSelector, disputeHash, _choices, _extraData); - uint256 bridgeCost = this.getSubmissionPrice(data.length); // We only pay for the submissionPrice gas cost // which is minimum gas cost required for submitting a // arbitrum retryable ticket to the retry buffer for @@ -78,7 +85,7 @@ abstract contract BaseForeignGateway is IL1Bridge, IForeignGateway { // // We do NOT forward the arbitrationCost ETH funds to the HomeGateway yet, // only the calldata. - this.sendCrossDomainMessage{value: bridgeCost}(data, 0, 0); + sendCrossDomainMessage(data, 0, 0); emit DisputeCreation(disputeID, IArbitrable(msg.sender)); } @@ -92,7 +99,7 @@ abstract contract BaseForeignGateway is IL1Bridge, IForeignGateway { // 4 + 4 + 32 + 32 + dynamic uint256 calldatasize = 82 + _extraData.length; - uint256 bridgeCost = this.getSubmissionPrice(calldatasize); + uint256 bridgeCost = getSubmissionPrice(calldatasize); return bridgeCost + internalArbitrationCost; } diff --git a/contracts/src/gateway/BaseHomeGateway.sol b/contracts/src/gateway/BaseHomeGateway.sol index e9f9edd42..2df6c0660 100644 --- a/contracts/src/gateway/BaseHomeGateway.sol +++ b/contracts/src/gateway/BaseHomeGateway.sol @@ -1,5 +1,13 @@ // SPDX-License-Identifier: MIT +/** + * @authors: [@shalzz] + * @reviewers: [] + * @auditors: [] + * @bounties: [] + * @deployments: [] + */ + pragma solidity ^0.8.0; import "../arbitration/IArbitrator.sol"; @@ -17,7 +25,7 @@ abstract contract BaseHomeGateway is IL2Bridge, IHomeGateway { uint256 public chainID; modifier onlyFromL1() { - this.onlyAuthorized(); + onlyAuthorized(); _; } @@ -40,7 +48,7 @@ abstract contract BaseHomeGateway is IL2Bridge, IHomeGateway { bytes4 methodSelector = IForeignGateway.relayRule.selector; bytes memory data = abi.encodeWithSelector(methodSelector, disputeIDtoHash[_disputeID], _ruling); - this.sendCrossDomainMessage(data); + sendCrossDomainMessage(data); } /** From 1e0cbced0df5b322535431002e6dadefc1c8b8e4 Mon Sep 17 00:00:00 2001 From: Shaleen Jain Date: Fri, 21 Jan 2022 09:31:49 +0000 Subject: [PATCH 2/9] feat(gateway): add forwarding for arbitrationCost --- contracts/src/gateway/BaseForeignGateway.sol | 32 +++++++++++++++++-- contracts/src/gateway/BaseHomeGateway.sol | 32 +++++++++++++++++-- .../gateway/interfaces/IForeignGateway.sol | 8 ++++- .../src/gateway/interfaces/IHomeGateway.sol | 5 ++- 4 files changed, 69 insertions(+), 8 deletions(-) diff --git a/contracts/src/gateway/BaseForeignGateway.sol b/contracts/src/gateway/BaseForeignGateway.sol index 55e2f26c5..3014851f8 100644 --- a/contracts/src/gateway/BaseForeignGateway.sol +++ b/contracts/src/gateway/BaseForeignGateway.sol @@ -29,6 +29,9 @@ abstract contract BaseForeignGateway is IL1Bridge, IForeignGateway { struct DisputeData { uint256 id; address arbitrable; + uint256 paid; + address forwarder; + bool ruled; } mapping(uint256 => bytes32) public disputeIDtoHash; mapping(bytes32 => DisputeData) public disputeHashtoDisputeData; @@ -68,7 +71,13 @@ abstract contract BaseForeignGateway is IL1Bridge, IForeignGateway { ) ); disputeIDtoHash[disputeID] = disputeHash; - disputeHashtoDisputeData[disputeHash] = DisputeData({id: disputeID, arbitrable: msg.sender}); + disputeHashtoDisputeData[disputeHash] = DisputeData({ + id: disputeID, + arbitrable: msg.sender, + paid: msg.value, + forwarder: address(0), + ruled: false + }); bytes4 methodSelector = IHomeGateway.relayCreateDispute.selector; bytes memory data = abi.encodeWithSelector(methodSelector, disputeHash, _choices, _extraData); @@ -106,13 +115,30 @@ abstract contract BaseForeignGateway is IL1Bridge, IForeignGateway { /** * Relay the rule call from the home gateway to the arbitrable. */ - function relayRule(bytes32 _disputeHash, uint256 _ruling) external onlyFromL2 { - DisputeData memory dispute = disputeHashtoDisputeData[_disputeHash]; + function relayRule( + bytes32 _disputeHash, + uint256 _ruling, + address _forwarder + ) external onlyFromL2 { + DisputeData storage dispute = disputeHashtoDisputeData[_disputeHash]; + + require(!dispute.ruled, "Cannot rule twice"); + dispute.ruled = true; + dispute.forwarder = _forwarder; IArbitrable arbitrable = IArbitrable(dispute.arbitrable); arbitrable.rule(dispute.id, _ruling); } + function withdrawFees(bytes32 _disputeHash) external { + DisputeData storage dispute = disputeHashtoDisputeData[_disputeHash]; + require(dispute.ruled, "Not ruled yet"); + + uint256 amount = dispute.paid; + dispute.paid = 0; + payable(dispute.forwarder).transfer(amount); + } + function foreignDisputeHashToID(bytes32 _disputeHash) external view returns (uint256) { return disputeHashtoDisputeData[_disputeHash].id; } diff --git a/contracts/src/gateway/BaseHomeGateway.sol b/contracts/src/gateway/BaseHomeGateway.sol index 2df6c0660..88a65c70e 100644 --- a/contracts/src/gateway/BaseHomeGateway.sol +++ b/contracts/src/gateway/BaseHomeGateway.sol @@ -24,6 +24,14 @@ abstract contract BaseHomeGateway is IL2Bridge, IHomeGateway { IArbitrator public arbitrator; uint256 public chainID; + struct RelayedData { + uint256 choices; + bytes extraData; + uint256 numOfJurors; + address forwarder; + } + mapping(bytes32 => RelayedData) public disputeHashtoRelayedData; + modifier onlyFromL1() { onlyAuthorized(); _; @@ -45,8 +53,11 @@ abstract contract BaseHomeGateway is IL2Bridge, IHomeGateway { function rule(uint256 _disputeID, uint256 _ruling) external { require(msg.sender == address(arbitrator), "Only Arbitrator"); + bytes32 disputeHash = disputeIDtoHash[_disputeID]; + RelayedData memory relayedData = disputeHashtoRelayedData[disputeHash]; + bytes4 methodSelector = IForeignGateway.relayRule.selector; - bytes memory data = abi.encodeWithSelector(methodSelector, disputeIDtoHash[_disputeID], _ruling); + bytes memory data = abi.encodeWithSelector(methodSelector, disputeHash, _ruling, relayedData.forwarder); sendCrossDomainMessage(data); } @@ -57,11 +68,26 @@ abstract contract BaseHomeGateway is IL2Bridge, IHomeGateway { function relayCreateDispute( bytes32 _disputeHash, uint256 _choices, - bytes calldata _extraData + bytes calldata _extraData, + uint256 _numOfJurors ) external onlyFromL1 { - uint256 disputeID = arbitrator.createDispute(_choices, _extraData); + RelayedData storage relayedData = disputeHashtoRelayedData[_disputeHash]; + relayedData.choices = _choices; + relayedData.extraData = _extraData; + relayedData.numOfJurors = _numOfJurors; + } + + function forwardCreateDispute(bytes32 _disputeHash) external payable { + RelayedData storage relayedData = disputeHashtoRelayedData[_disputeHash]; + + // TODO: Account for numOfJurors instead of just minJurors + uint256 cost = arbitrator.arbitrationCost(relayedData.extraData); + require(msg.value >= cost, "Not enough arbitration cost paid"); + + uint256 disputeID = arbitrator.createDispute{value: cost}(relayedData.choices, relayedData.extraData); disputeIDtoHash[disputeID] = _disputeHash; disputeHashtoID[_disputeHash] = disputeID; + relayedData.forwarder = msg.sender; emit Dispute(arbitrator, disputeID, 0, 0); } diff --git a/contracts/src/gateway/interfaces/IForeignGateway.sol b/contracts/src/gateway/interfaces/IForeignGateway.sol index 5732f12a9..04de45ba0 100644 --- a/contracts/src/gateway/interfaces/IForeignGateway.sol +++ b/contracts/src/gateway/interfaces/IForeignGateway.sol @@ -13,5 +13,11 @@ interface IForeignGateway is IArbitrator, IForeignEvidence { /** * Relay the rule call from the home gateway to the arbitrable. */ - function relayRule(bytes32 _disputeHash, uint256 _ruling) external; + function relayRule( + bytes32 _disputeHash, + uint256 _ruling, + address _forwarder + ) external; + + function withdrawFees(bytes32 _disputeHash) external; } diff --git a/contracts/src/gateway/interfaces/IHomeGateway.sol b/contracts/src/gateway/interfaces/IHomeGateway.sol index 4f018d9c1..5eb056e8c 100644 --- a/contracts/src/gateway/interfaces/IHomeGateway.sol +++ b/contracts/src/gateway/interfaces/IHomeGateway.sol @@ -16,6 +16,9 @@ interface IHomeGateway is IArbitrable, IHomeEvidence { function relayCreateDispute( bytes32 _disputeHash, uint256 _choices, - bytes calldata _extraData + bytes calldata _extraData, + uint256 numOfJurors ) external; + + function forwardCreateDispute(bytes32 _disputeHash) external payable; } From 7a1188fe8a7c45265fb2669ad42f57d5ccdc1ef0 Mon Sep 17 00:00:00 2001 From: Shaleen Jain Date: Fri, 21 Jan 2022 11:57:09 +0000 Subject: [PATCH 3/9] feat(gateway): add and use feeForJuror param by governor --- contracts/src/gateway/BaseForeignGateway.sol | 77 ++++++++++++++++--- contracts/src/gateway/BaseHomeGateway.sol | 21 +++-- .../src/gateway/arbitrum/EthereumGateway.sol | 5 +- .../src/gateway/xdai/EthereumGateway.sol | 5 +- 4 files changed, 84 insertions(+), 24 deletions(-) diff --git a/contracts/src/gateway/BaseForeignGateway.sol b/contracts/src/gateway/BaseForeignGateway.sol index 3014851f8..4c3c40506 100644 --- a/contracts/src/gateway/BaseForeignGateway.sol +++ b/contracts/src/gateway/BaseForeignGateway.sol @@ -17,14 +17,15 @@ import "./interfaces/IHomeGateway.sol"; import "./interfaces/IForeignGateway.sol"; abstract contract BaseForeignGateway is IL1Bridge, IForeignGateway { + // The global default minimum number of jurors in a dispute. + uint256 public constant MIN_JURORS = 3; + // @dev Note the disputeID needs to start from one as // the KlerosV1 proxy governor depends on this implementation. uint256 internal localDisputeID = 1; - // For now this is just a constant, but we'd probably need to - // implement the same arbitrationCost calculation code we'll have - // in the V2 court. - uint256 internal internalArbitrationCost; + // feeForJuror by subcourtID + uint256[] internal feeForJuror; struct DisputeData { uint256 id; @@ -38,15 +39,26 @@ abstract contract BaseForeignGateway is IL1Bridge, IForeignGateway { IHomeGateway public homeGateway; uint256 public chainID; + address public governor; modifier onlyFromL2() { onlyAuthorized(); _; } - constructor(uint256 _arbitrationCost, IHomeGateway _homeGateway) { - internalArbitrationCost = _arbitrationCost; + modifier onlyByGovernor() { + require(governor == msg.sender, "Access not allowed: Governor only."); + _; + } + + constructor( + address _governor, + IHomeGateway _homeGateway, + uint256[] memory _feeForJuror + ) { + governor = _governor; homeGateway = _homeGateway; + feeForJuror = _feeForJuror; uint256 id; assembly { @@ -55,9 +67,20 @@ abstract contract BaseForeignGateway is IL1Bridge, IForeignGateway { chainID = id; } + /** @dev Changes the `feeForJuror` property value of a specified subcourt. + * @param _subcourtID The ID of the subcourt. + * @param _feeForJuror The new value for the `feeForJuror` property value. + */ + function changeSubcourtJurorFee(uint96 _subcourtID, uint256 _feeForJuror) external onlyByGovernor { + feeForJuror[_subcourtID] = _feeForJuror; + } + function createDispute(uint256 _choices, bytes calldata _extraData) external payable returns (uint256 disputeID) { require(msg.value >= arbitrationCost(_extraData), "Not paid enough for arbitration"); + (uint96 subcourtID, ) = extraDataToSubcourtIDMinJurors(_extraData); + uint256 nbVotes = msg.value / feeForJuror[subcourtID]; + disputeID = localDisputeID++; bytes32 disputeHash = keccak256( abi.encodePacked( @@ -71,6 +94,7 @@ abstract contract BaseForeignGateway is IL1Bridge, IForeignGateway { ) ); disputeIDtoHash[disputeID] = disputeHash; + disputeHashtoDisputeData[disputeHash] = DisputeData({ id: disputeID, arbitrable: msg.sender, @@ -80,7 +104,13 @@ abstract contract BaseForeignGateway is IL1Bridge, IForeignGateway { }); bytes4 methodSelector = IHomeGateway.relayCreateDispute.selector; - bytes memory data = abi.encodeWithSelector(methodSelector, disputeHash, _choices, _extraData); + bytes memory data = abi.encodeWithSelector( + methodSelector, + disputeHash, + _choices, + _extraData, + nbVotes * feeForJuror[subcourtID] // we calculate the min amount required for nbVotes + ); // We only pay for the submissionPrice gas cost // which is minimum gas cost required for submitting a @@ -100,16 +130,19 @@ abstract contract BaseForeignGateway is IL1Bridge, IForeignGateway { } function arbitrationCost(bytes calldata _extraData) public view returns (uint256 cost) { + (uint96 subcourtID, uint256 minJurors) = extraDataToSubcourtIDMinJurors(_extraData); + // Calculate the size of calldata that will be passed to the L2 bridge // as that is a factor for the bridging cost. // Calldata size of relayCreateDispute: - // relayCreateDispute methodId + - // (createDispute methodId + bytes32 disputeHash + uint256 _choices + bytes _extraData) - // 4 + 4 + 32 + 32 + dynamic - uint256 calldatasize = 82 + _extraData.length; + // relayCreateDispute methodId + bytes32 disputeHash + uint256 _choices + bytes _extraData + uint256 _arbitrationCost) + // 4 + 32 + 32 + dynamic + 32 + uint256 calldatasize = 100 + _extraData.length; uint256 bridgeCost = getSubmissionPrice(calldatasize); - return bridgeCost + internalArbitrationCost; + uint256 arbCost = feeForJuror[subcourtID] * minJurors; + + return bridgeCost + arbCost; } /** @@ -157,4 +190,24 @@ abstract contract BaseForeignGateway is IL1Bridge, IForeignGateway { function homeBridge(uint256 _disputeID) external view returns (address) { return address(homeGateway); } + + function extraDataToSubcourtIDMinJurors(bytes memory _extraData) + internal + view + returns (uint96 subcourtID, uint256 minJurors) + { + // Note that here we ignore DisputeKitID + if (_extraData.length >= 64) { + assembly { + // solium-disable-line security/no-inline-assembly + subcourtID := mload(add(_extraData, 0x20)) + minJurors := mload(add(_extraData, 0x40)) + } + if (subcourtID >= feeForJuror.length) subcourtID = 0; + if (minJurors == 0) minJurors = MIN_JURORS; + } else { + subcourtID = 0; + minJurors = MIN_JURORS; + } + } } diff --git a/contracts/src/gateway/BaseHomeGateway.sol b/contracts/src/gateway/BaseHomeGateway.sol index 88a65c70e..f988cde12 100644 --- a/contracts/src/gateway/BaseHomeGateway.sol +++ b/contracts/src/gateway/BaseHomeGateway.sol @@ -27,7 +27,7 @@ abstract contract BaseHomeGateway is IL2Bridge, IHomeGateway { struct RelayedData { uint256 choices; bytes extraData; - uint256 numOfJurors; + uint256 arbitrationCost; address forwarder; } mapping(bytes32 => RelayedData) public disputeHashtoRelayedData; @@ -63,28 +63,33 @@ abstract contract BaseHomeGateway is IL2Bridge, IHomeGateway { } /** - * Relay the createDispute call from the foreign gateway to the arbitrator. + * @dev Relay the createDispute call from the foreign gateway to the arbitrator. + * + * @param _disputeHash disputeHash + * @param _choices number of ruling choices + * @param _extraData extraData + * @param _arbitrationCost We get the actual arbitrationCost paid by the + * arbitrable here in case they paid more than the min arbitrationCost */ function relayCreateDispute( bytes32 _disputeHash, uint256 _choices, bytes calldata _extraData, - uint256 _numOfJurors + uint256 _arbitrationCost ) external onlyFromL1 { RelayedData storage relayedData = disputeHashtoRelayedData[_disputeHash]; relayedData.choices = _choices; relayedData.extraData = _extraData; - relayedData.numOfJurors = _numOfJurors; + relayedData.arbitrationCost = _arbitrationCost; } function forwardCreateDispute(bytes32 _disputeHash) external payable { RelayedData storage relayedData = disputeHashtoRelayedData[_disputeHash]; + require(relayedData.forwarder == address(0), "Dispute already forwarded"); - // TODO: Account for numOfJurors instead of just minJurors - uint256 cost = arbitrator.arbitrationCost(relayedData.extraData); - require(msg.value >= cost, "Not enough arbitration cost paid"); + require(msg.value >= relayedData.arbitrationCost, "Not enough arbitration cost paid"); - uint256 disputeID = arbitrator.createDispute{value: cost}(relayedData.choices, relayedData.extraData); + uint256 disputeID = arbitrator.createDispute{value: msg.value}(relayedData.choices, relayedData.extraData); disputeIDtoHash[disputeID] = _disputeHash; disputeHashtoID[_disputeHash] = disputeID; relayedData.forwarder = msg.sender; diff --git a/contracts/src/gateway/arbitrum/EthereumGateway.sol b/contracts/src/gateway/arbitrum/EthereumGateway.sol index e90bde916..842e1a87a 100644 --- a/contracts/src/gateway/arbitrum/EthereumGateway.sol +++ b/contracts/src/gateway/arbitrum/EthereumGateway.sol @@ -9,9 +9,10 @@ import "../BaseForeignGateway.sol"; contract EthereumGateway is BaseForeignGateway, ArbL1Bridge { constructor( - uint256 _arbitrationCost, + address _governor, IHomeGateway _homeGateway, + uint256[] memory _feeForJuror, address _l2Target, address _inbox - ) BaseForeignGateway(_arbitrationCost, _homeGateway) ArbL1Bridge(_l2Target, _inbox) {} + ) BaseForeignGateway(_governor, _homeGateway, _feeForJuror) ArbL1Bridge(_l2Target, _inbox) {} } diff --git a/contracts/src/gateway/xdai/EthereumGateway.sol b/contracts/src/gateway/xdai/EthereumGateway.sol index 44759d8bd..c6f8234da 100644 --- a/contracts/src/gateway/xdai/EthereumGateway.sol +++ b/contracts/src/gateway/xdai/EthereumGateway.sol @@ -10,9 +10,10 @@ import "../BaseForeignGateway.sol"; contract EthereumGateway is BaseForeignGateway, xDaiL1Bridge { constructor( - uint256 _arbitrationCost, + address _governor, IHomeGateway _homeGateway, + uint256[] memory _feeForJuror, address _l2Target, IAMB _amb - ) BaseForeignGateway(_arbitrationCost, _homeGateway) xDaiL1Bridge(_l2Target, _amb) {} + ) BaseForeignGateway(_governor, _homeGateway, _feeForJuror) xDaiL1Bridge(_l2Target, _amb) {} } From 6b848903b528a56c28856786f711dfdb29e31df7 Mon Sep 17 00:00:00 2001 From: Shaleen Jain Date: Tue, 1 Feb 2022 12:38:45 +0000 Subject: [PATCH 4/9] fix(gateway): update disputeHash calculation --- contracts/src/gateway/BaseForeignGateway.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/contracts/src/gateway/BaseForeignGateway.sol b/contracts/src/gateway/BaseForeignGateway.sol index 4c3c40506..f73c934c3 100644 --- a/contracts/src/gateway/BaseForeignGateway.sol +++ b/contracts/src/gateway/BaseForeignGateway.sol @@ -89,6 +89,7 @@ abstract contract BaseForeignGateway is IL1Bridge, IForeignGateway { "createDispute", disputeID, arbitrationCost(_extraData), + _choices, _extraData, msg.sender ) From 2fd18100c4afafcbaf419658dc7b731966cdbffa Mon Sep 17 00:00:00 2001 From: Shaleen Jain Date: Wed, 2 Feb 2022 11:26:29 +0000 Subject: [PATCH 5/9] refactor(gateway): rename some functions --- contracts/src/bridge/IL1Bridge.sol | 2 +- contracts/src/bridge/IL2Bridge.sol | 2 +- contracts/src/bridge/arbitrum/ArbL1Bridge.sol | 2 +- contracts/src/bridge/arbitrum/ArbL2Bridge.sol | 2 +- contracts/src/bridge/xdai/xDaiL1Bridge.sol | 2 +- contracts/src/bridge/xdai/xDaiL2Bridge.sol | 2 +- contracts/src/gateway/BaseForeignGateway.sol | 10 +++++----- contracts/src/gateway/BaseHomeGateway.sol | 8 ++++---- contracts/src/gateway/interfaces/IHomeGateway.sol | 6 +++--- 9 files changed, 18 insertions(+), 18 deletions(-) diff --git a/contracts/src/bridge/IL1Bridge.sol b/contracts/src/bridge/IL1Bridge.sol index f0ff4b508..9d46c1ac7 100644 --- a/contracts/src/bridge/IL1Bridge.sol +++ b/contracts/src/bridge/IL1Bridge.sol @@ -32,5 +32,5 @@ abstract contract IL1Bridge { function getSubmissionPrice(uint256 _calldatasize) internal view virtual returns (uint256); - function onlyAuthorized() internal virtual; + function onlyCrossChainSender() internal virtual; } diff --git a/contracts/src/bridge/IL2Bridge.sol b/contracts/src/bridge/IL2Bridge.sol index 8f8c9a52d..f50db5cb6 100644 --- a/contracts/src/bridge/IL2Bridge.sol +++ b/contracts/src/bridge/IL2Bridge.sol @@ -15,5 +15,5 @@ abstract contract IL2Bridge { */ function sendCrossDomainMessage(bytes memory _calldata) internal virtual returns (uint256); - function onlyAuthorized() internal virtual; + function onlyCrossChainSender() internal virtual; } diff --git a/contracts/src/bridge/arbitrum/ArbL1Bridge.sol b/contracts/src/bridge/arbitrum/ArbL1Bridge.sol index 4382d6797..e382895b2 100644 --- a/contracts/src/bridge/arbitrum/ArbL1Bridge.sol +++ b/contracts/src/bridge/arbitrum/ArbL1Bridge.sol @@ -73,7 +73,7 @@ contract ArbL1Bridge is IL1Bridge { return submissionCost; } - function onlyAuthorized() internal override { + function onlyCrossChainSender() internal override { IOutbox outbox = IOutbox(inbox.bridge().activeOutbox()); address l2Sender = outbox.l2ToL1Sender(); require(l2Sender == l2Target, "Only L2 target"); diff --git a/contracts/src/bridge/arbitrum/ArbL2Bridge.sol b/contracts/src/bridge/arbitrum/ArbL2Bridge.sol index 977c523bb..2f3b12180 100644 --- a/contracts/src/bridge/arbitrum/ArbL2Bridge.sol +++ b/contracts/src/bridge/arbitrum/ArbL2Bridge.sol @@ -38,7 +38,7 @@ contract ArbL2Bridge is IL2Bridge { return withdrawalId; } - function onlyAuthorized() internal override { + function onlyCrossChainSender() internal override { require(msg.sender == AddressAliasHelper.applyL1ToL2Alias(l1Target), "Only L1 target"); } } diff --git a/contracts/src/bridge/xdai/xDaiL1Bridge.sol b/contracts/src/bridge/xdai/xDaiL1Bridge.sol index 36730be4e..deedd9700 100644 --- a/contracts/src/bridge/xdai/xDaiL1Bridge.sol +++ b/contracts/src/bridge/xdai/xDaiL1Bridge.sol @@ -42,7 +42,7 @@ contract xDaiL1Bridge is IL1Bridge { return 0; } - function onlyAuthorized() internal override { + function onlyCrossChainSender() internal override { require(msg.sender == address(amb), "Only AMB allowed"); // require(amb.messageSourceChainId() == foreignChainId, "Only foreign chain allowed"); require(amb.messageSender() == l2Target, "Only foreign gateway allowed"); diff --git a/contracts/src/bridge/xdai/xDaiL2Bridge.sol b/contracts/src/bridge/xdai/xDaiL2Bridge.sol index d12b3769c..0e87c4bb2 100644 --- a/contracts/src/bridge/xdai/xDaiL2Bridge.sol +++ b/contracts/src/bridge/xdai/xDaiL2Bridge.sol @@ -28,7 +28,7 @@ contract xDaiL2Bridge is IL2Bridge { return uint256(id); } - function onlyAuthorized() internal override { + function onlyCrossChainSender() internal override { require(msg.sender == address(amb), "Only AMB allowed"); // require(amb.messageSourceChainId() == homeChainId, "Only home chain allowed"); require(amb.messageSender() == l1Target, "Only home gateway allowed"); diff --git a/contracts/src/gateway/BaseForeignGateway.sol b/contracts/src/gateway/BaseForeignGateway.sol index f73c934c3..15198354e 100644 --- a/contracts/src/gateway/BaseForeignGateway.sol +++ b/contracts/src/gateway/BaseForeignGateway.sol @@ -42,7 +42,7 @@ abstract contract BaseForeignGateway is IL1Bridge, IForeignGateway { address public governor; modifier onlyFromL2() { - onlyAuthorized(); + onlyCrossChainSender(); _; } @@ -104,7 +104,7 @@ abstract contract BaseForeignGateway is IL1Bridge, IForeignGateway { ruled: false }); - bytes4 methodSelector = IHomeGateway.relayCreateDispute.selector; + bytes4 methodSelector = IHomeGateway.handleIncomingDispute.selector; bytes memory data = abi.encodeWithSelector( methodSelector, disputeHash, @@ -135,9 +135,9 @@ abstract contract BaseForeignGateway is IL1Bridge, IForeignGateway { // Calculate the size of calldata that will be passed to the L2 bridge // as that is a factor for the bridging cost. - // Calldata size of relayCreateDispute: - // relayCreateDispute methodId + bytes32 disputeHash + uint256 _choices + bytes _extraData + uint256 _arbitrationCost) - // 4 + 32 + 32 + dynamic + 32 + // Calldata size of handleIncomingDispute: + // methodId + bytes32 disputeHash + uint256 _choices + bytes _extraData + uint256 _arbitrationCost) + // 4 + 32 + 32 + dynamic + 32 uint256 calldatasize = 100 + _extraData.length; uint256 bridgeCost = getSubmissionPrice(calldatasize); diff --git a/contracts/src/gateway/BaseHomeGateway.sol b/contracts/src/gateway/BaseHomeGateway.sol index f988cde12..554c91ff4 100644 --- a/contracts/src/gateway/BaseHomeGateway.sol +++ b/contracts/src/gateway/BaseHomeGateway.sol @@ -33,7 +33,7 @@ abstract contract BaseHomeGateway is IL2Bridge, IHomeGateway { mapping(bytes32 => RelayedData) public disputeHashtoRelayedData; modifier onlyFromL1() { - onlyAuthorized(); + onlyCrossChainSender(); _; } @@ -63,7 +63,7 @@ abstract contract BaseHomeGateway is IL2Bridge, IHomeGateway { } /** - * @dev Relay the createDispute call from the foreign gateway to the arbitrator. + * @dev Handle the cross-chain call from the foreign gateway. * * @param _disputeHash disputeHash * @param _choices number of ruling choices @@ -71,7 +71,7 @@ abstract contract BaseHomeGateway is IL2Bridge, IHomeGateway { * @param _arbitrationCost We get the actual arbitrationCost paid by the * arbitrable here in case they paid more than the min arbitrationCost */ - function relayCreateDispute( + function handleIncomingDispute( bytes32 _disputeHash, uint256 _choices, bytes calldata _extraData, @@ -83,7 +83,7 @@ abstract contract BaseHomeGateway is IL2Bridge, IHomeGateway { relayedData.arbitrationCost = _arbitrationCost; } - function forwardCreateDispute(bytes32 _disputeHash) external payable { + function relayCreateDispute(bytes32 _disputeHash) external payable { RelayedData storage relayedData = disputeHashtoRelayedData[_disputeHash]; require(relayedData.forwarder == address(0), "Dispute already forwarded"); diff --git a/contracts/src/gateway/interfaces/IHomeGateway.sol b/contracts/src/gateway/interfaces/IHomeGateway.sol index 5eb056e8c..15ce5f498 100644 --- a/contracts/src/gateway/interfaces/IHomeGateway.sol +++ b/contracts/src/gateway/interfaces/IHomeGateway.sol @@ -11,14 +11,14 @@ interface IHomeGateway is IArbitrable, IHomeEvidence { function homeDisputeHashToID(bytes32 _disputeHash) external view returns (uint256); /** - * Relay the createDispute call from the foreign gateway to the arbitrator. + * Handle the cross-chain call from the foreign gateway. */ - function relayCreateDispute( + function handleIncomingDispute( bytes32 _disputeHash, uint256 _choices, bytes calldata _extraData, uint256 numOfJurors ) external; - function forwardCreateDispute(bytes32 _disputeHash) external payable; + function relayCreateDispute(bytes32 _disputeHash) external payable; } From 670e360c701c49359694423112f2a0603e576686 Mon Sep 17 00:00:00 2001 From: Shaleen Jain Date: Wed, 2 Feb 2022 11:38:21 +0000 Subject: [PATCH 6/9] refactor(gateway): rename xdai -> gnosis --- .../xDaiL1Bridge.sol => gnosis-chain/GnosisL1Bridge.sol} | 2 +- .../xDaiL2Bridge.sol => gnosis-chain/GnosisL2Bridge.sol} | 2 +- .../src/bridge/{xdai => gnosis-chain}/interfaces/IAMB.sol | 0 .../gateway/{xdai => gnosis-chain}/EthereumGateway.sol | 8 ++++---- .../xDaiGateway.sol => gnosis-chain/GnosisGateway.sol} | 8 ++++---- 5 files changed, 10 insertions(+), 10 deletions(-) rename contracts/src/bridge/{xdai/xDaiL1Bridge.sol => gnosis-chain/GnosisL1Bridge.sol} (96%) rename contracts/src/bridge/{xdai/xDaiL2Bridge.sol => gnosis-chain/GnosisL2Bridge.sol} (95%) rename contracts/src/bridge/{xdai => gnosis-chain}/interfaces/IAMB.sol (100%) rename contracts/src/gateway/{xdai => gnosis-chain}/EthereumGateway.sol (63%) rename contracts/src/gateway/{xdai/xDaiGateway.sol => gnosis-chain/GnosisGateway.sol} (55%) diff --git a/contracts/src/bridge/xdai/xDaiL1Bridge.sol b/contracts/src/bridge/gnosis-chain/GnosisL1Bridge.sol similarity index 96% rename from contracts/src/bridge/xdai/xDaiL1Bridge.sol rename to contracts/src/bridge/gnosis-chain/GnosisL1Bridge.sol index deedd9700..b46a80cfb 100644 --- a/contracts/src/bridge/xdai/xDaiL1Bridge.sol +++ b/contracts/src/bridge/gnosis-chain/GnosisL1Bridge.sol @@ -14,7 +14,7 @@ import "./interfaces/IAMB.sol"; import "../IL1Bridge.sol"; -contract xDaiL1Bridge is IL1Bridge { +contract GnosisL1Bridge is IL1Bridge { address public l2Target; IAMB amb; diff --git a/contracts/src/bridge/xdai/xDaiL2Bridge.sol b/contracts/src/bridge/gnosis-chain/GnosisL2Bridge.sol similarity index 95% rename from contracts/src/bridge/xdai/xDaiL2Bridge.sol rename to contracts/src/bridge/gnosis-chain/GnosisL2Bridge.sol index 0e87c4bb2..d35e07046 100644 --- a/contracts/src/bridge/xdai/xDaiL2Bridge.sol +++ b/contracts/src/bridge/gnosis-chain/GnosisL2Bridge.sol @@ -14,7 +14,7 @@ import "./interfaces/IAMB.sol"; import "../IL2Bridge.sol"; -contract xDaiL2Bridge is IL2Bridge { +contract GnosisL2Bridge is IL2Bridge { address public l1Target; IAMB amb; diff --git a/contracts/src/bridge/xdai/interfaces/IAMB.sol b/contracts/src/bridge/gnosis-chain/interfaces/IAMB.sol similarity index 100% rename from contracts/src/bridge/xdai/interfaces/IAMB.sol rename to contracts/src/bridge/gnosis-chain/interfaces/IAMB.sol diff --git a/contracts/src/gateway/xdai/EthereumGateway.sol b/contracts/src/gateway/gnosis-chain/EthereumGateway.sol similarity index 63% rename from contracts/src/gateway/xdai/EthereumGateway.sol rename to contracts/src/gateway/gnosis-chain/EthereumGateway.sol index c6f8234da..4ae3c1222 100644 --- a/contracts/src/gateway/xdai/EthereumGateway.sol +++ b/contracts/src/gateway/gnosis-chain/EthereumGateway.sol @@ -2,18 +2,18 @@ pragma solidity ^0.8.0; -import "../../bridge/xdai/xDaiL1Bridge.sol"; -import "../../bridge/xdai/interfaces/IAMB.sol"; +import "../../bridge/gnosis-chain/GnosisL1Bridge.sol"; +import "../../bridge/gnosis-chain/interfaces/IAMB.sol"; import "../interfaces/IForeignGateway.sol"; import "../BaseForeignGateway.sol"; -contract EthereumGateway is BaseForeignGateway, xDaiL1Bridge { +contract EthereumGateway is BaseForeignGateway, GnosisL1Bridge { constructor( address _governor, IHomeGateway _homeGateway, uint256[] memory _feeForJuror, address _l2Target, IAMB _amb - ) BaseForeignGateway(_governor, _homeGateway, _feeForJuror) xDaiL1Bridge(_l2Target, _amb) {} + ) BaseForeignGateway(_governor, _homeGateway, _feeForJuror) GnosisL1Bridge(_l2Target, _amb) {} } diff --git a/contracts/src/gateway/xdai/xDaiGateway.sol b/contracts/src/gateway/gnosis-chain/GnosisGateway.sol similarity index 55% rename from contracts/src/gateway/xdai/xDaiGateway.sol rename to contracts/src/gateway/gnosis-chain/GnosisGateway.sol index 6effc4b92..310812485 100644 --- a/contracts/src/gateway/xdai/xDaiGateway.sol +++ b/contracts/src/gateway/gnosis-chain/GnosisGateway.sol @@ -3,17 +3,17 @@ pragma solidity ^0.8.0; import "../../arbitration/IArbitrator.sol"; -import "../../bridge/xdai/xDaiL2Bridge.sol"; -import "../../bridge/xdai/interfaces/IAMB.sol"; +import "../../bridge/gnosis-chain/GnosisL2Bridge.sol"; +import "../../bridge/gnosis-chain/interfaces/IAMB.sol"; import "../interfaces/IHomeGateway.sol"; import "../BaseHomeGateway.sol"; -contract xDaiGateway is BaseHomeGateway, xDaiL2Bridge { +contract GnosisGateway is BaseHomeGateway, GnosisL2Bridge { constructor( IArbitrator _arbitrator, IForeignGateway _foreignGateway, address _l1Target, IAMB _amb - ) BaseHomeGateway(_arbitrator, _foreignGateway) xDaiL2Bridge(_l1Target, _amb) {} + ) BaseHomeGateway(_arbitrator, _foreignGateway) GnosisL2Bridge(_l1Target, _amb) {} } From 81faee374e862a40c1120b82747792286070ab15 Mon Sep 17 00:00:00 2001 From: Shaleen Jain Date: Wed, 2 Feb 2022 11:41:06 +0000 Subject: [PATCH 7/9] refactor(gateway): getSubmissionPrice -> bridgingCost --- contracts/src/bridge/IL1Bridge.sol | 2 +- contracts/src/bridge/arbitrum/ArbL1Bridge.sol | 4 ++-- contracts/src/bridge/gnosis-chain/GnosisL1Bridge.sol | 2 +- contracts/src/gateway/BaseForeignGateway.sol | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/contracts/src/bridge/IL1Bridge.sol b/contracts/src/bridge/IL1Bridge.sol index 9d46c1ac7..f6792732e 100644 --- a/contracts/src/bridge/IL1Bridge.sol +++ b/contracts/src/bridge/IL1Bridge.sol @@ -30,7 +30,7 @@ abstract contract IL1Bridge { uint256 _gasPriceBid ) internal virtual returns (uint256); - function getSubmissionPrice(uint256 _calldatasize) internal view virtual returns (uint256); + function bridgingCost(uint256 _calldatasize) internal view virtual returns (uint256); function onlyCrossChainSender() internal virtual; } diff --git a/contracts/src/bridge/arbitrum/ArbL1Bridge.sol b/contracts/src/bridge/arbitrum/ArbL1Bridge.sol index e382895b2..48a5fa2a3 100644 --- a/contracts/src/bridge/arbitrum/ArbL1Bridge.sol +++ b/contracts/src/bridge/arbitrum/ArbL1Bridge.sol @@ -50,7 +50,7 @@ contract ArbL1Bridge is IL1Bridge { uint256 _maxGas, uint256 _gasPriceBid ) internal override returns (uint256) { - uint256 baseSubmissionCost = getSubmissionPrice(_calldata.length); + uint256 baseSubmissionCost = bridgingCost(_calldata.length); require(msg.value >= baseSubmissionCost + (_maxGas * _gasPriceBid)); uint256 ticketID = inbox.createRetryableTicket{value: msg.value}( @@ -68,7 +68,7 @@ contract ArbL1Bridge is IL1Bridge { return ticketID; } - function getSubmissionPrice(uint256 _calldatasize) internal view override returns (uint256) { + function bridgingCost(uint256 _calldatasize) internal view override returns (uint256) { (uint256 submissionCost, ) = arbRetryableTx.getSubmissionPrice(_calldatasize); return submissionCost; } diff --git a/contracts/src/bridge/gnosis-chain/GnosisL1Bridge.sol b/contracts/src/bridge/gnosis-chain/GnosisL1Bridge.sol index b46a80cfb..7f9050ce2 100644 --- a/contracts/src/bridge/gnosis-chain/GnosisL1Bridge.sol +++ b/contracts/src/bridge/gnosis-chain/GnosisL1Bridge.sol @@ -36,7 +36,7 @@ contract GnosisL1Bridge is IL1Bridge { * @dev The xDai bridge gas cost doesn't depend on the calldata size * */ - function getSubmissionPrice( + function bridgingCost( uint256 /* _calldatasize */ ) internal view override returns (uint256) { return 0; diff --git a/contracts/src/gateway/BaseForeignGateway.sol b/contracts/src/gateway/BaseForeignGateway.sol index 15198354e..f97052637 100644 --- a/contracts/src/gateway/BaseForeignGateway.sol +++ b/contracts/src/gateway/BaseForeignGateway.sol @@ -140,7 +140,7 @@ abstract contract BaseForeignGateway is IL1Bridge, IForeignGateway { // 4 + 32 + 32 + dynamic + 32 uint256 calldatasize = 100 + _extraData.length; - uint256 bridgeCost = getSubmissionPrice(calldatasize); + uint256 bridgeCost = bridgingCost(calldatasize); uint256 arbCost = feeForJuror[subcourtID] * minJurors; return bridgeCost + arbCost; From fc7baaddd16db2aa0baaf6a084732e8f21fdae77 Mon Sep 17 00:00:00 2001 From: Shaleen Jain Date: Wed, 2 Feb 2022 11:45:48 +0000 Subject: [PATCH 8/9] refactor(gateway): reorder struct members --- contracts/src/gateway/BaseForeignGateway.sol | 6 +++--- contracts/src/gateway/BaseHomeGateway.sol | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/contracts/src/gateway/BaseForeignGateway.sol b/contracts/src/gateway/BaseForeignGateway.sol index f97052637..efa6d0fb8 100644 --- a/contracts/src/gateway/BaseForeignGateway.sol +++ b/contracts/src/gateway/BaseForeignGateway.sol @@ -28,11 +28,11 @@ abstract contract BaseForeignGateway is IL1Bridge, IForeignGateway { uint256[] internal feeForJuror; struct DisputeData { - uint256 id; + uint248 id; + bool ruled; address arbitrable; uint256 paid; address forwarder; - bool ruled; } mapping(uint256 => bytes32) public disputeIDtoHash; mapping(bytes32 => DisputeData) public disputeHashtoDisputeData; @@ -97,7 +97,7 @@ abstract contract BaseForeignGateway is IL1Bridge, IForeignGateway { disputeIDtoHash[disputeID] = disputeHash; disputeHashtoDisputeData[disputeHash] = DisputeData({ - id: disputeID, + id: uint248(disputeID), arbitrable: msg.sender, paid: msg.value, forwarder: address(0), diff --git a/contracts/src/gateway/BaseHomeGateway.sol b/contracts/src/gateway/BaseHomeGateway.sol index 554c91ff4..8c997c295 100644 --- a/contracts/src/gateway/BaseHomeGateway.sol +++ b/contracts/src/gateway/BaseHomeGateway.sol @@ -26,9 +26,9 @@ abstract contract BaseHomeGateway is IL2Bridge, IHomeGateway { struct RelayedData { uint256 choices; - bytes extraData; uint256 arbitrationCost; address forwarder; + bytes extraData; } mapping(bytes32 => RelayedData) public disputeHashtoRelayedData; From 11540b143b7b383f7ee97d96a1a1de3e1d90cd0b Mon Sep 17 00:00:00 2001 From: Shaleen Jain Date: Wed, 2 Feb 2022 15:38:11 +0000 Subject: [PATCH 9/9] refactor: rename gateways --- .../{EthereumGateway.sol => EthereumToArbitrumGateway.sol} | 2 +- .../GnosisToEthereumGateway.sol} | 0 contracts/src/gateway/gnosis-chain/GnosisGateway.sol | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename contracts/src/gateway/arbitrum/{EthereumGateway.sol => EthereumToArbitrumGateway.sol} (86%) rename contracts/src/gateway/{gnosis-chain/EthereumGateway.sol => arbitrum/GnosisToEthereumGateway.sol} (100%) diff --git a/contracts/src/gateway/arbitrum/EthereumGateway.sol b/contracts/src/gateway/arbitrum/EthereumToArbitrumGateway.sol similarity index 86% rename from contracts/src/gateway/arbitrum/EthereumGateway.sol rename to contracts/src/gateway/arbitrum/EthereumToArbitrumGateway.sol index 842e1a87a..a20578c20 100644 --- a/contracts/src/gateway/arbitrum/EthereumGateway.sol +++ b/contracts/src/gateway/arbitrum/EthereumToArbitrumGateway.sol @@ -7,7 +7,7 @@ import "../../bridge/arbitrum/ArbL1Bridge.sol"; import "../interfaces/IForeignGateway.sol"; import "../BaseForeignGateway.sol"; -contract EthereumGateway is BaseForeignGateway, ArbL1Bridge { +contract EthereumToArbitrumGateway is BaseForeignGateway, ArbL1Bridge { constructor( address _governor, IHomeGateway _homeGateway, diff --git a/contracts/src/gateway/gnosis-chain/EthereumGateway.sol b/contracts/src/gateway/arbitrum/GnosisToEthereumGateway.sol similarity index 100% rename from contracts/src/gateway/gnosis-chain/EthereumGateway.sol rename to contracts/src/gateway/arbitrum/GnosisToEthereumGateway.sol diff --git a/contracts/src/gateway/gnosis-chain/GnosisGateway.sol b/contracts/src/gateway/gnosis-chain/GnosisGateway.sol index 310812485..062f3551b 100644 --- a/contracts/src/gateway/gnosis-chain/GnosisGateway.sol +++ b/contracts/src/gateway/gnosis-chain/GnosisGateway.sol @@ -9,7 +9,7 @@ import "../../bridge/gnosis-chain/interfaces/IAMB.sol"; import "../interfaces/IHomeGateway.sol"; import "../BaseHomeGateway.sol"; -contract GnosisGateway is BaseHomeGateway, GnosisL2Bridge { +contract GnosisToEthereumGateway is BaseHomeGateway, GnosisL2Bridge { constructor( IArbitrator _arbitrator, IForeignGateway _foreignGateway,