{"sources":{"LayerZeroBridge(EthereumVersion).vy":{"content":"# @version 0.3.10\n\"\"\"\n@title Layer Zero Bridge (Ethereum Version)\n@license MIT\n@author Curve Finance\n\"\"\"\nfrom vyper.interfaces import ERC20\n\n\ninterface Endpoint:\n    def send(\n        _dst_chain_id: uint16,\n        _destination: Bytes[40],\n        _payload: Bytes[64],\n        _refund_address: address,\n        _zro_payment_address: address,\n        _adapter_params: Bytes[86]\n    ): payable\n    def estimateFees(\n        _dst_chain_id: uint16,\n        _user_application: address,\n        _payload: Bytes[64],\n        _pay_in_zro: bool,\n        _adapter_params: Bytes[86]\n    ) -> uint256: view\n\n\nevent SetKilled:\n    killed: bool\n\nevent SetDelay:\n    delay: uint256\n\nevent SetLimit:\n    limit: uint256\n\nevent Bridged:\n    receiver: indexed(address)\n    amount: uint256\n\nevent Delayed:\n    nonce: indexed(uint64)\n    receiver: indexed(address)\n    amount: uint256\n\nevent Failed:\n    nonce: indexed(uint64)\n    receiver: indexed(address)\n    amount: uint256\n\nevent Issued:\n    nonce: indexed(uint64)\n    receiver: indexed(address)\n    amount: uint256\n\nevent TransferOwnership:\n    owner: indexed(address)\n\n\nSCRVUSD: constant(address) = 0x0655977FEb2f289A4aB78af67BAB0d17aAb84367\nISSUANCE_INTERVAL: constant(uint256) = 86400\n\nLZ_ENDPOINT: public(constant(address)) = 0x66A71Dcef29A0fFBDBE3c6a460a3B5BC225Cd675\n\n\nLZ_CHAIN_ID: public(immutable(uint16))\nLZ_ADDRESS: immutable(Bytes[40])\nKECCAK_LZ_ADDRESS: immutable(bytes32)\n\n\nlimit: public(uint256)\ndelay: public(uint256)\nissued: public(HashMap[uint256, uint256])\ndelayed: public(HashMap[uint64, bytes32])\nfailed: public(HashMap[uint64, bytes32])\n\n\nowner: public(address)\nfuture_owner: public(address)\n\nis_killed: public(bool)\n\n\n@external\ndef __init__(_delay: uint256, _limit: uint256, _lz_chain_id: uint16):\n    self.delay = _delay\n    log SetDelay(_delay)\n\n    self.limit = _limit\n    log SetLimit(_limit)\n\n    self.owner = msg.sender\n    log TransferOwnership(msg.sender)\n\n    LZ_CHAIN_ID = _lz_chain_id\n    LZ_ADDRESS = concat(\n        slice(convert(self, bytes32), 12, 20), slice(convert(self, bytes32), 12, 20)\n    )\n    KECCAK_LZ_ADDRESS = keccak256(LZ_ADDRESS)\n\n\n@payable\n@external\ndef bridge(\n    _amount: uint256,\n    _receiver: address = msg.sender,\n    _refund_address: address = msg.sender,\n    _zro_payment_address: address = empty(address),\n    _native_amount: uint256 = 0,\n    _native_receiver: address = empty(address)\n):\n    \"\"\"\n    @notice Bridge SCRVUSD\n    \"\"\"\n    assert not self.is_killed  # dev: dead\n    assert _amount != 0 and _receiver != empty(address)  # dev: invalid\n\n    assert ERC20(SCRVUSD).transferFrom(msg.sender, self, _amount)\n\n    adapter_params: Bytes[86] = b\"\"\n    if _native_amount == 0:\n        adapter_params = concat(\n            b\"\\x00\\x01\",\n            convert(500_000, bytes32)\n        )\n    else:\n        adapter_params = concat(\n            b\"\\x00\\x02\",\n            convert(500_000, bytes32),\n            convert(_native_amount, bytes32),\n            slice(convert(_native_receiver, bytes32), 12, 20)\n        )\n\n    Endpoint(LZ_ENDPOINT).send(\n        LZ_CHAIN_ID,\n        LZ_ADDRESS,\n        _abi_encode(_receiver, _amount),\n        _refund_address,\n        _zro_payment_address,\n        adapter_params,\n        value=msg.value\n    )\n    log Bridged(_receiver, _amount)\n\n\n@external\ndef lzReceive(_lz_chain_id: uint16, _lz_address: Bytes[40], _nonce: uint64, _payload: Bytes[64]):\n    \"\"\"\n    @dev LayerZero method which should not revert at all\n    \"\"\"\n    assert msg.sender == LZ_ENDPOINT  # dev: invalid caller\n\n    assert _lz_chain_id == LZ_CHAIN_ID  # dev: invalid source chain\n    assert keccak256(_lz_address) == KECCAK_LZ_ADDRESS  # dev: invalid source address\n\n    receiver: address = empty(address)\n    amount: uint256 = empty(uint256)\n    receiver, amount = _abi_decode(_payload, (address, uint256))\n\n    if receiver in [empty(address), SCRVUSD] or amount == 0:\n        # precaution\n        return\n\n    period: uint256 = block.timestamp / ISSUANCE_INTERVAL\n    issued: uint256 = self.issued[period] + amount\n\n    if ERC20(SCRVUSD).balanceOf(self) < amount:\n        self.failed[_nonce] = keccak256(_payload)\n        log Failed(_nonce, receiver, amount)\n    elif issued > self.limit or self.is_killed:\n        self.delayed[_nonce] = keccak256(_abi_encode(block.timestamp, _payload))\n        log Delayed(_nonce, receiver, amount)\n    else:\n        self.issued[period] = issued\n\n        ERC20(SCRVUSD).transfer(receiver, amount)\n\n        log Issued(_nonce, receiver, amount)\n\n\n@external\ndef retry(_nonce: uint64, _timestamp: uint256, _receiver: address, _amount: uint256):\n    \"\"\"\n    @notice Retry a previously delayed bridge attempt\n    \"\"\"\n    assert not self.is_killed  # dev: dead\n\n    assert _timestamp + self.delay < block.timestamp  # dev: too soon\n    assert self.delayed[_nonce] == keccak256(\n        _abi_encode(_timestamp, _abi_encode(_receiver, _amount))\n    )  # dev: incorrect\n\n    self.delayed[_nonce] = empty(bytes32)\n\n    ERC20(SCRVUSD).transfer(_receiver, _amount)\n\n    log Issued(_nonce, _receiver, _amount)\n\n\n@payable\n@external\ndef recover(_nonce: uint64, _receiver: address, _amount: uint256):\n    assert not self.is_killed  # dev: dead\n\n    assert self.failed[_nonce] == keccak256(_abi_encode(_receiver, _amount))\n    self.failed[_nonce] = empty(bytes32)\n\n    Endpoint(LZ_ENDPOINT).send(\n        LZ_CHAIN_ID,\n        LZ_ADDRESS,\n        _abi_encode(_receiver, _amount),\n        msg.sender,\n        empty(address),\n        concat(\n            b\"\\x00\\x01\",\n            convert(500_000, bytes32)\n        ),\n        value=msg.value\n    )\n\n\n@view\n@external\ndef quote(_native_amount: uint256 = 0) -> uint256:\n    \"\"\"\n    @notice Quote the cost of calling the `bridge` method\n    \"\"\"\n    adapter_params: Bytes[86] = b\"\"\n    if _native_amount == 0:\n        adapter_params = concat(\n            b\"\\x00\\x01\",\n            convert(500_000, bytes32)\n        )\n    else:\n        adapter_params = concat(\n            b\"\\x00\\x02\",\n            convert(500_000, bytes32),\n            convert(_native_amount, bytes32),\n            b\"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\"\n        )\n\n    return Endpoint(LZ_ENDPOINT).estimateFees(\n        LZ_CHAIN_ID,\n        self,\n        concat(empty(bytes32), empty(bytes32)),\n        False,\n        adapter_params\n    )\n\n\n@external\ndef set_delay(_delay: uint256):\n    \"\"\"\n    @notice Set the delay for retrying a delayed bridge attempt\n    \"\"\"\n    assert msg.sender == self.owner\n\n    self.delay = _delay\n    log SetDelay(_delay)\n\n\n@external\ndef set_limit(_limit: uint256):\n    \"\"\"\n    @notice Set the issuance limit for the issuance interval\n    \"\"\"\n    assert msg.sender == self.owner\n\n    self.limit = _limit\n    log SetLimit(_limit)\n\n\n@external\ndef set_killed(_killed: bool):\n    \"\"\"\n    @notice Set the kill status of this side of the bridge\n    \"\"\"\n    assert msg.sender == self.owner\n\n    self.is_killed = _killed\n    log SetKilled(_killed)\n\n\n@external\ndef commit_transfer_ownership(_future_owner: address):\n    \"\"\"\n    @notice Transfer ownership to `_future_owner`\n    @param _future_owner The account to commit as the future owner\n    \"\"\"\n    assert msg.sender == self.owner  # dev: only owner\n\n    self.future_owner = _future_owner\n\n\n@external\ndef accept_transfer_ownership():\n    \"\"\"\n    @notice Accept the transfer of ownership\n    @dev Only the committed future owner can call this function\n    \"\"\"\n    assert msg.sender == self.future_owner  # dev: only future owner\n\n    self.owner = msg.sender\n    log TransferOwnership(msg.sender)"}},"abi":[{"name":"SetKilled","type":"event","inputs":[{"name":"killed","type":"bool","indexed":false}],"anonymous":false},{"name":"SetDelay","type":"event","inputs":[{"name":"delay","type":"uint256","indexed":false}],"anonymous":false},{"name":"SetLimit","type":"event","inputs":[{"name":"limit","type":"uint256","indexed":false}],"anonymous":false},{"name":"Bridged","type":"event","inputs":[{"name":"receiver","type":"address","indexed":true},{"name":"amount","type":"uint256","indexed":false}],"anonymous":false},{"name":"Delayed","type":"event","inputs":[{"name":"nonce","type":"uint64","indexed":true},{"name":"receiver","type":"address","indexed":true},{"name":"amount","type":"uint256","indexed":false}],"anonymous":false},{"name":"Failed","type":"event","inputs":[{"name":"nonce","type":"uint64","indexed":true},{"name":"receiver","type":"address","indexed":true},{"name":"amount","type":"uint256","indexed":false}],"anonymous":false},{"name":"Issued","type":"event","inputs":[{"name":"nonce","type":"uint64","indexed":true},{"name":"receiver","type":"address","indexed":true},{"name":"amount","type":"uint256","indexed":false}],"anonymous":false},{"name":"TransferOwnership","type":"event","inputs":[{"name":"owner","type":"address","indexed":true}],"anonymous":false},{"type":"constructor","inputs":[{"name":"_delay","type":"uint256"},{"name":"_limit","type":"uint256"},{"name":"_lz_chain_id","type":"uint16"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"bridge","type":"function","inputs":[{"name":"_amount","type":"uint256"}],"outputs":[],"stateMutability":"payable"},{"name":"bridge","type":"function","inputs":[{"name":"_amount","type":"uint256"},{"name":"_receiver","type":"address"}],"outputs":[],"stateMutability":"payable"},{"name":"bridge","type":"function","inputs":[{"name":"_amount","type":"uint256"},{"name":"_receiver","type":"address"},{"name":"_refund_address","type":"address"}],"outputs":[],"stateMutability":"payable"},{"name":"bridge","type":"function","inputs":[{"name":"_amount","type":"uint256"},{"name":"_receiver","type":"address"},{"name":"_refund_address","type":"address"},{"name":"_zro_payment_address","type":"address"}],"outputs":[],"stateMutability":"payable"},{"name":"bridge","type":"function","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"},{"name":"bridge","type":"function","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":"payable"},{"name":"lzReceive","type":"function","inputs":[{"name":"_lz_chain_id","type":"uint16"},{"name":"_lz_address","type":"bytes"},{"name":"_nonce","type":"uint64"},{"name":"_payload","type":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"retry","type":"function","inputs":[{"name":"_nonce","type":"uint64"},{"name":"_timestamp","type":"uint256"},{"name":"_receiver","type":"address"},{"name":"_amount","type":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"recover","type":"function","inputs":[{"name":"_nonce","type":"uint64"},{"name":"_receiver","type":"address"},{"name":"_amount","type":"uint256"}],"outputs":[],"stateMutability":"payable"},{"name":"quote","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256"}],"stateMutability":"view"},{"name":"quote","type":"function","inputs":[{"name":"_native_amount","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"stateMutability":"view"},{"name":"set_delay","type":"function","inputs":[{"name":"_delay","type":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"set_limit","type":"function","inputs":[{"name":"_limit","type":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"set_killed","type":"function","inputs":[{"name":"_killed","type":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"commit_transfer_ownership","type":"function","inputs":[{"name":"_future_owner","type":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"accept_transfer_ownership","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"LZ_ENDPOINT","type":"function","inputs":[],"outputs":[{"name":"","type":"address"}],"stateMutability":"view"},{"name":"LZ_CHAIN_ID","type":"function","inputs":[],"outputs":[{"name":"","type":"uint16"}],"stateMutability":"view"},{"name":"limit","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256"}],"stateMutability":"view"},{"name":"delay","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256"}],"stateMutability":"view"},{"name":"issued","type":"function","inputs":[{"name":"arg0","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"stateMutability":"view"},{"name":"delayed","type":"function","inputs":[{"name":"arg0","type":"uint64"}],"outputs":[{"name":"","type":"bytes32"}],"stateMutability":"view"},{"name":"failed","type":"function","inputs":[{"name":"arg0","type":"uint64"}],"outputs":[{"name":"","type":"bytes32"}],"stateMutability":"view"},{"name":"owner","type":"function","inputs":[],"outputs":[{"name":"","type":"address"}],"stateMutability":"view"},{"name":"future_owner","type":"function","inputs":[],"outputs":[{"name":"","type":"address"}],"stateMutability":"view"},{"name":"is_killed","type":"function","inputs":[],"outputs":[{"name":"","type":"bool"}],"stateMutability":"view"}],"matchId":"13344355","creationMatch":"match","runtimeMatch":"match","verifiedAt":"2026-01-09T15:32:03Z","match":"match","chainId":"1","address":"0x26E91B1f142b9bF0bB37e82959bA79D2Aa6b99b8"}