Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[SC-456] Use generic receivers and upgrade xchain-helpers #18

Merged
merged 7 commits into from
Jun 12, 2024
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion lib/xchain-helpers
35 changes: 0 additions & 35 deletions src/receivers/BridgeExecutorReceiverArbitrum.sol

This file was deleted.

37 changes: 0 additions & 37 deletions src/receivers/BridgeExecutorReceiverGnosis.sol

This file was deleted.

35 changes: 0 additions & 35 deletions src/receivers/BridgeExecutorReceiverOptimism.sol

This file was deleted.

41 changes: 16 additions & 25 deletions test/ArbitrumOneCrosschainTest.t.sol
Original file line number Diff line number Diff line change
@@ -1,25 +1,20 @@
// SPDX-License-Identifier: AGPL-3.0
pragma solidity ^0.8.0;

import 'forge-std/Test.sol';
import './CrosschainTestBase.sol';

import { Domain, ArbitrumDomain } from 'xchain-helpers/testing/ArbitrumDomain.sol';
import { XChainForwarders } from 'xchain-helpers/XChainForwarders.sol';

import { AuthBridgeExecutor } from 'src/executors/AuthBridgeExecutor.sol';
import { BridgeExecutorReceiverArbitrum } from 'src/receivers/BridgeExecutorReceiverArbitrum.sol';

import { IPayload } from './interfaces/IPayload.sol';

import { CrosschainPayload, CrosschainTestBase } from './CrosschainTestBase.sol';
import { ArbitrumBridgeTesting } from 'lib/xchain-helpers/src/testing/bridges/ArbitrumBridgeTesting.sol';
import { ArbitrumForwarder } from 'lib/xchain-helpers/src/forwarders/ArbitrumForwarder.sol';
import { ArbitrumReceiver } from 'lib/xchain-helpers/src/receivers/ArbitrumReceiver.sol';

