S Price: $0.593818 (-2.06%)

Contract

0x6F8012b70ba1fb7F40873CD7f1b03c6fb5bf666C

Overview

S Balance

Sonic LogoSonic LogoSonic Logo0 S

S Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Bridge16413102024-12-26 10:07:1890 days ago1735207638IN
0x6F8012b7...fb5bf666C
19.14133473 S0.000397271.55
Commit_transfer_...15837292024-12-25 18:09:2291 days ago1735150162IN
0x6F8012b7...fb5bf666C
0 S0.000046291

Latest 1 internal transaction

Parent Transaction Hash Block From To
16413102024-12-26 10:07:1890 days ago1735207638
0x6F8012b7...fb5bf666C
19.14133473 S
Loading...
Loading

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0xf6F07B39...28aA0472e
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
Layer Zero Bridge

Compiler Version
vyper:0.3.10

Optimization Enabled:
N/A

Other Settings:
default evmVersion, MIT license

Contract Source Code (Vyper language format)

# @version 0.3.10
"""
@title Layer Zero Bridge
@license MIT
@author Curve Finance
"""
from vyper.interfaces import ERC20


interface BERC20:
    def burnFrom(_from: address, _value: uint256): nonpayable

interface Minter:
    def mint(_for: address, _value: uint256): nonpayable

interface Endpoint:
    def send(
        _dst_chain_id: uint16,
        _destination: Bytes[40],
        _payload: Bytes[64],
        _refund_address: address,
        _zro_payment_address: address,
        _adapter_params: Bytes[86]
    ): payable
    def estimateFees(
        _dst_chain_id: uint16,
        _user_application: address,
        _payload: Bytes[64],
        _pay_in_zro: bool,
        _adapter_params: Bytes[86]
    ) -> uint256: view


event SetDelay:
    delay: uint256

event SetLimit:
    limit: uint256

event SetKilled:
    killed: bool

event Bridged:
    receiver: indexed(address)
    amount: uint256

event Delayed:
    nonce: indexed(uint64)
    receiver: indexed(address)
    amount: uint256

event Issued:
    nonce: indexed(uint64)
    receiver: indexed(address)
    amount: uint256

event TransferOwnership:
    owner: indexed(address)


ISSUANCE_INTERVAL: constant(uint256) = 86400


CRVUSD: public(immutable(address))
MINTER: public(immutable(address))

LZ_ENDPOINT: public(immutable(address))
LZ_CHAIN_ID: public(immutable(uint16))
LZ_ADDRESS: immutable(Bytes[40])
KECCAK_LZ_ADDRESS: immutable(bytes32)


limit: public(uint256)
delay: public(uint256)
issued: public(HashMap[uint256, uint256])
delayed: public(HashMap[uint64, bytes32])


owner: public(address)
future_owner: public(address)

is_killed: public(bool)


@external
def __init__(_delay: uint256, _limit: uint256, _lz_chain_id: uint16, _lz_endpoint: address, _crvusd: address, _minter: address):
    self.delay = _delay
    log SetDelay(_delay)

    self.limit = _limit
    log SetLimit(_limit)

    self.owner = msg.sender
    log TransferOwnership(msg.sender)

    LZ_CHAIN_ID = _lz_chain_id
    LZ_ADDRESS = concat(
        slice(convert(self, bytes32), 12, 20), slice(convert(self, bytes32), 12, 20)
    )
    KECCAK_LZ_ADDRESS = keccak256(LZ_ADDRESS)
    LZ_ENDPOINT = _lz_endpoint
    CRVUSD = _crvusd

    MINTER = _minter


@payable
@external
def bridge(
    _amount: uint256,
    _receiver: address = msg.sender,
    _refund_address: address = msg.sender,
    _zro_payment_address: address = empty(address),
    _native_amount: uint256 = 0,
    _native_receiver: address = empty(address)
):
    """
    @notice Bridge CRVUSD
    """
    assert not self.is_killed  # dev: dead
    assert _amount != 0 and _receiver != empty(address)  # dev: invalid

    BERC20(CRVUSD).burnFrom(msg.sender, _amount)

    adapter_params: Bytes[86] = b""
    if _native_amount == 0:
        adapter_params = concat(
            b"\x00\x01",
            convert(500_000, bytes32)
        )
    else:
        adapter_params = concat(
            b"\x00\x02",
            convert(500_000, bytes32),
            convert(_native_amount, bytes32),
            slice(convert(_native_receiver, bytes32), 12, 20)
        )

    Endpoint(LZ_ENDPOINT).send(
        LZ_CHAIN_ID,
        LZ_ADDRESS,
        _abi_encode(_receiver, _amount),
        _refund_address,
        _zro_payment_address,
        adapter_params,
        value=msg.value
    )
    log Bridged(_receiver, _amount)


