ETH Price: $2,595.34 (-1.13%)

Contract

0xB5e7fE8eA8ECbd33504485756fCabB5f5D29C051
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Apply_admins204285482024-07-31 19:13:3561 days ago1722453215IN
0xB5e7fE8e...f5D29C051
0 ETH0.0009243114.02598532
Commit_admins204285422024-07-31 19:12:2361 days ago1722453143IN
0xB5e7fE8e...f5D29C051
0 ETH0.0013153214.22033489
Broadcast204282142024-07-31 18:06:3561 days ago1722449195IN
0xB5e7fE8e...f5D29C051
0 ETH0.002411914.91031291
Set_destination_...204281842024-07-31 18:00:3561 days ago1722448835IN
0xB5e7fE8e...f5D29C051
0 ETH0.0010375214.81539335
0x61077e51204279312024-07-31 17:09:2361 days ago1722445763IN
 Create: Polygon zkEVM Broadcaster
0 ETH0.0086987514.1554159

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Polygon zkEVM Broadcaster

Compiler Version
vyper:0.3.10

Optimization Enabled:
N/A

Other Settings:
MIT license

Contract Source Code (Vyper language format)

# pragma version 0.3.10
"""
@title Polygon zkEVM Broadcaster
@author CurveFi
@license MIT
@custom:version 1.0.1
"""


version: public(constant(String[8])) = "1.0.1"


interface PolygonZkEVMBridge:
    def bridgeMessage(destination_network: uint32, destination_address: address, force_update: bool, metadata: Bytes[MAX_MESSAGE_RECEIVED]): payable


event Broadcast:
    chain_id: indexed(uint256)
    agent: indexed(Agent)
    messages: DynArray[Message, MAX_MESSAGES]


event SetDestinationData:
    chain_id: indexed(uint256)
    data: DestinationData


event SetNewBridge:
    new_bridge: PolygonZkEVMBridge


event SetNewDestinationNetwork:
    new_network: uint32


event ApplyAdmins:
    admins: AdminSet

event CommitAdmins:
    future_admins: AdminSet


enum Agent:
    OWNERSHIP
    PARAMETER
    EMERGENCY


struct AdminSet:
    ownership: address
    parameter: address
    emergency: address

struct Message:
    target: address
    data: Bytes[MAX_BYTES]


struct DestinationData:
    network: uint32
    relayer: address


MAX_BYTES: constant(uint256) = 1024
MAX_MESSAGES: constant(uint256) = 8
MAX_MESSAGE_RECEIVED: constant(uint256) = 9400


admins: public(AdminSet)
future_admins: public(AdminSet)

destination_data: public(HashMap[uint256, DestinationData])
agent: public(HashMap[address, Agent])

POLYGON_ZKEVM_BRIDGE: public(immutable(PolygonZkEVMBridge))


@external
def __init__(_admins: AdminSet, _polygon_zkevm_bridge: PolygonZkEVMBridge):
    assert _admins.ownership != _admins.parameter  # a != b
    assert _admins.ownership != _admins.emergency  # a != c
    assert _admins.parameter != _admins.emergency  # b != c

    self.admins = _admins

    self.agent[_admins.ownership] = Agent.OWNERSHIP
    self.agent[_admins.parameter] = Agent.PARAMETER
    self.agent[_admins.emergency] = Agent.EMERGENCY

    POLYGON_ZKEVM_BRIDGE = _polygon_zkevm_bridge

    log ApplyAdmins(_admins)