contract ArbitrumOneCrosschainPayload is CrosschainPayload {

constructor(IPayload _targetPayload, address _bridgeReceiver)
CrosschainPayload(_targetPayload, _bridgeReceiver) {}

function execute() external override {
XChainForwarders.sendMessageArbitrumOne(
ArbitrumForwarder.sendMessageL1toL2(
ArbitrumForwarder.L1_CROSS_DOMAIN_ARBITRUM_ONE,
bridgeReceiver,
encodeCrosschainExecutionMessage(),
1_000_000,
Expand All @@ -32,40 +27,36 @@ contract ArbitrumOneCrosschainPayload is CrosschainPayload {

contract ArbitrumOneCrosschainTest is CrosschainTestBase {

using DomainHelpers for *;
using ArbitrumBridgeTesting for *;

function deployCrosschainPayload(IPayload targetPayload, address bridgeReceiver)
public override returns (IPayload)
{
return IPayload(new ArbitrumOneCrosschainPayload(targetPayload, bridgeReceiver));
}

function setUp() public {
hostDomain = new Domain(getChain('mainnet'));
bridgedDomain = new ArbitrumDomain(getChain('arbitrum_one'), hostDomain);
bridge = ArbitrumBridgeTesting.createNativeBridge(getChain('mainnet').createFork(), getChain('arbitrum_one').createFork());

bridgedDomain.selectFork();
bridge.destination.selectFork();
bridgeExecutor = new AuthBridgeExecutor(
defaultL2BridgeExecutorArgs.delay,
defaultL2BridgeExecutorArgs.gracePeriod,
defaultL2BridgeExecutorArgs.guardian
);
bridgeReceiver = address(new BridgeExecutorReceiverArbitrum(
bridgeReceiver = address(new ArbitrumReceiver(
defaultL2BridgeExecutorArgs.ethereumGovernanceExecutor,
bridgeExecutor
address(bridgeExecutor)
));
bridgeExecutor.grantRole(bridgeExecutor.DEFAULT_ADMIN_ROLE(), bridgeReceiver);

hostDomain.selectFork();
bridge.source.selectFork();
vm.deal(L1_EXECUTOR, 0.01 ether);
}

function test_constructor_receiver() public {
BridgeExecutorReceiverArbitrum receiver = new BridgeExecutorReceiverArbitrum(
defaultL2BridgeExecutorArgs.ethereumGovernanceExecutor,
bridgeExecutor
);

assertEq(receiver.l1Authority(), defaultL2BridgeExecutorArgs.ethereumGovernanceExecutor);
assertEq(address(receiver.executor()), address(bridgeExecutor));
function relayMessagesAcrossBridge() internal override {
bridge.relayMessagesToDestination(true);
}

}
35 changes: 18 additions & 17 deletions test/BaseChainCrosschainTest.t.sol
Original file line number Diff line number Diff line change
@@ -1,25 +1,20 @@
// SPDX-License-Identifier: AGPL-3.0
pragma solidity ^0.8.0;

import 'forge-std/Test.sol';
import './CrosschainTestBase.sol';

import { Domain, OptimismDomain } from 'xchain-helpers/testing/OptimismDomain.sol';
import { XChainForwarders } from 'xchain-helpers/XChainForwarders.sol';

import { AuthBridgeExecutor } from 'src/executors/AuthBridgeExecutor.sol';
import { BridgeExecutorReceiverOptimism } from 'src/receivers/BridgeExecutorReceiverOptimism.sol';

import { IPayload } from './interfaces/IPayload.sol';

import { CrosschainPayload, CrosschainTestBase } from './CrosschainTestBase.sol';
import { OptimismBridgeTesting } from 'lib/xchain-helpers/src/testing/bridges/OptimismBridgeTesting.sol';
import { OptimismForwarder } from 'lib/xchain-helpers/src/forwarders/OptimismForwarder.sol';
import { OptimismReceiver } from 'lib/xchain-helpers/src/receivers/OptimismReceiver.sol';

contract BaseChainCrosschainPayload is CrosschainPayload {

constructor(IPayload _targetPayload, address _bridgeReceiver)
CrosschainPayload(_targetPayload, _bridgeReceiver) {}

function execute() external override {
XChainForwarders.sendMessageBase(
OptimismForwarder.sendMessageL1toL2(
OptimismForwarder.L1_CROSS_DOMAIN_BASE,
bridgeReceiver,
encodeCrosschainExecutionMessage(),
1_000_000
Expand All @@ -30,29 +25,35 @@ contract BaseChainCrosschainPayload is CrosschainPayload {

contract BaseChainCrosschainTest is CrosschainTestBase {

using DomainHelpers for *;
using OptimismBridgeTesting for *;

function deployCrosschainPayload(IPayload targetPayload, address bridgeReceiver)
public override returns (IPayload)
{
return IPayload(new BaseChainCrosschainPayload(targetPayload, bridgeReceiver));
}

function setUp() public {
hostDomain = new Domain(getChain('mainnet'));
bridgedDomain = new OptimismDomain(getChain('base'), hostDomain);
bridge = OptimismBridgeTesting.createNativeBridge(getChain('mainnet').createFork(), getChain('base').createFork());

bridgedDomain.selectFork();
bridge.destination.selectFork();
bridgeExecutor = new AuthBridgeExecutor(
defaultL2BridgeExecutorArgs.delay,
defaultL2BridgeExecutorArgs.gracePeriod,
defaultL2BridgeExecutorArgs.guardian
);
bridgeReceiver = address(new BridgeExecutorReceiverOptimism(
bridgeReceiver = address(new OptimismReceiver(
defaultL2BridgeExecutorArgs.ethereumGovernanceExecutor,
bridgeExecutor
address(bridgeExecutor)
));
bridgeExecutor.grantRole(bridgeExecutor.DEFAULT_ADMIN_ROLE(), bridgeReceiver);

hostDomain.selectFork();
bridge.source.selectFork();
}

function relayMessagesAcrossBridge() internal override {
bridge.relayMessagesToDestination(true);
}

}
24 changes: 14 additions & 10 deletions test/CrosschainTestBase.sol
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ pragma solidity ^0.8.0;

import 'forge-std/Test.sol';

import { BridgedDomain } from 'xchain-helpers/testing/BridgedDomain.sol';
import { Domain } from 'xchain-helpers/testing/Domain.sol';
import { Bridge } from 'lib/xchain-helpers/src/testing/Bridge.sol';
import { DomainHelpers } from 'lib/xchain-helpers/src/testing/Domain.sol';

import { IAuthBridgeExecutor } from 'src/interfaces/IAuthBridgeExecutor.sol';
import { IExecutorBase } from 'src/interfaces/IExecutorBase.sol';
Expand Down Expand Up @@ -60,6 +60,9 @@ abstract contract CrosschainPayload is IPayload {
}

abstract contract CrosschainTestBase is Test {

using DomainHelpers for *;

event TestEvent();

address public constant L1_EXECUTOR = 0x3300f198988e4C9C63F75dF86De36421f06af8c4;
Expand All @@ -73,20 +76,20 @@ abstract contract CrosschainTestBase is Test {
guardian: GUARDIAN
});

Domain public hostDomain;
BridgedDomain public bridgedDomain;
Bridge public bridge;

AuthBridgeExecutor public bridgeExecutor;
address public bridgeReceiver;

function deployCrosschainPayload(IPayload targetPayload, address bridgeReceiver) public virtual returns (IPayload);
function relayMessagesAcrossBridge() internal virtual;
barrutko marked this conversation as resolved.
Show resolved Hide resolved

function preparePayloadExecution() public {
bridgedDomain.selectFork();
bridge.destination.selectFork();

IPayload targetPayload = IPayload(new PayloadWithEmit());

hostDomain.selectFork();
bridge.source.selectFork();

IPayload crosschainPayload = deployCrosschainPayload(
targetPayload,
Expand All @@ -99,7 +102,7 @@ abstract contract CrosschainTestBase is Test {
abi.encodeWithSelector(IPayload.execute.selector)
);

bridgedDomain.relayFromHost(true);
relayMessagesAcrossBridge();
}

function testFuzz_basicCrosschainPayloadExecution(uint256 delay) public {
Expand Down Expand Up @@ -302,7 +305,7 @@ abstract contract CrosschainTestBase is Test {
}

function test_selfReconfiguration() public {
bridgedDomain.selectFork();
bridge.destination.selectFork();

assertEq(
bridgeExecutor.getDelay(),
Expand Down Expand Up @@ -330,7 +333,7 @@ abstract contract CrosschainTestBase is Test {
newL2BridgeExecutorParams.guardian
));

hostDomain.selectFork();
bridge.source.selectFork();

IPayload crosschainPayload = deployCrosschainPayload(
reconfigurationPayload,
Expand All @@ -343,7 +346,7 @@ abstract contract CrosschainTestBase is Test {
abi.encodeWithSelector(IPayload.execute.selector)
);

bridgedDomain.relayFromHost(true);
relayMessagesAcrossBridge();

skip(defaultL2BridgeExecutorArgs.delay);

Expand All @@ -362,4 +365,5 @@ abstract contract CrosschainTestBase is Test {
newL2BridgeExecutorParams.guardian
);
}

}
Loading
Loading