@external
def lzReceive(_lz_chain_id: uint16, _lz_address: Bytes[40], _nonce: uint64, _payload: Bytes[64]):
    """
    @dev LayerZero method which should not revert at all
    """
    assert msg.sender == LZ_ENDPOINT  # dev: invalid caller

    assert _lz_chain_id == LZ_CHAIN_ID  # dev: invalid source chain
    assert keccak256(_lz_address) == KECCAK_LZ_ADDRESS  # dev: invalid source address

    receiver: address = empty(address)
    amount: uint256 = empty(uint256)
    receiver, amount = _abi_decode(_payload, (address, uint256))

    if receiver in [empty(address), CRVUSD] or amount == 0:
        # precaution
        return

    period: uint256 = block.timestamp / ISSUANCE_INTERVAL
    issued: uint256 = self.issued[period] + amount

    if issued > self.limit or self.is_killed:
        self.delayed[_nonce] = keccak256(_abi_encode(block.timestamp, _payload))
        log Delayed(_nonce, receiver, amount)
    else:
        self.issued[period] = issued

        Minter(MINTER).mint(receiver, amount)

        log Issued(_nonce, receiver, amount)


@external
def retry(_nonce: uint64, _timestamp: uint256, _receiver: address, _amount: uint256):
    """
    @notice Retry a previously delayed bridge attempt
    """
    assert not self.is_killed  # dev: dead

    assert _timestamp + self.delay < block.timestamp  # dev: too soon
    assert self.delayed[_nonce] == keccak256(
        _abi_encode(_timestamp, _abi_encode(_receiver, _amount))
    )  # dev: incorrect

    self.delayed[_nonce] = empty(bytes32)

    Minter(MINTER).mint(_receiver, _amount)

    log Issued(_nonce, _receiver, _amount)


@view
@external
def quote(_native_amount: uint256 = 0) -> uint256:
    """
    @notice Quote the cost of calling the `bridge` method
    """
    adapter_params: Bytes[86] = b""
    if _native_amount == 0:
        adapter_params = concat(
            b"\x00\x01",
            convert(500_000, bytes32)
        )
    else:
        adapter_params = concat(
            b"\x00\x02",
            convert(500_000, bytes32),
            convert(_native_amount, bytes32),
            b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
        )

    return Endpoint(LZ_ENDPOINT).estimateFees(
        LZ_CHAIN_ID,
        self,
        concat(empty(bytes32), empty(bytes32)),
        False,
        adapter_params
    )

@external
def set_delay(_delay: uint256):
    """
    @notice Set the delay for retrying a delayed bridge attempt
    """
    assert msg.sender == self.owner

    self.delay = _delay
    log SetDelay(_delay)


@external
def set_limit(_limit: uint256):
    """
    @notice Set the issuance limit for the issuance interval
    """
    assert msg.sender == self.owner

    self.limit = _limit
    log SetLimit(_limit)


@external
def set_killed(_killed: bool):
    """
    @notice Set the kill status of this side of the bridge
    """
    assert msg.sender == self.owner

    self.is_killed = _killed
    log SetKilled(_killed)


@external
def commit_transfer_ownership(_future_owner: address):
    """
    @notice Transfer ownership to `_future_owner`
    @param _future_owner The account to commit as the future owner
    """
    assert msg.sender == self.owner  # dev: only owner

    self.future_owner = _future_owner


@external
def accept_transfer_ownership():
    """
    @notice Accept the transfer of ownership
    @dev Only the committed future owner can call this function
    """
    assert msg.sender == self.future_owner  # dev: only future owner

    self.owner = msg.sender
    log TransferOwnership(msg.sender)

Contract Security Audit

Contract ABI

