From 7c74b92d0e8aa171944099076e2bbaf4d79390aa Mon Sep 17 00:00:00 2001 From: Roman Agureev Date: Tue, 30 Jul 2024 23:57:59 +0300 Subject: [PATCH] feat: make broadcaster and relayer settable for easy deployment process --- contracts/arbitrum/ArbitrumBroadcaster.vy | 28 +++++++++++++++++-- contracts/arbitrum/ArbitrumRelayer.vy | 6 ++-- contracts/optimism/OptimismBroadcaster.vy | 27 ++++++++++++++++-- contracts/optimism/OptimismRelayer.vy | 6 ++-- .../polygon_zkevm/PolygonzkEVMBroadcaster.vy | 26 +++++++++++++++-- .../polygon_zkevm/PolygonzkEVMRelayer.vy | 7 +++-- tests/arbitrum/conftest.py | 24 +++++++++------- tests/arbitrum/test_broadcaster.py | 6 ++-- tests/arbitrum/test_relayer.py | 6 ++-- tests/optimism/conftest.py | 24 +++++++++------- tests/optimism/test_broadcaster.py | 6 ++-- tests/optimism/test_relayer.py | 6 ++-- tests/polygon_zkevm/conftest.py | 21 ++++++++------ tests/polygon_zkevm/test_broadcaster.py | 9 +++--- tests/polygon_zkevm/test_relayer.py | 11 ++++---- 15 files changed, 144 insertions(+), 69 deletions(-) diff --git a/contracts/arbitrum/ArbitrumBroadcaster.vy b/contracts/arbitrum/ArbitrumBroadcaster.vy index e173293..287ffaa 100644 --- a/contracts/arbitrum/ArbitrumBroadcaster.vy +++ b/contracts/arbitrum/ArbitrumBroadcaster.vy @@ -9,6 +9,9 @@ interface IArbInbox: def calculateRetryableSubmissionFee(_data_length: uint256, _base_fee: uint256) -> uint256: view +event SetRelayer: + relayer: address + event ApplyAdmins: admins: AdminSet @@ -46,6 +49,7 @@ MAXSIZE: constant(uint256) = 16384 admins: public(AdminSet) future_admins: public(AdminSet) +relayer: public(address) agent: HashMap[address, Agent] arb_inbox: public(address) @@ -74,15 +78,20 @@ def __init__(_admins: AdminSet, _arb_inbox: address, _arb_refund: address): @external -def broadcast(_messages: DynArray[Message, MAX_MESSAGES], _gas_limit: uint256, _max_fee_per_gas: uint256): +def broadcast(_messages: DynArray[Message, MAX_MESSAGES], _gas_limit: uint256, _max_fee_per_gas: uint256, _relayer: address=empty(address)): """ - @notice Broadcast a sequence of messeages. + @notice Broadcast a sequence of messages. @param _messages The sequence of messages to broadcast. @param _gas_limit The gas limit for the execution on L2. @param _max_fee_per_gas The maximum gas price bid for the execution on L2. + @param _relayer Relayer address in case of multiple relayers deployed. """ agent: Agent = self.agent[msg.sender] assert agent != empty(Agent) + relayer: address = _relayer + if relayer == empty(address): + relayer = self.relayer + assert relayer != empty(address) # define all variables here before expanding memory enormously arb_inbox: address = self.arb_inbox @@ -100,7 +109,7 @@ def broadcast(_messages: DynArray[Message, MAX_MESSAGES], _gas_limit: uint256, _ raw_call( arb_inbox, _abi_encode( - self, # to + relayer, # to empty(uint256), # l2CallValue submission_cost, # maxSubmissionCost arb_refund, # excessFeeRefundAddress @@ -114,6 +123,19 @@ def broadcast(_messages: DynArray[Message, MAX_MESSAGES], _gas_limit: uint256, _ ) +@external +def set_relayer(_relayer: address): + """ + @notice Set relayer address on child chain. Should be set once. + """ + # Initially anyone can set but if front-ran need to set by DAO + if self.relayer != empty(address): + assert msg.sender == self.admins.ownership + + self.relayer = _relayer + log SetRelayer(_relayer) + + @external def set_arb_inbox(_arb_inbox: address): assert msg.sender == self.admins.ownership diff --git a/contracts/arbitrum/ArbitrumRelayer.vy b/contracts/arbitrum/ArbitrumRelayer.vy index 2db218a..014fd6a 100644 --- a/contracts/arbitrum/ArbitrumRelayer.vy +++ b/contracts/arbitrum/ArbitrumRelayer.vy @@ -30,6 +30,7 @@ MAX_MESSAGES: constant(uint256) = 8 CODE_OFFSET: constant(uint256) = 3 +BROADCASTER: public(immutable(address)) ARBSYS: public(immutable(address)) OWNERSHIP_AGENT: public(immutable(address)) @@ -41,7 +42,8 @@ agent: HashMap[Agent, address] @external -def __init__(_agent_blueprint: address, _arbsys: address): +def __init__(broadcaster: address, _agent_blueprint: address, _arbsys: address): + BROADCASTER = broadcaster ARBSYS = _arbsys OWNERSHIP_AGENT = create_from_blueprint(_agent_blueprint, code_offset=CODE_OFFSET) @@ -61,6 +63,6 @@ def relay(_agent: Agent, _messages: DynArray[Message, MAX_MESSAGES]): @param _messages The sequence of messages to relay. """ assert IArbSys(ARBSYS).wasMyCallersAddressAliased() - assert IArbSys(ARBSYS).myCallersAddressWithoutAliasing() == self + assert IArbSys(ARBSYS).myCallersAddressWithoutAliasing() == BROADCASTER IAgent(self.agent[_agent]).execute(_messages) diff --git a/contracts/optimism/OptimismBroadcaster.vy b/contracts/optimism/OptimismBroadcaster.vy index 692d044..e243c1a 100644 --- a/contracts/optimism/OptimismBroadcaster.vy +++ b/contracts/optimism/OptimismBroadcaster.vy @@ -15,6 +15,9 @@ event ApplyAdmins: event CommitAdmins: future_admins: AdminSet +event SetRelayer: + relayer: address + event SetOVMChain: ovm_chain: address @@ -45,6 +48,7 @@ MAX_MESSAGES: constant(uint256) = 8 admins: public(AdminSet) future_admins: public(AdminSet) +relayer: public(address) agent: HashMap[address, Agent] ovm_chain: public(address) # CanonicalTransactionChain @@ -72,14 +76,18 @@ def __init__(_admins: AdminSet, _ovm_chain: address, _ovm_messenger: address): @external -def broadcast(_messages: DynArray[Message, MAX_MESSAGES], _gas_limit: uint32 = 0): +def broadcast(_messages: DynArray[Message, MAX_MESSAGES], _gas_limit: uint32 = 0, _relayer: address=empty(address)): """ - @notice Broadcast a sequence of messeages. + @notice Broadcast a sequence of messages. @param _messages The sequence of messages to broadcast. @param _gas_limit The L2 gas limit required to execute the sequence of messages. """ agent: Agent = self.agent[msg.sender] assert agent != empty(Agent) + relayer: address = _relayer + if relayer == empty(address): + relayer = self.relayer + assert relayer != empty(address) # https://community.optimism.io/docs/developers/bridge/messaging/#for-l1-%E2%87%92-l2-transactions gas_limit: uint32 = _gas_limit @@ -89,7 +97,7 @@ def broadcast(_messages: DynArray[Message, MAX_MESSAGES], _gas_limit: uint32 = 0 raw_call( self.ovm_messenger, _abi_encode( # sendMessage(address,bytes,uint32) - self, + relayer, _abi_encode( # relay(uint256,(address,bytes)[]) agent, _messages, @@ -101,6 +109,19 @@ def broadcast(_messages: DynArray[Message, MAX_MESSAGES], _gas_limit: uint32 = 0 ) +@external +def set_relayer(_relayer: address): + """ + @notice Set relayer address on child chain. Should be set once. + """ + # Initially anyone can set but if front-ran need to set by DAO + if self.relayer != empty(address): + assert msg.sender == self.admins.ownership + + self.relayer = _relayer + log SetRelayer(_relayer) + + @external def set_ovm_chain(_ovm_chain: address): """ diff --git a/contracts/optimism/OptimismRelayer.vy b/contracts/optimism/OptimismRelayer.vy index 8379db3..2a5a554 100644 --- a/contracts/optimism/OptimismRelayer.vy +++ b/contracts/optimism/OptimismRelayer.vy @@ -29,6 +29,7 @@ MAX_MESSAGES: constant(uint256) = 8 CODE_OFFSET: constant(uint256) = 3 +BROADCASTER: public(immutable(address)) MESSENGER: public(immutable(address)) OWNERSHIP_AGENT: public(immutable(address)) @@ -40,7 +41,8 @@ agent: HashMap[Agent, address] @external -def __init__(_agent_blueprint: address, _messenger: address): +def __init__(_broadcaster: address, _agent_blueprint: address, _messenger: address): + BROADCASTER = _broadcaster MESSENGER = _messenger OWNERSHIP_AGENT = create_from_blueprint(_agent_blueprint, code_offset=CODE_OFFSET) @@ -60,6 +62,6 @@ def relay(_agent: Agent, _messages: DynArray[Message, MAX_MESSAGES]): @param _messages The sequence of messages to relay. """ assert msg.sender == MESSENGER - assert IMessenger(MESSENGER).xDomainMessageSender() == self + assert IMessenger(MESSENGER).xDomainMessageSender() == BROADCASTER IAgent(self.agent[_agent]).execute(_messages) diff --git a/contracts/polygon_zkevm/PolygonzkEVMBroadcaster.vy b/contracts/polygon_zkevm/PolygonzkEVMBroadcaster.vy index d7ce2e4..7bd298a 100644 --- a/contracts/polygon_zkevm/PolygonzkEVMBroadcaster.vy +++ b/contracts/polygon_zkevm/PolygonzkEVMBroadcaster.vy @@ -14,6 +14,10 @@ event Broadcast: messages: DynArray[Message, MAX_MESSAGES] +event SetRelayer: + relayer: address + + event SetNewBridge: new_bridge: PolygonZkEVMBridge @@ -53,6 +57,7 @@ MAX_MESSAGE_RECEIVED: constant(uint256) = 9400 admins: public(AdminSet) future_admins: public(AdminSet) +relayer: public(address) agent: public(HashMap[address, Agent]) POLYGON_ZKEVM_BRIDGE: public(immutable(PolygonZkEVMBridge)) @@ -78,7 +83,7 @@ def __init__(_admins: AdminSet, _polygon_zkevm_bridge: PolygonZkEVMBridge, _dest @external -def broadcast(_messages: DynArray[Message, MAX_MESSAGES], _force_update: bool=True): +def broadcast(_messages: DynArray[Message, MAX_MESSAGES], _force_update: bool=True, _relayer: address=empty(address)): """ @notice Broadcast a sequence of messages. @dev Save `depositCount` from POLYGON_ZKEVM_BRIDGE.BridgeEvent to claim message on destination chain @@ -87,8 +92,12 @@ def broadcast(_messages: DynArray[Message, MAX_MESSAGES], _force_update: bool=Tr """ agent: Agent = self.agent[msg.sender] assert agent != empty(Agent) + relayer: address = _relayer + if relayer == empty(address): + relayer = self.relayer + assert relayer != empty(address) - POLYGON_ZKEVM_BRIDGE.bridgeMessage(DESTINATION_NETWORK, self, _force_update, + POLYGON_ZKEVM_BRIDGE.bridgeMessage(DESTINATION_NETWORK, relayer, _force_update, _abi_encode( # relay(uint256,(address,bytes)[]) agent, _messages, @@ -99,6 +108,19 @@ def broadcast(_messages: DynArray[Message, MAX_MESSAGES], _force_update: bool=Tr log Broadcast(agent, _messages) +@external +def set_relayer(_relayer: address): + """ + @notice Set relayer address on child chain. Should be set once. + """ + # Initially anyone can set but if front-ran need to set by DAO + if self.relayer != empty(address): + assert msg.sender == self.admins.ownership + + self.relayer = _relayer + log SetRelayer(_relayer) + + @external def commit_admins(_future_admins: AdminSet): """ diff --git a/contracts/polygon_zkevm/PolygonzkEVMRelayer.vy b/contracts/polygon_zkevm/PolygonzkEVMRelayer.vy index 0052497..5d66c6d 100644 --- a/contracts/polygon_zkevm/PolygonzkEVMRelayer.vy +++ b/contracts/polygon_zkevm/PolygonzkEVMRelayer.vy @@ -42,12 +42,15 @@ EMERGENCY_AGENT: public(immutable(address)) agent: HashMap[Agent, address] + +BROADCASTER: public(immutable(address)) MESSENGER: public(immutable(address)) ORIGIN_NETWORK: public(immutable(uint32)) @external -def __init__(_agent_blueprint: address, _messenger: address, _origin_network: uint32): +def __init__(_broadcaster: address, _agent_blueprint: address, _messenger: address, _origin_network: uint32): + BROADCASTER = _broadcaster MESSENGER = _messenger log SetMessenger(_messenger) ORIGIN_NETWORK = _origin_network @@ -78,7 +81,7 @@ def relay(_agent: Agent, _messages: DynArray[Message, MAX_MESSAGES]): @external def onMessageReceived(_origin_address: address, _origin_network: uint32, _data: Bytes[MAX_MESSAGE_RECEIVED]): assert msg.sender == MESSENGER - assert _origin_address == self + assert _origin_address == BROADCASTER assert _origin_network == ORIGIN_NETWORK raw_call(self, _data) # .relay() diff --git a/tests/arbitrum/conftest.py b/tests/arbitrum/conftest.py index d77f35b..6a33c7b 100644 --- a/tests/arbitrum/conftest.py +++ b/tests/arbitrum/conftest.py @@ -7,9 +7,20 @@ def mock_arbsys(alice, project): @pytest.fixture(scope="module") -def relayer(alice, project, agent_blueprint, mock_arbsys): - relayer = project.ArbitrumRelayer.deploy(agent_blueprint, mock_arbsys, sender=alice) - mock_arbsys._set_l1_caller(relayer, sender=alice) +def broadcaster(alice, bob, charlie, project, mock_arb_inbox, mock_arbsys): + contract = project.ArbitrumBroadcaster.deploy( + (alice, bob, charlie), mock_arb_inbox, alice, sender=alice, value=10**18 + ) + mock_arbsys._set_l1_caller(contract, sender=alice) + return contract + + +@pytest.fixture(scope="module") +def relayer(alice, dave, project, broadcaster, agent_blueprint, mock_arbsys): + relayer = project.ArbitrumRelayer.deploy( + broadcaster, agent_blueprint, mock_arbsys, sender=alice + ) + broadcaster.set_relayer(relayer, sender=dave) # anyone at set up yield relayer @@ -21,10 +32,3 @@ def agents(relayer): @pytest.fixture(scope="module") def mock_arb_inbox(alice, project): yield project.MockArbInbox.deploy(sender=alice) - - -@pytest.fixture(scope="module") -def broadcaster(alice, bob, charlie, project, mock_arb_inbox): - yield project.ArbitrumBroadcaster.deploy( - (alice, bob, charlie), mock_arb_inbox, alice, sender=alice, value=10**18 - ) diff --git a/tests/arbitrum/test_broadcaster.py b/tests/arbitrum/test_broadcaster.py index 7e9b358..0dc1367 100644 --- a/tests/arbitrum/test_broadcaster.py +++ b/tests/arbitrum/test_broadcaster.py @@ -4,11 +4,9 @@ from eth_utils import keccak -def test_constructor(alice, bob, charlie, project, mock_arb_inbox): - broadcaster = project.ArbitrumBroadcaster.deploy( - (alice, bob, charlie), mock_arb_inbox, alice, sender=alice, value=10**18 - ) +def test_constructor(alice, bob, charlie, broadcaster, relayer, mock_arb_inbox): assert broadcaster.admins() == (alice, bob, charlie) + assert broadcaster.relayer() == relayer assert broadcaster.arb_inbox() == mock_arb_inbox assert broadcaster.arb_refund() == alice diff --git a/tests/arbitrum/test_relayer.py b/tests/arbitrum/test_relayer.py index 91fb966..d8bb89b 100644 --- a/tests/arbitrum/test_relayer.py +++ b/tests/arbitrum/test_relayer.py @@ -1,19 +1,17 @@ import math import ape -import eth_abi import pytest from tests import AgentEnum -def test_constructor(alice, project, agent_blueprint, mock_arbsys, ZERO_ADDRESS): - relayer = project.ArbitrumRelayer.deploy(agent_blueprint, mock_arbsys, sender=alice) - +def test_constructor(alice, broadcaster, relayer, agent_blueprint, mock_arbsys, ZERO_ADDRESS): assert relayer.OWNERSHIP_AGENT() != ZERO_ADDRESS assert relayer.PARAMETER_AGENT() != ZERO_ADDRESS assert relayer.EMERGENCY_AGENT() != ZERO_ADDRESS assert relayer.ARBSYS() == mock_arbsys + assert relayer.BROADCASTER() == broadcaster @pytest.mark.parametrize("agent", AgentEnum) diff --git a/tests/optimism/conftest.py b/tests/optimism/conftest.py index f1f47f5..c308105 100644 --- a/tests/optimism/conftest.py +++ b/tests/optimism/conftest.py @@ -7,9 +7,20 @@ def mock_messenger(alice, project): @pytest.fixture(scope="module") -def relayer(alice, project, agent_blueprint, mock_messenger): - relayer = project.OptimismRelayer.deploy(agent_blueprint, mock_messenger, sender=alice) - mock_messenger._set_sender(relayer, sender=alice) +def broadcaster(alice, bob, charlie, project, mock_chain, mock_messenger): + contract = project.OptimismBroadcaster.deploy( + (alice, bob, charlie), mock_chain, mock_messenger, sender=alice + ) + mock_messenger._set_sender(contract, sender=alice) + return contract + + +@pytest.fixture(scope="module") +def relayer(alice, dave, project, broadcaster, agent_blueprint, mock_messenger): + relayer = project.OptimismRelayer.deploy( + broadcaster, agent_blueprint, mock_messenger, sender=alice + ) + broadcaster.set_relayer(relayer, sender=dave) # anyone at set up yield relayer @@ -21,10 +32,3 @@ def agents(relayer): @pytest.fixture(scope="module") def mock_chain(alice, project): yield project.MockCanonicalTransactionChain.deploy(sender=alice) - - -@pytest.fixture(scope="module") -def broadcaster(alice, bob, charlie, project, mock_chain, mock_messenger): - yield project.OptimismBroadcaster.deploy( - (alice, bob, charlie), mock_chain, mock_messenger, sender=alice - ) diff --git a/tests/optimism/test_broadcaster.py b/tests/optimism/test_broadcaster.py index e51bca2..a919783 100644 --- a/tests/optimism/test_broadcaster.py +++ b/tests/optimism/test_broadcaster.py @@ -6,11 +6,9 @@ from eth_utils import keccak -def test_constructor(alice, bob, charlie, project, mock_chain, mock_messenger): - broadcaster = project.OptimismBroadcaster.deploy( - (alice, bob, charlie), mock_chain, mock_messenger, sender=alice - ) +def test_constructor(alice, bob, charlie, broadcaster, relayer, mock_chain, mock_messenger): assert broadcaster.admins() == (alice, bob, charlie) + assert broadcaster.relayer() == relayer assert broadcaster.ovm_chain() == mock_chain assert broadcaster.ovm_messenger() == mock_messenger diff --git a/tests/optimism/test_relayer.py b/tests/optimism/test_relayer.py index 6e7932f..4c6414a 100644 --- a/tests/optimism/test_relayer.py +++ b/tests/optimism/test_relayer.py @@ -1,19 +1,17 @@ import math import ape -import eth_abi import pytest from tests import AgentEnum -def test_constructor(alice, project, agent_blueprint, mock_messenger, ZERO_ADDRESS): - relayer = project.OptimismRelayer.deploy(agent_blueprint, mock_messenger, sender=alice) - +def test_constructor(alice, broadcaster, relayer, agent_blueprint, mock_messenger, ZERO_ADDRESS): assert relayer.OWNERSHIP_AGENT() != ZERO_ADDRESS assert relayer.PARAMETER_AGENT() != ZERO_ADDRESS assert relayer.EMERGENCY_AGENT() != ZERO_ADDRESS assert relayer.MESSENGER() == mock_messenger + assert relayer.BROADCASTER() == broadcaster @pytest.mark.parametrize("agent", AgentEnum) diff --git a/tests/polygon_zkevm/conftest.py b/tests/polygon_zkevm/conftest.py index 91adcde..4dbfcbb 100644 --- a/tests/polygon_zkevm/conftest.py +++ b/tests/polygon_zkevm/conftest.py @@ -7,18 +7,21 @@ def mock_bridge(alice, project): @pytest.fixture(scope="module") -def relayer(alice, project, agent_blueprint, mock_bridge): - relayer = project.PolygonzkEVMRelayer.deploy(agent_blueprint, mock_bridge, 0, sender=alice) - yield relayer +def broadcaster(alice, bob, charlie, project, mock_bridge): + yield project.PolygonzkEVMBroadcaster.deploy( + (alice, bob, charlie), mock_bridge, 3, sender=alice + ) @pytest.fixture(scope="module") -def agents(relayer): - yield [getattr(relayer, attr + "_AGENT")() for attr in ["OWNERSHIP", "PARAMETER", "EMERGENCY"]] +def relayer(alice, dave, project, broadcaster, agent_blueprint, mock_bridge): + relayer = project.PolygonzkEVMRelayer.deploy( + broadcaster, agent_blueprint, mock_bridge, 0, sender=alice + ) + broadcaster.set_relayer(relayer, sender=dave) # anyone at set up + yield relayer @pytest.fixture(scope="module") -def broadcaster(alice, bob, charlie, project, mock_bridge): - yield project.PolygonzkEVMBroadcaster.deploy( - (alice, bob, charlie), mock_bridge, 3, sender=alice - ) +def agents(relayer): + yield [getattr(relayer, attr + "_AGENT")() for attr in ["OWNERSHIP", "PARAMETER", "EMERGENCY"]] diff --git a/tests/polygon_zkevm/test_broadcaster.py b/tests/polygon_zkevm/test_broadcaster.py index 41a46f9..6a95f8b 100644 --- a/tests/polygon_zkevm/test_broadcaster.py +++ b/tests/polygon_zkevm/test_broadcaster.py @@ -6,19 +6,18 @@ from eth_utils import keccak -def test_constructor(alice, bob, charlie, broadcaster, mock_bridge): +def test_constructor(alice, bob, charlie, broadcaster, relayer, mock_bridge): assert broadcaster.admins() == (alice, bob, charlie) + assert broadcaster.relayer() == relayer assert broadcaster.POLYGON_ZKEVM_BRIDGE() == mock_bridge assert broadcaster.DESTINATION_NETWORK() == 3 @pytest.mark.parametrize("idx,force_update", itertools.product(range(3), [False, True])) -def test_broadcast_success( - alice, bob, charlie, broadcaster, mock_bridge, idx, force_update -): +def test_broadcast_success(alice, bob, charlie, broadcaster, mock_bridge, idx, force_update): msg_sender = [alice, bob, charlie][idx] - tx = broadcaster.broadcast([(alice.address, b"")], force_update, sender=msg_sender) + broadcaster.broadcast([(alice.address, b"")], force_update, sender=msg_sender) decoded = eth_abi.decode(["uint256", "(address,bytes)[]"], mock_bridge.metadata()[4:]) diff --git a/tests/polygon_zkevm/test_relayer.py b/tests/polygon_zkevm/test_relayer.py index 2511234..0812b96 100644 --- a/tests/polygon_zkevm/test_relayer.py +++ b/tests/polygon_zkevm/test_relayer.py @@ -3,28 +3,29 @@ import ape import eth_abi import pytest - from eth_utils import keccak from tests import AgentEnum -def test_constructor(alice, relayer, mock_bridge, ZERO_ADDRESS): +def test_constructor(alice, broadcaster, relayer, mock_bridge, ZERO_ADDRESS): assert relayer.OWNERSHIP_AGENT() != ZERO_ADDRESS assert relayer.PARAMETER_AGENT() != ZERO_ADDRESS assert relayer.EMERGENCY_AGENT() != ZERO_ADDRESS assert relayer.MESSENGER() == mock_bridge + assert relayer.BROADCASTER() == broadcaster @pytest.mark.parametrize("agent", AgentEnum) def test_relay_success(alice, bob, relayer, mock_bridge, agent, agents, broadcaster): agent_addr = agents[int(math.log2(agent))] - data = keccak(text="relay(uint256,(address,bytes)[])")[:4] +\ - eth_abi.encode(["uint256", "(address,bytes)[]"], [agent, [(alice.address, b"")]]) + data = keccak(text="relay(uint256,(address,bytes)[])")[:4] + eth_abi.encode( + ["uint256", "(address,bytes)[]"], [agent, [(alice.address, b"")]] + ) mock_bridge.bridgeMessage(3, relayer.address, False, data, sender=broadcaster) mock_bridge._set_destination_address(relayer, sender=alice) - mock_bridge._set_origin_address(relayer, sender=alice) + mock_bridge._set_origin_address(broadcaster, sender=alice) tx = mock_bridge.claimMessage(sender=alice) targets = [f.contract_address for f in tx.trace if f.op == "CALL"]