Overview
S Balance
S Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 internal transaction
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
1641310 | 90 days ago | 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
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
- No Contract Security Audit Submitted- Submit Audit Here
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
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 35 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $1.04 | 0.1 | $0.1042 |
Loading...
Loading
Loading...
Loading
[ 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.