@external
def broadcast(_chain_id: uint256, _messages: DynArray[Message, MAX_MESSAGES], _force_update: bool=True, _destination_data: DestinationData=empty(DestinationData)):
    """
    @notice Broadcast a sequence of messages.
    @dev Save `depositCount` from POLYGON_ZKEVM_BRIDGE.BridgeEvent to claim message on destination chain
    @param _chain_id Chain ID of L2
    @param _messages The sequence of messages to broadcast.
    @param _force_update Indicates if the new global exit root is updated or not (forceUpdateGlobalExitRoot)
    @param _destination_data Specific DestinationData (self.destination_data by default)
    """
    agent: Agent = self.agent[msg.sender]
    assert agent != empty(Agent)
    destination: DestinationData = _destination_data
    if destination.relayer == empty(address):
        destination = self.destination_data[_chain_id]
    assert destination.relayer != empty(address)

    POLYGON_ZKEVM_BRIDGE.bridgeMessage(destination.network, destination.relayer, _force_update,
        _abi_encode(  # relay(uint256,(address,bytes)[])
            agent,
            _messages,
            method_id=method_id("relay(uint256,(address,bytes)[])"),
        ),
    )

    log Broadcast(_chain_id, agent, _messages)


@external
def set_destination_data(_chain_id: uint256, _destination_data: DestinationData):
    """
    @notice Set destination data for child chain.
    """
    assert msg.sender == self.admins.ownership
    self.destination_data[_chain_id] = _destination_data
    log SetDestinationData(_chain_id, _destination_data)


@external
def commit_admins(_future_admins: AdminSet):
    """
    @notice Commit an admin set to use in the future.
    """
    assert msg.sender == self.admins.ownership

    assert _future_admins.ownership != _future_admins.parameter  # a != b
    assert _future_admins.ownership != _future_admins.emergency  # a != c
    assert _future_admins.parameter != _future_admins.emergency  # b != c

    self.future_admins = _future_admins
    log CommitAdmins(_future_admins)


@external
def apply_admins():
    """
    @notice Apply the future admin set.
    """
    admins: AdminSet = self.admins
    assert msg.sender == admins.ownership

    # reset old admins
    self.agent[admins.ownership] = empty(Agent)
    self.agent[admins.parameter] = empty(Agent)
    self.agent[admins.emergency] = empty(Agent)

    # set new admins
    future_admins: AdminSet = self.future_admins
    self.agent[future_admins.ownership] = Agent.OWNERSHIP
    self.agent[future_admins.parameter] = Agent.PARAMETER
    self.agent[future_admins.emergency] = Agent.EMERGENCY

    self.admins = future_admins
    log ApplyAdmins(future_admins)

Contract Security Audit

Contract ABI

