Skip to content

Commit

Permalink
feat: make broadcaster and relayer settable for easy deployment process
Browse files Browse the repository at this point in the history
  • Loading branch information
romanagureev committed Jul 30, 2024
1 parent 00be3d9 commit 7c74b92
Show file tree
Hide file tree
Showing 15 changed files with 144 additions and 69 deletions.
28 changes: 25 additions & 3 deletions contracts/arbitrum/ArbitrumBroadcaster.vy
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@ interface IArbInbox:
def calculateRetryableSubmissionFee(_data_length: uint256, _base_fee: uint256) -> uint256: view


event SetRelayer:
relayer: address

event ApplyAdmins:
admins: AdminSet

Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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
Expand Down
6 changes: 4 additions & 2 deletions contracts/arbitrum/ArbitrumRelayer.vy
Original file line number Diff line number Diff line change
Expand Up @@ -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))
Expand All @@ -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)
Expand All @@ -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)
27 changes: 24 additions & 3 deletions contracts/optimism/OptimismBroadcaster.vy
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@ event ApplyAdmins:
event CommitAdmins:
future_admins: AdminSet

event SetRelayer:
relayer: address

event SetOVMChain:
ovm_chain: address

Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand All @@ -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,
Expand All @@ -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):
"""
Expand Down
6 changes: 4 additions & 2 deletions contracts/optimism/OptimismRelayer.vy
Original file line number Diff line number Diff line change
Expand Up @@ -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))
Expand All @@ -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)
Expand All @@ -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)
26 changes: 24 additions & 2 deletions contracts/polygon_zkevm/PolygonzkEVMBroadcaster.vy
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@ event Broadcast:
messages: DynArray[Message, MAX_MESSAGES]


event SetRelayer:
relayer: address


event SetNewBridge:
new_bridge: PolygonZkEVMBridge

Expand Down Expand Up @@ -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))
Expand All @@ -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
Expand All @@ -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,
Expand All @@ -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):
"""
Expand Down
7 changes: 5 additions & 2 deletions contracts/polygon_zkevm/PolygonzkEVMRelayer.vy
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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()
24 changes: 14 additions & 10 deletions tests/arbitrum/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -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


Expand All @@ -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
)
6 changes: 2 additions & 4 deletions tests/arbitrum/test_broadcaster.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
6 changes: 2 additions & 4 deletions tests/arbitrum/test_relayer.py
Original file line number Diff line number Diff line change
@@ -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)
Expand Down
24 changes: 14 additions & 10 deletions tests/optimism/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -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


Expand All @@ -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
)
6 changes: 2 additions & 4 deletions tests/optimism/test_broadcaster.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
Loading

0 comments on commit 7c74b92

Please sign in to comment.