API
[{"name":"SetDelay","inputs":[{"name":"delay","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"SetLimit","inputs":[{"name":"limit","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"SetKilled","inputs":[{"name":"killed","type":"bool","indexed":false}],"anonymous":false,"type":"event"},{"name":"Bridged","inputs":[{"name":"receiver","type":"address","indexed":true},{"name":"amount","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"Delayed","inputs":[{"name":"nonce","type":"uint64","indexed":true},{"name":"receiver","type":"address","indexed":true},{"name":"amount","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"Issued","inputs":[{"name":"nonce","type":"uint64","indexed":true},{"name":"receiver","type":"address","indexed":true},{"name":"amount","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"TransferOwnership","inputs":[{"name":"owner","type":"address","indexed":true}],"anonymous":false,"type":"event"},{"stateMutability":"nonpayable","type":"constructor","inputs":[{"name":"_delay","type":"uint256"},{"name":"_limit","type":"uint256"},{"name":"_lz_chain_id","type":"uint16"},{"name":"_lz_endpoint","type":"address"},{"name":"_crvusd","type":"address"},{"name":"_minter","type":"address"}],"outputs":[]},{"stateMutability":"payable","type":"function","name":"bridge","inputs":[{"name":"_amount","type":"uint256"}],"outputs":[]},{"stateMutability":"payable","type":"function","name":"bridge","inputs":[{"name":"_amount","type":"uint256"},{"name":"_receiver","type":"address"}],"outputs":[]},{"stateMutability":"payable","type":"function","name":"bridge","inputs":[{"name":"_amount","type":"uint256"},{"name":"_receiver","type":"address"},{"name":"_refund_address","type":"address"}],"outputs":[]},{"stateMutability":"payable","type":"function","name":"bridge","inputs":[{"name":"_amount","type":"uint256"},{"name":"_receiver","type":"address"},{"name":"_refund_address","type":"address"},{"name":"_zro_payment_address","type":"address"}],"outputs":[]},{"stateMutability":"payable","type":"function","name":"bridge","inputs":[{"name":"_amount","type":"uint256"},{"name":"_receiver","type":"address"},{"name":"_refund_address","type":"address"},{"name":"_zro_payment_address","type":"address"},{"name":"_native_amount","type":"uint256"}],"outputs":[]},{"stateMutability":"payable","type":"function","name":"bridge","inputs":[{"name":"_amount","type":"uint256"},{"name":"_receiver","type":"address"},{"name":"_refund_address","type":"address"},{"name":"_zro_payment_address","type":"address"},{"name":"_native_amount","type":"uint256"},{"name":"_native_receiver","type":"address"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"lzReceive","inputs":[{"name":"_lz_chain_id","type":"uint16"},{"name":"_lz_address","type":"bytes"},{"name":"_nonce","type":"uint64"},{"name":"_payload","type":"bytes"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"retry","inputs":[{"name":"_nonce","type":"uint64"},{"name":"_timestamp","type":"uint256"},{"name":"_receiver","type":"address"},{"name":"_amount","type":"uint256"}],"outputs":[]},{"stateMutability":"view","type":"function","name":"quote","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"quote","inputs":[{"name":"_native_amount","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"function","name":"set_delay","inputs":[{"name":"_delay","type":"uint256"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"set_limit","inputs":[{"name":"_limit","type":"uint256"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"set_killed","inputs":[{"name":"_killed","type":"bool"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"commit_transfer_ownership","inputs":[{"name":"_future_owner","type":"address"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"accept_transfer_ownership","inputs":[],"outputs":[]},{"stateMutability":"view","type":"function","name":"CRVUSD","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"MINTER","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"LZ_ENDPOINT","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"LZ_CHAIN_ID","inputs":[],"outputs":[{"name":"","type":"uint16"}]},{"stateMutability":"view","type":"function","name":"limit","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"delay","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"issued","inputs":[{"name":"arg0","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"delayed","inputs":[{"name":"arg0","type":"uint64"}],"outputs":[{"name":"","type":"bytes32"}]},{"stateMutability":"view","type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"future_owner","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"is_killed","inputs":[],"outputs":[{"name":"","type":"bool"}]}]

Deployed Bytecode

0x5f3560e01c60026019820660011b610ddf01601e395f51565b6316063ec081186100365734610ddb576020610e1160403960206040f35b63a4d66daf8118610dd75734610ddb575f5460405260206040f3610dd7565b63fe6d812481186100735734610ddb576020610e3160403960206040f35b63e5ea47b88118610dd75734610ddb576005543318610ddb5733600455337fcfaaa26691e16e66e73290fc725eee1a6b4e0e693a1640484937aac25ffb55a45f6040a200610dd7565b63cd4d1c648118610dd75734610ddb576020610e5160403960206040f3610dd7565b63935ec9908118610dd75734610ddb576020610e7160403960206040f3610dd7565b636a42b8f88118610dd75734610ddb5760015460405260206040f3610dd7565b63647dfbed811861014d57602436103417610ddb5760026004356020525f5260405f205460405260206040f35b639dee23808118610dd75760c3361115610ddb576024358060a01c610ddb576040526044358060a01c610ddb576060526064358060a01c610ddb5760805260843560a05260a4358060a01c610ddb5760c0525b600654610ddb57600435156101b95760405115156101bb565b5f5b15610ddb576020610e115f395f516379cc679060e052336101005260043561012052803b15610ddb575f60e0604460fc5f855af16101fb573d5f5f3e3d5ffd5b505f60e05260a05161027d575f6002610160527e0100000000000000000000000000000000000000000000000000000000000061018052610160805160208201836101c001815181525050808301925050506207a120816101c00152602081019050806101a0526101a0905060208151018060e0828460045afa505050610336565b5f6002610160527e02000000000000000000000000000000000000000000000000000000000000610180526101608051602082018361022001815181525050808301925050506207a12081610220015260208101905060a05181610220015260208101905060c0516101a0526101a0600c810180516101e0525060146101c0526101c090508051602082018361022001815181525050808301925050508061020052610200905060208151018060e0828460045afa5050505b6020610e515f395f5163c58031006101c05260c06020610e716101e0398061020052806101e00160206020610e915f395f510180610e918339508051806020830101601f825f03163682375050601f19601f825160200101169050810190508061022052604051610180526004356101a052604061016052610160816101e00160208251018082828560045afa50508051806020830101601f825f03163682375050601f19601f82516020010116905090508101905060605161024052608051610260528061028052806101e001602060e0510180828260e060045afa50508051806020830101601f825f03163682375050601f19601f82516020010116905081015050803b15610ddb575f6101c06102046101dc34855af161045b573d5f5f3e3d5ffd5b506040517f48b87fc02925b37a6aefac60c14fa9d8e9988d7dfadf262d4bd845872ca40730600435610160526020610160a200610dd7565b639155ba6881186104ce57602436103417610ddb576004358060401c610ddb5760405260036040516020525f5260405f205460605260206060f35b637bb446528118610dd75760a3361115610ddb576024358060a01c610ddb576040526044358060a01c610ddb576060526064358060a01c610ddb5760805260843560a0525f60c0526101a056610dd7565b638da5cb5b811861053b5734610ddb5760045460405260206040f35b636b441a408118610dd757602436103417610ddb576004358060a01c610ddb576040526004543318610ddb5760405160055500610dd7565b631ec0cdc1811861058f5734610ddb5760055460405260206040f35b639c868ac081186105ab5734610ddb5760065460405260206040f35b621d35678118610dd75760c436103417610ddb576004358060101c610ddb576040526024356004016028813511610ddb576020813501808260603750506044358060401c610ddb5760c0526064356004016040813511610ddb576020813501808260e03750506020610e515f395f513318610ddb576020610e715f395f5160405118610ddb576020610ef15f395f5160605160802018610ddb5760403661014037604060e05118610ddb57610100518060a01c610ddb5761018052610120516101a05261018080516101405260208101516101605250610140518061069157600161069e565b6020610e115f395f518118155b90506106ae5761016051156106b1565b60015b156106bb57610837565b426201518081049050610180526002610180516020525f5260405f205461016051808201828110610ddb57905090506101a0525f546101a0511161070157600654610704565b60015b61079a576101a0516002610180516020525f5260405f20556020610e315f395f516340c10f196101c052610140516101e0526101605161020052803b15610ddb575f6101c060446101dc5f855af161075e573d5f5f3e3d5ffd5b506101405160c0517f83eb516a22c3ab50120e5536c25737d192eed519684038efeb18c136a65cdffa610160516101c05260206101c0a3610837565b6040426101e0528061020052806101e001602060e0510180828260e060045afa50508051806020830101601f825f03163682375050601f19601f825160200101169050810190506101c0526101c0805160208201209050600360c0516020525f5260405f20556101405160c0517f2f9d03e55b4e245db68169fb64481b4794dd8a7f22fb8f4a5b99c1c6a6f743c5610160516101c05260206101c0a35b00610dd7565b6390fd50b38118610864576023361115610ddb5733604052336060526060366080376101a0565b63d7843e3981186108ad576083361115610ddb576024358060a01c610ddb576040526044358060a01c610ddb576060526064358060a01c610ddb5760805260403660a0376101a0565b638c84dede8118610dd757602436103417610ddb576004543318610ddb576004356001557fcf57d2e955986c39a021abcc2ff70c02efcd0a4dd6ce2255a84612dd7b65ea2960043560405260206040a100610dd7565b639394d2e88118610dd7576043361115610ddb576024358060a01c610ddb57604052336060526060366080376101a056610dd7565b63a334defb8118610dd7576063361115610ddb576024358060a01c610ddb576040526044358060a01c610ddb576060526060366080376101a056610dd7565b63b5fb0b428118610dd757608436103417610ddb576004358060401c610ddb576040526044358060a01c610ddb57606052600654610ddb5742602435600154808201828110610ddb57905090501015610ddb57604060243561010052806101205260605160a05260643560c05260406080526080816101000160208251018082828560045afa50508051806020830101601f825f03163682375050601f19601f82516020010116905090508101905060e05260e080516020820120905060036040516020525f5260405f205418610ddb575f60036040516020525f5260405f20556020610e315f395f516340c10f1960805260605160a05260643560c052803b15610ddb575f60806044609c5f855af1610a93573d5f5f3e3d5ffd5b506060516040517f83eb516a22c3ab50120e5536c25737d192eed519684038efeb18c136a65cdffa60643560805260206080a300610dd7565b63999b93af8118610dd75734610ddb575f604052610b0556610dd7565b63ed1bd76c8118610dd757602436103417610ddb576004356040525b5f606052604051610b84575f600260e0527e010000000000000000000000000000000000000000000000000000000000006101005260e08051602082018361014001815181525050808301925050506207a120816101400152602081019050806101205261012090506020815101806060828460045afa505050610c29565b5f600260e0527e020000000000000000000000000000000000000000000000000000000000006101005260e08051602082018361018001815181525050808301925050506207a1208161018001526020810190506040518161018001526020810190506014610120525f61014052610120805160208201836101800181518152505080830192505050806101605261016090506020815101806060828460045afa5050505b60206020610e515f395f516340a7bb106101405260a06020610e71610160393061018052806101a0525f5f8161010001526020810190505f8161010001526020810190508060e05260e09050816101600160208251018082828560045afa50508051806020830101601f825f03163682375050601f19601f8251602001011690509050810190505f6101c052806101e0528061016001602060605101808282606060045afa50508051806020830101601f825f03163682375050601f19601f82516020010116905081015050602061014061018461015c845afa610d0f573d5f5f3e3d5ffd5b60203d10610ddb576101409050f3610dd7565b63be0284268118610dd757602436103417610ddb576004543318610ddb576004355f557f479881bf41e329f328c21c2cbb11514b05a021cd33ea4e5a576ea6bc03874fd660043560405260206040a100610dd7565b6390b229978118610dd757602436103417610ddb576004358060011c610ddb576040526004543318610ddb576040516006557ff6a23ecf31263066d4cc1ac21837c1714818045ecc5c0dd89f279e0bd4b7ef8760405160605260206060a1005b5f5ffd5b5f80fd04930dd70dd70dd70dd7051f0dd700180dd70d770acc00de0ae90938097705730dd70d2201200dd700bc083d0903005501000000000000000000000000008fb3ec8f2d1dc089e70cd61f1e49496d443b2124000000000000000000000000c0b338da0fdd43dc48539837594cf6363795feea000000000000000000000000b6319cc6c8c27a8f5daf0dd3df91ea35c4720dd7000000000000000000000000000000000000000000000000000000000000006500000000000000000000000000000000000000000000000000000000000000286f8012b70ba1fb7f40873cd7f1b03c6fb5bf666c6f8012b70ba1fb7f40873cd7f1b03c6fb5bf666c000000000000000000000000000000000000000000000000271aad2b87155bf0d23df3f704f1152535938440ee6d53a6f07ff7687e84ba27

Block Transaction 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
[ Download: CSV Export  ]
[ 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.