[{"name":"Broadcast","inputs":[{"name":"chain_id","type":"uint256","indexed":true},{"name":"agent","type":"uint256","indexed":true},{"name":"messages","type":"tuple[]","components":[{"name":"target","type":"address"},{"name":"data","type":"bytes"}],"indexed":false}],"anonymous":false,"type":"event"},{"name":"SetDestinationData","inputs":[{"name":"chain_id","type":"uint256","indexed":true},{"name":"data","type":"tuple","components":[{"name":"network","type":"uint32"},{"name":"relayer","type":"address"}],"indexed":false}],"anonymous":false,"type":"event"},{"name":"SetNewBridge","inputs":[{"name":"new_bridge","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"name":"SetNewDestinationNetwork","inputs":[{"name":"new_network","type":"uint32","indexed":false}],"anonymous":false,"type":"event"},{"name":"ApplyAdmins","inputs":[{"name":"admins","type":"tuple","components":[{"name":"ownership","type":"address"},{"name":"parameter","type":"address"},{"name":"emergency","type":"address"}],"indexed":false}],"anonymous":false,"type":"event"},{"name":"CommitAdmins","inputs":[{"name":"future_admins","type":"tuple","components":[{"name":"ownership","type":"address"},{"name":"parameter","type":"address"},{"name":"emergency","type":"address"}],"indexed":false}],"anonymous":false,"type":"event"},{"stateMutability":"nonpayable","type":"constructor","inputs":[{"name":"_admins","type":"tuple","components":[{"name":"ownership","type":"address"},{"name":"parameter","type":"address"},{"name":"emergency","type":"address"}]},{"name":"_polygon_zkevm_bridge","type":"address"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"broadcast","inputs":[{"name":"_chain_id","type":"uint256"},{"name":"_messages","type":"tuple[]","components":[{"name":"target","type":"address"},{"name":"data","type":"bytes"}]}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"broadcast","inputs":[{"name":"_chain_id","type":"uint256"},{"name":"_messages","type":"tuple[]","components":[{"name":"target","type":"address"},{"name":"data","type":"bytes"}]},{"name":"_force_update","type":"bool"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"broadcast","inputs":[{"name":"_chain_id","type":"uint256"},{"name":"_messages","type":"tuple[]","components":[{"name":"target","type":"address"},{"name":"data","type":"bytes"}]},{"name":"_force_update","type":"bool"},{"name":"_destination_data","type":"tuple","components":[{"name":"network","type":"uint32"},{"name":"relayer","type":"address"}]}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"set_destination_data","inputs":[{"name":"_chain_id","type":"uint256"},{"name":"_destination_data","type":"tuple","components":[{"name":"network","type":"uint32"},{"name":"relayer","type":"address"}]}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"commit_admins","inputs":[{"name":"_future_admins","type":"tuple","components":[{"name":"ownership","type":"address"},{"name":"parameter","type":"address"},{"name":"emergency","type":"address"}]}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"apply_admins","inputs":[],"outputs":[]},{"stateMutability":"view","type":"function","name":"version","inputs":[],"outputs":[{"name":"","type":"string"}]},{"stateMutability":"view","type":"function","name":"admins","inputs":[],"outputs":[{"name":"","type":"tuple","components":[{"name":"ownership","type":"address"},{"name":"parameter","type":"address"},{"name":"emergency","type":"address"}]}]},{"stateMutability":"view","type":"function","name":"future_admins","inputs":[],"outputs":[{"name":"","type":"tuple","components":[{"name":"ownership","type":"address"},{"name":"parameter","type":"address"},{"name":"emergency","type":"address"}]}]},{"stateMutability":"view","type":"function","name":"destination_data","inputs":[{"name":"arg0","type":"uint256"}],"outputs":[{"name":"","type":"tuple","components":[{"name":"network","type":"uint32"},{"name":"relayer","type":"address"}]}]},{"stateMutability":"view","type":"function","name":"agent","inputs":[{"name":"arg0","type":"address"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"POLYGON_ZKEVM_BRIDGE","inputs":[],"outputs":[{"name":"","type":"address"}]}]

61077e5150346101105760206108a75f395f518060a01c6101105760405260206108c75f395f518060a01c6101105760605260206108e75f395f518060a01c6101105760805260206109075f395f518060a01c6101105760a0526060516040511461011057608051604051146101105760805160605114610110576040515f55606051600155608051600255600160076040516020525f5260405f2055600260076060516020525f5260405f2055600460076080516020525f5260405f205560a05161077e527fe0f6eb67e95817aeae79003a3bb27a26759368de7d4ce19e604f2c26e48a3b5b60405160c05260605160e05260805161010052606060c0a161077e6101146100003961079e610000f35b5f80fd5f3560e01c6002600a820660011b61076a01601e395f51565b6354fd4d50811861076257346107665760208060805260056040527f312e302e3100000000000000000000000000000000000000000000000000000060605260408160800181518152602082015160208201528051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506080f3610762565b63a5de361981186100c15734610766575f5460405260015460605260025460805260606040f35b63b06565ad8118610762576024361034176107665760066004356020525f5260405f20805460405260018101546060525060406040f3610762565b630a501674811861076257346107665760035460405260045460605260055460805260606040f3610762565b6392e423b5811861016357602436103417610766576004358060a01c6107665760405260076040516020525f5260405f205460605260206060f35b639b209ca781186107625760c436103417610766576044358060011c61076657612260526064358060201c61076657612280526084358060a01c610766576122a0525b60243560040160088135116107665780355f816008811161076657801561021a57905b61044081026060018160051b602086010135602086010180358060a01c61076657825260208101358101610400813511610766576020813501602084018183823750505050506001018181186101c9575b50508060405250506007336020525f5260405f20546122c0526122c0511561076657612280516122e0526122a05161230052612300516102735760066004356020525f5260405f2080546122e052600181015461230052505b612300511561076657602061077e5f395f5163240ff3786147c05260806122e0516147e05261230051614800526122605161482052806148405263f6caf91061232452600460406122c05161234452806123645280612344015f6040518083528060051b5f826008811161076657801561035e57905b828160051b60208801015261044081026060018360208801016040825182528060208301526020830181830160208251018082828560045afa50508051806020830101601f825f03163682375050601f19601f82516020010116905090508101905090509050830192506001018181186102e9575b505082016020019150509050810190500161232052612320816147e00160208251018082828560045afa50508051806020830101601f825f03163682375050601f19601f825160200101169050905081015050803b15610766575f6147c06125246147dc5f855af16103d2573d5f5f3e3d5ffd5b506122c0516004357f241535e867e2e70c9b90c78bf421cd608d5aa2fee669e7f606763ae02e0890b76020806123205280612320015f6040518083528060051b5f826008811161076657801561049957905b828160051b60208801015261044081026060018360208801016040825182528060208301526020830181830160208251018082828560045afa50508051806020830101601f825f03163682375050601f19601f8251602001011690509050810190509050905083019250600101818118610424575b50508201602001915050905081019050612320a300610762565b63c0db068381186104d1573461076657602061077e60403960206040f35b635b6bb17b811861076257606436103417610766576024358060201c610766576040526044358060a01c610766576060525f5433186107665760066004356020525f5260405f2060405181556060516001820155506004357fb4ed998abeea397c18e3b1fee36f5ba118c096e929f9d31f1d3e2d836dff029960405160805260605160a05260406080a200610762565b630ac1e51b81186107625760643610341761076657600161226052604036612280376101a656610762565b63dd95aad281186105bc57608436103417610766576044358060011c6107665761226052604036612280376101a6565b6367d20a5c81186107625734610766575f546040526001546060526002546080526040513318610766575f60076040516020525f5260405f20555f60076060516020525f5260405f20555f60076080516020525f5260405f205560035460a05260045460c05260055460e0526001600760a0516020525f5260405f20556002600760c0516020525f5260405f20556004600760e0516020525f5260405f205560a0515f5560c05160015560e0516002557fe0f6eb67e95817aeae79003a3bb27a26759368de7d4ce19e604f2c26e48a3b5b60a0516101005260c0516101205260e051610140526060610100a100610762565b63579f1ece811861076257606436103417610766576004358060a01c610766576040526024358060a01c610766576060526044358060a01c610766576080525f543318610766576060516040511461076657608051604051146107665760805160605114610766576040516003556060516004556080516005557faab5f73e74c83b7bbe381c885335c8bc6f8638e2eee26576cf80844c7ca0f11b60405160a05260605160c05260805160e052606060a0a1005b5f5ffd5b5f80fd058c009a06ae04b3001801280762076200fc05618419077e81141820a16576797065728300030a001500000000000000000000000071f718d3e4d1449d1502a6a7595eb84ebccb16830000000000000000000000004eeb3ba4f221ca16ed4a0cc7254e2e32df948c5f000000000000000000000000467947ee34af926cf1dcac093870f613c96b1e0c0000000000000000000000002a3dd3eb832af982ec71669e178424b10dca2ede

Deployed Bytecode

0x5f3560e01c6002600a820660011b61076a01601e395f51565b6354fd4d50811861076257346107665760208060805260056040527f312e302e3100000000000000000000000000000000000000000000000000000060605260408160800181518152602082015160208201528051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506080f3610762565b63a5de361981186100c15734610766575f5460405260015460605260025460805260606040f35b63b06565ad8118610762576024361034176107665760066004356020525f5260405f20805460405260018101546060525060406040f3610762565b630a501674811861076257346107665760035460405260045460605260055460805260606040f3610762565b6392e423b5811861016357602436103417610766576004358060a01c6107665760405260076040516020525f5260405f205460605260206060f35b639b209ca781186107625760c436103417610766576044358060011c61076657612260526064358060201c61076657612280526084358060a01c610766576122a0525b60243560040160088135116107665780355f816008811161076657801561021a57905b61044081026060018160051b602086010135602086010180358060a01c61076657825260208101358101610400813511610766576020813501602084018183823750505050506001018181186101c9575b50508060405250506007336020525f5260405f20546122c0526122c0511561076657612280516122e0526122a05161230052612300516102735760066004356020525f5260405f2080546122e052600181015461230052505b612300511561076657602061077e5f395f5163240ff3786147c05260806122e0516147e05261230051614800526122605161482052806148405263f6caf91061232452600460406122c05161234452806123645280612344015f6040518083528060051b5f826008811161076657801561035e57905b828160051b60208801015261044081026060018360208801016040825182528060208301526020830181830160208251018082828560045afa50508051806020830101601f825f03163682375050601f19601f82516020010116905090508101905090509050830192506001018181186102e9575b505082016020019150509050810190500161232052612320816147e00160208251018082828560045afa50508051806020830101601f825f03163682375050601f19601f825160200101169050905081015050803b15610766575f6147c06125246147dc5f855af16103d2573d5f5f3e3d5ffd5b506122c0516004357f241535e867e2e70c9b90c78bf421cd608d5aa2fee669e7f606763ae02e0890b76020806123205280612320015f6040518083528060051b5f826008811161076657801561049957905b828160051b60208801015261044081026060018360208801016040825182528060208301526020830181830160208251018082828560045afa50508051806020830101601f825f03163682375050601f19601f8251602001011690509050810190509050905083019250600101818118610424575b50508201602001915050905081019050612320a300610762565b63c0db068381186104d1573461076657602061077e60403960206040f35b635b6bb17b811861076257606436103417610766576024358060201c610766576040526044358060a01c610766576060525f5433186107665760066004356020525f5260405f2060405181556060516001820155506004357fb4ed998abeea397c18e3b1fee36f5ba118c096e929f9d31f1d3e2d836dff029960405160805260605160a05260406080a200610762565b630ac1e51b81186107625760643610341761076657600161226052604036612280376101a656610762565b63dd95aad281186105bc57608436103417610766576044358060011c6107665761226052604036612280376101a6565b6367d20a5c81186107625734610766575f546040526001546060526002546080526040513318610766575f60076040516020525f5260405f20555f60076060516020525f5260405f20555f60076080516020525f5260405f205560035460a05260045460c05260055460e0526001600760a0516020525f5260405f20556002600760c0516020525f5260405f20556004600760e0516020525f5260405f205560a0515f5560c05160015560e0516002557fe0f6eb67e95817aeae79003a3bb27a26759368de7d4ce19e604f2c26e48a3b5b60a0516101005260c0516101205260e051610140526060610100a100610762565b63579f1ece811861076257606436103417610766576004358060a01c610766576040526024358060a01c610766576060526044358060a01c610766576080525f543318610766576060516040511461076657608051604051146107665760805160605114610766576040516003556060516004556080516005557faab5f73e74c83b7bbe381c885335c8bc6f8638e2eee26576cf80844c7ca0f11b60405160a05260605160c05260805160e052606060a0a1005b5f5ffd5b5f80fd058c009a06ae04b3001801280762076200fc05610000000000000000000000002a3dd3eb832af982ec71669e178424b10dca2ede

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000071f718d3e4d1449d1502a6a7595eb84ebccb16830000000000000000000000004eeb3ba4f221ca16ed4a0cc7254e2e32df948c5f000000000000000000000000467947ee34af926cf1dcac093870f613c96b1e0c0000000000000000000000002a3dd3eb832af982ec71669e178424b10dca2ede

-----Decoded View---------------
Arg [0] : _admins (tuple): System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput]
Arg [1] : _polygon_zkevm_bridge (address): 0x2a3DD3EB832aF982ec71669E178424b10Dca2EDe

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 00000000000000000000000071f718d3e4d1449d1502a6a7595eb84ebccb1683
Arg [1] : 0000000000000000000000004eeb3ba4f221ca16ed4a0cc7254e2e32df948c5f
Arg [2] : 000000000000000000000000467947ee34af926cf1dcac093870f613c96b1e0c
Arg [3] : 0000000000000000000000002a3dd3eb832af982ec71669e178424b10dca2ede


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.